• Aravind Ramesh's avatar
    f2fs: support zone capacity less than zone size · de881df9
    Aravind Ramesh authored
    NVMe Zoned Namespace devices can have zone-capacity less than zone-size.
    Zone-capacity indicates the maximum number of sectors that are usable in
    a zone beginning from the first sector of the zone. This makes the sectors
    sectors after the zone-capacity till zone-size to be unusable.
    This patch set tracks zone-size and zone-capacity in zoned devices and
    calculate the usable blocks per segment and usable segments per section.
    
    If zone-capacity is less than zone-size mark only those segments which
    start before zone-capacity as free segments. All segments at and beyond
    zone-capacity are treated as permanently used segments. In cases where
    zone-capacity does not align with segment size the last segment will start
    before zone-capacity and end beyond the zone-capacity of the zone. For
    such spanning segments only sectors within the zone-capacity are used.
    
    During writes and GC manage the usable segments in a section and usable
    blocks per segment. Segments which are beyond zone-capacity are never
    allocated, and do not need to be garbage collected, only the segments
    which are before zone-capacity needs to garbage collected.
    For spanning segments based on the number of usable blocks in that
    segment, write to blocks only up to zone-capacity.
    
    Zone-capacity is device specific and cannot be configured by the user.
    Since NVMe ZNS device zones are sequentially write only, a block device
    with conventional zones or any normal block device is needed along with
    the ZNS device for the metadata operations of F2fs.
    
    A typical nvme-cli output of a zoned device shows zone start and capacity
    and write pointer as below:
    
    SLBA: 0x0     WP: 0x0     Cap: 0x18800 State: EMPTY Type: SEQWRITE_REQ
    SLBA: 0x20000 WP: 0x20000 Cap: 0x18800 State: EMPTY Type: SEQWRITE_REQ
    SLBA: 0x40000 WP: 0x40000 Cap: 0x18800 State: EMPTY Type: SEQWRITE_REQ
    
    Here zone size is 64MB, capacity is 49MB, WP is at zone start as the zones
    are in EMPTY state. For each zone, only zone start + 49MB is usable area,
    any lba/sector after 49MB cannot be read or written to, the drive will fail
    any attempts to read/write. So, the second zone starts at 64MB and is
    usable till 113MB (64 + 49) and the range between 113 and 128MB is
    again unusable. The next zone starts at 128MB, and so on.
    Signed-off-by: default avatarAravind Ramesh <aravind.ramesh@wdc.com>
    Signed-off-by: default avatarDamien Le Moal <damien.lemoal@wdc.com>
    Signed-off-by: default avatarNiklas Cassel <niklas.cassel@wdc.com>
    Reviewed-by: default avatarChao Yu <yuchao0@huawei.com>
    Signed-off-by: default avatarJaegeuk Kim <jaegeuk@kernel.org>
    de881df9
f2fs.h 132 KB