Author: avg
Date: Fri Jan 17 10:23:46 2014
New Revision: 260812
URL: http://svnweb.freebsd.org/changeset/base/260812

Log:
  traverse_visitbp: visit DMU_GROUPUSED_OBJECT before DMU_USERUSED_OBJECT
  
  This is done to ensure that visited object IDs are always increasing.
  Also, pass correct object ID to prefetch_dnode_metadata for
  os_groupused_dnode.
  
  Without this change we would hit an assert if traversal was paused on
  a GROUPUSED object, which is unlikely but possible.
  
  Apparently the same change was independently developed by Deplhix.
  
  Reviewed by:  Matthew Ahrens <[email protected]>
  MFC after:    10 days
  Sponsored by: HybridCluster

Modified:
  head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_traverse.c

Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_traverse.c
==============================================================================
--- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_traverse.c  Fri Jan 
17 10:18:45 2014        (r260811)
+++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_traverse.c  Fri Jan 
17 10:23:46 2014        (r260812)
@@ -351,9 +351,9 @@ traverse_visitbp(traverse_data_t *td, co
                prefetch_dnode_metadata(td, dnp, zb->zb_objset,
                    DMU_META_DNODE_OBJECT);
                if (arc_buf_size(buf) >= sizeof (objset_phys_t)) {
-                       prefetch_dnode_metadata(td, &osp->os_userused_dnode,
-                           zb->zb_objset, DMU_USERUSED_OBJECT);
                        prefetch_dnode_metadata(td, &osp->os_groupused_dnode,
+                           zb->zb_objset, DMU_GROUPUSED_OBJECT);
+                       prefetch_dnode_metadata(td, &osp->os_userused_dnode,
                            zb->zb_objset, DMU_USERUSED_OBJECT);
                }
 
@@ -364,18 +364,18 @@ traverse_visitbp(traverse_data_t *td, co
                        err = 0;
                }
                if (err == 0 && arc_buf_size(buf) >= sizeof (objset_phys_t)) {
-                       dnp = &osp->os_userused_dnode;
+                       dnp = &osp->os_groupused_dnode;
                        err = traverse_dnode(td, dnp, zb->zb_objset,
-                           DMU_USERUSED_OBJECT);
+                           DMU_GROUPUSED_OBJECT);
                }
                if (err && hard) {
                        lasterr = err;
                        err = 0;
                }
                if (err == 0 && arc_buf_size(buf) >= sizeof (objset_phys_t)) {
-                       dnp = &osp->os_groupused_dnode;
+                       dnp = &osp->os_userused_dnode;
                        err = traverse_dnode(td, dnp, zb->zb_objset,
-                           DMU_GROUPUSED_OBJECT);
+                           DMU_USERUSED_OBJECT);
                }
        }
 
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "[email protected]"

Reply via email to