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);
>  }

Reply via email to