[PATCH 01/17] udev rules and infrastructure for /dev/disk/by-slot

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



From: Dan Williams <djbw@xxxxxx>

/dev/disk/by-path maps the device by its sysfs path, but uses
data not necessarily guaranteed to be static.  It also takes extra work
to map where the device is physically attached.
static data for creating the path name.

For example:

pci-0000:04:00.0-sas-0x500605b005846061:1:0-0x5000cca01a7c5606:0
phy_id------------------------------------^
end_device-sas_address----------------------^

...on mpt2sas 'phy_id' is a dynamically allocated number based on when
the port comes up.  There is no differentiation based on where the end
device is attached as the end device sas address is the only indication
of the exit point from the topology.

In contrast:
enclosure-0x5f80f41f1d6a60ff-slot9

...is a static name for this physical location in an enclosure.

Signed-off-by: Dan Williams <dan.j.williams@xxxxxxxxx>
Signed-off-by: Song Liu <songliubraving@xxxxxx>
---
 Makefile                  |   3 +
 ses_slot_id               | 144 ++++++++++++++++++++++++++++++++++++++++++++++
 udev-enclosure-slot.rules |  13 +++++
 3 files changed, 160 insertions(+)
 create mode 100755 ses_slot_id
 create mode 100644 udev-enclosure-slot.rules

diff --git a/Makefile b/Makefile
index fde2e63..4eb2dad 100644
--- a/Makefile
+++ b/Makefile
@@ -110,6 +110,7 @@ LDLIBS=-ldl
 INSTALL = /usr/bin/install
 DESTDIR =
 BINDIR  = /sbin
+LIBDIR	= /lib/mdadm
 MANDIR  = /usr/share/man
 MAN4DIR = $(MANDIR)/man4
 MAN5DIR = $(MANDIR)/man5
@@ -292,6 +293,8 @@ install-man: mdadm.8 md.4 mdadm.conf.5 mdmon.8
 	$(INSTALL) -D -m 644 mdadm.conf.5 $(DESTDIR)$(MAN5DIR)/mdadm.conf.5
 
 install-udev: udev-md-raid-arrays.rules udev-md-raid-assembly.rules
