diff -NurpP linux-2.6.18.3-vs2.1.1.2.x/include/linux/vserver/base.h linux-2.6.18.3-vs2.1.1.2.3/include/linux/vserver/base.h --- linux-2.6.18.3-vs2.1.1.2.x/include/linux/vserver/base.h 2006-11-27 18:27:07 +0100 +++ linux-2.6.18.3-vs2.1.1.2.3/include/linux/vserver/base.h 2006-11-27 00:32:20 +0100 @@ -48,6 +48,13 @@ enum { #define VS_WATCH_P VS_WATCH #endif +#define VS_HARDIRQ 0x1000 +#define VS_SOFTIRQ 0x2000 +#define VS_IRQ 0x4000 + +#define VS_IRQ_MASK 0xF000 + +#include /* * check current context for ADMIN/WATCH and @@ -69,6 +76,14 @@ static inline int __vs_check(int cid, in (id > 1) && (id < MIN_D_CONTEXT)) return 1; } + if (mode & VS_IRQ_MASK) { + if ((mode & VS_IRQ) && unlikely(in_interrupt())) + return 1; + if ((mode & VS_HARDIRQ) && unlikely(in_irq())) + return 1; + if ((mode & VS_SOFTIRQ) && unlikely(in_softirq())) + return 1; + } return (((mode & VS_ADMIN) && (cid == 0)) || ((mode & VS_WATCH) && (cid == 1)) || ((mode & VS_HOSTID) && (id == 0))); @@ -81,7 +96,7 @@ static inline int __vs_check(int cid, in #define current_vx_info() (current->vx_info) -#define vx_check(c,m) __vs_check(vx_current_xid(),c,(m)) +#define vx_check(c,m) __vs_check(vx_current_xid(),c,(m)|VS_IRQ) #define vx_weak_check(c,m) ((m) ? vx_check(c,m) : 1)