From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jiaju Zhang Date: Wed, 21 Jul 2010 22:48:05 +0800 Subject: [Ocfs2-devel] [PATCH V2] Fix the nested PR lock calling issue Message-ID: <20100721144805.GA12822@linux-jjzhang> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: ocfs2-devel@oss.oracle.com Hi, This is an improved patch for the bug https://bugzilla.novell.com/show_bug.cgi?id=614332 (also http://oss.oracle.com/bugzilla/show_bug.cgi?id=1278) It is a nested PR lock calling issue, the referenced stack trace is as: smbd D ffff8800013d0600 0 9522 5608 0x00000000 ffff88002ca7fb18 0000000000000282 ffff88002f964500 ffff88002ca7fa98 ffff8800013d0600 ffff88002ca7fae0 ffff88002f964340 ffff88002f964340 ffff88002ca7ffd8 ffff88002ca7ffd8 ffff88002f964340 ffff88002f964340 Call Trace: [] schedule_timeout+0x175/0x210 [] wait_for_common+0xf0/0x210 [] __ocfs2_cluster_lock+0x3b9/0xa90 [ocfs2] [] ocfs2_inode_lock_full_nested+0x255/0xdb0 [ocfs2] [] ocfs2_get_acl+0x69/0x120 [ocfs2] [] ocfs2_check_acl+0x28/0x80 [ocfs2] [] acl_permission_check+0x57/0xb0 [] generic_permission+0x1d/0xc0 [] ocfs2_permission+0x10a/0x1d0 [ocfs2] [] inode_permission+0x45/0x100 [] sys_chdir+0x53/0x90 [] system_call_fastpath+0x16/0x1b [<00007f34a4ef6927>] 0x7f34a4ef6927 Many thanks for your review and comments;) Thanks, Jiaju Signed-off-by: Cc: Joel Becker Cc: Mark Fasheh Cc: Sunil Mushran Cc: Tao Ma Cc: Tiger Yang Cc: Wengang Wang --- fs/ocfs2/acl.c | 21 +++++++++++++++++---- 1 files changed, 17 insertions(+), 4 deletions(-) diff --git a/fs/ocfs2/acl.c b/fs/ocfs2/acl.c index da70229..ecf73f4 100644 --- a/fs/ocfs2/acl.c +++ b/fs/ocfs2/acl.c @@ -290,17 +290,30 @@ static int ocfs2_set_acl(handle_t *handle, int ocfs2_check_acl(struct inode *inode, int mask) { - struct posix_acl *acl = ocfs2_get_acl(inode, ACL_TYPE_ACCESS); + struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); + struct posix_acl *acl; + struct buffer_head *di_bh = NULL; + int ret = -EAGAIN; + + if (!(osb->s_mount_opt & OCFS2_MOUNT_POSIX_ACL)) + return ret; + + ret = ocfs2_read_inode_block(inode, &di_bh); + if (ret < 0) { + mlog_errno(ret); + return ret; + } + + acl = ocfs2_get_acl_nolock(inode, ACL_TYPE_ACCESS, di_bh); if (IS_ERR(acl)) return PTR_ERR(acl); if (acl) { - int ret = posix_acl_permission(inode, acl, mask); + ret = posix_acl_permission(inode, acl, mask); posix_acl_release(acl); - return ret; } - return -EAGAIN; + return ret; } int ocfs2_acl_chmod(struct inode *inode)