Commit 8ed7d42f authored by Kevin Wolf's avatar Kevin Wolf
Browse files

blockdev: Use bdrv_try_set_aio_context() for monitor commands



Monitor commands can handle errors, so they can easily be converted to
using the safer bdrv_try_set_aio_context() function.

Signed-off-by: default avatarKevin Wolf <kwolf@redhat.com>
parent ad943dcb
Loading
Loading
Loading
Loading
+28 −16
Original line number Diff line number Diff line
@@ -1535,6 +1535,7 @@ static void external_snapshot_prepare(BlkActionState *common,
                             DO_UPCAST(ExternalSnapshotState, common, common);
    TransactionAction *action = common->action;
    AioContext *aio_context;
    int ret;

    /* 'blockdev-snapshot' and 'blockdev-snapshot-sync' have similar
     * purpose but a different set of parameters */
@@ -1674,7 +1675,10 @@ static void external_snapshot_prepare(BlkActionState *common,
        goto out;
    }

    bdrv_set_aio_context(state->new_bs, aio_context);
    ret = bdrv_try_set_aio_context(state->new_bs, aio_context, errp);
    if (ret < 0) {
        goto out;
    }

    /* This removes our old bs and adds the new bs. This is an operation that
     * can fail, so we need to do it in .prepare; undoing it for abort is
@@ -3440,6 +3444,7 @@ static BlockJob *do_drive_backup(DriveBackup *backup, JobTxn *txn,
    int flags, job_flags = JOB_DEFAULT;
    int64_t size;
    bool set_backing_hd = false;
    int ret;

    if (!backup->has_speed) {
        backup->speed = 0;
@@ -3541,7 +3546,11 @@ static BlockJob *do_drive_backup(DriveBackup *backup, JobTxn *txn,
        goto out;
    }

    bdrv_set_aio_context(target_bs, aio_context);
    ret = bdrv_try_set_aio_context(target_bs, aio_context, errp);
    if (ret < 0) {
        bdrv_unref(target_bs);
        goto out;
    }

    if (set_backing_hd) {
        bdrv_set_backing_hd(target_bs, source, &local_err);
@@ -3613,6 +3622,7 @@ BlockJob *do_blockdev_backup(BlockdevBackup *backup, JobTxn *txn,
    AioContext *aio_context;
    BlockJob *job = NULL;
    int job_flags = JOB_DEFAULT;
    int ret;

    if (!backup->has_speed) {
        backup->speed = 0;
@@ -3649,17 +3659,10 @@ BlockJob *do_blockdev_backup(BlockdevBackup *backup, JobTxn *txn,
        goto out;
    }

    if (bdrv_get_aio_context(target_bs) != aio_context) {
        if (!bdrv_has_blk(target_bs)) {
            /* The target BDS is not attached, we can safely move it to another
             * AioContext. */
            bdrv_set_aio_context(target_bs, aio_context);
        } else {
            error_setg(errp, "Target is attached to a different thread from "
                             "source.");
    ret = bdrv_try_set_aio_context(target_bs, aio_context, errp);
    if (ret < 0) {
        goto out;
    }
    }

    if (backup->has_bitmap) {
        bmap = bdrv_find_dirty_bitmap(bs, backup->bitmap);
@@ -3831,6 +3834,7 @@ void qmp_drive_mirror(DriveMirror *arg, Error **errp)
    int flags;
    int64_t size;
    const char *format = arg->format;
    int ret;

    bs = qmp_get_root_bs(arg->device, errp);
    if (!bs) {
@@ -3931,7 +3935,11 @@ void qmp_drive_mirror(DriveMirror *arg, Error **errp)
        goto out;
    }

    bdrv_set_aio_context(target_bs, aio_context);
    ret = bdrv_try_set_aio_context(target_bs, aio_context, errp);
    if (ret < 0) {
        bdrv_unref(target_bs);
        goto out;
    }

    blockdev_mirror_common(arg->has_job_id ? arg->job_id : NULL, bs, target_bs,
                           arg->has_replaces, arg->replaces, arg->sync,
@@ -3975,6 +3983,7 @@ void qmp_blockdev_mirror(bool has_job_id, const char *job_id,
    AioContext *aio_context;
    BlockMirrorBackingMode backing_mode = MIRROR_LEAVE_BACKING_CHAIN;
    Error *local_err = NULL;
    int ret;

    bs = qmp_get_root_bs(device, errp);
    if (!bs) {
@@ -3989,7 +3998,10 @@ void qmp_blockdev_mirror(bool has_job_id, const char *job_id,
    aio_context = bdrv_get_aio_context(bs);
    aio_context_acquire(aio_context);

    bdrv_set_aio_context(target_bs, aio_context);
    ret = bdrv_try_set_aio_context(target_bs, aio_context, errp);
    if (ret < 0) {
        goto out;
    }

    blockdev_mirror_common(has_job_id ? job_id : NULL, bs, target_bs,
                           has_replaces, replaces, sync, backing_mode,
@@ -4005,7 +4017,7 @@ void qmp_blockdev_mirror(bool has_job_id, const char *job_id,
                           has_auto_dismiss, auto_dismiss,
                           &local_err);
    error_propagate(errp, local_err);

out:
    aio_context_release(aio_context);
}

@@ -4495,7 +4507,7 @@ void qmp_x_blockdev_set_iothread(const char *node_name, StrOrNull *iothread,
    old_context = bdrv_get_aio_context(bs);
    aio_context_acquire(old_context);

    bdrv_set_aio_context(bs, new_context);
    bdrv_try_set_aio_context(bs, new_context, errp);

    aio_context_release(old_context);
}