git.samba.org
/
metze
/
samba
/
wip.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
3b3bde9
)
s3:smbd: implement SMB2 Cancel correctly.
author
Stefan Metzmacher
<metze@samba.org>
Sat, 15 Aug 2009 08:01:38 +0000
(10:01 +0200)
committer
Stefan Metzmacher
<metze@samba.org>
Mon, 17 Aug 2009 07:25:45 +0000
(09:25 +0200)
metze
13 files changed:
source3/smbd/globals.h
patch
|
blob
|
history
source3/smbd/smb2_break.c
patch
|
blob
|
history
source3/smbd/smb2_create.c
patch
|
blob
|
history
source3/smbd/smb2_find.c
patch
|
blob
|
history
source3/smbd/smb2_flush.c
patch
|
blob
|
history
source3/smbd/smb2_getinfo.c
patch
|
blob
|
history
source3/smbd/smb2_ioctl.c
patch
|
blob
|
history
source3/smbd/smb2_lock.c
patch
|
blob
|
history
source3/smbd/smb2_notify.c
patch
|
blob
|
history
source3/smbd/smb2_read.c
patch
|
blob
|
history
source3/smbd/smb2_server.c
patch
|
blob
|
history
source3/smbd/smb2_setinfo.c
patch
|
blob
|
history
source3/smbd/smb2_write.c
patch
|
blob
|
history
diff --git
a/source3/smbd/globals.h
b/source3/smbd/globals.h
index 0b8ef5818ccd205c60d392fd0ee83e32130012b6..bfed901bf4adb208a9c030651d0e8d773a096b78 100644
(file)
--- a/
source3/smbd/globals.h
+++ b/
source3/smbd/globals.h
@@
-264,7
+264,8
@@
NTSTATUS smbd_smb2_send_oplock_break(struct smbd_server_connection *sconn,
uint64_t file_id_volatile,
uint8_t oplock_level);
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);
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;
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];
struct {
/* the NBT header is not allocated */
uint8_t nbt_hdr[4];
diff --git
a/source3/smbd/smb2_break.c
b/source3/smbd/smb2_break.c
index 449b8f6f4d7b2db46b7520c17413136701188c73..879d59f89e7eb4928ecf57f4bd7759310209077a 100644
(file)
--- a/
source3/smbd/smb2_break.c
+++ b/
source3/smbd/smb2_break.c
@@
-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);
}
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)
}
static void smbd_smb2_request_oplock_break_done(struct tevent_req *subreq)
diff --git
a/source3/smbd/smb2_create.c
b/source3/smbd/smb2_create.c
index 43b1fcb43deb320379bc05fcd0c4a8c1ea25b13a..76fe504738dc161d369dd78225c71490b05c9d45 100644
(file)
--- a/
source3/smbd/smb2_create.c
+++ b/
source3/smbd/smb2_create.c
@@
-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);
}
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)
}
static void smbd_smb2_request_create_done(struct tevent_req *subreq)
diff --git
a/source3/smbd/smb2_find.c
b/source3/smbd/smb2_find.c
index f28ae1974b8709a3bd138451932eccc23f8b64c0..40ba320fc5d059da0a7aac3a5d8a9c3f705e6ddd 100644
(file)
--- a/
source3/smbd/smb2_find.c
+++ b/
source3/smbd/smb2_find.c
@@
-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);
}
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)
}
static void smbd_smb2_request_find_done(struct tevent_req *subreq)
diff --git
a/source3/smbd/smb2_flush.c
b/source3/smbd/smb2_flush.c
index bfdb2d87384a5712df30984bfba8cc6c97e8ec17..561e69058225def82b078abbc7c3fa6411bc89ca 100644
(file)
--- a/
source3/smbd/smb2_flush.c
+++ b/
source3/smbd/smb2_flush.c
@@
-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);
}
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)
}
static void smbd_smb2_request_flush_done(struct tevent_req *subreq)
diff --git
a/source3/smbd/smb2_getinfo.c
b/source3/smbd/smb2_getinfo.c
index 1c247d7a0c57b93c15dce3485625b58bd46c9c01..3b50ab9cd7aede665100e472382571240f532455 100644
(file)
--- a/
source3/smbd/smb2_getinfo.c
+++ b/
source3/smbd/smb2_getinfo.c
@@
-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);
}
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)
}
static void smbd_smb2_request_getinfo_done(struct tevent_req *subreq)
diff --git
a/source3/smbd/smb2_ioctl.c
b/source3/smbd/smb2_ioctl.c
index 333616ab6143b6552c3e04df69edbe34f7e8cd3f..0041e5f7d000470145ad05cb8c6d236bb5e9aba5 100644
(file)
--- a/
source3/smbd/smb2_ioctl.c
+++ b/
source3/smbd/smb2_ioctl.c
@@
-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);
}
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)
}
static void smbd_smb2_request_ioctl_done(struct tevent_req *subreq)
diff --git
a/source3/smbd/smb2_lock.c
b/source3/smbd/smb2_lock.c
index eab95f666dbc99f74996d3476d74fd0ad5fef9a6..908e1cf8a4d575a640120d1467eedb199477dc78 100644
(file)
--- a/
source3/smbd/smb2_lock.c
+++ b/
source3/smbd/smb2_lock.c
@@
-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);
}
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)
}
static void smbd_smb2_request_lock_done(struct tevent_req *subreq)
diff --git
a/source3/smbd/smb2_notify.c
b/source3/smbd/smb2_notify.c
index 390bb578a43a45e8984f32919b6ea3168dc6c9ba..4d21b27ff83103ed0a65184287c6a51ac12a2f9a 100644
(file)
--- a/
source3/smbd/smb2_notify.c
+++ b/
source3/smbd/smb2_notify.c
@@
-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);
}
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)
}
static void smbd_smb2_request_notify_done(struct tevent_req *subreq)
diff --git
a/source3/smbd/smb2_read.c
b/source3/smbd/smb2_read.c
index 0b46567d60760f9cfeb158e2c39fc56c7429584e..3f316e0b71aad2f34555c4f96fc889145fa89192 100644
(file)
--- a/
source3/smbd/smb2_read.c
+++ b/
source3/smbd/smb2_read.c
@@
-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);
}
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)
}
static void smbd_smb2_request_read_done(struct tevent_req *subreq)
diff --git
a/source3/smbd/smb2_server.c
b/source3/smbd/smb2_server.c
index edddccb9d942c869e43f1a98f1157f46bc1e5515..9e5be404eff2c473fe20607ee5f121360aab0820 100644
(file)
--- a/
source3/smbd/smb2_server.c
+++ b/
source3/smbd/smb2_server.c
@@
-420,10
+420,10
@@
struct smbd_smb2_request_pending_state {
static void smbd_smb2_request_pending_writev_done(struct tevent_req *subreq);
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 smbd_smb2_request_pending_state *state;
- struct tevent_req *subreq;
uint8_t *outhdr;
int i = req->current_idx;
uint32_t flags;
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;
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);
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;
}
return NT_STATUS_OK;
@@
-797,6
+804,8
@@
static NTSTATUS smbd_smb2_request_reply(struct smbd_smb2_request *req)
{
struct tevent_req *subreq;
{
struct tevent_req *subreq;
+ req->subreq = NULL;
+
smb2_setup_nbt_length(req->out.vector, req->out.vector_count);
if (req->do_signing) {
smb2_setup_nbt_length(req->out.vector, req->out.vector_count);
if (req->do_signing) {
diff --git
a/source3/smbd/smb2_setinfo.c
b/source3/smbd/smb2_setinfo.c
index 5cb6714477f6cb8cb873411b1e3a1382c38d620e..f3e3fc964f9855750ff7a1d142056efa05fcb049 100644
(file)
--- a/
source3/smbd/smb2_setinfo.c
+++ b/
source3/smbd/smb2_setinfo.c
@@
-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);
}
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)
}
static void smbd_smb2_request_setinfo_done(struct tevent_req *subreq)
diff --git
a/source3/smbd/smb2_write.c
b/source3/smbd/smb2_write.c
index d9fa46f5cabfb3a06a7341ba28a21faca2de9b0c..fa209fafc73170c006f1de6a1ee718365ea096a7 100644
(file)
--- a/
source3/smbd/smb2_write.c
+++ b/
source3/smbd/smb2_write.c
@@
-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);
}
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)
}
static void smbd_smb2_request_write_done(struct tevent_req *subreq)