Fix ZVOL rename minor devices
authorBrian Behlendorf <behlendorf1@llnl.gov>
Fri, 7 Jan 2011 20:24:03 +0000 (12:24 -0800)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Fri, 7 Jan 2011 20:26:02 +0000 (12:26 -0800)
During a rename we need to be careful to destroy and create a
new minor for the ZVOL _only_ if the rename succeeded.  The previous
code would both destroy you minor device unconditionally, it would
also fail to create the new minor device on success.

module/zfs/zfs_ioctl.c

index 45e118e..6e8422b 100644 (file)
@@ -3307,6 +3307,7 @@ static int
 zfs_ioc_rename(zfs_cmd_t *zc)
 {
        boolean_t recursive = zc->zc_cookie & 1;
+       int err;
 
        zc->zc_value[sizeof (zc->zc_value) - 1] = '\0';
        if (dataset_namecheck(zc->zc_value, NULL, NULL) != 0 ||
@@ -3320,13 +3321,18 @@ zfs_ioc_rename(zfs_cmd_t *zc)
         */
        if (!recursive && strchr(zc->zc_name, '@') != NULL &&
            zc->zc_objset_type == DMU_OST_ZFS) {
-               int err = zfs_unmount_snap(zc->zc_name, NULL);
+               err = zfs_unmount_snap(zc->zc_name, NULL);
                if (err)
                        return (err);
        }
-       if (zc->zc_objset_type == DMU_OST_ZVOL)
+
+       err = dmu_objset_rename(zc->zc_name, zc->zc_value, recursive);
+       if ((err == 0) && (zc->zc_objset_type == DMU_OST_ZVOL)) {
                (void) zvol_remove_minor(zc->zc_name);
-       return (dmu_objset_rename(zc->zc_name, zc->zc_value, recursive));
+               (void) zvol_create_minor(zc->zc_value);
+       }
+
+       return (err);
 }
 
 static int