From mboxrd@z Thu Jan 1 00:00:00 1970 From: Theodore Ts'o Subject: [PATCH] fs: take i_mutex in __page_symlink() Date: Mon, 1 Apr 2013 11:23:42 -0400 Message-ID: <1364829822-18989-1-git-send-email-tytso@mit.edu> References: <20130328140635.GA32635@thunk.org> Cc: Theodore Ts'o , linux-fsdevel@vger.kernel.org, Al Viro To: Ext4 Developers List Return-path: In-Reply-To: <20130328140635.GA32635@thunk.org> Sender: linux-ext4-owner@vger.kernel.org List-Id: linux-fsdevel.vger.kernel.org In Documentation/filesystems/Locking, it's documented that write_begin() is guaranteed to be called with i_mutex locked. The function __page_symlink() was not taking i_mutex before calling pagecache_write_begin(), which will eventually result in the file system's write_begin()'s function getting called. Other callers of pagecache_write_begin such as in fs/splice.c, call pagecache_write_begin() with i_mutex locked, so fix __page_symlink() to be consistent. This was discovered by the addition of a new ext4 debugging assertion which checked to make sure i_mutex was locked before calling ext4_truncate(). Reported-by: Zheng Liu Signed-off-by: "Theodore Ts'o" Cc: linux-fsdevel@vger.kernel.org Cc: Al Viro --- Note: I plan to carry the following patch in the ext4 tree, unless someone objects or Al insists on carrying this in the vfs git tree. fs/namei.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/fs/namei.c b/fs/namei.c index 57ae9c8..548e57b 100644 --- a/fs/namei.c +++ b/fs/namei.c @@ -4035,8 +4035,10 @@ int __page_symlink(struct inode *inode, const char *symname, int len, int nofs) flags |= AOP_FLAG_NOFS; retry: + mutex_lock(&inode->i_mutex); err = pagecache_write_begin(NULL, mapping, 0, len-1, flags, &page, &fsdata); + mutex_unlock(&inode->i_mutex); if (err) goto fail; -- 1.7.12.rc0.22.gcdd159b