bellard | ea2384d | 2004-08-01 21:59:26 +0000 | [diff] [blame] | 1 | /* |
| 2 | * QEMU System Emulator block driver |
ths | 5fafdf2 | 2007-09-16 21:08:06 +0000 | [diff] [blame] | 3 | * |
bellard | ea2384d | 2004-08-01 21:59:26 +0000 | [diff] [blame] | 4 | * Copyright (c) 2003 Fabrice Bellard |
ths | 5fafdf2 | 2007-09-16 21:08:06 +0000 | [diff] [blame] | 5 | * |
bellard | ea2384d | 2004-08-01 21:59:26 +0000 | [diff] [blame] | 6 | * Permission is hereby granted, free of charge, to any person obtaining a copy |
| 7 | * of this software and associated documentation files (the "Software"), to deal |
| 8 | * in the Software without restriction, including without limitation the rights |
| 9 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
| 10 | * copies of the Software, and to permit persons to whom the Software is |
| 11 | * furnished to do so, subject to the following conditions: |
| 12 | * |
| 13 | * The above copyright notice and this permission notice shall be included in |
| 14 | * all copies or substantial portions of the Software. |
| 15 | * |
| 16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
| 17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
| 18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
| 19 | * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
| 20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
| 21 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
| 22 | * THE SOFTWARE. |
| 23 | */ |
| 24 | #ifndef BLOCK_INT_H |
| 25 | #define BLOCK_INT_H |
| 26 | |
Benoît Canet | 5e5a94b | 2014-09-05 15:46:16 +0200 | [diff] [blame] | 27 | #include "block/accounting.h" |
Paolo Bonzini | 737e150 | 2012-12-17 18:19:44 +0100 | [diff] [blame] | 28 | #include "block/block.h" |
Stefan Hajnoczi | 7719f3c | 2018-02-16 16:50:12 +0000 | [diff] [blame] | 29 | #include "block/aio-wait.h" |
Paolo Bonzini | 1de7afc | 2012-12-17 18:20:00 +0100 | [diff] [blame] | 30 | #include "qemu/queue.h" |
Daniel P. Berrange | 10817bf | 2015-09-01 14:48:02 +0100 | [diff] [blame] | 31 | #include "qemu/coroutine.h" |
Paolo Bonzini | f7946da | 2017-06-05 14:39:00 +0200 | [diff] [blame] | 32 | #include "qemu/stats64.h" |
Paolo Bonzini | 1de7afc | 2012-12-17 18:20:00 +0100 | [diff] [blame] | 33 | #include "qemu/timer.h" |
Paolo Bonzini | 8f0720e | 2013-01-21 17:09:41 +0100 | [diff] [blame] | 34 | #include "qemu/hbitmap.h" |
Wenchao Xia | f364ec6 | 2013-05-25 11:09:44 +0800 | [diff] [blame] | 35 | #include "block/snapshot.h" |
Benoît Canet | cc0681c | 2013-09-02 14:14:39 +0200 | [diff] [blame] | 36 | #include "qemu/throttle.h" |
pbrook | faf0796 | 2007-11-11 02:51:17 +0000 | [diff] [blame] | 37 | |
Stefan Hajnoczi | bfe8043 | 2012-07-27 09:05:22 +0100 | [diff] [blame] | 38 | #define BLOCK_FLAG_LAZY_REFCOUNTS 8 |
ths | ec36ba1 | 2007-09-16 21:59:02 +0000 | [diff] [blame] | 39 | |
Stefan Hajnoczi | bfe8043 | 2012-07-27 09:05:22 +0100 | [diff] [blame] | 40 | #define BLOCK_OPT_SIZE "size" |
| 41 | #define BLOCK_OPT_ENCRYPT "encryption" |
Daniel P. Berrange | 0cb8d47 | 2017-06-23 17:24:06 +0100 | [diff] [blame] | 42 | #define BLOCK_OPT_ENCRYPT_FORMAT "encrypt.format" |
Stefan Hajnoczi | bfe8043 | 2012-07-27 09:05:22 +0100 | [diff] [blame] | 43 | #define BLOCK_OPT_COMPAT6 "compat6" |
Janne Karhunen | f249924 | 2016-05-03 02:43:30 -0700 | [diff] [blame] | 44 | #define BLOCK_OPT_HWVERSION "hwversion" |
Stefan Hajnoczi | bfe8043 | 2012-07-27 09:05:22 +0100 | [diff] [blame] | 45 | #define BLOCK_OPT_BACKING_FILE "backing_file" |
| 46 | #define BLOCK_OPT_BACKING_FMT "backing_fmt" |
| 47 | #define BLOCK_OPT_CLUSTER_SIZE "cluster_size" |
| 48 | #define BLOCK_OPT_TABLE_SIZE "table_size" |
| 49 | #define BLOCK_OPT_PREALLOC "preallocation" |
| 50 | #define BLOCK_OPT_SUBFMT "subformat" |
| 51 | #define BLOCK_OPT_COMPAT_LEVEL "compat" |
| 52 | #define BLOCK_OPT_LAZY_REFCOUNTS "lazy_refcounts" |
Othmar Pasteka | 7f2039f | 2013-01-30 00:26:52 +0100 | [diff] [blame] | 53 | #define BLOCK_OPT_ADAPTER_TYPE "adapter_type" |
Liu Yuan | b3af018 | 2013-11-07 22:56:38 +0800 | [diff] [blame] | 54 | #define BLOCK_OPT_REDUNDANCY "redundancy" |
Chunyan Liu | 4ab1559 | 2014-06-30 14:29:58 +0800 | [diff] [blame] | 55 | #define BLOCK_OPT_NOCOW "nocow" |
Teruaki Ishizaki | 876eb1b | 2015-02-13 18:20:53 +0900 | [diff] [blame] | 56 | #define BLOCK_OPT_OBJECT_SIZE "object_size" |
Max Reitz | 06d05fa | 2015-02-18 17:40:49 -0500 | [diff] [blame] | 57 | #define BLOCK_OPT_REFCOUNT_BITS "refcount_bits" |
Kevin Wolf | dcc9868 | 2019-01-14 16:57:27 +0100 | [diff] [blame] | 58 | #define BLOCK_OPT_DATA_FILE "data_file" |
Kevin Wolf | 6c3944d | 2019-02-22 14:29:38 +0100 | [diff] [blame] | 59 | #define BLOCK_OPT_DATA_FILE_RAW "data_file_raw" |
Kevin Wolf | 0e7e198 | 2009-05-18 16:42:10 +0200 | [diff] [blame] | 60 | |
Kevin Wolf | 7cddd37 | 2014-11-20 16:27:11 +0100 | [diff] [blame] | 61 | #define BLOCK_PROBE_BUF_SIZE 512 |
| 62 | |
Fam Zheng | ebde595 | 2015-11-09 18:16:46 +0800 | [diff] [blame] | 63 | enum BdrvTrackedRequestType { |
| 64 | BDRV_TRACKED_READ, |
| 65 | BDRV_TRACKED_WRITE, |
Fam Zheng | ebde595 | 2015-11-09 18:16:46 +0800 | [diff] [blame] | 66 | BDRV_TRACKED_DISCARD, |
Kevin Wolf | 1bc5f09 | 2018-06-26 14:23:23 +0200 | [diff] [blame] | 67 | BDRV_TRACKED_TRUNCATE, |
Fam Zheng | ebde595 | 2015-11-09 18:16:46 +0800 | [diff] [blame] | 68 | }; |
| 69 | |
Stefan Hajnoczi | d616b22 | 2013-06-24 17:13:10 +0200 | [diff] [blame] | 70 | typedef struct BdrvTrackedRequest { |
| 71 | BlockDriverState *bs; |
Kevin Wolf | 793ed47 | 2013-12-03 15:31:25 +0100 | [diff] [blame] | 72 | int64_t offset; |
Fam Zheng | 22931a1 | 2018-07-10 14:31:18 +0800 | [diff] [blame] | 73 | uint64_t bytes; |
Fam Zheng | ebde595 | 2015-11-09 18:16:46 +0800 | [diff] [blame] | 74 | enum BdrvTrackedRequestType type; |
Kevin Wolf | 7327145 | 2013-12-04 17:08:50 +0100 | [diff] [blame] | 75 | |
Kevin Wolf | 2dbafdc | 2013-12-04 16:43:44 +0100 | [diff] [blame] | 76 | bool serialising; |
Kevin Wolf | 7327145 | 2013-12-04 17:08:50 +0100 | [diff] [blame] | 77 | int64_t overlap_offset; |
Fam Zheng | 22931a1 | 2018-07-10 14:31:18 +0800 | [diff] [blame] | 78 | uint64_t overlap_bytes; |
Kevin Wolf | 7327145 | 2013-12-04 17:08:50 +0100 | [diff] [blame] | 79 | |
Stefan Hajnoczi | d616b22 | 2013-06-24 17:13:10 +0200 | [diff] [blame] | 80 | QLIST_ENTRY(BdrvTrackedRequest) list; |
| 81 | Coroutine *co; /* owner, used for deadlock detection */ |
| 82 | CoQueue wait_queue; /* coroutines blocked on this request */ |
Kevin Wolf | 6460440 | 2013-12-13 13:04:35 +0100 | [diff] [blame] | 83 | |
| 84 | struct BdrvTrackedRequest *waiting_for; |
Stefan Hajnoczi | d616b22 | 2013-06-24 17:13:10 +0200 | [diff] [blame] | 85 | } BdrvTrackedRequest; |
| 86 | |
bellard | ea2384d | 2004-08-01 21:59:26 +0000 | [diff] [blame] | 87 | struct BlockDriver { |
| 88 | const char *format_name; |
| 89 | int instance_size; |
Benoît Canet | f6186f4 | 2013-10-02 14:33:48 +0200 | [diff] [blame] | 90 | |
Manos Pitsidianakis | 5a612c0 | 2017-07-13 18:30:25 +0300 | [diff] [blame] | 91 | /* set to true if the BlockDriver is a block filter. Block filters pass |
| 92 | * certain callbacks that refer to data (see block.c) to their bs->file if |
| 93 | * the driver doesn't implement them. Drivers that do not wish to forward |
| 94 | * must implement them and return -ENOTSUP. |
| 95 | */ |
Benoît Canet | b5042a3 | 2014-03-03 19:11:34 +0100 | [diff] [blame] | 96 | bool is_filter; |
Max Reitz | 5d69b5a | 2020-02-18 11:34:41 +0100 | [diff] [blame] | 97 | /* |
| 98 | * Return true if @to_replace can be replaced by a BDS with the |
| 99 | * same data as @bs without it affecting @bs's behavior (that is, |
| 100 | * without it being visible to @bs's parents). |
| 101 | */ |
| 102 | bool (*bdrv_recurse_can_replace)(BlockDriverState *bs, |
| 103 | BlockDriverState *to_replace); |
Benoît Canet | f6186f4 | 2013-10-02 14:33:48 +0200 | [diff] [blame] | 104 | |
bellard | ea2384d | 2004-08-01 21:59:26 +0000 | [diff] [blame] | 105 | int (*bdrv_probe)(const uint8_t *buf, int buf_size, const char *filename); |
Christoph Hellwig | 508c7cb | 2009-06-15 14:04:22 +0200 | [diff] [blame] | 106 | int (*bdrv_probe_device)(const char *filename); |
Kevin Wolf | c2ad1b0 | 2013-03-18 16:40:51 +0100 | [diff] [blame] | 107 | |
| 108 | /* Any driver implementing this callback is expected to be able to handle |
| 109 | * NULL file names in its .bdrv_open() implementation */ |
Kevin Wolf | 6963a30 | 2013-03-15 18:47:22 +0100 | [diff] [blame] | 110 | void (*bdrv_parse_filename)(const char *filename, QDict *options, Error **errp); |
Benoît Canet | 030be32 | 2013-09-24 17:07:04 +0200 | [diff] [blame] | 111 | /* Drivers not implementing bdrv_parse_filename nor bdrv_open should have |
| 112 | * this field set to true, except ones that are defined only by their |
| 113 | * child's bs. |
| 114 | * An example of the last type will be the quorum block driver. |
| 115 | */ |
| 116 | bool bdrv_needs_filename; |
Jeff Cody | e971aa1 | 2012-09-20 15:13:19 -0400 | [diff] [blame] | 117 | |
Kevin Wolf | 8ee79e7 | 2014-06-04 15:09:35 +0200 | [diff] [blame] | 118 | /* Set if a driver can support backing files */ |
| 119 | bool supports_backing; |
| 120 | |
Jeff Cody | e971aa1 | 2012-09-20 15:13:19 -0400 | [diff] [blame] | 121 | /* For handling image reopen for split or non-split files */ |
| 122 | int (*bdrv_reopen_prepare)(BDRVReopenState *reopen_state, |
| 123 | BlockReopenQueue *queue, Error **errp); |
| 124 | void (*bdrv_reopen_commit)(BDRVReopenState *reopen_state); |
| 125 | void (*bdrv_reopen_abort)(BDRVReopenState *reopen_state); |
Kevin Wolf | 5365f44 | 2015-11-16 15:34:59 +0100 | [diff] [blame] | 126 | void (*bdrv_join_options)(QDict *options, QDict *old_options); |
Jeff Cody | e971aa1 | 2012-09-20 15:13:19 -0400 | [diff] [blame] | 127 | |
Max Reitz | 015a103 | 2013-09-05 14:22:29 +0200 | [diff] [blame] | 128 | int (*bdrv_open)(BlockDriverState *bs, QDict *options, int flags, |
| 129 | Error **errp); |
Fabiano Rosas | 1e486cf | 2018-03-12 19:07:53 -0300 | [diff] [blame] | 130 | |
| 131 | /* Protocol drivers should implement this instead of bdrv_open */ |
Max Reitz | 015a103 | 2013-09-05 14:22:29 +0200 | [diff] [blame] | 132 | int (*bdrv_file_open)(BlockDriverState *bs, QDict *options, int flags, |
| 133 | Error **errp); |
bellard | e2731ad | 2004-09-18 19:32:11 +0000 | [diff] [blame] | 134 | void (*bdrv_close)(BlockDriverState *bs); |
Kevin Wolf | b0292b8 | 2018-01-09 16:50:57 +0100 | [diff] [blame] | 135 | int coroutine_fn (*bdrv_co_create)(BlockdevCreateOptions *opts, |
Stefan Hajnoczi | efc75e2 | 2018-01-18 13:43:45 +0100 | [diff] [blame] | 136 | Error **errp); |
Kevin Wolf | b0292b8 | 2018-01-09 16:50:57 +0100 | [diff] [blame] | 137 | int coroutine_fn (*bdrv_co_create_opts)(const char *filename, |
| 138 | QemuOpts *opts, |
| 139 | Error **errp); |
bellard | 95389c8 | 2005-12-18 18:28:15 +0000 | [diff] [blame] | 140 | int (*bdrv_make_empty)(BlockDriverState *bs); |
Max Reitz | 91af701 | 2014-07-18 20:24:56 +0200 | [diff] [blame] | 141 | |
Max Reitz | 998b3a1 | 2019-02-01 20:29:28 +0100 | [diff] [blame] | 142 | /* |
| 143 | * Refreshes the bs->exact_filename field. If that is impossible, |
| 144 | * bs->exact_filename has to be left empty. |
| 145 | */ |
| 146 | void (*bdrv_refresh_filename)(BlockDriverState *bs); |
Max Reitz | 91af701 | 2014-07-18 20:24:56 +0200 | [diff] [blame] | 147 | |
Max Reitz | 1e89d0f | 2019-02-01 20:29:18 +0100 | [diff] [blame] | 148 | /* |
Max Reitz | abc521a | 2019-02-01 20:29:26 +0100 | [diff] [blame] | 149 | * Gathers the open options for all children into @target. |
| 150 | * A simple format driver (without backing file support) might |
| 151 | * implement this function like this: |
| 152 | * |
| 153 | * QINCREF(bs->file->bs->full_open_options); |
| 154 | * qdict_put(target, "file", bs->file->bs->full_open_options); |
| 155 | * |
| 156 | * If not specified, the generic implementation will simply put |
| 157 | * all children's options under their respective name. |
| 158 | * |
| 159 | * @backing_overridden is true when bs->backing seems not to be |
| 160 | * the child that would result from opening bs->backing_file. |
| 161 | * Therefore, if it is true, the backing child's options should be |
| 162 | * gathered; otherwise, there is no need since the backing child |
| 163 | * is the one implied by the image header. |
| 164 | * |
| 165 | * Note that ideally this function would not be needed. Every |
| 166 | * block driver which implements it is probably doing something |
| 167 | * shady regarding its runtime option structure. |
| 168 | */ |
| 169 | void (*bdrv_gather_child_options)(BlockDriverState *bs, QDict *target, |
| 170 | bool backing_overridden); |
| 171 | |
| 172 | /* |
Max Reitz | 1e89d0f | 2019-02-01 20:29:18 +0100 | [diff] [blame] | 173 | * Returns an allocated string which is the directory name of this BDS: It |
| 174 | * will be used to make relative filenames absolute by prepending this |
| 175 | * function's return value to them. |
| 176 | */ |
| 177 | char *(*bdrv_dirname)(BlockDriverState *bs, Error **errp); |
| 178 | |
bellard | 83f6409 | 2006-08-01 16:21:11 +0000 | [diff] [blame] | 179 | /* aio */ |
Eric Blake | e31f686 | 2018-04-24 14:25:01 -0500 | [diff] [blame] | 180 | BlockAIOCB *(*bdrv_aio_preadv)(BlockDriverState *bs, |
| 181 | uint64_t offset, uint64_t bytes, QEMUIOVector *qiov, int flags, |
| 182 | BlockCompletionFunc *cb, void *opaque); |
Eric Blake | e31f686 | 2018-04-24 14:25:01 -0500 | [diff] [blame] | 183 | BlockAIOCB *(*bdrv_aio_pwritev)(BlockDriverState *bs, |
| 184 | uint64_t offset, uint64_t bytes, QEMUIOVector *qiov, int flags, |
| 185 | BlockCompletionFunc *cb, void *opaque); |
Markus Armbruster | 7c84b1b | 2014-10-07 13:59:14 +0200 | [diff] [blame] | 186 | BlockAIOCB *(*bdrv_aio_flush)(BlockDriverState *bs, |
Markus Armbruster | 097310b | 2014-10-07 13:59:15 +0200 | [diff] [blame] | 187 | BlockCompletionFunc *cb, void *opaque); |
Eric Blake | 4da444a | 2016-07-15 17:22:57 -0600 | [diff] [blame] | 188 | BlockAIOCB *(*bdrv_aio_pdiscard)(BlockDriverState *bs, |
Manos Pitsidianakis | f5a5ca7 | 2017-06-09 13:18:08 +0300 | [diff] [blame] | 189 | int64_t offset, int bytes, |
Markus Armbruster | 097310b | 2014-10-07 13:59:15 +0200 | [diff] [blame] | 190 | BlockCompletionFunc *cb, void *opaque); |
bellard | 83f6409 | 2006-08-01 16:21:11 +0000 | [diff] [blame] | 191 | |
Kevin Wolf | da1fa91 | 2011-07-14 17:27:13 +0200 | [diff] [blame] | 192 | int coroutine_fn (*bdrv_co_readv)(BlockDriverState *bs, |
| 193 | int64_t sector_num, int nb_sectors, QEMUIOVector *qiov); |
Daniel P. Berrange | 64182a6 | 2017-08-31 11:54:56 +0100 | [diff] [blame] | 194 | |
| 195 | /** |
| 196 | * @offset: position in bytes to read at |
| 197 | * @bytes: number of bytes to read |
| 198 | * @qiov: the buffers to fill with read data |
| 199 | * @flags: currently unused, always 0 |
| 200 | * |
| 201 | * @offset and @bytes will be a multiple of 'request_alignment', |
| 202 | * but the length of individual @qiov elements does not have to |
| 203 | * be a multiple. |
| 204 | * |
| 205 | * @bytes will always equal the total size of @qiov, and will be |
| 206 | * no larger than 'max_transfer'. |
| 207 | * |
| 208 | * The buffer in @qiov may point directly to guest memory. |
| 209 | */ |
Kevin Wolf | 3fb0669 | 2016-04-25 11:25:18 +0200 | [diff] [blame] | 210 | int coroutine_fn (*bdrv_co_preadv)(BlockDriverState *bs, |
| 211 | uint64_t offset, uint64_t bytes, QEMUIOVector *qiov, int flags); |
Vladimir Sementsov-Ogievskiy | ac850bf | 2019-06-04 19:15:06 +0300 | [diff] [blame] | 212 | int coroutine_fn (*bdrv_co_preadv_part)(BlockDriverState *bs, |
| 213 | uint64_t offset, uint64_t bytes, |
| 214 | QEMUIOVector *qiov, size_t qiov_offset, int flags); |
Kevin Wolf | da1fa91 | 2011-07-14 17:27:13 +0200 | [diff] [blame] | 215 | int coroutine_fn (*bdrv_co_writev)(BlockDriverState *bs, |
Kevin Wolf | 93f5e6d | 2016-03-10 13:39:55 +0100 | [diff] [blame] | 216 | int64_t sector_num, int nb_sectors, QEMUIOVector *qiov, int flags); |
Daniel P. Berrange | 64182a6 | 2017-08-31 11:54:56 +0100 | [diff] [blame] | 217 | /** |
| 218 | * @offset: position in bytes to write at |
| 219 | * @bytes: number of bytes to write |
| 220 | * @qiov: the buffers containing data to write |
| 221 | * @flags: zero or more bits allowed by 'supported_write_flags' |
| 222 | * |
| 223 | * @offset and @bytes will be a multiple of 'request_alignment', |
| 224 | * but the length of individual @qiov elements does not have to |
| 225 | * be a multiple. |
| 226 | * |
| 227 | * @bytes will always equal the total size of @qiov, and will be |
| 228 | * no larger than 'max_transfer'. |
| 229 | * |
| 230 | * The buffer in @qiov may point directly to guest memory. |
| 231 | */ |
Kevin Wolf | 3fb0669 | 2016-04-25 11:25:18 +0200 | [diff] [blame] | 232 | int coroutine_fn (*bdrv_co_pwritev)(BlockDriverState *bs, |
| 233 | uint64_t offset, uint64_t bytes, QEMUIOVector *qiov, int flags); |
Vladimir Sementsov-Ogievskiy | ac850bf | 2019-06-04 19:15:06 +0300 | [diff] [blame] | 234 | int coroutine_fn (*bdrv_co_pwritev_part)(BlockDriverState *bs, |
| 235 | uint64_t offset, uint64_t bytes, |
| 236 | QEMUIOVector *qiov, size_t qiov_offset, int flags); |
Kevin Wolf | 93f5e6d | 2016-03-10 13:39:55 +0100 | [diff] [blame] | 237 | |
Stefan Hajnoczi | f08f2dd | 2012-02-07 13:27:25 +0000 | [diff] [blame] | 238 | /* |
| 239 | * Efficiently zero a region of the disk image. Typically an image format |
| 240 | * would use a compact metadata representation to implement this. This |
Eric Blake | 465fe88 | 2016-05-03 16:39:07 -0600 | [diff] [blame] | 241 | * function pointer may be NULL or return -ENOSUP and .bdrv_co_writev() |
| 242 | * will be called instead. |
Stefan Hajnoczi | f08f2dd | 2012-02-07 13:27:25 +0000 | [diff] [blame] | 243 | */ |
Eric Blake | d05aa8b | 2016-06-01 15:10:03 -0600 | [diff] [blame] | 244 | int coroutine_fn (*bdrv_co_pwrite_zeroes)(BlockDriverState *bs, |
Manos Pitsidianakis | f5a5ca7 | 2017-06-09 13:18:08 +0300 | [diff] [blame] | 245 | int64_t offset, int bytes, BdrvRequestFlags flags); |
Eric Blake | 47a5486 | 2016-07-15 17:22:58 -0600 | [diff] [blame] | 246 | int coroutine_fn (*bdrv_co_pdiscard)(BlockDriverState *bs, |
Manos Pitsidianakis | f5a5ca7 | 2017-06-09 13:18:08 +0300 | [diff] [blame] | 247 | int64_t offset, int bytes); |
Eric Blake | 4c41cb4 | 2017-05-06 19:05:43 -0500 | [diff] [blame] | 248 | |
Fam Zheng | fcc6767 | 2018-06-01 17:26:39 +0800 | [diff] [blame] | 249 | /* Map [offset, offset + nbytes) range onto a child of @bs to copy from, |
| 250 | * and invoke bdrv_co_copy_range_from(child, ...), or invoke |
| 251 | * bdrv_co_copy_range_to() if @bs is the leaf child to copy data from. |
| 252 | * |
| 253 | * See the comment of bdrv_co_copy_range for the parameter and return value |
| 254 | * semantics. |
| 255 | */ |
| 256 | int coroutine_fn (*bdrv_co_copy_range_from)(BlockDriverState *bs, |
| 257 | BdrvChild *src, |
| 258 | uint64_t offset, |
| 259 | BdrvChild *dst, |
| 260 | uint64_t dst_offset, |
| 261 | uint64_t bytes, |
Vladimir Sementsov-Ogievskiy | 67b51fb | 2018-07-09 19:37:17 +0300 | [diff] [blame] | 262 | BdrvRequestFlags read_flags, |
| 263 | BdrvRequestFlags write_flags); |
Fam Zheng | fcc6767 | 2018-06-01 17:26:39 +0800 | [diff] [blame] | 264 | |
| 265 | /* Map [offset, offset + nbytes) range onto a child of bs to copy data to, |
| 266 | * and invoke bdrv_co_copy_range_to(child, src, ...), or perform the copy |
| 267 | * operation if @bs is the leaf and @src has the same BlockDriver. Return |
| 268 | * -ENOTSUP if @bs is the leaf but @src has a different BlockDriver. |
| 269 | * |
| 270 | * See the comment of bdrv_co_copy_range for the parameter and return value |
| 271 | * semantics. |
| 272 | */ |
| 273 | int coroutine_fn (*bdrv_co_copy_range_to)(BlockDriverState *bs, |
| 274 | BdrvChild *src, |
| 275 | uint64_t src_offset, |
| 276 | BdrvChild *dst, |
| 277 | uint64_t dst_offset, |
| 278 | uint64_t bytes, |
Vladimir Sementsov-Ogievskiy | 67b51fb | 2018-07-09 19:37:17 +0300 | [diff] [blame] | 279 | BdrvRequestFlags read_flags, |
| 280 | BdrvRequestFlags write_flags); |
Fam Zheng | fcc6767 | 2018-06-01 17:26:39 +0800 | [diff] [blame] | 281 | |
Eric Blake | 4c41cb4 | 2017-05-06 19:05:43 -0500 | [diff] [blame] | 282 | /* |
Eric Blake | 298a166 | 2017-10-11 22:46:57 -0500 | [diff] [blame] | 283 | * Building block for bdrv_block_status[_above] and |
| 284 | * bdrv_is_allocated[_above]. The driver should answer only |
Eric Blake | 86a3d5c | 2018-02-13 14:26:41 -0600 | [diff] [blame] | 285 | * according to the current layer, and should only need to set |
| 286 | * BDRV_BLOCK_DATA, BDRV_BLOCK_ZERO, BDRV_BLOCK_OFFSET_VALID, |
| 287 | * and/or BDRV_BLOCK_RAW; if the current layer defers to a backing |
| 288 | * layer, the result should be 0 (and not BDRV_BLOCK_ZERO). See |
| 289 | * block.h for the overall meaning of the bits. As a hint, the |
| 290 | * flag want_zero is true if the caller cares more about precise |
| 291 | * mappings (favor accurate _OFFSET_VALID/_ZERO) or false for |
| 292 | * overall allocation (favor larger *pnum, perhaps by reporting |
| 293 | * _DATA instead of _ZERO). The block layer guarantees input |
| 294 | * clamped to bdrv_getlength() and aligned to request_alignment, |
| 295 | * as well as non-NULL pnum, map, and file; in turn, the driver |
| 296 | * must return an error or set pnum to an aligned non-zero value. |
Eric Blake | 4c41cb4 | 2017-05-06 19:05:43 -0500 | [diff] [blame] | 297 | */ |
Eric Blake | 86a3d5c | 2018-02-13 14:26:41 -0600 | [diff] [blame] | 298 | int coroutine_fn (*bdrv_co_block_status)(BlockDriverState *bs, |
| 299 | bool want_zero, int64_t offset, int64_t bytes, int64_t *pnum, |
| 300 | int64_t *map, BlockDriverState **file); |
Kevin Wolf | da1fa91 | 2011-07-14 17:27:13 +0200 | [diff] [blame] | 301 | |
Kevin Wolf | c68b89a | 2011-11-10 17:25:44 +0100 | [diff] [blame] | 302 | /* |
Anthony Liguori | 0f15423 | 2011-11-14 15:09:45 -0600 | [diff] [blame] | 303 | * Invalidate any cached meta-data. |
| 304 | */ |
Paolo Bonzini | 2b148f3 | 2018-03-01 17:36:18 +0100 | [diff] [blame] | 305 | void coroutine_fn (*bdrv_co_invalidate_cache)(BlockDriverState *bs, |
| 306 | Error **errp); |
Kevin Wolf | 76b1c7f | 2015-12-22 14:07:08 +0100 | [diff] [blame] | 307 | int (*bdrv_inactivate)(BlockDriverState *bs); |
Anthony Liguori | 0f15423 | 2011-11-14 15:09:45 -0600 | [diff] [blame] | 308 | |
| 309 | /* |
Pavel Dovgalyuk | c32b82a | 2016-03-14 10:44:53 +0300 | [diff] [blame] | 310 | * Flushes all data for all layers by calling bdrv_co_flush for underlying |
| 311 | * layers, if needed. This function is needed for deterministic |
| 312 | * synchronization of the flush finishing callback. |
| 313 | */ |
| 314 | int coroutine_fn (*bdrv_co_flush)(BlockDriverState *bs); |
| 315 | |
| 316 | /* |
Kevin Wolf | c68b89a | 2011-11-10 17:25:44 +0100 | [diff] [blame] | 317 | * Flushes all data that was already written to the OS all the way down to |
Eric Blake | c1bb86c | 2016-12-02 13:48:54 -0600 | [diff] [blame] | 318 | * the disk (for example file-posix.c calls fsync()). |
Kevin Wolf | c68b89a | 2011-11-10 17:25:44 +0100 | [diff] [blame] | 319 | */ |
| 320 | int coroutine_fn (*bdrv_co_flush_to_disk)(BlockDriverState *bs); |
| 321 | |
Kevin Wolf | eb489bb | 2011-11-10 18:10:11 +0100 | [diff] [blame] | 322 | /* |
| 323 | * Flushes all internal caches to the OS. The data may still sit in a |
| 324 | * writeback cache of the host OS, but it will survive a crash of the qemu |
| 325 | * process. |
| 326 | */ |
| 327 | int coroutine_fn (*bdrv_co_flush_to_os)(BlockDriverState *bs); |
| 328 | |
Fabiano Rosas | 1e486cf | 2018-03-12 19:07:53 -0300 | [diff] [blame] | 329 | /* |
| 330 | * Drivers setting this field must be able to work with just a plain |
| 331 | * filename with '<protocol_name>:' as a prefix, and no other options. |
| 332 | * Options may be extracted from the filename by implementing |
| 333 | * bdrv_parse_filename. |
| 334 | */ |
bellard | 83f6409 | 2006-08-01 16:21:11 +0000 | [diff] [blame] | 335 | const char *protocol_name; |
Max Reitz | c80d8b0 | 2019-09-18 11:51:40 +0200 | [diff] [blame] | 336 | |
| 337 | /* |
| 338 | * Truncate @bs to @offset bytes using the given @prealloc mode |
| 339 | * when growing. Modes other than PREALLOC_MODE_OFF should be |
| 340 | * rejected when shrinking @bs. |
| 341 | * |
| 342 | * If @exact is true, @bs must be resized to exactly @offset. |
| 343 | * Otherwise, it is sufficient for @bs (if it is a host block |
| 344 | * device and thus there is no way to resize it) to be at least |
| 345 | * @offset bytes in length. |
| 346 | * |
| 347 | * If @exact is true and this function fails but would succeed |
| 348 | * with @exact = false, it should return -ENOTSUP. |
| 349 | */ |
Kevin Wolf | 061ca8a | 2018-06-21 17:54:35 +0200 | [diff] [blame] | 350 | int coroutine_fn (*bdrv_co_truncate)(BlockDriverState *bs, int64_t offset, |
Max Reitz | c80d8b0 | 2019-09-18 11:51:40 +0200 | [diff] [blame] | 351 | bool exact, PreallocMode prealloc, |
| 352 | Error **errp); |
Kevin Wolf | b94a261 | 2013-10-29 12:18:58 +0100 | [diff] [blame] | 353 | |
bellard | 83f6409 | 2006-08-01 16:21:11 +0000 | [diff] [blame] | 354 | int64_t (*bdrv_getlength)(BlockDriverState *bs); |
Kevin Wolf | b94a261 | 2013-10-29 12:18:58 +0100 | [diff] [blame] | 355 | bool has_variable_length; |
Fam Zheng | 4a1d5e1 | 2011-07-12 19:56:39 +0800 | [diff] [blame] | 356 | int64_t (*bdrv_get_allocated_file_size)(BlockDriverState *bs); |
Stefan Hajnoczi | 90880ff | 2017-07-05 13:57:30 +0100 | [diff] [blame] | 357 | BlockMeasureInfo *(*bdrv_measure)(QemuOpts *opts, BlockDriverState *in_bs, |
| 358 | Error **errp); |
Kevin Wolf | b94a261 | 2013-10-29 12:18:58 +0100 | [diff] [blame] | 359 | |
Pavel Butsykin | 29a298a | 2016-07-22 11:17:42 +0300 | [diff] [blame] | 360 | int coroutine_fn (*bdrv_co_pwritev_compressed)(BlockDriverState *bs, |
| 361 | uint64_t offset, uint64_t bytes, QEMUIOVector *qiov); |
Vladimir Sementsov-Ogievskiy | ac850bf | 2019-06-04 19:15:06 +0300 | [diff] [blame] | 362 | int coroutine_fn (*bdrv_co_pwritev_compressed_part)(BlockDriverState *bs, |
| 363 | uint64_t offset, uint64_t bytes, QEMUIOVector *qiov, |
| 364 | size_t qiov_offset); |
Pavel Butsykin | 29a298a | 2016-07-22 11:17:42 +0300 | [diff] [blame] | 365 | |
ths | 5fafdf2 | 2007-09-16 21:08:06 +0000 | [diff] [blame] | 366 | int (*bdrv_snapshot_create)(BlockDriverState *bs, |
bellard | faea38e | 2006-08-05 21:31:00 +0000 | [diff] [blame] | 367 | QEMUSnapshotInfo *sn_info); |
ths | 5fafdf2 | 2007-09-16 21:08:06 +0000 | [diff] [blame] | 368 | int (*bdrv_snapshot_goto)(BlockDriverState *bs, |
bellard | faea38e | 2006-08-05 21:31:00 +0000 | [diff] [blame] | 369 | const char *snapshot_id); |
Wenchao Xia | a89d89d | 2013-09-11 14:04:33 +0800 | [diff] [blame] | 370 | int (*bdrv_snapshot_delete)(BlockDriverState *bs, |
| 371 | const char *snapshot_id, |
| 372 | const char *name, |
| 373 | Error **errp); |
ths | 5fafdf2 | 2007-09-16 21:08:06 +0000 | [diff] [blame] | 374 | int (*bdrv_snapshot_list)(BlockDriverState *bs, |
bellard | faea38e | 2006-08-05 21:31:00 +0000 | [diff] [blame] | 375 | QEMUSnapshotInfo **psn_info); |
edison | 51ef672 | 2010-09-21 19:58:41 -0700 | [diff] [blame] | 376 | int (*bdrv_snapshot_load_tmp)(BlockDriverState *bs, |
Wenchao Xia | 7b4c478 | 2013-12-04 17:10:54 +0800 | [diff] [blame] | 377 | const char *snapshot_id, |
| 378 | const char *name, |
| 379 | Error **errp); |
bellard | faea38e | 2006-08-05 21:31:00 +0000 | [diff] [blame] | 380 | int (*bdrv_get_info)(BlockDriverState *bs, BlockDriverInfo *bdi); |
Andrey Shinkevich | 1bf6e9c | 2019-02-08 18:06:06 +0300 | [diff] [blame] | 381 | ImageInfoSpecific *(*bdrv_get_specific_info)(BlockDriverState *bs, |
| 382 | Error **errp); |
Anton Nefedov | d924559 | 2019-09-23 15:17:37 +0300 | [diff] [blame] | 383 | BlockStatsSpecific *(*bdrv_get_specific_stats)(BlockDriverState *bs); |
bellard | 83f6409 | 2006-08-01 16:21:11 +0000 | [diff] [blame] | 384 | |
Kevin Wolf | 1a8ae82 | 2016-06-09 16:24:44 +0200 | [diff] [blame] | 385 | int coroutine_fn (*bdrv_save_vmstate)(BlockDriverState *bs, |
| 386 | QEMUIOVector *qiov, |
| 387 | int64_t pos); |
| 388 | int coroutine_fn (*bdrv_load_vmstate)(BlockDriverState *bs, |
| 389 | QEMUIOVector *qiov, |
| 390 | int64_t pos); |
aliguori | 178e08a | 2009-04-05 19:10:55 +0000 | [diff] [blame] | 391 | |
Kevin Wolf | 756e673 | 2010-01-12 12:55:17 +0100 | [diff] [blame] | 392 | int (*bdrv_change_backing_file)(BlockDriverState *bs, |
| 393 | const char *backing_file, const char *backing_fmt); |
| 394 | |
bellard | 19cb373 | 2006-08-19 11:45:59 +0000 | [diff] [blame] | 395 | /* removable device specific */ |
Max Reitz | e031f75 | 2015-10-19 17:53:11 +0200 | [diff] [blame] | 396 | bool (*bdrv_is_inserted)(BlockDriverState *bs); |
Luiz Capitulino | f36f394 | 2012-02-03 16:24:53 -0200 | [diff] [blame] | 397 | void (*bdrv_eject)(BlockDriverState *bs, bool eject_flag); |
Markus Armbruster | 025e849 | 2011-09-06 18:58:47 +0200 | [diff] [blame] | 398 | void (*bdrv_lock_medium)(BlockDriverState *bs, bool locked); |
ths | 3b46e62 | 2007-09-17 08:09:54 +0000 | [diff] [blame] | 399 | |
ths | 985a03b | 2007-12-24 16:10:43 +0000 | [diff] [blame] | 400 | /* to control generic scsi devices */ |
Markus Armbruster | 7c84b1b | 2014-10-07 13:59:14 +0200 | [diff] [blame] | 401 | BlockAIOCB *(*bdrv_aio_ioctl)(BlockDriverState *bs, |
aliguori | 221f715 | 2009-03-28 17:28:41 +0000 | [diff] [blame] | 402 | unsigned long int req, void *buf, |
Markus Armbruster | 097310b | 2014-10-07 13:59:15 +0200 | [diff] [blame] | 403 | BlockCompletionFunc *cb, void *opaque); |
Kevin Wolf | 16a389d | 2016-10-20 15:07:27 +0200 | [diff] [blame] | 404 | int coroutine_fn (*bdrv_co_ioctl)(BlockDriverState *bs, |
| 405 | unsigned long int req, void *buf); |
ths | 985a03b | 2007-12-24 16:10:43 +0000 | [diff] [blame] | 406 | |
Kevin Wolf | 0e7e198 | 2009-05-18 16:42:10 +0200 | [diff] [blame] | 407 | /* List of options for creating images, terminated by name == NULL */ |
Chunyan Liu | 83d0521 | 2014-06-05 17:20:51 +0800 | [diff] [blame] | 408 | QemuOptsList *create_opts; |
Alberto Garcia | 8a2ce0b | 2019-03-12 18:48:48 +0200 | [diff] [blame] | 409 | /* |
| 410 | * If this driver supports reopening images this contains a |
| 411 | * NULL-terminated list of the runtime options that can be |
| 412 | * modified. If an option in this list is unspecified during |
| 413 | * reopen then it _must_ be reset to its default value or return |
| 414 | * an error. |
| 415 | */ |
| 416 | const char *const *mutable_opts; |
aliguori | 5eb4563 | 2009-03-28 17:55:10 +0000 | [diff] [blame] | 417 | |
Kevin Wolf | 9ac228e | 2010-06-29 12:37:54 +0200 | [diff] [blame] | 418 | /* |
| 419 | * Returns 0 for completed check, -errno for internal errors. |
| 420 | * The check results are stored in result. |
| 421 | */ |
Paolo Bonzini | 2fd6163 | 2018-03-01 17:36:19 +0100 | [diff] [blame] | 422 | int coroutine_fn (*bdrv_co_check)(BlockDriverState *bs, |
| 423 | BdrvCheckResult *result, |
| 424 | BdrvCheckMode fix); |
aliguori | e97fc19 | 2009-04-21 23:11:50 +0000 | [diff] [blame] | 425 | |
Max Reitz | 7748543 | 2014-10-27 11:12:50 +0100 | [diff] [blame] | 426 | int (*bdrv_amend_options)(BlockDriverState *bs, QemuOpts *opts, |
Max Reitz | 8b13976 | 2015-07-27 17:51:32 +0200 | [diff] [blame] | 427 | BlockDriverAmendStatusCB *status_cb, |
Max Reitz | d1402b5 | 2018-05-09 23:00:18 +0200 | [diff] [blame] | 428 | void *cb_opaque, |
| 429 | Error **errp); |
Max Reitz | 6f176b4 | 2013-09-03 10:09:50 +0200 | [diff] [blame] | 430 | |
Eric Blake | a31939e | 2015-11-18 01:52:54 -0700 | [diff] [blame] | 431 | void (*bdrv_debug_event)(BlockDriverState *bs, BlkdebugEvent event); |
Kevin Wolf | 8b9b0cc | 2010-03-15 17:27:00 +0100 | [diff] [blame] | 432 | |
Kevin Wolf | 41c695c | 2012-12-06 14:32:58 +0100 | [diff] [blame] | 433 | /* TODO Better pass a option string/QDict/QemuOpts to add any rule? */ |
| 434 | int (*bdrv_debug_breakpoint)(BlockDriverState *bs, const char *event, |
| 435 | const char *tag); |
Fam Zheng | 4cc70e9 | 2013-11-20 10:01:54 +0800 | [diff] [blame] | 436 | int (*bdrv_debug_remove_breakpoint)(BlockDriverState *bs, |
| 437 | const char *tag); |
Kevin Wolf | 41c695c | 2012-12-06 14:32:58 +0100 | [diff] [blame] | 438 | int (*bdrv_debug_resume)(BlockDriverState *bs, const char *tag); |
| 439 | bool (*bdrv_debug_is_suspended)(BlockDriverState *bs, const char *tag); |
| 440 | |
Kevin Wolf | 3baca89 | 2014-07-16 17:48:16 +0200 | [diff] [blame] | 441 | void (*bdrv_refresh_limits)(BlockDriverState *bs, Error **errp); |
Kevin Wolf | d34682c | 2013-12-11 19:26:16 +0100 | [diff] [blame] | 442 | |
Kevin Wolf | 336c1c1 | 2010-07-28 11:26:29 +0200 | [diff] [blame] | 443 | /* |
| 444 | * Returns 1 if newly created images are guaranteed to contain only |
| 445 | * zeros, 0 otherwise. |
Max Reitz | ceaca56 | 2019-07-24 19:12:31 +0200 | [diff] [blame] | 446 | * Must return 0 if .bdrv_has_zero_init_truncate() returns 0. |
Kevin Wolf | 336c1c1 | 2010-07-28 11:26:29 +0200 | [diff] [blame] | 447 | */ |
| 448 | int (*bdrv_has_zero_init)(BlockDriverState *bs); |
Kevin Wolf | 12c09b8 | 2009-11-30 16:54:15 +0100 | [diff] [blame] | 449 | |
Max Reitz | ceaca56 | 2019-07-24 19:12:31 +0200 | [diff] [blame] | 450 | /* |
| 451 | * Returns 1 if new areas added by growing the image with |
| 452 | * PREALLOC_MODE_OFF contain only zeros, 0 otherwise. |
| 453 | */ |
| 454 | int (*bdrv_has_zero_init_truncate)(BlockDriverState *bs); |
| 455 | |
Stefan Hajnoczi | dcd0422 | 2014-05-08 16:34:37 +0200 | [diff] [blame] | 456 | /* Remove fd handlers, timers, and other event loop callbacks so the event |
| 457 | * loop is no longer in use. Called with no in-flight requests and in |
| 458 | * depth-first traversal order with parents before child nodes. |
| 459 | */ |
| 460 | void (*bdrv_detach_aio_context)(BlockDriverState *bs); |
| 461 | |
| 462 | /* Add fd handlers, timers, and other event loop callbacks so I/O requests |
| 463 | * can be processed again. Called with no in-flight requests and in |
| 464 | * depth-first traversal order with child nodes before parent nodes. |
| 465 | */ |
| 466 | void (*bdrv_attach_aio_context)(BlockDriverState *bs, |
| 467 | AioContext *new_context); |
| 468 | |
Ming Lei | 448ad91 | 2014-07-04 18:04:33 +0800 | [diff] [blame] | 469 | /* io queue for linux-aio */ |
| 470 | void (*bdrv_io_plug)(BlockDriverState *bs); |
| 471 | void (*bdrv_io_unplug)(BlockDriverState *bs); |
Ming Lei | 448ad91 | 2014-07-04 18:04:33 +0800 | [diff] [blame] | 472 | |
Ekaterina Tumanova | 892b7de | 2015-02-16 12:47:54 +0100 | [diff] [blame] | 473 | /** |
| 474 | * Try to get @bs's logical and physical block size. |
| 475 | * On success, store them in @bsz and return zero. |
| 476 | * On failure, return negative errno. |
| 477 | */ |
| 478 | int (*bdrv_probe_blocksizes)(BlockDriverState *bs, BlockSizes *bsz); |
| 479 | /** |
| 480 | * Try to get @bs's geometry (cyls, heads, sectors) |
| 481 | * On success, store them in @geo and return 0. |
| 482 | * On failure return -errno. |
| 483 | * Only drivers that want to override guest geometry implement this |
| 484 | * callback; see hd_geometry_guess(). |
| 485 | */ |
| 486 | int (*bdrv_probe_geometry)(BlockDriverState *bs, HDGeometry *geo); |
| 487 | |
Fam Zheng | 67da1dc | 2015-11-09 18:16:53 +0800 | [diff] [blame] | 488 | /** |
Manos Pitsidianakis | f8ea8da | 2017-09-23 14:14:10 +0300 | [diff] [blame] | 489 | * bdrv_co_drain_begin is called if implemented in the beginning of a |
Manos Pitsidianakis | 481cad4 | 2017-09-23 14:14:09 +0300 | [diff] [blame] | 490 | * drain operation to drain and stop any internal sources of requests in |
| 491 | * the driver. |
| 492 | * bdrv_co_drain_end is called if implemented at the end of the drain. |
| 493 | * |
| 494 | * They should be used by the driver to e.g. manage scheduled I/O |
| 495 | * requests, or toggle an internal state. After the end of the drain new |
| 496 | * requests will continue normally. |
Fam Zheng | 67da1dc | 2015-11-09 18:16:53 +0800 | [diff] [blame] | 497 | */ |
Manos Pitsidianakis | f8ea8da | 2017-09-23 14:14:10 +0300 | [diff] [blame] | 498 | void coroutine_fn (*bdrv_co_drain_begin)(BlockDriverState *bs); |
Manos Pitsidianakis | 481cad4 | 2017-09-23 14:14:09 +0300 | [diff] [blame] | 499 | void coroutine_fn (*bdrv_co_drain_end)(BlockDriverState *bs); |
Fam Zheng | 67da1dc | 2015-11-09 18:16:53 +0800 | [diff] [blame] | 500 | |
Wen Congyang | e06018a | 2016-05-10 15:36:37 +0800 | [diff] [blame] | 501 | void (*bdrv_add_child)(BlockDriverState *parent, BlockDriverState *child, |
| 502 | Error **errp); |
| 503 | void (*bdrv_del_child)(BlockDriverState *parent, BdrvChild *child, |
| 504 | Error **errp); |
| 505 | |
Kevin Wolf | 33a610c | 2016-12-15 13:04:20 +0100 | [diff] [blame] | 506 | /** |
| 507 | * Informs the block driver that a permission change is intended. The |
| 508 | * driver checks whether the change is permissible and may take other |
| 509 | * preparations for the change (e.g. get file system locks). This operation |
| 510 | * is always followed either by a call to either .bdrv_set_perm or |
| 511 | * .bdrv_abort_perm_update. |
| 512 | * |
| 513 | * Checks whether the requested set of cumulative permissions in @perm |
| 514 | * can be granted for accessing @bs and whether no other users are using |
| 515 | * permissions other than those given in @shared (both arguments take |
| 516 | * BLK_PERM_* bitmasks). |
| 517 | * |
| 518 | * If both conditions are met, 0 is returned. Otherwise, -errno is returned |
| 519 | * and errp is set to an error describing the conflict. |
| 520 | */ |
| 521 | int (*bdrv_check_perm)(BlockDriverState *bs, uint64_t perm, |
| 522 | uint64_t shared, Error **errp); |
| 523 | |
| 524 | /** |
| 525 | * Called to inform the driver that the set of cumulative set of used |
| 526 | * permissions for @bs has changed to @perm, and the set of sharable |
| 527 | * permission to @shared. The driver can use this to propagate changes to |
| 528 | * its children (i.e. request permissions only if a parent actually needs |
| 529 | * them). |
| 530 | * |
| 531 | * This function is only invoked after bdrv_check_perm(), so block drivers |
| 532 | * may rely on preparations made in their .bdrv_check_perm implementation. |
| 533 | */ |
| 534 | void (*bdrv_set_perm)(BlockDriverState *bs, uint64_t perm, uint64_t shared); |
| 535 | |
| 536 | /* |
| 537 | * Called to inform the driver that after a previous bdrv_check_perm() |
| 538 | * call, the permission update is not performed and any preparations made |
| 539 | * for it (e.g. taken file locks) need to be undone. |
| 540 | * |
| 541 | * This function can be called even for nodes that never saw a |
| 542 | * bdrv_check_perm() call. It is a no-op then. |
| 543 | */ |
| 544 | void (*bdrv_abort_perm_update)(BlockDriverState *bs); |
| 545 | |
| 546 | /** |
| 547 | * Returns in @nperm and @nshared the permissions that the driver for @bs |
| 548 | * needs on its child @c, based on the cumulative permissions requested by |
| 549 | * the parents in @parent_perm and @parent_shared. |
| 550 | * |
| 551 | * If @c is NULL, return the permissions for attaching a new child for the |
| 552 | * given @role. |
Kevin Wolf | e0995dc | 2017-09-14 12:47:11 +0200 | [diff] [blame] | 553 | * |
| 554 | * If @reopen_queue is non-NULL, don't return the currently needed |
| 555 | * permissions, but those that will be needed after applying the |
| 556 | * @reopen_queue. |
Kevin Wolf | 33a610c | 2016-12-15 13:04:20 +0100 | [diff] [blame] | 557 | */ |
| 558 | void (*bdrv_child_perm)(BlockDriverState *bs, BdrvChild *c, |
| 559 | const BdrvChildRole *role, |
Kevin Wolf | e0995dc | 2017-09-14 12:47:11 +0200 | [diff] [blame] | 560 | BlockReopenQueue *reopen_queue, |
Kevin Wolf | 33a610c | 2016-12-15 13:04:20 +0100 | [diff] [blame] | 561 | uint64_t parent_perm, uint64_t parent_shared, |
| 562 | uint64_t *nperm, uint64_t *nshared); |
| 563 | |
Vladimir Sementsov-Ogievskiy | d2c3080 | 2019-09-20 11:25:43 +0300 | [diff] [blame] | 564 | bool (*bdrv_co_can_store_new_dirty_bitmap)(BlockDriverState *bs, |
Vladimir Sementsov-Ogievskiy | b56a1e3 | 2019-09-20 11:25:42 +0300 | [diff] [blame] | 565 | const char *name, |
Vladimir Sementsov-Ogievskiy | d2c3080 | 2019-09-20 11:25:43 +0300 | [diff] [blame] | 566 | uint32_t granularity, |
Vladimir Sementsov-Ogievskiy | b56a1e3 | 2019-09-20 11:25:42 +0300 | [diff] [blame] | 567 | Error **errp); |
Vladimir Sementsov-Ogievskiy | d2c3080 | 2019-09-20 11:25:43 +0300 | [diff] [blame] | 568 | int (*bdrv_co_remove_persistent_dirty_bitmap)(BlockDriverState *bs, |
| 569 | const char *name, |
| 570 | Error **errp); |
Vladimir Sementsov-Ogievskiy | cb9ff6c | 2017-06-28 15:05:13 +0300 | [diff] [blame] | 571 | |
Fam Zheng | 23d0ba9 | 2018-01-16 14:08:56 +0800 | [diff] [blame] | 572 | /** |
| 573 | * Register/unregister a buffer for I/O. For example, when the driver is |
| 574 | * interested to know the memory areas that will later be used in iovs, so |
| 575 | * that it can do IOMMU mapping with VFIO etc., in order to get better |
| 576 | * performance. In the case of VFIO drivers, this callback is used to do |
| 577 | * DMA mapping for hot buffers. |
| 578 | */ |
| 579 | void (*bdrv_register_buf)(BlockDriverState *bs, void *host, size_t size); |
| 580 | void (*bdrv_unregister_buf)(BlockDriverState *bs, void *host); |
Stefan Hajnoczi | 8a22f02 | 2010-04-13 10:29:33 +0100 | [diff] [blame] | 581 | QLIST_ENTRY(BlockDriver) list; |
Max Reitz | 2654267 | 2019-02-01 20:29:25 +0100 | [diff] [blame] | 582 | |
| 583 | /* Pointer to a NULL-terminated array of names of strong options |
| 584 | * that can be specified for bdrv_open(). A strong option is one |
| 585 | * that changes the data of a BDS. |
| 586 | * If this pointer is NULL, the array is considered empty. |
| 587 | * "filename" and "driver" are always considered strong. */ |
| 588 | const char *const *strong_runtime_opts; |
bellard | ea2384d | 2004-08-01 21:59:26 +0000 | [diff] [blame] | 589 | }; |
| 590 | |
Vladimir Sementsov-Ogievskiy | ac850bf | 2019-06-04 19:15:06 +0300 | [diff] [blame] | 591 | static inline bool block_driver_can_compress(BlockDriver *drv) |
| 592 | { |
| 593 | return drv->bdrv_co_pwritev_compressed || |
| 594 | drv->bdrv_co_pwritev_compressed_part; |
| 595 | } |
| 596 | |
Peter Lieven | fe81c2c | 2013-10-24 12:06:56 +0200 | [diff] [blame] | 597 | typedef struct BlockLimits { |
Eric Blake | a5b8dd2 | 2016-06-23 16:37:24 -0600 | [diff] [blame] | 598 | /* Alignment requirement, in bytes, for offset/length of I/O |
| 599 | * requests. Must be a power of 2 less than INT_MAX; defaults to |
| 600 | * 1 for drivers with modern byte interfaces, and to 512 |
| 601 | * otherwise. */ |
| 602 | uint32_t request_alignment; |
| 603 | |
Eric Blake | b8d0a98 | 2016-07-21 13:34:48 -0600 | [diff] [blame] | 604 | /* Maximum number of bytes that can be discarded at once (since it |
| 605 | * is signed, it must be < 2G, if set). Must be multiple of |
Eric Blake | b9f7855 | 2016-06-23 16:37:21 -0600 | [diff] [blame] | 606 | * pdiscard_alignment, but need not be power of 2. May be 0 if no |
| 607 | * inherent 32-bit limit */ |
| 608 | int32_t max_pdiscard; |
Peter Lieven | fe81c2c | 2013-10-24 12:06:56 +0200 | [diff] [blame] | 609 | |
Eric Blake | b8d0a98 | 2016-07-21 13:34:48 -0600 | [diff] [blame] | 610 | /* Optimal alignment for discard requests in bytes. A power of 2 |
| 611 | * is best but not mandatory. Must be a multiple of |
| 612 | * bl.request_alignment, and must be less than max_pdiscard if |
| 613 | * that is set. May be 0 if bl.request_alignment is good enough */ |
Eric Blake | b9f7855 | 2016-06-23 16:37:21 -0600 | [diff] [blame] | 614 | uint32_t pdiscard_alignment; |
Peter Lieven | fe81c2c | 2013-10-24 12:06:56 +0200 | [diff] [blame] | 615 | |
Eric Blake | b8d0a98 | 2016-07-21 13:34:48 -0600 | [diff] [blame] | 616 | /* Maximum number of bytes that can zeroized at once (since it is |
| 617 | * signed, it must be < 2G, if set). Must be multiple of |
Eric Blake | 29cc6a6 | 2016-06-23 16:37:20 -0600 | [diff] [blame] | 618 | * pwrite_zeroes_alignment. May be 0 if no inherent 32-bit limit */ |
Eric Blake | cf081fc | 2016-06-01 15:10:02 -0600 | [diff] [blame] | 619 | int32_t max_pwrite_zeroes; |
Peter Lieven | fe81c2c | 2013-10-24 12:06:56 +0200 | [diff] [blame] | 620 | |
Eric Blake | b8d0a98 | 2016-07-21 13:34:48 -0600 | [diff] [blame] | 621 | /* Optimal alignment for write zeroes requests in bytes. A power |
| 622 | * of 2 is best but not mandatory. Must be a multiple of |
| 623 | * bl.request_alignment, and must be less than max_pwrite_zeroes |
| 624 | * if that is set. May be 0 if bl.request_alignment is good |
| 625 | * enough */ |
Eric Blake | cf081fc | 2016-06-01 15:10:02 -0600 | [diff] [blame] | 626 | uint32_t pwrite_zeroes_alignment; |
Peter Lieven | 7337aca | 2013-11-27 11:07:04 +0100 | [diff] [blame] | 627 | |
Eric Blake | b8d0a98 | 2016-07-21 13:34:48 -0600 | [diff] [blame] | 628 | /* Optimal transfer length in bytes. A power of 2 is best but not |
| 629 | * mandatory. Must be a multiple of bl.request_alignment, or 0 if |
| 630 | * no preferred size */ |
Eric Blake | 5def6b8 | 2016-06-23 16:37:19 -0600 | [diff] [blame] | 631 | uint32_t opt_transfer; |
Kevin Wolf | 339064d | 2013-11-28 10:23:32 +0100 | [diff] [blame] | 632 | |
Eric Blake | b8d0a98 | 2016-07-21 13:34:48 -0600 | [diff] [blame] | 633 | /* Maximal transfer length in bytes. Need not be power of 2, but |
| 634 | * must be multiple of opt_transfer and bl.request_alignment, or 0 |
| 635 | * for no 32-bit limit. For now, anything larger than INT_MAX is |
| 636 | * clamped down. */ |
Eric Blake | 5def6b8 | 2016-06-23 16:37:19 -0600 | [diff] [blame] | 637 | uint32_t max_transfer; |
Peter Lieven | 2647fab | 2014-10-27 10:18:44 +0100 | [diff] [blame] | 638 | |
Eric Blake | a5b8dd2 | 2016-06-23 16:37:24 -0600 | [diff] [blame] | 639 | /* memory alignment, in bytes so that no bounce buffer is needed */ |
Denis V. Lunev | 4196d2f | 2015-05-12 17:30:55 +0300 | [diff] [blame] | 640 | size_t min_mem_alignment; |
| 641 | |
Eric Blake | a5b8dd2 | 2016-06-23 16:37:24 -0600 | [diff] [blame] | 642 | /* memory alignment, in bytes, for bounce buffer */ |
Kevin Wolf | 339064d | 2013-11-28 10:23:32 +0100 | [diff] [blame] | 643 | size_t opt_mem_alignment; |
Stefan Hajnoczi | bd44feb | 2015-07-09 10:56:44 +0100 | [diff] [blame] | 644 | |
| 645 | /* maximum number of iovec elements */ |
| 646 | int max_iov; |
Peter Lieven | fe81c2c | 2013-10-24 12:06:56 +0200 | [diff] [blame] | 647 | } BlockLimits; |
| 648 | |
Fam Zheng | fbe40ff | 2014-05-23 21:29:42 +0800 | [diff] [blame] | 649 | typedef struct BdrvOpBlocker BdrvOpBlocker; |
| 650 | |
Max Reitz | 3338442 | 2014-06-20 21:57:33 +0200 | [diff] [blame] | 651 | typedef struct BdrvAioNotifier { |
| 652 | void (*attached_aio_context)(AioContext *new_context, void *opaque); |
| 653 | void (*detach_aio_context)(void *opaque); |
| 654 | |
| 655 | void *opaque; |
Stefan Hajnoczi | e8a095d | 2016-06-16 17:56:26 +0100 | [diff] [blame] | 656 | bool deleted; |
Max Reitz | 3338442 | 2014-06-20 21:57:33 +0200 | [diff] [blame] | 657 | |
| 658 | QLIST_ENTRY(BdrvAioNotifier) list; |
| 659 | } BdrvAioNotifier; |
| 660 | |
Kevin Wolf | f3930ed | 2015-04-08 13:43:47 +0200 | [diff] [blame] | 661 | struct BdrvChildRole { |
Kevin Wolf | 5fe31c2 | 2017-03-06 16:20:51 +0100 | [diff] [blame] | 662 | /* If true, bdrv_replace_node() doesn't change the node this BdrvChild |
| 663 | * points to. */ |
Kevin Wolf | 26de943 | 2017-01-17 13:39:34 +0100 | [diff] [blame] | 664 | bool stay_at_node; |
| 665 | |
Kevin Wolf | 6cd5c9d | 2018-05-29 17:17:45 +0200 | [diff] [blame] | 666 | /* If true, the parent is a BlockDriverState and bdrv_next_all_states() |
| 667 | * will return it. This information is used for drain_all, where every node |
| 668 | * will be drained separately, so the drain only needs to be propagated to |
| 669 | * non-BDS parents. */ |
| 670 | bool parent_is_bds; |
| 671 | |
Kevin Wolf | 8e2160e | 2015-04-29 17:29:39 +0200 | [diff] [blame] | 672 | void (*inherit_options)(int *child_flags, QDict *child_options, |
| 673 | int parent_flags, QDict *parent_options); |
Kevin Wolf | c2066af | 2016-03-22 12:05:35 +0100 | [diff] [blame] | 674 | |
Kevin Wolf | 5c8cab4 | 2016-02-24 15:13:35 +0100 | [diff] [blame] | 675 | void (*change_media)(BdrvChild *child, bool load); |
| 676 | void (*resize)(BdrvChild *child); |
| 677 | |
Kevin Wolf | 4c265bf | 2016-02-26 10:22:16 +0100 | [diff] [blame] | 678 | /* Returns a name that is supposedly more useful for human users than the |
| 679 | * node name for identifying the node in question (in particular, a BB |
| 680 | * name), or NULL if the parent can't provide a better name. */ |
Klim Kireev | d4a7f45 | 2017-04-05 18:18:24 +0300 | [diff] [blame] | 681 | const char *(*get_name)(BdrvChild *child); |
Kevin Wolf | 4c265bf | 2016-02-26 10:22:16 +0100 | [diff] [blame] | 682 | |
Kevin Wolf | b541155 | 2017-01-17 15:56:16 +0100 | [diff] [blame] | 683 | /* Returns a malloced string that describes the parent of the child for a |
| 684 | * human reader. This could be a node-name, BlockBackend name, qdev ID or |
| 685 | * QOM path of the device owning the BlockBackend, job type and ID etc. The |
| 686 | * caller is responsible for freeing the memory. */ |
Klim Kireev | d4a7f45 | 2017-04-05 18:18:24 +0300 | [diff] [blame] | 687 | char *(*get_parent_desc)(BdrvChild *child); |
Kevin Wolf | b541155 | 2017-01-17 15:56:16 +0100 | [diff] [blame] | 688 | |
Kevin Wolf | c2066af | 2016-03-22 12:05:35 +0100 | [diff] [blame] | 689 | /* |
| 690 | * If this pair of functions is implemented, the parent doesn't issue new |
| 691 | * requests after returning from .drained_begin() until .drained_end() is |
| 692 | * called. |
| 693 | * |
Kevin Wolf | 4be6a6d | 2018-06-29 18:01:31 +0200 | [diff] [blame] | 694 | * These functions must not change the graph (and therefore also must not |
| 695 | * call aio_poll(), which could change the graph indirectly). |
| 696 | * |
Max Reitz | e037c09 | 2019-07-19 11:26:14 +0200 | [diff] [blame] | 697 | * If drained_end() schedules background operations, it must atomically |
| 698 | * increment *drained_end_counter for each such operation and atomically |
| 699 | * decrement it once the operation has settled. |
| 700 | * |
Kevin Wolf | c2066af | 2016-03-22 12:05:35 +0100 | [diff] [blame] | 701 | * Note that this can be nested. If drained_begin() was called twice, new |
| 702 | * I/O is allowed only after drained_end() was called twice, too. |
| 703 | */ |
| 704 | void (*drained_begin)(BdrvChild *child); |
Max Reitz | e037c09 | 2019-07-19 11:26:14 +0200 | [diff] [blame] | 705 | void (*drained_end)(BdrvChild *child, int *drained_end_counter); |
Kevin Wolf | db95dbb | 2017-02-08 11:28:52 +0100 | [diff] [blame] | 706 | |
Kevin Wolf | 89bd030 | 2018-03-22 14:11:20 +0100 | [diff] [blame] | 707 | /* |
| 708 | * Returns whether the parent has pending requests for the child. This |
| 709 | * callback is polled after .drained_begin() has been called until all |
| 710 | * activity on the child has stopped. |
| 711 | */ |
| 712 | bool (*drained_poll)(BdrvChild *child); |
| 713 | |
Kevin Wolf | cfa1a57 | 2017-05-04 18:52:38 +0200 | [diff] [blame] | 714 | /* Notifies the parent that the child has been activated/inactivated (e.g. |
| 715 | * when migration is completing) and it can start/stop requesting |
| 716 | * permissions and doing I/O on it. */ |
Kevin Wolf | 4417ab7 | 2017-05-04 18:52:37 +0200 | [diff] [blame] | 717 | void (*activate)(BdrvChild *child, Error **errp); |
Kevin Wolf | cfa1a57 | 2017-05-04 18:52:38 +0200 | [diff] [blame] | 718 | int (*inactivate)(BdrvChild *child); |
Kevin Wolf | 4417ab7 | 2017-05-04 18:52:37 +0200 | [diff] [blame] | 719 | |
Kevin Wolf | db95dbb | 2017-02-08 11:28:52 +0100 | [diff] [blame] | 720 | void (*attach)(BdrvChild *child); |
| 721 | void (*detach)(BdrvChild *child); |
Kevin Wolf | 6858eba | 2017-06-29 19:32:21 +0200 | [diff] [blame] | 722 | |
| 723 | /* Notifies the parent that the filename of its child has changed (e.g. |
| 724 | * because the direct child was removed from the backing chain), so that it |
| 725 | * can update its reference. */ |
| 726 | int (*update_filename)(BdrvChild *child, BlockDriverState *new_base, |
| 727 | const char *filename, Error **errp); |
Kevin Wolf | 5d23184 | 2019-05-06 19:17:56 +0200 | [diff] [blame] | 728 | |
| 729 | bool (*can_set_aio_ctx)(BdrvChild *child, AioContext *ctx, |
| 730 | GSList **ignore, Error **errp); |
Kevin Wolf | 53a7d04 | 2019-05-06 19:17:59 +0200 | [diff] [blame] | 731 | void (*set_aio_ctx)(BdrvChild *child, AioContext *ctx, GSList **ignore); |
Kevin Wolf | f3930ed | 2015-04-08 13:43:47 +0200 | [diff] [blame] | 732 | }; |
| 733 | |
| 734 | extern const BdrvChildRole child_file; |
| 735 | extern const BdrvChildRole child_format; |
Kevin Wolf | 91ef382 | 2016-12-20 16:23:46 +0100 | [diff] [blame] | 736 | extern const BdrvChildRole child_backing; |
Kevin Wolf | f3930ed | 2015-04-08 13:43:47 +0200 | [diff] [blame] | 737 | |
Kevin Wolf | b4b059f | 2015-06-15 13:24:19 +0200 | [diff] [blame] | 738 | struct BdrvChild { |
Kevin Wolf | 6e93e7c | 2015-04-08 13:49:41 +0200 | [diff] [blame] | 739 | BlockDriverState *bs; |
Kevin Wolf | 260fecf | 2015-04-27 13:46:22 +0200 | [diff] [blame] | 740 | char *name; |
Kevin Wolf | 6e93e7c | 2015-04-08 13:49:41 +0200 | [diff] [blame] | 741 | const BdrvChildRole *role; |
Kevin Wolf | 22aa8b2 | 2016-02-24 15:13:35 +0100 | [diff] [blame] | 742 | void *opaque; |
Kevin Wolf | d5e6f43 | 2016-12-14 17:24:36 +0100 | [diff] [blame] | 743 | |
| 744 | /** |
| 745 | * Granted permissions for operating on this BdrvChild (BLK_PERM_* bitmask) |
| 746 | */ |
| 747 | uint64_t perm; |
| 748 | |
| 749 | /** |
| 750 | * Permissions that can still be granted to other users of @bs while this |
| 751 | * BdrvChild is still attached to it. (BLK_PERM_* bitmask) |
| 752 | */ |
| 753 | uint64_t shared_perm; |
| 754 | |
Vladimir Sementsov-Ogievskiy | f962e96 | 2019-02-23 22:20:40 +0300 | [diff] [blame] | 755 | /* backup of permissions during permission update procedure */ |
| 756 | bool has_backup_perm; |
| 757 | uint64_t backup_perm; |
| 758 | uint64_t backup_shared_perm; |
| 759 | |
Alberto Garcia | 2cad1eb | 2019-03-12 18:48:40 +0200 | [diff] [blame] | 760 | /* |
| 761 | * This link is frozen: the child can neither be replaced nor |
| 762 | * detached from the parent. |
| 763 | */ |
| 764 | bool frozen; |
| 765 | |
Max Reitz | 804db8e | 2019-07-19 11:26:09 +0200 | [diff] [blame] | 766 | /* |
| 767 | * How many times the parent of this child has been drained |
| 768 | * (through role->drained_*). |
| 769 | * Usually, this is equal to bs->quiesce_counter (potentially |
| 770 | * reduced by bdrv_drain_all_count). It may differ while the |
| 771 | * child is entering or leaving a drained section. |
| 772 | */ |
| 773 | int parent_quiesce_counter; |
| 774 | |
Kevin Wolf | 6e93e7c | 2015-04-08 13:49:41 +0200 | [diff] [blame] | 775 | QLIST_ENTRY(BdrvChild) next; |
Kevin Wolf | d42a8a9 | 2015-09-17 13:18:23 +0200 | [diff] [blame] | 776 | QLIST_ENTRY(BdrvChild) next_parent; |
Kevin Wolf | b4b059f | 2015-06-15 13:24:19 +0200 | [diff] [blame] | 777 | }; |
Kevin Wolf | 6e93e7c | 2015-04-08 13:49:41 +0200 | [diff] [blame] | 778 | |
Jeff Cody | 8802d1f | 2012-02-28 15:54:06 -0500 | [diff] [blame] | 779 | /* |
| 780 | * Note: the function bdrv_append() copies and swaps contents of |
| 781 | * BlockDriverStates, so if you add new fields to this struct, please |
| 782 | * inspect bdrv_append() to determine if the new fields need to be |
| 783 | * copied as well. |
| 784 | */ |
bellard | ea2384d | 2004-08-01 21:59:26 +0000 | [diff] [blame] | 785 | struct BlockDriverState { |
Paolo Bonzini | 91bcea4 | 2017-02-13 14:52:35 +0100 | [diff] [blame] | 786 | /* Protected by big QEMU lock or read-only after opening. No special |
| 787 | * locking needed during I/O... |
| 788 | */ |
Naphtali Sprei | 4dca4b6 | 2010-02-14 13:39:18 +0200 | [diff] [blame] | 789 | int open_flags; /* flags used to open the file, re-used for re-open */ |
Eric Blake | 5411541 | 2016-06-23 16:37:26 -0600 | [diff] [blame] | 790 | bool read_only; /* if true, the media is read only */ |
| 791 | bool encrypted; /* if true, the media is encrypted */ |
Eric Blake | 5411541 | 2016-06-23 16:37:26 -0600 | [diff] [blame] | 792 | bool sg; /* if true, the device is a /dev/sg* */ |
| 793 | bool probed; /* if true, format was probed rather than specified */ |
Fam Zheng | 5a9347c | 2017-05-03 00:35:37 +0800 | [diff] [blame] | 794 | bool force_share; /* if true, always allow all shared permissions */ |
Kevin Wolf | d3c8c67 | 2017-07-18 17:24:05 +0200 | [diff] [blame] | 795 | bool implicit; /* if true, this filter node was automatically inserted */ |
Eric Blake | 5411541 | 2016-06-23 16:37:26 -0600 | [diff] [blame] | 796 | |
bellard | 19cb373 | 2006-08-19 11:45:59 +0000 | [diff] [blame] | 797 | BlockDriver *drv; /* NULL means no media */ |
bellard | ea2384d | 2004-08-01 21:59:26 +0000 | [diff] [blame] | 798 | void *opaque; |
| 799 | |
Stefan Hajnoczi | dcd0422 | 2014-05-08 16:34:37 +0200 | [diff] [blame] | 800 | AioContext *aio_context; /* event loop used for fd handlers, timers, etc */ |
Max Reitz | 3338442 | 2014-06-20 21:57:33 +0200 | [diff] [blame] | 801 | /* long-running tasks intended to always use the same AioContext as this |
| 802 | * BDS may register themselves in this list to be notified of changes |
| 803 | * regarding this BDS's context */ |
| 804 | QLIST_HEAD(, BdrvAioNotifier) aio_notifiers; |
Stefan Hajnoczi | e8a095d | 2016-06-16 17:56:26 +0100 | [diff] [blame] | 805 | bool walking_aio_notifiers; /* to make removal during iteration safe */ |
Stefan Hajnoczi | dcd0422 | 2014-05-08 16:34:37 +0200 | [diff] [blame] | 806 | |
Jeff Cody | 9a29e18 | 2015-01-22 08:03:30 -0500 | [diff] [blame] | 807 | char filename[PATH_MAX]; |
| 808 | char backing_file[PATH_MAX]; /* if non zero, the image is a diff of |
| 809 | this file image */ |
Max Reitz | 998c201 | 2019-02-01 20:29:08 +0100 | [diff] [blame] | 810 | /* The backing filename indicated by the image header; if we ever |
| 811 | * open this file, then this is replaced by the resulting BDS's |
| 812 | * filename (i.e. after a bdrv_refresh_filename() run). */ |
| 813 | char auto_backing_file[PATH_MAX]; |
aliguori | 5eb4563 | 2009-03-28 17:55:10 +0000 | [diff] [blame] | 814 | char backing_format[16]; /* if non-zero and backing_file exists */ |
bellard | 19cb373 | 2006-08-19 11:45:59 +0000 | [diff] [blame] | 815 | |
Max Reitz | 91af701 | 2014-07-18 20:24:56 +0200 | [diff] [blame] | 816 | QDict *full_open_options; |
Jeff Cody | 9a29e18 | 2015-01-22 08:03:30 -0500 | [diff] [blame] | 817 | char exact_filename[PATH_MAX]; |
Max Reitz | 91af701 | 2014-07-18 20:24:56 +0200 | [diff] [blame] | 818 | |
Kevin Wolf | 760e006 | 2015-06-17 14:55:21 +0200 | [diff] [blame] | 819 | BdrvChild *backing; |
Kevin Wolf | 9a4f4c3 | 2015-06-16 14:19:22 +0200 | [diff] [blame] | 820 | BdrvChild *file; |
Kevin Wolf | 66f82ce | 2010-04-14 14:17:38 +0200 | [diff] [blame] | 821 | |
Peter Lieven | fe81c2c | 2013-10-24 12:06:56 +0200 | [diff] [blame] | 822 | /* I/O Limits */ |
| 823 | BlockLimits bl; |
| 824 | |
Max Reitz | c1e3489 | 2018-05-02 16:03:59 +0200 | [diff] [blame] | 825 | /* Flags honored during pwrite (so far: BDRV_REQ_FUA, |
| 826 | * BDRV_REQ_WRITE_UNCHANGED). |
| 827 | * If a driver does not support BDRV_REQ_WRITE_UNCHANGED, those |
| 828 | * writes will be issued as normal writes without the flag set. |
| 829 | * This is important to note for drivers that do not explicitly |
| 830 | * request a WRITE permission for their children and instead take |
| 831 | * the same permissions as their parent did (this is commonly what |
| 832 | * block filters do). Such drivers have to be aware that the |
| 833 | * parent may have taken a WRITE_UNCHANGED permission only and is |
| 834 | * issuing such requests. Drivers either must make sure that |
| 835 | * these requests do not result in plain WRITE accesses (usually |
| 836 | * by supporting BDRV_REQ_WRITE_UNCHANGED, and then forwarding |
| 837 | * every incoming write request as-is, including potentially that |
| 838 | * flag), or they have to explicitly take the WRITE permission for |
| 839 | * their children. */ |
Eric Blake | 4df863f | 2016-05-03 16:39:06 -0600 | [diff] [blame] | 840 | unsigned int supported_write_flags; |
Eric Blake | d05aa8b | 2016-06-01 15:10:03 -0600 | [diff] [blame] | 841 | /* Flags honored during pwrite_zeroes (so far: BDRV_REQ_FUA, |
Max Reitz | c1e3489 | 2018-05-02 16:03:59 +0200 | [diff] [blame] | 842 | * BDRV_REQ_MAY_UNMAP, BDRV_REQ_WRITE_UNCHANGED) */ |
Eric Blake | 465fe88 | 2016-05-03 16:39:07 -0600 | [diff] [blame] | 843 | unsigned int supported_zero_flags; |
Paolo Bonzini | c25f53b | 2011-11-29 12:42:20 +0100 | [diff] [blame] | 844 | |
Benoît Canet | dc364f4 | 2014-01-23 21:31:32 +0100 | [diff] [blame] | 845 | /* the following member gives a name to every node on the bs graph. */ |
| 846 | char node_name[32]; |
| 847 | /* element of the list of named nodes building the graph */ |
| 848 | QTAILQ_ENTRY(BlockDriverState) node_list; |
Max Reitz | 2c1d04e | 2016-01-29 16:36:11 +0100 | [diff] [blame] | 849 | /* element of the list of all BlockDriverStates (all_bdrv_states) */ |
| 850 | QTAILQ_ENTRY(BlockDriverState) bs_list; |
Max Reitz | 9c4218e | 2016-01-29 16:36:12 +0100 | [diff] [blame] | 851 | /* element of the list of monitor-owned BDS */ |
| 852 | QTAILQ_ENTRY(BlockDriverState) monitor_list; |
Fam Zheng | 9fcb025 | 2013-08-23 09:14:46 +0800 | [diff] [blame] | 853 | int refcnt; |
Stefan Hajnoczi | dbffbdc | 2011-11-17 13:40:27 +0000 | [diff] [blame] | 854 | |
Fam Zheng | fbe40ff | 2014-05-23 21:29:42 +0800 | [diff] [blame] | 855 | /* operation blockers */ |
| 856 | QLIST_HEAD(, BdrvOpBlocker) op_blockers[BLOCK_OP_TYPE_MAX]; |
| 857 | |
Kevin Wolf | bddcec3 | 2015-04-09 18:47:50 +0200 | [diff] [blame] | 858 | /* The node that this node inherited default options from (and a reopen on |
| 859 | * which can affect this node by changing these defaults). This is always a |
| 860 | * parent node of this node. */ |
| 861 | BlockDriverState *inherits_from; |
Kevin Wolf | 6e93e7c | 2015-04-08 13:49:41 +0200 | [diff] [blame] | 862 | QLIST_HEAD(, BdrvChild) children; |
Kevin Wolf | d42a8a9 | 2015-09-17 13:18:23 +0200 | [diff] [blame] | 863 | QLIST_HEAD(, BdrvChild) parents; |
Kevin Wolf | 6e93e7c | 2015-04-08 13:49:41 +0200 | [diff] [blame] | 864 | |
Kevin Wolf | de9c0ce | 2013-03-15 10:35:02 +0100 | [diff] [blame] | 865 | QDict *options; |
Kevin Wolf | 145f598 | 2015-05-08 16:15:03 +0200 | [diff] [blame] | 866 | QDict *explicit_options; |
Peter Lieven | 465bee1 | 2014-05-18 00:58:19 +0200 | [diff] [blame] | 867 | BlockdevDetectZeroesOptions detect_zeroes; |
Fam Zheng | 826b6ca | 2014-05-23 21:29:47 +0800 | [diff] [blame] | 868 | |
| 869 | /* The error object in use for blocking operations on backing_hd */ |
| 870 | Error *backing_blocker; |
Francesco Romani | e246211 | 2015-01-12 14:11:13 +0100 | [diff] [blame] | 871 | |
Paolo Bonzini | 91bcea4 | 2017-02-13 14:52:35 +0100 | [diff] [blame] | 872 | /* Protected by AioContext lock */ |
| 873 | |
Paolo Bonzini | 91bcea4 | 2017-02-13 14:52:35 +0100 | [diff] [blame] | 874 | /* If we are reading a disk image, give its size in sectors. |
Juan Quintela | 5e22479 | 2017-04-20 14:25:55 +0200 | [diff] [blame] | 875 | * Generally read-only; it is written to by load_snapshot and |
| 876 | * save_snaphost, but the block layer is quiescent during those. |
Paolo Bonzini | 91bcea4 | 2017-02-13 14:52:35 +0100 | [diff] [blame] | 877 | */ |
| 878 | int64_t total_sectors; |
| 879 | |
| 880 | /* Callback before write request is processed */ |
| 881 | NotifierWithReturnList before_write_notifiers; |
| 882 | |
Francesco Romani | e246211 | 2015-01-12 14:11:13 +0100 | [diff] [blame] | 883 | /* threshold limit for writes, in bytes. "High water mark". */ |
| 884 | uint64_t write_threshold_offset; |
| 885 | NotifierWithReturn write_threshold_notifier; |
Fam Zheng | 51288d7 | 2015-10-23 11:08:09 +0800 | [diff] [blame] | 886 | |
Paolo Bonzini | 2119882 | 2017-06-05 14:39:03 +0200 | [diff] [blame] | 887 | /* Writing to the list requires the BQL _and_ the dirty_bitmap_mutex. |
| 888 | * Reading from the list can be done with either the BQL or the |
Paolo Bonzini | b64bd51 | 2017-06-05 14:39:05 +0200 | [diff] [blame] | 889 | * dirty_bitmap_mutex. Modifying a bitmap only requires |
| 890 | * dirty_bitmap_mutex. */ |
Paolo Bonzini | 2119882 | 2017-06-05 14:39:03 +0200 | [diff] [blame] | 891 | QemuMutex dirty_bitmap_mutex; |
Paolo Bonzini | 91bcea4 | 2017-02-13 14:52:35 +0100 | [diff] [blame] | 892 | QLIST_HEAD(, BdrvDirtyBitmap) dirty_bitmaps; |
| 893 | |
Paolo Bonzini | f7946da | 2017-06-05 14:39:00 +0200 | [diff] [blame] | 894 | /* Offset after the highest byte written to */ |
| 895 | Stat64 wr_highest_offset; |
| 896 | |
Paolo Bonzini | d3faa13 | 2017-06-05 14:38:50 +0200 | [diff] [blame] | 897 | /* If true, copy read backing sectors into image. Can be >1 if more |
| 898 | * than one client has requested copy-on-read. Accessed with atomic |
| 899 | * ops. |
| 900 | */ |
| 901 | int copy_on_read; |
| 902 | |
Paolo Bonzini | 20fc71b | 2017-06-05 14:38:53 +0200 | [diff] [blame] | 903 | /* number of in-flight requests; overall and serialising. |
| 904 | * Accessed with atomic ops. |
| 905 | */ |
| 906 | unsigned int in_flight; |
| 907 | unsigned int serialising_in_flight; |
| 908 | |
Paolo Bonzini | 850d54a | 2017-06-05 14:38:55 +0200 | [diff] [blame] | 909 | /* counter for nested bdrv_io_plug. |
| 910 | * Accessed with atomic ops. |
| 911 | */ |
| 912 | unsigned io_plugged; |
| 913 | |
Paolo Bonzini | 91bcea4 | 2017-02-13 14:52:35 +0100 | [diff] [blame] | 914 | /* do we need to tell the quest if we have a volatile write cache? */ |
| 915 | int enable_write_cache; |
| 916 | |
Paolo Bonzini | 414c2ec | 2017-06-05 14:38:51 +0200 | [diff] [blame] | 917 | /* Accessed with atomic ops. */ |
Fam Zheng | 51288d7 | 2015-10-23 11:08:09 +0800 | [diff] [blame] | 918 | int quiesce_counter; |
Kevin Wolf | d736f11 | 2017-12-18 16:05:48 +0100 | [diff] [blame] | 919 | int recursive_quiesce_counter; |
| 920 | |
Paolo Bonzini | 47fec59 | 2017-06-05 14:39:01 +0200 | [diff] [blame] | 921 | unsigned int write_gen; /* Current data generation */ |
Paolo Bonzini | 3783fa3 | 2017-06-05 14:39:02 +0200 | [diff] [blame] | 922 | |
| 923 | /* Protected by reqs_lock. */ |
| 924 | CoMutex reqs_lock; |
| 925 | QLIST_HEAD(, BdrvTrackedRequest) tracked_requests; |
| 926 | CoQueue flush_queue; /* Serializing flush queue */ |
| 927 | bool active_flush_req; /* Flush request in flight? */ |
| 928 | |
| 929 | /* Only read/written by whoever has set active_flush_req to true. */ |
| 930 | unsigned int flushed_gen; /* Flushed write generation */ |
Max Reitz | e5182c1 | 2019-07-03 19:28:02 +0200 | [diff] [blame] | 931 | |
| 932 | /* BdrvChild links to this node may never be frozen */ |
| 933 | bool never_freeze; |
bellard | ea2384d | 2004-08-01 21:59:26 +0000 | [diff] [blame] | 934 | }; |
| 935 | |
Max Reitz | 281d22d | 2015-10-19 17:53:24 +0200 | [diff] [blame] | 936 | struct BlockBackendRootState { |
| 937 | int open_flags; |
| 938 | bool read_only; |
| 939 | BlockdevDetectZeroesOptions detect_zeroes; |
Max Reitz | 281d22d | 2015-10-19 17:53:24 +0200 | [diff] [blame] | 940 | }; |
| 941 | |
Max Reitz | 274fcce | 2016-06-10 20:57:47 +0200 | [diff] [blame] | 942 | typedef enum BlockMirrorBackingMode { |
| 943 | /* Reuse the existing backing chain from the source for the target. |
| 944 | * - sync=full: Set backing BDS to NULL. |
| 945 | * - sync=top: Use source's backing BDS. |
| 946 | * - sync=none: Use source as the backing BDS. */ |
| 947 | MIRROR_SOURCE_BACKING_CHAIN, |
| 948 | |
| 949 | /* Open the target's backing chain completely anew */ |
| 950 | MIRROR_OPEN_BACKING_CHAIN, |
| 951 | |
| 952 | /* Do not change the target's backing BDS after job completion */ |
| 953 | MIRROR_LEAVE_BACKING_CHAIN, |
| 954 | } BlockMirrorBackingMode; |
| 955 | |
Kevin Wolf | 760e006 | 2015-06-17 14:55:21 +0200 | [diff] [blame] | 956 | static inline BlockDriverState *backing_bs(BlockDriverState *bs) |
| 957 | { |
| 958 | return bs->backing ? bs->backing->bs : NULL; |
| 959 | } |
| 960 | |
Max Reitz | 5f535a9 | 2014-12-02 18:32:41 +0100 | [diff] [blame] | 961 | |
| 962 | /* Essential block drivers which must always be statically linked into qemu, and |
| 963 | * which therefore can be accessed without using bdrv_find_format() */ |
| 964 | extern BlockDriver bdrv_file; |
| 965 | extern BlockDriver bdrv_raw; |
| 966 | extern BlockDriver bdrv_qcow2; |
| 967 | |
Kevin Wolf | a03ef88 | 2016-06-20 21:31:46 +0200 | [diff] [blame] | 968 | int coroutine_fn bdrv_co_preadv(BdrvChild *child, |
Kevin Wolf | 1bf1cbc | 2016-03-08 13:47:47 +0100 | [diff] [blame] | 969 | int64_t offset, unsigned int bytes, QEMUIOVector *qiov, |
| 970 | BdrvRequestFlags flags); |
Vladimir Sementsov-Ogievskiy | 1acc346 | 2019-06-04 19:15:11 +0300 | [diff] [blame] | 971 | int coroutine_fn bdrv_co_preadv_part(BdrvChild *child, |
| 972 | int64_t offset, unsigned int bytes, |
| 973 | QEMUIOVector *qiov, size_t qiov_offset, BdrvRequestFlags flags); |
Kevin Wolf | a03ef88 | 2016-06-20 21:31:46 +0200 | [diff] [blame] | 974 | int coroutine_fn bdrv_co_pwritev(BdrvChild *child, |
Kevin Wolf | a8823a3 | 2016-03-08 13:47:48 +0100 | [diff] [blame] | 975 | int64_t offset, unsigned int bytes, QEMUIOVector *qiov, |
| 976 | BdrvRequestFlags flags); |
Vladimir Sementsov-Ogievskiy | 1acc346 | 2019-06-04 19:15:11 +0300 | [diff] [blame] | 977 | int coroutine_fn bdrv_co_pwritev_part(BdrvChild *child, |
| 978 | int64_t offset, unsigned int bytes, |
| 979 | QEMUIOVector *qiov, size_t qiov_offset, BdrvRequestFlags flags); |
Kevin Wolf | 1bf1cbc | 2016-03-08 13:47:47 +0100 | [diff] [blame] | 980 | |
Vladimir Sementsov-Ogievskiy | 371420e | 2019-04-22 17:58:30 +0300 | [diff] [blame] | 981 | static inline int coroutine_fn bdrv_co_pread(BdrvChild *child, |
| 982 | int64_t offset, unsigned int bytes, void *buf, BdrvRequestFlags flags) |
| 983 | { |
| 984 | QEMUIOVector qiov = QEMU_IOVEC_INIT_BUF(qiov, buf, bytes); |
| 985 | |
| 986 | return bdrv_co_preadv(child, offset, bytes, &qiov, flags); |
| 987 | } |
| 988 | |
| 989 | static inline int coroutine_fn bdrv_co_pwrite(BdrvChild *child, |
| 990 | int64_t offset, unsigned int bytes, void *buf, BdrvRequestFlags flags) |
| 991 | { |
| 992 | QEMUIOVector qiov = QEMU_IOVEC_INIT_BUF(qiov, buf, bytes); |
| 993 | |
| 994 | return bdrv_co_pwritev(child, offset, bytes, &qiov, flags); |
| 995 | } |
| 996 | |
Kevin Wolf | 0f12264 | 2018-03-28 18:29:18 +0200 | [diff] [blame] | 997 | extern unsigned int bdrv_drain_all_count; |
Kevin Wolf | d736f11 | 2017-12-18 16:05:48 +0100 | [diff] [blame] | 998 | void bdrv_apply_subtree_drain(BdrvChild *child, BlockDriverState *new_parent); |
| 999 | void bdrv_unapply_subtree_drain(BdrvChild *child, BlockDriverState *old_parent); |
| 1000 | |
Paolo Bonzini | 18fbd0d | 2020-01-08 15:55:55 +0100 | [diff] [blame] | 1001 | bool coroutine_fn bdrv_mark_request_serialising(BdrvTrackedRequest *req, uint64_t align); |
Max Reitz | c28107e | 2019-11-01 16:25:09 +0100 | [diff] [blame] | 1002 | BdrvTrackedRequest *coroutine_fn bdrv_co_get_self_request(BlockDriverState *bs); |
Max Reitz | 304d9d7 | 2019-11-01 16:25:08 +0100 | [diff] [blame] | 1003 | |
Jim Meyering | eba2505 | 2012-05-28 09:27:54 +0200 | [diff] [blame] | 1004 | int get_tmp_filename(char *filename, int size); |
Kevin Wolf | 38f3ef5 | 2014-11-20 16:27:12 +0100 | [diff] [blame] | 1005 | BlockDriver *bdrv_probe_all(const uint8_t *buf, int buf_size, |
| 1006 | const char *filename); |
bellard | 95389c8 | 2005-12-18 18:28:15 +0000 | [diff] [blame] | 1007 | |
Max Reitz | 03c320d | 2017-05-22 21:52:16 +0200 | [diff] [blame] | 1008 | void bdrv_parse_filename_strip_prefix(const char *filename, const char *prefix, |
| 1009 | QDict *options); |
| 1010 | |
Zhi Yong Wu | 0563e19 | 2011-11-03 16:57:25 +0800 | [diff] [blame] | 1011 | |
Stefan Hajnoczi | 85d126f | 2013-03-07 13:41:48 +0100 | [diff] [blame] | 1012 | /** |
Stefan Hajnoczi | d616b22 | 2013-06-24 17:13:10 +0200 | [diff] [blame] | 1013 | * bdrv_add_before_write_notifier: |
| 1014 | * |
| 1015 | * Register a callback that is invoked before write requests are processed but |
| 1016 | * after any throttling or waiting for overlapping requests. |
| 1017 | */ |
| 1018 | void bdrv_add_before_write_notifier(BlockDriverState *bs, |
| 1019 | NotifierWithReturn *notifier); |
| 1020 | |
| 1021 | /** |
Max Reitz | 3338442 | 2014-06-20 21:57:33 +0200 | [diff] [blame] | 1022 | * bdrv_add_aio_context_notifier: |
| 1023 | * |
| 1024 | * If a long-running job intends to be always run in the same AioContext as a |
| 1025 | * certain BDS, it may use this function to be notified of changes regarding the |
| 1026 | * association of the BDS to an AioContext. |
| 1027 | * |
| 1028 | * attached_aio_context() is called after the target BDS has been attached to a |
| 1029 | * new AioContext; detach_aio_context() is called before the target BDS is being |
| 1030 | * detached from its old AioContext. |
| 1031 | */ |
| 1032 | void bdrv_add_aio_context_notifier(BlockDriverState *bs, |
| 1033 | void (*attached_aio_context)(AioContext *new_context, void *opaque), |
| 1034 | void (*detach_aio_context)(void *opaque), void *opaque); |
| 1035 | |
| 1036 | /** |
| 1037 | * bdrv_remove_aio_context_notifier: |
| 1038 | * |
| 1039 | * Unsubscribe of change notifications regarding the BDS's AioContext. The |
| 1040 | * parameters given here have to be the same as those given to |
| 1041 | * bdrv_add_aio_context_notifier(). |
| 1042 | */ |
| 1043 | void bdrv_remove_aio_context_notifier(BlockDriverState *bs, |
| 1044 | void (*aio_context_attached)(AioContext *, |
| 1045 | void *), |
| 1046 | void (*aio_context_detached)(void *), |
| 1047 | void *opaque); |
| 1048 | |
Paolo Bonzini | c9d1a56 | 2016-10-27 12:49:05 +0200 | [diff] [blame] | 1049 | /** |
| 1050 | * bdrv_wakeup: |
| 1051 | * @bs: The BlockDriverState for which an I/O operation has been completed. |
| 1052 | * |
| 1053 | * Wake up the main thread if it is waiting on BDRV_POLL_WHILE. During |
| 1054 | * synchronous I/O on a BlockDriverState that is attached to another |
| 1055 | * I/O thread, the main thread lets the I/O thread's event loop run, |
| 1056 | * waiting for the I/O operation to complete. A bdrv_wakeup will wake |
| 1057 | * up the main thread if necessary. |
| 1058 | * |
| 1059 | * Manual calls to bdrv_wakeup are rarely necessary, because |
| 1060 | * bdrv_dec_in_flight already calls it. |
| 1061 | */ |
| 1062 | void bdrv_wakeup(BlockDriverState *bs); |
| 1063 | |
Christoph Hellwig | 508c7cb | 2009-06-15 14:04:22 +0200 | [diff] [blame] | 1064 | #ifdef _WIN32 |
| 1065 | int is_windows_drive(const char *filename); |
| 1066 | #endif |
| 1067 | |
Paolo Bonzini | dc534f8 | 2012-03-30 13:17:13 +0200 | [diff] [blame] | 1068 | /** |
Paolo Bonzini | dc534f8 | 2012-03-30 13:17:13 +0200 | [diff] [blame] | 1069 | * stream_start: |
Alberto Garcia | 2323322 | 2016-07-05 17:28:59 +0300 | [diff] [blame] | 1070 | * @job_id: The id of the newly-created job, or %NULL to use the |
| 1071 | * device name of @bs. |
Paolo Bonzini | dc534f8 | 2012-03-30 13:17:13 +0200 | [diff] [blame] | 1072 | * @bs: Block device to operate on. |
| 1073 | * @base: Block device that will become the new base, or %NULL to |
| 1074 | * flatten the whole backing file chain onto @bs. |
Alberto Garcia | 2933800 | 2016-07-05 17:28:52 +0300 | [diff] [blame] | 1075 | * @backing_file_str: The file name that will be written to @bs as the |
| 1076 | * the new backing file if the job completes. Ignored if @base is %NULL. |
John Snow | cf6320d | 2018-09-06 09:02:12 -0400 | [diff] [blame] | 1077 | * @creation_flags: Flags that control the behavior of the Job lifetime. |
| 1078 | * See @BlockJobCreateFlags |
Stefan Hajnoczi | c83c66c | 2012-04-25 16:51:03 +0100 | [diff] [blame] | 1079 | * @speed: The maximum speed, in bytes per second, or 0 for unlimited. |
Paolo Bonzini | 1d80909 | 2012-09-28 17:22:59 +0200 | [diff] [blame] | 1080 | * @on_error: The action to take upon error. |
Stefan Hajnoczi | fd7f8c6 | 2012-04-25 16:51:00 +0100 | [diff] [blame] | 1081 | * @errp: Error object. |
Paolo Bonzini | dc534f8 | 2012-03-30 13:17:13 +0200 | [diff] [blame] | 1082 | * |
| 1083 | * Start a streaming operation on @bs. Clusters that are unallocated |
| 1084 | * in @bs, but allocated in any image between @base and @bs (both |
| 1085 | * exclusive) will be written to @bs. At the end of a successful |
| 1086 | * streaming job, the backing file of @bs will be changed to |
Alberto Garcia | 2933800 | 2016-07-05 17:28:52 +0300 | [diff] [blame] | 1087 | * @backing_file_str in the written image and to @base in the live |
| 1088 | * BlockDriverState. |
Paolo Bonzini | dc534f8 | 2012-03-30 13:17:13 +0200 | [diff] [blame] | 1089 | */ |
Alberto Garcia | 2323322 | 2016-07-05 17:28:59 +0300 | [diff] [blame] | 1090 | void stream_start(const char *job_id, BlockDriverState *bs, |
| 1091 | BlockDriverState *base, const char *backing_file_str, |
John Snow | cf6320d | 2018-09-06 09:02:12 -0400 | [diff] [blame] | 1092 | int creation_flags, int64_t speed, |
| 1093 | BlockdevOnError on_error, Error **errp); |
Stefan Hajnoczi | 4f1043b | 2012-01-18 14:40:44 +0000 | [diff] [blame] | 1094 | |
Jeff Cody | 747ff60 | 2012-09-27 13:29:13 -0400 | [diff] [blame] | 1095 | /** |
| 1096 | * commit_start: |
Alberto Garcia | fd62c60 | 2016-07-05 17:29:00 +0300 | [diff] [blame] | 1097 | * @job_id: The id of the newly-created job, or %NULL to use the |
| 1098 | * device name of @bs. |
Fam Zheng | 03544a6 | 2013-12-16 14:45:30 +0800 | [diff] [blame] | 1099 | * @bs: Active block device. |
| 1100 | * @top: Top block device to be committed. |
| 1101 | * @base: Block device that will be written into, and become the new top. |
John Snow | 5360782 | 2018-09-06 09:02:10 -0400 | [diff] [blame] | 1102 | * @creation_flags: Flags that control the behavior of the Job lifetime. |
| 1103 | * See @BlockJobCreateFlags |
Jeff Cody | 747ff60 | 2012-09-27 13:29:13 -0400 | [diff] [blame] | 1104 | * @speed: The maximum speed, in bytes per second, or 0 for unlimited. |
| 1105 | * @on_error: The action to take upon error. |
Jeff Cody | 54e2690 | 2014-06-25 15:40:10 -0400 | [diff] [blame] | 1106 | * @backing_file_str: String to use as the backing file in @top's overlay |
Kevin Wolf | 0db832f | 2017-02-20 18:10:05 +0100 | [diff] [blame] | 1107 | * @filter_node_name: The node name that should be assigned to the filter |
| 1108 | * driver that the commit job inserts into the graph above @top. NULL means |
| 1109 | * that a node name should be autogenerated. |
Jeff Cody | 747ff60 | 2012-09-27 13:29:13 -0400 | [diff] [blame] | 1110 | * @errp: Error object. |
| 1111 | * |
| 1112 | */ |
Alberto Garcia | fd62c60 | 2016-07-05 17:29:00 +0300 | [diff] [blame] | 1113 | void commit_start(const char *job_id, BlockDriverState *bs, |
John Snow | 5360782 | 2018-09-06 09:02:10 -0400 | [diff] [blame] | 1114 | BlockDriverState *base, BlockDriverState *top, |
| 1115 | int creation_flags, int64_t speed, |
John Snow | 8254b6d | 2016-10-27 12:06:58 -0400 | [diff] [blame] | 1116 | BlockdevOnError on_error, const char *backing_file_str, |
Kevin Wolf | 0db832f | 2017-02-20 18:10:05 +0100 | [diff] [blame] | 1117 | const char *filter_node_name, Error **errp); |
Fam Zheng | 03544a6 | 2013-12-16 14:45:30 +0800 | [diff] [blame] | 1118 | /** |
| 1119 | * commit_active_start: |
Alberto Garcia | fd62c60 | 2016-07-05 17:29:00 +0300 | [diff] [blame] | 1120 | * @job_id: The id of the newly-created job, or %NULL to use the |
| 1121 | * device name of @bs. |
Fam Zheng | 03544a6 | 2013-12-16 14:45:30 +0800 | [diff] [blame] | 1122 | * @bs: Active block device to be committed. |
| 1123 | * @base: Block device that will be written into, and become the new top. |
John Snow | 47970df | 2016-10-27 12:06:57 -0400 | [diff] [blame] | 1124 | * @creation_flags: Flags that control the behavior of the Job lifetime. |
| 1125 | * See @BlockJobCreateFlags |
Fam Zheng | 03544a6 | 2013-12-16 14:45:30 +0800 | [diff] [blame] | 1126 | * @speed: The maximum speed, in bytes per second, or 0 for unlimited. |
| 1127 | * @on_error: The action to take upon error. |
Kevin Wolf | 0db832f | 2017-02-20 18:10:05 +0100 | [diff] [blame] | 1128 | * @filter_node_name: The node name that should be assigned to the filter |
| 1129 | * driver that the commit job inserts into the graph above @bs. NULL means that |
| 1130 | * a node name should be autogenerated. |
Fam Zheng | 03544a6 | 2013-12-16 14:45:30 +0800 | [diff] [blame] | 1131 | * @cb: Completion function for the job. |
| 1132 | * @opaque: Opaque pointer value passed to @cb. |
Wen Congyang | b49f7ea | 2016-07-27 15:01:47 +0800 | [diff] [blame] | 1133 | * @auto_complete: Auto complete the job. |
Fam Zheng | 78bbd91 | 2017-04-21 20:27:04 +0800 | [diff] [blame] | 1134 | * @errp: Error object. |
Fam Zheng | 03544a6 | 2013-12-16 14:45:30 +0800 | [diff] [blame] | 1135 | * |
| 1136 | */ |
Vladimir Sementsov-Ogievskiy | cc19f17 | 2019-06-06 18:41:29 +0300 | [diff] [blame] | 1137 | BlockJob *commit_active_start(const char *job_id, BlockDriverState *bs, |
| 1138 | BlockDriverState *base, int creation_flags, |
| 1139 | int64_t speed, BlockdevOnError on_error, |
| 1140 | const char *filter_node_name, |
| 1141 | BlockCompletionFunc *cb, void *opaque, |
| 1142 | bool auto_complete, Error **errp); |
Paolo Bonzini | 893f7eb | 2012-10-18 16:49:23 +0200 | [diff] [blame] | 1143 | /* |
| 1144 | * mirror_start: |
Alberto Garcia | 71aa986 | 2016-07-05 17:28:57 +0300 | [diff] [blame] | 1145 | * @job_id: The id of the newly-created job, or %NULL to use the |
| 1146 | * device name of @bs. |
Paolo Bonzini | 893f7eb | 2012-10-18 16:49:23 +0200 | [diff] [blame] | 1147 | * @bs: Block device to operate on. |
| 1148 | * @target: Block device to write to. |
Benoît Canet | 09158f0 | 2014-06-27 18:25:25 +0200 | [diff] [blame] | 1149 | * @replaces: Block graph node name to replace once the mirror is done. Can |
| 1150 | * only be used when full mirroring is selected. |
John Snow | a1999b3 | 2018-09-06 09:02:11 -0400 | [diff] [blame] | 1151 | * @creation_flags: Flags that control the behavior of the Job lifetime. |
| 1152 | * See @BlockJobCreateFlags |
Paolo Bonzini | 893f7eb | 2012-10-18 16:49:23 +0200 | [diff] [blame] | 1153 | * @speed: The maximum speed, in bytes per second, or 0 for unlimited. |
Paolo Bonzini | eee13df | 2013-01-21 17:09:46 +0100 | [diff] [blame] | 1154 | * @granularity: The chosen granularity for the dirty bitmap. |
Paolo Bonzini | 08e4ed6 | 2013-01-22 09:03:13 +0100 | [diff] [blame] | 1155 | * @buf_size: The amount of data that can be in flight at one time. |
Paolo Bonzini | 893f7eb | 2012-10-18 16:49:23 +0200 | [diff] [blame] | 1156 | * @mode: Whether to collapse all images in the chain to the target. |
Max Reitz | 274fcce | 2016-06-10 20:57:47 +0200 | [diff] [blame] | 1157 | * @backing_mode: How to establish the target's backing chain after completion. |
Max Reitz | cdf3bc9 | 2019-07-24 19:12:30 +0200 | [diff] [blame] | 1158 | * @zero_target: Whether the target should be explicitly zero-initialized |
Paolo Bonzini | b952b55 | 2012-10-18 16:49:28 +0200 | [diff] [blame] | 1159 | * @on_source_error: The action to take upon error reading from the source. |
| 1160 | * @on_target_error: The action to take upon error writing to the target. |
Fam Zheng | 0fc9f8e | 2015-06-08 13:56:08 +0800 | [diff] [blame] | 1161 | * @unmap: Whether to unmap target where source sectors only contain zeroes. |
Kevin Wolf | 6cdbceb | 2017-02-20 18:10:05 +0100 | [diff] [blame] | 1162 | * @filter_node_name: The node name that should be assigned to the filter |
| 1163 | * driver that the mirror job inserts into the graph above @bs. NULL means that |
| 1164 | * a node name should be autogenerated. |
Max Reitz | 481deba | 2018-06-13 20:18:22 +0200 | [diff] [blame] | 1165 | * @copy_mode: When to trigger writes to the target. |
Paolo Bonzini | 893f7eb | 2012-10-18 16:49:23 +0200 | [diff] [blame] | 1166 | * @errp: Error object. |
| 1167 | * |
| 1168 | * Start a mirroring operation on @bs. Clusters that are allocated |
Yaowei Bai | e7e4f9f | 2016-09-14 07:03:38 -0400 | [diff] [blame] | 1169 | * in @bs will be written to @target until the job is cancelled or |
Paolo Bonzini | 893f7eb | 2012-10-18 16:49:23 +0200 | [diff] [blame] | 1170 | * manually completed. At the end of a successful mirroring job, |
| 1171 | * @bs will be switched to read from @target. |
| 1172 | */ |
Alberto Garcia | 71aa986 | 2016-07-05 17:28:57 +0300 | [diff] [blame] | 1173 | void mirror_start(const char *job_id, BlockDriverState *bs, |
| 1174 | BlockDriverState *target, const char *replaces, |
John Snow | a1999b3 | 2018-09-06 09:02:11 -0400 | [diff] [blame] | 1175 | int creation_flags, int64_t speed, |
| 1176 | uint32_t granularity, int64_t buf_size, |
Max Reitz | 274fcce | 2016-06-10 20:57:47 +0200 | [diff] [blame] | 1177 | MirrorSyncMode mode, BlockMirrorBackingMode backing_mode, |
Max Reitz | cdf3bc9 | 2019-07-24 19:12:30 +0200 | [diff] [blame] | 1178 | bool zero_target, |
Max Reitz | 274fcce | 2016-06-10 20:57:47 +0200 | [diff] [blame] | 1179 | BlockdevOnError on_source_error, |
Paolo Bonzini | b952b55 | 2012-10-18 16:49:28 +0200 | [diff] [blame] | 1180 | BlockdevOnError on_target_error, |
Max Reitz | 481deba | 2018-06-13 20:18:22 +0200 | [diff] [blame] | 1181 | bool unmap, const char *filter_node_name, |
| 1182 | MirrorCopyMode copy_mode, Error **errp); |
Paolo Bonzini | 893f7eb | 2012-10-18 16:49:23 +0200 | [diff] [blame] | 1183 | |
Dietmar Maurer | 98d2c6f | 2013-06-24 17:13:11 +0200 | [diff] [blame] | 1184 | /* |
John Snow | 111049a | 2016-11-08 01:50:38 -0500 | [diff] [blame] | 1185 | * backup_job_create: |
Alberto Garcia | 70559d4 | 2016-07-05 17:28:58 +0300 | [diff] [blame] | 1186 | * @job_id: The id of the newly-created job, or %NULL to use the |
| 1187 | * device name of @bs. |
Dietmar Maurer | 98d2c6f | 2013-06-24 17:13:11 +0200 | [diff] [blame] | 1188 | * @bs: Block device to operate on. |
| 1189 | * @target: Block device to write to. |
| 1190 | * @speed: The maximum speed, in bytes per second, or 0 for unlimited. |
Ian Main | fc5d3f8 | 2013-07-26 11:39:04 -0700 | [diff] [blame] | 1191 | * @sync_mode: What parts of the disk image should be copied to the destination. |
John Snow | c8b5650 | 2019-07-29 16:35:52 -0400 | [diff] [blame] | 1192 | * @sync_bitmap: The dirty bitmap if sync_mode is 'bitmap' or 'incremental' |
| 1193 | * @bitmap_mode: The bitmap synchronization policy to use. |
Dietmar Maurer | 98d2c6f | 2013-06-24 17:13:11 +0200 | [diff] [blame] | 1194 | * @on_source_error: The action to take upon error reading from the source. |
| 1195 | * @on_target_error: The action to take upon error writing to the target. |
John Snow | 47970df | 2016-10-27 12:06:57 -0400 | [diff] [blame] | 1196 | * @creation_flags: Flags that control the behavior of the Job lifetime. |
| 1197 | * See @BlockJobCreateFlags |
Dietmar Maurer | 98d2c6f | 2013-06-24 17:13:11 +0200 | [diff] [blame] | 1198 | * @cb: Completion function for the job. |
| 1199 | * @opaque: Opaque pointer value passed to @cb. |
John Snow | 78f51fd | 2015-11-05 18:13:17 -0500 | [diff] [blame] | 1200 | * @txn: Transaction that this job is part of (may be NULL). |
Dietmar Maurer | 98d2c6f | 2013-06-24 17:13:11 +0200 | [diff] [blame] | 1201 | * |
John Snow | 111049a | 2016-11-08 01:50:38 -0500 | [diff] [blame] | 1202 | * Create a backup operation on @bs. Clusters in @bs are written to @target |
Dietmar Maurer | 98d2c6f | 2013-06-24 17:13:11 +0200 | [diff] [blame] | 1203 | * until the job is cancelled or manually completed. |
| 1204 | */ |
John Snow | 111049a | 2016-11-08 01:50:38 -0500 | [diff] [blame] | 1205 | BlockJob *backup_job_create(const char *job_id, BlockDriverState *bs, |
| 1206 | BlockDriverState *target, int64_t speed, |
| 1207 | MirrorSyncMode sync_mode, |
| 1208 | BdrvDirtyBitmap *sync_bitmap, |
John Snow | c8b5650 | 2019-07-29 16:35:52 -0400 | [diff] [blame] | 1209 | BitmapSyncMode bitmap_mode, |
John Snow | 111049a | 2016-11-08 01:50:38 -0500 | [diff] [blame] | 1210 | bool compress, |
Vladimir Sementsov-Ogievskiy | 00e30f0 | 2019-10-01 16:14:09 +0300 | [diff] [blame] | 1211 | const char *filter_node_name, |
John Snow | 111049a | 2016-11-08 01:50:38 -0500 | [diff] [blame] | 1212 | BlockdevOnError on_source_error, |
| 1213 | BlockdevOnError on_target_error, |
| 1214 | int creation_flags, |
| 1215 | BlockCompletionFunc *cb, void *opaque, |
Kevin Wolf | 62c9e41 | 2018-04-19 16:09:52 +0200 | [diff] [blame] | 1216 | JobTxn *txn, Error **errp); |
Dietmar Maurer | 98d2c6f | 2013-06-24 17:13:11 +0200 | [diff] [blame] | 1217 | |
Kevin Wolf | abb21ac | 2016-02-23 17:33:24 +0100 | [diff] [blame] | 1218 | void hmp_drive_add_node(Monitor *mon, const char *optstr); |
| 1219 | |
Kevin Wolf | f21d96d | 2016-03-08 13:47:46 +0100 | [diff] [blame] | 1220 | BdrvChild *bdrv_root_attach_child(BlockDriverState *child_bs, |
| 1221 | const char *child_name, |
Kevin Wolf | 36fe133 | 2016-05-17 14:51:55 +0200 | [diff] [blame] | 1222 | const BdrvChildRole *child_role, |
Kevin Wolf | 132ada8 | 2019-04-24 17:41:46 +0200 | [diff] [blame] | 1223 | AioContext *ctx, |
Kevin Wolf | d5e6f43 | 2016-12-14 17:24:36 +0100 | [diff] [blame] | 1224 | uint64_t perm, uint64_t shared_perm, |
| 1225 | void *opaque, Error **errp); |
Kevin Wolf | f21d96d | 2016-03-08 13:47:46 +0100 | [diff] [blame] | 1226 | void bdrv_root_unref_child(BdrvChild *child); |
| 1227 | |
Max Reitz | c1087f1 | 2019-05-22 19:03:46 +0200 | [diff] [blame] | 1228 | /** |
| 1229 | * Sets a BdrvChild's permissions. Avoid if the parent is a BDS; use |
| 1230 | * bdrv_child_refresh_perms() instead and make the parent's |
| 1231 | * .bdrv_child_perm() implementation return the correct values. |
| 1232 | */ |
Kevin Wolf | 33a610c | 2016-12-15 13:04:20 +0100 | [diff] [blame] | 1233 | int bdrv_child_try_set_perm(BdrvChild *c, uint64_t perm, uint64_t shared, |
| 1234 | Error **errp); |
| 1235 | |
Max Reitz | c1087f1 | 2019-05-22 19:03:46 +0200 | [diff] [blame] | 1236 | /** |
| 1237 | * Calls bs->drv->bdrv_child_perm() and updates the child's permission |
| 1238 | * masks with the result. |
| 1239 | * Drivers should invoke this function whenever an event occurs that |
| 1240 | * makes their .bdrv_child_perm() implementation return different |
| 1241 | * values than before, but which will not result in the block layer |
| 1242 | * automatically refreshing the permissions. |
| 1243 | */ |
| 1244 | int bdrv_child_refresh_perms(BlockDriverState *bs, BdrvChild *c, Error **errp); |
| 1245 | |
Kevin Wolf | 6a1b9ee | 2016-12-15 11:27:32 +0100 | [diff] [blame] | 1246 | /* Default implementation for BlockDriver.bdrv_child_perm() that can be used by |
| 1247 | * block filters: Forward CONSISTENT_READ, WRITE, WRITE_UNCHANGED and RESIZE to |
| 1248 | * all children */ |
| 1249 | void bdrv_filter_default_perms(BlockDriverState *bs, BdrvChild *c, |
| 1250 | const BdrvChildRole *role, |
Kevin Wolf | e0995dc | 2017-09-14 12:47:11 +0200 | [diff] [blame] | 1251 | BlockReopenQueue *reopen_queue, |
Kevin Wolf | 6a1b9ee | 2016-12-15 11:27:32 +0100 | [diff] [blame] | 1252 | uint64_t perm, uint64_t shared, |
| 1253 | uint64_t *nperm, uint64_t *nshared); |
| 1254 | |
Kevin Wolf | 6b1a044 | 2016-12-19 15:21:48 +0100 | [diff] [blame] | 1255 | /* Default implementation for BlockDriver.bdrv_child_perm() that can be used by |
| 1256 | * (non-raw) image formats: Like above for bs->backing, but for bs->file it |
| 1257 | * requires WRITE | RESIZE for read-write images, always requires |
| 1258 | * CONSISTENT_READ and doesn't share WRITE. */ |
| 1259 | void bdrv_format_default_perms(BlockDriverState *bs, BdrvChild *c, |
| 1260 | const BdrvChildRole *role, |
Kevin Wolf | e0995dc | 2017-09-14 12:47:11 +0200 | [diff] [blame] | 1261 | BlockReopenQueue *reopen_queue, |
Kevin Wolf | 6b1a044 | 2016-12-19 15:21:48 +0100 | [diff] [blame] | 1262 | uint64_t perm, uint64_t shared, |
| 1263 | uint64_t *nperm, uint64_t *nshared); |
Kevin Wolf | 33a610c | 2016-12-15 13:04:20 +0100 | [diff] [blame] | 1264 | |
Max Reitz | 5d69b5a | 2020-02-18 11:34:41 +0100 | [diff] [blame] | 1265 | bool bdrv_recurse_can_replace(BlockDriverState *bs, |
| 1266 | BlockDriverState *to_replace); |
| 1267 | |
Manos Pitsidianakis | f7cc69b | 2017-07-13 18:30:28 +0300 | [diff] [blame] | 1268 | /* |
Eric Blake | 3e4d0e7 | 2018-02-13 14:26:43 -0600 | [diff] [blame] | 1269 | * Default implementation for drivers to pass bdrv_co_block_status() to |
Manos Pitsidianakis | f7cc69b | 2017-07-13 18:30:28 +0300 | [diff] [blame] | 1270 | * their file. |
| 1271 | */ |
Eric Blake | 3e4d0e7 | 2018-02-13 14:26:43 -0600 | [diff] [blame] | 1272 | int coroutine_fn bdrv_co_block_status_from_file(BlockDriverState *bs, |
| 1273 | bool want_zero, |
| 1274 | int64_t offset, |
| 1275 | int64_t bytes, |
| 1276 | int64_t *pnum, |
| 1277 | int64_t *map, |
| 1278 | BlockDriverState **file); |
Manos Pitsidianakis | f7cc69b | 2017-07-13 18:30:28 +0300 | [diff] [blame] | 1279 | /* |
Eric Blake | 3e4d0e7 | 2018-02-13 14:26:43 -0600 | [diff] [blame] | 1280 | * Default implementation for drivers to pass bdrv_co_block_status() to |
Manos Pitsidianakis | f7cc69b | 2017-07-13 18:30:28 +0300 | [diff] [blame] | 1281 | * their backing file. |
| 1282 | */ |
Eric Blake | 3e4d0e7 | 2018-02-13 14:26:43 -0600 | [diff] [blame] | 1283 | int coroutine_fn bdrv_co_block_status_from_backing(BlockDriverState *bs, |
| 1284 | bool want_zero, |
| 1285 | int64_t offset, |
| 1286 | int64_t bytes, |
| 1287 | int64_t *pnum, |
| 1288 | int64_t *map, |
| 1289 | BlockDriverState **file); |
Kevin Wolf | 1f0c461 | 2016-03-22 18:38:44 +0100 | [diff] [blame] | 1290 | const char *bdrv_get_parent_name(const BlockDriverState *bs); |
Kevin Wolf | 39829a0 | 2017-01-24 14:21:41 +0100 | [diff] [blame] | 1291 | void blk_dev_change_media_cb(BlockBackend *blk, bool load, Error **errp); |
Markus Armbruster | a7f53e2 | 2014-10-07 13:59:25 +0200 | [diff] [blame] | 1292 | bool blk_dev_has_removable_media(BlockBackend *blk); |
Max Reitz | 8f3a73b | 2016-01-29 20:49:10 +0100 | [diff] [blame] | 1293 | bool blk_dev_has_tray(BlockBackend *blk); |
Markus Armbruster | a7f53e2 | 2014-10-07 13:59:25 +0200 | [diff] [blame] | 1294 | void blk_dev_eject_request(BlockBackend *blk, bool force); |
| 1295 | bool blk_dev_is_tray_open(BlockBackend *blk); |
| 1296 | bool blk_dev_is_medium_locked(BlockBackend *blk); |
Markus Armbruster | a7f53e2 | 2014-10-07 13:59:25 +0200 | [diff] [blame] | 1297 | |
Eric Blake | 0fdf1a4 | 2017-09-25 09:55:25 -0500 | [diff] [blame] | 1298 | void bdrv_set_dirty(BlockDriverState *bs, int64_t offset, int64_t bytes); |
Stefan Hajnoczi | e0c47b6 | 2015-04-28 14:27:50 +0100 | [diff] [blame] | 1299 | |
Fam Zheng | df9a681 | 2015-11-09 18:16:54 +0800 | [diff] [blame] | 1300 | void bdrv_clear_dirty_bitmap(BdrvDirtyBitmap *bitmap, HBitmap **out); |
Vladimir Sementsov-Ogievskiy | 56bd662 | 2018-10-29 16:23:14 -0400 | [diff] [blame] | 1301 | void bdrv_restore_dirty_bitmap(BdrvDirtyBitmap *bitmap, HBitmap *backup); |
John Snow | b7661ca | 2019-07-29 16:35:53 -0400 | [diff] [blame] | 1302 | bool bdrv_dirty_bitmap_merge_internal(BdrvDirtyBitmap *dest, |
| 1303 | const BdrvDirtyBitmap *src, |
| 1304 | HBitmap **backup, bool lock); |
Fam Zheng | df9a681 | 2015-11-09 18:16:54 +0800 | [diff] [blame] | 1305 | |
Paolo Bonzini | 9972354 | 2016-10-27 12:48:52 +0200 | [diff] [blame] | 1306 | void bdrv_inc_in_flight(BlockDriverState *bs); |
| 1307 | void bdrv_dec_in_flight(BlockDriverState *bs); |
| 1308 | |
Max Reitz | 9c4218e | 2016-01-29 16:36:12 +0100 | [diff] [blame] | 1309 | void blockdev_close_all_bdrv_states(void); |
| 1310 | |
Fam Zheng | fcc6767 | 2018-06-01 17:26:39 +0800 | [diff] [blame] | 1311 | int coroutine_fn bdrv_co_copy_range_from(BdrvChild *src, uint64_t src_offset, |
| 1312 | BdrvChild *dst, uint64_t dst_offset, |
Vladimir Sementsov-Ogievskiy | 67b51fb | 2018-07-09 19:37:17 +0300 | [diff] [blame] | 1313 | uint64_t bytes, |
| 1314 | BdrvRequestFlags read_flags, |
| 1315 | BdrvRequestFlags write_flags); |
Fam Zheng | fcc6767 | 2018-06-01 17:26:39 +0800 | [diff] [blame] | 1316 | int coroutine_fn bdrv_co_copy_range_to(BdrvChild *src, uint64_t src_offset, |
| 1317 | BdrvChild *dst, uint64_t dst_offset, |
Vladimir Sementsov-Ogievskiy | 67b51fb | 2018-07-09 19:37:17 +0300 | [diff] [blame] | 1318 | uint64_t bytes, |
| 1319 | BdrvRequestFlags read_flags, |
| 1320 | BdrvRequestFlags write_flags); |
Fam Zheng | fcc6767 | 2018-06-01 17:26:39 +0800 | [diff] [blame] | 1321 | |
Kevin Wolf | 3d9f2d2 | 2018-06-26 13:55:20 +0200 | [diff] [blame] | 1322 | int refresh_total_sectors(BlockDriverState *bs, int64_t hint); |
| 1323 | |
bellard | ea2384d | 2004-08-01 21:59:26 +0000 | [diff] [blame] | 1324 | #endif /* BLOCK_INT_H */ |