Whamcloud - gitweb
LU-1452 scrub: OI scrub skips uninitialized groups
[fs/lustre-release.git] / lustre / osd-ldiskfs / osd_scrub.c
index 547bb11..709d650 100644 (file)
@@ -1164,8 +1164,22 @@ static int osd_inode_iteration(struct osd_thread_info *info,
 
        while (*pos <= limit && *count < max) {
                struct osd_idmap_cache *oic = NULL;
+               struct ldiskfs_group_desc *desc;
 
                param.bg = (*pos - 1) / LDISKFS_INODES_PER_GROUP(param.sb);
+               desc = ldiskfs_get_group_desc(param.sb, param.bg, NULL);
+               if (desc == NULL)
+                       RETURN(-EIO);
+
+               ldiskfs_lock_group(param.sb, param.bg);
+               if (desc->bg_flags & cpu_to_le16(LDISKFS_BG_INODE_UNINIT)) {
+                       ldiskfs_unlock_group(param.sb, param.bg);
+                       *pos = 1 + (param.bg + 1) *
+                               LDISKFS_INODES_PER_GROUP(param.sb);
+                       continue;
+               }
+               ldiskfs_unlock_group(param.sb, param.bg);
+
                param.offset = (*pos - 1) % LDISKFS_INODES_PER_GROUP(param.sb);
                param.gbase = 1 + param.bg * LDISKFS_INODES_PER_GROUP(param.sb);
                param.bitmap = ldiskfs_read_inode_bitmap(param.sb, param.bg);
@@ -1179,6 +1193,11 @@ static int osd_inode_iteration(struct osd_thread_info *info,
 
                while (param.offset < LDISKFS_INODES_PER_GROUP(param.sb) &&
                       *count < max) {
+                       if (param.offset +
+                               ldiskfs_itable_unused_count(param.sb, desc) >
+                           LDISKFS_INODES_PER_GROUP(param.sb))
+                               goto next_group;
+
                        rc = next(info, dev, &param, &oic, noslot);
                        switch (rc) {
                        case SCRUB_NEXT_BREAK: