s3:smbd: implement SMB2 Cancel correctly.
authorStefan Metzmacher <metze@samba.org>
Sat, 15 Aug 2009 08:01:38 +0000 (10:01 +0200)
committerStefan Metzmacher <metze@samba.org>
Mon, 17 Aug 2009 07:25:45 +0000 (09:25 +0200)
metze

13 files changed:
source3/smbd/globals.h
source3/smbd/smb2_break.c
source3/smbd/smb2_create.c
source3/smbd/smb2_find.c
source3/smbd/smb2_flush.c
source3/smbd/smb2_getinfo.c
source3/smbd/smb2_ioctl.c
source3/smbd/smb2_lock.c
source3/smbd/smb2_notify.c
source3/smbd/smb2_read.c
source3/smbd/smb2_server.c
source3/smbd/smb2_setinfo.c
source3/smbd/smb2_write.c

index 0b8ef5818ccd205c60d392fd0ee83e32130012b6..bfed901bf4adb208a9c030651d0e8d773a096b78 100644 (file)
@@ -264,7 +264,8 @@ NTSTATUS smbd_smb2_send_oplock_break(struct smbd_server_connection *sconn,
                                     uint64_t file_id_volatile,
                                     uint8_t oplock_level);
 
-NTSTATUS smbd_smb2_request_pending_queue(struct smbd_smb2_request *req);
+NTSTATUS smbd_smb2_request_pending_queue(struct smbd_smb2_request *req,
+                                        struct tevent_req *subreq);
 
 NTSTATUS smbd_smb2_request_check_session(struct smbd_smb2_request *req);
 NTSTATUS smbd_smb2_request_check_tcon(struct smbd_smb2_request *req);
@@ -311,6 +312,12 @@ struct smbd_smb2_request {
 
        NTSTATUS next_status;
 
+       /*
+        * The sub request for async backend calls.
+        * This is used for SMB2 Cancel.
+        */
+       struct tevent_req *subreq;
+
        struct {
                /* the NBT header is not allocated */
                uint8_t nbt_hdr[4];
index 449b8f6f4d7b2db46b7520c17413136701188c73..879d59f89e7eb4928ecf57f4bd7759310209077a 100644 (file)
@@ -77,11 +77,7 @@ NTSTATUS smbd_smb2_request_process_break(struct smbd_smb2_request *req)
        }
        tevent_req_set_callback(subreq, smbd_smb2_request_oplock_break_done, req);
 
-       if (tevent_req_is_in_progress(subreq)) {
-               return smbd_smb2_request_pending_queue(req);
-       }
-
-       return NT_STATUS_OK;
+       return smbd_smb2_request_pending_queue(req, subreq);
 }
 
 static void smbd_smb2_request_oplock_break_done(struct tevent_req *subreq)
index 43b1fcb43deb320379bc05fcd0c4a8c1ea25b13a..76fe504738dc161d369dd78225c71490b05c9d45 100644 (file)
@@ -126,11 +126,7 @@ NTSTATUS smbd_smb2_request_process_create(struct smbd_smb2_request *req)
        }
        tevent_req_set_callback(subreq, smbd_smb2_request_create_done, req);
 
-       if (tevent_req_is_in_progress(subreq)) {
-               return smbd_smb2_request_pending_queue(req);
-       }
-
-       return NT_STATUS_OK;
+       return smbd_smb2_request_pending_queue(req, subreq);
 }
 
 static void smbd_smb2_request_create_done(struct tevent_req *subreq)
index f28ae1974b8709a3bd138451932eccc23f8b64c0..40ba320fc5d059da0a7aac3a5d8a9c3f705e6ddd 100644 (file)
@@ -121,11 +121,7 @@ NTSTATUS smbd_smb2_request_process_find(struct smbd_smb2_request *req)
        }
        tevent_req_set_callback(subreq, smbd_smb2_request_find_done, req);
 
