Whamcloud - gitweb
Add RAID stride support to resize2fs
authorTheodore Ts'o <tytso@mit.edu>
Sun, 14 May 2006 19:33:57 +0000 (15:33 -0400)
committerTheodore Ts'o <tytso@mit.edu>
Sun, 14 May 2006 19:33:57 +0000 (15:33 -0400)
Resize2fs will now automatically determine the RAID stride parameter that
had been used to create the filesystem, and use that for newly created
block groups.   The RAID stride parameter may also be manually specified
on the command line using the new -S option to resize2fs.

Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
resize/ChangeLog
resize/main.c
resize/resize2fs.8.in

index 3a972d5..ce8e2f6 100644 (file)
@@ -1,3 +1,12 @@
+2006-05-14  Theodore Tso  <tytso@mit.edu>
+
+       * main.c (main, determine_fs_stride), resize2fs.8.in: Add a new
+               option (-S) to resize2fs which allows the user to specify
+               the RAID stride parameter to be used on new block groups.
+               In addition, add code so that resize2fs can automatically
+               determine the RAID stride parameter that had been
+               previously used on the filesystem.
+
 2006-03-18  Theodore Ts'o  <tytso@mit.edu>
 
        * main.c, resize2fs.c: Change printf statements to use %u instead
index 0632c07..537c9a6 100644 (file)
@@ -94,6 +94,50 @@ static errcode_t resize_progress_func(ext2_resize_t rfs, int pass,
        return 0;
 }
 
+static void determine_fs_stride(ext2_filsys fs)
+{
+       unsigned int    group;
+       unsigned long long sum;
+       unsigned int    has_sb, prev_has_sb, num;
+       int             i_stride, b_stride;
+
+       num = 0; sum = 0;
+       for (group = 0; group < fs->group_desc_count; group++) {
+               has_sb = ext2fs_bg_has_super(fs, group);
+               if (group == 0 || has_sb != prev_has_sb)
+                       goto next;
+               b_stride = fs->group_desc[group].bg_block_bitmap - 
+                       fs->group_desc[group-1].bg_block_bitmap - 
+                       fs->super->s_blocks_per_group;
+               i_stride = fs->group_desc[group].bg_inode_bitmap - 
+                       fs->group_desc[group-1].bg_inode_bitmap - 
+                       fs->super->s_blocks_per_group;
+               if (b_stride != i_stride ||
+                   b_stride < 0)
+                       goto next;
+
+               /* printf("group %d has stride %d\n", group, b_stride); */
+               sum += b_stride;
+               num++;
+                       
+       next:
+               prev_has_sb = has_sb;
+       }
+
+       if (fs->group_desc_count > 12 && num < 3)
+               sum = 0;
+
+       if (num)
+               fs->stride = sum / num;
+       else
+               fs->stride = 0;
+
+#if 0
+       if (fs->stride)
+               printf("Using RAID stride of %d\n", fs->stride);
+#endif
+}
+
 int main (int argc, char ** argv)
 {
        errcode_t       retval;
@@ -108,6 +152,7 @@ int main (int argc, char ** argv)
        blk_t           max_size = 0;
        io_manager      io_ptr;
        char            *new_size_str = 0;
+       int             use_stride = -1;
 #ifdef HAVE_FSTAT64
        struct stat64   st_buf;
 #else
@@ -133,7 +178,7 @@ int main (int argc, char ** argv)
        if (argc && *argv)
                program_name = *argv;
 
-       while ((c = getopt (argc, argv, "d:fFhp")) != EOF) {
+       while ((c = getopt (argc, argv, "d:fFhpS:")) != EOF) {
                switch (c) {
                case 'h':
                        usage(program_name);
@@ -150,6 +195,9 @@ int main (int argc, char ** argv)
                case 'p':
                        flags |= RESIZE_PERCENT_COMPLETE;
                        break;
+               case 'S':
+                       use_stride = atoi(optarg);
+                       break;
                default:
                        usage(program_name);
                }
@@ -293,6 +341,16 @@ int main (int argc, char ** argv)
                if (sys_page_size > fs->blocksize)
                        new_size &= ~((sys_page_size / fs->blocksize)-1);
        }
+
+       if (use_stride >= 0) {
+               if (use_stride >= fs->super->s_blocks_per_group) {
+                       com_err(program_name, 0, 
+                               _("Invalid stride length"));
+                       exit(1);
+               }
+               fs->stride = use_stride;
+       } else
+                 determine_fs_stride(fs);
        
        /*
         * If we are resizing a plain file, and it's not big enough,
index 426c3ce..4f869e9 100644 (file)
@@ -12,6 +12,10 @@ resize2fs \- ext2/ext3 file system resizer
 .I debug-flags
 ]
 [
+.B \-S
+.I RAID-stride
+]
+[
 .B \-f
 ]
 [
@@ -78,7 +82,7 @@ the partition, make sure you do not make it smaller than the new size
 of the ext2 filesystem!
 .SH OPTIONS
 .TP
-.I \-d debug-flags
+.B \-d \fIdebug-flags
 Turns on various resize2fs debugging features, if they have been compiled 
 into the binary.
 .I debug-flags
@@ -93,17 +97,24 @@ from the following list:
 .br
 \      16\     \-\ Debug moving the inode table
 .TP
-.I \-p
+.B \-S \fIRAID-stride
+The 
+.B resize2fs
+program will hueristically determine the RAID stride that was specified 
+when the filesystem was created.  This option allows the user to 
+explicitly specify a RAID stride setting to be used by resize2fs instead.
+.TP
+.B \-p
 Prints out a percentage completion bars for each 
 .B resize2fs
 operation, so that the user can keep track of what
 the program is doing.
 .TP 
-.I \-f
+.B \-f
 Forces resize2fs to proceed with the filesystem resize operation, overriding 
 some safety checks which resize2fs normally enforces.
 .TP
-.I \-F
+.B \-F
 Flush the filesystem device's buffer caches before beginning.  Only
 really useful for doing 
 .B resize2fs