Currently on rw=>ro remount we have following race | mount /mnt -oremount,ro | write-task | |-------------------------+------------| | | open(RDWR) | | shrink_dcache_sb(sb); | | | sync_filesystem(sb); | | | | write() | | | close() | | fs_may_remount_ro(sb) | | | sb->s_flags = new_flags | | Later writeback or sync() will result in error due to MS_RDONLY flag In case of ext4 this result in jbd2_start failure on writeback ext4_da_writepages: jbd2_start: 1024 pages, ino 1431; err -30 In fact all others are affected by this error but it is not visible because the skip s_flags check on writeback. For example ext3 check (s_flags & MS_RDONLY) only if page has no buffers during journal start. In order to prevent the race we have to block new writers before fs_may_remount_ro() and sync_filesystem(). Let's introduce new sb->s_flags MS_RO_REMOUNT flag for this purpose. But suddenly we have no available space in MS_XXX bits, let's share this bit with MS_REMOUNT. This is possible because MS_REMOUNT used only for passing arguments from flags to sys_mount() and never used in sb->s_flags. ##TESTCASE_BEGIN: #! /bin/bash -x DEV=/dev/sdb5 FSTYPE=ext4 BINDIR=/home/dmon MNTOPT="data=ordered" umount /mnt mkfs.${FSTYPE} ${DEV} || exit 1 mount ${DEV} /mnt -o${MNTOPT} || exit 1 ${BINDIR}/fsstress -p1 -l999999999 -n9999999999 -d /mnt/test & sleep 15 mount /mnt -oremount,ro,${MNTOPT} sleep 1 killall -9 fsstress sync # after this you may get following message in dmesg # "ext4_da_writepages: jbd2_start: 1024 pages, ino 1431; err -30" ##TESTCASE_END Signed-off-by: Dmitry Monakhov --