• alex chen's avatar
    ocfs2: prune the dcache before deleting the dentry of directory · 10ab8811
    alex chen authored
    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: default avatarAlex Chen <alex.chen@huawei.com>
    Reviewed-by: default avatarJoseph Qi <joseph.qi@huawei.com>
    Reviewed-by: default avatarjoyce.xue <xuejiufei@huawei.com>
    Reviewed-by: default avatarMark Fasheh <mfasheh@suse.com>
    Cc: Joel Becker <jlbec@evilplan.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    10ab8811
dlmglue.c 116 KB