int v9fs_vfs_rmdir(struct inode *i, struct dentry *d)
 {
+       dentry_unhash(d);
        return v9fs_remove(i, d, 1);
 }
 
 
                 dentry->d_inode->i_ino,
                 (int)dentry->d_name.len, dentry->d_name.name);
 
+       dentry_unhash(dentry);
+
        return affs_remove_header(dentry);
 }
 
 
        _enter("{%x:%u},{%s}",
               dvnode->fid.vid, dvnode->fid.vnode, dentry->d_name.name);
 
+       dentry_unhash(dentry);
+
        ret = -ENAMETOOLONG;
        if (dentry->d_name.len >= AFSNAMEMAX)
                goto error;
 
        if (!autofs4_oz_mode(sbi) && !capable(CAP_SYS_ADMIN))
                return -EACCES;
 
+       dentry_unhash(dentry);
+
        if (atomic_dec_and_test(&ino->count)) {
                p_ino = autofs4_dentry_ino(dentry->d_parent);
                if (p_ino && dentry->d_parent != dentry)
 
            inode->i_ino == BTRFS_FIRST_FREE_OBJECTID)
                return -ENOTEMPTY;
 
+       dentry_unhash(dentry);
+
        trans = __unlink_start_trans(dir, dentry);
        if (IS_ERR(trans))
                return PTR_ERR(trans);
 
        int err = -EROFS;
        int op;
 
