set_blocksize(): switch to passing struct file *
authorAl Viro <viro@zeniv.linux.org.uk>
Thu, 18 Apr 2024 04:34:31 +0000 (00:34 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Thu, 2 May 2024 21:39:44 +0000 (17:39 -0400)
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
block/bdev.c
block/ioctl.c
drivers/block/pktcdvd.c
fs/btrfs/dev-replace.c
fs/btrfs/volumes.c
fs/ext4/super.c
fs/reiserfs/journal.c
fs/xfs/xfs_buf.c
include/linux/blkdev.h

index b8e32d933a6369aebbffe36e2ce3165cc2288bef..a329ff9be11d8c5d5f4dc9c7f57861bf4b98d2dd 100644 (file)
@@ -144,8 +144,11 @@ static void set_init_blocksize(struct block_device *bdev)
        bdev->bd_inode->i_blkbits = blksize_bits(bsize);
 }
 
-int set_blocksize(struct block_device *bdev, int size)
+int set_blocksize(struct file *file, int size)
 {
+       struct inode *inode = file->f_mapping->host;
+       struct block_device *bdev = I_BDEV(inode);
+
        /* Size must be a power of two, and between 512 and PAGE_SIZE */
        if (size > PAGE_SIZE || size < 512 || !is_power_of_2(size))
                return -EINVAL;
@@ -155,9 +158,9 @@ int set_blocksize(struct block_device *bdev, int size)
                return -EINVAL;
 
        /* Don't change the size if it is same as current */
-       if (bdev->bd_inode->i_blkbits != blksize_bits(size)) {
+       if (inode->i_blkbits != blksize_bits(size)) {
                sync_blockdev(bdev);
-               bdev->bd_inode->i_blkbits = blksize_bits(size);
+               inode->i_blkbits = blksize_bits(size);
                kill_bdev(bdev);
        }
        return 0;
@@ -167,7 +170,7 @@ EXPORT_SYMBOL(set_blocksize);
 
 int sb_set_blocksize(struct super_block *sb, int size)
 {
-       if (set_blocksize(sb->s_bdev, size))
+       if (set_blocksize(sb->s_bdev_file, size))
                return 0;
        /* If we get here, we know size is power of two
         * and it's value is between 512 and PAGE_SIZE */
index a9028a2c2db57b0881b7faf7cee2243148d1626c..1c800364bc70412e71c861cb7ca379fef14fe10e 100644 (file)
@@ -473,11 +473,14 @@ static int compat_hdio_getgeo(struct block_device *bdev,
 #endif
 
 /* set the logical block size */
-static int blkdev_bszset(struct block_device *bdev, blk_mode_t mode,
+static int blkdev_bszset(struct file *file, blk_mode_t mode,
                int __user *argp)
 {
+       // this one might be file_inode(file)->i_rdev - a rare valid
+       // use of file_inode() for those.
+       dev_t dev = I_BDEV(file->f_mapping->host)->bd_dev;
+       struct file *excl_file;
        int ret, n;
-       struct file *file;
 
        if (!capable(CAP_SYS_ADMIN))
                return -EACCES;
@@ -487,13 +490,13 @@ static int blkdev_bszset(struct block_device *bdev, blk_mode_t mode,
                return -EFAULT;
 
        if (mode & BLK_OPEN_EXCL)
-               return set_blocksize(bdev, n);
+               return set_blocksize(file, n);
 
-       file = bdev_file_open_by_dev(bdev->bd_dev, mode, &bdev, NULL);
-       if (IS_ERR(file))
+       excl_file = bdev_file_open_by_dev(dev, mode, &dev, NULL);
+       if (IS_ERR(excl_file))
                return -EBUSY;
-       ret = set_blocksize(bdev, n);
-       fput(file);
+       ret = set_blocksize(excl_file, n);
+       fput(excl_file);
        return ret;
 }
 
@@ -621,7 +624,7 @@ long blkdev_ioctl(struct file *file, unsigned cmd, unsigned long arg)
        case BLKBSZGET: /* get block device soft block size (cf. BLKSSZGET) */
                return put_int(argp, block_size(bdev));
        case BLKBSZSET:
-               return blkdev_bszset(bdev, mode, argp);
+               return blkdev_bszset(file, mode, argp);
        case BLKGETSIZE64:
                return put_u64(argp, bdev_nr_bytes(bdev));
 
@@ -681,7 +684,7 @@ long compat_blkdev_ioctl(struct file *file, unsigned cmd, unsigned long arg)
        case BLKBSZGET_32: /* get the logical block size (cf. BLKSSZGET) */
                return put_int(argp, bdev_logical_block_size(bdev));
        case BLKBSZSET_32:
-               return blkdev_bszset(bdev, mode, argp);
+               return blkdev_bszset(file, mode, argp);
        case BLKGETSIZE64_32:
                return put_u64(argp, bdev_nr_bytes(bdev));
 
index 05933f25b3970d77b24ecbe57f1644340305b5a0..8a2ce80700109dfad85fe5d314319d675f3e0edb 100644 (file)
@@ -2215,7 +2215,7 @@ static int pkt_open_dev(struct pktcdvd_device *pd, bool write)
                }
                dev_info(ddev, "%lukB available on disc\n", lba << 1);
        }
-       set_blocksize(file_bdev(bdev_file), CD_FRAMESIZE);
+       set_blocksize(bdev_file, CD_FRAMESIZE);
 
        return 0;
 
index 7696beec4c216f1d2658b36cd077277ed96d27bf..7130040d92abe2764928a8d28c3cd1b06f5b3180 100644 (file)
@@ -316,7 +316,7 @@ static int btrfs_init_dev_replace_tgtdev(struct btrfs_fs_info *fs_info,
        set_bit(BTRFS_DEV_STATE_IN_FS_METADATA, &device->dev_state);
        set_bit(BTRFS_DEV_STATE_REPLACE_TGT, &device->dev_state);
        device->dev_stats_valid = 1;
-       set_blocksize(device->bdev, BTRFS_BDEV_BLOCKSIZE);
+       set_blocksize(bdev_file, BTRFS_BDEV_BLOCKSIZE);
        device->fs_devices = fs_devices;
 
        ret = btrfs_get_dev_zone_info(device, false);
index 43af5a9fb54720b90fea1af4a71899e5936b36d9..65c03ddecc595c67cc26512e7b5bc75043ff99e9 100644 (file)
@@ -483,7 +483,7 @@ btrfs_get_bdev_and_sb(const char *device_path, blk_mode_t flags, void *holder,
        if (flush)
                sync_blockdev(bdev);
        if (holder) {
-               ret = set_blocksize(bdev, BTRFS_BDEV_BLOCKSIZE);
+               ret = set_blocksize(*bdev_file, BTRFS_BDEV_BLOCKSIZE);
                if (ret) {
                        fput(*bdev_file);
                        goto error;
@@ -2717,7 +2717,7 @@ int btrfs_init_new_device(struct btrfs_fs_info *fs_info, const char *device_path
        set_bit(BTRFS_DEV_STATE_IN_FS_METADATA, &device->dev_state);
        clear_bit(BTRFS_DEV_STATE_REPLACE_TGT, &device->dev_state);
        device->dev_stats_valid = 1;
-       set_blocksize(device->bdev, BTRFS_BDEV_BLOCKSIZE);
+       set_blocksize(device->bdev_file, BTRFS_BDEV_BLOCKSIZE);
 
        if (seeding_dev) {
                btrfs_clear_sb_rdonly(sb);
index 044135796f2b6ebe86e56b69f57501e7567d761b..9988b3a40b424ab10789914264327bb9c37f3592 100644 (file)
@@ -5873,7 +5873,7 @@ static struct file *ext4_get_journal_blkdev(struct super_block *sb,
 
        sb_block = EXT4_MIN_BLOCK_SIZE / blocksize;
        offset = EXT4_MIN_BLOCK_SIZE % blocksize;
-       set_blocksize(bdev, blocksize);
+       set_blocksize(bdev_file, blocksize);
        bh = __bread(bdev, sb_block, blocksize);
        if (!bh) {
                ext4_msg(sb, KERN_ERR, "couldn't read superblock of "
index e539ccd39e1ee74cd8bdfd35d29f826be6f514e1..e477ee0ff35d205f716dc230db8c2930a4662453 100644 (file)
@@ -2626,8 +2626,7 @@ static int journal_init_dev(struct super_block *super,
                                         MAJOR(jdev), MINOR(jdev), result);
                        return result;
                } else if (jdev != super->s_dev)
-                       set_blocksize(file_bdev(journal->j_bdev_file),
-                                     super->s_blocksize);
+                       set_blocksize(journal->j_bdev_file, super->s_blocksize);
 
                return 0;
        }
@@ -2643,7 +2642,7 @@ static int journal_init_dev(struct super_block *super,
                return result;
        }
 
-       set_blocksize(file_bdev(journal->j_bdev_file), super->s_blocksize);
+       set_blocksize(journal->j_bdev_file, super->s_blocksize);
        reiserfs_info(super,
                      "journal_init_dev: journal device: %pg\n",
                      file_bdev(journal->j_bdev_file));
index f0fa02264edaaeef2d23d1101d1953d6454e8832..2dc0eacb099990297760074e82a7c3438d5347ec 100644 (file)
@@ -2043,7 +2043,7 @@ xfs_setsize_buftarg(
        btp->bt_meta_sectorsize = sectorsize;
        btp->bt_meta_sectormask = sectorsize - 1;
 
-       if (set_blocksize(btp->bt_bdev, sectorsize)) {
+       if (set_blocksize(btp->bt_bdev_file, sectorsize)) {
                xfs_warn(btp->bt_mount,
                        "Cannot set_blocksize to %u on device %pg",
                        sectorsize, btp->bt_bdev);
index 172c918799995f8ce6ed285bc5a8ea3341ddb6ed..20c749b2ebc231e0a9b5d2908ef6646293e51004 100644 (file)
@@ -1474,7 +1474,7 @@ static inline void bio_end_io_acct(struct bio *bio, unsigned long start_time)
 }
 
 int bdev_read_only(struct block_device *bdev);
-int set_blocksize(struct block_device *bdev, int size);
+int set_blocksize(struct file *file, int size);
 
 int lookup_bdev(const char *pathname, dev_t *dev);