block/export: Add blk_exp_close_all(_type)
[qemu.git] / include / block / export.h
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 /* 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
50 struct BlockExport {
51 const BlockExportDriver *drv;
52
53 /*
54 * Reference count for this block export. This includes strong references
55 * both from the owner (qemu-nbd or the monitor) and clients connected to
56 * the export.
57 */
58 int refcount;
59
60 /* The AioContext whose lock protects this BlockExport object. */
61 AioContext *ctx;
62
63 /* List entry for block_exports */
64 QLIST_ENTRY(BlockExport) next;
65 };
66
67 BlockExport *blk_exp_add(BlockExportOptions *export, Error **errp);
68 void blk_exp_ref(BlockExport *exp);
69 void blk_exp_unref(BlockExport *exp);
70 void blk_exp_request_shutdown(BlockExport *exp);
71 void blk_exp_close_all(void);
72 void blk_exp_close_all_type(BlockExportType type);
73
74 #endif