On Wed, 05/13 14:04, Paolo Bonzini wrote: > > > On 13/05/2015 19:28, Fam Zheng wrote: > > @@ -478,6 +478,10 @@ static int blk_check_request(BlockBackend *blk, > > int64_t sector_num, > > return -EIO; > > } > > > > + if (bdrv_op_is_blocked(blk->bs, BLOCK_OP_TYPE_DEVICE_IO, NULL)) { > > + return -EBUSY; > > + } > > I think this is incorrect. It's fine for backends to generate more I/O > after a blocker is submitted, as long as it's bounded. > > For example, SCSI requests can result in many consecutive I/Os: > > (1) FUA requests are split in write+flush > > (2) adapters that do not use QEMUSGList-based I/O only read 128K at a time > > (3) WRITE SAME operations are also split in chunks > > (4) UNMAP operations process one descriptor at a time
I don't understand the point of these examples. If we don't return -EBUSY here, the request will sneak into block/io.c and perhaps break qmp transaction semantics, if it lands between two backups. Fam > > Paolo > > > return blk_check_byte_request(blk, sector_num * BDRV_SECTOR_SIZE, > > nb_sectors * BDRV_SECTOR_SIZE); > > }