[PATCH] reiserfs: fix deadlock in inode creation failure path w/ default ACL
authorJeff Mahoney <jeffm@suse.com>
Wed, 27 Jul 2005 18:43:38 +0000 (11:43 -0700)
committerLinus Torvalds <torvalds@g5.osdl.org>
Wed, 27 Jul 2005 23:25:50 +0000 (16:25 -0700)
reiserfs_new_inode() can call iput() with the xattr lock held.  This will
cause a deadlock to occur when reiserfs_delete_xattrs() is called to clean
up.

The following patch releases the lock and reacquires it after the iput.
This is safe because interaction with xattrs is complete, and the relock is
just to balance out the release in the caller.

The locking needs some reworking to be more sane, but that's more intrusive
and I was just looking to fix this bug.

Signed-off-by: Jeff Mahoney <jeffm@suse.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
fs/reiserfs/inode.c

index 1aaf2c7d44e69e3a4b1a282bf0dc3023b88a3bfc..d9f614a57731bd08bad340ab08b0662dc99cfd58 100644 (file)
@@ -1980,7 +1980,17 @@ int reiserfs_new_inode(struct reiserfs_transaction_handle *th,
       out_inserted_sd:
        inode->i_nlink = 0;
        th->t_trans_id = 0;     /* so the caller can't use this handle later */
-       iput(inode);
+
+       /* If we were inheriting an ACL, we need to release the lock so that
+        * iput doesn't deadlock in reiserfs_delete_xattrs. The locking
+        * code really needs to be reworked, but this will take care of it
+        * for now. -jeffm */
+       if (REISERFS_I(dir)->i_acl_default) {
+               reiserfs_write_unlock_xattrs(dir->i_sb);
+               iput(inode);
+               reiserfs_write_lock_xattrs(dir->i_sb);
+       } else
+               iput(inode);
        return err;
 }