瀏覽代碼

nilfs2: accept 64-bit checkpoint numbers in cp mount option

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>
Ryusuke Konishi 14 年之前
父節點
當前提交
c05dbfc260
共有 1 個文件被更改,包括 12 次插入13 次删除
  1. 12 13
      fs/nilfs2/super.c

+ 12 - 13
fs/nilfs2/super.c

@@ -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);
 	struct nilfs_sb_info *sbi = NILFS_SB(sb);
 	char *p;
 	char *p;
 	substring_t args[MAX_OPT_ARGS];
 	substring_t args[MAX_OPT_ARGS];
-	int option;
 
 
 	if (!options)
 	if (!options)
 		return 1;
 		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);
 			nilfs_write_opt(sbi, ERROR_MODE, ERRORS_CONT);
 			break;
 			break;
 		case Opt_snapshot:
 		case Opt_snapshot:
-			if (match_int(&args[0], &option) || option <= 0)
-				return 0;
 			if (is_remount) {
 			if (is_remount) {
 				printk(KERN_ERR
 				printk(KERN_ERR
 				       "NILFS: \"%s\" option is invalid "
 				       "NILFS: \"%s\" option is invalid "
@@ -1065,7 +1062,7 @@ static int nilfs_identify(char *data, struct nilfs_super_data *sd)
 {
 {
 	char *p, *options = data;
 	char *p, *options = data;
 	substring_t args[MAX_OPT_ARGS];
 	substring_t args[MAX_OPT_ARGS];
-	int option, token;
+	int token;
 	int ret = 0;
 	int ret = 0;
 
 
 	do {
 	do {
@@ -1073,16 +1070,18 @@ static int nilfs_identify(char *data, struct nilfs_super_data *sd)
 		if (p != NULL && *p) {
 		if (p != NULL && *p) {
 			token = match_token(p, tokens, args);
 			token = match_token(p, tokens, args);
 			if (token == Opt_snapshot) {
 			if (token == Opt_snapshot) {
-				if (!(sd->flags & MS_RDONLY))
+				if (!(sd->flags & MS_RDONLY)) {
 					ret++;
 					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)
 			if (ret)