• A
    ocfs2: prune the dcache before deleting the dentry of directory · 10ab8811
    alex chen 提交于
    In ocfs2_dentry_convert_worker, we should prune the dcache before deleting
    the dentry of directory, otherwise, in the following cases the inode of
    directory will still remain in orphan directory until the device being
    umounted.
    
    Mount point: /mnt/ocfs2
    Node A                              Node B
    mkdir /mnt/ocfs2/testdir
      ocfs2_mkdir
      ->ocfs2_mknod
      ->ocfs2_dentry_attach_lock
      ->ocfs2_dentry_lock(dentry, 0)
      ... ...
    touch /mnt/ocfs2/testdir/testfile
                                        unlink /mnt/test/testdir/testfile
                                        rmdir /mnt/ocfs2/testdir
                                          ocfs2_unlink
                                          ->ocfs2_remote_dentry_delete
                                          ->ocfs2_dentry_lock(dentry, 1)
                                          ... ...
    ... ...
    ocfs2_downconvert_thread
    ->ocfs2_unblock_lock
    ->ocfs2_dentry_convert_worker
    ->ocfs2_find_local_alias
      ->dget_dlock
    ->d_delete
    Here the dentry can not be
    released because the children's
    dentry is negative but still exist.
    Finally, this inode will still remain
    in orphan directory until its children
    are destroyed.
    
    So before deleting dentry of directory, we should prune the dcache to
    remove unused children of the parent dentry by shrink_dcache_parent().
    Signed-off-by: NAlex Chen <alex.chen@huawei.com>
    Reviewed-by: NJoseph Qi <joseph.qi@huawei.com>
    Reviewed-by: Njoyce.xue <xuejiufei@huawei.com>
    Reviewed-by: NMark Fasheh <mfasheh@suse.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>
    10ab8811
dlmglue.c 115.7 KB