From: Valeriy Vdovin <valeriy.vdo...@virtuozzo.com>

Patchset description:

zap sb->s_ns + fix memleak in binfmt_misc

Vladimir Davydov (6):
  binfmt_misc: do not use sb->s_fs_info
  Revert "VE/VFS: use sb->s_ns member to store namespace for mount_ns()
    calls"
  Revert "ve/sunrpc: use correct pointer to net_namespace in auth_gss.c"
  Revert "nfsd/sunrpc/mqueue: use sb->s_ns instead of data in
    fill_super"
  binfmt_misc: do not use s_ns
  binfmt_misc: destroy all nodes on ve stop

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

Reviewed-by: Cyrill Gorcunov <gorcu...@virtuozzo.com>

======================
This patch description:

Each registered binfmt_misc node pins binfmt_misc mount point, which in
turn pins the owner ve. This means that if we don't clean up binfmt_misc
nodes on ve stop, the mount point as well as the ve struct will leak.

Signed-off-by: Vladimir Davydov <vdavy...@parallels.com>

(cherry-picked from commit a018c0f03fa1d072e0970d31b5c5f57be5c2cdb5)

Signed-off-by: Valeriy Vdovin <valeriy.vdo...@virtuozzo.com>

(cherry picked from vz8 commit 99728e0f8de999d45ffb6d4f87ab0fad353997be)
Signed-off-by: Andrey Zhadchenko <andrey.zhadche...@virtuozzo.com>
---
 fs/binfmt_misc.c | 28 +++++++++++++++++++++++++++-
 1 file changed, 27 insertions(+), 1 deletion(-)

diff --git a/fs/binfmt_misc.c b/fs/binfmt_misc.c
index da0dfe2..628d4fc 100644
--- a/fs/binfmt_misc.c
+++ b/fs/binfmt_misc.c
@@ -909,16 +909,42 @@ static void bm_kill_sb(struct super_block *sb)
 };
 MODULE_ALIAS_FS("binfmt_misc");
 
+static void ve_binfmt_fini(void *data)
+{
+       struct ve_struct *ve = data;
+       struct binfmt_misc *bm_data = ve->binfmt_misc;
+
+       if (!bm_data)
+               return;
+
+       /*
+        * XXX: Note we don't take any locks here. This is safe as long as
+        * nobody uses binfmt_misc outside the owner ve.
+        */
+       while (!list_empty(&bm_data->entries))
+               kill_node(bm_data, list_first_entry(
+                       &bm_data->entries, Node, list));
+}
+
+static struct ve_hook ve_binfmt_hook = {
+       .fini           = ve_binfmt_fini,
+       .priority       = HOOK_PRIO_DEFAULT,
+       .owner          = THIS_MODULE,
+};
+
 static int __init init_misc_binfmt(void)
 {
        int err = register_filesystem(&bm_fs_type);
-       if (!err)
+       if (!err) {
                insert_binfmt(&misc_format);
+               ve_hook_register(VE_SS_CHAIN, &ve_binfmt_hook);
+       }
        return err;
 }
 
 static void __exit exit_misc_binfmt(void)
 {
+       ve_hook_unregister(&ve_binfmt_hook);
        unregister_binfmt(&misc_format);
        unregister_filesystem(&bm_fs_type);
 }
-- 
1.8.3.1

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

Reply via email to