Condition variable usage, zilog->zl_cv_batch
authorBrian Behlendorf <behlendorf1@llnl.gov>
Mon, 15 Oct 2012 20:40:07 +0000 (13:40 -0700)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Mon, 15 Oct 2012 23:01:58 +0000 (16:01 -0700)
The following incorrect usage of cv_signal and cv_broadcast()
was caught by code inspection.  The cv_signal and cv_broadcast()
functions must be called under the associated mutex to preventing
racing with cv_wait().

Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
module/zfs/zil.c

index 292aea2..e76e5ec 100644 (file)
@@ -1560,13 +1560,14 @@ zil_commit(zilog_t *zilog, uint64_t foid)
        zil_commit_writer(zilog);
        zilog->zl_com_batch = mybatch;
        zilog->zl_writer = B_FALSE;
-       mutex_exit(&zilog->zl_lock);
 
        /* wake up one thread to become the next writer */
        cv_signal(&zilog->zl_cv_batch[(mybatch+1) & 1]);
 
        /* wake up all threads waiting for this batch to be committed */
        cv_broadcast(&zilog->zl_cv_batch[mybatch & 1]);
+
+       mutex_exit(&zilog->zl_lock);
 }
 
 /*