linux-scsi.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v7 0/2] scsi: sd: Fix build warning in sd_revalidate_disk()
@ 2025-08-16 20:53 Abinash Singh
  2025-08-16 20:53 ` [PATCH v7 1/2] " Abinash Singh
  2025-08-16 20:53 ` [PATCH v7 2/2] scsi: sd: make sd_revalidate_disk() return void Abinash Singh
  0 siblings, 2 replies; 5+ messages in thread
From: Abinash Singh @ 2025-08-16 20:53 UTC (permalink / raw)
  To: James E . J . Bottomley, Martin K . Petersen
  Cc: linux-scsi, linux-kernel, Abinash Singh

Hi all,

This v7 series follows up on v6 of the 
"scsi: sd: Fix build warning in sd_revalidate_disk()" patches.

On Mon, 11 Aug 2025 09:39 Damien Le Moal wrote:
> The order of the patches must be reversed because the fix build warning patch
> must be CC-ed to stable with a Fixes tag. The cleanup making
> sd_revalidate_disk() a void function must come after the fix. That will avoid
> the weird placeholder comment and also will allow a more extensive cleanup to
> replace several "goto out" with a simple return.

Damien Le Moal pointed out that the order of the patches should be reversed:
The build warning fix must come first, since it requires a Fixes tag 
and should be CC-ed to stable.

The cleanup making sd_revalidate_disk() return void should follow afterwards,
which also allows for a cleaner refactor without placeholder comments and prepares 
for further simplifications.

Changes in v7:

Reversed patch order:

Fix build warning in sd_revalidate_disk() (with Fixes and Cc: stable)
Refactor sd_revalidate_disk() to return void

I have built and tested this series locally with both gcc and clang; 
no build errors or warnings remain.

Many thanks to Damien for the review and guidance.

Abinash Singh (2):
  scsi: sd: Fix build warning in sd_revalidate_disk()
  scsi: sd: make sd_revalidate_disk() return void

 drivers/scsi/sd.c | 58 +++++++++++++++++++++++++++--------------------
 1 file changed, 33 insertions(+), 25 deletions(-)

-- 
2.43.0


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH v7 1/2] scsi: sd: Fix build warning in sd_revalidate_disk()
  2025-08-16 20:53 [PATCH v7 0/2] scsi: sd: Fix build warning in sd_revalidate_disk() Abinash Singh
