block: add default implementations for bdrv_co_get_block_status()
bdrv_co_get_block_status_from_file() and bdrv_co_get_block_status_from_backing() set *file to bs->file and bs->backing respectively, so that bdrv_co_get_block_status() can recurse to them. Future block drivers won't have to duplicate code to implement this. Reviewed-by: Fam Zheng <famz@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com> Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> Reviewed-by: Kevin Wolf <kwolf@redhat.com> Signed-off-by: Manos Pitsidianakis <el13635@mail.ntua.gr> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
		
							parent
							
								
									d8e12cd322
								
							
						
					
					
						commit
						f7cc69b326
					
				| 
						 | 
				
			
			@ -628,16 +628,6 @@ static int coroutine_fn blkdebug_co_pdiscard(BlockDriverState *bs,
 | 
			
		|||
    return bdrv_co_pdiscard(bs->file->bs, offset, bytes);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int64_t coroutine_fn blkdebug_co_get_block_status(
 | 
			
		||||
    BlockDriverState *bs, int64_t sector_num, int nb_sectors, int *pnum,
 | 
			
		||||
    BlockDriverState **file)
 | 
			
		||||
{
 | 
			
		||||
    *pnum = nb_sectors;
 | 
			
		||||
    *file = bs->file->bs;
 | 
			
		||||
    return BDRV_BLOCK_RAW | BDRV_BLOCK_OFFSET_VALID |
 | 
			
		||||
        (sector_num << BDRV_SECTOR_BITS);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void blkdebug_close(BlockDriverState *bs)
 | 
			
		||||
{
 | 
			
		||||
    BDRVBlkdebugState *s = bs->opaque;
 | 
			
		||||
| 
						 | 
				
			
			@ -907,7 +897,7 @@ static BlockDriver bdrv_blkdebug = {
 | 
			
		|||
    .bdrv_co_flush_to_disk  = blkdebug_co_flush,
 | 
			
		||||
    .bdrv_co_pwrite_zeroes  = blkdebug_co_pwrite_zeroes,
 | 
			
		||||
    .bdrv_co_pdiscard       = blkdebug_co_pdiscard,
 | 
			
		||||
    .bdrv_co_get_block_status = blkdebug_co_get_block_status,
 | 
			
		||||
    .bdrv_co_get_block_status = bdrv_co_get_block_status_from_file,
 | 
			
		||||
 | 
			
		||||
    .bdrv_debug_event           = blkdebug_debug_event,
 | 
			
		||||
    .bdrv_debug_breakpoint      = blkdebug_debug_breakpoint,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -244,16 +244,6 @@ static int coroutine_fn bdrv_commit_top_preadv(BlockDriverState *bs,
 | 
			
		|||
    return bdrv_co_preadv(bs->backing, offset, bytes, qiov, flags);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int64_t coroutine_fn bdrv_commit_top_get_block_status(
 | 
			
		||||
    BlockDriverState *bs, int64_t sector_num, int nb_sectors, int *pnum,
 | 
			
		||||
    BlockDriverState **file)
 | 
			
		||||
{
 | 
			
		||||
    *pnum = nb_sectors;
 | 
			
		||||
    *file = bs->backing->bs;
 | 
			
		||||
    return BDRV_BLOCK_RAW | BDRV_BLOCK_OFFSET_VALID |
 | 
			
		||||
           (sector_num << BDRV_SECTOR_BITS);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void bdrv_commit_top_refresh_filename(BlockDriverState *bs, QDict *opts)
 | 
			
		||||
{
 | 
			
		||||
    bdrv_refresh_filename(bs->backing->bs);
 | 
			
		||||
| 
						 | 
				
			
			@ -279,7 +269,7 @@ static void bdrv_commit_top_child_perm(BlockDriverState *bs, BdrvChild *c,
 | 
			
		|||
static BlockDriver bdrv_commit_top = {
 | 
			
		||||
    .format_name                = "commit_top",
 | 
			
		||||
    .bdrv_co_preadv             = bdrv_commit_top_preadv,
 | 
			
		||||
    .bdrv_co_get_block_status   = bdrv_commit_top_get_block_status,
 | 
			
		||||
    .bdrv_co_get_block_status   = bdrv_co_get_block_status_from_backing,
 | 
			
		||||
    .bdrv_refresh_filename      = bdrv_commit_top_refresh_filename,
 | 
			
		||||
    .bdrv_close                 = bdrv_commit_top_close,
 | 
			
		||||
    .bdrv_child_perm            = bdrv_commit_top_child_perm,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										26
									
								
								block/io.c
								
								
								
								
							
							
						
						
									
										26
									
								
								block/io.c
								
								
								
								
							| 
						 | 
				
			
			@ -1714,6 +1714,32 @@ typedef struct BdrvCoGetBlockStatusData {
 | 
			
		|||
    bool done;
 | 
			
		||||
} BdrvCoGetBlockStatusData;
 | 
			
		||||
 | 
			
		||||
int64_t coroutine_fn bdrv_co_get_block_status_from_file(BlockDriverState *bs,
 | 
			
		||||
                                                        int64_t sector_num,
 | 
			
		||||
                                                        int nb_sectors,
 | 
			
		||||
                                                        int *pnum,
 | 
			
		||||
                                                        BlockDriverState **file)
 | 
			
		||||
{
 | 
			
		||||
    assert(bs->file && bs->file->bs);
 | 
			
		||||
    *pnum = nb_sectors;
 | 
			
		||||
    *file = bs->file->bs;
 | 
			
		||||
    return BDRV_BLOCK_RAW | BDRV_BLOCK_OFFSET_VALID |
 | 
			
		||||
           (sector_num << BDRV_SECTOR_BITS);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int64_t coroutine_fn bdrv_co_get_block_status_from_backing(BlockDriverState *bs,
 | 
			
		||||
                                                           int64_t sector_num,
 | 
			
		||||
                                                           int nb_sectors,
 | 
			
		||||
                                                           int *pnum,
 | 
			
		||||
                                                           BlockDriverState **file)
 | 
			
		||||
{
 | 
			
		||||
    assert(bs->backing && bs->backing->bs);
 | 
			
		||||
    *pnum = nb_sectors;
 | 
			
		||||
    *file = bs->backing->bs;
 | 
			
		||||
    return BDRV_BLOCK_RAW | BDRV_BLOCK_OFFSET_VALID |
 | 
			
		||||
           (sector_num << BDRV_SECTOR_BITS);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Returns the allocation status of the specified sectors.
 | 
			
		||||
 * Drivers not implementing the functionality are assumed to not support
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1059,16 +1059,6 @@ static int coroutine_fn bdrv_mirror_top_flush(BlockDriverState *bs)
 | 
			
		|||
    return bdrv_co_flush(bs->backing->bs);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int64_t coroutine_fn bdrv_mirror_top_get_block_status(
 | 
			
		||||
    BlockDriverState *bs, int64_t sector_num, int nb_sectors, int *pnum,
 | 
			
		||||
    BlockDriverState **file)
 | 
			
		||||
{
 | 
			
		||||
    *pnum = nb_sectors;
 | 
			
		||||
    *file = bs->backing->bs;
 | 
			
		||||
    return BDRV_BLOCK_RAW | BDRV_BLOCK_OFFSET_VALID |
 | 
			
		||||
           (sector_num << BDRV_SECTOR_BITS);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int coroutine_fn bdrv_mirror_top_pwrite_zeroes(BlockDriverState *bs,
 | 
			
		||||
    int64_t offset, int bytes, BdrvRequestFlags flags)
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			@ -1115,7 +1105,7 @@ static BlockDriver bdrv_mirror_top = {
 | 
			
		|||
    .bdrv_co_pwrite_zeroes      = bdrv_mirror_top_pwrite_zeroes,
 | 
			
		||||
    .bdrv_co_pdiscard           = bdrv_mirror_top_pdiscard,
 | 
			
		||||
    .bdrv_co_flush              = bdrv_mirror_top_flush,
 | 
			
		||||
    .bdrv_co_get_block_status   = bdrv_mirror_top_get_block_status,
 | 
			
		||||
    .bdrv_co_get_block_status   = bdrv_co_get_block_status_from_backing,
 | 
			
		||||
    .bdrv_refresh_filename      = bdrv_mirror_top_refresh_filename,
 | 
			
		||||
    .bdrv_close                 = bdrv_mirror_top_close,
 | 
			
		||||
    .bdrv_child_perm            = bdrv_mirror_top_child_perm,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -964,6 +964,24 @@ void bdrv_format_default_perms(BlockDriverState *bs, BdrvChild *c,
 | 
			
		|||
                               uint64_t perm, uint64_t shared,
 | 
			
		||||
                               uint64_t *nperm, uint64_t *nshared);
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Default implementation for drivers to pass bdrv_co_get_block_status() to
 | 
			
		||||
 * their file.
 | 
			
		||||
 */
 | 
			
		||||
int64_t coroutine_fn bdrv_co_get_block_status_from_file(BlockDriverState *bs,
 | 
			
		||||
                                                        int64_t sector_num,
 | 
			
		||||
                                                        int nb_sectors,
 | 
			
		||||
                                                        int *pnum,
 | 
			
		||||
                                                        BlockDriverState **file);
 | 
			
		||||
/*
 | 
			
		||||
 * Default implementation for drivers to pass bdrv_co_get_block_status() to
 | 
			
		||||
 * their backing file.
 | 
			
		||||
 */
 | 
			
		||||
int64_t coroutine_fn bdrv_co_get_block_status_from_backing(BlockDriverState *bs,
 | 
			
		||||
                                                           int64_t sector_num,
 | 
			
		||||
                                                           int nb_sectors,
 | 
			
		||||
                                                           int *pnum,
 | 
			
		||||
                                                           BlockDriverState **file);
 | 
			
		||||
const char *bdrv_get_parent_name(const BlockDriverState *bs);
 | 
			
		||||
void blk_dev_change_media_cb(BlockBackend *blk, bool load, Error **errp);
 | 
			
		||||
bool blk_dev_has_removable_media(BlockBackend *blk);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue