nilfs2: accept 64-bit checkpoint numbers in cp mount option
authorRyusuke Konishi <konishi.ryusuke@lab.ntt.co.jp>
Wed, 15 Sep 2010 15:36:24 +0000 (00:36 +0900)
committerRyusuke Konishi <konishi.ryusuke@lab.ntt.co.jp>
Sat, 23 Oct 2010 00:24:39 +0000 (09:24 +0900)
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>
fs/nilfs2/super.c

index d92ebd5..a1cd444 100644 (file)
@@ -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;
@@ -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 "
@@ -1065,7 +1062,7 @@ 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 {
@@ -1073,16 +1070,18 @@ static int nilfs_identify(char *data, struct nilfs_super_data *sd)
                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)