-       if (tevent_req_is_in_progress(subreq)) {
-               return smbd_smb2_request_pending_queue(req);
-       }
-
-       return NT_STATUS_OK;
+       return smbd_smb2_request_pending_queue(req, subreq);
 }
 
 static void smbd_smb2_request_find_done(struct tevent_req *subreq)
index bfdb2d87384a5712df30984bfba8cc6c97e8ec17..561e69058225def82b078abbc7c3fa6411bc89ca 100644 (file)
@@ -70,11 +70,7 @@ NTSTATUS smbd_smb2_request_process_flush(struct smbd_smb2_request *req)
        }
        tevent_req_set_callback(subreq, smbd_smb2_request_flush_done, req);
 
-       if (tevent_req_is_in_progress(subreq)) {
-               return smbd_smb2_request_pending_queue(req);
-       }
-
-       return NT_STATUS_OK;
+       return smbd_smb2_request_pending_queue(req, subreq);
 }
 
 static void smbd_smb2_request_flush_done(struct tevent_req *subreq)
index 1c247d7a0c57b93c15dce3485625b58bd46c9c01..3b50ab9cd7aede665100e472382571240f532455 100644 (file)
@@ -114,11 +114,7 @@ NTSTATUS smbd_smb2_request_process_getinfo(struct smbd_smb2_request *req)
        }
        tevent_req_set_callback(subreq, smbd_smb2_request_getinfo_done, req);
 
-       if (tevent_req_is_in_progress(subreq)) {
-               return smbd_smb2_request_pending_queue(req);
-       }
-
-       return NT_STATUS_OK;
+       return smbd_smb2_request_pending_queue(req, subreq);
 }
 
 static void smbd_smb2_request_getinfo_done(struct tevent_req *subreq)
index 333616ab6143b6552c3e04df69edbe34f7e8cd3f..0041e5f7d000470145ad05cb8c6d236bb5e9aba5 100644 (file)
@@ -105,11 +105,7 @@ NTSTATUS smbd_smb2_request_process_ioctl(struct smbd_smb2_request *req)
        }
        tevent_req_set_callback(subreq, smbd_smb2_request_ioctl_done, req);
 
-       if (tevent_req_is_in_progress(subreq)) {
-               return smbd_smb2_request_pending_queue(req);
-       }
-
-       return NT_STATUS_OK;
+       return smbd_smb2_request_pending_queue(req, subreq);
 }
 
 static void smbd_smb2_request_ioctl_done(struct tevent_req *subreq)
index eab95f666dbc99f74996d3476d74fd0ad5fef9a6..908e1cf8a4d575a640120d1467eedb199477dc78 100644 (file)
@@ -124,11 +124,7 @@ NTSTATUS smbd_smb2_request_process_lock(struct smbd_smb2_request *req)
        }
        tevent_req_set_callback(subreq, smbd_smb2_request_lock_done, req);
 
-       if (tevent_req_is_in_progress(subreq)) {
-               return smbd_smb2_request_pending_queue(req);
-       }
-
-       return NT_STATUS_OK;
+       return smbd_smb2_request_pending_queue(req, subreq);
 }
 
 static void smbd_smb2_request_lock_done(struct tevent_req *subreq)
index 390bb578a43a45e8984f32919b6ea3168dc6c9ba..4d21b27ff83103ed0a65184287c6a51ac12a2f9a 100644 (file)
@@ -92,11 +92,7 @@ NTSTATUS smbd_smb2_request_process_notify(struct smbd_smb2_request *req)
        }
        tevent_req_set_callback(subreq, smbd_smb2_request_notify_done, req);
 
-       if (tevent_req_is_in_progress(subreq)) {
-               return smbd_smb2_request_pending_queue(req);
-       }
-
-       return NT_STATUS_OK;
+       return smbd_smb2_request_pending_queue(req, subreq);
 }
 
 static void smbd_smb2_request_notify_done(struct tevent_req *subreq)