@ 2025-08-16 20:53 ` Abinash Singh
  2025-08-19 19:26   ` Bart Van Assche
  2025-08-16 20:53 ` [PATCH v7 2/2] scsi: sd: make sd_revalidate_disk() return void Abinash Singh
  1 sibling, 1 reply; 5+ messages in thread
From: Abinash Singh @ 2025-08-16 20:53 UTC (permalink / raw)
  To: James E . J . Bottomley, Martin K . Petersen
  Cc: linux-scsi, linux-kernel, Abinash Singh

A build warning was triggered due to excessive stack usage in
sd_revalidate_disk():

drivers/scsi/sd.c: In function ‘sd_revalidate_disk.isra’:
drivers/scsi/sd.c:3824:1: warning: the frame size of 1160 bytes is larger than 1024 bytes [-Wframe-larger-than=]

This is caused by a large local struct queue_limits (~400B) allocated
on the stack. Replacing it with a heap allocation using kmalloc()
significantly reduces frame usage. Kernel stack is limited (~8 KB),
and allocating large structs on the stack is discouraged.
As the function already performs heap allocations (e.g. for buffer),
this change fits well.

Signed-off-by: Abinash Singh <abinashsinghlalotra@gmail.com>
---
 drivers/scsi/sd.c | 53 +++++++++++++++++++++++++++--------------------
 1 file changed, 31 insertions(+), 22 deletions(-)

diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c
index 5b8668accf8e..c3791746806d 100644
--- a/drivers/scsi/sd.c
+++ b/drivers/scsi/sd.c
@@ -3696,10 +3696,10 @@ static int sd_revalidate_disk(struct gendisk *disk)
 	struct scsi_disk *sdkp = scsi_disk(disk);
 	struct scsi_device *sdp = sdkp->device;
 	sector_t old_capacity = sdkp->capacity;
-	struct queue_limits lim;
-	unsigned char *buffer;
+	struct queue_limits *lim = NULL;
+	unsigned char *buffer = NULL;
 	unsigned int dev_max;
-	int err;
+	int err = 0;
 
 	SCSI_LOG_HLQUEUE(3, sd_printk(KERN_INFO, sdkp,
 				      "sd_revalidate_disk\n"));
@@ -3711,6 +3711,13 @@ static int sd_revalidate_disk(struct gendisk *disk)
 	if (!scsi_device_online(sdp))
 		goto out;
 
+	lim = kmalloc(sizeof(*lim), GFP_KERNEL);
+	if (!lim) {
+		sd_printk(KERN_WARNING, sdkp,
+			"sd_revalidate_disk: Disk limit allocation failure.\n");
+		goto out;
+	}
+
 	buffer = kmalloc(SD_BUF_SIZE, GFP_KERNEL);
 	if (!buffer) {
 		sd_printk(KERN_WARNING, sdkp, "sd_revalidate_disk: Memory "
@@ -3720,14 +3727,14 @@ static int sd_revalidate_disk(struct gendisk *disk)
 
 	sd_spinup_disk(sdkp);
 
-	lim = queue_limits_start_update(sdkp->disk->queue);
+	*lim = queue_limits_start_update(sdkp->disk->queue);
 
 	/*
 	 * Without media there is no reason to ask; moreover, some devices
 	 * react badly if we do.
 	 */
 	if (sdkp->media_present) {
-		sd_read_capacity(sdkp, &lim, buffer);
+		sd_read_capacity(sdkp, lim, buffer);
 		/*
 		 * Some USB/UAS devices return generic values for mode pages
 		 * until the media has been accessed. Trigger a READ operation
@@ -3741,17 +3748,17 @@ static int sd_revalidate_disk(struct gendisk *disk)
 		 * cause this to be updated correctly and any device which
 		 * doesn't support it should be treated as rotational.
 		 */
-		lim.features |= (BLK_FEAT_ROTATIONAL | BLK_FEAT_ADD_RANDOM);
+		lim->features |= (BLK_FEAT_ROTATIONAL | BLK_FEAT_ADD_RANDOM);
 
 		if (scsi_device_supports_vpd(sdp)) {
 			sd_read_block_provisioning(sdkp);
-			sd_read_block_limits(sdkp, &lim);
+			sd_read_block_limits(sdkp, lim);
 			sd_read_block_limits_ext(sdkp);
-			sd_read_block_characteristics(sdkp, &lim);
-			sd_zbc_read_zones(sdkp, &lim, buffer);
+			sd_read_block_characteristics(sdkp, lim);
+			sd_zbc_read_zones(sdkp, lim, buffer);
 		}
 
-		sd_config_discard(sdkp, &lim, sd_discard_mode(sdkp));
+		sd_config_discard(sdkp, lim, sd_discard_mode(sdkp));
 
 		sd_print_capacity(sdkp, old_capacity);
 
@@ -3761,47 +3768,46 @@ static int sd_revalidate_disk(struct gendisk *disk)
 		sd_read_app_tag_own(sdkp, buffer);
 		sd_read_write_same(sdkp, buffer);
 		sd_read_security(sdkp, buffer);
-		sd_config_protection(sdkp, &lim);
+		sd_config_protection(sdkp, lim);
 	}
 
 	/*
 	 * We now have all cache related info, determine how we deal
 	 * with flush requests.
 	 */
-	sd_set_flush_flag(sdkp, &lim);
+	sd_set_flush_flag(sdkp, lim);
 
 	/* Initial block count limit based on CDB TRANSFER LENGTH field size. */
 	dev_max = sdp->use_16_for_rw ? SD_MAX_XFER_BLOCKS : SD_DEF_XFER_BLOCKS;
 
 	/* Some devices report a maximum block count for READ/WRITE requests. */
 	dev_max = min_not_zero(dev_max, sdkp->max_xfer_blocks);
-	lim.max_dev_sectors = logical_to_sectors(sdp, dev_max);
+	lim->max_dev_sectors = logical_to_sectors(sdp, dev_max);
 
 	if (sd_validate_min_xfer_size(sdkp))
-		lim.io_min = logical_to_bytes(sdp, sdkp->min_xfer_blocks);
+		lim->io_min = logical_to_bytes(sdp, sdkp->min_xfer_blocks);
 	else
-		lim.io_min = 0;
+		lim->io_min = 0;
 
 	/*
 	 * Limit default to SCSI host optimal sector limit if set. There may be
 	 * an impact on performance for when the size of a request exceeds this
 	 * host limit.
 	 */
-	lim.io_opt = sdp->host->opt_sectors << SECTOR_SHIFT;
+	lim->io_opt = sdp->host->opt_sectors << SECTOR_SHIFT;
 	if (sd_validate_opt_xfer_size(sdkp, dev_max)) {
-		lim.io_opt = min_not_zero(lim.io_opt,
+		lim->io_opt = min_not_zero(lim->io_opt,
 				logical_to_bytes(sdp, sdkp->opt_xfer_blocks));
 	}
 
 	sdkp->first_scan = 0;
 
 	set_capacity_and_notify(disk, logical_to_sectors(sdp, sdkp->capacity));
-	sd_config_write_same(sdkp, &lim);
-	kfree(buffer);
+	sd_config_write_same(sdkp, lim);
 
-	err = queue_limits_commit_update_frozen(sdkp->disk->queue, &lim);
+	err = queue_limits_commit_update_frozen(sdkp->disk->queue, lim);
 	if (err)
-		return err;
+		goto out;
 
 	/*
 	 * Query concurrent positioning ranges after
@@ -3820,7 +3826,10 @@ static int sd_revalidate_disk(struct gendisk *disk)
 		set_capacity_and_notify(disk, 0);
 
  out:
-	return 0;
+	kfree(lim);
+	kfree(buffer);
+
+	return err;
 }
 
 /**
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH v7 2/2] scsi: sd: make sd_revalidate_disk() return void
  2025-08-16 20:53 [PATCH v7 0/2] scsi: sd: Fix build warning in sd_revalidate_disk() Abinash Singh
  2025-08-16 20:53 ` [PATCH v7 1/2] " Abinash Singh
