The commit is pushed to "branch-rh7-3.10.0-229.7.2-ovz" and will appear at https://src.openvz.org/scm/ovz/vzkernel.git after rh7-3.10.0-229.7.2.vz7.6.3 ------> commit 17dd96483ff558d44c98c3f8bcb04a86aca843a5 Author: Vladimir Davydov <vdavy...@parallels.com> Date: Fri Aug 28 16:42:43 2015 +0400
ve/binfmt_misc: do not use sb->s_fs_info 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: When we virtualized binfmt_misc, we made sb->s_fs_info store a pointer to binfmt_misc struct. At the same time, we store a pointer to the owner ve_struct in sb->s_ns and a pointer to the same binfmt_misc struct in ve_struct->binfmt_misc. That said, we don't actually need to use s_fs_info, because we can get the binfmt_misc by dereferencing sb->s_ns->binfmt_misc. Using sb->s_fs_info instead of sb->s_ns will allow us to revert our patches introducing sb->s_ns. This could be merged to 0b0dbb644794 ("VE/BINFTM: virtualization"). Signed-off-by: Vladimir Davydov <vdavy...@parallels.com> --- fs/binfmt_misc.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/fs/binfmt_misc.c b/fs/binfmt_misc.c index 7e760d2..d0cb80c 100644 --- a/fs/binfmt_misc.c +++ b/fs/binfmt_misc.c @@ -65,6 +65,8 @@ struct binfmt_misc { int entry_count; }; +#define BINFMT_MISC(sb) (((struct ve_struct *)(sb)->s_ns)->binfmt_misc) + /* * Check if we support the binfmt * if we do, return the node, else NULL @@ -541,7 +543,7 @@ static ssize_t bm_entry_write(struct file *file, const char __user *buffer, Node *e = file_inode(file)->i_private; int res = parse_command(buffer, count); struct super_block *sb = file->f_path.dentry->d_sb; - struct binfmt_misc *bm_data = sb->s_fs_info; + struct binfmt_misc *bm_data = BINFMT_MISC(sb); switch (res) { case 1: clear_bit(Enabled, &e->flags); @@ -576,7 +578,7 @@ static ssize_t bm_register_write(struct file *file, const char __user *buffer, struct inode *inode; struct dentry *root, *dentry; struct super_block *sb = file->f_path.dentry->d_sb; - struct binfmt_misc *bm_data = sb->s_fs_info; + struct binfmt_misc *bm_data = BINFMT_MISC(sb); int err = 0; e = create_entry(buffer, count); @@ -641,7 +643,7 @@ static const struct file_operations bm_register_operations = { static ssize_t bm_status_read(struct file *file, char __user *buf, size_t nbytes, loff_t *ppos) { - struct binfmt_misc *bm_data = file->f_dentry->d_sb->s_fs_info; + struct binfmt_misc *bm_data = BINFMT_MISC(file->f_dentry->d_sb); char *s = bm_data->enabled ? "enabled\n" : "disabled\n"; return simple_read_from_buffer(buf, nbytes, ppos, s, strlen(s)); @@ -650,7 +652,7 @@ bm_status_read(struct file *file, char __user *buf, size_t nbytes, loff_t *ppos) static ssize_t bm_status_write(struct file * file, const char __user * buffer, size_t count, loff_t *ppos) { - struct binfmt_misc *bm_data = file->f_dentry->d_sb->s_fs_info; + struct binfmt_misc *bm_data = BINFMT_MISC(file->f_dentry->d_sb); int res = parse_command(buffer, count); struct dentry *root; @@ -681,7 +683,7 @@ static const struct file_operations bm_status_operations = { static void bm_put_super(struct super_block *sb) { - struct binfmt_misc *bm_data = sb->s_fs_info; + struct binfmt_misc *bm_data = BINFMT_MISC(sb); struct ve_struct *ve = sb->s_ns; bm_data->enabled = 0; @@ -723,7 +725,6 @@ static int bm_fill_super(struct super_block * sb, void * data, int silent) } sb->s_op = &s_ops; - sb->s_fs_info = bm_data; bm_data->enabled = 1; get_ve(ve); _______________________________________________ Devel mailing list Devel@openvz.org https://lists.openvz.org/mailman/listinfo/devel