Hello! the patch below fixes potential deadlock in reiserfs code. The problem is we can sometimes return 1 even if we did not manage to find the xattr. Later we take the xattr lock because the function returned 1. But then the code in the error path of reiserfs_new_inode() checks i_default_acl and because it is not set it assumes we have not taken the lock and tries to retake it -> deadlock. Jeff has larger rewrite of the xattr locking but it will take some time before it will be accepted so this could be used as a temporary fix. Andrew, please apply.
Honza -- Jan Kara <[EMAIL PROTECTED]> SuSE CR Labs reiserfs_cache_default_acl() should return whether we successfully found the acl or not. We have to return correct value even if reiserfs_get_acl() returns error code and not just 0. Otherwise callers such as reiserfs_mkdir() can unnecessarily lock the xattrs and later functions such as reiserfs_new_inode() fail to notice that we have already taken the lock and try to take it again with obvious consequences. Signed-off-by: Jan Kara <[EMAIL PROTECTED]> diff -rupX /home/jack/.kerndiffexclude linux-2.6.5-SLES9_SP3_BRANCH/fs/reiserfs/xattr_acl.c linux-2.6.5-SLES9_SP3_BRANCH-1-reiser_xattr_fix/fs/reiserfs/xattr_acl.c --- linux-2.6.5-SLES9_SP3_BRANCH/fs/reiserfs/xattr_acl.c 2006-01-21 03:02:06.000000000 +0100 +++ linux-2.6.5-SLES9_SP3_BRANCH-1-reiser_xattr_fix/fs/reiserfs/xattr_acl.c 2006-01-21 09:09:04.000000000 +0100 @@ -410,8 +410,10 @@ reiserfs_cache_default_acl (struct inode acl = reiserfs_get_acl (inode, ACL_TYPE_DEFAULT); reiserfs_read_unlock_xattrs (inode->i_sb); reiserfs_read_unlock_xattr_i (inode); - ret = acl ? 1 : 0; + if (!acl || IS_ERR(acl)) + return 0; posix_acl_release (acl); + ret = 1; } return ret;