@@ -380,7 +380,7 @@ static const match_table_t tokens = {
380
380
{Opt_err , NULL }
381
381
};
382
382
383
- static int ufs_parse_options (char * options , unsigned * flavour , unsigned * on_err )
383
+ static int ufs_parse_options (char * options , unsigned * flavour , unsigned * on_err , bool remount )
384
384
{
385
385
char * p ;
386
386
@@ -392,6 +392,7 @@ static int ufs_parse_options(char *options, unsigned *flavour, unsigned *on_err)
392
392
while ((p = strsep (& options , "," )) != NULL ) {
393
393
substring_t args [MAX_OPT_ARGS ];
394
394
int token ;
395
+ unsigned int old = * flavour ;
395
396
if (!* p )
396
397
continue ;
397
398
@@ -444,6 +445,15 @@ static int ufs_parse_options(char *options, unsigned *flavour, unsigned *on_err)
444
445
pr_err ("Invalid option: \"%s\" or missing value\n" , p );
445
446
return 0 ;
446
447
}
448
+ if (* flavour == old )
449
+ continue ;
450
+ if (!old )
451
+ continue ;
452
+ if (remount )
453
+ pr_err ("ufstype can't be changed during remount\n" );
454
+ else
455
+ pr_err ("conflicting ufstype options\n" );
456
+ return 0 ;
447
457
}
448
458
return 1 ;
449
459
}
@@ -795,7 +805,7 @@ static int ufs_fill_super(struct super_block *sb, void *data, int silent)
795
805
*/
796
806
sbi -> s_flavour = 0 ;
797
807
sbi -> s_on_err = UFS_MOUNT_ONERROR_LOCK ;
798
- if (!ufs_parse_options (data , & sbi -> s_flavour , & sbi -> s_on_err )) {
808
+ if (!ufs_parse_options (data , & sbi -> s_flavour , & sbi -> s_on_err , false )) {
799
809
pr_err ("wrong mount options\n" );
800
810
goto failed ;
801
811
}
@@ -1295,16 +1305,9 @@ static int ufs_remount (struct super_block *sb, int *mount_flags, char *data)
1295
1305
* Allow the "check" option to be passed as a remount option.
1296
1306
* It is not possible to change ufstype option during remount
1297
1307
*/
1298
- ufstype = 0 ;
1308
+ ufstype = UFS_SB ( sb ) -> s_flavour ;
1299
1309
on_err = UFS_MOUNT_ONERROR_LOCK ;
1300
- if (!ufs_parse_options (data , & ufstype , & on_err )) {
1301
- mutex_unlock (& UFS_SB (sb )-> s_lock );
1302
- return - EINVAL ;
1303
- }
1304
- if (!ufstype )
1305
- ufstype = UFS_SB (sb )-> s_flavour ;
1306
- else if (ufstype != UFS_SB (sb )-> s_flavour ) {
1307
- pr_err ("ufstype can't be changed during remount\n" );
1310
+ if (!ufs_parse_options (data , & ufstype , & on_err , true)) {
1308
1311
mutex_unlock (& UFS_SB (sb )-> s_lock );
1309
1312
return - EINVAL ;
1310
1313
}
0 commit comments