Subject: [PATCH] Support for FreeBSD diskslices
To: 'tech-kern@netbsd.org ' <tech-kern@netbsd.org>
From: Joel Wilsson <joel.wilsson@bredband.com>
List: tech-kern
Date: 07/30/2002 06:27:38
This message is in MIME format. Since your mail reader does not understand
this format, some or all of this message may not be legible.

------_=_NextPart_000_01C23781.6F8FD040
Content-Type: text/plain


I've added support for FreeBSD-style diskslices, so that I can
mount my FreeBSD filesystems without hacking disklabels.

The attached patch does the following:
  Renames DISKMINOR to DISKMAKEMINOR, and adds a new DISKMINOR
    macro that ignores the slice bits in minor(dev). Those bits
    are defined by the macro DISKSLICEMASK.
  Renames MAKEDISKDEV to DISKMAKEDEV, and replaces all calls to
    MAKEDISKDEV with DISKMAKEDEV.
  Renames similar macros, like MAKEWDDEV, to WDMAKEDEV.
  Allocates NMBRPART disklabels for disks instead of just one.
  Changes i386/i386/disksubr.c:mbr_findslice() to support
    requests for specific diskslices.
  Makes i386/i386/disksubr.c:readdisklabel() always read the MBR
    from the raw partition.
  Several changes to the wd driver to make it use the correct
    slice when making I/O, ioctls...
  dev/ata/wd.c:wdopen() uses a new field in struct wd_softc,
    called dl_loaded, to see if the disklabel for the slice has
    been loaded or not. This could be turned into a bitfield,
    but I haven't gotten around to that yet.
  Other changes required to make wd.c care about slices, eg.
    passing a dev_t to wdgetdisklabel()

If the patch (or a better version of it) is accepted, I intend
to make patches for MAKEDEV so that it supports wd1sN[a-p]
devices, but for now you'll have to create them yourself if you
wish to test.
brw-r--r--  1 root  wheel     0,  4104 Jul 25 10:13 /dev/wd1s1a
brw-r--r--  1 root  wheel     0,  4105 Jul 27 08:37 /dev/wd1s1b
brw-r--r--  1 root  wheel     0,  4106 Jul 27 08:37 /dev/wd1s1c
brw-r--r--  1 root  wheel     0,  4107 Jul 27 08:37 /dev/wd1s1d
brw-r--r--  1 root  wheel     0,  8200 Jul 25 10:39 /dev/wd1s2a
brw-r--r--  1 root  wheel     0,  8201 Jul 27 08:33 /dev/wd1s2b
brw-r--r--  1 root  wheel     0,  8202 Jul 27 08:33 /dev/wd1s2c
brw-r--r--  1 root  wheel     0,  8203 Jul 27 08:35 /dev/wd1s2d
brw-r--r--  1 root  wheel     0, 12296 Jul 27 08:46 /dev/wd1s3a
brw-r--r--  1 root  wheel     0, 12297 Jul 27 08:46 /dev/wd1s3b
brw-r--r--  1 root  wheel     0, 12298 Jul 27 08:46 /dev/wd1s3c
brw-r--r--  1 root  wheel     0, 12299 Jul 27 08:46 /dev/wd1s3d

I can't say much more about the stability than that I can mount
my FreeBSD partitions just fine and use them for normal operation.
I haven't tried writing disklabels and such yet.

Please let me know if something like this is desired, and if so,
what changes should be made to my patch to make it acceptable.
Right now it works good enough for me:
/dev/wd0a on / type ffs (local)
/dev/wd0e on /usr type ffs (soft dependencies, local)
/dev/wd0f on /home type ffs (soft dependencies, local)
kernfs on /kern type kernfs (local)
/dev/wd1s3c on /mnt/home type ffs (local)
/dev/wd1s1a on /mnt/root type ffs (local)
/dev/wd1s2e on /mnt/usr type ffs (local)

Cheers,
  joelw

PS. I hope this message gets sent in plain-text, but since I now
    use my home computer for kernelhacking it's not stable enough
    to work as a router, which means it's now behind my brother's
    Windows box, which in turn means I can't run postfix on this
    one because we haven't bothered figuring out portforwarding
    with Sygate. This means I have to use my work email atm, via
    a webmail interface. Apologies if this gets sent as HTML.  DS.


------_=_NextPart_000_01C23781.6F8FD040
Content-Type: application/octet-stream;
	name="slicepatch.diff.gz"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
	filename="slicepatch.diff.gz"

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
pcUkK2fz2GT7X8nlA37oBgEA

------_=_NextPart_000_01C23781.6F8FD040--