diff --git a/include/sys/zil.h b/include/sys/zil.h index 11c7fb4a28e7..442fee4a1f8f 100644 --- a/include/sys/zil.h +++ b/include/sys/zil.h @@ -395,6 +395,7 @@ typedef struct itx { uint8_t itx_sync; /* synchronous transaction */ zil_callback_t itx_callback; /* Called when the itx is persistent */ void *itx_callback_data; /* User data for the callback */ + size_t itx_size; /* allocated itx structure size */ uint64_t itx_oid; /* object id */ lr_t itx_lr; /* common part of log record */ /* followed by type-specific part of lr_xx_t and its immediate data */ diff --git a/module/zfs/zil.c b/module/zfs/zil.c index d43b2693789d..9f4312a5a28d 100644 --- a/module/zfs/zil.c +++ b/module/zfs/zil.c @@ -1254,17 +1254,20 @@ zil_lwb_commit(zilog_t *zilog, itx_t *itx, lwb_t *lwb) itx_t * zil_itx_create(uint64_t txtype, size_t lrsize) { + size_t itxsize; itx_t *itx; lrsize = P2ROUNDUP_TYPED(lrsize, sizeof (uint64_t), size_t); + itxsize = offsetof(itx_t, itx_lr) + lrsize; - itx = zio_data_buf_alloc(offsetof(itx_t, itx_lr) + lrsize); + itx = zio_data_buf_alloc(itxsize); itx->itx_lr.lrc_txtype = txtype; itx->itx_lr.lrc_reclen = lrsize; itx->itx_lr.lrc_seq = 0; /* defensive */ itx->itx_sync = B_TRUE; /* default is synchronous */ itx->itx_callback = NULL; itx->itx_callback_data = NULL; + itx->itx_size = itxsize; return (itx); } @@ -1272,7 +1275,7 @@ zil_itx_create(uint64_t txtype, size_t lrsize) void zil_itx_destroy(itx_t *itx) { - zio_data_buf_free(itx, offsetof(itx_t, itx_lr)+itx->itx_lr.lrc_reclen); + zio_data_buf_free(itx, itx->itx_size); } /*