From: Theodore Ts'o Date: Sun, 14 May 2006 19:33:57 +0000 (-0400) Subject: Add RAID stride support to resize2fs X-Git-Tag: E2FSPROGS-1_39~19 X-Git-Url: https://git.whamcloud.com/gitweb?a=commitdiff_plain;h=46c5490d13eef1a80634995fd52fd35a2ff55e7f;p=tools%2Fe2fsprogs.git Add RAID stride support to resize2fs 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" --- diff --git a/resize/ChangeLog b/resize/ChangeLog index 3a972d5..ce8e2f6 100644 --- a/resize/ChangeLog +++ b/resize/ChangeLog @@ -1,3 +1,12 @@ +2006-05-14 Theodore Tso + + * 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 * main.c, resize2fs.c: Change printf statements to use %u instead diff --git a/resize/main.c b/resize/main.c index 0632c07..537c9a6 100644 --- a/resize/main.c +++ b/resize/main.c @@ -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, diff --git a/resize/resize2fs.8.in b/resize/resize2fs.8.in index 426c3ce..4f869e9 100644 --- a/resize/resize2fs.8.in +++ b/resize/resize2fs.8.in @@ -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