diff options
author | Andrew Tridgell <tridge@samba.org> | 2004-11-05 02:22:07 +0000 |
---|---|---|
committer | Gerald (Jerry) Carter <jerry@samba.org> | 2007-10-10 13:05:30 -0500 |
commit | 1d97e7b9d8a8e716cd50bb42065687a65d542b2d (patch) | |
tree | 4cb4743b53cbb51dd2f01bf032cd53cba2006b61 /source4/ntvfs/posix/pvfs_wait.c | |
parent | 80eef3ea6647a9f8600466b2b468d38bd2eb0664 (diff) | |
download | samba-1d97e7b9d8a8e716cd50bb42065687a65d542b2d.tar.gz samba-1d97e7b9d8a8e716cd50bb42065687a65d542b2d.tar.bz2 samba-1d97e7b9d8a8e716cd50bb42065687a65d542b2d.zip |
r3540: added testing of SMBntcancel in the open/open/close mux
testing. Interestingly, w2k3 does not allow the cancel of an
outstanding async open request, whereas it does allow the cancel of an
outstanding async lock request. To support this I have changed the
pvfs_wait interface to provide a enum on why the event is happening,
so the callback can decide what to do.
(This used to be commit f23d6a28008a13588cde24b5012ec21e488ac47a)
Diffstat (limited to 'source4/ntvfs/posix/pvfs_wait.c')
-rw-r--r-- | source4/ntvfs/posix/pvfs_wait.c | 19 |
1 files changed, 10 insertions, 9 deletions
diff --git a/source4/ntvfs/posix/pvfs_wait.c b/source4/ntvfs/posix/pvfs_wait.c index df7f045e00..dd7afaf653 100644 --- a/source4/ntvfs/posix/pvfs_wait.c +++ b/source4/ntvfs/posix/pvfs_wait.c @@ -29,14 +29,14 @@ struct pvfs_wait { struct pvfs_wait *next, *prev; struct pvfs_state *pvfs; - void (*handler)(void *, BOOL); + void (*handler)(void *, enum pvfs_wait_notice); void *private; struct timed_event *te; int msg_type; struct messaging_context *msg_ctx; struct event_context *ev; struct smbsrv_request *req; - BOOL timed_out; + enum pvfs_wait_notice reason; }; /* @@ -48,7 +48,7 @@ NTSTATUS pvfs_async_setup(struct ntvfs_module_context *ntvfs, struct smbsrv_request *req, void *private) { struct pvfs_wait *pwait = private; - pwait->handler(pwait->private, pwait->timed_out); + pwait->handler(pwait->private, pwait->reason); return NT_STATUS_OK; } @@ -68,7 +68,7 @@ static void pvfs_wait_dispatch(struct messaging_context *msg, void *private, uin *(void **)data->data != pwait->private) { return; } - pwait->timed_out = False; + pwait->reason = PVFS_WAIT_EVENT; req = pwait->req; /* the extra reference here is to ensure that the req @@ -90,7 +90,7 @@ static void pvfs_wait_timeout(struct event_context *ev, struct pvfs_wait *pwait = te->private; struct smbsrv_request *req = pwait->req; - pwait->timed_out = True; + pwait->reason = PVFS_WAIT_TIMEOUT; talloc_increase_ref_count(req); ntvfs_async_setup(pwait->req, pwait); @@ -117,11 +117,11 @@ static int pvfs_wait_destructor(void *ptr) the return value is a handle. To stop waiting talloc_free this handle. */ -void *pvfs_wait_message(struct pvfs_state *pvfs, + void *pvfs_wait_message(struct pvfs_state *pvfs, struct smbsrv_request *req, int msg_type, struct timeval end_time, - void (*fn)(void *, BOOL), + void (*fn)(void *, enum pvfs_wait_notice), void *private) { struct timed_event te; @@ -180,8 +180,9 @@ NTSTATUS pvfs_cancel(struct ntvfs_module_context *ntvfs, struct smbsrv_request * for (pwait=pvfs->wait_list;pwait;pwait=pwait->next) { if (SVAL(req->in.hdr, HDR_MID) == SVAL(pwait->req->in.hdr, HDR_MID) && req->smbpid == pwait->req->smbpid) { - /* trigger an early timeout */ - pvfs_wait_timeout(pwait->ev, pwait->te, timeval_current()); + /* trigger a cancel on the request */ + pwait->reason = PVFS_WAIT_CANCEL; + ntvfs_async_setup(pwait->req, pwait); return NT_STATUS_OK; } } |