Skip to content

Commit d5f0922

Browse files
committed
btrfs: restrict writes to opened btrfs devices
[WEIRD FLAG EXCLUSION] Commit ead6226 ("btrfs: Do not restrict writes to btrfs devices") removes the BLK_OPEN_RESTRICT_WRITES flag when opening the devices during mount. However there is no filesystem except btrfs excluding this flag, which is weird, and lacks a proper explanation why we need such an exception. [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 that 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 have 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 is 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 <brauner@kernel.org> Signed-off-by: Qu Wenruo <wqu@suse.com>
1 parent 39d8d3a commit d5f0922

File tree

1 file changed

+1
-7
lines changed

1 file changed

+1
-7
lines changed

fs/btrfs/super.c

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -261,12 +261,6 @@ static const struct fs_parameter_spec btrfs_fs_parameters[] = {
261261
{}
262262
};
263263

264-
/* No support for restricting writes to btrfs devices yet... */
265-
static inline blk_mode_t btrfs_open_mode(struct fs_context *fc)
266-
{
267-
return sb_open_mode(fc->sb_flags) & ~BLK_OPEN_RESTRICT_WRITES;
268-
}
269-
270264
static bool btrfs_match_compress_type(const char *string, const char *type, bool may_have_level)
271265
{
272266
const int len = strlen(type);
@@ -1843,7 +1837,7 @@ static int btrfs_get_tree_super(struct fs_context *fc)
18431837
struct btrfs_fs_devices *fs_devices = NULL;
18441838
struct btrfs_device *device;
18451839
struct super_block *sb;
1846-
blk_mode_t mode = btrfs_open_mode(fc);
1840+
blk_mode_t mode = sb_open_mode(fc->sb_flags);
18471841
int ret;
18481842

18491843
btrfs_ctx_to_info(fs_info, ctx);

0 commit comments

Comments
 (0)