Bart Van Assche ccce20fc79 scsi: sd_zbc: Avoid that resetting a zone fails sporadically
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 055f6e18e08f ("block: Make q_usage_counter also track
legacy requests"; kernel v4.15) the request queue freezing mechanism also
affects legacy request queues.

Fixes: 89d947561077 ("sd: Implement support for ZBC devices")
Signed-off-by: Bart 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: Damien Le Moal <damien.lemoal@wdc.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
2018-04-19 00:04:10 -04:00
..
2018-04-12 11:04:35 -07:00
2018-04-13 15:15:15 -07:00
2018-04-06 18:31:06 -07:00
2018-04-10 10:22:27 -07:00
2018-04-10 10:25:57 -07:00
2018-04-10 12:14:37 -07:00
2018-04-04 20:07:20 -07:00
2018-04-05 21:03:42 -07:00
2018-04-12 20:56:10 -07:00
2018-04-09 11:42:31 -07:00
2018-04-09 19:59:54 -07:00
2018-04-04 20:07:20 -07:00
2018-04-05 14:27:02 -07:00
2018-04-11 18:50:41 -07:00
2018-04-11 18:50:41 -07:00
2018-04-07 12:08:19 -07:00
2018-04-10 10:25:57 -07:00
2018-04-10 12:09:27 -07:00
2018-04-18 23:37:25 -04:00
2018-04-12 10:59:03 -07:00
2018-04-10 10:25:57 -07:00
2018-04-04 20:07:20 -07:00
2018-04-15 17:21:30 -07:00
2018-04-04 20:07:20 -07:00
2018-04-05 21:29:35 -07:00
2018-04-05 21:21:08 -07:00
2018-04-05 21:21:08 -07:00
2018-04-13 15:46:21 -07:00
2018-04-10 10:22:27 -07:00
2018-04-03 12:06:21 -07:00
2018-04-11 10:28:39 -07:00
2018-04-05 14:27:02 -07:00
2018-04-06 19:44:27 -07:00
2018-04-10 10:20:00 -07:00
2018-04-11 18:58:27 -07:00
2018-04-12 11:04:35 -07:00
2018-03-29 13:38:10 +03:00