• Christian Brauner's avatar
    fs: don't misleadingly warn during thaw operations · 2ae4db56
    Christian Brauner authored
    The block device may have been frozen before it was claimed by a
    filesystem. Concurrently another process might try to mount that
    frozen block device and has temporarily claimed the block device for
    that purpose causing a concurrent fs_bdev_thaw() to end up here. The
    mounter is already about to abort mounting because they still saw an
    elevanted bdev->bd_fsfreeze_count so get_bdev_super() will return
    NULL in that case.
    
    For example, P1 calls dm_suspend() which calls into bdev_freeze() before
    the block device has been claimed by the filesystem. This brings
    bdev->bd_fsfreeze_count to 1 and no call into fs_bdev_freeze() is
    required.
    
    Now P2 tries to mount that frozen block device. It claims it and checks
    bdev->bd_fsfreeze_count. As it's elevated it aborts mounting.
    
    In the meantime P3 called dm_resume(). P3 sees that the block device is
    already claimed by a filesystem and calls into fs_bdev_thaw().
    
    P3 takes a passive reference and realizes that the filesystem isn't
    ready yet. P3 puts itself to sleep to wait for the filesystem to become
    ready.
    
    P2 now puts the last active reference to the filesystem and marks it as
    dying. P3 gets woken, sees that the filesystem is dying and
    get_bdev_super() fails.
    
    Fixes: 49ef8832 ("bdev: implement freeze and thaw holder operations")
    Cc: <stable@vger.kernel.org>
    Reported-by: default avatarTheodore Ts'o <tytso@mit.edu>
    Link: https://lore.kernel.org/r/20240611085210.GA1838544@mit.edu
    Link: https://lore.kernel.org/r/20240613-lackmantel-einsehen-90f0d727358d@braunerReviewed-by: default avatarDarrick J. Wong <djwong@kernel.org>
    Signed-off-by: default avatarChristian Brauner <brauner@kernel.org>
    2ae4db56
super.c 58.4 KB