Skip to content

Commit

Permalink
nilfs2: accept 64-bit checkpoint numbers in cp mount option
Browse files Browse the repository at this point in the history
The current implementation doesn't mount snapshots with checkpoint
numbers larger than INT_MAX since it uses match_int() for parsing
"cp=" mount option.

This uses simple_strtoull() for the conversion to resolve the issue.

Signed-off-by: Ryusuke Konishi <konishi.ryusuke@lab.ntt.co.jp>
  • Loading branch information
Ryusuke Konishi committed Oct 23, 2010
1 parent 2879ed6 commit c05dbfc
Showing 1 changed file with 12 additions and 13 deletions.
25 changes: 12 additions & 13 deletions fs/nilfs2/super.c
Original file line number Diff line number Diff line change
Expand Up @@ -556,7 +556,6 @@ static int parse_options(char *options, struct super_block *sb, int is_remount)
struct nilfs_sb_info *sbi = NILFS_SB(sb);
char *p;
substring_t args[MAX_OPT_ARGS];
int option;

if (!options)
return 1;
Expand Down Expand Up @@ -594,8 +593,6 @@ static int parse_options(char *options, struct super_block *sb, int is_remount)
nilfs_write_opt(sbi, ERROR_MODE, ERRORS_CONT);
break;
case Opt_snapshot:
if (match_int(&args[0], &option) || option <= 0)
return 0;
if (is_remount) {
printk(KERN_ERR
"NILFS: \"%s\" option is invalid "
Expand Down Expand Up @@ -1065,24 +1062,26 @@ static int nilfs_identify(char *data, struct nilfs_super_data *sd)
{
char *p, *options = data;
substring_t args[MAX_OPT_ARGS];
int option, token;
int token;
int ret = 0;

do {
p = strsep(&options, ",");
if (p != NULL && *p) {
token = match_token(p, tokens, args);
if (token == Opt_snapshot) {
if (!(sd->flags & MS_RDONLY))
if (!(sd->flags & MS_RDONLY)) {
ret++;
else {
ret = match_int(&args[0], &option);
if (!ret) {
if (option > 0)
sd->cno = option;
else
ret++;
}
} else {
sd->cno = simple_strtoull(args[0].from,
NULL, 0);
/*
* No need to see the end pointer;
* match_token() has done syntax
* checking.
*/
if (sd->cno == 0)
ret++;
}
}
if (ret)
Expand Down

0 comments on commit c05dbfc

Please sign in to comment.