Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 21 Apr 1997 14:15:22 -0700 (MST)
From:      Terry Lambert <terry@lambert.org>
To:        joerg_wunsch@uriah.heep.sax.de
Cc:        freebsd-hackers@freebsd.org
Subject:   Re: disklabel -- owner?
Message-ID:  <199704212115.OAA23175@phaeton.artisoft.com>
In-Reply-To: <19970421203928.LG60164@uriah.heep.sax.de> from "J Wunsch" at Apr 21, 97 08:39:28 pm

next in thread | previous in thread | raw e-mail | index | archive | help
> > One problem, I think, is with device organization: I think it's
> > idiotic to have 'c' and 'd' used the way they are; one can be
> 
> Hmm, but that's not FreeBSD you're talking about, is it?  The
> magicness of the `d' partition went away with the slice code in
> 2.0.5R.
> 
> The magicness of the `c' partition simply solves the chicken-and-egg
> problem for an unlabelled disk.  I agree that it doesn't necessarily
> need to be a pseudo-partition, but either way, you'll end up with
> basically the same as there is now (since you need a minor number for
> it anyway), so why change the traditional method?  POLA.


You don't need a minor number for it at all, *if* you reexport devices
based on the fan-out from a DOS partition table.

For instance, say I have a /dev/wd0; if it has DOS partitions, then
I get /dev/wd0a, /dev/wd0b, /dev/wd0c, and /dev/wd0d, one for each
partition.

I'd prefer this be hierarchical, actually, but that's negotiable...
it's going to be hierarchical any way you look at it, and if you
want to make the namespace have an ambiguity because you want to
avoid putting a hierarchy seperator ("/") in there, well, that's
your business.

Basically, when a device probes true, it "arrives".  I'm going to
call this "arrives" from here on, because the "arrival" code needs
to be shared with some events other than just probing true.


So wd0 "arrives" and has a DOS partition table on it.

The devfs exports the device node "/dev/dsk/wd0", and that's "the
whole disk".  Note that it's a namespace thing, not a minor number
thing.

The devfs, after it exports the node, but before it returns from
handling the "arrival" event (returns to the probe code) calls
(this is all pseudocode):

    dev_arrive( dev_t parent, dev_t dev, name)
    {
	struct log_to_phys *ltpp;

	dev_register( parent, dev, name);	/* ("/dev/dsk", dev, "wd0")*/

	for( ltpp = mapping_layer_list; ltpp != NULL; ltpp = ltpp->next) {
		if( ltpp->reconize( dev)) {
			/* this mapping layer recognizes this dev...*/
			break;
		}
	}

	/*
	 * NOTE: CLEVER FUTURE EXPANSION
	 *

	if( ltpp == NULL) {
		/*
		 * device not recognized as containing a partitioning
		 * schema.  Devices which "arrive" without partitionig
		 * schema on them are probably file systems -- attempt
		 * to automount the device using the "last mounted on"
		 * field, if present in /etc/fstab and not mounted.
		 * Later, we will always mount and use /etc/fstab solely
		 * to map a mounted FS into the root FS hierarchy...
		 */
		...
	}

	 *
	 */
    }


The ltp_dospart.c looks like:

	/*
	 * ID string; displayed by user interface when offering up what
	 * types of partitions you are allowed to create...
	 */
	static char *dospart_idstring = "DOS Primary Partition Table";

	static int
	dospart_recognize( dev)
	{
		int	rv = 0;		/* default: not recognized*/
		int	i;

		/* read what would be the partition table if it was there*/
		...

		/* verify is valid*/
		if( ((dos_part_table *)data)->sig != 0xaa55)
			goto fail;

		/* allocate a DOS-partitioning style ltpp record...*/
		dltpp = ...;

		/* copy the partition table data into the record*/
		memcpy( dltpp->dospart, data, sizeof(dos_part_table));

		/* fill out the rest of the record...*/
		dltpp->ltp.id = dospart_idstring;	/* char */
		...

		/* for each valid partition, add a device*/
		for( i = 0; i< 4; i++) {
			dev_t	newdev;
			char	newname[ 2];

			/* is this partition valid?*/
			if( dltpp->dospart.id[ i] == 0)
				continue;	/* no; skip*/

			newdev = devfs_mksubdev( dev, offset,
						 length, (ltpp)dltpp, i);
			newname[ 0] = 'a' + i;
			newname[ 1] = 0;
			dev_arrive( dev, newdev, newname);
		}

		rv = 1;		/* this l-to-p driver eats this device*/
	fail:
		return( rv);
	}

	...

	static struct log_to_phys dospart = {
		dospart_recognize,	/* recognize partition*/
		dospart_read,		/* read slice data*/
		dospart_write,		/* write slice data*/
		4,			/* max slices*/
		LTOP_IS_LINEAR,		/* linear; can collapse mappings*/
		...			/* etc.*/
	};

	/* register ltop layer with system...*/
	SYSINIT( ... dospart ...);

