On 2020/09/10 16:40, Damien Le Moal wrote: > ZBC or ZAC disks that have a limit on the number of open zones may fail > a zone open command or a write to a zone that is not already implicitly > or explicitly open if the total number of open zones is already at the > maximum allowed. > > For these operations, instead of returning the generic BLK_STS_IOERR, > return BLK_STS_DEV_RESOURCE which is returned as -EBUSY to the I/O > issuer, allowing the device user to act appropriately on these > relatively benign zone resource errors. > > With this change the NVMe (ZNS) and sd drivers both return the same > error code for zone resource errors, facilitating the implementation of > IO error handling by the user with a common code base for both device > types. > > Signed-off-by: Damien Le Moal <damien.lemoal@xxxxxxx> > --- > drivers/scsi/scsi_lib.c | 12 ++++++++++++ > 1 file changed, 12 insertions(+) > > diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c > index 7c6dd6f75190..7eb4a80c3bbb 100644 > --- a/drivers/scsi/scsi_lib.c > +++ b/drivers/scsi/scsi_lib.c > @@ -758,6 +758,18 @@ static void scsi_io_completion_action(struct scsi_cmnd *cmd, int result) > /* See SSC3rXX or current. */ > action = ACTION_FAIL; > break; > + case DATA_PROTECT: > + sdev_printk(KERN_INFO, cmd->device, > + "asc/ascq = 0x%02x 0x%02x\n", > + sshdr.asc, sshdr.ascq); Oops... Forgot to remove my debug message. Re-sending without it. > + action = ACTION_FAIL; > + if ((sshdr.asc == 0x0C && sshdr.ascq == 0x12) || > + (sshdr.asc == 0x55 && > + (sshdr.ascq == 0x0E || sshdr.ascq == 0x0F))) { > + /* Insufficient zone resources */ > + blk_stat = BLK_STS_DEV_RESOURCE; > + } > + break; > default: > action = ACTION_FAIL; > break; > -- Damien Le Moal Western Digital Research