From 67f89bb3300a4cedd2bb01f81a6ede21b05377e0 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Thu, 20 Jun 2019 12:20:39 +0200 Subject: [PATCH] smbd: Return "blocker_pid" from do_lock() Signed-off-by: Volker Lendecke Reviewed-by: Jeremy Allison --- source3/locking/locking.c | 4 +++ source3/locking/proto.h | 1 + source3/modules/vfs_fruit.c | 60 +++++++++++++++++++++++++++---------- source3/smbd/blocking.c | 2 ++ source3/smbd/reply.c | 4 +++ source3/smbd/smb2_lock.c | 1 + source3/smbd/trans2.c | 1 + 7 files changed, 57 insertions(+), 16 deletions(-) diff --git a/source3/locking/locking.c b/source3/locking/locking.c index 969be706147..17ecfd08fff 100644 --- a/source3/locking/locking.c +++ b/source3/locking/locking.c @@ -243,6 +243,7 @@ struct byte_range_lock *do_lock(struct messaging_context *msg_ctx, enum brl_flavour lock_flav, bool blocking_lock, NTSTATUS *perr, + struct server_id *pblocker_pid, uint64_t *psmblctx) { struct byte_range_lock *br_lck = NULL; @@ -294,6 +295,9 @@ struct byte_range_lock *do_lock(struct messaging_context *msg_ctx, if (psmblctx != NULL) { *psmblctx = blocker_smblctx; } + if (pblocker_pid != NULL) { + *pblocker_pid = blocker_pid; + } DEBUG(10, ("do_lock: returning status=%s\n", nt_errstr(*perr))); diff --git a/source3/locking/proto.h b/source3/locking/proto.h index 13883875521..273d3666d37 100644 --- a/source3/locking/proto.h +++ b/source3/locking/proto.h @@ -123,6 +123,7 @@ struct byte_range_lock *do_lock(struct messaging_context *msg_ctx, enum brl_flavour lock_flav, bool blocking_lock, NTSTATUS *perr, + struct server_id *pblocker_pid, uint64_t *psmblctx); NTSTATUS do_unlock(struct messaging_context *msg_ctx, files_struct *fsp, diff --git a/source3/modules/vfs_fruit.c b/source3/modules/vfs_fruit.c index f2964769a74..d8e0dbe63e6 100644 --- a/source3/modules/vfs_fruit.c +++ b/source3/modules/vfs_fruit.c @@ -2746,10 +2746,17 @@ static NTSTATUS fruit_check_access(vfs_handle_struct *handle, off = access_to_netatalk_brl(fork_type, FILE_READ_DATA); br_lck = do_lock( - handle->conn->sconn->msg_ctx, fsp, - fsp->op->global->open_persistent_id, 1, off, - READ_LOCK, POSIX_LOCK, false, - &status, NULL); + handle->conn->sconn->msg_ctx, + fsp, + fsp->op->global->open_persistent_id, + 1, + off, + READ_LOCK, + POSIX_LOCK, + false, /* blocking_lock */ + &status, + NULL, + NULL); TALLOC_FREE(br_lck); @@ -2763,10 +2770,17 @@ static NTSTATUS fruit_check_access(vfs_handle_struct *handle, off = denymode_to_netatalk_brl(fork_type, DENY_READ); br_lck = do_lock( - handle->conn->sconn->msg_ctx, fsp, - fsp->op->global->open_persistent_id, 1, off, - READ_LOCK, POSIX_LOCK, false, - &status, NULL); + handle->conn->sconn->msg_ctx, + fsp, + fsp->op->global->open_persistent_id, + 1, + off, + READ_LOCK, + POSIX_LOCK, + false, /* blocking_lock */ + &status, + NULL, + NULL); TALLOC_FREE(br_lck); @@ -2780,10 +2794,17 @@ static NTSTATUS fruit_check_access(vfs_handle_struct *handle, off = access_to_netatalk_brl(fork_type, FILE_WRITE_DATA); br_lck = do_lock( - handle->conn->sconn->msg_ctx, fsp, - fsp->op->global->open_persistent_id, 1, off, - READ_LOCK, POSIX_LOCK, false, - &status, NULL); + handle->conn->sconn->msg_ctx, + fsp, + fsp->op->global->open_persistent_id, + 1, + off, + READ_LOCK, + POSIX_LOCK, + false, + &status, + NULL, + NULL); TALLOC_FREE(br_lck); @@ -2797,10 +2818,17 @@ static NTSTATUS fruit_check_access(vfs_handle_struct *handle, off = denymode_to_netatalk_brl(fork_type, DENY_WRITE); br_lck = do_lock( - handle->conn->sconn->msg_ctx, fsp, - fsp->op->global->open_persistent_id, 1, off, - READ_LOCK, POSIX_LOCK, false, - &status, NULL); + handle->conn->sconn->msg_ctx, + fsp, + fsp->op->global->open_persistent_id, + 1, + off, + READ_LOCK, + POSIX_LOCK, + false, + &status, + NULL, + NULL); TALLOC_FREE(br_lck); diff --git a/source3/smbd/blocking.c b/source3/smbd/blocking.c index 590e3e45cd9..61a02c70969 100644 --- a/source3/smbd/blocking.c +++ b/source3/smbd/blocking.c @@ -496,6 +496,7 @@ static bool process_lockingX(struct blocking_lock_record *blr) WINDOWS_LOCK, True, &status, + NULL, &blr->blocking_smblctx); if (ERROR_WAS_LOCK_DENIED(status) && !lock_timeout) { @@ -598,6 +599,7 @@ static bool process_trans2(struct blocking_lock_record *blr) blr->lock_flav, True, &status, + NULL, &blr->blocking_smblctx); if (ERROR_WAS_LOCK_DENIED(status) && !lock_timeout) { struct server_id blocker_pid; diff --git a/source3/smbd/reply.c b/source3/smbd/reply.c index 9da7a651cef..d02f14ead13 100644 --- a/source3/smbd/reply.c +++ b/source3/smbd/reply.c @@ -3795,6 +3795,7 @@ void reply_lockread(struct smb_request *req) WINDOWS_LOCK, False, /* Non-blocking lock. */ &status, + NULL, NULL); TALLOC_FREE(br_lck); @@ -5663,6 +5664,7 @@ void reply_lock(struct smb_request *req) WINDOWS_LOCK, False, /* Non-blocking lock. */ &status, + NULL, NULL); TALLOC_FREE(br_lck); @@ -8112,6 +8114,7 @@ NTSTATUS smbd_do_locking(struct smb_request *req, bool blocking_lock = (timeout != 0); bool defer_lock = false; struct byte_range_lock *br_lck; + struct server_id blocker_pid; uint64_t block_smblctx; br_lck = do_lock(req->sconn->msg_ctx, @@ -8123,6 +8126,7 @@ NTSTATUS smbd_do_locking(struct smb_request *req, WINDOWS_LOCK, blocking_lock, &status, + &blocker_pid, &block_smblctx); if (br_lck && blocking_lock && ERROR_WAS_LOCK_DENIED(status)) { diff --git a/source3/smbd/smb2_lock.c b/source3/smbd/smb2_lock.c index 1372661d0c7..e1df44bb373 100644 --- a/source3/smbd/smb2_lock.c +++ b/source3/smbd/smb2_lock.c @@ -743,6 +743,7 @@ static void reprocess_blocked_smb2_lock(struct smbd_smb2_request *smb2req, WINDOWS_LOCK, true, &status, + NULL, &blr->blocking_smblctx); TALLOC_FREE(br_lck); diff --git a/source3/smbd/trans2.c b/source3/smbd/trans2.c index 27eb6270f60..72400984160 100644 --- a/source3/smbd/trans2.c +++ b/source3/smbd/trans2.c @@ -7357,6 +7357,7 @@ static NTSTATUS smb_set_posix_lock(connection_struct *conn, POSIX_LOCK, blocking_lock, &status, + NULL, &block_smblctx); if (br_lck && blocking_lock && ERROR_WAS_LOCK_DENIED(status)) { -- 2.47.3