Change os->os_next_write_raw to work per txg
Currently, os_next_write_raw is a single boolean used for determining whether or not the next call to dmu_objset_sync() should write out the objset_phys_t as a raw buffer. Since the boolean is not associated with a txg, the work simply happens during the next txg, which is not necessarily the correct one. In the current implementation this issue was misdiagnosed, resulting in a small hack in dmu_objset_sync() which seemed to resolve the problem. This patch changes os_next_write_raw to be an array of booleans, one for each txg in TXG_OFF and removes the hack. Reviewed-by: Jorgen Lundman <lundman@lundman.net> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed by: Matthew Ahrens <mahrens@delphix.com> Signed-off-by: Tom Caputi <tcaputi@datto.com> Closes #6864
This commit is contained in:
parent
047116ac76
commit
1b66810bad
|
@ -127,7 +127,7 @@ struct objset {
|
||||||
boolean_t os_rescan_dnodes;
|
boolean_t os_rescan_dnodes;
|
||||||
|
|
||||||
/* os_phys_buf should be written raw next txg */
|
/* os_phys_buf should be written raw next txg */
|
||||||
boolean_t os_next_write_raw;
|
boolean_t os_next_write_raw[TXG_SIZE];
|
||||||
|
|
||||||
/* Protected by os_obj_lock */
|
/* Protected by os_obj_lock */
|
||||||
kmutex_t os_obj_lock;
|
kmutex_t os_obj_lock;
|
||||||
|
|
|
@ -2218,6 +2218,7 @@ dmu_buf_will_change_crypt_params(dmu_buf_t *db_fake, dmu_tx_t *tx)
|
||||||
ASSERT3P(dr, !=, NULL);
|
ASSERT3P(dr, !=, NULL);
|
||||||
ASSERT3U(dr->dr_txg, ==, tx->tx_txg);
|
ASSERT3U(dr->dr_txg, ==, tx->tx_txg);
|
||||||
dr->dt.dl.dr_raw = B_TRUE;
|
dr->dt.dl.dr_raw = B_TRUE;
|
||||||
|
db->db_objset->os_next_write_raw[tx->tx_txg & TXG_MASK] = B_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
#pragma weak dmu_buf_fill_done = dbuf_fill_done
|
#pragma weak dmu_buf_fill_done = dbuf_fill_done
|
||||||
|
|
|
@ -1508,9 +1508,9 @@ dmu_objset_sync(objset_t *os, zio_t *pio, dmu_tx_t *tx)
|
||||||
* the os_phys_buf raw. Neither of these actions will effect the MAC
|
* the os_phys_buf raw. Neither of these actions will effect the MAC
|
||||||
* at this point.
|
* at this point.
|
||||||
*/
|
*/
|
||||||
if (arc_is_unauthenticated(os->os_phys_buf) || os->os_next_write_raw) {
|
if (os->os_next_write_raw[tx->tx_txg & TXG_MASK]) {
|
||||||
ASSERT(os->os_encrypted);
|
ASSERT(os->os_encrypted);
|
||||||
os->os_next_write_raw = B_FALSE;
|
os->os_next_write_raw[tx->tx_txg & TXG_MASK] = B_FALSE;
|
||||||
arc_convert_to_raw(os->os_phys_buf,
|
arc_convert_to_raw(os->os_phys_buf,
|
||||||
os->os_dsl_dataset->ds_object, ZFS_HOST_BYTEORDER,
|
os->os_dsl_dataset->ds_object, ZFS_HOST_BYTEORDER,
|
||||||
DMU_OT_OBJSET, NULL, NULL, NULL);
|
DMU_OT_OBJSET, NULL, NULL, NULL);
|
||||||
|
|
|
@ -2177,7 +2177,7 @@ dsl_crypto_recv_key_sync(void *arg, dmu_tx_t *tx)
|
||||||
arc_release(os->os_phys_buf, &os->os_phys_buf);
|
arc_release(os->os_phys_buf, &os->os_phys_buf);
|
||||||
bcopy(portable_mac, os->os_phys->os_portable_mac, ZIO_OBJSET_MAC_LEN);
|
bcopy(portable_mac, os->os_phys->os_portable_mac, ZIO_OBJSET_MAC_LEN);
|
||||||
bzero(os->os_phys->os_local_mac, ZIO_OBJSET_MAC_LEN);
|
bzero(os->os_phys->os_local_mac, ZIO_OBJSET_MAC_LEN);
|
||||||
os->os_next_write_raw = B_TRUE;
|
os->os_next_write_raw[tx->tx_txg & TXG_MASK] = B_TRUE;
|
||||||
|
|
||||||
/* set metadnode compression and checksum */
|
/* set metadnode compression and checksum */
|
||||||
mdn->dn_compress = compress;
|
mdn->dn_compress = compress;
|
||||||
|
|
|
@ -941,7 +941,7 @@ dsl_dataset_zero_zil(dsl_dataset_t *ds, dmu_tx_t *tx)
|
||||||
|
|
||||||
bzero(&os->os_zil_header, sizeof (os->os_zil_header));
|
bzero(&os->os_zil_header, sizeof (os->os_zil_header));
|
||||||
if (os->os_encrypted)
|
if (os->os_encrypted)
|
||||||
os->os_next_write_raw = B_TRUE;
|
os->os_next_write_raw[tx->tx_txg & TXG_MASK] = B_TRUE;
|
||||||
|
|
||||||
zio = zio_root(dp->dp_spa, NULL, NULL, ZIO_FLAG_MUSTSUCCEED);
|
zio = zio_root(dp->dp_spa, NULL, NULL, ZIO_FLAG_MUSTSUCCEED);
|
||||||
dsl_dataset_sync(ds, zio, tx);
|
dsl_dataset_sync(ds, zio, tx);
|
||||||
|
|
|
@ -796,7 +796,7 @@ zil_claim(dsl_pool_t *dp, dsl_dataset_t *ds, void *txarg)
|
||||||
zio_free_zil(zilog->zl_spa, first_txg, &zh->zh_log);
|
zio_free_zil(zilog->zl_spa, first_txg, &zh->zh_log);
|
||||||
BP_ZERO(&zh->zh_log);
|
BP_ZERO(&zh->zh_log);
|
||||||
if (os->os_encrypted)
|
if (os->os_encrypted)
|
||||||
os->os_next_write_raw = B_TRUE;
|
os->os_next_write_raw[tx->tx_txg & TXG_MASK] = B_TRUE;
|
||||||
dsl_dataset_dirty(dmu_objset_ds(os), tx);
|
dsl_dataset_dirty(dmu_objset_ds(os), tx);
|
||||||
dmu_objset_disown(os, B_FALSE, FTAG);
|
dmu_objset_disown(os, B_FALSE, FTAG);
|
||||||
return (0);
|
return (0);
|
||||||
|
@ -820,7 +820,7 @@ zil_claim(dsl_pool_t *dp, dsl_dataset_t *ds, void *txarg)
|
||||||
zh->zh_flags |= ZIL_REPLAY_NEEDED;
|
zh->zh_flags |= ZIL_REPLAY_NEEDED;
|
||||||
zh->zh_flags |= ZIL_CLAIM_LR_SEQ_VALID;
|
zh->zh_flags |= ZIL_CLAIM_LR_SEQ_VALID;
|
||||||
if (os->os_encrypted)
|
if (os->os_encrypted)
|
||||||
os->os_next_write_raw = B_TRUE;
|
os->os_next_write_raw[tx->tx_txg & TXG_MASK] = B_TRUE;
|
||||||
dsl_dataset_dirty(dmu_objset_ds(os), tx);
|
dsl_dataset_dirty(dmu_objset_ds(os), tx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue