vserver 2.0-pre4
authorMarc Fiuczynski <mef@cs.princeton.edu>
Mon, 8 Aug 2005 21:03:50 +0000 (21:03 +0000)
committerMarc Fiuczynski <mef@cs.princeton.edu>
Mon, 8 Aug 2005 21:03:50 +0000 (21:03 +0000)
77 files changed:
Makefile
arch/i386/Kconfig
arch/i386/kernel/cpu/proc.c
arch/i386/kernel/smpboot.c
arch/ia64/ia32/ia32_entry.S
arch/mips/kernel/scall32-o32.S
arch/mips/kernel/scall64-64.S
arch/mips/kernel/scall64-n32.S
arch/mips/kernel/scall64-o32.S
arch/ppc/boot/include/serial.h
arch/ppc64/kernel/misc.S
arch/s390/kernel/syscalls.S
arch/sparc64/kernel/systbls.S
arch/x86_64/ia32/ia32entry.S
drivers/acpi/osl.c
drivers/block/floppy.c
drivers/char/cyclades.c
drivers/char/dtlk.c
drivers/char/isicom.c
drivers/char/moxa.c
drivers/char/mxser.c
drivers/char/pcmcia/synclink_cs.c
drivers/char/riscom8.h
drivers/char/specialix_io8.h
drivers/char/synclink.c
drivers/char/synclinkmp.c
drivers/macintosh/macserial.h
drivers/net/wan/z85230.h
drivers/sbus/char/aurora.h
drivers/serial/68328serial.h
drivers/serial/68360serial.c
drivers/serial/crisv10.h
drivers/serial/mcfserial.h
drivers/tc/zs.h
fs/inode.c
fs/nfsd/auth.c
fs/nfsd/nfs3xdr.c
fs/nfsd/nfsxdr.c
fs/proc/base.c
fs/quota.c
include/asm-i386/param.h
include/linux/cyclades.h
include/linux/dtlk.h
include/linux/generic_serial.h
include/linux/hayesesp.h
include/linux/jiffies.h
include/linux/serial.h
include/linux/serialP.h
include/linux/sysctl.h
include/linux/vs_context.h
include/linux/vserver/context.h
include/linux/vserver/cvirt.h
include/linux/vserver/dlimit.h
include/linux/vserver/inode_cmd.h
include/linux/vserver/legacy.h
include/linux/vserver/xid.h
include/net/irda/ircomm_tty.h
include/net/route.h
include/net/tcp.h
init/calibrate.c
kernel/sysctl.c
kernel/timer.c
kernel/vserver/Kconfig
kernel/vserver/Makefile
kernel/vserver/context.c
kernel/vserver/cvirt.c
kernel/vserver/dlimit.c
kernel/vserver/helper.c
kernel/vserver/inode.c
kernel/vserver/proc.c
kernel/vserver/signal.c
kernel/vserver/switch.c
net/core/sock.c
net/ipv4/netfilter/ip_conntrack_proto_sctp.c
net/ipv4/netfilter/ip_conntrack_proto_tcp.c
net/ipv4/tcp_minisocks.c
security/commoncap.c

index 728dadb..b8e707f 100644 (file)
--- 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*
index 5ed54ab..4f0ff15 100644 (file)
@@ -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
index c8d83fd..0fd2a0a 100644 (file)
@@ -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;
 }
 
index e99992e..4b120fc 100644 (file)
@@ -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");
 
index 1bb348d..aa51785 100644 (file)
@@ -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
index 344f2e2..fc44812 100644 (file)
@@ -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
index 32efb88..4e5002b 100644 (file)
@@ -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
index e52049c..f30a0c2 100644 (file)
@@ -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
index 739f399..a4c8078 100644 (file)
@@ -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 */
index d710eab..5ea78b4 100644 (file)
@@ -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;
index edbd00a..dc67e77 100644 (file)
@@ -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 */
index e616c01..bdbcec4 100644 (file)
@@ -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)
index cf8301f..1d25d71 100644 (file)
@@ -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
index d4cfaba..fc1f6ac 100644 (file)
@@ -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
index 94a5113..96772a4 100644 (file)
@@ -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) {
index bce3fc0..35db7f4 100644 (file)
@@ -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;
                }
