[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH 1/2] nbd: Convert to byte-based interface
From: |
Paolo Bonzini |
Subject: |
Re: [Qemu-devel] [PATCH 1/2] nbd: Convert to byte-based interface |
Date: |
Mon, 27 Jun 2016 14:19:25 +0200 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.1.1 |
On 24/06/2016 05:58, Eric Blake wrote:
> The NBD protocol doesn't have any notion of sectors, so it is
> a fairly easy convertion to use byte-based read and write.
>
> Signed-off-by: Eric Blake <address@hidden>
> ---
> block/nbd-client.h | 8 ++++----
> include/block/nbd.h | 1 -
> block/nbd-client.c | 30 +++++++++++++++++-------------
> block/nbd.c | 12 ++++++------
> 4 files changed, 27 insertions(+), 24 deletions(-)
>
> diff --git a/block/nbd-client.h b/block/nbd-client.h
> index 62dec33..fa9817b 100644
> --- a/block/nbd-client.h
> +++ b/block/nbd-client.h
> @@ -46,10 +46,10 @@ void nbd_client_close(BlockDriverState *bs);
>
> int nbd_client_co_pdiscard(BlockDriverState *bs, int64_t offset, int count);
> int nbd_client_co_flush(BlockDriverState *bs);
> -int nbd_client_co_writev(BlockDriverState *bs, int64_t sector_num,
> - int nb_sectors, QEMUIOVector *qiov, int flags);
> -int nbd_client_co_readv(BlockDriverState *bs, int64_t sector_num,
> - int nb_sectors, QEMUIOVector *qiov);
> +int nbd_client_co_pwritev(BlockDriverState *bs, uint64_t offset,
> + uint64_t bytes, QEMUIOVector *qiov, int flags);
> +int nbd_client_co_preadv(BlockDriverState *bs, uint64_t offset,
> + uint64_t bytes, QEMUIOVector *qiov, int flags);
>
> void nbd_client_detach_aio_context(BlockDriverState *bs);
> void nbd_client_attach_aio_context(BlockDriverState *bs,
> diff --git a/include/block/nbd.h b/include/block/nbd.h
> index 503f514..cb91820 100644
> --- a/include/block/nbd.h
> +++ b/include/block/nbd.h
> @@ -77,7 +77,6 @@ enum {
>
> /* Maximum size of a single READ/WRITE data buffer */
> #define NBD_MAX_BUFFER_SIZE (32 * 1024 * 1024)
> -#define NBD_MAX_SECTORS (NBD_MAX_BUFFER_SIZE / BDRV_SECTOR_SIZE)
>
> /* Maximum size of an export name. The NBD spec requires 256 and
> * suggests that servers support up to 4096, but we stick to only the
> diff --git a/block/nbd-client.c b/block/nbd-client.c
> index 070bb9d..647dedd 100644
> --- a/block/nbd-client.c
> +++ b/block/nbd-client.c
> @@ -218,17 +218,20 @@ static void nbd_coroutine_end(NbdClientSession *s,
> }
> }
>
> -int nbd_client_co_readv(BlockDriverState *bs, int64_t sector_num,
> - int nb_sectors, QEMUIOVector *qiov)
> +int nbd_client_co_preadv(BlockDriverState *bs, uint64_t offset,
> + uint64_t bytes, QEMUIOVector *qiov, int flags)
> {
> NbdClientSession *client = nbd_get_client_session(bs);
> - struct nbd_request request = { .type = NBD_CMD_READ };
> + struct nbd_request request = {
> + .type = NBD_CMD_READ,
> + .from = offset,
> + .len = bytes,
> + };
> struct nbd_reply reply;
> ssize_t ret;
>
> - assert(nb_sectors <= NBD_MAX_SECTORS);
> - request.from = sector_num * 512;
> - request.len = nb_sectors * 512;
> + assert(bytes <= NBD_MAX_BUFFER_SIZE);
> + assert(!flags);
>
> nbd_coroutine_start(client, &request);
> ret = nbd_co_send_request(bs, &request, NULL);
> @@ -239,14 +242,17 @@ int nbd_client_co_readv(BlockDriverState *bs, int64_t
> sector_num,
> }
> nbd_coroutine_end(client, &request);
> return -reply.error;
> -
> }
>
> -int nbd_client_co_writev(BlockDriverState *bs, int64_t sector_num,
> - int nb_sectors, QEMUIOVector *qiov, int flags)
> +int nbd_client_co_pwritev(BlockDriverState *bs, uint64_t offset,
> + uint64_t bytes, QEMUIOVector *qiov, int flags)
> {
> NbdClientSession *client = nbd_get_client_session(bs);
> - struct nbd_request request = { .type = NBD_CMD_WRITE };
> + struct nbd_request request = {
> + .type = NBD_CMD_WRITE,
> + .from = offset,
> + .len = bytes,
> + };
> struct nbd_reply reply;
> ssize_t ret;
>
> @@ -255,9 +261,7 @@ int nbd_client_co_writev(BlockDriverState *bs, int64_t
> sector_num,
> request.type |= NBD_CMD_FLAG_FUA;
> }
>
> - assert(nb_sectors <= NBD_MAX_SECTORS);
> - request.from = sector_num * 512;
> - request.len = nb_sectors * 512;
> + assert(bytes <= NBD_MAX_BUFFER_SIZE);
>
> nbd_coroutine_start(client, &request);
> ret = nbd_co_send_request(bs, &request, qiov);
> diff --git a/block/nbd.c b/block/nbd.c
> index 42cae0e..8d57220 100644
> --- a/block/nbd.c
> +++ b/block/nbd.c
> @@ -438,8 +438,8 @@ static BlockDriver bdrv_nbd = {
> .instance_size = sizeof(BDRVNBDState),
> .bdrv_parse_filename = nbd_parse_filename,
> .bdrv_file_open = nbd_open,
> - .bdrv_co_readv = nbd_client_co_readv,
> - .bdrv_co_writev_flags = nbd_client_co_writev,
> + .bdrv_co_preadv = nbd_client_co_preadv,
> + .bdrv_co_pwritev = nbd_client_co_pwritev,
> .bdrv_close = nbd_close,
> .bdrv_co_flush_to_os = nbd_co_flush,
> .bdrv_co_pdiscard = nbd_client_co_pdiscard,
> @@ -456,8 +456,8 @@ static BlockDriver bdrv_nbd_tcp = {
> .instance_size = sizeof(BDRVNBDState),
> .bdrv_parse_filename = nbd_parse_filename,
> .bdrv_file_open = nbd_open,
> - .bdrv_co_readv = nbd_client_co_readv,
> - .bdrv_co_writev_flags = nbd_client_co_writev,
> + .bdrv_co_preadv = nbd_client_co_preadv,
> + .bdrv_co_pwritev = nbd_client_co_pwritev,
> .bdrv_close = nbd_close,
> .bdrv_co_flush_to_os = nbd_co_flush,
> .bdrv_co_pdiscard = nbd_client_co_pdiscard,
> @@ -474,8 +474,8 @@ static BlockDriver bdrv_nbd_unix = {
> .instance_size = sizeof(BDRVNBDState),
> .bdrv_parse_filename = nbd_parse_filename,
> .bdrv_file_open = nbd_open,
> - .bdrv_co_readv = nbd_client_co_readv,
> - .bdrv_co_writev_flags = nbd_client_co_writev,
> + .bdrv_co_preadv = nbd_client_co_preadv,
> + .bdrv_co_pwritev = nbd_client_co_pwritev,
> .bdrv_close = nbd_close,
> .bdrv_co_flush_to_os = nbd_co_flush,
> .bdrv_co_pdiscard = nbd_client_co_pdiscard,
>
Acked-by: Paolo Bonzini <address@hidden>