nbd: Convert to byte-based interface

The NBD protocol doesn't have any notion of sectors, so it is
a fairly easy conversion to use byte-based read and write.

Signed-off-by: Eric Blake <eblake@redhat.com>
Acked-by: Paolo Bonzini <pbonzini@redhat.com>
Message-id: 1468624988-423-19-git-send-email-eblake@redhat.com
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
Eric Blake 2016-07-15 17:23:07 -06:00 committed by Stefan Hajnoczi
parent 02aefe43cb
commit 70c4fb2648
4 changed files with 27 additions and 24 deletions

View File

@ -218,17 +218,20 @@ static void nbd_coroutine_end(NbdClientSession *s,
} }
} }
int nbd_client_co_readv(BlockDriverState *bs, int64_t sector_num, int nbd_client_co_preadv(BlockDriverState *bs, uint64_t offset,
int nb_sectors, QEMUIOVector *qiov) uint64_t bytes, QEMUIOVector *qiov, int flags)
{ {
NbdClientSession *client = nbd_get_client_session(bs); 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; struct nbd_reply reply;
ssize_t ret; ssize_t ret;
assert(nb_sectors <= NBD_MAX_SECTORS); assert(bytes <= NBD_MAX_BUFFER_SIZE);
request.from = sector_num * 512; assert(!flags);
request.len = nb_sectors * 512;
nbd_coroutine_start(client, &request); nbd_coroutine_start(client, &request);
ret = nbd_co_send_request(bs, &request, NULL); 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); nbd_coroutine_end(client, &request);
return -reply.error; return -reply.error;
} }
int nbd_client_co_writev(BlockDriverState *bs, int64_t sector_num, int nbd_client_co_pwritev(BlockDriverState *bs, uint64_t offset,
int nb_sectors, QEMUIOVector *qiov, int flags) uint64_t bytes, QEMUIOVector *qiov, int flags)
{ {
NbdClientSession *client = nbd_get_client_session(bs); 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; struct nbd_reply reply;
ssize_t ret; ssize_t ret;
@ -255,9 +261,7 @@ int nbd_client_co_writev(BlockDriverState *bs, int64_t sector_num,
request.type |= NBD_CMD_FLAG_FUA; request.type |= NBD_CMD_FLAG_FUA;
} }
assert(nb_sectors <= NBD_MAX_SECTORS); assert(bytes <= NBD_MAX_BUFFER_SIZE);
request.from = sector_num * 512;
request.len = nb_sectors * 512;
nbd_coroutine_start(client, &request); nbd_coroutine_start(client, &request);
ret = nbd_co_send_request(bs, &request, qiov); ret = nbd_co_send_request(bs, &request, qiov);

View File

@ -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_pdiscard(BlockDriverState *bs, int64_t offset, int count);
int nbd_client_co_flush(BlockDriverState *bs); int nbd_client_co_flush(BlockDriverState *bs);
int nbd_client_co_writev(BlockDriverState *bs, int64_t sector_num, int nbd_client_co_pwritev(BlockDriverState *bs, uint64_t offset,
int nb_sectors, QEMUIOVector *qiov, int flags); uint64_t bytes, QEMUIOVector *qiov, int flags);
int nbd_client_co_readv(BlockDriverState *bs, int64_t sector_num, int nbd_client_co_preadv(BlockDriverState *bs, uint64_t offset,
int nb_sectors, QEMUIOVector *qiov); uint64_t bytes, QEMUIOVector *qiov, int flags);
void nbd_client_detach_aio_context(BlockDriverState *bs); void nbd_client_detach_aio_context(BlockDriverState *bs);
void nbd_client_attach_aio_context(BlockDriverState *bs, void nbd_client_attach_aio_context(BlockDriverState *bs,

View File

@ -438,8 +438,8 @@ static BlockDriver bdrv_nbd = {
.instance_size = sizeof(BDRVNBDState), .instance_size = sizeof(BDRVNBDState),
.bdrv_parse_filename = nbd_parse_filename, .bdrv_parse_filename = nbd_parse_filename,
.bdrv_file_open = nbd_open, .bdrv_file_open = nbd_open,
.bdrv_co_readv = nbd_client_co_readv, .bdrv_co_preadv = nbd_client_co_preadv,
.bdrv_co_writev_flags = nbd_client_co_writev, .bdrv_co_pwritev = nbd_client_co_pwritev,
.bdrv_close = nbd_close, .bdrv_close = nbd_close,
.bdrv_co_flush_to_os = nbd_co_flush, .bdrv_co_flush_to_os = nbd_co_flush,
.bdrv_co_pdiscard = nbd_client_co_pdiscard, .bdrv_co_pdiscard = nbd_client_co_pdiscard,
@ -456,8 +456,8 @@ static BlockDriver bdrv_nbd_tcp = {
.instance_size = sizeof(BDRVNBDState), .instance_size = sizeof(BDRVNBDState),
.bdrv_parse_filename = nbd_parse_filename, .bdrv_parse_filename = nbd_parse_filename,
.bdrv_file_open = nbd_open, .bdrv_file_open = nbd_open,
.bdrv_co_readv = nbd_client_co_readv, .bdrv_co_preadv = nbd_client_co_preadv,
.bdrv_co_writev_flags = nbd_client_co_writev, .bdrv_co_pwritev = nbd_client_co_pwritev,
.bdrv_close = nbd_close, .bdrv_close = nbd_close,
.bdrv_co_flush_to_os = nbd_co_flush, .bdrv_co_flush_to_os = nbd_co_flush,
.bdrv_co_pdiscard = nbd_client_co_pdiscard, .bdrv_co_pdiscard = nbd_client_co_pdiscard,
@ -474,8 +474,8 @@ static BlockDriver bdrv_nbd_unix = {
.instance_size = sizeof(BDRVNBDState), .instance_size = sizeof(BDRVNBDState),
.bdrv_parse_filename = nbd_parse_filename, .bdrv_parse_filename = nbd_parse_filename,
.bdrv_file_open = nbd_open, .bdrv_file_open = nbd_open,
.bdrv_co_readv = nbd_client_co_readv, .bdrv_co_preadv = nbd_client_co_preadv,
.bdrv_co_writev_flags = nbd_client_co_writev, .bdrv_co_pwritev = nbd_client_co_pwritev,
.bdrv_close = nbd_close, .bdrv_close = nbd_close,
.bdrv_co_flush_to_os = nbd_co_flush, .bdrv_co_flush_to_os = nbd_co_flush,
.bdrv_co_pdiscard = nbd_client_co_pdiscard, .bdrv_co_pdiscard = nbd_client_co_pdiscard,

View File

@ -77,7 +77,6 @@ enum {
/* Maximum size of a single READ/WRITE data buffer */ /* Maximum size of a single READ/WRITE data buffer */
#define NBD_MAX_BUFFER_SIZE (32 * 1024 * 1024) #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 /* 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 * suggests that servers support up to 4096, but we stick to only the