diff mbox series

[v2,1/3] block: fix arg type of bio_trim()

Message ID 6bd02746905e41dfee04f2500d6d15f9b9b73fc9.1626848677.git.naohiro.aota@wdc.com (mailing list archive)
State New, archived
Headers show
Series fix argument type of bio_trim() | expand

Commit Message

Naohiro Aota July 21, 2021, 6:26 a.m. UTC
From: Chaitanya Kulkarni <chaitanya.kulkarni@wdc.com>

The function bio_trim has offset and size arguments that are declared
as int.

The callers of this function uses 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() to catch their overflow.

Signed-off-by: Chaitanya Kulkarni <chaitanya.kulkarni@wdc.com>
Signed-off-by: Naohiro Aota <naohiro.aota@wdc.com>
---
 block/bio.c         | 14 +++++++++++---
 include/linux/bio.h |  2 +-
 2 files changed, 12 insertions(+), 4 deletions(-)

Comments

Christoph Hellwig July 21, 2021, 6:36 a.m. UTC | #1
On Wed, Jul 21, 2021 at 03:26:58PM +0900, Naohiro Aota wrote:
> +void bio_trim(struct bio *bio, sector_t offset, sector_t size)
>  {
> +	const sector_t uint_max_sectors = UINT_MAX >> SECTOR_SHIFT;

I'd make this a #define and keep it close to the struct bio definition
named something like BIO_MAX_SECTORS

> +
> +	/*
> +	 * 'bio' is a cloned bio which we need to trim to match the given
> +	 * offset and size.
>  	 */

This should go into the kernel doc comment.

Something like:

/**
 * bio_trim - trim a bio to the given offset and size
 * @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.
 */


> +	/* sanity check */
> +	if (WARN_ON(offset > uint_max_sectors || size > uint_max_sectors ||
> +		    offset + size > bio->bi_iter.bi_size))
> +		return;

No real need for the comment. WARN_ON pretty much implies a sanity
check.  I'd make this a WARN_ON_ONCE as otherwise you'll probably
drown in these warnings if they ever hit.

> -extern void bio_trim(struct bio *bio, int offset, int size);
> +extern void bio_trim(struct bio *bio, sector_t offset, sector_t size);

Please drop the extern while you're at it.
Naohiro Aota July 21, 2021, 11:47 a.m. UTC | #2
-Chaitanya, as the address is unavailable.

On Wed, Jul 21, 2021 at 07:36:05AM +0100, Christoph Hellwig wrote:
> On Wed, Jul 21, 2021 at 03:26:58PM +0900, Naohiro Aota wrote:
> > +void bio_trim(struct bio *bio, sector_t offset, sector_t size)
> >  {
> > +	const sector_t uint_max_sectors = UINT_MAX >> SECTOR_SHIFT;
> 
> I'd make this a #define and keep it close to the struct bio definition
> named something like BIO_MAX_SECTORS

Sure. I'll do so.

> > +
> > +	/*
> > +	 * 'bio' is a cloned bio which we need to trim to match the given
> > +	 * offset and size.
> >  	 */
> 
> This should go into the kernel doc comment.
> 
> Something like:
> 
> /**
>  * bio_trim - trim a bio to the given offset and size
>  * @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.
>  */

Thanks. I'll use this.
 
> > +	/* sanity check */
> > +	if (WARN_ON(offset > uint_max_sectors || size > uint_max_sectors ||
> > +		    offset + size > bio->bi_iter.bi_size))
> > +		return;
> 
> No real need for the comment. WARN_ON pretty much implies a sanity
> check.  I'd make this a WARN_ON_ONCE as otherwise you'll probably
> drown in these warnings if they ever hit.

Done.

> > -extern void bio_trim(struct bio *bio, int offset, int size);
> > +extern void bio_trim(struct bio *bio, sector_t offset, sector_t size);
> 
> Please drop the extern while you're at it.

Ah, I didn't know that. I'll keep it in mind.
diff mbox series

Patch

diff --git a/block/bio.c b/block/bio.c
index 44205dfb6b60..69a9751b18e7 100644
--- a/block/bio.c
+++ b/block/bio.c
@@ -1465,12 +1465,20 @@  EXPORT_SYMBOL(bio_split);
  * @offset:	number of sectors to trim from the front of @bio
  * @size:	size we want to trim @bio to, in sectors
  */
-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.
+	const sector_t uint_max_sectors = UINT_MAX >> SECTOR_SHIFT;
+
+	/*
+	 * 'bio' is a cloned bio which we need to trim to match the given
+	 * offset and size.
 	 */
 
+	/* sanity check */
+	if (WARN_ON(offset > uint_max_sectors || size > uint_max_sectors ||
+		    offset + size > bio->bi_iter.bi_size))
+		return;
+
 	size <<= 9;
 	if (offset == 0 && size == bio->bi_iter.bi_size)
 		return;
diff --git a/include/linux/bio.h b/include/linux/bio.h
index a0b4cfdf62a4..c91bc70add06 100644
--- a/include/linux/bio.h
+++ b/include/linux/bio.h
@@ -379,7 +379,7 @@  static inline void bip_set_seed(struct bio_integrity_payload *bip,
 
 #endif /* CONFIG_BLK_DEV_INTEGRITY */
 
-extern void bio_trim(struct bio *bio, int offset, int size);
+extern void bio_trim(struct bio *bio, sector_t offset, sector_t size);
 extern struct bio *bio_split(struct bio *bio, int sectors,
 			     gfp_t gfp, struct bio_set *bs);