Changes by: jkemi
Update of /cvsroot/linux-ntfs/dynamic-disk/linux/fs/partitions
In directory usw-pr-cvs1:/tmp/cvs-serv6801
Modified Files:
ldm.c
Log Message:
ldm_parse_guid(), ldm_parse_hex*(): comments, cleanups.
ldm_validate_tocblocks(), ldm_validate_privheads(): rewritten.
Index: ldm.c
===================================================================
RCS file: /cvsroot/linux-ntfs/dynamic-disk/linux/fs/partitions/ldm.c,v
retrieving revision 1.55
retrieving revision 1.56
diff -U2 -r1.55 -r1.56
--- ldm.c 9 Feb 2002 13:43:05 -0000 1.55
+++ ldm.c 9 Feb 2002 16:39:33 -0000 1.56
@@ -81,73 +81,62 @@
}
#endif
-/**
- * ldm_hex
- */
-static int ldm_hex (u8 ch)
-{
- if (ch >= 'a' && ch <= 'f')
- return ch-'a'+10;
- if (ch >= '0' && ch <= '9')
- return ch-'0';
- if (ch >= 'A' && ch <= 'F')
- return ch-'A'+10;
- return -1;
-}
/**
- * ldm_parse_hex
+ * ldm_parse_hexbyte - Convert a ASCII hex number to a byte
+ * @src: Pointer to at least 2 characters to convert.
+ *
+ * Return: integer in the range [0,255] on success
+ * -1 on error.
*/
-static int ldm_parse_hex (const u8 *data)
+static int ldm_parse_hexbyte (const u8 *src)
{
- int val, ch;
+ unsigned int a, b, c; /* For correct wrapping */
+ int h;
- if (!data)
- return -1;
-
- ch = ldm_hex (data[0]);
- if (ch < 0)
- return -1;
- val = ch << 4;
- ch = ldm_hex (data[1]);
- if (ch < 0)
- return -1;
- val += ch;
+ /* high part */
+ if ((a = src[0] - '0') <= '9'-'0') h = a;
+ else if ((b = src[0] - 'A') <= 'F'-'A') h = b+10;
+ else if ((c = src[0] - 'a') <= 'f'-'a') h = c+10;
+ else return -1;
+ h = h << 4;
- return val;
+ /* low part */
+ if ((a = src[1] - '0') <= '9'-'0') return h | a;
+ else if ((b = src[1] - 'A') <= 'F'-'A') return h | (b+10);
+ else if ((c = src[1] - 'a') <= 'f'-'a') return h | (c+10);
+ return -1;
}
/**
- * ldm_parse_guid
- * 36 char string -> unambiguous binary
- * fa50ff2b-f2e8-45de-83fa-65417f2f49ba
+ * ldm_parse_guid - Convert GUID from ASCII to binary
+ * @src: 36 char string on the form fa50ff2b-f2e8-45de-83fa-65417f2f49ba
+ * @dest: memory block to hold binary GUID (16 bytes)
+ *
* NB not NULL terminated!
+ *
+ * Return: TRUE @dest contains binary GUID
+ * FALSE @dest contents are undefined
*/
-static int ldm_parse_guid (const u8 *data, u8 *buffer)
+static BOOL ldm_parse_guid (const u8 *src, u8 *dest)
{
- static int size[] = { 4, 2, 2, 2, 6 };
- int i, j, val;
+ const int size[] = { 4, 2, 2, 2, 6 };
+ int i, j, v;
- if (!data || !buffer)
- return 0;
-
- if ((data[8] != '-') || (data[13] != '-') ||
- (data[18] != '-') || (data[23] != '-'))
- return 0;
+ if (src[8] != '-' || src[13] != '-' ||
+ src[18] != '-' || src[23] != '-')
+ return FALSE;
for (j = 0; j < 5; j++) {
- for (i = 0; i < size[j]; i++, data+=2, buffer++)
- {
- val = ldm_parse_hex (data);
- if (val < 0)
+ for (i = 0; i < size[j]; i++, src+=2, dest++) {
+ if ((v = ldm_parse_hexbyte(src)) < 0)
return 0;
- *buffer = val;
+ *dest = v;
}
- data++;
+ src++;
}
- return 1;
+ return TRUE;
}
-
/**
* ldm_parse_privhead - Read the LDM Database PRIVHEAD structure
@@ -414,49 +403,33 @@
Sector sect;
u8 *data;
- struct privhead *ph2, *ph3;
- BOOL result = FALSE;
-
- BUG_ON (!bdev || !ph1);
+ struct privhead ph2, ph3;
+ struct privhead *ph[3] = {NULL, &ph2, &ph3};
+ const int off[3] = {OFF_PRIVHEAD1, OFF_PRIVHEAD2, OFF_PRIVHEAD3};
+ int i;
+
+ /* Read and parse ph 2 & 3 */
+ // FIXME can ph 3 fail on odd-sized disks?
+ for (i = 1; i < 3; i++) {
+ int r;
+ if (!(data = read_dev_sector (bdev, base + off[i], §))) {
+ printk (LDM_CRIT "Disk read failed.\n");
+ return FALSE;
+ }
+ r = ldm_parse_privhead(data, ph[i]);
+ put_dev_sector (sect);
- ph2 = (struct privhead*)kmalloc (sizeof (*ph2), GFP_KERNEL);
- ph3 = (struct privhead*)kmalloc (sizeof (*ph3), GFP_KERNEL);
- if (!ph2 || !ph3) {
- printk (LDM_CRIT "Not enough memory for required buffers.\n");
- goto free_mem;
+ if (!r)
+ return FALSE;
}
- /* Read and parse second privhead. */
- data = read_dev_sector (bdev, base + OFF_PRIVHEAD2, §);
- if (!data)
- goto out;
- if (!ldm_parse_privhead (data, ph2))
- goto out;
- put_dev_sector (sect);
-
- /* Read and parse third privhead. */
- //FIXME this /could/ fail on odd-sized disks - might have to ignore errors
- data = read_dev_sector (bdev, base + OFF_PRIVHEAD3, §);
- if (!data)
- goto out;
- if (!ldm_parse_privhead (data, ph3))
- goto out;
-
- if ((!ldm_compare_privheads (ph1, ph2)) ||
- (!ldm_compare_privheads (ph1, ph3))) {
+ /* Compare privheads */
+ if (!ldm_compare_privheads (ph1, ph[1]) ||
+ !ldm_compare_privheads (ph1, ph[2])) {
printk (LDM_CRIT "Primary and backup PRIVHEADs don't match.\n");
- } else {
- ldm_debug ("Validated PRIVHEADs successfully.\n");
- result = TRUE;
+ return FALSE;
}
- /* We _could_ have checked more. */
-out:
- if (data)
- put_dev_sector (sect);
- else
- printk (LDM_CRIT "Disk read failed.\n");
-free_mem:
- kfree (ph2);
- kfree (ph3);
- return result;
+
+ ldm_debug ("Validated PRIVHEADs successfully.\n");
+ return TRUE;
}
@@ -478,56 +451,35 @@
Sector sect;
u8 *data;
- struct tocblock *toc2, *toc3, *toc4;
- BOOL result = FALSE;
-
- BUG_ON (!bdev || !toc1);
-
- toc2 = (struct tocblock*)kmalloc (sizeof (*toc2), GFP_KERNEL);
- toc3 = (struct tocblock*)kmalloc (sizeof (*toc3), GFP_KERNEL);
- toc4 = (struct tocblock*)kmalloc (sizeof (*toc4), GFP_KERNEL);
- if (!toc2 || !toc3 || !toc4) {
- printk (LDM_CRIT "Not enough memory to allocate required "
- "buffers.\n");
- goto free_mem;
- }
+ struct tocblock toc2, toc3, toc4;
+ struct tocblock* tb[4] = {toc1, &toc2, &toc3, &toc4};
+ const int off[4] = {
+ OFF_TOCBLOCK1, OFF_TOCBLOCK2, OFF_TOCBLOCK3, OFF_TOCBLOCK4};
+ int i;
/* Read and parse all four toc's. */
- data = read_dev_sector (bdev, base + OFF_TOCBLOCK1, §);
- if (!data || !ldm_parse_tocblock (data, toc1))
- goto out;
- put_dev_sector (sect);
-
- data = read_dev_sector (bdev, base + OFF_TOCBLOCK2, §);
- if (!data || !ldm_parse_tocblock (data, toc2))
- goto out;
- put_dev_sector (sect);
-
- data = read_dev_sector (bdev, base + OFF_TOCBLOCK3, §);
- if (!data || !ldm_parse_tocblock (data, toc3))
- goto out;
- put_dev_sector (sect);
+ for (i = 0; i < 4; i++)
+ {
+ int r;
+ if (!(data = read_dev_sector (bdev, base + off[i], §))) {
+ printk (LDM_CRIT "Disk read failed.\n");
+ return FALSE;
+ }
+ r = ldm_parse_tocblock (data, tb[i]);
+ put_dev_sector (sect);
- data = read_dev_sector (bdev, base + OFF_TOCBLOCK4, §);
- if (!data || !ldm_parse_tocblock (data, toc4))
- goto out;
+ if (!r)
+ return FALSE;
+ }
- if ((!ldm_compare_tocblocks (toc1, toc2)) || /* Compare all tocs. */
- (!ldm_compare_tocblocks (toc1, toc3)) ||
- (!ldm_compare_tocblocks (toc1, toc4))) {
+ /* Compare all tocs. */
+ if (!ldm_compare_tocblocks (tb[0], tb[1]) ||
+ !ldm_compare_tocblocks (tb[0], tb[2]) ||
+ !ldm_compare_tocblocks (tb[0], tb[3])) {
printk (LDM_CRIT "The TOCBLOCKs don't match.\n");
- } else {
- ldm_debug ("Validated TOCBLOCKs successfully.\n");
- result = TRUE;
+ return FALSE;
}
-out:
- if (data)
- put_dev_sector (sect);
- else
- printk (LDM_CRIT "Disk read failed.\n");
-free_mem:
- kfree (toc2);
- kfree (toc3);
- kfree (toc4);
- return result;
+
+ ldm_debug ("Validated TOCBLOCKs successfully.\n");
+ return TRUE;
}
@@ -1601,4 +1553,2 @@
return err;
}
-
-
|