diff options
Diffstat (limited to 'include')
| -rw-r--r-- | include/block/export.h | 89 | ||||
| -rw-r--r-- | include/block/nbd.h | 22 |
2 files changed, 97 insertions, 14 deletions
diff --git a/include/block/export.h b/include/block/export.h new file mode 100644 index 0000000000..7feb02e10d --- /dev/null +++ b/include/block/export.h @@ -0,0 +1,89 @@ +/* + * Declarations for block exports + * + * Copyright (c) 2012, 2020 Red Hat, Inc. + * + * Authors: + * Paolo Bonzini <pbonzini@redhat.com> + * Kevin Wolf <kwolf@redhat.com> + * + * This work is licensed under the terms of the GNU GPL, version 2 or + * later. See the COPYING file in the top-level directory. + */ + +#ifndef BLOCK_EXPORT_H +#define BLOCK_EXPORT_H + +#include "qapi/qapi-types-block-export.h" +#include "qemu/queue.h" + +typedef struct BlockExport BlockExport; + +typedef struct BlockExportDriver { + /* The export type that this driver services */ + BlockExportType type; + + /* + * The size of the driver-specific state that contains BlockExport as its + * first field. + */ + size_t instance_size; + + /* Creates and starts a new block export */ + int (*create)(BlockExport *, BlockExportOptions *, Error **); + + /* + * Frees a removed block export. This function is only called after all + * references have been dropped. + */ + void (*delete)(BlockExport *); + + /* + * Start to disconnect all clients and drop other references held + * internally by the export driver. When the function returns, there may + * still be active references while the export is in the process of + * shutting down. + */ + void (*request_shutdown)(BlockExport *); +} BlockExportDriver; + +struct BlockExport { + const BlockExportDriver *drv; + + /* Unique identifier for the export */ + char *id; + + /* + * Reference count for this block export. This includes strong references + * both from the owner (qemu-nbd or the monitor) and clients connected to + * the export. + */ + int refcount; + + /* + * True if one of the references in refcount belongs to the user. After the + * user has dropped their reference, they may not e.g. remove the same + * export a second time (which would decrease the refcount without having + * it incremented first). + */ + bool user_owned; + + /* The AioContext whose lock protects this BlockExport object. */ + AioContext *ctx; + + /* The block device to export */ + BlockBackend *blk; + + /* List entry for block_exports */ + QLIST_ENTRY(BlockExport) next; +}; + +BlockExport *blk_exp_add(BlockExportOptions *export, Error **errp); +BlockExport *blk_exp_find(const char *id); +void blk_exp_ref(BlockExport *exp); +void blk_exp_unref(BlockExport *exp); +void blk_exp_request_shutdown(BlockExport *exp); +void blk_exp_close_all(void); +void blk_exp_close_all_type(BlockExportType type); + +#endif diff --git a/include/block/nbd.h b/include/block/nbd.h index 9bc3bfaeec..3dd9a04546 100644 --- a/include/block/nbd.h +++ b/include/block/nbd.h @@ -20,11 +20,13 @@ #ifndef NBD_H #define NBD_H -#include "qapi/qapi-types-block.h" +#include "block/export.h" #include "io/channel-socket.h" #include "crypto/tlscreds.h" #include "qapi/error.h" +extern const BlockExportDriver blk_exp_nbd; + /* Handshake phase structs - this struct is passed on the wire */ struct NBDOption { @@ -328,21 +330,10 @@ int nbd_errno_to_system_errno(int err); typedef struct NBDExport NBDExport; typedef struct NBDClient NBDClient; -NBDExport *nbd_export_new(BlockDriverState *bs, uint64_t dev_offset, - uint64_t size, const char *name, const char *desc, - const char *bitmap, bool readonly, bool shared, - void (*close)(NBDExport *), bool writethrough, - BlockBackend *on_eject_blk, Error **errp); -void nbd_export_close(NBDExport *exp); -void nbd_export_remove(NBDExport *exp, NbdServerRemoveMode mode, Error **errp); -void nbd_export_get(NBDExport *exp); -void nbd_export_put(NBDExport *exp); - -BlockBackend *nbd_export_get_blockdev(NBDExport *exp); +void nbd_export_set_on_eject_blk(BlockExport *exp, BlockBackend *blk); AioContext *nbd_export_aio_context(NBDExport *exp); NBDExport *nbd_export_find(const char *name); -void nbd_export_close_all(void); void nbd_client_new(QIOChannelSocket *sioc, QCryptoTLSCreds *tlscreds, @@ -351,8 +342,11 @@ void nbd_client_new(QIOChannelSocket *sioc, void nbd_client_get(NBDClient *client); void nbd_client_put(NBDClient *client); +void nbd_server_is_qemu_nbd(bool value); +bool nbd_server_is_running(void); void nbd_server_start(SocketAddress *addr, const char *tls_creds, - const char *tls_authz, Error **errp); + const char *tls_authz, uint32_t max_connections, + Error **errp); void nbd_server_start_options(NbdServerOptions *arg, Error **errp); /* nbd_read |