• Hannes Reinecke's avatar
    nvme: generate uevent once a multipath namespace is operational again · f6f09c15
    Hannes Reinecke authored
    
    
    When fast_io_fail_tmo is set I/O will be aborted while recovery is
    still ongoing. This causes MD to set the namespace to failed, and
    no futher I/O will be submitted to that namespace.
    
    However, once the recovery succeeds and the namespace becomes
    operational again the NVMe subsystem doesn't send a notification,
    so MD cannot automatically reinstate operation and requires
    manual interaction.
    
    This patch will send a KOBJ_CHANGE uevent per multipathed namespace
    once the underlying controller transitions to LIVE, allowing an automatic
    MD reassembly with these udev rules:
    
    /etc/udev/rules.d/65-md-auto-re-add.rules:
    SUBSYSTEM!="block", GOTO="md_end"
    
    ACTION!="change", GOTO="md_end"
    ENV{ID_FS_TYPE}!="linux_raid_member", GOTO="md_end"
    PROGRAM="/sbin/md_raid_auto_readd.sh $devnode"
    LABEL="md_end"
    
    /sbin/md_raid_auto_readd.sh:
    
    MDADM=/sbin/mdadm
    DEVNAME=$1
    
    export $(${MDADM} --examine --export ${DEVNAME})
    
    if [ -z "${MD_UUID}" ]; then
        exit 1
    fi
    
    UUID_LINK=$(readlink /dev/disk/by-id/md-uuid-${MD_UUID})
    MD_DEVNAME=${UUID_LINK##*/}
    export $(${MDADM} --detail --export /dev/${MD_DEVNAME})
    if [ -z "${MD_METADATA}" ] ; then
        exit 1
    fi
    if [ $(cat /sys/block/${MD_DEVNAME}/md/degraded) != 1 ]; then
        echo "${MD_DEVNAME}: array not degraded, nothing to do"
        exit 0
    fi
    MD_STATE=$(cat /sys/block/${MD_DEVNAME}/md/array_state)
    if [ ${MD_STATE} != "clean" ] ; then
        echo "${MD_DEVNAME}: array state ${MD_STATE}, cannot re-add"
        exit 1
    fi
    MD_VARNAME="MD_DEVICE_dev_${DEVNAME##*/}_ROLE"
    if [ ${!MD_VARNAME} = "spare" ] ; then
        ${MDADM} --manage /dev/${MD_DEVNAME} --re-add ${DEVNAME}
    fi
    
    Changes to v2:
    - Add udev rules example to description
    Changes to v1:
    - use disk_uevent() as suggested by hch
    Signed-off-by: default avatarHannes Reinecke <hare@suse.de>
    Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
    f6f09c15
multipath.c 22.8 KB