Add zfsd, which deals with hard drive faults in ZFS pools. It manages
hotspares and replements in drive slots that publish physical paths.
Add zfsd(8) and its unit tests
Add zfsd to the build
A C++ library that helps devd clients process events
Add libdevdctl to the build. It's a private library, unusable by
By default, set zfsd_enable to NO
Add a directory for libdevdctl's include files
Add a directory for zfsd's unit tests
Add /var/db/zfsd/cases, where zfsd stores case files while it's shut
Add zfsd's rc script
Fix the resource.fs.zfs.statechange message. It had a number of
- It was only being emitted on a transition to the HEALTHY state.
That made it impossible for zfsd to take actions based on drives getting sicker.
- It compared the new state to vdev_prevstate, which is the state
that the vdev had the last time it was opened. That doesn't make sense, because a vdev can change state multiple times without being reopened.
- vdev_set_state contains logic that will change the device's new
state based on various conditions. However, the statechange event was being posted _before_ that logic took effect. Now it's being posted after.
Correct the rendering of device aliases that reside in
subdirectories of a devfs.
In devfs_readlink(), convert the devfs root relative path of an
alias's parent, that is recorded in the alias, into a fully
qualified path that includes the root of the containing devfs. This
avoids the ugliness of generating a relative path by prepending
"../"'s. For a non-jailed process, the "symlink root" is the
devfs's mount point. For a jailed process, we must remove any jail
prefix in the mount point so that our response matches the user
process's world view.