Hello Colin,

got a bit more time for debugging...
Short: it reads the right device but returns data from the wrong device.
Long: ... read on :)

I modified ext2.c to read some more blocks around the ext2 superblock to
see what's going on (and enough blocks to make sure some of them are not
cached yet :)).
Attached grub2-ext2-debug.patch not for inclusion but for information to
show what I did and where the outputs later come from. This is a cleaned
up version of the one where my previous snippets came from, don't try to
match the debug output from my previous comment against this code.

# strace -o grub-probe.strace grub2-1.98+20100722/build/grub-pc/grub-probe -vv 
--device-map=/boot/grub/device.map --target=fs --device /dev/md0 
>grub-probe.out 2>grub-probe.err
# nl grub-probe.strace > grub-probe.strace.nl

Here is a grub-probe.out snippet:
...
kern/fs.c:54: Detecting nilfs2...
kern/emu/hostdisk.c:582: reusing open device `/dev/sda2'
kern/fs.c:60: nilfs2 detection failed.
kern/fs.c:54: Detecting minix...
kern/fs.c:60: minix detection failed.
kern/fs.c:54: Detecting jfs...
kern/emu/hostdisk.c:582: reusing open device `/dev/sda2'
kern/emu/hostdisk.c:582: reusing open device `/dev/sda2'
kern/fs.c:60: jfs detection failed.
kern/fs.c:54: Detecting udf...
kern/fs.c:60: udf detection failed.
kern/fs.c:54: Detecting iso9660...
kern/fs.c:60: iso9660 detection failed.
kern/fs.c:54: Detecting hfsplus...
kern/fs.c:60: hfsplus detection failed.
kern/fs.c:54: Detecting hfs...
kern/fs.c:60: hfs detection failed.
kern/fs.c:54: Detecting ext2...
fs/ext2.c:548: grub_disk_read(md0, 1 * 2, 0, 336, &data->sblock)
fs/ext2.c:555: grub_disk_read(md0, 0, 0, 51200, buf)
kern/emu/hostdisk.c:582: reusing open device `/dev/sda2'
kern/emu/hostdisk.c:582: reusing open device `/dev/sda2'
kern/emu/hostdisk.c:582: reusing open device `/dev/sda2'
kern/emu/hostdisk.c:582: reusing open device `/dev/sda2'
kern/emu/hostdisk.c:582: reusing open device `/dev/sda2'
kern/emu/hostdisk.c:582: reusing open device `/dev/sda2'
kern/emu/hostdisk.c:582: reusing open device `/dev/sda2'
kern/emu/hostdisk.c:582: reusing open device `/dev/sda2'
kern/emu/hostdisk.c:582: reusing open device `/dev/sda2'
fs/ext2.c:573: 00000000  4c 55 4b 53 xx xx 00 xx  61 65 73 00 00 00 00 00  
|LUKS**..aes.....|
fs/ext2.c:573: 00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  
|................|
fs/ext2.c:573: 00000020  00 00 00 00 00 00 00 00  78 74 73 2d 70 6c 61 69  
|........xts-plai|
fs/ext2.c:573: 00000030  6e 36 34 00 00 00 00 00  00 00 00 00 00 00 00 00  
|n64.............|
fs/ext2.c:573: 00000040  00 00 00 00 00 00 00 00  73 68 61 32 35 36 00 00  
|........sha256..|
fs/ext2.c:573: 00000050  xx xx xx xx xx xx xx xx  xx xx xx xx xx xx xx xx  
|****************|
fs/ext2.c:573: 00000060  xx xx xx xx xx xx xx xx  xx xx xx xx xx xx xx xx  
|****************|
fs/ext2.c:573: 00000070  xx xx xx xx xx xx xx xx  xx xx xx xx xx xx xx xx  
|****************|
fs/ext2.c:573: 00000080  xx xx xx xx xx xx xx xx  xx xx xx xx xx xx xx xx  
|****************|
fs/ext2.c:573: 00000090  xx xx xx xx xx xx xx xx  xx xx xx xx xx xx xx xx  
|****************|
fs/ext2.c:573: 000000a0  xx xx xx xx xx xx xx xx  66 63 31 37 39 39 37 35  
|********fc179975|
fs/ext2.c:573: 000000b0  2d 64 35 33 32 2d 34 62  66 66 2d 39 39 32 61 2d  
|-d532-4bff-992a-|
fs/ext2.c:573: 000000c0  64 33 31 34 35 34 33 32  38 66 36 64 00 00 00 00  
|d31454328f6d....|
...

