raw: support discard on block devices

Block devices use a ioctl instead of fallocate, so add a separate
implementation.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
Paolo Bonzini 2013-01-14 16:26:54 +01:00 committed by Stefan Hajnoczi
parent c85191e5c9
commit fcd9d45552
1 changed files with 36 additions and 0 deletions

View File

@ -1345,6 +1345,40 @@ static BlockDriverAIOCB *hdev_aio_ioctl(BlockDriverState *bs,
return thread_pool_submit_aio(aio_worker, acb, cb, opaque);
}
static coroutine_fn int hdev_co_discard(BlockDriverState *bs,
int64_t sector_num, int nb_sectors)
{
BDRVRawState *s = bs->opaque;
int ret;
if (s->has_discard == 0) {
return 0;
}
ret = fd_open(bs);
if (ret < 0) {
return ret;
}
ret = -EOPNOTSUPP;
#ifdef BLKDISCARD
do {
uint64_t range[2] = { sector_num * 512, (uint64_t)nb_sectors * 512 };
if (ioctl(s->fd, BLKDISCARD, range) == 0) {
return 0;
}
} while (errno == EINTR);
ret = -errno;
#endif
if (ret == -ENODEV || ret == -ENOSYS || ret == -EOPNOTSUPP ||
ret == -ENOTTY) {
s->has_discard = 0;
ret = 0;
}
return ret;
}
#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
static int fd_open(BlockDriverState *bs)
{
@ -1413,6 +1447,8 @@ static BlockDriver bdrv_host_device = {
.create_options = raw_create_options,
.bdrv_has_zero_init = hdev_has_zero_init,
.bdrv_co_discard = hdev_co_discard,
.bdrv_aio_readv = raw_aio_readv,
.bdrv_aio_writev = raw_aio_writev,
.bdrv_aio_flush = raw_aio_flush,