Blame SOURCES/parted-3.1-libparted-mklabel-eav.patch

9cc286
Subject: [PATCH] libparted: mklabel to support EAV DASD
9cc286
9cc286
From: Nageswara R Sastry <rnsastry@linux.vnet.ibm.com>
9cc286
9cc286
Extended Address Volume (EAV) DASDs are ECKD DASDs with more than
9cc286
65520 cylinders. This patch adds support for mklabel to properly
9cc286
handle unformatted EAV DASDs.
9cc286
9cc286
Signed-off-by: Nageswara R Sastry <rnsastry@linux.vnet.ibm.com>
9cc286
---
9cc286
 include/parted/fdasd.h |    1 
9cc286
 libparted/labels/fdasd.c  |   92 +++++++++++++++++++++++++++++++++++++++++++++-
9cc286
 2 files changed, 90 insertions(+), 3 deletions(-)
9cc286
9cc286
--- a/include/parted/fdasd.h
9cc286
+++ b/include/parted/fdasd.h
9cc286
@@ -288,7 +288,6 @@ void fdasd_get_geometry (const PedDevice
9cc286
 void fdasd_check_api_version (fdasd_anchor_t *anc, int fd);
9cc286
 int fdasd_check_volume (fdasd_anchor_t *anc, int fd);
9cc286
 int fdasd_write_labels (fdasd_anchor_t *anc, int fd);
9cc286
-int fdasd_invalid_vtoc_pointer(fdasd_anchor_t *anc);
9cc286
 void fdasd_recreate_vtoc(fdasd_anchor_t *anc);
9cc286
 partition_info_t * fdasd_add_partition (fdasd_anchor_t *anc,
9cc286
                                         unsigned int start, unsigned int stop);
9cc286
--- a/libparted/labels/fdasd.c
9cc286
+++ b/libparted/labels/fdasd.c
9cc286
@@ -581,6 +581,22 @@ fdasd_recreate_vtoc (fdasd_anchor_t *anc
9cc286
 	anc->vtoc_changed++;
9cc286
 }
9cc286
 
9cc286
+ /*
9cc286
+ * initialize the VOL1 volume label
9cc286
+ */
9cc286
+static void
9cc286
+fdasd_init_volume_label(fdasd_anchor_t *anc, int fd)
9cc286
+{
9cc286
+	volume_label_t *vlabel = anc->vlabel;
9cc286
+
9cc286
+	vtoc_volume_label_init(vlabel);
9cc286
+	vtoc_volume_label_set_key(vlabel, "VOL1");
9cc286
+	vtoc_volume_label_set_label(vlabel, "VOL1");
9cc286
+
9cc286
+	vtoc_set_cchhb(&vlabel->vtoc, VTOC_START_CC, VTOC_START_HH, 0x01);
9cc286
+}
9cc286
+
9cc286
+
9cc286
 /*
9cc286
  * sets some important partition data
9cc286
  * (like used, start_trk, end_trk, len_trk)
9cc286
@@ -769,6 +785,52 @@ fdasd_process_valid_vtoc (fdasd_anchor_t
9cc286
 	fdasd_update_partition_info (anc);
9cc286
 }
9cc286
 
9cc286
+static void
9cc286
+fdasd_invalid_vtoc_pointer(fdasd_anchor_t *anc)
9cc286
+{
9cc286
+	PDEBUG
9cc286
+	anc->formatted_cylinders = anc->hw_cylinders;
9cc286
+	anc->fspace_trk = anc->formatted_cylinders * anc->geo.heads
9cc286
+			- FIRST_USABLE_TRK;
9cc286
+	vtoc_init_format4_label(anc->f4, USABLE_PARTITIONS,
9cc286
+			anc->geo.cylinders, anc->formatted_cylinders,
9cc286
+			anc->geo.heads, anc->geo.sectors,
9cc286
+			anc->blksize, anc->dev_type);
9cc286
+
9cc286
+	vtoc_init_format5_label(anc->f5);
9cc286
+	vtoc_init_format7_label(anc->f7);
9cc286
+
9cc286
+	vtoc_set_freespace(anc->f4, anc->f5, anc->f7, '+', anc->verbose,
9cc286
+			FIRST_USABLE_TRK,
9cc286
+			anc->formatted_cylinders * anc->geo.heads - 1,
9cc286
+			anc->formatted_cylinders, anc->geo.heads);
9cc286
+
9cc286
+	vtoc_set_cchhb(&anc->vlabel->vtoc, VTOC_START_CC, VTOC_START_HH, 0x01);
9cc286
+}
9cc286
+
9cc286
+/*
9cc286
+ * we have a invalid FMT4 DSCB and therefore we will re-create the VTOC
9cc286
+ */
9cc286
+static void
9cc286
+fdasd_process_invalid_vtoc(fdasd_anchor_t *anc)
9cc286
+{
9cc286
+	anc->formatted_cylinders = anc->hw_cylinders;
9cc286
+	anc->fspace_trk = anc->formatted_cylinders * anc->geo.heads
9cc286
+			- FIRST_USABLE_TRK;
9cc286
+	vtoc_init_format4_label(anc->f4, USABLE_PARTITIONS,
9cc286
+			anc->geo.cylinders, anc->formatted_cylinders,
9cc286
+			anc->geo.heads, anc->geo.sectors,
9cc286
+			anc->blksize, anc->dev_type);
9cc286
+
9cc286
+	vtoc_init_format5_label(anc->f5);
9cc286
+	vtoc_init_format7_label(anc->f7);
9cc286
+	vtoc_set_freespace(anc->f4, anc->f5, anc->f7, '+', anc->verbose,
9cc286
+			FIRST_USABLE_TRK,
9cc286
+			anc->formatted_cylinders * anc->geo.heads - 1,
9cc286
+			anc->formatted_cylinders, anc->geo.heads);
9cc286
+}
9cc286
+
9cc286
+
9cc286
 static int
9cc286
 fdasd_valid_vtoc_pointer(fdasd_anchor_t *anc, unsigned long b, int fd)
9cc286
 {
9cc286
@@ -781,6 +843,8 @@ fdasd_valid_vtoc_pointer(fdasd_anchor_t
9cc286
 	if (anc->f4->DS4IDFMT == 0xf4) {
9cc286
 		fdasd_process_valid_vtoc (anc, b, fd);
9cc286
 		return 0;
9cc286
+	} else {
9cc286
+		fdasd_process_invalid_vtoc(anc);
9cc286
 	}
9cc286
 	if (strncmp(anc->vlabel->volkey, vtoc_ebcdic_enc("LNX1",str,4),4) == 0 ||
9cc286
 	    strncmp(anc->vlabel->volkey, vtoc_ebcdic_enc("CMS1",str,4),4) == 0)
9cc286
@@ -817,13 +881,37 @@ fdasd_check_volume (fdasd_anchor_t *anc,
9cc286
 			else
9cc286
 				return 0;
9cc286
 		} else {
9cc286
-			return 1;
9cc286
+			fdasd_invalid_vtoc_pointer(anc);
9cc286
 		}
9cc286
 	} else if (strncmp (v->volkey, vtoc_ebcdic_enc ("LNX1", str, 4), 4) == 0 ||
9cc286
 	           strncmp (v->volkey, vtoc_ebcdic_enc ("CMS1", str, 4), 4) == 0) {
9cc286
 		return 0;
9cc286
+	} else if (anc->FBA_layout == 1) {
9cc286
+		/* Some times LDL formatted disks does not
9cc286
+		   contain any volume label */
9cc286
+		return 1;
9cc286
+	} else {
9cc286
+	/* didn't find VOL1 volume label */
9cc286
+		anc->formatted_cylinders = anc->hw_cylinders;
9cc286
+		anc->fspace_trk = anc->formatted_cylinders * anc->geo.heads
9cc286
+					- FIRST_USABLE_TRK;
9cc286
+
9cc286
+		fdasd_init_volume_label(anc, fd);
9cc286
+
9cc286
+		vtoc_init_format4_label(anc->f4, USABLE_PARTITIONS,
9cc286
+				anc->geo.cylinders, anc->formatted_cylinders,
9cc286
+				anc->geo.heads, anc->geo.sectors,
9cc286
+				anc->blksize, anc->dev_type);
9cc286
+
9cc286
+		vtoc_init_format5_label(anc->f5);
9cc286
+		vtoc_init_format7_label(anc->f7);
9cc286
+
9cc286
+		vtoc_set_freespace(anc->f4, anc->f5, anc->f7, '+',
9cc286
+			anc->verbose, FIRST_USABLE_TRK,
9cc286
+			anc->formatted_cylinders * anc->geo.heads - 1,
9cc286
+			anc->formatted_cylinders, anc->geo.heads);
9cc286
+		return 0;
9cc286
 	}
9cc286
-
9cc286
 	return 1;
9cc286
 }
9cc286