+       if ((dentry->d_inode->i_mode & S_IFMT) == S_IFDIR)
+               dentry_unhash(dentry);
+
        if (ceph_snap(dir) == CEPH_SNAPDIR) {
                /* rmdir .snap/foo is RMSNAP */
                dout("rmsnap dir %p '%.*s' dn %p\n", dir, dentry->d_name.len,
 
 
        cFYI(1, "cifs_rmdir, inode = 0x%p", inode);
 
+       dentry_unhash(direntry);
+
        xid = GetXid();
 
        full_path = build_path_from_dentry(direntry);
 
        int len = de->d_name.len;
        int error;
 
+       dentry_unhash(de);
+
        error = venus_rmdir(dir->i_sb, coda_i2f(dir), name, len);
        if (!error) {
                /* VFS may delete the child */
 
        struct module *subsys_owner = NULL, *dead_item_owner = NULL;
        int ret;
 
+       dentry_unhash(dentry);
+
        if (dentry->d_parent == configfs_sb->s_root)
                return -EPERM;
 
 
        struct dentry *lower_dir_dentry;
        int rc;
 
+       dentry_unhash(dentry);
+
        lower_dentry = ecryptfs_dentry_to_lower(dentry);
        dget(dentry);
        lower_dir_dentry = lock_parent(lower_dentry);
 
        struct inode *inode = dentry->d_inode;
        int err = -ENOTEMPTY;
 
+       dentry_unhash(dentry);
+
        if (exofs_empty_dir(inode)) {
                err = exofs_unlink(dir, dentry);
                if (!err) {
 
        struct inode * inode = dentry->d_inode;
        int err = -ENOTEMPTY;
 
+       dentry_unhash(dentry);
+
        if (ext2_empty_dir(inode)) {
                err = ext2_unlink(dir, dentry);
                if (!err) {
 
        struct ext3_dir_entry_2 * de;
        handle_t *handle;
 
+       dentry_unhash(dentry);
+
        /* Initialize quotas before so that eventual writes go in
         * separate transaction */
        dquot_initialize(dir);
 
        struct ext4_dir_entry_2 *de;
        handle_t *handle;
 
+       dentry_unhash(dentry);
+
        /* Initialize quotas before so that eventual writes go in
         * separate transaction */
        dquot_initialize(dir);
 
        struct fat_slot_info sinfo;
        int err;
 
+       dentry_unhash(dentry);
+
        lock_super(sb);
        /*
         * Check whether the directory is not in use, then check
 
        struct fat_slot_info sinfo;
        int err;
 
+       dentry_unhash(dentry);
+
        lock_super(sb);
 
        err = fat_dir_empty(inode);
 
        if (IS_ERR(req))
                return PTR_ERR(req);
 
+       dentry_unhash(entry);
+
        req->in.h.opcode = FUSE_RMDIR;
        req->in.h.nodeid = get_node_id(dir);
        req->in.numargs = 1;
 
        struct inode *inode = dentry->d_inode;
        int res;
 
+       if (S_ISDIR(inode->i_mode))
+               dentry_unhash(dentry);
+
        if (S_ISDIR(inode->i_mode) && inode->i_size != 2)
                return -ENOTEMPTY;
        res = hfs_cat_delete(inode->i_ino, dir, &dentry->d_name);
 
        struct inode *inode = dentry->d_inode;
        int res;
 
+       dentry_unhash(dentry);
+
        if (inode->i_size != 2)
                return -ENOTEMPTY;
 
 
        char *file;
        int err;
 
+       dentry_unhash(dentry);
+
        if ((file = dentry_name(dentry)) == NULL)
                return -ENOMEM;
        err = do_rmdir(file);
 
        int err;
        int r;
 
+       dentry_unhash(dentry);
+
        hpfs_adjust_length(name, &len);
        hpfs_lock(dir->i_sb);
        mutex_lock(&hpfs_i(inode)->i_parent_mutex);
 
        int ret;
        uint32_t now = get_seconds();
 
+       dentry_unhash(dentry);
+
        for (fd = f->dents ; fd; fd = fd->next) {
                if (fd->ino)
                        return -ENOTEMPTY;
 
 
        jfs_info("jfs_rmdir: dip:0x%p name:%s", dip, dentry->d_name.name);
 
+       dentry_unhash(dentry);
+
        /* Init inode for quota operations. */
        dquot_initialize(dip);
        dquot_initialize(ip);
 
        if (!simple_empty(dentry))
                return -ENOTEMPTY;
 
+       dentry_unhash(dentry);
+
        drop_nlink(dentry->d_inode);
        simple_unlink(dir, dentry);
        drop_nlink(dir);
 
 {
        struct inode *inode = dentry->d_inode;
 
+       dentry_unhash(dentry);
+
        if (!logfs_empty_dir(inode))
                return -ENOTEMPTY;
 
 
        struct inode * inode = dentry->d_inode;
        int err = -ENOTEMPTY;
 
+       dentry_unhash(dentry);
+
        if (minix_empty_dir(inode)) {
                err = minix_unlink(dir, dentry);
                if (!err) {
 
        else {
                error = security_inode_rmdir(dir, dentry);
                if (!error) {
-                       dentry_unhash(dentry);
                        error = dir->i_op->rmdir(dir, dentry);
                        if (!error) {
                                dentry->d_inode->i_flags |= S_DEAD;
 
        DPRINTK("ncp_rmdir: removing %s/%s\n",
                dentry->d_parent->d_name.name, dentry->d_name.name);
 
+       dentry_unhash(dentry);
+
        error = -EBUSY;
        if (!d_unhashed(dentry))
                goto out;
 
        dfprintk(VFS, "NFS: rmdir(%s/%ld), %s\n",
                        dir->i_sb->s_id, dir->i_ino, dentry->d_name.name);
 
+       dentry_unhash(dentry);
+
        error = NFS_PROTO(dir)->rmdir(dir, &dentry->d_name);
        /* Ensure the VFS deletes this inode */
        if (error == 0 && dentry->d_inode != NULL)
 
        struct nilfs_transaction_info ti;
        int err;
 
+       dentry_unhash(dentry);
+
        err = nilfs_transaction_begin(dir->i_sb, &ti, 0);
        if (err)
                return err;
 
                           (unsigned long long)OCFS2_I(dir)->ip_blkno,
                           (unsigned long long)OCFS2_I(inode)->ip_blkno);
 
+       if (S_ISDIR(inode->i_mode))
+               dentry_unhash(dentry);
+
        dquot_initialize(dir);
 
        BUG_ON(dentry->d_parent->d_inode != dir);
 
        struct inode *inode = dentry->d_inode;
        int ret;
 
-       if (S_ISDIR(inode->i_mode) && !omfs_dir_is_empty(inode))
-               return -ENOTEMPTY;
+
+       if (S_ISDIR(inode->i_mode)) {
+               dentry_unhash(dentry);
+               if (!omfs_dir_is_empty(inode))
+                       return -ENOTEMPTY;
+       }
 
        ret = omfs_delete_entry(dentry);
        if (ret)
 
        INITIALIZE_PATH(path);
        struct reiserfs_dir_entry de;
 
+       dentry_unhash(dentry);
+
        /* we will be doing 2 balancings and update 2 stat data, we change quotas
         * of the owner of the directory and of the owner of the parent directory.
         * The quota structure is possibly deleted only on last iput => outside
 
        struct inode *inode = dentry->d_inode;
        int err = -ENOTEMPTY;
 
+       dentry_unhash(dentry);
+
        if (sysv_empty_dir(inode)) {
                err = sysv_unlink(dir, dentry);
                if (!err) {
 
        struct ubifs_inode *dir_ui = ubifs_inode(dir);
        struct ubifs_budget_req req = { .mod_dent = 1, .dirtied_ino = 2 };
 
+       dentry_unhash(dentry);
+
        /*
         * Budget request settings: deletion direntry, deletion inode and
         * changing the parent inode. If budgeting fails, go ahead anyway
 
        struct fileIdentDesc *fi, cfi;
        struct kernel_lb_addr tloc;
 
+       dentry_unhash(dentry);
+
        retval = -ENOENT;
        fi = udf_find_entry(dir, &dentry->d_name, &fibh, &cfi);
        if (!fi)
 
        struct inode * inode = dentry->d_inode;
        int err= -ENOTEMPTY;
 
+       dentry_unhash(dentry);
+
        lock_ufs(dir->i_sb);
        if (ufs_empty_dir (inode)) {
                err = ufs_unlink(dir, dentry);