From nobody Tue Feb 10 00:22:07 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1487008806183441.1722954137475; Mon, 13 Feb 2017 10:00:06 -0800 (PST) Received: from localhost ([::1]:58560 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdKuy-0003ln-T8 for importer@patchew.org; Mon, 13 Feb 2017 13:00:04 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:59589) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdKMC-0003Y0-CO for qemu-devel@nongnu.org; Mon, 13 Feb 2017 12:24:10 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cdKMA-0006F6-Ph for qemu-devel@nongnu.org; Mon, 13 Feb 2017 12:24:08 -0500 Received: from mx1.redhat.com ([209.132.183.28]:59368) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cdKM7-0006Dc-C6; Mon, 13 Feb 2017 12:24:03 -0500 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 5019F81236; Mon, 13 Feb 2017 17:24:03 +0000 (UTC) Received: from noname.redhat.com (ovpn-117-183.ams2.redhat.com [10.36.117.183]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v1DHNC3f031842; Mon, 13 Feb 2017 12:24:01 -0500 From: Kevin Wolf To: qemu-block@nongnu.org Date: Mon, 13 Feb 2017 18:22:47 +0100 Message-Id: <1487006583-24350-26-git-send-email-kwolf@redhat.com> In-Reply-To: <1487006583-24350-1-git-send-email-kwolf@redhat.com> References: <1487006583-24350-1-git-send-email-kwolf@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.25]); Mon, 13 Feb 2017 17:24:03 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [RFC PATCH 25/41] blockjob: Add permissions to block_job_add_bdrv() X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, jcody@redhat.com, famz@redhat.com, qemu-devel@nongnu.org, mreitz@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Block jobs don't actually do I/O through the the reference they create with block_job_add_bdrv(), but they might want to use the permisssion system to express what the block job does to intermediate nodes. This adds permissions to block_job_add_bdrv() to provide the means to request permissions. Signed-off-by: Kevin Wolf --- block/backup.c | 3 ++- block/commit.c | 7 +++++-- block/mirror.c | 7 +++++-- block/stream.c | 3 ++- blockjob.c | 27 +++++++++++++++++++++------ include/block/blockjob.h | 4 +++- 6 files changed, 38 insertions(+), 13 deletions(-) diff --git a/block/backup.c b/block/backup.c index 12ab25c..22171f4 100644 --- a/block/backup.c +++ b/block/backup.c @@ -657,7 +657,8 @@ BlockJob *backup_job_create(const char *job_id, BlockDr= iverState *bs, job->cluster_size =3D MAX(BACKUP_CLUSTER_SIZE_DEFAULT, bdi.cluster= _size); } =20 - block_job_add_bdrv(&job->common, target); + /* FIXME Use real permissions */ + block_job_add_bdrv(&job->common, target, 0, BLK_PERM_ALL, &error_abort= ); job->common.len =3D len; block_job_txn_add_job(txn, &job->common); =20 diff --git a/block/commit.c b/block/commit.c index 60d29a9..68fa2a4 100644 --- a/block/commit.c +++ b/block/commit.c @@ -267,13 +267,16 @@ void commit_start(const char *job_id, BlockDriverStat= e *bs, * disappear from the chain after this operation. */ assert(bdrv_chain_contains(top, base)); for (iter =3D top; iter !=3D backing_bs(base); iter =3D backing_bs(ite= r)) { - block_job_add_bdrv(&s->common, iter); + /* FIXME Use real permissions */ + block_job_add_bdrv(&s->common, iter, 0, BLK_PERM_ALL, &error_abort= ); } /* overlay_bs must be blocked because it needs to be modified to * update the backing image string, but if it's the root node then * don't block it again */ if (bs !=3D overlay_bs) { - block_job_add_bdrv(&s->common, overlay_bs); + /* FIXME Use real permissions */ + block_job_add_bdrv(&s->common, overlay_bs, 0, BLK_PERM_ALL, + &error_abort); } =20 /* FIXME Use real permissions */ diff --git a/block/mirror.c b/block/mirror.c index 22680d7..9532b18 100644 --- a/block/mirror.c +++ b/block/mirror.c @@ -1020,13 +1020,16 @@ static void mirror_start_job(const char *job_id, Bl= ockDriverState *bs, return; } =20 - block_job_add_bdrv(&s->common, target); + /* FIXME Use real permissions */ + block_job_add_bdrv(&s->common, target, 0, BLK_PERM_ALL, &error_abort); + /* In commit_active_start() all intermediate nodes disappear, so * any jobs in them must be blocked */ if (bdrv_chain_contains(bs, target)) { BlockDriverState *iter; for (iter =3D backing_bs(bs); iter !=3D target; iter =3D backing_b= s(iter)) { - block_job_add_bdrv(&s->common, iter); + /* FIXME Use real permissions */ + block_job_add_bdrv(&s->common, iter, 0, BLK_PERM_ALL, &error_a= bort); } } =20 diff --git a/block/stream.c b/block/stream.c index 7f49279..47f0ffb 100644 --- a/block/stream.c +++ b/block/stream.c @@ -248,7 +248,8 @@ void stream_start(const char *job_id, BlockDriverState = *bs, /* Block all intermediate nodes between bs and base, because they * will disappear from the chain after this operation */ for (iter =3D backing_bs(bs); iter && iter !=3D base; iter =3D backing= _bs(iter)) { - block_job_add_bdrv(&s->common, iter); + /* FIXME Use real permissions */ + block_job_add_bdrv(&s->common, iter, 0, BLK_PERM_ALL, &error_abort= ); } =20 s->base =3D base; diff --git a/blockjob.c b/blockjob.c index 27833c7..0bcc099 100644 --- a/blockjob.c +++ b/blockjob.c @@ -55,6 +55,10 @@ struct BlockJobTxn { =20 static QLIST_HEAD(, BlockJob) block_jobs =3D QLIST_HEAD_INITIALIZER(block_= jobs); =20 +static const BdrvChildRole child_job =3D { + .stay_at_node =3D true, +}; + BlockJob *block_job_next(BlockJob *job) { if (!job) { @@ -115,11 +119,22 @@ static void block_job_detach_aio_context(void *opaque) block_job_unref(job); } =20 -void block_job_add_bdrv(BlockJob *job, BlockDriverState *bs) +int block_job_add_bdrv(BlockJob *job, BlockDriverState *bs, + uint64_t perm, uint64_t shared_perm, Error **errp) { - job->nodes =3D g_slist_prepend(job->nodes, bs); + BdrvChild *c; + + c =3D bdrv_root_attach_child(bs, "job", &child_job, perm, shared_perm, + NULL, errp); + if (c =3D=3D NULL) { + return -EPERM; + } + + job->nodes =3D g_slist_prepend(job->nodes, c); bdrv_ref(bs); bdrv_op_block_all(bs, job->blocker); + + return 0; } =20 void *block_job_create(const char *job_id, const BlockJobDriver *driver, @@ -171,7 +186,7 @@ void *block_job_create(const char *job_id, const BlockJ= obDriver *driver, job =3D g_malloc0(driver->instance_size); error_setg(&job->blocker, "block device is in use by block job: %s", BlockJobType_lookup[driver->job_type]); - block_job_add_bdrv(job, bs); + block_job_add_bdrv(job, bs, 0, BLK_PERM_ALL, &error_abort); bdrv_op_unblock(bs, BLOCK_OP_TYPE_DATAPLANE, job->blocker); =20 job->driver =3D driver; @@ -238,9 +253,9 @@ void block_job_unref(BlockJob *job) BlockDriverState *bs =3D blk_bs(job->blk); bs->job =3D NULL; for (l =3D job->nodes; l; l =3D l->next) { - bs =3D l->data; - bdrv_op_unblock_all(bs, job->blocker); - bdrv_unref(bs); + BdrvChild *c =3D l->data; + bdrv_op_unblock_all(c->bs, job->blocker); + bdrv_root_unref_child(c); } g_slist_free(job->nodes); blk_remove_aio_context_notifier(job->blk, diff --git a/include/block/blockjob.h b/include/block/blockjob.h index 1acb256..b0b1134 100644 --- a/include/block/blockjob.h +++ b/include/block/blockjob.h @@ -170,12 +170,14 @@ BlockJob *block_job_get(const char *id); * block_job_add_bdrv: * @job: A block job * @bs: A BlockDriverState that is involved in @job + * @perm, @shared_perm: Permissions to request on the node * * Add @bs to the list of BlockDriverState that are involved in * @job. This means that all operations will be blocked on @bs while * @job exists. */ -void block_job_add_bdrv(BlockJob *job, BlockDriverState *bs); +int block_job_add_bdrv(BlockJob *job, BlockDriverState *bs, + uint64_t perm, uint64_t shared_perm, Error **errp); =20 /** * block_job_set_speed: --=20 1.8.3.1