]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/blobdiff - block/ioctl.c
drm/bridge: anx7625: Fix edid_read break case in sp_tx_edid_read()
[mirror_ubuntu-jammy-kernel.git] / block / ioctl.c
index eb0491e90b9a0c07a552049a183537b189289005..cd506a90296302564cb8dcf0d54d3b7fac1924f8 100644 (file)
@@ -113,6 +113,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 inode *inode = bdev->bd_inode;
        int err;
 
        if (!(mode & FMODE_WRITE))
@@ -135,12 +136,17 @@ static int blk_ioctl_discard(struct block_device *bdev, fmode_t mode,
        if (start + len > i_size_read(bdev->bd_inode))
                return -EINVAL;
 
+       filemap_invalidate_lock(inode->i_mapping);
        err = truncate_bdev_range(bdev, mode, start, start + len - 1);
        if (err)
-               return err;
+               goto fail;
 
-       return blkdev_issue_discard(bdev, start >> 9, len >> 9,
-                                   GFP_KERNEL, flags);
+       err = blkdev_issue_discard(bdev, start >> 9, len >> 9,
+                                  GFP_KERNEL, flags);
+
+fail:
+       filemap_invalidate_unlock(inode->i_mapping);
+       return err;
 }
 
 static int blk_ioctl_zeroout(struct block_device *bdev, fmode_t mode,
@@ -148,6 +154,7 @@ static int blk_ioctl_zeroout(struct block_device *bdev, fmode_t mode,
 {
        uint64_t range[2];
        uint64_t start, end, len;
+       struct inode *inode = bdev->bd_inode;
        int err;
 
        if (!(mode & FMODE_WRITE))
@@ -170,12 +177,17 @@ static int blk_ioctl_zeroout(struct block_device *bdev, fmode_t mode,
                return -EINVAL;
 
        /* Invalidate the page cache, including dirty pages */
+       filemap_invalidate_lock(inode->i_mapping);
        err = truncate_bdev_range(bdev, mode, start, end);
        if (err)
-               return err;
+               goto fail;
+
+       err = blkdev_issue_zeroout(bdev, start >> 9, len >> 9, GFP_KERNEL,
+                                  BLKDEV_ZERO_NOUNMAP);
 
-       return blkdev_issue_zeroout(bdev, start >> 9, len >> 9, GFP_KERNEL,
-                       BLKDEV_ZERO_NOUNMAP);
+fail:
+       filemap_invalidate_unlock(inode->i_mapping);
+       return err;
 }
 
 static int put_ushort(unsigned short __user *argp, unsigned short val)
@@ -633,7 +645,7 @@ long compat_blkdev_ioctl(struct file *file, unsigned cmd, unsigned long arg)
                        (bdev->bd_disk->bdi->ra_pages * PAGE_SIZE) / 512);
        case BLKGETSIZE:
                size = i_size_read(bdev->bd_inode);
-               if ((size >> 9) > ~0UL)
+               if ((size >> 9) > ~(compat_ulong_t)0)
                        return -EFBIG;
                return compat_put_ulong(argp, size >> 9);