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 (6 years, 11 months ago) by mlelstv
Branches: MAIN
CVS tags: HEAD
separate cdevsw methods not used by disk drivers

    1: # Interfaces used by disk devices
    2: 
    3: The classical UNIX device interface
    4: 
    5: - implement bdevsw
    6:   - methods
    7: 	- d_open
    8: 	- d_close
    9: 	- d_strategy
   10: 	- d_ioctl
   11: 	- d_psize
   12: 	- d_discard
   13:   - constants
   14: 	- d_flag
   15: - implement cdevsw
   16:   - methods
   17: 	- d_open
   18: 	- d_close
   19: 	- d_read
   20: 	- d_write
   21: 	- d_ioctl
   22: 	- d_mmap
   23: 	- d_discard
   24:   - other methods not used by disk drivers
   25: 	- d_stop
   26: 	- d_tty
   27: 	- d_poll
   28: 	- d_kqfilter
   29:   - constants
   30: 	- d_flag
   31: 
   32: Layering is possible, the dk_lookup function is used to get
   33: a handle (a vnode) a child device.
   34: 
   35: - call each other using vnode layer
   36:   - methods
   37: 	VOP_IOCTL
   38: 	VOP_STRATEGY
   39:   - dk_lookup to find vnode
   40:   - vn_close to release vnode
   41: 
   42: 
   43: Disk drivers use the kernel disk interface to provide information
   44: for iostat and property lists. There are also helper routines
   45: to handle partitions and to get a disklabel.
   46: 
   47: - kernel disk interface
   48:   - kern/subr_disk.c
   49: 	- driver calls disk_init() to register
   50: 	- instrumentation (iostat)
   51: 	- DIOCGDISKINFO
   52: 	- partition support (bounds_check_..)
   53: 	- disklabel routines
   54: 	- low-level routines polluting namespace (disk_read_sectors)
   55: 	- registers a callback to strategy and minphys functions,
   56: 	  currently there are only one user, dk(4) calls the minphys
   57: 	  function.
   58: 
   59: 
   60: Almost all disk drivers have a regular driver structure that
   61: is created by the autoconf framework. An exception is the ccd(4)
   62: driver that hand-crafts its private data without autoconf.
   63: 
   64: - autoconf device building
   65:   - kern/subr_autoconf.c
   66: 	- generic for all device drivers, not only disk drivers
   67: 	- provides common data including a proplib dictionary
   68: 	- the dictionary is used to register unit data, for example
   69: 	  a drive geometry.
   70: 
   71: The disklabel routines are mostly MD, the sun/sparc routines are
   72: not in arch/* but in dev/sun/*, the i386/amd64 routines (also used
   73: by other archs) are in kern/subr_disk_mbr.c
   74: 
   75: - disklabel routines
   76:   - really MD, implement readdisklabel, writedisklabel, setdisklabel
   77:   - kern/subr_disk_mbr.c
   78: 	- more disklabel routines, MBR, ISO9660
   79: 	- writedisklabel
   80:   - sun/disksubr.c
   81: 	- like subr_disk_mbr.c but different for sun3/sparc/sparc64
   82:   - arch/\*/\*/disksubr.c
   83: 	- like subr_disk_mbr.c but different
   84: 
   85: 
   86: A wedge is a layered device on top of the RAW_PART of a standard
   87: disk device. All disk drivers need to implement ioctls to manually
   88: attach wedge devices (using dkctl(8)) and need to call dkwedge_discover
   89: to implement autodetect
   90: 
   91: - wedge routines
   92:   - dev/dkwedge/*
   93:   - implement dk device
   94:   - implement scan routines for various labels (MBR,BSD,GPT)
   95:   - IOCTLs to attach dk devices
   96:   - scan routines called by each disk driver
   97: 
   98: 
   99: The attempt to refactor disk drivers by collecting common functionality.
  100: Hardly used, the dk_lookup routine doesn't really belong here (it's
  101: more a vnode routine).
  102: 
  103: - dksubr interface
  104:   - dk_lookup helper to find vnodes
  105:   - dk_intf switch implements common parts of
  106: 	- open
  107: 	- close
  108: 	- strategy
  109: 	- size
  110: 	- ioctl
  111: 	- dump
  112:   - dk_getdisklabel, dk_makedisklabel. fallback routines ?.
  113:   - used only by cgd, xbd
  114: 

CVSweb for NetBSD wikisrc <wikimaster@NetBSD.org> software: FreeBSD-CVSweb