partitions/ibm: Replace strncpy() and improve readability
[linux-2.6-microblaze.git] / block / partitions / ibm.c
index 49eb0e3..7b0a3f1 100644 (file)
@@ -61,6 +61,43 @@ static sector_t cchhb2blk(struct vtoc_cchhb *ptr, struct hd_geometry *geo)
                ptr->b;
 }
 
+/* Volume Label Types */
+#define DASD_VOLLBL_TYPE_VOL1 0
+#define DASD_VOLLBL_TYPE_LNX1 1
+#define DASD_VOLLBL_TYPE_CMS1 2
+
+struct dasd_vollabel {
+       char *type;
+       int idx;
+};
+
+static struct dasd_vollabel dasd_vollabels[] = {
+       [DASD_VOLLBL_TYPE_VOL1] = {
+               .type = "VOL1",
+               .idx = DASD_VOLLBL_TYPE_VOL1,
+       },
+       [DASD_VOLLBL_TYPE_LNX1] = {
+               .type = "LNX1",
+               .idx = DASD_VOLLBL_TYPE_LNX1,
+       },
+       [DASD_VOLLBL_TYPE_CMS1] = {
+               .type = "CMS1",
+               .idx = DASD_VOLLBL_TYPE_CMS1,
+       },
+};
+
+static int get_label_by_type(const char *type)
+{
+       int i;
+
+       for (i = 0; i < ARRAY_SIZE(dasd_vollabels); i++) {
+               if (!memcmp(type, dasd_vollabels[i].type, 4))
+                       return dasd_vollabels[i].idx;
+       }
+
+       return -1;
+}
+
 static int find_label(struct parsed_partitions *state,
                      dasd_information2_t *info,
                      struct hd_geometry *geo,
@@ -70,12 +107,10 @@ static int find_label(struct parsed_partitions *state,
                      char type[],
                      union label_t *label)
 {
-       Sector sect;
-       unsigned char *data;
        sector_t testsect[3];
-       unsigned char temp[5];
-       int found = 0;
        int i, testcount;
+       Sector sect;
+       void *data;
 
        /* There a three places where we may find a valid label:
         * - on an ECKD disk it's block 2
@@ -103,29 +138,27 @@ static int find_label(struct parsed_partitions *state,
                if (data == NULL)
                        continue;
                memcpy(label, data, sizeof(*label));
-               memcpy(temp, data, 4);
-               temp[4] = 0;
-               EBCASC(temp, 4);
+               memcpy(type, data, 4);
+               EBCASC(type, 4);
                put_dev_sector(sect);
-               if (!strcmp(temp, "VOL1") ||
-                   !strcmp(temp, "LNX1") ||
-                   !strcmp(temp, "CMS1")) {
-                       if (!strcmp(temp, "VOL1")) {
-                               strncpy(type, label->vol.vollbl, 4);
-                               strncpy(name, label->vol.volid, 6);
-                       } else {
-                               strncpy(type, label->lnx.vollbl, 4);
-                               strncpy(name, label->lnx.volid, 6);
-                       }
-                       EBCASC(type, 4);
+               switch (get_label_by_type(type)) {
+               case DASD_VOLLBL_TYPE_VOL1:
+                       memcpy(name, label->vol.volid, 6);
                        EBCASC(name, 6);
                        *labelsect = testsect[i];
-                       found = 1;
+                       return 1;
+               case DASD_VOLLBL_TYPE_LNX1:
+               case DASD_VOLLBL_TYPE_CMS1:
+                       memcpy(name, label->lnx.volid, 6);
+                       EBCASC(name, 6);
+                       *labelsect = testsect[i];
+                       return 1;
+               default:
                        break;
                }
        }
 
-       return found;
+       return 0;
 }
 
 static int find_vol1_partitions(struct parsed_partitions *state,
@@ -328,18 +361,21 @@ int ibm_partition(struct parsed_partitions *state)
                info = NULL;
        }
 
-       if (find_label(state, info, geo, blocksize, &labelsect, name, type,
-                      label)) {
-               if (!strncmp(type, "VOL1", 4)) {
+       if (find_label(state, info, geo, blocksize, &labelsect, name, type, label)) {
+               switch (get_label_by_type(type)) {
+               case DASD_VOLLBL_TYPE_VOL1:
                        res = find_vol1_partitions(state, geo, blocksize, name,
                                                   label);
-               } else if (!strncmp(type, "LNX1", 4)) {
+                       break;
+               case DASD_VOLLBL_TYPE_LNX1:
                        res = find_lnx1_partitions(state, geo, blocksize, name,
                                                   label, labelsect, nr_sectors,
                                                   info);
-               } else if (!strncmp(type, "CMS1", 4)) {
+                       break;
+               case DASD_VOLLBL_TYPE_CMS1:
                        res = find_cms1_partitions(state, geo, blocksize, name,
                                                   label, labelsect);
+                       break;
                }
        } else if (info) {
                /*