How does the following change look to you?
If it's good, is anyone up to integrating it into illumos?

Thanks!

commit 380a6d6c42ff89f623d44fc78e67370012eb960e
Author: Andriy Gapon <[email protected]>
Date:   Mon Oct 14 09:39:15 2013 +0300

    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.

diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_traverse.c
b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_traverse.c
index 1ff47c8..a0ca63f 100644
--- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_traverse.c
+++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_traverse.c
@@ -329,9 +329,9 @@ traverse_visitbp(traverse_data_t *td, const dnode_phys_t 
*dnp,
                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);
                }

@@ -342,18 +342,18 @@ traverse_visitbp(traverse_data_t *td, const dnode_phys_t 
*dnp,
                        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);
                }
        }


-- 
Andriy Gapon
_______________________________________________
developer mailing list
[email protected]
http://lists.open-zfs.org/mailman/listinfo/developer

Reply via email to