block: Add synchronous wrapper for bdrv_co_is_allocated_above
There's no synchronous wrapper for bdrv_co_is_allocated_above function so it's not possible to check for sector allocation in an image with a backing file. Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com> Reviewed-by: Kevin Wolf <kwolf@redhat.com> Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
		
							parent
							
								
									7d81c1413c
								
							
						
					
					
						commit
						b35b2bba5b
					
				
							
								
								
									
										39
									
								
								block.c
									
									
									
									
									
								
							
							
						
						
									
										39
									
								
								block.c
									
									
									
									
									
								
							@ -2681,6 +2681,7 @@ int bdrv_has_zero_init(BlockDriverState *bs)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
typedef struct BdrvCoIsAllocatedData {
 | 
					typedef struct BdrvCoIsAllocatedData {
 | 
				
			||||||
    BlockDriverState *bs;
 | 
					    BlockDriverState *bs;
 | 
				
			||||||
 | 
					    BlockDriverState *base;
 | 
				
			||||||
    int64_t sector_num;
 | 
					    int64_t sector_num;
 | 
				
			||||||
    int nb_sectors;
 | 
					    int nb_sectors;
 | 
				
			||||||
    int *pnum;
 | 
					    int *pnum;
 | 
				
			||||||
@ -2813,6 +2814,44 @@ int coroutine_fn bdrv_co_is_allocated_above(BlockDriverState *top,
 | 
				
			|||||||
    return 0;
 | 
					    return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Coroutine wrapper for bdrv_is_allocated_above() */
 | 
				
			||||||
 | 
					static void coroutine_fn bdrv_is_allocated_above_co_entry(void *opaque)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    BdrvCoIsAllocatedData *data = opaque;
 | 
				
			||||||
 | 
					    BlockDriverState *top = data->bs;
 | 
				
			||||||
 | 
					    BlockDriverState *base = data->base;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    data->ret = bdrv_co_is_allocated_above(top, base, data->sector_num,
 | 
				
			||||||
 | 
					                                           data->nb_sectors, data->pnum);
 | 
				
			||||||
 | 
					    data->done = true;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Synchronous wrapper around bdrv_co_is_allocated_above().
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * See bdrv_co_is_allocated_above() for details.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					int bdrv_is_allocated_above(BlockDriverState *top, BlockDriverState *base,
 | 
				
			||||||
 | 
					                            int64_t sector_num, int nb_sectors, int *pnum)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    Coroutine *co;
 | 
				
			||||||
 | 
					    BdrvCoIsAllocatedData data = {
 | 
				
			||||||
 | 
					        .bs = top,
 | 
				
			||||||
 | 
					        .base = base,
 | 
				
			||||||
 | 
					        .sector_num = sector_num,
 | 
				
			||||||
 | 
					        .nb_sectors = nb_sectors,
 | 
				
			||||||
 | 
					        .pnum = pnum,
 | 
				
			||||||
 | 
					        .done = false,
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    co = qemu_coroutine_create(bdrv_is_allocated_above_co_entry);
 | 
				
			||||||
 | 
					    qemu_coroutine_enter(co, &data);
 | 
				
			||||||
 | 
					    while (!data.done) {
 | 
				
			||||||
 | 
					        qemu_aio_wait();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return data.ret;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
BlockInfo *bdrv_query_info(BlockDriverState *bs)
 | 
					BlockInfo *bdrv_query_info(BlockDriverState *bs)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    BlockInfo *info = g_malloc0(sizeof(*info));
 | 
					    BlockInfo *info = g_malloc0(sizeof(*info));
 | 
				
			||||||
 | 
				
			|||||||
@ -280,6 +280,8 @@ int bdrv_co_discard(BlockDriverState *bs, int64_t sector_num, int nb_sectors);
 | 
				
			|||||||
int bdrv_has_zero_init(BlockDriverState *bs);
 | 
					int bdrv_has_zero_init(BlockDriverState *bs);
 | 
				
			||||||
int bdrv_is_allocated(BlockDriverState *bs, int64_t sector_num, int nb_sectors,
 | 
					int bdrv_is_allocated(BlockDriverState *bs, int64_t sector_num, int nb_sectors,
 | 
				
			||||||
                      int *pnum);
 | 
					                      int *pnum);
 | 
				
			||||||
 | 
					int bdrv_is_allocated_above(BlockDriverState *top, BlockDriverState *base,
 | 
				
			||||||
 | 
					                            int64_t sector_num, int nb_sectors, int *pnum);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void bdrv_set_on_error(BlockDriverState *bs, BlockdevOnError on_read_error,
 | 
					void bdrv_set_on_error(BlockDriverState *bs, BlockdevOnError on_read_error,
 | 
				
			||||||
                       BlockdevOnError on_write_error);
 | 
					                       BlockdevOnError on_write_error);
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user