From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:55927) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WsVp6-00045A-Is for qemu-devel@nongnu.org; Thu, 05 Jun 2014 07:27:14 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1WsVp0-0004nv-Cx for qemu-devel@nongnu.org; Thu, 05 Jun 2014 07:27:08 -0400 Received: from mx1.redhat.com ([209.132.183.28]:64641) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WsVp0-0004no-45 for qemu-devel@nongnu.org; Thu, 05 Jun 2014 07:27:02 -0400 Message-ID: <53905400.4050605@redhat.com> Date: Thu, 05 Jun 2014 13:26:56 +0200 From: Paolo Bonzini MIME-Version: 1.0 References: <1401939756-11150-1-git-send-email-famz@redhat.com> <1401939756-11150-2-git-send-email-famz@redhat.com> <20140605111724.GI27366@stefanha-thinkpad.redhat.com> In-Reply-To: <20140605111724.GI27366@stefanha-thinkpad.redhat.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH 1/3] mirror: Go through ready -> complete process for 0 len image List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Stefan Hajnoczi , Fam Zheng Cc: Kevin Wolf , jcody@redhat.com, qemu-devel@nongnu.org, Stefan Hajnoczi , Max Reitz Il 05/06/2014 13:17, Stefan Hajnoczi ha scritto: > On Thu, Jun 05, 2014 at 11:42:34AM +0800, Fam Zheng wrote: >> diff --git a/block/mirror.c b/block/mirror.c >> index 94c8661..2bef5f3 100644 >> --- a/block/mirror.c >> +++ b/block/mirror.c >> @@ -324,9 +324,18 @@ static void coroutine_fn mirror_run(void *opaque) >> } >> >> s->common.len = bdrv_getlength(bs); >> - if (s->common.len <= 0) { >> + if (s->common.len < 0) { >> ret = s->common.len; >> goto immediate_exit; >> + } else if (s->common.len == 0) { >> + /* Report BLOCK_JOB_READY and wait for complete. */ >> + block_job_ready(&s->common); >> + s->synced = true; >> + while (!block_job_is_cancelled(&s->common) && !s->should_complete) { >> + block_job_sleep_ns(&s->common, QEMU_CLOCK_REALTIME, SLICE_TIME); > > Please take a look at block_job_resume() and how it's used when > cancelling or completing block jobs. There is no need to sleep, instead > we can yield until we get resumed. > You still need to set job->busy = false. So I guess we need a new function block_job_yield. Paolo