Commit b3bb8afd965159f155d4f629cbea158cbcc69275

Authored by Jeff Mahoney
Committed by Linus Torvalds
1 parent c9b3ad6734

[PATCH] reiserfs: fix deadlock in inode creation failure path w/ default ACL

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>

Showing 1 changed file with 11 additions and 1 deletions Side-by-side Diff

... ... @@ -1980,7 +1980,17 @@
1980 1980 out_inserted_sd:
1981 1981 inode->i_nlink = 0;
1982 1982 th->t_trans_id = 0; /* so the caller can't use this handle later */
1983   - iput(inode);
  1983 +
  1984 + /* If we were inheriting an ACL, we need to release the lock so that
  1985 + * iput doesn't deadlock in reiserfs_delete_xattrs. The locking
  1986 + * code really needs to be reworked, but this will take care of it
  1987 + * for now. -jeffm */
  1988 + if (REISERFS_I(dir)->i_acl_default) {
  1989 + reiserfs_write_unlock_xattrs(dir->i_sb);
  1990 + iput(inode);
  1991 + reiserfs_write_lock_xattrs(dir->i_sb);
  1992 + } else
  1993 + iput(inode);
1984 1994 return err;
1985 1995 }
1986 1996