> The only solution I came up with is to add before/after hooks in the block > job. I agree with the criticism, but I think it's general enough and at the > same > time easy enough to implement. > > > IMHO, the current implementation is quite simple and easy to maintain. > > No, "if (bs->backup_info)" simply doesn't belong in bdrv_co_writev.
I do not really understand that argument, because the current COPY_ON_READ implementation also works that way: if (bs->copy_on_read) { flags |= BDRV_REQ_COPY_ON_READ; } if (flags & BDRV_REQ_COPY_ON_READ) { bs->copy_on_read_in_flight++; } if (bs->copy_on_read_in_flight) { wait_for_overlapping_requests(bs, sector_num, nb_sectors); } tracked_request_begin(&req, bs, sector_num, nb_sectors, false); if (flags & BDRV_REQ_COPY_ON_READ) { ... Or do you also want to move that to block job hooks?