aboutsummaryrefslogtreecommitdiffstats
path: root/fs/cifs
diff options
context:
space:
mode:
authorJeff Layton <jlayton@redhat.com>2008-09-24 11:32:59 -0400
committerSteve French <sfrench@us.ibm.com>2008-09-24 14:59:20 -0400
commit7ce86d5a93ffe2542e6558a97ab055377df8cde3 (patch)
tree14b2e450aef89019dbbdcedaaed2383977aeb9c6 /fs/cifs
parent74553b1b6a8556e08757b4bce537fd8332b93898 (diff)
cifs: work around samba returning -ENOENT on SetFileDisposition call
cifs: work around samba returning -ENOENT on SetFileDisposition call Samba seems to return STATUS_OBJECT_NAME_NOT_FOUND when we try to set the delete on close bit after doing a rename by filehandle. This looks like a samba bug to me, but a lot of servers will do this. For now, pretend an -ENOENT return is a success. Samba does however seem to respect the CREATE_DELETE_ON_CLOSE bit when opening files that already exist. Windows will ignore it, but so adding it to the open flags should be harmless. We're also currently ignoring the return code on the rename by filehandle, so no need to set rc based on it. Signed-off-by: Jeff Layton <jlayton@redhat.com> Signed-off-by: Steve French <sfrench@us.ibm.com>
Diffstat (limited to 'fs/cifs')
-rw-r--r--fs/cifs/inode.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c
index 079f39a8dd3b..27e97d43c759 100644
--- a/fs/cifs/inode.c
+++ b/fs/cifs/inode.c
@@ -778,7 +778,8 @@ cifs_rename_pending_delete(char *full_path, struct inode *inode, int xid)
778 FILE_BASIC_INFO *info_buf; 778 FILE_BASIC_INFO *info_buf;
779 779
780 rc = CIFSSMBOpen(xid, tcon, full_path, FILE_OPEN, 780 rc = CIFSSMBOpen(xid, tcon, full_path, FILE_OPEN,
781 DELETE|FILE_WRITE_ATTRIBUTES, CREATE_NOT_DIR, 781 DELETE|FILE_WRITE_ATTRIBUTES,
782 CREATE_NOT_DIR|CREATE_DELETE_ON_CLOSE,
782 &netfid, &oplock, NULL, cifs_sb->local_nls, 783 &netfid, &oplock, NULL, cifs_sb->local_nls,
783 cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR); 784 cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR);
784 if (rc != 0) 785 if (rc != 0)
@@ -803,13 +804,20 @@ cifs_rename_pending_delete(char *full_path, struct inode *inode, int xid)
803 goto out_close; 804 goto out_close;
804 805
805 /* silly-rename the file */ 806 /* silly-rename the file */
806 rc = CIFSSMBRenameOpenFile(xid, tcon, netfid, NULL, cifs_sb->local_nls, 807 CIFSSMBRenameOpenFile(xid, tcon, netfid, NULL, cifs_sb->local_nls,
807 cifs_sb->mnt_cifs_flags & 808 cifs_sb->mnt_cifs_flags &
808 CIFS_MOUNT_MAP_SPECIAL_CHR); 809 CIFS_MOUNT_MAP_SPECIAL_CHR);
809 810
810 /* set DELETE_ON_CLOSE */ 811 /* set DELETE_ON_CLOSE */
811 rc = CIFSSMBSetFileDisposition(xid, tcon, true, netfid, current->tgid); 812 rc = CIFSSMBSetFileDisposition(xid, tcon, true, netfid, current->tgid);
812 813
814 /*
815 * some samba versions return -ENOENT when we try to set the file
816 * disposition here. Likely a samba bug, but work around it for now
817 */
818 if (rc == -ENOENT)
819 rc = 0;
820
813out_close: 821out_close:
814 CIFSSMBClose(xid, tcon, netfid); 822 CIFSSMBClose(xid, tcon, netfid);
815out: 823out: