Blame SOURCES/0060-libparted-dasd-add-new-fdasd-functions.patch

0cb0b9
From 3267b55ff764840cf267fd1e02fa467e4d87d388 Mon Sep 17 00:00:00 2001
0cb0b9
From: Wang Dong <dongdwdw@linux.vnet.ibm.com>
0cb0b9
Date: Wed, 26 Oct 2016 04:22:48 +0200
0cb0b9
Subject: [PATCH 60/75] libparted/dasd: add new fdasd functions
0cb0b9
0cb0b9
Introduce a set of new functions from the fdasd utility of the s390-tools
0cb0b9
to keep the code base in parted and s390-tools in sync.
0cb0b9
0cb0b9
These new functions are:
0cb0b9
  fdasd_check_volser():  validate the volser input
0cb0b9
  fdasd_get_volser():    get volume serial (volser)
0cb0b9
  fdasd_change_volser(): change volser with string
0cb0b9
  fdasd_reuse_vtoc():    re-create vtoc labels based on the existing vtoc
0cb0b9
0cb0b9
Signed-off-by: Wang Dong <dongdwdw@linux.vnet.ibm.com>
0cb0b9
Signed-off-by: Hendrik Brueckner <brueckner@linux.vnet.ibm.com>
0cb0b9
Signed-off-by: Brian C. Lane <bcl@redhat.com>
0cb0b9
---
0cb0b9
 include/parted/fdasd.in.h |   4 ++
0cb0b9
 libparted/labels/fdasd.c  | 123 ++++++++++++++++++++++++++++++++++++++++++++++
0cb0b9
 2 files changed, 127 insertions(+)
0cb0b9
0cb0b9
diff --git a/include/parted/fdasd.in.h b/include/parted/fdasd.in.h
0cb0b9
index 09a35a0..9e5d7d1 100644
0cb0b9
--- a/include/parted/fdasd.in.h
0cb0b9
+++ b/include/parted/fdasd.in.h
0cb0b9
@@ -293,5 +293,9 @@ void fdasd_recreate_vtoc(fdasd_anchor_t *anc);
0cb0b9
 partition_info_t * fdasd_add_partition (fdasd_anchor_t *anc,
0cb0b9
                                         unsigned int start, unsigned int stop);
0cb0b9
 int fdasd_prepare_labels (fdasd_anchor_t *anc, int fd) ;
0cb0b9
+void fdasd_check_volser(char *volser, int devno);
0cb0b9
+int fdasd_get_volser(fdasd_anchor_t *anc, char *volser, int fd);
0cb0b9
+void fdasd_change_volser(fdasd_anchor_t *anc, char *str);
0cb0b9
+void fdasd_reuse_vtoc(fdasd_anchor_t *anc);
0cb0b9
 
0cb0b9
 #endif /* FDASD_H */
0cb0b9
diff --git a/libparted/labels/fdasd.c b/libparted/labels/fdasd.c
0cb0b9
index e5df5cf..713ed6b 100644
0cb0b9
--- a/libparted/labels/fdasd.c
0cb0b9
+++ b/libparted/labels/fdasd.c
0cb0b9
@@ -1320,4 +1320,127 @@ fdasd_add_partition (fdasd_anchor_t *anc, unsigned int start,
0cb0b9
 	return p;
0cb0b9
 }
0cb0b9
 
0cb0b9
+/*
0cb0b9
+ * Check for valid volume serial characters (max. 6) - remove invalid.
0cb0b9
+ * If volser is empty, fill with default volser.
0cb0b9
+ */
0cb0b9
+void fdasd_check_volser (char *volser, int devno)
0cb0b9
+{
0cb0b9
+	int from, to;
0cb0b9
+
0cb0b9
+	for (from = 0, to = 0; volser[from] && from < VOLSER_LENGTH; from++) {
0cb0b9
+
0cb0b9
+			if ((volser[from] >= 0x23 &&
0cb0b9
+			     volser[from] <= 0x25) ||
0cb0b9
+			    (volser[from] >= 0x30 &&
0cb0b9
+			     volser[from] <= 0x39) ||
0cb0b9
+			    (volser[from] >= 0x40 &&
0cb0b9
+			     volser[from] <= 0x5a) ||
0cb0b9
+			    (volser[from] >= 0x61 &&
0cb0b9
+			     volser[from] <= 0x7a))
0cb0b9
+				volser[to++] = toupper(volser[from]);
0cb0b9
+	}
0cb0b9
+
0cb0b9
+	volser[to] = 0x00;
0cb0b9
+
0cb0b9
+	if (volser[0] == 0x00)
0cb0b9
+		sprintf(volser, "0X%04x", devno);
0cb0b9
+}
0cb0b9
+
0cb0b9
+/*
0cb0b9
+ * get volser from vtoc
0cb0b9
+ */
0cb0b9
+int fdasd_get_volser (fdasd_anchor_t *anc, char *volser, int fd)
0cb0b9
+{
0cb0b9
+	volume_label_t vlabel;
0cb0b9
+
0cb0b9
+	vtoc_read_volume_label(fd, anc->label_pos, &vlabel);
0cb0b9
+	vtoc_volume_label_get_volser(&vlabel, volser);
0cb0b9
+	return 0;
0cb0b9
+}
0cb0b9
+
0cb0b9
+/* Changes the volume serial (menu option)
0cb0b9
+ *
0cb0b9
+ */
0cb0b9
+void fdasd_change_volser (fdasd_anchor_t *anc, char *str)
0cb0b9
+{
0cb0b9
+	fdasd_check_volser(str, anc->devno);
0cb0b9
+	vtoc_volume_label_set_volser(anc->vlabel, str);
0cb0b9
+
0cb0b9
+	vtoc_set_cchhb(&anc->vlabel->vtoc, VTOC_START_CC, VTOC_START_HH, 0x01);
0cb0b9
+	anc->vlabel_changed++;
0cb0b9
+	anc->vtoc_changed++;
0cb0b9
+}
0cb0b9
+
0cb0b9
+/*
0cb0b9
+ * re-create all VTOC labels, but use the partition information
0cb0b9
+ * from existing VTOC
0cb0b9
+ */
0cb0b9
+void fdasd_reuse_vtoc (fdasd_anchor_t *anc)
0cb0b9
+{
0cb0b9
+	partition_info_t *part_info = anc->first;
0cb0b9
+	struct fdasd_hd_geometry geo = anc->geo;
0cb0b9
+	format1_label_t f1;
0cb0b9
+	format4_label_t f4;
0cb0b9
+	format5_label_t f5;
0cb0b9
+	format7_label_t f7;
0cb0b9
+
0cb0b9
+	vtoc_init_format4_label(&f4, geo.cylinders, anc->formatted_cylinders,
0cb0b9
+				geo.heads, geo.sectors,
0cb0b9
+				anc->blksize, anc->dev_type);
0cb0b9
+
0cb0b9
+	/* reuse some FMT4 values */
0cb0b9
+	f4.DS4HPCHR = anc->f4->DS4HPCHR;
0cb0b9
+	f4.DS4DSREC = anc->f4->DS4DSREC;
0cb0b9
+
0cb0b9
+	/* re-initialize both free-space labels */
0cb0b9
+	vtoc_init_format5_label(&f5;;
0cb0b9
+	vtoc_init_format7_label(&f7;;
0cb0b9
+
0cb0b9
+	if (anc->fspace_trk > 0)
0cb0b9
+		vtoc_set_freespace(&f4, &f5, &f7, '+', anc->verbose,
0cb0b9
+				   FIRST_USABLE_TRK,
0cb0b9
+				   FIRST_USABLE_TRK + anc->fspace_trk - 1,
0cb0b9
+				   anc->formatted_cylinders, geo.heads);
0cb0b9
+
0cb0b9
+	while (part_info != NULL) {
0cb0b9
+		if (part_info->used != 0x01) {
0cb0b9
+			part_info = part_info->next;
0cb0b9
+			continue;
0cb0b9
+		}
0cb0b9
+
0cb0b9
+		if (anc->formatted_cylinders > LV_COMPAT_CYL)
0cb0b9
+			vtoc_init_format8_label(anc->blksize,
0cb0b9
+						&part_info->f1->DS1EXT1, &f1;;
0cb0b9
+		else
0cb0b9
+			vtoc_init_format1_label(anc->blksize,
0cb0b9
+						&part_info->f1->DS1EXT1, &f1;;
0cb0b9
+
0cb0b9
+
0cb0b9
+		strncpy(f1.DS1DSNAM, part_info->f1->DS1DSNAM, 44);
0cb0b9
+		strncpy((char *)f1.DS1DSSN, (char *)part_info->f1->DS1DSSN, 6);
0cb0b9
+		f1.DS1CREDT = part_info->f1->DS1CREDT;
0cb0b9
+
0cb0b9
+		memcpy(part_info->f1, &f1, sizeof(format1_label_t));
0cb0b9
+
0cb0b9
+		if (part_info->fspace_trk > 0)
0cb0b9
+			vtoc_set_freespace(&f4, &f5, &f7, '+', anc->verbose,
0cb0b9
+					   part_info->end_trk + 1,
0cb0b9
+					   part_info->end_trk +
0cb0b9
+					   part_info->fspace_trk,
0cb0b9
+					   anc->formatted_cylinders, geo.heads);
0cb0b9
+
0cb0b9
+		part_info = part_info->next;
0cb0b9
+	}
0cb0b9
+
0cb0b9
+	/* over-write old labels with new ones */
0cb0b9
+	memcpy(anc->f4, &f4, sizeof(format4_label_t));
0cb0b9
+	memcpy(anc->f5, &f5, sizeof(format5_label_t));
0cb0b9
+	memcpy(anc->f7, &f7, sizeof(format7_label_t));
0cb0b9
+
0cb0b9
+	anc->vtoc_changed++;
0cb0b9
+
0cb0b9
+	return;
0cb0b9
+}
0cb0b9
+
0cb0b9
 /* vim:set tabstop=4 shiftwidth=4 softtabstop=4: */
0cb0b9
-- 
0cb0b9
2.9.3
0cb0b9