diff options
author | Jaegeuk Kim <jaegeuk@kernel.org> | 2015-01-23 20:41:39 -0500 |
---|---|---|
committer | Jaegeuk Kim <jaegeuk@kernel.org> | 2015-02-11 20:04:39 -0500 |
commit | dabc4a5c60f796a8e7171272284ba077f9c1e439 (patch) | |
tree | cf56e2d0756a2b61f44baeb10e536b2babf43e94 /fs/f2fs/super.c | |
parent | caf0047e7e1e60a7ad1d655d3b81b32e2dfb6095 (diff) |
f2fs: fix not to drop mount options when retrying fill_super
If wrong mount option was requested, f2fs tries to fill_super again.
But, during the next trial, f2fs has no valid mount options, since
parse_options deleted all the separators in the original string.
Reviewed-by: Chao Yu <chao2.yu@samsung.com>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
Diffstat (limited to 'fs/f2fs/super.c')
-rw-r--r-- | fs/f2fs/super.c | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c index c3aa72f9c8c8..146e310fbf04 100644 --- a/fs/f2fs/super.c +++ b/fs/f2fs/super.c | |||
@@ -951,6 +951,7 @@ static int f2fs_fill_super(struct super_block *sb, void *data, int silent) | |||
951 | struct inode *root; | 951 | struct inode *root; |
952 | long err = -EINVAL; | 952 | long err = -EINVAL; |
953 | bool retry = true; | 953 | bool retry = true; |
954 | char *options = NULL; | ||
954 | int i; | 955 | int i; |
955 | 956 | ||
956 | try_onemore: | 957 | try_onemore: |
@@ -982,9 +983,15 @@ try_onemore: | |||
982 | set_opt(sbi, POSIX_ACL); | 983 | set_opt(sbi, POSIX_ACL); |
983 | #endif | 984 | #endif |
984 | /* parse mount options */ | 985 | /* parse mount options */ |
985 | err = parse_options(sb, (char *)data); | 986 | options = kstrdup((const char *)data, GFP_KERNEL); |
986 | if (err) | 987 | if (data && !options) { |
988 | err = -ENOMEM; | ||
987 | goto free_sb_buf; | 989 | goto free_sb_buf; |
990 | } | ||
991 | |||
992 | err = parse_options(sb, options); | ||
993 | if (err) | ||
994 | goto free_options; | ||
988 | 995 | ||
989 | sb->s_maxbytes = max_file_size(le32_to_cpu(raw_super->log_blocksize)); | 996 | sb->s_maxbytes = max_file_size(le32_to_cpu(raw_super->log_blocksize)); |
990 | sb->s_max_links = F2FS_LINK_MAX; | 997 | sb->s_max_links = F2FS_LINK_MAX; |
@@ -1028,7 +1035,7 @@ try_onemore: | |||
1028 | if (IS_ERR(sbi->meta_inode)) { | 1035 | if (IS_ERR(sbi->meta_inode)) { |
1029 | f2fs_msg(sb, KERN_ERR, "Failed to read F2FS meta data inode"); | 1036 | f2fs_msg(sb, KERN_ERR, "Failed to read F2FS meta data inode"); |
1030 | err = PTR_ERR(sbi->meta_inode); | 1037 | err = PTR_ERR(sbi->meta_inode); |
1031 | goto free_sb_buf; | 1038 | goto free_options; |
1032 | } | 1039 | } |
1033 | 1040 | ||
1034 | err = get_valid_checkpoint(sbi); | 1041 | err = get_valid_checkpoint(sbi); |
@@ -1153,6 +1160,7 @@ try_onemore: | |||
1153 | if (err) | 1160 | if (err) |
1154 | goto free_kobj; | 1161 | goto free_kobj; |
1155 | } | 1162 | } |
1163 | kfree(options); | ||
1156 | return 0; | 1164 | return 0; |
1157 | 1165 | ||
1158 | free_kobj: | 1166 | free_kobj: |
@@ -1177,6 +1185,8 @@ free_cp: | |||
1177 | free_meta_inode: | 1185 | free_meta_inode: |
1178 | make_bad_inode(sbi->meta_inode); | 1186 | make_bad_inode(sbi->meta_inode); |
1179 | iput(sbi->meta_inode); | 1187 | iput(sbi->meta_inode); |
1188 | free_options: | ||
1189 | kfree(options); | ||
1180 | free_sb_buf: | 1190 | free_sb_buf: |
1181 | brelse(raw_super_buf); | 1191 | brelse(raw_super_buf); |
1182 | free_sbi: | 1192 | free_sbi: |