index 6a5337b..1cf94f1 100644 (file)
@@ -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:
index 903e4c3..85d2b42 100644 (file)
@@ -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
index 2ccde4d..c0fdd50 100644 (file)
@@ -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;
index 10ba9bf..c5137c2 100644 (file)
@@ -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 */
index 367f12d..c288ef5 100644 (file)
@@ -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;
index 1c8d866..ce49fac 100644 (file)
@@ -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;
        
index 6317aad..2208997 100644 (file)
@@ -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;
index 948ab14..77c3180 100644 (file)
@@ -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;
index 37c8bea..9341f3b 100644 (file)
@@ -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;
        
index dc0af4e..1d6c023 100644 (file)
@@ -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;
 
index bade11a..501fe11 100644 (file)
@@ -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;
index 77e5320..6809fac 100644 (file)
@@ -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
index b8b5476..b3df6b8 100644 (file)
@@ -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;
index 978f8a6..d52a8e7 100644 (file)
@@ -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;
index f148022..5529298 100644 (file)
@@ -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 */
index 1800c0e..b6bbf4b 100644 (file)
@@ -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;
index a2b28e8..dbd8eec 100644 (file)
@@ -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 */
index c52edff..5c5a719 100644 (file)
@@ -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;
index 7479128..6c21383 100644 (file)
@@ -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
index 8637b5f..672a9b1 100644 (file)
@@ -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 &
index 0c133b9..4580bce 100644 (file)
@@ -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;
 
index 77b18ba..97c16bf 100644 (file)
@@ -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;
index 28e49e9..9d7ba30 100644 (file)
@@ -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;
index 83cd513..ffb35ef 100644 (file)
@@ -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 =
index b644052..f53d781 100644 (file)
@@ -1,8 +1,14 @@
 #ifndef _ASMi386_PARAM_H
 #define _ASMi386_PARAM_H
 
+#include <linux/config.h>
+
 #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
index 46d8254..d87bce0 100644 (file)
@@ -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 */
index 2896d90..0c26359 100644 (file)
@@ -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
index 09d2047..629e762 100644 (file)
@@ -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;
index 131d711..0f429be 100644 (file)
@@ -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;
index d7a2555..08dc59f 100644 (file)
 # 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
index 0014582..a1ef6a6 100644 (file)
@@ -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;
index 2307f11..042d92a 100644 (file)
@@ -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 */
index 7db3d5d..b0fd3cf 100644 (file)
@@ -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;
index ab0e56e..bc8e9b4 100644 (file)
@@ -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
index eae7ec4..a5a77e0 100644 (file)
@@ -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
 #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 *);
 
index a3cadfd..eb13878 100644 (file)
@@ -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__ */
index 0c6587e..99c2240 100644 (file)
@@ -2,31 +2,6 @@
 #define _VX_DLIMIT_H
 
 #include "switch.h"
-#include <linux/spinlock.h>
-
-/*  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 <linux/spinlock.h>
+
 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__ */
index 2b6afea..f14c899 100644 (file)
@@ -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 <linux/compiler.h>
 
 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 */
index d5b8a3f..f058983 100644 (file)
@@ -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 *);
index 5d1c6c1..c1994c0 100644 (file)
@@ -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
 
index 87699cb..faa66af 100644 (file)
@@ -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 */
index 189c100..93b1966 100644 (file)
@@ -33,7 +33,6 @@
 #include <linux/route.h>
 #include <linux/ip.h>
 #include <linux/cache.h>
-#include <linux/vs_context.h>
 #include <linux/vs_network.h>
 
 #ifndef __KERNEL__
index b87b78e..161dfeb 100644 (file)
@@ -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
index c698e04..4841f3e 100644 (file)
@@ -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);
        }
 
index 2810362..8f87d99 100644 (file)
@@ -41,6 +41,7 @@
 #include <linux/limits.h>
 #include <linux/dcache.h>
 #include <linux/syscalls.h>
+#include <linux/vserver/cvirt.h>
 
 #include <asm/uaccess.h>
 #include <asm/processor.h>
