Author: mav
Date: Wed May 11 12:43:54 2016
New Revision: 299437
URL: https://svnweb.freebsd.org/changeset/base/299437

Log:
  MFV r299436: 6843 Make xattr dir truncate and remove in one tx
  
  Reviewed by: Brian Behlendorf <behlendo...@llnl.gov>
  Reviewed by: Dan McDonald <dan...@omniti.com>
  Reviewed by: Matthew Ahrens <mahr...@delphix.com>
  Approved by: Robert Mustacchi <r...@joyent.com>
  Author: Chunwei Chen <tux...@gmail.com>
  
  openzfs/openzfs@399cc7d5d9aff97c714b708af3e3f0280ceab93f

Modified:
  head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_dir.c
Directory Properties:
  head/sys/cddl/contrib/opensolaris/   (props changed)

Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_dir.c
==============================================================================
--- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_dir.c       Wed May 
11 12:39:53 2016        (r299436)
+++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_dir.c       Wed May 
11 12:43:54 2016        (r299437)
@@ -611,19 +611,25 @@ zfs_rmnode(znode_t *zp)
                        zfs_znode_free(zp);
                        return;
                }
-       }
-
-       /*
-        * Free up all the data in the file.
-        */
-       error = dmu_free_long_range(os, zp->z_id, 0, DMU_OBJECT_END);
-       if (error) {
+       } else {
                /*
-                * Not enough space.  Leave the file in the unlinked set.
+                * Free up all the data in the file.  We don't do this for
+                * XATTR directories because we need truncate and remove to be
+                * in the same tx, like in zfs_znode_delete(). Otherwise, if
+                * we crash here we'll end up with an inconsistent truncated
+                * zap object in the delete queue.  Note a truncated file is
+                * harmless since it only contains user data.
                 */
-               zfs_znode_dmu_fini(zp);
-               zfs_znode_free(zp);
-               return;
+               error = dmu_free_long_range(os, zp->z_id, 0, DMU_OBJECT_END);
+               if (error) {
+                       /*
+                        * Not enough space.  Leave the file in the unlinked
+                        * set.
+                        */
+                       zfs_znode_dmu_fini(zp);
+                       zfs_znode_free(zp);
+                       return;
+               }
        }
 
        /*
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to