forked from pool/parted
Accepting request 492572 from home:sparschauer:branches:Base:System
Use latest fdasd/vtoc code base from s390-tools (fate#321531) OBS-URL: https://build.opensuse.org/request/show/492572 OBS-URL: https://build.opensuse.org/package/show/Base:System/parted?expand=0&rev=125
This commit is contained in:
parent
5568719e10
commit
ef69beac35
167
libparted-dasd-add-new-fdasd-functions.patch
Normal file
167
libparted-dasd-add-new-fdasd-functions.patch
Normal file
@ -0,0 +1,167 @@
|
|||||||
|
From: Wang Dong <dongdwdw@linux.vnet.ibm.com>
|
||||||
|
Date: Wed, 26 Oct 2016 04:22:48 +0200
|
||||||
|
Subject: libparted/dasd: add new fdasd functions
|
||||||
|
References: fate#321531
|
||||||
|
Patch-mainline: v3.3
|
||||||
|
Git-commit: b9e12819ecef30087753b967bebc9809120593a6
|
||||||
|
|
||||||
|
Introduce a set of new functions from the fdasd utility of the s390-tools
|
||||||
|
to keep the code base in parted and s390-tools in sync.
|
||||||
|
|
||||||
|
These new functions are:
|
||||||
|
fdasd_check_volser(): validate the volser input
|
||||||
|
fdasd_get_volser(): get volume serial (volser)
|
||||||
|
fdasd_change_volser(): change volser with string
|
||||||
|
fdasd_reuse_vtoc(): re-create vtoc labels based on the existing vtoc
|
||||||
|
|
||||||
|
Signed-off-by: Wang Dong <dongdwdw@linux.vnet.ibm.com>
|
||||||
|
Signed-off-by: Hendrik Brueckner <brueckner@linux.vnet.ibm.com>
|
||||||
|
Signed-off-by: Brian C. Lane <bcl@redhat.com>
|
||||||
|
Acked-by: Sebastian Parschauer <sparschauer@suse.de>
|
||||||
|
---
|
||||||
|
include/parted/fdasd.in.h | 4 ++
|
||||||
|
libparted/labels/fdasd.c | 123 ++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
2 files changed, 127 insertions(+)
|
||||||
|
|
||||||
|
--- a/include/parted/fdasd.in.h
|
||||||
|
+++ b/include/parted/fdasd.in.h
|
||||||
|
@@ -291,5 +291,9 @@ void fdasd_recreate_vtoc(fdasd_anchor_t
|
||||||
|
partition_info_t * fdasd_add_partition (fdasd_anchor_t *anc,
|
||||||
|
unsigned int start, unsigned int stop);
|
||||||
|
int fdasd_prepare_labels (fdasd_anchor_t *anc, int fd) ;
|
||||||
|
+void fdasd_check_volser(char *volser, int devno);
|
||||||
|
+int fdasd_get_volser(fdasd_anchor_t *anc, char *volser, int fd);
|
||||||
|
+void fdasd_change_volser(fdasd_anchor_t *anc, char *str);
|
||||||
|
+void fdasd_reuse_vtoc(fdasd_anchor_t *anc);
|
||||||
|
|
||||||
|
#endif /* FDASD_H */
|
||||||
|
--- a/libparted/labels/fdasd.c
|
||||||
|
+++ b/libparted/labels/fdasd.c
|
||||||
|
@@ -1247,4 +1247,127 @@ fdasd_add_partition (fdasd_anchor_t *anc
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
+/*
|
||||||
|
+ * Check for valid volume serial characters (max. 6) - remove invalid.
|
||||||
|
+ * If volser is empty, fill with default volser.
|
||||||
|
+ */
|
||||||
|
+void fdasd_check_volser (char *volser, int devno)
|
||||||
|
+{
|
||||||
|
+ int from, to;
|
||||||
|
+
|
||||||
|
+ for (from = 0, to = 0; volser[from] && from < VOLSER_LENGTH; from++) {
|
||||||
|
+
|
||||||
|
+ if ((volser[from] >= 0x23 &&
|
||||||
|
+ volser[from] <= 0x25) ||
|
||||||
|
+ (volser[from] >= 0x30 &&
|
||||||
|
+ volser[from] <= 0x39) ||
|
||||||
|
+ (volser[from] >= 0x40 &&
|
||||||
|
+ volser[from] <= 0x5a) ||
|
||||||
|
+ (volser[from] >= 0x61 &&
|
||||||
|
+ volser[from] <= 0x7a))
|
||||||
|
+ volser[to++] = toupper(volser[from]);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ volser[to] = 0x00;
|
||||||
|
+
|
||||||
|
+ if (volser[0] == 0x00)
|
||||||
|
+ sprintf(volser, "0X%04x", devno);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+/*
|
||||||
|
+ * get volser from vtoc
|
||||||
|
+ */
|
||||||
|
+int fdasd_get_volser (fdasd_anchor_t *anc, char *volser, int fd)
|
||||||
|
+{
|
||||||
|
+ volume_label_t vlabel;
|
||||||
|
+
|
||||||
|
+ vtoc_read_volume_label(fd, anc->label_pos, &vlabel);
|
||||||
|
+ vtoc_volume_label_get_volser(&vlabel, volser);
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+/* Changes the volume serial (menu option)
|
||||||
|
+ *
|
||||||
|
+ */
|
||||||
|
+void fdasd_change_volser (fdasd_anchor_t *anc, char *str)
|
||||||
|
+{
|
||||||
|
+ fdasd_check_volser(str, anc->devno);
|
||||||
|
+ vtoc_volume_label_set_volser(anc->vlabel, str);
|
||||||
|
+
|
||||||
|
+ vtoc_set_cchhb(&anc->vlabel->vtoc, VTOC_START_CC, VTOC_START_HH, 0x01);
|
||||||
|
+ anc->vlabel_changed++;
|
||||||
|
+ anc->vtoc_changed++;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+/*
|
||||||
|
+ * re-create all VTOC labels, but use the partition information
|
||||||
|
+ * from existing VTOC
|
||||||
|
+ */
|
||||||
|
+void fdasd_reuse_vtoc (fdasd_anchor_t *anc)
|
||||||
|
+{
|
||||||
|
+ partition_info_t *part_info = anc->first;
|
||||||
|
+ struct fdasd_hd_geometry geo = anc->geo;
|
||||||
|
+ format1_label_t f1;
|
||||||
|
+ format4_label_t f4;
|
||||||
|
+ format5_label_t f5;
|
||||||
|
+ format7_label_t f7;
|
||||||
|
+
|
||||||
|
+ vtoc_init_format4_label(&f4, geo.cylinders, anc->formatted_cylinders,
|
||||||
|
+ geo.heads, geo.sectors,
|
||||||
|
+ anc->blksize, anc->dev_type);
|
||||||
|
+
|
||||||
|
+ /* reuse some FMT4 values */
|
||||||
|
+ f4.DS4HPCHR = anc->f4->DS4HPCHR;
|
||||||
|
+ f4.DS4DSREC = anc->f4->DS4DSREC;
|
||||||
|
+
|
||||||
|
+ /* re-initialize both free-space labels */
|
||||||
|
+ vtoc_init_format5_label(&f5);
|
||||||
|
+ vtoc_init_format7_label(&f7);
|
||||||
|
+
|
||||||
|
+ if (anc->fspace_trk > 0)
|
||||||
|
+ vtoc_set_freespace(&f4, &f5, &f7, '+', anc->verbose,
|
||||||
|
+ FIRST_USABLE_TRK,
|
||||||
|
+ FIRST_USABLE_TRK + anc->fspace_trk - 1,
|
||||||
|
+ anc->formatted_cylinders, geo.heads);
|
||||||
|
+
|
||||||
|
+ while (part_info != NULL) {
|
||||||
|
+ if (part_info->used != 0x01) {
|
||||||
|
+ part_info = part_info->next;
|
||||||
|
+ continue;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (anc->formatted_cylinders > LV_COMPAT_CYL)
|
||||||
|
+ vtoc_init_format8_label(anc->blksize,
|
||||||
|
+ &part_info->f1->DS1EXT1, &f1);
|
||||||
|
+ else
|
||||||
|
+ vtoc_init_format1_label(anc->blksize,
|
||||||
|
+ &part_info->f1->DS1EXT1, &f1);
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+ strncpy(f1.DS1DSNAM, part_info->f1->DS1DSNAM, 44);
|
||||||
|
+ strncpy((char *)f1.DS1DSSN, (char *)part_info->f1->DS1DSSN, 6);
|
||||||
|
+ f1.DS1CREDT = part_info->f1->DS1CREDT;
|
||||||
|
+
|
||||||
|
+ memcpy(part_info->f1, &f1, sizeof(format1_label_t));
|
||||||
|
+
|
||||||
|
+ if (part_info->fspace_trk > 0)
|
||||||
|
+ vtoc_set_freespace(&f4, &f5, &f7, '+', anc->verbose,
|
||||||
|
+ part_info->end_trk + 1,
|
||||||
|
+ part_info->end_trk +
|
||||||
|
+ part_info->fspace_trk,
|
||||||
|
+ anc->formatted_cylinders, geo.heads);
|
||||||
|
+
|
||||||
|
+ part_info = part_info->next;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ /* over-write old labels with new ones */
|
||||||
|
+ memcpy(anc->f4, &f4, sizeof(format4_label_t));
|
||||||
|
+ memcpy(anc->f5, &f5, sizeof(format5_label_t));
|
||||||
|
+ memcpy(anc->f7, &f7, sizeof(format7_label_t));
|
||||||
|
+
|
||||||
|
+ anc->vtoc_changed++;
|
||||||
|
+
|
||||||
|
+ return;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
/* vim:set tabstop=4 shiftwidth=4 softtabstop=4: */
|
266
libparted-dasd-unify-vtoc-handling-for-cdl-ldl.patch
Normal file
266
libparted-dasd-unify-vtoc-handling-for-cdl-ldl.patch
Normal file
@ -0,0 +1,266 @@
|
|||||||
|
From: Wang Dong <dongdwdw@linux.vnet.ibm.com>
|
||||||
|
Date: Wed, 26 Oct 2016 04:22:46 +0200
|
||||||
|
Subject: libparted/dasd: unify vtoc handling for cdl/ldl
|
||||||
|
References: fate#321531
|
||||||
|
Patch-mainline: v3.3
|
||||||
|
Git-commit: 4f25d54d4d2bd6ae12d56b5a97ed2b7f60f753e9
|
||||||
|
|
||||||
|
Merge volume label cdl and ldl. It is convenient to manipulate
|
||||||
|
the same structure. Also remove unused arguments in the functions.
|
||||||
|
|
||||||
|
Signed-off-by: Wang Dong <dongdwdw@linux.vnet.ibm.com>
|
||||||
|
Signed-off-by: Hendrik Brueckner <brueckner@linux.vnet.ibm.com>
|
||||||
|
Signed-off-by: Brian C. Lane <bcl@redhat.com>
|
||||||
|
Acked-by: Sebastian Parschauer <sparschauer@suse.de>
|
||||||
|
---
|
||||||
|
include/parted/vtoc.in.h | 34 +++++++++++++++++++---------------
|
||||||
|
libparted/labels/dasd.c | 8 +++-----
|
||||||
|
libparted/labels/vtoc.c | 38 +++++++++++++++++---------------------
|
||||||
|
3 files changed, 39 insertions(+), 41 deletions(-)
|
||||||
|
|
||||||
|
--- a/include/parted/vtoc.in.h
|
||||||
|
+++ b/include/parted/vtoc.in.h
|
||||||
|
@@ -62,7 +62,6 @@ typedef struct cchh cchh_t;
|
||||||
|
typedef struct labeldate labeldate_t;
|
||||||
|
typedef struct volume_label volume_label_t;
|
||||||
|
typedef struct cms_volume_label cms_volume_label_t;
|
||||||
|
-typedef struct ldl_volume_label ldl_volume_label_t;
|
||||||
|
typedef struct extent extent_t;
|
||||||
|
typedef struct dev_const dev_const_t;
|
||||||
|
typedef struct format1_label format1_label_t;
|
||||||
|
@@ -94,6 +93,19 @@ struct __attribute__ ((packed)) labeldat
|
||||||
|
u_int16_t day;
|
||||||
|
};
|
||||||
|
|
||||||
|
+/*
|
||||||
|
+ * The following structure is a merger of the cdl and ldl volume label.
|
||||||
|
+ * On an ldl disk there is no key information, so when reading an
|
||||||
|
+ * ldl label from disk, the data should be copied at the address of vollbl.
|
||||||
|
+ * On the other side, the field ldl_version is reserved in a cdl record
|
||||||
|
+ * and the field formatted_blocks exists only for ldl labels. So when
|
||||||
|
+ * reading a cdl label from disk, the formatted_blocks field will contain
|
||||||
|
+ * arbitrary data.
|
||||||
|
+ * This layout may be a bit awkward, but the advantage of having the
|
||||||
|
+ * same label type for both disk layout types is bigger than the effort
|
||||||
|
+ * for taking a bit of extra care at the fringes.
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
struct __attribute__ ((packed)) volume_label {
|
||||||
|
char volkey[4]; /* volume key = volume label */
|
||||||
|
char vollbl[4]; /* volume label ("VOL1" in EBCDIC) */
|
||||||
|
@@ -107,15 +119,8 @@ struct __attribute__ ((packed)) volume_l
|
||||||
|
char labperci[4]; /* no of labels per CI (FBA), blanks for CKD */
|
||||||
|
char res2[4]; /* reserved */
|
||||||
|
char lvtoc[14]; /* owner code for LVTOC */
|
||||||
|
- char res3[29]; /* reserved */
|
||||||
|
- char fudge[4]; /* filler to match length of ldl label */
|
||||||
|
-};
|
||||||
|
-
|
||||||
|
-struct __attribute__ ((packed)) ldl_volume_label {
|
||||||
|
- char vollbl[4]; /* Label identifier ("LNX1" in EBCDIC) */
|
||||||
|
- char volid[6]; /* Volume identifier */
|
||||||
|
- char res3[69]; /* Reserved field */
|
||||||
|
- char ldl_version[1]; /* Version number, valid for ldl format */
|
||||||
|
+ char res3[28]; /* reserved */
|
||||||
|
+ char ldl_version; /* version number, valid for ldl format */
|
||||||
|
u_int64_t formatted_blocks; /* valid when ldl_version >= "2" (in
|
||||||
|
EBCDIC) */
|
||||||
|
};
|
||||||
|
@@ -335,11 +340,10 @@ void vtoc_write_label (int fd, unsigned
|
||||||
|
format7_label_t const *f7,
|
||||||
|
format9_label_t const *f9);
|
||||||
|
|
||||||
|
-void vtoc_init_format1_label (char *volid, unsigned int blksize,
|
||||||
|
+void vtoc_init_format1_label (unsigned int blksize,
|
||||||
|
extent_t *part_extent, format1_label_t *f1);
|
||||||
|
|
||||||
|
void vtoc_init_format4_label (format4_label_t *f4lbl,
|
||||||
|
- unsigned int usable_partitions,
|
||||||
|
unsigned int compat_cylinders,
|
||||||
|
unsigned int real_cylinders,
|
||||||
|
unsigned int tracks,
|
||||||
|
@@ -352,11 +356,11 @@ void vtoc_update_format4_label (format4_
|
||||||
|
|
||||||
|
void vtoc_init_format5_label (format5_label_t *f5);
|
||||||
|
|
||||||
|
-void vtoc_update_format5_label_add (format5_label_t *f5, int verbose, int cyl,
|
||||||
|
+void vtoc_update_format5_label_add (format5_label_t *f5, int verbose,
|
||||||
|
int trk, u_int16_t a, u_int16_t b,
|
||||||
|
u_int8_t c);
|
||||||
|
|
||||||
|
-void vtoc_update_format5_label_del (format5_label_t *f5, int verbose, int cyl,
|
||||||
|
+void vtoc_update_format5_label_del (format5_label_t *f5, int verbose,
|
||||||
|
int trk, u_int16_t a, u_int16_t b,
|
||||||
|
u_int8_t c);
|
||||||
|
|
||||||
|
@@ -368,7 +372,7 @@ void vtoc_update_format7_label_add (form
|
||||||
|
void vtoc_update_format7_label_del (format7_label_t *f7, int verbose,
|
||||||
|
u_int32_t a, u_int32_t b);
|
||||||
|
|
||||||
|
-void vtoc_init_format8_label (char *volid, unsigned int blksize,
|
||||||
|
+void vtoc_init_format8_label (unsigned int blksize,
|
||||||
|
extent_t *part_extent, format1_label_t *f1);
|
||||||
|
|
||||||
|
void vtoc_update_format8_label (cchhb_t *associated_f9, format1_label_t *f8);
|
||||||
|
--- a/libparted/labels/dasd.c
|
||||||
|
+++ b/libparted/labels/dasd.c
|
||||||
|
@@ -345,13 +345,12 @@ dasd_read (PedDisk* disk)
|
||||||
|
DasdPartitionData* dasd_data;
|
||||||
|
|
||||||
|
union vollabel {
|
||||||
|
- volume_label_t unused;
|
||||||
|
- ldl_volume_label_t ldl;
|
||||||
|
+ volume_label_t ldl;
|
||||||
|
cms_volume_label_t cms;
|
||||||
|
};
|
||||||
|
union vollabel *cms_ptr1 = (union vollabel *) anchor.vlabel;
|
||||||
|
cms_volume_label_t *cms_ptr = &cms_ptr1->cms;
|
||||||
|
- ldl_volume_label_t *ldl_ptr = &cms_ptr1->ldl;
|
||||||
|
+ volume_label_t *ldl_ptr = &cms_ptr1->ldl;
|
||||||
|
int partition_start_block;
|
||||||
|
|
||||||
|
disk_specific->format_type = 1;
|
||||||
|
@@ -375,8 +374,7 @@ dasd_read (PedDisk* disk)
|
||||||
|
* (long long) cms_ptr->disk_offset;
|
||||||
|
|
||||||
|
if (is_ldl)
|
||||||
|
- if (strncmp(ldl_ptr->ldl_version,
|
||||||
|
- vtoc_ebcdic_enc("2", str, 1), 1) >= 0)
|
||||||
|
+ if (ldl_ptr->ldl_version >= 0xf2)
|
||||||
|
end = (long long) arch_specific->real_sector_size
|
||||||
|
/ (long long) disk->dev->sector_size
|
||||||
|
* (long long) ldl_ptr->formatted_blocks - 1;
|
||||||
|
--- a/libparted/labels/vtoc.c
|
||||||
|
+++ b/libparted/labels/vtoc.c
|
||||||
|
@@ -150,7 +150,7 @@ enum failure {
|
||||||
|
unable_to_read
|
||||||
|
};
|
||||||
|
|
||||||
|
-static char buffer[89];
|
||||||
|
+static char buffer[93];
|
||||||
|
|
||||||
|
static void
|
||||||
|
vtoc_error (enum failure why, char const *s1, char const *s2)
|
||||||
|
@@ -329,7 +329,7 @@ void
|
||||||
|
vtoc_volume_label_init (volume_label_t *vlabel)
|
||||||
|
{
|
||||||
|
PDEBUG
|
||||||
|
- sprintf(buffer, "%88s", " ");
|
||||||
|
+ sprintf(buffer, "%92s", " ");
|
||||||
|
vtoc_ebcdic_enc(buffer, buffer, sizeof *vlabel);
|
||||||
|
memcpy(vlabel, buffer, sizeof *vlabel);
|
||||||
|
}
|
||||||
|
@@ -348,8 +348,8 @@ vtoc_read_volume_label (int f, unsigned
|
||||||
|
typedef union vollabel vollabel_t;
|
||||||
|
|
||||||
|
union __attribute__((packed)) vollabel {
|
||||||
|
+ /* cdl and ldl have the same data struct */
|
||||||
|
volume_label_t cdl;
|
||||||
|
- ldl_volume_label_t ldl;
|
||||||
|
cms_volume_label_t cms;
|
||||||
|
};
|
||||||
|
|
||||||
|
@@ -373,9 +373,7 @@ vtoc_read_volume_label (int f, unsigned
|
||||||
|
}
|
||||||
|
|
||||||
|
rc = read(f, vlabel, sizeof(volume_label_t));
|
||||||
|
- if (rc != sizeof(volume_label_t) &&
|
||||||
|
- /* For CDL we ask to read 88 bytes, but only get 84 */
|
||||||
|
- rc != sizeof(volume_label_t) - 4) {
|
||||||
|
+ if (rc != sizeof(volume_label_t)) {
|
||||||
|
vtoc_error(unable_to_read, "vtoc_read_volume_label",
|
||||||
|
_("Could not read volume label."));
|
||||||
|
return 1;
|
||||||
|
@@ -427,10 +425,8 @@ vtoc_write_volume_label (int f, unsigned
|
||||||
|
vtoc_error(unable_to_seek, "vtoc_write_volume_label",
|
||||||
|
_("Could not write volume label."));
|
||||||
|
|
||||||
|
- rc = write(f, vlabel, sizeof(volume_label_t) - 4);
|
||||||
|
- /* Subtract 4 to leave off the "fudge" variable when writing.
|
||||||
|
- We only write CDL volume labels, never LDL or CMS. */
|
||||||
|
- if (rc != sizeof(volume_label_t) - 4)
|
||||||
|
+ rc = write(f, vlabel, sizeof(volume_label_t));
|
||||||
|
+ if (rc != sizeof(volume_label_t))
|
||||||
|
vtoc_error(unable_to_write, "vtoc_write_volume_label",
|
||||||
|
_("Could not write volume label."));
|
||||||
|
|
||||||
|
@@ -632,7 +628,7 @@ vtoc_write_label (int f, unsigned long p
|
||||||
|
* initializes a format4 label
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
-vtoc_init_format4_label (format4_label_t *f4, unsigned int usable_partitions,
|
||||||
|
+vtoc_init_format4_label (format4_label_t *f4,
|
||||||
|
unsigned int compat_cylinders,
|
||||||
|
unsigned int real_cylinders, unsigned int tracks,
|
||||||
|
unsigned int blocks, unsigned int blksize,
|
||||||
|
@@ -740,7 +736,7 @@ vtoc_init_format7_label (format7_label_t
|
||||||
|
* format1 or format 8 label, all but the field DS1FMTID
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
-vtoc_init_format_1_8_label (char *volid, unsigned int blksize,
|
||||||
|
+vtoc_init_format_1_8_label (unsigned int blksize,
|
||||||
|
extent_t *part_extent, format1_label_t *f1)
|
||||||
|
{
|
||||||
|
PDEBUG
|
||||||
|
@@ -794,18 +790,18 @@ vtoc_init_format_1_8_label (char *volid,
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
-vtoc_init_format1_label (char *volid, unsigned int blksize,
|
||||||
|
+vtoc_init_format1_label (unsigned int blksize,
|
||||||
|
extent_t *part_extent, format1_label_t *f1)
|
||||||
|
{
|
||||||
|
- vtoc_init_format_1_8_label(volid, blksize, part_extent, f1);
|
||||||
|
+ vtoc_init_format_1_8_label(blksize, part_extent, f1);
|
||||||
|
f1->DS1FMTID = 0xf1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
-vtoc_init_format8_label (char *volid, unsigned int blksize,
|
||||||
|
+vtoc_init_format8_label (unsigned int blksize,
|
||||||
|
extent_t *part_extent, format1_label_t *f8)
|
||||||
|
{
|
||||||
|
- vtoc_init_format_1_8_label(volid, blksize, part_extent, f8);
|
||||||
|
+ vtoc_init_format_1_8_label(blksize, part_extent, f8);
|
||||||
|
f8->DS1FMTID = 0xf8;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -886,7 +882,7 @@ vtoc_reorganize_FMT5_extents (format5_la
|
||||||
|
* add a free space extent description to the VTOC FMT5 DSCB
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
-vtoc_update_format5_label_add (format5_label_t *f5, int verbose, int cyl,
|
||||||
|
+vtoc_update_format5_label_add (format5_label_t *f5, int verbose,
|
||||||
|
int trk, u_int16_t a, u_int16_t b, u_int8_t c)
|
||||||
|
{
|
||||||
|
PDEBUG
|
||||||
|
@@ -974,7 +970,7 @@ vtoc_update_format5_label_add (format5_l
|
||||||
|
* remove a free space extent description from the VTOC FMT5 DSCB
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
-vtoc_update_format5_label_del (format5_label_t *f5, int verbose, int cyl,
|
||||||
|
+vtoc_update_format5_label_del (format5_label_t *f5, int verbose,
|
||||||
|
int trk, u_int16_t a, u_int16_t b, u_int8_t c)
|
||||||
|
{
|
||||||
|
PDEBUG
|
||||||
|
@@ -1054,7 +1050,7 @@ vtoc_update_format5_label_del (format5_l
|
||||||
|
ext->ft = (a - ext->t) % trk;
|
||||||
|
|
||||||
|
vtoc_update_format5_label_add(f5, verbose,
|
||||||
|
- cyl, trk, x, y, z);
|
||||||
|
+ trk, x, y, z);
|
||||||
|
|
||||||
|
if (verbose)
|
||||||
|
puts ("FMT5 del extent: 2 pieces");
|
||||||
|
@@ -1322,9 +1318,9 @@ vtoc_set_freespace(format4_label_t *f4,
|
||||||
|
z = (u_int8_t) ((stop - start + 1) % trk);
|
||||||
|
|
||||||
|
if (ch == '+')
|
||||||
|
- vtoc_update_format5_label_add(f5, verbose, cyl, trk, x, y, z);
|
||||||
|
+ vtoc_update_format5_label_add(f5, verbose, trk, x, y, z);
|
||||||
|
else if (ch == '-')
|
||||||
|
- vtoc_update_format5_label_del(f5, verbose, cyl, trk, x, y, z);
|
||||||
|
+ vtoc_update_format5_label_del(f5, verbose, trk, x, y, z);
|
||||||
|
else
|
||||||
|
puts ("BUG: syntax error in vtoc_set_freespace call");
|
||||||
|
|
204
libparted-dasd-update-and-improve-fdasd-functions.patch
Normal file
204
libparted-dasd-update-and-improve-fdasd-functions.patch
Normal file
@ -0,0 +1,204 @@
|
|||||||
|
From: Wang Dong <dongdwdw@linux.vnet.ibm.com>
|
||||||
|
Date: Wed, 26 Oct 2016 04:22:47 +0200
|
||||||
|
Subject: libparted/dasd: update and improve fdasd functions
|
||||||
|
References: fate#321531
|
||||||
|
Patch-mainline: v3.3
|
||||||
|
Git-commit: db37c8c017ebef8f241420dda071940957d4bbe5
|
||||||
|
|
||||||
|
Update the fdasd_anchor_t data structure and the fdasd_cleanup()
|
||||||
|
function. Also correct vtoc_changed and vlabel_changed accounting
|
||||||
|
because they are important to rewrite vtoc to save the changes.
|
||||||
|
|
||||||
|
Wang Dong <dongdwdw@linux.vnet.ibm.com>
|
||||||
|
Hendrik Brueckner <brueckner@linux.vnet.ibm.com>
|
||||||
|
|
||||||
|
Signed-off-by: Brian C. Lane <bcl@redhat.com>
|
||||||
|
Acked-by: Sebastian Parschauer <sparschauer@suse.de>
|
||||||
|
---
|
||||||
|
include/parted/fdasd.in.h | 14 +++++-------
|
||||||
|
libparted/labels/fdasd.c | 56 ++++++++++++++++++++++++-----------------------
|
||||||
|
2 files changed, 35 insertions(+), 35 deletions(-)
|
||||||
|
|
||||||
|
--- a/include/parted/fdasd.in.h
|
||||||
|
+++ b/include/parted/fdasd.in.h
|
||||||
|
@@ -186,6 +186,7 @@ typedef struct format_data_t {
|
||||||
|
/*****************************************************************************
|
||||||
|
* SECTION: Further IOCTL Definitions (see fs.h) *
|
||||||
|
*****************************************************************************/
|
||||||
|
+#define BLKROGET _IO(0x12,94) /* get read-only status (0 = read_write) */
|
||||||
|
/* re-read partition table */
|
||||||
|
#define BLKRRPART _IO(0x12,95)
|
||||||
|
/* get block device sector size */
|
||||||
|
@@ -196,15 +197,14 @@ typedef struct format_data_t {
|
||||||
|
/*****************************************************************************
|
||||||
|
* SECTION: FDASD internal types *
|
||||||
|
*****************************************************************************/
|
||||||
|
+#define PARTN_MASK ((1 << DASD_PARTN_BITS) - 1)
|
||||||
|
+#define USABLE_PARTITIONS ((1 << DASD_PARTN_BITS) - 1)
|
||||||
|
|
||||||
|
#define DASD_MIN_API_VERSION 0
|
||||||
|
|
||||||
|
#define DEFAULT_FDASD_CONF "/etc/fdasd.conf" /* default config file */
|
||||||
|
|
||||||
|
-#define PARTN_MASK ((1 << DASD_PARTN_BITS) - 1)
|
||||||
|
-#define USABLE_PARTITIONS ((1 << DASD_PARTN_BITS) - 1)
|
||||||
|
-
|
||||||
|
-#define FDASD_VERSION "1.05"
|
||||||
|
+#define FDASD_VERSION "1.32.0"
|
||||||
|
#define DEVICE "device"
|
||||||
|
#define DISC "disc"
|
||||||
|
#define PART "part"
|
||||||
|
@@ -231,9 +231,6 @@ typedef struct config_data {
|
||||||
|
typedef struct fdasd_anchor {
|
||||||
|
int vlabel_changed;
|
||||||
|
int vtoc_changed;
|
||||||
|
- int devname_specified;
|
||||||
|
- int volid_specified;
|
||||||
|
- int config_specified;
|
||||||
|
int auto_partition;
|
||||||
|
int print_table;
|
||||||
|
int big_disk;
|
||||||
|
@@ -280,7 +277,8 @@ enum fdasd_failure {
|
||||||
|
vlabel_corrupted,
|
||||||
|
dsname_corrupted,
|
||||||
|
malloc_failed,
|
||||||
|
- device_verification_failed
|
||||||
|
+ device_verification_failed,
|
||||||
|
+ volser_not_found
|
||||||
|
};
|
||||||
|
|
||||||
|
void fdasd_cleanup (fdasd_anchor_t *anchor);
|
||||||
|
--- a/libparted/labels/fdasd.c
|
||||||
|
+++ b/libparted/labels/fdasd.c
|
||||||
|
@@ -106,28 +106,26 @@ fdasd_cleanup (fdasd_anchor_t *anchor)
|
||||||
|
{
|
||||||
|
PDEBUG
|
||||||
|
int i;
|
||||||
|
- partition_info_t *p, *q;
|
||||||
|
+ partition_info_t *part_info, *next;
|
||||||
|
|
||||||
|
if (anchor == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
- free(anchor->f4);
|
||||||
|
- free(anchor->f5);
|
||||||
|
- free(anchor->f7);
|
||||||
|
- free(anchor->f9);
|
||||||
|
- free(anchor->vlabel);
|
||||||
|
-
|
||||||
|
- p = anchor->first;
|
||||||
|
- if (p == NULL)
|
||||||
|
- return;
|
||||||
|
-
|
||||||
|
- for (i=1; i <= USABLE_PARTITIONS; i++) {
|
||||||
|
- if (p == NULL)
|
||||||
|
- return;
|
||||||
|
- q = p->next;
|
||||||
|
- free(p->f1);
|
||||||
|
- free(p);
|
||||||
|
- p = q;
|
||||||
|
+ if (anchor->f4 != NULL)
|
||||||
|
+ free(anchor->f4);
|
||||||
|
+ if (anchor->f5 != NULL)
|
||||||
|
+ free(anchor->f5);
|
||||||
|
+ if (anchor->f7 != NULL)
|
||||||
|
+ free(anchor->f7);
|
||||||
|
+ if (anchor->vlabel != NULL)
|
||||||
|
+ free(anchor->vlabel);
|
||||||
|
+
|
||||||
|
+ part_info = anchor->first;
|
||||||
|
+ for (i = 1; i <= USABLE_PARTITIONS && part_info != NULL; i++) {
|
||||||
|
+ next = part_info->next;
|
||||||
|
+ free(part_info->f1);
|
||||||
|
+ free(part_info);
|
||||||
|
+ part_info = next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -190,6 +188,9 @@ fdasd_error (fdasd_anchor_t *anc, enum f
|
||||||
|
_("Device verification failed"),
|
||||||
|
_("The specified device is not a valid DASD device"));
|
||||||
|
break;
|
||||||
|
+ case volser_not_found:
|
||||||
|
+ sprintf(error, "fdasd: %s -- %s\n", _("VOLSER not found on device"), str);
|
||||||
|
+ break;
|
||||||
|
default:
|
||||||
|
sprintf(error, "fdasd: %s: %s\n", _("Fatal error"), str);
|
||||||
|
}
|
||||||
|
@@ -313,7 +314,7 @@ fdasd_write_vtoc_labels (fdasd_anchor_t
|
||||||
|
PDEBUG
|
||||||
|
partition_info_t *p;
|
||||||
|
unsigned long b, maxblk;
|
||||||
|
- char dsno[6], s1[7], s2[45], *c1, *c2, *ch;
|
||||||
|
+ char dsno[6], s1[VOLSER_LENGTH + 1], s2[45], *c1, *c2, *ch;
|
||||||
|
int i = 0, k = 0;
|
||||||
|
cchhb_t f9addr;
|
||||||
|
format1_label_t emptyf1;
|
||||||
|
@@ -545,7 +546,6 @@ fdasd_recreate_vtoc (fdasd_anchor_t *anc
|
||||||
|
int i;
|
||||||
|
|
||||||
|
vtoc_init_format4_label(anc->f4,
|
||||||
|
- USABLE_PARTITIONS,
|
||||||
|
anc->geo.cylinders,
|
||||||
|
anc->formatted_cylinders,
|
||||||
|
anc->geo.heads,
|
||||||
|
@@ -793,7 +793,7 @@ fdasd_invalid_vtoc_pointer(fdasd_anchor_
|
||||||
|
anc->formatted_cylinders = anc->hw_cylinders;
|
||||||
|
anc->fspace_trk = anc->formatted_cylinders * anc->geo.heads
|
||||||
|
- FIRST_USABLE_TRK;
|
||||||
|
- vtoc_init_format4_label(anc->f4, USABLE_PARTITIONS,
|
||||||
|
+ vtoc_init_format4_label(anc->f4,
|
||||||
|
anc->geo.cylinders, anc->formatted_cylinders,
|
||||||
|
anc->geo.heads, anc->geo.sectors,
|
||||||
|
anc->blksize, anc->dev_type);
|
||||||
|
@@ -807,6 +807,8 @@ fdasd_invalid_vtoc_pointer(fdasd_anchor_
|
||||||
|
anc->formatted_cylinders, anc->geo.heads);
|
||||||
|
|
||||||
|
vtoc_set_cchhb(&anc->vlabel->vtoc, VTOC_START_CC, VTOC_START_HH, 0x01);
|
||||||
|
+ anc->vtoc_changed++;
|
||||||
|
+ anc->vlabel_changed++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
@@ -818,7 +820,7 @@ fdasd_process_invalid_vtoc(fdasd_anchor_
|
||||||
|
anc->formatted_cylinders = anc->hw_cylinders;
|
||||||
|
anc->fspace_trk = anc->formatted_cylinders * anc->geo.heads
|
||||||
|
- FIRST_USABLE_TRK;
|
||||||
|
- vtoc_init_format4_label(anc->f4, USABLE_PARTITIONS,
|
||||||
|
+ vtoc_init_format4_label(anc->f4,
|
||||||
|
anc->geo.cylinders, anc->formatted_cylinders,
|
||||||
|
anc->geo.heads, anc->geo.sectors,
|
||||||
|
anc->blksize, anc->dev_type);
|
||||||
|
@@ -829,6 +831,8 @@ fdasd_process_invalid_vtoc(fdasd_anchor_
|
||||||
|
FIRST_USABLE_TRK,
|
||||||
|
anc->formatted_cylinders * anc->geo.heads - 1,
|
||||||
|
anc->formatted_cylinders, anc->geo.heads);
|
||||||
|
+
|
||||||
|
+ anc->vtoc_changed++;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@@ -901,7 +905,7 @@ fdasd_check_volume (fdasd_anchor_t *anc,
|
||||||
|
|
||||||
|
fdasd_init_volume_label(anc, fd);
|
||||||
|
|
||||||
|
- vtoc_init_format4_label(anc->f4, USABLE_PARTITIONS,
|
||||||
|
+ vtoc_init_format4_label(anc->f4,
|
||||||
|
anc->geo.cylinders, anc->formatted_cylinders,
|
||||||
|
anc->geo.heads, anc->geo.sectors,
|
||||||
|
anc->blksize, anc->dev_type);
|
||||||
|
@@ -1213,12 +1217,10 @@ fdasd_add_partition (fdasd_anchor_t *anc
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (anc->formatted_cylinders > LV_COMPAT_CYL) {
|
||||||
|
- vtoc_init_format8_label(anc->vlabel->volid, anc->blksize, &ext,
|
||||||
|
- p->f1);
|
||||||
|
+ vtoc_init_format8_label(anc->blksize, &ext, p->f1);
|
||||||
|
} else {
|
||||||
|
PDEBUG;
|
||||||
|
- vtoc_init_format1_label(anc->vlabel->volid, anc->blksize, &ext,
|
||||||
|
- p->f1);
|
||||||
|
+ vtoc_init_format1_label(anc->blksize, &ext, p->f1);
|
||||||
|
}
|
||||||
|
|
||||||
|
PDEBUG;
|
@ -1,3 +1,11 @@
|
|||||||
|
-------------------------------------------------------------------
|
||||||
|
Tue May 2 10:45:37 CEST 2017 - sparschauer@suse.de
|
||||||
|
|
||||||
|
- Use latest fdasd/vtoc code base from s390-tools (fate#321531)
|
||||||
|
- add: libparted-dasd-unify-vtoc-handling-for-cdl-ldl.patch
|
||||||
|
- add: libparted-dasd-update-and-improve-fdasd-functions.patch
|
||||||
|
- add: libparted-dasd-add-new-fdasd-functions.patch
|
||||||
|
|
||||||
-------------------------------------------------------------------
|
-------------------------------------------------------------------
|
||||||
Thu Apr 27 17:37:19 CEST 2017 - sparschauer@suse.de
|
Thu Apr 27 17:37:19 CEST 2017 - sparschauer@suse.de
|
||||||
|
|
||||||
|
@ -63,6 +63,10 @@ Patch34: parted-implement-wipesignatures-option.patch
|
|||||||
Patch35: libparted-Add-support-for-NVMe-devices.patch
|
Patch35: libparted-Add-support-for-NVMe-devices.patch
|
||||||
Patch36: libparted-fix-nvme-partition-naming.patch
|
Patch36: libparted-fix-nvme-partition-naming.patch
|
||||||
Patch37: libparted-dont-warn-if-no-HDIO_GET_IDENTITY.patch
|
Patch37: libparted-dont-warn-if-no-HDIO_GET_IDENTITY.patch
|
||||||
|
# fate#321531
|
||||||
|
Patch38: libparted-dasd-unify-vtoc-handling-for-cdl-ldl.patch
|
||||||
|
Patch39: libparted-dasd-update-and-improve-fdasd-functions.patch
|
||||||
|
Patch40: libparted-dasd-add-new-fdasd-functions.patch
|
||||||
Patch100: parted-fatresize-autoconf.patch
|
Patch100: parted-fatresize-autoconf.patch
|
||||||
BuildRequires: check-devel
|
BuildRequires: check-devel
|
||||||
BuildRequires: device-mapper-devel >= 1.02.33
|
BuildRequires: device-mapper-devel >= 1.02.33
|
||||||
@ -143,6 +147,9 @@ to develop applications that require these.
|
|||||||
%patch35 -p1
|
%patch35 -p1
|
||||||
%patch36 -p1
|
%patch36 -p1
|
||||||
%patch37 -p1
|
%patch37 -p1
|
||||||
|
%patch38 -p1
|
||||||
|
%patch39 -p1
|
||||||
|
%patch40 -p1
|
||||||
%patch100 -p1
|
%patch100 -p1
|
||||||
|
|
||||||
%build
|
%build
|
||||||
|
Loading…
x
Reference in New Issue
Block a user