{Opt_err, NULL}
};
-static int ufs_parse_options(char *options, unsigned *flavour, unsigned *on_err)
+static int ufs_parse_options(char *options, unsigned *flavour, unsigned *on_err, bool remount)
{
char * p;
while ((p = strsep(&options, ",")) != NULL) {
substring_t args[MAX_OPT_ARGS];
int token;
+ unsigned int old = *flavour;
if (!*p)
continue;
pr_err("Invalid option: \"%s\" or missing value\n", p);
return 0;
}
+ if (*flavour == old)
+ continue;
+ if (!old)
+ continue;
+ if (remount)
+ pr_err("ufstype can't be changed during remount\n");
+ else
+ pr_err("conflicting ufstype options\n");
+ return 0;
}
return 1;
}
*/
sbi->s_flavour = 0;
sbi->s_on_err = UFS_MOUNT_ONERROR_LOCK;
- if (!ufs_parse_options(data, &sbi->s_flavour, &sbi->s_on_err)) {
+ if (!ufs_parse_options(data, &sbi->s_flavour, &sbi->s_on_err, false)) {
pr_err("wrong mount options\n");
goto failed;
}
* Allow the "check" option to be passed as a remount option.
* It is not possible to change ufstype option during remount
*/
- ufstype = 0;
+ ufstype = UFS_SB(sb)->s_flavour;
on_err = UFS_MOUNT_ONERROR_LOCK;
- if (!ufs_parse_options(data, &ufstype, &on_err)) {
- mutex_unlock(&UFS_SB(sb)->s_lock);
- return -EINVAL;
- }
- if (!ufstype)
- ufstype = UFS_SB(sb)->s_flavour;
- else if (ufstype != UFS_SB(sb)->s_flavour) {
- pr_err("ufstype can't be changed during remount\n");
+ if (!ufs_parse_options(data, &ufstype, &on_err, true)) {
mutex_unlock(&UFS_SB(sb)->s_lock);
return -EINVAL;
}