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 Paolo > return blk_check_byte_request(blk, sector_num * BDRV_SECTOR_SIZE, > nb_sectors * BDRV_SECTOR_SIZE); > }