diff options
author | Steve French <sfrench@us.ibm.com> | 2006-11-01 22:45:24 -0500 |
---|---|---|
committer | Steve French <sfrench@us.ibm.com> | 2006-11-01 22:45:24 -0500 |
commit | 8e87d4dc159148f04f515bc072df22a2c089e7f2 (patch) | |
tree | 2c9bb5abd706b3f9c710ab400d77c7ab91ae5b06 | |
parent | 4b952a9b0877dbe8f0f69b2747abe79e3bbd2865 (diff) |
[CIFS] report rename failure when target file is locked by Windows
Fixes Samba bugzilla bug # 4182
Rename by handle failures (retry after rename by path) were not
being returned back.
Signed-off-by: Steve French <sfrench@us.ibm.com>
-rw-r--r-- | fs/cifs/CHANGES | 4 | ||||
-rw-r--r-- | fs/cifs/inode.c | 14 |
2 files changed, 12 insertions, 6 deletions
diff --git a/fs/cifs/CHANGES b/fs/cifs/CHANGES index 50afab81a59b..0b3c37ef52e0 100644 --- a/fs/cifs/CHANGES +++ b/fs/cifs/CHANGES | |||
@@ -3,7 +3,9 @@ Version 1.46 | |||
3 | Support deep tree mounts. Better support OS/2, Win9x (DOS) time stamps. | 3 | Support deep tree mounts. Better support OS/2, Win9x (DOS) time stamps. |
4 | Allow null user to be specified on mount ("username="). Do not return | 4 | Allow null user to be specified on mount ("username="). Do not return |
5 | EINVAL on readdir when filldir fails due to overwritten blocksize | 5 | EINVAL on readdir when filldir fails due to overwritten blocksize |
6 | (fixes FC problem) | 6 | (fixes FC problem). Return error in rename 2nd attempt retry (ie report |
7 | if rename by handle also fails, after rename by path fails, we were | ||
8 | not reporting whether the retry worked or not). | ||
7 | 9 | ||
8 | Version 1.45 | 10 | Version 1.45 |
9 | ------------ | 11 | ------------ |
diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c index 35d54bb0869a..dffe295825f4 100644 --- a/fs/cifs/inode.c +++ b/fs/cifs/inode.c | |||
@@ -885,10 +885,14 @@ int cifs_rename(struct inode *source_inode, struct dentry *source_direntry, | |||
885 | kmalloc(2 * sizeof(FILE_UNIX_BASIC_INFO), GFP_KERNEL); | 885 | kmalloc(2 * sizeof(FILE_UNIX_BASIC_INFO), GFP_KERNEL); |
886 | if (info_buf_source != NULL) { | 886 | if (info_buf_source != NULL) { |
887 | info_buf_target = info_buf_source + 1; | 887 | info_buf_target = info_buf_source + 1; |
888 | rc = CIFSSMBUnixQPathInfo(xid, pTcon, fromName, | 888 | if (pTcon->ses->capabilities & CAP_UNIX) |
889 | info_buf_source, cifs_sb_source->local_nls, | 889 | rc = CIFSSMBUnixQPathInfo(xid, pTcon, fromName, |
890 | cifs_sb_source->mnt_cifs_flags & | 890 | info_buf_source, |
891 | CIFS_MOUNT_MAP_SPECIAL_CHR); | 891 | cifs_sb_source->local_nls, |
892 | cifs_sb_source->mnt_cifs_flags & | ||
893 | CIFS_MOUNT_MAP_SPECIAL_CHR); | ||
894 | /* else rc is still EEXIST so will fall through to | ||
895 | unlink the target and retry rename */ | ||
892 | if (rc == 0) { | 896 | if (rc == 0) { |
893 | rc = CIFSSMBUnixQPathInfo(xid, pTcon, toName, | 897 | rc = CIFSSMBUnixQPathInfo(xid, pTcon, toName, |
894 | info_buf_target, | 898 | info_buf_target, |
@@ -937,7 +941,7 @@ int cifs_rename(struct inode *source_inode, struct dentry *source_direntry, | |||
937 | cifs_sb_source->mnt_cifs_flags & | 941 | cifs_sb_source->mnt_cifs_flags & |
938 | CIFS_MOUNT_MAP_SPECIAL_CHR); | 942 | CIFS_MOUNT_MAP_SPECIAL_CHR); |
939 | if (rc==0) { | 943 | if (rc==0) { |
940 | CIFSSMBRenameOpenFile(xid, pTcon, netfid, toName, | 944 | rc = CIFSSMBRenameOpenFile(xid, pTcon, netfid, toName, |
941 | cifs_sb_source->local_nls, | 945 | cifs_sb_source->local_nls, |
942 | cifs_sb_source->mnt_cifs_flags & | 946 | cifs_sb_source->mnt_cifs_flags & |
943 | CIFS_MOUNT_MAP_SPECIAL_CHR); | 947 | CIFS_MOUNT_MAP_SPECIAL_CHR); |