]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
btrfs: always open the device read-only in btrfs_scan_one_device()
authorChristoph Hellwig <hch@lst.de>
Wed, 11 Jun 2025 10:02:59 +0000 (12:02 +0200)
committerDavid Sterba <dsterba@suse.com>
Mon, 21 Jul 2025 22:06:02 +0000 (00:06 +0200)
btrfs_scan_one_device() opens the block device only to read the super
block.  Instead of passing a blk_mode_t argument to sometimes open
it for writing, just hard code BLK_OPEN_READ as it will never write
to the device or hand the block_device out to someone else.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Qu Wenruo <wqu@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/super.c
fs/btrfs/volumes.c
fs/btrfs/volumes.h

index 2d0d8c6e77b45601ee4fdca877f46a01f6a0bbaf..b9e08a59da4e334a8e473eeb96826f3926a31fd4 100644 (file)
@@ -364,10 +364,9 @@ static int btrfs_parse_param(struct fs_context *fc, struct fs_parameter *param)
                break;
        case Opt_device: {
                struct btrfs_device *device;
-               blk_mode_t mode = btrfs_open_mode(fc);
 
                mutex_lock(&uuid_mutex);
-               device = btrfs_scan_one_device(param->string, mode, false);
+               device = btrfs_scan_one_device(param->string, false);
                mutex_unlock(&uuid_mutex);
                if (IS_ERR(device))
                        return PTR_ERR(device);
@@ -1855,7 +1854,7 @@ static int btrfs_get_tree_super(struct fs_context *fc)
         * With 'true' passed to btrfs_scan_one_device() (mount time) we expect
         * either a valid device or an error.
         */
-       device = btrfs_scan_one_device(fc->source, mode, true);
+       device = btrfs_scan_one_device(fc->source, true);
        ASSERT(device != NULL);
        if (IS_ERR(device)) {
                mutex_unlock(&uuid_mutex);
@@ -2233,7 +2232,7 @@ static long btrfs_control_ioctl(struct file *file, unsigned int cmd,
                 * Scanning outside of mount can return NULL which would turn
                 * into 0 error code.
                 */
-               device = btrfs_scan_one_device(vol->name, BLK_OPEN_READ, false);
+               device = btrfs_scan_one_device(vol->name, false);
                ret = PTR_ERR_OR_ZERO(device);
                mutex_unlock(&uuid_mutex);
                break;
@@ -2251,7 +2250,7 @@ static long btrfs_control_ioctl(struct file *file, unsigned int cmd,
                 * Scanning outside of mount can return NULL which would turn
                 * into 0 error code.
                 */
-               device = btrfs_scan_one_device(vol->name, BLK_OPEN_READ, false);
+               device = btrfs_scan_one_device(vol->name, false);
                if (IS_ERR_OR_NULL(device)) {
                        mutex_unlock(&uuid_mutex);
                        if (IS_ERR(device))
index 714ebbd25c1e9ef400883edf4a9837a5651959d1..50b1cc91daf525c73f8902510cde89b94aa15fc2 100644 (file)
@@ -1439,7 +1439,7 @@ static bool btrfs_skip_registration(struct btrfs_super_block *disk_super,
  * the device or return an error. Multi-device and seeding devices are registered
  * in both cases.
  */
-struct btrfs_device *btrfs_scan_one_device(const char *path, blk_mode_t flags,
+struct btrfs_device *btrfs_scan_one_device(const char *path,
                                           bool mount_arg_dev)
 {
        struct btrfs_super_block *disk_super;
@@ -1460,7 +1460,7 @@ struct btrfs_device *btrfs_scan_one_device(const char *path, blk_mode_t flags,
         * values temporarily, as the device paths of the fsid are the only
         * required information for assembling the volume.
         */
-       bdev_file = bdev_file_open_by_path(path, flags, NULL, NULL);
+       bdev_file = bdev_file_open_by_path(path, BLK_OPEN_READ, NULL, NULL);
        if (IS_ERR(bdev_file))
                return ERR_CAST(bdev_file);
 
index 6d8b1f38e3ee878d8a9a42d095116d76283313a0..1cfced687ce37edce4c83315da6120507a20b790 100644 (file)
@@ -719,8 +719,7 @@ struct btrfs_block_group *btrfs_create_chunk(struct btrfs_trans_handle *trans,
 void btrfs_mapping_tree_free(struct btrfs_fs_info *fs_info);
 int btrfs_open_devices(struct btrfs_fs_devices *fs_devices,
                       blk_mode_t flags, void *holder);
-struct btrfs_device *btrfs_scan_one_device(const char *path, blk_mode_t flags,
-                                          bool mount_arg_dev);
+struct btrfs_device *btrfs_scan_one_device(const char *path, bool mount_arg_dev);
 int btrfs_forget_devices(dev_t devt);
 void btrfs_close_devices(struct btrfs_fs_devices *fs_devices);
 void btrfs_free_extra_devids(struct btrfs_fs_devices *fs_devices);