aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/partitions/msdos.c31
1 files changed, 31 insertions, 0 deletions
diff --git a/fs/partitions/msdos.c b/fs/partitions/msdos.c
index 8f12587c3129..4f8df71e49d3 100644
--- a/fs/partitions/msdos.c
+++ b/fs/partitions/msdos.c
@@ -58,6 +58,31 @@ msdos_magic_present(unsigned char *p)
58 return (p[0] == MSDOS_LABEL_MAGIC1 && p[1] == MSDOS_LABEL_MAGIC2); 58 return (p[0] == MSDOS_LABEL_MAGIC1 && p[1] == MSDOS_LABEL_MAGIC2);
59} 59}
60 60
61/* Value is EBCDIC 'IBMA' */
62#define AIX_LABEL_MAGIC1 0xC9
63#define AIX_LABEL_MAGIC2 0xC2
64#define AIX_LABEL_MAGIC3 0xD4
65#define AIX_LABEL_MAGIC4 0xC1
66static int aix_magic_present(unsigned char *p, struct block_device *bdev)
67{
68 Sector sect;
69 unsigned char *d;
70 int ret = 0;
71
72 if (p[0] != AIX_LABEL_MAGIC1 &&
73 p[1] != AIX_LABEL_MAGIC2 &&
74 p[2] != AIX_LABEL_MAGIC3 &&
75 p[3] != AIX_LABEL_MAGIC4)
76 return 0;
77 d = read_dev_sector(bdev, 7, &sect);
78 if (d) {
79 if (d[0] == '_' && d[1] == 'L' && d[2] == 'V' && d[3] == 'M')
80 ret = 1;
81 put_dev_sector(sect);
82 };
83 return ret;
84}
85
61/* 86/*
62 * Create devices for each logical partition in an extended partition. 87 * Create devices for each logical partition in an extended partition.
63 * The logical partitions form a linked list, with each entry being 88 * The logical partitions form a linked list, with each entry being
@@ -393,6 +418,12 @@ int msdos_partition(struct parsed_partitions *state, struct block_device *bdev)
393 return 0; 418 return 0;
394 } 419 }
395 420
421 if (aix_magic_present(data, bdev)) {
422 put_dev_sector(sect);
423 printk( " [AIX]");
424 return 0;
425 }
426
396 /* 427 /*
397 * Now that the 55aa signature is present, this is probably 428 * Now that the 55aa signature is present, this is probably
398 * either the boot sector of a FAT filesystem or a DOS-type 429 * either the boot sector of a FAT filesystem or a DOS-type