Merge tag 'core-rcu-2020-10-12' of git://git.kernel.org/pub/scm/linux/kernel/git...
[linux-2.6-microblaze.git] / block / ioctl.c
index bdb3bbb..3fbc382 100644 (file)
@@ -23,7 +23,7 @@ static int blkpg_do_ioctl(struct block_device *bdev,
                return -EACCES;
        if (copy_from_user(&p, upart, sizeof(struct blkpg_partition)))
                return -EFAULT;
-       if (bdev != bdev->bd_contains)
+       if (bdev_is_partition(bdev))
                return -EINVAL;
 
        if (p.pno <= 0)
@@ -94,7 +94,7 @@ static int blkdev_reread_part(struct block_device *bdev)
 {
        int ret;
 
-       if (!disk_part_scan_enabled(bdev->bd_disk) || bdev != bdev->bd_contains)
+       if (!disk_part_scan_enabled(bdev->bd_disk) || bdev_is_partition(bdev))
                return -EINVAL;
        if (!capable(CAP_SYS_ADMIN))
                return -EACCES;
@@ -112,8 +112,7 @@ static int blk_ioctl_discard(struct block_device *bdev, fmode_t mode,
        uint64_t range[2];
        uint64_t start, len;
        struct request_queue *q = bdev_get_queue(bdev);
-       struct address_space *mapping = bdev->bd_inode->i_mapping;
-
+       int err;
 
        if (!(mode & FMODE_WRITE))
                return -EBADF;
@@ -134,7 +133,11 @@ static int blk_ioctl_discard(struct block_device *bdev, fmode_t mode,
 
        if (start + len > i_size_read(bdev->bd_inode))
                return -EINVAL;
-       truncate_inode_pages_range(mapping, start, start + len - 1);
+
+       err = truncate_bdev_range(bdev, mode, start, start + len - 1);
+       if (err)
+               return err;
+
        return blkdev_issue_discard(bdev, start >> 9, len >> 9,
                                    GFP_KERNEL, flags);
 }
@@ -143,8 +146,8 @@ static int blk_ioctl_zeroout(struct block_device *bdev, fmode_t mode,
                unsigned long arg)
 {
        uint64_t range[2];
-       struct address_space *mapping;
        uint64_t start, end, len;
+       int err;
 
        if (!(mode & FMODE_WRITE))
                return -EBADF;
@@ -166,8 +169,9 @@ static int blk_ioctl_zeroout(struct block_device *bdev, fmode_t mode,
                return -EINVAL;
 
        /* Invalidate the page cache, including dirty pages */
-       mapping = bdev->bd_inode->i_mapping;
-       truncate_inode_pages_range(mapping, start, end);
+       err = truncate_bdev_range(bdev, mode, start, end);
+       if (err)
+               return err;
 
        return blkdev_issue_zeroout(bdev, start >> 9, len >> 9, GFP_KERNEL,
                        BLKDEV_ZERO_NOUNMAP);
@@ -474,15 +478,14 @@ static int blkdev_bszset(struct block_device *bdev, fmode_t mode,
        if (get_user(n, argp))
                return -EFAULT;
 
-       if (!(mode & FMODE_EXCL)) {
-               bdgrab(bdev);
-               if (blkdev_get(bdev, mode | FMODE_EXCL, &bdev) < 0)
-                       return -EBUSY;
-       }
+       if (mode & FMODE_EXCL)
+               return set_blocksize(bdev, n);
 
+       if (IS_ERR(blkdev_get_by_dev(bdev->bd_dev, mode | FMODE_EXCL, &bdev)))
+               return -EBUSY;
        ret = set_blocksize(bdev, n);
-       if (!(mode & FMODE_EXCL))
-               blkdev_put(bdev, mode | FMODE_EXCL);
+       blkdev_put(bdev, mode | FMODE_EXCL);
+
        return ret;
 }