net/bonding: Sanity-check sysfs usage

If sysfs is not available, you might still be able to create bond
interfaces, but only in very specific configurations, and you must have
the ifenslave binary instead to call ioctls.

Signed-off-by: Robin H. Johnson <robbat2@gentoo.org>
This commit is contained in:
Robin H. Johnson 2012-10-11 03:54:32 +00:00
parent 27984c0d2d
commit a9f1ac2dfd

View File

@ -5,6 +5,11 @@ bonding_depend()
{
before interface macchanger
program /sbin/ifconfig /bin/ifconfig
# If you do not have sysfs, you MUST have this binary instead for ioctl
# Also you will loose some functionality that cannot be done via sysfs:
if [ ! -d /sys/class/net ]; then
program /sbin/ifenslave
fi
}
_config_vars="$_config_vars slaves"
@ -38,6 +43,10 @@ bonding_pre_start()
fi
fi
if [ ! -d /sys/class/net ]; then
ewarn "sysfs is not available! You will be unable to create new bonds, or change dynamic parameters!"
fi
# We can create the interface name we like now, but this
# requires sysfs
if ! _exists && [ -d /sys/class/net ]; then
@ -55,7 +64,7 @@ bonding_pre_start()
# Configure the bond mode, then we can reloop to ensure we configure
# All other options
for x in /sys/class/net/"${IFACE}"/bonding/mode; do
[ -d /sys/class/net ] && for x in /sys/class/net/"${IFACE}"/bonding/mode; do
[ -f "${x}" ] || continue
n=${x##*/}
eval s=\$${n}_${IFVAR}
@ -66,7 +75,7 @@ bonding_pre_start()
fi
done
# Nice and dynamic for remaining options:)
for x in /sys/class/net/"${IFACE}"/bonding/*; do
[ -d /sys/class/net ] && for x in /sys/class/net/"${IFACE}"/bonding/*; do
[ -f "${x}" ] || continue
n=${x##*/}
eval s=\$${n}_${IFVAR}
@ -154,7 +163,7 @@ bonding_pre_start()
fi
done
else
/sbin/ifenslave "${IFACE}" ${slaves} >/dev/null
ifenslave "${IFACE}" ${slaves} >/dev/null
fi
eend $?
@ -187,7 +196,7 @@ bonding_stop()
echo -"${s}" > /sys/class/net/"${IFACE}"/bonding/slaves
done
else
/sbin/ifenslave -d "${IFACE}" ${slaves}
ifenslave -d "${IFACE}" ${slaves}
fi
# reset all slaves