[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH v5 03/11] block: add basic backup support to blo
From: |
Fam Zheng |
Subject: |
Re: [Qemu-devel] [PATCH v5 03/11] block: add basic backup support to block driver |
Date: |
Mon, 17 Jun 2013 11:43:24 +0800 |
User-agent: |
Mutt/1.5.21 (2010-09-15) |
> +static void coroutine_fn backup_run(void *opaque)
> +{
> + BackupBlockJob *job = opaque;
> + BlockDriverState *bs = job->common.bs;
> + BlockDriverState *target = job->target;
> + BlockdevOnError on_target_error = job->on_target_error;
> + NotifierWithReturn before_write = {
> + .notify = backup_before_write_notify,
> + };
> + int64_t start, end;
> + int ret = 0;
> +
> + QLIST_INIT(&job->inflight_reqs);
> + qemu_co_rwlock_init(&job->flush_rwlock);
> +
> + start = 0;
> + end = DIV_ROUND_UP(bdrv_getlength(bs) / BDRV_SECTOR_SIZE,
> + BACKUP_SECTORS_PER_CLUSTER);
> +
> + job->bitmap = hbitmap_alloc(end, 0);
> +
> + bdrv_set_on_error(target, on_target_error, on_target_error);
> + bdrv_iostatus_enable(target);
> +
> + bdrv_add_before_write_notifier(bs, &before_write);
> +
> + DPRINTF("backup_run start %s %" PRId64 " %" PRId64 "\n",
> + bdrv_get_device_name(bs), start, end);
> +
> + for (; start < end; start++) {
> + bool error_is_read;
> +
> + if (block_job_is_cancelled(&job->common)) {
> + break;
> + }
> +
> + /* we need to yield so that qemu_aio_flush() returns.
> + * (without, VM does not reboot)
> + */
> + if (job->common.speed) {
> + uint64_t delay_ns = ratelimit_calculate_delay(
> + &job->limit, job->sectors_read);
> + job->sectors_read = 0;
> + block_job_sleep_ns(&job->common, rt_clock, delay_ns);
> + } else {
> + block_job_sleep_ns(&job->common, rt_clock, 0);
> + }
> +
> + if (block_job_is_cancelled(&job->common)) {
> + break;
> + }
> +
> + DPRINTF("backup_run loop C%" PRId64 "\n", start);
> +
> + ret = backup_do_cow(bs, start * BACKUP_SECTORS_PER_CLUSTER, 1,
> + &error_is_read);
> + if (ret < 0) {
> + /* Depending on error action, fail now or retry cluster */
> + BlockErrorAction action =
> + backup_error_action(job, error_is_read, -ret);
> + if (action == BDRV_ACTION_REPORT) {
> + break;
> + } else {
> + start--;
> + continue;
> + }
> + }
> + }
> +
> + notifier_with_return_remove(&before_write);
> +
> + /* wait until pending backup_do_cow() calls have completed */
> + qemu_co_rwlock_wrlock(&job->flush_rwlock);
> + qemu_co_rwlock_unlock(&job->flush_rwlock);
> +
> + hbitmap_free(job->bitmap);
> +
> + bdrv_iostatus_disable(target);
> + bdrv_delete(job->target);
drive-mirror has bdrv_close before deleting target, why don't we need
one here?
> +
> + DPRINTF("backup_run complete %d\n", ret);
> + block_job_completed(&job->common, ret);
> +}
> +
Fam
- Re: [Qemu-devel] [PATCH v5 03/11] block: add basic backup support to block driver, Fam Zheng, 2013/06/05
- Re: [Qemu-devel] [PATCH v5 03/11] block: add basic backup support to block driver, Stefan Hajnoczi, 2013/06/06
- Re: [Qemu-devel] [PATCH v5 03/11] block: add basic backup support to block driver, Fam Zheng, 2013/06/06
- Re: [Qemu-devel] [PATCH v5 03/11] block: add basic backup support to block driver, Stefan Hajnoczi, 2013/06/07
- Re: [Qemu-devel] [PATCH v5 03/11] block: add basic backup support to block driver, Wenchao Xia, 2013/06/13
- Re: [Qemu-devel] [PATCH v5 03/11] block: add basic backup support to block driver, Wenchao Xia, 2013/06/13
- Re: [Qemu-devel] [PATCH v5 03/11] block: add basic backup support to block driver, Fam Zheng, 2013/06/13
- Re: [Qemu-devel] [PATCH v5 03/11] block: add basic backup support to block driver, Wenchao Xia, 2013/06/13
- Re: [Qemu-devel] [PATCH v5 03/11] block: add basic backup support to block driver, Stefan Hajnoczi, 2013/06/13