1/* 2 * Declarations for block exports 3 * 4 * Copyright (c) 2012, 2020 Red Hat, Inc. 5 * 6 * Authors: 7 * Paolo Bonzini <pbonzini@redhat.com> 8 * Kevin Wolf <kwolf@redhat.com> 9 * 10 * This work is licensed under the terms of the GNU GPL, version 2 or 11 * later. See the COPYING file in the top-level directory. 12 */ 13 14#ifndef BLOCK_EXPORT_H 15#define BLOCK_EXPORT_H 16 17#include "qapi/qapi-types-block-export.h" 18#include "qemu/queue.h" 19 20typedef struct BlockExport BlockExport; 21 22typedef struct BlockExportDriver { 23 /* The export type that this driver services */ 24 BlockExportType type; 25 26 /* 27 * The size of the driver-specific state that contains BlockExport as its 28 * first field. 29 */ 30 size_t instance_size; 31 32 /* Creates and starts a new block export */ 33 int (*create)(BlockExport *, BlockExportOptions *, Error **); 34 35 /* 36 * Frees a removed block export. This function is only called after all 37 * references have been dropped. 38 */ 39 void (*delete)(BlockExport *); 40 41 /* 42 * Start to disconnect all clients and drop other references held 43 * internally by the export driver. When the function returns, there may 44 * still be active references while the export is in the process of 45 * shutting down. 46 */ 47 void (*request_shutdown)(BlockExport *); 48} BlockExportDriver; 49 50struct BlockExport { 51 const BlockExportDriver *drv; 52 53 /* Unique identifier for the export */ 54 char *id; 55 56 /* 57 * Reference count for this block export. This includes strong references 58 * both from the owner (qemu-nbd or the monitor) and clients connected to 59 * the export. 60 */ 61 int refcount; 62 63 /* 64 * True if one of the references in refcount belongs to the user. After the 65 * user has dropped their reference, they may not e.g. remove the same 66 * export a second time (which would decrease the refcount without having 67 * it incremented first). 68 */ 69 bool user_owned; 70 71 /* The AioContext whose lock protects this BlockExport object. */ 72 AioContext *ctx; 73 74 /* The block device to export */ 75 BlockBackend *blk; 76 77 /* List entry for block_exports */ 78 QLIST_ENTRY(BlockExport) next; 79}; 80 81BlockExport *blk_exp_add(BlockExportOptions *export, Error **errp); 82BlockExport *blk_exp_find(const char *id); 83void blk_exp_ref(BlockExport *exp); 84void blk_exp_unref(BlockExport *exp); 85void blk_exp_request_shutdown(BlockExport *exp); 86void blk_exp_close_all(void); 87void blk_exp_close_all_type(BlockExportType type); 88 89#endif 90