summaryrefslogtreecommitdiff
path: root/source3/modules
diff options
context:
space:
mode:
Diffstat (limited to 'source3/modules')
-rw-r--r--source3/modules/onefs_cbrl.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/source3/modules/onefs_cbrl.c b/source3/modules/onefs_cbrl.c
index a196511427..f7cb26ccd0 100644
--- a/source3/modules/onefs_cbrl.c
+++ b/source3/modules/onefs_cbrl.c
@@ -150,6 +150,11 @@ static void onefs_cbrl_async_success(uint64_t id)
else
bs->state = ONEFS_CBRL_NONE;
+ /* Self contend our own level 2 oplock. The kernel handles
+ * contention of other opener's level 2 oplocks. */
+ contend_level2_oplocks_begin(blr->fsp,
+ LEVEL2_CONTEND_WINDOWS_BRL);
+
/* Process the queue, to try the next lock or finish up. */
process_blocking_lock_queue();
}
@@ -215,7 +220,7 @@ static void onefs_init_cbrl(void)
DEBUG(10, ("cbrl_event_fd = %d\n", cbrl_event_fd));
- /* Register the oplock event_fd with samba's event system */
+ /* Register the CBRL event_fd with samba's event system */
cbrl_fde = event_add_fd(smbd_event_context(),
NULL,
cbrl_event_fd,
@@ -366,6 +371,10 @@ failure:
return status;
success:
+ /* Self contend our own level 2 oplock. The kernel handles
+ * contention of other opener's level 2 oplocks. */
+ contend_level2_oplocks_begin(br_lck->fsp,
+ LEVEL2_CONTEND_WINDOWS_BRL);
END_PROFILE(syscall_brl_lock);
@@ -400,6 +409,10 @@ bool onefs_brl_unlock_windows(vfs_handle_struct *handle,
return false;
}
+ /* For symmetry purposes, end our oplock contention even though its
+ * currently a no-op. */
+ contend_level2_oplocks_end(br_lck->fsp, LEVEL2_CONTEND_WINDOWS_BRL);
+
DEBUG(10, ("returning true.\n"));
return true;