linux/Documentation/laptops/disk-shock-protection.txt
<<
>>
Prefs
   1Hard disk shock protection
   2==========================
   3
   4Author: Elias Oltmanns <eo@nebensachen.de>
   5Last modified: 2008-10-03
   6
   7
   80. Contents
   9-----------
  10
  111. Intro
  122. The interface
  133. References
  144. CREDITS
  15
  16
  171. Intro
  18--------
  19
  20ATA/ATAPI-7 specifies the IDLE IMMEDIATE command with unload feature.
  21Issuing this command should cause the drive to switch to idle mode and
  22unload disk heads. This feature is being used in modern laptops in
  23conjunction with accelerometers and appropriate software to implement
  24a shock protection facility. The idea is to stop all I/O operations on
  25the internal hard drive and park its heads on the ramp when critical
  26situations are anticipated. The desire to have such a feature
  27available on GNU/Linux systems has been the original motivation to
  28implement a generic disk head parking interface in the Linux kernel.
  29Please note, however, that other components have to be set up on your
  30system in order to get disk shock protection working (see
  31section 3. References below for pointers to more information about
  32that).
  33
  34
  352. The interface
  36----------------
  37
  38For each ATA device, the kernel exports the file
  39block/*/device/unload_heads in sysfs (here assumed to be mounted under
  40/sys). Access to /sys/block/*/device/unload_heads is denied with
  41-EOPNOTSUPP if the device does not support the unload feature.
  42Otherwise, writing an integer value to this file will take the heads
  43of the respective drive off the platter and block all I/O operations
  44for the specified number of milliseconds. When the timeout expires and
  45no further disk head park request has been issued in the meantime,
  46normal operation will be resumed. The maximal value accepted for a
  47timeout is 30000 milliseconds. Exceeding this limit will return
  48-EOVERFLOW, but heads will be parked anyway and the timeout will be
  49set to 30 seconds. However, you can always change a timeout to any
  50value between 0 and 30000 by issuing a subsequent head park request
  51before the timeout of the previous one has expired. In particular, the
  52total timeout can exceed 30 seconds and, more importantly, you can
  53cancel a previously set timeout and resume normal operation
  54immediately by specifying a timeout of 0. Values below -2 are rejected
  55with -EINVAL (see below for the special meaning of -1 and -2). If the
  56timeout specified for a recent head park request has not yet expired,
  57reading from /sys/block/*/device/unload_heads will report the number
  58of milliseconds remaining until normal operation will be resumed;
  59otherwise, reading the unload_heads attribute will return 0.
  60
  61For example, do the following in order to park the heads of drive
  62/dev/sda and stop all I/O operations for five seconds:
  63
  64# echo 5000 > /sys/block/sda/device/unload_heads
  65
  66A simple
  67
  68# cat /sys/block/sda/device/unload_heads
  69
  70will show you how many milliseconds are left before normal operation
  71will be resumed.
  72
  73A word of caution: The fact that the interface operates on a basis of
  74milliseconds may raise expectations that cannot be satisfied in
  75reality. In fact, the ATA specs clearly state that the time for an
  76unload operation to complete is vendor specific. The hint in ATA-7
  77that this will typically be within 500 milliseconds apparently has
  78been dropped in ATA-8.
  79
  80There is a technical detail of this implementation that may cause some
  81confusion and should be discussed here. When a head park request has
  82been issued to a device successfully, all I/O operations on the
  83controller port this device is attached to will be deferred. That is
  84to say, any other device that may be connected to the same port will
  85be affected too. The only exception is that a subsequent head unload
  86request to that other device will be executed immediately. Further
  87operations on that port will be deferred until the timeout specified
  88for either device on the port has expired. As far as PATA (old style
  89IDE) configurations are concerned, there can only be two devices
  90attached to any single port. In SATA world we have port multipliers
  91which means that a user-issued head parking request to one device may
  92actually result in stopping I/O to a whole bunch of devices. However,
  93since this feature is supposed to be used on laptops and does not seem
  94to be very useful in any other environment, there will be mostly one
  95device per port. Even if the CD/DVD writer happens to be connected to
  96the same port as the hard drive, it generally *should* recover just
  97fine from the occasional buffer under-run incurred by a head park
  98request to the HD. Actually, when you are using an ide driver rather
  99than its libata counterpart (i.e. your disk is called /dev/hda
 100instead of /dev/sda), then parking the heads of one drive (drive X)
 101will generally not affect the mode of operation of another drive
 102(drive Y) on the same port as described above. It is only when a port
 103reset is required to recover from an exception on drive Y that further
 104I/O operations on that drive (and the reset itself) will be delayed
 105until drive X is no longer in the parked state.
 106
 107Finally, there are some hard drives that only comply with an earlier
 108version of the ATA standard than ATA-7, but do support the unload
 109feature nonetheless. Unfortunately, there is no safe way Linux can
 110detect these devices, so you won't be able to write to the
 111unload_heads attribute. If you know that your device really does
 112support the unload feature (for instance, because the vendor of your
 113laptop or the hard drive itself told you so), then you can tell the
 114kernel to enable the usage of this feature for that drive by writing
 115the special value -1 to the unload_heads attribute:
 116
 117# echo -1 > /sys/block/sda/device/unload_heads
 118
 119will enable the feature for /dev/sda, and giving -2 instead of -1 will
 120disable it again.
 121
 122
 1233. References
 124-------------
 125
 126There are several laptops from different vendors featuring shock
 127protection capabilities. As manufacturers have refused to support open
 128source development of the required software components so far, Linux
 129support for shock protection varies considerably between different
 130hardware implementations. Ideally, this section should contain a list
 131of pointers at different projects aiming at an implementation of shock
 132protection on different systems. Unfortunately, I only know of a
 133single project which, although still considered experimental, is fit
 134for use. Please feel free to add projects that have been the victims
 135of my ignorance.
 136
 137- http://www.thinkwiki.org/wiki/HDAPS
 138  See this page for information about Linux support of the hard disk
 139  active protection system as implemented in IBM/Lenovo Thinkpads.
 140
 141
 1424. CREDITS
 143----------
 144
 145This implementation of disk head parking has been inspired by a patch
 146originally published by Jon Escombe <lists@dresco.co.uk>. My efforts
 147to develop an implementation of this feature that is fit to be merged
 148into mainline have been aided by various kernel developers, in
 149particular by Tejun Heo and Bartlomiej Zolnierkiewicz.
 150
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.