From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:55215) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1c42RL-0000Ik-4A for qemu-devel@nongnu.org; Tue, 08 Nov 2016 04:11:36 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1c42RH-0007ow-TW for qemu-devel@nongnu.org; Tue, 08 Nov 2016 04:11:35 -0500 Date: Tue, 8 Nov 2016 10:11:19 +0100 From: Kevin Wolf Message-ID: <20161108091119.GA5088@noname.str.redhat.com> References: <1478109056-25198-1-git-send-email-jsnow@redhat.com> <1478109056-25198-6-git-send-email-jsnow@redhat.com> <20161103131734.GC5352@noname.redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: Subject: Re: [Qemu-devel] [PATCH v3 5/6] blockjob: refactor backup_start as backup_job_create List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: John Snow Cc: vsementsov@virtuozzo.com, qemu-block@nongnu.org, jcody@redhat.com, qemu-devel@nongnu.org, stefanha@redhat.com, pbonzini@redhat.com Am 08.11.2016 um 06:41 hat John Snow geschrieben: > On 11/03/2016 09:17 AM, Kevin Wolf wrote: > >Am 02.11.2016 um 18:50 hat John Snow geschrieben: > >>Refactor backup_start as backup_job_create, which only creates the job, > >>but does not automatically start it. The old interface, 'backup_start', > >>is not kept in favor of limiting the number of nearly-identical interfaces > >>that would have to be edited to keep up with QAPI changes in the future. > >> > >>Callers that wish to synchronously start the backup_block_job can > >>instead just call block_job_start immediately after calling > >>backup_job_create. > >> > >>Transactions are updated to use the new interface, calling block_job_start > >>only during the .commit phase, which helps prevent race conditions where > >>jobs may finish before we even finish building the transaction. This may > >>happen, for instance, during empty block backup jobs. > >> > >>Reported-by: Vladimir Sementsov-Ogievskiy > >>Signed-off-by: John Snow > > > >>+static void drive_backup_commit(BlkActionState *common) > >>+{ > >>+ DriveBackupState *state = DO_UPCAST(DriveBackupState, common, common); > >>+ if (state->job) { > >>+ block_job_start(state->job); > >>+ } > >> } > > > >How could state->job ever be NULL? > > > > Mechanical thinking. It can't. (I definitely didn't copy paste from > the .abort routines. Definitely.) > > >Same question for abort, and for blockdev_backup_commit/abort. > > > > Abort ... we may not have created the job successfully. Abort gets > called whether or not we made it to or through the matching > .prepare. Ah, yes, I always forget about this. It's so counterintuitive (and bdrv_reopen() actually works differently, it only aborts entries that have successfully been prepared). Is there a good reason why qmp_transaction() works this way, especially since we have a separate .clean function? Kevin