• J
    ocfs2: implement delayed dropping of last dquot reference · e3a767b6
    Jan Kara 提交于
    We cannot drop last dquot reference from downconvert thread as that
    creates the following deadlock:
    
    NODE 1                                  NODE2
    holds dentry lock for 'foo'
    holds inode lock for GLOBAL_BITMAP_SYSTEM_INODE
                                            dquot_initialize(bar)
                                              ocfs2_dquot_acquire()
                                                ocfs2_inode_lock(USER_QUOTA_SYSTEM_INODE)
                                                ...
    downconvert thread (triggered from another
    node or a different process from NODE2)
      ocfs2_dentry_post_unlock()
        ...
        iput(foo)
          ocfs2_evict_inode(foo)
            ocfs2_clear_inode(foo)
              dquot_drop(inode)
                ...
    	    ocfs2_dquot_release()
                  ocfs2_inode_lock(USER_QUOTA_SYSTEM_INODE)
                   - blocks
                                                finds we need more space in
                                                quota file
                                                ...
                                                ocfs2_extend_no_holes()
                                                  ocfs2_inode_lock(GLOBAL_BITMAP_SYSTEM_INODE)
                                                    - deadlocks waiting for
                                                      downconvert thread
    
    We solve the problem by postponing dropping of the last dquot reference to
    a workqueue if it happens from the downconvert thread.
    Signed-off-by: NJan Kara <jack@suse.cz>
    Reviewed-by: NMark Fasheh <mfasheh@suse.de>
    Reviewed-by: NSrinivas Eeda <srinivas.eeda@oracle.com>
    Cc: Joel Becker <jlbec@evilplan.org>
    Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
    e3a767b6
quota_global.c 28.5 KB