• Johannes Thumshirn's avatar
    scsi: sd_zbc: emulate ZONE_APPEND commands · 5795eb44
    Johannes Thumshirn authored
    Emulate ZONE_APPEND for SCSI disks using a regular WRITE(16) command
    with a start LBA set to the target zone write pointer position.
    
    In order to always know the write pointer position of a sequential write
    zone, the write pointer of all zones is tracked using an array of 32bits
    zone write pointer offset attached to the scsi disk structure. Each
    entry of the array indicate a zone write pointer position relative to
    the zone start sector. The write pointer offsets are maintained in sync
    with the device as follows:
    1) the write pointer offset of a zone is reset to 0 when a
       REQ_OP_ZONE_RESET command completes.
    2) the write pointer offset of a zone is set to the zone size when a
       REQ_OP_ZONE_FINISH command completes.
    3) the write pointer offset of a zone is incremented by the number of
       512B sectors written when a write, write same or a zone append
       command completes.
    4) the write pointer offset of all zones is reset to 0 when a
       REQ_OP_ZONE_RESET_ALL command completes.
    
    Since the block layer does not write lock zones for zone append
    commands, to ensure a sequential ordering of the regular write commands
    used for the emulation, the target zone of a zone append command is
    locked when the function sd_zbc_prepare_zone_append() is called from
    sd_setup_read_write_cmnd(). If the zone write lock cannot be obtained
    (e.g. a zone append is in-flight or a regular write has already locked
    the zone), the zone append command dispatching is delayed by returning
    BLK_STS_ZONE_RESOURCE.
    
    To avoid the need for write locking all zones for REQ_OP_ZONE_RESET_ALL
    requests, use a spinlock to protect accesses and modifications of the
    zone write pointer offsets. This spinlock is initialized from sd_probe()
    using the new function sd_zbc_init().
    Co-developed-by: default avatarDamien Le Moal <Damien.LeMoal@wdc.com>
    Signed-off-by: default avatarJohannes Thumshirn <johannes.thumshirn@wdc.com>
    Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
    Reviewed-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
    Reviewed-by: default avatarHannes Reinecke <hare@suse.de>
    Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
    5795eb44
sd.c 98.2 KB