diff options
author | Samuel Mendoza-Jonas <sam@mendozajonas.com> | 2017-06-05 13:22:05 +1000 |
---|---|---|
committer | Samuel Mendoza-Jonas <sam@mendozajonas.com> | 2017-06-15 13:37:22 +1000 |
commit | d939857b297a45ab98d44587945e8e09fc43cbb0 (patch) | |
tree | 335ba744c0531e3799e2e946a1b2408df044730e /openpower/overlay | |
parent | 1a9152afb612f5f8a31e3cfc4951948ae6bfa195 (diff) | |
download | blackbird-op-build-d939857b297a45ab98d44587945e8e09fc43cbb0.tar.gz blackbird-op-build-d939857b297a45ab98d44587945e8e09fc43cbb0.zip |
overlay: Include udev rules for LVM
Include the udev rules from device-mapper in order to properly recognise
and set up LVM logical volumes.
Signed-off-by: Samuel Mendoza-Jonas <sam@mendozajonas.com>
Diffstat (limited to 'openpower/overlay')
-rw-r--r-- | openpower/overlay/lib/udev/rules.d/10-dm.rules | 150 | ||||
-rw-r--r-- | openpower/overlay/lib/udev/rules.d/11-dm-lvm.rules | 54 | ||||
-rw-r--r-- | openpower/overlay/lib/udev/rules.d/13-dm-disk.rules | 39 | ||||
-rw-r--r-- | openpower/overlay/lib/udev/rules.d/95-dm-notify.rules | 12 |
4 files changed, 255 insertions, 0 deletions
diff --git a/openpower/overlay/lib/udev/rules.d/10-dm.rules b/openpower/overlay/lib/udev/rules.d/10-dm.rules new file mode 100644 index 00000000..f33df582 --- /dev/null +++ b/openpower/overlay/lib/udev/rules.d/10-dm.rules @@ -0,0 +1,150 @@ +# Copyright (C) 2009 Red Hat, Inc. All rights reserved. +# +# This file is part of LVM2. + +# Udev rules for device-mapper devices. +# +# These rules create a DM control node in /dev/mapper directory. +# The rules also create nodes named dm-x (x is a number) in /dev +# directory and symlinks to these nodes with names given by +# the actual DM names. Some udev environment variables are set +# for use in later rules: +# DM_NAME - actual DM device's name +# DM_UUID - UUID set for DM device (blank if not specified) +# DM_SUSPENDED - suspended state of DM device (0 or 1) +# DM_UDEV_RULES_VSN - DM udev rules version +# +# These rules cover only basic device-mapper functionality in udev. +# +# Various DM subsystems may contain further subsystem-specific rules +# in 11-dm-<subsystem_name>.rules which should be installed together +# with the DM subsystem and which extend these basic rules. +# For example: +# 11-dm-lvm.rules for LVM subsystem +# 11-dm-mpath.rules for multipath subsystem (since version 0.6.0, recommended!) +# +# Even more specific rules may be required by subsystems so always +# check subsystem's upstream repository for recent set of rules. +# Also, keep in mind that recent rules may also require recent +# subsystem-specific binaries. + +KERNEL=="device-mapper", NAME="mapper/control" + +SUBSYSTEM!="block", GOTO="dm_end" +KERNEL!="dm-[0-9]*", GOTO="dm_end" + + +# Device created, major and minor number assigned - "add" event generated. +# Table loaded - no event generated. +# Device resumed (or renamed) - "change" event generated. +# Device removed - "remove" event generated. +# +# The dm-X nodes are always created, even on "add" event, we can't suppress +# that (the node is created even earlier with devtmpfs). All the symlinks +# (e.g. /dev/mapper) are created in right time after a device has its table +# loaded and is properly resumed. For this reason, direct use of dm-X nodes +# is not recommended. +ACTION!="add|change", GOTO="dm_end" + +# Decode udev control flags and set environment variables appropriately. +# These flags are encoded in DM_COOKIE variable that was introduced in +# kernel version 2.6.31. Therefore, we can use this feature with +# kernels >= 2.6.31 only. Cookie is not decoded for remove event. +ENV{DM_COOKIE}=="?*", IMPORT{program}="/usr/sbin/dmsetup udevflags $env{DM_COOKIE}" + +# Rule out easy-to-detect inappropriate events first. +ENV{DISK_RO}=="1", GOTO="dm_disable" + +# There is no cookie set nor any flags encoded in events not originating +# in libdevmapper so we need to detect this and try to behave correctly. +# For such spurious events, regenerate all flags from current udev database content +# (this information would normally be inaccessible for spurious ADD and CHANGE events). +ENV{DM_UDEV_PRIMARY_SOURCE_FLAG}=="1", ENV{DM_ACTIVATION}="1", GOTO="dm_flags_done" +IMPORT{db}="DM_UDEV_DISABLE_DM_RULES_FLAG" +IMPORT{db}="DM_UDEV_DISABLE_SUBSYSTEM_RULES_FLAG" +IMPORT{db}="DM_UDEV_DISABLE_DISK_RULES_FLAG" +IMPORT{db}="DM_UDEV_DISABLE_OTHER_RULES_FLAG" +IMPORT{db}="DM_UDEV_LOW_PRIORITY_FLAG" +IMPORT{db}="DM_UDEV_DISABLE_LIBRARY_FALLBACK_FLAG" +IMPORT{db}="DM_UDEV_PRIMARY_SOURCE_FLAG" +IMPORT{db}="DM_UDEV_FLAG7" +IMPORT{db}="DM_UDEV_RULES_VSN" +LABEL="dm_flags_done" + +# Normally, we operate on "change" events. But when coldplugging, there's an +# "add" event present. We have to recognize this and do our actions in this +# particular situation, too. Also, we don't want the nodes to be created +# prematurely on "add" events while not coldplugging. We check +# DM_UDEV_PRIMARY_SOURCE_FLAG to see if the device was activated correctly +# before and if not, we ignore the "add" event totally. This way we can support +# udev triggers generating "add" events (e.g. "udevadm trigger --action=add" or +# "echo add > /sys/block/<dm_device>/uevent"). The trigger with "add" event is +# also used at boot to reevaluate udev rules for all existing devices activated +# before (e.g. in initrd). If udev is used in initrd, we require the udev init +# script to not remove the existing udev database so we can reuse the information +# stored at the time of device activation in the initrd. +ACTION!="add", GOTO="dm_no_coldplug" +ENV{DM_UDEV_RULES_VSN}!="1", ENV{DM_UDEV_PRIMARY_SOURCE_FLAG}!="1", GOTO="dm_disable" +ENV{DM_ACTIVATION}="1" +LABEL="dm_no_coldplug" + +# Putting it together, following table is used to recognize genuine and spurious events. +# N.B. Spurious events are generated based on use of the WATCH udev +# rule or by triggering an event manually by "udevadm trigger" call +# or by "echo <event_name> > /sys/block/dm-X/uevent". +# +# EVENT DM_UDEV_PRIMARY_SOURCE_FLAG DM_ACTIVATION +# ====================================================================== +# add event (genuine) 0 0 +# change event (genuine) 1 1 +# add event (spurious) +# |_ dev still not active 0 0 +# \_ dev already active 1 1 +# change event (spurious) +# |_ dev still not active 0 0 +# \_ dev already active 1 0 + +# "dm" sysfs subdirectory is available in newer versions of DM +# only (kernels >= 2.6.29). We have to check for its existence +# and use dmsetup tool instead to get the DM name, uuid and +# suspended state if the "dm" subdirectory is not present. +# The "suspended" item was added even later (kernels >= 2.6.31), +# so we also have to call dmsetup if the kernel version used +# is in between these releases. +TEST=="dm", ENV{DM_NAME}="$attr{dm/name}", ENV{DM_UUID}="$attr{dm/uuid}", ENV{DM_SUSPENDED}="$attr{dm/suspended}" +TEST!="dm", IMPORT{program}="/usr/sbin/dmsetup info -j %M -m %m -c --nameprefixes --noheadings --rows -o name,uuid,suspended" +ENV{DM_SUSPENDED}!="?*", IMPORT{program}="/usr/sbin/dmsetup info -j %M -m %m -c --nameprefixes --noheadings --rows -o suspended" + +# dmsetup tool provides suspended state information in textual +# form with values "Suspended"/"Active". We translate it to +# 0/1 respectively to be consistent with sysfs values. +ENV{DM_SUSPENDED}=="Active", ENV{DM_SUSPENDED}="0" +ENV{DM_SUSPENDED}=="Suspended", ENV{DM_SUSPENDED}="1" + +# This variable provides a reliable way to check that device-mapper +# rules were installed. It means that all needed variables are set +# by these rules directly so there's no need to acquire them again +# later. Other rules can alternate the functionality based on this +# fact (e.g. fallback to rules that behave correctly even without +# these rules installed). It also provides versioning for any +# possible future changes. +# VSN 1 - original rules +# VSN 2 - add support for synthesized events +ENV{DM_UDEV_RULES_VSN}="2" + +ENV{DM_UDEV_DISABLE_DM_RULES_FLAG}!="1", ENV{DM_NAME}=="?*", SYMLINK+="mapper/$env{DM_NAME}" + +# Avoid processing and scanning a DM device in the other (foreign) +# rules if it is in suspended state. However, we still keep 'disk' +# and 'DM subsystem' related rules enabled in this case. +ENV{DM_SUSPENDED}=="1", ENV{DM_UDEV_DISABLE_OTHER_RULES_FLAG}="1" + +GOTO="dm_end" + +LABEL="dm_disable" +ENV{DM_UDEV_DISABLE_SUBSYSTEM_RULES_FLAG}="1" +ENV{DM_UDEV_DISABLE_DISK_RULES_FLAG}="1" +ENV{DM_UDEV_DISABLE_OTHER_RULES_FLAG}="1" +OPTIONS:="nowatch" + +LABEL="dm_end" diff --git a/openpower/overlay/lib/udev/rules.d/11-dm-lvm.rules b/openpower/overlay/lib/udev/rules.d/11-dm-lvm.rules new file mode 100644 index 00000000..16b80f9f --- /dev/null +++ b/openpower/overlay/lib/udev/rules.d/11-dm-lvm.rules @@ -0,0 +1,54 @@ +# Copyright (C) 2009 Red Hat, Inc. All rights reserved. +# +# This file is part of LVM2. + +# Udev rules for LVM. +# +# These rules create symlinks for LVM logical volumes in +# /dev/VG directory (VG is an actual VG name). Some udev +# environment variables are set (they can be used in later +# rules as well): +# DM_LV_NAME - logical volume name +# DM_VG_NAME - volume group name +# DM_LV_LAYER - logical volume layer (blank if not set) + +# "add" event is processed on coldplug only! +ACTION!="add|change", GOTO="lvm_end" +ENV{DM_UDEV_RULES_VSN}!="?*", GOTO="lvm_end" +ENV{DM_UUID}!="LVM-?*", GOTO="lvm_end" + +# Use DM name and split it up into its VG/LV/layer constituents. +IMPORT{program}="/usr/sbin/dmsetup splitname --nameprefixes --noheadings --rows $env{DM_NAME}" + +# DM_SUBSYSTEM_UDEV_FLAG0 is the 'NOSCAN' flag for LVM subsystem. +# This flag is used to temporarily disable selected rules to prevent any +# processing or scanning done on the LVM volume before LVM has any chance +# to zero any stale metadata found within the LV data area. Such stale +# metadata could cause false claim of the LV device, keeping it open etc. +# +# If the NOSCAN flag is present, backup selected existing flags used to +# disable rules, then set them firmly so those selected rules are surely skipped. +# Restore these flags once the NOSCAN flag is dropped (which is normally any +# uevent that follows for this LV, even an artificially generated one). +ENV{DM_SUBSYSTEM_UDEV_FLAG0}=="1", ENV{DM_NOSCAN}="1", ENV{DM_DISABLE_OTHER_RULES_FLAG_OLD}="$env{DM_UDEV_DISABLE_OTHER_RULES_FLAG}", ENV{DM_UDEV_DISABLE_OTHER_RULES_FLAG}="1" +ENV{DM_SUBSYSTEM_UDEV_FLAG0}!="1", IMPORT{db}="DM_NOSCAN", IMPORT{db}="DM_DISABLE_OTHER_RULES_FLAG_OLD" +ENV{DM_SUBSYSTEM_UDEV_FLAG0}!="1", ENV{DM_NOSCAN}=="1", ENV{DM_UDEV_DISABLE_OTHER_RULES_FLAG}="$env{DM_DISABLE_OTHER_RULES_FLAG_OLD}", \ + ENV{DM_DISABLE_OTHER_RULES_FLAG_OLD}="", ENV{DM_NOSCAN}="" + +ENV{DM_UDEV_DISABLE_SUBSYSTEM_RULES_FLAG}=="1", GOTO="lvm_end" + +OPTIONS+="event_timeout=180" + +# Do not create symlinks for inappropriate subdevices. +ENV{DM_LV_NAME}=="pvmove?*|?*_vorigin", GOTO="lvm_disable" +ENV{DM_LV_LAYER}=="?*", GOTO="lvm_disable" + +# Create symlinks for top-level devices only. +ENV{DM_VG_NAME}=="?*", ENV{DM_LV_NAME}=="?*", SYMLINK+="$env{DM_VG_NAME}/$env{DM_LV_NAME}", GOTO="lvm_end" + +LABEL="lvm_disable" +ENV{DM_UDEV_DISABLE_DISK_RULES_FLAG}="1" +ENV{DM_UDEV_DISABLE_OTHER_RULES_FLAG}="1" +OPTIONS:="nowatch" + +LABEL="lvm_end" diff --git a/openpower/overlay/lib/udev/rules.d/13-dm-disk.rules b/openpower/overlay/lib/udev/rules.d/13-dm-disk.rules new file mode 100644 index 00000000..9958cace --- /dev/null +++ b/openpower/overlay/lib/udev/rules.d/13-dm-disk.rules @@ -0,0 +1,39 @@ +# Copyright (C) 2009 Red Hat, Inc. All rights reserved. +# +# This file is part of LVM2. + +# Udev rules for device-mapper devices. +# +# These rules create symlinks in /dev/disk directory. +# Symlinks that depend on probing filesystem type, +# label and uuid are created only if the device is not +# suspended. + +# "add" event is processed on coldplug only! +ACTION!="add|change", GOTO="dm_end" +ENV{DM_UDEV_RULES_VSN}!="?*", GOTO="dm_end" +ENV{DM_UDEV_DISABLE_DISK_RULES_FLAG}=="1", GOTO="dm_end" + +SYMLINK+="disk/by-id/dm-name-$env{DM_NAME}" +ENV{DM_UUID}=="?*", SYMLINK+="disk/by-id/dm-uuid-$env{DM_UUID}" + +ENV{DM_SUSPENDED}=="1", GOTO="dm_end" +ENV{DM_NOSCAN}=="1", GOTO="dm_watch" + +IMPORT{builtin}="blkid" +ENV{DM_UDEV_LOW_PRIORITY_FLAG}=="1", OPTIONS="link_priority=-100" +ENV{ID_FS_USAGE}=="filesystem|other|crypto", ENV{ID_FS_UUID_ENC}=="?*", SYMLINK+="disk/by-uuid/$env{ID_FS_UUID_ENC}" +ENV{ID_FS_USAGE}=="filesystem|other", ENV{ID_FS_LABEL_ENC}=="?*", SYMLINK+="disk/by-label/$env{ID_FS_LABEL_ENC}" + +# Add inotify watch to track changes on this device. +# Using the watch rule is not optimal - it generates a lot of spurious +# and useless events whenever the device opened for read-write is closed. +# The best would be to generete the event directly in the tool changing +# relevant information so only relevant events will be processed +# (like creating a filesystem, changing filesystem label etc.). +# +# But let's use this until we have something better... +LABEL="dm_watch" +OPTIONS+="watch" + +LABEL="dm_end" diff --git a/openpower/overlay/lib/udev/rules.d/95-dm-notify.rules b/openpower/overlay/lib/udev/rules.d/95-dm-notify.rules new file mode 100644 index 00000000..e6bb5127 --- /dev/null +++ b/openpower/overlay/lib/udev/rules.d/95-dm-notify.rules @@ -0,0 +1,12 @@ +# Copyright (C) 2009 Red Hat, Inc. All rights reserved. +# +# This file is part of LVM2. + +# Udev rules for device-mapper devices. +# +# These rules are responsible for sending a notification to a process +# waiting for completion of udev rules. The process is identified by +# a cookie value sent within "change" and "remove" events (the cookie +# value is set before by that process for every action requested). + +ENV{DM_COOKIE}=="?*", RUN+="/usr/sbin/dmsetup udevcomplete $env{DM_COOKIE}" |