160 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			160 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| From 792e5326750b8e22627d993552af4a7906b49111 Mon Sep 17 00:00:00 2001
 | |
| From: John Snow <jsnow@redhat.com>
 | |
| Date: Tue, 25 Sep 2018 22:34:11 +0100
 | |
| Subject: [PATCH 08/28] block/mirror: utilize job_exit shim
 | |
| 
 | |
| RH-Author: John Snow <jsnow@redhat.com>
 | |
| Message-id: <20180925223431.24791-6-jsnow@redhat.com>
 | |
| Patchwork-id: 82269
 | |
| O-Subject: [RHEL8/rhel qemu-kvm PATCH 05/25] block/mirror: utilize job_exit shim
 | |
| Bugzilla: 1632939
 | |
| RH-Acked-by: Jeffrey Cody <jcody@redhat.com>
 | |
| RH-Acked-by: Max Reitz <mreitz@redhat.com>
 | |
| RH-Acked-by: Kevin Wolf <kwolf@redhat.com>
 | |
| 
 | |
| Change the manual deferment to mirror_exit into the implicit
 | |
| callback to job_exit and the mirror_exit callback.
 | |
| 
 | |
| This does change the order of some bdrv_unref calls and job_completed,
 | |
| but thanks to the new context in which we call .exit, this is safe to
 | |
| defer the possible flushing of any nodes to the job_finalize_single
 | |
| cleanup stage.
 | |
| 
 | |
| Signed-off-by: John Snow <jsnow@redhat.com>
 | |
| Message-id: 20180830015734.19765-6-jsnow@redhat.com
 | |
| Reviewed-by: Max Reitz <mreitz@redhat.com>
 | |
| Reviewed-by: Jeff Cody <jcody@redhat.com>
 | |
| Signed-off-by: Max Reitz <mreitz@redhat.com>
 | |
| (cherry picked from commit 7b508f6b7a38a8d9729772fa6e525da883fb120b)
 | |
| Signed-off-by: John Snow <jsnow@redhat.com>
 | |
| ---
 | |
|  block/mirror.c | 30 +++++++++++-------------------
 | |
|  1 file changed, 11 insertions(+), 19 deletions(-)
 | |
| 
 | |
| --
 | |
| 2.14.4
 | |
| 
 | |
| Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
 | |
| ---
 | |
|  block/mirror.c | 30 +++++++++++-------------------
 | |
|  1 file changed, 11 insertions(+), 19 deletions(-)
 | |
| 
 | |
| diff --git a/block/mirror.c b/block/mirror.c
 | |
| index 3c330ee..2604f61 100644
 | |
| --- a/block/mirror.c
 | |
| +++ b/block/mirror.c
 | |
| @@ -480,25 +480,21 @@ static void mirror_wait_for_all_io(MirrorBlockJob *s)
 | |
|      }
 | |
|  }
 | |
|  
 | |
| -typedef struct {
 | |
| -    int ret;
 | |
| -} MirrorExitData;
 | |
| -
 | |
| -static void mirror_exit(Job *job, void *opaque)
 | |
| +static void mirror_exit(Job *job)
 | |
|  {
 | |
|      MirrorBlockJob *s = container_of(job, MirrorBlockJob, common.job);
 | |
|      BlockJob *bjob = &s->common;
 | |
| -    MirrorExitData *data = opaque;
 | |
|      AioContext *replace_aio_context = NULL;
 | |
|      BlockDriverState *src = s->source;
 | |
|      BlockDriverState *target_bs = blk_bs(s->target);
 | |
|      BlockDriverState *mirror_top_bs = s->mirror_top_bs;
 | |
|      Error *local_err = NULL;
 | |
| +    int ret = job->ret;
 | |
|  
 | |
|      bdrv_release_dirty_bitmap(src, s->dirty_bitmap);
 | |
|  
 | |
| -    /* Make sure that the source BDS doesn't go away before we called
 | |
| -     * job_completed(). */
 | |
| +    /* Make sure that the source BDS doesn't go away during bdrv_replace_node,
 | |
| +     * before we can call bdrv_drained_end */
 | |
|      bdrv_ref(src);
 | |
|      bdrv_ref(mirror_top_bs);
 | |
|      bdrv_ref(target_bs);
 | |
| @@ -524,7 +520,7 @@ static void mirror_exit(Job *job, void *opaque)
 | |
|              bdrv_set_backing_hd(target_bs, backing, &local_err);
 | |
|              if (local_err) {
 | |
|                  error_report_err(local_err);
 | |
| -                data->ret = -EPERM;
 | |
| +                ret = -EPERM;
 | |
|              }
 | |
|          }
 | |
