• Damien Le Moal's avatar
    dm: introduce zone append emulation · bb37d772
    Damien Le Moal authored
    For zoned targets that cannot support zone append operations, implement
    an emulation using regular write operations. If the original BIO
    submitted by the user is a zone append operation, change its clone into
    a regular write operation directed at the target zone write pointer
    position.
    
    To do so, an array of write pointer offsets (write pointer position
    relative to the start of a zone) is added to struct mapped_device. All
    operations that modify a sequential zone write pointer (writes, zone
    reset, zone finish and zone append) are intersepted in __map_bio() and
    processed using the new functions dm_zone_map_bio().
    
    Detection of the target ability to natively support zone append
    operations is done from dm_table_set_restrictions() by calling the
    function dm_set_zones_restrictions(). A target that does not support
    zone append operation, either by explicitly declaring it using the new
    struct dm_target field zone_append_not_supported, or because the device
    table contains a non-zoned device, has its mapped device marked with the
    new flag DMF_ZONE_APPEND_EMULATED. The helper function
    dm_emulate_zone_append() is introduced to test a mapped device for this
    new flag.
    
    Atomicity of the zones write pointer tracking and updates is done using
    a zone write locking mechanism based on a bitmap. This is similar to
    the block layer method but based on BIOs rather than struct request.
    A zone write lock is taken in dm_zone_map_bio() for any clone BIO with
    an operation type that changes the BIO target zone write pointer
    position. The zone write lock is released if the clone BIO is failed
    before submission or when dm_zone_endio() is called when the clone BIO
    completes.
    
    The zone write lock bitmap of the mapped device, together with a bitmap
    indicating zone types (conv_zones_bitmap) and the write pointer offset
    array (zwp_offset) are allocated and initialized with a full device zone
    report in dm_set_zones_restrictions() using the function
    dm_revalidate_zones().
    
    For failed operations that may have modified a zone write pointer, the
    zone write pointer offset is marked as invalid in dm_zone_endio().
    Zones with an invalid write pointer offset are checked and the write
    pointer updated using an internal report zone operation when the
    faulty zone is accessed again by the user.
    
    All functions added for this emulation have a minimal overhead for
    zoned targets natively supporting zone append operations. Regular
    device targets are also not affected. The added code also does not
    impact builds with CONFIG_BLK_DEV_ZONED disabled by stubbing out all
    dm zone related functions.
    Signed-off-by: default avatarDamien Le Moal <damien.lemoal@wdc.com>
    Reviewed-by: default avatarHimanshu Madhani <himanshu.madhani@oracle.com>
    Reviewed-by: default avatarHannes Reinecke <hare@suse.de>
    Signed-off-by: default avatarMike Snitzer <snitzer@redhat.com>
    bb37d772
dm-table.c 52.9 KB