]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
smbd: Add "blocker_pid" to brl_lock()
authorVolker Lendecke <vl@samba.org>
Thu, 20 Jun 2019 10:05:30 +0000 (12:05 +0200)
committerJeremy Allison <jra@samba.org>
Thu, 20 Jun 2019 17:18:18 +0000 (17:18 +0000)
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 <vl@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
source3/locking/brlock.c
source3/locking/locking.c
source3/locking/proto.h
source3/smbd/blocking.c
source3/smbd/smb2_lock.c

index 5a4bd0d5c06381c818ff4e5aad48f45dae791c66..872a4b9869bb8da603bb27766281e2b3ac55f77f 100644 (file)
@@ -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;
index 8deb5279fa4dd4bba2cdcfab9a26bc1b93470942..9d9476db19c581b0bc043254e8ae916d853aaf5c 100644 (file)
@@ -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)));
index 9a9feffc0a4cd137d7fa6cec2eed28afcac6f50a..13883875521548080b0caed065cf1046e3485fdc 100644 (file)
@@ -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,
index 1195f71cc47aac511e3543f8410e9be9e8f8536e..590e3e45cd97ad7be87bd180da8048e457b79dbb 100644 (file)
@@ -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)) {
index ec2779ead75ad929ecba27270aff670c3c26c314..1372661d0c7b6a029b97ff18b89a520cb97e47a5 100644 (file)
@@ -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)) {