From: Cyrill Gorcunov <gorcu...@openvz.org>

The restore of ploop device is a bit tricky: its major/minor
is not a constant but allocated dynamicaly by the kernel
driver. Thus we may have a situation when /dev/ploopXX
points for some obsolete name which we have to resolve
into valid device.

For this sake we save old name in dev/$uuid form and
when mount namespaces are restored but their roots
are not moved we should walk over every root point
and figure out if there ploop device to be adjusted.

This patch requires CRIU to export "CRIU_MNT_NS_ROOTS".

https://jira.sw.ru/browse/PSBM-71861

Signed-off-by: Cyrill Gorcunov <gorcu...@openvz.org>
---
 scripts/vz-rst-action.in | 67 ++++++++++++++++++++++++++----------------------
 1 file changed, 37 insertions(+), 30 deletions(-)

diff --git a/scripts/vz-rst-action.in b/scripts/vz-rst-action.in
index fec68a7..a532bad 100755
--- a/scripts/vz-rst-action.in
+++ b/scripts/vz-rst-action.in
@@ -28,40 +28,48 @@
 
 exec 1>&2
 
+action_script=@SCRIPTDIR@/vz-rst-action
+
 restore_devices()
 {
        local s d t major minor old dir device
        local pid=$CRTOOLS_INIT_PID
 
-       root=/proc/$pid/root
-
-       # VE_PLOOP_DEVS=UUID@ploopN:major:minor:[root]
-       for s in $VE_PLOOP_DEVS; do
-               uuid=${s%%@*}
-               t=${s#*@}
-               device=${t%%:*}
-               t=${t#*:}
-               major=${t%%:*}
-               t=${t#*:}
-               minor=${t%%:*}
-
-               [ ! -L "$root/dev/$uuid" ] && continue
-
-               old=$(readlink $root/dev/$uuid)
-               [ -z "$old" ] && continue
-
-               for d in "${old}" "${device}"; do
-                       dir=$root/$d
-                       dir=${dir%/*}
-                       if [ -e "$dir" ]; then
-                               rm -f $root/$d
-                       else
-                               mkdir -p $dir
-                       fi
-                       mknod -m 600 $root/$d b $major $minor
-               done
+       if [ -z "$VZ_RST_USE_NSENTER" ]; then
+               export VZ_RST_USE_NSENTER="y"
+               nsenter -m -t $pid bash $action_script
+               exit 0
+       fi
 
-               rm -f $root/dev/$uuid
+       for root in $CRIU_MNT_NS_ROOTS; do
+               # VE_PLOOP_DEVS=UUID@ploopN:major:minor:[root]
+               for s in $VE_PLOOP_DEVS; do
+                       uuid=${s%%@*}
+                       t=${s#*@}
+                       device=${t%%:*}
+                       t=${t#*:}
+                       major=${t%%:*}
+                       t=${t#*:}
+                       minor=${t%%:*}
+
+                       [ ! -L "$root/dev/$uuid" ] && continue
+
+                       old=$(readlink $root/dev/$uuid)
+                       [ -z "$old" ] && continue
+
+                       for d in "${old}" "${device}"; do
+                               dir=$root/$d
+                               dir=${dir%/*}
+                               if [ -e "$dir" ]; then
+                                       rm -f $root/$d
+                               else
+                                       mkdir -p $dir
+                               fi
+                               mknod -m 600 $root/$d b $major $minor
+                       done
+
+                       rm -f $root/dev/$uuid
+               done
        done
 }
 
@@ -87,6 +95,7 @@ case "$CRTOOLS_SCRIPT_ACTION" in
        ;;
 "post-setup-namespaces")
        if [ -n "$VEID" ]; then
+               restore_devices
                [ -n "$VE_OS_RELEASE" ] && cgset -r 
ve.os_release="$VE_OS_RELEASE" $VEID
                [ -n "$VE_PID_MAX" ] && cgset -r ve.pid_max="$VE_PID_MAX" $VEID
        fi
@@ -97,8 +106,6 @@ case "$CRTOOLS_SCRIPT_ACTION" in
                exit 1
        fi
 
-       restore_devices
-
        if [ -n "$VEID" ]; then
                [ -f "$CRTOOLS_IMAGE_DIR/vz_core_pattern.img" ] && \
                        { cgexec -g ve:$VEID echo `cat 
$CRTOOLS_IMAGE_DIR/vz_core_pattern.img` \
-- 
2.7.5

_______________________________________________
Devel mailing list
Devel@openvz.org
https://lists.openvz.org/mailman/listinfo/devel

Reply via email to