[PATCH] fix reiserfs lock inversion of bkl vs inode semaphore

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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

The correct lock ordering is inode lock -> BKL

Signed-off-by: Chris Mason <mason@xxxxxxxx>

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

-- 
-
To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Ext4 Filesystem]     [Union Filesystem]     [Filesystem Testing]     [Ceph Users]     [Ecryptfs]     [AutoFS]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux Cachefs]     [Reiser Filesystem]     [Linux RAID]     [Samba]     [Device Mapper]     [CEPH Development]
  Powered by Linux