From e28576f437e494f8636fbc811976f4f918270671 Mon Sep 17 00:00:00 2001 From: Mark Huang Date: Thu, 3 Jun 2004 22:32:18 +0000 Subject: [PATCH] Merge to VServer 1.9.0 --- .config | 12 + .config.cmd | 1 + .config.old | 1221 ++++++++++++-------------- Makefile | 2 +- arch/alpha/Kconfig | 2 + arch/alpha/kernel/ptrace.c | 2 + arch/alpha/kernel/systbls.S | 2 +- arch/arm/Kconfig | 2 + arch/arm/kernel/ptrace.c | 2 + arch/arm26/Kconfig | 2 + arch/arm26/kernel/ptrace.c | 2 + arch/cris/Kconfig | 2 + arch/h8300/Kconfig | 2 + arch/h8300/kernel/ptrace.c | 2 + arch/i386/Kconfig | 2 + arch/i386/kernel/entry.S | 2 +- arch/i386/kernel/ptrace.c | 2 + arch/i386/kernel/sys_i386.c | 14 +- arch/i386/mm/hugetlbpage.c | 9 +- arch/ia64/Kconfig | 2 + arch/ia64/ia32/binfmt_elf32.c | 11 +- arch/ia64/kernel/perfmon.c | 3 +- arch/ia64/kernel/ptrace.c | 3 + arch/ia64/mm/fault.c | 8 +- arch/ia64/mm/hugetlbpage.c | 9 +- arch/m68k/Kconfig | 2 + arch/m68k/atari/stram.c | 3 +- arch/m68k/kernel/ptrace.c | 2 + arch/m68knommu/Kconfig | 2 + arch/m68knommu/kernel/ptrace.c | 2 + arch/mips/Kconfig | 2 + arch/mips/kernel/irixelf.c | 3 +- arch/mips/kernel/linux32.c | 2 +- arch/mips/kernel/ptrace.c | 2 + arch/mips/kernel/syscall.c | 20 +- arch/mips/kernel/sysirix.c | 3 +- arch/parisc/Kconfig | 2 + arch/parisc/kernel/ptrace.c | 3 + arch/parisc/kernel/sys_parisc32.c | 1 + arch/ppc/Kconfig | 2 + arch/ppc/kernel/misc.S | 2 +- arch/ppc/kernel/ptrace.c | 2 + arch/ppc/kernel/syscalls.c | 14 +- arch/ppc64/Kconfig | 2 + arch/ppc64/kernel/misc.S | 2 +- arch/ppc64/kernel/ptrace.c | 2 + arch/ppc64/kernel/sys_ppc32.c | 12 +- arch/ppc64/mm/hugetlbpage.c | 9 +- arch/s390/Kconfig | 2 + arch/s390/kernel/compat_exec.c | 11 +- arch/s390/kernel/ptrace.c | 4 +- arch/s390/kernel/syscalls.S | 2 +- arch/sh/Kconfig | 2 + arch/sh/kernel/ptrace.c | 2 + arch/sh/mm/hugetlbpage.c | 9 +- arch/sparc/Kconfig | 2 + arch/sparc/kernel/ptrace.c | 4 + arch/sparc/kernel/sys_sparc.c | 4 +- arch/sparc/kernel/systbls.S | 2 +- arch/sparc64/Kconfig | 2 + arch/sparc64/kernel/binfmt_aout32.c | 3 +- arch/sparc64/kernel/ptrace.c | 4 + arch/sparc64/kernel/sys_sparc.c | 4 +- arch/sparc64/kernel/systbls.S | 4 +- arch/sparc64/mm/hugetlbpage.c | 9 +- arch/um/Kconfig | 2 + arch/um/kernel/ptrace.c | 2 + arch/um/kernel/syscall_kern.c | 14 +- arch/v850/Kconfig | 2 + arch/v850/kernel/ptrace.c | 2 + arch/x86_64/Kconfig | 2 + arch/x86_64/ia32/ia32_aout.c | 3 +- arch/x86_64/ia32/ia32_binfmt.c | 11 +- arch/x86_64/ia32/sys_ia32.c | 12 +- arch/x86_64/kernel/ptrace.c | 2 + arch/x86_64/kernel/sys_x86_64.c | 2 +- configs/kernel-2.6.6-i586-smp.config | 12 + configs/kernel-2.6.6-i586.config | 12 + configs/kernel-2.6.6-i686-smp.config | 12 + configs/kernel-2.6.6-i686.config | 12 + fs/attr.c | 20 + fs/binfmt_aout.c | 3 +- fs/binfmt_elf.c | 3 +- fs/binfmt_flat.c | 3 +- fs/binfmt_som.c | 3 +- fs/devpts/inode.c | 12 + fs/exec.c | 10 +- fs/ext2/ialloc.c | 3 +- fs/ext2/inode.c | 66 +- fs/ext2/super.c | 10 +- fs/ext3/ialloc.c | 3 +- fs/ext3/inode.c | 96 +- fs/ext3/ioctl.c | 33 + fs/ext3/super.c | 10 +- fs/fcntl.c | 4 + fs/file_table.c | 2 + fs/inode.c | 6 + fs/ioctl.c | 50 ++ fs/jfs/jfs_imap.c | 21 +- fs/namei.c | 18 +- fs/namespace.c | 50 +- fs/nfs/nfsroot.c | 2 +- fs/open.c | 15 +- fs/proc/array.c | 62 +- fs/proc/base.c | 56 +- fs/proc/generic.c | 18 +- fs/proc/inode.c | 2 + fs/proc/proc_misc.c | 4 + fs/proc/root.c | 4 + fs/reiserfs/inode.c | 68 +- fs/reiserfs/ioctl.c | 10 +- fs/xfs/xfs_dinode.h | 6 + fs/xfs/xfs_fs.h | 2 + fs/xfs/xfs_inode.c | 4 + fs/xfs/xfs_vnodeops.c | 4 + include/asm-alpha/unistd.h | 1 + include/asm-arm/tlb.h | 3 +- include/asm-arm26/tlb.h | 3 +- include/asm-generic/tlb.h | 4 +- include/asm-ia64/tlb.h | 3 +- include/asm-m68k/unistd.h | 4 +- include/asm-m68knommu/unistd.h | 4 +- include/asm-mips/unistd.h | 21 +- include/asm-parisc/unistd.h | 4 +- include/asm-ppc/unistd.h | 2 +- include/asm-ppc64/unistd.h | 2 +- include/asm-s390/unistd.h | 2 +- include/asm-sparc/unistd.h | 2 +- include/asm-sparc64/unistd.h | 2 +- include/linux/autoconf.h | 12 + include/linux/capability.h | 6 + include/linux/ext2_fs.h | 6 +- include/linux/ext3_fs.h | 9 +- include/linux/fs.h | 10 + include/linux/init_task.h | 4 + include/linux/ip.h | 1 + include/linux/ipc.h | 1 + include/linux/mm.h | 1 + include/linux/namespace.h | 1 + include/linux/net.h | 3 +- include/linux/proc_fs.h | 3 + include/linux/reiserfs_fs.h | 7 + include/linux/sched.h | 16 +- include/linux/sysctl.h | 1 + include/linux/types.h | 2 + include/net/af_unix.h | 27 +- include/net/route.h | 71 +- include/net/scm.h | 4 +- include/net/sock.h | 9 + include/net/tcp.h | 4 + ipc/msg.c | 7 +- ipc/sem.c | 7 +- ipc/shm.c | 7 +- ipc/util.c | 6 +- kernel/Makefile | 5 + kernel/exit.c | 8 + kernel/fork.c | 33 + kernel/pid.c | 3 +- kernel/printk.c | 5 +- kernel/sched.c | 65 +- kernel/signal.c | 3 + kernel/sys.c | 102 ++- kernel/sysctl.c | 10 + kernel/timer.c | 11 +- kernel/user.c | 23 +- mm/fremap.c | 9 +- mm/memory.c | 30 +- mm/mlock.c | 12 +- mm/mmap.c | 56 +- mm/mremap.c | 15 +- mm/oom_kill.c | 1 + mm/page_alloc.c | 2 + mm/rmap.c | 3 +- mm/swapfile.c | 5 +- net/core/dev.c | 6 + net/core/rtnetlink.c | 4 + net/core/sock.c | 18 +- net/ipv4/af_inet.c | 59 +- net/ipv4/devinet.c | 33 + net/ipv4/fib_hash.c | 4 +- net/ipv4/raw.c | 41 +- net/ipv4/tcp_ipv4.c | 116 ++- net/ipv4/tcp_minisocks.c | 11 + net/ipv4/udp.c | 41 +- net/socket.c | 39 +- net/unix/af_unix.c | 14 +- scripts/basic/.docproc.cmd | 11 +- scripts/basic/.fixdep.cmd | 11 +- scripts/basic/.split-include.cmd | 6 +- scripts/basic/docproc | Bin 19832 -> 20254 bytes scripts/basic/fixdep | Bin 15691 -> 15751 bytes scripts/basic/split-include | Bin 14592 -> 14876 bytes scripts/kconfig/.conf.o.cmd | 6 +- scripts/kconfig/.mconf.o.cmd | 15 +- scripts/kconfig/.zconf.tab.o.cmd | 12 +- scripts/kconfig/conf | Bin 20591 -> 20627 bytes scripts/kconfig/conf.o | Bin 10348 -> 9940 bytes scripts/kconfig/libkconfig.so | Bin 92510 -> 92727 bytes scripts/kconfig/mconf.o | Bin 20532 -> 20104 bytes scripts/kconfig/zconf.tab.o | Bin 95696 -> 94132 bytes security/commoncap.c | 2 +- 201 files changed, 2412 insertions(+), 992 deletions(-) diff --git a/.config b/.config index de7e3e791..323a7faf2 100644 --- a/.config +++ b/.config @@ -2296,6 +2296,18 @@ CONFIG_DEBUG_SPINLOCK_SLEEP=y CONFIG_X86_FIND_SMP_CONFIG=y CONFIG_X86_MPPARSE=y +# +# Linux VServer +# +CONFIG_VSERVER_LEGACY=y +CONFIG_PROC_SECURE=y +# CONFIG_VSERVER_HARDCPU is not set +# CONFIG_INOXID_NONE is not set +# CONFIG_INOXID_GID16 is not set +CONFIG_INOXID_GID24=y +# CONFIG_INOXID_GID32 is not set +# CONFIG_INOXID_MAGIC is not set + # # Security options # diff --git a/.config.cmd b/.config.cmd index 358c465ea..d5aa21909 100644 --- a/.config.cmd +++ b/.config.cmd @@ -3,6 +3,7 @@ deps_config := \ crypto/Kconfig \ security/selinux/Kconfig \ security/Kconfig \ + kernel/vserver/Kconfig \ arch/i386/oprofile/Kconfig \ fs/nls/Kconfig \ fs/partitions/Kconfig \ diff --git a/.config.old b/.config.old index a1d48d7b8..de7e3e791 100644 --- a/.config.old +++ b/.config.old @@ -1,12 +1,10 @@ # # Automatically generated make config: don't edit # +CONFIG_X86=y CONFIG_MMU=y CONFIG_UID16=y CONFIG_GENERIC_ISA_DMA=y -CONFIG_SMP=y -# CONFIG_HOTPLUG_CPU is not set -CONFIG_SCHED_SMT=y # # Code maturity level options @@ -20,9 +18,12 @@ CONFIG_STANDALONE=y # CONFIG_SWAP=y CONFIG_SYSVIPC=y +CONFIG_POSIX_MQUEUE=y CONFIG_BSD_PROCESS_ACCT=y CONFIG_SYSCTL=y +# CONFIG_AUDIT is not set CONFIG_LOG_BUF_SHIFT=17 +CONFIG_HOTPLUG=y # CONFIG_IKCONFIG is not set # CONFIG_EMBEDDED is not set CONFIG_KALLSYMS=y @@ -32,13 +33,8 @@ CONFIG_EPOLL=y CONFIG_IOSCHED_NOOP=y CONFIG_IOSCHED_AS=y CONFIG_IOSCHED_DEADLINE=y -# CONFIG_NUMA is not set -# CONFIG_PREEMPT is not set -# CONFIG_IRQBALANCE is not set -CONFIG_POSIX_MQUEUE=y -CONFIG_EDD=m -# CONFIG_SMBIOS is not set -CONFIG_IRQSTACKS=y +CONFIG_IOSCHED_CFQ=y +CONFIG_CC_OPTIMIZE_FOR_SIZE=y # # Loadable module support @@ -49,6 +45,93 @@ CONFIG_MODULE_UNLOAD=y CONFIG_OBSOLETE_MODPARM=y # CONFIG_MODVERSIONS is not set CONFIG_KMOD=y +CONFIG_STOP_MACHINE=y + +# +# Processor type and features +# +# CONFIG_X86_PC is not set +# CONFIG_X86_ELAN is not set +# CONFIG_X86_VOYAGER is not set +# CONFIG_X86_NUMAQ is not set +# CONFIG_X86_SUMMIT is not set +# CONFIG_X86_BIGSMP is not set +# CONFIG_X86_VISWS is not set +CONFIG_X86_GENERICARCH=y +# CONFIG_X86_ES7000 is not set +CONFIG_X86_CYCLONE_TIMER=y +# CONFIG_M386 is not set +# CONFIG_M486 is not set +# CONFIG_M586 is not set +# CONFIG_M586TSC is not set +# CONFIG_M586MMX is not set +CONFIG_M686=y +# CONFIG_MPENTIUMII is not set +# CONFIG_MPENTIUMIII is not set +# CONFIG_MPENTIUMM is not set +# CONFIG_MPENTIUM4 is not set +# CONFIG_MK6 is not set +# CONFIG_MK7 is not set +# CONFIG_MK8 is not set +# CONFIG_MCRUSOE is not set +# CONFIG_MWINCHIPC6 is not set +# CONFIG_MWINCHIP2 is not set +# CONFIG_MWINCHIP3D is not set +# CONFIG_MCYRIXIII is not set +# CONFIG_MVIAC3_2 is not set +CONFIG_X86_GENERIC=y +CONFIG_X86_CMPXCHG=y +CONFIG_X86_XADD=y +CONFIG_X86_L1_CACHE_SHIFT=7 +CONFIG_RWSEM_XCHGADD_ALGORITHM=y +CONFIG_X86_PPRO_FENCE=y +CONFIG_X86_WP_WORKS_OK=y +CONFIG_X86_INVLPG=y +CONFIG_X86_BSWAP=y +CONFIG_X86_POPAD_OK=y +CONFIG_X86_GOOD_APIC=y +CONFIG_X86_INTEL_USERCOPY=y +CONFIG_X86_USE_PPRO_CHECKSUM=y +CONFIG_X86_4G=y +CONFIG_X86_SWITCH_PAGETABLES=y +CONFIG_X86_4G_VM_LAYOUT=y +CONFIG_X86_UACCESS_INDIRECT=y +CONFIG_X86_HIGH_ENTRY=y +CONFIG_HPET_TIMER=y +CONFIG_HPET_EMULATE_RTC=y +CONFIG_SMP=y +CONFIG_NR_CPUS=32 +CONFIG_SCHED_SMT=y +# CONFIG_PREEMPT is not set +CONFIG_X86_LOCAL_APIC=y +CONFIG_X86_IO_APIC=y +CONFIG_X86_TSC=y +CONFIG_X86_MCE=y +# CONFIG_X86_MCE_NONFATAL is not set +CONFIG_X86_MCE_P4THERMAL=y +CONFIG_TOSHIBA=m +CONFIG_I8K=m +CONFIG_MICROCODE=m +CONFIG_X86_MSR=m +CONFIG_X86_CPUID=m + +# +# Firmware Drivers +# +CONFIG_EDD=m +# CONFIG_NOHIGHMEM is not set +# CONFIG_HIGHMEM4G is not set +CONFIG_HIGHMEM64G=y +CONFIG_HIGHMEM=y +CONFIG_X86_PAE=y +# CONFIG_NUMA is not set +CONFIG_HIGHPTE=y +# CONFIG_MATH_EMULATION is not set +CONFIG_MTRR=y +# CONFIG_EFI is not set +# CONFIG_IRQBALANCE is not set +CONFIG_HAVE_DEC_LOCK=y +CONFIG_REGPARM=y # # Power management options (ACPI, APM) @@ -64,6 +147,7 @@ CONFIG_ACPI=y CONFIG_ACPI_BOOT=y CONFIG_ACPI_INTERPRETER=y CONFIG_ACPI_SLEEP=y +CONFIG_ACPI_SLEEP_PROC_FS=y CONFIG_ACPI_AC=m CONFIG_ACPI_BATTERY=m CONFIG_ACPI_BUTTON=m @@ -78,7 +162,19 @@ CONFIG_ACPI_EC=y CONFIG_ACPI_POWER=y CONFIG_ACPI_PCI=y CONFIG_ACPI_SYSTEM=y -CONFIG_ACPI_NUMA=y +CONFIG_X86_PM_TIMER=y + +# +# APM (Advanced Power Management) BIOS Support +# +CONFIG_APM=y +# CONFIG_APM_IGNORE_USER_SUSPEND is not set +# CONFIG_APM_DO_ENABLE is not set +CONFIG_APM_CPU_IDLE=y +# CONFIG_APM_DISPLAY_BLANK is not set +CONFIG_APM_RTC_IS_GMT=y +# CONFIG_APM_ALLOW_INTS is not set +# CONFIG_APM_REAL_MODE_POWER_OFF is not set # # CPU Frequency scaling @@ -89,10 +185,29 @@ CONFIG_CPU_FREQ=y CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE=y CONFIG_CPU_FREQ_GOV_PERFORMANCE=y CONFIG_CPU_FREQ_GOV_POWERSAVE=m -CONFIG_CPU_FREQ_GOV_USERSPACE=m +CONFIG_CPU_FREQ_GOV_USERSPACE=y # CONFIG_CPU_FREQ_24_API is not set CONFIG_CPU_FREQ_TABLE=y +# +# CPUFreq processor drivers +# +CONFIG_X86_ACPI_CPUFREQ=m +# CONFIG_X86_ACPI_CPUFREQ_PROC_INTF is not set +CONFIG_X86_POWERNOW_K6=m +CONFIG_X86_POWERNOW_K7=y +CONFIG_X86_POWERNOW_K8=m +# CONFIG_X86_GX_SUSPMOD is not set +CONFIG_X86_SPEEDSTEP_CENTRINO=y +CONFIG_X86_SPEEDSTEP_CENTRINO_TABLE=y +CONFIG_X86_SPEEDSTEP_CENTRINO_ACPI=y +CONFIG_X86_SPEEDSTEP_ICH=y +CONFIG_X86_SPEEDSTEP_SMI=m +CONFIG_X86_P4_CLOCKMOD=m +CONFIG_X86_SPEEDSTEP_LIB=y +# CONFIG_X86_SPEEDSTEP_RELAXED_CAP_CHECK is not set +CONFIG_X86_LONGRUN=y +# CONFIG_X86_LONGHAUL is not set # # Bus options (PCI, PCMCIA, EISA, MCA, ISA) @@ -105,21 +220,20 @@ CONFIG_PCI_GOANY=y CONFIG_PCI_BIOS=y CONFIG_PCI_DIRECT=y CONFIG_PCI_MMCONFIG=y +CONFIG_PCI_USE_VECTOR=y CONFIG_PCI_LEGACY_PROC=y # CONFIG_PCI_NAMES is not set -CONFIG_PCI_USE_VECTOR=y CONFIG_ISA=y # CONFIG_EISA is not set # CONFIG_MCA is not set # CONFIG_SCx200 is not set -CONFIG_HOTPLUG=y # # PCMCIA/CardBus support # CONFIG_PCMCIA=m # CONFIG_PCMCIA_DEBUG is not set -CONFIG_YENTA=y +CONFIG_YENTA=m CONFIG_CARDBUS=y CONFIG_I82092=m CONFIG_I82365=m @@ -140,7 +254,6 @@ CONFIG_HOTPLUG_PCI_PCIE=m CONFIG_HOTPLUG_PCI_PCIE_POLL_EVENT_MODE=y CONFIG_HOTPLUG_PCI_SHPC=m CONFIG_HOTPLUG_PCI_SHPC_POLL_EVENT_MODE=y -# CONFIG_HOTPLUG_PCI_SHPC_PHPRM_LEGACY is not set # # Executable file formats @@ -157,6 +270,7 @@ CONFIG_BINFMT_MISC=m # Generic Driver Options # CONFIG_FW_LOADER=y +# CONFIG_DEBUG_DRIVER is not set # # Memory Technology Devices (MTD) @@ -281,21 +395,16 @@ CONFIG_BLK_DEV_UMEM=m CONFIG_BLK_DEV_LOOP=m CONFIG_BLK_DEV_CRYPTOLOOP=m CONFIG_BLK_DEV_NBD=m +CONFIG_BLK_DEV_CARMEL=m CONFIG_BLK_DEV_RAM=y CONFIG_BLK_DEV_RAM_SIZE=16384 CONFIG_BLK_DEV_INITRD=y -CONFIG_BLK_DEV_ATIIXP=y CONFIG_LBD=y -# CONFIG_DCSSBLK is not set - # # ATA/ATAPI/MFM/RLL support # CONFIG_IDE=y -CONFIG_IDE_GENERIC=y -# CONFIG_HPT34X_AUTODMA is not set - CONFIG_BLK_DEV_IDE=y # @@ -316,8 +425,8 @@ CONFIG_BLK_DEV_IDEFLOPPY=y # # IDE chipset support/bugfixes # +CONFIG_IDE_GENERIC=y # CONFIG_BLK_DEV_CMD640 is not set -# CONFIG_BLK_DEV_CMD640_ENHANCED is not set CONFIG_BLK_DEV_IDEPNP=y CONFIG_BLK_DEV_IDEPCI=y CONFIG_IDEPCI_SHARE_IRQ=y @@ -326,7 +435,6 @@ CONFIG_BLK_DEV_GENERIC=y # CONFIG_BLK_DEV_OPTI621 is not set CONFIG_BLK_DEV_RZ1000=y CONFIG_BLK_DEV_IDEDMA_PCI=y -# CONFIG_BLK_DEV_IDE_TCQ is not set # CONFIG_BLK_DEV_IDEDMA_FORCED is not set CONFIG_IDEDMA_PCI_AUTO=y # CONFIG_IDEDMA_ONLYDISK is not set @@ -335,12 +443,14 @@ CONFIG_BLK_DEV_AEC62XX=y CONFIG_BLK_DEV_ALI15X3=y # CONFIG_WDC_ALI15X3 is not set CONFIG_BLK_DEV_AMD74XX=y +CONFIG_BLK_DEV_ATIIXP=y CONFIG_BLK_DEV_CMD64X=y CONFIG_BLK_DEV_TRIFLEX=y CONFIG_BLK_DEV_CY82C693=y CONFIG_BLK_DEV_CS5520=y CONFIG_BLK_DEV_CS5530=y CONFIG_BLK_DEV_HPT34X=y +# CONFIG_HPT34X_AUTODMA is not set CONFIG_BLK_DEV_HPT366=y # CONFIG_BLK_DEV_SC1200 is not set CONFIG_BLK_DEV_PIIX=y @@ -355,11 +465,11 @@ CONFIG_BLK_DEV_SIS5513=y CONFIG_BLK_DEV_SLC90E66=y # CONFIG_BLK_DEV_TRM290 is not set CONFIG_BLK_DEV_VIA82CXXX=y +# CONFIG_IDE_ARM is not set # CONFIG_IDE_CHIPSETS is not set CONFIG_BLK_DEV_IDEDMA=y # CONFIG_IDEDMA_IVB is not set CONFIG_IDEDMA_AUTO=y -# CONFIG_DMA_NONPCI is not set # CONFIG_BLK_DEV_HD is not set # @@ -382,11 +492,14 @@ CONFIG_CHR_DEV_SG=m # Some SCSI devices (e.g. CD jukebox) support multiple LUNs # # CONFIG_SCSI_MULTI_LUN is not set -CONFIG_SCSI_REPORT_LUNS=y CONFIG_SCSI_CONSTANTS=y CONFIG_SCSI_LOGGING=y -CONFIG_SCSI_SPI_ATTRS=y -CONFIG_SCSI_FC_ATTRS=y + +# +# SCSI Transport Attributes +# +CONFIG_SCSI_SPI_ATTRS=m +CONFIG_SCSI_FC_ATTRS=m # # SCSI low-level drivers @@ -400,7 +513,6 @@ CONFIG_SCSI_AACRAID=m CONFIG_SCSI_AIC7XXX=m CONFIG_AIC7XXX_CMDS_PER_DEVICE=4 CONFIG_AIC7XXX_RESET_DELAY_MS=15000 -# CONFIG_AIC7XXX_PROBE_EISA_VL is not set # CONFIG_AIC7XXX_BUILD_FIRMWARE is not set # CONFIG_AIC7XXX_DEBUG_ENABLE is not set CONFIG_AIC7XXX_DEBUG_MASK=0 @@ -414,6 +526,7 @@ CONFIG_AIC79XX_RESET_DELAY_MS=15000 # CONFIG_AIC79XX_DEBUG_ENABLE is not set CONFIG_AIC79XX_DEBUG_MASK=0 # CONFIG_AIC79XX_REG_PRETTY_PRINT is not set +# CONFIG_SCSI_DPT_I2O is not set CONFIG_SCSI_ADVANSYS=m CONFIG_SCSI_IN2000=m CONFIG_SCSI_MEGARAID=m @@ -421,13 +534,11 @@ CONFIG_SCSI_SATA=y CONFIG_SCSI_SATA_SVW=m CONFIG_SCSI_ATA_PIIX=m CONFIG_SCSI_SATA_PROMISE=m -CONFIG_SCSI_SATA_VIA=m -CONFIG_BLK_DEV_CARMEL=m -CONFIG_SCSI_SATA_VITESSE=m +CONFIG_SCSI_SATA_SX4=m CONFIG_SCSI_SATA_SIL=m CONFIG_SCSI_SATA_SIS=m -CONFIG_SCSI_SATA_SX4=m - +CONFIG_SCSI_SATA_VIA=m +CONFIG_SCSI_SATA_VITESSE=m CONFIG_SCSI_BUSLOGIC=m # CONFIG_SCSI_OMIT_FLASHPOINT is not set # CONFIG_SCSI_CPQFCTS is not set @@ -451,21 +562,13 @@ CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=1 CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16 CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64 # CONFIG_SCSI_SYM53C8XX_IOMAPPED is not set +# CONFIG_SCSI_IPR is not set # CONFIG_SCSI_PAS16 is not set # CONFIG_SCSI_PSI240I is not set CONFIG_SCSI_QLOGIC_FAS=m CONFIG_SCSI_QLOGIC_ISP=m # CONFIG_SCSI_QLOGIC_FC is not set -# CONFIG_SCSI_QLOGIC_FC_FIRMWARE is not set CONFIG_SCSI_QLOGIC_1280=m -# CONFIG_SCSI_SYM53C416 is not set -# CONFIG_SCSI_DC395x is not set -# CONFIG_SCSI_T128 is not set -# CONFIG_SCSI_U14_34F is not set -# CONFIG_SCSI_ULTRASTOR is not set -# CONFIG_SCSI_NSP32 is not set -# CONFIG_SCSI_DEBUG is not set -CONFIG_SCSI_DC390T=m CONFIG_SCSI_QLA2XXX=m CONFIG_SCSI_QLA21XX=m CONFIG_SCSI_QLA22XX=m @@ -473,8 +576,14 @@ CONFIG_SCSI_QLA2300=m CONFIG_SCSI_QLA2322=m CONFIG_SCSI_QLA6312=m CONFIG_SCSI_QLA6322=m -# CONFIG_SCSI_IPR is not set -# CONFIG_SCSI_DPT_I2O is not set +# CONFIG_SCSI_SYM53C416 is not set +# CONFIG_SCSI_DC395x is not set +CONFIG_SCSI_DC390T=m +# CONFIG_SCSI_T128 is not set +# CONFIG_SCSI_U14_34F is not set +# CONFIG_SCSI_ULTRASTOR is not set +# CONFIG_SCSI_NSP32 is not set +# CONFIG_SCSI_DEBUG is not set # # PCMCIA SCSI adapter support @@ -485,7 +594,6 @@ CONFIG_PCMCIA_NINJA_SCSI=m CONFIG_PCMCIA_QLOGIC=m CONFIG_PCMCIA_SYM53C500=m - # # Old CD-ROM drivers (not SCSI, not IDE) # @@ -515,7 +623,7 @@ CONFIG_FUSION_CTL=m CONFIG_FUSION_LAN=m # -# IEEE 1394 (FireWire) support (EXPERIMENTAL) +# IEEE 1394 (FireWire) support # CONFIG_IEEE1394=m @@ -524,6 +632,7 @@ CONFIG_IEEE1394=m # # CONFIG_IEEE1394_VERBOSEDEBUG is not set CONFIG_IEEE1394_OUI_DB=y +# CONFIG_IEEE1394_EXTRA_CONFIG_ROMS is not set # # Device Drivers @@ -542,17 +651,15 @@ CONFIG_IEEE1394_DV1394=m CONFIG_IEEE1394_RAWIO=m CONFIG_IEEE1394_CMP=m CONFIG_IEEE1394_AMDTP=m -# CONFIG_IEEE1394_EXTRA_CONFIG_ROMS is not set # # I2O device support # CONFIG_I2O=m -CONFIG_I2O_PCI=m +CONFIG_I2O_CONFIG=m CONFIG_I2O_BLOCK=m CONFIG_I2O_SCSI=m CONFIG_I2O_PROC=m -CONFIG_I2O_CONFIG=y # # Networking support @@ -588,9 +695,6 @@ CONFIG_SYN_COOKIES=y CONFIG_INET_AH=m CONFIG_INET_ESP=m CONFIG_INET_IPCOMP=m -CONFIG_NETCONSOLE=m -# CONFIG_NETPOLL_RX is not set -# CONFIG_NETPOLL_TRAP is not set # # IP: Virtual Server Configuration @@ -598,10 +702,18 @@ CONFIG_NETCONSOLE=m CONFIG_IP_VS=m # CONFIG_IP_VS_DEBUG is not set CONFIG_IP_VS_TAB_BITS=12 + +# +# IPVS transport protocol load balancing support +# CONFIG_IP_VS_PROTO_TCP=y CONFIG_IP_VS_PROTO_UDP=y CONFIG_IP_VS_PROTO_ESP=y CONFIG_IP_VS_PROTO_AH=y + +# +# IPVS scheduler +# CONFIG_IP_VS_RR=m CONFIG_IP_VS_WRR=m CONFIG_IP_VS_LC=m @@ -612,17 +724,17 @@ CONFIG_IP_VS_DH=m CONFIG_IP_VS_SH=m CONFIG_IP_VS_SED=m CONFIG_IP_VS_NQ=m -CONFIG_IP_VS_FTP=m - +# +# IPVS application helper +# +CONFIG_IP_VS_FTP=m CONFIG_IPV6=m CONFIG_IPV6_PRIVACY=y CONFIG_INET6_AH=m CONFIG_INET6_ESP=m CONFIG_INET6_IPCOMP=m CONFIG_IPV6_TUNNEL=m -# CONFIG_DECNET is not set -CONFIG_BRIDGE=m CONFIG_NETFILTER=y # CONFIG_NETFILTER_DEBUG is not set CONFIG_BRIDGE_NETFILTER=y @@ -636,7 +748,6 @@ CONFIG_IP_NF_IRC=m CONFIG_IP_NF_TFTP=m CONFIG_IP_NF_AMANDA=m CONFIG_IP_NF_QUEUE=m -CONFIG_IP_NF_RAW=m CONFIG_IP_NF_IPTABLES=m CONFIG_IP_NF_MATCH_LIMIT=m CONFIG_IP_NF_MATCH_IPRANGE=m @@ -665,7 +776,6 @@ CONFIG_IP_NF_TARGET_MASQUERADE=m CONFIG_IP_NF_TARGET_REDIRECT=m CONFIG_IP_NF_TARGET_NETMAP=m CONFIG_IP_NF_TARGET_SAME=m -CONFIG_IP_NF_TARGET_NOTRACK=m CONFIG_IP_NF_NAT_LOCAL=y CONFIG_IP_NF_NAT_SNMP_BASIC=m CONFIG_IP_NF_NAT_IRC=m @@ -686,6 +796,8 @@ CONFIG_IP_NF_ARPFILTER=m CONFIG_IP_NF_ARP_MANGLE=m # CONFIG_IP_NF_COMPAT_IPCHAINS is not set # CONFIG_IP_NF_COMPAT_IPFWADM is not set +CONFIG_IP_NF_TARGET_NOTRACK=m +CONFIG_IP_NF_RAW=m # # IPv6: Netfilter Configuration @@ -746,7 +858,9 @@ CONFIG_IP_SCTP=m # CONFIG_SCTP_HMAC_SHA1 is not set CONFIG_SCTP_HMAC_MD5=y # CONFIG_ATM is not set +CONFIG_BRIDGE=m CONFIG_VLAN_8021Q=m +# CONFIG_DECNET is not set CONFIG_LLC=m # CONFIG_LLC2 is not set CONFIG_IPX=m @@ -774,6 +888,7 @@ CONFIG_WAN_ROUTER=m CONFIG_NET_SCHED=y CONFIG_NET_SCH_CBQ=m CONFIG_NET_SCH_HTB=m +CONFIG_NET_SCH_HFSC=m CONFIG_NET_SCH_CSZ=m CONFIG_NET_SCH_PRIO=m CONFIG_NET_SCH_RED=m @@ -782,10 +897,8 @@ CONFIG_NET_SCH_TEQL=m CONFIG_NET_SCH_TBF=m CONFIG_NET_SCH_GRED=m CONFIG_NET_SCH_DSMARK=m -CONFIG_NET_SCH_INGRESS=m -CONFIG_NET_SCH_HFSC=m CONFIG_NET_SCH_DELAY=m - +CONFIG_NET_SCH_INGRESS=m CONFIG_NET_QOS=y CONFIG_NET_ESTIMATOR=y CONFIG_NET_CLS=y @@ -802,87 +915,171 @@ CONFIG_NET_CLS_POLICE=y # Network testing # # CONFIG_NET_PKTGEN is not set -CONFIG_NETDEVICES=y +CONFIG_NETPOLL=y +# CONFIG_NETPOLL_RX is not set +# CONFIG_NETPOLL_TRAP is not set +CONFIG_NET_POLL_CONTROLLER=y +# CONFIG_HAMRADIO is not set +CONFIG_IRDA=m # -# ARCnet devices +# IrDA protocols # -# CONFIG_ARCNET is not set -CONFIG_DUMMY=m -CONFIG_BONDING=m -CONFIG_EQUALIZER=m -CONFIG_TUN=m -CONFIG_ETHERTAP=m -CONFIG_NET_SB1000=m +CONFIG_IRLAN=m +CONFIG_IRNET=m +CONFIG_IRCOMM=m +# CONFIG_IRDA_ULTRA is not set # -# Ethernet (10 or 100Mbit) +# IrDA options # -CONFIG_NET_ETHERNET=y -CONFIG_MII=m -CONFIG_HAPPYMEAL=m -CONFIG_SUNGEM=m -CONFIG_NET_VENDOR_3COM=y -CONFIG_EL1=m -CONFIG_EL2=m -CONFIG_ELPLUS=m -CONFIG_EL16=m -CONFIG_EL3=m -CONFIG_3C515=m -CONFIG_VORTEX=m -CONFIG_TYPHOON=m -CONFIG_LANCE=m -CONFIG_NET_VENDOR_SMC=y -CONFIG_WD80x3=m -CONFIG_ULTRA=m -CONFIG_SMC9194=m -CONFIG_NET_VENDOR_RACAL=y -CONFIG_NI52=m -CONFIG_NI65=m +CONFIG_IRDA_CACHE_LAST_LSAP=y +CONFIG_IRDA_FAST_RR=y +# CONFIG_IRDA_DEBUG is not set # -# Tulip family network device support +# Infrared-port device drivers # -CONFIG_NET_TULIP=y -CONFIG_DE2104X=m -CONFIG_TULIP=m -# CONFIG_TULIP_NAPI is not set -# CONFIG_TULIP_MWI is not set -CONFIG_TULIP_MMIO=y -# CONFIG_NI5010 is not set -# CONFIG_PCMCIA_XIRTULIP is not set -CONFIG_DE4X5=m -CONFIG_WINBOND_840=m -CONFIG_DM9102=m -CONFIG_PCMCIA_XIRCOM=m -# CONFIG_AT1700 is not set -CONFIG_DEPCA=m -CONFIG_HP100=m -# CONFIG_NET_ISA is not set -# CONFIG_EWRK3 is not set -CONFIG_E2100=m -CONFIG_EEXPRESS=m -CONFIG_EEXPRESS_PRO=m -CONFIG_HPLAN_PLUS=m -CONFIG_HPLAN=m -CONFIG_LP486E=m -CONFIG_ETH16I=m -CONFIG_NE2000=m -CONFIG_ZNET=m -CONFIG_SEEQ8005=m -CONFIG_LNE390=m -CONFIG_NE3210=m -CONFIG_ES3210=m -CONFIG_NET_PCI=y -CONFIG_PCNET32=m -CONFIG_AMD8111_ETH=m -CONFIG_AMD8111E_NAPI=y -CONFIG_ADAPTEC_STARFIRE=m -CONFIG_ADAPTEC_STARFIRE_NAPI=y -CONFIG_AC3200=m +# +# SIR device drivers +# +CONFIG_IRTTY_SIR=m + +# +# Dongle support +# +CONFIG_DONGLE=y +CONFIG_ESI_DONGLE=m +CONFIG_ACTISYS_DONGLE=m +CONFIG_TEKRAM_DONGLE=m +CONFIG_LITELINK_DONGLE=m +CONFIG_MA600_DONGLE=m +CONFIG_GIRBIL_DONGLE=m +CONFIG_MCP2120_DONGLE=m +CONFIG_OLD_BELKIN_DONGLE=m +CONFIG_ACT200L_DONGLE=m + +# +# Old SIR device drivers +# + +# +# Old Serial dongle support +# + +# +# FIR device drivers +# +CONFIG_USB_IRDA=m +CONFIG_SIGMATEL_FIR=m +CONFIG_NSC_FIR=m +# CONFIG_WINBOND_FIR is not set +# CONFIG_TOSHIBA_FIR is not set +# CONFIG_SMC_IRCC_FIR is not set +# CONFIG_ALI_FIR is not set +# CONFIG_VLSI_FIR is not set +# CONFIG_VIA_FIR is not set +CONFIG_BT=m +CONFIG_BT_L2CAP=m +CONFIG_BT_SCO=m +CONFIG_BT_RFCOMM=m +CONFIG_BT_RFCOMM_TTY=y +CONFIG_BT_BNEP=m +CONFIG_BT_BNEP_MC_FILTER=y +CONFIG_BT_BNEP_PROTO_FILTER=y +CONFIG_BT_CMTP=m + +# +# Bluetooth device drivers +# +CONFIG_BT_HCIUSB=m +CONFIG_BT_HCIUSB_SCO=y +CONFIG_BT_HCIUART=m +CONFIG_BT_HCIUART_H4=y +CONFIG_BT_HCIUART_BCSP=y +CONFIG_BT_HCIUART_BCSP_TXCRC=y +CONFIG_BT_HCIBCM203X=m +CONFIG_BT_HCIBFUSB=m +CONFIG_BT_HCIDTL1=m +CONFIG_BT_HCIBT3C=m +CONFIG_BT_HCIBLUECARD=m +CONFIG_BT_HCIBTUART=m +CONFIG_BT_HCIVHCI=m +CONFIG_TUX=m + +# +# TUX options +# +CONFIG_TUX_EXTCGI=y +# CONFIG_TUX_EXTENDED_LOG is not set +# CONFIG_TUX_DEBUG is not set +CONFIG_NETDEVICES=y +CONFIG_DUMMY=m +CONFIG_BONDING=m +CONFIG_EQUALIZER=m +CONFIG_TUN=m +CONFIG_ETHERTAP=m +CONFIG_NET_SB1000=m + +# +# ARCnet devices +# +# CONFIG_ARCNET is not set + +# +# Ethernet (10 or 100Mbit) +# +CONFIG_NET_ETHERNET=y +CONFIG_MII=m +CONFIG_HAPPYMEAL=m +CONFIG_SUNGEM=m +CONFIG_NET_VENDOR_3COM=y +CONFIG_EL1=m +CONFIG_EL2=m +CONFIG_ELPLUS=m +CONFIG_EL16=m +CONFIG_EL3=m +CONFIG_3C515=m +CONFIG_VORTEX=m +CONFIG_TYPHOON=m +CONFIG_LANCE=m +CONFIG_NET_VENDOR_SMC=y +CONFIG_WD80x3=m +CONFIG_ULTRA=m +CONFIG_SMC9194=m +CONFIG_NET_VENDOR_RACAL=y +CONFIG_NI52=m +CONFIG_NI65=m + +# +# Tulip family network device support +# +CONFIG_NET_TULIP=y +CONFIG_DE2104X=m +CONFIG_TULIP=m +# CONFIG_TULIP_MWI is not set +CONFIG_TULIP_MMIO=y +# CONFIG_TULIP_NAPI is not set +CONFIG_DE4X5=m +CONFIG_WINBOND_840=m +CONFIG_DM9102=m +CONFIG_PCMCIA_XIRCOM=m +# CONFIG_AT1700 is not set +CONFIG_DEPCA=m +CONFIG_HP100=m +# CONFIG_NET_ISA is not set +CONFIG_NE2000=m +CONFIG_NET_PCI=y +CONFIG_PCNET32=m +CONFIG_AMD8111_ETH=m +CONFIG_AMD8111E_NAPI=y +CONFIG_ADAPTEC_STARFIRE=m +CONFIG_ADAPTEC_STARFIRE_NAPI=y +CONFIG_AC3200=m CONFIG_APRICOT=m CONFIG_B44=m +CONFIG_FORCEDETH=m CONFIG_CS89x0=m CONFIG_DGRS=m CONFIG_EEPRO100=m @@ -890,7 +1087,6 @@ CONFIG_EEPRO100=m CONFIG_E100=m CONFIG_E100_NAPI=y CONFIG_FEALNX=m -CONFIG_FORCEDETH=m CONFIG_NATSEMI=m CONFIG_NE2K_PCI=m CONFIG_8139CP=m @@ -899,7 +1095,6 @@ CONFIG_8139TOO_PIO=y # CONFIG_8139TOO_TUNE_TWISTER is not set CONFIG_8139TOO_8129=y # CONFIG_8139_OLD_RX_RESET is not set -CONFIG_8139_RXBUF_IDX=2 CONFIG_SIS900=m CONFIG_EPIC100=m CONFIG_SUNDANCE=m @@ -913,7 +1108,7 @@ CONFIG_DE600=m CONFIG_DE620=m # -# Ethernet (1000 Mbit) +# Gigabit Ethernet (1000/10000 Mbit) # CONFIG_NET_GIGE=y CONFIG_ACENIC=m @@ -927,29 +1122,15 @@ CONFIG_YELLOWFIN=m CONFIG_R8169=m CONFIG_SK98LIN=m CONFIG_TIGON3=m - -# -# Ethernet (10000 Mbit) -# CONFIG_IXGB=m CONFIG_IXGB_NAPI=y CONFIG_S2IO=m CONFIG_S2IO_NAPI=y -CONFIG_FDDI=y -# CONFIG_DEFXX is not set -CONFIG_SKFP=m -# CONFIG_HIPPI is not set -CONFIG_PLIP=m -CONFIG_PPP=m -CONFIG_PPP_MULTILINK=y -CONFIG_PPP_FILTER=y -CONFIG_PPP_ASYNC=m -CONFIG_PPP_SYNC_TTY=m -CONFIG_PPP_DEFLATE=m -CONFIG_IPPP_FILTER=y -# CONFIG_PPP_BSDCOMP is not set -CONFIG_PPPOE=m -# CONFIG_SLIP is not set + +# +# Token Ring devices +# +# CONFIG_TR is not set # # Wireless LAN (non-hamradio) @@ -980,7 +1161,6 @@ CONFIG_TMD_HERMES=m CONFIG_PCI_HERMES=m CONFIG_ATMEL=m CONFIG_PCI_ATMEL=m -CONFIG_PRISM54=m # # Wireless 802.11b Pcmcia/Cardbus cards support @@ -989,21 +1169,12 @@ CONFIG_PCMCIA_HERMES=m CONFIG_AIRO_CS=m CONFIG_PCMCIA_ATMEL=m CONFIG_PCMCIA_WL3501=m -CONFIG_NET_WIRELESS=y # -# Token Ring devices -# -# CONFIG_TR is not set - -CONFIG_NET_FC=y -CONFIG_RCPCI=m -# CONFIG_SHAPER is not set - -# -# Wan interfaces +# Prism GT/Duette 802.11(a/b/g) PCI/Cardbus support # -# CONFIG_WAN is not set +CONFIG_PRISM54=m +CONFIG_NET_WIRELESS=y # # PCMCIA network device support @@ -1019,119 +1190,72 @@ CONFIG_PCMCIA_XIRC2PS=m CONFIG_PCMCIA_AXNET=m # -# Amateur Radio support -# -# CONFIG_HAMRADIO is not set - -# -# IrDA (infrared) support -# -CONFIG_IRDA=m -# CONFIG_IRDA_DEBUG is not set -CONFIG_IRLAN=m -CONFIG_IRNET=m -CONFIG_IRCOMM=m -# CONFIG_IRDA_ULTRA is not set -CONFIG_IRDA_CACHE_LAST_LSAP=y -CONFIG_IRDA_FAST_RR=y -CONFIG_IRTTY_SIR=m -CONFIG_DONGLE=y -CONFIG_ESI_DONGLE=m -CONFIG_ACTISYS_DONGLE=m -CONFIG_TEKRAM_DONGLE=m -CONFIG_IRPORT_SIR=m -# CONFIG_DONGLE_OLD is not set -CONFIG_LITELINK_DONGLE=m -CONFIG_MA600_DONGLE=m -CONFIG_GIRBIL_DONGLE=m -CONFIG_MCP2120_DONGLE=m -CONFIG_OLD_BELKIN_DONGLE=m -CONFIG_ACT200L_DONGLE=m - -CONFIG_USB_IRDA=m -CONFIG_NSC_FIR=m -CONFIG_SIGMATEL_FIR=m -# CONFIG_WINBOND_FIR is not set -# CONFIG_TOSHIBA_FIR is not set -# CONFIG_SMC_IRCC_FIR is not set -# CONFIG_ALI_FIR is not set -# CONFIG_VLSI_FIR is not set -# CONFIG_VIA_FIR is not set - - - -# -# Bluetooth support +# Wan interfaces # -CONFIG_BT=m -CONFIG_BT_L2CAP=m -CONFIG_BT_SCO=m -CONFIG_BT_CMTP=m -CONFIG_BT_RFCOMM=m -CONFIG_BT_RFCOMM_TTY=y -CONFIG_BT_BNEP=m -CONFIG_BT_BNEP_MC_FILTER=y -CONFIG_BT_BNEP_PROTO_FILTER=y +# CONFIG_WAN is not set +CONFIG_FDDI=y +# CONFIG_DEFXX is not set +CONFIG_SKFP=m +# CONFIG_HIPPI is not set +CONFIG_PLIP=m +CONFIG_PPP=m +CONFIG_PPP_MULTILINK=y +CONFIG_PPP_FILTER=y +CONFIG_PPP_ASYNC=m +CONFIG_PPP_SYNC_TTY=m +CONFIG_PPP_DEFLATE=m +# CONFIG_PPP_BSDCOMP is not set +CONFIG_PPPOE=m +# CONFIG_SLIP is not set +CONFIG_NET_FC=y +# CONFIG_SHAPER is not set +CONFIG_NETCONSOLE=m # -# Bluetooth device drivers +# ISDN subsystem # -CONFIG_BT_HCIUSB=m -CONFIG_BT_HCIUART=m -CONFIG_BT_HCIUART_H4=y -CONFIG_BT_HCIUART_BCSP=y -CONFIG_BT_HCIUART_BCSP_TXCRC=y -CONFIG_BT_HCIDTL1=m -CONFIG_BT_HCIBT3C=m -CONFIG_BT_HCIBLUECARD=m -CONFIG_BT_HCIBTUART=m -CONFIG_BT_HCIVHCI=m -CONFIG_BT_HCIUSB_SCO=y -CONFIG_BT_HCIBCM203X=m -CONFIG_BT_HCIBFUSB=m -CONFIG_BT_CMTP=m -CONFIG_BT_HCIUSB_SCO=m -CONFIG_BT_HCIBCM203X=m -CONFIG_BT_HCIBFUSB=m -CONFIG_USB_BLUETOOTH_TTY=m +CONFIG_ISDN=m # -# ISDN subsystem +# Old ISDN4Linux # - -CONFIG_ISDN=m CONFIG_ISDN_I4L=m -CONFIG_ISDN_DRV_AVMB1_B1ISA=m -CONFIG_ISDN_DRV_AVMB1_B1PCI=m -CONFIG_ISDN_DRV_AVMB1_T1ISA=m -CONFIG_ISDN_DRV_AVMB1_B1PCMCIA=m -CONFIG_ISDN_DRV_AVMB1_T1PCI=m -CONFIG_ISDN_DRV_AVMB1_C4=m - CONFIG_ISDN_PPP=y CONFIG_ISDN_PPP_VJ=y CONFIG_ISDN_MPP=y +CONFIG_IPPP_FILTER=y # CONFIG_ISDN_PPP_BSDCOMP is not set +CONFIG_ISDN_AUDIO=y CONFIG_ISDN_TTY_FAX=y -CONFIG_DE_AOC=y -CONFIG_ISDN_AUDIO=y +# +# ISDN feature submodules +# -CONFIG_ISDN_DRV_HISAX=m -CONFIG_ISDN_DRV_ICN=m -CONFIG_ISDN_DRV_PCBIT=m -CONFIG_ISDN_DRV_SC=m -CONFIG_ISDN_DRV_ACT2000=m -CONFIG_ISDN_DRV_TPAM=m -CONFIG_ISDN_DRV_AVMB1_B1PCIV4=y -CONFIG_ISDN_DRV_AVMB1_AVM_CS=m +# +# ISDN4Linux hardware drivers +# -CONFIG_ISDN_CAPI_CAPIDRV=m +# +# Passive cards +# +CONFIG_ISDN_DRV_HISAX=m +# +# D-channel protocol features +# CONFIG_HISAX_EURO=y +CONFIG_DE_AOC=y +CONFIG_HISAX_NO_SENDCOMPLETE=y +CONFIG_HISAX_NO_LLC=y +CONFIG_HISAX_NO_KEYPAD=y CONFIG_HISAX_1TR6=y CONFIG_HISAX_NI1=y CONFIG_HISAX_MAX_CARDS=8 + +# +# HiSax supported cards +# CONFIG_HISAX_16_0=y CONFIG_HISAX_16_3=y CONFIG_HISAX_TELESPCI=y @@ -1161,21 +1285,31 @@ CONFIG_HISAX_W6692=y CONFIG_HISAX_HFC_SX=y CONFIG_HISAX_ENTERNOW_PCI=y # CONFIG_HISAX_DEBUG is not set -CONFIG_HISAX_AVM_A1_CS=m -CONFIG_HISAX_ST5481=m -CONFIG_HISAX_HFCUSB=m -CONFIG_HISAX_FRITZ_PCIPNP=m -CONFIG_HISAX_NO_SENDCOMPLETE=y -CONFIG_HISAX_NO_LLC=y -CONFIG_HISAX_NO_KEYPAD=y + +# +# HiSax PCMCIA card service modules +# CONFIG_HISAX_SEDLBAUER_CS=m CONFIG_HISAX_ELSA_CS=m +CONFIG_HISAX_AVM_A1_CS=m CONFIG_HISAX_TELES_CS=m -CONFIG_ISDN_DRV_LOOP=m -CONFIG_HYSDN=m -CONFIG_HYSDN_CAPI=y +# +# HiSax sub driver modules +# +CONFIG_HISAX_ST5481=m +CONFIG_HISAX_HFCUSB=m +CONFIG_HISAX_FRITZ_PCIPNP=m +CONFIG_HISAX_HDLC=y +# +# Active cards +# +CONFIG_ISDN_DRV_ICN=m +CONFIG_ISDN_DRV_PCBIT=m +CONFIG_ISDN_DRV_SC=m +CONFIG_ISDN_DRV_ACT2000=m +CONFIG_ISDN_DRV_TPAM=m # # CAPI subsystem @@ -1186,6 +1320,7 @@ CONFIG_ISDN_CAPI_MIDDLEWARE=y CONFIG_ISDN_CAPI_CAPI20=m CONFIG_ISDN_CAPI_CAPIFS_BOOL=y CONFIG_ISDN_CAPI_CAPIFS=m +CONFIG_ISDN_CAPI_CAPIDRV=m # # CAPI hardware drivers @@ -1253,9 +1388,9 @@ CONFIG_SERIO_SERPORT=y CONFIG_INPUT_KEYBOARD=y CONFIG_KEYBOARD_ATKBD=y # CONFIG_KEYBOARD_SUNKBD is not set +# CONFIG_KEYBOARD_LKKBD is not set # CONFIG_KEYBOARD_XTKBD is not set # CONFIG_KEYBOARD_NEWTON is not set -# CONFIG_KEYBOARD_LKKBD is not set CONFIG_INPUT_MOUSE=y CONFIG_MOUSE_PS2=y CONFIG_MOUSE_SERIAL=m @@ -1303,12 +1438,11 @@ CONFIG_VT_CONSOLE=y CONFIG_HW_CONSOLE=y CONFIG_SERIAL_NONSTANDARD=y CONFIG_ROCKETPORT=m +# CONFIG_CYCLADES is not set CONFIG_SYNCLINK=m CONFIG_SYNCLINKMP=m CONFIG_N_HDLC=m CONFIG_STALDRV=y -# CONFIG_FTAPE is not set -CONFIG_IBM_ASM=m # # Serial drivers @@ -1324,20 +1458,6 @@ CONFIG_SERIAL_8250_SHARE_IRQ=y CONFIG_SERIAL_8250_DETECT_IRQ=y CONFIG_SERIAL_8250_MULTIPORT=y CONFIG_SERIAL_8250_RSA=y -# CONFIG_COMPUTONE is not set -# CONFIG_CYCLADES is not set -# CONFIG_DIGIEPCA is not set -# CONFIG_DIGI is not set -# CONFIG_ESPSERIAL is not set -# CONFIG_MOXA_INTELLIO is not set -# CONFIG_MOXA_SMARTIO is not set -# CONFIG_ISI is not set -# CONFIG_RISCOM8 is not set -# CONFIG_SPECIALIX is not set -# CONFIG_SX is not set -# CONFIG_RIO is not set -# CONFIG_STALLION is not set -# CONFIG_ISTALLION is not set # # Non-8250 serial port support @@ -1345,92 +1465,13 @@ CONFIG_SERIAL_8250_RSA=y CONFIG_SERIAL_CORE=y CONFIG_SERIAL_CORE_CONSOLE=y CONFIG_UNIX98_PTYS=y -CONFIG_UNIX98_PTY_COUNT=2048 # CONFIG_LEGACY_PTYS is not set +CONFIG_CRASH=m CONFIG_PRINTER=m CONFIG_LP_CONSOLE=y CONFIG_PPDEV=m CONFIG_TIPAR=m - -# -# I2C support -# -CONFIG_I2C=m -CONFIG_I2C_CHARDEV=m - -# -# I2C Algorithms -# -# CONFIG_I2C_DEBUG_ALGO is not set -CONFIG_I2C_ALGOBIT=m -CONFIG_I2C_ALGOPCF=m - -# -# I2C Hardware Bus support -# -CONFIG_I2C_ALI1535=m -CONFIG_I2C_ALI15X3=m -CONFIG_I2C_AMD756=m -CONFIG_I2C_AMD8111=m -CONFIG_I2C_I801=m -CONFIG_I2C_I810=m -CONFIG_I2C_ISA=m -CONFIG_I2C_NFORCE2=m -CONFIG_I2C_PIIX4=m -CONFIG_I2C_PROSAVAGE=m -CONFIG_I2C_SAVAGE4=m -# CONFIG_SCx200_ACB is not set -CONFIG_I2C_SIS5595=m -CONFIG_I2C_SIS630=m -CONFIG_I2C_SIS96X=m -CONFIG_I2C_VIA=m -CONFIG_I2C_VIAPRO=m -CONFIG_I2C_VOODOO3=m -# CONFIG_I2C_ELEKTOR is not set -CONFIG_I2C_PARPORT=m -CONFIG_I2C_PARPORT_LIGHT=m -# CONFIG_I2C_DEBUG_CORE is not set -# CONFIG_I2C_DEBUG_BUS is not set -# CONFIG_I2C_DEBUG_CHIP is not set -# CONFIG_I2C_PARPORT is not set -CONFIG_I2C_ALI1563=m -# CONFIG_I2C_PARPORT_LIGHT is not set - - - -# -# I2C Hardware Sensors Chip support -# -CONFIG_I2C_SENSOR=m -CONFIG_SENSORS_ADM1021=m -CONFIG_SENSORS_EEPROM=m -CONFIG_SENSORS_IT87=m -CONFIG_SENSORS_LM75=m -CONFIG_SENSORS_LM78=m -CONFIG_SENSORS_LM80=m -CONFIG_SENSORS_LM83=m -CONFIG_SENSORS_LM85=m -CONFIG_SENSORS_VIA686A=m -CONFIG_SENSORS_W83781D=m -CONFIG_SENSORS_ASB100=m -CONFIG_SENSORS_LM90=m -CONFIG_SENSORS_W83L785TS=m -CONFIG_SENSORS_FSCHER=m -CONFIG_SENSORS_GL518SM=m -CONFIG_SENSORS_DS1621=m -CONFIG_SENSORS_W83627HF=m -CONFIG_SENSORS_PCF8574=m -CONFIG_SENSORS_PCF8591=m -CONFIG_SENSORS_RTC8564=m -CONFIG_SENSORS_MAX1619=m - - -# -# Mice -# -CONFIG_BUSMOUSE=m # CONFIG_QIC02_TAPE is not set -CONFIG_CRASH=m # # IPMI @@ -1438,43 +1479,55 @@ CONFIG_CRASH=m CONFIG_IPMI_HANDLER=m # CONFIG_IPMI_PANIC_EVENT is not set CONFIG_IPMI_DEVICE_INTERFACE=m -CONFIG_IPMI_KCS=m -CONFIG_IPMI_WATCHDOG=m CONFIG_IPMI_SI=m +CONFIG_IPMI_WATCHDOG=m # # Watchdog Cards # CONFIG_WATCHDOG=y # CONFIG_WATCHDOG_NOWAYOUT is not set + +# +# Watchdog Device Drivers +# CONFIG_SOFT_WATCHDOG=m -CONFIG_WDT=m -# CONFIG_WDT_501 is not set -CONFIG_WDTPCI=m -CONFIG_WDT_501_PCI=y -CONFIG_PCWATCHDOG=m CONFIG_ACQUIRE_WDT=m CONFIG_ADVANTECH_WDT=m +CONFIG_ALIM1535_WDT=m +CONFIG_ALIM7101_WDT=m +CONFIG_SC520_WDT=m CONFIG_EUROTECH_WDT=m CONFIG_IB700_WDT=m +CONFIG_WAFER_WDT=m CONFIG_I8XX_TCO=m -# CONFIG_MIXCOMWD is not set +CONFIG_SC1200_WDT=m # CONFIG_SCx200_WDT is not set # CONFIG_60XX_WDT is not set -CONFIG_W83877F_WDT=m +CONFIG_CPU5_WDT=m CONFIG_W83627HF_WDT=m +CONFIG_W83877F_WDT=m CONFIG_MACHZ_WDT=m -CONFIG_SC520_WDT=m -CONFIG_AMD7XX_TCO=m -CONFIG_ALIM7101_WDT=m -CONFIG_ALIM1535_WDT=m -CONFIG_SC1200_WDT=m -CONFIG_WAFER_WDT=m -CONFIG_CPU5_WDT=m -CONFIG_PCIPCWATCHDOG=m -CONFIG_USBPCWATCHDOG=m +# +# ISA-based Watchdog Cards +# +CONFIG_PCWATCHDOG=m +# CONFIG_MIXCOMWD is not set +CONFIG_WDT=m +# CONFIG_WDT_501 is not set + +# +# PCI-based Watchdog Cards +# +CONFIG_PCIPCWATCHDOG=m +CONFIG_WDTPCI=m +CONFIG_WDT_501_PCI=y +# +# USB-based Watchdog Cards +# +CONFIG_USBPCWATCHDOG=m CONFIG_HW_RANDOM=m CONFIG_NVRAM=m CONFIG_RTC=y @@ -1508,18 +1561,89 @@ CONFIG_DRM_I830=m CONFIG_DRM_MGA=m CONFIG_DRM_SIS=m +# +# PCMCIA character devices +# +CONFIG_SYNCLINK_CS=m +CONFIG_MWAVE=m +# CONFIG_RAW_DRIVER is not set +CONFIG_HANGCHECK_TIMER=m + +# +# I2C support +# +CONFIG_I2C=m +CONFIG_I2C_CHARDEV=m + +# +# I2C Algorithms +# +CONFIG_I2C_ALGOBIT=m +CONFIG_I2C_ALGOPCF=m + +# +# I2C Hardware Bus support +# +CONFIG_I2C_ALI1535=m +CONFIG_I2C_ALI1563=m +CONFIG_I2C_ALI15X3=m +CONFIG_I2C_AMD756=m +CONFIG_I2C_AMD8111=m +CONFIG_I2C_I801=m +CONFIG_I2C_I810=m +CONFIG_I2C_ISA=m +CONFIG_I2C_NFORCE2=m +# CONFIG_I2C_PARPORT is not set +# CONFIG_I2C_PARPORT_LIGHT is not set +CONFIG_I2C_PIIX4=m +CONFIG_I2C_PROSAVAGE=m +CONFIG_I2C_SAVAGE4=m +# CONFIG_SCx200_ACB is not set +CONFIG_I2C_SIS5595=m +CONFIG_I2C_SIS630=m +CONFIG_I2C_SIS96X=m +CONFIG_I2C_VIA=m +CONFIG_I2C_VIAPRO=m +CONFIG_I2C_VOODOO3=m + +# +# Hardware Sensors Chip support +# +CONFIG_I2C_SENSOR=m +CONFIG_SENSORS_ADM1021=m +CONFIG_SENSORS_ASB100=m +CONFIG_SENSORS_DS1621=m +CONFIG_SENSORS_FSCHER=m +CONFIG_SENSORS_GL518SM=m +CONFIG_SENSORS_IT87=m +CONFIG_SENSORS_LM75=m +CONFIG_SENSORS_LM78=m +CONFIG_SENSORS_LM80=m +CONFIG_SENSORS_LM83=m +CONFIG_SENSORS_LM85=m +CONFIG_SENSORS_LM90=m +CONFIG_SENSORS_MAX1619=m +CONFIG_SENSORS_VIA686A=m +CONFIG_SENSORS_W83781D=m +CONFIG_SENSORS_W83L785TS=m +CONFIG_SENSORS_W83627HF=m # -# PCMCIA character devices +# Other I2C Chip support # -CONFIG_SYNCLINK_CS=m - - +CONFIG_SENSORS_EEPROM=m +CONFIG_SENSORS_PCF8574=m +CONFIG_SENSORS_PCF8591=m +CONFIG_SENSORS_RTC8564=m +# CONFIG_I2C_DEBUG_CORE is not set +# CONFIG_I2C_DEBUG_ALGO is not set +# CONFIG_I2C_DEBUG_BUS is not set +# CONFIG_I2C_DEBUG_CHIP is not set -CONFIG_MWAVE=m -# CONFIG_RAW_DRIVER is not set -CONFIG_MAX_RAW_DEVS=8192 -CONFIG_HANGCHECK_TIMER=m +# +# Misc devices +# +CONFIG_IBM_ASM=m # # Multimedia devices @@ -1541,24 +1665,22 @@ CONFIG_VIDEO_W9966=m CONFIG_VIDEO_CPIA=m CONFIG_VIDEO_CPIA_PP=m CONFIG_VIDEO_CPIA_USB=m +CONFIG_VIDEO_SAA5246A=m CONFIG_VIDEO_SAA5249=m CONFIG_TUNER_3036=m CONFIG_VIDEO_STRADIS=m CONFIG_VIDEO_ZORAN=m -CONFIG_VIDEO_ZORAN=m CONFIG_VIDEO_ZORAN_BUZ=m CONFIG_VIDEO_ZORAN_DC10=m CONFIG_VIDEO_ZORAN_DC30=m CONFIG_VIDEO_ZORAN_LML33=m CONFIG_VIDEO_ZORAN_LML33R10=m -CONFIG_VIDEO_MEYE=m CONFIG_VIDEO_SAA7134=m CONFIG_VIDEO_MXB=m CONFIG_VIDEO_DPC=m CONFIG_VIDEO_HEXIUM_ORION=m CONFIG_VIDEO_HEXIUM_GEMINI=m CONFIG_VIDEO_CX88=m -CONFIG_VIDEO_SAA5246A=m # # Radio Adapters @@ -1571,8 +1693,6 @@ CONFIG_RADIO_GEMTEK=m CONFIG_RADIO_GEMTEK_PCI=m CONFIG_RADIO_MAXIRADIO=m CONFIG_RADIO_MAESTRO=m -CONFIG_RADIO_MIROPCM20=m -CONFIG_RADIO_MIROPCM20_RDS=m CONFIG_RADIO_SF16FMI=m CONFIG_RADIO_SF16FMR2=m CONFIG_RADIO_TERRATEC=m @@ -1581,70 +1701,31 @@ CONFIG_RADIO_TYPHOON=m CONFIG_RADIO_TYPHOON_PROC_FS=y CONFIG_RADIO_ZOLTRIX=m - # # Digital Video Broadcasting Devices # # CONFIG_DVB is not set -CONFIG_DVB_CORE=m - -# -# Supported Frontend Modules -# -CONFIG_DVB_STV0299=m -# CONFIG_DVB_SP887X is not set -# CONFIG_DVB_ALPS_TDLB7 is not set -CONFIG_DVB_ALPS_TDMB7=m -CONFIG_DVB_ATMEL_AT76C651=m -CONFIG_DVB_CX24110=m -CONFIG_DVB_GRUNDIG_29504_491=m -CONFIG_DVB_GRUNDIG_29504_401=m -CONFIG_DVB_MT312=m -CONFIG_DVB_VES1820=m -CONFIG_DVB_VES1X93=m -CONFIG_DVB_TWINHAN_DST=m -CONFIG_DVB_TTUSB_DEC=m -CONFIG_DVB_BT8XX=m -# CONFIG_DVB_TDA1004X is not set -CONFIG_DVB_NXT6000=m - -# -# Supported SAA7146 based PCI Adapters -# -CONFIG_DVB_AV7110=m -CONFIG_DVB_AV7110_OSD=y -# CONFIG_DVB_AV7110_FIRMWARE is not set -CONFIG_DVB_BUDGET=m -CONFIG_DVB_BUDGET_CI=m -CONFIG_DVB_BUDGET_AV=m -CONFIG_DVB_BUDGET_PATCH=m - -# -# Supported USB Adapters -# -CONFIG_DVB_TTUSB_BUDGET=m - -# -# Supported FlexCopII (B2C2) Adapters -# -CONFIG_DVB_B2C2_SKYSTAR=m CONFIG_VIDEO_SAA7146=m CONFIG_VIDEO_SAA7146_VV=m CONFIG_VIDEO_VIDEOBUF=m CONFIG_VIDEO_TUNER=m CONFIG_VIDEO_BUF=m CONFIG_VIDEO_BTCX=m +CONFIG_VIDEO_IR=m # # Graphics support # CONFIG_FB=y +# CONFIG_FB_PM2 is not set # CONFIG_FB_CYBER2000 is not set +# CONFIG_FB_ASILIANT is not set # CONFIG_FB_IMSTT is not set CONFIG_FB_VGA16=m CONFIG_FB_VESA=y CONFIG_VIDEO_SELECT=y CONFIG_FB_HGA=m +CONFIG_FB_HGA_ACCEL=y CONFIG_FB_RIVA=m CONFIG_FB_I810=m CONFIG_FB_I810_GTF=y @@ -1656,30 +1737,24 @@ CONFIG_FB_MATROX_G100=y CONFIG_FB_MATROX_I2C=m CONFIG_FB_MATROX_MAVEN=m CONFIG_FB_MATROX_MULTIHEAD=y -CONFIG_FB_RADEON=m -# CONFIG_FB_RADEON_DEBUG is not set # CONFIG_FB_RADEON_OLD is not set +CONFIG_FB_RADEON=m CONFIG_FB_RADEON_I2C=y +# CONFIG_FB_RADEON_DEBUG is not set CONFIG_FB_ATY128=m CONFIG_FB_ATY=m CONFIG_FB_ATY_CT=y CONFIG_FB_ATY_GX=y # CONFIG_FB_ATY_XL_INIT is not set # CONFIG_FB_SIS is not set -CONFIG_FB_SIS_300=y -CONFIG_FB_SIS_315=y CONFIG_FB_NEOMAGIC=m +CONFIG_FB_KYRO=m CONFIG_FB_3DFX=m +CONFIG_FB_3DFX_ACCEL=y CONFIG_FB_VOODOO1=m CONFIG_FB_TRIDENT=m -# CONFIG_FB_VIRTUAL is not set -CONFIG_FB_KYRO=m -# CONFIG_FB_PM2 is not set -# CONFIG_FB_PM2_FIFO_DISCONNECT is not set -# CONFIG_FB_ASILIANT is not set -CONFIG_FB_HGA_ACCEL=y -CONFIG_FB_3DFX_ACCEL=y CONFIG_FB_TRIDENT_ACCEL=y +# CONFIG_FB_VIRTUAL is not set # # Console display driver support @@ -1688,8 +1763,10 @@ CONFIG_VGA_CONSOLE=y CONFIG_MDA_CONSOLE=m CONFIG_DUMMY_CONSOLE=y CONFIG_FRAMEBUFFER_CONSOLE=y +CONFIG_PCI_CONSOLE=y # CONFIG_FONTS is not set - +CONFIG_FONT_8x8=y +CONFIG_FONT_8x16=y # # Logo configuration @@ -1708,6 +1785,10 @@ CONFIG_SOUND=m # Advanced Linux Sound Architecture # CONFIG_SND=m +CONFIG_SND_TIMER=m +CONFIG_SND_PCM=m +CONFIG_SND_HWDEP=m +CONFIG_SND_RAWMIDI=m CONFIG_SND_SEQUENCER=m CONFIG_SND_SEQ_DUMMY=m CONFIG_SND_OSSEMUL=y @@ -1717,11 +1798,14 @@ CONFIG_SND_SEQUENCER_OSS=y CONFIG_SND_RTCTIMER=m # CONFIG_SND_VERBOSE_PRINTK is not set # CONFIG_SND_DEBUG is not set -CONFIG_SND_BIT32_EMUL=y # # Generic devices # +CONFIG_SND_MPU401_UART=m +CONFIG_SND_OPL3_LIB=m +CONFIG_SND_OPL4_LIB=m +CONFIG_SND_VX_LIB=m CONFIG_SND_DUMMY=m CONFIG_SND_VIRMIDI=m CONFIG_SND_MTPAV=m @@ -1763,13 +1847,20 @@ CONFIG_SND_SSCAPE=m # # PCI devices # +CONFIG_SND_AC97_CODEC=m CONFIG_SND_ALI5451=m +CONFIG_SND_ATIIXP=m +CONFIG_SND_AU8810=m +CONFIG_SND_AU8820=m +CONFIG_SND_AU8830=m CONFIG_SND_AZT3328=m +CONFIG_SND_BT87X=m CONFIG_SND_CS46XX=m CONFIG_SND_CS46XX_NEW_DSP=y CONFIG_SND_CS4281=m CONFIG_SND_EMU10K1=m CONFIG_SND_KORG1212=m +CONFIG_SND_MIXART=m CONFIG_SND_NM256=m CONFIG_SND_RME32=m CONFIG_SND_RME96=m @@ -1785,22 +1876,14 @@ CONFIG_SND_ES1938=m CONFIG_SND_ES1968=m CONFIG_SND_MAESTRO3=m CONFIG_SND_FM801=m +CONFIG_SND_FM801_TEA575X=m CONFIG_SND_ICE1712=m CONFIG_SND_ICE1724=m CONFIG_SND_INTEL8X0=m +CONFIG_SND_INTEL8X0M=m CONFIG_SND_SONICVIBES=m CONFIG_SND_VIA82XX=m CONFIG_SND_VX222=m -CONFIG_SND_BT87X=m -CONFIG_SND_ATIIXP=m -CONFIG_SND_AU8810=m -CONFIG_SND_AU8820=m -CONFIG_SND_AU8830=m -CONFIG_SND_MIXART=m -CONFIG_SND_FM801_TEA575X=m -CONFIG_SND_INTEL8X0M=m -CONFIG_SND_PDAUDIOCF=m - # # ALSA USB devices @@ -1812,13 +1895,12 @@ CONFIG_SND_USB_AUDIO=m # # CONFIG_SND_VXPOCKET is not set # CONFIG_SND_VXP440 is not set +CONFIG_SND_PDAUDIOCF=m # # Open Sound System # # CONFIG_SOUND_PRIME is not set -# CONFIG_SOUND_BT878 is not set -# CONFIG_SOUND_CMPCI is not set # # USB support @@ -1874,17 +1956,14 @@ CONFIG_HID_PID=y CONFIG_LOGITECH_FF=y CONFIG_THRUSTMASTER_FF=y CONFIG_USB_HIDDEV=y - -# -# USB HID Boot Protocol drivers -# -# CONFIG_USB_KBD is not set -# CONFIG_USB_MOUSE is not set CONFIG_USB_AIPTEK=m CONFIG_USB_WACOM=m CONFIG_USB_KBTAB=m CONFIG_USB_POWERMATE=m +CONFIG_USB_MTOUCH=m +CONFIG_USB_EGALAX=m CONFIG_USB_XPAD=m +CONFIG_USB_ATI_REMOTE=m # # USB Imaging devices @@ -1902,9 +1981,9 @@ CONFIG_USB_DSBR=m CONFIG_USB_IBMCAM=m CONFIG_USB_KONICAWC=m CONFIG_USB_OV511=m -CONFIG_USB_PWC=m CONFIG_USB_SE401=m CONFIG_USB_STV680=m +CONFIG_USB_W9968CF=m # # USB Network adaptors @@ -1918,6 +1997,7 @@ CONFIG_USB_USBNET=m # # USB Host-to-Host Cables # +CONFIG_USB_ALI_M5632=y CONFIG_USB_AN2720=y CONFIG_USB_BELKIN=y CONFIG_USB_GENESYS=y @@ -1979,40 +2059,27 @@ CONFIG_USB_SERIAL_SAFE_PADDED=y CONFIG_USB_SERIAL_CYBERJACK=m CONFIG_USB_SERIAL_XIRCOM=m CONFIG_USB_SERIAL_OMNINET=m -CONFIG_USB_SERIAL_WHITEHEAT=m CONFIG_USB_EZUSB=y -CONFIG_USB_EMI62=m -CONFIG_USB_LED=m -CONFIG_USB_G_SERIAL=m - # # USB Miscellaneous drivers # +CONFIG_USB_EMI62=m # CONFIG_USB_EMI26 is not set CONFIG_USB_TIGL=m CONFIG_USB_AUERSWALD=m CONFIG_USB_RIO500=m -CONFIG_USB_BRLVGER=m -CONFIG_USB_LCD=m -CONFIG_USB_TEST=m -# CONFIG_USB_GADGET is not set -# CONFIG_USB_GADGET_PXA2XX is not set -# CONFIG_USB_GADGET_GOKU is not set -# CONFIG_USB_GADGET_SA1100 is not set -CONFIG_USB_ZERO=m -CONFIG_USB_ETH=m -CONFIG_USB_GADGETFS=m -CONFIG_USB_W9968CF=m CONFIG_USB_LEGOTOWER=m -CONFIG_USB_FILE_STORAGE=m -# CONFIG_USB_FILE_STORAGE_TEST is not set -CONFIG_USB_MTOUCH=m -CONFIG_USB_ATI_REMOTE=m -CONFIG_USB_ALI_M5632=y +CONFIG_USB_LCD=m +CONFIG_USB_LED=m # CONFIG_USB_CYTHERM is not set -CONFIG_USB_EGALAX=m CONFIG_USB_PHIDGETSERVO=m +CONFIG_USB_TEST=m + +# +# USB Gadget Support +# +# CONFIG_USB_GADGET is not set # # File systems @@ -2035,14 +2102,15 @@ CONFIG_REISERFS_FS_XATTR=y CONFIG_REISERFS_FS_POSIX_ACL=y CONFIG_REISERFS_FS_SECURITY=y CONFIG_JFS_FS=m +CONFIG_JFS_POSIX_ACL=y # CONFIG_JFS_DEBUG is not set # CONFIG_JFS_STATISTICS is not set -CONFIG_JFS_POSIX_ACL=y +CONFIG_FS_POSIX_ACL=y CONFIG_XFS_FS=m # CONFIG_XFS_RT is not set CONFIG_XFS_QUOTA=y -CONFIG_XFS_POSIX_ACL=y CONFIG_XFS_SECURITY=y +CONFIG_XFS_POSIX_ACL=y CONFIG_MINIX_FS=m CONFIG_ROMFS_FS=m CONFIG_QUOTA=y @@ -2074,6 +2142,7 @@ CONFIG_VFAT_FS=m # CONFIG_PROC_FS=y CONFIG_PROC_KCORE=y +CONFIG_SYSFS=y # CONFIG_DEVFS_FS is not set CONFIG_DEVPTS_FS_XATTR=y CONFIG_DEVPTS_FS_SECURITY=y @@ -2085,9 +2154,8 @@ CONFIG_RAMFS=y # # Miscellaneous filesystems # -# CONFIG_ADFS_FS is not seta +# CONFIG_ADFS_FS is not set CONFIG_AFFS_FS=m -# uses sleepon and needs a major update CONFIG_HFS_FS=m CONFIG_HFSPLUS_FS=m CONFIG_BEFS_FS=m @@ -2138,9 +2206,7 @@ CONFIG_NCPFS_SMALLDOS=y CONFIG_NCPFS_NLS=y CONFIG_NCPFS_EXTRAS=y # CONFIG_CODA_FS is not set -# CONFIG_INTERMEZZO_FS is not set # CONFIG_AFS_FS is not set -# CONFIG_RXRPC is not set # # Partition Types @@ -2162,11 +2228,11 @@ CONFIG_SGI_PARTITION=y # CONFIG_ULTRIX_PARTITION is not set CONFIG_SUN_PARTITION=y CONFIG_EFI_PARTITION=y -CONFIG_NLS=y # # Native Language Support # +CONFIG_NLS=y CONFIG_NLS_DEFAULT="utf8" CONFIG_NLS_CODEPAGE_437=m CONFIG_NLS_CODEPAGE_737=m @@ -2212,20 +2278,13 @@ CONFIG_NLS_UTF8=m CONFIG_PROFILING=y CONFIG_OPROFILE=m -# -# Tux -# -CONFIG_TUX=m -CONFIG_TUX_EXTCGI=y -# CONFIG_TUX_EXTENDED_LOG is not set -# CONFIG_TUX_DEBUG is not set - - # # Kernel hacking # CONFIG_DEBUG_KERNEL=y +CONFIG_EARLY_PRINTK=y CONFIG_DEBUG_STACKOVERFLOW=y +# CONFIG_DEBUG_STACK_USAGE is not set # CONFIG_DEBUG_SLAB is not set CONFIG_MAGIC_SYSRQ=y # CONFIG_DEBUG_SPINLOCK is not set @@ -2234,10 +2293,8 @@ CONFIG_MAGIC_SYSRQ=y CONFIG_DEBUG_INFO=y CONFIG_DEBUG_SPINLOCK_SLEEP=y # CONFIG_FRAME_POINTER is not set -CONFIG_CC_OPTIMIZE_FOR_SIZE=y -# CONFIG_DEBUG_STACK_USAGE is not set -# CONFIG_DEBUG_DRIVER is not set - +CONFIG_X86_FIND_SMP_CONFIG=y +CONFIG_X86_MPPARSE=y # # Security options @@ -2251,8 +2308,6 @@ CONFIG_SECURITY_SELINUX_BOOTPARAM=y CONFIG_SECURITY_SELINUX_DISABLE=y CONFIG_SECURITY_SELINUX_DEVELOP=y # CONFIG_SECURITY_SELINUX_MLS is not set -# CONFIG_AUDIT is not set -CONFIG_AUDITSYSCALL=y # # Cryptographic options @@ -2261,7 +2316,7 @@ CONFIG_CRYPTO=y CONFIG_CRYPTO_HMAC=y CONFIG_CRYPTO_NULL=m CONFIG_CRYPTO_MD4=m -CONFIG_CRYPTO_MD5=m +CONFIG_CRYPTO_MD5=y CONFIG_CRYPTO_SHA1=m CONFIG_CRYPTO_SHA256=m CONFIG_CRYPTO_SHA512=m @@ -2272,144 +2327,22 @@ CONFIG_CRYPTO_SERPENT=m CONFIG_CRYPTO_AES=m CONFIG_CRYPTO_CAST5=m CONFIG_CRYPTO_CAST6=m -CONFIG_CRYPTO_DEFLATE=m CONFIG_CRYPTO_ARC4=m +CONFIG_CRYPTO_DEFLATE=m CONFIG_CRYPTO_MICHAEL_MIC=m -# CONFIG_CRYPTO_TEST is not set -CONFIG_LIBCRC32C=m CONFIG_CRYPTO_CRC32C=m +# CONFIG_CRYPTO_TEST is not set # # Library routines # -CONFIG_CRC32=m +CONFIG_CRC32=y +CONFIG_LIBCRC32C=m CONFIG_ZLIB_INFLATE=y CONFIG_ZLIB_DEFLATE=m -CONFIG_PC=y -# CONFIG_X86_PC is not set -# CONFIG_X86_ELAN is not set -# CONFIG_X86_VOYAGER is not set -# CONFIG_X86_NUMAQ is not set -# CONFIG_X86_SUMMIT is not set -# CONFIG_X86_BIGSMP is not set -# CONFIG_X86_VISWS is not set -CONFIG_X86_GENERICARCH=y -# CONFIG_X86_ES7000 is not set -# CONFIG_M386 is not set -# CONFIG_M486 is not set -# CONFIG_M586 is not set -# CONFIG_M586TSC is not set -# CONFIG_M586MMX is not set -CONFIG_M686=y -# CONFIG_MPENTIUMII is not set -# CONFIG_MPENTIUMIII is not set -# CONFIG_MPENTIUMM is not set -# CONFIG_MPENTIUM4 is not set -# CONFIG_MK6 is not set -# CONFIG_MK7 is not set -# CONFIG_MK8 is not set -# CONFIG_MCRUSOE is not set -# CONFIG_MWINCHIPC6 is not set -# CONFIG_MWINCHIP2 is not set -# CONFIG_MWINCHIP3D is not set -# CONFIG_MCYRIXIII is not set -# CONFIG_MVIAC3_2 is not set -CONFIG_X86_GENERIC=y -CONFIG_X86_CMPXCHG=y -CONFIG_X86_XADD=y -CONFIG_X86_L1_CACHE_SHIFT=7 -CONFIG_RWSEM_XCHGADD_ALGORITHM=y -CONFIG_X86_PPRO_FENCE=y -CONFIG_X86_WP_WORKS_OK=y -CONFIG_X86_INVLPG=y -CONFIG_X86_BSWAP=y -CONFIG_X86_POPAD_OK=y -CONFIG_X86_GOOD_APIC=y -CONFIG_X86_INTEL_USERCOPY=y -CONFIG_X86_USE_PPRO_CHECKSUM=y -CONFIG_HPET_TIMER=y -CONFIG_HPET_EMULATE_RTC=y -CONFIG_NR_CPUS=32 -CONFIG_X86_LOCAL_APIC=y -CONFIG_X86_IO_APIC=y -CONFIG_X86_TSC=y -CONFIG_X86_MCE=y -# CONFIG_X86_MCE_NONFATAL is not set -CONFIG_X86_MCE_P4THERMAL=y -CONFIG_TOSHIBA=m -CONFIG_I8K=m -CONFIG_SONYPI=m -CONFIG_MICROCODE=m -CONFIG_X86_MSR=m -CONFIG_X86_CPUID=m -CONFIG_EDD=m -# CONFIG_NOHIGHMEM is not set -CONFIG_HIGHMEM4G=y -CONFIG_HIGHMEM64G=y -# CONFIG_HIGHMEM64G is not set -CONFIG_HIGHMEM=y -CONFIG_HIGHPTE=y -# CONFIG_MATH_EMULATION is not set -CONFIG_MTRR=y -CONFIG_HAVE_DEC_LOCK=y -# CONFIG_X86_UP_APIC is not set -CONFIG_X86_PM_TIMER=y -CONFIG_X86_4G=y -# CONFIG_EFI is not set -CONFIG_REGPARM=y -# CONFIG_PCI_GOBIOS is not set -# CONFIG_PCI_GODIRECT is not set -CONFIG_PCI_GOANY=y -CONFIG_MDA_CONSOLE=m -CONFIG_SYNCLINK_CS=m -CONFIG_SYNCLINK=m -CONFIG_SYNCLINKMP=m -CONFIG_HP100=m -CONFIG_PCMCIA_FDOMAIN=m -CONFIG_SCSI_FUTURE_DOMAIN=m -CONFIG_CRASH=m -CONFIG_I2O=m -CONFIG_APM=y -# CONFIG_APM_IGNORE_USER_SUSPEND is not set -# CONFIG_APM_DO_ENABLE is not set -CONFIG_APM_CPU_IDLE=y -# CONFIG_APM_DISPLAY_BLANK is not set -CONFIG_APM_RTC_IS_GMT=y -# CONFIG_APM_ALLOW_INTS is not set -# CONFIG_APM_REAL_MODE_POWER_OFF is not set -CONFIG_X86_FIND_SMP_CONFIG=y -CONFIG_X86_MPPARSE=y -CONFIG_4KSTACKS=y -CONFIG_X86_ACPI_CPUFREQ=m -# CONFIG_X86_ACPI_CPUFREQ_PROC_INTF is not set -CONFIG_X86_POWERNOW_K6=m -CONFIG_X86_POWERNOW_K7=y -CONFIG_X86_POWERNOW_K8=m -# CONFIG_X86_GX_SUSPMOD is not set -CONFIG_X86_SPEEDSTEP_CENTRINO=y -CONFIG_X86_SPEEDSTEP_ICH=y -CONFIG_X86_SPEEDSTEP_SMI=m -CONFIG_X86_SPEEDSTEP_LIB=y -CONFIG_X86_SPEEDSTEP_CENTRINO_ACPI=y -# CONFIG_X86_SPEEDSTEP_RELAXED_CAP_CHECK is not set -CONFIG_X86_P4_CLOCKMOD=m -CONFIG_X86_LONGRUN=y -# CONFIG_X86_LONGHAUL is not set CONFIG_X86_SMP=y CONFIG_X86_HT=y CONFIG_X86_BIOS_REBOOT=y CONFIG_X86_TRAMPOLINE=y -CONFIG_TUX=m -CONFIG_NVRAM=m -CONFIG_IBM_ASM=m -CONFIG_M686=y -# CONFIG_NOHIGHMEM is not set -CONFIG_HIGHMEM64G=y -CONFIG_HOTPLUG_PCI=y -CONFIG_HOTPLUG_PCI_COMPAQ=m -CONFIG_HOTPLUG_PCI_IBM=m -# CONFIG_HIGHMEM64G is not set -# CONFIG_EWRK3 is not set -CONFIG_NR_CPUS=32 -# CONFIG_X86_PC is not set -CONFIG_X86_GENERICARCH=y +CONFIG_X86_STD_RESOURCES=y +CONFIG_PC=y diff --git a/Makefile b/Makefile index a4cf56f43..8024701c4 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ VERSION = 2 PATCHLEVEL = 6 SUBLEVEL = 6 -EXTRAVERSION = -prep +EXTRAVERSION = -1.406-vs1.9.0 NAME=Zonked Quokka # *DOCUMENTATION* diff --git a/arch/alpha/Kconfig b/arch/alpha/Kconfig index e1f20ca1c..d770bb867 100644 --- a/arch/alpha/Kconfig +++ b/arch/alpha/Kconfig @@ -692,6 +692,8 @@ config DEBUG_INFO endmenu +source "kernel/vserver/Kconfig" + source "security/Kconfig" source "crypto/Kconfig" diff --git a/arch/alpha/kernel/ptrace.c b/arch/alpha/kernel/ptrace.c index aa654cc85..5d9aae6be 100644 --- a/arch/alpha/kernel/ptrace.c +++ b/arch/alpha/kernel/ptrace.c @@ -287,6 +287,8 @@ do_sys_ptrace(long request, long pid, long addr, long data, read_unlock(&tasklist_lock); if (!child) goto out_notsk; + if (!vx_check(vx_task_xid(child), VX_WATCH|VX_IDENT)) + goto out; if (request == PTRACE_ATTACH) { ret = ptrace_attach(child); diff --git a/arch/alpha/kernel/systbls.S b/arch/alpha/kernel/systbls.S index bf9b31357..57052d8a3 100644 --- a/arch/alpha/kernel/systbls.S +++ b/arch/alpha/kernel/systbls.S @@ -299,7 +299,7 @@ sys_call_table: .quad alpha_ni_syscall /* 270 */ .quad alpha_ni_syscall .quad alpha_ni_syscall - .quad alpha_ni_syscall + .quad sys_vserver /* 273 sys_vserver */ .quad alpha_ni_syscall .quad alpha_ni_syscall /* 275 */ .quad alpha_ni_syscall diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 03b9d5bc6..db1feb1b3 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig @@ -808,6 +808,8 @@ config DEBUG_S3C2410_UART endmenu +source "kernel/vserver/Kconfig" + source "security/Kconfig" source "crypto/Kconfig" diff --git a/arch/arm/kernel/ptrace.c b/arch/arm/kernel/ptrace.c index fd3d5b2ba..4bcf7f6a4 100644 --- a/arch/arm/kernel/ptrace.c +++ b/arch/arm/kernel/ptrace.c @@ -754,6 +754,8 @@ asmlinkage int sys_ptrace(long request, long pid, long addr, long data) read_unlock(&tasklist_lock); if (!child) goto out; + if (!vx_check(vx_task_xid(child), VX_WATCH|VX_IDENT)) + goto out_tsk; ret = -EPERM; if (pid == 1) /* you may not mess with init */ diff --git a/arch/arm26/Kconfig b/arch/arm26/Kconfig index ce96fd34b..b40758b9f 100644 --- a/arch/arm26/Kconfig +++ b/arch/arm26/Kconfig @@ -327,6 +327,8 @@ config DEBUG_LL endmenu +source "kernel/vserver/Kconfig" + source "security/Kconfig" source "crypto/Kconfig" diff --git a/arch/arm26/kernel/ptrace.c b/arch/arm26/kernel/ptrace.c index 57b9fb1e2..78cd8931d 100644 --- a/arch/arm26/kernel/ptrace.c +++ b/arch/arm26/kernel/ptrace.c @@ -691,6 +691,8 @@ asmlinkage int sys_ptrace(long request, long pid, long addr, long data) read_unlock(&tasklist_lock); if (!child) goto out; + if (!vx_check(vx_task_xid(child), VX_WATCH|VX_IDENT)) + goto out_tsk; ret = -EPERM; if (pid == 1) /* you may not mess with init */ diff --git a/arch/cris/Kconfig b/arch/cris/Kconfig index 86a05dbff..9b0b719bf 100644 --- a/arch/cris/Kconfig +++ b/arch/cris/Kconfig @@ -214,6 +214,8 @@ config PROFILE_SHIFT endmenu +source "kernel/vserver/Kconfig" + source "security/Kconfig" source "crypto/Kconfig" diff --git a/arch/h8300/Kconfig b/arch/h8300/Kconfig index 072192a4f..093f3e64c 100644 --- a/arch/h8300/Kconfig +++ b/arch/h8300/Kconfig @@ -253,6 +253,8 @@ config CONFIG_BLKDEV_RESERVE_ADDRESS BLKDEV start address. endmenu +source "kernel/vserver/Kconfig" + source "security/Kconfig" source "crypto/Kconfig" diff --git a/arch/h8300/kernel/ptrace.c b/arch/h8300/kernel/ptrace.c index 0843013d1..cdbfe9e5c 100644 --- a/arch/h8300/kernel/ptrace.c +++ b/arch/h8300/kernel/ptrace.c @@ -80,6 +80,8 @@ asmlinkage int sys_ptrace(long request, long pid, long addr, long data) read_unlock(&tasklist_lock); if (!child) goto out; + if (!vx_check(vx_task_xid(child), VX_WATCH|VX_IDENT)) + goto out_tsk; ret = -EPERM; if (pid == 1) /* you may not mess with init */ diff --git a/arch/i386/Kconfig b/arch/i386/Kconfig index c46596c97..75ee13720 100644 --- a/arch/i386/Kconfig +++ b/arch/i386/Kconfig @@ -1345,6 +1345,8 @@ config X86_MPPARSE endmenu +source "kernel/vserver/Kconfig" + source "security/Kconfig" source "crypto/Kconfig" diff --git a/arch/i386/kernel/entry.S b/arch/i386/kernel/entry.S index b3ad2d0a3..bb91de327 100644 --- a/arch/i386/kernel/entry.S +++ b/arch/i386/kernel/entry.S @@ -1019,7 +1019,7 @@ ENTRY(sys_call_table) .long sys_tgkill /* 270 */ .long sys_utimes .long sys_fadvise64_64 - .long sys_ni_syscall /* sys_vserver */ + .long sys_vserver .long sys_mbind .long sys_get_mempolicy .long sys_set_mempolicy diff --git a/arch/i386/kernel/ptrace.c b/arch/i386/kernel/ptrace.c index 0cf2f1187..6f3a62694 100644 --- a/arch/i386/kernel/ptrace.c +++ b/arch/i386/kernel/ptrace.c @@ -259,6 +259,8 @@ asmlinkage int sys_ptrace(long request, long pid, long addr, long data) read_unlock(&tasklist_lock); if (!child) goto out; + if (!vx_check(vx_task_xid(child), VX_WATCH|VX_IDENT)) + goto out_tsk; ret = -EPERM; if (pid == 1) /* you may not mess with init */ diff --git a/arch/i386/kernel/sys_i386.c b/arch/i386/kernel/sys_i386.c index 0c36130af..fc8001a81 100644 --- a/arch/i386/kernel/sys_i386.c +++ b/arch/i386/kernel/sys_i386.c @@ -217,7 +217,7 @@ asmlinkage int sys_uname(struct old_utsname __user * name) if (!name) return -EFAULT; down_read(&uts_sem); - err=copy_to_user(name, &system_utsname, sizeof (*name)); + err=copy_to_user(name, vx_new_utsname(), sizeof (*name)); up_read(&uts_sem); return err?-EFAULT:0; } @@ -225,6 +225,7 @@ asmlinkage int sys_uname(struct old_utsname __user * name) asmlinkage int sys_olduname(struct oldold_utsname __user * name) { int error; + struct new_utsname *ptr; if (!name) return -EFAULT; @@ -233,15 +234,16 @@ asmlinkage int sys_olduname(struct oldold_utsname __user * name) down_read(&uts_sem); - error = __copy_to_user(&name->sysname,&system_utsname.sysname,__OLD_UTS_LEN); + ptr = vx_new_utsname(); + error = __copy_to_user(&name->sysname,ptr->sysname,__OLD_UTS_LEN); error |= __put_user(0,name->sysname+__OLD_UTS_LEN); - error |= __copy_to_user(&name->nodename,&system_utsname.nodename,__OLD_UTS_LEN); + error |= __copy_to_user(&name->nodename,ptr->nodename,__OLD_UTS_LEN); error |= __put_user(0,name->nodename+__OLD_UTS_LEN); - error |= __copy_to_user(&name->release,&system_utsname.release,__OLD_UTS_LEN); + error |= __copy_to_user(&name->release,ptr->release,__OLD_UTS_LEN); error |= __put_user(0,name->release+__OLD_UTS_LEN); - error |= __copy_to_user(&name->version,&system_utsname.version,__OLD_UTS_LEN); + error |= __copy_to_user(&name->version,ptr->version,__OLD_UTS_LEN); error |= __put_user(0,name->version+__OLD_UTS_LEN); - error |= __copy_to_user(&name->machine,&system_utsname.machine,__OLD_UTS_LEN); + error |= __copy_to_user(&name->machine,ptr->machine,__OLD_UTS_LEN); error |= __put_user(0,name->machine+__OLD_UTS_LEN); up_read(&uts_sem); diff --git a/arch/i386/mm/hugetlbpage.c b/arch/i386/mm/hugetlbpage.c index 0397fe963..a8dbbc57b 100644 --- a/arch/i386/mm/hugetlbpage.c +++ b/arch/i386/mm/hugetlbpage.c @@ -43,7 +43,8 @@ static void set_huge_pte(struct mm_struct *mm, struct vm_area_struct *vma, struc { pte_t entry; - mm->rss += (HPAGE_SIZE / PAGE_SIZE); + // mm->rss += (HPAGE_SIZE / PAGE_SIZE); + vx_rsspages_add(mm, HPAGE_SIZE / PAGE_SIZE); if (write_access) { entry = pte_mkwrite(pte_mkdirty(mk_pte(page, vma->vm_page_prot))); @@ -83,7 +84,8 @@ int copy_hugetlb_page_range(struct mm_struct *dst, struct mm_struct *src, ptepage = pte_page(entry); get_page(ptepage); set_pte(dst_pte, entry); - dst->rss += (HPAGE_SIZE / PAGE_SIZE); + // dst->rss += (HPAGE_SIZE / PAGE_SIZE); + vx_rsspages_add(dst, HPAGE_SIZE / PAGE_SIZE); addr += HPAGE_SIZE; } return 0; @@ -222,7 +224,8 @@ void unmap_hugepage_range(struct vm_area_struct *vma, page = pte_page(pte); put_page(page); } - mm->rss -= (end - start) >> PAGE_SHIFT; + // mm->rss -= (end - start) >> PAGE_SHIFT; + vx_rsspages_sub(mm, (end - start) >> PAGE_SHIFT); flush_tlb_range(vma, start, end); } diff --git a/arch/ia64/Kconfig b/arch/ia64/Kconfig index b856ffae3..d51c192d0 100644 --- a/arch/ia64/Kconfig +++ b/arch/ia64/Kconfig @@ -497,6 +497,8 @@ config SYSVIPC_COMPAT default y endmenu +source "kernel/vserver/Kconfig" + source "security/Kconfig" source "crypto/Kconfig" diff --git a/arch/ia64/ia32/binfmt_elf32.c b/arch/ia64/ia32/binfmt_elf32.c index 30f2b84c3..1613474b1 100644 --- a/arch/ia64/ia32/binfmt_elf32.c +++ b/arch/ia64/ia32/binfmt_elf32.c @@ -146,7 +146,7 @@ ia64_elf32_init (struct pt_regs *regs) int ia32_setup_arg_pages (struct linux_binprm *bprm, int executable_stack) { - unsigned long stack_base; + unsigned long stack_base, grow; struct vm_area_struct *mpnt; struct mm_struct *mm = current->mm; int i; @@ -163,7 +163,10 @@ ia32_setup_arg_pages (struct linux_binprm *bprm, int executable_stack) if (!mpnt) return -ENOMEM; - if (security_vm_enough_memory((IA32_STACK_TOP - (PAGE_MASK & (unsigned long) bprm->p))>>PAGE_SHIFT)) { + grow = (IA32_STACK_TOP - (PAGE_MASK & (unsigned long) bprm->p)) + >> PAGE_SHIFT; + if (security_vm_enough_memory(grow) || + !vx_vmpages_avail(mm, grow)) { kmem_cache_free(vm_area_cachep, mpnt); return -ENOMEM; } @@ -184,7 +187,9 @@ ia32_setup_arg_pages (struct linux_binprm *bprm, int executable_stack) mpnt->vm_page_prot = (mpnt->vm_flags & VM_EXEC)? PAGE_COPY_EXEC: PAGE_COPY; insert_vm_struct(current->mm, mpnt); - current->mm->total_vm = (mpnt->vm_end - mpnt->vm_start) >> PAGE_SHIFT; + // current->mm->total_vm = (mpnt->vm_end - mpnt->vm_start) >> PAGE_SHIFT; + vx_vmpages_sub(current->mm, current->mm->total_vm - + ((mpnt->vm_end - mpnt->vm_start) >> PAGE_SHIFT)); } for (i = 0 ; i < MAX_ARG_PAGES ; i++) { diff --git a/arch/ia64/kernel/perfmon.c b/arch/ia64/kernel/perfmon.c index c46ba04e6..df9539ab8 100644 --- a/arch/ia64/kernel/perfmon.c +++ b/arch/ia64/kernel/perfmon.c @@ -2361,7 +2361,8 @@ pfm_smpl_buffer_alloc(struct task_struct *task, pfm_context_t *ctx, unsigned lon */ insert_vm_struct(mm, vma); - mm->total_vm += size >> PAGE_SHIFT; + // mm->total_vm += size >> PAGE_SHIFT; + vx_vmpages_add(mm, size >> PAGE_SHIFT); up_write(&task->mm->mmap_sem); diff --git a/arch/ia64/kernel/ptrace.c b/arch/ia64/kernel/ptrace.c index 0432abe56..eace1b77c 100644 --- a/arch/ia64/kernel/ptrace.c +++ b/arch/ia64/kernel/ptrace.c @@ -1310,6 +1310,9 @@ sys_ptrace (long request, pid_t pid, unsigned long addr, unsigned long data, read_unlock(&tasklist_lock); if (!child) goto out; + if (!vx_check(vx_task_xid(child), VX_WATCH|VX_IDENT)) + goto out_tsk; + ret = -EPERM; if (pid == 1) /* no messing around with init! */ goto out_tsk; diff --git a/arch/ia64/mm/fault.c b/arch/ia64/mm/fault.c index d823ff897..20d11f4d5 100644 --- a/arch/ia64/mm/fault.c +++ b/arch/ia64/mm/fault.c @@ -36,10 +36,14 @@ expand_backing_store (struct vm_area_struct *vma, unsigned long address) if (address - vma->vm_start > current->rlim[RLIMIT_STACK].rlim_cur || (((vma->vm_mm->total_vm + grow) << PAGE_SHIFT) > current->rlim[RLIMIT_AS].rlim_cur)) return -ENOMEM; + if (!vx_vmpages_avail(vma->vm_mm, grow) + return -ENOMEM; vma->vm_end += PAGE_SIZE; - vma->vm_mm->total_vm += grow; + // vma->vm_mm->total_vm += grow; + vx_vmpages_add(vma->vm_mm, grow); if (vma->vm_flags & VM_LOCKED) - vma->vm_mm->locked_vm += grow; + // vma->vm_mm->locked_vm += grow; + vx_vmlocked_add(vma->vm_mm, grow); return 0; } diff --git a/arch/ia64/mm/hugetlbpage.c b/arch/ia64/mm/hugetlbpage.c index 56e409ec6..c72435812 100644 --- a/arch/ia64/mm/hugetlbpage.c +++ b/arch/ia64/mm/hugetlbpage.c @@ -65,7 +65,8 @@ set_huge_pte (struct mm_struct *mm, struct vm_area_struct *vma, { pte_t entry; - mm->rss += (HPAGE_SIZE / PAGE_SIZE); + // mm->rss += (HPAGE_SIZE / PAGE_SIZE); + vx_rsspages_add(mm, HPAGE_SIZE / PAGE_SIZE); if (write_access) { entry = pte_mkwrite(pte_mkdirty(mk_pte(page, vma->vm_page_prot))); @@ -108,7 +109,8 @@ int copy_hugetlb_page_range(struct mm_struct *dst, struct mm_struct *src, ptepage = pte_page(entry); get_page(ptepage); set_pte(dst_pte, entry); - dst->rss += (HPAGE_SIZE / PAGE_SIZE); + // dst->rss += (HPAGE_SIZE / PAGE_SIZE); + vx_rsspages_add(dst, HPAGE_SIZE / PAGE_SIZE); addr += HPAGE_SIZE; } return 0; @@ -251,7 +253,8 @@ void unmap_hugepage_range(struct vm_area_struct *vma, unsigned long start, unsig put_page(page); pte_clear(pte); } - mm->rss -= (end - start) >> PAGE_SHIFT; + // mm->rss -= (end - start) >> PAGE_SHIFT; + vx_rsspages_sub(mm, (end - start) >> PAGE_SHIFT); flush_tlb_range(vma, start, end); } diff --git a/arch/m68k/Kconfig b/arch/m68k/Kconfig index 1fa88d5f3..35ea6886f 100644 --- a/arch/m68k/Kconfig +++ b/arch/m68k/Kconfig @@ -690,6 +690,8 @@ config DEBUG_INFO endmenu +source "kernel/vserver/Kconfig" + source "security/Kconfig" source "crypto/Kconfig" diff --git a/arch/m68k/atari/stram.c b/arch/m68k/atari/stram.c index b03d03163..65b1b9c7e 100644 --- a/arch/m68k/atari/stram.c +++ b/arch/m68k/atari/stram.c @@ -635,7 +635,8 @@ static inline void unswap_pte(struct vm_area_struct * vma, unsigned long set_pte(dir, pte_mkdirty(mk_pte(page, vma->vm_page_prot))); swap_free(entry); get_page(page); - ++vma->vm_mm->rss; + // ++vma->vm_mm->rss; + vx_rsspages_inc(vma->vm_mm); } static inline void unswap_pmd(struct vm_area_struct * vma, pmd_t *dir, diff --git a/arch/m68k/kernel/ptrace.c b/arch/m68k/kernel/ptrace.c index 12e4acdfd..0f0b28d34 100644 --- a/arch/m68k/kernel/ptrace.c +++ b/arch/m68k/kernel/ptrace.c @@ -140,6 +140,8 @@ asmlinkage int sys_ptrace(long request, long pid, long addr, long data) read_unlock(&tasklist_lock); if (!child) goto out; + if (!vx_check(vx_task_xid(child), VX_WATCH|VX_IDENT)) + goto out_tsk; ret = -EPERM; if (pid == 1) /* you may not mess with init */ diff --git a/arch/m68knommu/Kconfig b/arch/m68knommu/Kconfig index f11317725..b8f71e760 100644 --- a/arch/m68knommu/Kconfig +++ b/arch/m68knommu/Kconfig @@ -566,6 +566,8 @@ config BDM_DISABLE endmenu +source "kernel/vserver/Kconfig" + source "security/Kconfig" source "crypto/Kconfig" diff --git a/arch/m68knommu/kernel/ptrace.c b/arch/m68knommu/kernel/ptrace.c index 4f3df6d67..0c57f873a 100644 --- a/arch/m68knommu/kernel/ptrace.c +++ b/arch/m68knommu/kernel/ptrace.c @@ -124,6 +124,8 @@ asmlinkage int sys_ptrace(long request, long pid, long addr, long data) read_unlock(&tasklist_lock); if (!child) goto out; + if (!vx_check(vx_task_xid(child), VX_WATCH|VX_IDENT)) + goto out_tsk; ret = -EPERM; if (pid == 1) /* you may not mess with init */ diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig index 920bec861..8d6d86c07 100644 --- a/arch/mips/Kconfig +++ b/arch/mips/Kconfig @@ -1646,6 +1646,8 @@ config DEBUG_HIGHMEM endmenu +source "kernel/vserver/Kconfig" + source "security/Kconfig" source "crypto/Kconfig" diff --git a/arch/mips/kernel/irixelf.c b/arch/mips/kernel/irixelf.c index dc9f7924e..0bcfb5ab6 100644 --- a/arch/mips/kernel/irixelf.c +++ b/arch/mips/kernel/irixelf.c @@ -686,7 +686,8 @@ static int load_irix_binary(struct linux_binprm * bprm, struct pt_regs * regs) /* Do this so that we can load the interpreter, if need be. We will * change some of these later. */ - current->mm->rss = 0; + // current->mm->rss = 0; + vx_rsspages_sub(current->mm, current->mm->rss); setup_arg_pages(bprm, EXSTACK_DEFAULT); current->mm->start_stack = bprm->p; diff --git a/arch/mips/kernel/linux32.c b/arch/mips/kernel/linux32.c index bcb3e0c5a..836474423 100644 --- a/arch/mips/kernel/linux32.c +++ b/arch/mips/kernel/linux32.c @@ -1201,7 +1201,7 @@ asmlinkage long sys32_newuname(struct new_utsname * name) int ret = 0; down_read(&uts_sem); - if (copy_to_user(name,&system_utsname,sizeof *name)) + if (copy_to_user(name, vx_new_utsname(), sizeof *name)) ret = -EFAULT; up_read(&uts_sem); diff --git a/arch/mips/kernel/ptrace.c b/arch/mips/kernel/ptrace.c index 6e8511390..db86febff 100644 --- a/arch/mips/kernel/ptrace.c +++ b/arch/mips/kernel/ptrace.c @@ -76,6 +76,8 @@ asmlinkage int sys_ptrace(long request, long pid, long addr, long data) read_unlock(&tasklist_lock); if (!child) goto out; + if (!vx_check(vx_task_xid(child), VX_WATCH|VX_IDENT)) + goto out_tsk; ret = -EPERM; if (pid == 1) /* you may not mess with init */ diff --git a/arch/mips/kernel/syscall.c b/arch/mips/kernel/syscall.c index 7e1eca973..5785d06bc 100644 --- a/arch/mips/kernel/syscall.c +++ b/arch/mips/kernel/syscall.c @@ -209,7 +209,7 @@ out: */ asmlinkage int sys_uname(struct old_utsname * name) { - if (name && !copy_to_user(name, &system_utsname, sizeof (*name))) + if (name && !copy_to_user(name, vx_new_utsname(), sizeof (*name))) return 0; return -EFAULT; } @@ -220,21 +220,23 @@ asmlinkage int sys_uname(struct old_utsname * name) asmlinkage int sys_olduname(struct oldold_utsname * name) { int error; + struct new_utsname *ptr; if (!name) return -EFAULT; if (!access_ok(VERIFY_WRITE,name,sizeof(struct oldold_utsname))) return -EFAULT; - error = __copy_to_user(&name->sysname,&system_utsname.sysname,__OLD_UTS_LEN); + ptr = vx_new_utsname(); + error = __copy_to_user(&name->sysname,ptr->sysname,__OLD_UTS_LEN); error -= __put_user(0,name->sysname+__OLD_UTS_LEN); - error -= __copy_to_user(&name->nodename,&system_utsname.nodename,__OLD_UTS_LEN); + error -= __copy_to_user(&name->nodename,ptr->nodename,__OLD_UTS_LEN); error -= __put_user(0,name->nodename+__OLD_UTS_LEN); - error -= __copy_to_user(&name->release,&system_utsname.release,__OLD_UTS_LEN); + error -= __copy_to_user(&name->release,ptr->release,__OLD_UTS_LEN); error -= __put_user(0,name->release+__OLD_UTS_LEN); - error -= __copy_to_user(&name->version,&system_utsname.version,__OLD_UTS_LEN); + error -= __copy_to_user(&name->version,ptr->version,__OLD_UTS_LEN); error -= __put_user(0,name->version+__OLD_UTS_LEN); - error -= __copy_to_user(&name->machine,&system_utsname.machine,__OLD_UTS_LEN); + error -= __copy_to_user(&name->machine,ptr->machine,__OLD_UTS_LEN); error = __put_user(0,name->machine+__OLD_UTS_LEN); error = error ? -EFAULT : 0; @@ -260,10 +262,10 @@ asmlinkage int _sys_sysmips(int cmd, long arg1, int arg2, int arg3) return -EFAULT; down_write(&uts_sem); - strncpy(system_utsname.nodename, nodename, len); + strncpy(vx_new_uts(nodename), nodename, len); nodename[__NEW_UTS_LEN] = '\0'; - strlcpy(system_utsname.nodename, nodename, - sizeof(system_utsname.nodename)); + strlcpy(vx_new_uts(nodename), nodename, + sizeof(vx_new_uts(nodename))); up_write(&uts_sem); return 0; } diff --git a/arch/mips/kernel/sysirix.c b/arch/mips/kernel/sysirix.c index 25d7e97ed..3e0cf6e41 100644 --- a/arch/mips/kernel/sysirix.c +++ b/arch/mips/kernel/sysirix.c @@ -577,7 +577,8 @@ asmlinkage int irix_brk(unsigned long brk) /* * Check if we have enough memory.. */ - if (security_vm_enough_memory((newbrk-oldbrk) >> PAGE_SHIFT)) { + if (security_vm_enough_memory((newbrk-oldbrk) >> PAGE_SHIFT) || + !vx_vmpages_avail(mm, (newbrk-oldbrk) >> PAGE_SHIFT)) { ret = -ENOMEM; goto out; } diff --git a/arch/parisc/Kconfig b/arch/parisc/Kconfig index ccd63a41f..4f195174a 100644 --- a/arch/parisc/Kconfig +++ b/arch/parisc/Kconfig @@ -223,6 +223,8 @@ config DEBUG_INFO endmenu +source "kernel/vserver/Kconfig" + source "security/Kconfig" source "crypto/Kconfig" diff --git a/arch/parisc/kernel/ptrace.c b/arch/parisc/kernel/ptrace.c index 514e8b5f8..d45980cb5 100644 --- a/arch/parisc/kernel/ptrace.c +++ b/arch/parisc/kernel/ptrace.c @@ -110,6 +110,9 @@ long sys_ptrace(long request, pid_t pid, long addr, long data) read_unlock(&tasklist_lock); if (!child) goto out; + if (!vx_check(vx_task_xid(child), VX_WATCH|VX_IDENT)) + goto out_tsk; + ret = -EPERM; if (pid == 1) /* no messing around with init! */ goto out_tsk; diff --git a/arch/parisc/kernel/sys_parisc32.c b/arch/parisc/kernel/sys_parisc32.c index 6b5649a69..cd320b20c 100644 --- a/arch/parisc/kernel/sys_parisc32.c +++ b/arch/parisc/kernel/sys_parisc32.c @@ -676,6 +676,7 @@ asmlinkage int sys32_sysinfo(struct sysinfo32 *info) do { seq = read_seqbegin(&xtime_lock); + /* requires vx virtualization */ val.uptime = jiffies / HZ; val.loads[0] = avenrun[0] << (SI_LOAD_SHIFT - FSHIFT); diff --git a/arch/ppc/Kconfig b/arch/ppc/Kconfig index faeb15e37..d5b49d26b 100644 --- a/arch/ppc/Kconfig +++ b/arch/ppc/Kconfig @@ -1269,6 +1269,8 @@ config PPC_OCP endmenu +source "kernel/vserver/Kconfig" + source "security/Kconfig" source "crypto/Kconfig" diff --git a/arch/ppc/kernel/misc.S b/arch/ppc/kernel/misc.S index c3ed5ed1d..bd006ca95 100644 --- a/arch/ppc/kernel/misc.S +++ b/arch/ppc/kernel/misc.S @@ -1386,7 +1386,7 @@ _GLOBAL(sys_call_table) .long ppc_fadvise64_64 .long sys_ni_syscall /* 255 - rtas (used on ppc64) */ .long sys_ni_syscall /* 256 reserved for sys_debug_setcontext */ - .long sys_ni_syscall /* 257 reserved for vserver */ + .long sys_vserver .long sys_ni_syscall /* 258 reserved for new sys_remap_file_pages */ .long sys_ni_syscall /* 259 reserved for new sys_mbind */ .long sys_ni_syscall /* 260 reserved for new sys_get_mempolicy */ diff --git a/arch/ppc/kernel/ptrace.c b/arch/ppc/kernel/ptrace.c index 2ddfb1a37..f9120785b 100644 --- a/arch/ppc/kernel/ptrace.c +++ b/arch/ppc/kernel/ptrace.c @@ -197,6 +197,8 @@ int sys_ptrace(long request, long pid, long addr, long data) read_unlock(&tasklist_lock); if (!child) goto out; + if (!vx_check(vx_task_xid(child), VX_WATCH|VX_IDENT)) + goto out_tsk; ret = -EPERM; if (pid == 1) /* you may not mess with init */ diff --git a/arch/ppc/kernel/syscalls.c b/arch/ppc/kernel/syscalls.c index 7f2531d12..d33e63520 100644 --- a/arch/ppc/kernel/syscalls.c +++ b/arch/ppc/kernel/syscalls.c @@ -229,7 +229,7 @@ int sys_uname(struct old_utsname __user * name) int err = -EFAULT; down_read(&uts_sem); - if (name && !copy_to_user(name, &system_utsname, sizeof (*name))) + if (name && !copy_to_user(name, vx_new_utsname(), sizeof (*name))) err = 0; up_read(&uts_sem); return err; @@ -238,6 +238,7 @@ int sys_uname(struct old_utsname __user * name) int sys_olduname(struct oldold_utsname __user * name) { int error; + struct new_utsname *ptr; if (!name) return -EFAULT; @@ -245,15 +246,16 @@ int sys_olduname(struct oldold_utsname __user * name) return -EFAULT; down_read(&uts_sem); - error = __copy_to_user(&name->sysname,&system_utsname.sysname,__OLD_UTS_LEN); + ptr = vx_new_utsname(); + error = __copy_to_user(&name->sysname,ptr->sysname,__OLD_UTS_LEN); error -= __put_user(0,name->sysname+__OLD_UTS_LEN); - error -= __copy_to_user(&name->nodename,&system_utsname.nodename,__OLD_UTS_LEN); + error -= __copy_to_user(&name->nodename,ptr->nodename,__OLD_UTS_LEN); error -= __put_user(0,name->nodename+__OLD_UTS_LEN); - error -= __copy_to_user(&name->release,&system_utsname.release,__OLD_UTS_LEN); + error -= __copy_to_user(&name->release,ptr->release,__OLD_UTS_LEN); error -= __put_user(0,name->release+__OLD_UTS_LEN); - error -= __copy_to_user(&name->version,&system_utsname.version,__OLD_UTS_LEN); + error -= __copy_to_user(&name->version,ptr->version,__OLD_UTS_LEN); error -= __put_user(0,name->version+__OLD_UTS_LEN); - error -= __copy_to_user(&name->machine,&system_utsname.machine,__OLD_UTS_LEN); + error -= __copy_to_user(&name->machine,ptr->machine,__OLD_UTS_LEN); error = __put_user(0,name->machine+__OLD_UTS_LEN); up_read(&uts_sem); diff --git a/arch/ppc64/Kconfig b/arch/ppc64/Kconfig index f0a6ef197..8d5e077fd 100644 --- a/arch/ppc64/Kconfig +++ b/arch/ppc64/Kconfig @@ -437,6 +437,8 @@ config SPINLINE If in doubt, say N. +source "kernel/vserver/Kconfig" + source "security/Kconfig" source "crypto/Kconfig" diff --git a/arch/ppc64/kernel/misc.S b/arch/ppc64/kernel/misc.S index 3cdd1a097..5a6064a2d 100644 --- a/arch/ppc64/kernel/misc.S +++ b/arch/ppc64/kernel/misc.S @@ -871,7 +871,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_ni_syscall /* 257 reserved for vserver */ + .llong .sys_vserver .llong .sys_ni_syscall /* 258 reserved for new sys_remap_file_pages */ .llong .sys_ni_syscall /* 259 reserved for new sys_mbind */ .llong .sys_ni_syscall /* 260 reserved for new sys_get_mempolicy */ diff --git a/arch/ppc64/kernel/ptrace.c b/arch/ppc64/kernel/ptrace.c index efc9dbd3b..5ff2b1c90 100644 --- a/arch/ppc64/kernel/ptrace.c +++ b/arch/ppc64/kernel/ptrace.c @@ -76,6 +76,8 @@ int sys_ptrace(long request, long pid, long addr, long data) read_unlock(&tasklist_lock); if (!child) goto out; + if (!vx_check(vx_task_xid(child), VX_WATCH|VX_IDENT)) + goto out_tsk; ret = -EPERM; if (pid == 1) /* you may not mess with init */ diff --git a/arch/ppc64/kernel/sys_ppc32.c b/arch/ppc64/kernel/sys_ppc32.c index ca8014224..ddd1cb7c6 100644 --- a/arch/ppc64/kernel/sys_ppc32.c +++ b/arch/ppc64/kernel/sys_ppc32.c @@ -1158,6 +1158,7 @@ asmlinkage long sys32_time(compat_time_t __user * tloc) asmlinkage int sys32_olduname(struct oldold_utsname __user * name) { int error; + struct new_utsname *ptr; if (!name) return -EFAULT; @@ -1165,15 +1166,16 @@ asmlinkage int sys32_olduname(struct oldold_utsname __user * name) return -EFAULT; down_read(&uts_sem); - error = __copy_to_user(&name->sysname,&system_utsname.sysname,__OLD_UTS_LEN); + ptr = vx_new_utsname(); + error = __copy_to_user(&name->sysname,ptr->sysname,__OLD_UTS_LEN); error -= __put_user(0,name->sysname+__OLD_UTS_LEN); - error -= __copy_to_user(&name->nodename,&system_utsname.nodename,__OLD_UTS_LEN); + error -= __copy_to_user(&name->nodename,ptr->nodename,__OLD_UTS_LEN); error -= __put_user(0,name->nodename+__OLD_UTS_LEN); - error -= __copy_to_user(&name->release,&system_utsname.release,__OLD_UTS_LEN); + error -= __copy_to_user(&name->release,ptr->release,__OLD_UTS_LEN); error -= __put_user(0,name->release+__OLD_UTS_LEN); - error -= __copy_to_user(&name->version,&system_utsname.version,__OLD_UTS_LEN); + error -= __copy_to_user(&name->version,ptr->version,__OLD_UTS_LEN); error -= __put_user(0,name->version+__OLD_UTS_LEN); - error -= __copy_to_user(&name->machine,&system_utsname.machine,__OLD_UTS_LEN); + error -= __copy_to_user(&name->machine,ptr->machine,__OLD_UTS_LEN); error = __put_user(0,name->machine+__OLD_UTS_LEN); up_read(&uts_sem); diff --git a/arch/ppc64/mm/hugetlbpage.c b/arch/ppc64/mm/hugetlbpage.c index d660b0d28..9416e53df 100644 --- a/arch/ppc64/mm/hugetlbpage.c +++ b/arch/ppc64/mm/hugetlbpage.c @@ -125,7 +125,8 @@ static void setup_huge_pte(struct mm_struct *mm, struct page *page, hugepte_t entry; int i; - mm->rss += (HPAGE_SIZE / PAGE_SIZE); + // mm->rss += (HPAGE_SIZE / PAGE_SIZE); + vx_rsspages_sub(mm, HPAGE_SIZE / PAGE_SIZE); entry = mk_hugepte(page, write_access); for (i = 0; i < HUGEPTE_BATCH_SIZE; i++) set_hugepte(ptep+i, entry); @@ -287,7 +288,8 @@ int copy_hugetlb_page_range(struct mm_struct *dst, struct mm_struct *src, /* This is the first hugepte in a batch */ ptepage = hugepte_page(entry); get_page(ptepage); - dst->rss += (HPAGE_SIZE / PAGE_SIZE); + // dst->rss += (HPAGE_SIZE / PAGE_SIZE); + vx_rsspages_add(dst, HPAGE_SIZE / PAGE_SIZE); } set_hugepte(dst_pte, entry); @@ -407,7 +409,8 @@ void unmap_hugepage_range(struct vm_area_struct *vma, put_page(page); } - mm->rss -= (end - start) >> PAGE_SHIFT; + // mm->rss -= (end - start) >> PAGE_SHIFT; + vx_rsspages_sub(mm, (end - start) >> PAGE_SHIFT); } int hugetlb_prefault(struct address_space *mapping, struct vm_area_struct *vma) diff --git a/arch/s390/Kconfig b/arch/s390/Kconfig index eab5d1e96..c0b72b438 100644 --- a/arch/s390/Kconfig +++ b/arch/s390/Kconfig @@ -425,6 +425,8 @@ config DEBUG_SPINLOCK_SLEEP endmenu +source "kernel/vserver/Kconfig" + source "security/Kconfig" source "crypto/Kconfig" diff --git a/arch/s390/kernel/compat_exec.c b/arch/s390/kernel/compat_exec.c index 595c43a89..3e781bd77 100644 --- a/arch/s390/kernel/compat_exec.c +++ b/arch/s390/kernel/compat_exec.c @@ -36,7 +36,7 @@ int setup_arg_pages32(struct linux_binprm *bprm, int executable_stack) { - unsigned long stack_base; + unsigned long stack_base, grow; struct vm_area_struct *mpnt; struct mm_struct *mm = current->mm; int i; @@ -53,7 +53,10 @@ int setup_arg_pages32(struct linux_binprm *bprm, int executable_stack) if (!mpnt) return -ENOMEM; - if (security_vm_enough_memory((STACK_TOP - (PAGE_MASK & (unsigned long) bprm->p))>>PAGE_SHIFT)) { + grow = (STACK_TOP - (PAGE_MASK & (unsigned long) bprm->p)) + >> PAGE_SHIFT; + if (security_vm_enough_memory(grow) || + !vx_vmpages_avail(mm, grow)) { kmem_cache_free(vm_area_cachep, mpnt); return -ENOMEM; } @@ -69,7 +72,9 @@ int setup_arg_pages32(struct linux_binprm *bprm, int executable_stack) mpnt->vm_page_prot = PAGE_COPY; mpnt->vm_flags = VM_STACK_FLAGS; insert_vm_struct(mm, mpnt); - mm->total_vm = (mpnt->vm_end - mpnt->vm_start) >> PAGE_SHIFT; + // mm->total_vm = (mpnt->vm_end - mpnt->vm_start) >> PAGE_SHIFT; + vx_vmpages_sub(mm, mm->total_vm - + ((mpnt->vm_end - mpnt->vm_start) >> PAGE_SHIFT)); } for (i = 0 ; i < MAX_ARG_PAGES ; i++) { diff --git a/arch/s390/kernel/ptrace.c b/arch/s390/kernel/ptrace.c index 1176b4f5b..fa7875fba 100644 --- a/arch/s390/kernel/ptrace.c +++ b/arch/s390/kernel/ptrace.c @@ -680,9 +680,11 @@ sys_ptrace(long request, long pid, long addr, long data) read_unlock(&tasklist_lock); if (!child) goto out; + if (!vx_check(vx_task_xid(child), VX_WATCH|VX_IDENT)) + goto out_tsk; ret = do_ptrace(child, request, addr, data); - +out_tsk: put_task_struct(child); out: unlock_kernel(); diff --git a/arch/s390/kernel/syscalls.S b/arch/s390/kernel/syscalls.S index 9186fe765..d17ba7b7c 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) -NI_SYSCALL /* reserved for vserver */ +SYSCALL(sys_vserver,sys_vserver,sys_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/sh/Kconfig b/arch/sh/Kconfig index 8efb8e02a..e774424d6 100644 --- a/arch/sh/Kconfig +++ b/arch/sh/Kconfig @@ -792,6 +792,8 @@ config FRAME_POINTER endmenu +source "kernel/vserver/Kconfig" + source "security/Kconfig" source "crypto/Kconfig" diff --git a/arch/sh/kernel/ptrace.c b/arch/sh/kernel/ptrace.c index 602f6c570..732afaeaf 100644 --- a/arch/sh/kernel/ptrace.c +++ b/arch/sh/kernel/ptrace.c @@ -108,6 +108,8 @@ asmlinkage int sys_ptrace(long request, long pid, long addr, long data) read_unlock(&tasklist_lock); if (!child) goto out; + if (!vx_check(vx_task_xid(child), VX_WATCH|VX_IDENT)) + goto out_tsk; ret = -EPERM; if (pid == 1) /* you may not mess with init */ diff --git a/arch/sh/mm/hugetlbpage.c b/arch/sh/mm/hugetlbpage.c index 4d5d687d1..4bc97038e 100644 --- a/arch/sh/mm/hugetlbpage.c +++ b/arch/sh/mm/hugetlbpage.c @@ -62,7 +62,8 @@ static void set_huge_pte(struct mm_struct *mm, struct vm_area_struct *vma, unsigned long i; pte_t entry; - mm->rss += (HPAGE_SIZE / PAGE_SIZE); + // mm->rss += (HPAGE_SIZE / PAGE_SIZE); + vx_rsspages_add(mm, HPAGE_SIZE / PAGE_SIZE); if (write_access) entry = pte_mkwrite(pte_mkdirty(mk_pte(page, @@ -115,7 +116,8 @@ int copy_hugetlb_page_range(struct mm_struct *dst, struct mm_struct *src, pte_val(entry) += PAGE_SIZE; dst_pte++; } - dst->rss += (HPAGE_SIZE / PAGE_SIZE); + // dst->rss += (HPAGE_SIZE / PAGE_SIZE); + vx_rsspages_add(dst, HPAGE_SIZE / PAGE_SIZE); addr += HPAGE_SIZE; } return 0; @@ -206,7 +208,8 @@ void unmap_hugepage_range(struct vm_area_struct *vma, pte++; } } - mm->rss -= (end - start) >> PAGE_SHIFT; + // mm->rss -= (end - start) >> PAGE_SHIFT; + vx_rsspages_sub(mm, (end - start) >> PAGE_SHIFT); flush_tlb_range(vma, start, end); } diff --git a/arch/sparc/Kconfig b/arch/sparc/Kconfig index 79d52a1dd..4b3dd85b5 100644 --- a/arch/sparc/Kconfig +++ b/arch/sparc/Kconfig @@ -450,6 +450,8 @@ config DEBUG_BUGVERBOSE endmenu +source "kernel/vserver/Kconfig" + source "security/Kconfig" source "crypto/Kconfig" diff --git a/arch/sparc/kernel/ptrace.c b/arch/sparc/kernel/ptrace.c index d838bd8f6..949072b1c 100644 --- a/arch/sparc/kernel/ptrace.c +++ b/arch/sparc/kernel/ptrace.c @@ -321,6 +321,10 @@ asmlinkage void do_ptrace(struct pt_regs *regs) pt_error_return(regs, ESRCH); goto out; } + if (!vx_check(vx_task_xid(child), VX_WATCH|VX_IDENT)) { + pt_error_return(regs, ESRCH); + goto out_tsk; + } if ((current->personality == PER_SUNOS && request == PTRACE_SUNATTACH) || (current->personality != PER_SUNOS && request == PTRACE_ATTACH)) { diff --git a/arch/sparc/kernel/sys_sparc.c b/arch/sparc/kernel/sys_sparc.c index cec8ac302..7f2ab05ce 100644 --- a/arch/sparc/kernel/sys_sparc.c +++ b/arch/sparc/kernel/sys_sparc.c @@ -471,13 +471,13 @@ asmlinkage int sys_getdomainname(char __user *name, int len) down_read(&uts_sem); - nlen = strlen(system_utsname.domainname) + 1; + nlen = strlen(vx_new_uts(domainname)) + 1; if (nlen < len) len = nlen; if (len > __NEW_UTS_LEN) goto done; - if (copy_to_user(name, system_utsname.domainname, len)) + if (copy_to_user(name, vx_new_uts(domainname), len)) goto done; err = 0; done: diff --git a/arch/sparc/kernel/systbls.S b/arch/sparc/kernel/systbls.S index fd452a6d3..56c8c878d 100644 --- a/arch/sparc/kernel/systbls.S +++ b/arch/sparc/kernel/systbls.S @@ -72,7 +72,7 @@ sys_call_table: /*250*/ .long sparc_mremap, sys_sysctl, sys_getsid, sys_fdatasync, sys_nfsservctl /*255*/ .long sys_nis_syscall, sys_clock_settime, sys_clock_gettime, sys_clock_getres, sys_clock_nanosleep /*260*/ .long sys_sched_getaffinity, sys_sched_setaffinity, sys_timer_settime, sys_timer_gettime, sys_timer_getoverrun -/*265*/ .long sys_timer_delete, sys_timer_create, sys_nis_syscall, sys_io_setup, sys_io_destroy +/*265*/ .long sys_timer_delete, sys_timer_create, sys_vserver, sys_io_setup, sys_io_destroy /*270*/ .long sys_io_submit, sys_io_cancel, sys_io_getevents, sys_mq_open, sys_mq_unlink /*275*/ .long sys_mq_timedsend, sys_mq_timedreceive, sys_mq_notify, sys_mq_getsetattr, sys_ni_syscall /*280*/ .long sys_ni_syscall, sys_ni_syscall, sys_ni_syscall diff --git a/arch/sparc64/Kconfig b/arch/sparc64/Kconfig index 3b110a53f..57156710c 100644 --- a/arch/sparc64/Kconfig +++ b/arch/sparc64/Kconfig @@ -707,6 +707,8 @@ config FRAME_POINTER endmenu +source "kernel/vserver/Kconfig" + source "security/Kconfig" source "crypto/Kconfig" diff --git a/arch/sparc64/kernel/binfmt_aout32.c b/arch/sparc64/kernel/binfmt_aout32.c index 4ba5d4801..609b6ed06 100644 --- a/arch/sparc64/kernel/binfmt_aout32.c +++ b/arch/sparc64/kernel/binfmt_aout32.c @@ -239,7 +239,8 @@ static int load_aout32_binary(struct linux_binprm * bprm, struct pt_regs * regs) current->mm->brk = ex.a_bss + (current->mm->start_brk = N_BSSADDR(ex)); - current->mm->rss = 0; + // current->mm->rss = 0; + vx_rsspages_sub(current->mm, current->mm->rss); current->mm->mmap = NULL; compute_creds(bprm); current->flags &= ~PF_FORKNOEXEC; diff --git a/arch/sparc64/kernel/ptrace.c b/arch/sparc64/kernel/ptrace.c index 3e9aa09a9..8e5e09832 100644 --- a/arch/sparc64/kernel/ptrace.c +++ b/arch/sparc64/kernel/ptrace.c @@ -172,6 +172,10 @@ asmlinkage void do_ptrace(struct pt_regs *regs) pt_error_return(regs, ESRCH); goto out; } + if (!vx_check(vx_task_xid(child), VX_WATCH|VX_IDENT)) { + pt_error_return(regs, ESRCH); + goto out_tsk; + } if ((current->personality == PER_SUNOS && request == PTRACE_SUNATTACH) || (current->personality != PER_SUNOS && request == PTRACE_ATTACH)) { diff --git a/arch/sparc64/kernel/sys_sparc.c b/arch/sparc64/kernel/sys_sparc.c index d3ce03bd7..802949957 100644 --- a/arch/sparc64/kernel/sys_sparc.c +++ b/arch/sparc64/kernel/sys_sparc.c @@ -459,13 +459,13 @@ asmlinkage int sys_getdomainname(char __user *name, int len) down_read(&uts_sem); - nlen = strlen(system_utsname.domainname) + 1; + nlen = strlen(vx_new_uts(domainname)) + 1; if (nlen < len) len = nlen; if (len > __NEW_UTS_LEN) goto done; - if (copy_to_user(name, system_utsname.domainname, len)) + if (copy_to_user(name, vx_new_uts(domainname), len)) goto done; err = 0; done: diff --git a/arch/sparc64/kernel/systbls.S b/arch/sparc64/kernel/systbls.S index b2ce2cdad..66e82e77a 100644 --- a/arch/sparc64/kernel/systbls.S +++ b/arch/sparc64/kernel/systbls.S @@ -72,7 +72,7 @@ sys_call_table32: /*250*/ .word sys32_mremap, sys32_sysctl, sys_getsid, sys_fdatasync, compat_sys_nfsservctl .word sys_ni_syscall, compat_clock_settime, compat_clock_gettime, compat_clock_getres, compat_clock_nanosleep /*260*/ .word compat_sys_sched_getaffinity, compat_sys_sched_setaffinity, compat_timer_settime, compat_timer_gettime, sys_timer_getoverrun - .word sys_timer_delete, sys32_timer_create, sys_ni_syscall, compat_sys_io_setup, sys_io_destroy + .word sys_timer_delete, sys32_timer_create, sys_vserver, compat_sys_io_setup, sys_io_destroy /*270*/ .word compat_sys_io_submit, sys_io_cancel, compat_sys_io_getevents, compat_sys_mq_open, sys_mq_unlink .word sys32_mq_timedsend, sys32_mq_timedreceive, compat_sys_mq_notify, compat_sys_mq_getsetattr, sys_ni_syscall /*280*/ .word sys_ni_syscall, sys_ni_syscall, sys_ni_syscall @@ -136,7 +136,7 @@ sys_call_table: /*250*/ .word sys64_mremap, sys_sysctl, sys_getsid, sys_fdatasync, sys_nfsservctl .word sys_ni_syscall, sys_clock_settime, sys_clock_gettime, sys_clock_getres, sys_clock_nanosleep /*260*/ .word sys_sched_getaffinity, sys_sched_setaffinity, sys_timer_settime, sys_timer_gettime, sys_timer_getoverrun - .word sys_timer_delete, sys_timer_create, sys_ni_syscall, sys_io_setup, sys_io_destroy + .word sys_timer_delete, sys_timer_create, sys_vserver, sys_io_setup, sys_io_destroy /*270*/ .word sys_io_submit, sys_io_cancel, sys_io_getevents, sys_mq_open, sys_mq_unlink .word sys_mq_timedsend, sys_mq_timedreceive, sys_mq_notify, sys_mq_getsetattr, sys_ni_syscall /*280*/ .word sys_ni_syscall, sys_ni_syscall, sys_ni_syscall diff --git a/arch/sparc64/mm/hugetlbpage.c b/arch/sparc64/mm/hugetlbpage.c index 6da2759c2..c9954c2ec 100644 --- a/arch/sparc64/mm/hugetlbpage.c +++ b/arch/sparc64/mm/hugetlbpage.c @@ -59,7 +59,8 @@ static void set_huge_pte(struct mm_struct *mm, struct vm_area_struct *vma, unsigned long i; pte_t entry; - mm->rss += (HPAGE_SIZE / PAGE_SIZE); + // mm->rss += (HPAGE_SIZE / PAGE_SIZE); + vx_rsspages_add(mm, HPAGE_SIZE / PAGE_SIZE); if (write_access) entry = pte_mkwrite(pte_mkdirty(mk_pte(page, @@ -112,7 +113,8 @@ int copy_hugetlb_page_range(struct mm_struct *dst, struct mm_struct *src, pte_val(entry) += PAGE_SIZE; dst_pte++; } - dst->rss += (HPAGE_SIZE / PAGE_SIZE); + // dst->rss += (HPAGE_SIZE / PAGE_SIZE); + vx_rsspages_add(dst, HPAGE_SIZE / PAGE_SIZE); addr += HPAGE_SIZE; } return 0; @@ -203,7 +205,8 @@ void unmap_hugepage_range(struct vm_area_struct *vma, pte++; } } - mm->rss -= (end - start) >> PAGE_SHIFT; + // mm->rss -= (end - start) >> PAGE_SHIFT; + vx_rsspages_sub(mm, (end - start) >> PAGE_SHIFT); flush_tlb_range(vma, start, end); } diff --git a/arch/um/Kconfig b/arch/um/Kconfig index 47fbaf3f4..7ef333e57 100644 --- a/arch/um/Kconfig +++ b/arch/um/Kconfig @@ -188,6 +188,8 @@ source "net/Kconfig" source "fs/Kconfig" +source "kernel/vserver/Kconfig" + source "security/Kconfig" source "crypto/Kconfig" diff --git a/arch/um/kernel/ptrace.c b/arch/um/kernel/ptrace.c index c68c937f6..90f8d2861 100644 --- a/arch/um/kernel/ptrace.c +++ b/arch/um/kernel/ptrace.c @@ -58,6 +58,8 @@ int sys_ptrace(long request, long pid, long addr, long data) read_unlock(&tasklist_lock); if (!child) goto out; + if (!vx_check(vx_task_xid(child), VX_WATCH|VX_IDENT)) + goto out_tsk; ret = -EPERM; if (pid == 1) /* you may not mess with init */ diff --git a/arch/um/kernel/syscall_kern.c b/arch/um/kernel/syscall_kern.c index 2af5fc2e5..f3a72d2d8 100644 --- a/arch/um/kernel/syscall_kern.c +++ b/arch/um/kernel/syscall_kern.c @@ -264,7 +264,7 @@ int sys_uname(struct old_utsname * name) if (!name) return -EFAULT; down_read(&uts_sem); - err=copy_to_user(name, &system_utsname, sizeof (*name)); + err=copy_to_user(name, vx_new_utsname(), sizeof (*name)); up_read(&uts_sem); return err?-EFAULT:0; } @@ -272,6 +272,7 @@ int sys_uname(struct old_utsname * name) int sys_olduname(struct oldold_utsname * name) { int error; + struct new_utsname *ptr; if (!name) return -EFAULT; @@ -280,19 +281,20 @@ int sys_olduname(struct oldold_utsname * name) down_read(&uts_sem); - error = __copy_to_user(&name->sysname,&system_utsname.sysname, + ptr = vx_new_utsname(); + error = __copy_to_user(&name->sysname,ptr->sysname, __OLD_UTS_LEN); error |= __put_user(0,name->sysname+__OLD_UTS_LEN); - error |= __copy_to_user(&name->nodename,&system_utsname.nodename, + error |= __copy_to_user(&name->nodename,ptr->nodename, __OLD_UTS_LEN); error |= __put_user(0,name->nodename+__OLD_UTS_LEN); - error |= __copy_to_user(&name->release,&system_utsname.release, + error |= __copy_to_user(&name->release,ptr->release, __OLD_UTS_LEN); error |= __put_user(0,name->release+__OLD_UTS_LEN); - error |= __copy_to_user(&name->version,&system_utsname.version, + error |= __copy_to_user(&name->version,ptr->version, __OLD_UTS_LEN); error |= __put_user(0,name->version+__OLD_UTS_LEN); - error |= __copy_to_user(&name->machine,&system_utsname.machine, + error |= __copy_to_user(&name->machine,ptr->machine, __OLD_UTS_LEN); error |= __put_user(0,name->machine+__OLD_UTS_LEN); diff --git a/arch/v850/Kconfig b/arch/v850/Kconfig index 8665652e2..994e4f859 100644 --- a/arch/v850/Kconfig +++ b/arch/v850/Kconfig @@ -334,6 +334,8 @@ config NO_KERNEL_MSG endmenu +source "kernel/vserver/Kconfig" + source "security/Kconfig" source "crypto/Kconfig" diff --git a/arch/v850/kernel/ptrace.c b/arch/v850/kernel/ptrace.c index fc06058f2..7d2554774 100644 --- a/arch/v850/kernel/ptrace.c +++ b/arch/v850/kernel/ptrace.c @@ -138,6 +138,8 @@ int sys_ptrace(long request, long pid, long addr, long data) read_unlock(&tasklist_lock); if (!child) goto out; + if (!vx_check(vx_task_xid(child), VX_WATCH|VX_IDENT)) + goto out_tsk; rval = -EPERM; if (pid == 1) /* you may not mess with init */ diff --git a/arch/x86_64/Kconfig b/arch/x86_64/Kconfig index 2122afc52..1c07776ac 100644 --- a/arch/x86_64/Kconfig +++ b/arch/x86_64/Kconfig @@ -499,6 +499,8 @@ config IOMMU_LEAK endmenu +source "kernel/vserver/Kconfig" + source "security/Kconfig" source "crypto/Kconfig" diff --git a/arch/x86_64/ia32/ia32_aout.c b/arch/x86_64/ia32/ia32_aout.c index 040adf699..b7b698c68 100644 --- a/arch/x86_64/ia32/ia32_aout.c +++ b/arch/x86_64/ia32/ia32_aout.c @@ -308,7 +308,8 @@ static int load_aout_binary(struct linux_binprm * bprm, struct pt_regs * regs) (current->mm->start_brk = N_BSSADDR(ex)); current->mm->free_area_cache = TASK_UNMAPPED_BASE; - current->mm->rss = 0; + // current->mm->rss = 0; + vx_rsspages_sub(current->mm, current->mm->rss); current->mm->mmap = NULL; compute_creds(bprm); current->flags &= ~PF_FORKNOEXEC; diff --git a/arch/x86_64/ia32/ia32_binfmt.c b/arch/x86_64/ia32/ia32_binfmt.c index d8104898c..fc1a9b01a 100644 --- a/arch/x86_64/ia32/ia32_binfmt.c +++ b/arch/x86_64/ia32/ia32_binfmt.c @@ -327,7 +327,7 @@ static void elf32_init(struct pt_regs *regs) int setup_arg_pages(struct linux_binprm *bprm, int executable_stack) { - unsigned long stack_base; + unsigned long stack_base, grow; struct vm_area_struct *mpnt; struct mm_struct *mm = current->mm; int i; @@ -344,7 +344,10 @@ int setup_arg_pages(struct linux_binprm *bprm, int executable_stack) if (!mpnt) return -ENOMEM; - if (security_vm_enough_memory((IA32_STACK_TOP - (PAGE_MASK & (unsigned long) bprm->p))>>PAGE_SHIFT)) { + grow = (IA32_STACK_TOP - (PAGE_MASK & (unsigned long) bprm->p)) + >> PAGE_SHIFT; + if (security_vm_enough_memory(grow) || + !vx_vmpages_avail(mm, grow)) { kmem_cache_free(vm_area_cachep, mpnt); return -ENOMEM; } @@ -365,7 +368,9 @@ int setup_arg_pages(struct linux_binprm *bprm, int executable_stack) mpnt->vm_page_prot = (mpnt->vm_flags & VM_EXEC) ? PAGE_COPY_EXEC : PAGE_COPY; insert_vm_struct(mm, mpnt); - mm->total_vm = (mpnt->vm_end - mpnt->vm_start) >> PAGE_SHIFT; + // mm->total_vm = (mpnt->vm_end - mpnt->vm_start) >> PAGE_SHIFT; + vx_vmpages_sub(mm, mm->total_vm - + ((mpnt->vm_end - mpnt->vm_start) >> PAGE_SHIFT)); } for (i = 0 ; i < MAX_ARG_PAGES ; i++) { diff --git a/arch/x86_64/ia32/sys_ia32.c b/arch/x86_64/ia32/sys_ia32.c index af5f3218a..08a60e519 100644 --- a/arch/x86_64/ia32/sys_ia32.c +++ b/arch/x86_64/ia32/sys_ia32.c @@ -1059,6 +1059,7 @@ asmlinkage long sys32_mmap2(unsigned long addr, unsigned long len, asmlinkage long sys32_olduname(struct oldold_utsname __user * name) { int error; + struct new_utsname *ptr; if (!name) return -EFAULT; @@ -1067,13 +1068,14 @@ asmlinkage long sys32_olduname(struct oldold_utsname __user * name) down_read(&uts_sem); - error = __copy_to_user(&name->sysname,&system_utsname.sysname,__OLD_UTS_LEN); + ptr = vx_new_utsname(); + error = __copy_to_user(&name->sysname,ptr->sysname,__OLD_UTS_LEN); __put_user(0,name->sysname+__OLD_UTS_LEN); - __copy_to_user(&name->nodename,&system_utsname.nodename,__OLD_UTS_LEN); + __copy_to_user(&name->nodename,ptr->nodename,__OLD_UTS_LEN); __put_user(0,name->nodename+__OLD_UTS_LEN); - __copy_to_user(&name->release,&system_utsname.release,__OLD_UTS_LEN); + __copy_to_user(&name->release,ptr->release,__OLD_UTS_LEN); __put_user(0,name->release+__OLD_UTS_LEN); - __copy_to_user(&name->version,&system_utsname.version,__OLD_UTS_LEN); + __copy_to_user(&name->version,ptr->version,__OLD_UTS_LEN); __put_user(0,name->version+__OLD_UTS_LEN); { char *arch = "x86_64"; @@ -1096,7 +1098,7 @@ long sys32_uname(struct old_utsname __user * name) if (!name) return -EFAULT; down_read(&uts_sem); - err=copy_to_user(name, &system_utsname, sizeof (*name)); + err=copy_to_user(name, vx_new_utsname(), sizeof (*name)); up_read(&uts_sem); if (personality(current->personality) == PER_LINUX32) err |= copy_to_user(&name->machine, "i686", 5); diff --git a/arch/x86_64/kernel/ptrace.c b/arch/x86_64/kernel/ptrace.c index 5dd7752ae..d07a45b01 100644 --- a/arch/x86_64/kernel/ptrace.c +++ b/arch/x86_64/kernel/ptrace.c @@ -208,6 +208,8 @@ asmlinkage long sys_ptrace(long request, long pid, unsigned long addr, long data read_unlock(&tasklist_lock); if (!child) goto out; + if (!vx_check(vx_task_xid(child), VX_WATCH|VX_IDENT)) + goto out_tsk; ret = -EPERM; if (pid == 1) /* you may not mess with init */ diff --git a/arch/x86_64/kernel/sys_x86_64.c b/arch/x86_64/kernel/sys_x86_64.c index 38a286ca3..a2c5b038f 100644 --- a/arch/x86_64/kernel/sys_x86_64.c +++ b/arch/x86_64/kernel/sys_x86_64.c @@ -146,7 +146,7 @@ asmlinkage long sys_uname(struct new_utsname __user * name) { int err; down_read(&uts_sem); - err = copy_to_user(name, &system_utsname, sizeof (*name)); + err = copy_to_user(name, vx_new_utsname(), sizeof (*name)); up_read(&uts_sem); if (personality(current->personality) == PER_LINUX32) err |= copy_to_user(&name->machine, "i686", 5); diff --git a/configs/kernel-2.6.6-i586-smp.config b/configs/kernel-2.6.6-i586-smp.config index 2ac8f42d7..c776cab9f 100644 --- a/configs/kernel-2.6.6-i586-smp.config +++ b/configs/kernel-2.6.6-i586-smp.config @@ -2293,6 +2293,18 @@ CONFIG_DEBUG_SPINLOCK_SLEEP=y CONFIG_X86_FIND_SMP_CONFIG=y CONFIG_X86_MPPARSE=y +# +# Linux VServer +# +CONFIG_VSERVER_LEGACY=y +CONFIG_PROC_SECURE=y +# CONFIG_VSERVER_HARDCPU is not set +# CONFIG_INOXID_NONE is not set +# CONFIG_INOXID_GID16 is not set +CONFIG_INOXID_GID24=y +# CONFIG_INOXID_GID32 is not set +# CONFIG_INOXID_MAGIC is not set + # # Security options # diff --git a/configs/kernel-2.6.6-i586.config b/configs/kernel-2.6.6-i586.config index acf01adf2..eb84e1a7d 100644 --- a/configs/kernel-2.6.6-i586.config +++ b/configs/kernel-2.6.6-i586.config @@ -2313,6 +2313,18 @@ CONFIG_DEBUG_INFO=y CONFIG_DEBUG_SPINLOCK_SLEEP=y # CONFIG_FRAME_POINTER is not set +# +# Linux VServer +# +CONFIG_VSERVER_LEGACY=y +CONFIG_PROC_SECURE=y +# CONFIG_VSERVER_HARDCPU is not set +# CONFIG_INOXID_NONE is not set +# CONFIG_INOXID_GID16 is not set +CONFIG_INOXID_GID24=y +# CONFIG_INOXID_GID32 is not set +# CONFIG_INOXID_MAGIC is not set + # # Security options # diff --git a/configs/kernel-2.6.6-i686-smp.config b/configs/kernel-2.6.6-i686-smp.config index de7e3e791..323a7faf2 100644 --- a/configs/kernel-2.6.6-i686-smp.config +++ b/configs/kernel-2.6.6-i686-smp.config @@ -2296,6 +2296,18 @@ CONFIG_DEBUG_SPINLOCK_SLEEP=y CONFIG_X86_FIND_SMP_CONFIG=y CONFIG_X86_MPPARSE=y +# +# Linux VServer +# +CONFIG_VSERVER_LEGACY=y +CONFIG_PROC_SECURE=y +# CONFIG_VSERVER_HARDCPU is not set +# CONFIG_INOXID_NONE is not set +# CONFIG_INOXID_GID16 is not set +CONFIG_INOXID_GID24=y +# CONFIG_INOXID_GID32 is not set +# CONFIG_INOXID_MAGIC is not set + # # Security options # diff --git a/configs/kernel-2.6.6-i686.config b/configs/kernel-2.6.6-i686.config index c245c3d55..f416d4c37 100644 --- a/configs/kernel-2.6.6-i686.config +++ b/configs/kernel-2.6.6-i686.config @@ -2314,6 +2314,18 @@ CONFIG_DEBUG_INFO=y CONFIG_DEBUG_SPINLOCK_SLEEP=y # CONFIG_FRAME_POINTER is not set +# +# Linux VServer +# +CONFIG_VSERVER_LEGACY=y +CONFIG_PROC_SECURE=y +# CONFIG_VSERVER_HARDCPU is not set +# CONFIG_INOXID_NONE is not set +# CONFIG_INOXID_GID16 is not set +CONFIG_INOXID_GID24=y +# CONFIG_INOXID_GID32 is not set +# CONFIG_INOXID_MAGIC is not set + # # Security options # diff --git a/fs/attr.c b/fs/attr.c index d63350cfc..5bb63a855 100644 --- a/fs/attr.c +++ b/fs/attr.c @@ -62,6 +62,24 @@ error: EXPORT_SYMBOL(inode_change_ok); +int inode_setattr_flags(struct inode *inode, unsigned int flags) +{ + unsigned int oldflags, newflags; + + oldflags = inode->i_flags; + newflags = oldflags & ~(S_IMMUTABLE | S_IUNLINK | S_BARRIER); + if (flags & ATTR_FLAG_IMMUTABLE) + newflags |= S_IMMUTABLE; + if (flags & ATTR_FLAG_IUNLINK) + newflags |= S_IUNLINK; + if (flags & ATTR_FLAG_BARRIER) + newflags |= S_BARRIER; + + if (oldflags ^ newflags) + inode->i_flags = newflags; + return 0; +} + int inode_setattr(struct inode * inode, struct iattr * attr) { unsigned int ia_valid = attr->ia_valid; @@ -98,6 +116,8 @@ int inode_setattr(struct inode * inode, struct iattr * attr) mode &= ~S_ISGID; inode->i_mode = mode; } + if (ia_valid & ATTR_ATTR_FLAG) + inode_setattr_flags(inode, attr->ia_attr_flags); mark_inode_dirty(inode); out: return error; diff --git a/fs/binfmt_aout.c b/fs/binfmt_aout.c index a31cba58e..8db14c6df 100644 --- a/fs/binfmt_aout.c +++ b/fs/binfmt_aout.c @@ -310,7 +310,8 @@ static int load_aout_binary(struct linux_binprm * bprm, struct pt_regs * regs) current->mm->free_area_cache = TASK_UNMAPPED_BASE; /* unlimited stack is larger than TASK_SIZE */ current->mm->non_executable_cache = current->mm->mmap_top; - current->mm->rss = 0; + // current->mm->rss = 0; + vx_rsspages_sub(current->mm, current->mm->rss); current->mm->mmap = NULL; compute_creds(bprm); current->flags &= ~PF_FORKNOEXEC; diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c index 908661518..d9e71fc7d 100644 --- a/fs/binfmt_elf.c +++ b/fs/binfmt_elf.c @@ -767,7 +767,8 @@ static int load_elf_binary(struct linux_binprm * bprm, struct pt_regs * regs) /* Do this so that we can load the interpreter, if need be. We will change some of these later */ - current->mm->rss = 0; + // current->mm->rss = 0; + vx_rsspages_sub(current->mm, current->mm->rss); current->mm->free_area_cache = TASK_UNMAPPED_BASE; current->mm->non_executable_cache = current->mm->mmap_top; retval = setup_arg_pages(bprm, executable_stack); diff --git a/fs/binfmt_flat.c b/fs/binfmt_flat.c index 465133cd6..8728d532d 100644 --- a/fs/binfmt_flat.c +++ b/fs/binfmt_flat.c @@ -651,7 +651,8 @@ static int load_flat_file(struct linux_binprm * bprm, current->mm->start_brk = datapos + data_len + bss_len; current->mm->brk = (current->mm->start_brk + 3) & ~3; current->mm->context.end_brk = memp + ksize((void *) memp) - stack_len; - current->mm->rss = 0; + // current->mm->rss = 0; + vx_rsspages_sub(current->mm, current->mm->rss); } if (flags & FLAT_FLAG_KTRACE) diff --git a/fs/binfmt_som.c b/fs/binfmt_som.c index d7e5f1f23..496196b4e 100644 --- a/fs/binfmt_som.c +++ b/fs/binfmt_som.c @@ -259,7 +259,8 @@ load_som_binary(struct linux_binprm * bprm, struct pt_regs * regs) create_som_tables(bprm); current->mm->start_stack = bprm->p; - current->mm->rss = 0; + // current->mm->rss = 0; + vx_rsspages_sub(current->mm, current->mm->rss); #if 0 printk("(start_brk) %08lx\n" , (unsigned long) current->mm->start_brk); diff --git a/fs/devpts/inode.c b/fs/devpts/inode.c index 1d49ef4af..17b686a82 100644 --- a/fs/devpts/inode.c +++ b/fs/devpts/inode.c @@ -18,6 +18,7 @@ #include #include #include +#include #include "xattr.h" #define DEVPTS_SUPER_MAGIC 0x1cd1 @@ -134,11 +135,21 @@ static struct dentry *get_node(int num) return lookup_one_len(s, root, sprintf(s, "%d", num)); } +static int devpts_permission(struct inode *inode, int mask, struct nameidata *nd) +{ + int ret = -EACCES; + + if (vx_check(inode->i_xid, VX_IDENT)) + ret = vfs_permission(inode, mask); + return ret; +} + static struct inode_operations devpts_file_inode_operations = { .setxattr = devpts_setxattr, .getxattr = devpts_getxattr, .listxattr = devpts_listxattr, .removexattr = devpts_removexattr, + .permission = devpts_permission, }; int devpts_pty_new(struct tty_struct *tty) @@ -162,6 +173,7 @@ int devpts_pty_new(struct tty_struct *tty) inode->i_gid = config.setgid ? config.gid : current->fsgid; inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME; init_special_inode(inode, S_IFCHR|config.mode, device); + inode->i_xid = vx_current_xid(); inode->i_op = &devpts_file_inode_operations; inode->u.generic_ip = tty; diff --git a/fs/exec.c b/fs/exec.c index 3ba35b672..c5a7dfcff 100644 --- a/fs/exec.c +++ b/fs/exec.c @@ -320,7 +320,8 @@ void install_arg_page(struct vm_area_struct *vma, pte_unmap(pte); goto out; } - mm->rss++; + // mm->rss++; + vx_rsspages_inc(mm); lru_cache_add_active(page); set_pte(pte, pte_mkdirty(pte_mkwrite(mk_pte( page, vma->vm_page_prot)))); @@ -409,7 +410,8 @@ int setup_arg_pages(struct linux_binprm *bprm, int executable_stack) if (!mpnt) return -ENOMEM; - if (security_vm_enough_memory(arg_size >> PAGE_SHIFT)) { + if (security_vm_enough_memory(arg_size >> PAGE_SHIFT) || + !vx_vmpages_avail(mm, arg_size >> PAGE_SHIFT)) { kmem_cache_free(vm_area_cachep, mpnt); return -ENOMEM; } @@ -438,7 +440,9 @@ int setup_arg_pages(struct linux_binprm *bprm, int executable_stack) mpnt->vm_flags = VM_STACK_FLAGS; mpnt->vm_page_prot = protection_map[mpnt->vm_flags & 0x7]; insert_vm_struct(mm, mpnt); - mm->total_vm = (mpnt->vm_end - mpnt->vm_start) >> PAGE_SHIFT; + // mm->total_vm = (mpnt->vm_end - mpnt->vm_start) >> PAGE_SHIFT; + vx_vmpages_sub(mm, mm->total_vm - + ((mpnt->vm_end - mpnt->vm_start) >> PAGE_SHIFT)); } for (i = 0 ; i < MAX_ARG_PAGES ; i++) { diff --git a/fs/ext2/ialloc.c b/fs/ext2/ialloc.c index e03b54231..5aa6769ba 100644 --- a/fs/ext2/ialloc.c +++ b/fs/ext2/ialloc.c @@ -579,7 +579,8 @@ got: inode->i_blocks = 0; inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME; memset(ei->i_data, 0, sizeof(ei->i_data)); - ei->i_flags = EXT2_I(dir)->i_flags & ~EXT2_BTREE_FL; + ei->i_flags = EXT2_I(dir)->i_flags & + ~(EXT2_BTREE_FL|EXT2_IUNLINK_FL|EXT2_BARRIER_FL); if (S_ISLNK(mode)) ei->i_flags &= ~(EXT2_IMMUTABLE_FL|EXT2_APPEND_FL); /* dirsync is only applied to directories */ diff --git a/fs/ext2/inode.c b/fs/ext2/inode.c index 769c0b3af..4389ac953 100644 --- a/fs/ext2/inode.c +++ b/fs/ext2/inode.c @@ -31,6 +31,7 @@ #include #include #include +#include #include "ext2.h" #include "acl.h" @@ -65,6 +66,8 @@ void ext2_put_inode(struct inode *inode) ext2_discard_prealloc(inode); } +static void ext2_truncate_nocheck (struct inode * inode); + /* * Called at the last iput() if i_nlink is zero. */ @@ -78,7 +81,7 @@ void ext2_delete_inode (struct inode * inode) inode->i_size = 0; if (inode->i_blocks) - ext2_truncate (inode); + ext2_truncate_nocheck(inode); ext2_free_inode (inode); return; @@ -878,7 +881,7 @@ static void ext2_free_branches(struct inode *inode, u32 *p, u32 *q, int depth) ext2_free_data(inode, p, q); } -void ext2_truncate (struct inode * inode) +static void ext2_truncate_nocheck(struct inode * inode) { u32 *i_data = EXT2_I(inode)->i_data; int addr_per_block = EXT2_ADDR_PER_BLOCK(inode->i_sb); @@ -895,8 +898,6 @@ void ext2_truncate (struct inode * inode) return; if (ext2_inode_is_fast_symlink(inode)) return; - if (IS_APPEND(inode) || IS_IMMUTABLE(inode)) - return; ext2_discard_prealloc(inode); @@ -1018,6 +1019,13 @@ Egdp: return ERR_PTR(-EIO); } +void ext2_truncate (struct inode * inode) +{ + if (IS_APPEND(inode) || IS_IMMUTABLE(inode)) + return; + ext2_truncate_nocheck(inode); +} + void ext2_set_inode_flags(struct inode *inode) { unsigned int flags = EXT2_I(inode)->i_flags; @@ -1029,6 +1037,10 @@ void ext2_set_inode_flags(struct inode *inode) inode->i_flags |= S_APPEND; if (flags & EXT2_IMMUTABLE_FL) inode->i_flags |= S_IMMUTABLE; + if (flags & EXT2_IUNLINK_FL) + inode->i_flags |= S_IUNLINK; + if (flags & EXT2_BARRIER_FL) + inode->i_flags |= S_BARRIER; if (flags & EXT2_NOATIME_FL) inode->i_flags |= S_NOATIME; if (flags & EXT2_DIRSYNC_FL) @@ -1041,6 +1053,8 @@ void ext2_read_inode (struct inode * inode) ino_t ino = inode->i_ino; struct buffer_head * bh; struct ext2_inode * raw_inode = ext2_get_inode(inode->i_sb, ino, &bh); + uid_t uid; + gid_t gid; int n; #ifdef CONFIG_EXT2_FS_POSIX_ACL @@ -1051,12 +1065,17 @@ void ext2_read_inode (struct inode * inode) goto bad_inode; inode->i_mode = le16_to_cpu(raw_inode->i_mode); - inode->i_uid = (uid_t)le16_to_cpu(raw_inode->i_uid_low); - inode->i_gid = (gid_t)le16_to_cpu(raw_inode->i_gid_low); + uid = (uid_t)le16_to_cpu(raw_inode->i_uid_low); + gid = (gid_t)le16_to_cpu(raw_inode->i_gid_low); if (!(test_opt (inode->i_sb, NO_UID32))) { - inode->i_uid |= le16_to_cpu(raw_inode->i_uid_high) << 16; - inode->i_gid |= le16_to_cpu(raw_inode->i_gid_high) << 16; + uid |= le16_to_cpu(raw_inode->i_uid_high) << 16; + gid |= le16_to_cpu(raw_inode->i_gid_high) << 16; } + inode->i_uid = INOXID_UID(uid, gid); + inode->i_gid = INOXID_GID(uid, gid); + if (inode->i_sb->s_flags & MS_TAGXID) + inode->i_xid = INOXID_XID(uid, gid, le16_to_cpu(raw_inode->i_raw_xid)); + inode->i_nlink = le16_to_cpu(raw_inode->i_links_count); inode->i_size = le32_to_cpu(raw_inode->i_size); inode->i_atime.tv_sec = le32_to_cpu(raw_inode->i_atime); @@ -1149,8 +1168,8 @@ static int ext2_update_inode(struct inode * inode, int do_sync) struct ext2_inode_info *ei = EXT2_I(inode); struct super_block *sb = inode->i_sb; ino_t ino = inode->i_ino; - uid_t uid = inode->i_uid; - gid_t gid = inode->i_gid; + uid_t uid = XIDINO_UID(inode->i_uid, inode->i_xid); + gid_t gid = XIDINO_GID(inode->i_gid, inode->i_xid); struct buffer_head * bh; struct ext2_inode * raw_inode = ext2_get_inode(sb, ino, &bh); int n; @@ -1185,6 +1204,9 @@ static int ext2_update_inode(struct inode * inode, int do_sync) raw_inode->i_uid_high = 0; raw_inode->i_gid_high = 0; } +#ifdef CONFIG_INOXID_GID32 + raw_inode->i_raw_xid = cpu_to_le16(inode->i_xid); +#endif raw_inode->i_links_count = cpu_to_le16(inode->i_nlink); raw_inode->i_size = cpu_to_le32(inode->i_size); raw_inode->i_atime = cpu_to_le32(inode->i_atime.tv_sec); @@ -1262,6 +1284,27 @@ int ext2_sync_inode(struct inode *inode) return sync_inode(inode, &wbc); } +int ext2_setattr_flags(struct inode *inode, unsigned int flags) +{ + unsigned int oldflags, newflags; + + oldflags = EXT2_I(inode)->i_flags; + newflags = oldflags & + ~(EXT2_IMMUTABLE_FL | EXT2_IUNLINK_FL | EXT2_BARRIER_FL); + if (flags & ATTR_FLAG_IMMUTABLE) + newflags |= EXT2_IMMUTABLE_FL; + if (flags & ATTR_FLAG_IUNLINK) + newflags |= EXT2_IUNLINK_FL; + if (flags & ATTR_FLAG_BARRIER) + newflags |= EXT2_BARRIER_FL; + + if (oldflags ^ newflags) { + EXT2_I(inode)->i_flags = newflags; + inode->i_ctime = CURRENT_TIME; + } + return 0; +} + int ext2_setattr(struct dentry *dentry, struct iattr *iattr) { struct inode *inode = dentry->d_inode; @@ -1276,6 +1319,9 @@ int ext2_setattr(struct dentry *dentry, struct iattr *iattr) if (error) return error; } + if (iattr->ia_valid & ATTR_ATTR_FLAG) + ext2_setattr_flags(inode, iattr->ia_attr_flags); + inode_setattr(inode, iattr); if (iattr->ia_valid & ATTR_MODE) error = ext2_acl_chmod(inode); diff --git a/fs/ext2/super.c b/fs/ext2/super.c index 3a06830a5..3e54fbeac 100644 --- a/fs/ext2/super.c +++ b/fs/ext2/super.c @@ -270,7 +270,7 @@ enum { Opt_bsd_df, Opt_minix_df, Opt_grpid, Opt_nogrpid, Opt_resgid, Opt_resuid, Opt_sb, Opt_err_cont, Opt_err_panic, Opt_err_ro, Opt_nouid32, Opt_check, Opt_nocheck, Opt_debug, Opt_oldalloc, Opt_orlov, Opt_nobh, - Opt_user_xattr, Opt_nouser_xattr, Opt_acl, Opt_noacl, + Opt_user_xattr, Opt_nouser_xattr, Opt_acl, Opt_noacl, Opt_tagxid, Opt_ignore, Opt_err, }; @@ -299,6 +299,7 @@ static match_table_t tokens = { {Opt_nouser_xattr, "nouser_xattr"}, {Opt_acl, "acl"}, {Opt_noacl, "noacl"}, + {Opt_tagxid, "tagxid"}, {Opt_ignore, "grpquota"}, {Opt_ignore, "noquota"}, {Opt_ignore, "quota"}, @@ -362,6 +363,11 @@ static int parse_options (char * options, case Opt_nouid32: set_opt (sbi->s_mount_opt, NO_UID32); break; +#ifndef CONFIG_INOXID_NONE + case Opt_tagxid: + set_opt (sbi->s_mount_opt, TAG_XID); + break; +#endif case Opt_check: #ifdef CONFIG_EXT2_CHECK set_opt (sbi->s_mount_opt, CHECK); @@ -646,6 +652,8 @@ static int ext2_fill_super(struct super_block *sb, void *data, int silent) if (!parse_options ((char *) data, sbi)) goto failed_mount; + if (EXT2_SB(sb)->s_mount_opt & EXT2_MOUNT_TAG_XID) + sb->s_flags |= MS_TAGXID; sb->s_flags = (sb->s_flags & ~MS_POSIXACL) | ((EXT2_SB(sb)->s_mount_opt & EXT2_MOUNT_POSIX_ACL) ? MS_POSIXACL : 0); diff --git a/fs/ext3/ialloc.c b/fs/ext3/ialloc.c index 11ac3c2dc..c68240561 100644 --- a/fs/ext3/ialloc.c +++ b/fs/ext3/ialloc.c @@ -567,7 +567,8 @@ got: ei->i_dir_start_lookup = 0; ei->i_disksize = 0; - ei->i_flags = EXT3_I(dir)->i_flags & ~EXT3_INDEX_FL; + ei->i_flags = EXT3_I(dir)->i_flags & + ~(EXT3_INDEX_FL|EXT3_IUNLINK_FL|EXT3_BARRIER_FL); if (S_ISLNK(mode)) ei->i_flags &= ~(EXT3_IMMUTABLE_FL|EXT3_APPEND_FL); /* dirsync only applies to directories */ diff --git a/fs/ext3/inode.c b/fs/ext3/inode.c index f6f61f741..433ba25ed 100644 --- a/fs/ext3/inode.c +++ b/fs/ext3/inode.c @@ -36,6 +36,7 @@ #include #include #include +#include #include "xattr.h" #include "acl.h" @@ -176,6 +177,8 @@ static int ext3_journal_test_restart(handle_t *handle, struct inode *inode) return ext3_journal_restart(handle, blocks_for_truncate(inode)); } +static void ext3_truncate_nocheck (struct inode *inode); + /* * Called at the last iput() if i_nlink is zero. */ @@ -199,7 +202,7 @@ void ext3_delete_inode (struct inode * inode) handle->h_sync = 1; inode->i_size = 0; if (inode->i_blocks) - ext3_truncate(inode); + ext3_truncate_nocheck(inode); /* * Kill off the orphan record which ext3_truncate created. * AKPM: I think this can be inside the above `if'. @@ -2020,7 +2023,7 @@ static void ext3_free_branches(handle_t *handle, struct inode *inode, * ext3_truncate() run will find them and release them. */ -void ext3_truncate(struct inode * inode) +void ext3_truncate_nocheck(struct inode * inode) { handle_t *handle; struct ext3_inode_info *ei = EXT3_I(inode); @@ -2041,8 +2044,6 @@ void ext3_truncate(struct inode * inode) return; if (ext3_inode_is_fast_symlink(inode)) return; - if (IS_APPEND(inode) || IS_IMMUTABLE(inode)) - return; ext3_discard_reservation(inode); @@ -2351,6 +2352,13 @@ has_buffer: return 0; } +void ext3_truncate(struct inode * inode) +{ + if (IS_APPEND(inode) || IS_IMMUTABLE(inode)) + return; + ext3_truncate_nocheck(inode); +} + void ext3_set_inode_flags(struct inode *inode) { unsigned int flags = EXT3_I(inode)->i_flags; @@ -2362,6 +2370,10 @@ void ext3_set_inode_flags(struct inode *inode) inode->i_flags |= S_APPEND; if (flags & EXT3_IMMUTABLE_FL) inode->i_flags |= S_IMMUTABLE; + if (flags & EXT3_IUNLINK_FL) + inode->i_flags |= S_IUNLINK; + if (flags & EXT3_BARRIER_FL) + inode->i_flags |= S_BARRIER; if (flags & EXT3_NOATIME_FL) inode->i_flags |= S_NOATIME; if (flags & EXT3_DIRSYNC_FL) @@ -2375,6 +2387,8 @@ void ext3_read_inode(struct inode * inode) struct ext3_inode_info *ei = EXT3_I(inode); struct buffer_head *bh; int block; + uid_t uid; + gid_t gid; #ifdef CONFIG_EXT3_FS_POSIX_ACL ei->i_acl = EXT3_ACL_NOT_CACHED; @@ -2385,12 +2399,17 @@ void ext3_read_inode(struct inode * inode) bh = iloc.bh; raw_inode = ext3_raw_inode(&iloc); inode->i_mode = le16_to_cpu(raw_inode->i_mode); - inode->i_uid = (uid_t)le16_to_cpu(raw_inode->i_uid_low); - inode->i_gid = (gid_t)le16_to_cpu(raw_inode->i_gid_low); + uid = (uid_t)le16_to_cpu(raw_inode->i_uid_low); + gid = (gid_t)le16_to_cpu(raw_inode->i_gid_low); if(!(test_opt (inode->i_sb, NO_UID32))) { - inode->i_uid |= le16_to_cpu(raw_inode->i_uid_high) << 16; - inode->i_gid |= le16_to_cpu(raw_inode->i_gid_high) << 16; + uid |= le16_to_cpu(raw_inode->i_uid_high) << 16; + gid |= le16_to_cpu(raw_inode->i_gid_high) << 16; } + inode->i_uid = INOXID_UID(uid, gid); + inode->i_gid = INOXID_GID(uid, gid); + if (inode->i_sb->s_flags & MS_TAGXID) + inode->i_xid = INOXID_XID(uid, gid, le16_to_cpu(raw_inode->i_raw_xid)); + inode->i_nlink = le16_to_cpu(raw_inode->i_links_count); inode->i_size = le32_to_cpu(raw_inode->i_size); inode->i_atime.tv_sec = le32_to_cpu(raw_inode->i_atime); @@ -2498,6 +2517,8 @@ static int ext3_do_update_inode(handle_t *handle, struct ext3_inode *raw_inode = ext3_raw_inode(iloc); struct ext3_inode_info *ei = EXT3_I(inode); struct buffer_head *bh = iloc->bh; + uid_t uid = XIDINO_UID(inode->i_uid, inode->i_xid); + gid_t gid = XIDINO_GID(inode->i_gid, inode->i_xid); int err = 0, rc, block; /* For fields not not tracking in the in-memory inode, @@ -2507,29 +2528,32 @@ static int ext3_do_update_inode(handle_t *handle, raw_inode->i_mode = cpu_to_le16(inode->i_mode); if(!(test_opt(inode->i_sb, NO_UID32))) { - raw_inode->i_uid_low = cpu_to_le16(low_16_bits(inode->i_uid)); - raw_inode->i_gid_low = cpu_to_le16(low_16_bits(inode->i_gid)); + raw_inode->i_uid_low = cpu_to_le16(low_16_bits(uid)); + raw_inode->i_gid_low = cpu_to_le16(low_16_bits(gid)); /* * Fix up interoperability with old kernels. Otherwise, old inodes get * re-used with the upper 16 bits of the uid/gid intact */ if(!ei->i_dtime) { raw_inode->i_uid_high = - cpu_to_le16(high_16_bits(inode->i_uid)); + cpu_to_le16(high_16_bits(uid)); raw_inode->i_gid_high = - cpu_to_le16(high_16_bits(inode->i_gid)); + cpu_to_le16(high_16_bits(gid)); } else { raw_inode->i_uid_high = 0; raw_inode->i_gid_high = 0; } } else { raw_inode->i_uid_low = - cpu_to_le16(fs_high2lowuid(inode->i_uid)); + cpu_to_le16(fs_high2lowuid(uid)); raw_inode->i_gid_low = - cpu_to_le16(fs_high2lowgid(inode->i_gid)); + cpu_to_le16(fs_high2lowgid(gid)); raw_inode->i_uid_high = 0; raw_inode->i_gid_high = 0; } +#ifdef CONFIG_INOXID_GID32 + raw_inode->i_raw_xid = cpu_to_le16(inode->i_xid); +#endif raw_inode->i_links_count = cpu_to_le16(inode->i_nlink); raw_inode->i_size = cpu_to_le32(ei->i_disksize); raw_inode->i_atime = cpu_to_le32(inode->i_atime.tv_sec); @@ -2651,6 +2675,44 @@ void ext3_write_inode(struct inode *inode, int wait) ext3_force_commit(inode->i_sb); } +int ext3_setattr_flags(struct inode *inode, unsigned int flags) +{ + unsigned int oldflags, newflags; + int err = 0; + + oldflags = EXT3_I(inode)->i_flags; + newflags = oldflags & + ~(EXT3_IMMUTABLE_FL | EXT3_IUNLINK_FL | EXT3_BARRIER_FL); + if (flags & ATTR_FLAG_IMMUTABLE) + newflags |= EXT3_IMMUTABLE_FL; + if (flags & ATTR_FLAG_IUNLINK) + newflags |= EXT3_IUNLINK_FL; + if (flags & ATTR_FLAG_BARRIER) + newflags |= EXT3_BARRIER_FL; + + if (oldflags ^ newflags) { + handle_t *handle; + struct ext3_iloc iloc; + + handle = ext3_journal_start(inode, 1); + if (IS_ERR(handle)) + return PTR_ERR(handle); + if (IS_SYNC(inode)) + handle->h_sync = 1; + err = ext3_reserve_inode_write(handle, inode, &iloc); + if (err) + goto flags_err; + + EXT3_I(inode)->i_flags = newflags; + inode->i_ctime = CURRENT_TIME; + + err = ext3_mark_iloc_dirty(handle, inode, &iloc); + flags_err: + ext3_journal_stop(handle); + } + return err; +} + /* * ext3_setattr() * @@ -2722,6 +2784,12 @@ int ext3_setattr(struct dentry *dentry, struct iattr *attr) ext3_journal_stop(handle); } + if (ia_valid & ATTR_ATTR_FLAG) { + rc = ext3_setattr_flags(inode, attr->ia_attr_flags); + if (!error) + error = rc; + } + rc = inode_setattr(inode, attr); /* If inode_setattr's call to ext3_truncate failed to get a diff --git a/fs/ext3/ioctl.c b/fs/ext3/ioctl.c index e2ea75cf8..cac06b641 100644 --- a/fs/ext3/ioctl.c +++ b/fs/ext3/ioctl.c @@ -12,6 +12,7 @@ #include #include #include +#include #include @@ -220,6 +221,38 @@ flags_err: } +#if defined(CONFIG_VSERVER_LEGACY) && !defined(CONFIG_INOXID_NONE) + case EXT3_IOC_SETXID: { + handle_t *handle; + struct ext3_iloc iloc; + int xid; + int err; + + /* fixme: if stealth, return -ENOTTY */ + if (!capable(CAP_CONTEXT)) + return -EPERM; + if (IS_RDONLY(inode)) + return -EROFS; + if (!(inode->i_sb->s_flags & MS_TAGXID)) + return -ENOSYS; + if (get_user(xid, (int *) arg)) + return -EFAULT; + + handle = ext3_journal_start(inode, 1); + if (IS_ERR(handle)) + return PTR_ERR(handle); + err = ext3_reserve_inode_write(handle, inode, &iloc); + if (err) + return err; + + inode->i_xid = (xid & 0xFFFF); + inode->i_ctime = CURRENT_TIME; + + err = ext3_mark_iloc_dirty(handle, inode, &iloc); + ext3_journal_stop(handle); + return err; + } +#endif default: return -ENOTTY; } diff --git a/fs/ext3/super.c b/fs/ext3/super.c index 9c5901176..1aa5b0491 100644 --- a/fs/ext3/super.c +++ b/fs/ext3/super.c @@ -585,7 +585,7 @@ enum { Opt_abort, Opt_data_journal, Opt_data_ordered, Opt_data_writeback, Opt_usrjquota, Opt_grpjquota, Opt_offusrjquota, Opt_offgrpjquota, Opt_jqfmt_vfsold, Opt_jqfmt_vfsv0, - Opt_ignore, Opt_err, Opt_resize, + Opt_tagxid, Opt_ignore, Opt_err, Opt_resize, }; static match_table_t tokens = { @@ -628,6 +628,7 @@ static match_table_t tokens = { {Opt_grpjquota, "grpjquota=%s"}, {Opt_jqfmt_vfsold, "jqfmt=vfsold"}, {Opt_jqfmt_vfsv0, "jqfmt=vfsv0"}, + {Opt_tagxid, "tagxid"}, {Opt_ignore, "grpquota"}, {Opt_ignore, "noquota"}, {Opt_ignore, "quota"}, @@ -723,6 +724,11 @@ static int parse_options (char * options, struct super_block *sb, case Opt_nouid32: set_opt (sbi->s_mount_opt, NO_UID32); break; +#ifndef CONFIG_INOXID_NONE + case Opt_tagxid: + set_opt (sbi->s_mount_opt, TAG_XID); + break; +#endif case Opt_check: #ifdef CONFIG_EXT3_CHECK set_opt (sbi->s_mount_opt, CHECK); @@ -1310,6 +1316,8 @@ static int ext3_fill_super (struct super_block *sb, void *data, int silent) if (!parse_options ((char *) data, sb, &journal_inum, NULL, 0)) goto failed_mount; + if (EXT3_SB(sb)->s_mount_opt & EXT3_MOUNT_TAG_XID) + sb->s_flags |= MS_TAGXID; sb->s_flags |= MS_ONE_SECOND; sb->s_flags = (sb->s_flags & ~MS_POSIXACL) | ((sbi->s_mount_opt & EXT3_MOUNT_POSIX_ACL) ? MS_POSIXACL : 0); diff --git a/fs/fcntl.c b/fs/fcntl.c index 68b3d561c..4b75518ed 100644 --- a/fs/fcntl.c +++ b/fs/fcntl.c @@ -107,6 +107,8 @@ repeat: error = -EMFILE; if (newfd >= current->rlim[RLIMIT_NOFILE].rlim_cur) goto out; + if (!vx_files_avail(1)) + goto out; error = expand_files(files, newfd); if (error < 0) @@ -139,6 +141,7 @@ int dupfd(struct file *file, unsigned int start) FD_SET(fd, files->open_fds); FD_CLR(fd, files->close_on_exec); spin_unlock(&files->file_lock); + vx_openfd_inc(fd); fd_install(fd, file); } else { spin_unlock(&files->file_lock); @@ -188,6 +191,7 @@ asmlinkage long sys_dup2(unsigned int oldfd, unsigned int newfd) FD_SET(newfd, files->open_fds); FD_CLR(newfd, files->close_on_exec); spin_unlock(&files->file_lock); + vx_openfd_inc(newfd); if (tofree) filp_close(tofree, files); diff --git a/fs/file_table.c b/fs/file_table.c index 5d56ec5db..1894e3b34 100644 --- a/fs/file_table.c +++ b/fs/file_table.c @@ -87,6 +87,7 @@ static int old_max; f->f_owner.lock = RW_LOCK_UNLOCKED; /* f->f_version: 0 */ INIT_LIST_HEAD(&f->f_list); + vx_files_inc(f); return f; } } @@ -184,6 +185,7 @@ void fastcall __fput(struct file *file) fops_put(file->f_op); if (file->f_mode & FMODE_WRITE) put_write_access(inode); + vx_files_dec(file); file_kill(file); file->f_dentry = NULL; file->f_vfsmnt = NULL; diff --git a/fs/inode.c b/fs/inode.c index e5ee5a79b..1f847baad 100644 --- a/fs/inode.c +++ b/fs/inode.c @@ -114,6 +114,11 @@ static struct inode *alloc_inode(struct super_block *sb) struct address_space * const mapping = &inode->i_data; inode->i_sb = sb; + if (sb->s_flags & MS_TAGXID) + inode->i_xid = current->xid; + else + inode->i_xid = 0; /* maybe xid -1 would be better? */ + // inode->i_dqh = dqhget(sb->s_dqh); inode->i_blkbits = sb->s_blocksize_bits; inode->i_flags = 0; atomic_set(&inode->i_count, 1); @@ -133,6 +138,7 @@ static struct inode *alloc_inode(struct super_block *sb) inode->i_bdev = NULL; inode->i_cdev = NULL; inode->i_rdev = 0; + // inode->i_xid = 0; /* maybe not too wise ... */ inode->i_security = NULL; inode->dirtied_when = 0; if (security_inode_alloc(inode)) { diff --git a/fs/ioctl.c b/fs/ioctl.c index aef5391e4..12f3e71d2 100644 --- a/fs/ioctl.c +++ b/fs/ioctl.c @@ -9,10 +9,18 @@ #include #include #include +#include +#include +#include #include #include +#ifdef CONFIG_VSERVER_LEGACY +extern int vx_proc_ioctl(struct inode *, struct file *, + unsigned int, unsigned long); +#endif + static int file_ioctl(struct file *filp,unsigned int cmd,unsigned long arg) { int error; @@ -120,6 +128,48 @@ asmlinkage long sys_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg) else error = -ENOTTY; break; +#ifdef CONFIG_VSERVER_LEGACY +#ifndef CONFIG_INOXID_NONE + case FIOC_GETXID: { + struct inode *inode = filp->f_dentry->d_inode; + + /* fixme: if stealth, return -ENOTTY */ + error = -EPERM; + if (capable(CAP_CONTEXT)) + error = put_user(inode->i_xid, (int *) arg); + break; + } + case FIOC_SETXID: { + struct inode *inode = filp->f_dentry->d_inode; + int xid; + + /* fixme: if stealth, return -ENOTTY */ + error = -EPERM; + if (!capable(CAP_CONTEXT)) + break; + error = -EROFS; + if (IS_RDONLY(inode)) + break; + error = -ENOSYS; + if (!(inode->i_sb->s_flags & MS_TAGXID)) + break; + error = -EFAULT; + if (get_user(xid, (int *) arg)) + break; + error = 0; + inode->i_xid = (xid & 0xFFFF); + inode->i_ctime = CURRENT_TIME; + mark_inode_dirty(inode); + break; + } +#endif + case FIOC_GETXFLG: + case FIOC_SETXFLG: + error = -ENOTTY; + if (filp->f_dentry->d_inode->i_sb->s_magic == PROC_SUPER_MAGIC) + error = vx_proc_ioctl(filp->f_dentry->d_inode, filp, cmd, arg); + break; +#endif default: error = -ENOTTY; if (S_ISREG(filp->f_dentry->d_inode->i_mode)) diff --git a/fs/jfs/jfs_imap.c b/fs/jfs/jfs_imap.c index 865334f6c..848fbc8ba 100644 --- a/fs/jfs/jfs_imap.c +++ b/fs/jfs/jfs_imap.c @@ -44,6 +44,7 @@ #include #include #include +#include #include "jfs_incore.h" #include "jfs_filsys.h" @@ -3098,14 +3099,21 @@ static void duplicateIXtree(struct super_block *sb, s64 blkno, static int copy_from_dinode(struct dinode * dip, struct inode *ip) { struct jfs_inode_info *jfs_ip = JFS_IP(ip); + uid_t uid; + gid_t gid; jfs_ip->fileset = le32_to_cpu(dip->di_fileset); jfs_ip->mode2 = le32_to_cpu(dip->di_mode); ip->i_mode = le32_to_cpu(dip->di_mode) & 0xffff; ip->i_nlink = le32_to_cpu(dip->di_nlink); - ip->i_uid = le32_to_cpu(dip->di_uid); - ip->i_gid = le32_to_cpu(dip->di_gid); + + uid = le32_to_cpu(dip->di_uid); + gid = le32_to_cpu(dip->di_gid); + ip->i_uid = INOXID_UID(uid, gid); + ip->i_gid = INOXID_GID(uid, gid); + ip->i_xid = INOXID_XID(uid, gid, 0); + ip->i_size = le64_to_cpu(dip->di_size); ip->i_atime.tv_sec = le32_to_cpu(dip->di_atime.tv_sec); ip->i_atime.tv_nsec = le32_to_cpu(dip->di_atime.tv_nsec); @@ -3156,6 +3164,8 @@ static int copy_from_dinode(struct dinode * dip, struct inode *ip) static void copy_to_dinode(struct dinode * dip, struct inode *ip) { struct jfs_inode_info *jfs_ip = JFS_IP(ip); + uid_t uid; + gid_t gid; dip->di_fileset = cpu_to_le32(jfs_ip->fileset); dip->di_inostamp = cpu_to_le32(JFS_SBI(ip->i_sb)->inostamp); @@ -3164,8 +3174,11 @@ static void copy_to_dinode(struct dinode * dip, struct inode *ip) dip->di_size = cpu_to_le64(ip->i_size); dip->di_nblocks = cpu_to_le64(PBLK2LBLK(ip->i_sb, ip->i_blocks)); dip->di_nlink = cpu_to_le32(ip->i_nlink); - dip->di_uid = cpu_to_le32(ip->i_uid); - dip->di_gid = cpu_to_le32(ip->i_gid); + + uid = XIDINO_UID(ip->i_uid, ip->i_xid); + gid = XIDINO_GID(ip->i_gid, ip->i_xid); + dip->di_uid = cpu_to_le32(uid); + dip->di_gid = cpu_to_le32(gid); /* * mode2 is only needed for storing the higher order bits. * Trust i_mode for the lower order ones diff --git a/fs/namei.c b/fs/namei.c index df5b8f852..c2d43bbdf 100644 --- a/fs/namei.c +++ b/fs/namei.c @@ -163,6 +163,9 @@ int vfs_permission(struct inode * inode, int mask) { umode_t mode = inode->i_mode; + if (IS_BARRIER(inode) && !vx_check(0, VX_ADMIN|VX_WATCH)) + return -EACCES; + if (mask & MAY_WRITE) { /* * Nobody gets write access to a read-only fs. @@ -208,6 +211,15 @@ int vfs_permission(struct inode * inode, int mask) return -EACCES; } +static inline int xid_permission(struct inode *inode) +{ + if (inode->i_xid == 0) + return 0; + if (vx_check(inode->i_xid, VX_ADMIN|VX_WATCH|VX_IDENT)) + return 0; + return -EACCES; +} + int permission(struct inode * inode,int mask, struct nameidata *nd) { int retval; @@ -216,6 +228,8 @@ int permission(struct inode * inode,int mask, struct nameidata *nd) /* Ordinary permission routines do not understand MAY_APPEND. */ submask = mask & ~MAY_APPEND; + if ((retval = xid_permission(inode))) + return retval; if (inode->i_op && inode->i_op->permission) retval = inode->i_op->permission(inode, submask, nd); else @@ -1073,7 +1087,7 @@ static inline int may_delete(struct inode *dir,struct dentry *victim,int isdir) if (IS_APPEND(dir)) return -EPERM; if (check_sticky(dir, victim->d_inode)||IS_APPEND(victim->d_inode)|| - IS_IMMUTABLE(victim->d_inode)) + IS_IXORUNLINK(victim->d_inode)) return -EPERM; if (isdir) { if (!S_ISDIR(victim->d_inode->i_mode)) @@ -1877,7 +1891,7 @@ int vfs_link(struct dentry *old_dentry, struct inode *dir, struct dentry *new_de /* * A link to an append-only or immutable file cannot be created. */ - if (IS_APPEND(inode) || IS_IMMUTABLE(inode)) + if (IS_APPEND(inode) || IS_IXORUNLINK(inode)) return -EPERM; if (!dir->i_op || !dir->i_op->link) return -EPERM; diff --git a/fs/namespace.c b/fs/namespace.c index 2adae4289..d497b2d32 100644 --- a/fs/namespace.c +++ b/fs/namespace.c @@ -234,6 +234,9 @@ static int show_vfsmnt(struct seq_file *m, void *v) }; struct proc_fs_info *fs_infop; + if (vx_flags(VXF_HIDE_MOUNT, 0)) + return 0; + mangle(m, mnt->mnt_devname ? mnt->mnt_devname : "none"); seq_putc(m, ' '); seq_path(m, mnt, mnt->mnt_root, " \t\n\\"); @@ -333,18 +336,10 @@ int may_umount(struct vfsmount *mnt) EXPORT_SYMBOL(may_umount); -void umount_tree(struct vfsmount *mnt) +static inline void __umount_tree(struct vfsmount *mnt, struct list_head *kill) { - struct vfsmount *p; - LIST_HEAD(kill); - - for (p = mnt; p; p = next_mnt(p, mnt)) { - list_del(&p->mnt_list); - list_add(&p->mnt_list, &kill); - } - - while (!list_empty(&kill)) { - mnt = list_entry(kill.next, struct vfsmount, mnt_list); + while (!list_empty(kill)) { + mnt = list_entry(kill->next, struct vfsmount, mnt_list); list_del_init(&mnt->mnt_list); if (mnt->mnt_parent == mnt) { spin_unlock(&vfsmount_lock); @@ -359,6 +354,32 @@ void umount_tree(struct vfsmount *mnt) } } +void umount_tree(struct vfsmount *mnt) +{ + struct vfsmount *p; + LIST_HEAD(kill); + + for (p = mnt; p; p = next_mnt(p, mnt)) { + list_del(&p->mnt_list); + list_add(&p->mnt_list, &kill); + } + __umount_tree(mnt, &kill); +} + +void umount_unused(struct vfsmount *mnt, struct fs_struct *fs) +{ + struct vfsmount *p; + LIST_HEAD(kill); + + for (p = mnt; p; p = next_mnt(p, mnt)) { + if (p == fs->rootmnt || p == fs->pwdmnt) + continue; + list_del(&p->mnt_list); + list_add(&p->mnt_list, &kill); + } + __umount_tree(mnt, &kill); +} + static int do_umount(struct vfsmount *mnt, int flags) { struct super_block * sb = mnt->mnt_sb; @@ -456,7 +477,7 @@ asmlinkage long sys_umount(char __user * name, int flags) goto dput_and_out; retval = -EPERM; - if (!capable(CAP_SYS_ADMIN)) + if (!capable(CAP_SYS_ADMIN) && !vx_ccaps(VXC_SECURE_MOUNT)) goto dput_and_out; retval = do_umount(nd.mnt, flags); @@ -483,6 +504,8 @@ static int mount_is_safe(struct nameidata *nd) { if (capable(CAP_SYS_ADMIN)) return 0; + if (vx_ccaps(VXC_SECURE_MOUNT)) + return 0; return -EPERM; #ifdef notyet if (S_ISLNK(nd->dentry->d_inode->i_mode)) @@ -843,6 +866,9 @@ long do_mount(char * dev_name, char * dir_name, char *type_page, mnt_flags |= MNT_NOEXEC; flags &= ~(MS_NOSUID|MS_NOEXEC|MS_NODEV|MS_ACTIVE); + if (vx_ccaps(VXC_SECURE_MOUNT)) + mnt_flags |= MNT_NODEV; + /* ... and get the mountpoint */ retval = path_lookup(dir_name, LOOKUP_FOLLOW, &nd); if (retval) diff --git a/fs/nfs/nfsroot.c b/fs/nfs/nfsroot.c index 864615916..a561819b6 100644 --- a/fs/nfs/nfsroot.c +++ b/fs/nfs/nfsroot.c @@ -306,7 +306,7 @@ static int __init root_nfs_name(char *name) /* Override them by options set on kernel command-line */ root_nfs_parse(name, buf); - cp = system_utsname.nodename; + cp = vx_new_uts(nodename); if (strlen(buf) + strlen(cp) > NFS_MAXPATHLEN) { printk(KERN_ERR "Root-NFS: Pathname for remote directory too long.\n"); return -1; diff --git a/fs/open.c b/fs/open.c index 8bdcf32bd..a2566c942 100644 --- a/fs/open.c +++ b/fs/open.c @@ -22,6 +22,7 @@ #include #include #include +#include #include @@ -607,6 +608,9 @@ asmlinkage long sys_fchmod(unsigned int fd, mode_t mode) dentry = file->f_dentry; inode = dentry->d_inode; + err = -EPERM; + if (IS_BARRIER(inode) && !vx_check(0, VX_ADMIN)) + goto out_putf; err = -EROFS; if (IS_RDONLY(inode)) goto out_putf; @@ -639,6 +643,10 @@ asmlinkage long sys_chmod(const char __user * filename, mode_t mode) goto out; inode = nd.dentry->d_inode; + error = -EPERM; + if (IS_BARRIER(inode) && !vx_check(0, VX_ADMIN)) + goto dput_and_out; + error = -EROFS; if (IS_RDONLY(inode)) goto dput_and_out; @@ -678,14 +686,15 @@ static int chown_common(struct dentry * dentry, uid_t user, gid_t group) error = -EPERM; if (IS_IMMUTABLE(inode) || IS_APPEND(inode)) goto out; + newattrs.ia_valid = ATTR_CTIME; if (user != (uid_t) -1) { newattrs.ia_valid |= ATTR_UID; - newattrs.ia_uid = user; + newattrs.ia_uid = vx_map_uid(user); } if (group != (gid_t) -1) { newattrs.ia_valid |= ATTR_GID; - newattrs.ia_gid = group; + newattrs.ia_gid = vx_map_gid(group); } if (!S_ISDIR(inode->i_mode)) newattrs.ia_valid |= ATTR_KILL_SUID|ATTR_KILL_SGID; @@ -880,6 +889,7 @@ repeat: FD_SET(fd, files->open_fds); FD_CLR(fd, files->close_on_exec); files->next_fd = fd + 1; + vx_openfd_inc(fd); #if 1 /* Sanity check */ if (files->fd[fd] != NULL) { @@ -1033,6 +1043,7 @@ asmlinkage long sys_close(unsigned int fd) FD_CLR(fd, files->close_on_exec); __put_unused_fd(files, fd); spin_unlock(&files->file_lock); + vx_openfd_dec(fd); return filp_close(filp, files); out_unlock: diff --git a/fs/proc/array.c b/fs/proc/array.c index 190198240..ecce1806d 100644 --- a/fs/proc/array.c +++ b/fs/proc/array.c @@ -73,6 +73,7 @@ #include #include #include +#include #include #include @@ -128,7 +129,8 @@ static const char *task_state_array[] = { "D (disk sleep)", /* 2 */ "T (stopped)", /* 4 */ "Z (zombie)", /* 8 */ - "X (dead)" /* 16 */ + "X (dead)", /* 16 */ + "H (on hold)" /* 32 */ }; static inline const char * get_task_state(struct task_struct *tsk) @@ -137,7 +139,8 @@ static inline const char * get_task_state(struct task_struct *tsk) TASK_INTERRUPTIBLE | TASK_UNINTERRUPTIBLE | TASK_ZOMBIE | - TASK_STOPPED); + TASK_STOPPED | + TASK_ONHOLD); const char **p = &task_state_array[0]; while (state) { @@ -151,8 +154,10 @@ static inline char * task_state(struct task_struct *p, char *buffer) { struct group_info *group_info; int g; + pid_t ppid; read_lock(&tasklist_lock); + ppid = vx_map_tgid(current->vx_info, p->real_parent->pid); buffer += sprintf(buffer, "State:\t%s\n" "SleepAVG:\t%lu%%\n" @@ -165,7 +170,7 @@ static inline char * task_state(struct task_struct *p, char *buffer) get_task_state(p), (p->sleep_avg/1024)*100/(1020000000/1024), p->tgid, - p->pid, p->pid ? p->real_parent->pid : 0, + p->pid, p->pid ? ppid : 0, p->pid && p->ptrace ? p->parent->pid : 0, p->uid, p->euid, p->suid, p->fsuid, p->gid, p->egid, p->sgid, p->fsgid); @@ -278,6 +283,10 @@ extern char *task_mem(struct mm_struct *, char *); int proc_pid_status(struct task_struct *task, char * buffer) { char * orig = buffer; +#ifdef CONFIG_VSERVER_LEGACY + struct vx_info *vxi; + struct nx_info *nxi; +#endif struct mm_struct *mm = get_task_mm(task); buffer = task_name(task, buffer); @@ -289,6 +298,41 @@ int proc_pid_status(struct task_struct *task, char * buffer) } buffer = task_sig(task, buffer); buffer = task_cap(task, buffer); + +#ifdef CONFIG_VSERVER_LEGACY + buffer += sprintf (buffer,"s_context: %d\n", vx_task_xid(task)); + vxi = task_get_vx_info(task); + if (vxi) { + buffer += sprintf (buffer,"ctxflags: %08llx\n" + ,vxi->vx_flags); + buffer += sprintf (buffer,"initpid: %d\n" + ,vxi->vx_initpid); + } else { + buffer += sprintf (buffer,"ctxflags: none\n"); + buffer += sprintf (buffer,"initpid: none\n"); + } + put_vx_info(vxi); + nxi = task_get_nx_info(task); + if (nxi) { + int i; + + buffer += sprintf (buffer,"ipv4root:"); + for (i=0; inbipv4; i++){ + buffer += sprintf (buffer," %08x/%08x" + ,nxi->ipv4[i] + ,nxi->mask[i]); + } + *buffer++ = '\n'; + buffer += sprintf (buffer,"ipv4root_bcast: %08x\n" + ,nxi->v4_bcast); + buffer += sprintf (buffer,"ipv4root_refcnt: %d\n" + ,atomic_read(&nxi->nx_refcount)); + } else { + buffer += sprintf (buffer,"ipv4root: 0\n"); + buffer += sprintf (buffer,"ipv4root_bcast: 0\n"); + } + put_nx_info(nxi); +#endif #if defined(CONFIG_ARCH_S390) buffer = task_show_regs(task, buffer); #endif @@ -300,6 +344,7 @@ int proc_pid_stat(struct task_struct *task, char * buffer) { unsigned long vsize, eip, esp, wchan; long priority, nice; + unsigned long long bias_jiffies; int tty_pgrp = -1, tty_nr = 0; sigset_t sigign, sigcatch; char state; @@ -311,7 +356,16 @@ int proc_pid_stat(struct task_struct *task, char * buffer) state = *get_task_state(task); vsize = eip = esp = 0; + bias_jiffies = INITIAL_JIFFIES; + task_lock(task); + if (__vx_task_flags(task, VXF_VIRT_UPTIME, 0)) { + bias_jiffies = task->vx_info->cvirt.bias_jiffies; + /* hmm, do we need that? */ + if (bias_jiffies > task->start_time) + bias_jiffies = task->start_time; + } + mm = task->mm; if(mm) mm = mmgrab(mm); @@ -358,7 +412,7 @@ int proc_pid_stat(struct task_struct *task, char * buffer) read_unlock(&tasklist_lock); /* Temporary variable needed for gcc-2.96 */ - start_time = jiffies_64_to_clock_t(task->start_time - INITIAL_JIFFIES); + start_time = jiffies_64_to_clock_t(task->start_time - bias_jiffies); res = sprintf(buffer,"%d (%s) %c %d %d %d %d %d %lu %lu \ %lu %lu %lu %lu %lu %ld %ld %ld %ld %d %ld %llu %lu %ld %lu %lu %lu %lu %lu \ diff --git a/fs/proc/base.c b/fs/proc/base.c index 6bfde43f9..69f0a305d 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c @@ -32,6 +32,7 @@ #include #include #include +#include /* * For hysterical raisins we keep the same inumbers as in the old procfs. @@ -67,6 +68,8 @@ enum pid_directory_inos { PROC_TGID_ATTR_EXEC, PROC_TGID_ATTR_FSCREATE, #endif + PROC_TGID_VX_INFO, + PROC_TGID_IP_INFO, PROC_TGID_FD_DIR, PROC_TID_INO, PROC_TID_STATUS, @@ -90,6 +93,8 @@ enum pid_directory_inos { PROC_TID_ATTR_EXEC, PROC_TID_ATTR_FSCREATE, #endif + PROC_TID_VX_INFO, + PROC_TID_IP_INFO, PROC_TID_FD_DIR = 0x8000, /* 0x8000-0xffff */ }; @@ -123,6 +128,8 @@ static struct pid_entry tgid_base_stuff[] = { #ifdef CONFIG_KALLSYMS E(PROC_TGID_WCHAN, "wchan", S_IFREG|S_IRUGO), #endif + E(PROC_TGID_VX_INFO, "vinfo", S_IFREG|S_IRUGO), + E(PROC_TGID_IP_INFO, "ninfo", S_IFREG|S_IRUGO), {0,0,NULL,0} }; static struct pid_entry tid_base_stuff[] = { @@ -145,6 +152,8 @@ static struct pid_entry tid_base_stuff[] = { #ifdef CONFIG_KALLSYMS E(PROC_TID_WCHAN, "wchan", S_IFREG|S_IRUGO), #endif + E(PROC_TID_VX_INFO, "vinfo", S_IFREG|S_IRUGO), + E(PROC_TID_IP_INFO, "ninfo", S_IFREG|S_IRUGO), {0,0,NULL,0} }; @@ -954,6 +963,7 @@ static struct inode *proc_pid_make_inode(struct super_block * sb, struct task_st inode->i_uid = task->euid; inode->i_gid = task->egid; } + inode->i_xid = vx_task_xid(task); security_task_to_inode(task, inode); out: @@ -979,6 +989,11 @@ static int pid_revalidate(struct dentry *dentry, struct nameidata *nd) { struct inode *inode = dentry->d_inode; struct task_struct *task = proc_task(inode); + + if (!vx_check(vx_task_xid(task), VX_WATCH|VX_IDENT)) + goto out_drop; + /* discard wrong fakeinit */ + if (pid_alive(task)) { if (proc_type(inode) == PROC_TGID_INO || proc_type(inode) == PROC_TID_INO || task_dumpable(task)) { inode->i_uid = task->euid; @@ -990,6 +1005,7 @@ static int pid_revalidate(struct dentry *dentry, struct nameidata *nd) security_task_to_inode(task, inode); return 1; } +out_drop: d_drop(dentry); return 0; } @@ -1375,6 +1391,16 @@ static struct dentry *proc_pident_lookup(struct inode *dir, ei->op.proc_read = proc_pid_wchan; break; #endif + case PROC_TID_VX_INFO: + case PROC_TGID_VX_INFO: + inode->i_fop = &proc_info_file_operations; + ei->op.proc_read = proc_pid_vx_info; + break; + case PROC_TID_IP_INFO: + case PROC_TGID_IP_INFO: + inode->i_fop = &proc_info_file_operations; + ei->op.proc_read = proc_pid_nx_info; + break; default: printk("procfs: impossible type (%d)",p->type); iput(inode); @@ -1555,7 +1581,7 @@ struct dentry *proc_pid_lookup(struct inode *dir, struct dentry * dentry, struct d_add(dentry, inode); return NULL; } - tgid = name_to_int(dentry); + tgid = vx_rmap_tgid(current->vx_info, name_to_int(dentry)); if (tgid == ~0U) goto out; @@ -1567,8 +1593,9 @@ struct dentry *proc_pid_lookup(struct inode *dir, struct dentry * dentry, struct if (!task) goto out; - inode = proc_pid_make_inode(dir->i_sb, task, PROC_TGID_INO); - + inode = NULL; + if (vx_check(vx_task_xid(task), VX_WATCH|VX_IDENT)) + inode = proc_pid_make_inode(dir->i_sb, task, PROC_TGID_INO); if (!inode) { put_task_struct(task); @@ -1610,10 +1637,12 @@ static struct dentry *proc_task_lookup(struct inode *dir, struct dentry * dentry struct inode *inode; unsigned tid; - tid = name_to_int(dentry); + tid = vx_rmap_tgid(current->vx_info, name_to_int(dentry)); if (tid == ~0U) goto out; +/* handle fakeinit */ + read_lock(&tasklist_lock); task = find_task_by_pid(tid); if (task) @@ -1624,8 +1653,9 @@ static struct dentry *proc_task_lookup(struct inode *dir, struct dentry * dentry if (leader->tgid != task->tgid) goto out_drop_task; - inode = proc_pid_make_inode(dir->i_sb, task, PROC_TID_INO); - + inode = NULL; + if (vx_check(vx_task_xid(task), VX_WATCH|VX_IDENT)) + inode = proc_pid_make_inode(dir->i_sb, task, PROC_TID_INO); if (!inode) goto out_drop_task; @@ -1676,11 +1706,14 @@ static int get_tgid_list(int index, unsigned long version, unsigned int *tgids) for ( ; p != &init_task; p = next_task(p)) { int tgid = p->pid; + if (!pid_alive(p)) continue; + if (!vx_check(vx_task_xid(p), VX_WATCH|VX_IDENT)) + continue; if (--index >= 0) continue; - tgids[nr_tgids] = tgid; + tgids[nr_tgids] = vx_map_tgid(current->vx_info, tgid); nr_tgids++; if (nr_tgids >= PROC_MAXPIDS) break; @@ -1710,9 +1743,11 @@ 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)) + continue; if (--index >= 0) continue; - tids[nr_tids] = tid; + tids[nr_tids] = vx_map_tgid(current->vx_info, tid); nr_tids++; if (nr_tids >= PROC_MAXPIDS) break; @@ -1766,11 +1801,14 @@ static int proc_task_readdir(struct file * filp, void * dirent, filldir_t filldi unsigned int nr_tids, i; struct dentry *dentry = filp->f_dentry; struct inode *inode = dentry->d_inode; + struct task_struct *task = proc_task(inode); int retval = -ENOENT; ino_t ino; unsigned long pos = filp->f_pos; /* avoiding "long long" filp->f_pos */ - if (!pid_alive(proc_task(inode))) + if (!vx_check(vx_task_xid(task), VX_WATCH|VX_IDENT)) + goto out; + if (!pid_alive(task)) goto out; retval = 0; diff --git a/fs/proc/generic.c b/fs/proc/generic.c index 474bee886..32a3f8798 100644 --- a/fs/proc/generic.c +++ b/fs/proc/generic.c @@ -17,6 +17,8 @@ #include #include #include +#include +#include #include #include @@ -341,8 +343,15 @@ static int proc_delete_dentry(struct dentry * dentry) return 1; } +static int proc_revalidate_dentry(struct dentry *de, struct nameidata *nd) +{ + /* maybe add a check if it's really necessary? */ + return 0; +} + static struct dentry_operations proc_dentry_operations = { + .d_revalidate = proc_revalidate_dentry, .d_delete = proc_delete_dentry, }; @@ -362,6 +371,8 @@ struct dentry *proc_lookup(struct inode * dir, struct dentry *dentry, struct nam for (de = de->subdir; de ; de = de->next) { if (de->namelen != dentry->d_name.len) continue; + if (!vx_hide_check(0, de->vx_flags)) + continue; if (!memcmp(dentry->d_name.name, de->name, de->namelen)) { unsigned int ino = de->low_ino; @@ -438,9 +449,12 @@ int proc_readdir(struct file * filp, } do { + if (!vx_hide_check(0, de->vx_flags)) + goto skip; if (filldir(dirent, de->name, de->namelen, filp->f_pos, de->low_ino, de->mode >> 12) < 0) goto out; + skip: filp->f_pos++; de = de->next; } while (de); @@ -552,6 +566,7 @@ static struct proc_dir_entry *proc_create(struct proc_dir_entry **parent, ent->namelen = len; ent->mode = mode; ent->nlink = nlink; + ent->vx_flags = IATTR_PROC_DEFAULT; out: return ent; } @@ -572,7 +587,8 @@ struct proc_dir_entry *proc_symlink(const char *name, kfree(ent->data); kfree(ent); ent = NULL; - } + } else + ent->vx_flags = IATTR_PROC_SYMLINK; } else { kfree(ent); ent = NULL; diff --git a/fs/proc/inode.c b/fs/proc/inode.c index 2d38f02c9..bf090daaf 100644 --- a/fs/proc/inode.c +++ b/fs/proc/inode.c @@ -211,6 +211,8 @@ struct inode *proc_get_inode(struct super_block *sb, unsigned int ino, inode->i_uid = de->uid; inode->i_gid = de->gid; } + if (de->vx_flags) + PROC_I(inode)->vx_flags = de->vx_flags; if (de->size) inode->i_size = de->size; if (de->nlink) diff --git a/fs/proc/proc_misc.c b/fs/proc/proc_misc.c index 60e38c796..f96582d28 100644 --- a/fs/proc/proc_misc.c +++ b/fs/proc/proc_misc.c @@ -44,6 +44,7 @@ #include #include #include +#include #include #include #include @@ -144,6 +145,9 @@ static int uptime_read_proc(char *page, char **start, off_t off, do_posix_clock_monotonic_gettime(&uptime); jiffies_to_timespec(idle_jiffies, &idle); + if (vx_flags(VXF_VIRT_UPTIME, 0)) + vx_vsi_uptime(&uptime, &idle); + len = sprintf(page,"%lu.%02lu %lu.%02lu\n", (unsigned long) uptime.tv_sec, (uptime.tv_nsec / (NSEC_PER_SEC / 100)), diff --git a/fs/proc/root.c b/fs/proc/root.c index bf4b5d299..c84e88fe0 100644 --- a/fs/proc/root.c +++ b/fs/proc/root.c @@ -23,6 +23,9 @@ struct proc_dir_entry *proc_net, *proc_bus, *proc_root_fs, *proc_root_driver; #ifdef CONFIG_SYSCTL struct proc_dir_entry *proc_sys_root; #endif +struct proc_dir_entry *proc_virtual; + +extern void proc_vx_init(void); static struct super_block *proc_get_sb(struct file_system_type *fs_type, int flags, const char *dev_name, void *data) @@ -75,6 +78,7 @@ void __init proc_root_init(void) proc_device_tree_init(); #endif proc_bus = proc_mkdir("bus", 0); + proc_vx_init(); } static struct dentry *proc_root_lookup(struct inode * dir, struct dentry * dentry, struct nameidata *nd) diff --git a/fs/reiserfs/inode.c b/fs/reiserfs/inode.c index 68050af43..402ba643f 100644 --- a/fs/reiserfs/inode.c +++ b/fs/reiserfs/inode.c @@ -17,6 +17,7 @@ #include #include #include +#include extern int reiserfs_default_io_size; /* default io size devuned in super.c */ @@ -1010,6 +1011,8 @@ static void init_inode (struct inode * inode, struct path * path) struct buffer_head * bh; struct item_head * ih; __u32 rdev; + uid_t uid; + gid_t gid; //int version = ITEM_VERSION_1; bh = PATH_PLAST_BUFFER (path); @@ -1033,12 +1036,13 @@ static void init_inode (struct inode * inode, struct path * path) struct stat_data_v1 * sd = (struct stat_data_v1 *)B_I_PITEM (bh, ih); unsigned long blocks; + uid = sd_v1_uid(sd); + gid = sd_v1_gid(sd); + set_inode_item_key_version (inode, KEY_FORMAT_3_5); set_inode_sd_version (inode, STAT_DATA_V1); inode->i_mode = sd_v1_mode(sd); inode->i_nlink = sd_v1_nlink(sd); - inode->i_uid = sd_v1_uid(sd); - inode->i_gid = sd_v1_gid(sd); inode->i_size = sd_v1_size(sd); inode->i_atime.tv_sec = sd_v1_atime(sd); inode->i_mtime.tv_sec = sd_v1_mtime(sd); @@ -1078,11 +1082,12 @@ static void init_inode (struct inode * inode, struct path * path) // (directories and symlinks) struct stat_data * sd = (struct stat_data *)B_I_PITEM (bh, ih); + uid = sd_v2_uid(sd); + gid = sd_v2_gid(sd); + inode->i_mode = sd_v2_mode(sd); inode->i_nlink = sd_v2_nlink(sd); - inode->i_uid = sd_v2_uid(sd); inode->i_size = sd_v2_size(sd); - inode->i_gid = sd_v2_gid(sd); inode->i_mtime.tv_sec = sd_v2_mtime(sd); inode->i_atime.tv_sec = sd_v2_atime(sd); inode->i_ctime.tv_sec = sd_v2_ctime(sd); @@ -1109,6 +1114,9 @@ static void init_inode (struct inode * inode, struct path * path) REISERFS_I(inode)->i_attrs = sd_v2_attrs( sd ); sd_attrs_to_i_attrs( sd_v2_attrs( sd ), inode ); } + inode->i_uid = INOXID_UID(uid, gid); + inode->i_gid = INOXID_GID(uid, gid); + inode->i_xid = INOXID_XID(uid, gid, 0); pathrelse (path); if (S_ISREG (inode->i_mode)) { @@ -1133,13 +1141,15 @@ static void init_inode (struct inode * inode, struct path * path) static void inode2sd (void * sd, struct inode * inode, loff_t size) { struct stat_data * sd_v2 = (struct stat_data *)sd; + uid_t uid = XIDINO_UID(inode->i_uid, inode->i_xid); + gid_t gid = XIDINO_GID(inode->i_gid, inode->i_xid); __u16 flags; + set_sd_v2_uid(sd_v2, uid ); + set_sd_v2_gid(sd_v2, gid ); set_sd_v2_mode(sd_v2, inode->i_mode ); set_sd_v2_nlink(sd_v2, inode->i_nlink ); - set_sd_v2_uid(sd_v2, inode->i_uid ); set_sd_v2_size(sd_v2, size ); - set_sd_v2_gid(sd_v2, inode->i_gid ); set_sd_v2_mtime(sd_v2, inode->i_mtime.tv_sec ); set_sd_v2_atime(sd_v2, inode->i_atime.tv_sec ); set_sd_v2_ctime(sd_v2, inode->i_ctime.tv_sec ); @@ -2429,6 +2439,14 @@ void sd_attrs_to_i_attrs( __u16 sd_attrs, struct inode *inode ) inode -> i_flags |= S_IMMUTABLE; else inode -> i_flags &= ~S_IMMUTABLE; + if( sd_attrs & REISERFS_IUNLINK_FL ) + inode -> i_flags |= S_IUNLINK; + else + inode -> i_flags &= ~S_IUNLINK; + if( sd_attrs & REISERFS_BARRIER_FL ) + inode -> i_flags |= S_BARRIER; + else + inode -> i_flags &= ~S_BARRIER; if( sd_attrs & REISERFS_APPEND_FL ) inode -> i_flags |= S_APPEND; else @@ -2451,6 +2469,14 @@ void i_attrs_to_sd_attrs( struct inode *inode, __u16 *sd_attrs ) *sd_attrs |= REISERFS_IMMUTABLE_FL; else *sd_attrs &= ~REISERFS_IMMUTABLE_FL; + if( inode -> i_flags & S_IUNLINK ) + *sd_attrs |= REISERFS_IUNLINK_FL; + else + *sd_attrs &= ~REISERFS_IUNLINK_FL; + if( inode -> i_flags & S_BARRIER ) + *sd_attrs |= REISERFS_BARRIER_FL; + else + *sd_attrs &= ~REISERFS_BARRIER_FL; if( inode -> i_flags & S_SYNC ) *sd_attrs |= REISERFS_SYNC_FL; else @@ -2611,11 +2637,36 @@ static ssize_t reiserfs_direct_IO(int rw, struct kiocb *iocb, offset, nr_segs, reiserfs_get_blocks_direct_io, NULL); } +int reiserfs_setattr_flags(struct inode *inode, unsigned int flags) +{ + unsigned int oldflags, newflags; + + oldflags = REISERFS_I(inode)->i_flags; + newflags = oldflags & ~(REISERFS_IMMUTABLE_FL | + REISERFS_IUNLINK_FL | REISERFS_BARRIER_FL); + if (flags & ATTR_FLAG_IMMUTABLE) + newflags |= REISERFS_IMMUTABLE_FL; + if (flags & ATTR_FLAG_IUNLINK) + newflags |= REISERFS_IUNLINK_FL; + if (flags & ATTR_FLAG_BARRIER) + newflags |= REISERFS_BARRIER_FL; + + if (oldflags ^ newflags) { + REISERFS_I(inode)->i_flags = newflags; + inode->i_ctime = CURRENT_TIME; + } + return 0; +} + int reiserfs_setattr(struct dentry *dentry, struct iattr *attr) { struct inode *inode = dentry->d_inode ; int error ; unsigned int ia_valid = attr->ia_valid; + reiserfs_write_lock(inode->i_sb); + if (S_ISDIR(inode->i_mode)) + goto is_dir; + if (attr->ia_valid & ATTR_SIZE) { /* version 2 items will be caught by the s_maxbytes check ** done for us in vmtruncate @@ -2648,7 +2699,12 @@ int reiserfs_setattr(struct dentry *dentry, struct iattr *attr) { goto out; } + is_dir: error = inode_change_ok(inode, attr) ; + + if (!error && attr->ia_valid & ATTR_ATTR_FLAG) + reiserfs_setattr_flags(inode, attr->ia_attr_flags); + if (!error) { if ((ia_valid & ATTR_UID && attr->ia_uid != inode->i_uid) || (ia_valid & ATTR_GID && attr->ia_gid != inode->i_gid)) { diff --git a/fs/reiserfs/ioctl.c b/fs/reiserfs/ioctl.c index 7f2fba5e1..b1f32fc27 100644 --- a/fs/reiserfs/ioctl.c +++ b/fs/reiserfs/ioctl.c @@ -20,7 +20,7 @@ int reiserfs_ioctl (struct inode * inode, struct file * filp, unsigned int cmd, unsigned long arg) { - unsigned int flags; + unsigned int flags, oldflags; switch (cmd) { case REISERFS_IOC_UNPACK: @@ -36,6 +36,7 @@ int reiserfs_ioctl (struct inode * inode, struct file * filp, unsigned int cmd, case REISERFS_IOC_GETFLAGS: flags = REISERFS_I(inode) -> i_attrs; i_attrs_to_sd_attrs( inode, ( __u16 * ) &flags ); + flags &= REISERFS_FL_USER_VISIBLE; return put_user(flags, (int __user *) arg); case REISERFS_IOC_SETFLAGS: { if (IS_RDONLY(inode)) @@ -47,7 +48,9 @@ int reiserfs_ioctl (struct inode * inode, struct file * filp, unsigned int cmd, if (get_user(flags, (int __user *) arg)) return -EFAULT; - if ( ( ( flags ^ REISERFS_I(inode) -> i_attrs) & ( REISERFS_IMMUTABLE_FL | REISERFS_APPEND_FL)) && + oldflags = REISERFS_I(inode) -> i_attrs; + if ( ( ( flags ^ oldflags) & + ( REISERFS_IMMUTABLE_FL | REISERFS_IUNLINK_FL | REISERFS_APPEND_FL)) && !capable( CAP_LINUX_IMMUTABLE ) ) return -EPERM; @@ -59,6 +62,9 @@ int reiserfs_ioctl (struct inode * inode, struct file * filp, unsigned int cmd, if( result ) return result; } + + flags = flags & REISERFS_FL_USER_MODIFYABLE; + flags |= oldflags & ~REISERFS_FL_USER_MODIFYABLE; sd_attrs_to_i_attrs( flags, inode ); REISERFS_I(inode) -> i_attrs = flags; inode->i_ctime = CURRENT_TIME; diff --git a/fs/xfs/xfs_dinode.h b/fs/xfs/xfs_dinode.h index e0b529b33..f8f6e0fe6 100644 --- a/fs/xfs/xfs_dinode.h +++ b/fs/xfs/xfs_dinode.h @@ -456,6 +456,9 @@ xfs_dinode_t *xfs_buf_to_dinode(struct xfs_buf *bp); #define XFS_DIFLAG_SYNC_BIT 5 /* inode is written synchronously */ #define XFS_DIFLAG_NOATIME_BIT 6 /* do not update atime */ #define XFS_DIFLAG_NODUMP_BIT 7 /* do not dump */ +#define XFS_DIFLAG_BARRIER_BIT 10 /* chroot() barrier */ +#define XFS_DIFLAG_IUNLINK_BIT 11 /* inode has iunlink */ + #define XFS_DIFLAG_REALTIME (1 << XFS_DIFLAG_REALTIME_BIT) #define XFS_DIFLAG_PREALLOC (1 << XFS_DIFLAG_PREALLOC_BIT) #define XFS_DIFLAG_NEWRTBM (1 << XFS_DIFLAG_NEWRTBM_BIT) @@ -464,5 +467,8 @@ xfs_dinode_t *xfs_buf_to_dinode(struct xfs_buf *bp); #define XFS_DIFLAG_SYNC (1 << XFS_DIFLAG_SYNC_BIT) #define XFS_DIFLAG_NOATIME (1 << XFS_DIFLAG_NOATIME_BIT) #define XFS_DIFLAG_NODUMP (1 << XFS_DIFLAG_NODUMP_BIT) +#define XFS_DIFLAG_BARRIER (1 << XFS_DIFLAG_BARRIER_BIT) +#define XFS_DIFLAG_IUNLINK (1 << XFS_DIFLAG_IUNLINK_BIT) + #endif /* __XFS_DINODE_H__ */ diff --git a/fs/xfs/xfs_fs.h b/fs/xfs/xfs_fs.h index 1ed650e90..7e1b82c4f 100644 --- a/fs/xfs/xfs_fs.h +++ b/fs/xfs/xfs_fs.h @@ -76,6 +76,8 @@ struct fsxattr { #define XFS_XFLAG_SYNC 0x00000020 /* all writes synchronous */ #define XFS_XFLAG_NOATIME 0x00000040 /* do not update access time */ #define XFS_XFLAG_NODUMP 0x00000080 /* do not include in backups */ +#define XFS_XFLAG_BARRIER 0x00004000 /* chroot() barrier */ +#define XFS_XFLAG_IUNLINK 0x00008000 /* Immutable unlink */ #define XFS_XFLAG_HASATTR 0x80000000 /* no DIFLAG for this */ /* diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index ab973fe10..92a4c654e 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -869,6 +869,10 @@ xfs_dic2xflags( flags |= XFS_XFLAG_PREALLOC; if (di_flags & XFS_DIFLAG_IMMUTABLE) flags |= XFS_XFLAG_IMMUTABLE; + if (di_flags & XFS_DIFLAG_IUNLINK) + flags |= XFS_XFLAG_IUNLINK; + if (di_flags & XFS_DIFLAG_BARRIER) + flags |= XFS_XFLAG_BARRIER; if (di_flags & XFS_DIFLAG_APPEND) flags |= XFS_XFLAG_APPEND; if (di_flags & XFS_DIFLAG_SYNC) diff --git a/fs/xfs/xfs_vnodeops.c b/fs/xfs/xfs_vnodeops.c index ab9b4d181..2777aca04 100644 --- a/fs/xfs/xfs_vnodeops.c +++ b/fs/xfs/xfs_vnodeops.c @@ -835,6 +835,10 @@ xfs_setattr( } if (vap->va_xflags & XFS_XFLAG_IMMUTABLE) ip->i_d.di_flags |= XFS_DIFLAG_IMMUTABLE; + if (vap->va_xflags & XFS_XFLAG_IUNLINK) + ip->i_d.di_flags |= XFS_DIFLAG_IUNLINK; + if (vap->va_xflags & XFS_XFLAG_BARRIER) + ip->i_d.di_flags |= XFS_DIFLAG_BARRIER; if (vap->va_xflags & XFS_XFLAG_APPEND) ip->i_d.di_flags |= XFS_DIFLAG_APPEND; if (vap->va_xflags & XFS_XFLAG_SYNC) diff --git a/include/asm-alpha/unistd.h b/include/asm-alpha/unistd.h index ceda5fc56..aae3ab664 100644 --- a/include/asm-alpha/unistd.h +++ b/include/asm-alpha/unistd.h @@ -233,6 +233,7 @@ #define __NR_osf_memcntl 260 /* not implemented */ #define __NR_osf_fdatasync 261 /* not implemented */ +#define __NR_vserver 273 /* * Linux-specific system calls begin at 300 diff --git a/include/asm-arm/tlb.h b/include/asm-arm/tlb.h index ab3cad4fb..a21e6a01e 100644 --- a/include/asm-arm/tlb.h +++ b/include/asm-arm/tlb.h @@ -58,7 +58,8 @@ tlb_finish_mmu(struct mmu_gather *tlb, unsigned long start, unsigned long end) if (rss < freed) freed = rss; - mm->rss = rss - freed; + // mm->rss = rss - freed; + vx_rsspages_sub(mm, freed); if (freed) { flush_tlb_mm(mm); diff --git a/include/asm-arm26/tlb.h b/include/asm-arm26/tlb.h index ee6d11d86..214185e68 100644 --- a/include/asm-arm26/tlb.h +++ b/include/asm-arm26/tlb.h @@ -38,7 +38,8 @@ tlb_finish_mmu(struct mmu_gather *tlb, unsigned long start, unsigned long end) if (rss < freed) freed = rss; - mm->rss = rss - freed; + // mm->rss = rss - freed; + vx_rsspages_sub(mm, freed); if (freed) { flush_tlb_mm(mm); diff --git a/include/asm-generic/tlb.h b/include/asm-generic/tlb.h index 1358c5136..aa7d3c093 100644 --- a/include/asm-generic/tlb.h +++ b/include/asm-generic/tlb.h @@ -15,6 +15,7 @@ #include #include +#include #include /* @@ -91,7 +92,8 @@ tlb_finish_mmu(struct mmu_gather *tlb, unsigned long start, unsigned long end) if (rss < freed) freed = rss; - mm->rss = rss - freed; + // mm->rss = rss - freed; + vx_rsspages_sub(mm, freed); tlb_flush_mmu(tlb, start, end); /* keep the page table cache within bounds */ diff --git a/include/asm-ia64/tlb.h b/include/asm-ia64/tlb.h index 5d714b206..f1ff70964 100644 --- a/include/asm-ia64/tlb.h +++ b/include/asm-ia64/tlb.h @@ -163,7 +163,8 @@ tlb_finish_mmu (struct mmu_gather *tlb, unsigned long start, unsigned long end) if (rss < freed) freed = rss; - mm->rss = rss - freed; + // mm->rss = rss - freed; + vx_rsspages_sub(mm, freed); /* * Note: tlb->nr may be 0 at this point, so we can't rely on tlb->start_addr and * tlb->end_addr. diff --git a/include/asm-m68k/unistd.h b/include/asm-m68k/unistd.h index 0bf278903..65806ca4e 100644 --- a/include/asm-m68k/unistd.h +++ b/include/asm-m68k/unistd.h @@ -239,7 +239,9 @@ #define __NR_fremovexattr 234 #define __NR_futex 235 -#define NR_syscalls 236 +#define __NR_vserver 273 + +#define NR_syscalls 274 /* user-visible error numbers are in the range -1 - -124: see */ diff --git a/include/asm-m68knommu/unistd.h b/include/asm-m68knommu/unistd.h index 6f35eb257..bf2f87892 100644 --- a/include/asm-m68knommu/unistd.h +++ b/include/asm-m68knommu/unistd.h @@ -221,7 +221,9 @@ #define __NR_setfsuid32 215 #define __NR_setfsgid32 216 -#define NR_syscalls 256 +#define __NR_vserver 273 + +#define NR_syscalls 274 /* user-visible error numbers are in the range -1 - -122: see */ diff --git a/include/asm-mips/unistd.h b/include/asm-mips/unistd.h index 22d59d82b..40a96a4e9 100644 --- a/include/asm-mips/unistd.h +++ b/include/asm-mips/unistd.h @@ -288,20 +288,21 @@ #define __NR_clock_nanosleep (__NR_Linux + 265) #define __NR_tgkill (__NR_Linux + 266) #define __NR_utimes (__NR_Linux + 267) -#define __NR_mbind (__NR_Linux + 268) -#define __NR_get_mempolicy (__NR_Linux + 269) -#define __NR_set_mempolicy (__NR_Linux + 270) -#define __NR_mq_open (__NR_Linux + 271) -#define __NR_mq_unlink (__NR_Linux + 272) -#define __NR_mq_timedsend (__NR_Linux + 273) -#define __NR_mq_timedreceive (__NR_Linux + 274) -#define __NR_mq_notify (__NR_Linux + 275) -#define __NR_mq_getsetattr (__NR_Linux + 276) +#define __NR_vserver (__NR_Linux + 273) +#define __NR_mbind (__NR_Linux + 274) +#define __NR_get_mempolicy (__NR_Linux + 275) +#define __NR_set_mempolicy (__NR_Linux + 276) +#define __NR_mq_open (__NR_Linux + 277) +#define __NR_mq_unlink (__NR_Linux + 278) +#define __NR_mq_timedsend (__NR_Linux + 279) +#define __NR_mq_timedreceive (__NR_Linux + 280) +#define __NR_mq_notify (__NR_Linux + 281) +#define __NR_mq_getsetattr (__NR_Linux + 282) /* * Offset of the last Linux o32 flavoured syscall */ -#define __NR_Linux_syscalls 276 +#define __NR_Linux_syscalls 282 #endif /* _MIPS_SIM == _MIPS_SIM_ABI32 */ diff --git a/include/asm-parisc/unistd.h b/include/asm-parisc/unistd.h index de710ff4e..1c410cdb3 100644 --- a/include/asm-parisc/unistd.h +++ b/include/asm-parisc/unistd.h @@ -728,7 +728,9 @@ #define __NR_mq_notify (__NR_Linux + 233) #define __NR_mq_getsetattr (__NR_Linux + 234) -#define __NR_Linux_syscalls 235 +#define __NR_vserver (__NR_Linux + 273) + +#define __NR_Linux_syscalls 273 #define HPUX_GATEWAY_ADDR 0xC0000004 #define LINUX_GATEWAY_ADDR 0x100 diff --git a/include/asm-ppc/unistd.h b/include/asm-ppc/unistd.h index dd6e92e8d..388789e68 100644 --- a/include/asm-ppc/unistd.h +++ b/include/asm-ppc/unistd.h @@ -261,7 +261,7 @@ #define __NR_fadvise64_64 254 #define __NR_rtas 255 /* Number 256 is reserved for sys_debug_setcontext */ -/* Number 257 is reserved for vserver */ +#define __NR_vserver 257 /* Number 258 is reserved for new sys_remap_file_pages */ /* Number 259 is reserved for new sys_mbind */ /* Number 260 is reserved for new sys_get_mempolicy */ diff --git a/include/asm-ppc64/unistd.h b/include/asm-ppc64/unistd.h index 7f38d35f1..39ffcca2f 100644 --- a/include/asm-ppc64/unistd.h +++ b/include/asm-ppc64/unistd.h @@ -267,7 +267,7 @@ #define __NR_fadvise64_64 254 #define __NR_rtas 255 /* Number 256 is reserved for sys_debug_setcontext */ -/* Number 257 is reserved for vserver */ +#define __NR_vserver 257 /* Number 258 is reserved for new sys_remap_file_pages */ /* Number 259 is reserved for new sys_mbind */ /* Number 260 is reserved for new sys_get_mempolicy */ diff --git a/include/asm-s390/unistd.h b/include/asm-s390/unistd.h index 785c764cb..874e25d7f 100644 --- a/include/asm-s390/unistd.h +++ b/include/asm-s390/unistd.h @@ -255,7 +255,7 @@ #define __NR_clock_gettime (__NR_timer_create+6) #define __NR_clock_getres (__NR_timer_create+7) #define __NR_clock_nanosleep (__NR_timer_create+8) -/* Number 263 is reserved for vserver */ +#define __NR_vserver 263 #define __NR_fadvise64_64 264 #define __NR_statfs64 265 #define __NR_fstatfs64 266 diff --git a/include/asm-sparc/unistd.h b/include/asm-sparc/unistd.h index 62eaacd9f..b742c9f4d 100644 --- a/include/asm-sparc/unistd.h +++ b/include/asm-sparc/unistd.h @@ -283,7 +283,7 @@ #define __NR_timer_getoverrun 264 #define __NR_timer_delete 265 #define __NR_timer_create 266 -/* #define __NR_vserver 267 Reserved for VSERVER */ +#define __NR_vserver 267 #define __NR_io_setup 268 #define __NR_io_destroy 269 #define __NR_io_submit 270 diff --git a/include/asm-sparc64/unistd.h b/include/asm-sparc64/unistd.h index 1309641df..e907d845b 100644 --- a/include/asm-sparc64/unistd.h +++ b/include/asm-sparc64/unistd.h @@ -285,7 +285,7 @@ #define __NR_timer_getoverrun 264 #define __NR_timer_delete 265 #define __NR_timer_create 266 -/* #define __NR_vserver 267 Reserved for VSERVER */ +#define __NR_vserver 267 #define __NR_io_setup 268 #define __NR_io_destroy 269 #define __NR_io_submit 270 diff --git a/include/linux/autoconf.h b/include/linux/autoconf.h index 546d52177..c4806367f 100644 --- a/include/linux/autoconf.h +++ b/include/linux/autoconf.h @@ -2297,6 +2297,18 @@ #define CONFIG_X86_FIND_SMP_CONFIG 1 #define CONFIG_X86_MPPARSE 1 +/* + * Linux VServer + */ +#define CONFIG_VSERVER_LEGACY 1 +#define CONFIG_PROC_SECURE 1 +#undef CONFIG_VSERVER_HARDCPU +#undef CONFIG_INOXID_NONE +#undef CONFIG_INOXID_GID16 +#define CONFIG_INOXID_GID24 1 +#undef CONFIG_INOXID_GID32 +#undef CONFIG_INOXID_MAGIC + /* * Security options */ diff --git a/include/linux/capability.h b/include/linux/capability.h index c96e7b624..7798d2c26 100644 --- a/include/linux/capability.h +++ b/include/linux/capability.h @@ -235,6 +235,7 @@ typedef __u32 kernel_cap_t; /* Allow enabling/disabling tagged queuing on SCSI controllers and sending arbitrary SCSI commands */ /* Allow setting encryption key on loopback filesystem */ +/* Allow the selection of a security context */ #define CAP_SYS_ADMIN 21 @@ -284,6 +285,11 @@ typedef __u32 kernel_cap_t; #define CAP_LEASE 28 +/* Allow context manipulations */ +/* Allow changing context info on files */ + +#define CAP_CONTEXT 29 + #ifdef __KERNEL__ /* * Bounding set diff --git a/include/linux/ext2_fs.h b/include/linux/ext2_fs.h index d701ba88c..7c6f650c9 100644 --- a/include/linux/ext2_fs.h +++ b/include/linux/ext2_fs.h @@ -192,6 +192,8 @@ struct ext2_group_desc #define EXT2_NOTAIL_FL 0x00008000 /* file tail should not be merged */ #define EXT2_DIRSYNC_FL 0x00010000 /* dirsync behaviour (directories only) */ #define EXT2_TOPDIR_FL 0x00020000 /* Top of directory hierarchies*/ +#define EXT2_BARRIER_FL 0x04000000 /* Barrier for chroot() */ +#define EXT2_IUNLINK_FL 0x08000000 /* Immutable unlink */ #define EXT2_RESERVED_FL 0x80000000 /* reserved for ext2 lib */ #define EXT2_FL_USER_VISIBLE 0x0003DFFF /* User visible flags */ @@ -240,7 +242,7 @@ struct ext2_inode { struct { __u8 l_i_frag; /* Fragment number */ __u8 l_i_fsize; /* Fragment size */ - __u16 i_pad1; + __u16 l_i_xid; /* LRU Context */ __u16 l_i_uid_high; /* these 2 fields */ __u16 l_i_gid_high; /* were reserved2[0] */ __u32 l_i_reserved2; @@ -272,6 +274,7 @@ struct ext2_inode { #define i_gid_low i_gid #define i_uid_high osd2.linux2.l_i_uid_high #define i_gid_high osd2.linux2.l_i_gid_high +#define i_raw_xid osd2.linux2.l_i_xid #define i_reserved2 osd2.linux2.l_i_reserved2 #endif @@ -312,6 +315,7 @@ struct ext2_inode { #define EXT2_MOUNT_NO_UID32 0x0200 /* Disable 32-bit UIDs */ #define EXT2_MOUNT_XATTR_USER 0x4000 /* Extended user attributes */ #define EXT2_MOUNT_POSIX_ACL 0x8000 /* POSIX Access Control Lists */ +#define EXT2_MOUNT_TAG_XID (1<<16) /* Enable Context Tags */ #define clear_opt(o, opt) o &= ~EXT2_MOUNT_##opt #define set_opt(o, opt) o |= EXT2_MOUNT_##opt diff --git a/include/linux/ext3_fs.h b/include/linux/ext3_fs.h index a4440a9f9..6e4497d8d 100644 --- a/include/linux/ext3_fs.h +++ b/include/linux/ext3_fs.h @@ -184,6 +184,8 @@ struct ext3_group_desc #define EXT3_NOTAIL_FL 0x00008000 /* file tail should not be merged */ #define EXT3_DIRSYNC_FL 0x00010000 /* dirsync behaviour (directories only) */ #define EXT3_TOPDIR_FL 0x00020000 /* Top of directory hierarchies*/ +#define EXT3_BARRIER_FL 0x04000000 /* Barrier for chroot() */ +#define EXT3_IUNLINK_FL 0x08000000 /* Immutable unlink */ #define EXT3_RESERVED_FL 0x80000000 /* reserved for ext3 lib */ #define EXT3_FL_USER_VISIBLE 0x0003DFFF /* User visible flags */ @@ -237,6 +239,9 @@ struct ext3_new_group_data { #endif #define EXT3_IOC_GETRSVSZ _IOR('r', 1, long) #define EXT3_IOC_SETRSVSZ _IOW('r', 2, long) +#ifdef CONFIG_VSERVER_LEGACY +#define EXT3_IOC_SETXID FIOC_SETXIDJ +#endif /* * Structure of an inode on the disk @@ -273,7 +278,7 @@ struct ext3_inode { struct { __u8 l_i_frag; /* Fragment number */ __u8 l_i_fsize; /* Fragment size */ - __u16 i_pad1; + __u16 l_i_xid; /* LRU Context */ __u16 l_i_uid_high; /* these 2 fields */ __u16 l_i_gid_high; /* were reserved2[0] */ __u32 l_i_reserved2; @@ -305,6 +310,7 @@ struct ext3_inode { #define i_gid_low i_gid #define i_uid_high osd2.linux2.l_i_uid_high #define i_gid_high osd2.linux2.l_i_gid_high +#define i_raw_xid osd2.linux2.l_i_xid #define i_reserved2 osd2.linux2.l_i_reserved2 #elif defined(__GNU__) @@ -354,6 +360,7 @@ struct ext3_inode { #define EXT3_MOUNT_XATTR_USER 0x04000 /* Extended user attributes */ #define EXT3_MOUNT_POSIX_ACL 0x08000 /* POSIX Access Control Lists */ #define EXT3_MOUNT_RESERVATION 0x10000 /* Preallocation */ +#define EXT3_MOUNT_TAG_XID 0x20000 /* Enable Context Tags */ /* Compatibility, for having both ext2_fs.h and ext3_fs.h included at once */ #ifndef _LINUX_EXT2_FS_H diff --git a/include/linux/fs.h b/include/linux/fs.h index bd4c362af..0f6c1e938 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -114,6 +114,7 @@ extern int leases_enable, dir_notify_enable, lease_break_time; #define MS_VERBOSE 32768 #define MS_POSIXACL (1<<16) /* VFS does not apply the umask */ #define MS_ONE_SECOND (1<<17) /* fs has 1 sec a/m/ctime resolution */ +#define MS_TAGXID (1<<24) /* tag inodes with context information */ #define MS_ACTIVE (1<<30) #define MS_NOUSER (1<<31) @@ -140,6 +141,8 @@ extern int leases_enable, dir_notify_enable, lease_break_time; #define S_NOQUOTA 64 /* Inode is not counted to quota */ #define S_DIRSYNC 128 /* Directory modifications are synchronous */ #define S_NOCMTIME 256 /* Do not update file c/mtime */ +#define S_BARRIER 512 /* Barrier for chroot() */ +#define S_IUNLINK 1024 /* Immutable unlink */ /* * Note that nosuid etc flags are inode-specific: setting some file-system @@ -167,11 +170,14 @@ extern int leases_enable, dir_notify_enable, lease_break_time; #define IS_NOQUOTA(inode) ((inode)->i_flags & S_NOQUOTA) #define IS_APPEND(inode) ((inode)->i_flags & S_APPEND) #define IS_IMMUTABLE(inode) ((inode)->i_flags & S_IMMUTABLE) +#define IS_IUNLINK(inode) ((inode)->i_flags & S_IUNLINK) +#define IS_IXORUNLINK(inode) ((IS_IUNLINK(inode) ? S_IMMUTABLE : 0) ^ IS_IMMUTABLE(inode)) #define IS_NOATIME(inode) (__IS_FLG(inode, MS_NOATIME) || ((inode)->i_flags & S_NOATIME)) #define IS_NODIRATIME(inode) __IS_FLG(inode, MS_NODIRATIME) #define IS_POSIXACL(inode) __IS_FLG(inode, MS_POSIXACL) #define IS_ONE_SECOND(inode) __IS_FLG(inode, MS_ONE_SECOND) +#define IS_BARRIER(inode) (S_ISDIR((inode)->i_mode) && ((inode)->i_flags & S_BARRIER)) #define IS_DEADDIR(inode) ((inode)->i_flags & S_DEAD) #define IS_NOCMTIME(inode) ((inode)->i_flags & S_NOCMTIME) @@ -281,6 +287,9 @@ struct iattr { #define ATTR_FLAG_IMMUTABLE 8 /* Immutable file */ #define ATTR_FLAG_NODIRATIME 16 /* Don't update atime for directory */ +#define ATTR_FLAG_BARRIER 512 /* Barrier for chroot() */ +#define ATTR_FLAG_IUNLINK 1024 /* Immutable unlink */ + /* * Includes for diskquotas. */ @@ -418,6 +427,7 @@ struct inode { unsigned int i_nlink; uid_t i_uid; gid_t i_gid; + xid_t i_xid; dev_t i_rdev; loff_t i_size; struct timespec i_atime; diff --git a/include/linux/init_task.h b/include/linux/init_task.h index 29189706e..3ba25d682 100644 --- a/include/linux/init_task.h +++ b/include/linux/init_task.h @@ -112,6 +112,10 @@ extern struct group_info init_groups; .proc_lock = SPIN_LOCK_UNLOCKED, \ .switch_lock = SPIN_LOCK_UNLOCKED, \ .journal_info = NULL, \ + .xid = 0, \ + .nid = 0, \ + .vx_info = NULL, \ + .nx_info = NULL, \ } diff --git a/include/linux/ip.h b/include/linux/ip.h index ab799b48b..5ea190d1b 100644 --- a/include/linux/ip.h +++ b/include/linux/ip.h @@ -111,6 +111,7 @@ struct inet_opt { /* Socket demultiplex comparisons on incoming packets. */ __u32 daddr; /* Foreign IPv4 addr */ __u32 rcv_saddr; /* Bound local IPv4 addr */ + __u32 rcv_saddr2; /* Second bound ipv4 addr, for ipv4root */ __u16 dport; /* Destination port */ __u16 num; /* Local port */ __u32 saddr; /* Sending source */ diff --git a/include/linux/ipc.h b/include/linux/ipc.h index b29118973..079c2feb3 100644 --- a/include/linux/ipc.h +++ b/include/linux/ipc.h @@ -66,6 +66,7 @@ struct kern_ipc_perm mode_t mode; unsigned long seq; void *security; + xid_t xid; }; #endif /* __KERNEL__ */ diff --git a/include/linux/mm.h b/include/linux/mm.h index 09e6742dd..76a8070d7 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -12,6 +12,7 @@ #include #include #include +#include #include struct mempolicy; diff --git a/include/linux/namespace.h b/include/linux/namespace.h index fdd8abb07..ae9c17d6e 100644 --- a/include/linux/namespace.h +++ b/include/linux/namespace.h @@ -13,6 +13,7 @@ struct namespace { }; extern void umount_tree(struct vfsmount *); +extern void umount_unused(struct vfsmount *, struct fs_struct *); extern int copy_namespace(int, struct task_struct *); void __put_namespace(struct namespace *namespace); diff --git a/include/linux/net.h b/include/linux/net.h index a4684166d..1f531a9b5 100644 --- a/include/linux/net.h +++ b/include/linux/net.h @@ -60,6 +60,8 @@ typedef enum { #define SOCK_ASYNC_NOSPACE 0 #define SOCK_ASYNC_WAITDATA 1 #define SOCK_NOSPACE 2 +#define SOCK_PASS_CRED 16 +#define SOCK_USER_SOCKET 17 /** * struct socket - general BSD socket @@ -82,7 +84,6 @@ struct socket { struct sock *sk; wait_queue_head_t wait; short type; - unsigned char passcred; }; struct vm_area_struct; diff --git a/include/linux/proc_fs.h b/include/linux/proc_fs.h index 2d439a839..3c3226075 100644 --- a/include/linux/proc_fs.h +++ b/include/linux/proc_fs.h @@ -55,6 +55,7 @@ struct proc_dir_entry { nlink_t nlink; uid_t uid; gid_t gid; + int vx_flags; unsigned long size; struct inode_operations * proc_iops; struct file_operations * proc_fops; @@ -237,9 +238,11 @@ extern struct kcore_list *kclist_del(void *); struct proc_inode { struct task_struct *task; int type; + int vx_flags; union { int (*proc_get_link)(struct inode *, struct dentry **, struct vfsmount **); int (*proc_read)(struct task_struct *task, char *page); + int (*proc_vid_read)(int vid, char *page); } op; struct proc_dir_entry *pde; struct inode vfs_inode; diff --git a/include/linux/reiserfs_fs.h b/include/linux/reiserfs_fs.h index 8132a6ec9..2eb4e7974 100644 --- a/include/linux/reiserfs_fs.h +++ b/include/linux/reiserfs_fs.h @@ -888,6 +888,13 @@ struct stat_data_v1 #define REISERFS_COMPR_FL EXT2_COMPR_FL #define REISERFS_NOTAIL_FL EXT2_NOTAIL_FL +/* unfortunately reiserfs sdattr is only 16 bit */ +#define REISERFS_BARRIER_FL (EXT2_BARRIER_FL >> 16) +#define REISERFS_IUNLINK_FL (EXT2_IUNLINK_FL >> 16) + +#define REISERFS_FL_USER_VISIBLE 0x80FF +#define REISERFS_FL_USER_MODIFYABLE 0x80FF + /* persistent flags that file inherits from the parent directory */ #define REISERFS_INHERIT_MASK ( REISERFS_IMMUTABLE_FL | \ REISERFS_SYNC_FL | \ diff --git a/include/linux/sched.h b/include/linux/sched.h index b82de21dc..3276ebc9a 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -105,6 +105,7 @@ extern unsigned long nr_iowait(void); #include #include +#include #define TASK_RUNNING 0 #define TASK_INTERRUPTIBLE 1 @@ -112,6 +113,7 @@ extern unsigned long nr_iowait(void); #define TASK_STOPPED 4 #define TASK_ZOMBIE 8 #define TASK_DEAD 16 +#define TASK_ONHOLD 32 #define __set_task_state(tsk, state_value) \ do { (tsk)->state = (state_value); } while (0) @@ -229,6 +231,7 @@ struct mm_struct { /* Architecture-specific MM context */ mm_context_t context; + struct vx_info *mm_vx_info; /* coredumping support */ int core_waiters; @@ -323,9 +326,10 @@ struct user_struct { /* Hash table maintenance information */ struct list_head uidhash_list; uid_t uid; + xid_t xid; }; -extern struct user_struct *find_user(uid_t); +extern struct user_struct *find_user(xid_t, uid_t); extern struct user_struct root_user; #define INIT_USER (&root_user) @@ -495,6 +499,14 @@ struct task_struct { void *security; struct audit_context *audit_context; +/* vserver context data */ + xid_t xid; + struct vx_info *vx_info; + +/* vserver network data */ + nid_t nid; + struct nx_info *nx_info; + /* Thread group tracking */ u32 parent_exec_id; u32 self_exec_id; @@ -730,7 +742,7 @@ extern void set_special_pids(pid_t session, pid_t pgrp); extern void __set_special_pids(pid_t session, pid_t pgrp); /* per-UID process charging. */ -extern struct user_struct * alloc_uid(uid_t); +extern struct user_struct * alloc_uid(xid_t, uid_t); extern void free_uid(struct user_struct *); extern void switch_uid(struct user_struct *); diff --git a/include/linux/sysctl.h b/include/linux/sysctl.h index 9b955be35..0c923ca54 100644 --- a/include/linux/sysctl.h +++ b/include/linux/sysctl.h @@ -133,6 +133,7 @@ enum KERN_NGROUPS_MAX=63, /* int: NGROUPS_MAX */ KERN_SPARC_SCONS_PWROFF=64, /* int: serial console power-off halt */ KERN_HZ_TIMER=65, /* int: hz timer on or off */ + KERN_VSHELPER=66, /* string: path to vshelper policy agent */ }; diff --git a/include/linux/types.h b/include/linux/types.h index 23c414f11..288ab653e 100644 --- a/include/linux/types.h +++ b/include/linux/types.h @@ -36,6 +36,8 @@ typedef __kernel_uid32_t uid_t; typedef __kernel_gid32_t gid_t; typedef __kernel_uid16_t uid16_t; typedef __kernel_gid16_t gid16_t; +typedef unsigned int xid_t; +typedef unsigned int nid_t; #ifdef CONFIG_UID16 /* This is defined by include/asm-{arch}/posix_types.h */ diff --git a/include/net/af_unix.h b/include/net/af_unix.h index be877d75c..b47489bfc 100644 --- a/include/net/af_unix.h +++ b/include/net/af_unix.h @@ -11,9 +11,9 @@ extern rwlock_t unix_table_lock; extern atomic_t unix_tot_inflight; -static inline struct sock *first_unix_socket(int *i) +static inline struct sock *next_unix_socket_table(int *i) { - for (*i = 0; *i <= UNIX_HASH_SIZE; (*i)++) { + for ((*i)++; *i <= UNIX_HASH_SIZE; (*i)++) { if (!hlist_empty(&unix_socket_table[*i])) return __sk_head(&unix_socket_table[*i]); } @@ -22,16 +22,19 @@ static inline struct sock *first_unix_socket(int *i) static inline struct sock *next_unix_socket(int *i, struct sock *s) { - struct sock *next = sk_next(s); - /* More in this chain? */ - if (next) - return next; - /* Look for next non-empty chain. */ - for ((*i)++; *i <= UNIX_HASH_SIZE; (*i)++) { - if (!hlist_empty(&unix_socket_table[*i])) - return __sk_head(&unix_socket_table[*i]); - } - return NULL; + do { + if (s) + s = sk_next(s); + if (!s) + s = next_unix_socket_table(i); + } while (s && !vx_check(s->sk_xid, VX_IDENT|VX_WATCH)); + return s; +} + +static inline struct sock *first_unix_socket(int *i) +{ + *i = 0; + return next_unix_socket(i, NULL); } #define forall_unix_sockets(i, s) \ diff --git a/include/net/route.h b/include/net/route.h index 7a851de92..4cbac7da3 100644 --- a/include/net/route.h +++ b/include/net/route.h @@ -33,6 +33,7 @@ #include #include #include +#include #ifndef __KERNEL__ #warning This file is not supposed to be used outside of kernel. @@ -146,6 +147,59 @@ static inline char rt_tos2priority(u8 tos) return ip_tos2prio[IPTOS_TOS(tos)>>1]; } +#define IPI_LOOPBACK 0x0100007f + +static inline int ip_find_src(struct nx_info *nxi, struct rtable **rp, struct flowi *fl) +{ + int err; + int i, n = nxi->nbipv4; + u32 ipv4root = nxi->ipv4[0]; + + if (ipv4root == 0) + return 0; + + if (fl->fl4_src == 0) { + if (n > 1) { + u32 foundsrc; + + err = __ip_route_output_key(rp, fl); + if (err) { + fl->fl4_src = ipv4root; + err = __ip_route_output_key(rp, fl); + } + if (err) + return err; + + foundsrc = (*rp)->rt_src; + ip_rt_put(*rp); + + for (i=0; imask[i]; + u32 ipv4 = nxi->ipv4[i]; + u32 net4 = ipv4 & mask; + + if (foundsrc == ipv4) { + fl->fl4_src = ipv4; + break; + } + if (!fl->fl4_src && (foundsrc & mask) == net4) + fl->fl4_src = ipv4; + } + } + if (fl->fl4_src == 0) + fl->fl4_src = (fl->fl4_dst == IPI_LOOPBACK) + ? IPI_LOOPBACK : ipv4root; + } else { + for (i=0; iipv4[i] == fl->fl4_src) + break; + } + if (i == n) + return -EPERM; + } + return 0; +} + static inline int ip_route_connect(struct rtable **rp, u32 dst, u32 src, u32 tos, int oif, u8 protocol, u16 sport, u16 dport, struct sock *sk) @@ -160,7 +214,22 @@ static inline int ip_route_connect(struct rtable **rp, u32 dst, .dport = dport } } }; int err; - if (!dst || !src) { + struct nx_info *nx_info = current->nx_info; + + if (sk) + nx_info = sk->sk_nx_info; + vxdprintk("ip_route_connect(%p) %p,%p;%lx\n", + sk, nx_info, sk->sk_socket, + (sk->sk_socket?sk->sk_socket->flags:0)); + + if (nx_info) { + err = ip_find_src(nx_info, rp, &fl); + if (err) + return err; + if (fl.fl4_dst == IPI_LOOPBACK && !vx_check(0, VX_ADMIN)) + fl.fl4_dst = nx_info->ipv4[0]; + } + if (!fl.fl4_dst || !fl.fl4_src) { err = __ip_route_output_key(rp, &fl); if (err) return err; diff --git a/include/net/scm.h b/include/net/scm.h index b7ba74dbc..30e9fbb98 100644 --- a/include/net/scm.h +++ b/include/net/scm.h @@ -51,13 +51,13 @@ static __inline__ void scm_recv(struct socket *sock, struct msghdr *msg, { if (!msg->msg_control) { - if (sock->passcred || scm->fp) + if (test_bit(SOCK_PASS_CRED, &sock->flags) || scm->fp) msg->msg_flags |= MSG_CTRUNC; scm_destroy(scm); return; } - if (sock->passcred) + if (test_bit(SOCK_PASS_CRED, &sock->flags)) put_cmsg(msg, SOL_SOCKET, SCM_CREDENTIALS, sizeof(scm->creds), &scm->creds); if (!scm->fp) diff --git a/include/net/sock.h b/include/net/sock.h index 1cea99704..67a55d513 100644 --- a/include/net/sock.h +++ b/include/net/sock.h @@ -50,6 +50,7 @@ #include #include +#include #include #include @@ -109,6 +110,10 @@ struct sock_common { struct hlist_node skc_node; struct hlist_node skc_bind_node; atomic_t skc_refcnt; + xid_t skc_xid; + struct vx_info *skc_vx_info; + nid_t skc_nid; + struct nx_info *skc_nx_info; }; /** @@ -187,6 +192,10 @@ struct sock { #define sk_node __sk_common.skc_node #define sk_bind_node __sk_common.skc_bind_node #define sk_refcnt __sk_common.skc_refcnt +#define sk_xid __sk_common.skc_xid +#define sk_vx_info __sk_common.skc_vx_info +#define sk_nid __sk_common.skc_nid +#define sk_nx_info __sk_common.skc_nx_info volatile unsigned char sk_zapped; unsigned char sk_shutdown; unsigned char sk_use_write_queue; diff --git a/include/net/tcp.h b/include/net/tcp.h index 62d75ee68..6c9bcf81b 100644 --- a/include/net/tcp.h +++ b/include/net/tcp.h @@ -195,6 +195,10 @@ struct tcp_tw_bucket { #define tw_node __tw_common.skc_node #define tw_bind_node __tw_common.skc_bind_node #define tw_refcnt __tw_common.skc_refcnt +#define tw_xid __tw_common.skc_xid +#define tw_vx_info __tw_common.skc_vx_info +#define tw_nid __tw_common.skc_nid +#define tw_nx_info __tw_common.skc_nx_info volatile unsigned char tw_substate; unsigned char tw_rcv_wscale; __u16 tw_sport; diff --git a/ipc/msg.c b/ipc/msg.c index 5f256af8b..210641516 100644 --- a/ipc/msg.c +++ b/ipc/msg.c @@ -96,6 +96,7 @@ static int newque (key_t key, int msgflg) msq->q_perm.mode = (msgflg & S_IRWXUGO); msq->q_perm.key = key; + msq->q_perm.xid = current->xid; msq->q_perm.security = NULL; retval = security_msg_queue_alloc(msq); @@ -788,7 +789,11 @@ static int sysvipc_msg_read_proc(char *buffer, char **start, off_t offset, int l for(i = 0; i <= msg_ids.max_id; i++) { struct msg_queue * msq; msq = msg_lock(i); - if(msq != NULL) { + if (msq) { + if (!vx_check(msq->q_perm.xid, VX_IDENT)) { + msg_unlock(msq); + continue; + } len += sprintf(buffer + len, "%10d %10d %4o %10lu %10lu %5u %5u %5u %5u %5u %5u %10lu %10lu %10lu\n", msq->q_perm.key, msg_buildid(i,msq->q_perm.seq), diff --git a/ipc/sem.c b/ipc/sem.c index 6316aca9c..d226d3dd1 100644 --- a/ipc/sem.c +++ b/ipc/sem.c @@ -175,6 +175,7 @@ static int newary (key_t key, int nsems, int semflg) sma->sem_perm.mode = (semflg & S_IRWXUGO); sma->sem_perm.key = key; + sma->sem_perm.xid = current->xid; sma->sem_perm.security = NULL; retval = security_sem_alloc(sma); @@ -1296,7 +1297,11 @@ static int sysvipc_sem_read_proc(char *buffer, char **start, off_t offset, int l for(i = 0; i <= sem_ids.max_id; i++) { struct sem_array *sma; sma = sem_lock(i); - if(sma) { + if (sma) { + if (!vx_check(sma->sem_perm.xid, VX_IDENT)) { + sem_unlock(sma); + continue; + } len += sprintf(buffer + len, "%10d %10d %4o %10lu %5u %5u %5u %5u %10lu %10lu\n", sma->sem_perm.key, sem_buildid(i,sma->sem_perm.seq), diff --git a/ipc/shm.c b/ipc/shm.c index 9761e3bcb..ea2409464 100644 --- a/ipc/shm.c +++ b/ipc/shm.c @@ -189,6 +189,7 @@ static int newseg (key_t key, int shmflg, size_t size) return -ENOMEM; shp->shm_perm.key = key; + shp->shm_perm.xid = current->xid; shp->shm_flags = (shmflg & S_IRWXUGO); shp->shm_perm.security = NULL; @@ -847,11 +848,15 @@ static int sysvipc_shm_read_proc(char *buffer, char **start, off_t offset, int l struct shmid_kernel* shp; shp = shm_lock(i); - if(shp!=NULL) { + if (shp) { #define SMALL_STRING "%10d %10d %4o %10u %5u %5u %5d %5u %5u %5u %5u %10lu %10lu %10lu\n" #define BIG_STRING "%10d %10d %4o %21u %5u %5u %5d %5u %5u %5u %5u %10lu %10lu %10lu\n" char *format; + if (!vx_check(shp->shm_perm.xid, VX_IDENT)) { + shm_unlock(shp); + continue; + } if (sizeof(size_t) <= sizeof(int)) format = SMALL_STRING; else diff --git a/ipc/util.c b/ipc/util.c index 81a145ede..7c99ebe64 100644 --- a/ipc/util.c +++ b/ipc/util.c @@ -105,8 +105,10 @@ int ipc_findkey(struct ipc_ids* ids, key_t key) */ for (id = 0; id <= max_id; id++) { p = ids->entries[id].p; - if(p==NULL) + if (p==NULL) continue; + if (!vx_check(p->xid, VX_IDENT)) + continue; if (key == p->key) return id; } @@ -369,6 +371,8 @@ int ipcperms (struct kern_ipc_perm *ipcp, short flag) { /* flag will most probably be 0 or S_...UGO from */ int requested_mode, granted_mode; + if (!vx_check(ipcp->xid, VX_ADMIN|VX_IDENT)) /* maybe just VX_IDENT? */ + return -1; requested_mode = (flag >> 6) | (flag >> 3) | flag; granted_mode = ipcp->mode; if (current->euid == ipcp->cuid || current->euid == ipcp->uid) diff --git a/kernel/Makefile b/kernel/Makefile index 238c65f60..81849958d 100644 --- a/kernel/Makefile +++ b/kernel/Makefile @@ -9,6 +9,11 @@ obj-y = sched.o fork.o exec_domain.o panic.o printk.o profile.o \ rcupdate.o intermodule.o extable.o params.o posix-timers.o \ kthread.o +# mod-subdirs := vserver + +subdir-y += vserver +obj-y += vserver/vserver.o + obj-$(CONFIG_FUTEX) += futex.o obj-$(CONFIG_GENERIC_ISA_DMA) += dma.o obj-$(CONFIG_SMP) += cpu.o diff --git a/kernel/exit.c b/kernel/exit.c index c80a44115..c6cd8aeff 100644 --- a/kernel/exit.c +++ b/kernel/exit.c @@ -37,6 +37,11 @@ int getrusage(struct task_struct *, int, struct rusage __user *); static void __unhash_process(struct task_struct *p) { nr_threads--; + /* tasklist_lock is held, is this sufficient? */ + if (p->vx_info) { + atomic_dec(&p->vx_info->cacct.nr_threads); + atomic_dec(&p->vx_info->limit.res[RLIMIT_NPROC]); + } detach_pid(p, PIDTYPE_PID); detach_pid(p, PIDTYPE_TGID); if (thread_group_leader(p)) { @@ -236,6 +241,7 @@ void reparent_to_init(void) ptrace_unlink(current); /* Reparent to init */ REMOVE_LINKS(current); + /* FIXME handle vchild_reaper/initpid */ current->parent = child_reaper; current->real_parent = child_reaper; SET_LINKS(current); @@ -380,6 +386,7 @@ static inline void close_files(struct files_struct * files) struct file * file = xchg(&files->fd[i], NULL); if (file) filp_close(file, files); + vx_openfd_dec(fd); } i++; set >>= 1; @@ -599,6 +606,7 @@ static inline void forget_original_parent(struct task_struct * father) struct task_struct *p, *reaper = father; struct list_head *_p, *_n; + /* FIXME handle vchild_reaper/initpid */ reaper = father->group_leader; if (reaper == father) reaper = child_reaper; diff --git a/kernel/fork.c b/kernel/fork.c index 559e6bbf5..b20afcbd6 100644 --- a/kernel/fork.c +++ b/kernel/fork.c @@ -36,6 +36,8 @@ #include #include #include +#include +#include #include #include @@ -78,6 +80,8 @@ static kmem_cache_t *task_struct_cachep; static void free_task(struct task_struct *tsk) { free_thread_info(tsk->thread_info); + clr_vx_info(&tsk->vx_info); + clr_nx_info(&tsk->nx_info); free_task_struct(tsk); } @@ -419,6 +423,7 @@ static struct mm_struct * mm_init(struct mm_struct * mm) #ifdef __HAVE_ARCH_MMAP_TOP mm->mmap_top = mmap_top(); #endif + set_vx_info(&mm->mm_vx_info, current->vx_info); return mm; } free_mm(mm); @@ -450,6 +455,7 @@ void fastcall __mmdrop(struct mm_struct *mm) BUG_ON(mm == &init_mm); mm_free_pgd(mm); destroy_context(mm); + clr_vx_info(&mm->mm_vx_info); free_mm(mm); } @@ -564,6 +570,7 @@ static int copy_mm(unsigned long clone_flags, struct task_struct * tsk) /* Copy the current MM stuff.. */ memcpy(mm, oldmm, sizeof(*mm)); + mm->mm_vx_info = NULL; if (!mm_init(mm)) goto fail_nomem; @@ -875,6 +882,8 @@ struct task_struct *copy_process(unsigned long clone_flags, { int retval; struct task_struct *p = NULL; + struct vx_info *vxi; + struct nx_info *nxi; if ((clone_flags & (CLONE_NEWNS|CLONE_FS)) == (CLONE_NEWNS|CLONE_FS)) return ERR_PTR(-EINVAL); @@ -899,12 +908,32 @@ struct task_struct *copy_process(unsigned long clone_flags, goto fork_out; retval = -ENOMEM; + p = dup_task_struct(current); if (!p) goto fork_out; p->tux_info = NULL; + vxi = get_vx_info(current->vx_info); + nxi = get_nx_info(current->nx_info); + + /* check vserver memory */ + if (p->mm && !(clone_flags & CLONE_VM)) { + if (vx_vmpages_avail(p->mm, p->mm->total_vm)) + vx_pages_add(p->mm->mm_vx_info, RLIMIT_AS, p->mm->total_vm); + else + goto bad_fork_free; + } + if (p->mm && vx_flags(VXF_FORK_RSS, 0)) { + if (!vx_rsspages_avail(p->mm, p->mm->rss)) + goto bad_fork_free; + } + retval = -EAGAIN; + if (vxi && (atomic_read(&vxi->limit.res[RLIMIT_NPROC]) + >= vxi->limit.rlim[RLIMIT_NPROC])) + goto bad_fork_free; + if (atomic_read(&p->user->processes) >= p->rlim[RLIMIT_NPROC].rlim_cur) { if (!capable(CAP_SYS_ADMIN) && !capable(CAP_SYS_RESOURCE) && @@ -1097,6 +1126,10 @@ struct task_struct *copy_process(unsigned long clone_flags, link_pid(p, p->pids + PIDTYPE_TGID, &p->group_leader->pids[PIDTYPE_TGID].pid); nr_threads++; + if (vxi) { + atomic_inc(&vxi->cacct.nr_threads); + atomic_inc(&vxi->limit.res[RLIMIT_NPROC]); + } write_unlock_irq(&tasklist_lock); retval = 0; diff --git a/kernel/pid.c b/kernel/pid.c index 6ed44f56c..a8b7eb3c2 100644 --- a/kernel/pid.c +++ b/kernel/pid.c @@ -224,7 +224,8 @@ void fastcall detach_pid(task_t *task, enum pid_type type) task_t *find_task_by_pid(int nr) { - struct pid *pid = find_pid(PIDTYPE_PID, nr); + struct pid *pid = find_pid(PIDTYPE_PID, + vx_rmap_tgid(current->vx_info, nr)); if (!pid) return NULL; diff --git a/kernel/printk.c b/kernel/printk.c index 9e34ce41b..8bffe0433 100644 --- a/kernel/printk.c +++ b/kernel/printk.c @@ -247,7 +247,10 @@ int do_syslog(int type, char __user * buf, int len) unsigned long i, j, limit, count; int do_clear = 0; char c; - int error = 0; + int error = -EPERM; + + if (!vx_check(0, VX_ADMIN|VX_WATCH)) + return error; error = security_syslog(type); if (error) diff --git a/kernel/sched.c b/kernel/sched.c index 02f9f2253..53c92f136 100644 --- a/kernel/sched.c +++ b/kernel/sched.c @@ -41,6 +41,8 @@ #include #include #include +#include +#include #include @@ -233,6 +235,8 @@ struct runqueue { task_t *migration_thread; struct list_head migration_queue; #endif + struct list_head hold_queue; + int idle_tokens; }; static DEFINE_PER_CPU(struct runqueue, runqueues); @@ -354,6 +358,9 @@ static int effective_prio(task_t *p) bonus = CURRENT_BONUS(p) - MAX_BONUS / 2; prio = p->static_prio - bonus; + if (__vx_task_flags(p, VXF_SCHED_PRIO, 0)) + prio += effective_vavavoom(p, MAX_USER_PRIO); + if (prio < MAX_RT_PRIO) prio = MAX_RT_PRIO; if (prio > MAX_PRIO-1) @@ -1983,6 +1990,9 @@ void scheduler_tick(int user_ticks, int sys_ticks) } if (p == rq->idle) { + if (!--rq->idle_tokens && !list_empty(&rq->hold_queue)) + set_need_resched(); + if (atomic_read(&rq->nr_iowait) > 0) cpustat->iowait += sys_ticks; else @@ -2027,7 +2037,7 @@ void scheduler_tick(int user_ticks, int sys_ticks) } goto out_unlock; } - if (!--p->time_slice) { + if (vx_need_resched(p)) { dequeue_task(p, rq->active); set_tsk_need_resched(p); p->prio = effective_prio(p); @@ -2174,6 +2184,10 @@ asmlinkage void __sched schedule(void) unsigned long long now; unsigned long run_time; int cpu, idx; +#ifdef CONFIG_VSERVER_HARDCPU + struct vx_info *vxi; + int maxidle = -HZ; +#endif /* * Test if we are atomic. Since do_exit() needs to call into @@ -2224,6 +2238,37 @@ need_resched: } cpu = smp_processor_id(); +#ifdef CONFIG_VSERVER_HARDCPU + if (!list_empty(&rq->hold_queue)) { + struct list_head *l, *n; + int ret; + + vxi = NULL; + list_for_each_safe(l, n, &rq->hold_queue) { + next = list_entry(l, task_t, run_list); + if (vxi == next->vx_info) + continue; + + vxi = next->vx_info; + ret = vx_tokens_recalc(vxi); + // tokens = vx_tokens_avail(next); + + if (ret > 0) { + list_del(&next->run_list); + next->state &= ~TASK_ONHOLD; + recalc_task_prio(next, now); + __activate_task(next, rq); + // printk("··· unhold %p\n", next); + break; + } + if ((ret < 0) && (maxidle < ret)) + maxidle = ret; + } + } + rq->idle_tokens = -maxidle; + +pick_next: +#endif if (unlikely(!rq->nr_running)) { idle_balance(cpu, rq); if (!rq->nr_running) { @@ -2255,6 +2300,23 @@ need_resched: goto switch_tasks; } +#ifdef CONFIG_VSERVER_HARDCPU + vxi = next->vx_info; + if (vxi && __vx_flags(vxi->vx_flags, + VXF_SCHED_PAUSE|VXF_SCHED_HARD, 0)) { + int ret = vx_tokens_recalc(vxi); + + if (unlikely(ret <= 0)) { + if (ret && (rq->idle_tokens > -ret)) + rq->idle_tokens = -ret; + deactivate_task(next, rq); + list_add_tail(&next->run_list, &rq->hold_queue); + next->state |= TASK_ONHOLD; + goto pick_next; + } + } +#endif + if (!rt_task(next) && next->activated > 0) { unsigned long long delta = now - next->timestamp; @@ -3918,6 +3980,7 @@ void __init sched_init(void) rq->migration_thread = NULL; INIT_LIST_HEAD(&rq->migration_queue); #endif + INIT_LIST_HEAD(&rq->hold_queue); atomic_set(&rq->nr_iowait, 0); for (j = 0; j < 2; j++) { diff --git a/kernel/signal.c b/kernel/signal.c index d1f7f609b..d8755d805 100644 --- a/kernel/signal.c +++ b/kernel/signal.c @@ -1052,6 +1052,9 @@ int group_send_sig_info(int sig, struct siginfo *info, struct task_struct *p) unsigned long flags; int ret; + if (!vx_check(vx_task_xid(p), VX_ADMIN|VX_WATCH|VX_IDENT)) + return -ESRCH; + ret = check_kill_permission(sig, info, p); if (!ret && sig && p->sighand) { spin_lock_irqsave(&p->sighand->siglock, flags); diff --git a/kernel/sys.c b/kernel/sys.c index d22fd2d12..464d5cb8d 100644 --- a/kernel/sys.c +++ b/kernel/sys.c @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -342,7 +343,7 @@ asmlinkage long sys_setpriority(int which, int who, int niceval) if (!who) user = current->user; else - user = find_user(who); + user = find_user(vx_current_xid(), who); if (!user) goto out_unlock; @@ -403,7 +404,7 @@ asmlinkage long sys_getpriority(int which, int who) if (!who) user = current->user; else - user = find_user(who); + user = find_user(vx_current_xid(), who); if (!user) goto out_unlock; @@ -425,6 +426,72 @@ out_unlock: return retval; } +/* + * vshelper path is set via /proc/sys + * invoked by vserver sys_reboot(), with + * the following arguments + * + * argv [0] = vshelper_path; + * argv [1] = action: "restart", "halt", "poweroff", ... + * argv [2] = context identifier + * argv [3] = additional argument (restart2) + * + * envp [*] = type-specific parameters + */ +char vshelper_path[255] = "/sbin/vshelper"; + +long vs_reboot(unsigned int cmd, void * arg) +{ + char id_buf[8], cmd_buf[32]; + char uid_buf[32], pid_buf[32]; + char buffer[256]; + + char *argv[] = {vshelper_path, NULL, id_buf, NULL, 0}; + char *envp[] = {"HOME=/", "TERM=linux", + "PATH=/sbin:/usr/sbin:/bin:/usr/bin", + uid_buf, pid_buf, cmd_buf, 0}; + + snprintf(id_buf, sizeof(id_buf)-1, "%d", vx_current_xid()); + + snprintf(cmd_buf, sizeof(cmd_buf)-1, "VS_CMD=%08x", cmd); + snprintf(uid_buf, sizeof(uid_buf)-1, "VS_UID=%d", current->uid); + snprintf(pid_buf, sizeof(pid_buf)-1, "VS_PID=%d", current->pid); + + switch (cmd) { + case LINUX_REBOOT_CMD_RESTART: + argv[1] = "restart"; + break; + + case LINUX_REBOOT_CMD_HALT: + argv[1] = "halt"; + break; + + case LINUX_REBOOT_CMD_POWER_OFF: + argv[1] = "poweroff"; + break; + + case LINUX_REBOOT_CMD_SW_SUSPEND: + argv[1] = "swsusp"; + break; + + case LINUX_REBOOT_CMD_RESTART2: + if (strncpy_from_user(&buffer[0], (char *)arg, sizeof(buffer) - 1) < 0) + return -EFAULT; + argv[3] = buffer; + default: + argv[1] = "restart2"; + break; + } + + /* maybe we should wait ? */ + if (call_usermodehelper(*argv, argv, envp, 0)) { + printk( KERN_WARNING + "vs_reboot(): failed to exec (%s %s %s %s)\n", + vshelper_path, argv[1], argv[2], argv[3]); + return -EPERM; + } + return 0; +} /* * Reboot system call: for obvious reasons only root may call it, @@ -450,6 +517,9 @@ asmlinkage long sys_reboot(int magic1, int magic2, unsigned int cmd, void __user magic2 != LINUX_REBOOT_MAGIC2C)) return -EINVAL; + if (!vx_check(0, VX_ADMIN|VX_WATCH)) + return vs_reboot(cmd, arg); + lock_kernel(); switch (cmd) { case LINUX_REBOOT_CMD_RESTART: @@ -644,7 +714,7 @@ static int set_user(uid_t new_ruid, int dumpclear) { struct user_struct *new_user; - new_user = alloc_uid(new_ruid); + new_user = alloc_uid(vx_current_xid(), new_ruid); if (!new_user) return -EAGAIN; @@ -1392,7 +1462,7 @@ asmlinkage long sys_newuname(struct new_utsname __user * name) int errno = 0; down_read(&uts_sem); - if (copy_to_user(name,&system_utsname,sizeof *name)) + if (copy_to_user(name, vx_new_utsname(), sizeof *name)) errno = -EFAULT; up_read(&uts_sem); return errno; @@ -1403,15 +1473,17 @@ asmlinkage long sys_sethostname(char __user *name, int len) int errno; char tmp[__NEW_UTS_LEN]; - if (!capable(CAP_SYS_ADMIN)) + if (!capable(CAP_SYS_ADMIN) && !vx_ccaps(VXC_SET_UTSNAME)) return -EPERM; if (len < 0 || len > __NEW_UTS_LEN) return -EINVAL; down_write(&uts_sem); errno = -EFAULT; if (!copy_from_user(tmp, name, len)) { - memcpy(system_utsname.nodename, tmp, len); - system_utsname.nodename[len] = 0; + char *ptr = vx_new_uts(nodename); + + memcpy(ptr, tmp, len); + ptr[len] = 0; errno = 0; } up_write(&uts_sem); @@ -1423,15 +1495,17 @@ asmlinkage long sys_sethostname(char __user *name, int len) asmlinkage long sys_gethostname(char __user *name, int len) { int i, errno; + char *ptr; if (len < 0) return -EINVAL; down_read(&uts_sem); - i = 1 + strlen(system_utsname.nodename); + ptr = vx_new_uts(nodename); + i = 1 + strlen(ptr); if (i > len) i = len; errno = 0; - if (copy_to_user(name, system_utsname.nodename, i)) + if (copy_to_user(name, ptr, i)) errno = -EFAULT; up_read(&uts_sem); return errno; @@ -1448,7 +1522,7 @@ asmlinkage long sys_setdomainname(char __user *name, int len) int errno; char tmp[__NEW_UTS_LEN]; - if (!capable(CAP_SYS_ADMIN)) + if (!capable(CAP_SYS_ADMIN) && !vx_ccaps(VXC_SET_UTSNAME)) return -EPERM; if (len < 0 || len > __NEW_UTS_LEN) return -EINVAL; @@ -1456,8 +1530,10 @@ asmlinkage long sys_setdomainname(char __user *name, int len) down_write(&uts_sem); errno = -EFAULT; if (!copy_from_user(tmp, name, len)) { - memcpy(system_utsname.domainname, tmp, len); - system_utsname.domainname[len] = 0; + char *ptr = vx_new_uts(domainname); + + memcpy(ptr, tmp, len); + ptr[len] = 0; errno = 0; } up_write(&uts_sem); @@ -1509,7 +1585,7 @@ asmlinkage long sys_setrlimit(unsigned int resource, struct rlimit __user *rlim) old_rlim = current->rlim + resource; if (((new_rlim.rlim_cur > old_rlim->rlim_max) || (new_rlim.rlim_max > old_rlim->rlim_max)) && - !capable(CAP_SYS_RESOURCE)) + !capable(CAP_SYS_RESOURCE) && vx_ccaps(VXC_SET_RLIMIT)) return -EPERM; if (resource == RLIMIT_NOFILE) { if (new_rlim.rlim_cur > NR_OPEN || new_rlim.rlim_max > NR_OPEN) diff --git a/kernel/sysctl.c b/kernel/sysctl.c index 75f3c3db1..40b0d358c 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c @@ -100,6 +100,7 @@ extern char modprobe_path[]; #ifdef CONFIG_HOTPLUG extern char hotplug_path[]; #endif +extern char vshelper_path[]; #ifdef CONFIG_CHR_DEV_SG extern int sg_big_buff; #endif @@ -466,6 +467,15 @@ static ctl_table kern_table[] = { .strategy = &sysctl_string, }, #endif + { + .ctl_name = KERN_VSHELPER, + .procname = "vshelper", + .data = &vshelper_path, + .maxlen = 256, + .mode = 0644, + .proc_handler = &proc_dostring, + .strategy = &sysctl_string, + }, #ifdef CONFIG_CHR_DEV_SG { .ctl_name = KERN_SG_BIG_BUFF, diff --git a/kernel/timer.c b/kernel/timer.c index 3a8162b97..0e4b116a7 100644 --- a/kernel/timer.c +++ b/kernel/timer.c @@ -31,6 +31,8 @@ #include #include #include +#include +#include #include #include @@ -996,7 +998,7 @@ asmlinkage unsigned long sys_alarm(unsigned int seconds) */ asmlinkage long sys_getpid(void) { - return current->tgid; + return vx_map_tgid(current->vx_info, current->tgid); } /* @@ -1040,7 +1042,7 @@ asmlinkage long sys_getppid(void) #endif break; } - return pid; + return vx_map_tgid(current->vx_info, pid); } asmlinkage long sys_getuid(void) @@ -1249,6 +1251,8 @@ asmlinkage long sys_sysinfo(struct sysinfo __user *info) tp.tv_nsec = tp.tv_nsec - NSEC_PER_SEC; tp.tv_sec++; } + if (vx_flags(VXF_VIRT_UPTIME, 0)) + vx_vsi_uptime(&tp, NULL); val.uptime = tp.tv_sec + (tp.tv_nsec ? 1 : 0); val.loads[0] = avenrun[0] << (SI_LOAD_SHIFT - FSHIFT); @@ -1258,6 +1262,9 @@ asmlinkage long sys_sysinfo(struct sysinfo __user *info) val.procs = nr_threads; } while (read_seqretry(&xtime_lock, seq)); +/* if (vx_flags(VXF_VIRT_CPU, 0)) + vx_vsi_cpu(val); +*/ si_meminfo(&val); si_swapinfo(&val); diff --git a/kernel/user.c b/kernel/user.c index 60e942b8f..209a7d1fa 100644 --- a/kernel/user.c +++ b/kernel/user.c @@ -20,8 +20,8 @@ #define UIDHASH_BITS 8 #define UIDHASH_SZ (1 << UIDHASH_BITS) #define UIDHASH_MASK (UIDHASH_SZ - 1) -#define __uidhashfn(uid) (((uid >> UIDHASH_BITS) + uid) & UIDHASH_MASK) -#define uidhashentry(uid) (uidhash_table + __uidhashfn((uid))) +#define __uidhashfn(xid,uid) ((((uid) >> UIDHASH_BITS) + ((uid)^(xid))) & UIDHASH_MASK) +#define uidhashentry(xid,uid) (uidhash_table + __uidhashfn((xid),(uid))) static kmem_cache_t *uid_cachep; static struct list_head uidhash_table[UIDHASH_SZ]; @@ -46,7 +46,7 @@ static inline void uid_hash_remove(struct user_struct *up) list_del(&up->uidhash_list); } -static inline struct user_struct *uid_hash_find(uid_t uid, struct list_head *hashent) +static inline struct user_struct *uid_hash_find(xid_t xid, uid_t uid, struct list_head *hashent) { struct list_head *up; @@ -55,7 +55,7 @@ static inline struct user_struct *uid_hash_find(uid_t uid, struct list_head *has user = list_entry(up, struct user_struct, uidhash_list); - if(user->uid == uid) { + if(user->uid == uid && user->xid == xid) { atomic_inc(&user->__count); return user; } @@ -70,12 +70,12 @@ static inline struct user_struct *uid_hash_find(uid_t uid, struct list_head *has * * If the user_struct could not be found, return NULL. */ -struct user_struct *find_user(uid_t uid) +struct user_struct *find_user(xid_t xid, uid_t uid) { struct user_struct *ret; spin_lock(&uidhash_lock); - ret = uid_hash_find(uid, uidhashentry(uid)); + ret = uid_hash_find(xid, uid, uidhashentry(xid, uid)); spin_unlock(&uidhash_lock); return ret; } @@ -89,13 +89,13 @@ void free_uid(struct user_struct *up) } } -struct user_struct * alloc_uid(uid_t uid) +struct user_struct * alloc_uid(xid_t xid, uid_t uid) { - struct list_head *hashent = uidhashentry(uid); + struct list_head *hashent = uidhashentry(xid, uid); struct user_struct *up; spin_lock(&uidhash_lock); - up = uid_hash_find(uid, hashent); + up = uid_hash_find(xid, uid, hashent); spin_unlock(&uidhash_lock); if (!up) { @@ -105,6 +105,7 @@ struct user_struct * alloc_uid(uid_t uid) if (!new) return NULL; new->uid = uid; + new->xid = xid; atomic_set(&new->__count, 1); atomic_set(&new->processes, 0); atomic_set(&new->files, 0); @@ -114,7 +115,7 @@ struct user_struct * alloc_uid(uid_t uid) * on adding the same user already.. */ spin_lock(&uidhash_lock); - up = uid_hash_find(uid, hashent); + up = uid_hash_find(xid, uid, hashent); if (up) { kmem_cache_free(uid_cachep, new); } else { @@ -156,7 +157,7 @@ static int __init uid_cache_init(void) /* Insert the root user immediately (init already runs as root) */ spin_lock(&uidhash_lock); - uid_hash_insert(&root_user, uidhashentry(0)); + uid_hash_insert(&root_user, uidhashentry(0,0)); spin_unlock(&uidhash_lock); return 0; diff --git a/mm/fremap.c b/mm/fremap.c index 8eefa7a6b..6c38dc8f7 100644 --- a/mm/fremap.c +++ b/mm/fremap.c @@ -38,7 +38,8 @@ static inline void zap_pte(struct mm_struct *mm, struct vm_area_struct *vma, set_page_dirty(page); page_remove_rmap(page); page_cache_release(page); - mm->rss--; + // mm->rss--; + vx_rsspages_dec(mm); } } } else { @@ -64,6 +65,9 @@ int install_page(struct mm_struct *mm, struct vm_area_struct *vma, pgd = pgd_offset(mm, addr); spin_lock(&mm->page_table_lock); + if (!vx_rsspages_avail(mm, 1)) + goto err_unlock; + pmd = pmd_alloc(mm, pgd, addr); if (!pmd) goto err_unlock; @@ -74,7 +78,8 @@ int install_page(struct mm_struct *mm, struct vm_area_struct *vma, zap_pte(mm, vma, addr, pte); - mm->rss++; + // mm->rss++; + vx_rsspages_inc(mm); flush_icache_page(vma, page); set_pte(pte, mk_pte(page, prot)); page_add_file_rmap(page); diff --git a/mm/memory.c b/mm/memory.c index 4e9684aba..19e49a572 100644 --- a/mm/memory.c +++ b/mm/memory.c @@ -279,6 +279,10 @@ skip_copy_pte_range: struct page *page; unsigned long pfn; + if (!vx_rsspages_avail(dst, 1)) { + spin_unlock(&src->page_table_lock); + goto nomem; + } /* copy_one_pte */ if (pte_none(pte)) @@ -322,7 +326,8 @@ skip_copy_pte_range: pte = pte_mkclean(pte); pte = pte_mkold(pte); get_page(page); - dst->rss++; + // dst->rss++; + vx_rsspages_inc(dst); set_pte(dst_pte, pte); page_dup_rmap(page); cont_copy_pte_range_noset: @@ -1092,7 +1097,8 @@ static int do_wp_page(struct mm_struct *mm, struct vm_area_struct * vma, page_table = pte_offset_map(pmd, address); if (likely(pte_same(*page_table, pte))) { if (PageReserved(old_page)) - ++mm->rss; + // ++mm->rss; + vx_rsspages_inc(mm); else page_remove_rmap(old_page); break_cow(vma, new_page, address, page_table); @@ -1341,6 +1347,10 @@ static int do_swap_page(struct mm_struct * mm, inc_page_state(pgmajfault); } + if (!vx_rsspages_avail(mm, 1)) { + ret = VM_FAULT_OOM; + goto out; + } mark_page_accessed(page); lock_page(page); @@ -1365,7 +1375,8 @@ static int do_swap_page(struct mm_struct * mm, if (vm_swap_full()) remove_exclusive_swap_page(page); - mm->rss++; + // mm->rss++; + vx_rsspages_inc(mm); pte = mk_pte(page, vma->vm_page_prot); if (write_access && can_share_swap_page(page)) { pte = maybe_mkwrite(pte_mkdirty(pte), vma); @@ -1405,6 +1416,11 @@ do_anonymous_page(struct mm_struct *mm, struct vm_area_struct *vma, pte_t entry; struct page * page = ZERO_PAGE(addr); + if (!vx_rsspages_avail(mm, 1)) { + spin_unlock(&mm->page_table_lock); + return VM_FAULT_OOM; + } + /* Read-only mapping of ZERO_PAGE. */ entry = pte_wrprotect(mk_pte(ZERO_PAGE(addr), vma->vm_page_prot)); @@ -1430,7 +1446,8 @@ do_anonymous_page(struct mm_struct *mm, struct vm_area_struct *vma, spin_unlock(&mm->page_table_lock); goto out; } - mm->rss++; + // mm->rss++; + vx_rsspages_inc(mm); entry = maybe_mkwrite(pte_mkdirty(mk_pte(page, vma->vm_page_prot)), vma); @@ -1493,6 +1510,8 @@ retry: return VM_FAULT_SIGBUS; if (new_page == NOPAGE_OOM) return VM_FAULT_OOM; + if (!vx_rsspages_avail(mm, 1)) + return VM_FAULT_OOM; /* * Should we do an early C-O-W break? @@ -1539,7 +1558,8 @@ retry: /* Only go through if we didn't race with anybody else... */ if (pte_none(*page_table)) { if (!PageReserved(new_page)) - ++mm->rss; + // ++mm->rss; + vx_rsspages_inc(mm); flush_icache_page(vma, new_page); entry = mk_pte(new_page, vma->vm_page_prot); if (write_access) diff --git a/mm/mlock.c b/mm/mlock.c index a9e37161d..b896132c6 100644 --- a/mm/mlock.c +++ b/mm/mlock.c @@ -103,7 +103,7 @@ static int do_mlock(unsigned long start, size_t len, int on) asmlinkage long sys_mlock(unsigned long start, size_t len) { - unsigned long locked; + unsigned long locked, grow; unsigned long lock_limit; int error = -ENOMEM; @@ -111,8 +111,10 @@ asmlinkage long sys_mlock(unsigned long start, size_t len) len = PAGE_ALIGN(len + (start & ~PAGE_MASK)); start &= PAGE_MASK; - locked = len >> PAGE_SHIFT; - locked += current->mm->locked_vm; + grow = len >> PAGE_SHIFT; + if (!vx_vmlocked_avail(current->mm, grow)) + goto out; + locked = current->mm->locked_vm + grow; lock_limit = current->rlim[RLIMIT_MEMLOCK].rlim_cur; lock_limit >>= PAGE_SHIFT; @@ -120,6 +122,7 @@ asmlinkage long sys_mlock(unsigned long start, size_t len) /* check against resource limits */ if (locked <= lock_limit) error = do_mlock(start, len, 1); +out: up_write(¤t->mm->mmap_sem); return error; } @@ -177,6 +180,9 @@ asmlinkage long sys_mlockall(int flags) lock_limit >>= PAGE_SHIFT; ret = -ENOMEM; + if (!vx_vmlocked_avail(current->mm, current->mm->total_vm)) + goto out; + /* check vserver lock limits? */ if (current->mm->total_vm <= lock_limit) ret = do_mlockall(flags); out: diff --git a/mm/mmap.c b/mm/mmap.c index d6005880b..7e4c2a822 100644 --- a/mm/mmap.c +++ b/mm/mmap.c @@ -853,6 +853,10 @@ munmap_back: > current->rlim[RLIMIT_AS].rlim_cur) return -ENOMEM; + /* check context space, maybe only Private writable mapping? */ + if (!vx_vmpages_avail(mm, len >> PAGE_SHIFT)) + return -ENOMEM; + if (accountable && (!(flags & MAP_NORESERVE) || sysctl_overcommit_memory > 1)) { if (vm_flags & VM_SHARED) { @@ -949,9 +953,11 @@ munmap_back: kmem_cache_free(vm_area_cachep, vma); } out: - mm->total_vm += len >> PAGE_SHIFT; + // mm->total_vm += len >> PAGE_SHIFT; + vx_vmpages_add(mm, len >> PAGE_SHIFT); if (vm_flags & VM_LOCKED) { - mm->locked_vm += len >> PAGE_SHIFT; + // mm->locked_vm += len >> PAGE_SHIFT; + vx_vmlocked_add(mm, len >> PAGE_SHIFT); make_pages_present(addr, addr + len); } if (flags & MAP_POPULATE) { @@ -1191,7 +1197,8 @@ int expand_stack(struct vm_area_struct * vma, unsigned long address) grow = (address - vma->vm_end) >> PAGE_SHIFT; /* Overcommit.. */ - if (security_vm_enough_memory(grow)) { + if (security_vm_enough_memory(grow) || + !vx_vmpages_avail(vma->vm_mm, grow)) { anon_vma_unlock(vma); return -ENOMEM; } @@ -1203,10 +1210,13 @@ int expand_stack(struct vm_area_struct * vma, unsigned long address) vm_unacct_memory(grow); return -ENOMEM; } + vma->vm_end = address; - vma->vm_mm->total_vm += grow; + // vma->vm_mm->total_vm += grow; + vx_vmpages_add(vma->vm_mm, grow); if (vma->vm_flags & VM_LOCKED) - vma->vm_mm->locked_vm += grow; + // vma->vm_mm->locked_vm += grow; + vx_vmlocked_add(vma->vm_mm, grow); anon_vma_unlock(vma); return 0; } @@ -1252,7 +1262,8 @@ int expand_stack(struct vm_area_struct *vma, unsigned long address) grow = (vma->vm_start - address) >> PAGE_SHIFT; /* Overcommit.. */ - if (security_vm_enough_memory(grow)) { + if (security_vm_enough_memory(grow) || + !vx_vmpages_avail(vma->vm_mm, grow)) { anon_vma_unlock(vma); return -ENOMEM; } @@ -1264,11 +1275,14 @@ int expand_stack(struct vm_area_struct *vma, unsigned long address) vm_unacct_memory(grow); return -ENOMEM; } + vma->vm_start = address; vma->vm_pgoff -= grow; - vma->vm_mm->total_vm += grow; + // vma->vm_mm->total_vm += grow; + vx_vmpages_add(vma->vm_mm, grow); if (vma->vm_flags & VM_LOCKED) - vma->vm_mm->locked_vm += grow; + // vma->vm_mm->locked_vm += grow; + vx_vmlocked_add(vma->vm_mm, grow); anon_vma_unlock(vma); return 0; } @@ -1371,9 +1385,12 @@ static void unmap_vma(struct mm_struct *mm, struct vm_area_struct *area) { size_t len = area->vm_end - area->vm_start; - area->vm_mm->total_vm -= len >> PAGE_SHIFT; + // area->vm_mm->total_vm -= len >> PAGE_SHIFT; + vx_vmpages_sub(area->vm_mm, len >> PAGE_SHIFT); + if (area->vm_flags & VM_LOCKED) - area->vm_mm->locked_vm -= len >> PAGE_SHIFT; + // area->vm_mm->locked_vm -= len >> PAGE_SHIFT; + vx_vmlocked_sub(area->vm_mm, len >> PAGE_SHIFT); /* * Is this a new hole at the lowest possible address? */ @@ -1623,6 +1640,7 @@ unsigned long do_brk(unsigned long addr, unsigned long len) locked += len; if (locked > current->rlim[RLIMIT_MEMLOCK].rlim_cur) return -EAGAIN; + /* vserver checks ? */ } /* @@ -1644,7 +1662,8 @@ unsigned long do_brk(unsigned long addr, unsigned long len) if (mm->map_count > sysctl_max_map_count) return -ENOMEM; - if (security_vm_enough_memory(len >> PAGE_SHIFT)) + if (security_vm_enough_memory(len >> PAGE_SHIFT) || + !vx_vmpages_avail(mm, len >> PAGE_SHIFT)) return -ENOMEM; flags = VM_DATA_DEFAULT_FLAGS | VM_ACCOUNT | mm->def_flags; @@ -1672,9 +1691,11 @@ unsigned long do_brk(unsigned long addr, unsigned long len) vma->vm_page_prot = protection_map[flags & 0x0f]; vma_link(mm, vma, prev, rb_link, rb_parent); out: - mm->total_vm += len >> PAGE_SHIFT; + // mm->total_vm += len >> PAGE_SHIFT; + vx_vmpages_add(mm, len >> PAGE_SHIFT); if (flags & VM_LOCKED) { - mm->locked_vm += len >> PAGE_SHIFT; + // mm->locked_vm += len >> PAGE_SHIFT; + vx_vmlocked_add(mm, len >> PAGE_SHIFT); make_pages_present(addr, addr + len); } return addr; @@ -1708,9 +1729,12 @@ void exit_mmap(struct mm_struct *mm) vma = mm->mmap; mm->mmap = mm->mmap_cache = NULL; mm->mm_rb = RB_ROOT; - mm->rss = 0; - mm->total_vm = 0; - mm->locked_vm = 0; + // mm->rss = 0; + vx_rsspages_sub(mm, mm->rss); + // mm->total_vm = 0; + vx_vmpages_sub(mm, mm->total_vm); + // mm->locked_vm = 0; + vx_vmlocked_sub(mm, mm->locked_vm); arch_flush_exec_range(mm); spin_unlock(&mm->page_table_lock); diff --git a/mm/mremap.c b/mm/mremap.c index 329190677..ca4ea79d8 100644 --- a/mm/mremap.c +++ b/mm/mremap.c @@ -224,9 +224,11 @@ static unsigned long move_vma(struct vm_area_struct *vma, vma->vm_next->vm_flags |= VM_ACCOUNT; } - mm->total_vm += new_len >> PAGE_SHIFT; + // mm->total_vm += new_len >> PAGE_SHIFT; + vx_vmpages_add(mm, new_len >> PAGE_SHIFT); if (vm_flags & VM_LOCKED) { - mm->locked_vm += new_len >> PAGE_SHIFT; + // mm->locked_vm += new_len >> PAGE_SHIFT; + vx_vmlocked_add(mm, new_len >> PAGE_SHIFT); if (new_len > old_len) make_pages_present(new_addr + old_len, new_addr + new_len); @@ -335,6 +337,9 @@ unsigned long do_mremap(unsigned long addr, if ((current->mm->total_vm << PAGE_SHIFT) + (new_len - old_len) > current->rlim[RLIMIT_AS].rlim_cur) goto out; + /* check context space, maybe only Private writable mapping? */ + if (!vx_vmpages_avail(current->mm, (new_len - old_len) >> PAGE_SHIFT)) + goto out; if (vma->vm_flags & VM_ACCOUNT) { charged = (new_len - old_len) >> PAGE_SHIFT; @@ -358,9 +363,11 @@ unsigned long do_mremap(unsigned long addr, vma_adjust(vma, vma->vm_start, addr + new_len, vma->vm_pgoff, NULL); - current->mm->total_vm += pages; + // current->mm->total_vm += pages; + vx_vmpages_add(current->mm, pages); if (vma->vm_flags & VM_LOCKED) { - current->mm->locked_vm += pages; + // current->mm->locked_vm += pages; + vx_vmlocked_add(current->mm, pages); make_pages_present(addr + old_len, addr + new_len); } diff --git a/mm/oom_kill.c b/mm/oom_kill.c index ed0cee4e6..2f1529049 100644 --- a/mm/oom_kill.c +++ b/mm/oom_kill.c @@ -54,6 +54,7 @@ static int badness(struct task_struct *p) * The memory size of the process is the basis for the badness. */ points = p->mm->total_vm; + /* add vserver badness ;) */ /* * CPU time is in seconds and run time is in minutes. There is no diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 5769a391d..04468cc92 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -1017,6 +1017,8 @@ void si_meminfo(struct sysinfo *val) val->freehigh = 0; #endif val->mem_unit = PAGE_SIZE; + if (vx_flags(VXF_VIRT_MEM, 0)) + vx_vsi_meminfo(val); } EXPORT_SYMBOL(si_meminfo); diff --git a/mm/rmap.c b/mm/rmap.c index 871e76b9c..da85d34f4 100644 --- a/mm/rmap.c +++ b/mm/rmap.c @@ -505,7 +505,8 @@ static int try_to_unmap_one(struct page *page, struct vm_area_struct *vma) BUG_ON(pte_file(*pte)); } - mm->rss--; + // mm->rss--; + vx_rsspages_dec(mm); BUG_ON(!page->mapcount); page->mapcount--; page_cache_release(page); diff --git a/mm/swapfile.c b/mm/swapfile.c index 2eabfd19a..fc9b47d83 100644 --- a/mm/swapfile.c +++ b/mm/swapfile.c @@ -430,7 +430,8 @@ static void unuse_pte(struct vm_area_struct *vma, unsigned long address, pte_t *dir, swp_entry_t entry, struct page *page) { - vma->vm_mm->rss++; + // vma->vm_mm->rss++; + vx_rsspages_inc(vma->vm_mm); get_page(page); set_pte(dir, pte_mkold(mk_pte(page, vma->vm_page_prot))); page_add_anon_rmap(page, vma, address); @@ -1573,6 +1574,8 @@ void si_swapinfo(struct sysinfo *val) val->freeswap = nr_swap_pages + nr_to_be_unused; val->totalswap = total_swap_pages + nr_to_be_unused; swap_list_unlock(); + if (vx_flags(VXF_VIRT_MEM, 0)) + vx_vsi_swapinfo(val); } /* diff --git a/net/core/dev.c b/net/core/dev.c index dfd505c1c..f0c0c9a95 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -1979,6 +1979,8 @@ static int dev_ifconf(char __user *arg) total = 0; for (dev = dev_base; dev; dev = dev->next) { + if (!dev_in_nx_info(dev, current->nx_info)) + continue; for (i = 0; i < NPROTO; i++) { if (gifconf_list[i]) { int done; @@ -2039,6 +2041,10 @@ void dev_seq_stop(struct seq_file *seq, void *v) static void dev_seq_printf_stats(struct seq_file *seq, struct net_device *dev) { + struct nx_info *nxi = current->nx_info; + + if (!dev_in_nx_info(dev, nxi)) + return; if (dev->get_stats) { struct net_device_stats *stats = dev->get_stats(dev); diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index 26e3577c0..f577cba67 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c @@ -224,6 +224,8 @@ int rtnetlink_dump_ifinfo(struct sk_buff *skb, struct netlink_callback *cb) for (dev=dev_base, idx=0; dev; dev = dev->next, idx++) { if (idx < s_idx) continue; + if (!dev_in_nx_info(dev, current->nx_info)) + continue; if (rtnetlink_fill_ifinfo(skb, dev, RTM_NEWLINK, NETLINK_CB(cb->skb).pid, cb->nlh->nlmsg_seq, 0) <= 0) break; } @@ -309,6 +311,8 @@ void rtmsg_ifinfo(int type, struct net_device *dev, unsigned change) struct sk_buff *skb; int size = NLMSG_GOODSIZE; + if (!dev_in_nx_info(dev, current->nx_info)) + return; skb = alloc_skb(size, GFP_KERNEL); if (!skb) return; diff --git a/net/core/sock.c b/net/core/sock.c index 8c433e763..78d318a96 100644 --- a/net/core/sock.c +++ b/net/core/sock.c @@ -323,7 +323,10 @@ int sock_setsockopt(struct socket *sock, int level, int optname, break; case SO_PASSCRED: - sock->passcred = valbool; + if (valbool) + set_bit(SOCK_PASS_CRED, &sock->flags); + else + clear_bit(SOCK_PASS_CRED, &sock->flags); break; case SO_TIMESTAMP: @@ -546,7 +549,7 @@ int sock_getsockopt(struct socket *sock, int level, int optname, break; case SO_PASSCRED: - v.val = sock->passcred; + v.val = test_bit(SOCK_PASS_CRED, &sock->flags)?1:0; break; case SO_PEERCRED: @@ -621,6 +624,8 @@ struct sock *sk_alloc(int family, int priority, int zero_it, kmem_cache_t *slab) sock_lock_init(sk); } sk->sk_slab = slab; + sock_vx_init(sk); + sock_nx_init(sk); if (security_sk_alloc(sk, family, priority)) { kmem_cache_free(slab, sk); @@ -651,6 +656,10 @@ void sk_free(struct sock *sk) __FUNCTION__, atomic_read(&sk->sk_omem_alloc)); security_sk_free(sk); + BUG_ON(sk->sk_vx_info); + BUG_ON(sk->sk_nx_info); +/* clr_vx_info(&sk->sk_vx_info); + clr_nx_info(&sk->sk_nx_info); */ kmem_cache_free(sk->sk_slab, sk); module_put(owner); } @@ -1142,6 +1151,11 @@ void sock_init_data(struct socket *sock, struct sock *sk) sk->sk_stamp.tv_sec = -1L; sk->sk_stamp.tv_usec = -1L; + sk->sk_vx_info = NULL; + sk->sk_xid = 0; + sk->sk_nx_info = NULL; + sk->sk_nid = 0; + atomic_set(&sk->sk_refcnt, 1); } diff --git a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c index db0931a9a..8d450fb04 100644 --- a/net/ipv4/af_inet.c +++ b/net/ipv4/af_inet.c @@ -158,6 +158,9 @@ void inet_sock_destruct(struct sock *sk) if (inet->opt) kfree(inet->opt); + + BUG_ON(sk->sk_nx_info); + BUG_ON(sk->sk_vx_info); dst_release(sk->sk_dst_cache); #ifdef INET_REFCNT_DEBUG atomic_dec(&inet_sock_nr); @@ -397,6 +400,11 @@ static int inet_create(struct socket *sock, int protocol) sk->sk_family = PF_INET; sk->sk_protocol = protocol; sk->sk_backlog_rcv = sk->sk_prot->backlog_rcv; + + set_vx_info(&sk->sk_vx_info, current->vx_info); + sk->sk_xid = vx_current_xid(); + set_nx_info(&sk->sk_nx_info, current->nx_info); + sk->sk_nid = nx_current_nid(); inet->uc_ttl = -1; inet->mc_loop = 1; @@ -421,8 +429,13 @@ static int inet_create(struct socket *sock, int protocol) if (sk->sk_prot->init) { err = sk->sk_prot->init(sk); - if (err) - inet_sock_release(sk); + if (err) { +/* sk->sk_vx_info = NULL; + put_vx_info(current->vx_info); + sk->sk_nx_info = NULL; + put_nx_info(current->nx_info); +*/ inet_sock_release(sk); + } } out: return err; @@ -460,6 +473,8 @@ int inet_release(struct socket *sock) !(current->flags & PF_EXITING)) timeout = sk->sk_lingertime; sock->sk = NULL; + clr_vx_info(&sk->sk_vx_info); + clr_nx_info(&sk->sk_nx_info); sk->sk_prot->close(sk, timeout); } return 0; @@ -476,6 +491,10 @@ int inet_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len) unsigned short snum; int chk_addr_ret; int err; + __u32 s_addr; /* Address used for validation */ + __u32 s_addr1; + __u32 s_addr2 = 0xffffffffl; /* Optional address of the socket */ + struct nx_info *nxi = sk->sk_nx_info; /* If the socket has its own bind function then use it. (RAW) */ if (sk->sk_prot->bind) { @@ -486,7 +505,36 @@ int inet_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len) if (addr_len < sizeof(struct sockaddr_in)) goto out; - chk_addr_ret = inet_addr_type(addr->sin_addr.s_addr); + s_addr = s_addr1 = addr->sin_addr.s_addr; + nxdprintk("inet_bind(%p) %p,%p;%lx\n", + sk, nx_info, sk->sk_socket, + (sk->sk_socket?sk->sk_socket->flags:0)); + if (nxi) { + __u32 v4_bcast = nxi->v4_bcast; + __u32 ipv4root = nxi->ipv4[0]; + int nbipv4 = nxi->nbipv4; + if (s_addr == 0) { + s_addr = ipv4root; + if (nbipv4 > 1) + s_addr1 = 0; + else { + s_addr1 = ipv4root; + } + s_addr2 = v4_bcast; + } else if (s_addr == 0x0100007f) { + s_addr = s_addr1 = ipv4root; + } else if (s_addr != v4_bcast) { + int i; + for (i=0; iipv4[i]) + break; + } + if (i == nbipv4) { + return -EADDRNOTAVAIL; + } + } + } + chk_addr_ret = inet_addr_type(s_addr); /* Not specified by any standard per-se, however it breaks too * many applications when removed. It is unfortunate since @@ -498,7 +546,7 @@ int inet_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len) err = -EADDRNOTAVAIL; if (!sysctl_ip_nonlocal_bind && !inet->freebind && - addr->sin_addr.s_addr != INADDR_ANY && + s_addr != INADDR_ANY && chk_addr_ret != RTN_LOCAL && chk_addr_ret != RTN_MULTICAST && chk_addr_ret != RTN_BROADCAST) @@ -523,7 +571,8 @@ int inet_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len) if (sk->sk_state != TCP_CLOSE || inet->num) goto out_release_sock; - inet->rcv_saddr = inet->saddr = addr->sin_addr.s_addr; + inet->rcv_saddr = inet->saddr = s_addr1; + inet->rcv_saddr2 = s_addr2; if (chk_addr_ret == RTN_MULTICAST || chk_addr_ret == RTN_BROADCAST) inet->saddr = 0; /* Use device */ diff --git a/net/ipv4/devinet.c b/net/ipv4/devinet.c index 6e16cc55b..37581ba5b 100644 --- a/net/ipv4/devinet.c +++ b/net/ipv4/devinet.c @@ -488,6 +488,33 @@ static __inline__ int inet_abc_len(u32 addr) return rc; } +/* + Check that a device is not member of the ipv4root assigned to the process + Return true if this is the case + + If the process is not bound to specific IP, then it returns 0 (all + interface are fine). +*/ +static inline int devinet_notiproot (struct in_ifaddr *ifa) +{ + int ret = 0; + struct nx_info *nxi; + + if ((nxi = current->nx_info)) { + int i; + int nbip = nxi->nbipv4; + __u32 addr = ifa->ifa_local; + ret = 1; + for (i=0; iipv4[i] == addr) { + ret = 0; + break; + } + } + } + return ret; +} + int devinet_ioctl(unsigned int cmd, void __user *arg) { @@ -595,6 +622,8 @@ int devinet_ioctl(unsigned int cmd, void __user *arg) ret = -EADDRNOTAVAIL; if (!ifa && cmd != SIOCSIFADDR && cmd != SIOCSIFFLAGS) goto done; + if (!ifa_in_nx_info(ifa, current->nx_info)) + goto done; switch(cmd) { case SIOCGIFADDR: /* Get interface address */ @@ -724,6 +753,8 @@ static int inet_gifconf(struct net_device *dev, char __user *buf, int len) goto out; for (; ifa; ifa = ifa->ifa_next) { + if (!ifa_in_nx_info(ifa, current->nx_info)) + continue; if (!buf) { done += sizeof(ifr); continue; @@ -1059,6 +1090,8 @@ static int inet_dump_ifaddr(struct sk_buff *skb, struct netlink_callback *cb) read_lock(&in_dev->lock); for (ifa = in_dev->ifa_list, ip_idx = 0; ifa; ifa = ifa->ifa_next, ip_idx++) { + if (!ifa_in_nx_info(ifa, current->nx_info)) + continue; if (ip_idx < s_ip_idx) continue; if (inet_fill_ifaddr(skb, ifa, NETLINK_CB(cb->skb).pid, diff --git a/net/ipv4/fib_hash.c b/net/ipv4/fib_hash.c index 2316dfa91..3b4f8e35e 100644 --- a/net/ipv4/fib_hash.c +++ b/net/ipv4/fib_hash.c @@ -1010,6 +1010,8 @@ static unsigned fib_flag_trans(int type, int dead, u32 mask, struct fib_info *fi return flags; } +extern int dev_in_nx_info(struct net_device *, struct nx_info *); + /* * This outputs /proc/net/route. * @@ -1039,7 +1041,7 @@ static int fib_seq_show(struct seq_file *seq, void *v) mask = FZ_MASK(iter->zone); flags = fib_flag_trans(f->fn_type, f->fn_state & FN_S_ZOMBIE, mask, fi); - if (fi) + if (fi && dev_in_nx_info(fi->fib_dev, current->nx_info)) snprintf(bf, sizeof(bf), "%s\t%08X\t%08X\t%04X\t%d\t%u\t%d\t%08X\t%d\t%u\t%u", fi->fib_dev ? fi->fib_dev->name : "*", prefix, diff --git a/net/ipv4/raw.c b/net/ipv4/raw.c index 755d53aae..9cba88457 100644 --- a/net/ipv4/raw.c +++ b/net/ipv4/raw.c @@ -102,6 +102,38 @@ static void raw_v4_unhash(struct sock *sk) write_unlock_bh(&raw_v4_lock); } + +/* + Check if an address is in the list +*/ +static inline int raw_addr_in_list ( + u32 rcv_saddr1, + u32 rcv_saddr2, + u32 loc_addr, + struct nx_info *nx_info) +{ + int ret = 0; + if (loc_addr != 0 && + (rcv_saddr1 == loc_addr || rcv_saddr2 == loc_addr)) + ret = 1; + else if (rcv_saddr1 == 0) { + /* Accept any address or only the one in the list */ + if (nx_info == NULL) + ret = 1; + else { + int n = nx_info->nbipv4; + int i; + for (i=0; iipv4[i] == loc_addr) { + ret = 1; + break; + } + } + } + } + return ret; +} + struct sock *__raw_v4_lookup(struct sock *sk, unsigned short num, unsigned long raddr, unsigned long laddr, int dif) @@ -113,7 +145,8 @@ struct sock *__raw_v4_lookup(struct sock *sk, unsigned short num, if (inet->num == num && !(inet->daddr && inet->daddr != raddr) && - !(inet->rcv_saddr && inet->rcv_saddr != laddr) && + raw_addr_in_list(inet->rcv_saddr, inet->rcv_saddr2, + laddr, sk->sk_nx_info) && !(sk->sk_bound_dev_if && sk->sk_bound_dev_if != dif)) goto found; /* gotcha */ } @@ -687,7 +720,8 @@ static struct sock *raw_get_first(struct seq_file *seq) struct hlist_node *node; sk_for_each(sk, node, &raw_v4_htable[state->bucket]) - if (sk->sk_family == PF_INET) + if (sk->sk_family == PF_INET && + vx_check(sk->sk_xid, VX_WATCH|VX_IDENT)) goto found; } sk = NULL; @@ -703,7 +737,8 @@ static struct sock *raw_get_next(struct seq_file *seq, struct sock *sk) sk = sk_next(sk); try_again: ; - } while (sk && sk->sk_family != PF_INET); + } while (sk && (sk->sk_family != PF_INET || + !vx_check(sk->sk_xid, VX_WATCH|VX_IDENT))); if (!sk && ++state->bucket < RAWV4_HTABLE_SIZE) { sk = sk_head(&raw_v4_htable[state->bucket]); diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c index 87b73c85f..dd6d462a5 100644 --- a/net/ipv4/tcp_ipv4.c +++ b/net/ipv4/tcp_ipv4.c @@ -179,9 +179,63 @@ void tcp_bind_hash(struct sock *sk, struct tcp_bind_bucket *tb, tcp_sk(sk)->bind_hash = tb; } +/* + Return 1 if addr match the socket IP list + or the socket is INADDR_ANY +*/ +static inline int tcp_in_list(struct sock *sk, u32 addr) +{ + struct nx_info *nxi = sk->sk_nx_info; + + vxdprintk("tcp_in_list(%p) %p,%p;%lx\n", + sk, nxi, sk->sk_socket, + (sk->sk_socket?sk->sk_socket->flags:0)); + + if (nxi) { + int n = nxi->nbipv4; + int i; + + for (i=0; iipv4[i] == addr) + return 1; + } + else if (!tcp_v4_rcv_saddr(sk) || tcp_v4_rcv_saddr(sk) == addr) + return 1; + return 0; +} + +/* + Check if the addresses in sk1 conflict with those in sk2 +*/ +int tcp_ipv4_addr_conflict(struct sock *sk1, struct sock *sk2) +{ + if (sk1 && sk2) + nxdprintk("inet_bind(%p,%p) %p,%p;%lx %p,%p;%lx\n", + sk1, sk2, + sk1->sk_nx_info, sk1->sk_socket, + (sk1->sk_socket?sk1->sk_socket->flags:0), + sk2->sk_nx_info, sk2->sk_socket, + (sk2->sk_socket?sk2->sk_socket->flags:0)); + + if (tcp_v4_rcv_saddr(sk1)) { + /* Bind to one address only */ + return tcp_in_list (sk2, tcp_v4_rcv_saddr(sk1)); + } else if (sk1->sk_nx_info) { + /* A restricted bind(any) */ + struct nx_info *nxi = sk1->sk_nx_info; + int n = nxi->nbipv4; + int i; + + for (i=0; iipv4[i])) + return 1; + } else /* A bind(any) do not allow other bind on the same port */ + return 1; + return 0; +} + static inline int tcp_bind_conflict(struct sock *sk, struct tcp_bind_bucket *tb) { - const u32 sk_rcv_saddr = tcp_v4_rcv_saddr(sk); struct sock *sk2; struct hlist_node *node; int reuse = sk->sk_reuse; @@ -194,9 +248,7 @@ static inline int tcp_bind_conflict(struct sock *sk, struct tcp_bind_bucket *tb) sk->sk_bound_dev_if == sk2->sk_bound_dev_if)) { if (!reuse || !sk2->sk_reuse || sk2->sk_state == TCP_LISTEN) { - const u32 sk2_rcv_saddr = tcp_v4_rcv_saddr(sk2); - if (!sk2_rcv_saddr || !sk_rcv_saddr || - sk2_rcv_saddr == sk_rcv_saddr) + if (tcp_ipv4_addr_conflict(sk, sk2)) break; } } @@ -405,6 +457,34 @@ void tcp_unhash(struct sock *sk) wake_up(&tcp_lhash_wait); } +/* + Check if an address is in the list +*/ +static inline int tcp_addr_in_list( + u32 rcv_saddr, + u32 daddr, + struct nx_info *nx_info) +{ + if (rcv_saddr == daddr) + return 1; + else if (rcv_saddr == 0) { + /* Accept any address or check the list */ + if (!nx_info) + return 1; + else { + int n = nx_info->nbipv4; + int i; + + for (i=0; iipv4[i] == daddr) + return 1; + } + } + return 0; +} + + + /* Don't inline this cruft. Here are some nice properties to * exploit here. The BSD API does not allow a listening TCP * to specify the remote port nor the remote address for the @@ -426,11 +506,10 @@ static struct sock *__tcp_v4_lookup_listener(struct hlist_head *head, u32 daddr, __u32 rcv_saddr = inet->rcv_saddr; score = (sk->sk_family == PF_INET ? 1 : 0); - if (rcv_saddr) { - if (rcv_saddr != daddr) - continue; + if (tcp_addr_in_list(rcv_saddr, daddr, sk->sk_nx_info)) score+=2; - } + else + continue; if (sk->sk_bound_dev_if) { if (sk->sk_bound_dev_if != dif) continue; @@ -460,8 +539,8 @@ inline struct sock *tcp_v4_lookup_listener(u32 daddr, unsigned short hnum, struct inet_opt *inet = inet_sk((sk = __sk_head(head))); if (inet->num == hnum && !sk->sk_node.next && - (!inet->rcv_saddr || inet->rcv_saddr == daddr) && (sk->sk_family == PF_INET || !ipv6_only_sock(sk)) && + tcp_addr_in_list(inet->rcv_saddr, daddr, sk->sk_nx_info) && !sk->sk_bound_dev_if) goto sherry_cache; sk = __tcp_v4_lookup_listener(head, daddr, hnum, dif); @@ -2159,6 +2238,8 @@ static void *listening_get_next(struct seq_file *seq, void *cur) req = req->dl_next; while (1) { while (req) { + if (!vx_check(req->sk->sk_xid, VX_IDENT|VX_WATCH)) + continue; if (req->class->family == st->family) { cur = req; goto out; @@ -2177,6 +2258,8 @@ get_req: sk = sk_next(sk); get_sk: sk_for_each_from(sk, node) { + if (!vx_check(sk->sk_xid, VX_IDENT|VX_WATCH)) + continue; if (sk->sk_family == st->family) { cur = sk; goto out; @@ -2224,18 +2307,20 @@ static void *established_get_first(struct seq_file *seq) read_lock(&tcp_ehash[st->bucket].lock); sk_for_each(sk, node, &tcp_ehash[st->bucket].chain) { - if (sk->sk_family != st->family) { + if (!vx_check(sk->sk_xid, VX_IDENT|VX_WATCH)) + continue; + if (sk->sk_family != st->family) continue; - } rc = sk; goto out; } st->state = TCP_SEQ_STATE_TIME_WAIT; tw_for_each(tw, node, &tcp_ehash[st->bucket + tcp_ehash_size].chain) { - if (tw->tw_family != st->family) { + if (!vx_check(tw->tw_xid, VX_IDENT|VX_WATCH)) + continue; + if (tw->tw_family != st->family) continue; - } rc = tw; goto out; } @@ -2259,7 +2344,8 @@ static void *established_get_next(struct seq_file *seq, void *cur) tw = cur; tw = tw_next(tw); get_tw: - while (tw && tw->tw_family != st->family) { + while (tw && tw->tw_family != st->family && + !vx_check(tw->tw_xid, VX_IDENT|VX_WATCH)) { tw = tw_next(tw); } if (tw) { @@ -2279,6 +2365,8 @@ get_tw: sk = sk_next(sk); sk_for_each_from(sk, node) { + if (!vx_check(sk->sk_xid, VX_IDENT|VX_WATCH)) + continue; if (sk->sk_family == st->family) goto found; } diff --git a/net/ipv4/tcp_minisocks.c b/net/ipv4/tcp_minisocks.c index 61c77cc3c..54f1c3351 100644 --- a/net/ipv4/tcp_minisocks.c +++ b/net/ipv4/tcp_minisocks.c @@ -362,6 +362,11 @@ void tcp_time_wait(struct sock *sk, int state, int timeo) tw->tw_ts_recent_stamp = tp->ts_recent_stamp; tw_dead_node_init(tw); + tw->tw_xid = sk->sk_xid; + tw->tw_vx_info = NULL; + tw->tw_nid = sk->sk_nid; + tw->tw_nx_info = NULL; + #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) if (tw->tw_family == PF_INET6) { struct ipv6_pinfo *np = inet6_sk(sk); @@ -697,6 +702,8 @@ struct sock *tcp_create_openreq_child(struct sock *sk, struct open_request *req, newsk->sk_state = TCP_SYN_RECV; /* SANITY */ + sock_vx_init(newsk); + sock_nx_init(newsk); sk_node_init(&newsk->sk_node); tcp_sk(newsk)->bind_hash = NULL; @@ -801,6 +808,10 @@ struct sock *tcp_create_openreq_child(struct sock *sk, struct open_request *req, newsk->sk_err = 0; newsk->sk_priority = 0; atomic_set(&newsk->sk_refcnt, 2); + + /* hmm, maybe from socket? */ + set_vx_info(&newsk->sk_vx_info, current->vx_info); + set_nx_info(&newsk->sk_nx_info, current->nx_info); #ifdef INET_REFCNT_DEBUG atomic_inc(&inet_sock_nr); #endif diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c index 900d7fd23..dec547c4b 100644 --- a/net/ipv4/udp.c +++ b/net/ipv4/udp.c @@ -120,6 +120,8 @@ rwlock_t udp_hash_lock = RW_LOCK_UNLOCKED; /* Shared by v4/v6 udp. */ int udp_port_rover; +int tcp_ipv4_addr_conflict(struct sock *sk1, struct sock *sk2); + static int udp_v4_get_port(struct sock *sk, unsigned short snum) { struct hlist_node *node; @@ -179,9 +181,7 @@ gotit: (!sk2->sk_bound_dev_if || !sk->sk_bound_dev_if || sk2->sk_bound_dev_if == sk->sk_bound_dev_if) && - (!inet2->rcv_saddr || - !inet->rcv_saddr || - inet2->rcv_saddr == inet->rcv_saddr) && + tcp_ipv4_addr_conflict(sk2, sk) && (!sk2->sk_reuse || !sk->sk_reuse)) goto fail; } @@ -216,6 +216,17 @@ static void udp_v4_unhash(struct sock *sk) write_unlock_bh(&udp_hash_lock); } +static inline int udp_in_list(struct nx_info *nx_info, u32 addr) +{ + int n = nx_info->nbipv4; + int i; + + for (i=0; iipv4[i] == addr) + return 1; + return 0; +} + /* UDP is nearly always wildcards out the wazoo, it makes no sense to try * harder than this. -DaveM */ @@ -235,6 +246,11 @@ struct sock *udp_v4_lookup_longway(u32 saddr, u16 sport, u32 daddr, u16 dport, i if (inet->rcv_saddr != daddr) continue; score+=2; + } else if (sk->sk_nx_info) { + if (udp_in_list(sk->sk_nx_info, daddr)) + score+=2; + else + continue; } if (inet->daddr) { if (inet->daddr != saddr) @@ -290,7 +306,8 @@ static inline struct sock *udp_v4_mcast_next(struct sock *sk, if (inet->num != hnum || (inet->daddr && inet->daddr != rmt_addr) || (inet->dport != rmt_port && inet->dport) || - (inet->rcv_saddr && inet->rcv_saddr != loc_addr) || + (inet->rcv_saddr && inet->rcv_saddr != loc_addr && + inet->rcv_saddr2 && inet->rcv_saddr2 != loc_addr) || ipv6_only_sock(s) || (s->sk_bound_dev_if && s->sk_bound_dev_if != dif)) continue; @@ -599,6 +616,15 @@ int udp_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, .uli_u = { .ports = { .sport = inet->sport, .dport = dport } } }; + struct nx_info *nxi = sk->sk_nx_info; + + if (nxi) { + err = ip_find_src(nxi, &rt, &fl); + if (err) + goto out; + if (daddr == IPI_LOOPBACK && !vx_check(0, VX_ADMIN)) + daddr = fl.fl4_dst = nxi->ipv4[0]; + } err = ip_route_output_flow(&rt, &fl, sk, !(msg->msg_flags&MSG_DONTWAIT)); if (err) goto out; @@ -1374,8 +1400,10 @@ static struct sock *udp_get_first(struct seq_file *seq) for (state->bucket = 0; state->bucket < UDP_HTABLE_SIZE; ++state->bucket) { struct hlist_node *node; + sk_for_each(sk, node, &udp_hash[state->bucket]) { - if (sk->sk_family == state->family) + if (sk->sk_family == state->family && + vx_check(sk->sk_xid, VX_WATCH|VX_IDENT)) goto found; } } @@ -1392,7 +1420,8 @@ static struct sock *udp_get_next(struct seq_file *seq, struct sock *sk) sk = sk_next(sk); try_again: ; - } while (sk && sk->sk_family != state->family); + } while (sk && (sk->sk_family != state->family || + !vx_check(sk->sk_xid, VX_WATCH|VX_IDENT))); if (!sk && ++state->bucket < UDP_HTABLE_SIZE) { sk = sk_head(&udp_hash[state->bucket]); diff --git a/net/socket.c b/net/socket.c index 3549ae8dc..e0cae444d 100644 --- a/net/socket.c +++ b/net/socket.c @@ -288,7 +288,7 @@ static struct inode *sock_alloc_inode(struct super_block *sb) ei->socket.ops = NULL; ei->socket.sk = NULL; ei->socket.file = NULL; - ei->socket.passcred = 0; + ei->socket.flags = 0; return &ei->vfs_inode; } @@ -543,7 +543,7 @@ static inline int __sock_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, size_t size) { struct sock_iocb *si = kiocb_to_siocb(iocb); - int err; + int err, len; si->sock = sock; si->scm = NULL; @@ -554,7 +554,20 @@ static inline int __sock_sendmsg(struct kiocb *iocb, struct socket *sock, if (err) return err; - return sock->ops->sendmsg(iocb, sock, msg, size); + len = sock->ops->sendmsg(iocb, sock, msg, size); + if (sock->sk) { + if (len == size) + vx_sock_send(sock->sk, size); + else + vx_sock_fail(sock->sk, size); + } + vxdprintk("__sock_sendmsg: %p[%p,%p,%p;%d]:%d/%d\n", + sock, sock->sk, + (sock->sk)?sock->sk->sk_nx_info:0, + (sock->sk)?sock->sk->sk_vx_info:0, + (sock->sk)?sock->sk->sk_xid:0, + size, len); + return len; } int sock_sendmsg(struct socket *sock, struct msghdr *msg, size_t size) @@ -573,7 +586,7 @@ int sock_sendmsg(struct socket *sock, struct msghdr *msg, size_t size) static inline int __sock_recvmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, size_t size, int flags) { - int err; + int err, len; struct sock_iocb *si = kiocb_to_siocb(iocb); si->sock = sock; @@ -586,7 +599,16 @@ static inline int __sock_recvmsg(struct kiocb *iocb, struct socket *sock, if (err) return err; - return sock->ops->recvmsg(iocb, sock, msg, size, flags); + len = sock->ops->recvmsg(iocb, sock, msg, size, flags); + if ((len >= 0) && sock->sk) + vx_sock_recv(sock->sk, len); + vxdprintk("__sock_recvmsg: %p[%p,%p,%p;%d]:%d/%d\n", + sock, sock->sk, + (sock->sk)?sock->sk->sk_nx_info:0, + (sock->sk)?sock->sk->sk_vx_info:0, + (sock->sk)?sock->sk->sk_xid:0, + size, len); + return len; } int sock_recvmsg(struct socket *sock, struct msghdr *msg, @@ -1036,6 +1058,10 @@ static int __sock_create(int family, int type, int protocol, struct socket **res if (type < 0 || type >= SOCK_MAX) return -EINVAL; + /* disable IPv6 inside vservers for now */ + if (family == PF_INET6 && !vx_check(0, VX_ADMIN)) + return -EAFNOSUPPORT; + /* Compatibility. This uglymoron is moved from INET layer to here to avoid @@ -1144,6 +1170,7 @@ asmlinkage long sys_socket(int family, int type, int protocol) if (retval < 0) goto out; + set_bit(SOCK_USER_SOCKET, &sock->flags); retval = sock_map_fd(sock); if (retval < 0) goto out_release; @@ -1174,10 +1201,12 @@ asmlinkage long sys_socketpair(int family, int type, int protocol, int __user *u err = sock_create(family, type, protocol, &sock1); if (err < 0) goto out; + set_bit(SOCK_USER_SOCKET, &sock1->flags); err = sock_create(family, type, protocol, &sock2); if (err < 0) goto out_release_1; + set_bit(SOCK_USER_SOCKET, &sock2->flags); err = sock1->ops->socketpair(sock1, sock2); if (err < 0) diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c index e19475e6a..349343927 100644 --- a/net/unix/af_unix.c +++ b/net/unix/af_unix.c @@ -405,6 +405,8 @@ static int unix_release_sock (struct sock *sk, int embrion) mntput(mnt); } + clr_vx_info(&sk->sk_vx_info); + clr_nx_info(&sk->sk_nx_info); sock_put(sk); /* ---- Socket is dead now and most probably destroyed ---- */ @@ -559,6 +561,10 @@ static struct sock * unix_create1(struct socket *sock) sock_init_data(sock,sk); sk_set_owner(sk, THIS_MODULE); + set_vx_info(&sk->sk_vx_info, current->vx_info); + set_nx_info(&sk->sk_nx_info, current->nx_info); + sk->sk_xid = vx_current_xid(); + sk->sk_write_space = unix_write_space; sk->sk_max_ack_backlog = sysctl_unix_max_dgram_qlen; sk->sk_destruct = unix_sock_destructor; @@ -870,7 +876,7 @@ static int unix_dgram_connect(struct socket *sock, struct sockaddr *addr, goto out; alen = err; - if (sock->passcred && !unix_sk(sk)->addr && + if (test_bit(SOCK_PASS_CRED, &sock->flags) && !unix_sk(sk)->addr && (err = unix_autobind(sock)) != 0) goto out; @@ -961,7 +967,8 @@ static int unix_stream_connect(struct socket *sock, struct sockaddr *uaddr, goto out; addr_len = err; - if (sock->passcred && !u->addr && (err = unix_autobind(sock)) != 0) + if (test_bit(SOCK_PASS_CRED, &sock->flags) + && !u->addr && (err = unix_autobind(sock)) != 0) goto out; timeo = sock_sndtimeo(sk, flags & O_NONBLOCK); @@ -1295,7 +1302,8 @@ static int unix_dgram_sendmsg(struct kiocb *kiocb, struct socket *sock, goto out; } - if (sock->passcred && !u->addr && (err = unix_autobind(sock)) != 0) + if (test_bit(SOCK_PASS_CRED, &sock->flags) + && !u->addr && (err = unix_autobind(sock)) != 0) goto out; err = -EMSGSIZE; diff --git a/scripts/basic/.docproc.cmd b/scripts/basic/.docproc.cmd index e725e6b22..6d40859d8 100644 --- a/scripts/basic/.docproc.cmd +++ b/scripts/basic/.docproc.cmd @@ -6,7 +6,7 @@ deps_scripts/basic/docproc := \ /usr/include/features.h \ /usr/include/sys/cdefs.h \ /usr/include/gnu/stubs.h \ - /usr/lib/gcc-lib/i586-mandrake-linux-gnu/3.3.2/include/stddef.h \ + /usr/lib/gcc-lib/i386-redhat-linux/3.2.2/include/stddef.h \ /usr/include/bits/types.h \ /usr/include/bits/wordsize.h \ /usr/include/bits/typesizes.h \ @@ -15,7 +15,7 @@ deps_scripts/basic/docproc := \ /usr/include/wchar.h \ /usr/include/bits/wchar.h \ /usr/include/gconv.h \ - /usr/lib/gcc-lib/i586-mandrake-linux-gnu/3.3.2/include/stdarg.h \ + /usr/lib/gcc-lib/i386-redhat-linux/3.2.2/include/stdarg.h \ /usr/include/bits/stdio_lim.h \ /usr/include/bits/sys_errlist.h \ /usr/include/bits/stdio.h \ @@ -40,8 +40,8 @@ deps_scripts/basic/docproc := \ /usr/include/bits/posix_opt.h \ /usr/include/bits/confname.h \ /usr/include/getopt.h \ - /usr/lib/gcc-lib/i586-mandrake-linux-gnu/3.3.2/include/limits.h \ - /usr/lib/gcc-lib/i586-mandrake-linux-gnu/3.3.2/include/syslimits.h \ + /usr/lib/gcc-lib/i386-redhat-linux/3.2.2/include/limits.h \ + /usr/lib/gcc-lib/i386-redhat-linux/3.2.2/include/syslimits.h \ /usr/include/limits.h \ /usr/include/bits/posix1_lim.h \ /usr/include/bits/local_lim.h \ @@ -54,9 +54,6 @@ deps_scripts/basic/docproc := \ /usr/include/bits/sigaction.h \ /usr/include/bits/sigcontext.h \ /usr/include/asm/sigcontext.h \ - /usr/include/linux/compiler.h \ - /usr/include/linux/compiler-gcc3.h \ - /usr/include/linux/compiler-gcc.h \ /usr/include/bits/sigstack.h \ /usr/include/bits/sigthread.h \ /usr/include/sys/resource.h \ diff --git a/scripts/basic/.fixdep.cmd b/scripts/basic/.fixdep.cmd index 1c463aa74..4f04c3fd8 100644 --- a/scripts/basic/.fixdep.cmd +++ b/scripts/basic/.fixdep.cmd @@ -12,7 +12,7 @@ deps_scripts/basic/fixdep := \ /usr/include/gnu/stubs.h \ /usr/include/bits/types.h \ /usr/include/bits/wordsize.h \ - /usr/lib/gcc-lib/i586-mandrake-linux-gnu/3.3.2/include/stddef.h \ + /usr/lib/gcc-lib/i386-redhat-linux/3.2.2/include/stddef.h \ /usr/include/bits/typesizes.h \ /usr/include/time.h \ /usr/include/endian.h \ @@ -45,12 +45,12 @@ deps_scripts/basic/fixdep := \ /usr/include/wchar.h \ /usr/include/bits/wchar.h \ /usr/include/gconv.h \ - /usr/lib/gcc-lib/i586-mandrake-linux-gnu/3.3.2/include/stdarg.h \ + /usr/lib/gcc-lib/i386-redhat-linux/3.2.2/include/stdarg.h \ /usr/include/bits/stdio_lim.h \ /usr/include/bits/sys_errlist.h \ /usr/include/bits/stdio.h \ - /usr/lib/gcc-lib/i586-mandrake-linux-gnu/3.3.2/include/limits.h \ - /usr/lib/gcc-lib/i586-mandrake-linux-gnu/3.3.2/include/syslimits.h \ + /usr/lib/gcc-lib/i386-redhat-linux/3.2.2/include/limits.h \ + /usr/lib/gcc-lib/i386-redhat-linux/3.2.2/include/syslimits.h \ /usr/include/limits.h \ /usr/include/bits/posix1_lim.h \ /usr/include/bits/local_lim.h \ @@ -59,9 +59,6 @@ deps_scripts/basic/fixdep := \ /usr/include/ctype.h \ /usr/include/netinet/in.h \ /usr/include/stdint.h \ - /usr/include/sys/socket.h \ - /usr/include/sys/uio.h \ - /usr/include/bits/uio.h \ /usr/include/bits/socket.h \ /usr/include/bits/sockaddr.h \ /usr/include/asm/socket.h \ diff --git a/scripts/basic/.split-include.cmd b/scripts/basic/.split-include.cmd index e596a8729..e1a20d0c2 100644 --- a/scripts/basic/.split-include.cmd +++ b/scripts/basic/.split-include.cmd @@ -9,7 +9,7 @@ deps_scripts/basic/split-include := \ /usr/include/gnu/stubs.h \ /usr/include/bits/types.h \ /usr/include/bits/wordsize.h \ - /usr/lib/gcc-lib/i586-mandrake-linux-gnu/3.3.2/include/stddef.h \ + /usr/lib/gcc-lib/i386-redhat-linux/3.2.2/include/stddef.h \ /usr/include/bits/typesizes.h \ /usr/include/time.h \ /usr/include/bits/stat.h \ @@ -28,8 +28,6 @@ deps_scripts/basic/split-include := \ /usr/include/bits/errno.h \ /usr/include/linux/errno.h \ /usr/include/asm/errno.h \ - /usr/include/asm-generic/errno.h \ - /usr/include/asm-generic/errno-base.h \ /usr/include/fcntl.h \ /usr/include/bits/fcntl.h \ /usr/include/stdio.h \ @@ -38,7 +36,7 @@ deps_scripts/basic/split-include := \ /usr/include/wchar.h \ /usr/include/bits/wchar.h \ /usr/include/gconv.h \ - /usr/lib/gcc-lib/i586-mandrake-linux-gnu/3.3.2/include/stdarg.h \ + /usr/lib/gcc-lib/i386-redhat-linux/3.2.2/include/stdarg.h \ /usr/include/bits/stdio_lim.h \ /usr/include/bits/sys_errlist.h \ /usr/include/bits/stdio.h \ diff --git a/scripts/basic/docproc b/scripts/basic/docproc index 51640ad93660a5e29ce19452befa76d58d827f84..fd219c4e1efb9b9a575d9565312dd77090e7138a 100755 GIT binary patch literal 20254 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 literal 19832 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 literal 15691 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 OeD6)1ot}KH^8W%yQa%y@ diff --git a/scripts/basic/split-include b/scripts/basic/split-include index ecd686e99d025d2c3c9c70c36ec7ef64affb3e19..964ac45fbe40096075988fc0227dee62ab5a54c2 100755 GIT binary patch literal 14876 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 literal 14592 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 dEZdO^=W;P_%BgRpir_={{bt)DqH{n diff --git a/scripts/kconfig/.conf.o.cmd b/scripts/kconfig/.conf.o.cmd index 2c06e27ab..2b46bc4a8 100644 --- a/scripts/kconfig/.conf.o.cmd +++ b/scripts/kconfig/.conf.o.cmd @@ -9,7 +9,7 @@ deps_scripts/kconfig/conf.o := \ /usr/include/gnu/stubs.h \ /usr/include/bits/types.h \ /usr/include/bits/wordsize.h \ - /usr/lib/gcc-lib/i586-mandrake-linux-gnu/3.3.2/include/stddef.h \ + /usr/lib/gcc-lib/i386-redhat-linux/3.2.2/include/stddef.h \ /usr/include/bits/typesizes.h \ /usr/include/endian.h \ /usr/include/bits/endian.h \ @@ -41,11 +41,11 @@ deps_scripts/kconfig/conf.o := \ /usr/include/wchar.h \ /usr/include/bits/wchar.h \ /usr/include/gconv.h \ - /usr/lib/gcc-lib/i586-mandrake-linux-gnu/3.3.2/include/stdarg.h \ + /usr/lib/gcc-lib/i386-redhat-linux/3.2.2/include/stdarg.h \ /usr/include/bits/stdio_lim.h \ /usr/include/bits/sys_errlist.h \ /usr/include/bits/stdio.h \ - /usr/lib/gcc-lib/i586-mandrake-linux-gnu/3.3.2/include/stdbool.h \ + /usr/lib/gcc-lib/i386-redhat-linux/3.2.2/include/stdbool.h \ scripts/kconfig/lkc_proto.h \ scripts/kconfig/conf.o: $(deps_scripts/kconfig/conf.o) diff --git a/scripts/kconfig/.mconf.o.cmd b/scripts/kconfig/.mconf.o.cmd index 6f874bf8c..ecef0130f 100644 --- a/scripts/kconfig/.mconf.o.cmd +++ b/scripts/kconfig/.mconf.o.cmd @@ -18,7 +18,7 @@ deps_scripts/kconfig/mconf.o := \ /usr/include/bits/sigset.h \ /usr/include/bits/types.h \ /usr/include/bits/wordsize.h \ - /usr/lib/gcc-lib/i586-mandrake-linux-gnu/3.3.2/include/stddef.h \ + /usr/lib/gcc-lib/i386-redhat-linux/3.2.2/include/stddef.h \ /usr/include/bits/typesizes.h \ /usr/include/bits/signum.h \ /usr/include/time.h \ @@ -26,9 +26,6 @@ deps_scripts/kconfig/mconf.o := \ /usr/include/bits/sigaction.h \ /usr/include/bits/sigcontext.h \ /usr/include/asm/sigcontext.h \ - /usr/include/linux/compiler.h \ - /usr/include/linux/compiler-gcc3.h \ - /usr/include/linux/compiler-gcc.h \ /usr/include/bits/sigstack.h \ /usr/include/bits/pthreadtypes.h \ /usr/include/bits/sched.h \ @@ -45,22 +42,20 @@ deps_scripts/kconfig/mconf.o := \ /usr/include/bits/errno.h \ /usr/include/linux/errno.h \ /usr/include/asm/errno.h \ - /usr/include/asm-generic/errno.h \ - /usr/include/asm-generic/errno-base.h \ /usr/include/fcntl.h \ /usr/include/bits/fcntl.h \ /usr/include/sys/types.h \ /usr/include/sys/select.h \ /usr/include/bits/select.h \ /usr/include/sys/sysmacros.h \ - /usr/lib/gcc-lib/i586-mandrake-linux-gnu/3.3.2/include/limits.h \ - /usr/lib/gcc-lib/i586-mandrake-linux-gnu/3.3.2/include/syslimits.h \ + /usr/lib/gcc-lib/i386-redhat-linux/3.2.2/include/limits.h \ + /usr/lib/gcc-lib/i386-redhat-linux/3.2.2/include/syslimits.h \ /usr/include/limits.h \ /usr/include/bits/posix1_lim.h \ /usr/include/bits/local_lim.h \ /usr/include/linux/limits.h \ /usr/include/bits/posix2_lim.h \ - /usr/lib/gcc-lib/i586-mandrake-linux-gnu/3.3.2/include/stdarg.h \ + /usr/lib/gcc-lib/i386-redhat-linux/3.2.2/include/stdarg.h \ /usr/include/stdlib.h \ /usr/include/alloca.h \ /usr/include/string.h \ @@ -83,7 +78,7 @@ deps_scripts/kconfig/mconf.o := \ /usr/include/bits/stdio_lim.h \ /usr/include/bits/sys_errlist.h \ /usr/include/bits/stdio.h \ - /usr/lib/gcc-lib/i586-mandrake-linux-gnu/3.3.2/include/stdbool.h \ + /usr/lib/gcc-lib/i386-redhat-linux/3.2.2/include/stdbool.h \ scripts/kconfig/lkc_proto.h \ scripts/kconfig/mconf.o: $(deps_scripts/kconfig/mconf.o) diff --git a/scripts/kconfig/.zconf.tab.o.cmd b/scripts/kconfig/.zconf.tab.o.cmd index 2a3661c06..fdd857ef0 100644 --- a/scripts/kconfig/.zconf.tab.o.cmd +++ b/scripts/kconfig/.zconf.tab.o.cmd @@ -8,11 +8,11 @@ deps_scripts/kconfig/zconf.tab.o := \ /usr/include/gnu/stubs.h \ /usr/include/bits/types.h \ /usr/include/bits/wordsize.h \ - /usr/lib/gcc-lib/i586-mandrake-linux-gnu/3.3.2/include/stddef.h \ + /usr/lib/gcc-lib/i386-redhat-linux/3.2.2/include/stddef.h \ /usr/include/bits/typesizes.h \ /usr/include/endian.h \ /usr/include/bits/endian.h \ - /usr/lib/gcc-lib/i586-mandrake-linux-gnu/3.3.2/include/stdarg.h \ + /usr/lib/gcc-lib/i386-redhat-linux/3.2.2/include/stdarg.h \ /usr/include/stdio.h \ /usr/include/libio.h \ /usr/include/_G_config.h \ @@ -36,7 +36,7 @@ deps_scripts/kconfig/zconf.tab.o := \ /usr/include/string.h \ /usr/include/bits/string.h \ /usr/include/bits/string2.h \ - /usr/lib/gcc-lib/i586-mandrake-linux-gnu/3.3.2/include/stdbool.h \ + /usr/lib/gcc-lib/i386-redhat-linux/3.2.2/include/stdbool.h \ scripts/kconfig/lkc.h \ scripts/kconfig/expr.h \ scripts/kconfig/lkc_proto.h \ @@ -45,10 +45,8 @@ deps_scripts/kconfig/zconf.tab.o := \ /usr/include/bits/errno.h \ /usr/include/linux/errno.h \ /usr/include/asm/errno.h \ - /usr/include/asm-generic/errno.h \ - /usr/include/asm-generic/errno-base.h \ - /usr/lib/gcc-lib/i586-mandrake-linux-gnu/3.3.2/include/limits.h \ - /usr/lib/gcc-lib/i586-mandrake-linux-gnu/3.3.2/include/syslimits.h \ + /usr/lib/gcc-lib/i386-redhat-linux/3.2.2/include/limits.h \ + /usr/lib/gcc-lib/i386-redhat-linux/3.2.2/include/syslimits.h \ /usr/include/limits.h \ /usr/include/bits/posix1_lim.h \ /usr/include/bits/local_lim.h \ diff --git a/scripts/kconfig/conf b/scripts/kconfig/conf index 89b852e2f243ee2892596ec7ecd35607da6a7f80..f979702f2c70e013fb90970f906f84752528b6f8 100755 GIT binary patch literal 20627 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�KDaAs7TV!Njj{+akPx=rn@&YFr`BaM=ohy8%R>c#1Q0Qq1f{r~^~ literal 20591 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 diff --git a/scripts/kconfig/conf.o b/scripts/kconfig/conf.o index c191a8a72cd7dc86b00872d436f45203e92698f7..733910a56021d4b691281def66d200cfc1d6871a 100644 GIT binary patch literal 9940 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%0D)ksWnlFO)gz#_+K9Vq29~cz#JuxHe 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 literal 92510 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 literal 20532 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 YQ@Bi_*k`>!gQC|dY*H9jxJBXr2CEg_(f|Me diff --git a/scripts/kconfig/zconf.tab.o b/scripts/kconfig/zconf.tab.o index 3d1d070f08e892bfbf6ad208776f231e4c1108b7..b0e7ec749ea531a4ba3ee69d3eb5408b13635a55 100644 GIT binary patch literal 94132 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

$wac<^DkC8N4X5wasQwZWVG@l)34()T+97~ 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 WLYx-js1P@W^;%eug>f#7>;DJ7H?;-; diff --git a/security/commoncap.c b/security/commoncap.c index 289569304..5f629be72 100644 --- a/security/commoncap.c +++ b/security/commoncap.c @@ -120,7 +120,7 @@ void cap_bprm_apply_creds (struct linux_binprm *bprm, int unsafe) /* Derived from fs/exec.c:compute_creds. */ kernel_cap_t new_permitted, working; - new_permitted = cap_intersect (bprm->cap_permitted, cap_bset); + new_permitted = cap_intersect (bprm->cap_permitted, vx_current_bcaps()); working = cap_intersect (bprm->cap_inheritable, current->cap_inheritable); new_permitted = cap_combine (new_permitted, working); -- 2.51.1