File:  [NetBSD Developer Wiki] / wikisrc / users / mlelstv / disk-devices-layered.mdwn
Revision 1.4: download - view: text, annotated - select for diffs
Sun Oct 12 07:10:09 2014 UTC (7 years, 8 months ago) by mlelstv
Branches: MAIN
CVS tags: HEAD
separate cdevsw methods not used by disk drivers

# Interfaces used by disk devices

The classical UNIX device interface

- implement bdevsw
  - methods
	- d_open
	- d_close
	- d_strategy
	- d_ioctl
	- d_psize
	- d_discard
  - constants
	- d_flag
- implement cdevsw
  - methods
	- d_open
	- d_close
	- d_read
	- d_write
	- d_ioctl
	- d_mmap
	- d_discard
  - other methods not used by disk drivers
	- d_stop
	- d_tty
	- d_poll
	- d_kqfilter
  - constants
	- d_flag

Layering is possible, the dk_lookup function is used to get
a handle (a vnode) a child device.

- call each other using vnode layer
  - methods
  - dk_lookup to find vnode
  - vn_close to release vnode

Disk drivers use the kernel disk interface to provide information
for iostat and property lists. There are also helper routines
to handle partitions and to get a disklabel.

- kernel disk interface
  - kern/subr_disk.c
	- driver calls disk_init() to register
	- instrumentation (iostat)
	- partition support (bounds_check_..)
	- disklabel routines
	- low-level routines polluting namespace (disk_read_sectors)
	- registers a callback to strategy and minphys functions,
	  currently there are only one user, dk(4) calls the minphys

Almost all disk drivers have a regular driver structure that
is created by the autoconf framework. An exception is the ccd(4)
driver that hand-crafts its private data without autoconf.

- autoconf device building
  - kern/subr_autoconf.c
	- generic for all device drivers, not only disk drivers
	- provides common data including a proplib dictionary
	- the dictionary is used to register unit data, for example
	  a drive geometry.

The disklabel routines are mostly MD, the sun/sparc routines are
not in arch/* but in dev/sun/*, the i386/amd64 routines (also used
by other archs) are in kern/subr_disk_mbr.c

- disklabel routines
  - really MD, implement readdisklabel, writedisklabel, setdisklabel
  - kern/subr_disk_mbr.c
	- more disklabel routines, MBR, ISO9660
	- writedisklabel
  - sun/disksubr.c
	- like subr_disk_mbr.c but different for sun3/sparc/sparc64
  - arch/\*/\*/disksubr.c
	- like subr_disk_mbr.c but different

A wedge is a layered device on top of the RAW_PART of a standard
disk device. All disk drivers need to implement ioctls to manually
attach wedge devices (using dkctl(8)) and need to call dkwedge_discover
to implement autodetect

- wedge routines
  - dev/dkwedge/*
  - implement dk device
  - implement scan routines for various labels (MBR,BSD,GPT)
  - IOCTLs to attach dk devices
  - scan routines called by each disk driver

The attempt to refactor disk drivers by collecting common functionality.
Hardly used, the dk_lookup routine doesn't really belong here (it's
more a vnode routine).

- dksubr interface
  - dk_lookup helper to find vnodes
  - dk_intf switch implements common parts of
	- open
	- close
	- strategy
	- size
	- ioctl
	- dump
  - dk_getdisklabel, dk_makedisklabel. fallback routines ?.
  - used only by cgd, xbd

CVSweb for NetBSD wikisrc <> software: FreeBSD-CVSweb