From 4adbeb9714beb9194a6f350fdf89dfcb7dd04226 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Thu, 20 Jun 2019 12:05:30 +0200 Subject: [PATCH] smbd: Add "blocker_pid" to brl_lock() Soon we will wait on a conflicting lock to become free via dbwrap_watched_watch_send. That routine can take a server_id that blocks us, watching it to go away. To use that, we need to know which PID it is that blocks us. Signed-off-by: Volker Lendecke Reviewed-by: Jeremy Allison --- source3/locking/brlock.c | 2 ++ source3/locking/locking.c | 2 ++ source3/locking/proto.h | 1 + source3/smbd/blocking.c | 6 ++++++ source3/smbd/smb2_lock.c | 2 ++ 5 files changed, 13 insertions(+) diff --git a/source3/locking/brlock.c b/source3/locking/brlock.c index 5a4bd0d5c06..872a4b9869b 100644 --- a/source3/locking/brlock.c +++ b/source3/locking/brlock.c @@ -1023,6 +1023,7 @@ NTSTATUS brl_lock(struct messaging_context *msg_ctx, enum brl_type lock_type, enum brl_flavour lock_flav, bool blocking_lock, + struct server_id *blocker_pid, uint64_t *psmblctx) { NTSTATUS ret; @@ -1061,6 +1062,7 @@ NTSTATUS brl_lock(struct messaging_context *msg_ctx, /* If we're returning an error, return who blocked us. */ if (!NT_STATUS_IS_OK(ret) && psmblctx) { + *blocker_pid = lock.context.pid; *psmblctx = lock.context.smblctx; } return ret; diff --git a/source3/locking/locking.c b/source3/locking/locking.c index 8deb5279fa4..9d9476db19c 100644 --- a/source3/locking/locking.c +++ b/source3/locking/locking.c @@ -246,6 +246,7 @@ struct byte_range_lock *do_lock(struct messaging_context *msg_ctx, uint64_t *psmblctx) { struct byte_range_lock *br_lck = NULL; + struct server_id blocker_pid; /* silently return ok on print files as we don't do locking there */ if (fsp->print_file) { @@ -286,6 +287,7 @@ struct byte_range_lock *do_lock(struct messaging_context *msg_ctx, lock_type, lock_flav, blocking_lock, + &blocker_pid, psmblctx); DEBUG(10, ("do_lock: returning status=%s\n", nt_errstr(*perr))); diff --git a/source3/locking/proto.h b/source3/locking/proto.h index 9a9feffc0a4..13883875521 100644 --- a/source3/locking/proto.h +++ b/source3/locking/proto.h @@ -47,6 +47,7 @@ NTSTATUS brl_lock(struct messaging_context *msg_ctx, enum brl_type lock_type, enum brl_flavour lock_flav, bool blocking_lock, + struct server_id *blocker_pid, uint64_t *psmblctx); bool brl_unlock(struct messaging_context *msg_ctx, struct byte_range_lock *br_lck, diff --git a/source3/smbd/blocking.c b/source3/smbd/blocking.c index 1195f71cc47..590e3e45cd9 100644 --- a/source3/smbd/blocking.c +++ b/source3/smbd/blocking.c @@ -164,6 +164,7 @@ bool push_blocking_lock_request( struct byte_range_lock *br_lck, { struct smbd_server_connection *sconn = req->sconn; struct blocking_lock_record *blr; + struct server_id blocker_pid; NTSTATUS status; if (req->smb2req) { @@ -227,6 +228,7 @@ bool push_blocking_lock_request( struct byte_range_lock *br_lck, lock_type == READ_LOCK ? PENDING_READ_LOCK : PENDING_WRITE_LOCK, blr->lock_flav, True, + &blocker_pid, NULL); if (!NT_STATUS_IS_OK(status)) { @@ -497,6 +499,7 @@ static bool process_lockingX(struct blocking_lock_record *blr) &blr->blocking_smblctx); if (ERROR_WAS_LOCK_DENIED(status) && !lock_timeout) { + struct server_id blocker_pid; /* * If we didn't timeout, but still need to wait, * re-add the pending lock entry whilst holding @@ -515,6 +518,7 @@ static bool process_lockingX(struct blocking_lock_record *blr) PENDING_WRITE_LOCK, blr->lock_flav, true, /* Blocking lock. */ + &blocker_pid, NULL); if (!NT_STATUS_IS_OK(status1)) { @@ -596,6 +600,7 @@ static bool process_trans2(struct blocking_lock_record *blr) &status, &blr->blocking_smblctx); if (ERROR_WAS_LOCK_DENIED(status) && !lock_timeout) { + struct server_id blocker_pid; /* * If we didn't timeout, but still need to wait, * re-add the pending lock entry whilst holding @@ -614,6 +619,7 @@ static bool process_trans2(struct blocking_lock_record *blr) PENDING_WRITE_LOCK, blr->lock_flav, true, /* Blocking lock. */ + &blocker_pid, NULL); if (!NT_STATUS_IS_OK(status1)) { diff --git a/source3/smbd/smb2_lock.c b/source3/smbd/smb2_lock.c index ec2779ead75..1372661d0c7 100644 --- a/source3/smbd/smb2_lock.c +++ b/source3/smbd/smb2_lock.c @@ -594,6 +594,7 @@ bool push_blocking_lock_request_smb2( struct byte_range_lock *br_lck, struct tevent_req *req = NULL; struct smbd_smb2_lock_state *state = NULL; struct blocking_lock_record *blr = NULL; + struct server_id blocker_pid; NTSTATUS status = NT_STATUS_OK; if (!smb2req) { @@ -645,6 +646,7 @@ bool push_blocking_lock_request_smb2( struct byte_range_lock *br_lck, lock_type == READ_LOCK ? PENDING_READ_LOCK : PENDING_WRITE_LOCK, blr->lock_flav, true, + &blocker_pid, NULL); if (!NT_STATUS_IS_OK(status)) { -- 2.47.3