diff options
| -rw-r--r-- | fs/hfsplus/hfsplus_fs.h | 1 | ||||
| -rw-r--r-- | fs/hfsplus/options.c | 26 | ||||
| -rw-r--r-- | fs/hfsplus/super.c | 8 | 
3 files changed, 30 insertions, 5 deletions
diff --git a/fs/hfsplus/hfsplus_fs.h b/fs/hfsplus/hfsplus_fs.h index cb3653efb57..f07aa640c27 100644 --- a/fs/hfsplus/hfsplus_fs.h +++ b/fs/hfsplus/hfsplus_fs.h @@ -362,6 +362,7 @@ ssize_t hfsplus_listxattr(struct dentry *dentry, char *buffer, size_t size);  /* options.c */  int hfsplus_parse_options(char *, struct hfsplus_sb_info *); +int hfsplus_parse_options_remount(char *input, int *force);  void hfsplus_fill_defaults(struct hfsplus_sb_info *);  int hfsplus_show_options(struct seq_file *, struct vfsmount *); diff --git a/fs/hfsplus/options.c b/fs/hfsplus/options.c index f9ab276a4d8..43b02b5525e 100644 --- a/fs/hfsplus/options.c +++ b/fs/hfsplus/options.c @@ -65,6 +65,32 @@ static inline int match_fourchar(substring_t *arg, u32 *result)  	return 0;  } +int hfsplus_parse_options_remount(char *input, int *force) +{ +	char *p; +	substring_t args[MAX_OPT_ARGS]; +	int token; + +	if (!input) +		return 0; + +	while ((p = strsep(&input, ",")) != NULL) { +		if (!*p) +			continue; + +		token = match_token(p, tokens, args); +		switch (token) { +		case opt_force: +			*force = 1; +			break; +		default: +			break; +		} +	} + +	return 1; +} +  /* Parse options from mount. Returns 0 on failure */  /* input is the options passed to mount() as a string */  int hfsplus_parse_options(char *input, struct hfsplus_sb_info *sbi) diff --git a/fs/hfsplus/super.c b/fs/hfsplus/super.c index 52cc746d3ba..1c356a2fba0 100644 --- a/fs/hfsplus/super.c +++ b/fs/hfsplus/super.c @@ -263,11 +263,9 @@ static int hfsplus_remount(struct super_block *sb, int *flags, char *data)  		return 0;  	if (!(*flags & MS_RDONLY)) {  		struct hfsplus_vh *vhdr = HFSPLUS_SB(sb)->s_vhdr; -		struct hfsplus_sb_info sbi; +		int force = 0; -		memset(&sbi, 0, sizeof(struct hfsplus_sb_info)); -		sbi.nls = HFSPLUS_SB(sb)->nls; -		if (!hfsplus_parse_options(data, &sbi)) +		if (!hfsplus_parse_options_remount(data, &force))  			return -EINVAL;  		if (!(vhdr->attributes & cpu_to_be32(HFSPLUS_VOL_UNMNT))) { @@ -275,7 +273,7 @@ static int hfsplus_remount(struct super_block *sb, int *flags, char *data)  			       "running fsck.hfsplus is recommended.  leaving read-only.\n");  			sb->s_flags |= MS_RDONLY;  			*flags |= MS_RDONLY; -		} else if (test_bit(HFSPLUS_SB_FORCE, &sbi.flags)) { +		} else if (force) {  			/* nothing */  		} else if (vhdr->attributes & cpu_to_be32(HFSPLUS_VOL_SOFTLOCK)) {  			printk(KERN_WARNING "hfs: filesystem is marked locked, leaving read-only.\n");  |