diff options
author | Jeff Layton <jlayton@redhat.com> | 2008-10-16 19:27:12 -0400 |
---|---|---|
committer | Steve French <sfrench@us.ibm.com> | 2008-10-17 10:47:13 -0400 |
commit | dd1db2dedc4f6ad736fbba5aa6ecfe6e7c8ee0f4 (patch) | |
tree | 5585ad01c207b5cf0e45857255bceb4e1efee3ce /fs | |
parent | 469ee614aaa367d9cde01cbdd2027212f56c6cc6 (diff) |
cifs: don't use CREATE_DELETE_ON_CLOSE in cifs_rename_pending_delete
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>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/cifs/inode.c | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c index a8c833345fc9..fe4f2ee97b6c 100644 --- a/fs/cifs/inode.c +++ b/fs/cifs/inode.c | |||
@@ -784,8 +784,7 @@ cifs_rename_pending_delete(char *full_path, struct inode *inode, int xid) | |||
784 | FILE_BASIC_INFO *info_buf; | 784 | FILE_BASIC_INFO *info_buf; |
785 | 785 | ||
786 | rc = CIFSSMBOpen(xid, tcon, full_path, FILE_OPEN, | 786 | rc = CIFSSMBOpen(xid, tcon, full_path, FILE_OPEN, |
787 | DELETE|FILE_WRITE_ATTRIBUTES, | 787 | DELETE|FILE_WRITE_ATTRIBUTES, CREATE_NOT_DIR, |
788 | CREATE_NOT_DIR|CREATE_DELETE_ON_CLOSE, | ||
789 | &netfid, &oplock, NULL, cifs_sb->local_nls, | 788 | &netfid, &oplock, NULL, cifs_sb->local_nls, |
790 | cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR); | 789 | cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR); |
791 | if (rc != 0) | 790 | if (rc != 0) |
@@ -810,17 +809,23 @@ cifs_rename_pending_delete(char *full_path, struct inode *inode, int xid) | |||
810 | goto out_close; | 809 | goto out_close; |
811 | cifsInode->cifsAttrs = dosattr; | 810 | cifsInode->cifsAttrs = dosattr; |
812 | 811 | ||
813 | /* silly-rename the file */ | 812 | /* rename the file */ |
814 | CIFSSMBRenameOpenFile(xid, tcon, netfid, NULL, cifs_sb->local_nls, | 813 | rc = CIFSSMBRenameOpenFile(xid, tcon, netfid, NULL, cifs_sb->local_nls, |
815 | cifs_sb->mnt_cifs_flags & | 814 | cifs_sb->mnt_cifs_flags & |
816 | CIFS_MOUNT_MAP_SPECIAL_CHR); | 815 | CIFS_MOUNT_MAP_SPECIAL_CHR); |
816 | if (rc != 0) | ||
817 | goto out; | ||
817 | 818 | ||
818 | /* set DELETE_ON_CLOSE */ | 819 | /* set DELETE_ON_CLOSE */ |
819 | rc = CIFSSMBSetFileDisposition(xid, tcon, true, netfid, current->tgid); | 820 | rc = CIFSSMBSetFileDisposition(xid, tcon, true, netfid, current->tgid); |
820 | 821 | ||
821 | /* | 822 | /* |
822 | * some samba versions return -ENOENT when we try to set the file | 823 | * some samba versions return -ENOENT when we try to set the file |
823 | * disposition here. Likely a samba bug, but work around it for now | 824 | * disposition here. Likely a samba bug, but work around it for now. |
825 | * This means that some cifsXXX files may hang around after they | ||
826 | * shouldn't. | ||
827 | * | ||
828 | * BB: remove this once fixed samba servers are in the field | ||
824 | */ | 829 | */ |
825 | if (rc == -ENOENT) | 830 | if (rc == -ENOENT) |
826 | rc = 0; | 831 | rc = 0; |