diff options
-rw-r--r-- | fs/nfs/dir.c | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c index 72f50c0117b1..eb50c19fc253 100644 --- a/fs/nfs/dir.c +++ b/fs/nfs/dir.c | |||
@@ -1511,9 +1511,11 @@ static int nfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
1511 | */ | 1511 | */ |
1512 | if (!new_inode) | 1512 | if (!new_inode) |
1513 | goto go_ahead; | 1513 | goto go_ahead; |
1514 | if (S_ISDIR(new_inode->i_mode)) | 1514 | if (S_ISDIR(new_inode->i_mode)) { |
1515 | goto out; | 1515 | error = -EISDIR; |
1516 | else if (atomic_read(&new_dentry->d_count) > 2) { | 1516 | if (!S_ISDIR(old_inode->i_mode)) |
1517 | goto out; | ||
1518 | } else if (atomic_read(&new_dentry->d_count) > 2) { | ||
1517 | int err; | 1519 | int err; |
1518 | /* copy the target dentry's name */ | 1520 | /* copy the target dentry's name */ |
1519 | dentry = d_alloc(new_dentry->d_parent, | 1521 | dentry = d_alloc(new_dentry->d_parent, |