diff options
author | Tony Hutter <[email protected]> | 2016-10-24 10:45:59 -0700 |
---|---|---|
committer | Brian Behlendorf <[email protected]> | 2016-10-24 10:45:59 -0700 |
commit | 1bbd8770490f0e5b8c575865ab70f6853bca2a2a (patch) | |
tree | 302dc7e82db3c1b33739ec41998d95cfe0157450 /include | |
parent | a85cefa35c00ab4999038fbed69a6c28d0244366 (diff) |
Turn on/off enclosure slot fault LED even when disk isn't present
Previously when a drive faulted, the statechange-led.sh script would lookup
the drive's LED sysfs entry in /sys/block/sd*/device/enclosure_device, and
turn it on. During testing we noticed that if you pulled out a drive, or if
the drive was so badly broken that it no longer appeared to Linux, that the
/sys/block/sd* path would be removed, and the script could not lookup the
LED entry.
To fix this, this patch looks up the disks's more persistent
"/sys/class/enclosure/X:X:X:X/Slot N" LED sysfs path at pool import. It then
passes that path to the statechange-led script to use, rather than having the
script look it up on the fly. This allows the script to turn on/off the slot
LEDs even when the drive is missing.
Closes #5309
Closes #2375
Diffstat (limited to 'include')
-rw-r--r-- | include/libzfs.h | 5 | ||||
-rw-r--r-- | include/sys/fm/fs/zfs.h | 1 | ||||
-rw-r--r-- | include/sys/fs/zfs.h | 3 | ||||
-rw-r--r-- | include/sys/vdev_impl.h | 1 |
4 files changed, 8 insertions, 2 deletions
diff --git a/include/libzfs.h b/include/libzfs.h index 089cb8bc4..d4962dec6 100644 --- a/include/libzfs.h +++ b/include/libzfs.h @@ -280,8 +280,9 @@ extern nvlist_t *zpool_find_vdev_by_physpath(zpool_handle_t *, const char *, extern int zpool_label_disk_wait(char *, int); extern int zpool_label_disk(libzfs_handle_t *, zpool_handle_t *, char *); -int dev_is_dm(char *devname); -char *get_underlying_path(libzfs_handle_t *hdl, char *dev_name); +int zfs_dev_is_dm(char *dev_name); +char *zfs_get_underlying_path(char *dev_name); +char *zfs_get_enclosure_sysfs_path(char *dev_name); /* * Functions to manage pool properties diff --git a/include/sys/fm/fs/zfs.h b/include/sys/fm/fs/zfs.h index 25510f8ca..7a8c36ea2 100644 --- a/include/sys/fm/fs/zfs.h +++ b/include/sys/fm/fs/zfs.h @@ -58,6 +58,7 @@ extern "C" { #define FM_EREPORT_PAYLOAD_ZFS_VDEV_TYPE "vdev_type" #define FM_EREPORT_PAYLOAD_ZFS_VDEV_PATH "vdev_path" #define FM_EREPORT_PAYLOAD_ZFS_VDEV_PHYSPATH "vdev_physpath" +#define FM_EREPORT_PAYLOAD_ZFS_VDEV_ENC_SYSFS_PATH "vdev_enc_sysfs_path" #define FM_EREPORT_PAYLOAD_ZFS_VDEV_DEVID "vdev_devid" #define FM_EREPORT_PAYLOAD_ZFS_VDEV_FRU "vdev_fru" #define FM_EREPORT_PAYLOAD_ZFS_VDEV_STATE "vdev_state" diff --git a/include/sys/fs/zfs.h b/include/sys/fs/zfs.h index c51d190c7..d1d0a275d 100644 --- a/include/sys/fs/zfs.h +++ b/include/sys/fs/zfs.h @@ -592,6 +592,9 @@ typedef struct zpool_rewind_policy { #define ZPOOL_CONFIG_VDEV_ASYNC_AGG_W_HISTO "vdev_async_agg_w_histo" #define ZPOOL_CONFIG_VDEV_AGG_SCRUB_HISTO "vdev_agg_scrub_histo" +/* vdev enclosure sysfs path */ +#define ZPOOL_CONFIG_VDEV_ENC_SYSFS_PATH "vdev_enc_sysfs_path" + #define ZPOOL_CONFIG_WHOLE_DISK "whole_disk" #define ZPOOL_CONFIG_ERRCOUNT "error_count" #define ZPOOL_CONFIG_NOT_PRESENT "not_present" diff --git a/include/sys/vdev_impl.h b/include/sys/vdev_impl.h index bdf8498fa..b9a2d181b 100644 --- a/include/sys/vdev_impl.h +++ b/include/sys/vdev_impl.h @@ -213,6 +213,7 @@ struct vdev { char *vdev_path; /* vdev path (if any) */ char *vdev_devid; /* vdev devid (if any) */ char *vdev_physpath; /* vdev device path (if any) */ + char *vdev_enc_sysfs_path; /* enclosure sysfs path */ char *vdev_fru; /* physical FRU location */ uint64_t vdev_not_present; /* not present during import */ uint64_t vdev_unspare; /* unspare when resilvering done */ |