Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1761896AbYBOWkd (ORCPT ); Fri, 15 Feb 2008 17:40:33 -0500 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1763697AbYBOWhk (ORCPT ); Fri, 15 Feb 2008 17:37:40 -0500 Received: from e1.ny.us.ibm.com ([32.97.182.141]:35879 "EHLO e1.ny.us.ibm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1762397AbYBOWhh (ORCPT ); Fri, 15 Feb 2008 17:37:37 -0500 Subject: [PATCH 09/30] r/o bind mounts: drop write during emergency remount To: linux-kernel@vger.kernel.org Cc: hch@lst.de, miklos@szeredi.hu, akpm@osdl.org, Dave Hansen From: Dave Hansen Date: Fri, 15 Feb 2008 14:37:32 -0800 References: <20080215223721.9E0A088A@kernel> In-Reply-To: <20080215223721.9E0A088A@kernel> Message-Id: <20080215223732.42E46571@kernel> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 1796 Lines: 62 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. Acked-by: Al Viro Signed-off-by: Christoph Hellwig Signed-off-by: Dave Hansen --- 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-15 13:25:46.000000000 -0800 +++ linux-2.6.git-dave/fs/super.c 2008-02-15 13:25:46.000000000 -0800 @@ -37,6 +37,7 @@ #include #include #include +#include #include @@ -567,10 +568,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(); } _ -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/