• Christian Brauner's avatar
    block: handle BLK_OPEN_RESTRICT_WRITES correctly · ddd65e19
    Christian Brauner authored
    Last kernel release we introduce CONFIG_BLK_DEV_WRITE_MOUNTED. By
    default this option is set. When it is set the long-standing behavior
    of being able to write to mounted block devices is enabled.
    
    But in order to guard against unintended corruption by writing to the
    block device buffer cache CONFIG_BLK_DEV_WRITE_MOUNTED can be turned
    off. In that case it isn't possible to write to mounted block devices
    anymore.
    
    A filesystem may open its block devices with BLK_OPEN_RESTRICT_WRITES
    which disallows concurrent BLK_OPEN_WRITE access. When we still had the
    bdev handle around we could recognize BLK_OPEN_RESTRICT_WRITES because
    the mode was passed around. Since we managed to get rid of the bdev
    handle we changed that logic to recognize BLK_OPEN_RESTRICT_WRITES based
    on whether the file was opened writable and writes to that block device
    are blocked. That logic doesn't work because we do allow
    BLK_OPEN_RESTRICT_WRITES to be specified without BLK_OPEN_WRITE.
    
    Fix the detection logic and use an FMODE_* bit. We could've also abused
    O_EXCL as an indicator that BLK_OPEN_RESTRICT_WRITES has been requested.
    For userspace open paths O_EXCL will never be retained but for internal
    opens where we open files that are never installed into a file
    descriptor table this is fine. But it would be a gamble that this
    doesn't cause bugs. Note that BLK_OPEN_RESTRICT_WRITES is an internal
    only flag that cannot directly be raised by userspace. It is implicitly
    raised during mounting.
    
    Passes xftests and blktests with CONFIG_BLK_DEV_WRITE_MOUNTED set and
    unset.
    
    Link: https://lore.kernel.org/r/ZfyyEwu9Uq5Pgb94@casper.infradead.org
    Link: https://lore.kernel.org/r/20240323-zielbereich-mittragen-6fdf14876c3e@brauner
    Fixes: 321de651 ("block: don't rely on BLK_OPEN_RESTRICT_WRITES when yielding write access")
    Reviewed-by: default avatarYu Kuai <yukuai3@huawei.com>
    Reviewed-by: default avatarJan Kara <jack@suse.cz>
    Reported-by: default avatarMatthew Wilcox <willy@infradead.org>
    Signed-off-by: default avatarChristian Brauner <brauner@kernel.org>
    ddd65e19
bdev.c 30.8 KB