s3 onefs: Self-contend level2 oplocks on BRL
authorZack Kirsch <zack.kirsch@isilon.com>
Mon, 11 May 2009 17:10:43 +0000 (17:10 +0000)
committerTim Prouty <tprouty@samba.org>
Wed, 13 May 2009 00:53:16 +0000 (17:53 -0700)
source3/modules/onefs_cbrl.c
source3/smbd/oplock_onefs.c

index a196511427c54f165396e8087b7a568b40091cec..f7cb26ccd0e043468091fa115b6bcf46d138d8b8 100644 (file)
@@ -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;
 
index b69d93791501e0f88765cdd9a08c59c9e8e700a5..d359f9c6f201638956cf6545aa99532e2ce3965c 100644 (file)
@@ -526,7 +526,6 @@ static void onefs_semlock_write(int fd, enum level2_contention_type type,
 
        switch (type) {
        case LEVEL2_CONTEND_ALLOC_GROW:
-       case LEVEL2_CONTEND_WINDOWS_BRL:
        case LEVEL2_CONTEND_POSIX_BRL:
                DEBUG(10, ("Taking %d write semlock for cmd %d on fd: %d\n",
                           semlock_op, type, fd));