• Bart Van Assche's avatar
    scsi: sd_zbc: Avoid that resetting a zone fails sporadically · ccce20fc
    Bart Van Assche authored
    Since SCSI scanning occurs asynchronously, since sd_revalidate_disk() is
    called from sd_probe_async() and since sd_revalidate_disk() calls
    sd_zbc_read_zones() it can happen that sd_zbc_read_zones() is called
    concurrently with blkdev_report_zones() and/or blkdev_reset_zones().  That can
    cause these functions to fail with -EIO because sd_zbc_read_zones() e.g. sets
    q->nr_zones to zero before restoring it to the actual value, even if no drive
    characteristics have changed.  Avoid that this can happen by making the
    following changes:
    
    - Protect the code that updates zone information with blk_queue_enter()
      and blk_queue_exit().
    - Modify sd_zbc_setup_seq_zones_bitmap() and sd_zbc_setup() such that
      these functions do not modify struct scsi_disk before all zone
      information has been obtained.
    
    Note: since commit 055f6e18 ("block: Make q_usage_counter also track
    legacy requests"; kernel v4.15) the request queue freezing mechanism also
    affects legacy request queues.
    
    Fixes: 89d94756 ("sd: Implement support for ZBC devices")
    Signed-off-by: default avatarBart Van Assche <bart.vanassche@wdc.com>
    Cc: Jens Axboe <axboe@kernel.dk>
    Cc: Damien Le Moal <damien.lemoal@wdc.com>
    Cc: Christoph Hellwig <hch@lst.de>
    Cc: Hannes Reinecke <hare@suse.com>
    Cc: stable@vger.kernel.org # v4.16
    Reviewed-by: default avatarDamien Le Moal <damien.lemoal@wdc.com>
    Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
    ccce20fc
sd_zbc.c 19 KB