diff options
author | mav <mav@FreeBSD.org> | 2015-02-19 14:36:03 +0000 |
---|---|---|
committer | mav <mav@FreeBSD.org> | 2015-02-19 14:36:03 +0000 |
commit | 8f6eba03a8317fe2f5ae0fabc0a9d9f8c334a6f6 (patch) | |
tree | 894ae1fc1748468436f5f1f954a896aed0add476 /sys/cam/ctl/ctl_backend_block.c | |
parent | 2116079c78d5da438cb804a681902bae1291f6ac (diff) | |
download | FreeBSD-src-8f6eba03a8317fe2f5ae0fabc0a9d9f8c334a6f6.zip FreeBSD-src-8f6eba03a8317fe2f5ae0fabc0a9d9f8c334a6f6.tar.gz |
MFC r278625: Make XCOPY and WUT commands respect physical block size/offset.
This change by 2-3 times improves performance of misaligned XCOPY and WUT
commands by avoiding unneeded read-modify-write cycles inside ZFS.
Diffstat (limited to 'sys/cam/ctl/ctl_backend_block.c')
-rw-r--r-- | sys/cam/ctl/ctl_backend_block.c | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/sys/cam/ctl/ctl_backend_block.c b/sys/cam/ctl/ctl_backend_block.c index 1c126e8..7211681 100644 --- a/sys/cam/ctl/ctl_backend_block.c +++ b/sys/cam/ctl/ctl_backend_block.c @@ -1190,7 +1190,8 @@ ctl_be_block_cw_dispatch_ws(struct ctl_be_block_lun *be_lun, struct ctl_be_block_io *beio; struct ctl_be_block_softc *softc; struct ctl_lba_len_flags *lbalen; - uint64_t len_left, lba, pb, pbo, adj; + uint64_t len_left, lba; + uint32_t pb, pbo, adj; int i, seglen; uint8_t *buf, *end; @@ -1244,8 +1245,11 @@ ctl_be_block_cw_dispatch_ws(struct ctl_be_block_lun *be_lun, DPRINTF("WRITE SAME at LBA %jx len %u\n", (uintmax_t)lbalen->lba, lbalen->len); - pb = (uint64_t)be_lun->blocksize << be_lun->pblockexp; - pbo = pb - (uint64_t)be_lun->blocksize * be_lun->pblockoff; + pb = be_lun->blocksize << be_lun->pblockexp; + if (be_lun->pblockoff > 0) + pbo = pb - be_lun->blocksize * be_lun->pblockoff; + else + pbo = 0; len_left = (uint64_t)lbalen->len * be_lun->blocksize; for (i = 0, lba = 0; i < CTLBLK_MAX_SEGS && len_left > 0; i++) { |