@@ -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))
index 10af71d..9e7985c 100644 (file)
@@ -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
     }
 
     /*
index 5f12bc2..b25de3e 100644 (file)
@@ -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
index 14f74ae..19cd988 100644 (file)
@@ -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
index 3d23d71..993ef72 100644 (file)
@@ -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 */
index 21bd0bd..5e976b0 100644 (file)
@@ -11,6 +11,7 @@
 
 #include <linux/config.h>
 #include <linux/sched.h>
+#include <linux/sysctl.h>
 #include <linux/types.h>
 #include <linux/vs_context.h>
 #include <linux/vs_cvirt.h>
@@ -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:
  *
index d648060..9cf8d6d 100644 (file)
@@ -6,6 +6,7 @@
  *  Copyright (C) 2004-2005  Herbert Pötzl
  *
  *  V0.01  initial version
+ *  V0.02  compat32 splitup
  *
  */
 
 #include <linux/namespace.h>
 #include <linux/namei.h>
 #include <linux/statfs.h>
+#include <linux/compat.h>
 #include <linux/vserver/switch.h>
 #include <linux/vs_context.h>
 #include <linux/vs_dlimit.h>
+#include <linux/vserver/dlimit_cmd.h>
 
 #include <asm/errno.h>
 #include <asm/uaccess.h>
@@ -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;
index 5963b18..ebb3a75 100644 (file)
@@ -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:
index bb41a14..dce77dd 100644 (file)
@@ -9,7 +9,6 @@
  *
  */
 
-#include <linux/config.h>
 #include <linux/sched.h>
 #include <linux/vs_context.h>
 #include <linux/proc_fs.h>
@@ -17,6 +16,7 @@
 #include <linux/namei.h>
 #include <linux/mount.h>
 #include <linux/parser.h>
+#include <linux/compat.h>
 #include <linux/vserver/inode.h>
 #include <linux/vserver/inode_cmd.h>
 #include <linux/vserver/xid.h>
@@ -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
 
index 6b4c6e9..06141cd 100644 (file)
@@ -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;
 }
 
index ae4d11f..5824ad5 100644 (file)
@@ -16,7 +16,7 @@
 #include <asm/uaccess.h>
 
 #include <linux/vs_context.h>
-#include <linux/vserver/signal.h>
+#include <linux/vserver/signal_cmd.h>
 
 
 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;
 }
 
index 88f164c..e39b01c 100644 (file)
  *  V0.03  added rlimit functions
  *  V0.04  added iattr, task/xid functions
  *  V0.05  added debug/history stuff
+ *  V0.06  added compat32 layer
  *
  */
 
 #include <linux/config.h>
 #include <linux/linkage.h>
 #include <linux/sched.h>
+#include <linux/compat.h>
 #include <asm/errno.h>
 
 #include <linux/vserver/network.h>
@@ -23,8 +25,8 @@
 #include <linux/vserver/debug.h>
 
 
-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 <linux/vserver/sched_cmd.h>
 #include <linux/vserver/debug_cmd.h>
 #include <linux/vserver/inode_cmd.h>
+#include <linux/vserver/dlimit_cmd.h>
+#include <linux/vserver/signal_cmd.h>
 
 #include <linux/vserver/legacy.h>
 #include <linux/vserver/namespace.h>
 #include <linux/vserver/inode.h>
-#include <linux/vserver/signal.h>
 #include <linux/vserver/dlimit.h>
 
 
-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 */
index 35b0c13..52a2296 100644 (file)
 #include <linux/filter.h>
 #include <linux/vs_socket.h>
 #include <linux/vs_limit.h>
+#include <linux/vs_context.h>
 
 #ifdef CONFIG_INET
 #include <net/tcp.h>
index 7d9f8ea..08a8f69 100644 (file)
@@ -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;
index 939931c..95cf7fe 100644 (file)
@@ -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;
index dc1bc35..4bb46b8 100644 (file)
@@ -31,6 +31,7 @@
 
 #include <linux/vs_limit.h>
 #include <linux/vs_socket.h>
+#include <linux/vs_context.h>
 
 #ifdef CONFIG_SYSCTL
 #define SYNC_INIT 0 /* let the user enable it */
index f067e8a..98114af 100644 (file)
@@ -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;
 }