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 20 typedef struct BlockExport BlockExport; 21 22 typedef 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 /* True if the export type supports running on an inactive node */ 33 bool supports_inactive; 34 35 /* Creates and starts a new block export */ 36 int (*create)(BlockExport *, BlockExportOptions *, Error **); 37 38 /* 39 * Frees a removed block export. This function is only called after all 40 * references have been dropped. 41 */ 42 void (*delete)(BlockExport *); 43 44 /* 45 * Start to disconnect all clients and drop other references held 46 * internally by the export driver. When the function returns, there may 47 * still be active references while the export is in the process of 48 * shutting down. 49 */ 50 void (*request_shutdown)(BlockExport *); 51 } BlockExportDriver; 52 53 struct BlockExport { 54 const BlockExportDriver *drv; 55 56 /* Unique identifier for the export */ 57 char *id; 58 59 /* 60 * Reference count for this block export. This includes strong references 61 * both from the owner (qemu-nbd or the monitor) and clients connected to 62 * the export. 63 * 64 * Use atomics to access this field. 65 */ 66 int refcount; 67 68 /* 69 * True if one of the references in refcount belongs to the user. After the 70 * user has dropped their reference, they may not e.g. remove the same 71 * export a second time (which would decrease the refcount without having 72 * it incremented first). 73 */ 74 bool user_owned; 75 76 /* The AioContext whose lock protects this BlockExport object. */ 77 AioContext *ctx; 78 79 /* The block device to export */ 80 BlockBackend *blk; 81 82 /* List entry for block_exports */ 83 QLIST_ENTRY(BlockExport) next; 84 }; 85 86 BlockExport *blk_exp_add(BlockExportOptions *export, Error **errp); 87 BlockExport *blk_exp_find(const char *id); 88 void blk_exp_ref(BlockExport *exp); 89 void blk_exp_unref(BlockExport *exp); 90 void blk_exp_request_shutdown(BlockExport *exp); 91 void blk_exp_close_all(void); 92 void blk_exp_close_all_type(BlockExportType type); 93 94 #endif 95