@ 2025-08-16 20:53 ` Abinash Singh
  2025-08-19 19:24   ` Bart Van Assche
  1 sibling, 1 reply; 5+ messages in thread
From: Abinash Singh @ 2025-08-16 20:53 UTC (permalink / raw)
  To: James E . J . Bottomley, Martin K . Petersen
  Cc: linux-scsi, linux-kernel, Abinash Singh

The sd_revalidate_disk() function currently returns 0 for
both success and memory allocation failure.Since none of its
callers use the return value, this return code is both unnecessary
and potentially misleading.

Change the return type of sd_revalidate_disk() from int to void
and remove all return value handling. This makes the function
semantics clearer and avoids confusion about unused return codes.

Signed-off-by: Abinash Singh <abinashsinghlalotra@gmail.com>
---
 drivers/scsi/sd.c | 9 ++++-----
 1 file changed, 4 insertions(+), 5 deletions(-)

diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c
index c3791746806d..ba3bfd9b00aa 100644
--- a/drivers/scsi/sd.c
+++ b/drivers/scsi/sd.c
@@ -106,7 +106,7 @@ static void sd_config_discard(struct scsi_disk *sdkp, struct queue_limits *lim,
 		unsigned int mode);
 static void sd_config_write_same(struct scsi_disk *sdkp,
 		struct queue_limits *lim);
-static int  sd_revalidate_disk(struct gendisk *);
+static void  sd_revalidate_disk(struct gendisk *);
 static void sd_unlock_native_capacity(struct gendisk *disk);
 static void sd_shutdown(struct device *);
 static void scsi_disk_release(struct device *cdev);
@@ -3691,7 +3691,7 @@ static void sd_read_block_zero(struct scsi_disk *sdkp)
  *	performs disk spin up, read_capacity, etc.
  *	@disk: struct gendisk we care about
  **/
