• Junxiao Bi's avatar
    ocfs2: revert using ocfs2_acl_chmod to avoid inode cluster lock hang · 5ee0fbd5
    Junxiao Bi authored
    Commit 743b5f14 ("ocfs2: take inode lock in ocfs2_iop_set/get_acl()")
    introduced this issue.  ocfs2_setattr called by chmod command holds
    cluster wide inode lock when calling posix_acl_chmod.  This latter
    function in turn calls ocfs2_iop_get_acl and ocfs2_iop_set_acl.  These
    two are also called directly from vfs layer for getfacl/setfacl commands
    and therefore acquire the cluster wide inode lock.  If a remote
    conversion request comes after the first inode lock in ocfs2_setattr,
    OCFS2_LOCK_BLOCKED will be set.  And this will cause the second call to
    inode lock from the ocfs2_iop_get_acl() to block indefinetly.
    
    The deleted version of ocfs2_acl_chmod() calls __posix_acl_chmod() which
    does not call back into the filesystem.  Therefore, we restore
    ocfs2_acl_chmod(), modify it slightly for locking as needed, and use that
    instead.
    
    Fixes: 743b5f14 ("ocfs2: take inode lock in ocfs2_iop_set/get_acl()")
    Signed-off-by: default avatarTariq Saeed <tariq.x.saeed@oracle.com>
    Signed-off-by: default avatarJunxiao Bi <junxiao.bi@oracle.com>
    Cc: Mark Fasheh <mfasheh@suse.de>
    Cc: Joel Becker <jlbec@evilplan.org>
    Cc: Joseph Qi <joseph.qi@huawei.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    5ee0fbd5
file.c 61.9 KB