block/sd: Return -EREMOTEIO when WRITE SAME and DISCARD are disabled
authorMartin K. Petersen <martin.petersen@oracle.com>
Thu, 4 Feb 2016 05:52:12 +0000 (00:52 -0500)
committerMartin K. Petersen <martin.petersen@oracle.com>
Fri, 5 Feb 2016 03:42:58 +0000 (22:42 -0500)
commit0fb5b1fb30fba3671dd5b1489d78e93e08d62e4e
tree090ebf83b190bff02e29a43f8611503d066e33c5
parent82c43310508eb19eb41fe7862e89afeb74030b84
block/sd: Return -EREMOTEIO when WRITE SAME and DISCARD are disabled

When a storage device rejects a WRITE SAME command we will disable write
same functionality for the device and return -EREMOTEIO to the block
layer. -EREMOTEIO will in turn prevent DM from retrying the I/O and/or
failing the path.

Yiwen Jiang discovered a small race where WRITE SAME requests issued
simultaneously would cause -EIO to be returned. This happened because
any requests being prepared after WRITE SAME had been disabled for the
device caused us to return BLKPREP_KILL. The latter caused the block
layer to return -EIO upon completion.

To overcome this we introduce BLKPREP_INVALID which indicates that this
is an invalid request for the device. blk_peek_request() is modified to
return -EREMOTEIO in that case.

Reported-by: Yiwen Jiang <jiangyiwen@huawei.com>
Suggested-by: Mike Snitzer <snitzer@redhat.com>
Reviewed-by: Hannes Reinicke <hare@suse.de>
Reviewed-by: Ewan Milne <emilne@redhat.com>
Reviewed-by: Yiwen Jiang <jiangyiwen@huawei.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
block/blk-core.c
drivers/scsi/sd.c
include/linux/blkdev.h