-static int sd_revalidate_disk(struct gendisk *disk)
+static void sd_revalidate_disk(struct gendisk *disk)
 {
 	struct scsi_disk *sdkp = scsi_disk(disk);
 	struct scsi_device *sdp = sdkp->device;
@@ -3709,13 +3709,13 @@ static int sd_revalidate_disk(struct gendisk *disk)
 	 * of the other niceties.
 	 */
 	if (!scsi_device_online(sdp))
-		goto out;
+		return;
 
 	lim = kmalloc(sizeof(*lim), GFP_KERNEL);
 	if (!lim) {
 		sd_printk(KERN_WARNING, sdkp,
 			"sd_revalidate_disk: Disk limit allocation failure.\n");
-		goto out;
+		return;
 	}
 
 	buffer = kmalloc(SD_BUF_SIZE, GFP_KERNEL);
@@ -3829,7 +3829,6 @@ static int sd_revalidate_disk(struct gendisk *disk)
 	kfree(lim);
 	kfree(buffer);
 
-	return err;
 }
 
 /**
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH v7 2/2] scsi: sd: make sd_revalidate_disk() return void
  2025-08-16 20:53 ` [PATCH v7 2/2] scsi: sd: make sd_revalidate_disk() return void Abinash Singh
@ 2025-08-19 19:24   ` Bart Van Assche
  0 siblings, 0 replies; 5+ messages in thread
From: Bart Van Assche @ 2025-08-19 19:24 UTC (permalink / raw)
  To: Abinash Singh, James E . J . Bottomley, Martin K . Petersen
  Cc: linux-scsi, linux-kernel

On 8/16/25 1:53 PM, Abinash Singh wrote:
> diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c
> index c3791746806d..ba3bfd9b00aa 100644
> --- a/drivers/scsi/sd.c
> +++ b/drivers/scsi/sd.c
> @@ -106,7 +106,7 @@ static void sd_config_discard(struct scsi_disk *sdkp, struct queue_limits *lim,
>   		unsigned int mode);
>   static void sd_config_write_same(struct scsi_disk *sdkp,
>   		struct queue_limits *lim);
> -static int  sd_revalidate_disk(struct gendisk *);
> +static void  sd_revalidate_disk(struct gendisk *);
>   static void sd_unlock_native_capacity(struct gendisk *disk);
>   static void sd_shutdown(struct device *);
>   static void scsi_disk_release(struct device *cdev);
> @@ -3691,7 +3691,7 @@ static void sd_read_block_zero(struct scsi_disk *sdkp)
>    *	performs disk spin up, read_capacity, etc.
>    *	@disk: struct gendisk we care about
>    **/
> -static int sd_revalidate_disk(struct gendisk *disk)
> +static void sd_revalidate_disk(struct gendisk *disk)
>   {
>   	struct scsi_disk *sdkp = scsi_disk(disk);
>   	struct scsi_device *sdp = sdkp->device;
> @@ -3709,13 +3709,13 @@ static int sd_revalidate_disk(struct gendisk *disk)
>   	 * of the other niceties.
>   	 */
>   	if (!scsi_device_online(sdp))
> -		goto out;
> +		return;
>   
>   	lim = kmalloc(sizeof(*lim), GFP_KERNEL);
>   	if (!lim) {
>   		sd_printk(KERN_WARNING, sdkp,
>   			"sd_revalidate_disk: Disk limit allocation failure.\n");
> -		goto out;
> +		return;
>   	}
>   
>   	buffer = kmalloc(SD_BUF_SIZE, GFP_KERNEL);
> @@ -3829,7 +3829,6 @@ static int sd_revalidate_disk(struct gendisk *disk)
>   	kfree(lim);
>   	kfree(buffer);
>   
> -	return err;
>   }

Shouldn't this patch remove the initializer from the 'err' variable?
Otherwise this patch looks good to me.

Bart.

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH v7 1/2] scsi: sd: Fix build warning in sd_revalidate_disk()
  2025-08-16 20:53 ` [PATCH v7 1/2] " Abinash Singh
@ 2025-08-19 19:26   ` Bart Van Assche
  0 siblings, 0 replies; 5+ messages in thread
From: Bart Van Assche @ 2025-08-19 19:26 UTC (permalink / raw)
  To: Abinash Singh, James E . J . Bottomley, Martin K . Petersen
  Cc: linux-scsi, linux-kernel

On 8/16/25 1:53 PM, Abinash Singh wrote:
> +	kfree(lim);
> +	kfree(buffer);

The traditional order for kfree() statements is the opposite order of
the corresponding kmalloc() calls. With or without this change:

Reviewed-by: Bart Van Assche <bvanassche@acm.org>

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2025-08-19 19:26 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-08-16 20:53 [PATCH v7 0/2] scsi: sd: Fix build warning in sd_revalidate_disk() Abinash Singh
2025-08-16 20:53 ` [PATCH v7 1/2] " Abinash Singh
2025-08-19 19:26   ` Bart Van Assche
2025-08-16 20:53 ` [PATCH v7 2/2] scsi: sd: make sd_revalidate_disk() return void Abinash Singh
2025-08-19 19:24   ` Bart Van Assche

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).