cvsdist 67c2933
--- util-linux-2.11y/mount/linux_fs.h.skipraid2	2002-10-07 09:08:22.000000000 -0400
cvsdist 67c2933
+++ util-linux-2.11y/mount/linux_fs.h	2003-01-13 14:42:57.000000000 -0500
cvsdist 67c2933
@@ -13,6 +13,12 @@
cvsdist 67c2933
 #endif
cvsdist 67c2933
 #endif
cvsdist 67c2933
 
cvsdist 67c2933
+#include <inttypes.h>
cvsdist 67c2933
+#ifndef BLKGETSIZE64
cvsdist 67c2933
+#include <sys/ioctl.h>
cvsdist 67c2933
+#define BLKGETSIZE64 _IOR(0x12,114,sizeof(uint64_t))
cvsdist 67c2933
+#endif
cvsdist 67c2933
+
cvsdist 67c2933
 #define MINIX_SUPER_MAGIC   0x137F         /* minix v1, 14 char names */
cvsdist 67c2933
 #define MINIX_SUPER_MAGIC2  0x138F         /* minix v1, 30 char names */
cvsdist 67c2933
 #define MINIX2_SUPER_MAGIC  0x2468	   /* minix v2, 14 char names */
cvsdist 67c2933
--- util-linux-2.11y/mount/get_label_uuid.c.skipraid2	2003-01-13 14:44:04.000000000 -0500
cvsdist 67c2933
+++ util-linux-2.11y/mount/get_label_uuid.c	2003-01-13 14:46:34.000000000 -0500
cvsdist 67c2933
@@ -6,6 +6,8 @@
cvsdist 67c2933
 #include <unistd.h>
cvsdist 67c2933
 #include <stdlib.h>
cvsdist 67c2933
 #include <string.h>
cvsdist 67c2933
+#include <endian.h>
cvsdist 67c2933
+#include <sys/stat.h>
cvsdist 67c2933
 
cvsdist 67c2933
 #include "linux_fs.h"
cvsdist 67c2933
 #include "get_label_uuid.h"
cvsdist 67c2933
@@ -19,28 +21,62 @@
cvsdist 67c2933
  *  not on the disks that form the raid array. This test causes a lot of
cvsdist 67c2933
  *  problems when run on my striped promise fasttrak 100 array."
cvsdist 67c2933
  */
cvsdist 67c2933
-static inline int
cvsdist 67c2933
-is_raid_partition(int fd) {
cvsdist 67c2933
-#if 0
cvsdist 67c2933
-	struct mdp_super_block mdsb;
cvsdist 67c2933
-	int n;
cvsdist 67c2933
-
cvsdist 67c2933
-	/* hardcode 4096 here in various places, because that's
cvsdist 67c2933
-	   what it's defined to be.  Note that even if we used
cvsdist 67c2933
-	   the actual kernel headers, sizeof(mdp_super_t) is
cvsdist 67c2933
-	   slightly larger in the 2.2 kernel on 64-bit archs,
cvsdist 67c2933
-	   so using that wouldn't work. */
cvsdist 67c2933
-	lseek(fd, -4096, SEEK_END);	/* Ignore possible error
cvsdist 67c2933
-					   about return value overflow */
cvsdist 67c2933
-	n = 4096;
cvsdist 67c2933
-	if (sizeof(mdsb) < n)
cvsdist 67c2933
-		n = sizeof(mdsb);
cvsdist 67c2933
-	if (read(fd, &mdsb, n) != n)
cvsdist 67c2933
-		return 1;		/* error */
cvsdist 67c2933
-	return (mdsbmagic(mdsb) == MD_SB_MAGIC);
cvsdist 67c2933
+
cvsdist 67c2933
+#if BYTE_ORDER == BIG_ENDIAN
cvsdist 67c2933
+#define INT32_FROM_LE(val)        ((unsigned int) ( \
cvsdist 67c2933
+    (((unsigned int) (val) & (unsigned int) 0x000000ffU) << 24) | \
cvsdist 67c2933
+    (((unsigned int) (val) & (unsigned int) 0x0000ff00U) <<  8) | \
cvsdist 67c2933
+    (((unsigned int) (val) & (unsigned int) 0x00ff0000U) >>  8) | \
cvsdist 67c2933
+    (((unsigned int) (val) & (unsigned int) 0xff000000U) >> 24)))
cvsdist 67c2933
 #else
