* [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).