xref: /qemu/block/block-backend.c (revision 7a4e543d)
1 /*
2  * QEMU Block backends
3  *
4  * Copyright (C) 2014 Red Hat, Inc.
5  *
6  * Authors:
7  *  Markus Armbruster <armbru@redhat.com>,
8  *
9  * This work is licensed under the terms of the GNU LGPL, version 2.1
10  * or later.  See the COPYING.LIB file in the top-level directory.
11  */
12 
13 #include "qemu/osdep.h"
14 #include "sysemu/block-backend.h"
15 #include "block/block_int.h"
16 #include "block/blockjob.h"
17 #include "block/throttle-groups.h"
18 #include "sysemu/blockdev.h"
19 #include "sysemu/sysemu.h"
20 #include "qapi-event.h"
21 
22 /* Number of coroutines to reserve per attached device model */
23 #define COROUTINE_POOL_RESERVATION 64
24 
25 static AioContext *blk_aiocb_get_aio_context(BlockAIOCB *acb);
26 
27 struct BlockBackend {
28     char *name;
29     int refcnt;
30     BlockDriverState *bs;
31     DriveInfo *legacy_dinfo;    /* null unless created by drive_new() */
32     QTAILQ_ENTRY(BlockBackend) link; /* for blk_backends */
33 
34     void *dev;                  /* attached device model, if any */
35     /* TODO change to DeviceState when all users are qdevified */
36     const BlockDevOps *dev_ops;
37     void *dev_opaque;
38 
39     /* the block size for which the guest device expects atomicity */
40     int guest_block_size;
41 
42     /* If the BDS tree is removed, some of its options are stored here (which
43      * can be used to restore those options in the new BDS on insert) */
44     BlockBackendRootState root_state;
45 
46     /* I/O stats (display with "info blockstats"). */
47     BlockAcctStats stats;
48 
49     BlockdevOnError on_read_error, on_write_error;
50     bool iostatus_enabled;
51     BlockDeviceIoStatus iostatus;
52 
53     NotifierList remove_bs_notifiers, insert_bs_notifiers;
54 };
55 
56 typedef struct BlockBackendAIOCB {
57     BlockAIOCB common;
58     QEMUBH *bh;
59     BlockBackend *blk;
60     int ret;
61 } BlockBackendAIOCB;
62 
63 static const AIOCBInfo block_backend_aiocb_info = {
64     .get_aio_context = blk_aiocb_get_aio_context,
65     .aiocb_size = sizeof(BlockBackendAIOCB),
66 };
67 
68 static void drive_info_del(DriveInfo *dinfo);
69 
70 /* All the BlockBackends (except for hidden ones) */
71 static QTAILQ_HEAD(, BlockBackend) blk_backends =
72     QTAILQ_HEAD_INITIALIZER(blk_backends);
73 
74 /*
75  * Create a new BlockBackend with @name, with a reference count of one.
76  * @name must not be null or empty.
77  * Fail if a BlockBackend with this name already exists.
78  * Store an error through @errp on failure, unless it's null.
79  * Return the new BlockBackend on success, null on failure.
80  */
81 BlockBackend *blk_new(const char *name, Error **errp)
82 {
83     BlockBackend *blk;
84 
85     assert(name && name[0]);
86     if (!id_wellformed(name)) {
87         error_setg(errp, "Invalid device name");
88         return NULL;
89     }
90     if (blk_by_name(name)) {
91         error_setg(errp, "Device with id '%s' already exists", name);
92         return NULL;
93     }
94     if (bdrv_find_node(name)) {
95         error_setg(errp,
96                    "Device name '%s' conflicts with an existing node name",
97                    name);
98         return NULL;
99     }
100 
101     blk = g_new0(BlockBackend, 1);
102     blk->name = g_strdup(name);
103     blk->refcnt = 1;
104     notifier_list_init(&blk->remove_bs_notifiers);
105     notifier_list_init(&blk->insert_bs_notifiers);
106     QTAILQ_INSERT_TAIL(&blk_backends, blk, link);
107     return blk;
108 }
109 
110 /*
111  * Create a new BlockBackend with a new BlockDriverState attached.
112  * Otherwise just like blk_new(), which see.
113  */
114 BlockBackend *blk_new_with_bs(const char *name, Error **errp)
115 {
116     BlockBackend *blk;
117     BlockDriverState *bs;
118 
119     blk = blk_new(name, errp);
120     if (!blk) {
121         return NULL;
122     }
123 
124     bs = bdrv_new_root();
125     blk->bs = bs;
126     bs->blk = blk;
127     return blk;
128 }
129 
130 /*
131  * Calls blk_new_with_bs() and then calls bdrv_open() on the BlockDriverState.
132  *
133  * Just as with bdrv_open(), after having called this function the reference to
134  * @options belongs to the block layer (even on failure).
135  *
136  * TODO: Remove @filename and @flags; it should be possible to specify a whole
137  * BDS tree just by specifying the @options QDict (or @reference,
138  * alternatively). At the time of adding this function, this is not possible,
139  * though, so callers of this function have to be able to specify @filename and
140  * @flags.
141  */
142 BlockBackend *blk_new_open(const char *name, const char *filename,
143                            const char *reference, QDict *options, int flags,
144                            Error **errp)
145 {
146     BlockBackend *blk;
147     int ret;
148 
149     blk = blk_new_with_bs(name, errp);
150     if (!blk) {
151         QDECREF(options);
152         return NULL;
153     }
154 
155     ret = bdrv_open(&blk->bs, filename, reference, options, flags, errp);
156     if (ret < 0) {
157         blk_unref(blk);
158         return NULL;
159     }
160 
161     return blk;
162 }
163 
164 static void blk_delete(BlockBackend *blk)
165 {
166     assert(!blk->refcnt);
167     assert(!blk->dev);
168     if (blk->bs) {
169         blk_remove_bs(blk);
170     }
171     assert(QLIST_EMPTY(&blk->remove_bs_notifiers.notifiers));
172     assert(QLIST_EMPTY(&blk->insert_bs_notifiers.notifiers));
173     if (blk->root_state.throttle_state) {
174         g_free(blk->root_state.throttle_group);
175         throttle_group_unref(blk->root_state.throttle_state);
176     }
177     /* Avoid double-remove after blk_hide_on_behalf_of_hmp_drive_del() */
178     if (blk->name[0]) {
179         QTAILQ_REMOVE(&blk_backends, blk, link);
180     }
181     g_free(blk->name);
182     drive_info_del(blk->legacy_dinfo);
183     block_acct_cleanup(&blk->stats);
184     g_free(blk);
185 }
186 
187 static void drive_info_del(DriveInfo *dinfo)
188 {
189     if (!dinfo) {
190         return;
191     }
192     qemu_opts_del(dinfo->opts);
193     g_free(dinfo->serial);
194     g_free(dinfo);
195 }
196 
197 int blk_get_refcnt(BlockBackend *blk)
198 {
199     return blk ? blk->refcnt : 0;
200 }
201 
202 /*
203  * Increment @blk's reference count.
204  * @blk must not be null.
205  */
206 void blk_ref(BlockBackend *blk)
207 {
208     blk->refcnt++;
209 }
210 
211 /*
212  * Decrement @blk's reference count.
213  * If this drops it to zero, destroy @blk.
214  * For convenience, do nothing if @blk is null.
215  */
216 void blk_unref(BlockBackend *blk)
217 {
218     if (blk) {
219         assert(blk->refcnt > 0);
220         if (!--blk->refcnt) {
221             blk_delete(blk);
222         }
223     }
224 }
225 
226 void blk_remove_all_bs(void)
227 {
228     BlockBackend *blk;
229 
230     QTAILQ_FOREACH(blk, &blk_backends, link) {
231         AioContext *ctx = blk_get_aio_context(blk);
232 
233         aio_context_acquire(ctx);
234         if (blk->bs) {
235             blk_remove_bs(blk);
236         }
237         aio_context_release(ctx);
238     }
239 }
240 
241 /*
242  * Return the BlockBackend after @blk.
243  * If @blk is null, return the first one.
244  * Else, return @blk's next sibling, which may be null.
245  *
246  * To iterate over all BlockBackends, do
247  * for (blk = blk_next(NULL); blk; blk = blk_next(blk)) {
248  *     ...
249  * }
250  */
251 BlockBackend *blk_next(BlockBackend *blk)
252 {
253     return blk ? QTAILQ_NEXT(blk, link) : QTAILQ_FIRST(&blk_backends);
254 }
255 
256 /*
257  * Return @blk's name, a non-null string.
258  * Wart: the name is empty iff @blk has been hidden with
259  * blk_hide_on_behalf_of_hmp_drive_del().
260  */
261 const char *blk_name(BlockBackend *blk)
262 {
263     return blk->name;
264 }
265 
266 /*
267  * Return the BlockBackend with name @name if it exists, else null.
268  * @name must not be null.
269  */
270 BlockBackend *blk_by_name(const char *name)
271 {
272     BlockBackend *blk;
273 
274     assert(name);
275     QTAILQ_FOREACH(blk, &blk_backends, link) {
276         if (!strcmp(name, blk->name)) {
277             return blk;
278         }
279     }
280     return NULL;
281 }
282 
283 /*
284  * Return the BlockDriverState attached to @blk if any, else null.
285  */
286 BlockDriverState *blk_bs(BlockBackend *blk)
287 {
288     return blk->bs;
289 }
290 
291 /*
292  * Changes the BlockDriverState attached to @blk
293  */
294 void blk_set_bs(BlockBackend *blk, BlockDriverState *bs)
295 {
296     bdrv_ref(bs);
297 
298     if (blk->bs) {
299         blk->bs->blk = NULL;
300         bdrv_unref(blk->bs);
301     }
302     assert(bs->blk == NULL);
303 
304     blk->bs = bs;
305     bs->blk = blk;
306 }
307 
308 /*
309  * Return @blk's DriveInfo if any, else null.
310  */
311 DriveInfo *blk_legacy_dinfo(BlockBackend *blk)
312 {
313     return blk->legacy_dinfo;
314 }
315 
316 /*
317  * Set @blk's DriveInfo to @dinfo, and return it.
318  * @blk must not have a DriveInfo set already.
319  * No other BlockBackend may have the same DriveInfo set.
320  */
321 DriveInfo *blk_set_legacy_dinfo(BlockBackend *blk, DriveInfo *dinfo)
322 {
323     assert(!blk->legacy_dinfo);
324     return blk->legacy_dinfo = dinfo;
325 }
326 
327 /*
328  * Return the BlockBackend with DriveInfo @dinfo.
329  * It must exist.
330  */
331 BlockBackend *blk_by_legacy_dinfo(DriveInfo *dinfo)
332 {
333     BlockBackend *blk;
334 
335     QTAILQ_FOREACH(blk, &blk_backends, link) {
336         if (blk->legacy_dinfo == dinfo) {
337             return blk;
338         }
339     }
340     abort();
341 }
342 
343 /*
344  * Hide @blk.
345  * @blk must not have been hidden already.
346  * Make attached BlockDriverState, if any, anonymous.
347  * Once hidden, @blk is invisible to all functions that don't receive
348  * it as argument.  For example, blk_by_name() won't return it.
349  * Strictly for use by do_drive_del().
350  * TODO get rid of it!
351  */
352 void blk_hide_on_behalf_of_hmp_drive_del(BlockBackend *blk)
353 {
354     QTAILQ_REMOVE(&blk_backends, blk, link);
355     blk->name[0] = 0;
356     if (blk->bs) {
357         bdrv_make_anon(blk->bs);
358     }
359 }
360 
361 /*
362  * Disassociates the currently associated BlockDriverState from @blk.
363  */
364 void blk_remove_bs(BlockBackend *blk)
365 {
366     assert(blk->bs->blk == blk);
367 
368     notifier_list_notify(&blk->remove_bs_notifiers, blk);
369 
370     blk_update_root_state(blk);
371 
372     blk->bs->blk = NULL;
373     bdrv_unref(blk->bs);
374     blk->bs = NULL;
375 }
376 
377 /*
378  * Associates a new BlockDriverState with @blk.
379  */
380 void blk_insert_bs(BlockBackend *blk, BlockDriverState *bs)
381 {
382     assert(!blk->bs && !bs->blk);
383     bdrv_ref(bs);
384     blk->bs = bs;
385     bs->blk = blk;
386 
387     notifier_list_notify(&blk->insert_bs_notifiers, blk);
388 }
389 
390 /*
391  * Attach device model @dev to @blk.
392  * Return 0 on success, -EBUSY when a device model is attached already.
393  */
394 int blk_attach_dev(BlockBackend *blk, void *dev)
395 /* TODO change to DeviceState *dev when all users are qdevified */
396 {
397     if (blk->dev) {
398         return -EBUSY;
399     }
400     blk_ref(blk);
401     blk->dev = dev;
402     blk_iostatus_reset(blk);
403     return 0;
404 }
405 
406 /*
407  * Attach device model @dev to @blk.
408  * @blk must not have a device model attached already.
409  * TODO qdevified devices don't use this, remove when devices are qdevified
410  */
411 void blk_attach_dev_nofail(BlockBackend *blk, void *dev)
412 {
413     if (blk_attach_dev(blk, dev) < 0) {
414         abort();
415     }
416 }
417 
418 /*
419  * Detach device model @dev from @blk.
420  * @dev must be currently attached to @blk.
421  */
422 void blk_detach_dev(BlockBackend *blk, void *dev)
423 /* TODO change to DeviceState *dev when all users are qdevified */
424 {
425     assert(blk->dev == dev);
426     blk->dev = NULL;
427     blk->dev_ops = NULL;
428     blk->dev_opaque = NULL;
429     blk->guest_block_size = 512;
430     blk_unref(blk);
431 }
432 
433 /*
434  * Return the device model attached to @blk if any, else null.
435  */
436 void *blk_get_attached_dev(BlockBackend *blk)
437 /* TODO change to return DeviceState * when all users are qdevified */
438 {
439     return blk->dev;
440 }
441 
442 /*
443  * Set @blk's device model callbacks to @ops.
444  * @opaque is the opaque argument to pass to the callbacks.
445  * This is for use by device models.
446  */
447 void blk_set_dev_ops(BlockBackend *blk, const BlockDevOps *ops,
448                      void *opaque)
449 {
450     blk->dev_ops = ops;
451     blk->dev_opaque = opaque;
452 }
453 
454 /*
455  * Notify @blk's attached device model of media change.
456  * If @load is true, notify of media load.
457  * Else, notify of media eject.
458  * Also send DEVICE_TRAY_MOVED events as appropriate.
459  */
460 void blk_dev_change_media_cb(BlockBackend *blk, bool load)
461 {
462     if (blk->dev_ops && blk->dev_ops->change_media_cb) {
463         bool tray_was_open, tray_is_open;
464 
465         tray_was_open = blk_dev_is_tray_open(blk);
466         blk->dev_ops->change_media_cb(blk->dev_opaque, load);
467         tray_is_open = blk_dev_is_tray_open(blk);
468 
469         if (tray_was_open != tray_is_open) {
470             qapi_event_send_device_tray_moved(blk_name(blk), tray_is_open,
471                                               &error_abort);
472         }
473     }
474 }
475 
476 /*
477  * Does @blk's attached device model have removable media?
478  * %true if no device model is attached.
479  */
480 bool blk_dev_has_removable_media(BlockBackend *blk)
481 {
482     return !blk->dev || (blk->dev_ops && blk->dev_ops->change_media_cb);
483 }
484 
485 /*
486  * Does @blk's attached device model have a tray?
487  */
488 bool blk_dev_has_tray(BlockBackend *blk)
489 {
490     return blk->dev_ops && blk->dev_ops->is_tray_open;
491 }
492 
493 /*
494  * Notify @blk's attached device model of a media eject request.
495  * If @force is true, the medium is about to be yanked out forcefully.
496  */
497 void blk_dev_eject_request(BlockBackend *blk, bool force)
498 {
499     if (blk->dev_ops && blk->dev_ops->eject_request_cb) {
500         blk->dev_ops->eject_request_cb(blk->dev_opaque, force);
501     }
502 }
503 
504 /*
505  * Does @blk's attached device model have a tray, and is it open?
506  */
507 bool blk_dev_is_tray_open(BlockBackend *blk)
508 {
509     if (blk_dev_has_tray(blk)) {
510         return blk->dev_ops->is_tray_open(blk->dev_opaque);
511     }
512     return false;
513 }
514 
515 /*
516  * Does @blk's attached device model have the medium locked?
517  * %false if the device model has no such lock.
518  */
519 bool blk_dev_is_medium_locked(BlockBackend *blk)
520 {
521     if (blk->dev_ops && blk->dev_ops->is_medium_locked) {
522         return blk->dev_ops->is_medium_locked(blk->dev_opaque);
523     }
524     return false;
525 }
526 
527 /*
528  * Notify @blk's attached device model of a backend size change.
529  */
530 void blk_dev_resize_cb(BlockBackend *blk)
531 {
532     if (blk->dev_ops && blk->dev_ops->resize_cb) {
533         blk->dev_ops->resize_cb(blk->dev_opaque);
534     }
535 }
536 
537 void blk_iostatus_enable(BlockBackend *blk)
538 {
539     blk->iostatus_enabled = true;
540     blk->iostatus = BLOCK_DEVICE_IO_STATUS_OK;
541 }
542 
543 /* The I/O status is only enabled if the drive explicitly
544  * enables it _and_ the VM is configured to stop on errors */
545 bool blk_iostatus_is_enabled(const BlockBackend *blk)
546 {
547     return (blk->iostatus_enabled &&
548            (blk->on_write_error == BLOCKDEV_ON_ERROR_ENOSPC ||
549             blk->on_write_error == BLOCKDEV_ON_ERROR_STOP   ||
550             blk->on_read_error == BLOCKDEV_ON_ERROR_STOP));
551 }
552 
553 BlockDeviceIoStatus blk_iostatus(const BlockBackend *blk)
554 {
555     return blk->iostatus;
556 }
557 
558 void blk_iostatus_disable(BlockBackend *blk)
559 {
560     blk->iostatus_enabled = false;
561 }
562 
563 void blk_iostatus_reset(BlockBackend *blk)
564 {
565     if (blk_iostatus_is_enabled(blk)) {
566         blk->iostatus = BLOCK_DEVICE_IO_STATUS_OK;
567         if (blk->bs && blk->bs->job) {
568             block_job_iostatus_reset(blk->bs->job);
569         }
570     }
571 }
572 
573 void blk_iostatus_set_err(BlockBackend *blk, int error)
574 {
575     assert(blk_iostatus_is_enabled(blk));
576     if (blk->iostatus == BLOCK_DEVICE_IO_STATUS_OK) {
577         blk->iostatus = error == ENOSPC ? BLOCK_DEVICE_IO_STATUS_NOSPACE :
578                                           BLOCK_DEVICE_IO_STATUS_FAILED;
579     }
580 }
581 
582 static int blk_check_byte_request(BlockBackend *blk, int64_t offset,
583                                   size_t size)
584 {
585     int64_t len;
586 
587     if (size > INT_MAX) {
588         return -EIO;
589     }
590 
591     if (!blk_is_available(blk)) {
592         return -ENOMEDIUM;
593     }
594 
595     len = blk_getlength(blk);
596     if (len < 0) {
597         return len;
598     }
599 
600     if (offset < 0) {
601         return -EIO;
602     }
603 
604     if (offset > len || len - offset < size) {
605         return -EIO;
606     }
607 
608     return 0;
609 }
610 
611 static int blk_check_request(BlockBackend *blk, int64_t sector_num,
612                              int nb_sectors)
613 {
614     if (sector_num < 0 || sector_num > INT64_MAX / BDRV_SECTOR_SIZE) {
615         return -EIO;
616     }
617 
618     if (nb_sectors < 0 || nb_sectors > INT_MAX / BDRV_SECTOR_SIZE) {
619         return -EIO;
620     }
621 
622     return blk_check_byte_request(blk, sector_num * BDRV_SECTOR_SIZE,
623                                   nb_sectors * BDRV_SECTOR_SIZE);
624 }
625 
626 int blk_read(BlockBackend *blk, int64_t sector_num, uint8_t *buf,
627              int nb_sectors)
628 {
629     int ret = blk_check_request(blk, sector_num, nb_sectors);
630     if (ret < 0) {
631         return ret;
632     }
633 
634     return bdrv_read(blk->bs, sector_num, buf, nb_sectors);
635 }
636 
637 int blk_read_unthrottled(BlockBackend *blk, int64_t sector_num, uint8_t *buf,
638                          int nb_sectors)
639 {
640     int ret = blk_check_request(blk, sector_num, nb_sectors);
641     if (ret < 0) {
642         return ret;
643     }
644 
645     return bdrv_read_unthrottled(blk->bs, sector_num, buf, nb_sectors);
646 }
647 
648 int blk_write(BlockBackend *blk, int64_t sector_num, const uint8_t *buf,
649               int nb_sectors)
650 {
651     int ret = blk_check_request(blk, sector_num, nb_sectors);
652     if (ret < 0) {
653         return ret;
654     }
655 
656     return bdrv_write(blk->bs, sector_num, buf, nb_sectors);
657 }
658 
659 int blk_write_zeroes(BlockBackend *blk, int64_t sector_num,
660                      int nb_sectors, BdrvRequestFlags flags)
661 {
662     int ret = blk_check_request(blk, sector_num, nb_sectors);
663     if (ret < 0) {
664         return ret;
665     }
666 
667     return bdrv_write_zeroes(blk->bs, sector_num, nb_sectors, flags);
668 }
669 
670 static void error_callback_bh(void *opaque)
671 {
672     struct BlockBackendAIOCB *acb = opaque;
673     qemu_bh_delete(acb->bh);
674     acb->common.cb(acb->common.opaque, acb->ret);
675     qemu_aio_unref(acb);
676 }
677 
678 BlockAIOCB *blk_abort_aio_request(BlockBackend *blk,
679                                   BlockCompletionFunc *cb,
680                                   void *opaque, int ret)
681 {
682     struct BlockBackendAIOCB *acb;
683     QEMUBH *bh;
684 
685     acb = blk_aio_get(&block_backend_aiocb_info, blk, cb, opaque);
686     acb->blk = blk;
687     acb->ret = ret;
688 
689     bh = aio_bh_new(blk_get_aio_context(blk), error_callback_bh, acb);
690     acb->bh = bh;
691     qemu_bh_schedule(bh);
692 
693     return &acb->common;
694 }
695 
696 BlockAIOCB *blk_aio_write_zeroes(BlockBackend *blk, int64_t sector_num,
697                                  int nb_sectors, BdrvRequestFlags flags,
698                                  BlockCompletionFunc *cb, void *opaque)
699 {
700     int ret = blk_check_request(blk, sector_num, nb_sectors);
701     if (ret < 0) {
702         return blk_abort_aio_request(blk, cb, opaque, ret);
703     }
704 
705     return bdrv_aio_write_zeroes(blk->bs, sector_num, nb_sectors, flags,
706                                  cb, opaque);
707 }
708 
709 int blk_pread(BlockBackend *blk, int64_t offset, void *buf, int count)
710 {
711     int ret = blk_check_byte_request(blk, offset, count);
712     if (ret < 0) {
713         return ret;
714     }
715 
716     return bdrv_pread(blk->bs, offset, buf, count);
717 }
718 
719 int blk_pwrite(BlockBackend *blk, int64_t offset, const void *buf, int count)
720 {
721     int ret = blk_check_byte_request(blk, offset, count);
722     if (ret < 0) {
723         return ret;
724     }
725 
726     return bdrv_pwrite(blk->bs, offset, buf, count);
727 }
728 
729 int64_t blk_getlength(BlockBackend *blk)
730 {
731     if (!blk_is_available(blk)) {
732         return -ENOMEDIUM;
733     }
734 
735     return bdrv_getlength(blk->bs);
736 }
737 
738 void blk_get_geometry(BlockBackend *blk, uint64_t *nb_sectors_ptr)
739 {
740     if (!blk->bs) {
741         *nb_sectors_ptr = 0;
742     } else {
743         bdrv_get_geometry(blk->bs, nb_sectors_ptr);
744     }
745 }
746 
747 int64_t blk_nb_sectors(BlockBackend *blk)
748 {
749     if (!blk_is_available(blk)) {
750         return -ENOMEDIUM;
751     }
752 
753     return bdrv_nb_sectors(blk->bs);
754 }
755 
756 BlockAIOCB *blk_aio_readv(BlockBackend *blk, int64_t sector_num,
757                           QEMUIOVector *iov, int nb_sectors,
758                           BlockCompletionFunc *cb, void *opaque)
759 {
760     int ret = blk_check_request(blk, sector_num, nb_sectors);
761     if (ret < 0) {
762         return blk_abort_aio_request(blk, cb, opaque, ret);
763     }
764 
765     return bdrv_aio_readv(blk->bs, sector_num, iov, nb_sectors, cb, opaque);
766 }
767 
768 BlockAIOCB *blk_aio_writev(BlockBackend *blk, int64_t sector_num,
769                            QEMUIOVector *iov, int nb_sectors,
770                            BlockCompletionFunc *cb, void *opaque)
771 {
772     int ret = blk_check_request(blk, sector_num, nb_sectors);
773     if (ret < 0) {
774         return blk_abort_aio_request(blk, cb, opaque, ret);
775     }
776 
777     return bdrv_aio_writev(blk->bs, sector_num, iov, nb_sectors, cb, opaque);
778 }
779 
780 BlockAIOCB *blk_aio_flush(BlockBackend *blk,
781                           BlockCompletionFunc *cb, void *opaque)
782 {
783     if (!blk_is_available(blk)) {
784         return blk_abort_aio_request(blk, cb, opaque, -ENOMEDIUM);
785     }
786 
787     return bdrv_aio_flush(blk->bs, cb, opaque);
788 }
789 
790 BlockAIOCB *blk_aio_discard(BlockBackend *blk,
791                             int64_t sector_num, int nb_sectors,
792                             BlockCompletionFunc *cb, void *opaque)
793 {
794     int ret = blk_check_request(blk, sector_num, nb_sectors);
795     if (ret < 0) {
796         return blk_abort_aio_request(blk, cb, opaque, ret);
797     }
798 
799     return bdrv_aio_discard(blk->bs, sector_num, nb_sectors, cb, opaque);
800 }
801 
802 void blk_aio_cancel(BlockAIOCB *acb)
803 {
804     bdrv_aio_cancel(acb);
805 }
806 
807 void blk_aio_cancel_async(BlockAIOCB *acb)
808 {
809     bdrv_aio_cancel_async(acb);
810 }
811 
812 int blk_aio_multiwrite(BlockBackend *blk, BlockRequest *reqs, int num_reqs)
813 {
814     int i, ret;
815 
816     for (i = 0; i < num_reqs; i++) {
817         ret = blk_check_request(blk, reqs[i].sector, reqs[i].nb_sectors);
818         if (ret < 0) {
819             return ret;
820         }
821     }
822 
823     return bdrv_aio_multiwrite(blk->bs, reqs, num_reqs);
824 }
825 
826 int blk_ioctl(BlockBackend *blk, unsigned long int req, void *buf)
827 {
828     if (!blk_is_available(blk)) {
829         return -ENOMEDIUM;
830     }
831 
832     return bdrv_ioctl(blk->bs, req, buf);
833 }
834 
835 BlockAIOCB *blk_aio_ioctl(BlockBackend *blk, unsigned long int req, void *buf,
836                           BlockCompletionFunc *cb, void *opaque)
837 {
838     if (!blk_is_available(blk)) {
839         return blk_abort_aio_request(blk, cb, opaque, -ENOMEDIUM);
840     }
841 
842     return bdrv_aio_ioctl(blk->bs, req, buf, cb, opaque);
843 }
844 
845 int blk_co_discard(BlockBackend *blk, int64_t sector_num, int nb_sectors)
846 {
847     int ret = blk_check_request(blk, sector_num, nb_sectors);
848     if (ret < 0) {
849         return ret;
850     }
851 
852     return bdrv_co_discard(blk->bs, sector_num, nb_sectors);
853 }
854 
855 int blk_co_flush(BlockBackend *blk)
856 {
857     if (!blk_is_available(blk)) {
858         return -ENOMEDIUM;
859     }
860 
861     return bdrv_co_flush(blk->bs);
862 }
863 
864 int blk_flush(BlockBackend *blk)
865 {
866     if (!blk_is_available(blk)) {
867         return -ENOMEDIUM;
868     }
869 
870     return bdrv_flush(blk->bs);
871 }
872 
873 int blk_flush_all(void)
874 {
875     return bdrv_flush_all();
876 }
877 
878 void blk_drain(BlockBackend *blk)
879 {
880     if (blk->bs) {
881         bdrv_drain(blk->bs);
882     }
883 }
884 
885 void blk_drain_all(void)
886 {
887     bdrv_drain_all();
888 }
889 
890 void blk_set_on_error(BlockBackend *blk, BlockdevOnError on_read_error,
891                       BlockdevOnError on_write_error)
892 {
893     blk->on_read_error = on_read_error;
894     blk->on_write_error = on_write_error;
895 }
896 
897 BlockdevOnError blk_get_on_error(BlockBackend *blk, bool is_read)
898 {
899     return is_read ? blk->on_read_error : blk->on_write_error;
900 }
901 
902 BlockErrorAction blk_get_error_action(BlockBackend *blk, bool is_read,
903                                       int error)
904 {
905     BlockdevOnError on_err = blk_get_on_error(blk, is_read);
906 
907     switch (on_err) {
908     case BLOCKDEV_ON_ERROR_ENOSPC:
909         return (error == ENOSPC) ?
910                BLOCK_ERROR_ACTION_STOP : BLOCK_ERROR_ACTION_REPORT;
911     case BLOCKDEV_ON_ERROR_STOP:
912         return BLOCK_ERROR_ACTION_STOP;
913     case BLOCKDEV_ON_ERROR_REPORT:
914         return BLOCK_ERROR_ACTION_REPORT;
915     case BLOCKDEV_ON_ERROR_IGNORE:
916         return BLOCK_ERROR_ACTION_IGNORE;
917     default:
918         abort();
919     }
920 }
921 
922 static void send_qmp_error_event(BlockBackend *blk,
923                                  BlockErrorAction action,
924                                  bool is_read, int error)
925 {
926     IoOperationType optype;
927 
928     optype = is_read ? IO_OPERATION_TYPE_READ : IO_OPERATION_TYPE_WRITE;
929     qapi_event_send_block_io_error(blk_name(blk), optype, action,
930                                    blk_iostatus_is_enabled(blk),
931                                    error == ENOSPC, strerror(error),
932                                    &error_abort);
933 }
934 
935 /* This is done by device models because, while the block layer knows
936  * about the error, it does not know whether an operation comes from
937  * the device or the block layer (from a job, for example).
938  */
939 void blk_error_action(BlockBackend *blk, BlockErrorAction action,
940                       bool is_read, int error)
941 {
942     assert(error >= 0);
943 
944     if (action == BLOCK_ERROR_ACTION_STOP) {
945         /* First set the iostatus, so that "info block" returns an iostatus
946          * that matches the events raised so far (an additional error iostatus
947          * is fine, but not a lost one).
948          */
949         blk_iostatus_set_err(blk, error);
950 
951         /* Then raise the request to stop the VM and the event.
952          * qemu_system_vmstop_request_prepare has two effects.  First,
953          * it ensures that the STOP event always comes after the
954          * BLOCK_IO_ERROR event.  Second, it ensures that even if management
955          * can observe the STOP event and do a "cont" before the STOP
956          * event is issued, the VM will not stop.  In this case, vm_start()
957          * also ensures that the STOP/RESUME pair of events is emitted.
958          */
959         qemu_system_vmstop_request_prepare();
960         send_qmp_error_event(blk, action, is_read, error);
961         qemu_system_vmstop_request(RUN_STATE_IO_ERROR);
962     } else {
963         send_qmp_error_event(blk, action, is_read, error);
964     }
965 }
966 
967 int blk_is_read_only(BlockBackend *blk)
968 {
969     if (blk->bs) {
970         return bdrv_is_read_only(blk->bs);
971     } else {
972         return blk->root_state.read_only;
973     }
974 }
975 
976 int blk_is_sg(BlockBackend *blk)
977 {
978     if (!blk->bs) {
979         return 0;
980     }
981 
982     return bdrv_is_sg(blk->bs);
983 }
984 
985 int blk_enable_write_cache(BlockBackend *blk)
986 {
987     if (blk->bs) {
988         return bdrv_enable_write_cache(blk->bs);
989     } else {
990         return !!(blk->root_state.open_flags & BDRV_O_CACHE_WB);
991     }
992 }
993 
994 void blk_set_enable_write_cache(BlockBackend *blk, bool wce)
995 {
996     if (blk->bs) {
997         bdrv_set_enable_write_cache(blk->bs, wce);
998     } else {
999         if (wce) {
1000             blk->root_state.open_flags |= BDRV_O_CACHE_WB;
1001         } else {
1002             blk->root_state.open_flags &= ~BDRV_O_CACHE_WB;
1003         }
1004     }
1005 }
1006 
1007 void blk_invalidate_cache(BlockBackend *blk, Error **errp)
1008 {
1009     if (!blk->bs) {
1010         error_setg(errp, "Device '%s' has no medium", blk->name);
1011         return;
1012     }
1013 
1014     bdrv_invalidate_cache(blk->bs, errp);
1015 }
1016 
1017 bool blk_is_inserted(BlockBackend *blk)
1018 {
1019     return blk->bs && bdrv_is_inserted(blk->bs);
1020 }
1021 
1022 bool blk_is_available(BlockBackend *blk)
1023 {
1024     return blk_is_inserted(blk) && !blk_dev_is_tray_open(blk);
1025 }
1026 
1027 void blk_lock_medium(BlockBackend *blk, bool locked)
1028 {
1029     if (blk->bs) {
1030         bdrv_lock_medium(blk->bs, locked);
1031     }
1032 }
1033 
1034 void blk_eject(BlockBackend *blk, bool eject_flag)
1035 {
1036     if (blk->bs) {
1037         bdrv_eject(blk->bs, eject_flag);
1038     }
1039 }
1040 
1041 int blk_get_flags(BlockBackend *blk)
1042 {
1043     if (blk->bs) {
1044         return bdrv_get_flags(blk->bs);
1045     } else {
1046         return blk->root_state.open_flags;
1047     }
1048 }
1049 
1050 int blk_get_max_transfer_length(BlockBackend *blk)
1051 {
1052     if (blk->bs) {
1053         return blk->bs->bl.max_transfer_length;
1054     } else {
1055         return 0;
1056     }
1057 }
1058 
1059 int blk_get_max_iov(BlockBackend *blk)
1060 {
1061     return blk->bs->bl.max_iov;
1062 }
1063 
1064 void blk_set_guest_block_size(BlockBackend *blk, int align)
1065 {
1066     blk->guest_block_size = align;
1067 }
1068 
1069 void *blk_try_blockalign(BlockBackend *blk, size_t size)
1070 {
1071     return qemu_try_blockalign(blk ? blk->bs : NULL, size);
1072 }
1073 
1074 void *blk_blockalign(BlockBackend *blk, size_t size)
1075 {
1076     return qemu_blockalign(blk ? blk->bs : NULL, size);
1077 }
1078 
1079 bool blk_op_is_blocked(BlockBackend *blk, BlockOpType op, Error **errp)
1080 {
1081     if (!blk->bs) {
1082         return false;
1083     }
1084 
1085     return bdrv_op_is_blocked(blk->bs, op, errp);
1086 }
1087 
1088 void blk_op_unblock(BlockBackend *blk, BlockOpType op, Error *reason)
1089 {
1090     if (blk->bs) {
1091         bdrv_op_unblock(blk->bs, op, reason);
1092     }
1093 }
1094 
1095 void blk_op_block_all(BlockBackend *blk, Error *reason)
1096 {
1097     if (blk->bs) {
1098         bdrv_op_block_all(blk->bs, reason);
1099     }
1100 }
1101 
1102 void blk_op_unblock_all(BlockBackend *blk, Error *reason)
1103 {
1104     if (blk->bs) {
1105         bdrv_op_unblock_all(blk->bs, reason);
1106     }
1107 }
1108 
1109 AioContext *blk_get_aio_context(BlockBackend *blk)
1110 {
1111     if (blk->bs) {
1112         return bdrv_get_aio_context(blk->bs);
1113     } else {
1114         return qemu_get_aio_context();
1115     }
1116 }
1117 
1118 static AioContext *blk_aiocb_get_aio_context(BlockAIOCB *acb)
1119 {
1120     BlockBackendAIOCB *blk_acb = DO_UPCAST(BlockBackendAIOCB, common, acb);
1121     return blk_get_aio_context(blk_acb->blk);
1122 }
1123 
1124 void blk_set_aio_context(BlockBackend *blk, AioContext *new_context)
1125 {
1126     if (blk->bs) {
1127         bdrv_set_aio_context(blk->bs, new_context);
1128     }
1129 }
1130 
1131 void blk_add_aio_context_notifier(BlockBackend *blk,
1132         void (*attached_aio_context)(AioContext *new_context, void *opaque),
1133         void (*detach_aio_context)(void *opaque), void *opaque)
1134 {
1135     if (blk->bs) {
1136         bdrv_add_aio_context_notifier(blk->bs, attached_aio_context,
1137                                       detach_aio_context, opaque);
1138     }
1139 }
1140 
1141 void blk_remove_aio_context_notifier(BlockBackend *blk,
1142                                      void (*attached_aio_context)(AioContext *,
1143                                                                   void *),
1144                                      void (*detach_aio_context)(void *),
1145                                      void *opaque)
1146 {
1147     if (blk->bs) {
1148         bdrv_remove_aio_context_notifier(blk->bs, attached_aio_context,
1149                                          detach_aio_context, opaque);
1150     }
1151 }
1152 
1153 void blk_add_remove_bs_notifier(BlockBackend *blk, Notifier *notify)
1154 {
1155     notifier_list_add(&blk->remove_bs_notifiers, notify);
1156 }
1157 
1158 void blk_add_insert_bs_notifier(BlockBackend *blk, Notifier *notify)
1159 {
1160     notifier_list_add(&blk->insert_bs_notifiers, notify);
1161 }
1162 
1163 void blk_io_plug(BlockBackend *blk)
1164 {
1165     if (blk->bs) {
1166         bdrv_io_plug(blk->bs);
1167     }
1168 }
1169 
1170 void blk_io_unplug(BlockBackend *blk)
1171 {
1172     if (blk->bs) {
1173         bdrv_io_unplug(blk->bs);
1174     }
1175 }
1176 
1177 BlockAcctStats *blk_get_stats(BlockBackend *blk)
1178 {
1179     return &blk->stats;
1180 }
1181 
1182 void *blk_aio_get(const AIOCBInfo *aiocb_info, BlockBackend *blk,
1183                   BlockCompletionFunc *cb, void *opaque)
1184 {
1185     return qemu_aio_get(aiocb_info, blk_bs(blk), cb, opaque);
1186 }
1187 
1188 int coroutine_fn blk_co_write_zeroes(BlockBackend *blk, int64_t sector_num,
1189                                      int nb_sectors, BdrvRequestFlags flags)
1190 {
1191     int ret = blk_check_request(blk, sector_num, nb_sectors);
1192     if (ret < 0) {
1193         return ret;
1194     }
1195 
1196     return bdrv_co_write_zeroes(blk->bs, sector_num, nb_sectors, flags);
1197 }
1198 
1199 int blk_write_compressed(BlockBackend *blk, int64_t sector_num,
1200                          const uint8_t *buf, int nb_sectors)
1201 {
1202     int ret = blk_check_request(blk, sector_num, nb_sectors);
1203     if (ret < 0) {
1204         return ret;
1205     }
1206 
1207     return bdrv_write_compressed(blk->bs, sector_num, buf, nb_sectors);
1208 }
1209 
1210 int blk_truncate(BlockBackend *blk, int64_t offset)
1211 {
1212     if (!blk_is_available(blk)) {
1213         return -ENOMEDIUM;
1214     }
1215 
1216     return bdrv_truncate(blk->bs, offset);
1217 }
1218 
1219 int blk_discard(BlockBackend *blk, int64_t sector_num, int nb_sectors)
1220 {
1221     int ret = blk_check_request(blk, sector_num, nb_sectors);
1222     if (ret < 0) {
1223         return ret;
1224     }
1225 
1226     return bdrv_discard(blk->bs, sector_num, nb_sectors);
1227 }
1228 
1229 int blk_save_vmstate(BlockBackend *blk, const uint8_t *buf,
1230                      int64_t pos, int size)
1231 {
1232     if (!blk_is_available(blk)) {
1233         return -ENOMEDIUM;
1234     }
1235 
1236     return bdrv_save_vmstate(blk->bs, buf, pos, size);
1237 }
1238 
1239 int blk_load_vmstate(BlockBackend *blk, uint8_t *buf, int64_t pos, int size)
1240 {
1241     if (!blk_is_available(blk)) {
1242         return -ENOMEDIUM;
1243     }
1244 
1245     return bdrv_load_vmstate(blk->bs, buf, pos, size);
1246 }
1247 
1248 int blk_probe_blocksizes(BlockBackend *blk, BlockSizes *bsz)
1249 {
1250     if (!blk_is_available(blk)) {
1251         return -ENOMEDIUM;
1252     }
1253 
1254     return bdrv_probe_blocksizes(blk->bs, bsz);
1255 }
1256 
1257 int blk_probe_geometry(BlockBackend *blk, HDGeometry *geo)
1258 {
1259     if (!blk_is_available(blk)) {
1260         return -ENOMEDIUM;
1261     }
1262 
1263     return bdrv_probe_geometry(blk->bs, geo);
1264 }
1265 
1266 /*
1267  * Updates the BlockBackendRootState object with data from the currently
1268  * attached BlockDriverState.
1269  */
1270 void blk_update_root_state(BlockBackend *blk)
1271 {
1272     assert(blk->bs);
1273 
1274     blk->root_state.open_flags    = blk->bs->open_flags;
1275     blk->root_state.read_only     = blk->bs->read_only;
1276     blk->root_state.detect_zeroes = blk->bs->detect_zeroes;
1277 
1278     if (blk->root_state.throttle_group) {
1279         g_free(blk->root_state.throttle_group);
1280         throttle_group_unref(blk->root_state.throttle_state);
1281     }
1282     if (blk->bs->throttle_state) {
1283         const char *name = throttle_group_get_name(blk->bs);
1284         blk->root_state.throttle_group = g_strdup(name);
1285         blk->root_state.throttle_state = throttle_group_incref(name);
1286     } else {
1287         blk->root_state.throttle_group = NULL;
1288         blk->root_state.throttle_state = NULL;
1289     }
1290 }
1291 
1292 /*
1293  * Applies the information in the root state to the given BlockDriverState. This
1294  * does not include the flags which have to be specified for bdrv_open(), use
1295  * blk_get_open_flags_from_root_state() to inquire them.
1296  */
1297 void blk_apply_root_state(BlockBackend *blk, BlockDriverState *bs)
1298 {
1299     bs->detect_zeroes = blk->root_state.detect_zeroes;
1300     if (blk->root_state.throttle_group) {
1301         bdrv_io_limits_enable(bs, blk->root_state.throttle_group);
1302     }
1303 }
1304 
1305 /*
1306  * Returns the flags to be used for bdrv_open() of a BlockDriverState which is
1307  * supposed to inherit the root state.
1308  */
1309 int blk_get_open_flags_from_root_state(BlockBackend *blk)
1310 {
1311     int bs_flags;
1312 
1313     bs_flags = blk->root_state.read_only ? 0 : BDRV_O_RDWR;
1314     bs_flags |= blk->root_state.open_flags & ~BDRV_O_RDWR;
1315 
1316     return bs_flags;
1317 }
1318 
1319 BlockBackendRootState *blk_get_root_state(BlockBackend *blk)
1320 {
1321     return &blk->root_state;
1322 }
1323