• Jeff Layton's avatar
    lib: add errseq_t type and infrastructure for handling it · 84cbadad
    Jeff Layton authored
    An errseq_t is a way of recording errors in one place, and allowing any
    number of "subscribers" to tell whether an error has been set again
    since a previous time.
    
    It's implemented as an unsigned 32-bit value that is managed with atomic
    operations. The low order bits are designated to hold an error code
    (max size of MAX_ERRNO). The upper bits are used as a counter.
    
    The API works with consumers sampling an errseq_t value at a particular
    point in time. Later, that value can be used to tell whether new errors
    have been set since that time.
    
    Note that there is a 1 in 512k risk of collisions here if new errors
    are being recorded frequently, since we have so few bits to use as a
    counter. To mitigate this, one bit is used as a flag to tell whether the
    value has been sampled since a new value was recorded. That allows
    us to avoid bumping the counter if no one has sampled it since it
    was last bumped.
    
    Later patches will build on this infrastructure to change how writeback
    errors are tracked in the kernel.
    Signed-off-by: default avatarJeff Layton <jlayton@redhat.com>
    Reviewed-by: default avatarNeilBrown <neilb@suse.com>
    Reviewed-by: default avatarJan Kara <jack@suse.cz>
    84cbadad
errseq.c 6.51 KB