cifs: when renaming don't try to unlink negative dentry
authorJeff Layton <jlayton@redhat.com>
Fri, 17 Apr 2009 15:45:30 +0000 (11:45 -0400)
committerSteve French <sfrench@us.ibm.com>
Fri, 17 Apr 2009 21:08:15 +0000 (21:08 +0000)
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>
fs/cifs/inode.c

index 09082ac85185eec39894a5bdf8d0951423bbfc20..f36b4e40e443d4b10c069eb62434e44c3d1f4292 100644 (file)
@@ -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;