• Damien Le Moal's avatar
    nvme: fix io_opt limit setting · 68ab60ca
    Damien Le Moal authored
    Currently, a namespace io_opt queue limit is set by default to the
    physical sector size of the namespace and to the the write optimal
    size (NOWS) when the namespace reports optimal IO sizes. This causes
    problems with block limits stacking in blk_stack_limits() when a
    namespace block device is combined with an HDD which generally do not
    report any optimal transfer size (io_opt limit is 0). The code:
    
    /* Optimal I/O a multiple of the physical block size? */
    if (t->io_opt & (t->physical_block_size - 1)) {
    	t->io_opt = 0;
    	t->misaligned = 1;
    	ret = -1;
    }
    
    in blk_stack_limits() results in an error return for this function when
    the combined devices have different but compatible physical sector
    sizes (e.g. 512B sector SSD with 4KB sector disks).
    
    Fix this by not setting the optimal IO size queue limit if the namespace
    does not report an optimal write size value.
    Signed-off-by: default avatarDamien Le Moal <damien.lemoal@wdc.com>
    Reviewed-by: default avatarBart van Assche <bvanassche@acm.org>
    Reviewed-by: default avatarHannes Reinecke <hare@suse.de>
    Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
    68ab60ca
core.c 111 KB