[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-block] [RFC PATCH 25/41] blockjob: Add permissions to block_jo
From: |
Max Reitz |
Subject: |
Re: [Qemu-block] [RFC PATCH 25/41] blockjob: Add permissions to block_job_add_bdrv() |
Date: |
Mon, 20 Feb 2017 14:38:39 +0100 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.7.0 |
On 13.02.2017 18:22, Kevin Wolf wrote:
> 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 <address@hidden>
> ---
> 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,
> BlockDriverState *bs,
> job->cluster_size = MAX(BACKUP_CLUSTER_SIZE_DEFAULT,
> bdi.cluster_size);
> }
>
> - 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 = len;
> block_job_txn_add_job(txn, &job->common);
>
> 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, BlockDriverState
> *bs,
> * disappear from the chain after this operation. */
> assert(bdrv_chain_contains(top, base));
> for (iter = top; iter != backing_bs(base); iter = 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);
> }
> /* 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 != 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);
> }
>
> /* 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,
> BlockDriverState *bs,
> return;
> }
>
> - 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 = backing_bs(bs); iter != target; iter = 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);
> }
> }
>
> 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 = backing_bs(bs); iter && iter != base; iter =
> 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);
> }
>
> s->base = 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 {
>
> static QLIST_HEAD(, BlockJob) block_jobs =
> QLIST_HEAD_INITIALIZER(block_jobs);
>
> +static const BdrvChildRole child_job = {
> + .stay_at_node = true,
(1) Not a big fan of such alignment without further users.
(2) No problem though because I'd like to ask for get_link_name() and/or
get_name() here.
It should be easy to generate a nice description when using the BlockJob
as BdrvChild.opaque.
> +};
> +
> 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);
> }
>
> -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 = g_slist_prepend(job->nodes, bs);
> + BdrvChild *c;
> +
> + c = bdrv_root_attach_child(bs, "job", &child_job, perm, shared_perm,
"job" doesn't make much sense as the child's name, it's rather a generic
name for the parent.
"job-child" or something caller-provided would be better. (I'd vote for
caller-provided. We don't have that many callers.)
Max
> + NULL, errp);
> + if (c == NULL) {
> + return -EPERM;
> + }
> +
> + job->nodes = g_slist_prepend(job->nodes, c);
> bdrv_ref(bs);
> bdrv_op_block_all(bs, job->blocker);
> +
> + return 0;
> }
>
> void *block_job_create(const char *job_id, const BlockJobDriver *driver,
[...]
signature.asc
Description: OpenPGP digital signature
- Re: [Qemu-block] [RFC PATCH 20/41] hw/block: Introduce share-rw qdev property, (continued)
[Qemu-block] [RFC PATCH 21/41] blockjob: Add permissions to block_job_create(), Kevin Wolf, 2017/02/13
[Qemu-block] [RFC PATCH 22/41] block: Add BdrvChildRole.get_link_name(), Kevin Wolf, 2017/02/13
[Qemu-block] [RFC PATCH 23/41] block: Include details on permission errors in message, Kevin Wolf, 2017/02/13
[Qemu-block] [RFC PATCH 24/41] block: Add BdrvChildRole.stay_at_node, Kevin Wolf, 2017/02/13
[Qemu-block] [RFC PATCH 25/41] blockjob: Add permissions to block_job_add_bdrv(), Kevin Wolf, 2017/02/13
- Re: [Qemu-block] [RFC PATCH 25/41] blockjob: Add permissions to block_job_add_bdrv(),
Max Reitz <=
[Qemu-block] [RFC PATCH 27/41] block: Add bdrv_new_open_driver(), Kevin Wolf, 2017/02/13
[Qemu-block] [RFC PATCH 28/41] commit: Use real permissions in commit block job, Kevin Wolf, 2017/02/13
[Qemu-block] [RFC PATCH 29/41] commit: Use real permissions for HMP 'commit', Kevin Wolf, 2017/02/13
[Qemu-block] [RFC PATCH 30/41] backup: Use real permissions in backup block job, Kevin Wolf, 2017/02/13
[Qemu-block] [RFC PATCH 33/41] block: Allow backing file links in change_parent_backing_link(), Kevin Wolf, 2017/02/13
[Qemu-block] [RFC PATCH 36/41] hmp: Request permissions in qemu-io, Kevin Wolf, 2017/02/13
[Qemu-block] [RFC PATCH 38/41] nbd/server: Use real permissions for NBD exports, Kevin Wolf, 2017/02/13
[Qemu-block] [RFC PATCH 26/41] block: Factor out bdrv_open_driver(), Kevin Wolf, 2017/02/13
[Qemu-block] [RFC PATCH 31/41] block: Fix pending requests check in bdrv_append(), Kevin Wolf, 2017/02/13