diff mbox

fix extended partition mapping

Message ID 1357441050-21997-1-git-send-email-psusi@ubuntu.com (mailing list archive)
State Deferred, archived
Headers show

Commit Message

Phillip Susi Jan. 6, 2013, 2:57 a.m. UTC
The linux kernel maps the extended partition only
so that LILO can be installed there.  The length is always set
to two sectors to allow this, and most tools know to ignore the
device.  kpartx was mapping the entire extended partition, then
stacking the logical partitions on top of it.  This presented
a device that looked like an entirely separate disk that
contains only the logical partitions.  This patch fixes kpartx
to conform with the normal Linux behavior.
---
 kpartx/dos.c    |    2 ++
 kpartx/kpartx.c |    9 +++------
 2 files changed, 5 insertions(+), 6 deletions(-)

Comments

Christophe Varoqui Jan. 6, 2013, 10:19 a.m. UTC | #1
On sam., 2013-01-05 at 21:57 -0500, Phillip Susi wrote:
> The linux kernel maps the extended partition only
> so that LILO can be installed there.  The length is always set
> to two sectors to allow this, and most tools know to ignore the
> device.  kpartx was mapping the entire extended partition, then
> stacking the logical partitions on top of it.  This presented
> a device that looked like an entirely separate disk that
> contains only the logical partitions.  This patch fixes kpartx
> to conform with the normal Linux behavior.

Applied.
Thanks.

> ---
>  kpartx/dos.c    |    2 ++
>  kpartx/kpartx.c |    9 +++------
>  2 files changed, 5 insertions(+), 6 deletions(-)
> 
> diff --git a/kpartx/dos.c b/kpartx/dos.c
> index 1691105..a1a9961 100644
> --- a/kpartx/dos.c
> +++ b/kpartx/dos.c
> @@ -98,6 +98,8 @@ read_dos_pt(int fd, struct slice all, struct slice *sp, int ns) {
>  			break;
>  		}
>  		if (is_extended(p.sys_type)) {
> +			sp[i].size = 2; /* extended partitions only get two
> +					   sectors mapped for LILO to install */
>  			n += read_extended_partition(fd, &p, i, sp+n, ns-n);
>  		}
>  	}
> diff --git a/kpartx/kpartx.c b/kpartx/kpartx.c
> index b5e0a32..f359afe 100644
> --- a/kpartx/kpartx.c
> +++ b/kpartx/kpartx.c
> @@ -515,7 +515,6 @@ main(int argc, char **argv){
>  			d = c;
>  			while (c) {
>  				for (j = 0; j < n; j++) {
> -					uint64_t start;
>  					int k = slices[j].container - 1;
>  
>  					if (slices[j].size == 0)
> @@ -541,11 +540,9 @@ main(int argc, char **argv){
>  					}
>  					strip_slash(partname);
>  
> -					start = slices[j].start - slices[k].start;
> -					if (safe_sprintf(params, "%d:%d %" PRIu64,
> -							 slices[k].major,
> -							 slices[k].minor,
> -							 start)) {
> +					if (safe_sprintf(params, "%s %" PRIu64,
> +							 device,
> +							 slices[j].start)) {
>  						fprintf(stderr, "params too small\n");
>  						exit(1);
>  					}



--
dm-devel mailing list
dm-devel@redhat.com
https://www.redhat.com/mailman/listinfo/dm-devel
diff mbox

Patch

diff --git a/kpartx/dos.c b/kpartx/dos.c
index 1691105..a1a9961 100644
--- a/kpartx/dos.c
+++ b/kpartx/dos.c
@@ -98,6 +98,8 @@  read_dos_pt(int fd, struct slice all, struct slice *sp, int ns) {
 			break;
 		}
 		if (is_extended(p.sys_type)) {
+			sp[i].size = 2; /* extended partitions only get two
+					   sectors mapped for LILO to install */
 			n += read_extended_partition(fd, &p, i, sp+n, ns-n);
 		}
 	}
diff --git a/kpartx/kpartx.c b/kpartx/kpartx.c
index b5e0a32..f359afe 100644
--- a/kpartx/kpartx.c
+++ b/kpartx/kpartx.c
@@ -515,7 +515,6 @@  main(int argc, char **argv){
 			d = c;
 			while (c) {
 				for (j = 0; j < n; j++) {
-					uint64_t start;
 					int k = slices[j].container - 1;
 
 					if (slices[j].size == 0)
@@ -541,11 +540,9 @@  main(int argc, char **argv){
 					}
 					strip_slash(partname);
 
-					start = slices[j].start - slices[k].start;
-					if (safe_sprintf(params, "%d:%d %" PRIu64,
-							 slices[k].major,
-							 slices[k].minor,
-							 start)) {
+					if (safe_sprintf(params, "%s %" PRIu64,
+							 device,
+							 slices[j].start)) {
 						fprintf(stderr, "params too small\n");
 						exit(1);
 					}