block: change flush to co_flush
Since coroutine operation is now mandatory, convert all bdrv_flush implementations to coroutines. For qcow2, this means taking the lock. Other implementations are simpler and just forward bdrv_flush to the underlying protocol, so they can avoid the lock. The bdrv_flush callback is then unused and can be eliminated. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
		
							parent
							
								
									e183ef75cc
								
							
						
					
					
						commit
						8b94ff8573
					
				
							
								
								
									
										2
									
								
								block.c
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								block.c
									
									
									
									
									
								
							| @ -2892,8 +2892,6 @@ int coroutine_fn bdrv_co_flush(BlockDriverState *bs) | ||||
|             qemu_coroutine_yield(); | ||||
|             return co.ret; | ||||
|         } | ||||
|     } else if (bs->drv->bdrv_flush) { | ||||
|         return bs->drv->bdrv_flush(bs); | ||||
|     } else { | ||||
|         /*
 | ||||
|          * Some block drivers always operate in either writethrough or unsafe | ||||
|  | ||||
| @ -306,9 +306,9 @@ exit: | ||||
|     return ret; | ||||
| } | ||||
| 
 | ||||
| static int cow_flush(BlockDriverState *bs) | ||||
| static coroutine_fn int cow_co_flush(BlockDriverState *bs) | ||||
| { | ||||
|     return bdrv_flush(bs->file); | ||||
|     return bdrv_co_flush(bs->file); | ||||
| } | ||||
| 
 | ||||
| static QEMUOptionParameter cow_create_options[] = { | ||||
| @ -334,7 +334,7 @@ static BlockDriver bdrv_cow = { | ||||
|     .bdrv_write         = cow_co_write, | ||||
|     .bdrv_close		= cow_close, | ||||
|     .bdrv_create	= cow_create, | ||||
|     .bdrv_flush		= cow_flush, | ||||
|     .bdrv_co_flush      = cow_co_flush, | ||||
|     .bdrv_is_allocated	= cow_is_allocated, | ||||
| 
 | ||||
|     .create_options = cow_create_options, | ||||
|  | ||||
							
								
								
									
										11
									
								
								block/qcow.c
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								block/qcow.c
									
									
									
									
									
								
							| @ -781,10 +781,9 @@ static int qcow_write_compressed(BlockDriverState *bs, int64_t sector_num, | ||||
|     return 0; | ||||
| } | ||||
| 
 | ||||
| static BlockDriverAIOCB *qcow_aio_flush(BlockDriverState *bs, | ||||
|         BlockDriverCompletionFunc *cb, void *opaque) | ||||
| static coroutine_fn int qcow_co_flush(BlockDriverState *bs) | ||||
| { | ||||
|     return bdrv_aio_flush(bs->file, cb, opaque); | ||||
|     return bdrv_co_flush(bs->file); | ||||
| } | ||||
| 
 | ||||
| static int qcow_get_info(BlockDriverState *bs, BlockDriverInfo *bdi) | ||||
| @ -824,9 +823,9 @@ static BlockDriver bdrv_qcow = { | ||||
|     .bdrv_is_allocated	= qcow_is_allocated, | ||||
|     .bdrv_set_key	= qcow_set_key, | ||||
|     .bdrv_make_empty	= qcow_make_empty, | ||||
|     .bdrv_co_readv  = qcow_co_readv, | ||||
|     .bdrv_co_writev = qcow_co_writev, | ||||
|     .bdrv_aio_flush	= qcow_aio_flush, | ||||
|     .bdrv_co_readv      = qcow_co_readv, | ||||
|     .bdrv_co_writev     = qcow_co_writev, | ||||
|     .bdrv_co_flush      = qcow_co_flush, | ||||
|     .bdrv_write_compressed = qcow_write_compressed, | ||||
|     .bdrv_get_info	= qcow_get_info, | ||||
| 
 | ||||
|  | ||||
| @ -1099,24 +1099,24 @@ fail: | ||||
|     return ret; | ||||
| } | ||||
| 
 | ||||
| static BlockDriverAIOCB *qcow2_aio_flush(BlockDriverState *bs, | ||||
|                                          BlockDriverCompletionFunc *cb, | ||||
|                                          void *opaque) | ||||
| static int qcow2_co_flush(BlockDriverState *bs) | ||||
| { | ||||
|     BDRVQcowState *s = bs->opaque; | ||||
|     int ret; | ||||
| 
 | ||||
|     qemu_co_mutex_lock(&s->lock); | ||||
|     ret = qcow2_cache_flush(bs, s->l2_table_cache); | ||||
|     if (ret < 0) { | ||||
|         return NULL; | ||||
|         return ret; | ||||
|     } | ||||
| 
 | ||||
|     ret = qcow2_cache_flush(bs, s->refcount_block_cache); | ||||
|     if (ret < 0) { | ||||
|         return NULL; | ||||
|         return ret; | ||||
|     } | ||||
|     qemu_co_mutex_unlock(&s->lock); | ||||
| 
 | ||||
|     return bdrv_aio_flush(bs->file, cb, opaque); | ||||
|     return bdrv_co_flush(bs->file); | ||||
| } | ||||
| 
 | ||||
| static int64_t qcow2_vm_state_offset(BDRVQcowState *s) | ||||
| @ -1237,7 +1237,7 @@ static BlockDriver bdrv_qcow2 = { | ||||
| 
 | ||||
|     .bdrv_co_readv      = qcow2_co_readv, | ||||
|     .bdrv_co_writev     = qcow2_co_writev, | ||||
|     .bdrv_aio_flush     = qcow2_aio_flush, | ||||
|     .bdrv_co_flush      = qcow2_co_flush, | ||||
| 
 | ||||
|     .bdrv_discard           = qcow2_discard, | ||||
|     .bdrv_truncate          = qcow2_truncate, | ||||
|  | ||||
| @ -281,7 +281,7 @@ static BlockDriver bdrv_file = { | ||||
|     .bdrv_file_open	= raw_open, | ||||
|     .bdrv_close		= raw_close, | ||||
|     .bdrv_create	= raw_create, | ||||
|     .bdrv_flush		= raw_flush, | ||||
|     .bdrv_co_flush      = raw_flush, | ||||
|     .bdrv_read		= raw_read, | ||||
|     .bdrv_write		= raw_write, | ||||
|     .bdrv_truncate	= raw_truncate, | ||||
| @ -409,7 +409,7 @@ static BlockDriver bdrv_host_device = { | ||||
|     .bdrv_probe_device	= hdev_probe_device, | ||||
|     .bdrv_file_open	= hdev_open, | ||||
|     .bdrv_close		= raw_close, | ||||
|     .bdrv_flush		= raw_flush, | ||||
|     .bdrv_co_flush      = raw_flush, | ||||
|     .bdrv_has_zero_init = hdev_has_zero_init, | ||||
| 
 | ||||
|     .bdrv_read		= raw_read, | ||||
|  | ||||
| @ -705,7 +705,7 @@ static BlockDriverAIOCB *qemu_rbd_aio_writev(BlockDriverState *bs, | ||||
|     return rbd_aio_rw_vector(bs, sector_num, qiov, nb_sectors, cb, opaque, 1); | ||||
| } | ||||
| 
 | ||||
| static int qemu_rbd_flush(BlockDriverState *bs) | ||||
| static int qemu_rbd_co_flush(BlockDriverState *bs) | ||||
| { | ||||
| #if LIBRBD_VERSION_CODE >= LIBRBD_VERSION(0, 1, 1) | ||||
|     /* rbd_flush added in 0.1.1 */ | ||||
| @ -851,7 +851,7 @@ static BlockDriver bdrv_rbd = { | ||||
|     .bdrv_file_open     = qemu_rbd_open, | ||||
|     .bdrv_close         = qemu_rbd_close, | ||||
|     .bdrv_create        = qemu_rbd_create, | ||||
|     .bdrv_flush         = qemu_rbd_flush, | ||||
|     .bdrv_co_flush      = qemu_rbd_co_flush, | ||||
|     .bdrv_get_info      = qemu_rbd_getinfo, | ||||
|     .create_options     = qemu_rbd_create_options, | ||||
|     .bdrv_getlength     = qemu_rbd_getlength, | ||||
|  | ||||
| @ -936,10 +936,10 @@ static void vdi_close(BlockDriverState *bs) | ||||
| { | ||||
| } | ||||
| 
 | ||||
| static int vdi_flush(BlockDriverState *bs) | ||||
| static coroutine_fn int vdi_co_flush(BlockDriverState *bs) | ||||
| { | ||||
|     logout("\n"); | ||||
|     return bdrv_flush(bs->file); | ||||
|     return bdrv_co_flush(bs->file); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| @ -975,7 +975,7 @@ static BlockDriver bdrv_vdi = { | ||||
|     .bdrv_open = vdi_open, | ||||
|     .bdrv_close = vdi_close, | ||||
|     .bdrv_create = vdi_create, | ||||
|     .bdrv_flush = vdi_flush, | ||||
|     .bdrv_co_flush = vdi_co_flush, | ||||
|     .bdrv_is_allocated = vdi_is_allocated, | ||||
|     .bdrv_make_empty = vdi_make_empty, | ||||
| 
 | ||||
|  | ||||
| @ -1494,14 +1494,14 @@ static void vmdk_close(BlockDriverState *bs) | ||||
|     vmdk_free_extents(bs); | ||||
| } | ||||
| 
 | ||||
| static int vmdk_flush(BlockDriverState *bs) | ||||
| static coroutine_fn int vmdk_co_flush(BlockDriverState *bs) | ||||
| { | ||||
|     int i, ret, err; | ||||
|     BDRVVmdkState *s = bs->opaque; | ||||
| 
 | ||||
|     ret = bdrv_flush(bs->file); | ||||
|     ret = bdrv_co_flush(bs->file); | ||||
|     for (i = 0; i < s->num_extents; i++) { | ||||
|         err = bdrv_flush(s->extents[i].file); | ||||
|         err = bdrv_co_flush(s->extents[i].file); | ||||
|         if (err < 0) { | ||||
|             ret = err; | ||||
|         } | ||||
| @ -1568,7 +1568,7 @@ static BlockDriver bdrv_vmdk = { | ||||
|     .bdrv_write     = vmdk_co_write, | ||||
|     .bdrv_close     = vmdk_close, | ||||
|     .bdrv_create    = vmdk_create, | ||||
|     .bdrv_flush     = vmdk_flush, | ||||
|     .bdrv_co_flush  = vmdk_co_flush, | ||||
|     .bdrv_is_allocated  = vmdk_is_allocated, | ||||
|     .bdrv_get_allocated_file_size  = vmdk_get_allocated_file_size, | ||||
| 
 | ||||
|  | ||||
| @ -467,9 +467,9 @@ static coroutine_fn int vpc_co_write(BlockDriverState *bs, int64_t sector_num, | ||||
|     return ret; | ||||
| } | ||||
| 
 | ||||
| static int vpc_flush(BlockDriverState *bs) | ||||
| static coroutine_fn int vpc_co_flush(BlockDriverState *bs) | ||||
| { | ||||
|     return bdrv_flush(bs->file); | ||||
|     return bdrv_co_flush(bs->file); | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
| @ -665,7 +665,7 @@ static BlockDriver bdrv_vpc = { | ||||
|     .bdrv_open      = vpc_open, | ||||
|     .bdrv_read      = vpc_co_read, | ||||
|     .bdrv_write     = vpc_co_write, | ||||
|     .bdrv_flush     = vpc_flush, | ||||
|     .bdrv_co_flush  = vpc_co_flush, | ||||
|     .bdrv_close     = vpc_close, | ||||
|     .bdrv_create    = vpc_create, | ||||
| 
 | ||||
|  | ||||
| @ -62,7 +62,6 @@ struct BlockDriver { | ||||
|                       const uint8_t *buf, int nb_sectors); | ||||
|     void (*bdrv_close)(BlockDriverState *bs); | ||||
|     int (*bdrv_create)(const char *filename, QEMUOptionParameter *options); | ||||
|     int (*bdrv_flush)(BlockDriverState *bs); | ||||
|     int (*bdrv_discard)(BlockDriverState *bs, int64_t sector_num, | ||||
|                         int nb_sectors); | ||||
|     int (*bdrv_is_allocated)(BlockDriverState *bs, int64_t sector_num, | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Paolo Bonzini
						Paolo Bonzini