.. | .. |
---|
906 | 906 | struct super_block *sb = fc->root->d_sb; |
---|
907 | 907 | int retval; |
---|
908 | 908 | bool remount_ro = false; |
---|
| 909 | + bool remount_rw = false; |
---|
909 | 910 | bool force = fc->sb_flags & SB_FORCE; |
---|
910 | 911 | |
---|
911 | 912 | if (fc->sb_flags_mask & ~MS_RMT_MASK) |
---|
.. | .. |
---|
922 | 923 | if (!(fc->sb_flags & SB_RDONLY) && bdev_read_only(sb->s_bdev)) |
---|
923 | 924 | return -EACCES; |
---|
924 | 925 | #endif |
---|
925 | | - |
---|
| 926 | + remount_rw = !(fc->sb_flags & SB_RDONLY) && sb_rdonly(sb); |
---|
926 | 927 | remount_ro = (fc->sb_flags & SB_RDONLY) && !sb_rdonly(sb); |
---|
927 | 928 | } |
---|
928 | 929 | |
---|
.. | .. |
---|
952 | 953 | if (retval) |
---|
953 | 954 | return retval; |
---|
954 | 955 | } |
---|
| 956 | + } else if (remount_rw) { |
---|
| 957 | + /* |
---|
| 958 | + * We set s_readonly_remount here to protect filesystem's |
---|
| 959 | + * reconfigure code from writes from userspace until |
---|
| 960 | + * reconfigure finishes. |
---|
| 961 | + */ |
---|
| 962 | + sb->s_readonly_remount = 1; |
---|
| 963 | + smp_wmb(); |
---|
955 | 964 | } |
---|
956 | 965 | |
---|
957 | 966 | if (fc->ops->reconfigure) { |
---|