]> git.pld-linux.org Git - packages/parted.git/blob - 0058-libparted-dasd-unify-vtoc-handling-for-cdl-ldl.patch
- rel 4; tons of patches from FC
[packages/parted.git] / 0058-libparted-dasd-unify-vtoc-handling-for-cdl-ldl.patch
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
5
6 Merge volume label cdl and ldl. It is convenient to manipulate
7 the same structure. Also remove unused arguments in the functions.
8
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>
12 ---
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(-)
17
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 {
31          u_int16_t day;
32  };
33  
34 +/*
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
41 + * arbitrary data.
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.
45 + */
46 +
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       */
56 -};
57 -
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
66                                          EBCDIC)                              */
67  };
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);
71  
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);
75  
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,
80                                unsigned int tracks,
81 @@ -352,11 +356,11 @@ void vtoc_update_format4_label (format4_label_t *f4, cchhb_t *highest_f1,
82  
83  void vtoc_init_format5_label (format5_label_t *f5);
84  
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,
88                                      u_int8_t c);
89  
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,
93                                      u_int8_t c);
94  
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);
98  
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);
102  
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;
110  
111                 union vollabel {
112 -                       volume_label_t unused;
113 -                       ldl_volume_label_t ldl;
114 +                       volume_label_t ldl;
115                         cms_volume_label_t cms;
116                 };
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;
122  
123                 disk_specific->format_type = 1;
124 @@ -360,8 +359,7 @@ dasd_read (PedDisk* disk)
125                                 * (long long) cms_ptr->disk_offset;
126  
127                 if (is_ldl)
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 {
139         unable_to_read
140  };
141  
142 -static char buffer[89];
143 +static char buffer[93];
144  
145  static void
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)
149  {
150         PDEBUG
151 -       sprintf(buffer, "%88s", " ");
152 +       sprintf(buffer, "%92s", " ");
153         vtoc_ebcdic_enc(buffer, buffer, sizeof *vlabel);
154         memcpy(vlabel, buffer, sizeof *vlabel);
155  }
156 @@ -348,8 +348,8 @@ vtoc_read_volume_label (int f, unsigned long vlabel_start,
157         typedef union vollabel vollabel_t;
158  
159         union __attribute__((packed)) vollabel {
160 +               /* cdl and ldl have the same data struct */
161                 volume_label_t cdl;
162 -               ldl_volume_label_t ldl;
163                 cms_volume_label_t cms;
164         };
165  
166 @@ -373,9 +373,7 @@ vtoc_read_volume_label (int f, unsigned long vlabel_start,
167         }
168  
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."));
176                 return 1;
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."));
180  
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."));
189  
190 @@ -632,7 +628,7 @@ vtoc_write_label (int f, unsigned long position,
191   * initializes a format4 label
192   */
193  void
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
201   */
202  void
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)
206  {
207         PDEBUG
208 @@ -794,18 +790,18 @@ vtoc_init_format_1_8_label (char *volid, unsigned int blksize,
209  }
210  
211  void
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)
215  {
216 -       vtoc_init_format_1_8_label(volid, blksize, part_extent, f1);
217 +       vtoc_init_format_1_8_label(blksize, part_extent, f1);
218         f1->DS1FMTID = 0xf1;
219  }
220  
221  void
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)
225  {
226 -       vtoc_init_format_1_8_label(volid, blksize, part_extent, f8);
227 +       vtoc_init_format_1_8_label(blksize, part_extent, f8);
228         f8->DS1FMTID = 0xf8;
229  }
230  
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
233   */
234  void
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)
238  {
239         PDEBUG
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
242   */
243  void
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)
247  {
248         PDEBUG
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;
251  
252                         vtoc_update_format5_label_add(f5, verbose,
253 -                                                     cyl, trk, x, y, z);
254 +                                                     trk, x, y, z);
255  
256                         if (verbose)
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);
260  
261                 if (ch == '+')
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);
264                 else if (ch == '-')
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);
267                 else
268                         puts ("BUG: syntax error in vtoc_set_freespace call");
269  
270 -- 
271 2.9.3
272
This page took 0.116879 seconds and 3 git commands to generate.