X-Git-Url: http://git.linux-vserver.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=scripts%2Fvserver.functions;h=dfddc6b92773e8c7ebcd5395c729eed857fd72b0;hb=4cc6746ff2ab2c7e32e7bc20111cec287a4fb113;hp=0f812d40200691ae02d12f931761aa52c2191401;hpb=2ccb6aff8218b761cab25da6a5fda09baf602871;p=util-vserver.git diff --git a/scripts/vserver.functions b/scripts/vserver.functions index 0f812d4..dfddc6b 100644 --- a/scripts/vserver.functions +++ b/scripts/vserver.functions @@ -689,6 +689,54 @@ function generateOptions fi } +function addtoCPUSET +{ + local vdir=$1 + local cpuset + local f="$vdir"/cpuset + local i + local configured=0 + + test -d "$f" || return 0 + test -e "$f"/name || return 0 + + read cpuset < "$f"/name + test -e "$f"/nocreate || { + test -d /dev/cpuset/"$cpuset" || mkdir /dev/cpuset/"$cpuset" || configured=1 + for i in cpus mems cpu_exclusive mem_exclusive virtualized; do + if test -e "$f"/"$i"; then + cat "$f"/"$i" >/dev/cpuset/"$cpuset"/"$i" 2>/dev/null || { + configured=1 + break + } + fi + done + } + + echo $$ >/dev/cpuset/"$cpuset"/tasks || configured=1 + if [ "$configured" -ne 0 ]; then + warning $"\ +WARNING: Failed to create or CPUSET \"$cpuset\" does not exist! Not using it!" >&2 + rmdir /dev/cpuset/"$cpuset" 2>/dev/null || : + return 0 + fi +} + +function removeCPUSET +{ + local vdir=$1 + local cpuset + local f="$vdir"/cpuset + + test -d "$f" || return 0 + test -e "$f"/name || return 0 + + read cpuset < "$f"/name + test -e "$f"/nocreate || { + rmdir /dev/cpuset/"$cpuset" 2>/dev/null || : + } +} + function _mountVserverInternal { local fstab="$1" @@ -742,13 +790,13 @@ function mountVserver test -n "$_HAVE_CHBIND_OPTIONS" || _generateChbindOptions "$cfgdir" - test -z "$NAMESPACE_CLEANUP" || isAvoidNamespace "$cfgdir" || \ - $_VNAMESPACE --cleanup - _mountVserverInternal "$cfgdir"/fstab _mountVserverInternal "$cfgdir"/fstab.local _mountVserverInternal "$cfgdir"/fstab.remote $_CHBIND "${CHBIND_OPTS[@]}" + isNamespaceCleanup "$cfgdir" && \ + _namespaceCleanup + isAvoidNamespace "$cfgdir" || \ $_SECURE_MOUNT --rbind -n "$vdir" "/" } @@ -1100,3 +1148,29 @@ function saveDiskLimits _saveSingleDiskLimit "$vdir" "$dlimit" done } + +function _namespaceCleanup +{ + local root=$(readlink -f "$vdir") + local tmp="$root" + local -a list + while [ "$tmp" ]; do + list=( "${list[@]}" "$tmp" ) + tmp="${tmp%/*}" + done + local -a list_umount + while read dev path opts; do + [ "$path" ] || continue + for i in "$root" /dev /proc; do + [ "${path#$i}" != "$path" ] && continue 2 + done + for i in "${list[@]}" /; do + [ "$path" = "$i" ] && continue 2 + done + list_umount=( "${list_umount[@]}" "$path" ) + done < /proc/mounts + for i in "${list_umount[@]}"; do + umount -l -n "$i" + done +} +