aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPavel Shilovsky <pshilovsky@samba.org>2012-09-18 19:20:28 -0400
committerSteve French <smfrench@gmail.com>2012-09-24 22:46:27 -0400
commit7a5cfb1965854132f2f382eade8c6ce2eeb6f692 (patch)
tree93f982d31fbcf23418423319be26ca77b364f83c
parent1d8c4c0009deda22b436b1f0ab9f2885863717fc (diff)
CIFS: Add SMB2 support for flush
Signed-off-by: Pavel Shilovsky <pshilovsky@samba.org> Signed-off-by: Steve French <smfrench@gmail.com>
-rw-r--r--fs/cifs/smb2ops.c8
-rw-r--r--fs/cifs/smb2pdu.c38
-rw-r--r--fs/cifs/smb2pdu.h15
-rw-r--r--fs/cifs/smb2proto.h2
4 files changed, 63 insertions, 0 deletions
diff --git a/fs/cifs/smb2ops.c b/fs/cifs/smb2ops.c
index 0fd580168252..d81e1daeb8f0 100644
--- a/fs/cifs/smb2ops.c
+++ b/fs/cifs/smb2ops.c
@@ -329,6 +329,13 @@ smb2_close_file(const unsigned int xid, struct cifs_tcon *tcon,
329 return SMB2_close(xid, tcon, fid->persistent_fid, fid->volatile_fid); 329 return SMB2_close(xid, tcon, fid->persistent_fid, fid->volatile_fid);
330} 330}
331 331
332static int
333smb2_flush_file(const unsigned int xid, struct cifs_tcon *tcon,
334 struct cifs_fid *fid)
335{
336 return SMB2_flush(xid, tcon, fid->persistent_fid, fid->volatile_fid);
337}
338
332struct smb_version_operations smb21_operations = { 339struct smb_version_operations smb21_operations = {
333 .setup_request = smb2_setup_request, 340 .setup_request = smb2_setup_request,
334 .setup_async_request = smb2_setup_async_request, 341 .setup_async_request = smb2_setup_async_request,
@@ -363,6 +370,7 @@ struct smb_version_operations smb21_operations = {
363 .open = smb2_open_file, 370 .open = smb2_open_file,
364 .set_fid = smb2_set_fid, 371 .set_fid = smb2_set_fid,
365 .close = smb2_close_file, 372 .close = smb2_close_file,
373 .flush = smb2_flush_file,
366}; 374};
367 375
368struct smb_version_values smb21_values = { 376struct smb_version_values smb21_values = {
diff --git a/fs/cifs/smb2pdu.c b/fs/cifs/smb2pdu.c
index 231e9701ab85..ff374063f4e2 100644
--- a/fs/cifs/smb2pdu.c
+++ b/fs/cifs/smb2pdu.c
@@ -1152,3 +1152,41 @@ SMB2_echo(struct TCP_Server_Info *server)
1152 cifs_small_buf_release(req); 1152 cifs_small_buf_release(req);
1153 return rc; 1153 return rc;
1154} 1154}
1155
1156int
1157SMB2_flush(const unsigned int xid, struct cifs_tcon *tcon, u64 persistent_fid,
1158 u64 volatile_fid)
1159{
1160 struct smb2_flush_req *req;
1161 struct TCP_Server_Info *server;
1162 struct cifs_ses *ses = tcon->ses;
1163 struct kvec iov[1];
1164 int resp_buftype;
1165 int rc = 0;
1166
1167 cFYI(1, "Flush");
1168
1169 if (ses && (ses->server))
1170 server = ses->server;
1171 else
1172 return -EIO;
1173
1174 rc = small_smb2_init(SMB2_FLUSH, tcon, (void **) &req);
1175 if (rc)
1176 return rc;
1177
1178 req->PersistentFileId = persistent_fid;
1179 req->VolatileFileId = volatile_fid;
1180
1181 iov[0].iov_base = (char *)req;
1182 /* 4 for rfc1002 length field */
1183 iov[0].iov_len = get_rfc1002_length(req) + 4;
1184
1185 rc = SendReceive2(xid, ses, iov, 1, &resp_buftype, 0);
1186
1187 if ((rc != 0) && tcon)
1188 cifs_stats_fail_inc(tcon, SMB2_FLUSH_HE);
1189
1190 free_rsp_buf(resp_buftype, iov[0].iov_base);
1191 return rc;
1192}
diff --git a/fs/cifs/smb2pdu.h b/fs/cifs/smb2pdu.h
index 0e962cbf8166..f5bf63f66971 100644
--- a/fs/cifs/smb2pdu.h
+++ b/fs/cifs/smb2pdu.h
@@ -453,6 +453,21 @@ struct smb2_close_rsp {
453 __le32 Attributes; 453 __le32 Attributes;
454} __packed; 454} __packed;
455 455
456struct smb2_flush_req {
457 struct smb2_hdr hdr;
458 __le16 StructureSize; /* Must be 24 */
459 __le16 Reserved1;
460 __le32 Reserved2;
461 __u64 PersistentFileId; /* opaque endianness */
462 __u64 VolatileFileId; /* opaque endianness */
463} __packed;
464
465struct smb2_flush_rsp {
466 struct smb2_hdr hdr;
467 __le16 StructureSize;
468 __le16 Reserved;
469} __packed;
470
456struct smb2_echo_req { 471struct smb2_echo_req {
457 struct smb2_hdr hdr; 472 struct smb2_hdr hdr;
458 __le16 StructureSize; /* Must be 4 */ 473 __le16 StructureSize; /* Must be 4 */
diff --git a/fs/cifs/smb2proto.h b/fs/cifs/smb2proto.h
index 624d344e1a57..51e6cd185c79 100644
--- a/fs/cifs/smb2proto.h
+++ b/fs/cifs/smb2proto.h
@@ -89,6 +89,8 @@ extern int SMB2_open(const unsigned int xid, struct cifs_tcon *tcon,
89 struct smb2_file_all_info *buf); 89 struct smb2_file_all_info *buf);
90extern int SMB2_close(const unsigned int xid, struct cifs_tcon *tcon, 90extern int SMB2_close(const unsigned int xid, struct cifs_tcon *tcon,
91 u64 persistent_file_id, u64 volatile_file_id); 91 u64 persistent_file_id, u64 volatile_file_id);
92extern int SMB2_flush(const unsigned int xid, struct cifs_tcon *tcon,
93 u64 persistent_file_id, u64 volatile_file_id);
92extern int SMB2_query_info(const unsigned int xid, struct cifs_tcon *tcon, 94extern int SMB2_query_info(const unsigned int xid, struct cifs_tcon *tcon,
93 u64 persistent_file_id, u64 volatile_file_id, 95 u64 persistent_file_id, u64 volatile_file_id,
94 struct smb2_file_all_info *data); 96 struct smb2_file_all_info *data);