kpartx: Handle extended partitions correctly
PATCH 1/1 kpartx: Handle extended partitions correctly
Hi Christophe,
there is actually a small bug in kpartx; it calculates the size for an extended partition relative to the entire disk, not the contained partition. This patch fixes this.
Cheers,
Hannes
Signature · 4 lines
Dr. Hannes Reinecke zSeries & Storage [email protected] +49 911 74053 688 SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg GF: Markus Rex, HRB 16746 (AG Nürnberg)
kpartx: Handle extended partitions correctly
When creating the device-mapper table for an extended partition we should calculate the size relative to the containing partition, not to the entire device.
Signed-off-by Hannes Reinecke <[email protected]>
kpartx/kpartx.c +14 -9
@@ -265,7 +265,7 @@ main(int argc, char **argv){ }if (dm_prereq (DM_TARGET ,0 ,0 ,0 ) && (what ==ADD || what ==DELETE )) { -fprintf (stderr,"device mapper prerequisites not met\n" ); +fprintf (stderr,"device mapper prerequisites not met\n" );exit (1 ); }
@@ -387,10 +387,10 @@ main(int argc, char **argv){ slices[j].minor = m++; start = slices[j].start - slices[k].start; -printf ("%s%s%d : 0 %lu /dev/dm-%d %lu\n" , +printf ("%s%s%d : 0 %lu %s%s%d %lu\n" , mapname, delim, j+1 , (unsigned long ) slices[j].size, - slices[k].minor, start); + mapname, delim, k, start); c--; }/* Terminate loop if nothing more to resolve */
@@ -431,7 +431,7 @@ main(int argc, char **argv){break ;case ADD : -for (j=0 , c =0 ; j<n; j++) { +for (j =0 , c =0 ; j < n; j++) {if (slices[j].size ==0 )continue ;
@@ -477,6 +477,7 @@ main(int argc, char **argv){ d = c;while (c) {for (j =0 ; j < n; j++) { +unsigned long start;int k = slices[j].container -1 ;if (slices[j].size ==0 )
@@ -487,7 +488,7 @@ main(int argc, char **argv){continue ;/* Skip all simple slices */ -if (k <0 ) +if (slices[j].container ==0 )continue ;/* Check container slice */
@@ -502,10 +503,11 @@ main(int argc, char **argv){ }strip_slash (partname); + start = slices[j].start - slices[k].start;if (safe_sprintf (params,"%d:%d %lu" , slices[k].major, slices[k].minor, - (unsigned long )slices[j].start)) { + start)) {fprintf (stderr,"params too small\n" );exit (1 ); }
@@ -524,9 +526,12 @@ main(int argc, char **argv){ &slices[j].minor);if (verbose) -printf ("add map %s : 0 %lu %s %s\n" , - partname, slices[j].size, -DM_TARGET , params); +printf ("add map %s (%d:%d): 0 %lu %s\n" , + partname, + slices[j].major, + slices[j].minor, + slices[j].size, + params); c--; }/* Terminate loop */