* [patch 4/4] reiser4: reduce frame size of reiser4_init_super_data @ 2009-10-05 0:40 Edward Shishkin 2009-10-07 19:45 ` Laurent Riffard 0 siblings, 1 reply; 4+ messages in thread From: Edward Shishkin @ 2009-10-05 0:40 UTC (permalink / raw) To: akpm, ReiserFS Development List [-- Attachment #1: Type: text/plain, Size: 1 bytes --] [-- Attachment #2: reiser4-reduce-frame-size.patch --] [-- Type: text/plain, Size: 5784 bytes --] Address a gcc warning for x86_64 about large frame size. Add a new function push_sb_field_opts(). Signed-off-by Edward Shsihkin <edward.shishkin@gmail.com> --- fs/reiser4/init_super.c | 126 +++++++++++++++++++++++++----------------------- 1 file changed, 66 insertions(+), 60 deletions(-) --- mmotm.orig/fs/reiser4/init_super.c +++ mmotm/fs/reiser4/init_super.c @@ -292,66 +292,6 @@ static int parse_options(char *opt_strin #define MAX_NR_OPTIONS (30) -/** - * reiser4_init_super_data - initialize reiser4 private super block - * @super: super block to initialize - * @opt_string: list of reiser4 mount options - * - * Sets various reiser4 parameters to default values. Parses mount options and - * overwrites default settings. - */ -int reiser4_init_super_data(struct super_block *super, char *opt_string) -{ - int result; - struct opt_desc *opts, *p; - reiser4_super_info_data *sbinfo = get_super_private(super); - - /* initialize super, export, dentry operations */ - sbinfo->ops.super = reiser4_super_operations; - sbinfo->ops.export = reiser4_export_operations; - sbinfo->ops.dentry = reiser4_dentry_operations; - super->s_op = &sbinfo->ops.super; - super->s_export_op = &sbinfo->ops.export; - - /* initialize transaction manager parameters to default values */ - sbinfo->tmgr.atom_max_size = totalram_pages / 4; - sbinfo->tmgr.atom_max_age = REISER4_ATOM_MAX_AGE / HZ; - sbinfo->tmgr.atom_min_size = 256; - sbinfo->tmgr.atom_max_flushers = ATOM_MAX_FLUSHERS; - - /* initialize cbk cache parameter */ - sbinfo->tree.cbk_cache.nr_slots = CBK_CACHE_SLOTS; - - /* initialize flush parameters */ - sbinfo->flush.relocate_threshold = FLUSH_RELOCATE_THRESHOLD; - sbinfo->flush.relocate_distance = FLUSH_RELOCATE_DISTANCE; - sbinfo->flush.written_threshold = FLUSH_WRITTEN_THRESHOLD; - sbinfo->flush.scan_maxnodes = FLUSH_SCAN_MAXNODES; - - sbinfo->optimal_io_size = REISER4_OPTIMAL_IO_SIZE; - - /* preliminary tree initializations */ - sbinfo->tree.super = super; - sbinfo->tree.carry.new_node_flags = REISER4_NEW_NODE_FLAGS; - sbinfo->tree.carry.new_extent_flags = REISER4_NEW_EXTENT_FLAGS; - sbinfo->tree.carry.paste_flags = REISER4_PASTE_FLAGS; - sbinfo->tree.carry.insert_flags = REISER4_INSERT_FLAGS; - rwlock_init(&(sbinfo->tree.tree_lock)); - spin_lock_init(&(sbinfo->tree.epoch_lock)); - - /* initialize default readahead params */ - sbinfo->ra_params.max = num_physpages / 4; - sbinfo->ra_params.flags = 0; - - /* allocate memory for structure describing reiser4 mount options */ - opts = kmalloc(sizeof(struct opt_desc) * MAX_NR_OPTIONS, - reiser4_ctx_gfp_mask_get()); - if (opts == NULL) - return RETERR(-ENOMEM); - - /* initialize structure describing reiser4 mount options */ - p = opts; - #if REISER4_DEBUG # define OPT_ARRAY_CHECK if ((p) > (opts) + MAX_NR_OPTIONS) { \ warning("zam-1046", "opt array is overloaded"); break; \ @@ -370,6 +310,10 @@ do { \ #define PUSH_SB_FIELD_OPT(field, format) PUSH_OPT(SB_FIELD_OPT(field, format)) #define PUSH_BIT_OPT(name, bit) PUSH_OPT(BIT_OPT(name, bit)) +static noinline void push_sb_field_opts(struct opt_desc *p, + struct opt_desc *opts, + reiser4_super_info_data *sbinfo) +{ /* * tmgr.atom_max_size=N * Atoms containing more than N blocks will be forced to commit. N is @@ -435,7 +379,69 @@ do { \ */ PUSH_SB_FIELD_OPT(altsuper, "%lu"); #endif +} + +/** + * reiser4_init_super_data - initialize reiser4 private super block + * @super: super block to initialize + * @opt_string: list of reiser4 mount options + * + * Sets various reiser4 parameters to default values. Parses mount options and + * overwrites default settings. + */ +int reiser4_init_super_data(struct super_block *super, char *opt_string) +{ + int result; + struct opt_desc *opts, *p; + reiser4_super_info_data *sbinfo = get_super_private(super); + + /* initialize super, export, dentry operations */ + sbinfo->ops.super = reiser4_super_operations; + sbinfo->ops.export = reiser4_export_operations; + sbinfo->ops.dentry = reiser4_dentry_operations; + super->s_op = &sbinfo->ops.super; + super->s_export_op = &sbinfo->ops.export; + + /* initialize transaction manager parameters to default values */ + sbinfo->tmgr.atom_max_size = totalram_pages / 4; + sbinfo->tmgr.atom_max_age = REISER4_ATOM_MAX_AGE / HZ; + sbinfo->tmgr.atom_min_size = 256; + sbinfo->tmgr.atom_max_flushers = ATOM_MAX_FLUSHERS; + + /* initialize cbk cache parameter */ + sbinfo->tree.cbk_cache.nr_slots = CBK_CACHE_SLOTS; + + /* initialize flush parameters */ + sbinfo->flush.relocate_threshold = FLUSH_RELOCATE_THRESHOLD; + sbinfo->flush.relocate_distance = FLUSH_RELOCATE_DISTANCE; + sbinfo->flush.written_threshold = FLUSH_WRITTEN_THRESHOLD; + sbinfo->flush.scan_maxnodes = FLUSH_SCAN_MAXNODES; + + sbinfo->optimal_io_size = REISER4_OPTIMAL_IO_SIZE; + + /* preliminary tree initializations */ + sbinfo->tree.super = super; + sbinfo->tree.carry.new_node_flags = REISER4_NEW_NODE_FLAGS; + sbinfo->tree.carry.new_extent_flags = REISER4_NEW_EXTENT_FLAGS; + sbinfo->tree.carry.paste_flags = REISER4_PASTE_FLAGS; + sbinfo->tree.carry.insert_flags = REISER4_INSERT_FLAGS; + rwlock_init(&(sbinfo->tree.tree_lock)); + spin_lock_init(&(sbinfo->tree.epoch_lock)); + + /* initialize default readahead params */ + sbinfo->ra_params.max = num_physpages / 4; + sbinfo->ra_params.flags = 0; + + /* allocate memory for structure describing reiser4 mount options */ + opts = kmalloc(sizeof(struct opt_desc) * MAX_NR_OPTIONS, + reiser4_ctx_gfp_mask_get()); + if (opts == NULL) + return RETERR(-ENOMEM); + + /* initialize structure describing reiser4 mount options */ + p = opts; + push_sb_field_opts(p, opts, sbinfo); /* turn on BSD-style gid assignment */ PUSH_BIT_OPT("bsdgroups", REISER4_BSD_GID); /* turn on 32 bit times */ ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [patch 4/4] reiser4: reduce frame size of reiser4_init_super_data 2009-10-05 0:40 [patch 4/4] reiser4: reduce frame size of reiser4_init_super_data Edward Shishkin @ 2009-10-07 19:45 ` Laurent Riffard 2009-10-07 19:54 ` Laurent Riffard 2009-10-07 20:05 ` [patch] reiser4: reduce frame size of reiser4_init_super_data fixup Edward Shishkin 0 siblings, 2 replies; 4+ messages in thread From: Laurent Riffard @ 2009-10-07 19:45 UTC (permalink / raw) To: Edward Shishkin; +Cc: akpm, ReiserFS Development List Hi Edward, This patch is buggy, isn't it ? I've got 2 reiser4 FS in my /etc/fstab: /dev/vglinux1/lvkernel-r4 /home/laurent/kernel reiser4 defaults,noatime,nodiratime,tmgr.atom_max_size=2048 0 0 /dev/disk/by-uuid/b8dbe880-b664-49aa-8050-bddc91fd5e49 /mnt/diske reiser4 noauto,users,noatime,nodiratime 0 0 The first FS can't be mounted: [ 235.078342] reiser4[mount(4205)]: parse_options (fs/reiser4/init_super.c:253)[nikita-2307]: [ 235.078345] WARNING: Unrecognized option: "tmgr.atom_max_size=2048" although the second one can be mounted: [ 3152.046324] reiser4: sda7: found disk format 4.0.0. Let's have a look at the code in fs/reiser4/init_super.c: 392 int reiser4_init_super_data(struct super_block *super, char *opt_string) 393 { 394 int result; 395 struct opt_desc *opts, *p; 396 reiser4_super_info_data *sbinfo = get_super_private(super); 397 ... 442 p = opts; 443 444 push_sb_field_opts(p, opts, sbinfo); p is passed by value to push_sb_field(). push_sb_field() does increment its local copy of p, but here p remains equal to opts. ... 501 result = parse_options(opt_string, opts, p - opts); 3rd argument is 0 because p==opts. Now let's have a look at parse_options() 230 static int parse_options(char *opt_string, struct opt_desc *opts, int nr_opts) 231 { nr_opts always == 0 here. 232 int result; 233 234 result = 0; 235 while ((result == 0) && opt_string && *opt_string) { I assume opt_string is not null (opt_string == "tmgr.atom_max_size=2048" ?), so let's loop: 236 int j; 237 char *next; 244 for (j = 0; j < nr_opts; ++j) { nr_opts == 0, so we won't do any iteration here. 245 if (!strncmp(opt_string, opts[j].name, 246 strlen(opts[j].name))) { 247 result = parse_option(opt_string, &opts[j]); 248 break; 249 } 250 } here, j==0 and nr_opts==0. 251 if (j == nr_opts) { 252 warning("nikita-2307", "Unrecognized option: \"%s\"", 253 opt_string); 254 /* traditionally, -EINVAL is returned on wrong mount 255 option */ 256 result = RETERR(-EINVAL); oops ! ~~ laurent ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [patch 4/4] reiser4: reduce frame size of reiser4_init_super_data 2009-10-07 19:45 ` Laurent Riffard @ 2009-10-07 19:54 ` Laurent Riffard 2009-10-07 20:05 ` [patch] reiser4: reduce frame size of reiser4_init_super_data fixup Edward Shishkin 1 sibling, 0 replies; 4+ messages in thread From: Laurent Riffard @ 2009-10-07 19:54 UTC (permalink / raw) Cc: Edward Shishkin, akpm, ReiserFS Development List Oops, sorry, Edward already sent a patch for this... ~~ laurent Le 07/10/2009 21:45, Laurent Riffard a écrit : > Hi Edward, > > This patch is buggy, isn't it ? > > I've got 2 reiser4 FS in my /etc/fstab: > > /dev/vglinux1/lvkernel-r4 /home/laurent/kernel reiser4 defaults,noatime,nodiratime,tmgr.atom_max_size=2048 0 0 > /dev/disk/by-uuid/b8dbe880-b664-49aa-8050-bddc91fd5e49 /mnt/diske reiser4 noauto,users,noatime,nodiratime 0 0 > > The first FS can't be mounted: > > [ 235.078342] reiser4[mount(4205)]: parse_options (fs/reiser4/init_super.c:253)[nikita-2307]: > [ 235.078345] WARNING: Unrecognized option: "tmgr.atom_max_size=2048" > > although the second one can be mounted: > > [ 3152.046324] reiser4: sda7: found disk format 4.0.0. > > > Let's have a look at the code in fs/reiser4/init_super.c: > > > 392 int reiser4_init_super_data(struct super_block *super, char *opt_string) > 393 { > 394 int result; > 395 struct opt_desc *opts, *p; > 396 reiser4_super_info_data *sbinfo = get_super_private(super); > 397 > ... > 442 p = opts; > 443 > 444 push_sb_field_opts(p, opts, sbinfo); > > p is passed by value to push_sb_field(). push_sb_field() does increment > its local copy of p, but here p remains equal to opts. > > ... > 501 result = parse_options(opt_string, opts, p - opts); > > 3rd argument is 0 because p==opts. Now let's have a look at parse_options() > > 230 static int parse_options(char *opt_string, struct opt_desc *opts, int nr_opts) > 231 { > > nr_opts always == 0 here. > > 232 int result; > 233 > 234 result = 0; > 235 while ((result == 0) && opt_string && *opt_string) { > > I assume opt_string is not null (opt_string == "tmgr.atom_max_size=2048" ?), > so let's loop: > > 236 int j; > 237 char *next; > 244 for (j = 0; j < nr_opts; ++j) { > > nr_opts == 0, so we won't do any iteration here. > > 245 if (!strncmp(opt_string, opts[j].name, > 246 strlen(opts[j].name))) { > 247 result = parse_option(opt_string, &opts[j]); > 248 break; > 249 } > 250 } > > here, j==0 and nr_opts==0. > > 251 if (j == nr_opts) { > 252 warning("nikita-2307", "Unrecognized option: \"%s\"", > 253 opt_string); > 254 /* traditionally, -EINVAL is returned on wrong mount > 255 option */ > 256 result = RETERR(-EINVAL); > > oops ! > > ~~ > laurent > -- > To unsubscribe from this list: send the line "unsubscribe reiserfs-devel" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > -- To unsubscribe from this list: send the line "unsubscribe reiserfs-devel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 4+ messages in thread
* [patch] reiser4: reduce frame size of reiser4_init_super_data fixup 2009-10-07 19:45 ` Laurent Riffard 2009-10-07 19:54 ` Laurent Riffard @ 2009-10-07 20:05 ` Edward Shishkin 1 sibling, 0 replies; 4+ messages in thread From: Edward Shishkin @ 2009-10-07 20:05 UTC (permalink / raw) To: Laurent Riffard, akpm; +Cc: ReiserFS Development List [-- Attachment #1: Type: text/plain, Size: 725 bytes --] Laurent Riffard wrote: > Hi Edward, > Hello Laurent. > This patch is buggy, isn't it ? > Yes, sorry, my fault.. I have sent the fixup already to the list yesterday.. Resending for you and Akpm. Andrew, please apply. Thanks. Edward. > I've got 2 reiser4 FS in my /etc/fstab: > > /dev/vglinux1/lvkernel-r4 /home/laurent/kernel reiser4 defaults,noatime,nodiratime,tmgr.atom_max_size=2048 0 0 > /dev/disk/by-uuid/b8dbe880-b664-49aa-8050-bddc91fd5e49 /mnt/diske reiser4 noauto,users,noatime,nodiratime 0 0 > > The first FS can't be mounted: > > [ 235.078342] reiser4[mount(4205)]: parse_options (fs/reiser4/init_super.c:253)[nikita-2307]: > [ 235.078345] WARNING: Unrecognized option: "tmgr.atom_max_size=2048" > [-- Attachment #2: reiser4-reduce-frame-size-fix.patch --] [-- Type: text/plain, Size: 2644 bytes --] . Fix up the bug in reiser4_init_super_data(): The pointer "p" to opt_desc structure is not incremented. Pass "&p" instead of "p" to push_sb_field_opts(), which is supposed to increment the pointer. . Modify macros PUSH_OPT, OPT_ARRAY_CHECK to accept arguments. Signed-off-by Edward Shsihkin <edward.shishkin@gmail.com> --- fs/reiser4/init_super.c | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) --- mmotm.orig/fs/reiser4/init_super.c +++ mmotm/fs/reiser4/init_super.c @@ -293,27 +293,27 @@ static int parse_options(char *opt_strin #define MAX_NR_OPTIONS (30) #if REISER4_DEBUG -# define OPT_ARRAY_CHECK if ((p) > (opts) + MAX_NR_OPTIONS) { \ +# define OPT_ARRAY_CHECK(opt, array) \ + if ((opt) > (array) + MAX_NR_OPTIONS) { \ warning("zam-1046", "opt array is overloaded"); break; \ } #else -# define OPT_ARRAY_CHECK noop +# define OPT_ARRAY_CHECK(opt, array) noop #endif -#define PUSH_OPT(...) \ +#define PUSH_OPT(opt, array, ...) \ do { \ struct opt_desc o = __VA_ARGS__; \ - OPT_ARRAY_CHECK; \ - *p ++ = o; \ + OPT_ARRAY_CHECK(opt, array); \ + *(opt) ++ = o; \ } while (0) -#define PUSH_SB_FIELD_OPT(field, format) PUSH_OPT(SB_FIELD_OPT(field, format)) -#define PUSH_BIT_OPT(name, bit) PUSH_OPT(BIT_OPT(name, bit)) - -static noinline void push_sb_field_opts(struct opt_desc *p, +static noinline void push_sb_field_opts(struct opt_desc **p, struct opt_desc *opts, reiser4_super_info_data *sbinfo) { +#define PUSH_SB_FIELD_OPT(field, format) \ + PUSH_OPT(*p, opts, SB_FIELD_OPT(field, format)) /* * tmgr.atom_max_size=N * Atoms containing more than N blocks will be forced to commit. N is @@ -441,8 +441,12 @@ int reiser4_init_super_data(struct super /* initialize structure describing reiser4 mount options */ p = opts; - push_sb_field_opts(p, opts, sbinfo); + push_sb_field_opts(&p, opts, sbinfo); /* turn on BSD-style gid assignment */ + +#define PUSH_BIT_OPT(name, bit) \ + PUSH_OPT(p, opts, BIT_OPT(name, bit)) + PUSH_BIT_OPT("bsdgroups", REISER4_BSD_GID); /* turn on 32 bit times */ PUSH_BIT_OPT("32bittimes", REISER4_32_BIT_TIMES); @@ -456,7 +460,7 @@ int reiser4_init_super_data(struct super /* disable use of write barriers in the reiser4 log writer. */ PUSH_BIT_OPT("no_write_barrier", REISER4_NO_WRITE_BARRIER); - PUSH_OPT( + PUSH_OPT(p, opts, { /* * tree traversal readahead parameters: @@ -482,7 +486,7 @@ int reiser4_init_super_data(struct super ); /* What to do in case of fs error */ - PUSH_OPT( + PUSH_OPT(p, opts, { .name = "onerror", .type = OPT_ONEOF, ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2009-10-07 20:05 UTC | newest] Thread overview: 4+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2009-10-05 0:40 [patch 4/4] reiser4: reduce frame size of reiser4_init_super_data Edward Shishkin 2009-10-07 19:45 ` Laurent Riffard 2009-10-07 19:54 ` Laurent Riffard 2009-10-07 20:05 ` [patch] reiser4: reduce frame size of reiser4_init_super_data fixup Edward Shishkin
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).