diff -rubN linux-2.2.1-orig/drivers/block/genhd.c linux-2.2.1-karel/drivers/block/genhd.c
--- linux-2.2.1-orig/drivers/block/genhd.c	Sat May 15 12:46:49 1999
+++ linux-2.2.1-karel/drivers/block/genhd.c	Fri May 21 16:56:26 1999
@@ -608,7 +608,7 @@
 			add_partition(hd, current_minor, START_SECT(p), NR_SECTS(p));
 		}
 	}
-	printk("\n");
+	printk(" (MSDOS partition table)\n");
 	brelse(bh);
 	return 1;
 }
@@ -685,7 +685,7 @@
 				partition->p_size);
 		current_minor++;
 	}
-	printk("\n");
+	printk(" (OSF partition table)\n");
 	brelse(bh);
 	return 1;
 }
@@ -731,8 +731,11 @@
 	label = (struct sun_disklabel *) bh->b_data;
 	p = label->partitions;
 	if (be16_to_cpu(label->magic) != SUN_LABEL_MAGIC) {
+		/* 
+		 * If it is not a sun disk, keep quiet!
 		printk("Dev %s Sun disklabel: bad magic %04x\n",
 		       kdevname(dev), be16_to_cpu(label->magic));
+		*/
 		brelse(bh);
 		return 0;
 	}
@@ -758,7 +761,7 @@
 			add_partition(hd, current_minor, st_sector, num_sectors);
 		current_minor++;
 	}
-	printk("\n");
+	printk(" (SUN partition table)\n");
 	brelse(bh);
 	return 1;
 }
@@ -832,7 +835,7 @@
 		add_partition(hd, current_minor, start, blocks);
 		current_minor++;
 	}
-	printk("\n");
+	printk(" (AMIGA partition table)\n");
 	brelse(bh);
 	return 1;
 }
@@ -1045,7 +1048,7 @@
 		++current_minor;
 	}
 	brelse(bh);
-	printk("\n");
+	printk(" (MAC partition table)\n");
 	return 1;
 }
 
@@ -1224,7 +1227,7 @@
 					      label->pt_part[i].pi_blkoff,
 					      label->pt_part[i].pi_nblocks);
 		brelse(bh);
