vfs: protect remounting superblock read-only
authorMiklos Szeredi <mszeredi@suse.cz>
Mon, 21 Nov 2011 11:11:31 +0000 (12:11 +0100)
committerAl Viro <viro@zeniv.linux.org.uk>
Sat, 7 Jan 2012 04:20:12 +0000 (23:20 -0500)
commit4ed5e82fe77f4147cf386327c9a63a2dd7eff518
treef4eaeefaf5d293014457892ac31f878eece07331
parent39f7c4db1d2d9e2e2a90abdf34811783089d217d
vfs: protect remounting superblock read-only

Currently remouting superblock read-only is racy in a major way.

With the per mount read-only infrastructure it is now possible to
prevent most races, which this patch attempts.

Before starting the remount read-only, iterate through all mounts
belonging to the superblock and if none of them have any pending
writes, set sb->s_readonly_remount.  This indicates that remount is in
progress and no further write requests are allowed.  If the remount
succeeds set MS_RDONLY and reset s_readonly_remount.

If the remounting is unsuccessful just reset s_readonly_remount.
This can result in transient EROFS errors, despite the fact the
remount failed.  Unfortunately hodling off writes is difficult as
remount itself may touch the filesystem (e.g. through load_nls())
which would deadlock.

A later patch deals with delayed writes due to nlink going to zero.

Signed-off-by: Miklos Szeredi <mszeredi@suse.cz>
Tested-by: Toshiyuki Okajima <toshi.okajima@jp.fujitsu.com>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/internal.h
fs/namespace.c
fs/super.c
include/linux/fs.h