diff -NurpP --minimal linux-3.0-vs2.3.1-pre8/include/linux/vserver/base.h linux-3.0-vs2.3.1-pre9/include/linux/vserver/base.h --- linux-3.0-vs2.3.1-pre8/include/linux/vserver/base.h 2011-06-13 14:09:44.000000000 +0200 +++ linux-3.0-vs2.3.1-pre9/include/linux/vserver/base.h 2011-08-01 18:26:07.000000000 +0200 @@ -161,6 +161,11 @@ enum { !((f) & ~vx_current_umask()))) +#define __vx_wmask(v) ((v)->vx_wmask) + +#define vx_current_wmask() __vx_wmask(current_vx_info()) + + #define __vx_state(v) ((v) ? ((v)->vx_state) : 0) #define vx_info_state(v, m) (__vx_state(v) & (m)) diff -NurpP --minimal linux-3.0-vs2.3.1-pre8/include/linux/vserver/context.h linux-3.0-vs2.3.1-pre9/include/linux/vserver/context.h --- linux-3.0-vs2.3.1-pre8/include/linux/vserver/context.h 2011-06-10 22:11:24.000000000 +0200 +++ linux-3.0-vs2.3.1-pre9/include/linux/vserver/context.h 2011-08-01 18:23:13.000000000 +0200 @@ -119,6 +119,7 @@ struct vx_info { uint64_t vx_flags; /* context flags */ uint64_t vx_ccaps; /* context caps (vserver) */ uint64_t vx_umask; /* unshare mask (guest) */ + uint64_t vx_wmask; /* warn mask (guest) */ kernel_cap_t vx_bcaps; /* bounding caps (system) */ struct task_struct *vx_reaper; /* guest reaper process */ diff -NurpP --minimal linux-3.0-vs2.3.1-pre8/include/linux/vserver/context_cmd.h linux-3.0-vs2.3.1-pre9/include/linux/vserver/context_cmd.h --- linux-3.0-vs2.3.1-pre8/include/linux/vserver/context_cmd.h 2011-06-10 22:11:24.000000000 +0200 +++ linux-3.0-vs2.3.1-pre9/include/linux/vserver/context_cmd.h 2011-08-01 18:25:07.000000000 +0200 @@ -128,6 +128,23 @@ extern int vc_set_umask(struct vx_info * #endif /* __KERNEL__ */ +/* wmask commands */ + +#define VCMD_get_wmask VC_CMD(FLAGS, 15, 0) +#define VCMD_set_wmask VC_CMD(FLAGS, 16, 0) + +struct vcmd_wmask { + uint64_t wmask; + uint64_t mask; +}; + +#ifdef __KERNEL__ +extern int vc_get_wmask(struct vx_info *, void __user *); +extern int vc_set_wmask(struct vx_info *, void __user *); + +#endif /* __KERNEL__ */ + + /* OOM badness */ #define VCMD_get_badness VC_CMD(MEMCTRL, 5, 0) diff -NurpP --minimal linux-3.0-vs2.3.1-pre8/kernel/vserver/context.c linux-3.0-vs2.3.1-pre9/kernel/vserver/context.c --- linux-3.0-vs2.3.1-pre8/kernel/vserver/context.c 2011-07-19 19:22:49.000000000 +0200 +++ linux-3.0-vs2.3.1-pre9/kernel/vserver/context.c 2011-08-01 18:28:12.000000000 +0200 @@ -3,7 +3,7 @@ * * Virtual Server: Context Support * - * Copyright (C) 2003-2010 Herbert Pötzl + * Copyright (C) 2003-2011 Herbert Pötzl * * V0.01 context helper * V0.02 vx_ctx_kill syscall command @@ -23,6 +23,7 @@ * V0.16 have __create claim() the vxi * V0.17 removed older and legacy stuff * V0.18 added user credentials + * V0.19 added warn mask * */ @@ -118,6 +119,7 @@ static struct vx_info *__alloc_vx_info(x new->vx_bcaps = CAP_FULL_SET; // maybe ~CAP_SETPCAP new->vx_ccaps = 0; new->vx_umask = 0; + new->vx_wmask = 0; new->reboot_cmd = 0; new->exit_code = 0; @@ -1052,6 +1054,31 @@ int vc_set_umask(struct vx_info *vxi, vo } +int vc_get_wmask(struct vx_info *vxi, void __user *data) +{ + struct vcmd_wmask vc_data; + + vc_data.wmask = vxi->vx_wmask; + vc_data.mask = ~0ULL; + + if (copy_to_user(data, &vc_data, sizeof(vc_data))) + return -EFAULT; + return 0; +} + +int vc_set_wmask(struct vx_info *vxi, void __user *data) +{ + struct vcmd_wmask vc_data; + + if (copy_from_user(&vc_data, data, sizeof(vc_data))) + return -EFAULT; + + vxi->vx_wmask = vs_mask_flags(vxi->vx_wmask, + vc_data.wmask, vc_data.mask); + return 0; +} + + int vc_get_badness(struct vx_info *vxi, void __user *data) { struct vcmd_badness_v0 vc_data; diff -NurpP --minimal linux-3.0-vs2.3.1-pre8/kernel/vserver/switch.c linux-3.0-vs2.3.1-pre9/kernel/vserver/switch.c --- linux-3.0-vs2.3.1-pre8/kernel/vserver/switch.c 2011-07-20 02:40:51.000000000 +0200 +++ linux-3.0-vs2.3.1-pre9/kernel/vserver/switch.c 2011-08-01 18:28:26.000000000 +0200 @@ -3,7 +3,7 @@ * * Virtual Server: Syscall Switch * - * Copyright (C) 2003-2007 Herbert Pötzl + * Copyright (C) 2003-2011 Herbert Pötzl * * V0.01 syscall switch * V0.02 added signal to context @@ -16,6 +16,7 @@ * V0.09 added tag commands * V0.10 added oom bias * V0.11 added device commands + * V0.12 added warn mask * */ @@ -115,6 +116,11 @@ long do_vcmd(uint32_t cmd, uint32_t id, case VCMD_get_umask: return vc_get_umask(vxi, data); + case VCMD_set_wmask: + return vc_set_wmask(vxi, data); + + case VCMD_get_wmask: + return vc_get_wmask(vxi, data); #ifdef CONFIG_IA32_EMULATION case VCMD_get_rlimit: return __COMPAT(vc_get_rlimit, vxi, data, compat); @@ -332,6 +338,7 @@ long do_vserver(uint32_t cmd, uint32_t i __VCMD(get_ccaps, 3, VCA_VXI, VCF_INFO); __VCMD(get_cflags, 3, VCA_VXI, VCF_INFO); __VCMD(get_umask, 3, VCA_VXI, VCF_INFO); + __VCMD(get_wmask, 3, VCA_VXI, VCF_INFO); __VCMD(get_badness, 3, VCA_VXI, VCF_INFO); __VCMD(get_vhi_name, 3, VCA_VXI, VCF_INFO); __VCMD(get_rlimit, 3, VCA_VXI, VCF_INFO); @@ -378,6 +385,7 @@ long do_vserver(uint32_t cmd, uint32_t i __VCMD(set_bcaps, 7, VCA_VXI, VCF_ARES | VCF_SETUP); __VCMD(set_cflags, 7, VCA_VXI, VCF_ARES | VCF_SETUP); __VCMD(set_umask, 7, VCA_VXI, VCF_ARES | VCF_SETUP); + __VCMD(set_wmask, 7, VCA_VXI, VCF_ARES | VCF_SETUP); __VCMD(set_badness, 7, VCA_VXI, VCF_ARES | VCF_SETUP); __VCMD(set_vhi_name, 7, VCA_VXI, VCF_ARES | VCF_SETUP);