1 From ebb6eef20792a17388da30f1c312ede4b03140fd Mon Sep 17 00:00:00 2001
2 From: Wang Dong <dongdwdw@linux.vnet.ibm.com>
3 Date: Wed, 26 Oct 2016 04:22:46 +0200
4 Subject: [PATCH 58/75] libparted/dasd: unify vtoc handling for cdl/ldl
6 Merge volume label cdl and ldl. It is convenient to manipulate
7 the same structure. Also remove unused arguments in the functions.
9 Signed-off-by: Wang Dong <dongdwdw@linux.vnet.ibm.com>
10 Signed-off-by: Hendrik Brueckner <brueckner@linux.vnet.ibm.com>
11 Signed-off-by: Brian C. Lane <bcl@redhat.com>
13 include/parted/vtoc.in.h | 34 +++++++++++++++++++---------------
14 libparted/labels/dasd.c | 8 +++-----
15 libparted/labels/vtoc.c | 38 +++++++++++++++++---------------------
16 3 files changed, 39 insertions(+), 41 deletions(-)
18 diff --git a/include/parted/vtoc.in.h b/include/parted/vtoc.in.h
19 index 499c2d3..b9da23a 100644
20 --- a/include/parted/vtoc.in.h
21 +++ b/include/parted/vtoc.in.h
22 @@ -62,7 +62,6 @@ typedef struct cchh cchh_t;
23 typedef struct labeldate labeldate_t;
24 typedef struct volume_label volume_label_t;
25 typedef struct cms_volume_label cms_volume_label_t;
26 -typedef struct ldl_volume_label ldl_volume_label_t;
27 typedef struct extent extent_t;
28 typedef struct dev_const dev_const_t;
29 typedef struct format1_label format1_label_t;
30 @@ -94,6 +93,19 @@ struct __attribute__ ((packed)) labeldate {
35 + * The following structure is a merger of the cdl and ldl volume label.
36 + * On an ldl disk there is no key information, so when reading an
37 + * ldl label from disk, the data should be copied at the address of vollbl.
38 + * On the other side, the field ldl_version is reserved in a cdl record
39 + * and the field formatted_blocks exists only for ldl labels. So when
40 + * reading a cdl label from disk, the formatted_blocks field will contain
42 + * This layout may be a bit awkward, but the advantage of having the
43 + * same label type for both disk layout types is bigger than the effort
44 + * for taking a bit of extra care at the fringes.
47 struct __attribute__ ((packed)) volume_label {
48 char volkey[4]; /* volume key = volume label */
49 char vollbl[4]; /* volume label ("VOL1" in EBCDIC) */
50 @@ -107,15 +119,8 @@ struct __attribute__ ((packed)) volume_label {
51 char labperci[4]; /* no of labels per CI (FBA), blanks for CKD */
52 char res2[4]; /* reserved */
53 char lvtoc[14]; /* owner code for LVTOC */
54 - char res3[29]; /* reserved */
55 - char fudge[4]; /* filler to match length of ldl label */
58 -struct __attribute__ ((packed)) ldl_volume_label {
59 - char vollbl[4]; /* Label identifier ("LNX1" in EBCDIC) */
60 - char volid[6]; /* Volume identifier */
61 - char res3[69]; /* Reserved field */
62 - char ldl_version[1]; /* Version number, valid for ldl format */
63 + char res3[28]; /* reserved */
64 + char ldl_version; /* version number, valid for ldl format */
65 u_int64_t formatted_blocks; /* valid when ldl_version >= "2" (in
68 @@ -335,11 +340,10 @@ void vtoc_write_label (int fd, unsigned long position,
69 format7_label_t const *f7,
70 format9_label_t const *f9);
72 -void vtoc_init_format1_label (char *volid, unsigned int blksize,
73 +void vtoc_init_format1_label (unsigned int blksize,
74 extent_t *part_extent, format1_label_t *f1);
76 void vtoc_init_format4_label (format4_label_t *f4lbl,
77 - unsigned int usable_partitions,
78 unsigned int compat_cylinders,
79 unsigned int real_cylinders,
81 @@ -352,11 +356,11 @@ void vtoc_update_format4_label (format4_label_t *f4, cchhb_t *highest_f1,
83 void vtoc_init_format5_label (format5_label_t *f5);
85 -void vtoc_update_format5_label_add (format5_label_t *f5, int verbose, int cyl,
86 +void vtoc_update_format5_label_add (format5_label_t *f5, int verbose,
87 int trk, u_int16_t a, u_int16_t b,
90 -void vtoc_update_format5_label_del (format5_label_t *f5, int verbose, int cyl,
91 +void vtoc_update_format5_label_del (format5_label_t *f5, int verbose,
92 int trk, u_int16_t a, u_int16_t b,
95 @@ -368,7 +372,7 @@ void vtoc_update_format7_label_add (format7_label_t *f7, int verbose,
96 void vtoc_update_format7_label_del (format7_label_t *f7, int verbose,
97 u_int32_t a, u_int32_t b);
99 -void vtoc_init_format8_label (char *volid, unsigned int blksize,
100 +void vtoc_init_format8_label (unsigned int blksize,
101 extent_t *part_extent, format1_label_t *f1);
103 void vtoc_update_format8_label (cchhb_t *associated_f9, format1_label_t *f8);
104 diff --git a/libparted/labels/dasd.c b/libparted/labels/dasd.c
105 index 4e68512..7594e96 100644
106 --- a/libparted/labels/dasd.c
107 +++ b/libparted/labels/dasd.c
108 @@ -330,13 +330,12 @@ dasd_read (PedDisk* disk)
109 DasdPartitionData* dasd_data;
112 - volume_label_t unused;
113 - ldl_volume_label_t ldl;
114 + volume_label_t ldl;
115 cms_volume_label_t cms;
117 union vollabel *cms_ptr1 = (union vollabel *) anchor.vlabel;
118 cms_volume_label_t *cms_ptr = &cms_ptr1->cms;
119 - ldl_volume_label_t *ldl_ptr = &cms_ptr1->ldl;
120 + volume_label_t *ldl_ptr = &cms_ptr1->ldl;
121 int partition_start_block;
123 disk_specific->format_type = 1;
124 @@ -360,8 +359,7 @@ dasd_read (PedDisk* disk)
125 * (long long) cms_ptr->disk_offset;
128 - if (strncmp(ldl_ptr->ldl_version,
129 - vtoc_ebcdic_enc("2", str, 1), 1) >= 0)
130 + if (ldl_ptr->ldl_version >= 0xf2)
131 end = (long long) arch_specific->real_sector_size
132 / (long long) disk->dev->sector_size
133 * (long long) ldl_ptr->formatted_blocks - 1;
134 diff --git a/libparted/labels/vtoc.c b/libparted/labels/vtoc.c
135 index fdfa94f..d47b791 100644
136 --- a/libparted/labels/vtoc.c
137 +++ b/libparted/labels/vtoc.c
138 @@ -150,7 +150,7 @@ enum failure {
142 -static char buffer[89];
143 +static char buffer[93];
146 vtoc_error (enum failure why, char const *s1, char const *s2)
147 @@ -329,7 +329,7 @@ void
148 vtoc_volume_label_init (volume_label_t *vlabel)
151 - sprintf(buffer, "%88s", " ");
152 + sprintf(buffer, "%92s", " ");
153 vtoc_ebcdic_enc(buffer, buffer, sizeof *vlabel);
154 memcpy(vlabel, buffer, sizeof *vlabel);
156 @@ -348,8 +348,8 @@ vtoc_read_volume_label (int f, unsigned long vlabel_start,
157 typedef union vollabel vollabel_t;
159 union __attribute__((packed)) vollabel {
160 + /* cdl and ldl have the same data struct */
162 - ldl_volume_label_t ldl;
163 cms_volume_label_t cms;
166 @@ -373,9 +373,7 @@ vtoc_read_volume_label (int f, unsigned long vlabel_start,
169 rc = read(f, vlabel, sizeof(volume_label_t));
170 - if (rc != sizeof(volume_label_t) &&
171 - /* For CDL we ask to read 88 bytes, but only get 84 */
172 - rc != sizeof(volume_label_t) - 4) {
173 + if (rc != sizeof(volume_label_t)) {
174 vtoc_error(unable_to_read, "vtoc_read_volume_label",
175 _("Could not read volume label."));
177 @@ -427,10 +425,8 @@ vtoc_write_volume_label (int f, unsigned long vlabel_start,
178 vtoc_error(unable_to_seek, "vtoc_write_volume_label",
179 _("Could not write volume label."));
181 - rc = write(f, vlabel, sizeof(volume_label_t) - 4);
182 - /* Subtract 4 to leave off the "fudge" variable when writing.
183 - We only write CDL volume labels, never LDL or CMS. */
184 - if (rc != sizeof(volume_label_t) - 4)
185 + rc = write(f, vlabel, sizeof(volume_label_t));
186 + if (rc != sizeof(volume_label_t))
187 vtoc_error(unable_to_write, "vtoc_write_volume_label",
188 _("Could not write volume label."));
190 @@ -632,7 +628,7 @@ vtoc_write_label (int f, unsigned long position,
191 * initializes a format4 label
194 -vtoc_init_format4_label (format4_label_t *f4, unsigned int usable_partitions,
195 +vtoc_init_format4_label (format4_label_t *f4,
196 unsigned int compat_cylinders,
197 unsigned int real_cylinders, unsigned int tracks,
198 unsigned int blocks, unsigned int blksize,
199 @@ -740,7 +736,7 @@ vtoc_init_format7_label (format7_label_t *f7)
200 * format1 or format 8 label, all but the field DS1FMTID
203 -vtoc_init_format_1_8_label (char *volid, unsigned int blksize,
204 +vtoc_init_format_1_8_label (unsigned int blksize,
205 extent_t *part_extent, format1_label_t *f1)
208 @@ -794,18 +790,18 @@ vtoc_init_format_1_8_label (char *volid, unsigned int blksize,
212 -vtoc_init_format1_label (char *volid, unsigned int blksize,
213 +vtoc_init_format1_label (unsigned int blksize,
214 extent_t *part_extent, format1_label_t *f1)
216 - vtoc_init_format_1_8_label(volid, blksize, part_extent, f1);
217 + vtoc_init_format_1_8_label(blksize, part_extent, f1);
222 -vtoc_init_format8_label (char *volid, unsigned int blksize,
223 +vtoc_init_format8_label (unsigned int blksize,
224 extent_t *part_extent, format1_label_t *f8)
226 - vtoc_init_format_1_8_label(volid, blksize, part_extent, f8);
227 + vtoc_init_format_1_8_label(blksize, part_extent, f8);
231 @@ -886,7 +882,7 @@ vtoc_reorganize_FMT5_extents (format5_label_t *f5)
232 * add a free space extent description to the VTOC FMT5 DSCB
235 -vtoc_update_format5_label_add (format5_label_t *f5, int verbose, int cyl,
236 +vtoc_update_format5_label_add (format5_label_t *f5, int verbose,
237 int trk, u_int16_t a, u_int16_t b, u_int8_t c)
240 @@ -974,7 +970,7 @@ vtoc_update_format5_label_add (format5_label_t *f5, int verbose, int cyl,
241 * remove a free space extent description from the VTOC FMT5 DSCB
244 -vtoc_update_format5_label_del (format5_label_t *f5, int verbose, int cyl,
245 +vtoc_update_format5_label_del (format5_label_t *f5, int verbose,
246 int trk, u_int16_t a, u_int16_t b, u_int8_t c)
249 @@ -1054,7 +1050,7 @@ vtoc_update_format5_label_del (format5_label_t *f5, int verbose, int cyl,
250 ext->ft = (a - ext->t) % trk;
252 vtoc_update_format5_label_add(f5, verbose,
253 - cyl, trk, x, y, z);
257 puts ("FMT5 del extent: 2 pieces");
258 @@ -1322,9 +1318,9 @@ vtoc_set_freespace(format4_label_t *f4, format5_label_t *f5,
259 z = (u_int8_t) ((stop - start + 1) % trk);
262 - vtoc_update_format5_label_add(f5, verbose, cyl, trk, x, y, z);
263 + vtoc_update_format5_label_add(f5, verbose, trk, x, y, z);
265 - vtoc_update_format5_label_del(f5, verbose, cyl, trk, x, y, z);
266 + vtoc_update_format5_label_del(f5, verbose, trk, x, y, z);
268 puts ("BUG: syntax error in vtoc_set_freespace call");