block: Remove BlockDriver.bdrv_read/write
There are no block drivers left that implement the old .bdrv_read/write interface, so it can be removed now. This gets us rid of the corresponding emulation functions, too. Signed-off-by: Kevin Wolf <kwolf@redhat.com> Reviewed-by: Fam Zheng <famz@redhat.com>
This commit is contained in:
		
							parent
							
								
									4575eb496d
								
							
						
					
					
						commit
						e3ddef25e9
					
				
							
								
								
									
										2
									
								
								block.c
								
								
								
								
							
							
						
						
									
										2
									
								
								block.c
								
								
								
								
							| 
						 | 
				
			
			@ -218,8 +218,6 @@ void bdrv_get_full_backing_filename(BlockDriverState *bs, char *dest, size_t sz,
 | 
			
		|||
 | 
			
		||||
void bdrv_register(BlockDriver *bdrv)
 | 
			
		||||
{
 | 
			
		||||
    bdrv_setup_io_funcs(bdrv);
 | 
			
		||||
 | 
			
		||||
    QLIST_INSERT_HEAD(&bdrv_drivers, bdrv, list);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										92
									
								
								block/io.c
								
								
								
								
							
							
						
						
									
										92
									
								
								block/io.c
								
								
								
								
							| 
						 | 
				
			
			@ -34,12 +34,6 @@
 | 
			
		|||
 | 
			
		||||
#define NOT_DONE 0x7fffffff /* used while emulated sync operation in progress */
 | 
			
		||||
 | 
			
		||||
static BlockAIOCB *bdrv_aio_readv_em(BlockDriverState *bs,
 | 
			
		||||
        int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
 | 
			
		||||
        BlockCompletionFunc *cb, void *opaque);
 | 
			
		||||
static BlockAIOCB *bdrv_aio_writev_em(BlockDriverState *bs,
 | 
			
		||||
        int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
 | 
			
		||||
        BlockCompletionFunc *cb, void *opaque);
 | 
			
		||||
static BlockAIOCB *bdrv_co_aio_rw_vector(BlockDriverState *bs,
 | 
			
		||||
                                         int64_t sector_num,
 | 
			
		||||
                                         QEMUIOVector *qiov,
 | 
			
		||||
| 
						 | 
				
			
			@ -104,18 +98,6 @@ void bdrv_io_limits_update_group(BlockDriverState *bs, const char *group)
 | 
			
		|||
    bdrv_io_limits_enable(bs, group);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void bdrv_setup_io_funcs(BlockDriver *bdrv)
 | 
			
		||||
{
 | 
			
		||||
    /* bdrv_co_readv_em()/brdv_co_writev_em() work in terms of aio, so if
 | 
			
		||||
     * the block driver lacks aio we need to emulate that.
 | 
			
		||||
     */
 | 
			
		||||
    if (!bdrv->bdrv_aio_readv) {
 | 
			
		||||
        /* add AIO emulation layer */
 | 
			
		||||
        bdrv->bdrv_aio_readv = bdrv_aio_readv_em;
 | 
			
		||||
        bdrv->bdrv_aio_writev = bdrv_aio_writev_em;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void bdrv_refresh_limits(BlockDriverState *bs, Error **errp)
 | 
			
		||||
{
 | 
			
		||||
    BlockDriver *drv = bs->drv;
 | 
			
		||||
| 
						 | 
				
			
			@ -2145,80 +2127,6 @@ void bdrv_aio_cancel_async(BlockAIOCB *acb)
 | 
			
		|||
/**************************************************************/
 | 
			
		||||
/* async block device emulation */
 | 
			
		||||
 | 
			
		||||
typedef struct BlockAIOCBSync {
 | 
			
		||||
    BlockAIOCB common;
 | 
			
		||||
    QEMUBH *bh;
 | 
			
		||||
    int ret;
 | 
			
		||||
    /* vector translation state */
 | 
			
		||||
    QEMUIOVector *qiov;
 | 
			
		||||
    uint8_t *bounce;
 | 
			
		||||
    int is_write;
 | 
			
		||||
} BlockAIOCBSync;
 | 
			
		||||
 | 
			
		||||
static const AIOCBInfo bdrv_em_aiocb_info = {
 | 
			
		||||
    .aiocb_size         = sizeof(BlockAIOCBSync),
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static void bdrv_aio_bh_cb(void *opaque)
 | 
			
		||||
{
 | 
			
		||||
    BlockAIOCBSync *acb = opaque;
 | 
			
		||||
 | 
			
		||||
    if (!acb->is_write && acb->ret >= 0) {
 | 
			
		||||
        qemu_iovec_from_buf(acb->qiov, 0, acb->bounce, acb->qiov->size);
 | 
			
		||||
    }
 | 
			
		||||
    qemu_vfree(acb->bounce);
 | 
			
		||||
    acb->common.cb(acb->common.opaque, acb->ret);
 | 
			
		||||
    qemu_bh_delete(acb->bh);
 | 
			
		||||
    acb->bh = NULL;
 | 
			
		||||
    qemu_aio_unref(acb);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static BlockAIOCB *bdrv_aio_rw_vector(BlockDriverState *bs,
 | 
			
		||||
                                      int64_t sector_num,
 | 
			
		||||
                                      QEMUIOVector *qiov,
 | 
			
		||||
                                      int nb_sectors,
 | 
			
		||||
                                      BlockCompletionFunc *cb,
 | 
			
		||||
                                      void *opaque,
 | 
			
		||||
                                      int is_write)
 | 
			
		||||
 | 
			
		||||
{
 | 
			
		||||
    BlockAIOCBSync *acb;
 | 
			
		||||
 | 
			
		||||
    acb = qemu_aio_get(&bdrv_em_aiocb_info, bs, cb, opaque);
 | 
			
		||||
    acb->is_write = is_write;
 | 
			
		||||
    acb->qiov = qiov;
 | 
			
		||||
    acb->bounce = qemu_try_blockalign(bs, qiov->size);
 | 
			
		||||
    acb->bh = aio_bh_new(bdrv_get_aio_context(bs), bdrv_aio_bh_cb, acb);
 | 
			
		||||
 | 
			
		||||
    if (acb->bounce == NULL) {
 | 
			
		||||
        acb->ret = -ENOMEM;
 | 
			
		||||
    } else if (is_write) {
 | 
			
		||||
        qemu_iovec_to_buf(acb->qiov, 0, acb->bounce, qiov->size);
 | 
			
		||||
        acb->ret = bs->drv->bdrv_write(bs, sector_num, acb->bounce, nb_sectors);
 | 
			
		||||
    } else {
 | 
			
		||||
        acb->ret = bs->drv->bdrv_read(bs, sector_num, acb->bounce, nb_sectors);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    qemu_bh_schedule(acb->bh);
 | 
			
		||||
 | 
			
		||||
    return &acb->common;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static BlockAIOCB *bdrv_aio_readv_em(BlockDriverState *bs,
 | 
			
		||||
        int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
 | 
			
		||||
        BlockCompletionFunc *cb, void *opaque)
 | 
			
		||||
{
 | 
			
		||||
    return bdrv_aio_rw_vector(bs, sector_num, qiov, nb_sectors, cb, opaque, 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static BlockAIOCB *bdrv_aio_writev_em(BlockDriverState *bs,
 | 
			
		||||
        int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
 | 
			
		||||
        BlockCompletionFunc *cb, void *opaque)
 | 
			
		||||
{
 | 
			
		||||
    return bdrv_aio_rw_vector(bs, sector_num, qiov, nb_sectors, cb, opaque, 1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
typedef struct BlockAIOCBCoroutine {
 | 
			
		||||
    BlockAIOCB common;
 | 
			
		||||
    BlockRequest req;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -127,10 +127,6 @@ struct BlockDriver {
 | 
			
		|||
                     Error **errp);
 | 
			
		||||
    int (*bdrv_file_open)(BlockDriverState *bs, QDict *options, int flags,
 | 
			
		||||
                          Error **errp);
 | 
			
		||||
    int (*bdrv_read)(BlockDriverState *bs, int64_t sector_num,
 | 
			
		||||
                     uint8_t *buf, int nb_sectors);
 | 
			
		||||
    int (*bdrv_write)(BlockDriverState *bs, int64_t sector_num,
 | 
			
		||||
                      const uint8_t *buf, int nb_sectors);
 | 
			
		||||
    void (*bdrv_close)(BlockDriverState *bs);
 | 
			
		||||
    int (*bdrv_create)(const char *filename, QemuOpts *opts, Error **errp);
 | 
			
		||||
    int (*bdrv_set_key)(BlockDriverState *bs, const char *key);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue