mirror: auto complete active commit
Auto complete mirror job in background to prevent from blocking synchronously Signed-off-by: Wen Congyang <wency@cn.fujitsu.com> Signed-off-by: Changlong Xie <xiecl.fnst@cn.fujitsu.com> Signed-off-by: Wang WeiWei <wangww.fnst@cn.fujitsu.com> Message-id: 1469602913-20979-7-git-send-email-xiecl.fnst@cn.fujitsu.com Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
		
							parent
							
								
									68365a3843
								
							
						
					
					
						commit
						b49f7ead8d
					
				| @ -916,7 +916,8 @@ static void mirror_start_job(const char *job_id, BlockDriverState *bs, | ||||
|                              BlockCompletionFunc *cb, | ||||
|                              void *opaque, Error **errp, | ||||
|                              const BlockJobDriver *driver, | ||||
|                              bool is_none_mode, BlockDriverState *base) | ||||
|                              bool is_none_mode, BlockDriverState *base, | ||||
|                              bool auto_complete) | ||||
| { | ||||
|     MirrorBlockJob *s; | ||||
| 
 | ||||
| @ -952,6 +953,9 @@ static void mirror_start_job(const char *job_id, BlockDriverState *bs, | ||||
|     s->granularity = granularity; | ||||
|     s->buf_size = ROUND_UP(buf_size, granularity); | ||||
|     s->unmap = unmap; | ||||
|     if (auto_complete) { | ||||
|         s->should_complete = true; | ||||
|     } | ||||
| 
 | ||||
|     s->dirty_bitmap = bdrv_create_dirty_bitmap(bs, granularity, NULL, errp); | ||||
|     if (!s->dirty_bitmap) { | ||||
| @ -990,14 +994,15 @@ void mirror_start(const char *job_id, BlockDriverState *bs, | ||||
|     mirror_start_job(job_id, bs, target, replaces, | ||||
|                      speed, granularity, buf_size, backing_mode, | ||||
|                      on_source_error, on_target_error, unmap, cb, opaque, errp, | ||||
|                      &mirror_job_driver, is_none_mode, base); | ||||
|                      &mirror_job_driver, is_none_mode, base, false); | ||||
| } | ||||
| 
 | ||||
| void commit_active_start(const char *job_id, BlockDriverState *bs, | ||||
|                          BlockDriverState *base, int64_t speed, | ||||
|                          BlockdevOnError on_error, | ||||
|                          BlockCompletionFunc *cb, | ||||
|                          void *opaque, Error **errp) | ||||
|                          void *opaque, Error **errp, | ||||
|                          bool auto_complete) | ||||
| { | ||||
|     int64_t length, base_length; | ||||
|     int orig_base_flags; | ||||
| @ -1038,7 +1043,7 @@ void commit_active_start(const char *job_id, BlockDriverState *bs, | ||||
|     mirror_start_job(job_id, bs, base, NULL, speed, 0, 0, | ||||
|                      MIRROR_LEAVE_BACKING_CHAIN, | ||||
|                      on_error, on_error, false, cb, opaque, &local_err, | ||||
|                      &commit_active_job_driver, false, base); | ||||
|                      &commit_active_job_driver, false, base, auto_complete); | ||||
|     if (local_err) { | ||||
|         error_propagate(errp, local_err); | ||||
|         goto error_restore_flags; | ||||
|  | ||||
| @ -3090,7 +3090,7 @@ void qmp_block_commit(bool has_job_id, const char *job_id, const char *device, | ||||
|             goto out; | ||||
|         } | ||||
|         commit_active_start(has_job_id ? job_id : NULL, bs, base_bs, speed, | ||||
|                             on_error, block_job_cb, bs, &local_err); | ||||
|                             on_error, block_job_cb, bs, &local_err, false); | ||||
|     } else { | ||||
|         commit_start(has_job_id ? job_id : NULL, bs, base_bs, top_bs, speed, | ||||
|                      on_error, block_job_cb, bs, | ||||
|  | ||||
| @ -702,13 +702,14 @@ void commit_start(const char *job_id, BlockDriverState *bs, | ||||
|  * @cb: Completion function for the job. | ||||
|  * @opaque: Opaque pointer value passed to @cb. | ||||
|  * @errp: Error object. | ||||
|  * @auto_complete: Auto complete the job. | ||||
|  * | ||||
|  */ | ||||
| void commit_active_start(const char *job_id, BlockDriverState *bs, | ||||
|                          BlockDriverState *base, int64_t speed, | ||||
|                          BlockdevOnError on_error, | ||||
|                          BlockCompletionFunc *cb, | ||||
|                          void *opaque, Error **errp); | ||||
|                          void *opaque, Error **errp, bool auto_complete); | ||||
| /*
 | ||||
|  * mirror_start: | ||||
|  * @job_id: The id of the newly-created job, or %NULL to use the | ||||
|  | ||||
| @ -921,7 +921,7 @@ static int img_commit(int argc, char **argv) | ||||
|     }; | ||||
| 
 | ||||
|     commit_active_start("commit", bs, base_bs, 0, BLOCKDEV_ON_ERROR_REPORT, | ||||
|                         common_block_job_cb, &cbi, &local_err); | ||||
|                         common_block_job_cb, &cbi, &local_err, false); | ||||
|     if (local_err) { | ||||
|         goto done; | ||||
|     } | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Wen Congyang
						Wen Congyang