xref: /qemu/include/block/export.h (revision f2ec48fefd172a8dd20cb0073087d659aca9578c)
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