Skip to content

Commit

Permalink
UBIFS: allow sync option in rootflags
Browse files Browse the repository at this point in the history
When passing UBIFS parameters via kernel command line, the
sync option will be passed to UBIFS as a string, not as an
MS_SYNCHRONOUS flag. Teach UBIFS interpreting this flag.

Reported-by: Aurélien GÉRÔME <ag@debian.org>
Signed-off-by: Artem Bityutskiy <Artem.Bityutskiy@nokia.com>
  • Loading branch information
Artem Bityutskiy authored and Artem Bityutskiy committed Jun 2, 2009
1 parent 428ff9d commit 8379ea3
Showing 1 changed file with 35 additions and 5 deletions.
40 changes: 35 additions & 5 deletions fs/ubifs/super.c
Original file line number Diff line number Diff line change
Expand Up @@ -939,6 +939,27 @@ static const match_table_t tokens = {
{Opt_err, NULL},
};

/**
* parse_standard_option - parse a standard mount option.
* @option: the option to parse
*
* Normally, standard mount options like "sync" are passed to file-systems as
* flags. However, when a "rootflags=" kernel boot parameter is used, they may
* be present in the options string. This function tries to deal with this
* situation and parse standard options. Returns 0 if the option was not
* recognized, and the corresponding integer flag if it was.
*
* UBIFS is only interested in the "sync" option, so do not check for anything
* else.
*/
static int parse_standard_option(const char *option)
{
ubifs_msg("parse %s", option);
if (!strcmp(option, "sync"))
return MS_SYNCHRONOUS;
return 0;
}

/**
* ubifs_parse_options - parse mount parameters.
* @c: UBIFS file-system description object
Expand Down Expand Up @@ -1015,9 +1036,19 @@ static int ubifs_parse_options(struct ubifs_info *c, char *options,
break;
}
default:
ubifs_err("unrecognized mount option \"%s\" "
"or missing value", p);
return -EINVAL;
{
unsigned long flag;
struct super_block *sb = c->vfs_sb;

flag = parse_standard_option(p);
if (!flag) {
ubifs_err("unrecognized mount option \"%s\" "
"or missing value", p);
return -EINVAL;
}
sb->s_flags |= flag;
break;
}
}
}

Expand Down Expand Up @@ -1908,6 +1939,7 @@ static int ubifs_fill_super(struct super_block *sb, void *data, int silent)
INIT_LIST_HEAD(&c->orph_list);
INIT_LIST_HEAD(&c->orph_new);

c->vfs_sb = sb;
c->highest_inum = UBIFS_FIRST_INO;
c->lhead_lnum = c->ltail_lnum = UBIFS_LOG_LNUM;

Expand Down Expand Up @@ -1939,8 +1971,6 @@ static int ubifs_fill_super(struct super_block *sb, void *data, int silent)
if (err)
goto out_bdi;

c->vfs_sb = sb;

sb->s_fs_info = c;
sb->s_magic = UBIFS_SUPER_MAGIC;
sb->s_blocksize = UBIFS_BLOCK_SIZE;
Expand Down

0 comments on commit 8379ea3

Please sign in to comment.