summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeff Layton <jlayton@redhat.com>2009-04-17 11:45:30 -0400
committerSteve French <sfrench@us.ibm.com>2009-04-17 21:08:15 +0000
commitfc6f394332ef1bf6ff5fbeaba0f2cd7a3c7971b6 (patch)
tree86cccb6f28f84355d348bad27fa55d5c377d6660
parent22c9d52bc03b880045ab1081890a38f11b272ae7 (diff)
downloadlinux-fc6f394332ef1bf6ff5fbeaba0f2cd7a3c7971b6.tar.gz
linux-fc6f394332ef1bf6ff5fbeaba0f2cd7a3c7971b6.tar.bz2
linux-fc6f394332ef1bf6ff5fbeaba0f2cd7a3c7971b6.zip
cifs: when renaming don't try to unlink negative dentry
When attempting to rename a file on a read-only share, the kernel can call cifs_unlink on a negative dentry, which causes an oops. Only try to unlink the file if it's a positive dentry. Signed-off-by: Jeff Layton <jlayton@redhat.com> Tested-by: Shirish Pargaonkar <shirishp@us.ibm.com> CC: Stable <stable@vger.kernel.org> Signed-off-by: Steve French <sfrench@us.ibm.com>
-rw-r--r--fs/cifs/inode.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c
index 09082ac85185..f36b4e40e443 100644
--- a/fs/cifs/inode.c
+++ b/fs/cifs/inode.c
@@ -1453,7 +1453,8 @@ int cifs_rename(struct inode *source_dir, struct dentry *source_dentry,
checking the UniqueId via FILE_INTERNAL_INFO */
unlink_target:
- if ((rc == -EACCES) || (rc == -EEXIST)) {
+ /* Try unlinking the target dentry if it's not negative */
+ if (target_dentry->d_inode && (rc == -EACCES || rc == -EEXIST)) {
tmprc = cifs_unlink(target_dir, target_dentry);
if (tmprc)
goto cifs_rename_exit;