|      }
 | |
| @@ -534,7 +530,7 @@ static void mirror_exit(Job *job, void *opaque)
 | |
|          aio_context_acquire(replace_aio_context);
 | |
|      }
 | |
|  
 | |
| -    if (s->should_complete && data->ret == 0) {
 | |
| +    if (s->should_complete && ret == 0) {
 | |
|          BlockDriverState *to_replace = src;
 | |
|          if (s->to_replace) {
 | |
|              to_replace = s->to_replace;
 | |
| @@ -551,7 +547,7 @@ static void mirror_exit(Job *job, void *opaque)
 | |
|          bdrv_drained_end(target_bs);
 | |
|          if (local_err) {
 | |
|              error_report_err(local_err);
 | |
| -            data->ret = -EPERM;
 | |
| +            ret = -EPERM;
 | |
|          }
 | |
|      }
 | |
|      if (s->to_replace) {
 | |
| @@ -581,12 +577,11 @@ static void mirror_exit(Job *job, void *opaque)
 | |
|      blk_set_perm(bjob->blk, 0, BLK_PERM_ALL, &error_abort);
 | |
|      blk_insert_bs(bjob->blk, mirror_top_bs, &error_abort);
 | |
|  
 | |
| -    job_completed(job, data->ret);
 | |
| -
 | |
| -    g_free(data);
 | |
|      bdrv_drained_end(src);
 | |
|      bdrv_unref(mirror_top_bs);
 | |
|      bdrv_unref(src);
 | |
| +
 | |
| +    job->ret = ret;
 | |
|  }
 | |
|  
 | |
|  static void mirror_throttle(MirrorBlockJob *s)
 | |
| @@ -686,7 +681,6 @@ static int mirror_flush(MirrorBlockJob *s)
 | |
|  static int coroutine_fn mirror_run(Job *job, Error **errp)
 | |
|  {
 | |
|      MirrorBlockJob *s = container_of(job, MirrorBlockJob, common.job);
 | |
| -    MirrorExitData *data;
 | |
|      BlockDriverState *bs = s->source;
 | |
|      BlockDriverState *target_bs = blk_bs(s->target);
 | |
|      bool need_drain = true;
 | |
| @@ -896,14 +890,10 @@ immediate_exit:
 | |
|      g_free(s->in_flight_bitmap);
 | |
|      bdrv_dirty_iter_free(s->dbi);
 | |
|  
 | |
| -    data = g_malloc(sizeof(*data));
 | |
| -    data->ret = ret;
 | |
| -
 | |
|      if (need_drain) {
 | |
|          bdrv_drained_begin(bs);
 | |
|      }
 | |
|  
 | |
| -    job_defer_to_main_loop(&s->common.job, mirror_exit, data);
 | |
|      return ret;
 | |
|  }
 | |
|  
 | |
| @@ -996,6 +986,7 @@ static const BlockJobDriver mirror_job_driver = {
 | |
|          .user_resume            = block_job_user_resume,
 | |
|          .drain                  = block_job_drain,
 | |
|          .run                    = mirror_run,
 | |
| +        .exit                   = mirror_exit,
 | |
|          .pause                  = mirror_pause,
 | |
|          .complete               = mirror_complete,
 | |
|      },
 | |
| @@ -1011,6 +1002,7 @@ static const BlockJobDriver commit_active_job_driver = {
 | |
|          .user_resume            = block_job_user_resume,
 | |
|          .drain                  = block_job_drain,
 | |
|          .run                    = mirror_run,
 | |
| +        .exit                   = mirror_exit,
 | |
|          .pause                  = mirror_pause,
 | |
|          .complete               = mirror_complete,
 | |
|      },
 | |
| -- 
 | |
| 1.8.3.1
 | |
| 
 |