summaryrefslogtreecommitdiffstats
path: root/source3/smbd/smb2_write.c
diff options
context:
space:
mode:
authorStefan Metzmacher <metze@samba.org>2011-11-14 09:33:22 +0100
committerStefan Metzmacher <metze@samba.org>2011-11-15 17:14:13 +0100
commit3fbf32213a9523ecab4bc201018d94f38b561b0b (patch)
tree4ce98a749c0b19e4cc9a6c979f6fe03a1599025a /source3/smbd/smb2_write.c
parent2802be75e38d5ae64ad5ec36e46d0799c77eec30 (diff)
downloadsamba-3fbf32213a9523ecab4bc201018d94f38b561b0b.tar.gz
samba-3fbf32213a9523ecab4bc201018d94f38b561b0b.tar.xz
samba-3fbf32213a9523ecab4bc201018d94f38b561b0b.zip
s3:smb2_write: make it possible to cancel aio writes
metze
Diffstat (limited to 'source3/smbd/smb2_write.c')
-rw-r--r--source3/smbd/smb2_write.c17
1 files changed, 16 insertions, 1 deletions
diff --git a/source3/smbd/smb2_write.c b/source3/smbd/smb2_write.c
index 34272056ed0..14d384fff3e 100644
--- a/source3/smbd/smb2_write.c
+++ b/source3/smbd/smb2_write.c
@@ -165,6 +165,7 @@ static void smbd_smb2_request_write_done(struct tevent_req *subreq)
struct smbd_smb2_write_state {
struct smbd_smb2_request *smb2req;
+ struct smb_request *smbreq;
files_struct *fsp;
bool write_through;
uint32_t in_length;
@@ -212,6 +213,17 @@ NTSTATUS smb2_write_complete(struct tevent_req *req, ssize_t nwritten, int err)
return NT_STATUS_OK;
}
+static bool smbd_smb2_write_cancel(struct tevent_req *req)
+{
+ struct smbd_smb2_write_state *state =
+ tevent_req_data(req,
+ struct smbd_smb2_write_state);
+
+ state->smb2req->cancelled = true;
+
+ return cancel_smb2_aio(state->smbreq);
+}
+
static struct tevent_req *smbd_smb2_write_send(TALLOC_CTX *mem_ctx,
struct tevent_context *ev,
struct smbd_smb2_request *smb2req,
@@ -249,6 +261,7 @@ static struct tevent_req *smbd_smb2_write_send(TALLOC_CTX *mem_ctx,
if (tevent_req_nomem(smbreq, req)) {
return tevent_req_post(req, ev);
}
+ state->smbreq = smbreq;
fsp = file_fsp(smbreq, (uint16_t)in_file_id_volatile);
if (fsp == NULL) {
@@ -302,8 +315,10 @@ static struct tevent_req *smbd_smb2_write_send(TALLOC_CTX *mem_ctx,
if (NT_STATUS_IS_OK(status)) {
/*
- * Doing an async write.
+ * Doing an async write, allow this
+ * request to be canceled
*/
+ tevent_req_set_cancel_fn(req, smbd_smb2_write_cancel);
return req;
}