From: Al Viro <viro@zeniv.linux.org.uk>
To: linux-fsdevel@vger.kernel.org
Cc: Linus Torvalds <torvalds@linux-foundation.org>,
Christian Brauner <brauner@kernel.org>,
Christoph Hellwig <hch@lst.de>,
linux-block@vger.kernel.org, Jens Axboe <axboe@kernel.dk>,
linux-btrfs@vger.kernel.org,
"Rafael J. Wysocki" <rafael@kernel.org>,
Andrew Morton <akpm@linux-foundation.org>
Subject: [PATCHES v2][RFC] set_blocksize() rework
Date: Fri, 3 May 2024 04:18:33 +0100 [thread overview]
Message-ID: <20240503031833.GU2118490@ZenIV> (raw)
In-Reply-To: <20240427210920.GR2118490@ZenIV>
On Sat, Apr 27, 2024 at 10:09:20PM +0100, Al Viro wrote:
> Any buffer-cache based filesystem is going to be FUBAR
> if somebody manages to change block size of device under it,
> since primitives (sb_bread(), sb_getblk(), etc.) operate in
> terms of block numbers. If block size suddenly doubles, so
> will the offsets from the beginning of device. Results are
> not pretty, obviously.
>
> The thing that (mostly) prevents that kind of mess
> is that most of the mechanisms that lead to block size
> change require the device being opened exclusive. However,
> there are several exceptions that allow to do that without
> an exclusive open. Fortunately, all of them require
> CAP_SYS_ADMIN, so it's not a security problem - anyone
> who already has that level of access can screw the system
> into the ground in any number of ways. However, security
> problems or not, that crap should be fixed.
>
> The series below eliminates these calls of set_blocksize()
> and changes calling conventsion of set_blocksize() so that it
> uses struct file * instead of struct block_device * to tell
> which device to act upon. Unlike struct block_device, struct
> file has enough information to tell an exclusive open from
> non-exclusive one, so we can reject the operation in non-exclusive
> case.
>
> The branch is available at
> git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs.git #work.set_blocksize
> Individual patches in followups.
>
> Review (and testing, obviously) would be very welcome.
Branch updated and force-pushed (same place). Individual patches in
followups.
Changes:
* zram elimination of double-open added.
* hopefully better description of btrfs side of things.
* final commit split into switch of set_blocksize() to struct file
and adding a check for exclusive open.
* chunk in Documentation/filesystems/porting.rst added.
Shortlog:
Al Viro (9):
bcache_register(): don't bother with set_blocksize()
pktcdvd: sort set_blocksize() calls out
swapon(2)/swapoff(2): don't bother with block size
swapon(2): open swap with O_EXCL
zram: don't bother with reopening - just use O_EXCL for open
swsusp: don't bother with setting block size
btrfs_get_bdev_and_sb(): call set_blocksize() only for exclusive opens
set_blocksize(): switch to passing struct file *
make set_blocksize() fail unless block device is opened exclusive
Diffstat:
Documentation/filesystems/porting.rst | 7 +++++++
block/bdev.c | 14 ++++++++++----
block/ioctl.c | 21 ++++++++++++---------
drivers/block/pktcdvd.c | 7 +------
drivers/block/zram/zram_drv.c | 29 +++++++----------------------
drivers/block/zram/zram_drv.h | 2 +-
drivers/md/bcache/super.c | 4 ----
fs/btrfs/dev-replace.c | 2 +-
fs/btrfs/volumes.c | 13 ++++++++-----
fs/ext4/super.c | 2 +-
fs/reiserfs/journal.c | 5 ++---
fs/xfs/xfs_buf.c | 2 +-
include/linux/blkdev.h | 2 +-
include/linux/swap.h | 2 --
kernel/power/swap.c | 7 +------
mm/swapfile.c | 29 ++---------------------------
16 files changed, 55 insertions(+), 93 deletions(-)
next prev parent reply other threads:[~2024-05-03 3:18 UTC|newest]
Thread overview: 51+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-04-27 21:09 [PATCHES][RFC] set_blocksize() rework Al Viro
2024-04-27 21:10 ` [PATCH 1/7] bcache_register(): don't bother with set_blocksize() Al Viro
2024-04-29 5:06 ` Christoph Hellwig
2024-04-29 8:37 ` Christian Brauner
2024-04-27 21:10 ` [PATCH 2/7] pktcdvd: sort set_blocksize() calls out Al Viro
2024-04-29 5:07 ` Christoph Hellwig
2024-04-29 8:38 ` Christian Brauner
2024-04-27 21:10 ` [PATCH 3/7] swapon(2)/swapoff(2): don't bother with block size Al Viro
2024-04-29 5:08 ` Christoph Hellwig
2024-04-29 8:38 ` Christian Brauner
2024-04-27 21:11 ` [PATCH 4/7] swapon(2): open swap with O_EXCL Al Viro
2024-04-27 21:40 ` Linus Torvalds
2024-04-27 23:46 ` Al Viro
2024-04-28 1:25 ` Al Viro
2024-04-28 18:19 ` Al Viro
2024-04-28 18:46 ` Linus Torvalds
2024-04-28 19:07 ` Al Viro
2024-04-29 5:10 ` Christoph Hellwig
2024-04-29 5:09 ` Christoph Hellwig
2024-04-29 8:39 ` Christian Brauner
2024-04-27 21:11 ` [PATCH 5/7] swsusp: don't bother with setting block size Al Viro
2024-04-29 5:10 ` Christoph Hellwig
2024-04-29 8:40 ` Christian Brauner
2024-04-27 21:12 ` [PATCH 6/7] btrfs_get_dev_args_from_path(): don't call set_blocksize() Al Viro
2024-04-29 5:11 ` Christoph Hellwig
2024-04-29 8:40 ` Christian Brauner
2024-04-29 15:11 ` David Sterba
2024-04-30 2:05 ` Al Viro
2024-04-27 21:13 ` [PATCH 7/7] set_blocksize(): switch to passing struct file *, fail if it's not opened exclusive Al Viro
2024-04-29 5:12 ` Christoph Hellwig
2024-04-29 8:42 ` Christian Brauner
2024-05-03 3:18 ` Al Viro [this message]
2024-05-03 3:23 ` [PATCH v2 1/9] bcache_register(): don't bother with set_blocksize() Al Viro
2024-05-03 3:23 ` [PATCH v2 2/9] pktcdvd: sort set_blocksize() calls out Al Viro
2024-05-03 3:23 ` [PATCH v2 3/9] swapon(2)/swapoff(2): don't bother with block size Al Viro
2024-05-03 3:23 ` [PATCH v2 4/9] swapon(2): open swap with O_EXCL Al Viro
2024-05-03 3:23 ` [PATCH v2 5/9] zram: don't bother with reopening - just use O_EXCL for open Al Viro
2024-05-03 3:23 ` [PATCH v2 6/9] swsusp: don't bother with setting block size Al Viro
2024-05-03 3:23 ` [PATCH v2 7/9] btrfs_get_bdev_and_sb(): call set_blocksize() only for exclusive opens Al Viro
2024-05-10 13:41 ` David Sterba
2024-05-03 3:23 ` [PATCH v2 8/9] set_blocksize(): switch to passing struct file * Al Viro
2024-05-03 3:23 ` [PATCH v2 9/9] make set_blocksize() fail unless block device is opened exclusive Al Viro
2024-05-03 4:17 ` [PATCH v2 1/9] bcache_register(): don't bother with set_blocksize() Al Viro
2024-05-03 4:17 ` [PATCH v2 2/9] pktcdvd: sort set_blocksize() calls out Al Viro
2024-05-03 4:17 ` [PATCH v2 3/9] swapon(2)/swapoff(2): don't bother with block size Al Viro
2024-05-03 4:17 ` [PATCH v2 4/9] swapon(2): open swap with O_EXCL Al Viro
2024-05-03 4:17 ` [PATCH v2 5/9] zram: don't bother with reopening - just use O_EXCL for open Al Viro
2024-05-03 4:17 ` [PATCH v2 6/9] swsusp: don't bother with setting block size Al Viro
2024-05-03 4:17 ` [PATCH v2 7/9] btrfs_get_bdev_and_sb(): call set_blocksize() only for exclusive opens Al Viro
2024-05-03 4:17 ` [PATCH v2 8/9] set_blocksize(): switch to passing struct file * Al Viro
2024-05-03 4:17 ` [PATCH v2 9/9] make set_blocksize() fail unless block device is opened exclusive Al Viro
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240503031833.GU2118490@ZenIV \
--to=viro@zeniv.linux.org.uk \
--cc=akpm@linux-foundation.org \
--cc=axboe@kernel.dk \
--cc=brauner@kernel.org \
--cc=hch@lst.de \
--cc=linux-block@vger.kernel.org \
--cc=linux-btrfs@vger.kernel.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=rafael@kernel.org \
--cc=torvalds@linux-foundation.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.