diff -Nurp linux-2.6.22.18/arch/alpha/Kconfig linux-2.6.22.18-vs2.2.0.6/arch/alpha/Kconfig --- linux-2.6.22.18/arch/alpha/Kconfig 2007-07-21 23:59:44.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/alpha/Kconfig 2008-02-11 12:35:31.000000000 +0100 @@ -662,6 +662,8 @@ config DUMMY_CONSOLE depends on VGA_HOSE default y +source "kernel/vserver/Kconfig" + source "security/Kconfig" source "crypto/Kconfig" diff -Nurp linux-2.6.22.18/arch/alpha/kernel/asm-offsets.c linux-2.6.22.18-vs2.2.0.6/arch/alpha/kernel/asm-offsets.c --- linux-2.6.22.18/arch/alpha/kernel/asm-offsets.c 2006-06-18 03:49:35.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/alpha/kernel/asm-offsets.c 2008-02-11 12:35:31.000000000 +0100 @@ -36,6 +36,7 @@ void foo(void) DEFINE(PT_PTRACED, PT_PTRACED); DEFINE(CLONE_VM, CLONE_VM); DEFINE(CLONE_UNTRACED, CLONE_UNTRACED); + DEFINE(CLONE_KTHREAD, CLONE_KTHREAD); DEFINE(SIGCHLD, SIGCHLD); BLANK(); diff -Nurp linux-2.6.22.18/arch/alpha/kernel/entry.S linux-2.6.22.18-vs2.2.0.6/arch/alpha/kernel/entry.S --- linux-2.6.22.18/arch/alpha/kernel/entry.S 2007-07-21 23:59:44.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/alpha/kernel/entry.S 2008-02-11 12:35:31.000000000 +0100 @@ -643,7 +643,7 @@ kernel_thread: stq $2, 152($sp) /* HAE */ /* Shuffle FLAGS to the front; add CLONE_VM. */ - ldi $1, CLONE_VM|CLONE_UNTRACED + ldi $1, CLONE_VM | CLONE_UNTRACED | CLONE_KTHREAD; or $18, $1, $16 bsr $26, sys_clone @@ -872,24 +872,15 @@ sys_getxgid: .globl sys_getxpid .ent sys_getxpid sys_getxpid: + lda $sp, -16($sp) + stq $26, 0($sp) .prologue 0 - ldq $2, TI_TASK($8) - /* See linux/kernel/timer.c sys_getppid for discussion - about this loop. */ - ldq $3, TASK_GROUP_LEADER($2) - ldq $4, TASK_REAL_PARENT($3) - ldl $0, TASK_TGID($2) -1: ldl $1, TASK_TGID($4) -#ifdef CONFIG_SMP - mov $4, $5 - mb - ldq $3, TASK_GROUP_LEADER($2) - ldq $4, TASK_REAL_PARENT($3) - cmpeq $4, $5, $5 - beq $5, 1b -#endif - stq $1, 80($sp) + lda $16, 96($sp) + jsr $26, do_getxpid + ldq $26, 0($sp) + + lda $sp, 16($sp) ret .end sys_getxpid diff -Nurp linux-2.6.22.18/arch/alpha/kernel/osf_sys.c linux-2.6.22.18-vs2.2.0.6/arch/alpha/kernel/osf_sys.c --- linux-2.6.22.18/arch/alpha/kernel/osf_sys.c 2007-07-21 23:59:44.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/alpha/kernel/osf_sys.c 2008-02-11 12:35:31.000000000 +0100 @@ -883,7 +883,7 @@ osf_gettimeofday(struct timeval32 __user { if (tv) { struct timeval ktv; - do_gettimeofday(&ktv); + vx_gettimeofday(&ktv); if (put_tv32(tv, &ktv)) return -EFAULT; } diff -Nurp linux-2.6.22.18/arch/alpha/kernel/ptrace.c linux-2.6.22.18-vs2.2.0.6/arch/alpha/kernel/ptrace.c --- linux-2.6.22.18/arch/alpha/kernel/ptrace.c 2006-06-18 03:49:35.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/alpha/kernel/ptrace.c 2008-02-11 12:35:31.000000000 +0100 @@ -15,6 +15,7 @@ #include #include #include +#include #include #include @@ -283,6 +284,11 @@ do_sys_ptrace(long request, long pid, lo goto out_notsk; } + if (!vx_check(vx_task_xid(child), VS_WATCH_P | VS_IDENT)) { + ret = -EPERM; + goto out; + } + if (request == PTRACE_ATTACH) { ret = ptrace_attach(child); goto out; diff -Nurp linux-2.6.22.18/arch/alpha/kernel/semaphore.c linux-2.6.22.18-vs2.2.0.6/arch/alpha/kernel/semaphore.c --- linux-2.6.22.18/arch/alpha/kernel/semaphore.c 2006-06-18 03:49:35.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/alpha/kernel/semaphore.c 2008-02-11 12:35:31.000000000 +0100 @@ -68,8 +68,8 @@ __down_failed(struct semaphore *sem) DECLARE_WAITQUEUE(wait, tsk); #ifdef CONFIG_DEBUG_SEMAPHORE - printk("%s(%d): down failed(%p)\n", - tsk->comm, tsk->pid, sem); + printk("%s(%d:#%u): down failed(%p)\n", + tsk->comm, tsk->pid, tsk->xid, sem); #endif tsk->state = TASK_UNINTERRUPTIBLE; @@ -97,8 +97,8 @@ __down_failed(struct semaphore *sem) wake_up(&sem->wait); #ifdef CONFIG_DEBUG_SEMAPHORE - printk("%s(%d): down acquired(%p)\n", - tsk->comm, tsk->pid, sem); + printk("%s(%d:#%u): down acquired(%p)\n", + tsk->comm, tsk->pid, tsk->xid, sem); #endif } @@ -110,8 +110,8 @@ __down_failed_interruptible(struct semap long ret = 0; #ifdef CONFIG_DEBUG_SEMAPHORE - printk("%s(%d): down failed(%p)\n", - tsk->comm, tsk->pid, sem); + printk("%s(%d:#%u): down failed(%p)\n", + tsk->comm, tsk->pid, tsk->xid, sem); #endif tsk->state = TASK_INTERRUPTIBLE; diff -Nurp linux-2.6.22.18/arch/alpha/kernel/systbls.S linux-2.6.22.18-vs2.2.0.6/arch/alpha/kernel/systbls.S --- linux-2.6.22.18/arch/alpha/kernel/systbls.S 2007-07-21 23:59:44.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/alpha/kernel/systbls.S 2008-02-11 12:35:31.000000000 +0100 @@ -446,7 +446,7 @@ sys_call_table: .quad sys_stat64 /* 425 */ .quad sys_lstat64 .quad sys_fstat64 - .quad sys_ni_syscall /* sys_vserver */ + .quad sys_vserver /* sys_vserver */ .quad sys_ni_syscall /* sys_mbind */ .quad sys_ni_syscall /* sys_get_mempolicy */ .quad sys_ni_syscall /* sys_set_mempolicy */ diff -Nurp linux-2.6.22.18/arch/alpha/kernel/traps.c linux-2.6.22.18-vs2.2.0.6/arch/alpha/kernel/traps.c --- linux-2.6.22.18/arch/alpha/kernel/traps.c 2007-05-04 15:55:03.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/alpha/kernel/traps.c 2008-02-11 12:35:31.000000000 +0100 @@ -182,7 +182,8 @@ die_if_kernel(char * str, struct pt_regs #ifdef CONFIG_SMP printk("CPU %d ", hard_smp_processor_id()); #endif - printk("%s(%d): %s %ld\n", current->comm, current->pid, str, err); + printk("%s(%d[#%u]): %s %ld\n", current->comm, + current->pid, current->xid, str, err); dik_show_regs(regs, r9_15); dik_show_trace((unsigned long *)(regs+1)); dik_show_code((unsigned int *)regs->pc); diff -Nurp linux-2.6.22.18/arch/alpha/mm/fault.c linux-2.6.22.18-vs2.2.0.6/arch/alpha/mm/fault.c --- linux-2.6.22.18/arch/alpha/mm/fault.c 2007-07-21 23:59:44.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/alpha/mm/fault.c 2008-02-11 12:35:31.000000000 +0100 @@ -197,8 +197,8 @@ do_page_fault(unsigned long address, uns down_read(&mm->mmap_sem); goto survive; } - printk(KERN_ALERT "VM: killing process %s(%d)\n", - current->comm, current->pid); + printk(KERN_ALERT "VM: killing process %s(%d:#%u)\n", + current->comm, current->pid, current->xid); if (!user_mode(regs)) goto no_context; do_exit(SIGKILL); diff -Nurp linux-2.6.22.18/arch/arm/Kconfig linux-2.6.22.18-vs2.2.0.6/arch/arm/Kconfig --- linux-2.6.22.18/arch/arm/Kconfig 2007-07-21 23:59:44.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/arm/Kconfig 2008-02-11 12:35:31.000000000 +0100 @@ -1042,6 +1042,8 @@ source "arch/arm/oprofile/Kconfig" source "arch/arm/Kconfig.debug" +source "kernel/vserver/Kconfig" + source "security/Kconfig" source "crypto/Kconfig" diff -Nurp linux-2.6.22.18/arch/arm/kernel/calls.S linux-2.6.22.18-vs2.2.0.6/arch/arm/kernel/calls.S --- linux-2.6.22.18/arch/arm/kernel/calls.S 2007-07-21 23:59:44.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/arm/kernel/calls.S 2008-02-11 12:35:31.000000000 +0100 @@ -322,7 +322,7 @@ /* 310 */ CALL(sys_request_key) CALL(sys_keyctl) CALL(ABI(sys_semtimedop, sys_oabi_semtimedop)) -/* vserver */ CALL(sys_ni_syscall) + CALL(sys_vserver) CALL(sys_ioprio_set) /* 315 */ CALL(sys_ioprio_get) CALL(sys_inotify_init) diff -Nurp linux-2.6.22.18/arch/arm/kernel/process.c linux-2.6.22.18-vs2.2.0.6/arch/arm/kernel/process.c --- linux-2.6.22.18/arch/arm/kernel/process.c 2007-07-21 23:59:44.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/arm/kernel/process.c 2008-02-11 12:35:31.000000000 +0100 @@ -261,7 +261,8 @@ void __show_regs(struct pt_regs *regs) void show_regs(struct pt_regs * regs) { printk("\n"); - printk("Pid: %d, comm: %20s\n", current->pid, current->comm); + printk("Pid: %d[#%u], comm: %20s\n", + current->pid, current->xid, current->comm); __show_regs(regs); __backtrace(); } @@ -423,7 +424,8 @@ pid_t kernel_thread(int (*fn)(void *), v regs.ARM_pc = (unsigned long)kernel_thread_helper; regs.ARM_cpsr = SVC_MODE; - return do_fork(flags|CLONE_VM|CLONE_UNTRACED, 0, ®s, 0, NULL, NULL); + return do_fork(flags | CLONE_VM | CLONE_UNTRACED | CLONE_KTHREAD, + 0, ®s, 0, NULL, NULL); } EXPORT_SYMBOL(kernel_thread); diff -Nurp linux-2.6.22.18/arch/arm/kernel/traps.c linux-2.6.22.18-vs2.2.0.6/arch/arm/kernel/traps.c --- linux-2.6.22.18/arch/arm/kernel/traps.c 2007-07-21 23:59:44.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/arm/kernel/traps.c 2008-02-11 12:35:31.000000000 +0100 @@ -222,8 +222,8 @@ static void __die(const char *str, int e str, err, ++die_counter); print_modules(); __show_regs(regs); - printk("Process %s (pid: %d, stack limit = 0x%p)\n", - tsk->comm, tsk->pid, thread + 1); + printk("Process %s (pid: %d:#%u, stack limit = 0x%p)\n", + tsk->comm, tsk->pid, tsk->xid, thread + 1); if (!user_mode(regs) || in_interrupt()) { dump_mem("Stack: ", regs->ARM_sp, diff -Nurp linux-2.6.22.18/arch/arm/mm/fault.c linux-2.6.22.18-vs2.2.0.6/arch/arm/mm/fault.c --- linux-2.6.22.18/arch/arm/mm/fault.c 2007-07-21 23:59:44.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/arm/mm/fault.c 2008-02-11 12:35:31.000000000 +0100 @@ -266,7 +266,8 @@ do_page_fault(unsigned long addr, unsign * happened to us that made us unable to handle * the page fault gracefully. */ - printk("VM: killing process %s\n", tsk->comm); + printk("VM: killing process %s(%d:#%u)\n", + tsk->comm, tsk->pid, tsk->xid); do_exit(SIGKILL); return 0; diff -Nurp linux-2.6.22.18/arch/arm26/Kconfig linux-2.6.22.18-vs2.2.0.6/arch/arm26/Kconfig --- linux-2.6.22.18/arch/arm26/Kconfig 2007-07-21 23:59:44.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/arm26/Kconfig 2008-02-11 12:35:31.000000000 +0100 @@ -243,6 +243,8 @@ source "drivers/usb/Kconfig" source "arch/arm26/Kconfig.debug" +source "kernel/vserver/Kconfig" + source "security/Kconfig" source "crypto/Kconfig" diff -Nurp linux-2.6.22.18/arch/arm26/kernel/calls.S linux-2.6.22.18-vs2.2.0.6/arch/arm26/kernel/calls.S --- linux-2.6.22.18/arch/arm26/kernel/calls.S 2006-06-18 03:49:35.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/arm26/kernel/calls.S 2008-02-11 12:35:31.000000000 +0100 @@ -257,6 +257,11 @@ __syscall_start: .long sys_lremovexattr .long sys_fremovexattr .long sys_tkill + + .rept 313 - (. - __syscall_start) / 4 + .long sys_ni_syscall + .endr + .long sys_vserver /* 313 */ __syscall_end: .rept NR_syscalls - (__syscall_end - __syscall_start) / 4 diff -Nurp linux-2.6.22.18/arch/arm26/kernel/process.c linux-2.6.22.18-vs2.2.0.6/arch/arm26/kernel/process.c --- linux-2.6.22.18/arch/arm26/kernel/process.c 2007-05-04 15:55:07.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/arm26/kernel/process.c 2008-02-11 12:35:31.000000000 +0100 @@ -365,7 +365,8 @@ pid_t kernel_thread(int (*fn)(void *), v regs.ARM_r3 = (unsigned long)do_exit; regs.ARM_pc = (unsigned long)kernel_thread_helper | MODE_SVC26; - return do_fork(flags|CLONE_VM|CLONE_UNTRACED, 0, ®s, 0, NULL, NULL); + return do_fork(flags | CLONE_VM | CLONE_UNTRACED | CLONE_KTHREAD, + 0, ®s, 0, NULL, NULL); } EXPORT_SYMBOL(kernel_thread); diff -Nurp linux-2.6.22.18/arch/arm26/kernel/traps.c linux-2.6.22.18-vs2.2.0.6/arch/arm26/kernel/traps.c --- linux-2.6.22.18/arch/arm26/kernel/traps.c 2007-05-04 15:55:07.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/arm26/kernel/traps.c 2008-02-11 12:35:31.000000000 +0100 @@ -185,8 +185,9 @@ NORET_TYPE void die(const char *str, str printk("Internal error: %s: %x\n", str, err); printk("CPU: %d\n", smp_processor_id()); show_regs(regs); - printk("Process %s (pid: %d, stack limit = 0x%p)\n", - current->comm, current->pid, end_of_stack(tsk)); + printk("Process %s (pid: %d[#%u], stack limit = 0x%p)\n", + current->comm, current->pid, + current->xid, end_of_stack(tsk)); if (!user_mode(regs) || in_interrupt()) { __dump_stack(tsk, (unsigned long)(regs + 1)); diff -Nurp linux-2.6.22.18/arch/cris/arch-v10/kernel/process.c linux-2.6.22.18-vs2.2.0.6/arch/cris/arch-v10/kernel/process.c --- linux-2.6.22.18/arch/cris/arch-v10/kernel/process.c 2007-05-04 15:55:07.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/cris/arch-v10/kernel/process.c 2008-02-11 12:35:31.000000000 +0100 @@ -103,7 +103,8 @@ int kernel_thread(int (*fn)(void *), voi regs.dccr = 1 << I_DCCR_BITNR; /* Ok, create the new process.. */ - return do_fork(flags | CLONE_VM | CLONE_UNTRACED, 0, ®s, 0, NULL, NULL); + return do_fork(flags | CLONE_VM | CLONE_UNTRACED | CLONE_KTHREAD, + 0, ®s, 0, NULL, NULL); } /* setup the child's kernel stack with a pt_regs and switch_stack on it. diff -Nurp linux-2.6.22.18/arch/cris/arch-v32/kernel/process.c linux-2.6.22.18-vs2.2.0.6/arch/cris/arch-v32/kernel/process.c --- linux-2.6.22.18/arch/cris/arch-v32/kernel/process.c 2007-05-04 15:55:07.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/cris/arch-v32/kernel/process.c 2008-02-11 12:35:31.000000000 +0100 @@ -120,7 +120,8 @@ kernel_thread(int (*fn)(void *), void * regs.ccs = 1 << (I_CCS_BITNR + CCS_SHIFT); /* Create the new process. */ - return do_fork(flags | CLONE_VM | CLONE_UNTRACED, 0, ®s, 0, NULL, NULL); + return do_fork(flags | CLONE_VM | CLONE_UNTRACED | CLONE_KTHREAD, + 0, ®s, 0, NULL, NULL); } /* diff -Nurp linux-2.6.22.18/arch/cris/Kconfig linux-2.6.22.18-vs2.2.0.6/arch/cris/Kconfig --- linux-2.6.22.18/arch/cris/Kconfig 2007-07-21 23:58:14.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/cris/Kconfig 2008-02-11 12:35:31.000000000 +0100 @@ -200,6 +200,8 @@ source "drivers/usb/Kconfig" source "arch/cris/Kconfig.debug" +source "kernel/vserver/Kconfig" + source "security/Kconfig" source "crypto/Kconfig" diff -Nurp linux-2.6.22.18/arch/frv/kernel/kernel_thread.S linux-2.6.22.18-vs2.2.0.6/arch/frv/kernel/kernel_thread.S --- linux-2.6.22.18/arch/frv/kernel/kernel_thread.S 2006-06-18 03:49:35.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/frv/kernel/kernel_thread.S 2008-02-11 12:35:31.000000000 +0100 @@ -13,6 +13,8 @@ #include #define CLONE_VM 0x00000100 /* set if VM shared between processes */ +#define CLONE_KTHREAD 0x10000000 /* kernel thread */ +#define CLONE_KT (CLONE_VM | CLONE_KTHREAD) /* kernel thread flags */ #define KERN_ERR "<3>" .section .rodata @@ -37,7 +39,7 @@ kernel_thread: # start by forking the current process, but with shared VM setlos.p #__NR_clone,gr7 ; syscall number - ori gr10,#CLONE_VM,gr8 ; first syscall arg [clone_flags] + ori gr10,#CLONE_KT,gr8 ; first syscall arg [clone_flags] sethi.p #0xe4e4,gr9 ; second syscall arg [newsp] setlo #0xe4e4,gr9 setlos.p #0,gr10 ; third syscall arg [parent_tidptr] diff -Nurp linux-2.6.22.18/arch/h8300/Kconfig linux-2.6.22.18-vs2.2.0.6/arch/h8300/Kconfig --- linux-2.6.22.18/arch/h8300/Kconfig 2007-07-21 23:59:44.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/h8300/Kconfig 2008-02-11 12:35:32.000000000 +0100 @@ -222,6 +222,8 @@ source "fs/Kconfig" source "arch/h8300/Kconfig.debug" +source "kernel/vserver/Kconfig" + source "security/Kconfig" source "crypto/Kconfig" diff -Nurp linux-2.6.22.18/arch/h8300/kernel/process.c linux-2.6.22.18-vs2.2.0.6/arch/h8300/kernel/process.c --- linux-2.6.22.18/arch/h8300/kernel/process.c 2007-05-04 15:55:07.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/h8300/kernel/process.c 2008-02-11 12:35:32.000000000 +0100 @@ -134,7 +134,7 @@ int kernel_thread(int (*fn)(void *), voi fs = get_fs(); set_fs (KERNEL_DS); - clone_arg = flags | CLONE_VM; + clone_arg = flags | CLONE_VM | CLONE_KTHREAD; __asm__("mov.l sp,er3\n\t" "sub.l er2,er2\n\t" "mov.l %2,er1\n\t" diff -Nurp linux-2.6.22.18/arch/i386/Kconfig linux-2.6.22.18-vs2.2.0.6/arch/i386/Kconfig --- linux-2.6.22.18/arch/i386/Kconfig 2007-07-21 23:59:44.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/i386/Kconfig 2008-02-11 12:35:32.000000000 +0100 @@ -1230,6 +1230,8 @@ endmenu source "arch/i386/Kconfig.debug" +source "kernel/vserver/Kconfig" + source "security/Kconfig" source "crypto/Kconfig" diff -Nurp linux-2.6.22.18/arch/i386/kernel/process.c linux-2.6.22.18-vs2.2.0.6/arch/i386/kernel/process.c --- linux-2.6.22.18/arch/i386/kernel/process.c 2007-07-21 23:59:45.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/i386/kernel/process.c 2008-02-11 12:35:32.000000000 +0100 @@ -302,8 +302,10 @@ void show_regs(struct pt_regs * regs) unsigned long cr0 = 0L, cr2 = 0L, cr3 = 0L, cr4 = 0L; printk("\n"); - printk("Pid: %d, comm: %20s\n", current->pid, current->comm); - printk("EIP: %04x:[<%08lx>] CPU: %d\n",0xffff & regs->xcs,regs->eip, smp_processor_id()); + printk("Pid: %d[#%u], comm: %20s\n", + current->pid, current->xid, current->comm); + printk("EIP: %04x:[<%08lx>] CPU: %d\n", + 0xffff & regs->xcs,regs->eip, smp_processor_id()); print_symbol("EIP is at %s\n", regs->eip); if (user_mode_vm(regs)) @@ -355,7 +357,8 @@ int kernel_thread(int (*fn)(void *), voi regs.eflags = X86_EFLAGS_IF | X86_EFLAGS_SF | X86_EFLAGS_PF | 0x2; /* Ok, create the new process.. */ - return do_fork(flags | CLONE_VM | CLONE_UNTRACED, 0, ®s, 0, NULL, NULL); + return do_fork(flags | CLONE_VM | CLONE_UNTRACED | CLONE_KTHREAD, + 0, ®s, 0, NULL, NULL); } EXPORT_SYMBOL(kernel_thread); diff -Nurp linux-2.6.22.18/arch/i386/kernel/syscall_table.S linux-2.6.22.18-vs2.2.0.6/arch/i386/kernel/syscall_table.S --- linux-2.6.22.18/arch/i386/kernel/syscall_table.S 2007-07-21 23:59:45.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/i386/kernel/syscall_table.S 2008-02-11 12:35:32.000000000 +0100 @@ -272,7 +272,7 @@ ENTRY(sys_call_table) .long sys_tgkill /* 270 */ .long sys_utimes .long sys_fadvise64_64 - .long sys_ni_syscall /* sys_vserver */ + .long sys_vserver .long sys_mbind .long sys_get_mempolicy .long sys_set_mempolicy diff -Nurp linux-2.6.22.18/arch/i386/kernel/sysenter.c linux-2.6.22.18-vs2.2.0.6/arch/i386/kernel/sysenter.c --- linux-2.6.22.18/arch/i386/kernel/sysenter.c 2007-08-26 03:38:36.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/i386/kernel/sysenter.c 2008-02-11 12:35:32.000000000 +0100 @@ -17,6 +17,7 @@ #include #include #include +#include #include #include diff -Nurp linux-2.6.22.18/arch/i386/kernel/traps.c linux-2.6.22.18-vs2.2.0.6/arch/i386/kernel/traps.c --- linux-2.6.22.18/arch/i386/kernel/traps.c 2007-07-21 23:59:45.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/i386/kernel/traps.c 2008-02-11 12:35:32.000000000 +0100 @@ -56,6 +56,8 @@ #include #include +#include +#include #include "mach_traps.h" @@ -303,8 +305,8 @@ void show_registers(struct pt_regs *regs regs->esi, regs->edi, regs->ebp, esp); printk(KERN_EMERG "ds: %04x es: %04x fs: %04x gs: %04x ss: %04x\n", regs->xds & 0xffff, regs->xes & 0xffff, regs->xfs & 0xffff, gs, ss); - printk(KERN_EMERG "Process %.*s (pid: %d, ti=%p task=%p task.ti=%p)", - TASK_COMM_LEN, current->comm, current->pid, + printk(KERN_EMERG "Process %.*s (pid: %d[#%u], ti=%p task=%p task.ti=%p)", + TASK_COMM_LEN, current->comm, current->pid, current->xid, current_thread_info(), current, task_thread_info(current)); /* * When in-kernel, we also print out the stack and code at the @@ -375,6 +377,8 @@ void die(const char * str, struct pt_reg oops_enter(); + vxh_throw_oops(); + if (die.lock_owner != raw_smp_processor_id()) { console_verbose(); spin_lock_irqsave(&die.lock, flags); @@ -412,9 +416,9 @@ void die(const char * str, struct pt_reg if (nl) printk("\n"); if (notify_die(DIE_OOPS, str, regs, err, - current->thread.trap_no, SIGSEGV) != - NOTIFY_STOP) { + current->thread.trap_no, SIGSEGV) != NOTIFY_STOP) { show_registers(regs); + vxh_dump_history(); /* Executive summary in case the oops scrolled away */ esp = (unsigned long) (®s->esp); savesegment(ss, ss); diff -Nurp linux-2.6.22.18/arch/i386/mm/fault.c linux-2.6.22.18-vs2.2.0.6/arch/i386/mm/fault.c --- linux-2.6.22.18/arch/i386/mm/fault.c 2007-09-05 07:07:59.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/i386/mm/fault.c 2008-02-11 12:35:32.000000000 +0100 @@ -587,7 +587,8 @@ out_of_memory: down_read(&mm->mmap_sem); goto survive; } - printk("VM: killing process %s\n", tsk->comm); + printk("VM: killing process %s(%d:#%u)\n", + tsk->comm, tsk->pid, tsk->xid); if (error_code & 4) do_exit(SIGKILL); goto no_context; diff -Nurp linux-2.6.22.18/arch/ia64/ia32/binfmt_elf32.c linux-2.6.22.18-vs2.2.0.6/arch/ia64/ia32/binfmt_elf32.c --- linux-2.6.22.18/arch/ia64/ia32/binfmt_elf32.c 2007-07-21 23:58:15.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/ia64/ia32/binfmt_elf32.c 2008-02-11 12:35:32.000000000 +0100 @@ -233,7 +233,8 @@ ia32_setup_arg_pages (struct linux_binpr kmem_cache_free(vm_area_cachep, mpnt); return ret; } - current->mm->stack_vm = current->mm->total_vm = vma_pages(mpnt); + vx_vmpages_sub(current->mm, current->mm->total_vm - vma_pages(mpnt)); + current->mm->stack_vm = current->mm->total_vm; } for (i = 0 ; i < MAX_ARG_PAGES ; i++) { diff -Nurp linux-2.6.22.18/arch/ia64/ia32/ia32_entry.S linux-2.6.22.18-vs2.2.0.6/arch/ia64/ia32/ia32_entry.S --- linux-2.6.22.18/arch/ia64/ia32/ia32_entry.S 2007-07-21 23:59:45.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/ia64/ia32/ia32_entry.S 2008-02-11 12:35:32.000000000 +0100 @@ -446,7 +446,7 @@ ia32_syscall_table: data8 sys_tgkill /* 270 */ data8 compat_sys_utimes data8 sys32_fadvise64_64 - data8 sys_ni_syscall + data8 sys32_vserver data8 sys_ni_syscall data8 sys_ni_syscall /* 275 */ data8 sys_ni_syscall diff -Nurp linux-2.6.22.18/arch/ia64/ia32/sys_ia32.c linux-2.6.22.18-vs2.2.0.6/arch/ia64/ia32/sys_ia32.c --- linux-2.6.22.18/arch/ia64/ia32/sys_ia32.c 2007-07-21 23:58:15.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/ia64/ia32/sys_ia32.c 2008-02-11 12:35:32.000000000 +0100 @@ -1182,7 +1182,7 @@ sys32_gettimeofday (struct compat_timeva { if (tv) { struct timeval ktv; - do_gettimeofday(&ktv); + vx_gettimeofday(&ktv); if (put_tv32(tv, &ktv)) return -EFAULT; } diff -Nurp linux-2.6.22.18/arch/ia64/Kconfig linux-2.6.22.18-vs2.2.0.6/arch/ia64/Kconfig --- linux-2.6.22.18/arch/ia64/Kconfig 2007-07-21 23:59:45.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/ia64/Kconfig 2008-02-11 12:35:32.000000000 +0100 @@ -592,6 +592,8 @@ endmenu source "arch/ia64/Kconfig.debug" +source "kernel/vserver/Kconfig" + source "security/Kconfig" source "crypto/Kconfig" diff -Nurp linux-2.6.22.18/arch/ia64/kernel/asm-offsets.c linux-2.6.22.18-vs2.2.0.6/arch/ia64/kernel/asm-offsets.c --- linux-2.6.22.18/arch/ia64/kernel/asm-offsets.c 2007-07-21 23:58:15.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/ia64/kernel/asm-offsets.c 2008-02-11 12:35:32.000000000 +0100 @@ -192,6 +192,7 @@ void foo(void) /* for assembly files which can't include sched.h: */ DEFINE(IA64_CLONE_VFORK, CLONE_VFORK); DEFINE(IA64_CLONE_VM, CLONE_VM); + DEFINE(IA64_CLONE_KTHREAD, CLONE_KTHREAD); BLANK(); DEFINE(IA64_CPUINFO_NSEC_PER_CYC_OFFSET, diff -Nurp linux-2.6.22.18/arch/ia64/kernel/entry.S linux-2.6.22.18-vs2.2.0.6/arch/ia64/kernel/entry.S --- linux-2.6.22.18/arch/ia64/kernel/entry.S 2007-07-21 23:59:45.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/ia64/kernel/entry.S 2008-02-11 12:35:32.000000000 +0100 @@ -1547,7 +1547,7 @@ sys_call_table: data8 sys_mq_notify data8 sys_mq_getsetattr data8 sys_kexec_load - data8 sys_ni_syscall // reserved for vserver + data8 sys_vserver data8 sys_waitid // 1270 data8 sys_add_key data8 sys_request_key diff -Nurp linux-2.6.22.18/arch/ia64/kernel/perfmon.c linux-2.6.22.18-vs2.2.0.6/arch/ia64/kernel/perfmon.c --- linux-2.6.22.18/arch/ia64/kernel/perfmon.c 2007-07-21 23:59:45.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/ia64/kernel/perfmon.c 2008-02-11 12:35:32.000000000 +0100 @@ -40,6 +40,7 @@ #include #include #include +#include #include #include @@ -2395,7 +2396,7 @@ pfm_smpl_buffer_alloc(struct task_struct */ insert_vm_struct(mm, vma); - mm->total_vm += size >> PAGE_SHIFT; + vx_vmpages_add(mm, size >> PAGE_SHIFT); vm_stat_account(vma->vm_mm, vma->vm_flags, vma->vm_file, vma_pages(vma)); up_write(&task->mm->mmap_sem); diff -Nurp linux-2.6.22.18/arch/ia64/kernel/process.c linux-2.6.22.18-vs2.2.0.6/arch/ia64/kernel/process.c --- linux-2.6.22.18/arch/ia64/kernel/process.c 2007-07-21 23:59:45.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/ia64/kernel/process.c 2008-02-11 12:35:32.000000000 +0100 @@ -105,7 +105,8 @@ show_regs (struct pt_regs *regs) unsigned long ip = regs->cr_iip + ia64_psr(regs)->ri; print_modules(); - printk("\nPid: %d, CPU %d, comm: %20s\n", current->pid, smp_processor_id(), current->comm); + printk("\nPid: %d[#%u], CPU %d, comm: %20s\n", + current->pid, current->xid, smp_processor_id(), current->comm); printk("psr : %016lx ifs : %016lx ip : [<%016lx>] %s\n", regs->cr_ipsr, regs->cr_ifs, ip, print_tainted()); print_symbol("ip is at %s\n", ip); @@ -696,7 +697,8 @@ kernel_thread (int (*fn)(void *), void * regs.sw.ar_fpsr = regs.pt.ar_fpsr = ia64_getreg(_IA64_REG_AR_FPSR); regs.sw.ar_bspstore = (unsigned long) current + IA64_RBS_OFFSET; regs.sw.pr = (1 << PRED_KERNEL_STACK); - return do_fork(flags | CLONE_VM | CLONE_UNTRACED, 0, ®s.pt, 0, NULL, NULL); + return do_fork(flags | CLONE_VM | CLONE_UNTRACED | CLONE_KTHREAD, + 0, ®s.pt, 0, NULL, NULL); } EXPORT_SYMBOL(kernel_thread); diff -Nurp linux-2.6.22.18/arch/ia64/kernel/ptrace.c linux-2.6.22.18-vs2.2.0.6/arch/ia64/kernel/ptrace.c --- linux-2.6.22.18/arch/ia64/kernel/ptrace.c 2007-07-21 23:58:15.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/ia64/kernel/ptrace.c 2008-02-11 12:35:32.000000000 +0100 @@ -17,6 +17,7 @@ #include #include #include +#include #include #include @@ -1443,6 +1444,9 @@ sys_ptrace (long request, pid_t pid, uns read_unlock(&tasklist_lock); if (!child) goto out; + if (!vx_check(vx_task_xid(child), VS_WATCH_P | VS_IDENT)) + goto out_tsk; + ret = -EPERM; if (pid == 1) /* no messing around with init! */ goto out_tsk; diff -Nurp linux-2.6.22.18/arch/ia64/kernel/traps.c linux-2.6.22.18-vs2.2.0.6/arch/ia64/kernel/traps.c --- linux-2.6.22.18/arch/ia64/kernel/traps.c 2007-07-21 23:59:45.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/ia64/kernel/traps.c 2008-02-11 12:35:32.000000000 +0100 @@ -60,8 +60,9 @@ die (const char *str, struct pt_regs *re put_cpu(); if (++die.lock_owner_depth < 3) { - printk("%s[%d]: %s %ld [%d]\n", - current->comm, current->pid, str, err, ++die_counter); + printk("%s[%d[#%u]]: %s %ld [%d]\n", + current->comm, current->pid, current->xid, + str, err, ++die_counter); (void) notify_die(DIE_OOPS, (char *)str, regs, err, 255, SIGSEGV); show_regs(regs); } else @@ -313,8 +314,9 @@ handle_fpu_swa (int fp_fault, struct pt_ if ((last.count & 15) < 5 && (ia64_fetchadd(1, &last.count, acq) & 15) < 5) { last.time = current_jiffies + 5 * HZ; printk(KERN_WARNING - "%s(%d): floating-point assist fault at ip %016lx, isr %016lx\n", - current->comm, current->pid, regs->cr_iip + ia64_psr(regs)->ri, isr); + "%s(%d[#%u]): floating-point assist fault at ip %016lx, isr %016lx\n", + current->comm, current->pid, current->xid, + regs->cr_iip + ia64_psr(regs)->ri, isr); } } } diff -Nurp linux-2.6.22.18/arch/ia64/mm/fault.c linux-2.6.22.18-vs2.2.0.6/arch/ia64/mm/fault.c --- linux-2.6.22.18/arch/ia64/mm/fault.c 2007-07-21 23:59:45.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/ia64/mm/fault.c 2008-02-11 12:35:32.000000000 +0100 @@ -10,6 +10,7 @@ #include #include #include +#include #include #include diff -Nurp linux-2.6.22.18/arch/m32r/kernel/process.c linux-2.6.22.18-vs2.2.0.6/arch/m32r/kernel/process.c --- linux-2.6.22.18/arch/m32r/kernel/process.c 2007-07-21 23:58:15.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/m32r/kernel/process.c 2008-02-11 12:35:32.000000000 +0100 @@ -211,8 +211,8 @@ int kernel_thread(int (*fn)(void *), voi regs.psw = M32R_PSW_BIE; /* Ok, create the new process. */ - return do_fork(flags | CLONE_VM | CLONE_UNTRACED, 0, ®s, 0, NULL, - NULL); + return do_fork(flags | CLONE_VM | CLONE_UNTRACED | CLONE_KTHREAD, + 0, ®s, 0, NULL, NULL); } /* diff -Nurp linux-2.6.22.18/arch/m32r/kernel/traps.c linux-2.6.22.18-vs2.2.0.6/arch/m32r/kernel/traps.c --- linux-2.6.22.18/arch/m32r/kernel/traps.c 2007-05-04 15:57:13.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/m32r/kernel/traps.c 2008-02-11 12:35:32.000000000 +0100 @@ -195,8 +195,9 @@ static void show_registers(struct pt_reg } else { printk("SPI: %08lx\n", sp); } - printk("Process %s (pid: %d, process nr: %d, stackpage=%08lx)", - current->comm, current->pid, 0xffff & i, 4096+(unsigned long)current); + printk("Process %s (pid: %d[#%u], process nr: %d, stackpage=%08lx)", + current->comm, current->pid, current->xid, + 0xffff & i, 4096+(unsigned long)current); /* * When in-kernel, we also print out the stack and code at the diff -Nurp linux-2.6.22.18/arch/m68k/Kconfig linux-2.6.22.18-vs2.2.0.6/arch/m68k/Kconfig --- linux-2.6.22.18/arch/m68k/Kconfig 2007-07-21 23:59:45.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/m68k/Kconfig 2008-02-11 12:35:32.000000000 +0100 @@ -678,6 +678,8 @@ source "fs/Kconfig" source "arch/m68k/Kconfig.debug" +source "kernel/vserver/Kconfig" + source "security/Kconfig" source "crypto/Kconfig" diff -Nurp linux-2.6.22.18/arch/m68k/kernel/process.c linux-2.6.22.18-vs2.2.0.6/arch/m68k/kernel/process.c --- linux-2.6.22.18/arch/m68k/kernel/process.c 2007-05-04 15:57:14.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/m68k/kernel/process.c 2008-02-11 12:35:32.000000000 +0100 @@ -159,7 +159,8 @@ int kernel_thread(int (*fn)(void *), voi { register long retval __asm__ ("d0"); - register long clone_arg __asm__ ("d1") = flags | CLONE_VM | CLONE_UNTRACED; + register long clone_arg __asm__ ("d1") = + flags | CLONE_VM | CLONE_UNTRACED | CLONE_KTHREAD; retval = __NR_clone; __asm__ __volatile__ diff -Nurp linux-2.6.22.18/arch/m68k/kernel/ptrace.c linux-2.6.22.18-vs2.2.0.6/arch/m68k/kernel/ptrace.c --- linux-2.6.22.18/arch/m68k/kernel/ptrace.c 2007-07-21 23:59:45.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/m68k/kernel/ptrace.c 2008-02-11 12:35:32.000000000 +0100 @@ -18,6 +18,7 @@ #include #include #include +#include #include #include @@ -278,6 +279,8 @@ long arch_ptrace(struct task_struct *chi ret = ptrace_request(child, request, addr, data); break; } + if (!vx_check(vx_task_xid(child), VS_WATCH_P | VS_IDENT)) + goto out_tsk; return ret; out_eio: diff -Nurp linux-2.6.22.18/arch/m68k/kernel/traps.c linux-2.6.22.18-vs2.2.0.6/arch/m68k/kernel/traps.c --- linux-2.6.22.18/arch/m68k/kernel/traps.c 2007-07-21 23:58:15.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/m68k/kernel/traps.c 2008-02-11 12:35:32.000000000 +0100 @@ -899,8 +899,8 @@ void show_registers(struct pt_regs *regs printk("d4: %08lx d5: %08lx a0: %08lx a1: %08lx\n", regs->d4, regs->d5, regs->a0, regs->a1); - printk("Process %s (pid: %d, task=%p)\n", - current->comm, current->pid, current); + printk("Process %s (pid: %d[#%u], task=%p)\n", + current->comm, current->pid, current->xid, current); addr = (unsigned long)&fp->un; printk("Frame format=%X ", regs->format); switch (regs->format) { diff -Nurp linux-2.6.22.18/arch/m68knommu/Kconfig linux-2.6.22.18-vs2.2.0.6/arch/m68knommu/Kconfig --- linux-2.6.22.18/arch/m68knommu/Kconfig 2007-07-21 23:59:45.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/m68knommu/Kconfig 2008-02-11 12:35:32.000000000 +0100 @@ -670,6 +670,8 @@ source "fs/Kconfig" source "arch/m68knommu/Kconfig.debug" +source "kernel/vserver/Kconfig" + source "security/Kconfig" source "crypto/Kconfig" diff -Nurp linux-2.6.22.18/arch/m68knommu/kernel/process.c linux-2.6.22.18-vs2.2.0.6/arch/m68knommu/kernel/process.c --- linux-2.6.22.18/arch/m68knommu/kernel/process.c 2007-05-04 15:58:04.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/m68knommu/kernel/process.c 2008-02-11 12:35:32.000000000 +0100 @@ -122,7 +122,7 @@ void show_regs(struct pt_regs * regs) int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags) { int retval; - long clone_arg = flags | CLONE_VM; + long clone_arg = flags | CLONE_VM | CLONE_KTHREAD; mm_segment_t fs; fs = get_fs(); diff -Nurp linux-2.6.22.18/arch/m68knommu/kernel/traps.c linux-2.6.22.18-vs2.2.0.6/arch/m68knommu/kernel/traps.c --- linux-2.6.22.18/arch/m68knommu/kernel/traps.c 2007-07-21 23:58:15.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/m68knommu/kernel/traps.c 2008-02-11 12:35:32.000000000 +0100 @@ -80,8 +80,9 @@ void die_if_kernel(char *str, struct pt_ printk(KERN_EMERG "d4: %08lx d5: %08lx a0: %08lx a1: %08lx\n", fp->d4, fp->d5, fp->a0, fp->a1); - printk(KERN_EMERG "Process %s (pid: %d, stackpage=%08lx)\n", - current->comm, current->pid, PAGE_SIZE+(unsigned long)current); + printk(KERN_EMERG "Process %s (pid: %d[#%u], stackpage=%08lx)\n", + current->comm, current->pid, current->xid, + PAGE_SIZE+(unsigned long)current); show_stack(NULL, (unsigned long *)fp); do_exit(SIGSEGV); } diff -Nurp linux-2.6.22.18/arch/mips/Kconfig linux-2.6.22.18-vs2.2.0.6/arch/mips/Kconfig --- linux-2.6.22.18/arch/mips/Kconfig 2007-07-21 23:59:45.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/mips/Kconfig 2008-02-11 12:35:32.000000000 +0100 @@ -1959,6 +1959,8 @@ source "arch/mips/oprofile/Kconfig" source "arch/mips/Kconfig.debug" +source "kernel/vserver/Kconfig" + source "security/Kconfig" source "crypto/Kconfig" diff -Nurp linux-2.6.22.18/arch/mips/kernel/linux32.c linux-2.6.22.18-vs2.2.0.6/arch/mips/kernel/linux32.c --- linux-2.6.22.18/arch/mips/kernel/linux32.c 2007-07-21 23:59:45.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/mips/kernel/linux32.c 2008-02-11 12:35:32.000000000 +0100 @@ -229,7 +229,7 @@ sys32_gettimeofday(struct compat_timeval { if (tv) { struct timeval ktv; - do_gettimeofday(&ktv); + vx_gettimeofday(&ktv); if (put_tv32(tv, &ktv)) return -EFAULT; } diff -Nurp linux-2.6.22.18/arch/mips/kernel/process.c linux-2.6.22.18-vs2.2.0.6/arch/mips/kernel/process.c --- linux-2.6.22.18/arch/mips/kernel/process.c 2007-07-21 23:58:16.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/mips/kernel/process.c 2008-02-11 12:35:32.000000000 +0100 @@ -236,7 +236,8 @@ long kernel_thread(int (*fn)(void *), vo #endif /* Ok, create the new process.. */ - return do_fork(flags | CLONE_VM | CLONE_UNTRACED, 0, ®s, 0, NULL, NULL); + return do_fork(flags | CLONE_VM | CLONE_UNTRACED | CLONE_KTHREAD, + 0, ®s, 0, NULL, NULL); } /* diff -Nurp linux-2.6.22.18/arch/mips/kernel/ptrace.c linux-2.6.22.18-vs2.2.0.6/arch/mips/kernel/ptrace.c --- linux-2.6.22.18/arch/mips/kernel/ptrace.c 2007-07-21 23:59:45.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/mips/kernel/ptrace.c 2008-02-11 12:35:32.000000000 +0100 @@ -25,6 +25,7 @@ #include #include #include +#include #include #include @@ -171,6 +172,9 @@ long arch_ptrace(struct task_struct *chi { int ret; + if (!vx_check(vx_task_xid(child), VS_WATCH_P | VS_IDENT)) + goto out; + switch (request) { /* when I and D space are separate, these will need to be fixed. */ case PTRACE_PEEKTEXT: /* read word at location addr. */ diff -Nurp linux-2.6.22.18/arch/mips/kernel/scall32-o32.S linux-2.6.22.18-vs2.2.0.6/arch/mips/kernel/scall32-o32.S --- linux-2.6.22.18/arch/mips/kernel/scall32-o32.S 2007-07-21 23:59:45.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/mips/kernel/scall32-o32.S 2008-02-11 12:35:32.000000000 +0100 @@ -619,7 +619,7 @@ einval: li v0, -EINVAL sys sys_mq_timedreceive 5 sys sys_mq_notify 2 /* 4275 */ sys sys_mq_getsetattr 3 - sys sys_ni_syscall 0 /* sys_vserver */ + sys sys_vserver 3 sys sys_waitid 5 sys sys_ni_syscall 0 /* available, was setaltroot */ sys sys_add_key 5 /* 4280 */ diff -Nurp linux-2.6.22.18/arch/mips/kernel/scall64-64.S linux-2.6.22.18-vs2.2.0.6/arch/mips/kernel/scall64-64.S --- linux-2.6.22.18/arch/mips/kernel/scall64-64.S 2007-07-21 23:59:45.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/mips/kernel/scall64-64.S 2008-02-11 12:35:32.000000000 +0100 @@ -434,7 +434,7 @@ sys_call_table: PTR sys_mq_timedreceive PTR sys_mq_notify PTR sys_mq_getsetattr /* 5235 */ - PTR sys_ni_syscall /* sys_vserver */ + PTR sys_vserver PTR sys_waitid PTR sys_ni_syscall /* available, was setaltroot */ PTR sys_add_key diff -Nurp linux-2.6.22.18/arch/mips/kernel/scall64-n32.S linux-2.6.22.18-vs2.2.0.6/arch/mips/kernel/scall64-n32.S --- linux-2.6.22.18/arch/mips/kernel/scall64-n32.S 2007-07-21 23:59:45.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/mips/kernel/scall64-n32.S 2008-02-11 12:35:32.000000000 +0100 @@ -360,7 +360,7 @@ EXPORT(sysn32_call_table) PTR compat_sys_mq_timedreceive PTR compat_sys_mq_notify PTR compat_sys_mq_getsetattr - PTR sys_ni_syscall /* 6240, sys_vserver */ + PTR sys32_vserver /* 6240 */ PTR compat_sys_waitid PTR sys_ni_syscall /* available, was setaltroot */ PTR sys_add_key diff -Nurp linux-2.6.22.18/arch/mips/kernel/scall64-o32.S linux-2.6.22.18-vs2.2.0.6/arch/mips/kernel/scall64-o32.S --- linux-2.6.22.18/arch/mips/kernel/scall64-o32.S 2007-07-21 23:59:45.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/mips/kernel/scall64-o32.S 2008-02-11 12:35:32.000000000 +0100 @@ -482,7 +482,7 @@ sys_call_table: PTR compat_sys_mq_timedreceive PTR compat_sys_mq_notify /* 4275 */ PTR compat_sys_mq_getsetattr - PTR sys_ni_syscall /* sys_vserver */ + PTR sys32_vserver PTR sys32_waitid PTR sys_ni_syscall /* available, was setaltroot */ PTR sys_add_key /* 4280 */ diff -Nurp linux-2.6.22.18/arch/mips/kernel/traps.c linux-2.6.22.18-vs2.2.0.6/arch/mips/kernel/traps.c --- linux-2.6.22.18/arch/mips/kernel/traps.c 2007-07-21 23:59:48.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/mips/kernel/traps.c 2008-02-11 12:35:32.000000000 +0100 @@ -302,8 +302,9 @@ void show_registers(struct pt_regs *regs { show_regs(regs); print_modules(); - printk("Process %s (pid: %d, threadinfo=%p, task=%p)\n", - current->comm, current->pid, current_thread_info(), current); + printk("Process %s (pid: %d:#%u, threadinfo=%p, task=%p)\n", + current->comm, current->pid, current->xid, + current_thread_info(), current); show_stacktrace(current, regs); show_code((unsigned int *) regs->cp0_epc); printk("\n"); diff -Nurp linux-2.6.22.18/arch/mips/mm/fault.c linux-2.6.22.18-vs2.2.0.6/arch/mips/mm/fault.c --- linux-2.6.22.18/arch/mips/mm/fault.c 2007-07-21 23:59:48.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/mips/mm/fault.c 2008-02-11 12:35:32.000000000 +0100 @@ -179,7 +179,8 @@ out_of_memory: down_read(&mm->mmap_sem); goto survive; } - printk("VM: killing process %s\n", tsk->comm); + printk("VM: killing process %s(%d:#%u)\n", + tsk->comm, tsk->pid, tsk->xid); if (user_mode(regs)) do_exit(SIGKILL); goto no_context; diff -Nurp linux-2.6.22.18/arch/parisc/Kconfig linux-2.6.22.18-vs2.2.0.6/arch/parisc/Kconfig --- linux-2.6.22.18/arch/parisc/Kconfig 2007-07-21 23:58:18.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/parisc/Kconfig 2008-02-11 12:35:32.000000000 +0100 @@ -271,6 +271,8 @@ source "arch/parisc/oprofile/Kconfig" source "arch/parisc/Kconfig.debug" +source "kernel/vserver/Kconfig" + source "security/Kconfig" source "crypto/Kconfig" diff -Nurp linux-2.6.22.18/arch/parisc/kernel/entry.S linux-2.6.22.18-vs2.2.0.6/arch/parisc/kernel/entry.S --- linux-2.6.22.18/arch/parisc/kernel/entry.S 2007-07-21 23:59:48.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/parisc/kernel/entry.S 2008-02-11 12:35:32.000000000 +0100 @@ -761,6 +761,7 @@ END(fault_vector_11) #define CLONE_VM 0x100 /* Must agree with */ #define CLONE_UNTRACED 0x00800000 +#define CLONE_KTHREAD 0x10000000 .import do_fork ENTRY(__kernel_thread) diff -Nurp linux-2.6.22.18/arch/parisc/kernel/process.c linux-2.6.22.18-vs2.2.0.6/arch/parisc/kernel/process.c --- linux-2.6.22.18/arch/parisc/kernel/process.c 2007-07-21 23:59:48.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/parisc/kernel/process.c 2008-02-11 12:35:32.000000000 +0100 @@ -173,7 +173,7 @@ pid_t kernel_thread(int (*fn)(void *), v * kernel_thread can become a #define. */ - return __kernel_thread(fn, arg, flags); + return __kernel_thread(fn, arg, flags | CLONE_KTHREAD); } EXPORT_SYMBOL(kernel_thread); diff -Nurp linux-2.6.22.18/arch/parisc/kernel/syscall_table.S linux-2.6.22.18-vs2.2.0.6/arch/parisc/kernel/syscall_table.S --- linux-2.6.22.18/arch/parisc/kernel/syscall_table.S 2007-07-21 23:59:48.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/parisc/kernel/syscall_table.S 2008-02-11 12:35:32.000000000 +0100 @@ -363,7 +363,7 @@ ENTRY_COMP(mbind) /* 260 */ ENTRY_COMP(get_mempolicy) ENTRY_COMP(set_mempolicy) - ENTRY_SAME(ni_syscall) /* 263: reserved for vserver */ + ENTRY_DIFF(vserver) ENTRY_SAME(add_key) ENTRY_SAME(request_key) /* 265 */ ENTRY_SAME(keyctl) diff -Nurp linux-2.6.22.18/arch/parisc/kernel/sys_parisc32.c linux-2.6.22.18-vs2.2.0.6/arch/parisc/kernel/sys_parisc32.c --- linux-2.6.22.18/arch/parisc/kernel/sys_parisc32.c 2007-07-21 23:59:48.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/parisc/kernel/sys_parisc32.c 2008-02-11 12:35:32.000000000 +0100 @@ -204,11 +204,11 @@ static inline long get_ts32(struct times asmlinkage int sys32_gettimeofday(struct compat_timeval __user *tv, struct timezone __user *tz) { - extern void do_gettimeofday(struct timeval *tv); + extern void vx_gettimeofday(struct timeval *tv); if (tv) { struct timeval ktv; - do_gettimeofday(&ktv); + vx_gettimeofday(&ktv); if (put_compat_timeval(tv, &ktv)) return -EFAULT; } diff -Nurp linux-2.6.22.18/arch/parisc/kernel/traps.c linux-2.6.22.18-vs2.2.0.6/arch/parisc/kernel/traps.c --- linux-2.6.22.18/arch/parisc/kernel/traps.c 2007-07-21 23:59:48.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/parisc/kernel/traps.c 2008-02-11 12:35:32.000000000 +0100 @@ -218,8 +218,9 @@ void die_if_kernel(char *str, struct pt_ if (err == 0) return; /* STFU */ - printk(KERN_CRIT "%s (pid %d): %s (code %ld) at " RFMT "\n", - current->comm, current->pid, str, err, regs->iaoq[0]); + printk(KERN_CRIT "%s (pid %d:#%u): %s (code %ld) at " RFMT "\n", + current->comm, current->pid, current->xid, + str, err, regs->iaoq[0]); #ifdef PRINT_USER_FAULTS /* XXX for debugging only */ show_regs(regs); @@ -251,8 +252,8 @@ KERN_CRIT " || | pdc_console_restart(); if (err) - printk(KERN_CRIT "%s (pid %d): %s (code %ld)\n", - current->comm, current->pid, str, err); + printk(KERN_CRIT "%s (pid %d:#%u): %s (code %ld)\n", + current->comm, current->pid, current->xid, str, err); /* Wot's wrong wif bein' racy? */ if (current->thread.flags & PARISC_KERNEL_DEATH) { diff -Nurp linux-2.6.22.18/arch/parisc/mm/fault.c linux-2.6.22.18-vs2.2.0.6/arch/parisc/mm/fault.c --- linux-2.6.22.18/arch/parisc/mm/fault.c 2007-07-21 23:58:18.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/parisc/mm/fault.c 2008-02-11 12:35:32.000000000 +0100 @@ -209,8 +209,9 @@ bad_area: #ifdef PRINT_USER_FAULTS printk(KERN_DEBUG "\n"); - printk(KERN_DEBUG "do_page_fault() pid=%d command='%s' type=%lu address=0x%08lx\n", - tsk->pid, tsk->comm, code, address); + printk(KERN_DEBUG "do_page_fault() pid=%d:#%u " + "command='%s' type=%lu address=0x%08lx\n", + tsk->pid, tsk->xid, tsk->comm, code, address); if (vma) { printk(KERN_DEBUG "vm_start = 0x%08lx, vm_end = 0x%08lx\n", vma->vm_start, vma->vm_end); @@ -260,7 +261,8 @@ no_context: out_of_memory: up_read(&mm->mmap_sem); - printk(KERN_CRIT "VM: killing process %s\n", current->comm); + printk(KERN_CRIT "VM: killing process %s(%d:#%u)\n", + current->comm, current->pid, current->xid); if (user_mode(regs)) do_exit(SIGKILL); goto no_context; diff -Nurp linux-2.6.22.18/arch/powerpc/Kconfig linux-2.6.22.18-vs2.2.0.6/arch/powerpc/Kconfig --- linux-2.6.22.18/arch/powerpc/Kconfig 2007-07-21 23:59:48.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/powerpc/Kconfig 2008-02-11 12:35:32.000000000 +0100 @@ -906,6 +906,8 @@ endmenu source "arch/powerpc/Kconfig.debug" +source "kernel/vserver/Kconfig" + source "security/Kconfig" config KEYS_COMPAT diff -Nurp linux-2.6.22.18/arch/powerpc/kernel/asm-offsets.c linux-2.6.22.18-vs2.2.0.6/arch/powerpc/kernel/asm-offsets.c --- linux-2.6.22.18/arch/powerpc/kernel/asm-offsets.c 2007-07-21 23:59:48.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/powerpc/kernel/asm-offsets.c 2008-02-11 12:35:32.000000000 +0100 @@ -250,6 +250,7 @@ int main(void) DEFINE(CLONE_VM, CLONE_VM); DEFINE(CLONE_UNTRACED, CLONE_UNTRACED); + DEFINE(CLONE_KTHREAD, CLONE_KTHREAD); #ifndef CONFIG_PPC64 DEFINE(MM_PGD, offsetof(struct mm_struct, pgd)); diff -Nurp linux-2.6.22.18/arch/powerpc/kernel/irq.c linux-2.6.22.18-vs2.2.0.6/arch/powerpc/kernel/irq.c --- linux-2.6.22.18/arch/powerpc/kernel/irq.c 2007-07-21 23:59:48.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/powerpc/kernel/irq.c 2008-02-11 12:35:32.000000000 +0100 @@ -53,6 +53,7 @@ #include #include #include +#include #include #include diff -Nurp linux-2.6.22.18/arch/powerpc/kernel/misc_32.S linux-2.6.22.18-vs2.2.0.6/arch/powerpc/kernel/misc_32.S --- linux-2.6.22.18/arch/powerpc/kernel/misc_32.S 2007-07-21 23:59:48.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/powerpc/kernel/misc_32.S 2008-02-11 12:35:32.000000000 +0100 @@ -745,7 +745,7 @@ _GLOBAL(kernel_thread) mr r30,r3 /* function */ mr r31,r4 /* argument */ ori r3,r5,CLONE_VM /* flags */ - oris r3,r3,CLONE_UNTRACED>>16 + oris r3,r3,(CLONE_UNTRACED|CLONE_KTHREAD)>>16 li r4,0 /* new sp (unused) */ li r0,__NR_clone sc diff -Nurp linux-2.6.22.18/arch/powerpc/kernel/misc_64.S linux-2.6.22.18-vs2.2.0.6/arch/powerpc/kernel/misc_64.S --- linux-2.6.22.18/arch/powerpc/kernel/misc_64.S 2007-07-21 23:58:18.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/powerpc/kernel/misc_64.S 2008-02-11 12:35:32.000000000 +0100 @@ -434,7 +434,7 @@ _GLOBAL(kernel_thread) mr r29,r3 mr r30,r4 ori r3,r5,CLONE_VM /* flags */ - oris r3,r3,(CLONE_UNTRACED>>16) + oris r3,r3,(CLONE_UNTRACED|CLONE_KTHREAD)>>16 li r4,0 /* new sp (unused) */ li r0,__NR_clone sc diff -Nurp linux-2.6.22.18/arch/powerpc/kernel/process.c linux-2.6.22.18-vs2.2.0.6/arch/powerpc/kernel/process.c --- linux-2.6.22.18/arch/powerpc/kernel/process.c 2007-09-29 14:11:48.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/powerpc/kernel/process.c 2008-02-11 12:35:32.000000000 +0100 @@ -422,8 +422,9 @@ void show_regs(struct pt_regs * regs) trap = TRAP(regs); if (trap == 0x300 || trap == 0x600) printk("DAR: "REG", DSISR: "REG"\n", regs->dar, regs->dsisr); - printk("TASK = %p[%d] '%s' THREAD: %p", - current, current->pid, current->comm, task_thread_info(current)); + printk("TASK = %p[%d,#%u] '%s' THREAD: %p", + current, current->pid, current->xid, + current->comm, task_thread_info(current)); #ifdef CONFIG_SMP printk(" CPU: %d", smp_processor_id()); diff -Nurp linux-2.6.22.18/arch/powerpc/kernel/sys_ppc32.c linux-2.6.22.18-vs2.2.0.6/arch/powerpc/kernel/sys_ppc32.c --- linux-2.6.22.18/arch/powerpc/kernel/sys_ppc32.c 2007-07-21 23:59:48.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/powerpc/kernel/sys_ppc32.c 2008-02-11 12:35:32.000000000 +0100 @@ -205,7 +205,7 @@ asmlinkage long compat_sys_gettimeofday( { if (tv) { struct timeval ktv; - do_gettimeofday(&ktv); + vx_gettimeofday(&ktv); if (put_tv32(tv, &ktv)) return -EFAULT; } diff -Nurp linux-2.6.22.18/arch/powerpc/kernel/traps.c linux-2.6.22.18-vs2.2.0.6/arch/powerpc/kernel/traps.c --- linux-2.6.22.18/arch/powerpc/kernel/traps.c 2007-07-21 23:59:48.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/powerpc/kernel/traps.c 2008-02-11 12:35:32.000000000 +0100 @@ -878,8 +878,9 @@ void nonrecoverable_exception(struct pt_ void trace_syscall(struct pt_regs *regs) { - printk("Task: %p(%d), PC: %08lX/%08lX, Syscall: %3ld, Result: %s%ld %s\n", - current, current->pid, regs->nip, regs->link, regs->gpr[0], + printk("Task: %p(%d[#%u]), PC: %08lX/%08lX, Syscall: %3ld, Result: %s%ld %s\n", + current, current->pid, current->xid, + regs->nip, regs->link, regs->gpr[0], regs->ccr&0x10000000?"Error=":"", regs->gpr[3], print_tainted()); } diff -Nurp linux-2.6.22.18/arch/powerpc/kernel/vdso.c linux-2.6.22.18-vs2.2.0.6/arch/powerpc/kernel/vdso.c --- linux-2.6.22.18/arch/powerpc/kernel/vdso.c 2007-07-21 23:59:48.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/powerpc/kernel/vdso.c 2008-02-11 12:35:32.000000000 +0100 @@ -21,6 +21,7 @@ #include #include #include +#include #include #include diff -Nurp linux-2.6.22.18/arch/powerpc/mm/fault.c linux-2.6.22.18-vs2.2.0.6/arch/powerpc/mm/fault.c --- linux-2.6.22.18/arch/powerpc/mm/fault.c 2007-07-21 23:59:48.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/powerpc/mm/fault.c 2008-02-11 12:35:32.000000000 +0100 @@ -378,7 +378,8 @@ out_of_memory: down_read(&mm->mmap_sem); goto survive; } - printk("VM: killing process %s\n", current->comm); + printk("VM: killing process %s(%d:#%u)\n", + current->comm, current->pid, current->xid); if (user_mode(regs)) do_exit(SIGKILL); return SIGKILL; diff -Nurp linux-2.6.22.18/arch/ppc/Kconfig linux-2.6.22.18-vs2.2.0.6/arch/ppc/Kconfig --- linux-2.6.22.18/arch/ppc/Kconfig 2007-07-21 23:58:19.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/ppc/Kconfig 2008-02-11 12:35:32.000000000 +0100 @@ -1455,6 +1455,8 @@ source "arch/powerpc/oprofile/Kconfig" source "arch/ppc/Kconfig.debug" +source "kernel/vserver/Kconfig" + source "security/Kconfig" source "crypto/Kconfig" diff -Nurp linux-2.6.22.18/arch/ppc/kernel/asm-offsets.c linux-2.6.22.18-vs2.2.0.6/arch/ppc/kernel/asm-offsets.c --- linux-2.6.22.18/arch/ppc/kernel/asm-offsets.c 2007-07-21 23:59:49.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/ppc/kernel/asm-offsets.c 2008-02-11 12:35:32.000000000 +0100 @@ -120,6 +120,7 @@ main(void) DEFINE(TRAP, STACK_FRAME_OVERHEAD+offsetof(struct pt_regs, trap)); DEFINE(CLONE_VM, CLONE_VM); DEFINE(CLONE_UNTRACED, CLONE_UNTRACED); + DEFINE(CLONE_KTHREAD, CLONE_KTHREAD); DEFINE(MM_PGD, offsetof(struct mm_struct, pgd)); /* About the CPU features table */ diff -Nurp linux-2.6.22.18/arch/ppc/kernel/misc.S linux-2.6.22.18-vs2.2.0.6/arch/ppc/kernel/misc.S --- linux-2.6.22.18/arch/ppc/kernel/misc.S 2007-05-04 15:57:15.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/ppc/kernel/misc.S 2008-02-11 12:35:32.000000000 +0100 @@ -848,7 +848,7 @@ _GLOBAL(kernel_thread) mr r30,r3 /* function */ mr r31,r4 /* argument */ ori r3,r5,CLONE_VM /* flags */ - oris r3,r3,CLONE_UNTRACED>>16 + oris r3,r3,(CLONE_UNTRACED|CLONE_KTHREAD)>>16 li r4,0 /* new sp (unused) */ li r0,__NR_clone sc diff -Nurp linux-2.6.22.18/arch/ppc/kernel/traps.c linux-2.6.22.18-vs2.2.0.6/arch/ppc/kernel/traps.c --- linux-2.6.22.18/arch/ppc/kernel/traps.c 2007-07-21 23:59:49.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/ppc/kernel/traps.c 2008-02-11 12:35:32.000000000 +0100 @@ -696,8 +696,9 @@ void nonrecoverable_exception(struct pt_ void trace_syscall(struct pt_regs *regs) { - printk("Task: %p(%d), PC: %08lX/%08lX, Syscall: %3ld, Result: %s%ld %s\n", - current, current->pid, regs->nip, regs->link, regs->gpr[0], + printk("Task: %p(%d[#%u]), PC: %08lX/%08lX, Syscall: %3ld, Result: %s%ld %s\n", + current, current->pid, current->xid, + regs->nip, regs->link, regs->gpr[0], regs->ccr&0x10000000?"Error=":"", regs->gpr[3], print_tainted()); } diff -Nurp linux-2.6.22.18/arch/ppc/mm/fault.c linux-2.6.22.18-vs2.2.0.6/arch/ppc/mm/fault.c --- linux-2.6.22.18/arch/ppc/mm/fault.c 2007-05-04 15:57:15.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/ppc/mm/fault.c 2008-02-11 12:35:32.000000000 +0100 @@ -296,7 +296,8 @@ out_of_memory: down_read(&mm->mmap_sem); goto survive; } - printk("VM: killing process %s\n", current->comm); + printk("VM: killing process %s(%d:#%u)\n", + current->comm, current->pid, current->xid); if (user_mode(regs)) do_exit(SIGKILL); return SIGKILL; diff -Nurp linux-2.6.22.18/arch/s390/Kconfig linux-2.6.22.18-vs2.2.0.6/arch/s390/Kconfig --- linux-2.6.22.18/arch/s390/Kconfig 2007-07-21 23:59:49.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/s390/Kconfig 2008-02-11 12:35:32.000000000 +0100 @@ -551,6 +551,8 @@ endmenu source "arch/s390/Kconfig.debug" +source "kernel/vserver/Kconfig" + source "security/Kconfig" source "crypto/Kconfig" diff -Nurp linux-2.6.22.18/arch/s390/kernel/compat_linux.c linux-2.6.22.18-vs2.2.0.6/arch/s390/kernel/compat_linux.c --- linux-2.6.22.18/arch/s390/kernel/compat_linux.c 2007-07-21 23:59:49.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/s390/kernel/compat_linux.c 2008-02-11 12:35:32.000000000 +0100 @@ -567,7 +567,7 @@ asmlinkage long sys32_gettimeofday(struc { if (tv) { struct timeval ktv; - do_gettimeofday(&ktv); + vx_gettimeofday(&ktv); if (put_tv32(tv, &ktv)) return -EFAULT; } diff -Nurp linux-2.6.22.18/arch/s390/kernel/process.c linux-2.6.22.18-vs2.2.0.6/arch/s390/kernel/process.c --- linux-2.6.22.18/arch/s390/kernel/process.c 2007-07-21 23:59:49.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/s390/kernel/process.c 2008-02-11 12:35:32.000000000 +0100 @@ -164,9 +164,9 @@ void show_regs(struct pt_regs *regs) struct task_struct *tsk = current; printk("CPU: %d %s\n", task_thread_info(tsk)->cpu, print_tainted()); - printk("Process %s (pid: %d, task: %p, ksp: %p)\n", - current->comm, current->pid, (void *) tsk, - (void *) tsk->thread.ksp); + printk("Process %s (pid: %d[#%u], task: %p, ksp: %p)\n", + current->comm, current->pid, current->xid, + (void *) tsk, (void *) tsk->thread.ksp); show_registers(regs); /* Show stack backtrace if pt_regs is from kernel mode */ @@ -197,7 +197,7 @@ int kernel_thread(int (*fn)(void *), voi regs.orig_gpr2 = -1; /* Ok, create the new process.. */ - return do_fork(flags | CLONE_VM | CLONE_UNTRACED, + return do_fork(flags | CLONE_VM | CLONE_UNTRACED | CLONE_KTHREAD, 0, ®s, 0, NULL, NULL); } diff -Nurp linux-2.6.22.18/arch/s390/kernel/ptrace.c linux-2.6.22.18-vs2.2.0.6/arch/s390/kernel/ptrace.c --- linux-2.6.22.18/arch/s390/kernel/ptrace.c 2007-07-21 23:58:19.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/s390/kernel/ptrace.c 2008-02-11 12:35:32.000000000 +0100 @@ -33,6 +33,7 @@ #include #include #include +#include #include #include @@ -725,7 +726,13 @@ sys_ptrace(long request, long pid, long goto out; } + if (!vx_check(vx_task_xid(child), VS_WATCH_P | VS_IDENT)) { + ret = -EPERM; + goto out_tsk; + } + ret = do_ptrace(child, request, addr, data); +out_tsk: put_task_struct(child); out: unlock_kernel(); diff -Nurp linux-2.6.22.18/arch/s390/kernel/syscalls.S linux-2.6.22.18-vs2.2.0.6/arch/s390/kernel/syscalls.S --- linux-2.6.22.18/arch/s390/kernel/syscalls.S 2007-07-21 23:59:49.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/s390/kernel/syscalls.S 2008-02-11 12:35:32.000000000 +0100 @@ -271,7 +271,7 @@ SYSCALL(sys_clock_settime,sys_clock_sett SYSCALL(sys_clock_gettime,sys_clock_gettime,sys32_clock_gettime_wrapper) /* 260 */ SYSCALL(sys_clock_getres,sys_clock_getres,sys32_clock_getres_wrapper) SYSCALL(sys_clock_nanosleep,sys_clock_nanosleep,sys32_clock_nanosleep_wrapper) -NI_SYSCALL /* reserved for vserver */ +SYSCALL(sys_vserver,sys_vserver,sys32_vserver) SYSCALL(s390_fadvise64_64,sys_ni_syscall,sys32_fadvise64_64_wrapper) SYSCALL(sys_statfs64,sys_statfs64,compat_sys_statfs64_wrapper) SYSCALL(sys_fstatfs64,sys_fstatfs64,compat_sys_fstatfs64_wrapper) diff -Nurp linux-2.6.22.18/arch/s390/mm/fault.c linux-2.6.22.18-vs2.2.0.6/arch/s390/mm/fault.c --- linux-2.6.22.18/arch/s390/mm/fault.c 2007-07-21 23:59:49.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/s390/mm/fault.c 2008-02-11 12:35:32.000000000 +0100 @@ -216,7 +216,8 @@ static int do_out_of_memory(struct pt_re down_read(&mm->mmap_sem); return 1; } - printk("VM: killing process %s\n", tsk->comm); + printk("VM: killing process %s(%d:#%u)\n", + tsk->comm, tsk->pid, tsk->xid); if (regs->psw.mask & PSW_MASK_PSTATE) do_exit(SIGKILL); do_no_context(regs, error_code, address); diff -Nurp linux-2.6.22.18/arch/sh/Kconfig linux-2.6.22.18-vs2.2.0.6/arch/sh/Kconfig --- linux-2.6.22.18/arch/sh/Kconfig 2007-07-21 23:59:49.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/sh/Kconfig 2008-02-11 12:35:32.000000000 +0100 @@ -723,6 +723,8 @@ source "arch/sh/oprofile/Kconfig" source "arch/sh/Kconfig.debug" +source "kernel/vserver/Kconfig" + source "security/Kconfig" source "crypto/Kconfig" diff -Nurp linux-2.6.22.18/arch/sh/kernel/irq.c linux-2.6.22.18-vs2.2.0.6/arch/sh/kernel/irq.c --- linux-2.6.22.18/arch/sh/kernel/irq.c 2007-07-21 23:59:49.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/sh/kernel/irq.c 2008-02-11 12:35:33.000000000 +0100 @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include diff -Nurp linux-2.6.22.18/arch/sh/kernel/process.c linux-2.6.22.18-vs2.2.0.6/arch/sh/kernel/process.c --- linux-2.6.22.18/arch/sh/kernel/process.c 2007-07-21 23:59:49.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/sh/kernel/process.c 2008-02-11 12:35:33.000000000 +0100 @@ -118,7 +118,8 @@ void machine_power_off(void) void show_regs(struct pt_regs * regs) { printk("\n"); - printk("Pid : %d, Comm: %20s\n", current->pid, current->comm); + printk("Pid : %d:#%u, Comm: %20s\n", + current->pid, current->xid, current->comm); print_symbol("PC is at %s\n", instruction_pointer(regs)); printk("PC : %08lx SP : %08lx SR : %08lx ", regs->pc, regs->regs[15], regs->sr); @@ -179,7 +180,7 @@ int kernel_thread(int (*fn)(void *), voi regs.sr = (1 << 30); /* Ok, create the new process.. */ - return do_fork(flags | CLONE_VM | CLONE_UNTRACED, 0, + return do_fork(flags | CLONE_VM | CLONE_UNTRACED | CLONE_KTHREAD, 0, ®s, 0, NULL, NULL); } diff -Nurp linux-2.6.22.18/arch/sh/kernel/vsyscall/vsyscall.c linux-2.6.22.18-vs2.2.0.6/arch/sh/kernel/vsyscall/vsyscall.c --- linux-2.6.22.18/arch/sh/kernel/vsyscall/vsyscall.c 2007-07-21 23:59:49.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/sh/kernel/vsyscall/vsyscall.c 2008-02-11 12:35:33.000000000 +0100 @@ -18,6 +18,7 @@ #include #include #include +#include /* * Should the kernel map a VDSO page into processes and pass its diff -Nurp linux-2.6.22.18/arch/sh/mm/fault.c linux-2.6.22.18-vs2.2.0.6/arch/sh/mm/fault.c --- linux-2.6.22.18/arch/sh/mm/fault.c 2007-07-21 23:59:49.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/sh/mm/fault.c 2008-02-11 12:35:33.000000000 +0100 @@ -201,7 +201,8 @@ out_of_memory: down_read(&mm->mmap_sem); goto survive; } - printk("VM: killing process %s\n", tsk->comm); + printk("VM: killing process %s(%d:#%u)\n", + tsk->comm, tsk->pid, tsk->xid); if (user_mode(regs)) do_exit(SIGKILL); goto no_context; diff -Nurp linux-2.6.22.18/arch/sh64/kernel/process.c linux-2.6.22.18-vs2.2.0.6/arch/sh64/kernel/process.c --- linux-2.6.22.18/arch/sh64/kernel/process.c 2007-07-21 23:59:49.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/sh64/kernel/process.c 2008-02-11 12:35:33.000000000 +0100 @@ -400,8 +400,8 @@ int kernel_thread(int (*fn)(void *), voi regs.pc = (unsigned long)kernel_thread_helper; regs.sr = (1 << 30); - return do_fork(flags | CLONE_VM | CLONE_UNTRACED, 0, - ®s, 0, NULL, NULL); + return do_fork(flags | CLONE_VM | CLONE_UNTRACED | CLONE_KTHREAD, + 0, ®s, 0, NULL, NULL); } /* diff -Nurp linux-2.6.22.18/arch/sh64/mm/fault.c linux-2.6.22.18-vs2.2.0.6/arch/sh64/mm/fault.c --- linux-2.6.22.18/arch/sh64/mm/fault.c 2007-07-21 23:59:49.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/sh64/mm/fault.c 2008-02-11 12:35:33.000000000 +0100 @@ -81,7 +81,7 @@ static inline void print_vma(struct vm_a static inline void print_task(struct task_struct *tsk) { - printk("Task pid %d\n", tsk->pid); + printk("Task pid %d:#%u\n", tsk->pid, tsk->xid); } static pte_t *lookup_pte(struct mm_struct *mm, unsigned long address) @@ -330,7 +330,8 @@ out_of_memory: down_read(&mm->mmap_sem); goto survive; } - printk("VM: killing process %s\n", tsk->comm); + printk("VM: killing process %s(%d:#%u)\n", + tsk->comm, tsk->pid, tsk->xid); if (user_mode(regs)) do_exit(SIGKILL); goto no_context; diff -Nurp linux-2.6.22.18/arch/sparc/Kconfig linux-2.6.22.18-vs2.2.0.6/arch/sparc/Kconfig --- linux-2.6.22.18/arch/sparc/Kconfig 2007-07-21 23:59:49.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/sparc/Kconfig 2008-02-11 12:35:33.000000000 +0100 @@ -317,6 +317,8 @@ endmenu source "arch/sparc/Kconfig.debug" +source "kernel/vserver/Kconfig" + source "security/Kconfig" source "crypto/Kconfig" diff -Nurp linux-2.6.22.18/arch/sparc/kernel/process.c linux-2.6.22.18-vs2.2.0.6/arch/sparc/kernel/process.c --- linux-2.6.22.18/arch/sparc/kernel/process.c 2007-07-21 23:59:49.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/sparc/kernel/process.c 2008-02-11 12:35:33.000000000 +0100 @@ -705,7 +705,8 @@ pid_t kernel_thread(int (*fn)(void *), v /* Notreached by child. */ "1: mov %%o0, %0\n\t" : "=r" (retval) : - "i" (__NR_clone), "r" (flags | CLONE_VM | CLONE_UNTRACED), + "i" (__NR_clone), "r" (flags | + CLONE_VM | CLONE_UNTRACED | CLONE_KTHREAD), "i" (__NR_exit), "r" (fn), "r" (arg) : "g1", "g2", "g3", "o0", "o1", "memory", "cc"); return retval; diff -Nurp linux-2.6.22.18/arch/sparc/kernel/ptrace.c linux-2.6.22.18-vs2.2.0.6/arch/sparc/kernel/ptrace.c --- linux-2.6.22.18/arch/sparc/kernel/ptrace.c 2007-05-04 15:58:05.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/sparc/kernel/ptrace.c 2008-02-11 12:35:33.000000000 +0100 @@ -19,6 +19,7 @@ #include #include #include +#include #include #include @@ -302,6 +303,10 @@ asmlinkage void do_ptrace(struct pt_regs pt_error_return(regs, -ret); goto out; } + if (!vx_check(vx_task_xid(child), VS_WATCH_P | VS_IDENT)) { + pt_error_return(regs, ESRCH); + goto out_tsk; + } if ((current->personality == PER_SUNOS && request == PTRACE_SUNATTACH) || (current->personality != PER_SUNOS && request == PTRACE_ATTACH)) { diff -Nurp linux-2.6.22.18/arch/sparc/kernel/systbls.S linux-2.6.22.18-vs2.2.0.6/arch/sparc/kernel/systbls.S --- linux-2.6.22.18/arch/sparc/kernel/systbls.S 2007-07-21 23:59:49.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/sparc/kernel/systbls.S 2008-02-11 12:35:33.000000000 +0100 @@ -71,7 +71,7 @@ sys_call_table: /*250*/ .long sparc_mremap, sys_sysctl, sys_getsid, sys_fdatasync, sys_nfsservctl /*255*/ .long sys_sync_file_range, sys_clock_settime, sys_clock_gettime, sys_clock_getres, sys_clock_nanosleep /*260*/ .long sys_sched_getaffinity, sys_sched_setaffinity, sys_timer_settime, sys_timer_gettime, sys_timer_getoverrun -/*265*/ .long sys_timer_delete, sys_timer_create, sys_nis_syscall, sys_io_setup, sys_io_destroy +/*265*/ .long sys_timer_delete, sys_timer_create, sys_vserver, sys_io_setup, sys_io_destroy /*270*/ .long sys_io_submit, sys_io_cancel, sys_io_getevents, sys_mq_open, sys_mq_unlink /*275*/ .long sys_mq_timedsend, sys_mq_timedreceive, sys_mq_notify, sys_mq_getsetattr, sys_waitid /*280*/ .long sys_tee, sys_add_key, sys_request_key, sys_keyctl, sys_openat diff -Nurp linux-2.6.22.18/arch/sparc/kernel/traps.c linux-2.6.22.18-vs2.2.0.6/arch/sparc/kernel/traps.c --- linux-2.6.22.18/arch/sparc/kernel/traps.c 2007-07-21 23:59:49.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/sparc/kernel/traps.c 2008-02-11 12:35:33.000000000 +0100 @@ -99,7 +99,8 @@ void die_if_kernel(char *str, struct pt_ " /_| \\__/ |_\\\n" " \\__U_/\n"); - printk("%s(%d): %s [#%d]\n", current->comm, current->pid, str, ++die_counter); + printk("%s(%d[#%u]): %s [#%d]\n", current->comm, + current->pid, current->xid, str, ++die_counter); show_regs(regs); __SAVE; __SAVE; __SAVE; __SAVE; diff -Nurp linux-2.6.22.18/arch/sparc/mm/fault.c linux-2.6.22.18-vs2.2.0.6/arch/sparc/mm/fault.c --- linux-2.6.22.18/arch/sparc/mm/fault.c 2007-07-21 23:59:49.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/sparc/mm/fault.c 2008-02-11 12:35:33.000000000 +0100 @@ -367,7 +367,8 @@ no_context: */ out_of_memory: up_read(&mm->mmap_sem); - printk("VM: killing process %s\n", tsk->comm); + printk("VM: killing process %s(%d:#%u)\n", + tsk->comm, tsk->pid, tsk->xid); if (from_user) do_exit(SIGKILL); goto no_context; diff -Nurp linux-2.6.22.18/arch/sparc64/Kconfig linux-2.6.22.18-vs2.2.0.6/arch/sparc64/Kconfig --- linux-2.6.22.18/arch/sparc64/Kconfig 2007-07-21 23:59:49.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/sparc64/Kconfig 2008-02-11 12:35:33.000000000 +0100 @@ -451,6 +451,8 @@ endmenu source "arch/sparc64/Kconfig.debug" +source "kernel/vserver/Kconfig" + source "security/Kconfig" source "crypto/Kconfig" diff -Nurp linux-2.6.22.18/arch/sparc64/kernel/binfmt_aout32.c linux-2.6.22.18-vs2.2.0.6/arch/sparc64/kernel/binfmt_aout32.c --- linux-2.6.22.18/arch/sparc64/kernel/binfmt_aout32.c 2007-05-04 15:58:05.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/sparc64/kernel/binfmt_aout32.c 2008-02-11 12:35:33.000000000 +0100 @@ -27,6 +27,7 @@ #include #include #include +#include #include #include diff -Nurp linux-2.6.22.18/arch/sparc64/kernel/process.c linux-2.6.22.18-vs2.2.0.6/arch/sparc64/kernel/process.c --- linux-2.6.22.18/arch/sparc64/kernel/process.c 2007-07-21 23:59:49.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/sparc64/kernel/process.c 2008-02-11 12:35:33.000000000 +0100 @@ -707,7 +707,8 @@ pid_t kernel_thread(int (*fn)(void *), v /* Notreached by child. */ "1:" : "=r" (retval) : - "i" (__NR_clone), "r" (flags | CLONE_VM | CLONE_UNTRACED), + "i" (__NR_clone), "r" (flags | + CLONE_VM | CLONE_UNTRACED | CLONE_KTHREAD), "i" (__NR_exit), "r" (fn), "r" (arg) : "g1", "g2", "g3", "o0", "o1", "memory", "cc"); return retval; diff -Nurp linux-2.6.22.18/arch/sparc64/kernel/ptrace.c linux-2.6.22.18-vs2.2.0.6/arch/sparc64/kernel/ptrace.c --- linux-2.6.22.18/arch/sparc64/kernel/ptrace.c 2007-05-04 15:58:05.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/sparc64/kernel/ptrace.c 2008-02-11 12:35:33.000000000 +0100 @@ -22,6 +22,7 @@ #include #include #include +#include #include #include @@ -215,6 +216,10 @@ asmlinkage void do_ptrace(struct pt_regs pt_error_return(regs, -ret); goto out; } + if (!vx_check(vx_task_xid(child), VS_WATCH_P | VS_IDENT)) { + pt_error_return(regs, ESRCH); + goto out_tsk; + } if ((current->personality == PER_SUNOS && request == PTRACE_SUNATTACH) || (current->personality != PER_SUNOS && request == PTRACE_ATTACH)) { diff -Nurp linux-2.6.22.18/arch/sparc64/kernel/sys_sparc32.c linux-2.6.22.18-vs2.2.0.6/arch/sparc64/kernel/sys_sparc32.c --- linux-2.6.22.18/arch/sparc64/kernel/sys_sparc32.c 2007-07-21 23:59:49.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/sparc64/kernel/sys_sparc32.c 2008-02-11 12:35:33.000000000 +0100 @@ -729,7 +729,7 @@ asmlinkage long sys32_gettimeofday(struc { if (tv) { struct timeval ktv; - do_gettimeofday(&ktv); + vx_gettimeofday(&ktv); if (put_tv32(tv, &ktv)) return -EFAULT; } diff -Nurp linux-2.6.22.18/arch/sparc64/kernel/systbls.S linux-2.6.22.18-vs2.2.0.6/arch/sparc64/kernel/systbls.S --- linux-2.6.22.18/arch/sparc64/kernel/systbls.S 2007-07-21 23:59:49.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/sparc64/kernel/systbls.S 2008-02-11 12:35:33.000000000 +0100 @@ -72,7 +72,7 @@ sys_call_table32: /*250*/ .word sys32_mremap, sys32_sysctl, sys32_getsid, sys_fdatasync, sys32_nfsservctl .word sys32_sync_file_range, compat_sys_clock_settime, compat_sys_clock_gettime, compat_sys_clock_getres, sys32_clock_nanosleep /*260*/ .word compat_sys_sched_getaffinity, compat_sys_sched_setaffinity, sys32_timer_settime, compat_sys_timer_gettime, sys_timer_getoverrun - .word sys_timer_delete, compat_sys_timer_create, sys_ni_syscall, compat_sys_io_setup, sys_io_destroy + .word sys_timer_delete, compat_sys_timer_create, sys32_vserver, compat_sys_io_setup, sys_io_destroy /*270*/ .word sys32_io_submit, sys_io_cancel, compat_sys_io_getevents, sys32_mq_open, sys_mq_unlink .word compat_sys_mq_timedsend, compat_sys_mq_timedreceive, compat_sys_mq_notify, compat_sys_mq_getsetattr, compat_sys_waitid /*280*/ .word sys32_tee, sys_add_key, sys_request_key, sys_keyctl, compat_sys_openat @@ -144,7 +144,7 @@ sys_call_table: /*250*/ .word sys64_mremap, sys_sysctl, sys_getsid, sys_fdatasync, sys_nfsservctl .word sys_sync_file_range, sys_clock_settime, sys_clock_gettime, sys_clock_getres, sys_clock_nanosleep /*260*/ .word sys_sched_getaffinity, sys_sched_setaffinity, sys_timer_settime, sys_timer_gettime, sys_timer_getoverrun - .word sys_timer_delete, sys_timer_create, sys_ni_syscall, sys_io_setup, sys_io_destroy + .word sys_timer_delete, sys_timer_create, sys_vserver, sys_io_setup, sys_io_destroy /*270*/ .word sys_io_submit, sys_io_cancel, sys_io_getevents, sys_mq_open, sys_mq_unlink .word sys_mq_timedsend, sys_mq_timedreceive, sys_mq_notify, sys_mq_getsetattr, sys_waitid /*280*/ .word sys_tee, sys_add_key, sys_request_key, sys_keyctl, sys_openat diff -Nurp linux-2.6.22.18/arch/sparc64/kernel/traps.c linux-2.6.22.18-vs2.2.0.6/arch/sparc64/kernel/traps.c --- linux-2.6.22.18/arch/sparc64/kernel/traps.c 2007-09-05 07:07:59.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/sparc64/kernel/traps.c 2008-02-11 12:35:33.000000000 +0100 @@ -2225,7 +2225,8 @@ void die_if_kernel(char *str, struct pt_ " /_| \\__/ |_\\\n" " \\__U_/\n"); - printk("%s(%d): %s [#%d]\n", current->comm, current->pid, str, ++die_counter); + printk("%s(%d[#%u]): %s [#%d]\n", current->comm, + current->pid, current->xid, str, ++die_counter); notify_die(DIE_OOPS, str, regs, 0, 255, SIGSEGV); __asm__ __volatile__("flushw"); __show_regs(regs); diff -Nurp linux-2.6.22.18/arch/sparc64/mm/fault.c linux-2.6.22.18-vs2.2.0.6/arch/sparc64/mm/fault.c --- linux-2.6.22.18/arch/sparc64/mm/fault.c 2007-09-05 07:07:59.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/sparc64/mm/fault.c 2008-02-11 12:35:33.000000000 +0100 @@ -463,7 +463,8 @@ handle_kernel_fault: out_of_memory: insn = get_fault_insn(regs, insn); up_read(&mm->mmap_sem); - printk("VM: killing process %s\n", current->comm); + printk("VM: killing process %s(%d:#%u)\n", + current->comm, current->pid, current->xid); if (!(regs->tstate & TSTATE_PRIV)) do_exit(SIGKILL); goto handle_kernel_fault; diff -Nurp linux-2.6.22.18/arch/sparc64/solaris/fs.c linux-2.6.22.18-vs2.2.0.6/arch/sparc64/solaris/fs.c --- linux-2.6.22.18/arch/sparc64/solaris/fs.c 2007-05-04 15:58:05.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/sparc64/solaris/fs.c 2008-02-11 12:35:33.000000000 +0100 @@ -368,7 +368,7 @@ static int report_statvfs(struct vfsmoun int j = strlen (p); if (j > 15) j = 15; - if (IS_RDONLY(inode)) i = 1; + if (IS_RDONLY(inode) || MNT_IS_RDONLY(mnt)) i = 1; if (mnt->mnt_flags & MNT_NOSUID) i |= 2; if (!sysv_valid_dev(inode->i_sb->s_dev)) return -EOVERFLOW; @@ -404,7 +404,7 @@ static int report_statvfs64(struct vfsmo int j = strlen (p); if (j > 15) j = 15; - if (IS_RDONLY(inode)) i = 1; + if (IS_RDONLY(inode) || MNT_IS_RDONLY(mnt)) i = 1; if (mnt->mnt_flags & MNT_NOSUID) i |= 2; if (!sysv_valid_dev(inode->i_sb->s_dev)) return -EOVERFLOW; diff -Nurp linux-2.6.22.18/arch/um/Kconfig linux-2.6.22.18-vs2.2.0.6/arch/um/Kconfig --- linux-2.6.22.18/arch/um/Kconfig 2007-07-21 23:59:49.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/um/Kconfig 2008-02-11 12:35:33.000000000 +0100 @@ -316,6 +316,8 @@ source "drivers/connector/Kconfig" source "fs/Kconfig" +source "kernel/vserver/Kconfig" + source "security/Kconfig" source "crypto/Kconfig" diff -Nurp linux-2.6.22.18/arch/um/kernel/trap.c linux-2.6.22.18-vs2.2.0.6/arch/um/kernel/trap.c --- linux-2.6.22.18/arch/um/kernel/trap.c 2007-07-21 23:59:50.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/um/kernel/trap.c 2008-02-11 12:35:33.000000000 +0100 @@ -210,7 +210,8 @@ unsigned long segv(struct faultinfo fi, current->thread.arch.faultinfo = fi; force_sig_info(SIGBUS, &si, current); } else if (err == -ENOMEM) { - printk("VM: killing process %s\n", current->comm); + printk("VM: killing process %s(%d:#%u)\n", + current->comm, current->pid, current->xid); do_exit(SIGKILL); } else { BUG_ON(err != -EFAULT); diff -Nurp linux-2.6.22.18/arch/v850/Kconfig linux-2.6.22.18-vs2.2.0.6/arch/v850/Kconfig --- linux-2.6.22.18/arch/v850/Kconfig 2007-07-21 23:59:50.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/v850/Kconfig 2008-02-11 12:35:33.000000000 +0100 @@ -333,6 +333,8 @@ source "drivers/usb/Kconfig" source "arch/v850/Kconfig.debug" +source "kernel/vserver/Kconfig" + source "security/Kconfig" source "crypto/Kconfig" diff -Nurp linux-2.6.22.18/arch/v850/kernel/process.c linux-2.6.22.18-vs2.2.0.6/arch/v850/kernel/process.c --- linux-2.6.22.18/arch/v850/kernel/process.c 2007-07-21 23:59:50.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/v850/kernel/process.c 2008-02-11 12:35:33.000000000 +0100 @@ -82,7 +82,7 @@ int kernel_thread (int (*fn)(void *), vo /* Clone this thread. Note that we don't pass the clone syscall's second argument -- it's ignored for calls from kernel mode (the child's SP is always set to the top of the kernel stack). */ - arg0 = flags | CLONE_VM; + arg0 = flags | CLONE_VM | CLONE_KTHREAD; syscall = __NR_clone; asm volatile ("trap " SYSCALL_SHORT_TRAP : "=r" (ret), "=r" (syscall) diff -Nurp linux-2.6.22.18/arch/v850/kernel/ptrace.c linux-2.6.22.18-vs2.2.0.6/arch/v850/kernel/ptrace.c --- linux-2.6.22.18/arch/v850/kernel/ptrace.c 2007-07-21 23:59:50.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/v850/kernel/ptrace.c 2008-02-11 12:35:33.000000000 +0100 @@ -23,6 +23,7 @@ #include #include #include +#include #include #include @@ -116,6 +117,9 @@ long arch_ptrace(struct task_struct *chi { int rval; + if (!vx_check(vx_task_xid(child), VS_WATCH_P | VS_IDENT)) + goto out; + switch (request) { unsigned long val, copied; diff -Nurp linux-2.6.22.18/arch/x86_64/ia32/ia32_aout.c linux-2.6.22.18-vs2.2.0.6/arch/x86_64/ia32/ia32_aout.c --- linux-2.6.22.18/arch/x86_64/ia32/ia32_aout.c 2007-05-04 15:58:05.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/x86_64/ia32/ia32_aout.c 2008-02-11 12:35:33.000000000 +0100 @@ -25,6 +25,7 @@ #include #include #include +#include #include #include diff -Nurp linux-2.6.22.18/arch/x86_64/ia32/ia32_binfmt.c linux-2.6.22.18-vs2.2.0.6/arch/x86_64/ia32/ia32_binfmt.c --- linux-2.6.22.18/arch/x86_64/ia32/ia32_binfmt.c 2007-07-21 23:59:50.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/x86_64/ia32/ia32_binfmt.c 2008-02-11 12:35:33.000000000 +0100 @@ -324,7 +324,8 @@ int ia32_setup_arg_pages(struct linux_bi kmem_cache_free(vm_area_cachep, mpnt); return ret; } - mm->stack_vm = mm->total_vm = vma_pages(mpnt); + vx_vmpages_sub(mm, mm->total_vm - vma_pages(mpnt)); + mm->stack_vm = mm->total_vm; } for (i = 0 ; i < MAX_ARG_PAGES ; i++) { diff -Nurp linux-2.6.22.18/arch/x86_64/ia32/ia32entry.S linux-2.6.22.18-vs2.2.0.6/arch/x86_64/ia32/ia32entry.S --- linux-2.6.22.18/arch/x86_64/ia32/ia32entry.S 2007-09-29 14:11:36.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/x86_64/ia32/ia32entry.S 2008-02-11 12:35:33.000000000 +0100 @@ -680,7 +680,7 @@ ia32_sys_call_table: .quad sys_tgkill /* 270 */ .quad compat_sys_utimes .quad sys32_fadvise64_64 - .quad quiet_ni_syscall /* sys_vserver */ + .quad sys32_vserver .quad sys_mbind .quad compat_sys_get_mempolicy /* 275 */ .quad sys_set_mempolicy diff -Nurp linux-2.6.22.18/arch/x86_64/ia32/syscall32.c linux-2.6.22.18-vs2.2.0.6/arch/x86_64/ia32/syscall32.c --- linux-2.6.22.18/arch/x86_64/ia32/syscall32.c 2007-07-21 23:59:50.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/x86_64/ia32/syscall32.c 2008-02-11 12:35:33.000000000 +0100 @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include diff -Nurp linux-2.6.22.18/arch/x86_64/ia32/sys_ia32.c linux-2.6.22.18-vs2.2.0.6/arch/x86_64/ia32/sys_ia32.c --- linux-2.6.22.18/arch/x86_64/ia32/sys_ia32.c 2007-07-21 23:59:50.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/x86_64/ia32/sys_ia32.c 2008-02-11 12:35:33.000000000 +0100 @@ -454,7 +454,7 @@ sys32_gettimeofday(struct compat_timeval { if (tv) { struct timeval ktv; - do_gettimeofday(&ktv); + vx_gettimeofday(&ktv); if (put_tv32(tv, &ktv)) return -EFAULT; } diff -Nurp linux-2.6.22.18/arch/x86_64/Kconfig linux-2.6.22.18-vs2.2.0.6/arch/x86_64/Kconfig --- linux-2.6.22.18/arch/x86_64/Kconfig 2007-07-21 23:59:50.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/x86_64/Kconfig 2008-02-11 12:35:33.000000000 +0100 @@ -782,6 +782,8 @@ endmenu source "arch/x86_64/Kconfig.debug" +source "kernel/vserver/Kconfig" + source "security/Kconfig" source "crypto/Kconfig" diff -Nurp linux-2.6.22.18/arch/x86_64/kernel/process.c linux-2.6.22.18-vs2.2.0.6/arch/x86_64/kernel/process.c --- linux-2.6.22.18/arch/x86_64/kernel/process.c 2007-07-21 23:59:50.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/x86_64/kernel/process.c 2008-02-11 12:35:33.000000000 +0100 @@ -54,7 +54,8 @@ asmlinkage extern void ret_from_fork(void); -unsigned long kernel_thread_flags = CLONE_VM | CLONE_UNTRACED; +unsigned long kernel_thread_flags = + CLONE_VM | CLONE_UNTRACED | CLONE_KTHREAD; unsigned long boot_option_idle_override = 0; EXPORT_SYMBOL(boot_option_idle_override); @@ -310,8 +311,8 @@ void __show_regs(struct pt_regs * regs) printk("\n"); print_modules(); - printk("Pid: %d, comm: %.20s %s %s %.*s\n", - current->pid, current->comm, print_tainted(), + printk("Pid: %d:#%u, comm: %.20s %s %s %.*s\n", + current->pid, current->xid, current->comm, print_tainted(), init_utsname()->release, (int)strcspn(init_utsname()->version, " "), init_utsname()->version); diff -Nurp linux-2.6.22.18/arch/x86_64/kernel/traps.c linux-2.6.22.18-vs2.2.0.6/arch/x86_64/kernel/traps.c --- linux-2.6.22.18/arch/x86_64/kernel/traps.c 2007-07-21 23:59:50.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/x86_64/kernel/traps.c 2008-02-11 12:46:02.000000000 +0100 @@ -413,8 +413,9 @@ void show_registers(struct pt_regs *regs rsp = regs->rsp; printk("CPU %d ", cpu); __show_regs(regs); - printk("Process %s (pid: %d, threadinfo %p, task %p)\n", - cur->comm, cur->pid, task_thread_info(cur), cur); + printk("Process %s (pid: %d[#%u], threadinfo %p, task %p)\n", + cur->comm, cur->pid, cur->xid, + task_thread_info(cur), cur); /* * When in-kernel, we also print out the stack and code at the @@ -580,8 +581,8 @@ static void __kprobes do_trap(int trapnr if (exception_trace && unhandled_signal(tsk, signr)) printk(KERN_INFO - "%s[%d] trap %s rip:%lx rsp:%lx error:%lx\n", - tsk->comm, tsk->pid, str, + "%s[%d:#%u] trap %s rip:%lx rsp:%lx error:%lx\n", + tsk->comm, tsk->pid, tsk->xid, str, regs->rip, regs->rsp, error_code); if (info) @@ -684,8 +685,8 @@ asmlinkage void __kprobes do_general_pro if (exception_trace && unhandled_signal(tsk, SIGSEGV)) printk(KERN_INFO - "%s[%d] general protection rip:%lx rsp:%lx error:%lx\n", - tsk->comm, tsk->pid, + "%s[%d:#%u] general protection rip:%lx rsp:%lx error:%lx\n", + tsk->comm, tsk->pid, tsk->xid, regs->rip, regs->rsp, error_code); force_sig(SIGSEGV, tsk); diff -Nurp linux-2.6.22.18/arch/x86_64/mm/fault.c linux-2.6.22.18-vs2.2.0.6/arch/x86_64/mm/fault.c --- linux-2.6.22.18/arch/x86_64/mm/fault.c 2007-07-21 23:59:50.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/arch/x86_64/mm/fault.c 2008-02-11 12:35:33.000000000 +0100 @@ -497,10 +497,10 @@ bad_area_nosemaphore: if (exception_trace && unhandled_signal(tsk, SIGSEGV)) { printk( - "%s%s[%d]: segfault at %016lx rip %016lx rsp %016lx error %lx\n", + "%s%s[%d:#%u]: segfault at %016lx rip %016lx rsp %016lx error %lx\n", tsk->pid > 1 ? KERN_INFO : KERN_EMERG, - tsk->comm, tsk->pid, address, regs->rip, - regs->rsp, error_code); + tsk->comm, tsk->pid, tsk->xid, address, + regs->rip, regs->rsp, error_code); } tsk->thread.cr2 = address; @@ -567,7 +567,8 @@ out_of_memory: yield(); goto again; } - printk("VM: killing process %s\n", tsk->comm); + printk("VM: killing process %s(%d:#%u)\n", + tsk->comm, tsk->pid, tsk->xid); if (error_code & 4) do_exit(SIGKILL); goto no_context; diff -Nurp linux-2.6.22.18/Documentation/vserver/debug.txt linux-2.6.22.18-vs2.2.0.6/Documentation/vserver/debug.txt --- linux-2.6.22.18/Documentation/vserver/debug.txt 1970-01-01 01:00:00.000000000 +0100 +++ linux-2.6.22.18-vs2.2.0.6/Documentation/vserver/debug.txt 2008-02-11 12:35:31.000000000 +0100 @@ -0,0 +1,154 @@ + +debug_cvirt: + + 2 4 "vx_map_tgid: %p/%llx: %d -> %d" + "vx_rmap_tgid: %p/%llx: %d -> %d" + +debug_dlim: + + 0 1 "ALLOC (%p,#%d)%c inode (%d)" + "FREE (%p,#%d)%c inode" + 1 2 "ALLOC (%p,#%d)%c %lld bytes (%d)" + "FREE (%p,#%d)%c %lld bytes" + 2 4 "ADJUST: %lld,%lld on %ld,%ld [mult=%d]" + 3 8 "ext3_has_free_blocks(%p): %lu<%lu+1, %c, %u!=%u r=%d" + "ext3_has_free_blocks(%p): free=%lu, root=%lu" + "rcu_free_dl_info(%p)" + 4 10 "alloc_dl_info(%p,%d) = %p" + "dealloc_dl_info(%p)" + "get_dl_info(%p[#%d.%d])" + "put_dl_info(%p[#%d.%d])" + 5 20 "alloc_dl_info(%p,%d)*" + 6 40 "__hash_dl_info: %p[#%d]" + "__unhash_dl_info: %p[#%d]" + 7 80 "locate_dl_info(%p,#%d) = %p" + +debug_misc: + + 0 1 "destroy_dqhash: %p [#0x%08x] c=%d" + "new_dqhash: %p [#0x%08x]" + "vroot[%d]_clr_dev: dev=%p[%lu,%d:%d]" + "vroot[%d]_get_real_bdev: dev=%p[%lu,%d:%d]" + "vroot[%d]_set_dev: dev=%p[%lu,%d:%d]" + "vroot_get_real_bdev not set" + 1 2 "cow_break_link(»%s«)" + "temp copy »%s«" + 2 4 "dentry_open(new): %p" + "dentry_open(old): %p" + "lookup_create(new): %p" + "old path »%s«" + "path_lookup(old): %d" + "vfs_create(new): %d" + "vfs_rename: %d" + "vfs_sendfile: %d" + 3 8 "fput(new_file=%p[#%d])" + "fput(old_file=%p[#%d])" + 4 10 "vx_info_kill(%p[#%d],%d,%d) = %d" + "vx_info_kill(%p[#%d],%d,%d)*" + 5 20 "vs_reboot(%p[#%d],%d)" + 6 40 "dropping task %p[#%u,%u] for %p[#%u,%u]" + +debug_net: + + 2 4 "nx_addr_conflict(%p,%p) %d.%d,%d.%d" + 3 8 "inet_bind(%p) %d.%d.%d.%d, %d.%d.%d.%d, %d.%d.%d.%d" + "inet_bind(%p)* %p,%p;%lx %d.%d.%d.%d" + 4 10 "ip_route_connect(%p) %p,%p;%lx" + 5 20 "__addr_in_socket(%p,%d.%d.%d.%d) %p:%d.%d.%d.%d %p;%lx" + 6 40 "sk,egf: %p [#%d] (from %d)" + "sk,egn: %p [#%d] (from %d)" + "sk,req: %p [#%d] (from %d)" + "sk: %p [#%d] (from %d)" + "tw: %p [#%d] (from %d)" + 7 80 "__sock_recvmsg: %p[%p,%p,%p;%d]:%d/%d" + "__sock_sendmsg: %p[%p,%p,%p;%d]:%d/%d" + +debug_nid: + + 0 1 "__lookup_nx_info(#%u): %p[#%u]" + "alloc_nx_info(%d) = %p" + "create_nx_info(%d) (dynamic rejected)" + "create_nx_info(%d) = %p (already there)" + "create_nx_info(%d) = %p (new)" + "dealloc_nx_info(%p)" + 1 2 "alloc_nx_info(%d)*" + "create_nx_info(%d)*" + 2 4 "get_nx_info(%p[#%d.%d])" + "put_nx_info(%p[#%d.%d])" + 3 8 "claim_nx_info(%p[#%d.%d.%d]) %p" + "clr_nx_info(%p[#%d.%d])" + "init_nx_info(%p[#%d.%d])" + "release_nx_info(%p[#%d.%d.%d]) %p" + "set_nx_info(%p[#%d.%d])" + 4 10 "__hash_nx_info: %p[#%d]" + "__nx_dynamic_id: [#%d]" + "__unhash_nx_info: %p[#%d.%d.%d]" + 5 20 "moved task %p into nxi:%p[#%d]" + "nx_migrate_task(%p,%p[#%d.%d.%d])" + "task_get_nx_info(%p)" + 6 40 "nx_clear_persistent(%p[#%d])" + +debug_quota: + + 0 1 "quota_sync_dqh(%p,%d) discard inode %p" + 1 2 "quota_sync_dqh(%p,%d)" + "sync_dquots(%p,%d)" + "sync_dquots_dqh(%p,%d)" + 3 8 "do_quotactl(%p,%d,cmd=%d,id=%d,%p)" + +debug_switch: + + 0 1 "vc: VCMD_%02d_%d[%d], %d,%p [%d,%d,%x,%x]" + 1 2 "vc: VCMD_%02d_%d[%d] = %08lx(%ld) [%d,%d]" + 4 10 "%s: (%s %s) returned %s with %d" + +debug_tag: + + 7 80 "dx_parse_tag(»%s«): %d:#%d" + "dx_propagate_tag(%p[#%lu.%d]): %d,%d" + +debug_xid: + + 0 1 "__lookup_vx_info(#%u): %p[#%u]" + "alloc_vx_info(%d) = %p" + "alloc_vx_info(%d)*" + "create_vx_info(%d) (dynamic rejected)" + "create_vx_info(%d) = %p (already there)" + "create_vx_info(%d) = %p (new)" + "dealloc_vx_info(%p)" + "loc_vx_info(%d) = %p (found)" + "loc_vx_info(%d) = %p (new)" + "loc_vx_info(%d) = %p (not available)" + 1 2 "create_vx_info(%d)*" + "loc_vx_info(%d)*" + 2 4 "get_vx_info(%p[#%d.%d])" + "put_vx_info(%p[#%d.%d])" + 3 8 "claim_vx_info(%p[#%d.%d.%d]) %p" + "clr_vx_info(%p[#%d.%d])" + "init_vx_info(%p[#%d.%d])" + "release_vx_info(%p[#%d.%d.%d]) %p" + "set_vx_info(%p[#%d.%d])" + 4 10 "__hash_vx_info: %p[#%d]" + "__unhash_vx_info: %p[#%d.%d.%d]" + "__vx_dynamic_id: [#%d]" + 5 20 "enter_vx_info(%p[#%d],%p) %p[#%d,%p]" + "leave_vx_info(%p[#%d,%p]) %p[#%d,%p]" + "moved task %p into vxi:%p[#%d]" + "task_get_vx_info(%p)" + "vx_migrate_task(%p,%p[#%d.%d])" + 6 40 "vx_clear_persistent(%p[#%d])" + "vx_exit_init(%p[#%d],%p[#%d,%d,%d])" + "vx_set_init(%p[#%d],%p[#%d,%d,%d])" + "vx_set_persistent(%p[#%d])" + "vx_set_reaper(%p[#%d],%p[#%d,%d])" + 7 80 "vx_child_reaper(%p[#%u,%u]) = %p[#%u,%u]" + + +debug_limit: + + n 2^n "vx_acc_cres[%5d,%s,%2d]: %5d%s" + "vx_cres_avail[%5d,%s,%2d]: %5ld > %5d + %5d" + + m 2^m "vx_acc_page[%5d,%s,%2d]: %5d%s" + "vx_acc_pages[%5d,%s,%2d]: %5d += %5d" + "vx_pages_avail[%5d,%s,%2d]: %5ld > %5d + %5d" diff -Nurp linux-2.6.22.18/drivers/block/Kconfig linux-2.6.22.18-vs2.2.0.6/drivers/block/Kconfig --- linux-2.6.22.18/drivers/block/Kconfig 2007-07-21 23:59:50.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/drivers/block/Kconfig 2008-02-11 12:35:33.000000000 +0100 @@ -311,6 +311,13 @@ config BLK_DEV_CRYPTOLOOP instead, which can be configured to be on-disk compatible with the cryptoloop device. +config BLK_DEV_VROOT + tristate "Virtual Root device support" + depends on QUOTACTL + ---help--- + Saying Y here will allow you to use quota/fs ioctls on a shared + partition within a virtual server without compromising security. + config BLK_DEV_NBD tristate "Network block device support" depends on NET diff -Nurp linux-2.6.22.18/drivers/block/loop.c linux-2.6.22.18-vs2.2.0.6/drivers/block/loop.c --- linux-2.6.22.18/drivers/block/loop.c 2007-07-21 23:59:50.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/drivers/block/loop.c 2008-02-11 12:35:33.000000000 +0100 @@ -74,6 +74,7 @@ #include #include #include +#include #include @@ -790,6 +791,7 @@ static int loop_set_fd(struct loop_devic lo->lo_blocksize = lo_blocksize; lo->lo_device = bdev; lo->lo_flags = lo_flags; + lo->lo_xid = vx_current_xid(); lo->lo_backing_file = file; lo->transfer = transfer_none; lo->ioctl = NULL; @@ -909,6 +911,7 @@ static int loop_clr_fd(struct loop_devic lo->lo_encrypt_key_size = 0; lo->lo_flags = 0; lo->lo_thread = NULL; + lo->lo_xid = 0; memset(lo->lo_encrypt_key, 0, LO_KEY_SIZE); memset(lo->lo_crypt_name, 0, LO_NAME_SIZE); memset(lo->lo_file_name, 0, LO_NAME_SIZE); @@ -930,7 +933,7 @@ loop_set_status(struct loop_device *lo, struct loop_func_table *xfer; if (lo->lo_encrypt_key_size && lo->lo_key_owner != current->uid && - !capable(CAP_SYS_ADMIN)) + !vx_capable(CAP_SYS_ADMIN, VXC_ADMIN_CLOOP)) return -EPERM; if (lo->lo_state != Lo_bound) return -ENXIO; @@ -1010,7 +1013,8 @@ loop_get_status(struct loop_device *lo, memcpy(info->lo_crypt_name, lo->lo_crypt_name, LO_NAME_SIZE); info->lo_encrypt_type = lo->lo_encryption ? lo->lo_encryption->number : 0; - if (lo->lo_encrypt_key_size && capable(CAP_SYS_ADMIN)) { + if (lo->lo_encrypt_key_size && + vx_capable(CAP_SYS_ADMIN, VXC_ADMIN_CLOOP)) { info->lo_encrypt_key_size = lo->lo_encrypt_key_size; memcpy(info->lo_encrypt_key, lo->lo_encrypt_key, lo->lo_encrypt_key_size); @@ -1321,6 +1325,9 @@ static int lo_open(struct inode *inode, { struct loop_device *lo = inode->i_bdev->bd_disk->private_data; + if (!vx_check(lo->lo_xid, VS_IDENT|VS_HOSTID)) + return -EACCES; + mutex_lock(&lo->lo_ctl_mutex); lo->lo_refcnt++; mutex_unlock(&lo->lo_ctl_mutex); diff -Nurp linux-2.6.22.18/drivers/block/Makefile linux-2.6.22.18-vs2.2.0.6/drivers/block/Makefile --- linux-2.6.22.18/drivers/block/Makefile 2007-05-04 15:58:05.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/drivers/block/Makefile 2008-02-11 12:35:33.000000000 +0100 @@ -28,4 +28,5 @@ obj-$(CONFIG_BLK_DEV_CRYPTOLOOP) += cryp obj-$(CONFIG_VIODASD) += viodasd.o obj-$(CONFIG_BLK_DEV_SX8) += sx8.o obj-$(CONFIG_BLK_DEV_UB) += ub.o +obj-$(CONFIG_BLK_DEV_VROOT) += vroot.o diff -Nurp linux-2.6.22.18/drivers/block/vroot.c linux-2.6.22.18-vs2.2.0.6/drivers/block/vroot.c --- linux-2.6.22.18/drivers/block/vroot.c 1970-01-01 01:00:00.000000000 +0100 +++ linux-2.6.22.18-vs2.2.0.6/drivers/block/vroot.c 2008-02-11 12:35:33.000000000 +0100 @@ -0,0 +1,281 @@ +/* + * linux/drivers/block/vroot.c + * + * written by Herbert Pötzl, 9/11/2002 + * ported to 2.6.10 by Herbert Pötzl, 30/12/2004 + * + * based on the loop.c code by Theodore Ts'o. + * + * Copyright (C) 2002-2007 by Herbert Pötzl. + * Redistribution of this file is permitted under the + * GNU General Public License. + * + */ + +#include +#include +#include +#include +#include + +#include +#include + + +static int max_vroot = 8; + +static struct vroot_device *vroot_dev; +static struct gendisk **disks; + + +static int vroot_set_dev( + struct vroot_device *vr, + struct file *vr_file, + struct block_device *bdev, + unsigned int arg) +{ + struct block_device *real_bdev; + struct file *file; + struct inode *inode; + int error; + + error = -EBUSY; + if (vr->vr_state != Vr_unbound) + goto out; + + error = -EBADF; + file = fget(arg); + if (!file) + goto out; + + error = -EINVAL; + inode = file->f_dentry->d_inode; + + + if (S_ISBLK(inode->i_mode)) { + real_bdev = inode->i_bdev; + vr->vr_device = real_bdev; + __iget(real_bdev->bd_inode); + } else + goto out_fput; + + vxdprintk(VXD_CBIT(misc, 0), + "vroot[%d]_set_dev: dev=" VXF_DEV, + vr->vr_number, VXD_DEV(real_bdev)); + + vr->vr_state = Vr_bound; + error = 0; + + out_fput: + fput(file); + out: + return error; +} + +static int vroot_clr_dev( + struct vroot_device *vr, + struct file *vr_file, + struct block_device *bdev) +{ + struct block_device *real_bdev; + + if (vr->vr_state != Vr_bound) + return -ENXIO; + if (vr->vr_refcnt > 1) /* we needed one fd for the ioctl */ + return -EBUSY; + + real_bdev = vr->vr_device; + + vxdprintk(VXD_CBIT(misc, 0), + "vroot[%d]_clr_dev: dev=" VXF_DEV, + vr->vr_number, VXD_DEV(real_bdev)); + + bdput(real_bdev); + vr->vr_state = Vr_unbound; + vr->vr_device = NULL; + return 0; +} + + +static int vr_ioctl(struct inode *inode, struct file *file, + unsigned int cmd, unsigned long arg) +{ + struct vroot_device *vr = inode->i_bdev->bd_disk->private_data; + int err; + + down(&vr->vr_ctl_mutex); + switch (cmd) { + case VROOT_SET_DEV: + err = vroot_set_dev(vr, file, inode->i_bdev, arg); + break; + case VROOT_CLR_DEV: + err = vroot_clr_dev(vr, file, inode->i_bdev); + break; + default: + err = -EINVAL; + break; + } + up(&vr->vr_ctl_mutex); + return err; +} + +static int vr_open(struct inode *inode, struct file *file) +{ + struct vroot_device *vr = inode->i_bdev->bd_disk->private_data; + + down(&vr->vr_ctl_mutex); + vr->vr_refcnt++; + up(&vr->vr_ctl_mutex); + return 0; +} + +static int vr_release(struct inode *inode, struct file *file) +{ + struct vroot_device *vr = inode->i_bdev->bd_disk->private_data; + + down(&vr->vr_ctl_mutex); + --vr->vr_refcnt; + up(&vr->vr_ctl_mutex); + return 0; +} + +static struct block_device_operations vr_fops = { + .owner = THIS_MODULE, + .open = vr_open, + .release = vr_release, + .ioctl = vr_ioctl, +}; + +struct block_device *__vroot_get_real_bdev(struct block_device *bdev) +{ + struct inode *inode = bdev->bd_inode; + struct vroot_device *vr; + struct block_device *real_bdev; + int minor = iminor(inode); + + vr = &vroot_dev[minor]; + real_bdev = vr->vr_device; + + vxdprintk(VXD_CBIT(misc, 0), + "vroot[%d]_get_real_bdev: dev=" VXF_DEV, + vr->vr_number, VXD_DEV(real_bdev)); + + if (vr->vr_state != Vr_bound) + return ERR_PTR(-ENXIO); + + __iget(real_bdev->bd_inode); + return real_bdev; +} + +/* + * And now the modules code and kernel interface. + */ + +module_param(max_vroot, int, 0); + +MODULE_PARM_DESC(max_vroot, "Maximum number of vroot devices (1-256)"); +MODULE_LICENSE("GPL"); +MODULE_ALIAS_BLOCKDEV_MAJOR(VROOT_MAJOR); + +MODULE_AUTHOR ("Herbert Pötzl"); +MODULE_DESCRIPTION ("Virtual Root Device Mapper"); + + +int __init vroot_init(void) +{ + int err, i; + + if (max_vroot < 1 || max_vroot > 256) { + max_vroot = MAX_VROOT_DEFAULT; + printk(KERN_WARNING "vroot: invalid max_vroot " + "(must be between 1 and 256), " + "using default (%d)\n", max_vroot); + } + + if (register_blkdev(VROOT_MAJOR, "vroot")) + return -EIO; + + err = -ENOMEM; + vroot_dev = kmalloc(max_vroot * sizeof(struct vroot_device), GFP_KERNEL); + if (!vroot_dev) + goto out_mem1; + memset(vroot_dev, 0, max_vroot * sizeof(struct vroot_device)); + + disks = kmalloc(max_vroot * sizeof(struct gendisk *), GFP_KERNEL); + if (!disks) + goto out_mem2; + + for (i = 0; i < max_vroot; i++) { + disks[i] = alloc_disk(1); + if (!disks[i]) + goto out_mem3; + } + + for (i = 0; i < max_vroot; i++) { + struct vroot_device *vr = &vroot_dev[i]; + struct gendisk *disk = disks[i]; + + memset(vr, 0, sizeof(*vr)); + init_MUTEX(&vr->vr_ctl_mutex); + vr->vr_number = i; + disk->major = VROOT_MAJOR; + disk->first_minor = i; + disk->fops = &vr_fops; + sprintf(disk->disk_name, "vroot%d", i); + disk->private_data = vr; + } + + err = register_vroot_grb(&__vroot_get_real_bdev); + if (err) + goto out_mem3; + + for (i = 0; i < max_vroot; i++) + add_disk(disks[i]); + printk(KERN_INFO "vroot: loaded (max %d devices)\n", max_vroot); + return 0; + +out_mem3: + while (i--) + put_disk(disks[i]); + kfree(disks); +out_mem2: + kfree(vroot_dev); +out_mem1: + unregister_blkdev(VROOT_MAJOR, "vroot"); + printk(KERN_ERR "vroot: ran out of memory\n"); + return err; +} + +void vroot_exit(void) +{ + int i; + + if (unregister_vroot_grb(&__vroot_get_real_bdev)) + printk(KERN_WARNING "vroot: cannot unregister grb\n"); + + for (i = 0; i < max_vroot; i++) { + del_gendisk(disks[i]); + put_disk(disks[i]); + } + if (unregister_blkdev(VROOT_MAJOR, "vroot")) + printk(KERN_WARNING "vroot: cannot unregister blkdev\n"); + + kfree(disks); + kfree(vroot_dev); +} + +module_init(vroot_init); +module_exit(vroot_exit); + +#ifndef MODULE + +static int __init max_vroot_setup(char *str) +{ + max_vroot = simple_strtol(str, NULL, 0); + return 1; +} + +__setup("max_vroot=", max_vroot_setup); + +#endif + diff -Nurp linux-2.6.22.18/drivers/char/sysrq.c linux-2.6.22.18-vs2.2.0.6/drivers/char/sysrq.c --- linux-2.6.22.18/drivers/char/sysrq.c 2007-07-21 23:59:53.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/drivers/char/sysrq.c 2008-02-11 12:35:33.000000000 +0100 @@ -36,6 +36,7 @@ #include #include #include +#include #include #include @@ -309,6 +310,21 @@ static struct sysrq_key_op sysrq_unrt_op .enable_mask = SYSRQ_ENABLE_RTNICE, }; + +#ifdef CONFIG_VSERVER_DEBUG +static void sysrq_handle_vxinfo(int key, struct tty_struct *tty) +{ + dump_vx_info_inactive((key == 'x')?0:1); +} + +static struct sysrq_key_op sysrq_showvxinfo_op = { + .handler = sysrq_handle_vxinfo, + .help_msg = "conteXt", + .action_msg = "Show Context Info", + .enable_mask = SYSRQ_ENABLE_DUMP, +}; +#endif + /* Key Operations table and lock */ static DEFINE_SPINLOCK(sysrq_key_table_lock); @@ -357,7 +373,11 @@ static struct sysrq_key_op *sysrq_key_ta /* x: May be registered on ppc/powerpc for xmon */ NULL, /* x */ NULL, /* y */ - NULL /* z */ +#ifdef CONFIG_VSERVER_DEBUG + &sysrq_showvxinfo_op, /* z */ +#else + NULL, /* z */ +#endif }; /* key2index calculation, -1 on invalid index */ @@ -369,6 +389,8 @@ static int sysrq_key_table_key2index(int retval = key - '0'; else if ((key >= 'a') && (key <= 'z')) retval = key + 10 - 'a'; + else if ((key >= 'A') && (key <= 'Z')) + retval = key + 10 - 'A'; else retval = -1; return retval; diff -Nurp linux-2.6.22.18/drivers/char/tty_io.c linux-2.6.22.18-vs2.2.0.6/drivers/char/tty_io.c --- linux-2.6.22.18/drivers/char/tty_io.c 2007-07-21 23:59:53.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/drivers/char/tty_io.c 2008-02-11 12:35:33.000000000 +0100 @@ -103,6 +103,7 @@ #include #include +#include #undef TTY_DEBUG_HANGUP @@ -3049,13 +3050,15 @@ unlock: static int tiocgpgrp(struct tty_struct *tty, struct tty_struct *real_tty, pid_t __user *p) { + pid_t pgrp; /* * (tty == real_tty) is a cheap way of * testing if the tty is NOT a master pty. */ if (tty == real_tty && current->signal->tty != real_tty) return -ENOTTY; - return put_user(pid_nr(real_tty->pgrp), p); + pgrp = vx_map_pid(pid_nr(real_tty->pgrp)); + return put_user(pgrp, p); } /** @@ -3086,6 +3089,7 @@ static int tiocspgrp(struct tty_struct * return -ENOTTY; if (get_user(pgrp_nr, p)) return -EFAULT; + pgrp_nr = vx_rmap_pid(pgrp_nr); if (pgrp_nr < 0) return -EINVAL; rcu_read_lock(); diff -Nurp linux-2.6.22.18/drivers/infiniband/hw/ipath/ipath_user_pages.c linux-2.6.22.18-vs2.2.0.6/drivers/infiniband/hw/ipath/ipath_user_pages.c --- linux-2.6.22.18/drivers/infiniband/hw/ipath/ipath_user_pages.c 2007-05-04 15:58:07.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/drivers/infiniband/hw/ipath/ipath_user_pages.c 2008-02-11 12:35:33.000000000 +0100 @@ -33,6 +33,7 @@ #include #include +#include #include "ipath_kernel.h" @@ -61,7 +62,8 @@ static int __get_user_pages(unsigned lon lock_limit = current->signal->rlim[RLIMIT_MEMLOCK].rlim_cur >> PAGE_SHIFT; - if (num_pages > lock_limit) { + if (num_pages > lock_limit || + !vx_vmlocked_avail(current->mm, num_pages)) { ret = -ENOMEM; goto bail; } @@ -78,7 +80,7 @@ static int __get_user_pages(unsigned lon goto bail_release; } - current->mm->locked_vm += num_pages; + vx_vmlocked_add(current->mm, num_pages); ret = 0; goto bail; @@ -203,7 +205,7 @@ void ipath_release_user_pages(struct pag __ipath_release_user_pages(p, num_pages, 1); - current->mm->locked_vm -= num_pages; + vx_vmlocked_sub(current->mm, num_pages); up_write(¤t->mm->mmap_sem); } @@ -220,7 +222,7 @@ static void user_pages_account(struct wo container_of(_work, struct ipath_user_pages_work, work); down_write(&work->mm->mmap_sem); - work->mm->locked_vm -= work->num_pages; + vx_vmlocked_sub(work->mm, work->num_pages); up_write(&work->mm->mmap_sem); mmput(work->mm); kfree(work); diff -Nurp linux-2.6.22.18/drivers/md/dm.c linux-2.6.22.18-vs2.2.0.6/drivers/md/dm.c --- linux-2.6.22.18/drivers/md/dm.c 2007-08-12 03:54:36.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/drivers/md/dm.c 2008-02-11 12:35:33.000000000 +0100 @@ -21,6 +21,7 @@ #include #include #include +#include #define DM_MSG_PREFIX "core" @@ -77,6 +78,7 @@ struct mapped_device { rwlock_t map_lock; atomic_t holders; atomic_t open_count; + xid_t xid; unsigned long flags; @@ -223,6 +225,7 @@ static void __exit dm_exit(void) static int dm_blk_open(struct inode *inode, struct file *file) { struct mapped_device *md; + int ret = -ENXIO; spin_lock(&_minor_lock); @@ -231,18 +234,19 @@ static int dm_blk_open(struct inode *ino goto out; if (test_bit(DMF_FREEING, &md->flags) || - test_bit(DMF_DELETING, &md->flags)) { - md = NULL; + test_bit(DMF_DELETING, &md->flags)) + goto out; + + ret = -EACCES; + if (!vx_check(md->xid, VS_IDENT|VS_HOSTID)) goto out; - } dm_get(md); atomic_inc(&md->open_count); - + ret = 0; out: spin_unlock(&_minor_lock); - - return md ? 0 : -ENXIO; + return ret; } static int dm_blk_close(struct inode *inode, struct file *file) @@ -438,6 +442,14 @@ int dm_set_geometry(struct mapped_device return 0; } +/* + * Get the xid associated with a dm device + */ +xid_t dm_get_xid(struct mapped_device *md) +{ + return md->xid; +} + /*----------------------------------------------------------------- * CRUD START: * A more elegant soln is in the works that uses the queue @@ -1000,6 +1012,7 @@ static struct mapped_device *alloc_dev(i atomic_set(&md->holders, 1); atomic_set(&md->open_count, 0); atomic_set(&md->event_nr, 0); + md->xid = vx_current_xid(); md->queue = blk_alloc_queue(GFP_KERNEL); if (!md->queue) diff -Nurp linux-2.6.22.18/drivers/md/dm.h linux-2.6.22.18-vs2.2.0.6/drivers/md/dm.h --- linux-2.6.22.18/drivers/md/dm.h 2007-05-04 15:58:08.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/drivers/md/dm.h 2008-02-11 12:35:33.000000000 +0100 @@ -91,6 +91,8 @@ void dm_put_target_type(struct target_ty int dm_target_iterate(void (*iter_func)(struct target_type *tt, void *param), void *param); +xid_t dm_get_xid(struct mapped_device *md); + /*----------------------------------------------------------------- * Useful inlines. *---------------------------------------------------------------*/ diff -Nurp linux-2.6.22.18/drivers/md/dm-ioctl.c linux-2.6.22.18-vs2.2.0.6/drivers/md/dm-ioctl.c --- linux-2.6.22.18/drivers/md/dm-ioctl.c 2007-07-21 23:58:29.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/drivers/md/dm-ioctl.c 2008-02-11 12:35:33.000000000 +0100 @@ -15,6 +15,7 @@ #include #include #include +#include #include @@ -100,7 +101,8 @@ static struct hash_cell *__get_name_cell unsigned int h = hash_str(str); list_for_each_entry (hc, _name_buckets + h, name_list) - if (!strcmp(hc->name, str)) { + if (vx_check(dm_get_xid(hc->md), VS_WATCH_P | VS_IDENT) && + !strcmp(hc->name, str)) { dm_get(hc->md); return hc; } @@ -114,7 +116,8 @@ static struct hash_cell *__get_uuid_cell unsigned int h = hash_str(str); list_for_each_entry (hc, _uuid_buckets + h, uuid_list) - if (!strcmp(hc->uuid, str)) { + if (vx_check(dm_get_xid(hc->md), VS_WATCH_P | VS_IDENT) && + !strcmp(hc->uuid, str)) { dm_get(hc->md); return hc; } @@ -349,6 +352,9 @@ typedef int (*ioctl_fn)(struct dm_ioctl static int remove_all(struct dm_ioctl *param, size_t param_size) { + if (!vx_check(0, VS_ADMIN)) + return -EPERM; + dm_hash_remove_all(1); param->data_size = 0; return 0; @@ -396,6 +402,8 @@ static int list_devices(struct dm_ioctl */ for (i = 0; i < NUM_BUCKETS; i++) { list_for_each_entry (hc, _name_buckets + i, name_list) { + if (!vx_check(dm_get_xid(hc->md), VS_WATCH_P | VS_IDENT)) + continue; needed += sizeof(struct dm_name_list); needed += strlen(hc->name) + 1; needed += ALIGN_MASK; @@ -419,6 +427,8 @@ static int list_devices(struct dm_ioctl */ for (i = 0; i < NUM_BUCKETS; i++) { list_for_each_entry (hc, _name_buckets + i, name_list) { + if (!vx_check(dm_get_xid(hc->md), VS_WATCH_P | VS_IDENT)) + continue; if (old_nl) old_nl->next = (uint32_t) ((void *) nl - (void *) old_nl); @@ -609,10 +619,11 @@ static struct hash_cell *__find_device_h if (!md) goto out; - mdptr = dm_get_mdptr(md); + if (vx_check(dm_get_xid(md), VS_WATCH_P | VS_IDENT)) + mdptr = dm_get_mdptr(md); + if (!mdptr) dm_put(md); - out: return mdptr; } @@ -1409,8 +1420,8 @@ static int ctl_ioctl(struct inode *inode ioctl_fn fn = NULL; size_t param_size; - /* only root can play with this */ - if (!capable(CAP_SYS_ADMIN)) + /* only root and certain contexts can play with this */ + if (!vx_capable(CAP_SYS_ADMIN, VXC_ADMIN_MAPPER)) return -EACCES; if (_IOC_TYPE(command) != DM_IOCTL) diff -Nurp linux-2.6.22.18/fs/attr.c linux-2.6.22.18-vs2.2.0.6/fs/attr.c --- linux-2.6.22.18/fs/attr.c 2007-07-22 00:00:15.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/fs/attr.c 2008-02-11 12:35:33.000000000 +0100 @@ -14,6 +14,9 @@ #include #include #include +#include +#include +#include /* Taken over from the old code... */ @@ -55,6 +58,27 @@ int inode_change_ok(struct inode *inode, if (current->fsuid != inode->i_uid && !capable(CAP_FOWNER)) goto error; } + + /* Check for evil vserver activity */ + if (vx_check(0, VS_ADMIN)) + goto fine; + + if (IS_BARRIER(inode)) { + vxwprintk_task(1, "messing with the barrier."); + goto error; + } + switch (inode->i_sb->s_magic) { + case PROC_SUPER_MAGIC: + /* maybe allow that in the future? */ + vxwprintk_task(1, "messing with the procfs."); + goto error; + case DEVPTS_SUPER_MAGIC: + /* devpts is xid tagged */ + if (vx_check((xid_t)inode->i_tag, VS_IDENT)) + goto fine; + vxwprintk_task(1, "messing with the devpts."); + goto error; + } fine: retval = 0; error: @@ -78,6 +102,8 @@ int inode_setattr(struct inode * inode, inode->i_uid = attr->ia_uid; if (ia_valid & ATTR_GID) inode->i_gid = attr->ia_gid; + if ((ia_valid & ATTR_TAG) && IS_TAGGED(inode)) + inode->i_tag = attr->ia_tag; if (ia_valid & ATTR_ATIME) inode->i_atime = timespec_trunc(attr->ia_atime, inode->i_sb->s_time_gran); @@ -152,7 +178,8 @@ int notify_change(struct dentry * dentry error = security_inode_setattr(dentry, attr); if (!error) { if ((ia_valid & ATTR_UID && attr->ia_uid != inode->i_uid) || - (ia_valid & ATTR_GID && attr->ia_gid != inode->i_gid)) + (ia_valid & ATTR_GID && attr->ia_gid != inode->i_gid) || + (ia_valid & ATTR_TAG && attr->ia_tag != inode->i_tag)) error = DQUOT_TRANSFER(inode, attr) ? -EDQUOT : 0; if (!error) error = inode_setattr(inode, attr); diff -Nurp linux-2.6.22.18/fs/binfmt_aout.c linux-2.6.22.18-vs2.2.0.6/fs/binfmt_aout.c --- linux-2.6.22.18/fs/binfmt_aout.c 2007-05-04 15:58:21.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/fs/binfmt_aout.c 2008-02-11 12:35:33.000000000 +0100 @@ -24,6 +24,7 @@ #include #include #include +#include #include #include diff -Nurp linux-2.6.22.18/fs/binfmt_elf.c linux-2.6.22.18-vs2.2.0.6/fs/binfmt_elf.c --- linux-2.6.22.18/fs/binfmt_elf.c 2007-07-22 00:00:15.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/fs/binfmt_elf.c 2008-02-11 12:35:33.000000000 +0100 @@ -39,6 +39,7 @@ #include #include #include +#include #include #include #include diff -Nurp linux-2.6.22.18/fs/binfmt_flat.c linux-2.6.22.18-vs2.2.0.6/fs/binfmt_flat.c --- linux-2.6.22.18/fs/binfmt_flat.c 2007-07-22 00:00:15.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/fs/binfmt_flat.c 2008-02-11 12:35:33.000000000 +0100 @@ -36,6 +36,7 @@ #include #include #include +#include #include #include diff -Nurp linux-2.6.22.18/fs/binfmt_som.c linux-2.6.22.18-vs2.2.0.6/fs/binfmt_som.c --- linux-2.6.22.18/fs/binfmt_som.c 2007-05-04 15:57:29.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/fs/binfmt_som.c 2008-02-11 12:35:33.000000000 +0100 @@ -28,6 +28,7 @@ #include #include #include +#include #include #include diff -Nurp linux-2.6.22.18/fs/dcache.c linux-2.6.22.18-vs2.2.0.6/fs/dcache.c --- linux-2.6.22.18/fs/dcache.c 2007-07-22 00:00:15.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/fs/dcache.c 2008-02-11 12:35:33.000000000 +0100 @@ -31,6 +31,7 @@ #include #include #include +#include #include "internal.h" @@ -176,6 +177,7 @@ void dput(struct dentry *dentry) if (!dentry) return; + vx_dentry_dec(dentry); repeat: if (atomic_read(&dentry->d_count) == 1) might_sleep(); @@ -189,6 +191,8 @@ repeat: return; } + vx_dentry_dec(dentry); + /* * AV: ->d_delete() is _NOT_ allowed to block now. */ @@ -288,6 +292,7 @@ static inline struct dentry * __dget_loc if (!list_empty(&dentry->d_lru)) { dentry_stat.nr_unused--; list_del_init(&dentry->d_lru); + vx_dentry_inc(dentry); } return dentry; } @@ -898,6 +903,9 @@ struct dentry *d_alloc(struct dentry * p struct dentry *dentry; char *dname; + if (!vx_dentry_avail(1)) + return NULL; + dentry = kmem_cache_alloc(dentry_cache, GFP_KERNEL); if (!dentry) return NULL; @@ -946,6 +954,7 @@ struct dentry *d_alloc(struct dentry * p if (parent) list_add(&dentry->d_u.d_child, &parent->d_subdirs); dentry_stat.nr_dentry++; + vx_dentry_inc(dentry); spin_unlock(&dcache_lock); return dentry; @@ -1295,6 +1304,7 @@ struct dentry * __d_lookup(struct dentry if (!d_unhashed(dentry)) { atomic_inc(&dentry->d_count); + vx_dentry_inc(dentry); found = dentry; } spin_unlock(&dentry->d_lock); diff -Nurp linux-2.6.22.18/fs/devpts/inode.c linux-2.6.22.18-vs2.2.0.6/fs/devpts/inode.c --- linux-2.6.22.18/fs/devpts/inode.c 2007-07-22 00:00:15.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/fs/devpts/inode.c 2008-02-11 12:46:02.000000000 +0100 @@ -20,8 +20,22 @@ #include #include #include +#include -#define DEVPTS_SUPER_MAGIC 0x1cd1 + +static int devpts_permission(struct inode *inode, int mask, struct nameidata *nd) +{ + int ret = -EACCES; + + /* devpts is xid tagged */ + if (vx_check((xid_t)inode->i_tag, VS_WATCH_P | VS_IDENT)) + ret = generic_permission(inode, mask, NULL); + return ret; +} + +static struct inode_operations devpts_file_inode_operations = { + .permission = devpts_permission, +}; static struct vfsmount *devpts_mnt; static struct dentry *devpts_root; @@ -92,6 +106,25 @@ static int devpts_remount(struct super_b return 0; } +static int devpts_filter(struct dentry *de) +{ + /* devpts is xid tagged */ + return vx_check((xid_t)de->d_inode->i_tag, VS_WATCH_P | VS_IDENT); +} + +static int devpts_readdir(struct file * filp, void * dirent, filldir_t filldir) +{ + return dcache_readdir_filter(filp, dirent, filldir, devpts_filter); +} + +static struct file_operations devpts_dir_operations = { + .open = dcache_dir_open, + .release = dcache_dir_close, + .llseek = dcache_dir_lseek, + .read = generic_read_dir, + .readdir = devpts_readdir, +}; + static const struct super_operations devpts_sops = { .statfs = simple_statfs, .remount_fs = devpts_remount, @@ -117,8 +150,10 @@ devpts_fill_super(struct super_block *s, inode->i_uid = inode->i_gid = 0; inode->i_mode = S_IFDIR | S_IRUGO | S_IXUGO | S_IWUSR; inode->i_op = &simple_dir_inode_operations; - inode->i_fop = &simple_dir_operations; + inode->i_fop = &devpts_dir_operations; inode->i_nlink = 2; + /* devpts is xid tagged */ + inode->i_tag = (tag_t)vx_current_xid(); devpts_root = s->s_root = d_alloc_root(inode); if (s->s_root) @@ -176,6 +211,9 @@ int devpts_pty_new(struct tty_struct *tt inode->i_gid = config.setgid ? config.gid : current->fsgid; inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME; init_special_inode(inode, S_IFCHR|config.mode, device); + /* devpts is xid tagged */ + inode->i_tag = (tag_t)vx_current_xid(); + inode->i_op = &devpts_file_inode_operations; inode->i_private = tty; dentry = get_node(number); diff -Nurp linux-2.6.22.18/fs/ecryptfs/inode.c linux-2.6.22.18-vs2.2.0.6/fs/ecryptfs/inode.c --- linux-2.6.22.18/fs/ecryptfs/inode.c 2007-08-12 03:54:36.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/fs/ecryptfs/inode.c 2008-02-11 12:35:33.000000000 +0100 @@ -423,7 +423,7 @@ static int ecryptfs_link(struct dentry * dget(lower_new_dentry); lower_dir_dentry = lock_parent(lower_new_dentry); rc = vfs_link(lower_old_dentry, lower_dir_dentry->d_inode, - lower_new_dentry); + lower_new_dentry, NULL); if (rc || !lower_new_dentry->d_inode) goto out_lock; rc = ecryptfs_interpose(lower_new_dentry, new_dentry, dir->i_sb, 0); @@ -451,7 +451,7 @@ static int ecryptfs_unlink(struct inode struct inode *lower_dir_inode = ecryptfs_inode_to_lower(dir); lock_parent(lower_dentry); - rc = vfs_unlink(lower_dir_inode, lower_dentry); + rc = vfs_unlink(lower_dir_inode, lower_dentry, NULL); if (rc) { printk(KERN_ERR "Error in vfs_unlink; rc = [%d]\n", rc); goto out_unlock; @@ -488,7 +488,7 @@ static int ecryptfs_symlink(struct inode goto out_lock; } rc = vfs_symlink(lower_dir_dentry->d_inode, lower_dentry, - encoded_symname, mode); + encoded_symname, mode, NULL); kfree(encoded_symname); if (rc || !lower_dentry->d_inode) goto out_lock; @@ -513,7 +513,7 @@ static int ecryptfs_mkdir(struct inode * lower_dentry = ecryptfs_dentry_to_lower(dentry); lower_dir_dentry = lock_parent(lower_dentry); - rc = vfs_mkdir(lower_dir_dentry->d_inode, lower_dentry, mode); + rc = vfs_mkdir(lower_dir_dentry->d_inode, lower_dentry, mode, NULL); if (rc || !lower_dentry->d_inode) goto out; rc = ecryptfs_interpose(lower_dentry, dentry, dir->i_sb, 0); @@ -539,7 +539,7 @@ static int ecryptfs_rmdir(struct inode * dget(dentry); lower_dir_dentry = lock_parent(lower_dentry); dget(lower_dentry); - rc = vfs_rmdir(lower_dir_dentry->d_inode, lower_dentry); + rc = vfs_rmdir(lower_dir_dentry->d_inode, lower_dentry, NULL); dput(lower_dentry); if (!rc) d_delete(lower_dentry); @@ -561,7 +561,7 @@ ecryptfs_mknod(struct inode *dir, struct lower_dentry = ecryptfs_dentry_to_lower(dentry); lower_dir_dentry = lock_parent(lower_dentry); - rc = vfs_mknod(lower_dir_dentry->d_inode, lower_dentry, mode, dev); + rc = vfs_mknod(lower_dir_dentry->d_inode, lower_dentry, mode, dev, NULL); if (rc || !lower_dentry->d_inode) goto out; rc = ecryptfs_interpose(lower_dentry, dentry, dir->i_sb, 0); diff -Nurp linux-2.6.22.18/fs/exec.c linux-2.6.22.18-vs2.2.0.6/fs/exec.c --- linux-2.6.22.18/fs/exec.c 2008-02-11 12:34:20.000000000 +0100 +++ linux-2.6.22.18-vs2.2.0.6/fs/exec.c 2008-02-11 12:35:33.000000000 +0100 @@ -51,6 +51,7 @@ #include #include #include +#include #include #include @@ -440,7 +441,8 @@ int setup_arg_pages(struct linux_binprm kmem_cache_free(vm_area_cachep, mpnt); return ret; } - mm->stack_vm = mm->total_vm = vma_pages(mpnt); + vx_vmpages_sub(mm, mm->total_vm - vma_pages(mpnt)); + mm->stack_vm = mm->total_vm; } for (i = 0 ; i < MAX_ARG_PAGES ; i++) { @@ -1336,7 +1338,7 @@ static int format_corename(char *corenam /* UNIX time of coredump */ case 't': { struct timeval tv; - do_gettimeofday(&tv); + vx_gettimeofday(&tv); rc = snprintf(out_ptr, out_end - out_ptr, "%lu", tv.tv_sec); if (rc > out_end - out_ptr) diff -Nurp linux-2.6.22.18/fs/ext2/balloc.c linux-2.6.22.18-vs2.2.0.6/fs/ext2/balloc.c --- linux-2.6.22.18/fs/ext2/balloc.c 2007-07-21 23:58:45.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/fs/ext2/balloc.c 2008-02-11 12:35:33.000000000 +0100 @@ -16,6 +16,8 @@ #include #include #include +#include +#include /* * balloc.c contains the blocks allocation and deallocation routines @@ -102,12 +104,13 @@ static int reserve_blocks(struct super_b { struct ext2_sb_info *sbi = EXT2_SB(sb); struct ext2_super_block *es = sbi->s_es; - unsigned free_blocks; - unsigned root_blocks; + unsigned long long free_blocks, root_blocks; free_blocks = percpu_counter_read_positive(&sbi->s_freeblocks_counter); root_blocks = le32_to_cpu(es->s_r_blocks_count); + DLIMIT_ADJUST_BLOCK(sb, dx_current_tag(), &free_blocks, &root_blocks); + if (free_blocks < count) count = free_blocks; @@ -258,6 +261,7 @@ do_more: } error_return: brelse(bitmap_bh); + DLIMIT_FREE_BLOCK(inode, freed); release_blocks(sb, freed); DQUOT_FREE_BLOCK(inode, freed); } @@ -361,6 +365,10 @@ int ext2_new_block(struct inode *inode, *err = -ENOSPC; goto out_dquot; } + if (DLIMIT_ALLOC_BLOCK(inode, es_alloc)) { + *err = -ENOSPC; + goto out_dlimit; + } ext2_debug ("goal=%lu.\n", goal); @@ -508,6 +516,8 @@ got_block: *err = 0; out_release: group_release_blocks(sb, group_no, desc, gdp_bh, group_alloc); + DLIMIT_FREE_BLOCK(inode, es_alloc); +out_dlimit: release_blocks(sb, es_alloc); out_dquot: DQUOT_FREE_BLOCK(inode, dq_alloc); diff -Nurp linux-2.6.22.18/fs/ext2/ext2.h linux-2.6.22.18-vs2.2.0.6/fs/ext2/ext2.h --- linux-2.6.22.18/fs/ext2/ext2.h 2007-07-22 00:00:15.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/fs/ext2/ext2.h 2008-02-11 12:35:33.000000000 +0100 @@ -167,6 +167,7 @@ extern const struct file_operations ext2 extern const struct address_space_operations ext2_aops; extern const struct address_space_operations ext2_aops_xip; extern const struct address_space_operations ext2_nobh_aops; +extern int ext2_sync_flags(struct inode *inode); /* namei.c */ extern const struct inode_operations ext2_dir_inode_operations; diff -Nurp linux-2.6.22.18/fs/ext2/file.c linux-2.6.22.18-vs2.2.0.6/fs/ext2/file.c --- linux-2.6.22.18/fs/ext2/file.c 2007-07-21 23:58:45.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/fs/ext2/file.c 2008-02-11 12:35:33.000000000 +0100 @@ -85,4 +85,5 @@ const struct inode_operations ext2_file_ #endif .setattr = ext2_setattr, .permission = ext2_permission, + .sync_flags = ext2_sync_flags, }; diff -Nurp linux-2.6.22.18/fs/ext2/ialloc.c linux-2.6.22.18-vs2.2.0.6/fs/ext2/ialloc.c --- linux-2.6.22.18/fs/ext2/ialloc.c 2007-05-04 15:57:35.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/fs/ext2/ialloc.c 2008-02-11 12:35:33.000000000 +0100 @@ -17,6 +17,8 @@ #include #include #include +#include +#include #include "ext2.h" #include "xattr.h" #include "acl.h" @@ -125,6 +127,7 @@ void ext2_free_inode (struct inode * ino ext2_xattr_delete_inode(inode); DQUOT_FREE_INODE(inode); DQUOT_DROP(inode); + DLIMIT_FREE_INODE(inode); } es = EXT2_SB(sb)->s_es; @@ -464,6 +467,11 @@ struct inode *ext2_new_inode(struct inod if (!inode) return ERR_PTR(-ENOMEM); + inode->i_tag = dx_current_fstag(sb); + if (DLIMIT_ALLOC_INODE(inode)) { + err = -ENOSPC; + goto fail_dlim; + } ei = EXT2_I(inode); sbi = EXT2_SB(sb); es = sbi->s_es; @@ -577,7 +585,8 @@ got: inode->i_blocks = 0; inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME_SEC; memset(ei->i_data, 0, sizeof(ei->i_data)); - ei->i_flags = EXT2_I(dir)->i_flags & ~EXT2_BTREE_FL; + ei->i_flags = EXT2_I(dir)->i_flags & + ~(EXT2_BTREE_FL|EXT2_IUNLINK_FL|EXT2_BARRIER_FL); if (S_ISLNK(mode)) ei->i_flags &= ~(EXT2_IMMUTABLE_FL|EXT2_APPEND_FL); /* dirsync is only applied to directories */ @@ -625,12 +634,15 @@ fail_free_drop: fail_drop: DQUOT_DROP(inode); + DLIMIT_FREE_INODE(inode); inode->i_flags |= S_NOQUOTA; inode->i_nlink = 0; iput(inode); return ERR_PTR(err); fail: + DLIMIT_FREE_INODE(inode); +fail_dlim: make_bad_inode(inode); iput(inode); return ERR_PTR(err); diff -Nurp linux-2.6.22.18/fs/ext2/inode.c linux-2.6.22.18-vs2.2.0.6/fs/ext2/inode.c --- linux-2.6.22.18/fs/ext2/inode.c 2007-07-22 00:00:15.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/fs/ext2/inode.c 2008-02-11 12:35:33.000000000 +0100 @@ -31,6 +31,7 @@ #include #include #include +#include #include "ext2.h" #include "acl.h" #include "xip.h" @@ -913,7 +914,7 @@ void ext2_truncate (struct inode * inode return; if (ext2_inode_is_fast_symlink(inode)) return; - if (IS_APPEND(inode) || IS_IMMUTABLE(inode)) + if (IS_APPEND(inode) || IS_IXORUNLINK(inode)) return; ext2_discard_prealloc(inode); @@ -1042,13 +1043,20 @@ void ext2_set_inode_flags(struct inode * { unsigned int flags = EXT2_I(inode)->i_flags; - inode->i_flags &= ~(S_SYNC|S_APPEND|S_IMMUTABLE|S_NOATIME|S_DIRSYNC); + inode->i_flags &= ~(S_IMMUTABLE | S_IUNLINK | S_BARRIER | + S_SYNC | S_APPEND | S_NOATIME | S_DIRSYNC); + + if (flags & EXT2_IMMUTABLE_FL) + inode->i_flags |= S_IMMUTABLE; + if (flags & EXT2_IUNLINK_FL) + inode->i_flags |= S_IUNLINK; + if (flags & EXT2_BARRIER_FL) + inode->i_flags |= S_BARRIER; + if (flags & EXT2_SYNC_FL) inode->i_flags |= S_SYNC; if (flags & EXT2_APPEND_FL) inode->i_flags |= S_APPEND; - if (flags & EXT2_IMMUTABLE_FL) - inode->i_flags |= S_IMMUTABLE; if (flags & EXT2_NOATIME_FL) inode->i_flags |= S_NOATIME; if (flags & EXT2_DIRSYNC_FL) @@ -1074,12 +1082,37 @@ void ext2_get_inode_flags(struct ext2_in ei->i_flags |= EXT2_DIRSYNC_FL; } +int ext2_sync_flags(struct inode *inode) +{ + unsigned int oldflags, newflags; + + oldflags = EXT2_I(inode)->i_flags; + newflags = oldflags & ~(EXT2_IMMUTABLE_FL | + EXT2_IUNLINK_FL | EXT2_BARRIER_FL); + + if (IS_IMMUTABLE(inode)) + newflags |= EXT2_IMMUTABLE_FL; + if (IS_IUNLINK(inode)) + newflags |= EXT2_IUNLINK_FL; + if (IS_BARRIER(inode)) + newflags |= EXT2_BARRIER_FL; + + if (oldflags ^ newflags) { + EXT2_I(inode)->i_flags = newflags; + inode->i_ctime = CURRENT_TIME; + mark_inode_dirty(inode); + } + return 0; +} + void ext2_read_inode (struct inode * inode) { struct ext2_inode_info *ei = EXT2_I(inode); ino_t ino = inode->i_ino; struct buffer_head * bh; struct ext2_inode * raw_inode = ext2_get_inode(inode->i_sb, ino, &bh); + uid_t uid; + gid_t gid; int n; #ifdef CONFIG_EXT2_FS_POSIX_ACL @@ -1090,12 +1123,17 @@ void ext2_read_inode (struct inode * ino goto bad_inode; inode->i_mode = le16_to_cpu(raw_inode->i_mode); - inode->i_uid = (uid_t)le16_to_cpu(raw_inode->i_uid_low); - inode->i_gid = (gid_t)le16_to_cpu(raw_inode->i_gid_low); + uid = (uid_t)le16_to_cpu(raw_inode->i_uid_low); + gid = (gid_t)le16_to_cpu(raw_inode->i_gid_low); if (!(test_opt (inode->i_sb, NO_UID32))) { - inode->i_uid |= le16_to_cpu(raw_inode->i_uid_high) << 16; - inode->i_gid |= le16_to_cpu(raw_inode->i_gid_high) << 16; + uid |= le16_to_cpu(raw_inode->i_uid_high) << 16; + gid |= le16_to_cpu(raw_inode->i_gid_high) << 16; } + inode->i_uid = INOTAG_UID(DX_TAG(inode), uid, gid); + inode->i_gid = INOTAG_GID(DX_TAG(inode), uid, gid); + inode->i_tag = INOTAG_TAG(DX_TAG(inode), uid, gid, + le16_to_cpu(raw_inode->i_raw_tag)); + inode->i_nlink = le16_to_cpu(raw_inode->i_links_count); inode->i_size = le32_to_cpu(raw_inode->i_size); inode->i_atime.tv_sec = (signed)le32_to_cpu(raw_inode->i_atime); @@ -1192,8 +1230,8 @@ static int ext2_update_inode(struct inod struct ext2_inode_info *ei = EXT2_I(inode); struct super_block *sb = inode->i_sb; ino_t ino = inode->i_ino; - uid_t uid = inode->i_uid; - gid_t gid = inode->i_gid; + uid_t uid = TAGINO_UID(DX_TAG(inode), inode->i_uid, inode->i_tag); + gid_t gid = TAGINO_GID(DX_TAG(inode), inode->i_gid, inode->i_tag); struct buffer_head * bh; struct ext2_inode * raw_inode = ext2_get_inode(sb, ino, &bh); int n; @@ -1229,6 +1267,9 @@ static int ext2_update_inode(struct inod raw_inode->i_uid_high = 0; raw_inode->i_gid_high = 0; } +#ifdef CONFIG_TAGGING_INTERN + raw_inode->i_raw_tag = cpu_to_le16(inode->i_tag); +#endif raw_inode->i_links_count = cpu_to_le16(inode->i_nlink); raw_inode->i_size = cpu_to_le32(inode->i_size); raw_inode->i_atime = cpu_to_le32(inode->i_atime.tv_sec); @@ -1315,7 +1356,8 @@ int ext2_setattr(struct dentry *dentry, if (error) return error; if ((iattr->ia_valid & ATTR_UID && iattr->ia_uid != inode->i_uid) || - (iattr->ia_valid & ATTR_GID && iattr->ia_gid != inode->i_gid)) { + (iattr->ia_valid & ATTR_GID && iattr->ia_gid != inode->i_gid) || + (iattr->ia_valid & ATTR_TAG && iattr->ia_tag != inode->i_tag)) { error = DQUOT_TRANSFER(inode, iattr) ? -EDQUOT : 0; if (error) return error; diff -Nurp linux-2.6.22.18/fs/ext2/ioctl.c linux-2.6.22.18-vs2.2.0.6/fs/ext2/ioctl.c --- linux-2.6.22.18/fs/ext2/ioctl.c 2007-07-22 00:00:15.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/fs/ext2/ioctl.c 2008-02-11 12:35:33.000000000 +0100 @@ -13,6 +13,7 @@ #include #include #include +#include #include #include @@ -33,7 +34,8 @@ int ext2_ioctl (struct inode * inode, st case EXT2_IOC_SETFLAGS: { unsigned int oldflags; - if (IS_RDONLY(inode)) + if (IS_RDONLY(inode) || + (filp && MNT_IS_RDONLY(filp->f_vfsmnt))) return -EROFS; if ((current->fsuid != inode->i_uid) && !capable(CAP_FOWNER)) @@ -54,7 +56,9 @@ int ext2_ioctl (struct inode * inode, st * * This test looks nicer. Thanks to Pauline Middelink */ - if ((flags ^ oldflags) & (EXT2_APPEND_FL | EXT2_IMMUTABLE_FL)) { + if ((oldflags & EXT2_IMMUTABLE_FL) || + ((flags ^ oldflags) & (EXT2_APPEND_FL | + EXT2_IMMUTABLE_FL | EXT2_IUNLINK_FL))) { if (!capable(CAP_LINUX_IMMUTABLE)) { mutex_unlock(&inode->i_mutex); return -EPERM; @@ -76,7 +80,8 @@ int ext2_ioctl (struct inode * inode, st case EXT2_IOC_SETVERSION: if ((current->fsuid != inode->i_uid) && !capable(CAP_FOWNER)) return -EPERM; - if (IS_RDONLY(inode)) + if (IS_RDONLY(inode) || + (filp && MNT_IS_RDONLY(filp->f_vfsmnt))) return -EROFS; if (get_user(inode->i_generation, (int __user *) arg)) return -EFAULT; diff -Nurp linux-2.6.22.18/fs/ext2/namei.c linux-2.6.22.18-vs2.2.0.6/fs/ext2/namei.c --- linux-2.6.22.18/fs/ext2/namei.c 2007-07-21 23:58:45.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/fs/ext2/namei.c 2008-02-11 12:35:33.000000000 +0100 @@ -31,6 +31,7 @@ */ #include +#include #include "ext2.h" #include "xattr.h" #include "acl.h" @@ -66,6 +67,7 @@ static struct dentry *ext2_lookup(struct inode = iget(dir->i_sb, ino); if (!inode) return ERR_PTR(-EACCES); + dx_propagate_tag(nd, inode); } return d_splice_alias(inode, dentry); } @@ -391,6 +393,7 @@ const struct inode_operations ext2_dir_i #endif .setattr = ext2_setattr, .permission = ext2_permission, + .sync_flags = ext2_sync_flags, }; const struct inode_operations ext2_special_inode_operations = { @@ -402,4 +405,5 @@ const struct inode_operations ext2_speci #endif .setattr = ext2_setattr, .permission = ext2_permission, + .sync_flags = ext2_sync_flags, }; diff -Nurp linux-2.6.22.18/fs/ext2/super.c linux-2.6.22.18-vs2.2.0.6/fs/ext2/super.c --- linux-2.6.22.18/fs/ext2/super.c 2007-07-22 00:00:15.000000000 +0200 +++ linux-2.6.22.18-vs2.2.0.6/fs/ext2/super.c 2008-02-11 12:46:02.000000000 +0100 @@ -321,7 +321,7 @@ enum { Opt_err_ro, Opt_nouid32, Opt_nocheck, Opt_debug, Opt_oldalloc, Opt_orlov, Opt_nobh, Opt_user_xattr, Opt_nouser_xattr, Opt_acl, Opt_noacl, Opt_xip, Opt_ignore, Opt_err, Opt_quota, - Opt_usrquota, Opt_grpquota + Opt_usrquota, Opt_grpquota, Opt_tag, Opt_notag, Opt_tagid }; static match_table_t tokens = { @@ -349,6 +349,10 @@ static match_table_t tokens = { {Opt_acl, "acl"}, {Opt_noacl, "noacl"}, {Opt_xip, "xip"}, + {Opt_tag, "tag"}, + {Opt_notag, "notag"}, + {Opt_tagid, "tagid=%u"}, + {Opt_tag, "tagxid"}, {Opt_grpquota, "grpquota"}, {Opt_ignore, "noquota"}, {Opt_quota, "quota"}, @@ -417,6 +421,20 @@ static int parse_options (char * options case Opt_nouid32: set_opt (sbi->s_mount_opt, NO_UID32); break; +#ifndef CONFIG_TAGGING_NONE + case Opt_tag: + set_opt (sbi->s_mount_opt, TAGGED); + break; + case Opt_notag: + clear_opt (sbi->s_mount_opt, TAGGED); + break; +#endif +#ifdef CONFIG_PROPAGATE + case Opt_tagid: + /* use args[0] */ + set_opt (sbi->s_mount_opt, TAGGED); + break; +#endif case Opt_nocheck: clear_opt (sbi->s_mount_opt, CHECK); break; @@ -727,6 +745,8 @@ static int ext2