aboutsummaryrefslogtreecommitdiffstats
path: root/fs/partitions/msdos.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/partitions/msdos.c')
-rw-r--r--fs/partitions/msdos.c22
1 files changed, 16 insertions, 6 deletions
diff --git a/fs/partitions/msdos.c b/fs/partitions/msdos.c
index 8c7af1777819..4ccec4cd1367 100644
--- a/fs/partitions/msdos.c
+++ b/fs/partitions/msdos.c
@@ -63,15 +63,25 @@ msdos_magic_present(unsigned char *p)
63#define AIX_LABEL_MAGIC4 0xC1 63#define AIX_LABEL_MAGIC4 0xC1
64static int aix_magic_present(unsigned char *p, struct block_device *bdev) 64static int aix_magic_present(unsigned char *p, struct block_device *bdev)
65{ 65{
66 struct partition *pt = (struct partition *) (p + 0x1be);
66 Sector sect; 67 Sector sect;
67 unsigned char *d; 68 unsigned char *d;
68 int ret = 0; 69 int slot, ret = 0;
69 70
70 if (p[0] != AIX_LABEL_MAGIC1 && 71 if (!(p[0] == AIX_LABEL_MAGIC1 &&
71 p[1] != AIX_LABEL_MAGIC2 && 72 p[1] == AIX_LABEL_MAGIC2 &&
72 p[2] != AIX_LABEL_MAGIC3 && 73 p[2] == AIX_LABEL_MAGIC3 &&
73 p[3] != AIX_LABEL_MAGIC4) 74 p[3] == AIX_LABEL_MAGIC4))
74 return 0; 75 return 0;
76 /* Assume the partition table is valid if Linux partitions exists */
77 for (slot = 1; slot <= 4; slot++, pt++) {
78 if (pt->sys_ind == LINUX_SWAP_PARTITION ||
79 pt->sys_ind == LINUX_RAID_PARTITION ||
80 pt->sys_ind == LINUX_DATA_PARTITION ||
81 pt->sys_ind == LINUX_LVM_PARTITION ||
82 is_extended_partition(pt))
83 return 0;
84 }
75 d = read_dev_sector(bdev, 7, &sect); 85 d = read_dev_sector(bdev, 7, &sect);
76 if (d) { 86 if (d) {
77 if (d[0] == '_' && d[1] == 'L' && d[2] == 'V' && d[3] == 'M') 87 if (d[0] == '_' && d[1] == 'L' && d[2] == 'V' && d[3] == 'M')
@@ -155,7 +165,7 @@ parse_extended(struct parsed_partitions *state, struct block_device *bdev,
155 165
156 put_partition(state, state->next, next, size); 166 put_partition(state, state->next, next, size);
157 if (SYS_IND(p) == LINUX_RAID_PARTITION) 167 if (SYS_IND(p) == LINUX_RAID_PARTITION)
158 state->parts[state->next].flags = 1; 168 state->parts[state->next].flags = ADDPART_FLAG_RAID;
159 loopct = 0; 169 loopct = 0;
160 if (++state->next == state->limit) 170 if (++state->next == state->limit)
161 goto done; 171 goto done;