Author: avg
Date: Mon May 11 09:43:16 2015
New Revision: 282765
URL: https://svnweb.freebsd.org/changeset/base/282765

Log:
  MFC r282131: replace a comment about zfs recv -F corner case with a longer one

Modified:
  stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c
Directory Properties:
  stable/9/sys/   (props changed)
  stable/9/sys/cddl/contrib/opensolaris/   (props changed)

Modified: stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c
==============================================================================
--- stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c Mon May 
11 09:43:03 2015        (r282764)
+++ stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c Mon May 
11 09:43:16 2015        (r282765)
@@ -1319,15 +1319,25 @@ zfs_rezget(znode_t *zp)
        }
 
        /*
-        * XXXPJD: Not sure how is that possible, but under heavy
-        * zfs recv -F load it happens that z_gen is the same, but
-        * vnode type is different than znode type. This would mean
-        * that for example regular file was replaced with directory
-        * which has the same object number.
+        * It is highly improbable but still quite possible that two
+        * objects in different datasets are created with the same
+        * object numbers and in transaction groups with the same
+        * numbers.  znodes corresponding to those objects would
+        * have the same z_id and z_gen, but their other attributes
+        * may be different.
+        * zfs recv -F may replace one of such objects with the other.
+        * As a result file properties recorded in the replaced
+        * object's vnode may no longer match the received object's
+        * properties.  At present the only cached property is the
+        * files type recorded in v_type.
+        * So, handle this case by leaving the old vnode and znode
+        * disassociated from the actual object.  A new vnode and a
+        * znode will be created if the object is accessed
+        * (e.g. via a look-up).  The old vnode and znode will be
+        * recycled when the last vnode reference is dropped.
         */
        vp = ZTOV(zp);
-       if (vp != NULL &&
-           vp->v_type != IFTOVT((mode_t)zp->z_mode)) {
+       if (vp != NULL && vp->v_type != IFTOVT((mode_t)zp->z_mode)) {
                zfs_znode_dmu_fini(zp);
                ZFS_OBJ_HOLD_EXIT(zfsvfs, obj_num);
                return (EIO);
_______________________________________________
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