aboutsummaryrefslogtreecommitdiffstats
path: root/fs/cifs/cifssmb.c
diff options
context:
space:
mode:
authorSteve French <sfrench@us.ibm.com>2005-09-20 23:49:16 -0400
committerSteve French <sfrench@us.ibm.com>2005-09-20 23:49:16 -0400
commite30dcf3a1905b4d2154f95db5fdfdf69691b4f0e (patch)
tree13fb11eff9f5bbbfae6eeefaf8f6a56c76885347 /fs/cifs/cifssmb.c
parent3e87d80391c84eefceb4bda94a6363661dba4f71 (diff)
[CIFS] Add support for legacy servers part eight. Write fixes for Windows
ME, and do not set ctime unless explicitly requested with atime and/or mtime (it gets thrown away by most servers anyway as there is no way to set this via posix). Signed-off-by: Steve French (sfrench@us.ibm.com)
Diffstat (limited to 'fs/cifs/cifssmb.c')
-rw-r--r--fs/cifs/cifssmb.c15
1 files changed, 9 insertions, 6 deletions
diff --git a/fs/cifs/cifssmb.c b/fs/cifs/cifssmb.c
index 575b2281518d..f72a61df3c68 100644
--- a/fs/cifs/cifssmb.c
+++ b/fs/cifs/cifssmb.c
@@ -1072,7 +1072,7 @@ CIFSSMBWrite(const int xid, struct cifsTconInfo *tcon,
1072 if (bytes_sent > count) 1072 if (bytes_sent > count)
1073 bytes_sent = count; 1073 bytes_sent = count;
1074 pSMB->DataOffset = 1074 pSMB->DataOffset =
1075 cpu_to_le16(offsetof(struct smb_com_write_req,Data) - 4); 1075 cpu_to_le16(offsetof(struct smb_com_write_req,Data) - 4);
1076 if(buf) 1076 if(buf)
1077 memcpy(pSMB->Data,buf,bytes_sent); 1077 memcpy(pSMB->Data,buf,bytes_sent);
1078 else if(ubuf) { 1078 else if(ubuf) {
@@ -1080,20 +1080,23 @@ CIFSSMBWrite(const int xid, struct cifsTconInfo *tcon,
1080 cifs_buf_release(pSMB); 1080 cifs_buf_release(pSMB);
1081 return -EFAULT; 1081 return -EFAULT;
1082 } 1082 }
1083 } else { 1083 } else if (count != 0) {
1084 /* No buffer */ 1084 /* No buffer */
1085 cifs_buf_release(pSMB); 1085 cifs_buf_release(pSMB);
1086 return -EINVAL; 1086 return -EINVAL;
1087 } /* else setting file size with write of zero bytes */
1088 if(wct == 14)
1089 byte_count = bytes_sent + 1; /* pad */
1090 else /* wct == 12 */ {
1091 byte_count = bytes_sent + 5; /* bigger pad, smaller smb hdr */
1087 } 1092 }
1088
1089 byte_count = bytes_sent + 1 /* pad */ ; /* BB fix this for sends > 64K */
1090 pSMB->DataLengthLow = cpu_to_le16(bytes_sent & 0xFFFF); 1093 pSMB->DataLengthLow = cpu_to_le16(bytes_sent & 0xFFFF);
1091 pSMB->DataLengthHigh = cpu_to_le16(bytes_sent >> 16); 1094 pSMB->DataLengthHigh = cpu_to_le16(bytes_sent >> 16);
1092 pSMB->hdr.smb_buf_length += bytes_sent+1; 1095 pSMB->hdr.smb_buf_length += byte_count;
1093 1096
1094 if(wct == 14) 1097 if(wct == 14)
1095 pSMB->ByteCount = cpu_to_le16(byte_count); 1098 pSMB->ByteCount = cpu_to_le16(byte_count);
1096 else { /* old style write has byte count 4 bytes earlier */ 1099 else { /* old style write has byte count 4 bytes earlier so 4 bytes pad */
1097 struct smb_com_writex_req * pSMBW = 1100 struct smb_com_writex_req * pSMBW =
1098 (struct smb_com_writex_req *)pSMB; 1101 (struct smb_com_writex_req *)pSMB;
1099 pSMBW->ByteCount = cpu_to_le16(byte_count); 1102 pSMBW->ByteCount = cpu_to_le16(byte_count);