Recreate minors when renaming zvols

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
This commit is contained in:
Brian Behlendorf 2012-11-19 13:48:06 -08:00
parent 33364b15d3
commit 0e20a31b4b
1 changed files with 13 additions and 5 deletions

View 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; for (cn = uu_list_first(clp->cl_list); cn != NULL;
cn = uu_list_next(clp->cl_list, cn)) { 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. * 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; continue;
/* /*
* Destroy the previous mountpoint if needed. * Destroy the previous mountpoint if needed.
*/ */
remove_mountpoint(cn->cn_handle); remove_mountpoint(hdl);
(void) strlcpy(newname, dst, sizeof (newname)); (void) strlcpy(newname, dst, sizeof (newname));
(void) strcat(newname, cn->cn_handle->zfs_name + strlen(src)); (void) strcat(newname, hdl->zfs_name + strlen(src));
(void) strlcpy(cn->cn_handle->zfs_name, newname, if (ZFS_IS_VOLUME(hdl)) {
sizeof (cn->cn_handle->zfs_name)); (void) zvol_remove_link(hdl->zfs_hdl, hdl->zfs_name);
(void) zvol_create_link(hdl->zfs_hdl, newname);
}
(void) strlcpy(hdl->zfs_name, newname, sizeof (hdl->zfs_name));
} }
} }