blockdev: Introduce DriveInfo.enable_auto_del
BlockDriverStates shouldn't be affected by an unplugged guest device, except if created with the legacy -drive command line option or the drive_add HMP command. Make the automatic deletion as well as cancelling of jobs conditional on an enable_auto_del boolean that is only set in drive_init(). Signed-off-by: Kevin Wolf <kwolf@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com> Reviewed-by: Wenchao Xia <xiawenc@linux.vnet.ibm.com>
This commit is contained in:
		
							parent
							
								
									622f557f5a
								
							
						
					
					
						commit
						2d246f01d3
					
				
							
								
								
									
										17
									
								
								blockdev.c
									
									
									
									
									
								
							
							
						
						
									
										17
									
								
								blockdev.c
									
									
									
									
									
								
							| @ -89,6 +89,10 @@ void blockdev_mark_auto_del(BlockDriverState *bs) | ||||
| { | ||||
|     DriveInfo *dinfo = drive_get_by_blockdev(bs); | ||||
| 
 | ||||
|     if (dinfo && !dinfo->enable_auto_del) { | ||||
|         return; | ||||
|     } | ||||
| 
 | ||||
|     if (bs->job) { | ||||
|         block_job_cancel(bs->job); | ||||
|     } | ||||
| @ -746,6 +750,7 @@ static void qemu_opt_rename(QemuOpts *opts, const char *from, const char *to) | ||||
| DriveInfo *drive_init(QemuOpts *all_opts, BlockInterfaceType block_default_type) | ||||
| { | ||||
|     const char *value; | ||||
|     DriveInfo *dinfo; | ||||
| 
 | ||||
|     /* Change legacy command line options into QMP ones */ | ||||
|     qemu_opt_rename(all_opts, "iops", "throttling.iops-total"); | ||||
| @ -794,7 +799,17 @@ DriveInfo *drive_init(QemuOpts *all_opts, BlockInterfaceType block_default_type) | ||||
|         qemu_opt_unset(all_opts, "cache"); | ||||
|     } | ||||
| 
 | ||||
|     return blockdev_init(all_opts, block_default_type); | ||||
|     /* Actual block device init: Functionality shared with blockdev-add */ | ||||
|     dinfo = blockdev_init(all_opts, block_default_type); | ||||
|     if (dinfo == NULL) { | ||||
|         goto fail; | ||||
|     } | ||||
| 
 | ||||
|     /* Set legacy DriveInfo fields */ | ||||
|     dinfo->enable_auto_del = true; | ||||
| 
 | ||||
| fail: | ||||
|     return dinfo; | ||||
| } | ||||
| 
 | ||||
| void do_commit(Monitor *mon, const QDict *qdict) | ||||
|  | ||||
| @ -37,6 +37,7 @@ struct DriveInfo { | ||||
|     int bus; | ||||
|     int unit; | ||||
|     int auto_del;               /* see blockdev_mark_auto_del() */ | ||||
|     bool enable_auto_del; /* Only for legacy drive_init() */ | ||||
|     int media_cd; | ||||
|     int cyls, heads, secs, trans; | ||||
|     QemuOpts *opts; | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Kevin Wolf
						Kevin Wolf