linux-fsdevel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] fix reiserfs lock inversion of bkl vs inode semaphore
@ 2006-08-04 14:00 Chris Mason
  2006-08-04 22:51 ` Andrew Morton
  2006-08-04 22:56 ` Andrew Morton
  0 siblings, 2 replies; 4+ messages in thread
From: Chris Mason @ 2006-08-04 14:00 UTC (permalink / raw)
  To: linux-fsdevel, akpm, reiserfs-dev

From: Chris Mason <mason@suse.com>
Subject: fix reiserfs lock inversion of bkl vs inode semaphore

The correct lock ordering is inode lock -> BKL

Signed-off-by: Chris Mason <mason@suse.com>

--- 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.  */

-- 

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2006-08-05 16:22 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-08-04 14:00 [PATCH] fix reiserfs lock inversion of bkl vs inode semaphore Chris Mason
2006-08-04 22:51 ` Andrew Morton
2006-08-05 16:21   ` Arjan van de Ven
2006-08-04 22:56 ` Andrew Morton

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).