On 2020/09/18 8:18, Keith Busch wrote: > A zoned device with limited resources to open or activate zones may > return an error when the host exceeds those limits. The same command may > be successful if retried later, but the host needs to wait for specific > zone states before it should retry. Have the block layer provide an > appropriate status for these conditions so applications can distinuguish > this error for special handling. > > Cc: Christoph Hellwig <hch@xxxxxx> > Cc: Damien Le Moal <Damien.LeMoal@xxxxxxx> > Cc: Johannes Thumshirn <Johannes.Thumshirn@xxxxxxx> > Signed-off-by: Keith Busch <kbusch@xxxxxxxxxx> > --- > Documentation/block/queue-sysfs.rst | 8 ++++++++ > block/blk-core.c | 4 ++++ > include/linux/blk_types.h | 18 ++++++++++++++++++ > 3 files changed, 30 insertions(+) > > diff --git a/Documentation/block/queue-sysfs.rst b/Documentation/block/queue-sysfs.rst > index f261a5c84170..2638d3446b79 100644 > --- a/Documentation/block/queue-sysfs.rst > +++ b/Documentation/block/queue-sysfs.rst > @@ -124,6 +124,10 @@ For zoned block devices (zoned attribute indicating "host-managed" or > EXPLICIT OPEN, IMPLICIT OPEN or CLOSED, is limited by this value. > If this value is 0, there is no limit. > > +If the host attempts to exceed this limit, the driver should report this error > +with BLK_STS_ZONE_ACTIVE_RESOURCE, which user space may see as the EOVERFLOW > +errno. > + > max_open_zones (RO) > ------------------- > For zoned block devices (zoned attribute indicating "host-managed" or > @@ -131,6 +135,10 @@ For zoned block devices (zoned attribute indicating "host-managed" or > EXPLICIT OPEN or IMPLICIT OPEN, is limited by this value. > If this value is 0, there is no limit. > > +If the host attempts to exceed this limit, the driver should report this error > +with BLK_STS_ZONE_OPEN_RESOURCE, which user space may see as the ETOOMANYREFS > +errno. > + > max_sectors_kb (RW) > ------------------- > This is the maximum number of kilobytes that the block layer will allow > diff --git a/block/blk-core.c b/block/blk-core.c > index 10c08ac50697..8bffc7732e37 100644 > --- a/block/blk-core.c > +++ b/block/blk-core.c > @@ -186,6 +186,10 @@ static const struct { > /* device mapper special case, should not leak out: */ > [BLK_STS_DM_REQUEUE] = { -EREMCHG, "dm internal retry" }, > > + /* zone device specific errors */ > + [BLK_STS_ZONE_OPEN_RESOURCE] = { -ETOOMANYREFS, "open zones exceeded" }, > + [BLK_STS_ZONE_ACTIVE_RESOURCE] = { -EOVERFLOW, "active zones exceeded" }, > + > /* everything else not covered above: */ > [BLK_STS_IOERR] = { -EIO, "I/O" }, > }; > diff --git a/include/linux/blk_types.h b/include/linux/blk_types.h > index 4ecf4fed171f..8603fc5f86a3 100644 > --- a/include/linux/blk_types.h > +++ b/include/linux/blk_types.h > @@ -103,6 +103,24 @@ typedef u8 __bitwise blk_status_t; > */ > #define BLK_STS_ZONE_RESOURCE ((__force blk_status_t)14) > > +/* > + * BLK_STS_ZONE_OPEN_RESOURCE is returned from the driver in the completion > + * path if the device returns a status indicating that too many zone resources > + * are currently open. The same command should be successful if resubmitted > + * after the number of open zones decreases below the device's limits, which is > + * reported in the request_queue's max_open_zones. > + */ > +#define BLK_STS_ZONE_OPEN_RESOURCE ((__force blk_status_t)15) > + > +/* > + * BLK_STS_ZONE_ACTIVE_RESOURCE is returned from the driver in the completion > + * path if the device returns a status indicating that too many zone resources > + * are currently active. The same command should be successful if resubmitted > + * after the number of active zones decreases below the device's limits, which > + * is reported in the request_queue's max_active_zones. > + */ > +#define BLK_STS_ZONE_ACTIVE_RESOURCE ((__force blk_status_t)16) > + > /** > * blk_path_error - returns true if error may be path related > * @error: status the request was completed with > Looks good. Reviewed-by: Damien Le Moal <damien.lemoal@xxxxxxx> -- Damien Le Moal Western Digital Research