Actually, theres no reason this couldn't be handled without devfs... but
it's more complicated to do the MAKEDEV to make it work without devfs
(about equal to as complicated as it currently is without devfs).


Then you define an l-to-p mapping for:

	DOS partitioning
	DOS extended partitioning
	FreeBSD disklabel partitioning
	OpenBSD disklabel partitioning
	SVR4 VTOC partitioning
	DEC OSF partitioning
	HPUX partitioning
	Solaris partitioning
	OnTrack Disk Manager 6.x/7.x LBA support
	BAD144 handling			(not linear - media perfection layer)
	CCD stipe set management
	etc., etc.

And everything just comes up as appropriate devices, automagically.  It
even automatically hides the differences between a "dangerously dedidcated"
and a normal install...


You need to support mapping into the correct ltop mapping layer for a
given device by retrieving the ltpp and entry index passed to create
the device in devfs_mksubdev() (or the non-devfs equivalent) so that
you can mainpulate an existing table (read/write/edit).

You also need to be able to retrieve the "depends on" information so
you can warn when you delete a DOS partition that has BSD partitioning
on it.

Finally, you need to be able to enumerate the available l-to-p layers
so that you can apply them to a device without any existing partitioning.

You need *at least* these ioctl's:

	LTOP_READ	Read partitioning information.  Assumes that
			the partitioning already exists.  The ioctl()
			will return -1 if there is no schema associated
			with the device.

	LTOP_WRITE	Write partitioning information.  Assumes that
			the partitioning already exists.  The ioctl()
			will return -1 if there is no schema associated
			with the device.

	LTOP_STAT	Get meta-information specific to the partitiong
			scheme for the current device.  Assumes that
			the partitioning already exists.  The ioctl()
			will return -1 if there is no schema associated
			with the device.

	LTOP_ENUM	Enumerate registered partitioning schema; this
			is a get-next interface.  The first time you
			call this interface, the index in the argument
			struct must be 0; it is updated when the id
			of the schema (a string) is returned.  The
			ioctl() returns -1 when there are no more schema,
			0 otherwise.

	LTOP_INIT	Takes a registered partitioning schema and a
			device, and associates the schema with the
			device (it does this by internally enumerating
			the available ltop layers to find the layer for
			the specified schema, and calling the schema
			specific 'read' with a (dev_t)-1 to get a
			"default, uninitialized" schema written to the
			device).

	LTOP_DEL	Removes the registered partitioning schema by
			writing all zeros to the data area for the
			partition type information.  All subpartition
			data areas must be deleted via LTOP_WRITE or
			this command will be refused.

And assuming you handle the data record iteration properly, you should
be able to support all types of partitioning with the same utility,
which operates on a device hierarchy (you will need to support 1-n
sets of partition data being shoved across the interface for any given
type of partitioning.  The value of n is obtained via LTOP_STAT.).

Note that the LTOP_WRITE takes the place of a user space writing on
a disk.

The vnode configuration needs to go through an "arrival" to allow this
to still be applied for FS floppies for install/fixit, etc..


One utility... makes the problem a bit simpler, no?


If you wanted to force relationships, you could have the layers know
about their parent's by going through the 'parent dev' to see if the
parent is acceptable to them... for instance, a "DOS primary partition"
probably wants its parent to be a real device, and a "DOS extended
partition" probably wants its parent to be a "DOS primary partition".
A "BSD disklabel" may or may not prefer that its parent be a "DOS
primary partition" or "DOS extended partition", etc..



You will probably (if you have devfs) want newly created devices to
"arrive" or newly removed ones to "depart" as a result of the LTOP_WRITE
invocation.

You will probably (eventually) use this same arrival/departure mechanism
for nomadic computing (roaming, docked + no net, docked + net, roaming +
dialup net, roming + transient IR connectivity, etc.).


					Regards,
					Terry Lambert
					terry@lambert.org
---
Any opinions in this posting are my own and not those of my present
or previous employers.



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199704212115.OAA23175>