diff options
| author | Qu Wenruo <[email protected]> | 2025-07-04 09:38:03 +0000 |
|---|---|---|
| committer | David Sterba <[email protected]> | 2025-07-21 22:06:20 +0000 |
| commit | 736bd9d2e35866a07f32d9884019e0431b0b50d8 (patch) | |
| tree | aa20b477de9dcd25c77325156485cfe0751e3d65 | |
| parent | btrfs: use fs_holder_ops for all opened devices (diff) | |
| download | kernel-736bd9d2e35866a07f32d9884019e0431b0b50d8.tar.gz kernel-736bd9d2e35866a07f32d9884019e0431b0b50d8.zip | |
btrfs: restrict writes to opened btrfs devices
[FLAG EXCLUSION]
Commit ead622674df5 ("btrfs: Do not restrict writes to btrfs devices")
removes the BLK_OPEN_RESTRICT_WRITES flag when opening the devices
during mount. This was an exception at the time as it depended on other
patches.
[REASON TO EXCLUDE THAT FLAG]
Btrfs needs to call btrfs_scan_one_device() to determine the fsid, no
matter if we're mounting a new fs or an existing one.
But if a fs is already mounted and the BLK_OPEN_RESTRICT_WRITES is
honored, meaning no other write open is allowed for the block device.
Then we want to mount a subvolume of the mounted fs to another mount
point, we will call btrfs_scan_one_device() again, but it will fail due
to the BLK_OPEN_RESTRICT_WRITES flag (no more write open allowed),
causing only one mount point for the fs.
Thus at that time, we had to exclude the BLK_OPEN_RESTRICT_WRITES to
allow multiple mount points for one fs.
[WHY IT'S SAFE NOW]
The root problem is, we do not need to nor should use BLK_OPEN_WRITE for
btrfs_scan_one_device().
That function is only to read out the super block, no write at all, and
BLK_OPEN_WRITE is only going to cause problems for such usage.
The root problem has been fixed by patch "btrfs: always open the device
read-only in btrfs_scan_one_device", so btrfs_scan_one_device() will
always work no matter if the device is opened with
BLK_OPEN_RESTRICT_WRITES.
[ENHANCEMENT]
Just remove the btrfs_open_mode(), as the only call site can be replaced
with regular sb_open_mode().
Reviewed-by: Christian Brauner <[email protected]>
Signed-off-by: Qu Wenruo <[email protected]>
Signed-off-by: David Sterba <[email protected]>
| -rw-r--r-- | fs/btrfs/super.c | 8 |
1 files changed, 1 insertions, 7 deletions
diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c index 212474f44216..466d0450269c 100644 --- a/fs/btrfs/super.c +++ b/fs/btrfs/super.c @@ -261,12 +261,6 @@ static const struct fs_parameter_spec btrfs_fs_parameters[] = { {} }; -/* No support for restricting writes to btrfs devices yet... */ -static inline blk_mode_t btrfs_open_mode(struct fs_context *fc) -{ - return sb_open_mode(fc->sb_flags) & ~BLK_OPEN_RESTRICT_WRITES; -} - static bool btrfs_match_compress_type(const char *string, const char *type, bool may_have_level) { const int len = strlen(type); @@ -1843,7 +1837,7 @@ static int btrfs_get_tree_super(struct fs_context *fc) struct btrfs_fs_devices *fs_devices = NULL; struct btrfs_device *device; struct super_block *sb; - blk_mode_t mode = btrfs_open_mode(fc); + blk_mode_t mode = sb_open_mode(fc->sb_flags); int ret; btrfs_ctx_to_info(fs_info, ctx); |