-		printk ("\n");
+		printk (" (ULTRIX partition table)\n");
 		return 1;
 	} else {
 		brelse(bh);
@@ -1234,6 +1237,180 @@
 
 #endif /* CONFIG_ULTRIX_PARTITION */
 
+#ifdef CONFIG_NETBSD_PARTITION
+/*
+ * Native NetBSD disklabels, not inside MSDOS partitions.
+ * 
+ * Support addded by Karel van Houten <vhouten@xs4all.nl>
+ * 1999/03/07
+ *
+ *
+ */
+
+#define LABELOFFSET     64                      /* offset of label in sector */
+#define MAXPARTITIONS   8                       /* number of partitions */
+
+#define DISKMAGIC	((u_int32_t)0x82564557)	/* The disk magic number */
+
+#define NOFFSETS 4
+
+static int label_offset[NOFFSETS] = { 0, 64, 128, 516 };
+
+struct netbsd_disklabel {
+	u_int32_t d_magic;		/* the magic number */
+	u_int16_t d_type;		/* drive type */
+	u_int16_t d_subtype;		/* controller/d_type specific */
+	char	  d_typename[16];	/* type name, e.g. "eagle" */
+	union {
+		char	un_d_packname[16];	/* pack identifier */
+		struct {
+			char *un_d_boot0;	/* primary bootstrap name */
+			char *un_d_boot1;	/* secondary bootstrap name */
+		} un_b;
+	} d_un;
+#define d_packname	d_un.un_d_packname
+#define d_boot0		d_un.un_b.un_d_boot0
+#define d_boot1		d_un.un_b.un_d_boot1
+	u_int32_t d_secsize;		/* # of bytes per sector */
+	u_int32_t d_nsectors;		/* # of data sectors per track */
+	u_int32_t d_ntracks;		/* # of tracks per cylinder */
+	u_int32_t d_ncylinders;		/* # of data cylinders per unit */
+	u_int32_t d_secpercyl;		/* # of data sectors per cylinder */
+	u_int32_t d_secperunit;		/* # of data sectors per unit */
+	u_int16_t d_sparespertrack;	/* # of spare sectors per track */
+	u_int16_t d_sparespercyl;	/* # of spare sectors per cylinder */
+	u_int32_t d_acylinders;		/* # of alt. cylinders per unit */
+	u_int16_t d_rpm;		/* rotational speed */
+	u_int16_t d_interleave;		/* hardware sector interleave */
+	u_int16_t d_trackskew;		/* sector 0 skew, per track */
+	u_int16_t d_cylskew;		/* sector 0 skew, per cylinder */
+	u_int32_t d_headswitch;		/* head switch time, usec */
+	u_int32_t d_trkseek;		/* track-to-track seek, usec */
+	u_int32_t d_flags;		/* generic flags */
+#define NDDATA 5
+	u_int32_t d_drivedata[NDDATA];	/* drive-type specific information */
+#define NSPARE 5
+	u_int32_t d_spare[NSPARE];	/* reserved for future use */
+	u_int32_t d_magic2;		/* the magic number (again) */
+	u_int16_t d_checksum;		/* xor of data incl. partitions */
+
+			/* filesystem and partition information: */
+	u_int16_t d_npartitions;	/* number of partitions in following */
+	u_int32_t d_bbsize;		/* size of boot area at sn0, bytes */
+	u_int32_t d_sbsize;		/* max size of fs superblock, bytes */
+	struct	nbsdpartition {		/* the partition table */
+		u_int32_t p_size;	/* number of sectors in partition */
+		u_int32_t p_offset;	/* starting sector */
+		u_int32_t p_fsize;	/* filesystem basic fragment size */
+		u_int8_t p_fstype;	/* filesystem type, see below */
+		u_int8_t p_frag;	/* filesystem fragments per block */
+		union {
+			u_int16_t cpg;	/* UFS: FS cylinders per group */
+			u_int16_t sgs;	/* LFS: FS segment shift */
+		} __partition_u1;
+#define	p_cpg	__partition_u1.cpg
+#define	p_sgs	__partition_u1.sgs
+	} d_partitions[MAXPARTITIONS];	/* actually may be more */
+};
+
+/*
+ * Compute checksum for disk label.
+ */
+static u_int
+BEdkcksum(lp)
+        register struct netbsd_disklabel *lp;
+{
+        register u_short *start, *end;
+        register u_short sum = 0;
+
+        start = (u_short *)lp;
+        end = (u_short *)&lp->d_partitions[be16_to_cpu(lp->d_npartitions)];
+        while (start < end)
+                sum ^= *start++;
+        return (sum);
+}
+
+static u_int
+LEdkcksum(lp)
+        register struct netbsd_disklabel *lp;
+{
+        register u_short *start, *end;
+        register u_short sum = 0;
+
+        start = (u_short *)lp;
+        end = (u_short *)&lp->d_partitions[le16_to_cpu(lp->d_npartitions)];
+        while (start < end)
+                sum ^= *start++;
+        return (sum);
+}
+
+static int netbsd_partition(struct gendisk *hd, kdev_t dev, unsigned long first_sector)
+{
+        int i,j, minor = current_minor;
+        struct buffer_head *bh;
+        struct netbsd_disklabel *label;
+
+
+        bh = bread (dev, 0, get_ptable_blocksize(dev));
+        if (!bh) {
+                printk (" unable to read block %d\n", 0);
+                return -1;
+        }
+
+	/* First try BIG Endian labels */
+	for (j=0; j<NOFFSETS; j++) {
+	    label = (struct netbsd_disklabel *)(bh->b_data + label_offset[j]);
+
+	    if (be32_to_cpu(label->d_magic) == DISKMAGIC &&
+	        be32_to_cpu(label->d_magic2) == DISKMAGIC) {
+		    if (BEdkcksum(label) != 0) {
+			printk("Dev %s NetBSD BE disklabel: bad checksum\n", kdevname(dev));
+
+			/* KvH: Should we retry a different offset? */
+			brelse(bh);
+			return 0;
+		    }
+		    for (i=0; i<8; i++, minor++)
+			if (label->d_partitions[i].p_size)
+			    add_partition(hd, minor,
+				  be32_to_cpu(label->d_partitions[i].p_offset),
+				  be32_to_cpu(label->d_partitions[i].p_size));
+		    printk(" (NETBSD partition table, BE, offset %d)\n", label_offset[j]);
+		    brelse(bh);
+		    return 1;
+	    }
+	}
+	
+	/* Next try LITTLE Endian labels */
+	for (j=0; j<NOFFSETS; j++) {
+	    label = (struct netbsd_disklabel *)(bh->b_data + label_offset[j]);
+
+	    if (le32_to_cpu(label->d_magic) == DISKMAGIC &&
+	        le32_to_cpu(label->d_magic2) == DISKMAGIC) {
+		    if (LEdkcksum(label) != 0) {
+			printk("Dev %s NetBSD LE disklabel: bad checksum\n", kdevname(dev));
+
+			/* KvH: Should we retry a different offset? */
+			brelse(bh);
+			return 0;
+		    }
+		    for (i=0; i<8; i++, minor++)
+			if (label->d_partitions[i].p_size)
+			    add_partition(hd, minor,
+				  le32_to_cpu(label->d_partitions[i].p_offset),
+				  le32_to_cpu(label->d_partitions[i].p_size));
+		    printk(" (NETBSD partition table, LE, offset %d)\n", label_offset[j]);
+		    brelse(bh);
+		    return 1;
+	    }
+	}
+	brelse(bh);
+	return 0;
+}
+
+#endif /* CONFIG_NETBSD_PARTITION */
+
+
 static void check_partition(struct gendisk *hd, kdev_t dev)
 {
 	static int first_time = 1;
@@ -1263,10 +1440,6 @@
 	if (osf_partition(hd, dev, first_sector))
 		return;
 #endif
-#ifdef CONFIG_SUN_PARTITION
-	if(sun_partition(hd, dev, first_sector))
-		return;
-#endif
 #ifdef CONFIG_AMIGA_PARTITION
 	if(amiga_partition(hd, dev, first_sector))
 		return;
@@ -1285,6 +1458,14 @@
 #endif
 #ifdef CONFIG_ULTRIX_PARTITION
 	if(ultrix_partition(hd, dev, first_sector))
+		return;
+#endif
+#ifdef CONFIG_NETBSD_PARTITION
+        if(netbsd_partition(hd, dev, first_sector))
+                return;
+#endif
+#ifdef CONFIG_SUN_PARTITION
+	if(sun_partition(hd, dev, first_sector))
 		return;
 #endif
 	printk(" unknown partition table\n");
diff -rubN linux-2.2.1-orig/fs/Config.in linux-2.2.1-karel/fs/Config.in
--- linux-2.2.1-orig/fs/Config.in	Sat May 15 12:50:07 1999
+++ linux-2.2.1-karel/fs/Config.in	Fri May 21 16:55:37 1999
@@ -119,6 +119,7 @@
 bool 'Solaris (x86) partition table support' CONFIG_SOLARIS_X86_PARTITION
 if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
   bool 'Ultrix partition table support (experimental)' CONFIG_ULTRIX_PARTITION
+  bool 'NetBSD partition table support (experimental)' CONFIG_NETBSD_PARTITION
   bool 'Unixware slices support (EXPERIMENTAL)' CONFIG_UNIXWARE_DISKLABEL
 fi
 
