Subject: new disklabels - part2
To: None <tech-kern@netbsd.org>
From: Leo Weppelman <leo@wau.mis.ah.nl>
List: tech-kern
Date: 09/17/1999 21:24:34
It has taken me a while, but here is the next episode in the disklabel
update saga. I think I covered the items mentioned in the various
discussions. 

The items below were written with the following guidelines in mind:
  - It should be possible to use a generic-disklabel in both kernel and
    userland. It should have a 'large' number of partitions. All ports have
    the _same_ definition of the generic-disklabel.
  - The kernel will be able to convert (at least) the port's native
    disklabel from the native to the generic label format (to allow
    finding the root partition). This is the current situation.
  - There is no necessity for the kernel to support conversion of
    generic labels to some native format. This is probably better left
    to labeltype specific programs (like mbrlabel).
  - There should be COMPAT_1x support of the current userland disklabels.
  - Historical behaviour in keeping state of 'internal' disklabels is
    retained (stickyness).

The following items are more aimed at the specification/implementation. There
are still question marks at some places...

  * The basis of the generic-label is the current dislabel definition
    (as defined in 'include/disklabel.h'). The additions are:
      - 52 (2*26 == [a-zA-Z]) partitions (MAX_GENERIC_PARTITIONS)
      - 'sticky' member.
      - 'labeltype' (UNKNOWN/MBR/AHDI/RDB)

  * The generic label will be the label stored in dk_label and thus is
    the `in-core' label. This allows the virtual disk drivers to use
    the new label format.

  * The semantics of kern.maxpartitions and (the should be kernel only)
    define MAXPARTITIONS is: The maximum number of partitions allowed on
    a _native_ disk.
    Note: it might even make sense to make this device dependent. When the
          kernel supports multiple label types. Or drop it alltogether.

  * Sticky labels
    Labels are _not_ sticky by default. The in-core label will be dropped
    on the last close of the disk device unless it's sticky. A label can
    be made sticky by setting the 'sticky' member of the generic-disklabel
    and activate the label by either a DIOCSDINFO or DIOCWDINFO ioctl. The
    sticky-flag can be cleared in a simular way (usually DIOCSDINFO only).
    The flag will also be dropped when a media change is detected.

  * When a device is opened, the kernel checks the label. If the kernel
    recognizes the label _and_ there is no sticky label, the kernel will
    update the in-core label.

  * setting the on-disk label
    - When the argument of the ioctl is a generic-label that cannot be
      converted -> fail [ what about errors??? ]
    - Also update the in-core label & drop sticky bit.
    - Does is make sense to allow the passing and updating of 'specific'
      labels? My opinion is 'no', this better handled outside the kernel.

  * The ioctl-interface
    - provide COMPAT_1x
    - When only the generic label can be passed - keep it as it is 
      (pass the structure).
    - When also the various 'native' labels have to be passed to the
      kernel, passing a structure with size/pointer/type and a following
      copyin/copyout looks to be the better solution.

Leo.