index 0b46567d60760f9cfeb158e2c39fc56c7429584e..3f316e0b71aad2f34555c4f96fc889145fa89192 100644 (file)
@@ -101,11 +101,7 @@ NTSTATUS smbd_smb2_request_process_read(struct smbd_smb2_request *req)
        }
        tevent_req_set_callback(subreq, smbd_smb2_request_read_done, req);
 
-       if (tevent_req_is_in_progress(subreq)) {
-               return smbd_smb2_request_pending_queue(req);
-       }
-
-       return NT_STATUS_OK;
+       return smbd_smb2_request_pending_queue(req, subreq);
 }
 
 static void smbd_smb2_request_read_done(struct tevent_req *subreq)
index edddccb9d942c869e43f1a98f1157f46bc1e5515..9e5be404eff2c473fe20607ee5f121360aab0820 100644 (file)
@@ -420,10 +420,10 @@ struct smbd_smb2_request_pending_state {
 
 static void smbd_smb2_request_pending_writev_done(struct tevent_req *subreq);
 
-NTSTATUS smbd_smb2_request_pending_queue(struct smbd_smb2_request *req)
+NTSTATUS smbd_smb2_request_pending_queue(struct smbd_smb2_request *req,
+                                        struct tevent_req *subreq)
 {
        struct smbd_smb2_request_pending_state *state;
-       struct tevent_req *subreq;
        uint8_t *outhdr;
        int i = req->current_idx;
        uint32_t flags;
@@ -432,6 +432,13 @@ NTSTATUS smbd_smb2_request_pending_queue(struct smbd_smb2_request *req)
        uint8_t *hdr;
        uint8_t *body;
 
+       if (!tevent_req_is_in_progress(subreq)) {
+               return NT_STATUS_OK;
+       }
+
+       req->subreq = subreq;
+       subreq = NULL;
+
        outhdr = (uint8_t *)req->out.vector[i].iov_base;
 
        flags = IVAL(outhdr, SMB2_HDR_FLAGS);
@@ -559,8 +566,8 @@ static NTSTATUS smbd_smb2_request_process_cancel(struct smbd_smb2_request *req)
                }
        }
 
-       if (cur) {
-               /* TODO: try to cancel the request */
+       if (cur && cur->subreq) {
+               tevent_req_cancel(cur->subreq);
        }
 
        return NT_STATUS_OK;
@@ -797,6 +804,8 @@ static NTSTATUS smbd_smb2_request_reply(struct smbd_smb2_request *req)
 {
        struct tevent_req *subreq;
 
+       req->subreq = NULL;
+
        smb2_setup_nbt_length(req->out.vector, req->out.vector_count);
 
        if (req->do_signing) {
index 5cb6714477f6cb8cb873411b1e3a1382c38d620e..f3e3fc964f9855750ff7a1d142056efa05fcb049 100644 (file)
@@ -104,11 +104,7 @@ NTSTATUS smbd_smb2_request_process_setinfo(struct smbd_smb2_request *req)
        }
        tevent_req_set_callback(subreq, smbd_smb2_request_setinfo_done, req);
 
-       if (tevent_req_is_in_progress(subreq)) {
-               return smbd_smb2_request_pending_queue(req);
-       }
-
-       return NT_STATUS_OK;
+       return smbd_smb2_request_pending_queue(req, subreq);
 }
 
 static void smbd_smb2_request_setinfo_done(struct tevent_req *subreq)
index d9fa46f5cabfb3a06a7341ba28a21faca2de9b0c..fa209fafc73170c006f1de6a1ee718365ea096a7 100644 (file)
@@ -109,11 +109,7 @@ NTSTATUS smbd_smb2_request_process_write(struct smbd_smb2_request *req)
        }
        tevent_req_set_callback(subreq, smbd_smb2_request_write_done, req);
 
-       if (tevent_req_is_in_progress(subreq)) {
-               return smbd_smb2_request_pending_queue(req);
-       }
-
-       return NT_STATUS_OK;
+       return smbd_smb2_request_pending_queue(req, subreq);
 }
 
 static void smbd_smb2_request_write_done(struct tevent_req *subreq)