Recreate minors when renaming zvols
authorBrian Behlendorf <behlendorf1@llnl.gov>
Mon, 19 Nov 2012 21:48:06 +0000 (13:48 -0800)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Tue, 20 Nov 2012 00:59:44 +0000 (16:59 -0800)
When a zvol with snapshots is renamed the device files under
/dev/zvol/ are not renamed.  This patch resolves the problem
by destroying and recreating the minors with the new name so
the links can be recreated bu udev.

Original-patch-by: Suman Chakravartula <schakrava@gmail.com>
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Closes #408

lib/libzfs/libzfs_changelist.c

index 0bcfc04..3a83e2d 100644 (file)
@@ -291,22 +291,30 @@ changelist_rename(prop_changelist_t *clp, const char *src, const char *dst)
 
        for (cn = uu_list_first(clp->cl_list); cn != NULL;
            cn = uu_list_next(clp->cl_list, cn)) {
+               zfs_handle_t *hdl;
+
+               hdl = cn->cn_handle;
+
                /*
                 * Do not rename a clone that's not in the source hierarchy.
                 */
-               if (!isa_child_of(cn->cn_handle->zfs_name, src))
+               if (!isa_child_of(hdl->zfs_name, src))
                        continue;
 
                /*
                 * Destroy the previous mountpoint if needed.
                 */
-               remove_mountpoint(cn->cn_handle);
+               remove_mountpoint(hdl);
 
                (void) strlcpy(newname, dst, sizeof (newname));
-               (void) strcat(newname, cn->cn_handle->zfs_name + strlen(src));
+               (void) strcat(newname, hdl->zfs_name + strlen(src));
+
+               if (ZFS_IS_VOLUME(hdl)) {
+                       (void) zvol_remove_link(hdl->zfs_hdl, hdl->zfs_name);
+                       (void) zvol_create_link(hdl->zfs_hdl, newname);
+               }
 
-               (void) strlcpy(cn->cn_handle->zfs_name, newname,
-                   sizeof (cn->cn_handle->zfs_name));
+               (void) strlcpy(hdl->zfs_name, newname, sizeof (hdl->zfs_name));
        }
 }