Skip to contentSkip to conversation

2.6.19 cannot find root partition

PATCH New Anton Blanchard 3 participants 6 messages Dec 6, 2006 – Jan 4, 2007

lore
Share & tools
lore
#0 lore raw

Hi,

The patch to identify AIX disks and ignore them has caused at least one machine to fail to find the root partition on 2.6.19. The patch is:

http://lkml.org/lkml/2006/7/31/117

The problem is some disk formatters do not blow away the first 4 bytes of the disk. If the disk we are installing to used to have AIX on it, then the first 4 bytes will still have IBMA in EBCDIC.

The install in question was debian etch. Im not sure what the best fix is, perhaps the AIX detection code could check more than the first 4 bytes.

Anton

#1 lore raw
Quoted 3 lines · Anton Blanchard

The install in question was debian etch. Im not sure what the best fix is, perhaps the AIX detection code could check more than the first 4 bytes.

Can you send me a dump of the first block?

#2 lore raw
In reply to Anton Blanchard
Quoted 8 lines · Anton Blanchard

Hi,

The patch to identify AIX disks and ignore them has caused at least one machine to fail to find the root partition on 2.6.19. The patch is:

http://lkml.org/lkml/2006/7/31/117

Quoted 7 lines

The problem is some disk formatters do not blow away the first 4 bytes of the disk. If the disk we are installing to used to have AIX on it, then the first 4 bytes will still have IBMA in EBCDIC.

The install in question was debian etch. Im not sure what the best fix is, perhaps the AIX detection code could check more than the first 4 bytes.

Yeah, I had this problem on paulus' old PReP machine - I had to manually zap the AIX magic number to get it to see the perfectly good partitions.

Signature · 4 lines
David Gibson			| I'll have my music baroque, and my code
david AT gibson.dropbear.id.au	| minimalist, thank you.  NOT _the_ _other_
				| _way_ _around_!
http://www.ozlabs.org/~dgibson
#3 lore raw
Quoted 3 lines · David Gibson

Yeah, I had this problem on paulus' old PReP machine - I had to manually zap the AIX magic number to get it to see the perfectly good partitions.

Something like this in aix_label_present should do it, beside echo > /dev/sda

        struct partition *pt = (struct partition *) (p + 0x1be);
        int slot;
        for (slot = 1; slot <= 4; slot++, pt++) {
                if (pt->sys_ind == LINUX_SWAP_PARTITION ||
                        pt->sys_ind == LINUX_RAID_PARTITION ||
                        pt->sys_ind == 0x83 ||
                        pt->sys_ind == 0x8e ||
                        is_extended_partition(pt))
                        return 0;
        }                                                                                                                                                            
#4 lore raw

PATCH 1/1 relax check for AIX in msdos partition table

In reply to David Gibson
Quoted 11 lines · David Gibson
Quoted 9 lines · Anton Blanchard

The patch to identify AIX disks and ignore them has caused at least one machine to fail to find the root partition on 2.6.19. The patch is:

http://lkml.org/lkml/2006/7/31/117

The problem is some disk formatters do not blow away the first 4 bytes of the disk. If the disk we are installing to used to have AIX on it, then the first 4 bytes will still have IBMA in EBCDIC.

Quoted 7 lines
Quoted 3 lines

The install in question was debian etch. Im not sure what the best fix is, perhaps the AIX detection code could check more than the first 4 bytes.

Yeah, I had this problem on paulus' old PReP machine - I had to manually zap the AIX magic number to get it to see the perfectly good partitions.

What pre-historic fdisk was used to create the partition table? At least the current version of fdisk does not let me manipulate the existing partition table before I remove the AIX marker. The patch below should fix it. Partition table entries 2,3,4 from an AIX 4.3 install have type 0x41.

Also, the whole partition info for primary partitions is in this block:

  dd if=/dev/sdb count=$(( 4 * 16 )) bs=1 skip=$(( 0x1be ))

All other data do not matter, beside the 0x55aa marker at the end of the first block.

---
 fs/partitions/msdos.c |   12 +++++++++++-
 include/linux/genhd.h |    2 ++
 2 files changed, 13 insertions(+), 1 deletion(-)
fs/partitions/msdos.c +11 -1
Index: linux-2.6/fs/partitions/msdos.c
===================================================================
@@ -63,15 +63,25 @@ msdos_magic_present(unsigned char *p)
 #define AIX_LABEL_MAGIC4	0xC1
 static int aix_magic_present(unsigned char *p, struct block_device *bdev)
 {
+	struct partition *pt = (struct partition *) (p + 0x1be);
 	Sector sect;
 	unsigned char *d;
-	int ret = 0;
+	int slot, ret = 0;
 
 	if (p[0] != AIX_LABEL_MAGIC1 &&
 		p[1] != AIX_LABEL_MAGIC2 &&
 		p[2] != AIX_LABEL_MAGIC3 &&
 		p[3] != AIX_LABEL_MAGIC4)
 		return 0;
+	/* Assume the partition table is valid if Linux partitions exists */
+	for (slot = 1; slot <= 4; slot++, pt++) {
+		if (pt->sys_ind == LINUX_SWAP_PARTITION ||
+			pt->sys_ind == LINUX_RAID_PARTITION ||
+			pt->sys_ind == LINUX_DATA_PARTITION ||
+			pt->sys_ind == LINUX_LVM_PARTITION ||
+			is_extended_partition(pt))
+			return 0;
+	}
 	d = read_dev_sector(bdev, 7, &sect);
 	if (d) {
 		if (d[0] == '_' && d[1] == 'L' && d[2] == 'V' && d[3] == 'M')
include/linux/genhd.h +2 -0
Index: linux-2.6/include/linux/genhd.h
===================================================================
@@ -21,6 +21,8 @@ enum {
 	WIN98_EXTENDED_PARTITION = 0x0f,
 
 	LINUX_SWAP_PARTITION = 0x82,
+	LINUX_DATA_PARTITION = 0x83,
+	LINUX_LVM_PARTITION = 0x8e,
 	LINUX_RAID_PARTITION = 0xfd,	/* autodetect RAID partition */
 
 	SOLARIS_X86_PARTITION =	LINUX_SWAP_PARTITION,
#5 lore raw

PATCH 1/1 fix logic error in AIX detection

Correct the AIX magic check to let 'echo > /dev/sdb' actually work.

---
 fs/partitions/msdos.c |    8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)
fs/partitions/msdos.c +4 -4
Index: linux-2.6.20-rc3/fs/partitions/msdos.c
===================================================================
@@ -68,10 +68,10 @@ static int aix_magic_present(unsigned ch
 	unsigned char *d;
 	int slot, ret = 0;
 
-	if (p[0] != AIX_LABEL_MAGIC1 &&
-		p[1] != AIX_LABEL_MAGIC2 &&
-		p[2] != AIX_LABEL_MAGIC3 &&
-		p[3] != AIX_LABEL_MAGIC4)
+	if (!(p[0] == AIX_LABEL_MAGIC1 &&
+		p[1] == AIX_LABEL_MAGIC2 &&
+		p[2] == AIX_LABEL_MAGIC3 &&
+		p[3] == AIX_LABEL_MAGIC4))
 		return 0;
 	/* Assume the partition table is valid if Linux partitions exists */
 	for (slot = 1; slot <= 4; slot++, pt++) {