diff options
author | Chaitanya Kulkarni <chaitanya.kulkarni@wdc.com> | 2021-07-21 21:43:32 +0900 |
---|---|---|
committer | David Sterba <dsterba@suse.com> | 2021-08-23 13:19:08 +0200 |
commit | e83502ca5f1e1f03fb1393008ec22d17e7dc9882 (patch) | |
tree | 06c37c2389e478cfd1edd9033b6ff0e22c3677ea /block | |
parent | 5662c967c69dfd162a0667d69bad776939bedf85 (diff) | |
download | linux-stable-e83502ca5f1e1f03fb1393008ec22d17e7dc9882.tar.gz linux-stable-e83502ca5f1e1f03fb1393008ec22d17e7dc9882.tar.bz2 linux-stable-e83502ca5f1e1f03fb1393008ec22d17e7dc9882.zip |
block: fix argument type of bio_trim()
The function bio_trim has offset and size arguments that are declared
as int.
The callers of this function use sector_t type when passing the offset
and size, e.g. drivers/md/raid1.c:narrow_write_error() and
drivers/md/raid1.c:narrow_write_error().
Change offset and size arguments to sector_t type for bio_trim(). Also,
add WARN_ON_ONCE() to catch their overflow.
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Chaitanya Kulkarni <chaitanya.kulkarni@wdc.com>
Signed-off-by: Naohiro Aota <naohiro.aota@wdc.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
Diffstat (limited to 'block')
-rw-r--r-- | block/bio.c | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/block/bio.c b/block/bio.c index 1fab762e079b..77cadcba93b9 100644 --- a/block/bio.c +++ b/block/bio.c @@ -1463,12 +1463,15 @@ EXPORT_SYMBOL(bio_split); * @bio: bio to trim * @offset: number of sectors to trim from the front of @bio * @size: size we want to trim @bio to, in sectors + * + * This function is typically used for bios that are cloned and submitted + * to the underlying device in parts. */ -void bio_trim(struct bio *bio, int offset, int size) +void bio_trim(struct bio *bio, sector_t offset, sector_t size) { - /* 'bio' is a cloned bio which we need to trim to match - * the given offset and size. - */ + if (WARN_ON_ONCE(offset > BIO_MAX_SECTORS || size > BIO_MAX_SECTORS || + offset + size > bio->bi_iter.bi_size)) + return; size <<= 9; if (offset == 0 && size == bio->bi_iter.bi_size) @@ -1479,7 +1482,6 @@ void bio_trim(struct bio *bio, int offset, int size) if (bio_integrity(bio)) bio_integrity_trim(bio); - } EXPORT_SYMBOL_GPL(bio_trim); |