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