diff options
Diffstat (limited to 'fs/cifs/inode.c')
-rw-r--r-- | fs/cifs/inode.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c index 426d6c6ad8bf..7899a40465b3 100644 --- a/fs/cifs/inode.c +++ b/fs/cifs/inode.c | |||
@@ -1720,13 +1720,22 @@ cifs_rename2(struct inode *source_dir, struct dentry *source_dentry, | |||
1720 | unlink_target: | 1720 | unlink_target: |
1721 | /* Try unlinking the target dentry if it's not negative */ | 1721 | /* Try unlinking the target dentry if it's not negative */ |
1722 | if (target_dentry->d_inode && (rc == -EACCES || rc == -EEXIST)) { | 1722 | if (target_dentry->d_inode && (rc == -EACCES || rc == -EEXIST)) { |
1723 | tmprc = cifs_unlink(target_dir, target_dentry); | 1723 | if (d_is_dir(target_dentry)) |
1724 | tmprc = cifs_rmdir(target_dir, target_dentry); | ||
1725 | else | ||
1726 | tmprc = cifs_unlink(target_dir, target_dentry); | ||
1724 | if (tmprc) | 1727 | if (tmprc) |
1725 | goto cifs_rename_exit; | 1728 | goto cifs_rename_exit; |
1726 | rc = cifs_do_rename(xid, source_dentry, from_name, | 1729 | rc = cifs_do_rename(xid, source_dentry, from_name, |
1727 | target_dentry, to_name); | 1730 | target_dentry, to_name); |
1728 | } | 1731 | } |
1729 | 1732 | ||
1733 | /* force revalidate to go get info when needed */ | ||
1734 | CIFS_I(source_dir)->time = CIFS_I(target_dir)->time = 0; | ||
1735 | |||
1736 | source_dir->i_ctime = source_dir->i_mtime = target_dir->i_ctime = | ||
1737 | target_dir->i_mtime = current_fs_time(source_dir->i_sb); | ||
1738 | |||
1730 | cifs_rename_exit: | 1739 | cifs_rename_exit: |
1731 | kfree(info_buf_source); | 1740 | kfree(info_buf_source); |
1732 | kfree(from_name); | 1741 | kfree(from_name); |