diff options
author | Etienne Dechamps <[email protected]> | 2012-06-06 11:30:24 +0200 |
---|---|---|
committer | Brian Behlendorf <[email protected]> | 2012-06-11 09:43:48 -0700 |
commit | ab85f8455b995741c479f1cdcf21304de87fdaa8 (patch) | |
tree | 0786910a0506e787a841aec4c2e8491107c408ee /module | |
parent | cac1f230e0537ceddead464dbd140e23a0556be6 (diff) |
Honor logbias when writing to ZVOLs.
The logbias option is not taken into account when writing to ZVOLs. We fix
that by using the same logic as in the zfs filesystem write code
(see zfs_log.c).
Signed-off-by: Brian Behlendorf <[email protected]>
Closes #774
Diffstat (limited to 'module')
-rw-r--r-- | module/zfs/zvol.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/module/zfs/zvol.c b/module/zfs/zvol.c index 9b1313402..ba26543f7 100644 --- a/module/zfs/zvol.c +++ b/module/zfs/zvol.c @@ -459,11 +459,15 @@ zvol_log_write(zvol_state_t *zv, dmu_tx_t *tx, uint32_t blocksize = zv->zv_volblocksize; zilog_t *zilog = zv->zv_zilog; boolean_t slogging; + ssize_t immediate_write_sz; if (zil_replaying(zilog, tx)) return; - slogging = spa_has_slogs(zilog->zl_spa); + immediate_write_sz = (zilog->zl_logbias == ZFS_LOGBIAS_THROUGHPUT) + ? 0 : zvol_immediate_write_sz; + slogging = spa_has_slogs(zilog->zl_spa) && + (zilog->zl_logbias == ZFS_LOGBIAS_LATENCY); while (size) { itx_t *itx; @@ -475,7 +479,7 @@ zvol_log_write(zvol_state_t *zv, dmu_tx_t *tx, * Unlike zfs_log_write() we can be called with * up to DMU_MAX_ACCESS/2 (5MB) writes. */ - if (blocksize > zvol_immediate_write_sz && !slogging && + if (blocksize > immediate_write_sz && !slogging && size >= blocksize && offset % blocksize == 0) { write_state = WR_INDIRECT; /* uses dmu_sync */ len = blocksize; |