qemu/block
Eric Blake b8d0a9804d block: Cater to iscsi with non-power-of-2 discard
Dell Equallogic iSCSI SANs have a very unusual advertised geometry:

$ iscsi-inq -e 1 -c $((0xb0)) iscsi://XXX/0
wsnz:0
maximum compare and write length:1
optimal transfer length granularity:0
maximum transfer length:0
optimal transfer length:0
maximum prefetch xdread xdwrite transfer length:0
maximum unmap lba count:30720
maximum unmap block descriptor count:2
optimal unmap granularity:30720
ugavalid:1
unmap granularity alignment:0
maximum write same length:30720

which says that both the maximum and the optimal discard size
is 15M.  It is not immediately apparent if the device allows
discard requests not aligned to the optimal size, nor if it
allows discards at a finer granularity than the optimal size.

I tried to find details in the SCSI Commands Reference Manual
Rev. A on what valid values of maximum and optimal sizes are
permitted, but while that document mentions a "Block Limits
VPD Page", I couldn't actually find documentation of that page
or what values it would have, or if a SCSI device has an
advertisement of its minimal unmap granularity.  So it is not
obvious to me whether the Dell Equallogic device is compliance
with the SCSI specification.

Fortunately, it is easy enough to support non-power-of-2 sizing,
even if it means we are less efficient than truly possible when
targetting that device (for example, it means that we refuse to
unmap anything that is not a multiple of 15M and aligned to a
15M boundary, even if the device truly does support a smaller
granularity where unmapping actually works).

Reported-by: Peter Lieven <pl@kamp.de>
Signed-off-by: Eric Blake <eblake@redhat.com>
Message-Id: <1469129688-22848-5-git-send-email-eblake@redhat.com>
Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2016-08-03 18:44:57 +02:00
..
accounting.c
archipelago.c
backup.c coroutine: move entry argument to qemu_coroutine_create 2016-07-13 13:26:02 +02:00
blkdebug.c coroutine: move entry argument to qemu_coroutine_create 2016-07-13 13:26:02 +02:00
blkreplay.c blkreplay: Switch .bdrv_co_discard() to byte-based 2016-07-20 14:11:55 +01:00
blkverify.c
block-backend.c block: Convert BB interface to byte-based discards 2016-07-20 14:11:55 +01:00
bochs.c block: Convert bdrv_co_preadv/pwritev to BdrvChild 2016-07-05 16:46:27 +02:00
cloop.c block: Convert bdrv_pread(v) to BdrvChild 2016-07-05 16:46:27 +02:00
commit.c Improve block job rate limiting for small bandwidth values 2016-07-13 13:41:38 +02:00
crypto.c block: export LUKS specific data to qemu-img info 2016-07-26 17:46:37 +02:00
curl.c
dirty-bitmap.c dirty-bitmap: operate with int64_t amount 2016-07-19 16:54:46 -04:00
dmg.c block: Convert bdrv_pread(v) to BdrvChild 2016-07-05 16:46:27 +02:00
gluster.c Pull request 2016-07-21 11:00:36 +01:00
io.c block: Cater to iscsi with non-power-of-2 discard 2016-08-03 18:44:57 +02:00
iscsi.c iscsi: Switch .bdrv_co_discard() to byte-based 2016-07-20 14:24:25 +01:00
linux-aio.c linux-aio: prevent submitting more than MAX_EVENTS 2016-07-18 15:10:52 +01:00
Makefile.objs
mirror.c mirror: double performance of the bulk stage if the disc is full 2016-07-26 16:23:36 -04:00
nbd-client.c nbd: Convert to byte-based interface 2016-07-20 14:24:25 +01:00
nbd-client.h nbd: Limit nbdflags to 16 bits 2016-08-03 18:44:56 +02:00
nbd.c nbd: Convert to byte-based interface 2016-07-20 14:24:25 +01:00
nfs.c coroutine: move entry argument to qemu_coroutine_create 2016-07-13 13:26:02 +02:00
null.c
parallels.c block: Convert bdrv_pwrite_zeroes() to BdrvChild 2016-07-05 16:46:27 +02:00
qapi.c qapi: Add new visit_complete() function 2016-07-06 10:52:04 +02:00
qcow2-cache.c block: Convert bdrv_pwrite(v/_sync) to BdrvChild 2016-07-05 16:46:27 +02:00
qcow2-cluster.c qcow2: Fix qcow2_get_cluster_offset() 2016-07-13 13:41:38 +02:00
qcow2-refcount.c block: Convert bdrv_discard() to byte-based 2016-07-20 14:11:55 +01:00
qcow2-snapshot.c block: Convert bdrv_pwrite(v/_sync) to BdrvChild 2016-07-05 16:46:27 +02:00
qcow2.c qcow2: do not allocate extra memory 2016-07-26 17:46:37 +02:00
qcow2.h
qcow.c qcow2: do not allocate extra memory 2016-07-26 17:46:37 +02:00
qed-check.c
qed-cluster.c
qed-gencb.c
qed-l2-cache.c
qed-table.c
qed.c coroutine: move entry argument to qemu_coroutine_create 2016-07-13 13:26:02 +02:00
qed.h
quorum.c
raw_bsd.c raw_bsd: Convert to byte-based interface 2016-07-20 14:24:25 +01:00
raw-posix.c block: Convert .bdrv_aio_discard() to byte-based 2016-07-20 14:11:55 +01:00
raw-win32.c raw-posix: Switch paio_submit() to byte-based 2016-07-20 14:11:55 +01:00
rbd.c block: Convert .bdrv_aio_discard() to byte-based 2016-07-20 14:11:55 +01:00
sheepdog.c sheepdog: Switch .bdrv_co_discard() to byte-based 2016-07-20 14:24:25 +01:00
snapshot.c
ssh.c coroutine: move entry argument to qemu_coroutine_create 2016-07-13 13:26:02 +02:00
stream.c Improve block job rate limiting for small bandwidth values 2016-07-13 13:41:38 +02:00
throttle-groups.c
trace-events raw-posix: Switch paio_submit() to byte-based 2016-07-20 14:11:55 +01:00
vdi.c block: Convert bdrv_co_preadv/pwritev to BdrvChild 2016-07-05 16:46:27 +02:00
vhdx-endian.c
vhdx-log.c block: Convert bdrv_pwrite(v/_sync) to BdrvChild 2016-07-05 16:46:27 +02:00
vhdx.c block: Convert bdrv_pwrite(v/_sync) to BdrvChild 2016-07-05 16:46:27 +02:00
vhdx.h
vmdk.c vmdk: fix metadata write regression 2016-07-13 13:41:39 +02:00
vpc.c block: Convert bdrv_co_preadv/pwritev to BdrvChild 2016-07-05 16:46:27 +02:00
vvfat.c vvfat: Fix qcow write target driver specification 2016-07-13 13:41:39 +02:00
win32-aio.c linux-aio: share one LinuxAioState within an AioContext 2016-07-18 15:09:31 +01:00
write-threshold.c