mirror of
https://github.com/mii443/qemu.git
synced 2025-12-16 17:18:49 +00:00
nbd: Create struct for tracking export info
The NBD Protocol is introducing some additional information about exports, such as minimum request size and alignment, as well as an advertised maximum request size. It will be easier to feed this information back to the block layer if we gather all the information into a struct, rather than adding yet more pointer parameters during negotiation. Signed-off-by: Eric Blake <eblake@redhat.com> Message-Id: <20170707203049.534-2-eblake@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
committed by
Paolo Bonzini
parent
1221a47467
commit
004a89fce9
44
nbd/client.c
44
nbd/client.c
@@ -425,13 +425,13 @@ static QIOChannel *nbd_receive_starttls(QIOChannel *ioc,
|
||||
}
|
||||
|
||||
|
||||
int nbd_receive_negotiate(QIOChannel *ioc, const char *name, uint16_t *flags,
|
||||
int nbd_receive_negotiate(QIOChannel *ioc, const char *name,
|
||||
QCryptoTLSCreds *tlscreds, const char *hostname,
|
||||
QIOChannel **outioc,
|
||||
off_t *size, Error **errp)
|
||||
QIOChannel **outioc, NBDExportInfo *info,
|
||||
Error **errp)
|
||||
{
|
||||
char buf[256];
|
||||
uint64_t magic, s;
|
||||
uint64_t magic;
|
||||
int rc;
|
||||
bool zeroes = true;
|
||||
|
||||
@@ -532,17 +532,17 @@ int nbd_receive_negotiate(QIOChannel *ioc, const char *name, uint16_t *flags,
|
||||
}
|
||||
|
||||
/* Read the response */
|
||||
if (nbd_read(ioc, &s, sizeof(s), errp) < 0) {
|
||||
if (nbd_read(ioc, &info->size, sizeof(info->size), errp) < 0) {
|
||||
error_prepend(errp, "Failed to read export length");
|
||||
goto fail;
|
||||
}
|
||||
*size = be64_to_cpu(s);
|
||||
be64_to_cpus(&info->size);
|
||||
|
||||
if (nbd_read(ioc, flags, sizeof(*flags), errp) < 0) {
|
||||
if (nbd_read(ioc, &info->flags, sizeof(info->flags), errp) < 0) {
|
||||
error_prepend(errp, "Failed to read export flags");
|
||||
goto fail;
|
||||
}
|
||||
be16_to_cpus(flags);
|
||||
be16_to_cpus(&info->flags);
|
||||
} else if (magic == NBD_CLIENT_MAGIC) {
|
||||
uint32_t oldflags;
|
||||
|
||||
@@ -555,11 +555,11 @@ int nbd_receive_negotiate(QIOChannel *ioc, const char *name, uint16_t *flags,
|
||||
goto fail;
|
||||
}
|
||||
|
||||
if (nbd_read(ioc, &s, sizeof(s), errp) < 0) {
|
||||
if (nbd_read(ioc, &info->size, sizeof(info->size), errp) < 0) {
|
||||
error_prepend(errp, "Failed to read export length");
|
||||
goto fail;
|
||||
}
|
||||
*size = be64_to_cpu(s);
|
||||
be64_to_cpus(&info->size);
|
||||
|
||||
if (nbd_read(ioc, &oldflags, sizeof(oldflags), errp) < 0) {
|
||||
error_prepend(errp, "Failed to read export flags");
|
||||
@@ -570,13 +570,13 @@ int nbd_receive_negotiate(QIOChannel *ioc, const char *name, uint16_t *flags,
|
||||
error_setg(errp, "Unexpected export flags %0x" PRIx32, oldflags);
|
||||
goto fail;
|
||||
}
|
||||
*flags = oldflags;
|
||||
info->flags = oldflags;
|
||||
} else {
|
||||
error_setg(errp, "Bad magic received");
|
||||
goto fail;
|
||||
}
|
||||
|
||||
trace_nbd_receive_negotiate_size_flags(*size, *flags);
|
||||
trace_nbd_receive_negotiate_size_flags(info->size, info->flags);
|
||||
if (zeroes && nbd_drop(ioc, 124, errp) < 0) {
|
||||
error_prepend(errp, "Failed to read reserved block");
|
||||
goto fail;
|
||||
@@ -588,13 +588,13 @@ fail:
|
||||
}
|
||||
|
||||
#ifdef __linux__
|
||||
int nbd_init(int fd, QIOChannelSocket *sioc, uint16_t flags, off_t size,
|
||||
int nbd_init(int fd, QIOChannelSocket *sioc, NBDExportInfo *info,
|
||||
Error **errp)
|
||||
{
|
||||
unsigned long sectors = size / BDRV_SECTOR_SIZE;
|
||||
if (size / BDRV_SECTOR_SIZE != sectors) {
|
||||
error_setg(errp, "Export size %lld too large for 32-bit kernel",
|
||||
(long long) size);
|
||||
unsigned long sectors = info->size / BDRV_SECTOR_SIZE;
|
||||
if (info->size / BDRV_SECTOR_SIZE != sectors) {
|
||||
error_setg(errp, "Export size %" PRIu64 " too large for 32-bit kernel",
|
||||
info->size);
|
||||
return -E2BIG;
|
||||
}
|
||||
|
||||
@@ -615,8 +615,8 @@ int nbd_init(int fd, QIOChannelSocket *sioc, uint16_t flags, off_t size,
|
||||
}
|
||||
|
||||
trace_nbd_init_set_size(sectors);
|
||||
if (size % BDRV_SECTOR_SIZE) {
|
||||
trace_nbd_init_trailing_bytes(size % BDRV_SECTOR_SIZE);
|
||||
if (info->size % BDRV_SECTOR_SIZE) {
|
||||
trace_nbd_init_trailing_bytes(info->size % BDRV_SECTOR_SIZE);
|
||||
}
|
||||
|
||||
if (ioctl(fd, NBD_SET_SIZE_BLOCKS, sectors) < 0) {
|
||||
@@ -625,9 +625,9 @@ int nbd_init(int fd, QIOChannelSocket *sioc, uint16_t flags, off_t size,
|
||||
return -serrno;
|
||||
}
|
||||
|
||||
if (ioctl(fd, NBD_SET_FLAGS, (unsigned long) flags) < 0) {
|
||||
if (ioctl(fd, NBD_SET_FLAGS, (unsigned long) info->flags) < 0) {
|
||||
if (errno == ENOTTY) {
|
||||
int read_only = (flags & NBD_FLAG_READ_ONLY) != 0;
|
||||
int read_only = (info->flags & NBD_FLAG_READ_ONLY) != 0;
|
||||
trace_nbd_init_set_readonly();
|
||||
|
||||
if (ioctl(fd, BLKROSET, (unsigned long) &read_only) < 0) {
|
||||
@@ -685,7 +685,7 @@ int nbd_disconnect(int fd)
|
||||
}
|
||||
|
||||
#else
|
||||
int nbd_init(int fd, QIOChannelSocket *ioc, uint16_t flags, off_t size,
|
||||
int nbd_init(int fd, QIOChannelSocket *ioc, NBDExportInfo *info,
|
||||
Error **errp)
|
||||
{
|
||||
error_setg(errp, "nbd_init is only supported on Linux");
|
||||
|
||||
Reference in New Issue
Block a user