• Matteo Croce's avatar
    block: add disk sequence number · cf179948
    Matteo Croce authored
    Associating uevents with block devices in userspace is difficult and racy:
    the uevent netlink socket is lossy, and on slow and overloaded systems
    has a very high latency.
    Block devices do not have exclusive owners in userspace, any process can
    set one up (e.g. loop devices). Moreover, device names can be reused
    (e.g. loop0 can be reused again and again). A userspace process setting
    up a block device and watching for its events cannot thus reliably tell
    whether an event relates to the device it just set up or another earlier
    instance with the same name.
    
    Being able to set a UUID on a loop device would solve the race conditions.
    But it does not allow to derive orderings from uevents: if you see a
    uevent with a UUID that does not match the device you are waiting for,
    you cannot tell whether it's because the right uevent has not arrived yet,
    or it was already sent and you missed it. So you cannot tell whether you
    should wait for it or not.
    
    Associating a unique, monotonically increasing sequential number to the
    lifetime of each block device, which can be retrieved with an ioctl
    immediately upon setting it up, allows to solve the race conditions with
    uevents, and also allows userspace processes to know whether they should
    wait for the uevent they need or if it was dropped and thus they should
    move on.
    
    Additionally, increment the disk sequence number when the media change,
    i.e. on DISK_EVENT_MEDIA_CHANGE event.
    Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
    Signed-off-by: default avatarMatteo Croce <mcroce@microsoft.com>
    Tested-by: default avatarLuca Boccassi <bluca@debian.org>
    Link: https://lore.kernel.org/r/20210712230530.29323-2-mcroce@linux.microsoft.comSigned-off-by: default avatarJens Axboe <axboe@kernel.dk>
    cf179948
genhd.c 34.4 KB