Author: avg
Date: Tue Feb 18 14:06:41 2014
New Revision: 262158
URL: http://svnweb.freebsd.org/changeset/base/262158

Log:
  MFC r253819: MFV r253781 + r253871: 3894 zfs should not allow snapshot of 
inconsistent dataset
  
  MFC slacker:  delphij

Modified:
  stable/9/cddl/contrib/opensolaris/cmd/zfs/zfs_main.c
  stable/9/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_dataset.c
  stable/9/sys/cddl/contrib/opensolaris/common/zfs/zfs_prop.c
  stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_send.c
  stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c
  stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/dsl_dataset.h
  stable/9/sys/cddl/contrib/opensolaris/uts/common/sys/fs/zfs.h
Directory Properties:
  stable/9/cddl/contrib/opensolaris/   (props changed)
  stable/9/cddl/contrib/opensolaris/cmd/zfs/   (props changed)
  stable/9/cddl/contrib/opensolaris/lib/libzfs/   (props changed)
  stable/9/sys/   (props changed)
  stable/9/sys/cddl/contrib/opensolaris/   (props changed)

Modified: stable/9/cddl/contrib/opensolaris/cmd/zfs/zfs_main.c
==============================================================================
--- stable/9/cddl/contrib/opensolaris/cmd/zfs/zfs_main.c        Tue Feb 18 
13:59:06 2014        (r262157)
+++ stable/9/cddl/contrib/opensolaris/cmd/zfs/zfs_main.c        Tue Feb 18 
14:06:41 2014        (r262158)
@@ -3519,6 +3519,12 @@ zfs_snapshot_cb(zfs_handle_t *zhp, void 
        int rv = 0;
        int error;
 
+       if (sd->sd_recursive &&
+           zfs_prop_get_int(zhp, ZFS_PROP_INCONSISTENT) != 0) {
+               zfs_close(zhp);
+               return (0);
+       }
+
        error = asprintf(&name, "%s@%s", zfs_get_name(zhp), sd->sd_snapname);
        if (error == -1)
                nomem();

Modified: stable/9/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_dataset.c
==============================================================================
--- stable/9/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_dataset.c        
Tue Feb 18 13:59:06 2014        (r262157)
+++ stable/9/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_dataset.c        
Tue Feb 18 14:06:41 2014        (r262158)
@@ -1885,6 +1885,10 @@ get_numeric_property(zfs_handle_t *zhp, 
                zcmd_free_nvlists(&zc);
                break;
 
+       case ZFS_PROP_INCONSISTENT:
+               *val = zhp->zfs_dmustats.dds_inconsistent;
+               break;
+
        default:
                switch (zfs_prop_get_type(prop)) {
                case PROP_TYPE_NUMBER:
@@ -3379,13 +3383,16 @@ zfs_snapshot_cb(zfs_handle_t *zhp, void 
        char name[ZFS_MAXNAMELEN];
        int rv = 0;
 
-       (void) snprintf(name, sizeof (name),
-           "%s@%s", zfs_get_name(zhp), sd->sd_snapname);
+       if (zfs_prop_get_int(zhp, ZFS_PROP_INCONSISTENT) == 0) {
+               (void) snprintf(name, sizeof (name),
+                   "%s@%s", zfs_get_name(zhp), sd->sd_snapname);
 
-       fnvlist_add_boolean(sd->sd_nvl, name);
+               fnvlist_add_boolean(sd->sd_nvl, name);
 
-       rv = zfs_iter_filesystems(zhp, zfs_snapshot_cb, sd);
+               rv = zfs_iter_filesystems(zhp, zfs_snapshot_cb, sd);
+       }
        zfs_close(zhp);
+
        return (rv);
 }
 

Modified: stable/9/sys/cddl/contrib/opensolaris/common/zfs/zfs_prop.c
==============================================================================
--- stable/9/sys/cddl/contrib/opensolaris/common/zfs/zfs_prop.c Tue Feb 18 
13:59:06 2014        (r262157)
+++ stable/9/sys/cddl/contrib/opensolaris/common/zfs/zfs_prop.c Tue Feb 18 
14:06:41 2014        (r262158)
@@ -397,6 +397,8 @@ zfs_prop_init(void)
            PROP_READONLY, ZFS_TYPE_DATASET, "UNIQUE");
        zprop_register_hidden(ZFS_PROP_OBJSETID, "objsetid", PROP_TYPE_NUMBER,
            PROP_READONLY, ZFS_TYPE_DATASET, "OBJSETID");
+       zprop_register_hidden(ZFS_PROP_INCONSISTENT, "inconsistent",
+           PROP_TYPE_NUMBER, PROP_READONLY, ZFS_TYPE_DATASET, "INCONSISTENT");
 
        /* oddball properties */
        zprop_register_impl(ZFS_PROP_CREATION, "creation", PROP_TYPE_NUMBER, 0,

Modified: stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_send.c
==============================================================================
--- stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_send.c  Tue Feb 
18 13:59:06 2014        (r262157)
+++ stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_send.c  Tue Feb 
18 14:06:41 2014        (r262158)
@@ -1648,7 +1648,7 @@ dmu_recv_end_check(void *arg, dmu_tx_t *
                        return (error);
                }
                error = dsl_dataset_snapshot_check_impl(origin_head,
-                   drc->drc_tosnap, tx);
+                   drc->drc_tosnap, tx, B_TRUE);
                dsl_dataset_rele(origin_head, FTAG);
                if (error != 0)
                        return (error);
@@ -1656,7 +1656,7 @@ dmu_recv_end_check(void *arg, dmu_tx_t *
                error = dsl_destroy_head_check_impl(drc->drc_ds, 1);
        } else {
                error = dsl_dataset_snapshot_check_impl(drc->drc_ds,
-                   drc->drc_tosnap, tx);
+                   drc->drc_tosnap, tx, B_TRUE);
        }
        return (error);
 }

