/* * Declarations for block exports * * Copyright (c) 2012, 2020 Red Hat, Inc. * * Authors: * Paolo Bonzini * Kevin Wolf * * 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. * * Use atomics to access this field. */ 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