Excuse me that I don't like to disclose the whole LUKS header.
Note that /dev/md0, i.e. /dev/sda2 is no LUKS device but an ext2 fs.

I found instead of reading /dev/sda2 as member of /dev/md0 as it claims
it appears to read /dev/sdf which is a member of /dev/md74.
But strace.out shows it doesn't really: here is a grub-probe.strace.nl
snippet:
...
   580  open("/dev/sda2", O_RDONLY|O_SYNC|O_LARGEFILE) = 10
...
  1651  open("/dev/sdf", O_RDONLY|O_LARGEFILE)  = 23
  1652  fstat64(23, {st_mode=S_IFBLK|0660, st_rdev=makedev(8, 80), ...}) = 0
  1653  ioctl(23, BLKGETSIZE64, 0xbfd4e0b8)     = 0
  1654  close(23)                               = 0
...
  1714  read(10, ..., 4096) = 4096
  1715  _llseek(10, 51200, [51200], SEEK_SET)   = 0
  1716  read(10, ..., 4096) = 4096
  1717  write(1, "da2'\nkern/fs.c:60: nilfs2 detect"..., 4096) = 4096
  1718  write(1, " 00 00 00 00 00  00 00 xx xx 00 "..., 4096) = 4096
  1719  write(1, ".....|\nfs/ext2.c:573: 000004a0  "..., 4096) = 4096

From line 1716 I searched backwards for " = 10$" and found line 580 as
first hit. Also from line 1716 I searched backwards for sdf and found
line 1651 as first hit.

It seems like grub_disk_read() really reads /dev/sda2 as it claims but
does return data from /dev/sdf ... looks like grub's internal cache is
somewhat out of sync.

For completeness I also attached /proc/mdstat, /etc/fstab, and
/proc/mounts. This still requires a map from raid- to crypto-devices,
here is it:
/dev/md1        /dev/dm-0       (/dev/mapper/md1)
/dev/md2        /dev/dm-1       (/dev/mapper/md2)
/dev/md3        /dev/dm-2       (/dev/mapper/md3)
/dev/md4        /dev/dm-3       (/dev/mapper/md4)
/dev/md5        /dev/dm-4       (/dev/mapper/md5)
/dev/md6        /dev/dm-5       (/dev/mapper/md6)
/dev/md71       /dev/dm-6       (/dev/mapper/md71)
/dev/md72       /dev/dm-7       (/dev/mapper/md72)
/dev/md73       /dev/dm-8       (/dev/mapper/md73)
/dev/md74       /dev/dm-9       (/dev/mapper/md74)
/dev/md8        /dev/dm-10      (/dev/mapper/md8)


regards
   Mario