+	$(INSTALL) -D -m 655 ses_slot_id $(DESTDIR)$(LIBDIR)/ses_slot_id
+	$(INSTALL) -D -m 644 udev-enclosure-slot.rules $(DESTDIR)$(UDEVDIR)/rules.d/62-md-enclosure-slot.rules
 	@for file in 63-md-raid-arrays.rules 64-md-raid-assembly.rules ; \
 	do sed -e 's,BINDIR,$(BINDIR),g' udev-$${file#??-} > .install.tmp.1 && \
 	   $(ECHO) $(INSTALL) -D -m 644 udev-$${file#??-} $(DESTDIR)$(UDEVDIR)/rules.d/$$file ; \
diff --git a/ses_slot_id b/ses_slot_id
new file mode 100755
index 0000000..629f1d1
--- /dev/null
+++ b/ses_slot_id
@@ -0,0 +1,144 @@
+#!/bin/sh
+
+# lookup ses slot information for a given device a /dev/disk/by-slot to
+# supplement the not-always-persistent path in the sas case
+# based on the the original shell script implementation of path_id
+
+SYSFS=/sys
+RESULT=1
+TYPE=
+OPWD="`pwd`"
+full_sysfs_path=
+full_sysfs_device_path=
+
+if [ -z "$DEVPATH" -a -z "$1" ] ; then
+	exit 1
+fi
+
+if [ -z "$DEVPATH" ] ; then
+	case "$1" in
+		$SYSFS/*)
+			DEVPATH="${1#$SYSFS}"
+			;;
+		*)
+			DEVPATH=$1
+			;;
+	esac
+fi
+
+if [ ! -e $SYSFS$DEVPATH/dev ] ; then
+	exit 1
+fi
+
+case "$DEVPATH" in
+	/devices/*)
+		cd "$SYSFS$DEVPATH/subsystem";
+		TYPE="`pwd -P`"
+		cd "$OPWD"
+		TYPE="${TYPE##*/}"
+		;;
+	/class/*)
+		TYPE="${DEVPATH#/class/}"
+		TYPE="${TYPE%%/*}"
+		;;
+	/block/*)
+		TYPE=block
+		;;
+	*)
+		exit 1
+		;;
+esac
+
+handle_ses () {
+	: handle_ses $*
+	local DEV=$1
+
+	ses_dev=$(find $DEV -maxdepth 1 -name 'enclosure_device:*' -print -quit)
+	ses_dev=$(readlink -f "$ses_dev")
+	enc_dev="${ses_dev%/*}"
+
+	if [ -f "$ses_dev/slot" ]; then
+		read slot < "$ses_dev/slot"
+	fi
+
+	if [ -f "$enc_dev/id" ]; then
+		read enclosure_id < "$enc_dev/id"
+	fi
+
+	if [ -z "$slot" -o -z "$enclosure_id" ]; then
+		: no enclosure device
+		D=
+		RESULT=1
+		return
+	fi
+
+	d="enclosure-${enclosure_id}-slot${slot}"
+	D=
+	RESULT=0
+}
+
+handle_device () {
+	full_sysfs_path="$SYSFS$DEVPATH"
+	case "$DEVPATH" in
+		/devices/*)
+			# new sysfs layout
+			if [ -L $full_sysfs_path/subsystem ]; then
+				full_sysfs_path="${full_sysfs_path%/*}"
+				cd "$full_sysfs_path/subsystem";
+				subsys="`pwd -P`"
+				cd "$OPWD"
+				subsys="${subsys##*/}"
+				if [ "$subsys" = "block" ]; then
+					# parent is "block", it's a partition, move one up
+				full_sysfs_path="${full_sysfs_path%/*}"
+				fi
+				cd $full_sysfs_path
+			fi
+			;;
+		*)
+			# old sysfs layout
+			if [ ! -L $full_sysfs_path/device ] ; then
+				if [ -f $full_sysfs_path/range ] ; then return ; fi
+				full_sysfs_path="${full_sysfs_path%/*}"
+				: full_sysfs_path "$full_sysfs_path"
+				if [ ! -L $full_sysfs_path/device -o ! -f $full_sysfs_path/dev ] ; then
+					return
+				fi
+			fi
+			cd $full_sysfs_path/device
+			;;
+	esac
+	full_sysfs_device_path="`pwd -P`"
+	cd "$OPWD"
+	D=$full_sysfs_device_path
+	while [ ! -z "$D" ] ; do
+		case "$D" in
+			*/end_device-[0-9]*:[0-9]*:[0-9]*/*)
+				handle_ses "$D"
+				if [ $RESULT = 0 ]; then
+					found_ses="yes"
+				fi
+				;;
+			*/devices)
+				D=
+				;;
+			*)
+				: not handled
+				RESULT=1
+				return
+				;;
+		esac
+	done
+}
+
+case "$TYPE" in
+	block)
+		handle_device
+		echo "ID_SLOT='$d'"
+		;;
+	*)
+		RESULT=1
+		;;
+esac
+
+exit $RESULT
diff --git a/udev-enclosure-slot.rules b/udev-enclosure-slot.rules
new file mode 100644
index 0000000..75c6376
--- /dev/null
+++ b/udev-enclosure-slot.rules
@@ -0,0 +1,13 @@
+# do not edit this file, it will be overwritten on update
+
+SUBSYSTEM!="block", GOTO="ses_slot_end"
+
+ACTION!="add|change", GOTO="ses_slot_end"
+KERNEL!="sd*", GOTO="ses_slot_end"
+
+# by-slot (parent device slot)
+ENV{DEVTYPE}=="disk", IMPORT{program}="/lib/mdadm/ses_slot_id %p"
+ENV{DEVTYPE}=="disk", ENV{ID_SLOT}=="?*", SYMLINK+="disk/by-slot/$env{ID_SLOT}"
+ENV{DEVTYPE}=="partition", ENV{ID_SLOT}=="?*", SYMLINK+="disk/by-slot/$env{ID_SLOT}-part%n"
+
+LABEL="ses_slot_end"
-- 
2.4.6

--
To unsubscribe from this list: send the line "unsubscribe linux-raid" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux RAID Wiki]     [ATA RAID]     [Linux SCSI Target Infrastructure]     [Linux Block]     [Linux IDE]     [Linux SCSI]     [Linux Hams]     [Device Mapper]     [Device Mapper Cryptographics]     [Kernel]     [Linux Admin]     [Linux Net]     [GFS]     [RPM]     [git]     [Yosemite Forum]


  Powered by Linux