]> sourceware.org Git - lvm2.git/commitdiff
Use hard-coded /dev/mapper/control details for 2.6.36+ kernels and simplify
authorAlasdair Kergon <agk@redhat.com>
Fri, 25 Mar 2011 23:50:35 +0000 (23:50 +0000)
committerAlasdair Kergon <agk@redhat.com>
Fri, 25 Mar 2011 23:50:35 +0000 (23:50 +0000)
associated code.  (Some obscure configurations that happened to work before
are no longer supported.)

WHATS_NEW_DM
libdm/ioctl/libdm-iface.c

index 6072bd030197a1945aff633e30c7c3fde53fde7d..39cc25ac3fdaf2f0bc64db440a451070dfe8aac4 100644 (file)
@@ -1,5 +1,7 @@
 Version 1.02.64 - 
 ===================================
+  Streamline /dev/mapper/control node code for common cases.
+  Use hard-coded dm control node device number for 2.6.36 kernels and above.
   Improve stack debug reporting in dm_task_create().
   Fallback to control node creation only if node doesn't exist yet.
   Change dm_hash API for binary data to accept const void *key.
index ecd9d06df39d5cc98c3fe3ce912c9dc5b2667b6d..f54cf1d202b0fab127352cf3b6f4e8ab787083c4 100644 (file)
@@ -228,7 +228,7 @@ static int _control_device_number(uint32_t *major, uint32_t *minor)
 }
 
 /*
- * Returns 1 if exists; 0 if it doesn't; -1 if it's wrong
+ * Returns 1 if it exists on returning; 0 if it doesn't; -1 if it's wrong.
  */
 static int _control_exists(const char *control, uint32_t major, uint32_t minor)
 {
@@ -267,8 +267,15 @@ static int _create_control(const char *control, uint32_t major, uint32_t minor)
        int ret;
        mode_t old_umask;
 
-       if (!major)
-               return 0;
+       /*
+        * Return if the control already exists with intended major/minor
+        * or there's an error unlinking an apparently incorrect one.
+        */
+       ret = _control_exists(control, major, minor);
+       if (ret == -1)
+               return 0;       /* Failed to unlink existing incorrect node */
+       if (ret)
+               return 1;       /* Already exists and correct */
 
        (void) dm_prepare_selinux_context(dm_dir(), S_IFDIR);
        old_umask = umask(DM_DEV_DIR_UMASK);
@@ -359,14 +366,9 @@ static void _close_control_fd(void)
        }
 }
 
-static int _open_and_assign_control_fd(const char *control,
-                                      int ignore_nodev)
+static int _open_and_assign_control_fd(const char *control)
 {
-       _close_control_fd();
-
        if ((_control_fd = open(control, O_RDWR)) < 0) {
-               if (ignore_nodev && errno == ENODEV)
-                       return 1;
                log_sys_error("open", control);
                return 0;
        }
@@ -378,8 +380,8 @@ static int _open_control(void)
 {
 #ifdef DM_IOCTLS
        char control[PATH_MAX];
-       uint32_t major = 0, minor;
-       int dm_mod_autoload_support, needs_open;
+       uint32_t major = MISC_MAJOR;
+       uint32_t minor = MAPPER_CTRL_MINOR;
 
        if (_control_fd != -1)
                return 1;
@@ -390,63 +392,27 @@ static int _open_control(void)
        snprintf(control, sizeof(control), "%s/%s", dm_dir(), DM_CONTROL_NODE);
 
        /*
-        * dm-mod autoloading is supported since kernel 2.6.36.
-        * Udev daemon will try to read modules.devname file extracted
-        * by depmod and create any static nodes needed.
-        * The /dev/mapper/control node can be created and prepared this way.
-        * First access to such node should load dm-mod module automatically.
-        */
-       dm_mod_autoload_support = KERNEL_VERSION(_kernel_major, _kernel_minor,
-                                 _kernel_release) >= KERNEL_VERSION(2, 6, 36);
-
-       /*
-        *  If dm-mod autoloading is supported and the control node exists
-        *  already try to open it now. This should autoload dm-mod module.
-        */
-       if (dm_mod_autoload_support) {
-               if (!_get_proc_number(PROC_DEVICES, MISC_NAME, &major))
-                       /* If major not found, just fallback to hardcoded value. */
-                       major = MISC_MAJOR;
-
-               /* Recreate the node with correct major and minor if needed. */
-               if (!_control_exists(control, major, MAPPER_CTRL_MINOR) &&
-                   !_create_control(control, major, MAPPER_CTRL_MINOR))
-                       goto error;
-
-               /* Fallback to old code only if control node doesn't exist */
-               if (!_open_and_assign_control_fd(control, 1))
-                       goto error;
-       }
-
-       /*
-        * Get major and minor number assigned for the control node.
-        * In case we make use of the module autoload support, this
-        * information should be accessible now as well.
+        * Prior to 2.6.36 the minor number should be looked up in /proc.
         */
-       if (!_control_device_number(&major, &minor))
-               log_error("Is device-mapper driver missing from kernel?");
+       if ((KERNEL_VERSION(_kernel_major, _kernel_minor, _kernel_release) <
+            KERNEL_VERSION(2, 6, 36)) &&
+           !_control_device_number(&major, &minor))
+               goto_bad;
 
        /*
-        * Check the control node and its major and minor number.
-        * If there's anything wrong, remove the old node and create
-        * a correct one.
+        * Create the node with correct major and minor if not already done.
+        * Udev may already have created /dev/mapper/control
+        * from the modules.devname file generated by depmod.
         */
-       if ((needs_open = !_control_exists(control, major, minor)) &&
-           !_create_control(control, major, minor)) {
-               _close_control_fd();
-               goto error;
-       }
+       if (!_create_control(control, major, minor))
+               goto_bad;
 
        /*
-        * For older kernels without dm-mod autoloading support, we always
-        * need to open the control node here - we still haven't done that!
-        * For newer kernels with dm-mod autoloading, we open it only if the
-        * node was recreated and corrected in previous step.
+        * As of 2.6.36 kernels, the open can trigger autoloading dm-mod.
         */
-       if ((!dm_mod_autoload_support || needs_open) &&
-            !_open_and_assign_control_fd(control, 0))
-               goto error;
-
+       if (!_open_and_assign_control_fd(control))
+               goto_bad;
+       
        if (!_create_dm_bitset()) {
                log_error("Failed to set up list of device-mapper major numbers");
                return 0;
@@ -454,8 +420,10 @@ static int _open_control(void)
 
        return 1;
 
-error:
+bad:
        log_error("Failure to communicate with kernel device-mapper driver.");
+       if (!geteuid())
+               log_error("Check that device-mapper is available in the kernel.");
        return 0;
 #else
        return 1;
This page took 0.047115 seconds and 5 git commands to generate.