Commit 7b99c834 authored by Li Nan's avatar Li Nan
Browse files

block: check io size before submit discard

hulk inclusion
category: bugfix
bugzilla: 189755, https://gitee.com/openeuler/kernel/issues/I9K0H3



--------------------------------

In __blkdev_issue_discard(), q->limits.discard_granularity is read
multi times.

  WARN_ON_ONCE(!q->limits.discard_granularity) [1]
  ...
  q->limits.discard_granularity >> SECTOR_SHIFT [2]
  ...
  bio_aligned_discard_max_sectors [3]

It can be changed to 0 after check [1], such as submitting ioctl
'LOOP_SET_STATUS'. This is undesirable. If 'discard_granularity' is set
to 0, BUG_ON might be triggered and the loop of 'while(nr_sects)' will
never exit(see fixes commit). Fix it by checking 'req_sects' before
submit io, return error code directly if it is 0.

Fixes: b35fd742 ("block: check queue's limits.discard_granularity in __blkdev_issue_discard()")
Signed-off-by: default avatarLi Nan <linan122@huawei.com>
parent 68fab4b6
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -92,6 +92,14 @@ int __blkdev_issue_discard(struct block_device *bdev, sector_t sector,
			req_sects = min_t(sector_t, nr_sects,
					  granularity_aligned_lba - sector_mapped);

		if (!req_sects) {
			if (bio) {
				bio_io_error(bio);
				bio_put(bio);
			}
			return -EOPNOTSUPP;
		}

		WARN_ON_ONCE((req_sects << 9) > UINT_MAX);

		bio = blk_next_bio(bio, 0, gfp_mask);