Introduce new helper mount_and_collect_binfmt_misc(),
and do all the work there.

Signed-off-by: Kirill Tkhai <[email protected]>
---
 criu/mount.c |   61 ++++++++++++++++++++++++++++++++++------------------------
 1 file changed, 36 insertions(+), 25 deletions(-)

diff --git a/criu/mount.c b/criu/mount.c
index 7daeef326..fec8ef00e 100644
--- a/criu/mount.c
+++ b/criu/mount.c
@@ -1473,7 +1473,40 @@ static __maybe_unused int mount_cr_time_mount(struct 
ns_id *ns, unsigned int *s_
        return ret < 0 ? 0 : exit_code;
 }
 
+static __maybe_unused int mount_and_collect_binfmt_misc(void)
+{
+       unsigned int s_dev = 0;
+       struct ns_id *ns;
+       int ret;
 
+       for (ns = ns_ids; ns != NULL; ns = ns->next) {
+               if (ns->type == NS_ROOT && ns->nd == &mnt_ns_desc)
+                       break;
+       }
+       BUG_ON(!ns);
+
+       ret = mount_cr_time_mount(ns, &s_dev, "binfmt_misc", "/" 
BINFMT_MISC_HOME,
+                                 "binfmt_misc");
+       if (ret == -EPERM || ret == -ENODEV || ret == -ENOENT) {
+               /*
+                * EPERM is returned when we're in !init_user_ns, ENODEV and 
ENOENT
+                * when no binfmt_misc module is loaded.
+                */
+               pr_info("Can't mount binfmt_misc: %d %s\n", ret, 
strerror(-ret));
+               ret = 0;
+       } else if (ret < 0) {
+               errno = -ret;
+               pr_perror("Can't mount binfmt_misc");
+       } else if (ret == 0) {
+               /* Error not connected with mount */
+               ret = -1;
+       } else if (ret > 0) {
+               ret = add_cr_time_mount(ns->mnt.mntinfo_tree, "binfmt_misc",
+                                       BINFMT_MISC_HOME, s_dev);
+       }
+
+       return ret;
+}
 
 static int dump_one_fs(struct mount_info *mi)
 {
@@ -3488,31 +3521,9 @@ int collect_mnt_namespaces(bool for_dump)
 
 #ifdef CONFIG_BINFMT_MISC_VIRTUALIZED
        if (for_dump && !opts.has_binfmt_misc) {
-               unsigned int s_dev = 0;
-               struct ns_id *ns;
-
-               for (ns = ns_ids; ns != NULL; ns = ns->next) {
-                       if (ns->type == NS_ROOT && ns->nd == &mnt_ns_desc)
-                               break;
-               }
-
-               if (ns) {
-                       ret = mount_cr_time_mount(ns, &s_dev, "binfmt_misc", 
"/" BINFMT_MISC_HOME,
-                                                 "binfmt_misc");
-                       if (ret == -EPERM)
-                               pr_info("Can't mount binfmt_misc: EPERM. 
Running in user_ns?\n");
-                       else if (ret < 0 && ret != -ENODEV && ret != -ENOENT) {
-                               pr_err("Can't mount binfmt_misc: %d %s\n", ret, 
strerror(-ret));
-                               goto err;
-                       } else if (ret == 0) {
-                               ret = -1;
-                               goto err;
-                       } else if (ret > 0 && 
add_cr_time_mount(ns->mnt.mntinfo_tree, "binfmt_misc",
-                                                               
BINFMT_MISC_HOME, s_dev) < 0) {
-                               ret = -1;
-                               goto err;
-                       }
-               }
+               ret = mount_and_collect_binfmt_misc();
+               if (ret)
+                       goto err;
        }
 #endif
 

_______________________________________________
Devel mailing list
[email protected]
https://lists.openvz.org/mailman/listinfo/devel

Reply via email to