Whamcloud - gitweb
LU-2224 osd-zfs: Fix osd_commit_async() locking
authorBrian Behlendorf <behlendorf1@llnl.gov>
Thu, 25 Oct 2012 05:45:40 +0000 (22:45 -0700)
committerOleg Drokin <green@whamcloud.com>
Mon, 29 Oct 2012 05:30:17 +0000 (01:30 -0400)
The ZFS osd_commit_async() function never properly acquires the
tx->tx_sync_lock() mutex to protext the tx_state_t.  However,
the mutex is correctly dropped so we just add the obviously
missing mutex_enter().

Change-Id: Iae426feaeb5885034515d6bf0ccb9509ed098bb0
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed-on: http://review.whamcloud.com/4383
Tested-by: Hudson
Reviewed-by: Alex Zhuravlev <bzzz@whamcloud.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Reviewed-by: Prakash Surya <surya1@llnl.gov>
Tested-by: Maloo <whamcloud.maloo@gmail.com>
lustre/osd-zfs/osd_handler.c

index 65d69a7..5a345d6 100644 (file)
@@ -383,6 +383,7 @@ static int osd_commit_async(const struct lu_env *env, struct dt_device *dev)
        tx_state_t        *tx = &dmu_objset_pool(osd->od_objset.os)->dp_tx;
        uint64_t           txg;
 
        tx_state_t        *tx = &dmu_objset_pool(osd->od_objset.os)->dp_tx;
        uint64_t           txg;
 
+       mutex_enter(&tx->tx_sync_lock);
        txg = tx->tx_open_txg + 1;
        if (tx->tx_quiesce_txg_waiting < txg) {
                tx->tx_quiesce_txg_waiting = txg;
        txg = tx->tx_open_txg + 1;
        if (tx->tx_quiesce_txg_waiting < txg) {
                tx->tx_quiesce_txg_waiting = txg;