Hi all!
Please, can somebody explain me, why we fail guest request in case of
io error in write notifier? I think guest consistency is more
important than success of unfinished backup. Or, what am I missing?
I'm saying about this code:
static int coroutine_fn backup_before_write_notify(
NotifierWithReturn *notifier,
void *opaque)
{
BackupBlockJob *job = container_of(notifier, BackupBlockJob,
before_write);
BdrvTrackedRequest *req = opaque;
int64_t sector_num = req->offset >> BDRV_SECTOR_BITS;
int nb_sectors = req->bytes >> BDRV_SECTOR_BITS;
assert(req->bs == blk_bs(job->common.blk));
assert((req->offset & (BDRV_SECTOR_SIZE - 1)) == 0);
assert((req->bytes & (BDRV_SECTOR_SIZE - 1)) == 0);
return backup_do_cow(job, sector_num, nb_sectors, NULL, true);
}
So, what about something like
ret = backup_do_cow(job, ...
if (ret < 0 && job->notif_ret == 0) {
job->notif_ret = ret;
}
return 0;
and fail block job if notif_ret < 0 in other places of backup code?