cifs: don't use CREATE_DELETE_ON_CLOSE in cifs_rename_pending_delete
authorJeff Layton <jlayton@redhat.com>
Thu, 16 Oct 2008 23:27:12 +0000 (19:27 -0400)
committerSteve French <sfrench@us.ibm.com>
Fri, 17 Oct 2008 14:47:13 +0000 (14:47 +0000)
cifs: don't use CREATE_DELETE_ON_CLOSE in cifs_rename_pending_delete

CREATE_DELETE_ON_CLOSE apparently has different semantics than when you
set the DELETE_ON_CLOSE bit after opening the file. Setting it in the
open says "delete this file as soon as this filehandle is closed". That's
not what we want for cifs_rename_pending_delete.

Don't set this bit in the CreateFlags. Experimentation shows that
setting this flag in the SET_FILE_INFO call has no effect.

Signed-off-by: Jeff Layton <jlayton@redhat.com>
Signed-off-by: Steve French <sfrench@us.ibm.com>
fs/cifs/inode.c

index a8c833345fc98ad8442c70457ca654a881595883..fe4f2ee97b6c3146bd036b5dba982162fc0c7ab7 100644 (file)
@@ -784,8 +784,7 @@ cifs_rename_pending_delete(char *full_path, struct inode *inode, int xid)
        FILE_BASIC_INFO *info_buf;
 
        rc = CIFSSMBOpen(xid, tcon, full_path, FILE_OPEN,
-                        DELETE|FILE_WRITE_ATTRIBUTES,
-                        CREATE_NOT_DIR|CREATE_DELETE_ON_CLOSE,
+                        DELETE|FILE_WRITE_ATTRIBUTES, CREATE_NOT_DIR,
                         &netfid, &oplock, NULL, cifs_sb->local_nls,
                         cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR);
        if (rc != 0)
@@ -810,17 +809,23 @@ cifs_rename_pending_delete(char *full_path, struct inode *inode, int xid)
                goto out_close;
        cifsInode->cifsAttrs = dosattr;
 
-       /* silly-rename the file */
-       CIFSSMBRenameOpenFile(xid, tcon, netfid, NULL, cifs_sb->local_nls,
+       /* rename the file */
+       rc = CIFSSMBRenameOpenFile(xid, tcon, netfid, NULL, cifs_sb->local_nls,
                                   cifs_sb->mnt_cifs_flags &
                                            CIFS_MOUNT_MAP_SPECIAL_CHR);
+       if (rc != 0)
+               goto out;
 
        /* set DELETE_ON_CLOSE */
        rc = CIFSSMBSetFileDisposition(xid, tcon, true, netfid, current->tgid);
 
        /*
         * some samba versions return -ENOENT when we try to set the file
-        * disposition here. Likely a samba bug, but work around it for now
+        * disposition here. Likely a samba bug, but work around it for now.
+        * This means that some cifsXXX files may hang around after they
+        * shouldn't.
+        *
+        * BB: remove this once fixed samba servers are in the field
         */
        if (rc == -ENOENT)
                rc = 0;