From: Andrew Morton Signed-off-by: Andrew Morton --- fs/namei.c | 6 +++--- fs/nfs/dir.c | 3 ++- fs/nfs/super.c | 10 +++++----- include/linux/fs.h | 7 +++---- 4 files changed, 13 insertions(+), 13 deletions(-) diff -puN fs/namei.c~revert-allow-file-systems-to-manually-d_move-inside-of-rename fs/namei.c --- a/fs/namei.c~revert-allow-file-systems-to-manually-d_move-inside-of-rename +++ a/fs/namei.c @@ -2370,8 +2370,7 @@ static int vfs_rename_dir(struct inode * dput(new_dentry); } if (!error) - if (!(old_dir->i_sb->s_type->fs_flags & FS_RENAME_DOES_D_MOVE)) - d_move(old_dentry,new_dentry); + d_move(old_dentry,new_dentry); return error; } @@ -2394,7 +2393,8 @@ static int vfs_rename_other(struct inode else error = old_dir->i_op->rename(old_dir, old_dentry, new_dir, new_dentry); if (!error) { - if (!(old_dir->i_sb->s_type->fs_flags & FS_RENAME_DOES_D_MOVE)) + /* The following d_move() should become unconditional */ + if (!(old_dir->i_sb->s_type->fs_flags & FS_ODD_RENAME)) d_move(old_dentry, new_dentry); } if (target) diff -puN fs/nfs/dir.c~revert-allow-file-systems-to-manually-d_move-inside-of-rename fs/nfs/dir.c --- a/fs/nfs/dir.c~revert-allow-file-systems-to-manually-d_move-inside-of-rename +++ a/fs/nfs/dir.c @@ -1682,7 +1682,8 @@ out: if (rehash) d_rehash(rehash); if (!error) { - d_move(old_dentry, new_dentry); + if (!S_ISDIR(old_inode->i_mode)) + d_move(old_dentry, new_dentry); nfs_renew_times(new_dentry); nfs_set_verifier(new_dentry, nfs_save_change_attribute(new_dir)); } diff -puN fs/nfs/super.c~revert-allow-file-systems-to-manually-d_move-inside-of-rename fs/nfs/super.c --- a/fs/nfs/super.c~revert-allow-file-systems-to-manually-d_move-inside-of-rename +++ a/fs/nfs/super.c @@ -71,7 +71,7 @@ static struct file_system_type nfs_fs_ty .name = "nfs", .get_sb = nfs_get_sb, .kill_sb = nfs_kill_super, - .fs_flags = FS_RENAME_DOES_D_MOVE|FS_REVAL_DOT|FS_BINARY_MOUNTDATA, + .fs_flags = FS_ODD_RENAME|FS_REVAL_DOT|FS_BINARY_MOUNTDATA, }; struct file_system_type nfs_xdev_fs_type = { @@ -79,7 +79,7 @@ struct file_system_type nfs_xdev_fs_type .name = "nfs", .get_sb = nfs_xdev_get_sb, .kill_sb = nfs_kill_super, - .fs_flags = FS_RENAME_DOES_D_MOVE|FS_REVAL_DOT|FS_BINARY_MOUNTDATA, + .fs_flags = FS_ODD_RENAME|FS_REVAL_DOT|FS_BINARY_MOUNTDATA, }; static struct super_operations nfs_sops = { @@ -107,7 +107,7 @@ static struct file_system_type nfs4_fs_t .name = "nfs4", .get_sb = nfs4_get_sb, .kill_sb = nfs4_kill_super, - .fs_flags = FS_RENAME_DOES_D_MOVE|FS_REVAL_DOT|FS_BINARY_MOUNTDATA, + .fs_flags = FS_ODD_RENAME|FS_REVAL_DOT|FS_BINARY_MOUNTDATA, }; struct file_system_type nfs4_xdev_fs_type = { @@ -115,7 +115,7 @@ struct file_system_type nfs4_xdev_fs_typ .name = "nfs4", .get_sb = nfs4_xdev_get_sb, .kill_sb = nfs4_kill_super, - .fs_flags = FS_RENAME_DOES_D_MOVE|FS_REVAL_DOT|FS_BINARY_MOUNTDATA, + .fs_flags = FS_ODD_RENAME|FS_REVAL_DOT|FS_BINARY_MOUNTDATA, }; struct file_system_type nfs4_referral_fs_type = { @@ -123,7 +123,7 @@ struct file_system_type nfs4_referral_fs .name = "nfs4", .get_sb = nfs4_referral_get_sb, .kill_sb = nfs4_kill_super, - .fs_flags = FS_RENAME_DOES_D_MOVE|FS_REVAL_DOT|FS_BINARY_MOUNTDATA, + .fs_flags = FS_ODD_RENAME|FS_REVAL_DOT|FS_BINARY_MOUNTDATA, }; static struct super_operations nfs4_sops = { diff -puN include/linux/fs.h~revert-allow-file-systems-to-manually-d_move-inside-of-rename include/linux/fs.h --- a/include/linux/fs.h~revert-allow-file-systems-to-manually-d_move-inside-of-rename +++ a/include/linux/fs.h @@ -92,10 +92,9 @@ extern int dir_notify_enable; #define FS_REQUIRES_DEV 1 #define FS_BINARY_MOUNTDATA 2 #define FS_REVAL_DOT 16384 /* Check the paths ".", ".." for staleness */ -#define FS_RENAME_DOES_D_MOVE 32768 /* FS will handle d_move() - * during rename() internally. - */ - +#define FS_ODD_RENAME 32768 /* Temporary stuff; will go away as soon + * as nfs_rename() will be cleaned up + */ /* * These are the fs-independent mount-flags: up to 32 flags are supported */ _