From mboxrd@z Thu Jan 1 00:00:00 1970 From: Chris Mason Subject: [PATCH] fix reiserfs lock inversion of bkl vs inode semaphore Date: Fri, 4 Aug 2006 10:00:15 -0400 Message-ID: <20060804140015.GD1134@watt.suse.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Return-path: Received: from cantor2.suse.de ([195.135.220.15]:13549 "EHLO mx2.suse.de") by vger.kernel.org with ESMTP id S1161196AbWHDOAh (ORCPT ); Fri, 4 Aug 2006 10:00:37 -0400 To: linux-fsdevel@vger.kernel.org, akpm@osdl.org, reiserfs-dev@namesys.com Content-Disposition: inline Sender: linux-fsdevel-owner@vger.kernel.org List-Id: linux-fsdevel.vger.kernel.org From: Chris Mason Subject: fix reiserfs lock inversion of bkl vs inode semaphore The correct lock ordering is inode lock -> BKL Signed-off-by: Chris Mason --- a/fs/reiserfs/file.c Thu Aug 03 16:18:18 2006 -0400 +++ b/fs/reiserfs/file.c Thu Aug 03 16:18:18 2006 -0400 @@ -48,8 +48,8 @@ static int reiserfs_file_release(struct return 0; } + mutex_lock(&inode->i_mutex); reiserfs_write_lock(inode->i_sb); - mutex_lock(&inode->i_mutex); /* freeing preallocation only involves relogging blocks that * are already in the current transaction. preallocation gets * freed at the end of each transaction, so it is impossible for --- a/fs/reiserfs/inode.c Thu Aug 03 16:18:18 2006 -0400 +++ b/fs/reiserfs/inode.c Thu Aug 03 16:18:28 2006 -0400 @@ -35,11 +35,11 @@ void reiserfs_delete_inode(struct inode truncate_inode_pages(&inode->i_data, 0); - reiserfs_write_lock(inode->i_sb); /* The = 0 happens when we abort creating a new inode for some reason like lack of space.. */ if (!(inode->i_state & I_NEW) && INODE_PKEY(inode)->k_objectid != 0) { /* also handles bad_inode case */ mutex_lock(&inode->i_mutex); + reiserfs_write_lock(inode->i_sb); reiserfs_delete_xattrs(inode); @@ -75,7 +75,7 @@ void reiserfs_delete_inode(struct inode * about an error here */ } else { /* no object items are in the tree */ - ; + reiserfs_write_lock(inode->i_sb); } out: clear_inode(inode); /* note this must go after the journal_end to prevent deadlock */ --- a/fs/reiserfs/ioctl.c Thu Aug 03 16:18:18 2006 -0400 +++ b/fs/reiserfs/ioctl.c Thu Aug 03 16:18:18 2006 -0400 @@ -116,12 +116,12 @@ static int reiserfs_unpack(struct inode if (REISERFS_I(inode)->i_flags & i_nopack_mask) { return 0; } - reiserfs_write_lock(inode->i_sb); /* we need to make sure nobody is changing the file size beneath ** us */ mutex_lock(&inode->i_mutex); + reiserfs_write_lock(inode->i_sb); write_from = inode->i_size & (blocksize - 1); /* if we are on a block boundary, we are already unpacked. */ --