diff options
-rw-r--r-- | fs/nfs/dir.c | 10 |
1 files changed, 2 insertions, 8 deletions
diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c index 7cb298525ee..b5fae1953e9 100644 --- a/fs/nfs/dir.c +++ b/fs/nfs/dir.c | |||
@@ -1601,13 +1601,8 @@ static int nfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
1601 | * silly-rename. If the silly-rename succeeds, the | 1601 | * silly-rename. If the silly-rename succeeds, the |
1602 | * copied dentry is hashed and becomes the new target. | 1602 | * copied dentry is hashed and becomes the new target. |
1603 | */ | 1603 | */ |
1604 | if (!new_inode) | 1604 | if (new_inode && !S_ISDIR(new_inode->i_mode) && |
1605 | goto go_ahead; | 1605 | atomic_read(&new_dentry->d_count) > 2) { |
1606 | if (S_ISDIR(new_inode->i_mode)) { | ||
1607 | error = -EISDIR; | ||
1608 | if (!S_ISDIR(old_inode->i_mode)) | ||
1609 | goto out; | ||
1610 | } else if (atomic_read(&new_dentry->d_count) > 2) { | ||
1611 | int err; | 1606 | int err; |
1612 | /* copy the target dentry's name */ | 1607 | /* copy the target dentry's name */ |
1613 | dentry = d_alloc(new_dentry->d_parent, | 1608 | dentry = d_alloc(new_dentry->d_parent, |
@@ -1627,7 +1622,6 @@ static int nfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
1627 | goto out; | 1622 | goto out; |
1628 | } | 1623 | } |
1629 | 1624 | ||
1630 | go_ahead: | ||
1631 | /* | 1625 | /* |
1632 | * ... prune child dentries and writebacks if needed. | 1626 | * ... prune child dentries and writebacks if needed. |
1633 | */ | 1627 | */ |