-- 
The social dynamics of the net are a direct consequence of the fact that
nobody has yet developed a Remote Strangulation Protocol.  -- Larry Wall
--- grub2-1.98+20100722.orig/fs/ext2.c	2010-06-03 01:13:14.000000000 +0200
+++ grub2-1.98+20100722/fs/ext2.c	2010-07-28 14:18:11.676076695 +0200
@@ -536,17 +536,43 @@
 grub_ext2_mount (grub_disk_t disk)
 {
   struct grub_ext2_data *data;
+	unsigned char buf[100 * 512];
+	unsigned i;
 
   data = grub_malloc (sizeof (struct grub_ext2_data));
   if (!data)
     return 0;
 
   /* Read the superblock.  */
+	grub_dprintf("ext2", "grub_disk_read(%s, 1 * 2, 0, %u, &data->sblock)\n",
+			disk->name, sizeof(struct grub_ext2_sblock));
   grub_disk_read (disk, 1 * 2, 0, sizeof (struct grub_ext2_sblock),
                   &data->sblock);
   if (grub_errno)
     goto fail;
 
+	grub_dprintf("ext2", "grub_disk_read(%s, 0, 0, %u, buf)\n",
+			disk->name, sizeof(buf));
+	grub_disk_read(disk, 0, 0, sizeof(buf), buf);
+	if (grub_errno) goto fail;
+	for(i = 0; i < sizeof(buf); i += 16) {
+		unsigned u[16];
+		unsigned c[16];
+		int j;
+		for(j = 0; j < 16; ++j) {
+			u[j] = buf[i + j];
+			c[j] = buf[i + j];
+			if(c[j] < 0x20 || (c[j] > 0x7e && c[j] < 0xa1)) c[j] = '.';
+		}
+		grub_dprintf ("ext2", "%08x  %02x %02x %02x %02x %02x %02x %02x %02x "
+				" %02x %02x %02x %02x %02x %02x %02x %02x "
+				" |%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c|\n", i,
+				u[0], u[1], u[2], u[3], u[4], u[5], u[6], u[7],
+				u[8], u[9], u[10], u[11], u[12], u[13], u[14], u[15],
+				c[0], c[1], c[2], c[3], c[4], c[5], c[6], c[7],
+				c[8], c[9], c[10], c[11], c[12], c[13], c[14], c[15]);
+	}
+
   /* Make sure this is an ext2 filesystem.  */
   if (grub_le_to_cpu16 (data->sblock.magic) != EXT2_MAGIC)
     {
Personalities : [raid1] [raid0] 
md7 : active raid0 dm-6[0] dm-9[3] dm-8[2] dm-7[1]
      5860549632 blocks super 1.2 256k chunks
      
md8 : active raid1 sdb9[0]
      1465127865 blocks super 1.2 [2/1] [U_]
      bitmap: 14/22 pages [56KB], 32768KB chunk

md74 : active raid1 sdf[0]
      1465138448 blocks super 1.2 [2/1] [U_]
      bitmap: 22/22 pages [88KB], 32768KB chunk

md73 : active raid1 sde[0]
      1465138448 blocks super 1.2 [2/1] [U_]
      bitmap: 22/22 pages [88KB], 32768KB chunk

md72 : active raid1 sdd[0]
      1465138448 blocks super 1.2 [2/1] [U_]
      bitmap: 22/22 pages [88KB], 32768KB chunk

md71 : active raid1 sdc[0]
      1465138448 blocks super 1.2 [2/1] [U_]
      bitmap: 22/22 pages [88KB], 32768KB chunk

md6 : active (auto-read-only) raid1 sda8[0] sdb8[1]
      58596992 blocks [3/2] [UU_]
      bitmap: 14/14 pages [56KB], 2048KB chunk

md5 : active raid1 sda7[0] sdb7[1]
      312830976 blocks [3/2] [UU_]
      bitmap: 18/19 pages [72KB], 8192KB chunk

md4 : active raid1 sda6[0] sdb6[1]
      78132032 blocks [3/2] [UU_]
      bitmap: 19/19 pages [76KB], 2048KB chunk

md3 : active raid1 sda5[0] sdb5[1]
      29302464 blocks [3/2] [UU_]
      bitmap: 14/14 pages [56KB], 1024KB chunk

md2 : active (auto-read-only) raid1 sda4[0] sdb4[1]
      8302912 blocks [3/2] [UU_]
      
md1 : active raid1 sda3[0] sdb3[1]
      979840 blocks [3/2] [UU_]
      
md0 : active raid1 sda2[0] sdb2[1]
      240832 blocks [3/2] [UU_]
      
unused devices: <none>
# /etc/fstab: static file system information.
#
# type ext3,ext2 vs. auto: if kernel has no ext3 support,
# type auto fails, since mount detects it as ext3 and
# does not try to mount it as ext2, if ext3 isnt there:
#       # mount -t auto -o loop foo /mnt
#       mount: fs type ext3 not supported by kernel
#       # mount -t ext3,ext2 -o loop foo /mnt
#       # mount | grep foo
#       /root/foo on /mnt type ext2 (rw,loop=/dev/loop0)
#       #
#
# <file system> <mount point>   <type>  <options>                  <dump> <pass>
/dev/mapper/md1 /               ext2    defaults,errors=remount-ro      0 1
/dev/mapper/md2 none            swap    sw                              0 0
tmpfs           /tmp            tmpfs   nosuid,nodev                    0 0
/dev/md0        /boot           ext2    defaults,nosuid,nodev,noexec    0 2
/dev/mapper/md3 /usr            ext3    defaults,nodev                  0 3
/dev/mapper/md4 /var            ext3    defaults,nosuid,nodev,user_xattr        
0 3
/dev/mapper/md5 /home           ext3    defaults,nosuid,nodev           0 3
/dev/mapper/md6 /mnt            ext2    defaults,noexec,nosuid,nodev,noauto     
0 4
/dev/md7        /home/ftp/pub   xfs     defaults,ro,nosuid,nodev,largeio,attr2  
0 0
/dev/mapper/md8 /home/holbe/downloads   xfs     defaults,nosuid,nodev,attr2     
0 0
/dev/cdrom      /media/cdrom0   udf,iso9660,auto        ro,user,noauto          
0 0
/dev/fd0        /media/floppy0  auto    user,noatime,noauto             0 0
/dev/stick0     /media/stick0   auto    user,noatime,noauto             0 0
/dev/stick1     /media/stick1   auto    user,noatime,noauto             0 0
/dev/stick2     /media/stick2   auto    user,noatime,noauto             0 0
/dev/stick3     /media/stick3   auto    user,noatime,noauto             0 0
/dev/stick4     /media/stick4   auto    user,noatime,noauto             0 0
/dev/stick5     /media/stick5   auto    user,noatime,noauto             0 0
/dev/stick6     /media/stick6   auto    user,noatime,noauto             0 0
/dev/stick7     /media/stick7   auto    user,noatime,noauto             0 0
/dev/stick8     /media/stick8   auto    user,noatime,noauto             0 0
/dev/stick9     /media/stick9   auto    user,noatime,noauto             0 0
rootfs / rootfs rw 0 0
none /sys sysfs rw,nosuid,nodev,noexec,relatime 0 0
none /proc proc rw,nosuid,nodev,noexec,relatime 0 0
none /dev devtmpfs rw,relatime,size=4144368k,nr_inodes=205047,mode=755 0 0
none /dev/pts devpts rw,nosuid,noexec,relatime,mode=600,ptmxmode=000 0 0
/dev/mapper/md1 / ext2 rw,relatime 0 0
tmpfs /lib/init/rw tmpfs rw,nosuid,relatime,mode=755 0 0
tmpfs /dev/shm tmpfs rw,nosuid,nodev,relatime 0 0
tmpfs /tmp tmpfs rw,nosuid,nodev,relatime 0 0
/dev/md0 /boot ext2 rw,nosuid,nodev,noexec,relatime 0 0
/dev/dm-2 /usr ext3 rw,nodev,relatime,barrier=0,data=ordered 0 0
/dev/dm-3 /var ext3 rw,nosuid,nodev,relatime,user_xattr,barrier=0,data=ordered 
0 0
/dev/dm-4 /home ext3 rw,nosuid,nodev,relatime,barrier=0,data=ordered 0 0
/dev/md7 /home/ftp/pub xfs 
ro,nosuid,nodev,relatime,attr2,largeio,logbsize=256k,sunit=512,swidth=2048,noquota
 0 0
/dev/dm-10 /home/holbe/downloads xfs rw,nosuid,nodev,relatime,attr2,noquota 0 0
debugfs /sys/kernel/debug debugfs rw,relatime 0 0
fusectl /sys/fs/fuse/connections fusectl rw,relatime 0 0
binfmt_misc /proc/sys/fs/binfmt_misc binfmt_misc 
rw,nosuid,nodev,noexec,relatime 0 0
cgroup /var/run/cgroups/cpu cgroup rw,relatime,cpu 0 0
cgroup /var/run/cgroups/cpuacct cgroup rw,relatime,cpuacct 0 0
cgroup /var/run/cgroups/devices cgroup rw,relatime,devices 0 0

Attachment: signature.asc
Description: Digital signature

Reply via email to