From: Steve French Date: Fri, 3 Nov 2006 01:59:05 +0000 (+0000) Subject: [PATCH] CIFS: report rename failure when target file is locked by Windows X-Git-Tag: v2.6.18.3~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1d520e5839dc938021a473ea39d1df8cb60e5129;p=thirdparty%2Fkernel%2Fstable.git [PATCH] 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 [chrisw: trivial backport in CHANGES] Signed-off-by: Chris Wright --- diff --git a/fs/cifs/CHANGES b/fs/cifs/CHANGES index 0feb3bd49cb85..77a2fbb15294f 100644 --- a/fs/cifs/CHANGES +++ b/fs/cifs/CHANGES @@ -6,7 +6,11 @@ on requests on other threads. Improve POSIX locking emulation, (lock cancel now works, and unlock of merged range works even to Windows servers now). Fix oops on mount to lanman servers (win9x, os/2 etc.) when null password. Do not send listxattr -(SMB to query all EAs) if nouser_xattr specified. +(SMB to query all EAs) if nouser_xattr specified. Return error +in rename 2nd attempt retry (ie report if rename by handle also +fails, after rename by path fails, we were not reporting whether +the retry worked or not). + Version 1.44 ------------ diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c index b88147c1dc27f..c76ac386529e0 100644 --- a/fs/cifs/inode.c +++ b/fs/cifs/inode.c @@ -880,10 +880,14 @@ int cifs_rename(struct inode *source_inode, struct dentry *source_direntry, kmalloc(2 * sizeof(FILE_UNIX_BASIC_INFO), GFP_KERNEL); if (info_buf_source != NULL) { info_buf_target = info_buf_source + 1; - rc = CIFSSMBUnixQPathInfo(xid, pTcon, fromName, - info_buf_source, cifs_sb_source->local_nls, - cifs_sb_source->mnt_cifs_flags & - CIFS_MOUNT_MAP_SPECIAL_CHR); + if (pTcon->ses->capabilities & CAP_UNIX) + rc = CIFSSMBUnixQPathInfo(xid, pTcon, fromName, + info_buf_source, + cifs_sb_source->local_nls, + cifs_sb_source->mnt_cifs_flags & + CIFS_MOUNT_MAP_SPECIAL_CHR); + /* else rc is still EEXIST so will fall through to + unlink the target and retry rename */ if (rc == 0) { rc = CIFSSMBUnixQPathInfo(xid, pTcon, toName, info_buf_target, @@ -932,7 +936,7 @@ int cifs_rename(struct inode *source_inode, struct dentry *source_direntry, cifs_sb_source->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR); if (rc==0) { - CIFSSMBRenameOpenFile(xid, pTcon, netfid, toName, + rc = CIFSSMBRenameOpenFile(xid, pTcon, netfid, toName, cifs_sb_source->local_nls, cifs_sb_source->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR);