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 <behlendorf1@llnl.gov>
Closes #774
This commit is contained in:
Etienne Dechamps 2012-06-06 11:30:24 +02:00 committed by Brian Behlendorf
parent cac1f230e0
commit ab85f8455b
1 changed files with 6 additions and 2 deletions

View File

@ -459,11 +459,15 @@ zvol_log_write(zvol_state_t *zv, dmu_tx_t *tx,
uint32_t blocksize = zv->zv_volblocksize; uint32_t blocksize = zv->zv_volblocksize;
zilog_t *zilog = zv->zv_zilog; zilog_t *zilog = zv->zv_zilog;
boolean_t slogging; boolean_t slogging;
ssize_t immediate_write_sz;
if (zil_replaying(zilog, tx)) if (zil_replaying(zilog, tx))
return; 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) { while (size) {
itx_t *itx; 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 * Unlike zfs_log_write() we can be called with
* up to DMU_MAX_ACCESS/2 (5MB) writes. * 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) { size >= blocksize && offset % blocksize == 0) {
write_state = WR_INDIRECT; /* uses dmu_sync */ write_state = WR_INDIRECT; /* uses dmu_sync */
len = blocksize; len = blocksize;