From a6d8dea2993ef90fb69b81372daa0b63f8aa940e Mon Sep 17 00:00:00 2001 From: Marc Fiuczynski Date: Mon, 8 Aug 2005 21:03:50 +0000 Subject: [PATCH] vserver 2.0-pre4 --- Makefile | 2 +- arch/i386/Kconfig | 8 + arch/i386/kernel/cpu/proc.c | 4 +- arch/i386/kernel/smpboot.c | 4 +- arch/ia64/ia32/ia32_entry.S | 2 +- arch/mips/kernel/scall32-o32.S | 2 +- arch/mips/kernel/scall64-64.S | 2 +- arch/mips/kernel/scall64-n32.S | 2 +- arch/mips/kernel/scall64-o32.S | 2 +- arch/ppc/boot/include/serial.h | 4 +- arch/ppc64/kernel/misc.S | 4 +- arch/s390/kernel/syscalls.S | 2 +- arch/sparc64/kernel/systbls.S | 2 +- arch/x86_64/ia32/ia32entry.S | 2 +- drivers/acpi/osl.c | 2 +- drivers/block/floppy.c | 2 +- drivers/char/cyclades.c | 2 +- drivers/char/dtlk.c | 4 +- drivers/char/isicom.c | 2 +- drivers/char/moxa.c | 2 +- drivers/char/mxser.c | 2 +- drivers/char/pcmcia/synclink_cs.c | 4 +- drivers/char/riscom8.h | 2 +- drivers/char/specialix_io8.h | 2 +- drivers/char/synclink.c | 4 +- drivers/char/synclinkmp.c | 4 +- drivers/macintosh/macserial.h | 10 +- drivers/net/wan/z85230.h | 2 +- drivers/sbus/char/aurora.h | 2 +- drivers/serial/68328serial.h | 10 +- drivers/serial/68360serial.c | 8 +- drivers/serial/crisv10.h | 4 +- drivers/serial/mcfserial.h | 4 +- drivers/tc/zs.h | 10 +- fs/inode.c | 2 + fs/nfsd/auth.c | 8 +- fs/nfsd/nfs3xdr.c | 6 +- fs/nfsd/nfsxdr.c | 6 +- fs/proc/base.c | 26 +- fs/quota.c | 4 - include/asm-i386/param.h | 8 +- include/linux/cyclades.h | 2 +- include/linux/dtlk.h | 2 +- include/linux/generic_serial.h | 2 +- include/linux/hayesesp.h | 4 +- include/linux/jiffies.h | 8 + include/linux/serial.h | 6 +- include/linux/serialP.h | 8 +- include/linux/sysctl.h | 4 + include/linux/vs_context.h | 6 + include/linux/vserver/context.h | 13 +- include/linux/vserver/cvirt.h | 4 + include/linux/vserver/dlimit.h | 36 +-- include/linux/vserver/inode_cmd.h | 18 ++ include/linux/vserver/legacy.h | 5 - include/linux/vserver/xid.h | 6 + include/net/irda/ircomm_tty.h | 4 +- include/net/route.h | 1 - include/net/tcp.h | 12 +- init/calibrate.c | 8 +- kernel/sysctl.c | 34 ++- kernel/timer.c | 8 + kernel/vserver/Kconfig | 12 +- kernel/vserver/Makefile | 3 +- kernel/vserver/context.c | 10 +- kernel/vserver/cvirt.c | 27 ++ kernel/vserver/dlimit.c | 258 +++++++++++++------ kernel/vserver/helper.c | 21 +- kernel/vserver/inode.c | 60 ++++- kernel/vserver/proc.c | 23 +- kernel/vserver/signal.c | 8 +- kernel/vserver/switch.c | 53 +++- net/core/sock.c | 1 + net/ipv4/netfilter/ip_conntrack_proto_sctp.c | 2 +- net/ipv4/netfilter/ip_conntrack_proto_tcp.c | 2 +- net/ipv4/tcp_minisocks.c | 1 + security/commoncap.c | 3 +- 77 files changed, 566 insertions(+), 293 deletions(-) diff --git a/Makefile b/Makefile index 728dadb12..b8e707f57 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ VERSION = 2 PATCHLEVEL = 6 SUBLEVEL = 11 -EXTRAVERSION = .7-vs2.0-pre1 +EXTRAVERSION = .7-vs2.0-pre4 NAME=Woozy Numbat # *DOCUMENTATION* diff --git a/arch/i386/Kconfig b/arch/i386/Kconfig index 5ed54abff..4f0ff1537 100644 --- a/arch/i386/Kconfig +++ b/arch/i386/Kconfig @@ -568,6 +568,14 @@ config X86_IO_APIC depends on !SMP && X86_UP_IOAPIC default y +config KERNEL_HZ + int "Timer Frequency (100-10000)" + range 100 10000 + default "1000" + help + This allows you to specify the frequency at which the + kernel timer interrupt will occur. + config X86_TSC bool depends on (MWINCHIP3D || MWINCHIP2 || MCRUSOE || MEFFICEON || MCYRIXIII || MK7 || MK6 || MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M686 || M586MMX || M586TSC || MK8 || MVIAC3_2) && !X86_NUMAQ diff --git a/arch/i386/kernel/cpu/proc.c b/arch/i386/kernel/cpu/proc.c index c8d83fdc2..0fd2a0a52 100644 --- a/arch/i386/kernel/cpu/proc.c +++ b/arch/i386/kernel/cpu/proc.c @@ -124,8 +124,8 @@ static int show_cpuinfo(struct seq_file *m, void *v) seq_printf(m, " %s", x86_cap_flags[i]); seq_printf(m, "\nbogomips\t: %lu.%02lu\n\n", - c->loops_per_jiffy/(500000/HZ), - (c->loops_per_jiffy/(5000/HZ)) % 100); + HZ*(c->loops_per_jiffy >> 3)/62500, + (HZ*(c->loops_per_jiffy >> 3)/625) % 100); return 0; } diff --git a/arch/i386/kernel/smpboot.c b/arch/i386/kernel/smpboot.c index e99992e27..4b120fcd1 100644 --- a/arch/i386/kernel/smpboot.c +++ b/arch/i386/kernel/smpboot.c @@ -1025,8 +1025,8 @@ static void __init smp_boot_cpus(unsigned int max_cpus) printk(KERN_INFO "Total of %d processors activated (%lu.%02lu BogoMIPS).\n", cpucount+1, - bogosum/(500000/HZ), - (bogosum/(5000/HZ))%100); + HZ*(bogosum >> 3)/62500, + (HZ*(bogosum >> 3)/625) % 100); Dprintk("Before bogocount - setting activated=1.\n"); diff --git a/arch/ia64/ia32/ia32_entry.S b/arch/ia64/ia32/ia32_entry.S index 1bb348d72..aa5178554 100644 --- a/arch/ia64/ia32/ia32_entry.S +++ b/arch/ia64/ia32/ia32_entry.S @@ -483,7 +483,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 --git a/arch/mips/kernel/scall32-o32.S b/arch/mips/kernel/scall32-o32.S index 344f2e29e..fc4481244 100644 --- a/arch/mips/kernel/scall32-o32.S +++ b/arch/mips/kernel/scall32-o32.S @@ -617,7 +617,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 4 sys sys_ni_syscall 0 /* available, was setaltroot */ sys sys_add_key 5 diff --git a/arch/mips/kernel/scall64-64.S b/arch/mips/kernel/scall64-64.S index 32efb8881..4e5002b41 100644 --- a/arch/mips/kernel/scall64-64.S +++ b/arch/mips/kernel/scall64-64.S @@ -443,7 +443,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 --git a/arch/mips/kernel/scall64-n32.S b/arch/mips/kernel/scall64-n32.S index e52049c87..f30a0c29d 100644 --- a/arch/mips/kernel/scall64-n32.S +++ b/arch/mips/kernel/scall64-n32.S @@ -357,7 +357,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 sys_waitid PTR sys_ni_syscall /* available, was setaltroot */ PTR sys_add_key diff --git a/arch/mips/kernel/scall64-o32.S b/arch/mips/kernel/scall64-o32.S index 739f3998d..a4c8078ef 100644 --- a/arch/mips/kernel/scall64-o32.S +++ b/arch/mips/kernel/scall64-o32.S @@ -479,7 +479,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 sys_waitid PTR sys_ni_syscall /* available, was setaltroot */ PTR sys_add_key /* 4280 */ diff --git a/arch/ppc/boot/include/serial.h b/arch/ppc/boot/include/serial.h index d710eabb4..5ea78b404 100644 --- a/arch/ppc/boot/include/serial.h +++ b/arch/ppc/boot/include/serial.h @@ -36,8 +36,8 @@ struct serial_state { int count; u8 *iomem_base; u16 iomem_reg_shift; - unsigned short close_delay; - unsigned short closing_wait; /* time to wait before closing */ + unsigned int close_delay; + unsigned int closing_wait; /* time to wait before closing */ unsigned long icount; int io_type; void *info; diff --git a/arch/ppc64/kernel/misc.S b/arch/ppc64/kernel/misc.S index edbd00aec..dc67e7742 100644 --- a/arch/ppc64/kernel/misc.S +++ b/arch/ppc64/kernel/misc.S @@ -924,7 +924,7 @@ _GLOBAL(sys_call_table32) .llong .ppc32_fadvise64_64 /* 32bit only fadvise64_64 */ .llong .ppc_rtas /* 255 */ .llong .sys_ni_syscall /* 256 reserved for sys_debug_setcontext */ - .llong .sys_vserver + .llong .sys32_vserver .llong .sys_ni_syscall /* 258 reserved for new sys_remap_file_pages */ .llong .compat_sys_mbind .llong .compat_sys_get_mempolicy /* 260 */ @@ -1199,7 +1199,7 @@ _GLOBAL(sys_call_table) .llong .sys_ni_syscall /* 32bit only fadvise64_64 */ .llong .ppc_rtas /* 255 */ .llong .sys_ni_syscall /* 256 reserved for sys_debug_setcontext */ - .llong .sys_ni_syscall /* 257 reserved for vserver */ + .llong .sys_vserver .llong .sys_ni_syscall /* 258 reserved for new sys_remap_file_pages */ .llong .sys_mbind .llong .sys_get_mempolicy /* 260 */ diff --git a/arch/s390/kernel/syscalls.S b/arch/s390/kernel/syscalls.S index e616c01b7..bdbcec4b9 100644 --- a/arch/s390/kernel/syscalls.S +++ b/arch/s390/kernel/syscalls.S @@ -271,7 +271,7 @@ SYSCALL(sys_clock_settime,sys_clock_settime,sys32_clock_settime_wrapper) 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) -SYSCALL(sys_vserver,sys_vserver,sys_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 --git a/arch/sparc64/kernel/systbls.S b/arch/sparc64/kernel/systbls.S index cf8301fed..1d25d7172 100644 --- a/arch/sparc64/kernel/systbls.S +++ b/arch/sparc64/kernel/systbls.S @@ -73,7 +73,7 @@ sys_call_table32: /*250*/ .word sys32_mremap, sys32_sysctl, sys32_getsid, sys_fdatasync, sys32_nfsservctl .word sys_ni_syscall, sys32_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, sys32_timer_create, sys_vserver, compat_sys_io_setup, sys_io_destroy + .word sys_timer_delete, sys32_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 sys_mq_timedsend, sys_mq_timedreceive, compat_sys_mq_notify, compat_sys_mq_getsetattr, compat_sys_waitid /*280*/ .word sys_ni_syscall, sys_add_key, sys_request_key, sys_keyctl diff --git a/arch/x86_64/ia32/ia32entry.S b/arch/x86_64/ia32/ia32entry.S index d4cfaba16..fc1f6ac14 100644 --- a/arch/x86_64/ia32/ia32entry.S +++ b/arch/x86_64/ia32/ia32entry.S @@ -579,7 +579,7 @@ ia32_sys_call_table: .quad sys_tgkill /* 270 */ .quad compat_sys_utimes .quad sys32_fadvise64_64 - .quad sys_vserver + .quad sys32_vserver .quad sys_mbind .quad compat_sys_get_mempolicy /* 275 */ .quad sys_set_mempolicy diff --git a/drivers/acpi/osl.c b/drivers/acpi/osl.c index 94a511315..96772a48b 100644 --- a/drivers/acpi/osl.c +++ b/drivers/acpi/osl.c @@ -938,7 +938,7 @@ acpi_os_wait_semaphore( // TODO: A better timeout algorithm? { int i = 0; - static const int quantum_ms = 1000/HZ; + static const int quantum_ms = (HZ>1000)?1:(1000/HZ); ret = down_trylock(sem); for (i = timeout; (i > 0 && ret < 0); i -= quantum_ms) { diff --git a/drivers/block/floppy.c b/drivers/block/floppy.c index bce3fc0e6..35db7f44a 100644 --- a/drivers/block/floppy.c +++ b/drivers/block/floppy.c @@ -4084,7 +4084,7 @@ static void __init daring(int *ints, int param, int param2) FD_SILENT_DCL_CLEAR; } else { default_drive_params[i].params.select_delay = - 2 * HZ / 100; + SEL_DLY; default_drive_params[i].params.flags &= ~FD_SILENT_DCL_CLEAR; } diff --git a/drivers/char/cyclades.c b/drivers/char/cyclades.c index 6a5337bf0..1cf94f142 100644 --- a/drivers/char/cyclades.c +++ b/drivers/char/cyclades.c @@ -4054,7 +4054,7 @@ cy_ioctl(struct tty_struct *tty, struct file * file, break; #endif /* CONFIG_CYZ_INTR */ case CYSETWAIT: - info->closing_wait = (unsigned short)arg * HZ/100; + info->closing_wait = (unsigned int)arg * HZ/100; ret_val = 0; break; case CYGETWAIT: diff --git a/drivers/char/dtlk.c b/drivers/char/dtlk.c index 903e4c3cc..85d2b4235 100644 --- a/drivers/char/dtlk.c +++ b/drivers/char/dtlk.c @@ -198,7 +198,7 @@ static ssize_t dtlk_write(struct file *file, const char __user *buf, up to 250 usec for the RDY bit to go nonzero. */ for (retries = 0; - retries < loops_per_jiffy / (4000/HZ); + retries < HZ*(loops_per_jiffy >> 3)/500; retries++) if (inb_p(dtlk_port_tts) & TTS_WRITABLE) @@ -445,7 +445,7 @@ for (i = 0; i < 10; i++) \ LOOK dtlk_write_bytes("\0012I\r", 4); buffer[b++] = 0; - __delay(50 * loops_per_jiffy / (1000/HZ)); + __delay(50 * (loops_per_jiffy >> 3) * HZ / 125); outb_p(0xff, dtlk_port_lpc); buffer[b++] = 0; LOOK diff --git a/drivers/char/isicom.c b/drivers/char/isicom.c index 2ccde4de3..c0fdd5074 100644 --- a/drivers/char/isicom.c +++ b/drivers/char/isicom.c @@ -197,7 +197,7 @@ struct isi_port { int close_delay; unsigned short channel; unsigned short status; - unsigned short closing_wait; + unsigned int closing_wait; struct isi_board * card; struct tty_struct * tty; wait_queue_head_t close_wait; diff --git a/drivers/char/moxa.c b/drivers/char/moxa.c index 10ba9bfb5..c5137c203 100644 --- a/drivers/char/moxa.c +++ b/drivers/char/moxa.c @@ -148,7 +148,7 @@ struct moxa_str { int type; int port; int close_delay; - unsigned short closing_wait; + unsigned int closing_wait; int count; int blocked_open; long event; /* long req'd for set_bit --RR */ diff --git a/drivers/char/mxser.c b/drivers/char/mxser.c index 367f12d6c..c288ef581 100644 --- a/drivers/char/mxser.c +++ b/drivers/char/mxser.c @@ -316,7 +316,7 @@ struct mxser_struct { int custom_divisor; int x_char; /* xon/xoff character */ int close_delay; - unsigned short closing_wait; + unsigned int closing_wait; int IER; /* Interrupt Enable Register */ int MCR; /* Modem control register */ unsigned long event; diff --git a/drivers/char/pcmcia/synclink_cs.c b/drivers/char/pcmcia/synclink_cs.c index 1c8d866a4..ce49fac61 100644 --- a/drivers/char/pcmcia/synclink_cs.c +++ b/drivers/char/pcmcia/synclink_cs.c @@ -146,8 +146,8 @@ typedef struct _mgslpc_info { int flags; int count; /* count of opens */ int line; - unsigned short close_delay; - unsigned short closing_wait; /* time to wait before closing */ + unsigned int close_delay; + unsigned int closing_wait; /* time to wait before closing */ struct mgsl_icount icount; diff --git a/drivers/char/riscom8.h b/drivers/char/riscom8.h index 6317aade2..220899778 100644 --- a/drivers/char/riscom8.h +++ b/drivers/char/riscom8.h @@ -85,7 +85,7 @@ struct riscom_port { struct work_struct tqueue_hangup; short wakeup_chars; short break_length; - unsigned short closing_wait; + unsigned int closing_wait; unsigned char mark_mask; unsigned char IER; unsigned char MSVR; diff --git a/drivers/char/specialix_io8.h b/drivers/char/specialix_io8.h index 948ab1489..77c3180f3 100644 --- a/drivers/char/specialix_io8.h +++ b/drivers/char/specialix_io8.h @@ -124,7 +124,7 @@ struct specialix_port { struct work_struct tqueue_hangup; short wakeup_chars; short break_length; - unsigned short closing_wait; + unsigned int closing_wait; unsigned char mark_mask; unsigned char IER; unsigned char MSVR; diff --git a/drivers/char/synclink.c b/drivers/char/synclink.c index 37c8bea8e..9341f3bcd 100644 --- a/drivers/char/synclink.c +++ b/drivers/char/synclink.c @@ -189,8 +189,8 @@ struct mgsl_struct { int count; /* count of opens */ int line; int hw_version; - unsigned short close_delay; - unsigned short closing_wait; /* time to wait before closing */ + unsigned int close_delay; + unsigned int closing_wait; /* time to wait before closing */ struct mgsl_icount icount; diff --git a/drivers/char/synclinkmp.c b/drivers/char/synclinkmp.c index dc0af4ea7..1d6c02342 100644 --- a/drivers/char/synclinkmp.c +++ b/drivers/char/synclinkmp.c @@ -157,8 +157,8 @@ typedef struct _synclinkmp_info { int flags; int count; /* count of opens */ int line; - unsigned short close_delay; - unsigned short closing_wait; /* time to wait before closing */ + unsigned int close_delay; + unsigned int closing_wait; /* time to wait before closing */ struct mgsl_icount icount; diff --git a/drivers/macintosh/macserial.h b/drivers/macintosh/macserial.h index bade11a7a..501fe11aa 100644 --- a/drivers/macintosh/macserial.h +++ b/drivers/macintosh/macserial.h @@ -22,11 +22,11 @@ struct serial_struct { int xmit_fifo_size; int custom_divisor; int baud_base; - unsigned short close_delay; + unsigned int close_delay; char reserved_char[2]; int hub6; - unsigned short closing_wait; /* time to wait before closing */ - unsigned short closing_wait2; /* no longer used... */ + unsigned int closing_wait; /* time to wait before closing */ + unsigned int closing_wait2; /* no longer used... */ int reserved[4]; }; @@ -149,8 +149,8 @@ struct mac_serial { int custom_divisor; int x_char; /* xon/xoff character */ int close_delay; - unsigned short closing_wait; - unsigned short closing_wait2; + unsigned int closing_wait; + unsigned int closing_wait2; unsigned long event; unsigned long last_active; int line; diff --git a/drivers/net/wan/z85230.h b/drivers/net/wan/z85230.h index 77e532080..6809facb5 100644 --- a/drivers/net/wan/z85230.h +++ b/drivers/net/wan/z85230.h @@ -348,7 +348,7 @@ struct z8530_channel int xmit_fifo_size; /* Transmit FIFO info */ int close_delay; /* Do we wait for drain on close ? */ - unsigned short closing_wait; + unsigned int closing_wait; /* We need to know the current clock divisor * to read the bps rate the chip has currently diff --git a/drivers/sbus/char/aurora.h b/drivers/sbus/char/aurora.h index b8b5476d9..b3df6b8e7 100644 --- a/drivers/sbus/char/aurora.h +++ b/drivers/sbus/char/aurora.h @@ -258,7 +258,7 @@ struct Aurora_port { struct tq_struct tqueue_hangup; short wakeup_chars; short break_length; - unsigned short closing_wait; + unsigned int closing_wait; unsigned char mark_mask; unsigned char SRER; unsigned char MSVR; diff --git a/drivers/serial/68328serial.h b/drivers/serial/68328serial.h index 978f8a609..d52a8e792 100644 --- a/drivers/serial/68328serial.h +++ b/drivers/serial/68328serial.h @@ -22,11 +22,11 @@ struct serial_struct { int xmit_fifo_size; int custom_divisor; int baud_base; - unsigned short close_delay; + unsigned int close_delay; char reserved_char[2]; int hub6; /* FIXME: We don't have AT&T Hub6 boards! */ - unsigned short closing_wait; /* time to wait before closing */ - unsigned short closing_wait2; /* no longer used... */ + unsigned int closing_wait; /* time to wait before closing */ + unsigned int closing_wait2; /* no longer used... */ int reserved[4]; }; @@ -148,8 +148,8 @@ struct m68k_serial { int custom_divisor; int x_char; /* xon/xoff character */ int close_delay; - unsigned short closing_wait; - unsigned short closing_wait2; + unsigned int closing_wait; + unsigned int closing_wait2; unsigned long event; unsigned long last_active; int line; diff --git a/drivers/serial/68360serial.c b/drivers/serial/68360serial.c index f148022b6..552929882 100644 --- a/drivers/serial/68360serial.c +++ b/drivers/serial/68360serial.c @@ -159,8 +159,8 @@ struct serial_state { int count; u8 *iomem_base; u16 iomem_reg_shift; - unsigned short close_delay; - unsigned short closing_wait; /* time to wait before closing */ + unsigned int close_delay; + unsigned int closing_wait; /* time to wait before closing */ struct async_icount_24 icount; int io_type; struct async_struct *info; @@ -244,8 +244,8 @@ typedef struct serial_info { int line; int x_char; /* xon/xoff character */ int close_delay; - unsigned short closing_wait; - unsigned short closing_wait2; + unsigned int closing_wait; + unsigned int closing_wait2; unsigned long event; unsigned long last_active; int blocked_open; /* # of blocked opens */ diff --git a/drivers/serial/crisv10.h b/drivers/serial/crisv10.h index 1800c0e75..b6bbf4bad 100644 --- a/drivers/serial/crisv10.h +++ b/drivers/serial/crisv10.h @@ -78,8 +78,8 @@ struct e100_serial { int ignore_status_mask; int x_char; /* xon/xoff character */ int close_delay; - unsigned short closing_wait; - unsigned short closing_wait2; + unsigned int closing_wait; + unsigned int closing_wait2; unsigned long event; unsigned long last_active; int line; diff --git a/drivers/serial/mcfserial.h b/drivers/serial/mcfserial.h index a2b28e862..dbd8eec7c 100644 --- a/drivers/serial/mcfserial.h +++ b/drivers/serial/mcfserial.h @@ -52,8 +52,8 @@ struct mcf_serial { int x_char; /* xon/xoff character */ int baud_base; int close_delay; - unsigned short closing_wait; - unsigned short closing_wait2; + unsigned int closing_wait; + unsigned int closing_wait2; unsigned long event; int line; int count; /* # of fd on device */ diff --git a/drivers/tc/zs.h b/drivers/tc/zs.h index c52edffa6..5c5a719b5 100644 --- a/drivers/tc/zs.h +++ b/drivers/tc/zs.h @@ -24,11 +24,11 @@ struct serial_struct { int xmit_fifo_size; int custom_divisor; int baud_base; - unsigned short close_delay; + unsigned int close_delay; char reserved_char[2]; int hub6; - unsigned short closing_wait; /* time to wait before closing */ - unsigned short closing_wait2; /* no longer used... */ + unsigned int closing_wait; /* time to wait before closing */ + unsigned int closing_wait2; /* no longer used... */ int reserved[4]; }; @@ -128,8 +128,8 @@ struct dec_serial { int custom_divisor; int x_char; /* XON/XOFF character. */ int close_delay; - unsigned short closing_wait; - unsigned short closing_wait2; + unsigned int closing_wait; + unsigned int closing_wait2; unsigned long event; unsigned long last_active; int line; diff --git a/fs/inode.c b/fs/inode.c index 747912802..6c213832c 100644 --- a/fs/inode.c +++ b/fs/inode.c @@ -236,6 +236,8 @@ void __iget(struct inode * inode) inodes_stat.nr_unused--; } +EXPORT_SYMBOL_GPL(__iget); + /** * clear_inode - clear an inode * @inode: inode to clear diff --git a/fs/nfsd/auth.c b/fs/nfsd/auth.c index 8637b5f85..672a9b1ee 100644 --- a/fs/nfsd/auth.c +++ b/fs/nfsd/auth.c @@ -43,20 +43,20 @@ int nfsd_setuser(struct svc_rqst *rqstp, struct svc_export *exp) } if (cred->cr_uid != (uid_t) -1) - current->fsuid = INOXID_UID(1, cred->cr_uid, cred->cr_gid); + current->fsuid = INOXID_UID(XID_TAG_NFSD, cred->cr_uid, cred->cr_gid); else current->fsuid = exp->ex_anon_uid; if (cred->cr_gid != (gid_t) -1) - current->fsgid = INOXID_GID(1, cred->cr_uid, cred->cr_gid); + current->fsgid = INOXID_GID(XID_TAG_NFSD, cred->cr_uid, cred->cr_gid); else current->fsgid = exp->ex_anon_gid; - current->xid = INOXID_XID(1, cred->cr_uid, cred->cr_gid, 0); + current->xid = INOXID_XID(XID_TAG_NFSD, cred->cr_uid, cred->cr_gid, 0); if (!cred->cr_group_info) return -ENOMEM; ret = set_current_groups(cred->cr_group_info); - if (INOXID_UID(1, cred->cr_uid, cred->cr_gid)) { + if (INOXID_UID(XID_TAG_NFSD, cred->cr_uid, cred->cr_gid)) { cap_t(current->cap_effective) &= ~CAP_NFSD_MASK; } else { cap_t(current->cap_effective) |= (CAP_NFSD_MASK & diff --git a/fs/nfsd/nfs3xdr.c b/fs/nfsd/nfs3xdr.c index 0c133b9e3..4580bce02 100644 --- a/fs/nfsd/nfs3xdr.c +++ b/fs/nfsd/nfs3xdr.c @@ -123,9 +123,9 @@ decode_sattr3(u32 *p, struct iattr *iap) iap->ia_valid |= ATTR_GID; gid = ntohl(*p++); } - iap->ia_uid = INOXID_UID(1, uid, gid); - iap->ia_gid = INOXID_GID(1, uid, gid); - iap->ia_xid = INOXID_XID(1, uid, gid, 0); + iap->ia_uid = INOXID_UID(XID_TAG_NFSD, uid, gid); + iap->ia_gid = INOXID_GID(XID_TAG_NFSD, uid, gid); + iap->ia_xid = INOXID_XID(XID_TAG_NFSD, uid, gid, 0); if (*p++) { u64 newsize; diff --git a/fs/nfsd/nfsxdr.c b/fs/nfsd/nfsxdr.c index 77b18baab..97c16bfc3 100644 --- a/fs/nfsd/nfsxdr.c +++ b/fs/nfsd/nfsxdr.c @@ -118,9 +118,9 @@ decode_sattr(u32 *p, struct iattr *iap) iap->ia_valid |= ATTR_GID; gid = tmp; } - iap->ia_uid = INOXID_UID(1, uid, gid); - iap->ia_gid = INOXID_GID(1, uid, gid); - iap->ia_xid = INOXID_XID(1, uid, gid, 0); + iap->ia_uid = INOXID_UID(XID_TAG_NFSD, uid, gid); + iap->ia_gid = INOXID_GID(XID_TAG_NFSD, uid, gid); + iap->ia_xid = INOXID_XID(XID_TAG_NFSD, uid, gid, 0); if ((tmp = ntohl(*p++)) != (u32)-1) { iap->ia_valid |= ATTR_SIZE; iap->ia_size = tmp; diff --git a/fs/proc/base.c b/fs/proc/base.c index 28e49e94a..9d7ba30b8 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c @@ -1702,6 +1702,20 @@ void proc_pid_flush(struct dentry *proc_dentry) } } +#define VXF_FAKE_INIT (VXF_INFO_INIT|VXF_STATE_INIT) + +static inline int proc_pid_visible(struct task_struct *task, int pid) +{ + if ((pid == 1) && + !vx_flags(VXF_FAKE_INIT, VXF_FAKE_INIT)) + goto visible; + if (vx_check(vx_task_xid(task), VX_WATCH|VX_IDENT)) + goto visible; + return 0; +visible: + return 1; +} + /* SMP-safe */ struct dentry *proc_pid_lookup(struct inode *dir, struct dentry * dentry, struct nameidata *nd) { @@ -1738,7 +1752,8 @@ struct dentry *proc_pid_lookup(struct inode *dir, struct dentry * dentry, struct if (!task) goto out; - if (!vx_check(vx_task_xid(task), VX_WATCH|VX_IDENT)) + /* check for context visibility */ + if (!proc_pid_visible(task, tgid)) goto out_drop_task; inode = proc_pid_make_inode(dir->i_sb, task, PROC_TGID_INO); @@ -1799,7 +1814,8 @@ static struct dentry *proc_task_lookup(struct inode *dir, struct dentry * dentry if (leader->tgid != task->tgid) goto out_drop_task; - if (!vx_check(vx_task_xid(task), VX_WATCH|VX_IDENT)) + /* check for context visibility */ + if (!proc_pid_visible(task, tid)) goto out_drop_task; inode = proc_pid_make_inode(dir->i_sb, task, PROC_TID_INO); @@ -1856,7 +1872,8 @@ static int get_tgid_list(int index, unsigned long version, unsigned int *tgids) if (!pid_alive(p)) continue; - if (!vx_check(vx_task_xid(p), VX_WATCH|VX_IDENT)) + /* check for context visibility */ + if (!proc_pid_visible(p, tgid)) continue; if (--index >= 0) continue; @@ -1890,7 +1907,8 @@ static int get_tid_list(int index, unsigned int *tids, struct inode *dir) if (pid_alive(task)) do { int tid = task->pid; - if (!vx_check(vx_task_xid(task), VX_WATCH|VX_IDENT)) + /* check for context visibility */ + if (!proc_pid_visible(task, tid)) continue; if (--index >= 0) continue; diff --git a/fs/quota.c b/fs/quota.c index 83cd51368..ffb35ef75 100644 --- a/fs/quota.c +++ b/fs/quota.c @@ -330,10 +330,6 @@ asmlinkage long sys_quotactl(unsigned int cmd, const char __user *special, qid_t if (IS_ERR(bdev)) return PTR_ERR(bdev); #ifdef CONFIG_BLK_DEV_VROOT - printk(KERN_INFO "bdev=%p, gendisk=%p inode=%p[%d,%d]\n", - bdev, bdev?bdev->bd_disk:0, bdev->bd_inode, - imajor(bdev->bd_inode), iminor(bdev->bd_inode)); - if (bdev && bdev->bd_inode && imajor(bdev->bd_inode) == VROOT_MAJOR) { struct block_device *bdnew = diff --git a/include/asm-i386/param.h b/include/asm-i386/param.h index b6440526e..f53d78180 100644 --- a/include/asm-i386/param.h +++ b/include/asm-i386/param.h @@ -1,8 +1,14 @@ #ifndef _ASMi386_PARAM_H #define _ASMi386_PARAM_H +#include + #ifdef __KERNEL__ -# define HZ 1000 /* Internal kernel timer frequency */ +# ifdef CONFIG_KERNEL_HZ +# define HZ CONFIG_KERNEL_HZ +# else +# define HZ 1000 /* Internal kernel timer frequency */ +# endif # define USER_HZ 100 /* .. some user interfaces are in "ticks" */ # define CLOCKS_PER_SEC (USER_HZ) /* like times() */ #endif diff --git a/include/linux/cyclades.h b/include/linux/cyclades.h index 46d8254c1..d87bce0af 100644 --- a/include/linux/cyclades.h +++ b/include/linux/cyclades.h @@ -585,7 +585,7 @@ struct cyclades_port { int custom_divisor; int x_char; /* to be pushed out ASAP */ int close_delay; - unsigned short closing_wait; + unsigned int closing_wait; unsigned long event; unsigned long last_active; int count; /* # of fd on device */ diff --git a/include/linux/dtlk.h b/include/linux/dtlk.h index 2896d9011..0c26359fc 100644 --- a/include/linux/dtlk.h +++ b/include/linux/dtlk.h @@ -27,7 +27,7 @@ #define DTLK_CLEAR 0x18 /* stops speech */ -#define DTLK_MAX_RETRIES (loops_per_jiffy/(10000/HZ)) +#define DTLK_MAX_RETRIES (HZ*(loops_per_jiffy >> 3)/1250) /* TTS Port Status Flags */ #define TTS_READABLE 0x80 /* mask for bit which is nonzero if a diff --git a/include/linux/generic_serial.h b/include/linux/generic_serial.h index 09d204709..629e76236 100644 --- a/include/linux/generic_serial.h +++ b/include/linux/generic_serial.h @@ -42,7 +42,7 @@ struct gs_port { int blocked_open; struct tty_struct *tty; unsigned long event; - unsigned short closing_wait; + unsigned int closing_wait; int close_delay; struct real_driver *rd; int wakeup_chars; diff --git a/include/linux/hayesesp.h b/include/linux/hayesesp.h index 131d71116..0f429be2e 100644 --- a/include/linux/hayesesp.h +++ b/include/linux/hayesesp.h @@ -87,8 +87,8 @@ struct esp_struct { int stat_flags; int custom_divisor; int close_delay; - unsigned short closing_wait; - unsigned short closing_wait2; + unsigned int closing_wait; + unsigned int closing_wait2; int IER; /* Interrupt Enable Register */ int MCR; /* Modem control register */ unsigned long event; diff --git a/include/linux/jiffies.h b/include/linux/jiffies.h index d7a2555a8..08dc59f47 100644 --- a/include/linux/jiffies.h +++ b/include/linux/jiffies.h @@ -38,6 +38,14 @@ # define SHIFT_HZ 9 #elif HZ >= 768 && HZ < 1536 # define SHIFT_HZ 10 +#elif HZ >= 1536 && HZ < 3072 +# define SHIFT_HZ 11 +#elif HZ >= 3072 && HZ < 6144 +# define SHIFT_HZ 12 +#elif HZ >= 6144 && HZ < 12288 +# define SHIFT_HZ 13 +#elif HZ >= 12288 && HZ < 24576 +# define SHIFT_HZ 14 #else # error You lose. #endif diff --git a/include/linux/serial.h b/include/linux/serial.h index 00145822f..a1ef6a64d 100644 --- a/include/linux/serial.h +++ b/include/linux/serial.h @@ -39,12 +39,12 @@ struct serial_struct { int xmit_fifo_size; int custom_divisor; int baud_base; - unsigned short close_delay; + unsigned int close_delay; char io_type; char reserved_char[1]; int hub6; - unsigned short closing_wait; /* time to wait before closing */ - unsigned short closing_wait2; /* no longer used... */ + unsigned int closing_wait; /* time to wait before closing */ + unsigned int closing_wait2; /* no longer used... */ unsigned char *iomem_base; unsigned short iomem_reg_shift; unsigned int port_high; diff --git a/include/linux/serialP.h b/include/linux/serialP.h index 2307f11d8..042d92aee 100644 --- a/include/linux/serialP.h +++ b/include/linux/serialP.h @@ -42,8 +42,8 @@ struct serial_state { int count; u8 *iomem_base; u16 iomem_reg_shift; - unsigned short close_delay; - unsigned short closing_wait; /* time to wait before closing */ + unsigned int close_delay; + unsigned int closing_wait; /* time to wait before closing */ struct async_icount icount; int io_type; struct async_struct *info; @@ -64,8 +64,8 @@ struct async_struct { int quot; int x_char; /* xon/xoff character */ int close_delay; - unsigned short closing_wait; - unsigned short closing_wait2; /* obsolete */ + unsigned int closing_wait; + unsigned int closing_wait2; /* obsolete */ int IER; /* Interrupt Enable Register */ int MCR; /* Modem control register */ int LCR; /* Line control register */ diff --git a/include/linux/sysctl.h b/include/linux/sysctl.h index 7db3d5dda..b0fd3cf0e 100644 --- a/include/linux/sysctl.h +++ b/include/linux/sysctl.h @@ -786,6 +786,9 @@ typedef int ctl_handler (ctl_table *table, int __user *name, int nlen, typedef int proc_handler (ctl_table *ctl, int write, struct file * filp, void __user *buffer, size_t *lenp, loff_t *ppos); +typedef int virt_handler (struct ctl_table *ctl, int write, xid_t xid, + void **datap, size_t *lenp); + extern int proc_dostring(ctl_table *, int, struct file *, void __user *, size_t *, loff_t *); extern int proc_dointvec(ctl_table *, int, struct file *, @@ -867,6 +870,7 @@ struct ctl_table mode_t mode; ctl_table *child; proc_handler *proc_handler; /* Callback for text formatting */ + virt_handler *virt_handler; /* Context virtualization */ ctl_handler *strategy; /* Callback function for all r/w */ struct proc_dir_entry *de; /* /proc control block */ void *extra1; diff --git a/include/linux/vs_context.h b/include/linux/vs_context.h index ab0e56ee9..bc8e9b498 100644 --- a/include/linux/vs_context.h +++ b/include/linux/vs_context.h @@ -160,6 +160,12 @@ static __inline__ struct vx_info *__task_get_vx_info(struct task_struct *p, } +static inline void __wakeup_vx_info(struct vx_info *vxi) +{ + if (waitqueue_active(&vxi->vx_wait)) + wake_up_interruptible(&vxi->vx_wait); +} + #else #warning duplicate inclusion #endif diff --git a/include/linux/vserver/context.h b/include/linux/vserver/context.h index eae7ec4b9..a5a77e0c9 100644 --- a/include/linux/vserver/context.h +++ b/include/linux/vserver/context.h @@ -52,6 +52,7 @@ #define VXC_SET_RLIMIT 0x00000002 #define VXC_RAW_ICMP 0x00000100 +#define VXC_SYSLOG 0x00001000 #define VXC_SECURE_MOUNT 0x00010000 #define VXC_SECURE_REMOUNT 0x00020000 @@ -60,10 +61,12 @@ #define VXC_QUOTA_CTL 0x00100000 -/* vshelper sync commands */ +/* context state changes */ -#define VS_CONTEXT_CREATED 1 -#define VS_CONTEXT_DESTROY 2 +enum { + VSC_STARTUP = 1, + VSC_SHUTDOWN, +}; #ifdef __KERNEL__ @@ -94,7 +97,7 @@ struct vx_info { pid_t vx_initpid; /* PID of fake init process */ spinlock_t vx_lock; - wait_queue_head_t vx_exit; /* context exit waitqueue */ + wait_queue_head_t vx_wait; /* context exit waitqueue */ struct _vx_limit limit; /* vserver limits */ struct _vx_sched sched; /* vserver scheduler */ @@ -145,7 +148,7 @@ extern int xid_is_hashed(xid_t); extern int vx_migrate_task(struct task_struct *, struct vx_info *); -extern long vs_context_state(struct vx_info *, unsigned int); +extern long vs_state_change(struct vx_info *, unsigned int); extern void free_vx_info(struct vx_info *); diff --git a/include/linux/vserver/cvirt.h b/include/linux/vserver/cvirt.h index a3cadfdf3..eb138787f 100644 --- a/include/linux/vserver/cvirt.h +++ b/include/linux/vserver/cvirt.h @@ -13,6 +13,10 @@ struct vx_info; void vx_update_load(struct vx_info *); +int vx_uts_virt_handler(struct ctl_table *ctl, int write, xid_t xid, + void **datap, size_t *lenp); + + int vx_do_syslog(int, char __user *, int); #endif /* __KERNEL__ */ diff --git a/include/linux/vserver/dlimit.h b/include/linux/vserver/dlimit.h index 0c6587eb4..99c224025 100644 --- a/include/linux/vserver/dlimit.h +++ b/include/linux/vserver/dlimit.h @@ -2,31 +2,6 @@ #define _VX_DLIMIT_H #include "switch.h" -#include - -/* inode vserver commands */ - -#define VCMD_add_dlimit VC_CMD(DLIMIT, 1, 0) -#define VCMD_rem_dlimit VC_CMD(DLIMIT, 2, 0) - -#define VCMD_set_dlimit VC_CMD(DLIMIT, 5, 0) -#define VCMD_get_dlimit VC_CMD(DLIMIT, 6, 0) - - -struct vcmd_ctx_dlimit_base_v0 { - const char __user *name; - uint32_t flags; -}; - -struct vcmd_ctx_dlimit_v0 { - const char __user *name; - uint32_t space_used; /* used space in kbytes */ - uint32_t space_total; /* maximum space in kbytes */ - uint32_t inodes_used; /* used inodes */ - uint32_t inodes_total; /* maximum inodes */ - uint32_t reserved; /* reserved for root in % */ - uint32_t flags; -}; #define CDLIM_UNSET (0ULL) #define CDLIM_INFINITY (~0ULL) @@ -35,6 +10,8 @@ struct vcmd_ctx_dlimit_v0 { #ifdef __KERNEL__ +#include + struct super_block; struct dl_info { @@ -46,7 +23,6 @@ struct dl_info { struct super_block *dl_sb; /* associated superblock */ -// struct rw_semaphore dl_sem; /* protect the values */ spinlock_t dl_lock; /* protect the values */ uint64_t dl_space_used; /* used space in bytes */ @@ -69,14 +45,6 @@ struct kstatfs; extern void vx_vsi_statfs(struct super_block *, struct kstatfs *); - -extern int vc_add_dlimit(uint32_t, void __user *); -extern int vc_rem_dlimit(uint32_t, void __user *); - -extern int vc_set_dlimit(uint32_t, void __user *); -extern int vc_get_dlimit(uint32_t, void __user *); - - typedef uint64_t dlsize_t; #endif /* __KERNEL__ */ diff --git a/include/linux/vserver/inode_cmd.h b/include/linux/vserver/inode_cmd.h index 2b6afeac4..f14c899ff 100644 --- a/include/linux/vserver/inode_cmd.h +++ b/include/linux/vserver/inode_cmd.h @@ -27,6 +27,17 @@ struct vcmd_ctx_iattr_v1 { #ifdef __KERNEL__ +#ifdef CONFIG_COMPAT + +struct vcmd_ctx_iattr_v1_x32 { + compat_uptr_t name_ptr; + uint32_t xid; + uint32_t flags; + uint32_t mask; +}; + +#endif /* CONFIG_COMPAT */ + #include extern int vc_get_iattr_v0(uint32_t, void __user *); @@ -35,5 +46,12 @@ extern int vc_set_iattr_v0(uint32_t, void __user *); extern int vc_get_iattr(uint32_t, void __user *); extern int vc_set_iattr(uint32_t, void __user *); +#ifdef CONFIG_COMPAT + +extern int vc_get_iattr_x32(uint32_t, void __user *); +extern int vc_set_iattr_x32(uint32_t, void __user *); + +#endif /* CONFIG_COMPAT */ + #endif /* __KERNEL__ */ #endif /* _VX_INODE_CMD_H */ diff --git a/include/linux/vserver/legacy.h b/include/linux/vserver/legacy.h index d5b8a3f21..f058983fa 100644 --- a/include/linux/vserver/legacy.h +++ b/include/linux/vserver/legacy.h @@ -40,11 +40,6 @@ struct vcmd_set_ipv4root_v3 { #define VX_INFO_NAMESPACE 128 /* save private namespace */ -#define NB_S_CONTEXT 16 - -#define NB_IPV4ROOT 16 - - #ifdef __KERNEL__ extern int vc_new_s_context(uint32_t, void __user *); extern int vc_set_ipv4root(uint32_t, void __user *); diff --git a/include/linux/vserver/xid.h b/include/linux/vserver/xid.h index 5d1c6c133..c1994c005 100644 --- a/include/linux/vserver/xid.h +++ b/include/linux/vserver/xid.h @@ -9,6 +9,12 @@ (((struct inode *)in)->i_sb && \ (((struct inode *)in)->i_sb->s_flags & MS_TAGXID))) +#ifdef CONFIG_XID_TAG_NFSD +#define XID_TAG_NFSD 1 +#else +#define XID_TAG_NFSD 0 +#endif + #ifdef CONFIG_INOXID_NONE diff --git a/include/net/irda/ircomm_tty.h b/include/net/irda/ircomm_tty.h index 87699cb4e..faa66af84 100644 --- a/include/net/irda/ircomm_tty.h +++ b/include/net/irda/ircomm_tty.h @@ -102,8 +102,8 @@ struct ircomm_tty_cb { struct timer_list watchdog_timer; struct work_struct tqueue; - unsigned short close_delay; - unsigned short closing_wait; /* time to wait before closing */ + unsigned int close_delay; + unsigned int closing_wait; /* time to wait before closing */ int open_count; int blocked_open; /* # of blocked opens */ diff --git a/include/net/route.h b/include/net/route.h index 189c100b2..93b1966d2 100644 --- a/include/net/route.h +++ b/include/net/route.h @@ -33,7 +33,6 @@ #include #include #include -#include #include #ifndef __KERNEL__ diff --git a/include/net/tcp.h b/include/net/tcp.h index b87b78e0a..161dfebfb 100644 --- a/include/net/tcp.h +++ b/include/net/tcp.h @@ -489,8 +489,8 @@ static __inline__ int tcp_sk_listen_hashfn(struct sock *sk) so that we select tick to get range about 4 seconds. */ -#if HZ <= 16 || HZ > 4096 -# error Unsupported: HZ <= 16 or HZ > 4096 +#if HZ <= 16 || HZ > 32768 +# error Unsupported: HZ <= 16 or HZ > 32768 #elif HZ <= 32 # define TCP_TW_RECYCLE_TICK (5+2-TCP_TW_RECYCLE_SLOTS_LOG) #elif HZ <= 64 @@ -505,8 +505,14 @@ static __inline__ int tcp_sk_listen_hashfn(struct sock *sk) # define TCP_TW_RECYCLE_TICK (10+2-TCP_TW_RECYCLE_SLOTS_LOG) #elif HZ <= 2048 # define TCP_TW_RECYCLE_TICK (11+2-TCP_TW_RECYCLE_SLOTS_LOG) -#else +#elif HZ <= 4096 # define TCP_TW_RECYCLE_TICK (12+2-TCP_TW_RECYCLE_SLOTS_LOG) +#elif HZ <= 8192 +# define TCP_TW_RECYCLE_TICK (13+2-TCP_TW_RECYCLE_SLOTS_LOG) +#elif HZ <= 16384 +# define TCP_TW_RECYCLE_TICK (14+2-TCP_TW_RECYCLE_SLOTS_LOG) +#else +# define TCP_TW_RECYCLE_TICK (15+2-TCP_TW_RECYCLE_SLOTS_LOG) #endif #define BICTCP_BETA_SCALE 1024 /* Scale factor beta calculation diff --git a/init/calibrate.c b/init/calibrate.c index c698e04a3..4841f3e16 100644 --- a/init/calibrate.c +++ b/init/calibrate.c @@ -33,8 +33,8 @@ void __devinit calibrate_delay(void) loops_per_jiffy = preset_lpj; printk("Calibrating delay loop (skipped)... " "%lu.%02lu BogoMIPS preset\n", - loops_per_jiffy/(500000/HZ), - (loops_per_jiffy/(5000/HZ)) % 100); + HZ*(loops_per_jiffy >> 3)/62500, + (HZ*(loops_per_jiffy >> 3)/625) % 100); } else { loops_per_jiffy = (1<<12); @@ -71,8 +71,8 @@ void __devinit calibrate_delay(void) /* Round the value and print it */ printk("%lu.%02lu BogoMIPS (lpj=%lu)\n", - loops_per_jiffy/(500000/HZ), - (loops_per_jiffy/(5000/HZ)) % 100, + HZ*(loops_per_jiffy >> 3)/62500, + (HZ*(loops_per_jiffy >> 3)/625) % 100, loops_per_jiffy); } diff --git a/kernel/sysctl.c b/kernel/sysctl.c index 28103626a..8f87d9924 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c @@ -41,6 +41,7 @@ #include #include #include +#include #include #include @@ -227,6 +228,7 @@ static ctl_table kern_table[] = { .maxlen = sizeof(system_utsname.sysname), .mode = 0444, .proc_handler = &proc_doutsstring, + .virt_handler = &vx_uts_virt_handler, .strategy = &sysctl_string, }, { @@ -236,6 +238,7 @@ static ctl_table kern_table[] = { .maxlen = sizeof(system_utsname.release), .mode = 0444, .proc_handler = &proc_doutsstring, + .virt_handler = &vx_uts_virt_handler, .strategy = &sysctl_string, }, { @@ -245,6 +248,7 @@ static ctl_table kern_table[] = { .maxlen = sizeof(system_utsname.version), .mode = 0444, .proc_handler = &proc_doutsstring, + .virt_handler = &vx_uts_virt_handler, .strategy = &sysctl_string, }, { @@ -254,6 +258,7 @@ static ctl_table kern_table[] = { .maxlen = sizeof(system_utsname.nodename), .mode = 0644, .proc_handler = &proc_doutsstring, + .virt_handler = &vx_uts_virt_handler, .strategy = &sysctl_string, }, { @@ -263,6 +268,7 @@ static ctl_table kern_table[] = { .maxlen = sizeof(system_utsname.domainname), .mode = 0644, .proc_handler = &proc_doutsstring, + .virt_handler = &vx_uts_virt_handler, .strategy = &sysctl_string, }, { @@ -1389,16 +1395,22 @@ static ssize_t proc_writesys(struct file * file, const char __user * buf, int proc_dostring(ctl_table *table, int write, struct file *filp, void __user *buffer, size_t *lenp, loff_t *ppos) { - size_t len; + size_t len, maxlen; char __user *p; char c; - + void *data; + + data = table->data; + maxlen = table->maxlen; + if (table->virt_handler) + table->virt_handler(table, write, filp->f_xid, &data, &maxlen); + if (!table->data || !table->maxlen || !*lenp || (*ppos && !write)) { *lenp = 0; return 0; } - + if (write) { len = 0; p = buffer; @@ -1409,20 +1421,20 @@ int proc_dostring(ctl_table *table, int write, struct file *filp, break; len++; } - if (len >= table->maxlen) - len = table->maxlen-1; - if(copy_from_user(table->data, buffer, len)) + if (len >= maxlen) + len = maxlen-1; + if(copy_from_user(data, buffer, len)) return -EFAULT; - ((char *) table->data)[len] = 0; + ((char *) data)[len] = 0; *ppos += *lenp; } else { - len = strlen(table->data); - if (len > table->maxlen) - len = table->maxlen; + len = strlen(data); + if (len > maxlen) + len = maxlen; if (len > *lenp) len = *lenp; if (len) - if(copy_to_user(buffer, table->data, len)) + if(copy_to_user(buffer, data, len)) return -EFAULT; if (len < *lenp) { if(put_user('\n', ((char __user *) buffer) + len)) diff --git a/kernel/timer.c b/kernel/timer.c index 10af71d99..9e7985cb2 100644 --- a/kernel/timer.c +++ b/kernel/timer.c @@ -686,7 +686,11 @@ static void second_overflow(void) if (ltemp > (MAXPHASE / MINSEC) << SHIFT_UPDATE) ltemp = (MAXPHASE / MINSEC) << SHIFT_UPDATE; time_offset += ltemp; + #if SHIFT_SCALE - SHIFT_HZ - SHIFT_UPDATE > 0 time_adj = -ltemp << (SHIFT_SCALE - SHIFT_HZ - SHIFT_UPDATE); + #else + time_adj = -ltemp >> (SHIFT_HZ + SHIFT_UPDATE - SHIFT_SCALE); + #endif } else { ltemp = time_offset; if (!(time_status & STA_FLL)) @@ -694,7 +698,11 @@ static void second_overflow(void) if (ltemp > (MAXPHASE / MINSEC) << SHIFT_UPDATE) ltemp = (MAXPHASE / MINSEC) << SHIFT_UPDATE; time_offset -= ltemp; + #if SHIFT_SCALE - SHIFT_HZ - SHIFT_UPDATE > 0 time_adj = ltemp << (SHIFT_SCALE - SHIFT_HZ - SHIFT_UPDATE); + #else + time_adj = ltemp >> (SHIFT_HZ + SHIFT_UPDATE - SHIFT_SCALE); + #endif } /* diff --git a/kernel/vserver/Kconfig b/kernel/vserver/Kconfig index 5f12bc248..b25de3e89 100644 --- a/kernel/vserver/Kconfig +++ b/kernel/vserver/Kconfig @@ -103,8 +103,16 @@ config INOXID_RUNTIME endchoice +config XID_TAG_NFSD + bool "Tag NFSD User Auth and Files" + default n + help + Enable this if you do want the kernel nfsd to + use the xid tagging specified above. + (will require patched clients too) + config VSERVER_DEBUG - bool "Compile Debugging Code" + bool "VServer Debugging Code" default n help Set this to yes if you want to be able to activate @@ -113,7 +121,7 @@ config VSERVER_DEBUG increases the kernel size by about 20k. config VSERVER_HISTORY - bool "Compile History Tracing" + bool "VServer History Tracing" depends on VSERVER_DEBUG default n help diff --git a/kernel/vserver/Makefile b/kernel/vserver/Makefile index 14f74ae3f..19cd98839 100644 --- a/kernel/vserver/Makefile +++ b/kernel/vserver/Makefile @@ -6,8 +6,9 @@ obj-y += vserver.o vserver-y := switch.o context.o namespace.o sched.o network.o inode.o \ - limit.o cvirt.o signal.o proc.o helper.o init.o dlimit.o + limit.o cvirt.o signal.o helper.o init.o dlimit.o +vserver-$(CONFIG_PROC_FS) += proc.o vserver-$(CONFIG_VSERVER_DEBUG) += sysctl.o vserver-$(CONFIG_VSERVER_LEGACY) += legacy.o vserver-$(CONFIG_VSERVER_LEGACYNET) += legacynet.o diff --git a/kernel/vserver/context.c b/kernel/vserver/context.c index 3d23d7142..993ef7279 100644 --- a/kernel/vserver/context.c +++ b/kernel/vserver/context.c @@ -66,7 +66,7 @@ static struct vx_info *__alloc_vx_info(xid_t xid) new->vx_parent = NULL; new->vx_state = 0; new->vx_lock = SPIN_LOCK_UNLOCKED; - init_waitqueue_head(&new->vx_exit); + init_waitqueue_head(&new->vx_wait); /* rest of init goes here */ vx_info_init_limit(&new->limit); @@ -114,7 +114,8 @@ void __shutdown_vx_info(struct vx_info *vxi) might_sleep(); - vs_context_state(vxi, VS_CONTEXT_DESTROY); + vxi->vx_state |= VXS_SHUTDOWN; + vs_state_change(vxi, VSC_SHUTDOWN); namespace = xchg(&vxi->vx_namespace, NULL); if (namespace) @@ -178,7 +179,6 @@ static inline void __hash_vx_info(struct vx_info *vxi) /* context must not be hashed */ BUG_ON(vxi->vx_state & VXS_HASHED); - get_vx_info(vxi); vxi->vx_state |= VXS_HASHED; head = &vx_info_hash[__hashval(vxi->vx_id)]; hlist_add_head(&vxi->vx_hlist, head); @@ -202,7 +202,6 @@ static inline void __unhash_vx_info(struct vx_info *vxi) vxi->vx_state &= ~VXS_HASHED; hlist_del(&vxi->vx_hlist); - put_vx_info(vxi); } @@ -391,6 +390,7 @@ void unhash_vx_info(struct vx_info *vxi) spin_lock(&vx_info_hash_lock); __unhash_vx_info(vxi); spin_unlock(&vx_info_hash_lock); + __wakeup_vx_info(vxi); } @@ -668,7 +668,7 @@ int vc_ctx_create(uint32_t xid, void __user *data) if (IS_ERR(new_vxi)) return PTR_ERR(new_vxi); - vs_context_state(new_vxi, VS_CONTEXT_CREATED); + vs_state_change(new_vxi, VSC_STARTUP); ret = new_vxi->vx_id; vx_migrate_task(current, new_vxi); /* if this fails, we might end up with a hashed vx_info */ diff --git a/kernel/vserver/cvirt.c b/kernel/vserver/cvirt.c index 21bd0bd07..5e976b0cd 100644 --- a/kernel/vserver/cvirt.c +++ b/kernel/vserver/cvirt.c @@ -11,6 +11,7 @@ #include #include +#include #include #include #include @@ -94,6 +95,32 @@ out: } +int vx_uts_virt_handler(struct ctl_table *ctl, int write, xid_t xid, + void **datap, size_t *lenp) +{ + switch (ctl->ctl_name) { + case KERN_OSTYPE: + *datap = vx_new_uts(sysname); + break; + case KERN_OSRELEASE: + *datap = vx_new_uts(release); + break; + case KERN_VERSION: + *datap = vx_new_uts(version); + break; + case KERN_NODENAME: + *datap = vx_new_uts(nodename); + break; + case KERN_DOMAINNAME: + *datap = vx_new_uts(domainname); + break; + } + + return 0; +} + + + /* * Commands to do_syslog: * diff --git a/kernel/vserver/dlimit.c b/kernel/vserver/dlimit.c index d648060f2..9cf8d6d98 100644 --- a/kernel/vserver/dlimit.c +++ b/kernel/vserver/dlimit.c @@ -6,6 +6,7 @@ * Copyright (C) 2004-2005 Herbert Pƶtzl * * V0.01 initial version + * V0.02 compat32 splitup * */ @@ -14,9 +15,11 @@ #include #include #include +#include #include #include #include +#include #include #include @@ -178,18 +181,13 @@ void rcu_free_dl_info(struct rcu_head *head) -int vc_add_dlimit(uint32_t id, void __user *data) +int do_addrem_dlimit(uint32_t id, const char __user *name, + uint32_t flags, int add) { struct nameidata nd; - struct vcmd_ctx_dlimit_base_v0 vc_data; int ret; - if (!vx_check(0, VX_ADMIN)) - return -ENOSYS; - if (copy_from_user (&vc_data, data, sizeof(vc_data))) - return -EFAULT; - - ret = user_path_walk_link(vc_data.name, &nd); + ret = user_path_walk_link(name, &nd); if (!ret) { struct super_block *sb; struct dl_info *dli; @@ -200,19 +198,28 @@ int vc_add_dlimit(uint32_t id, void __user *data) if (!(sb = nd.dentry->d_inode->i_sb)) goto out_release; - dli = __alloc_dl_info(sb, id); - spin_lock(&dl_info_hash_lock); - - ret = -EEXIST; - if (__lookup_dl_info(sb, id)) - goto out_unlock; - __hash_dl_info(dli); - dli = NULL; + if (add) { + dli = __alloc_dl_info(sb, id); + spin_lock(&dl_info_hash_lock); + + ret = -EEXIST; + if (__lookup_dl_info(sb, id)) + goto out_unlock; + __hash_dl_info(dli); + dli = NULL; + } else { + spin_lock(&dl_info_hash_lock); + dli = __lookup_dl_info(sb, id); + + ret = -ESRCH; + if (!dli) + goto out_unlock; + __unhash_dl_info(dli); + } ret = 0; - out_unlock: spin_unlock(&dl_info_hash_lock); - if (dli) + if (add && dli) __dealloc_dl_info(dli); out_release: path_release(&nd); @@ -220,60 +227,71 @@ int vc_add_dlimit(uint32_t id, void __user *data) return ret; } +int vc_add_dlimit(uint32_t id, void __user *data) +{ + struct vcmd_ctx_dlimit_base_v0 vc_data; + + if (!vx_check(0, VX_ADMIN)) + return -ENOSYS; + if (copy_from_user (&vc_data, data, sizeof(vc_data))) + return -EFAULT; + + return do_addrem_dlimit(id, vc_data.name, vc_data.flags, 1); +} int vc_rem_dlimit(uint32_t id, void __user *data) { - struct nameidata nd; struct vcmd_ctx_dlimit_base_v0 vc_data; - int ret; if (!vx_check(0, VX_ADMIN)) return -ENOSYS; if (copy_from_user (&vc_data, data, sizeof(vc_data))) return -EFAULT; - ret = user_path_walk_link(vc_data.name, &nd); - if (!ret) { - struct super_block *sb; - struct dl_info *dli; - - ret = -EINVAL; - if (!nd.dentry->d_inode) - goto out_release; - if (!(sb = nd.dentry->d_inode->i_sb)) - goto out_release; + return do_addrem_dlimit(id, vc_data.name, vc_data.flags, 0); +} - spin_lock(&dl_info_hash_lock); - dli = __lookup_dl_info(sb, id); +#ifdef CONFIG_COMPAT - ret = -ESRCH; - if (!dli) - goto out_unlock; +int vc_add_dlimit_x32(uint32_t id, void __user *data) +{ + struct vcmd_ctx_dlimit_base_v0_x32 vc_data; - __unhash_dl_info(dli); - ret = 0; + if (!vx_check(0, VX_ADMIN)) + return -ENOSYS; + if (copy_from_user (&vc_data, data, sizeof(vc_data))) + return -EFAULT; - out_unlock: - spin_unlock(&dl_info_hash_lock); - out_release: - path_release(&nd); - } - return ret; + return do_addrem_dlimit(id, + compat_ptr(vc_data.name_ptr), vc_data.flags, 1); } - -int vc_set_dlimit(uint32_t id, void __user *data) +int vc_rem_dlimit_x32(uint32_t id, void __user *data) { - struct nameidata nd; - struct vcmd_ctx_dlimit_v0 vc_data; - int ret; + struct vcmd_ctx_dlimit_base_v0_x32 vc_data; if (!vx_check(0, VX_ADMIN)) return -ENOSYS; if (copy_from_user (&vc_data, data, sizeof(vc_data))) return -EFAULT; - ret = user_path_walk_link(vc_data.name, &nd); + return do_addrem_dlimit(id, + compat_ptr(vc_data.name_ptr), vc_data.flags, 0); +} + +#endif /* CONFIG_COMPAT */ + + +static inline +int do_set_dlimit(uint32_t id, const char __user *name, + uint32_t space_used, uint32_t space_total, + uint32_t inodes_used, uint32_t inodes_total, + uint32_t reserved, uint32_t flags) +{ + struct nameidata nd; + int ret; + + ret = user_path_walk_link(name, &nd); if (!ret) { struct super_block *sb; struct dl_info *dli; @@ -283,12 +301,12 @@ int vc_set_dlimit(uint32_t id, void __user *data) goto out_release; if (!(sb = nd.dentry->d_inode->i_sb)) goto out_release; - if ((vc_data.reserved != (uint32_t)CDLIM_KEEP && - vc_data.reserved > 100) || - (vc_data.inodes_used != (uint32_t)CDLIM_KEEP && - vc_data.inodes_used > vc_data.inodes_total) || - (vc_data.space_used != (uint32_t)CDLIM_KEEP && - vc_data.space_used > vc_data.space_total)) + if ((reserved != (uint32_t)CDLIM_KEEP && + reserved > 100) || + (inodes_used != (uint32_t)CDLIM_KEEP && + inodes_used > inodes_total) || + (space_used != (uint32_t)CDLIM_KEEP && + space_used > space_total)) goto out_release; ret = -ESRCH; @@ -298,22 +316,22 @@ int vc_set_dlimit(uint32_t id, void __user *data) spin_lock(&dli->dl_lock); - if (vc_data.inodes_used != (uint32_t)CDLIM_KEEP) - dli->dl_inodes_used = vc_data.inodes_used; - if (vc_data.inodes_total != (uint32_t)CDLIM_KEEP) - dli->dl_inodes_total = vc_data.inodes_total; - if (vc_data.space_used != (uint32_t)CDLIM_KEEP) { - dli->dl_space_used = vc_data.space_used; + if (inodes_used != (uint32_t)CDLIM_KEEP) + dli->dl_inodes_used = inodes_used; + if (inodes_total != (uint32_t)CDLIM_KEEP) + dli->dl_inodes_total = inodes_total; + if (space_used != (uint32_t)CDLIM_KEEP) { + dli->dl_space_used = space_used; dli->dl_space_used <<= 10; } - if (vc_data.space_total == (uint32_t)CDLIM_INFINITY) + if (space_total == (uint32_t)CDLIM_INFINITY) dli->dl_space_total = (uint64_t)CDLIM_INFINITY; - else if (vc_data.space_total != (uint32_t)CDLIM_KEEP) { - dli->dl_space_total = vc_data.space_total; + else if (space_total != (uint32_t)CDLIM_KEEP) { + dli->dl_space_total = space_total; dli->dl_space_total <<= 10; } - if (vc_data.reserved != (uint32_t)CDLIM_KEEP) - dli->dl_nrlmult = (1 << 10) * (100 - vc_data.reserved) / 100; + if (reserved != (uint32_t)CDLIM_KEEP) + dli->dl_nrlmult = (1 << 10) * (100 - reserved) / 100; spin_unlock(&dli->dl_lock); @@ -326,18 +344,51 @@ int vc_set_dlimit(uint32_t id, void __user *data) return ret; } -int vc_get_dlimit(uint32_t id, void __user *data) +int vc_set_dlimit(uint32_t id, void __user *data) { - struct nameidata nd; struct vcmd_ctx_dlimit_v0 vc_data; - int ret; if (!vx_check(0, VX_ADMIN)) return -ENOSYS; if (copy_from_user (&vc_data, data, sizeof(vc_data))) return -EFAULT; - ret = user_path_walk_link(vc_data.name, &nd); + return do_set_dlimit(id, vc_data.name, + vc_data.space_used, vc_data.space_total, + vc_data.inodes_used, vc_data.inodes_total, + vc_data.reserved, vc_data.flags); +} + +#ifdef CONFIG_COMPAT + +int vc_set_dlimit_x32(uint32_t id, void __user *data) +{ + struct vcmd_ctx_dlimit_v0_x32 vc_data; + + if (!vx_check(0, VX_ADMIN)) + return -ENOSYS; + if (copy_from_user (&vc_data, data, sizeof(vc_data))) + return -EFAULT; + + return do_set_dlimit(id, compat_ptr(vc_data.name_ptr), + vc_data.space_used, vc_data.space_total, + vc_data.inodes_used, vc_data.inodes_total, + vc_data.reserved, vc_data.flags); +} + +#endif /* CONFIG_COMPAT */ + + +static inline +int do_get_dlimit(uint32_t id, const char __user *name, + uint32_t *space_used, uint32_t *space_total, + uint32_t *inodes_used, uint32_t *inodes_total, + uint32_t *reserved, uint32_t *flags) +{ + struct nameidata nd; + int ret; + + ret = user_path_walk_link(name, &nd); if (!ret) { struct super_block *sb; struct dl_info *dli; @@ -347,10 +398,6 @@ int vc_get_dlimit(uint32_t id, void __user *data) goto out_release; if (!(sb = nd.dentry->d_inode->i_sb)) goto out_release; - if (vc_data.reserved > 100 || - vc_data.inodes_used > vc_data.inodes_total || - vc_data.space_used > vc_data.space_total) - goto out_release; ret = -ESRCH; dli = locate_dl_info(sb, id); @@ -358,21 +405,19 @@ int vc_get_dlimit(uint32_t id, void __user *data) goto out_release; spin_lock(&dli->dl_lock); - vc_data.inodes_used = dli->dl_inodes_used; - vc_data.inodes_total = dli->dl_inodes_total; - vc_data.space_used = dli->dl_space_used >> 10; + *inodes_used = dli->dl_inodes_used; + *inodes_total = dli->dl_inodes_total; + *space_used = dli->dl_space_used >> 10; if (dli->dl_space_total == (uint64_t)CDLIM_INFINITY) - vc_data.space_total = (uint32_t)CDLIM_INFINITY; + *space_total = (uint32_t)CDLIM_INFINITY; else - vc_data.space_total = dli->dl_space_total >> 10; + *space_total = dli->dl_space_total >> 10; - vc_data.reserved = 100 - ((dli->dl_nrlmult * 100 + 512) >> 10); + *reserved = 100 - ((dli->dl_nrlmult * 100 + 512) >> 10); spin_unlock(&dli->dl_lock); put_dl_info(dli); ret = -EFAULT; - if (copy_to_user(data, &vc_data, sizeof(vc_data))) - goto out_release; ret = 0; out_release: @@ -382,6 +427,55 @@ int vc_get_dlimit(uint32_t id, void __user *data) } +int vc_get_dlimit(uint32_t id, void __user *data) +{ + struct vcmd_ctx_dlimit_v0 vc_data; + int ret; + + if (!vx_check(0, VX_ADMIN)) + return -ENOSYS; + if (copy_from_user (&vc_data, data, sizeof(vc_data))) + return -EFAULT; + + ret = do_get_dlimit(id, vc_data.name, + &vc_data.space_used, &vc_data.space_total, + &vc_data.inodes_used, &vc_data.inodes_total, + &vc_data.reserved, &vc_data.flags); + if (ret) + return ret; + + if (copy_to_user(data, &vc_data, sizeof(vc_data))) + return -EFAULT; + return 0; +} + +#ifdef CONFIG_COMPAT + +int vc_get_dlimit_x32(uint32_t id, void __user *data) +{ + struct vcmd_ctx_dlimit_v0_x32 vc_data; + int ret; + + if (!vx_check(0, VX_ADMIN)) + return -ENOSYS; + if (copy_from_user (&vc_data, data, sizeof(vc_data))) + return -EFAULT; + + ret = do_get_dlimit(id, compat_ptr(vc_data.name_ptr), + &vc_data.space_used, &vc_data.space_total, + &vc_data.inodes_used, &vc_data.inodes_total, + &vc_data.reserved, &vc_data.flags); + if (ret) + return ret; + + if (copy_to_user(data, &vc_data, sizeof(vc_data))) + return -EFAULT; + return 0; +} + +#endif /* CONFIG_COMPAT */ + + void vx_vsi_statfs(struct super_block *sb, struct kstatfs *buf) { struct dl_info *dli; diff --git a/kernel/vserver/helper.c b/kernel/vserver/helper.c index 5963b1812..ebb3a755c 100644 --- a/kernel/vserver/helper.c +++ b/kernel/vserver/helper.c @@ -29,12 +29,13 @@ int do_vshelper(char *name, char *argv[], char *envp[], int sync) if ((ret = call_usermodehelper(name, argv, envp, sync))) { printk( KERN_WARNING - "%s: (%s %s) returned with %d\n", - name, argv[1], argv[2], ret); + "%s: (%s %s) returned %s with %d\n", + name, argv[1], argv[2], + sync?"sync":"async", ret); } vxdprintk(VXD_CBIT(switch, 1), - "%s: (%s %s) returned with %d", - name, argv[1], argv[2], ret); + "%s: (%s %s) returned %s with %d", + name, argv[1], argv[2], sync?"sync":"async", ret); return ret; } @@ -82,6 +83,9 @@ long vs_reboot(unsigned int cmd, void * arg) case LINUX_REBOOT_CMD_SW_SUSPEND: argv[1] = "swsusp"; break; + + default: + return 0; } if (do_vshelper(vshelper_path, argv, envp, 1)) @@ -91,9 +95,6 @@ long vs_reboot(unsigned int cmd, void * arg) /* - * invoked by vserver sys_reboot(), with - * the following arguments - * * argv [0] = vshelper_path; * argv [1] = action: "startup", "shutdown" * argv [2] = context identifier @@ -101,7 +102,7 @@ long vs_reboot(unsigned int cmd, void * arg) * envp [*] = type-specific parameters */ -long vs_context_state(struct vx_info *vxi, unsigned int cmd) +long vs_state_change(struct vx_info *vxi, unsigned int cmd) { char id_buf[8], cmd_buf[16]; char *argv[] = {vshelper_path, NULL, id_buf, 0}; @@ -112,10 +113,10 @@ long vs_context_state(struct vx_info *vxi, unsigned int cmd) snprintf(cmd_buf, sizeof(cmd_buf)-1, "VS_CMD=%08x", cmd); switch (cmd) { - case VS_CONTEXT_CREATED: + case VSC_STARTUP: argv[1] = "startup"; break; - case VS_CONTEXT_DESTROY: + case VSC_SHUTDOWN: argv[1] = "shutdown"; break; default: diff --git a/kernel/vserver/inode.c b/kernel/vserver/inode.c index bb41a144b..dce77dd89 100644 --- a/kernel/vserver/inode.c +++ b/kernel/vserver/inode.c @@ -9,7 +9,6 @@ * */ -#include #include #include #include @@ -17,6 +16,7 @@ #include #include #include +#include #include #include #include @@ -87,12 +87,44 @@ int vc_get_iattr(uint32_t id, void __user *data) &vc_data.xid, &vc_data.flags, &vc_data.mask); path_release(&nd); } + if (ret) + return ret; if (copy_to_user (data, &vc_data, sizeof(vc_data))) ret = -EFAULT; return ret; } +#ifdef CONFIG_COMPAT + +int vc_get_iattr_x32(uint32_t id, void __user *data) +{ + struct nameidata nd; + struct vcmd_ctx_iattr_v1_x32 vc_data = { .xid = -1 }; + int ret; + + if (!vx_check(0, VX_ADMIN)) + return -ENOSYS; + if (copy_from_user (&vc_data, data, sizeof(vc_data))) + return -EFAULT; + + ret = user_path_walk_link(compat_ptr(vc_data.name_ptr), &nd); + if (!ret) { + ret = __vc_get_iattr(nd.dentry->d_inode, + &vc_data.xid, &vc_data.flags, &vc_data.mask); + path_release(&nd); + } + if (ret) + return ret; + + if (copy_to_user (data, &vc_data, sizeof(vc_data))) + ret = -EFAULT; + return ret; +} + +#endif /* CONFIG_COMPAT */ + + static int __vc_set_iattr(struct dentry *de, uint32_t *xid, uint32_t *flags, uint32_t *mask) { struct inode *in = de->d_inode; @@ -189,6 +221,32 @@ int vc_set_iattr(uint32_t id, void __user *data) return ret; } +#ifdef CONFIG_COMPAT + +int vc_set_iattr_x32(uint32_t id, void __user *data) +{ + struct nameidata nd; + struct vcmd_ctx_iattr_v1_x32 vc_data; + int ret; + + if (!capable(CAP_SYS_ADMIN) || !capable(CAP_LINUX_IMMUTABLE)) + return -EPERM; + if (copy_from_user (&vc_data, data, sizeof(vc_data))) + return -EFAULT; + + ret = user_path_walk_link(compat_ptr(vc_data.name_ptr), &nd); + if (!ret) { + ret = __vc_set_iattr(nd.dentry, + &vc_data.xid, &vc_data.flags, &vc_data.mask); + path_release(&nd); + } + + if (copy_to_user (data, &vc_data, sizeof(vc_data))) + ret = -EFAULT; + return ret; +} + +#endif /* CONFIG_COMPAT */ #ifdef CONFIG_VSERVER_LEGACY diff --git a/kernel/vserver/proc.c b/kernel/vserver/proc.c index 6b4c6e947..06141cd67 100644 --- a/kernel/vserver/proc.c +++ b/kernel/vserver/proc.c @@ -833,9 +833,10 @@ void proc_vx_init(void) /* per pid info */ -char *task_vx_info(struct task_struct *p, char *buffer) +int proc_pid_vx_info(struct task_struct *p, char *buffer) { struct vx_info *vxi; + char * orig = buffer; buffer += sprintf (buffer,"XID:\t%d\n", vx_task_xid(p)); vxi = task_get_vx_info(p); @@ -850,20 +851,14 @@ char *task_vx_info(struct task_struct *p, char *buffer) ,vxi->vx_initpid); } put_vx_info(vxi); - return buffer; -} - -int proc_pid_vx_info(struct task_struct *p, char *buffer) -{ - char * orig = buffer; - - buffer = task_vx_info(p, buffer); return buffer - orig; } -char *task_nx_info(struct task_struct *p, char *buffer) + +int proc_pid_nx_info(struct task_struct *p, char *buffer) { struct nx_info *nxi; + char * orig = buffer; buffer += sprintf (buffer,"NID:\t%d\n", nx_task_nid(p)); nxi = task_get_nx_info(p); @@ -881,14 +876,6 @@ char *task_nx_info(struct task_struct *p, char *buffer) ,NIPQUAD(nxi->v4_bcast)); } put_nx_info(nxi); - return buffer; -} - -int proc_pid_nx_info(struct task_struct *p, char *buffer) -{ - char * orig = buffer; - - buffer = task_nx_info(p, buffer); return buffer - orig; } diff --git a/kernel/vserver/signal.c b/kernel/vserver/signal.c index ae4d11fa3..5824ad5e6 100644 --- a/kernel/vserver/signal.c +++ b/kernel/vserver/signal.c @@ -16,7 +16,7 @@ #include #include -#include +#include int vc_ctx_kill(uint32_t id, void __user *data) @@ -95,11 +95,11 @@ static int __wait_exit(struct vx_info *vxi) DECLARE_WAITQUEUE(wait, current); int ret = 0; - add_wait_queue(&vxi->vx_exit, &wait); + add_wait_queue(&vxi->vx_wait, &wait); set_current_state(TASK_INTERRUPTIBLE); wait: - if (vx_info_state(vxi, VXS_DEFUNCT)) + if (vx_info_state(vxi, VXS_SHUTDOWN|VXS_HASHED) == VXS_SHUTDOWN) goto out; if (signal_pending(current)) { ret = -ERESTARTSYS; @@ -110,7 +110,7 @@ wait: out: set_current_state(TASK_RUNNING); - remove_wait_queue(&vxi->vx_exit, &wait); + remove_wait_queue(&vxi->vx_wait, &wait); return ret; } diff --git a/kernel/vserver/switch.c b/kernel/vserver/switch.c index 88f164c81..e39b01c4f 100644 --- a/kernel/vserver/switch.c +++ b/kernel/vserver/switch.c @@ -10,12 +10,14 @@ * V0.03 added rlimit functions * V0.04 added iattr, task/xid functions * V0.05 added debug/history stuff + * V0.06 added compat32 layer * */ #include #include #include +#include #include #include @@ -23,8 +25,8 @@ #include -static inline int -vc_get_version(uint32_t id) +static inline +int vc_get_version(uint32_t id) { return VCI_VERSION; } @@ -36,21 +38,31 @@ vc_get_version(uint32_t id) #include #include #include +#include +#include #include #include #include -#include #include -extern asmlinkage long -sys_vserver(uint32_t cmd, uint32_t id, void __user *data) +#ifdef CONFIG_COMPAT +#define __COMPAT(name, id, data, compat) \ + (compat) ? name ## _x32 (id, data) : name (id, data) +#else +#define __COMPAT(name, id, data, compat) \ + name (id, data) +#endif + + +static inline +long do_vserver(uint32_t cmd, uint32_t id, void __user *data, int compat) { vxdprintk(VXD_CBIT(switch, 0), - "vc: VCMD_%02d_%d[%d], %d", + "vc: VCMD_%02d_%d[%d], %d,%p,%d", VC_CATEGORY(cmd), VC_COMMAND(cmd), - VC_VERSION(cmd), id); + VC_VERSION(cmd), id, data, compat); #ifdef CONFIG_VSERVER_LEGACY if (!capable(CAP_CONTEXT) && @@ -152,13 +164,13 @@ sys_vserver(uint32_t cmd, uint32_t id, void __user *data) return vc_set_sched(id, data); case VCMD_add_dlimit: - return vc_add_dlimit(id, data); + return __COMPAT(vc_add_dlimit, id, data, compat); case VCMD_rem_dlimit: - return vc_rem_dlimit(id, data); + return __COMPAT(vc_rem_dlimit, id, data, compat); case VCMD_set_dlimit: - return vc_set_dlimit(id, data); + return __COMPAT(vc_set_dlimit, id, data, compat); case VCMD_get_dlimit: - return vc_get_dlimit(id, data); + return __COMPAT(vc_get_dlimit, id, data, compat); } /* below here only with VX_ADMIN */ @@ -180,9 +192,9 @@ sys_vserver(uint32_t cmd, uint32_t id, void __user *data) #endif case VCMD_get_iattr: - return vc_get_iattr(id, data); + return __COMPAT(vc_get_iattr, id, data, compat); case VCMD_set_iattr: - return vc_set_iattr(id, data); + return __COMPAT(vc_set_iattr, id, data, compat); case VCMD_enter_namespace: return vc_enter_namespace(id, data); @@ -207,3 +219,18 @@ sys_vserver(uint32_t cmd, uint32_t id, void __user *data) return -ENOSYS; } +extern asmlinkage long +sys_vserver(uint32_t cmd, uint32_t id, void __user *data) +{ + return do_vserver(cmd, id, data, 0); +} + +#ifdef CONFIG_COMPAT + +extern asmlinkage long +sys32_vserver(uint32_t cmd, uint32_t id, void __user *data) +{ + return do_vserver(cmd, id, data, 1); +} + +#endif /* CONFIG_COMPAT */ diff --git a/net/core/sock.c b/net/core/sock.c index 35b0c133c..52a2296b8 100644 --- a/net/core/sock.c +++ b/net/core/sock.c @@ -124,6 +124,7 @@ #include #include #include +#include #ifdef CONFIG_INET #include diff --git a/net/ipv4/netfilter/ip_conntrack_proto_sctp.c b/net/ipv4/netfilter/ip_conntrack_proto_sctp.c index 7d9f8ea14..08a8f69c9 100644 --- a/net/ipv4/netfilter/ip_conntrack_proto_sctp.c +++ b/net/ipv4/netfilter/ip_conntrack_proto_sctp.c @@ -61,7 +61,7 @@ static const char *sctp_conntrack_names[] = { static unsigned long ip_ct_sctp_timeout_closed = 10 SECS; static unsigned long ip_ct_sctp_timeout_cookie_wait = 3 SECS; static unsigned long ip_ct_sctp_timeout_cookie_echoed = 3 SECS; -static unsigned long ip_ct_sctp_timeout_established = 5 DAYS; +static unsigned long ip_ct_sctp_timeout_established = 2 DAYS; static unsigned long ip_ct_sctp_timeout_shutdown_sent = 300 SECS / 1000; static unsigned long ip_ct_sctp_timeout_shutdown_recd = 300 SECS / 1000; static unsigned long ip_ct_sctp_timeout_shutdown_ack_sent = 3 SECS; diff --git a/net/ipv4/netfilter/ip_conntrack_proto_tcp.c b/net/ipv4/netfilter/ip_conntrack_proto_tcp.c index 939931c33..95cf7fe41 100644 --- a/net/ipv4/netfilter/ip_conntrack_proto_tcp.c +++ b/net/ipv4/netfilter/ip_conntrack_proto_tcp.c @@ -88,7 +88,7 @@ static const char *tcp_conntrack_names[] = { unsigned long ip_ct_tcp_timeout_syn_sent = 2 MINS; unsigned long ip_ct_tcp_timeout_syn_recv = 60 SECS; -unsigned long ip_ct_tcp_timeout_established = 5 DAYS; +unsigned long ip_ct_tcp_timeout_established = 2 DAYS; unsigned long ip_ct_tcp_timeout_fin_wait = 2 MINS; unsigned long ip_ct_tcp_timeout_close_wait = 60 SECS; unsigned long ip_ct_tcp_timeout_last_ack = 30 SECS; diff --git a/net/ipv4/tcp_minisocks.c b/net/ipv4/tcp_minisocks.c index dc1bc35a2..4bb46b80e 100644 --- a/net/ipv4/tcp_minisocks.c +++ b/net/ipv4/tcp_minisocks.c @@ -31,6 +31,7 @@ #include #include +#include #ifdef CONFIG_SYSCTL #define SYNC_INIT 0 /* let the user enable it */ diff --git a/security/commoncap.c b/security/commoncap.c index f067e8acb..98114af88 100644 --- a/security/commoncap.c +++ b/security/commoncap.c @@ -311,7 +311,8 @@ void cap_task_reparent_to_init (struct task_struct *p) int cap_syslog (int type) { - if ((type != 3 && type != 10) && !capable(CAP_SYS_ADMIN)) + if ((type != 3 && type != 10) && + !capable(CAP_SYS_ADMIN) && !vx_ccaps(VXC_SYSLOG)) return -EPERM; return 0; } -- 2.43.0