Messages in this thread Patch in this message | | | Subject | [RFC][PATCH 09/30] r/o bind mounts: drop write during emergency remount | From | Dave Hansen <> | Date | Fri, 08 Feb 2008 14:26:58 -0800 |
| |
The emergency remount code forcibly removes FMODE_WRITE from filps. The r/o bind mount code notices that this was done without a proper mnt_drop_write() and properly gives a warning.
This patch does a mnt_drop_write() to keep everything balanced.
Signed-off-by: Dave Hansen <haveblue@us.ibm.com> ---
linux-2.6.git-dave/fs/super.c | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-)
diff -puN fs/super.c~robind-sysrq-fix fs/super.c --- linux-2.6.git/fs/super.c~robind-sysrq-fix 2008-02-08 13:04:48.000000000 -0800 +++ linux-2.6.git-dave/fs/super.c 2008-02-08 13:04:49.000000000 -0800 @@ -37,6 +37,7 @@ #include <linux/idr.h> #include <linux/kobject.h> #include <linux/mutex.h> +#include <linux/file.h> #include <asm/uaccess.h> @@ -566,10 +567,25 @@ static void mark_files_ro(struct super_b { struct file *f; +retry: file_list_lock(); list_for_each_entry(f, &sb->s_files, f_u.fu_list) { - if (S_ISREG(f->f_path.dentry->d_inode->i_mode) && file_count(f)) - f->f_mode &= ~FMODE_WRITE; + struct vfsmount *mnt; + if (!S_ISREG(f->f_path.dentry->d_inode->i_mode)) + continue; + if (!file_count(f)) + continue; + if (!(f->f_mode & FMODE_WRITE)) + continue; + f->f_mode &= ~FMODE_WRITE; + mnt = f->f_path.mnt; + file_list_unlock(); + /* + * This can sleep, so we can't hold + * the file_list_lock() spinlock. + */ + mnt_drop_write(mnt); + goto retry; } file_list_unlock(); } _
| |