Unverified Commit c0fb81fe authored by openeuler-ci-bot's avatar openeuler-ci-bot Committed by Gitee
Browse files

!7077 v4 block: dicard bugfix

Merge Pull Request from: @ci-robot 
 
PR sync from: Li Nan <linan122@huawei.com>
https://mailweb.openeuler.org/hyperkitty/list/kernel@openeuler.org/message/L2FHU2KTL3UHTJASB3BSUVMOYQ5JNXZW/ 
Improve patch 2.

Li Nan (2):
  block: fix overflow in blk_ioctl_discard()
  block: check io size before submit discard


-- 
2.39.2
 
https://gitee.com/openeuler/kernel/issues/I9K0H6 
 
Link:https://gitee.com/openeuler/kernel/pulls/7077

 

Reviewed-by: default avatarYu Kuai <yukuai3@huawei.com>
Reviewed-by: default avatarZhang Peng <zhangpeng362@huawei.com>
Signed-off-by: default avatarZhang Peng <zhangpeng362@huawei.com>
parents a4c1bb6d 1c394c8b
Loading
Loading
Loading
Loading
+12 −1
Original line number Diff line number Diff line
@@ -38,7 +38,7 @@ static sector_t bio_discard_limit(struct block_device *bdev, sector_t sector)
int __blkdev_issue_discard(struct block_device *bdev, sector_t sector,
		sector_t nr_sects, gfp_t gfp_mask, struct bio **biop)
{
	struct bio *bio = *biop;
	struct bio *bio = NULL;
	sector_t bs_mask;

	if (bdev_read_only(bdev))
@@ -64,6 +64,17 @@ int __blkdev_issue_discard(struct block_device *bdev, sector_t sector,
		sector_t req_sects =
			min(nr_sects, bio_discard_limit(bdev, sector));

		if (!req_sects) {
			/* just put the bio allocated in this function */
			if (bio) {
				bio_io_error(bio);
				bio_put(bio);
			}
			return -EOPNOTSUPP;
		}
		if (!bio)
			bio = *biop;

		bio = blk_next_bio(bio, bdev, 0, REQ_OP_DISCARD, gfp_mask);
		bio->bi_iter.bi_sector = sector;
		bio->bi_iter.bi_size = req_sects << 9;
+3 −2
Original line number Diff line number Diff line
@@ -89,7 +89,7 @@ static int blk_ioctl_discard(struct block_device *bdev, blk_mode_t mode,
		unsigned long arg)
{
	uint64_t range[2];
	uint64_t start, len;
	uint64_t start, len, end;
	struct inode *inode = bdev->bd_inode;
	int err;

@@ -110,7 +110,8 @@ static int blk_ioctl_discard(struct block_device *bdev, blk_mode_t mode,
	if (len & 511)
		return -EINVAL;

	if (start + len > bdev_nr_bytes(bdev))
	if (check_add_overflow(start, len, &end) ||
	    end > bdev_nr_bytes(bdev))
		return -EINVAL;

	filemap_invalidate_lock(inode->i_mapping);