Modified: stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c
==============================================================================
--- stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c       
Tue Feb 18 13:59:06 2014        (r262157)
+++ stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c       
Tue Feb 18 14:06:41 2014        (r262158)
@@ -994,7 +994,7 @@ typedef struct dsl_dataset_snapshot_arg 
 
 int
 dsl_dataset_snapshot_check_impl(dsl_dataset_t *ds, const char *snapname,
-    dmu_tx_t *tx)
+    dmu_tx_t *tx, boolean_t recv)
 {
        int error;
        uint64_t value;
@@ -1020,6 +1020,18 @@ dsl_dataset_snapshot_check_impl(dsl_data
        if (error != ENOENT)
                return (error);
 
+       /*
+        * We don't allow taking snapshots of inconsistent datasets, such as
+        * those into which we are currently receiving.  However, if we are
+        * creating this snapshot as part of a receive, this check will be
+        * executed atomically with respect to the completion of the receive
+        * itself but prior to the clearing of DS_FLAG_INCONSISTENT; in this
+        * case we ignore this, knowing it will be fixed up for us shortly in
+        * dmu_recv_end_sync().
+        */
+       if (!recv && DS_IS_INCONSISTENT(ds))
+               return (SET_ERROR(EBUSY));
+
        error = dsl_dataset_snapshot_reserve_space(ds, tx);
        if (error != 0)
                return (error);
@@ -1056,7 +1068,7 @@ dsl_dataset_snapshot_check(void *arg, dm
                        error = dsl_dataset_hold(dp, dsname, FTAG, &ds);
                if (error == 0) {
                        error = dsl_dataset_snapshot_check_impl(ds,
-                           atp + 1, tx);
+                           atp + 1, tx, B_FALSE);
                        dsl_dataset_rele(ds, FTAG);
                }
 
@@ -1322,7 +1334,8 @@ dsl_dataset_snapshot_tmp_check(void *arg
        if (error != 0)
                return (error);
 
-       error = dsl_dataset_snapshot_check_impl(ds, ddsta->ddsta_snapname, tx);
+       error = dsl_dataset_snapshot_check_impl(ds, ddsta->ddsta_snapname,
+           tx, B_FALSE);
        if (error != 0) {
                dsl_dataset_rele(ds, FTAG);
                return (error);

Modified: 
stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/dsl_dataset.h
==============================================================================
--- stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/dsl_dataset.h   
Tue Feb 18 13:59:06 2014        (r262157)
+++ stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/dsl_dataset.h   
Tue Feb 18 14:06:41 2014        (r262158)
@@ -251,7 +251,7 @@ int dsl_dataset_clone_swap_check_impl(ds
 void dsl_dataset_clone_swap_sync_impl(dsl_dataset_t *clone,
     dsl_dataset_t *origin_head, dmu_tx_t *tx);
 int dsl_dataset_snapshot_check_impl(dsl_dataset_t *ds, const char *snapname,
-    dmu_tx_t *tx);
+    dmu_tx_t *tx, boolean_t recv);
 void dsl_dataset_snapshot_sync_impl(dsl_dataset_t *ds, const char *snapname,
     dmu_tx_t *tx);
 

Modified: stable/9/sys/cddl/contrib/opensolaris/uts/common/sys/fs/zfs.h
==============================================================================
--- stable/9/sys/cddl/contrib/opensolaris/uts/common/sys/fs/zfs.h       Tue Feb 
18 13:59:06 2014        (r262157)
+++ stable/9/sys/cddl/contrib/opensolaris/uts/common/sys/fs/zfs.h       Tue Feb 
18 14:06:41 2014        (r262158)
@@ -143,6 +143,7 @@ typedef enum {
        ZFS_PROP_CLONES,
        ZFS_PROP_LOGICALUSED,
        ZFS_PROP_LOGICALREFERENCED,
+       ZFS_PROP_INCONSISTENT,          /* not exposed to the user */
        ZFS_NUM_PROPS
 } zfs_prop_t;
 
_______________________________________________
svn-src-stable-9@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-stable-9
To unsubscribe, send any mail to "svn-src-stable-9-unsubscr...@freebsd.org"

Reply via email to