From: Kirill Tkhai <ktk...@odin.com>

It's the similar to VZCTL_VE_CONFIGURE ioctl in PCS6.

Note: max_write_len is __NEW_UTS_LEN + 1, because I want to allow

echo ... > ve.os_release, which adds trailing '\n' to the string
(see man echo for details).

Extra symbol will be cut in ve_os_release_write().

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

Signed-off-by: Kirill Tkhai <ktk...@odin.com>
Signed-off-by: Stanislav Kinsburskiy <skinsbur...@virtuozzo.com>

(cherry picked from vz8 commit d9c541f7a5f43f1f39df07f3b50d2704c3f2fe9b)
Signed-off-by: Andrey Zhadchenko <andrey.zhadche...@virtuozzo.com>
---
 kernel/ve/ve.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 56 insertions(+)

diff --git a/kernel/ve/ve.c b/kernel/ve/ve.c
index 751f43f..03eb636 100644
--- a/kernel/ve/ve.c
+++ b/kernel/ve/ve.c
@@ -647,6 +647,55 @@ static u64 ve_netns_avail_nr_read(struct 
cgroup_subsys_state *css, struct cftype
        return atomic_read(&css_to_ve(css)->netns_avail_nr);
 }
 
+static int ve_os_release_read(struct seq_file *sf, void *v)
+{
+       struct cgroup_subsys_state *css = seq_css(sf);
+       struct ve_struct *ve = css_to_ve(css);
+       int ret = 0;
+
+       down_read(&ve->op_sem);
+
+       if (!ve->ve_ns) {
+               ret = -ENOENT;
+               goto up_opsem;
+       }
+
+       down_read(&uts_sem);
+       seq_puts(sf, ve->ve_ns->uts_ns->name.release);
+       seq_putc(sf, '\n');
+       up_read(&uts_sem);
+up_opsem:
+       up_read(&ve->op_sem);
+
+       return ret;
+}
+
+static ssize_t ve_os_release_write(struct kernfs_open_file *of, char *buf,
+                                  size_t nbytes, loff_t off)
+{
+       struct cgroup_subsys_state *css = of_css(of);
+       struct ve_struct *ve = css_to_ve(css);
+       char *release;
+       int ret = 0;
+
+       down_read(&ve->op_sem);
+
+       if (!ve->ve_ns) {
+               ret = -ENOENT;
+               goto up_opsem;
+       }
+
+       down_write(&uts_sem);
+       release = ve->ve_ns->uts_ns->name.release;
+       strncpy(release, buf, __NEW_UTS_LEN);
+       release[__NEW_UTS_LEN] = '\0';
+       up_write(&uts_sem);
+up_opsem:
+       up_read(&ve->op_sem);
+
+       return ret ? ret : nbytes;
+}
+
 static struct cftype ve_cftypes[] = {
 
        {
@@ -683,6 +732,13 @@ static u64 ve_netns_avail_nr_read(struct 
cgroup_subsys_state *css, struct cftype
                .name                   = "netns_avail_nr",
                .read_u64               = ve_netns_avail_nr_read,
        },
+       {
+               .name                   = "os_release",
+               .max_write_len          = __NEW_UTS_LEN + 1,
+               .flags                  = CFTYPE_NOT_ON_ROOT,
+               .seq_show               = ve_os_release_read,
+               .write                  = ve_os_release_write,
+       },
        { }
 };
 
-- 
1.8.3.1

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

Reply via email to