No feedback on this, and no merge, so resending. -- fs: improve remount,ro coherency invalidate sb->s_bdev on remount,ro Fixes a problem reported by "Jorge Boncompte [DTI2]" <jorge@xxxxxxxx> who is trying to snapshot a minix filesystem image. Added comments explain the problem. Signed-off-by: Nick Piggin <npiggin@xxxxxxx> --- fs/super.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) Index: linux-2.6/fs/super.c =================================================================== --- linux-2.6.orig/fs/super.c +++ linux-2.6/fs/super.c @@ -637,7 +637,7 @@ retry: int do_remount_sb(struct super_block *sb, int flags, void *data, int force) { int retval; - int remount_rw; + int remount_rw, remount_ro; #ifdef CONFIG_BLOCK if (!(flags & MS_RDONLY) && bdev_read_only(sb->s_bdev)) @@ -648,9 +648,12 @@ int do_remount_sb(struct super_block *sb shrink_dcache_sb(sb); fsync_super(sb); + remount_ro = (flags & MS_RDONLY) && !(sb->s_flags & MS_RDONLY); + remount_rw = !(flags & MS_RDONLY) && (sb->s_flags & MS_RDONLY); + /* If we are remounting RDONLY and current sb is read/write, make sure there are no rw files opened */ - if ((flags & MS_RDONLY) && !(sb->s_flags & MS_RDONLY)) { + if (remount_ro) { if (force) mark_files_ro(sb); else if (!fs_may_remount_ro(sb)) @@ -659,7 +662,6 @@ int do_remount_sb(struct super_block *sb if (retval < 0 && retval != -ENOSYS) return -EBUSY; } - remount_rw = !(flags & MS_RDONLY) && (sb->s_flags & MS_RDONLY); if (sb->s_op->remount_fs) { lock_super(sb); @@ -671,6 +673,14 @@ int do_remount_sb(struct super_block *sb sb->s_flags = (sb->s_flags & ~MS_RMT_MASK) | (flags & MS_RMT_MASK); if (remount_rw) DQUOT_ON_REMOUNT(sb); + /* Some filesystems modify their metadata via some other path + than the bdev buffer cache (eg. use a private mapping, or + directories in pagecache, etc). Also file data modifications + go via their own mappings. So If we try to mount readonly + then copy the filesystem from bdev, we could get stale data, + so invalidate it to give a best effort at coherency. */ + if (remount_ro && sb->s_bdev) + invalidate_bdev(sb->s_bdev); return 0; } -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html