@@ -2104,16 +2104,40 @@ static int handle_mount_opt(struct super_block *sb, char *opt, int token,
2104
2104
switch (token ) {
2105
2105
case Opt_dax :
2106
2106
case Opt_dax_always :
2107
+ if (is_remount &&
2108
+ (!(sbi -> s_mount_opt & EXT4_MOUNT_DAX_ALWAYS ) ||
2109
+ (sbi -> s_mount_opt2 & EXT4_MOUNT2_DAX_NEVER ))) {
2110
+ fail_dax_change_remount :
2111
+ ext4_msg (sb , KERN_ERR , "can't change "
2112
+ "dax mount option while remounting" );
2113
+ return -1 ;
2114
+ }
2115
+ if (is_remount &&
2116
+ (test_opt (sb , DATA_FLAGS ) ==
2117
+ EXT4_MOUNT_JOURNAL_DATA )) {
2118
+ ext4_msg (sb , KERN_ERR , "can't mount with "
2119
+ "both data=journal and dax" );
2120
+ return -1 ;
2121
+ }
2107
2122
ext4_msg (sb , KERN_WARNING ,
2108
2123
"DAX enabled. Warning: EXPERIMENTAL, use at your own risk" );
2109
2124
sbi -> s_mount_opt |= EXT4_MOUNT_DAX_ALWAYS ;
2110
2125
sbi -> s_mount_opt2 &= ~EXT4_MOUNT2_DAX_NEVER ;
2111
2126
break ;
2112
2127
case Opt_dax_never :
2128
+ if (is_remount &&
2129
+ (!(sbi -> s_mount_opt2 & EXT4_MOUNT2_DAX_NEVER ) ||
2130
+ (sbi -> s_mount_opt & EXT4_MOUNT_DAX_ALWAYS )))
2131
+ goto fail_dax_change_remount ;
2113
2132
sbi -> s_mount_opt2 |= EXT4_MOUNT2_DAX_NEVER ;
2114
2133
sbi -> s_mount_opt &= ~EXT4_MOUNT_DAX_ALWAYS ;
2115
2134
break ;
2116
2135
case Opt_dax_inode :
2136
+ if (is_remount &&
2137
+ ((sbi -> s_mount_opt & EXT4_MOUNT_DAX_ALWAYS ) ||
2138
+ (sbi -> s_mount_opt2 & EXT4_MOUNT2_DAX_NEVER ) ||
2139
+ !(sbi -> s_mount_opt2 & EXT4_MOUNT2_DAX_INODE )))
2140
+ goto fail_dax_change_remount ;
2117
2141
sbi -> s_mount_opt &= ~EXT4_MOUNT_DAX_ALWAYS ;
2118
2142
sbi -> s_mount_opt2 &= ~EXT4_MOUNT2_DAX_NEVER ;
2119
2143
/* Strictly for printing options */
@@ -5454,12 +5478,6 @@ static int ext4_remount(struct super_block *sb, int *flags, char *data)
5454
5478
err = - EINVAL ;
5455
5479
goto restore_opts ;
5456
5480
}
5457
- if (test_opt (sb , DAX_ALWAYS )) {
5458
- ext4_msg (sb , KERN_ERR , "can't mount with "
5459
- "both data=journal and dax" );
5460
- err = - EINVAL ;
5461
- goto restore_opts ;
5462
- }
5463
5481
} else if (test_opt (sb , DATA_FLAGS ) == EXT4_MOUNT_ORDERED_DATA ) {
5464
5482
if (test_opt (sb , JOURNAL_ASYNC_COMMIT )) {
5465
5483
ext4_msg (sb , KERN_ERR , "can't mount with "
@@ -5475,18 +5493,6 @@ static int ext4_remount(struct super_block *sb, int *flags, char *data)
5475
5493
goto restore_opts ;
5476
5494
}
5477
5495
5478
- if ((sbi -> s_mount_opt ^ old_opts .s_mount_opt ) & EXT4_MOUNT_DAX_ALWAYS ||
5479
- (sbi -> s_mount_opt2 ^ old_opts .s_mount_opt2 ) & EXT4_MOUNT2_DAX_NEVER ||
5480
- (sbi -> s_mount_opt2 ^ old_opts .s_mount_opt2 ) & EXT4_MOUNT2_DAX_INODE ) {
5481
- ext4_msg (sb , KERN_WARNING , "warning: refusing change of "
5482
- "dax mount option with busy inodes while remounting" );
5483
- sbi -> s_mount_opt &= ~EXT4_MOUNT_DAX_ALWAYS ;
5484
- sbi -> s_mount_opt |= old_opts .s_mount_opt & EXT4_MOUNT_DAX_ALWAYS ;
5485
- sbi -> s_mount_opt2 &= ~(EXT4_MOUNT2_DAX_NEVER | EXT4_MOUNT2_DAX_INODE );
5486
- sbi -> s_mount_opt2 |= old_opts .s_mount_opt2 &
5487
- (EXT4_MOUNT2_DAX_NEVER | EXT4_MOUNT2_DAX_INODE );
5488
- }
5489
-
5490
5496
if (sbi -> s_mount_flags & EXT4_MF_FS_ABORTED )
5491
5497
ext4_abort (sb , EXT4_ERR_ESHUTDOWN , "Abort forced by user" );
5492
5498
0 commit comments