if [[ "$UDEV_EXTRAS" == 'y' ]]; then
make EXTRAS="extras/ata_id extras/dasd_id extras/edd_id extras/floppy
extras/scsi_id extras/usb_id extras/volume_id" prefix=${INSTALL_ROOT}/
exec_prefix=${INSTALL_ROOT}/ ${OPTS} V=true install &&
diff --git a/disk/udev/helpers/cdsymlink_helper
b/disk/udev/helpers/cdsymlink_helper
new file mode 100644
index 0000000..803cc20
--- /dev/null
+++ b/disk/udev/helpers/cdsymlink_helper
@@ -0,0 +1,61 @@
+#!/bin/bash
+
+if [[ -z "$1" ]]; then
+ echo "Not enough input!"
+ echo "Usage: $0 %k"
+ exit 1
+fi
+
+# Prevent conflicts between parallel processes by creating a lock dir
+# and using it as a queue ticket. Only the process that can create it
+# (meaning it doesn't already exist from another process) is allowed to
+# proceed, others have to wait. Maximum queue time is 5 seconds, queue
+# check happens every 20 milliseconds.
+lock()
+{
+ [[ -d /dev/.udev ]] ||
+ if ! mkdir -p /dev/.udev; then
+ echo "Cannot create /dev/.udev!"
+ exit 1
+ fi
+ LOCK_DIR=/dev/.udev/.lock-cdsymlink
+ local retry=250
+ while ! mkdir $LOCK_DIR 2>/dev/null; do
+ if ((retry==0)); then
+ echo "Cannot lock $LOCK_DIR!" >&2
+ exit 2
+ fi
+ sleep 0.02
+ ((retry-=1))
+ done
+}
+
+# Once the process is finished, delete lock dir so that the next process
+# may step forward in queue.
+unlock()
+{
+ [[ "$LOCK_DIR" ]] || return 0
+ rm -r $LOCK_DIR 2>/dev/null || return 0
+}
+
+# Find the next available symlink name for device. $1 is the device name
+# from kernel (udev's %k value), $2 is the desired symlink basename
+# (e.g. basename "cdrom" will be used to create symlinks /dev/cdrom,
+# /dev/cdrom1, etc.)
+echo_link()
+{
+ local num
+ while [[ -e /dev/$2$num ]] &&
+ [[ "$(readlink /dev/$2$num)" != "$1" ]]; do
+ ((num+=1))
+ done
+ echo -n "$2$num "
+}
+
+lock
+
+# Output symlink name for cdrom, and then for dvd if needed.
+echo_link $1 cdrom
+[[ "$ID_CDROM_DVD" ]] && echo_link $1 dvd
+
+unlock
diff --git a/disk/udev/rules/50-default.rules
b/disk/udev/rules/50-default.rules
index 7bbed58..dac5953 100644
--- a/disk/udev/rules/50-default.rules
+++ b/disk/udev/rules/50-default.rules
@@ -23,10 +23,6 @@ KERNEL=="vcs[0-9]*", NAME="vcc/%n", SY
KERNEL=="vcsa", NAME="vcc/a0", SYMLINK="%k"
KERNEL=="vcsa[0-9]*", NAME="vcc/a%n", SYMLINK="%k"
-# all block devices
-SUBSYSTEM=="block", GROUP="disk", MODE="0640"
-SUBSYSTEM=="block", SYSFS{removable}=="1", GROUP="floppy"
-
# device mapper creates its own device nodes so ignore these
KERNEL=="dm-[0-9]*", OPTIONS="ignore_device"
KERNEL=="device-mapper", NAME="mapper/control"
@@ -38,18 +34,22 @@ KERNEL=="ataraid*", NAME="%k", GROU
BUS=="scsi", KERNEL=="sr[0-9]*", GROUP="scsi"
BUS=="scsi", KERNEL=="sg[0-9]*", GROUP="burning"