| .. | .. |
|---|
| 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) { |
|---|