diff mbox series

[1/2] scsi: scsi_debug: adjust num_parts to create equally sized partitions

Message ID 20200827213327.25537-2-jpittman@redhat.com (mailing list archive)
State Accepted
Headers show
Series scsi_debug: improve num_parts usage | expand

Commit Message

John Pittman Aug. 27, 2020, 9:33 p.m. UTC
Currently when using the num_parts parameter, partitions are aligned
and the end sector is one prior to the next start.  This creates
different sized partitions. Create instead equally sized partitions by
trimming the end of each partition to the size of the smallest
partition.  This aligns better with what one would expect from
automatically created partitions and can be helpful with testing
things such as raid which often expect legs of the same size.
Minimal space is lost as the initial partition starting size is
calculated by dividing num_sectors by sdebug_num_parts.

Signed-off-by: John Pittman <jpittman@redhat.com>
---
 drivers/scsi/scsi_debug.c | 11 +++++++----
 1 file changed, 7 insertions(+), 4 deletions(-)

Comments

Douglas Gilbert Sept. 1, 2020, 12:51 a.m. UTC | #1
On 2020-08-27 5:33 p.m., John Pittman wrote:
> Currently when using the num_parts parameter, partitions are aligned
> and the end sector is one prior to the next start.  This creates
> different sized partitions. Create instead equally sized partitions by
> trimming the end of each partition to the size of the smallest
> partition.  This aligns better with what one would expect from
> automatically created partitions and can be helpful with testing
> things such as raid which often expect legs of the same size.
> Minimal space is lost as the initial partition starting size is
> calculated by dividing num_sectors by sdebug_num_parts.
> 
> Signed-off-by: John Pittman <jpittman@redhat.com>
> ---
>   drivers/scsi/scsi_debug.c | 11 +++++++----
>   1 file changed, 7 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/scsi/scsi_debug.c b/drivers/scsi/scsi_debug.c
> index 139f0073da37..3d9db1e8b781 100644
> --- a/drivers/scsi/scsi_debug.c
> +++ b/drivers/scsi/scsi_debug.c
> @@ -5259,7 +5259,7 @@ static int scsi_debug_host_reset(struct scsi_cmnd *SCpnt)
>   static void sdebug_build_parts(unsigned char *ramp, unsigned long store_size)
>   {
>   	struct msdos_partition *pp;
> -	int starts[SDEBUG_MAX_PARTS + 2];
> +	int starts[SDEBUG_MAX_PARTS + 2], max_part_secs;
>   	int sectors_per_part, num_sectors, k;
>   	int heads_by_sects, start_sec, end_sec;
>   
> @@ -5271,13 +5271,16 @@ static void sdebug_build_parts(unsigned char *ramp, unsigned long store_size)
>   		pr_warn("reducing partitions to %d\n", SDEBUG_MAX_PARTS);
>   	}
>   	num_sectors = (int)sdebug_store_sectors;
> -	sectors_per_part = (num_sectors - sdebug_sectors_per)
> +	max_part_secs = sectors_per_part = (num_sectors - sdebug_sectors_per)
>   			   / sdebug_num_parts;
>   	heads_by_sects = sdebug_heads * sdebug_sectors_per;
>   	starts[0] = sdebug_sectors_per;
> -	for (k = 1; k < sdebug_num_parts; ++k)
> +	for (k = 1; k < sdebug_num_parts; ++k) {
>   		starts[k] = ((k * sectors_per_part) / heads_by_sects)
>   			    * heads_by_sects;
> +		if (starts[k] - starts[k - 1] < max_part_secs)
> +			max_part_secs = starts[k] - starts[k - 1];
> +	}
>   	starts[sdebug_num_parts] = num_sectors;
>   	starts[sdebug_num_parts + 1] = 0;
>   
> @@ -5286,7 +5289,7 @@ static void sdebug_build_parts(unsigned char *ramp, unsigned long store_size)
>   	pp = (struct msdos_partition *)(ramp + 0x1be);
>   	for (k = 0; starts[k + 1]; ++k, ++pp) {
>   		start_sec = starts[k];
> -		end_sec = starts[k + 1] - 1;
> +		end_sec = starts[k] + max_part_secs - 1;
>   		pp->boot_ind = 0;
>   
>   		pp->cyl = start_sec / heads_by_sects;
> 

Apart from the multiple assignments on one line (ref: lk coding style) the
patch looks fine to me.

Acked-by: Douglas Gilbert <dgilbert@interlog.com>
diff mbox series

Patch

diff --git a/drivers/scsi/scsi_debug.c b/drivers/scsi/scsi_debug.c
index 139f0073da37..3d9db1e8b781 100644
--- a/drivers/scsi/scsi_debug.c
+++ b/drivers/scsi/scsi_debug.c
@@ -5259,7 +5259,7 @@  static int scsi_debug_host_reset(struct scsi_cmnd *SCpnt)
 static void sdebug_build_parts(unsigned char *ramp, unsigned long store_size)
 {
 	struct msdos_partition *pp;
-	int starts[SDEBUG_MAX_PARTS + 2];
+	int starts[SDEBUG_MAX_PARTS + 2], max_part_secs;
 	int sectors_per_part, num_sectors, k;
 	int heads_by_sects, start_sec, end_sec;
 
@@ -5271,13 +5271,16 @@  static void sdebug_build_parts(unsigned char *ramp, unsigned long store_size)
 		pr_warn("reducing partitions to %d\n", SDEBUG_MAX_PARTS);
 	}
 	num_sectors = (int)sdebug_store_sectors;
-	sectors_per_part = (num_sectors - sdebug_sectors_per)
+	max_part_secs = sectors_per_part = (num_sectors - sdebug_sectors_per)
 			   / sdebug_num_parts;
 	heads_by_sects = sdebug_heads * sdebug_sectors_per;
 	starts[0] = sdebug_sectors_per;
-	for (k = 1; k < sdebug_num_parts; ++k)
+	for (k = 1; k < sdebug_num_parts; ++k) {
 		starts[k] = ((k * sectors_per_part) / heads_by_sects)
 			    * heads_by_sects;
+		if (starts[k] - starts[k - 1] < max_part_secs)
+			max_part_secs = starts[k] - starts[k - 1];
+	}
 	starts[sdebug_num_parts] = num_sectors;
 	starts[sdebug_num_parts + 1] = 0;
 
@@ -5286,7 +5289,7 @@  static void sdebug_build_parts(unsigned char *ramp, unsigned long store_size)
 	pp = (struct msdos_partition *)(ramp + 0x1be);
 	for (k = 0; starts[k + 1]; ++k, ++pp) {
 		start_sec = starts[k];
-		end_sec = starts[k + 1] - 1;
+		end_sec = starts[k] + max_part_secs - 1;
 		pp->boot_ind = 0;
 
 		pp->cyl = start_sec / heads_by_sects;