[RFC] CAM/GEOM media change notification

Alexander Motin mav at FreeBSD.org
Mon Jul 23 13:42:23 UTC 2012


Hi.

On PC-BSD developers request and sponsored by iXsystems, Inc, I've made 
patch for present FreeBSD 10-CURRENT implementing media change 
notification for DA and CD removable media devices, that I would like to 
be reviewed and tested. It includes three parts:
  1) Modifications to CAM to detect media media changes and report them 
to disk(9) layer. For modern SATA (and potentially UAS) devices it 
utilizes Asynchronous Notification mechanism to receive events from 
hardware. Active polling with TEST UNIT READY commands with 3 seconds 
period is used for incapable hardware. After that both CD and DA drivers 
work the same way, detecting two conditions: "NOT READY: Medium not 
present" after medium was detected previously, and "UNIT ATTENTION: Not 
ready to ready change, medium may have changed". First one reported to 
disk(9) as media removal, second as media insert/change. To reliably 
receive second event new AC_UNIT_ATTENTION async added to make UAs 
broadcasted to all periphs by generic error handling code.
  2) Modifications to GEOM core to handle media remove and change 
events. Media removal handled by spoiling all consumers attached to the 
provider. Media change event also schedules provider retaste after 
spoiling to probe new media. New flag G_CF_ORPHAN was added to consumers 
to reflect that consumer is in process of destruction. It allows retaste 
to create new geom instance of the same class, while previous one is 
still dying.
  3) Modifications to several major GEOM classes: DEV -- to report media 
change events to devd; VFS -- to handle spoiling same as orphan to 
prevent accessing replaced media. PART class already handles spoiling 
alike to orphan.

As result, such events are reported to devd for USB card reader:
  - on media inserted:
!system=DEVFS subsystem=CDEV type=MEDIACHANGE cdev=da3
!system=DEVFS subsystem=CDEV type=CREATE cdev=da3s1
!system=DEVFS subsystem=CDEV type=CREATE cdev=msdosfs/NIKON D7000
  - on media removed:
!system=DEVFS subsystem=CDEV type=DESTROY cdev=da3s1
!system=DEVFS subsystem=CDEV type=DESTROY cdev=msdosfs/NIKON D7000

Patch can be found here:
http://people.freebsd.org/~mav/mediachange8.patch

Any comments/objections/propositions?

-- 
Alexander Motin


More information about the freebsd-scsi mailing list