struct inode *old_inode = old_dentry->d_inode;
struct inode *new_inode = new_dentry->d_inode;
struct dentry *dentry = NULL;
- int error, rehash = 0, update = 1;
+ int error, rehash = 0;
dfprintk(VFS, "NFS: rename(%s/%s -> %s/%s, ct=%d)\n",
old_dentry->d_parent->d_name.name, old_dentry->d_name.name,
}
/*
- * Check for within-directory rename ... no complications.
- */
- if (new_dir == old_dir)
- goto do_rename;
- /*
- * Cross-directory move ...
- *
* ... prune child dentries and writebacks if needed.
*/
if (old_dentry->d_count > 1) {
shrink_dcache_parent(old_dentry);
}
- /*
- * Now check the use counts ... we can't safely do the
- * rename unless we can drop the dentries first.
- */
- if (old_dentry->d_count > 1) {
-#ifdef NFS_PARANOIA
-printk("nfs_rename: old dentry %s/%s busy, d_count=%d\n",
-old_dentry->d_parent->d_name.name,old_dentry->d_name.name,old_dentry->d_count);
-#endif
- goto out;
- }
if (new_dentry->d_count > 1 && new_inode) {
#ifdef NFS_PARANOIA
printk("nfs_rename: new dentry %s/%s busy, d_count=%d\n",
goto out;
}
- d_drop(old_dentry);
- update = 0;
-
-do_rename:
/*
* To prevent any new references to the target during the rename,
* we unhash the dentry and free the inode in advance.
*/
-#ifdef NFS_PARANOIA
-if (new_inode &&
- new_inode->i_count > (S_ISDIR(new_inode->i_mode) ? 1 : new_inode->i_nlink))
-printk("nfs_rename: %s/%s inode busy?? i_count=%d, i_nlink=%d\n",
-new_dentry->d_parent->d_name.name, new_dentry->d_name.name,
-new_inode->i_count, new_inode->i_nlink);
-#endif
if (!list_empty(&new_dentry->d_hash)) {
d_drop(new_dentry);
- rehash = update;
+ rehash = 1;
}
- if (new_inode) {
+ if (new_inode)
d_delete(new_dentry);
- }
nfs_invalidate_dircache(new_dir);
nfs_invalidate_dircache(old_dir);
error = nfs_proc_rename(NFS_DSERVER(old_dentry),
NFS_FH(old_dentry->d_parent), old_dentry->d_name.name,
NFS_FH(new_dentry->d_parent), new_dentry->d_name.name);
- if (!error && !S_ISDIR(old_inode->i_mode)) {
- /* Update the dcache if needed */
- if (rehash)
- d_add(new_dentry, NULL);
- if (update)
- d_move(old_dentry, new_dentry);
- }
+
+ /* Update the dcache if needed */
+ if (rehash)
+ d_add(new_dentry, NULL);
+ if (!error && !S_ISDIR(old_inode->i_mode))
+ d_move(old_dentry, new_dentry);
out:
/* new dentry created? */