cvsdist 67c2933
-	return 0;
cvsdist 67c2933
+#define INT32_FROM_LE(val) (val)
cvsdist 67c2933
+#endif
cvsdist 67c2933
+
cvsdist 67c2933
+typedef struct {
cvsdist 67c2933
+	unsigned int md_magic;
cvsdist 67c2933
+} mdp_super_t;
cvsdist 67c2933
+#ifndef MD_SB_MAGIC
cvsdist 67c2933
+#define MD_SB_MAGIC		0xa92b4efc
cvsdist 67c2933
+#endif
cvsdist 67c2933
+#ifndef MD_RESERVED_BYTES
cvsdist 67c2933
+#define MD_RESERVED_BYTES 65536L
cvsdist 67c2933
 #endif
cvsdist 67c2933
+#ifndef MD_NEW_SIZE_BYTES
cvsdist 67c2933
+#define MD_NEW_SIZE_BYTES(x)		((x & ~(MD_RESERVED_BYTES - 1L)) - MD_RESERVED_BYTES)
cvsdist 67c2933
+#endif
cvsdist 67c2933
+
cvsdist 67c2933
+static int
cvsdist 67c2933
+is_raid_partition(int fd)
cvsdist 67c2933
+{
cvsdist 67c2933
+        mdp_super_t mdsb;
cvsdist 67c2933
+        int n;
cvsdist 67c2933
+	struct stat sbuf;
cvsdist 67c2933
+ 	if(fstat(fd, &sbuf))
cvsdist 67c2933
+	  return 2;
cvsdist 67c2933
+	if(!sbuf.st_size) {
cvsdist 67c2933
+		uint64_t bsize64;
cvsdist 67c2933
+		unsigned int bsize32;
cvsdist 67c2933
+		if(!ioctl(fd, BLKGETSIZE64, &bsize64))
cvsdist 67c2933
+			sbuf.st_size = bsize64;
cvsdist 67c2933
+		else if(!ioctl(fd, BLKGETSIZE, &bsize32))
cvsdist 67c2933
+			sbuf.st_size = bsize32;
cvsdist 67c2933
+	}
cvsdist 67c2933
+	if(!sbuf.st_size) return 3;
cvsdist 67c2933
+	/* hardcode 4096 here in various places,
cvsdist 67c2933
+	   because that's what it's defined to be.
cvsdist 67c2933
+	   Note that even if we used the actual kernel headers,
cvsdist 67c2933
+	   sizeof(mdp_super_t) is slightly larger in the 2.2 kernel on 64-bit
cvsdist 67c2933
+	   archs, so using that wouldn't work. */
cvsdist 67c2933
+	lseek(fd, MD_NEW_SIZE_BYTES(sbuf.st_size), SEEK_SET);
cvsdist 67c2933
+	n = 4096; if(sizeof(mdsb) < n) n = sizeof(mdsb);
cvsdist 67c2933
+        if(read(fd, &mdsb, n) != n)
cvsdist 67c2933
+	  return 4; /* error */
cvsdist 67c2933
+	mdsb.md_magic = INT32_FROM_LE(mdsb.md_magic);
cvsdist 67c2933
+	return (mdsb.md_magic == MD_SB_MAGIC); /* If this device has a
cvsdist 67c2933
+						  RAID superblock at
cvsdist 67c2933
+						  the end, it must be
cvsdist 67c2933
+						  part of a RAID
cvsdist 67c2933
+						  array. */
cvsdist 67c2933
 }
cvsdist 67c2933
 
cvsdist 67c2933
 /* for now, only ext2, ext3, xfs, ocfs are supported */