d_delete(dentry);
 }
 
+static void nfs_dentry_remove_handle_error(struct inode *dir,
+                                          struct dentry *dentry, int error)
+{
+       switch (error) {
+       case -ENOENT:
+               d_delete(dentry);
+               fallthrough;
+       case 0:
+               nfs_set_verifier(dentry, nfs_save_change_attribute(dir));
+       }
+}
+
 int nfs_rmdir(struct inode *dir, struct dentry *dentry)
 {
        int error;
                up_write(&NFS_I(d_inode(dentry))->rmdir_sem);
        } else
                error = NFS_PROTO(dir)->rmdir(dir, &dentry->d_name);
+       nfs_dentry_remove_handle_error(dir, dentry, error);
        trace_nfs_rmdir_exit(dir, dentry, error);
 
        return error;
        }
        spin_unlock(&dentry->d_lock);
        error = nfs_safe_remove(dentry);
-       if (!error || error == -ENOENT) {
-               nfs_set_verifier(dentry, nfs_save_change_attribute(dir));
-       } else if (need_rehash)
+       nfs_dentry_remove_handle_error(dir, dentry, error);
+       if (need_rehash)
                d_rehash(dentry);
 out:
        trace_nfs_unlink_exit(dir, dentry, error);