sys-fs/lvm2: conditionally depend on lvmetad
authorDoug Goldstein <cardoe@gentoo.org>
Thu, 24 Dec 2015 23:28:35 +0000 (17:28 -0600)
committerRobin H. Johnson <robbat2@gentoo.org>
Mon, 28 Dec 2015 00:29:01 +0000 (16:29 -0800)
If the user has configured their system to be dependent on lvmetad in
/etc/lvm/lvm.conf then we need to depend on lvmetad starting up.
Otherwise it shouldn't be necessary and won't be started.

Gentoo-Bug: 503016
Gentoo-Bug: 525614
Gentoo-Bug: 554918
Gentoo-Bug: 565154
Signed-off-by: Doug Goldstein <cardoe@gentoo.org>
Signed-off-by: Robin H. Johnson <robbat2@gentoo.org>
sys-fs/lvm2/files/lvm.rc-2.02.116-r3 [new file with mode: 0644]
sys-fs/lvm2/lvm2-2.02.116-r3.ebuild

diff --git a/sys-fs/lvm2/files/lvm.rc-2.02.116-r3 b/sys-fs/lvm2/files/lvm.rc-2.02.116-r3
new file mode 100644 (file)
index 0000000..059e880
--- /dev/null
@@ -0,0 +1,134 @@
+#!/sbin/runscript
+# Copyright 1999-2014 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Id$
+
+_get_lvm_path() {
+       local lvm_path=
+       for lvm_path in /bin/lvm /sbin/lvm ; do
+               [ -x "$lvm_path" ] && break
+       done
+       echo "${lvm_path}"
+}
+
+_need_lvmetad()
+{
+       local lvm_path="$(_get_lvm_path)"
+       [ ! -x "${lvm_path}" ] && return 1
+       ${lvm_path} dumpconfig global | grep -q 'use_lvmetad=1'
+}
+
+depend() {
+       before checkfs fsck
+       after modules device-mapper
+       need lvmetad sysfs
+       # We may use lvmetad based on the configuration. If we added lvmetad
+       # support while lvm2 is running then we aren't dependent on it. For the
+       # more common case, if its disabled in the config we aren't dependent
+       # on it.
+       config /etc/lvm/lvm.conf
+       local _need=
+       if service_started; then
+               _need=$(service_get_value need)
+       else
+               if _need_lvmetad; then
+                       _need="${_need} lvmetad"
+               fi
+       fi
+       need ${_need}
+}
+
+config='global { locking_dir = "/run/lock/lvm" }'
+
+dm_in_proc() {
+       local retval=0
+       for x in devices misc ; do
+               grep -qs 'device-mapper' /proc/${x}
+               retval=$((${retval} + $?))
+       done
+       return ${retval}
+}
+
+start() {
+       # LVM support for /usr, /home, /opt ....
+       # This should be done *before* checking local
+       # volumes, or they never get checked.
+
+       # NOTE: Add needed modules for LVM or RAID, etc
+       #       to /etc/modules.autoload if needed
+       lvm_path="$(_get_lvm_path)"
+       for lvm_path in /bin/lvm /sbin/lvm ; do
+               [ -x "$lvm_path" ] && break
+       done
+       if [ ! -x "$lvm_path" ]; then
+               eerror "Cannot find lvm binary in /sbin or /bin!"
+               return 1
+       fi
+       if [ -z "${CDBOOT}" ] ; then
+               if [ -e /proc/modules ] && ! dm_in_proc ; then
+                       modprobe dm-mod 2>/dev/null
+               fi
+               if [ -d /proc/lvm ] || dm_in_proc ; then
+                       ebegin "Setting up the Logical Volume Manager"
+                       #still echo stderr for debugging
+                       lvm_commands="#! ${lvm_path} --config '${config}'\n"
+                       # Extra PV find pass because some devices might not have been available until very recently
+                       lvm_commands="${lvm_commands}pvscan\n"
+                       # Now make the nodes
+                       lvm_commands="${lvm_commands}vgscan --mknodes\n"
+                       # And turn them on!
+                       lvm_commands="${lvm_commands}vgchange --sysinit -a ly\n"
+                       # Order of this is important, have to work around dash and LVM readline
+                       printf "%b\n" "${lvm_commands}" | $lvm_path /proc/self/fd/0 --config "${config}" >/dev/null
+                       eend $? "Failed to setup the LVM"
+               fi
+       fi
+}
+
+start_post()
+{
+       # Save if we needed lvmetad
+       if _need_lvmetad; then
+               service_set_value need lvmetad
+       fi
+}
+
+stop() {
+       for lvm_path in /bin/lvm /sbin/lvm ; do
+               [ -x "$lvm_path" ] && break
+       done
+       if [ ! -x "$lvm_path" ]; then
+               eerror "Cannot find lvm binary in /sbin or /bin!"
+               return 1
+       fi
+# Stop LVM2
+if [ -x /sbin/vgs ] && \
+   [ -x /sbin/vgchange ] && \
+   [ -x /sbin/lvchange ] && \
+   [ -f /etc/lvmtab -o -d /etc/lvm ] && \
+   [ -d /proc/lvm  -o "`grep device-mapper /proc/misc 2>/dev/null`" ]
+then
+       einfo "Shutting down the Logical Volume Manager"
+
+        VGS=$($lvm_path vgs --config "${config}" -o vg_name --noheadings --nosuffix --rows 2> /dev/null)
+
+        if [ "$VGS" ]
+        then
+            ebegin "  Shutting Down LVs & VGs"
+                       #still echo stderr for debugging
+                       lvm_commands="#! ${lvm_path} --config '${config}'\n"
+                       # Extra PV find pass because some devices might not have been available until very recently
+                       lvm_commands="${lvm_commands}lvchange --sysinit -a ln ${VGS}\n"
+                       # Now make the nodes
+                       lvm_commands="${lvm_commands}vgchange --sysinit -a ln ${VGS}\n"
+                       # Order of this is important, have to work around dash and LVM readline
+                       printf "%b\n" "${lvm_commands}" | $lvm_path /proc/self/fd/0 --config "${config}" >/dev/null
+                       eend $? "Failed (possibly some LVs still needed for /usr or root)"
+        fi
+
+       einfo "Finished shutting down the Logical Volume Manager"
+       return 0
+fi
+}
+
+# vim:ts=4
index 3146e3c0ecfba61c0f4351f48eb312e3051fa522..e62a3b6e8af97f6b27e9cd804659203a3c58503a 100644 (file)
@@ -227,7 +227,7 @@ src_install() {
 
        if use !device-mapper-only ; then
                newinitd "${FILESDIR}"/dmeventd.initd-2.02.67-r1 dmeventd
-               newinitd "${FILESDIR}"/lvm.rc-2.02.105-r2 lvm
+               newinitd "${FILESDIR}"/lvm.rc-2.02.116-r3 lvm
                newconfd "${FILESDIR}"/lvm.confd-2.02.28-r2 lvm
 
                newinitd "${FILESDIR}"/lvm-monitoring.initd-2.02.105-r2 lvm-monitoring