block: Mark bdrv_co_create() and callers GRAPH_RDLOCK
This adds GRAPH_RDLOCK annotations to declare that callers of bdrv_co_create() need to hold a reader lock for the graph. Signed-off-by: Emanuele Giuseppe Esposito <eesposit@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com> Message-Id: <20230203152202.49054-17-kwolf@redhat.com> Reviewed-by: Emanuele Giuseppe Esposito <eesposit@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
		
							parent
							
								
									7b9e8b22bc
								
							
						
					
					
						commit
						4ec8df0183
					
				
							
								
								
									
										1
									
								
								block.c
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								block.c
									
									
									
									
									
								
							@ -533,6 +533,7 @@ int coroutine_fn bdrv_co_create(BlockDriver *drv, const char *filename,
 | 
				
			|||||||
    int ret;
 | 
					    int ret;
 | 
				
			||||||
    GLOBAL_STATE_CODE();
 | 
					    GLOBAL_STATE_CODE();
 | 
				
			||||||
    ERRP_GUARD();
 | 
					    ERRP_GUARD();
 | 
				
			||||||
 | 
					    assert_bdrv_graph_readable();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!drv->bdrv_co_create_opts) {
 | 
					    if (!drv->bdrv_co_create_opts) {
 | 
				
			||||||
        error_setg(errp, "Driver '%s' does not support image creation",
 | 
					        error_setg(errp, "Driver '%s' does not support image creation",
 | 
				
			||||||
 | 
				
			|||||||
@ -43,6 +43,7 @@ static int coroutine_fn blockdev_create_run(Job *job, Error **errp)
 | 
				
			|||||||
    int ret;
 | 
					    int ret;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    GLOBAL_STATE_CODE();
 | 
					    GLOBAL_STATE_CODE();
 | 
				
			||||||
 | 
					    GRAPH_RDLOCK_GUARD();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    job_progress_set_remaining(&s->common, 1);
 | 
					    job_progress_set_remaining(&s->common, 1);
 | 
				
			||||||
    ret = s->drv->bdrv_co_create(s->opts, errp);
 | 
					    ret = s->drv->bdrv_co_create(s->opts, errp);
 | 
				
			||||||
@ -59,6 +60,12 @@ static const JobDriver blockdev_create_job_driver = {
 | 
				
			|||||||
    .run           = blockdev_create_run,
 | 
					    .run           = blockdev_create_run,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Checking whether the function is present doesn't require the graph lock */
 | 
				
			||||||
 | 
					static inline bool TSA_NO_TSA has_bdrv_co_create(BlockDriver *drv)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    return drv->bdrv_co_create;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void qmp_blockdev_create(const char *job_id, BlockdevCreateOptions *options,
 | 
					void qmp_blockdev_create(const char *job_id, BlockdevCreateOptions *options,
 | 
				
			||||||
                         Error **errp)
 | 
					                         Error **errp)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@ -79,7 +86,7 @@ void qmp_blockdev_create(const char *job_id, BlockdevCreateOptions *options,
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* Error out if the driver doesn't support .bdrv_co_create */
 | 
					    /* Error out if the driver doesn't support .bdrv_co_create */
 | 
				
			||||||
    if (!drv->bdrv_co_create) {
 | 
					    if (!has_bdrv_co_create(drv)) {
 | 
				
			||||||
        error_setg(errp, "Driver does not support blockdev-create");
 | 
					        error_setg(errp, "Driver does not support blockdev-create");
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
				
			|||||||
@ -664,10 +664,9 @@ fail:
 | 
				
			|||||||
    return ret;
 | 
					    return ret;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int coroutine_fn block_crypto_co_create_opts_luks(BlockDriver *drv,
 | 
					static int coroutine_fn GRAPH_RDLOCK
 | 
				
			||||||
                                                         const char *filename,
 | 
					block_crypto_co_create_opts_luks(BlockDriver *drv, const char *filename,
 | 
				
			||||||
                                                         QemuOpts *opts,
 | 
					                                 QemuOpts *opts, Error **errp)
 | 
				
			||||||
                                                         Error **errp)
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    QCryptoBlockCreateOptions *create_opts = NULL;
 | 
					    QCryptoBlockCreateOptions *create_opts = NULL;
 | 
				
			||||||
    BlockDriverState *bs = NULL;
 | 
					    BlockDriverState *bs = NULL;
 | 
				
			||||||
 | 
				
			|||||||
@ -2607,10 +2607,9 @@ out:
 | 
				
			|||||||
    return result;
 | 
					    return result;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int coroutine_fn raw_co_create_opts(BlockDriver *drv,
 | 
					static int coroutine_fn GRAPH_RDLOCK
 | 
				
			||||||
                                           const char *filename,
 | 
					raw_co_create_opts(BlockDriver *drv, const char *filename,
 | 
				
			||||||
                                           QemuOpts *opts,
 | 
					                   QemuOpts *opts, Error **errp)
 | 
				
			||||||
                                           Error **errp)
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    BlockdevCreateOptions options;
 | 
					    BlockdevCreateOptions options;
 | 
				
			||||||
    int64_t total_size = 0;
 | 
					    int64_t total_size = 0;
 | 
				
			||||||
 | 
				
			|||||||
@ -613,10 +613,9 @@ static int raw_co_create(BlockdevCreateOptions *options, Error **errp)
 | 
				
			|||||||
    return 0;
 | 
					    return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int coroutine_fn raw_co_create_opts(BlockDriver *drv,
 | 
					static int coroutine_fn GRAPH_RDLOCK
 | 
				
			||||||
                                           const char *filename,
 | 
					raw_co_create_opts(BlockDriver *drv, const char *filename,
 | 
				
			||||||
                                           QemuOpts *opts,
 | 
					                   QemuOpts *opts, Error **errp)
 | 
				
			||||||
                                           Error **errp)
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    BlockdevCreateOptions options;
 | 
					    BlockdevCreateOptions options;
 | 
				
			||||||
    int64_t total_size = 0;
 | 
					    int64_t total_size = 0;
 | 
				
			||||||
 | 
				
			|||||||
@ -622,10 +622,9 @@ exit:
 | 
				
			|||||||
    goto out;
 | 
					    goto out;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int coroutine_fn parallels_co_create_opts(BlockDriver *drv,
 | 
					static int coroutine_fn GRAPH_RDLOCK
 | 
				
			||||||
                                                 const char *filename,
 | 
					parallels_co_create_opts(BlockDriver *drv, const char *filename,
 | 
				
			||||||
                                                 QemuOpts *opts,
 | 
					                         QemuOpts *opts, Error **errp)
 | 
				
			||||||
                                                 Error **errp)
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    BlockdevCreateOptions *create_options = NULL;
 | 
					    BlockdevCreateOptions *create_options = NULL;
 | 
				
			||||||
    BlockDriverState *bs = NULL;
 | 
					    BlockDriverState *bs = NULL;
 | 
				
			||||||
 | 
				
			|||||||
@ -921,8 +921,8 @@ exit:
 | 
				
			|||||||
    return ret;
 | 
					    return ret;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int coroutine_fn qcow_co_create_opts(BlockDriver *drv,
 | 
					static int coroutine_fn GRAPH_RDLOCK
 | 
				
			||||||
                                            const char *filename,
 | 
					qcow_co_create_opts(BlockDriver *drv, const char *filename,
 | 
				
			||||||
                    QemuOpts *opts, Error **errp)
 | 
					                    QemuOpts *opts, Error **errp)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    BlockdevCreateOptions *create_options = NULL;
 | 
					    BlockdevCreateOptions *create_options = NULL;
 | 
				
			||||||
 | 
				
			|||||||
@ -3816,9 +3816,8 @@ out:
 | 
				
			|||||||
    return ret;
 | 
					    return ret;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int coroutine_fn qcow2_co_create_opts(BlockDriver *drv,
 | 
					static int coroutine_fn GRAPH_RDLOCK
 | 
				
			||||||
                                             const char *filename,
 | 
					qcow2_co_create_opts(BlockDriver *drv, const char *filename, QemuOpts *opts,
 | 
				
			||||||
                                             QemuOpts *opts,
 | 
					 | 
				
			||||||
                     Error **errp)
 | 
					                     Error **errp)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    BlockdevCreateOptions *create_options = NULL;
 | 
					    BlockdevCreateOptions *create_options = NULL;
 | 
				
			||||||
 | 
				
			|||||||
@ -754,10 +754,9 @@ out:
 | 
				
			|||||||
    return ret;
 | 
					    return ret;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int coroutine_fn bdrv_qed_co_create_opts(BlockDriver *drv,
 | 
					static int coroutine_fn GRAPH_RDLOCK
 | 
				
			||||||
                                                const char *filename,
 | 
					bdrv_qed_co_create_opts(BlockDriver *drv, const char *filename,
 | 
				
			||||||
                                                QemuOpts *opts,
 | 
					                        QemuOpts *opts, Error **errp)
 | 
				
			||||||
                                                Error **errp)
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    BlockdevCreateOptions *create_options = NULL;
 | 
					    BlockdevCreateOptions *create_options = NULL;
 | 
				
			||||||
    QDict *qdict;
 | 
					    QDict *qdict;
 | 
				
			||||||
 | 
				
			|||||||
@ -430,10 +430,9 @@ static int raw_has_zero_init(BlockDriverState *bs)
 | 
				
			|||||||
    return bdrv_has_zero_init(bs->file->bs);
 | 
					    return bdrv_has_zero_init(bs->file->bs);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int coroutine_fn raw_co_create_opts(BlockDriver *drv,
 | 
					static int coroutine_fn GRAPH_RDLOCK
 | 
				
			||||||
                                           const char *filename,
 | 
					raw_co_create_opts(BlockDriver *drv, const char *filename,
 | 
				
			||||||
                                           QemuOpts *opts,
 | 
					                   QemuOpts *opts, Error **errp)
 | 
				
			||||||
                                           Error **errp)
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    return bdrv_co_create_file(filename, opts, errp);
 | 
					    return bdrv_co_create_file(filename, opts, errp);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -898,10 +898,9 @@ static int coroutine_fn vdi_co_create(BlockdevCreateOptions *create_options,
 | 
				
			|||||||
    return vdi_co_do_create(create_options, DEFAULT_CLUSTER_SIZE, errp);
 | 
					    return vdi_co_do_create(create_options, DEFAULT_CLUSTER_SIZE, errp);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int coroutine_fn vdi_co_create_opts(BlockDriver *drv,
 | 
					static int coroutine_fn GRAPH_RDLOCK
 | 
				
			||||||
                                           const char *filename,
 | 
					vdi_co_create_opts(BlockDriver *drv, const char *filename,
 | 
				
			||||||
                                           QemuOpts *opts,
 | 
					                   QemuOpts *opts, Error **errp)
 | 
				
			||||||
                                           Error **errp)
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    QDict *qdict = NULL;
 | 
					    QDict *qdict = NULL;
 | 
				
			||||||
    BlockdevCreateOptions *create_options = NULL;
 | 
					    BlockdevCreateOptions *create_options = NULL;
 | 
				
			||||||
 | 
				
			|||||||
@ -2059,10 +2059,9 @@ delete_and_exit:
 | 
				
			|||||||
    return ret;
 | 
					    return ret;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int coroutine_fn vhdx_co_create_opts(BlockDriver *drv,
 | 
					static int coroutine_fn GRAPH_RDLOCK
 | 
				
			||||||
                                            const char *filename,
 | 
					vhdx_co_create_opts(BlockDriver *drv, const char *filename,
 | 
				
			||||||
                                            QemuOpts *opts,
 | 
					                    QemuOpts *opts, Error **errp)
 | 
				
			||||||
                                            Error **errp)
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    BlockdevCreateOptions *create_options = NULL;
 | 
					    BlockdevCreateOptions *create_options = NULL;
 | 
				
			||||||
    QDict *qdict;
 | 
					    QDict *qdict;
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										37
									
								
								block/vmdk.c
									
									
									
									
									
								
							
							
						
						
									
										37
									
								
								block/vmdk.c
									
									
									
									
									
								
							@ -2277,10 +2277,9 @@ exit:
 | 
				
			|||||||
    return ret;
 | 
					    return ret;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int coroutine_fn vmdk_create_extent(const char *filename,
 | 
					static int coroutine_fn GRAPH_RDLOCK
 | 
				
			||||||
                                           int64_t filesize, bool flat,
 | 
					vmdk_create_extent(const char *filename, int64_t filesize, bool flat,
 | 
				
			||||||
                                           bool compress, bool zeroed_grain,
 | 
					                   bool compress, bool zeroed_grain, BlockBackend **pbb,
 | 
				
			||||||
                                           BlockBackend **pbb,
 | 
					 | 
				
			||||||
                   QemuOpts *opts, Error **errp)
 | 
					                   QemuOpts *opts, Error **errp)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    int ret;
 | 
					    int ret;
 | 
				
			||||||
@ -2359,13 +2358,9 @@ static int filename_decompose(const char *filename, char *path, char *prefix,
 | 
				
			|||||||
 *           non-split format.
 | 
					 *           non-split format.
 | 
				
			||||||
 * idx >= 1: get the n-th extent if in a split subformat
 | 
					 * idx >= 1: get the n-th extent if in a split subformat
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
typedef BlockBackend * coroutine_fn (*vmdk_create_extent_fn)(int64_t size,
 | 
					typedef BlockBackend * coroutine_fn /* GRAPH_RDLOCK */
 | 
				
			||||||
                                                             int idx,
 | 
					    (*vmdk_create_extent_fn)(int64_t size, int idx, bool flat, bool split,
 | 
				
			||||||
                                                             bool flat,
 | 
					                             bool compress, bool zeroed_grain, void *opaque,
 | 
				
			||||||
                                                             bool split,
 | 
					 | 
				
			||||||
                                                             bool compress,
 | 
					 | 
				
			||||||
                                                             bool zeroed_grain,
 | 
					 | 
				
			||||||
                                                             void *opaque,
 | 
					 | 
				
			||||||
                             Error **errp);
 | 
					                             Error **errp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void vmdk_desc_add_extent(GString *desc,
 | 
					static void vmdk_desc_add_extent(GString *desc,
 | 
				
			||||||
@ -2379,7 +2374,8 @@ static void vmdk_desc_add_extent(GString *desc,
 | 
				
			|||||||
    g_free(basename);
 | 
					    g_free(basename);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int coroutine_fn vmdk_co_do_create(int64_t size,
 | 
					static int coroutine_fn GRAPH_RDLOCK
 | 
				
			||||||
 | 
					vmdk_co_do_create(int64_t size,
 | 
				
			||||||
                  BlockdevVmdkSubformat subformat,
 | 
					                  BlockdevVmdkSubformat subformat,
 | 
				
			||||||
                  BlockdevVmdkAdapterType adapter_type,
 | 
					                  BlockdevVmdkAdapterType adapter_type,
 | 
				
			||||||
                  const char *backing_file,
 | 
					                  const char *backing_file,
 | 
				
			||||||
@ -2609,9 +2605,9 @@ typedef struct {
 | 
				
			|||||||
    QemuOpts *opts;
 | 
					    QemuOpts *opts;
 | 
				
			||||||
} VMDKCreateOptsData;
 | 
					} VMDKCreateOptsData;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static BlockBackend * coroutine_fn vmdk_co_create_opts_cb(int64_t size, int idx,
 | 
					static BlockBackend * coroutine_fn GRAPH_RDLOCK
 | 
				
			||||||
                                            bool flat, bool split, bool compress,
 | 
					vmdk_co_create_opts_cb(int64_t size, int idx, bool flat, bool split,
 | 
				
			||||||
                                            bool zeroed_grain, void *opaque,
 | 
					                       bool compress, bool zeroed_grain, void *opaque,
 | 
				
			||||||
                       Error **errp)
 | 
					                       Error **errp)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    BlockBackend *blk = NULL;
 | 
					    BlockBackend *blk = NULL;
 | 
				
			||||||
@ -2651,10 +2647,9 @@ exit:
 | 
				
			|||||||
    return blk;
 | 
					    return blk;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int coroutine_fn vmdk_co_create_opts(BlockDriver *drv,
 | 
					static int coroutine_fn GRAPH_RDLOCK
 | 
				
			||||||
                                            const char *filename,
 | 
					vmdk_co_create_opts(BlockDriver *drv, const char *filename,
 | 
				
			||||||
                                            QemuOpts *opts,
 | 
					                    QemuOpts *opts, Error **errp)
 | 
				
			||||||
                                            Error **errp)
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    Error *local_err = NULL;
 | 
					    Error *local_err = NULL;
 | 
				
			||||||
    char *desc = NULL;
 | 
					    char *desc = NULL;
 | 
				
			||||||
@ -2814,8 +2809,8 @@ static BlockBackend * coroutine_fn vmdk_co_create_cb(int64_t size, int idx,
 | 
				
			|||||||
    return blk;
 | 
					    return blk;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int coroutine_fn vmdk_co_create(BlockdevCreateOptions *create_options,
 | 
					static int coroutine_fn GRAPH_RDLOCK
 | 
				
			||||||
                                       Error **errp)
 | 
					vmdk_co_create(BlockdevCreateOptions *create_options, Error **errp)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    BlockdevCreateOptionsVmdk *opts;
 | 
					    BlockdevCreateOptionsVmdk *opts;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -1087,10 +1087,9 @@ out:
 | 
				
			|||||||
    return ret;
 | 
					    return ret;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int coroutine_fn vpc_co_create_opts(BlockDriver *drv,
 | 
					static int coroutine_fn GRAPH_RDLOCK
 | 
				
			||||||
                                           const char *filename,
 | 
					vpc_co_create_opts(BlockDriver *drv, const char *filename,
 | 
				
			||||||
                                           QemuOpts *opts,
 | 
					                   QemuOpts *opts, Error **errp)
 | 
				
			||||||
                                           Error **errp)
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    BlockdevCreateOptions *create_options = NULL;
 | 
					    BlockdevCreateOptions *create_options = NULL;
 | 
				
			||||||
    QDict *qdict;
 | 
					    QDict *qdict;
 | 
				
			||||||
 | 
				
			|||||||
@ -58,13 +58,15 @@ BlockDriver *bdrv_find_protocol(const char *filename,
 | 
				
			|||||||
                                Error **errp);
 | 
					                                Error **errp);
 | 
				
			||||||
BlockDriver *bdrv_find_format(const char *format_name);
 | 
					BlockDriver *bdrv_find_format(const char *format_name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int coroutine_fn bdrv_co_create(BlockDriver *drv, const char *filename,
 | 
					int coroutine_fn GRAPH_RDLOCK
 | 
				
			||||||
                                QemuOpts *opts, Error **errp);
 | 
					bdrv_co_create(BlockDriver *drv, const char *filename, QemuOpts *opts,
 | 
				
			||||||
int co_wrapper bdrv_create(BlockDriver *drv, const char *filename,
 | 
					               Error **errp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int co_wrapper_bdrv_rdlock bdrv_create(BlockDriver *drv, const char *filename,
 | 
				
			||||||
                                       QemuOpts *opts, Error **errp);
 | 
					                                       QemuOpts *opts, Error **errp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int coroutine_fn bdrv_co_create_file(const char *filename, QemuOpts *opts,
 | 
					int coroutine_fn GRAPH_RDLOCK
 | 
				
			||||||
                                     Error **errp);
 | 
					bdrv_co_create_file(const char *filename, QemuOpts *opts, Error **errp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
BlockDriverState *bdrv_new(void);
 | 
					BlockDriverState *bdrv_new(void);
 | 
				
			||||||
int bdrv_append(BlockDriverState *bs_new, BlockDriverState *bs_top,
 | 
					int bdrv_append(BlockDriverState *bs_new, BlockDriverState *bs_top,
 | 
				
			||||||
 | 
				
			|||||||
@ -246,12 +246,11 @@ struct BlockDriver {
 | 
				
			|||||||
                          Error **errp);
 | 
					                          Error **errp);
 | 
				
			||||||
    void (*bdrv_close)(BlockDriverState *bs);
 | 
					    void (*bdrv_close)(BlockDriverState *bs);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    int coroutine_fn (*bdrv_co_create)(BlockdevCreateOptions *opts,
 | 
					    int coroutine_fn GRAPH_RDLOCK_PTR (*bdrv_co_create)(
 | 
				
			||||||
                                       Error **errp);
 | 
					        BlockdevCreateOptions *opts, Error **errp);
 | 
				
			||||||
    int coroutine_fn (*bdrv_co_create_opts)(BlockDriver *drv,
 | 
					
 | 
				
			||||||
                                            const char *filename,
 | 
					    int coroutine_fn GRAPH_RDLOCK_PTR (*bdrv_co_create_opts)(
 | 
				
			||||||
                                            QemuOpts *opts,
 | 
					        BlockDriver *drv, const char *filename, QemuOpts *opts, Error **errp);
 | 
				
			||||||
                                            Error **errp);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    int (*bdrv_amend_options)(BlockDriverState *bs,
 | 
					    int (*bdrv_amend_options)(BlockDriverState *bs,
 | 
				
			||||||
                              QemuOpts *opts,
 | 
					                              QemuOpts *opts,
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user