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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 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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 T+;A>i6zZk&U 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 NbCXj$o;Mf!~0!R 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 literal 92510 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 QSg&xU!bXKn3fC+AH#7{VP5=M^ literal 20532 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 Z;dKg^DHQvx7iduQI)zON!wR=3{NJk;-O>O6 diff --git a/scripts/kconfig/zconf.tab.o b/scripts/kconfig/zconf.tab.o index 3d1d070f08e892bfbf6ad208776f231e4c1108b7..b0e7ec749ea531a4ba3ee69d3eb5408b13635a55 100644 GIT binary patch literal 94132 zcmeEvdwdkt_4wJ%Bw3k-Sun+Dqpmm#C`y7TWIzou*#zXV33>1kVpR}RUczjGei6ah zQ77Ztv}*0k+LyN0Z>_CpQ41~*6S1vg`p|ycTB?0y-B{6T2ne~q&pCHyb~c%S-^%az z&#!YKbLXCW&wZVH?z!ild-wLrxe=ew2lnHG9LRhD1XCO`m0lCzR0x4NR~F1VInd_6 z+gCm-o{aS+X0g3S-`+$E)Ej?mY*@Ihw?Hu`(x+OGF1^_H!2n~-NXQ>EW;{@Y*dM_7 zuf1jAd>SE%iV*|mPE1{TaHVmDbk{KenE1+T1CebzF}5@wz<4@@zPsKI0c<-G!VtpL zGJ=-?L(HcM_uq|!IaI1d1&q-S9Guu;?!?5#BY!=@*lYi&X=G1hh1k>hZ9IJd|LzQa z%vjG+#+a#7FtvqoP)p`$2ae|OFM^mlBHMkyZ|vTk@|#a%D;zaPjJHqA3Ow|+17-s8PSlBhN=)i7>6z_kmH7b7ofs;;5Z`!@03f|^ns5K*SSf>dE45&2 z5SxKlO%3zTkzTle;eY#)ez1}n;r6F)IEFn>)qWv;B zR)nzqZNg8TL(o7om{cRS{wNXGwrUv%up!8t)~GSGj!+-?rTD=C93NO?w&AGO8>A>& zM=+}O2FSm-DQY(#Qflhw12)YP9zyc?02VSdB<+&LR@(F)jmkw$%WnPzTb6Pt9bEMV&@s>-(DpDtnh8BO#MN zyP5VKJ3$Roe;Qz{(P>Gx!G#m)HT^@aH`tuxfqLyQsGWvS-9gP8v-U7PEM!IP;?3*oWp zyBXN}ek#x6rf74XN6A7b#3&zQtj6g$tvARv^s@~gHgodVItruB`5uUWh6CAy<}*e8 z1!Wy*hGtGtTD2Uq2cgyx#Bk3}SvCx2XEdd5KFV0*s(c^7syyUMyn9M|ek2lo$CFYV zXC+suX_yKpL|k|jd+9#n_kOlMZ2HZzBDOx@<^a6M7^HrB1S#ItrKtl%jKOBVD`%V0 z+;zmey)tC}bt+!alfY&VlRDGd*lN6J$OVEH)8ipj`@CULWSaGikKJq`o3=QENXri= zxaVlVsoRbHL+iHig!$Zf_(XN9;xx%AIQ3G$-G98l`oM2)I4Z?chZt+{n*N+#N*$%b z1f9V~v*8nmuqA9F$ZompQNUYn8^s?wQ)WiN19m&4>JQmv?E`;o1kbQ+7zEBh$WYTO z&Tt_9U`B(c&nOS1j`dNQoh~NCJgz-h|A(RsEoP=Q{>dxuaAFT64-A7OQ`g5VB)0tF zfh0N%5~seY8?c!y4%iIr=A#w^NsZ}aY!}j8N<<&B%ajj&IL1!PF=?FH~Z`y>}b@Ki`bO(>m~_?dQ#Fq zPwWKcOy0}V3-?@&GCl+2B`tZ~0=mQi5z;} z=-=IQHkX(Wy;*%ur#7&#OaJhQwRYQi@CakKkK+Za&{pH}qUmB0}BXi>tZEqmTp2qK< zHSaUlWb9egP}_6e`wUsDwiAmX7<+DynmU%_I0e1^qJ)WMGZMX2H~gCrrrC=S!H32D zk`Ew)rTsHX3_RN@xx~%1ohXs#Nbxsmg-Rc|fN~`L?DbV)8DB!sLa%ki)}Pbb!KW_e zYq?Td$f{Rry#e!S>_bL`Aw3g6E13@v?fJ?<#%Jbqa&?5dP=aKs4{?gIN=XZFt9+%jM3uB_P>841mDU@OUdYEa z6xNT|Hmben@A>h2yeoOdN_XOV+MpyGUQ89?Q0>zOd{TS`E*%os-}*jI8fspKL~45$ zyvNw$Cbpdl8|^83k1=BpBRbVOLaFnyq=*LvbMqdGWhDN11gm_M2+`b$UoLX22#hj_ zFgcdgRQH?{O}%{#*Noe*#uc94$JdHmYOEHQ;y=am^5zcd-D)0JU<~dDlCz9_dsM4= zEP<587r&{!?=zEGS;5aqIBhbROe#Y{NpFATg<>!C|UgM0_XnXVH>o;BC$4Aue+mew-Pt@a7y& zHJoEbLRv?dyjBxT*I8_{)*Eb~z!K~dqtAj(-J$oX=OkJ{+Y-!E$CwfMF$e>w6GlQA zfDw_+%k;k3TUFZ_E_k=>6eYJFX)82LmuhtRLld)VgBB%G_{LN=ql)-+EpPVxr zeGAPBIdBn*Ebe-1{bK7yW?VaZ3fD03iY?vC-|0T<{ZH%tcf$_(qZRTS>;22dhJ~go zhup|#sB)pXSuRkgX}!TlY6M)4H}dvyCg5n#DdHVnI|B#AXlwAkD`WVIQTmKP1e z6&-@B2z3}Uxqe{ra(mJK^>*SK=||fe7P^aAL!~NE3!G%mQ<@Ji**7PpWt0Y92>L zZC|vcd7RyrAw6kyswKw3iT$zD>YM$|K3;ZCu!$|c^lR;nR(+!NRtJRAztwsJ^&H3Y zrg{sp)={){dDAkh3_)|VESu|sW~IElN6-%V+(p4f*=Rpt^}@~h*_oP^LFCx|xzb%< zz_~iEO&Y;Ti(-$kW4Bv_DmDS>w@(#Iw-l+@6VZQU)(7-%_2QDG@jB;H$e$9k2DZ)& zjZi1ou$aAwW2!vKt`+iZRi5DV2(OLN*C~X+tPfOE;t$fh%}7A&7o_;h$P)Sm>8^(X zpjs`8vKBA2she=V#)_U|7oC@U(Gu1YbP8bN;188_>q+%$ZF;^sL+@4x6)F7_LL&@8 zqskLli!Gpr()-LZVFnF`*mKX3zU3)wPJO9ekWe;;RD%t08kd)F@gk18keVp9*p8NG zr%!Fd`3&nOIzc$&WcO66)(*-fywVPG8YMMpfUz1D6D$gJS|;@l=eeA=vzV?mtk(zh zK6AAkR?E%#L4BXPLhB7QIMixJ0(vr5V&>_|*o9_`p!ca~m=RQs8bmcR=D}P*{X+?*QT7$f{i`|J+8!0QN zfz$hk@|R|wsXa4wX$7MJLdXEM;Ans@Ei@YEIDk%^{tB1U9>&ng&s;6bCdKvjBsTeG zJdbE@pVClI^z#&=A`&tQtFOoRIO64b5N3Of-w5L>Y^0@s`a}ng*ulSct0v;*@2OcP6CRLFw)JoZ?d<{J%gcfN7VdXEMez=y#xED|HIS!!>vYkostV zu^m!&*k3R#lpXdf3>%#t_AG{-njQ8ChK{ zednR?$LKo;eUG3ojJ~g<4>#&kUqs({^xcKNGtqY&`o^JeqbnzA7Y;J60OwieW0vO} zvpbVYP(rJm4B1-bYjHgsskRVmgm!$EXg!n)y0T$q!PKvgGG-6s1x7y~J)Db7>@g-9 zem>sX^0nRoAB&y&z^1Sg9`2o4kq;pKMTfDn%d*ObD~k71&wcy}Gj?({{aSCJI%@jL zc;3)6WGW+*Naxd#`P#EwdsSyIwndg!(SEBb`3GcPzrU0PLM`oZQ8O|57&GJ50r z!qLe5A3nlZY1ih9Cw6Hpkf6C~%UG;Hph0`j-WCaIEO7ffT5q7SA$2}uti9*q5WtQg z($aWbnfGf4`V*T1>2EmQ%kwsl7!xMGWBG}h8X=p{cIMmi4c3Q4(~sI!L}|4wXiHtu z)Q?GRZOxv8I+@prmU)ssl2+JQIfJU2I_h4arFEj7Mx|QxRHp_x^ z*GfMCMl744Cu3tTtdoV3q;|w7J&-K3C*pPtouhXfb#h?K>4_F-%fGu4sw(Hi`m(Ys zxL3P%l3$7+!v$M~95}S!=*qb@7;7nEdY_tO&b-&8W;Lq{E^HO_q!jPMn2o`NFa`}M z9!I5XRnV*oYP|t1>5sBjzQ=^@sY)=bC=IG^69svgfjjp@`wgm>(Pb9gn{#VWZQI6B z6Vj6V0=_t7cpOt4Ng1S_R_g(1j#p6F1$ku?&Nf7l!wgwaHNzly*qX$)L>;)XCPE~mE(s!VK z$gWY0Z@ZaQLh8TJPHF${o}7dbN>vY_F0Bej9;6xua7M(s;nP))v<9hB*|Oh-r`Sva zGX!@(k|;|(nObp-vG&GnMT`Mr<5`vCxoc?3`LNwM&2;FW4MM5Y~#5GJO zy%6=6B=v6To5|{P_89wZ9m}9~C{`B51Ty^MlDOY|oLCYkfZ!A6EkdHoU%F@GQr^Vc z9>39_C{S`{1xt@4s{JiRM&F#-Xf>9VPu_C${a}PFlQb$DA29YPcXjkV`CK&LfqSIc?ca7E zt}i$TyE|l>SmUjw5Ib);{#&|xV{xYscueV;(degkN>uv{O5RrHv&ysI*4NR>&3I+j zh0}PHo-w!)-tSY-M5ceX*6)u!F_=ke9ibhlnn*vVCu8lV3iX5uebeCu5U(eoH)@ufMW}hZW7W3e$Q6ND>Wdjw!T7dwxOUT*1=isV@S+5W3wg zhk7>QtU!dI_Zc6k*YcrVI`d9-zTT})Hw*62yVa7xP3$6{f_r(}8RY?okr*!-GwC9~q%GtCN=Q1Yl zceAa5t~yZjSJ=>l?S*S`!8HeTMP%ZK z5oA}^G&3E$iTIA2I`wY#aLhA@DMOv`*HC#tRgO3ENF5wQU zcYZa`Q}0%PWktgDYO)7cRha>i{&6-Ni}Kdg_o)lb`%uA?C}*XV$;P}zq=Qdv2xz^5 zgzz-x6Xp7SG*Jrk_|1?gXsD2wgb)fVL;&S&2cN<$fH^z?-j&3WiVWTEcFJehxJzAYbz8ww+9Tq1!+oaWM3vuMEl)BkPfZM5}SkV`aZQ1$7;zwJ*noH!FE2%-IJp=BXI6d7^pkdkuD@L+#hAcPAOg&#luJI zC@e{0y@%V+BV{`2<3qH^hlvL7BxmAeQKPdbn1N^URjVkd#=xhG*7}wY0CK5#fu(!B z=)u}3H9{H9iKFv(mvLLK90Ewts>=MiJUs+p?FZUKKXO|~Q3${y_^nq?R{!aua8%at z_I$(HUQDR6wb9+QsNNdsoj44hHu`Y8J!Ik*J66PMD0?o(AfByXy$U%nSIbz7em`Hb zb(PU7#h7Xteshh0zpD(DG|*Lsx>e9<8y0tu?3E7|v`ZkXW%4_`un-xAyEJ?U#^~x2 zXy1Th^LdLGfa+qELhrU{IUvP<&~=}0&A9} z+L(SL&#c02#K*8Q#*|p)V>rvi##yLd@)=bj({EG>T~$cua#?4+1OTSg` z-siT>;vFqqdQYMSN|LEdQ3p0?{lJwX=4i7#q`l&4m1O%90)Ib>AGL36uYjCu>=U7hro7K*4sl-=`0mwKzwUqA6+6nCo% zIQgh@5pMb*5mp&5qW(pacI`InVWlaQYX<@=QDEA7xG9!*_o%8!`Y$*S)YCXn8*Q)*06ArUp!$s?TF13ZmmB+=$aY{`?<4`hyhp|n>&{l+*Hs~- zbp~`*$Rtfm@m07|=nb;%@?4CKEoD^5lTf)(Cl~46WV9j09}@sd`W#)G@T8u^&QWX8 zMr5uWG;4y|kv#QMbCx_3f&k~;j)-Q-iSlDwzrR&9XBDFHURv{N^{a1BW z$SCQ9q;E#uoGOPBG(euk9fza;dNj5@p~~ZtaxQmTR8JZ&s^7ql2dHcw;p}?j#D-g| zw(*crL9~Rrw+~SFwpk{1TYqlrI5VzY8|5YzZIv){jTHY50L;8aiX*wsT&sQ_Yltav zSIbo8pc#>O_vC5^d}zpl)@GS(?1ME8NV(b(pE^Q2;@gm`9r3G$W_3~N%Nza1%SNv)K-Y(Y( z_Snr9xU`M}%P^{~5-Mkolk_)m;nmX?igz2GQoIejao5Y*;c<8GS5MatU!%50+VbK_ zb)>XwzjkDtnyVeTCe|BIO7|zFXOh*%2j}cjCvR28spFz(<@vfxc1>*XHP|w1$T*n( zdZ!;!XK`bULbhG57^aMiXt(n2{pqi^LHYsgBHE5WUZujR(X@Wl`md6{a20M0^pB9@ z$H;T8q~k7ELY2p5lcl7ej^T6ViN;*i4FsCQ_Ns~K?c<}2bpj;T`>b>$I5|uDU+7c_ z8o_Y0H-|`7nUh(tTI=^ocWpk#*tV6N03t*bshjw&1tv|M$L$>n(FD#pEm4sVG#wY> zC4CutFlYSVf?*YMP}>yDQnwK4wwECQ zVARO=km||N`u#1p6IY1JyWbJCw|w#L*i;Iz*+g4}vk2*4G!Np%<+gbx$!#6T0EzeV zI&l&~Dw$>Sc~}6<{gf)%tQGX`*n#wyaDS+^(6RH1Cu3vG zDtRQ8b&pXc^OIt{lBq^Mgq?Lx>Q$~L&IIJ)E*6L*^2GN{W2PN7>(AyS!Z@$dglB48&A}Z9o)zgp{HP;LUTcnEo75A{L z?^OZ)T{U9f7Sx#(M|$Y1l0#B_3T9s!z{v=A(alOsr_&jkHG=-GT43~9VTVz!#IP6& z-Z=7|0#(R`dQvUs!CW40TE^#b+t!cbb_t}qa?C|9}*%_Ph^Ib_D~+hk3VW>o>|qc>~)z75s13Aq}N1+rF`;o6|4mg2LA zMB&Yj@)w#(oFMs#0md4f9MUh;IDVw&Om1~ZX;S@R6<4i;YfoN~SQ`1t7|j;!CoT1Q}y(Wxko4q&V87&0G|F zfhKULR9Z)HP`NU7;>3DdraqXX(|T=rB`ls)$4R@ATK_op46Xkf^)pp%!ZbeBQedvu ze@!f{GfBS_^=bocc{8t3ub4SbRpQB55|`6t_)6T(k*n;gd;vvD9J&5x9|xwY1{mWr zS$nOtD;aIf>H}WhF;Qt(9zmR?J(S^&XB;Mrk3L0z@vZG3OE%# zW*Nq(t|uhfOJk!#Ci7d1JL-pzFqUdMif8NPa7~nLmnZlE+yZ|LTekQ-I0$e#n!2ef z3JjA6u?9V9bgA==&I>uqN!(9-9=D+*^~gpLE9cmq@u}^6=^om8yARY6RmNtyAT=7z z7>Ki?GB4%FPm4kPgANJel!I7s3gDu80Y|uKNv3J6Wtfczc}MDJhZ!TiPIJ~4AZM6m zWHM;h$>A z5zMN95eb<2WC)($db%0c+8y?b5sZVlvw(apz%H};i+aFb=9cuK=I9Na;w)1FBO;{J zZuIHrvZ0GuD_0yDkwAJk>YTFo4pkY=%**iZhy2zn%((WXRV0)lTZHsmcow7A*;iV` zS~BKA_9{&42;n9}`;c;{f8TEF*ekMi?5JR;o#oB)gmzMOjxb9~|0%^ga1PElL#6M; zPOs6D0`kRBeb3V zNGZMw4?^9Fb9F;wVwQl13vjNjkPFR_wkLohSxONBNUifrx#}U)qH-!q+RO|w0>yDwf#1AmJ20)rLzQ8Fb<~wWR?d?X9Z#(?m`BY zewWh+Um6(|a(J_YcLrC{N zDc*@{$bP?i3g5KNrg>~@B^}LJ9L!R@nlZ+)OZvZ1%EawC2d>_0<-9xnCFCQxmURSK>8Vrm*A3gI#cDD?#vxg z4i^p;xU!NGvyS5M8LJ)6S4Wq0Ylm~x5&Sd{iPshKRI@k{p*W+Ep`23EtqtVF{%G`R zhjXO(uW=#LC>V8e(D%~(md*6(Y5 z5G8HD+JG;gDwK4mb&80n)r&EkUURb?(5}pny{#S2kKuJNmi`eXvqTFRdywwuVh7a8 zK~2ez?b8PGV;$+=V)=yFBieu<#h*dCJuJi?)CL6g8uTT!0U>s`d3%7bA4*?GvpDr) zu1YRN6FL1xKA5JKMgx+*1TRYAS=U>4RiriEOXg;IYH3v{!ICST_fv_cL_I;z_S zAsmB8jVzj*hhV-T#mPLjhtn~2Nx-ZR^p(r`QhfgaV|``l>l|RLbibNk8%>4yQir3W z5uOTQ5X+TxYcW36tR)O)B}xe)DSnHEDE2&2pLRG`(ushn5T*42Nyp=6sUP9Gtpy0z zdDw*RLQ47=jAK}F5J$gbo?luSkn|K^ST)cTOGsY92-!%UKgLj&L-Noc%})Q|F~(A- zbDo6+qvLslLG9R#aq#>H_5mkhZF;_>--%Jngw!N_*9+zp&W@ciIgl^uc*PEl$@N0& zL#|lmV~q|id)o}Fa+uC;k!(2+%+aMENO9b+H1kV~V`FPktgLV7*^OOl%apH|?pDVp z%F!xMx)T*a+JH~3)du{kOQH<0X)YsKI%WD6a&F7e))vSXyE@va1TKKm=3V+Jl3MKq zw9+*?RkZrB!)zprEJ}VhT3^pfdJ2$UEJ-LzvSmXLUfWpS_~?(gadA*tr4KF`OA-NzG1d=EC7m4LAudQQUujl7c9a)Xzx zXu+vga7nwJFCe;T{ew@-6w^czT;HdnO}-;@qu5UJM*3G==r$|l(2}LgagM@XEWkg7 zQ8uOLUL1iP!AzK0As4aYo;#3>bcE6mJ2Z$=JmzUxHIQ&P-W;1KKdSZTNOz6IY3Ya{ z#lMI1%Mn4k3y*hcM{?8=Xb8nm%#rAf>(X8`u6<}NMsO*1tH8AyHl^4H+qq@MF5~sC zJls#ivDO-}sMUxBy7KXyT~`&!)W%df{W8WRYWWS?D7?;BfN19x(yqh>gq9SH0V6+! z>pHVpm_eo?YSemP#NU!`sj_SY#z0p-3h?}60iiyBkE-{Xs%F4@wcSU9AGT{JZ7>!D-&l?lUm2C z%!?RJEyDFO(xYX&I%wTOi`Uev$N0X9iQD`x!ZJ6@g+yEza}`FD8P^JG?0X>tjW*Jf zcZu1m!JXLOMvt`-g%KQuhMrXap8m7ZhkB34$>yVUi=gI~ZVANp^LrBZq1{DC35HAe zC)3aI`DbvMusm2Uz8VtLjat9ZT8`^WzQRURxj`k1J0*KZdS*}he|Q9^WN|7PuBRle zKR@=YQ-YtAZV_TXw3uHc5PO)H^K0!G{-q3=^lze#ovA-cvumBaSld}9L*X?MeB z^klfjrzc~lIOmJ8uRN6y7&H9_+Q^_`6JC{Yf;=3Z+W$I_;q*$XrB|}346NNDBD3#lFb@vX|)0S~?>*||0spo0^ z0qHJ0Cu+vEsn#Gs9^Tk2*y8}_XRRYhA(mpWLPnK4U)-x@*83doSgxBFqxqQ4Ny&cg zuc(>ByCp*QT`Cm(QYM(+j>dx@``?t|bXy65yIwAQ=?60(*8MG%=YATi+A$oHW{Z$m zC8T=r43Bn9P#0Qbqf4D?*UWn7mn6yFz)@qiqric?I*w)~{jLLC-eikC={GC{oz{B< zf5(2DehsOEc3jdgBwC;bxeu3C)8EZ3CV!1(v-E%NKGpl^LLT)3;$+fYwAUHe7CGF^ z;gDuT;QJ(~^>cI1E=N&?R{-~K{Ik(dHn>jj4~o#TEB&Xe^i+b0{Zw2#k%M!Q9pXZ> zWO3B3dm+1z*ACD=ybJOF2E_x(^z$A%@RDRoWQ@`I0^H$uw_HiG^kp@o9m#8*iF=xM zgB{KxZm3Su4*R)poOam9eTCZLJnkE%@8h0aI&ZUduQlE#nVaP@cP=_JSIgB>d>=|G zv=&h1MKpgByVx=Y4eUv45v^x+ave@w`KU`>YR0wutwNbqf>|c$Np%MD8#~@7M5lF3 zvga+HQF><$n`Y&iu{2$@q#^xCvk$r4TzjLy*#M#}Iq({LZ$Rq^r*2`4HT$#DEMMfV zPP0G#@}L?v=V1J6SgVl!8SbG}32ePU87yAzPP%xxS%u<&HM-mp?Q+rWJ3JO4Fc+Yf z6@}~rTx4JOppgx9XU zr!k*;bLnkiRl>#0ZDB|2N%vt{CS>Ex%BdwxPsXNU^rF(+rd!dcJJIb0o@2PEb%d&8 zzolcs=~tZT*XTmY=vnQypkK}Bz&rSKj%_RHXycpyhqdS7v{z}r5h>W{H~Nh(y2QlM z5m7yFE6nNxrk+I;^ZU4}sS0zd7je^xFG1VQ*aW=~`xN`BocEJcY;!#sul1>C;rhkg z5@_uCfeTUWXZ-r5x4SCoC{Rf<{e6$VRUdPt45JH8O>c1FQ13~t&B%a7=3Kcrs{;F^ z_(Z-hQM`4N4AR|r4TrINTeZ9uyR9r_)}WPG$eb1AD(?d6j+u1(zhAoZYVzbtcU^!Q zYp!tL6f##8pf!UTB|AZ@S4VDp3yq2}f1^gmTHp@Ma~Pz`WyY3}v9`d)JJ613CfX6* zc^%G{{kg3dV^XswjHWzCv1n+Nj2GtP;B|}5b<0{jY1|qznhVrZ zv}1lL{sI?e zTC!KjMdl{L_!>qT++k9@8p#41V18IT?3d!GV4?4p>7}n2svIy5ZuA>3Vdf~ZZhIM# zBOZfyywfLY1$9PqQEAF}xy5h1gXjB8_iywY`;8a1V?Ie=z;zDpI#o-0=>TIp$*y_w z0Ar5H=(B@bN>8d`3|jBlG-D}^7tQ%$Gcp}_a?*EF0X9rG=Y+A~bO%_X1#Fa(-s0V; zO{li1O!A6M(>Wj$K{0*=H?nWXY$cb z_icU__Yd&C&7i}GPz&u5&`FjPh|7FR~V{4ah}H-qpK}-D+u~3^gzP zzShaJ)ho>T(@WkheYxdam!&YlcRZ<1rK>~(0I_AZv9p@1F~2&g z^q8@wNR>D%pjMettV$#_ScTZXY%f96?>Oya6N|CF&@$G?F4=DMorm`SI6Fo%=V0&- z(l)2<_&gNLDzkA2w;QHu1HKIxpi<$Sth@f=$(T@jDE3Dz4nJyX^p*6b|G+IUe$&1S z2U+@;crO6S24&fjQhzQgs9J9`WIVulhebm9Zkms5I7Ju;K*t@KMJ z`_jK`%PZLzPsTdZPqyVDx=8vCX;+@sGf(TE)cU3w*Lt1e%`8?g!zfg`h#6|f6D1b@ z5D@+!IryneQXFm0)33KR__iL|q~>ltvM9Dw>-4wfrJr%NJ?c#&L)vGvEVoWH) z|Lsr{m-0G^=F|t8p?O5JWzj$)kQpg7%LE?G)^jTt(r1=--8RDLk)GMlw;V7U{uspw z{9yy<9)QxW+y6jH&orKS9#RY`&VN+K;)3p?Nbx*e6hd>zyEvgtK2~w0dvFuhDF~kh zv&L&ASncLST0fq(mRl>NU6o)p=u|VVtzPJKgx#RLCo)5lH}BiLdH-0_o&GBx>B}DV zui2ws(tnI{MWm1{H{P@FdH&!DW3DV{TY|zNG-_x>qYRy?c-#Y5wtQ!b3xy?o+OoE& zB85v9*YlYeH?DX@B3A0eR4rqc?`p=_*4v<1#cOf!N|TIu8!7CB;<8TIRF?ipTP0Z% z{};C;{*5g@5Ib@6lGJp**UHyKvxc;0t8CU3Xh*CYZ`IQs?}ky@5kFtIs5#~=Jilz# z$%0uvy|g?mJ&5OZGW;FS#Aol{yo(n5X!qWhA5W_1p;c<^Y&!L`R*LuHX3LSa(ighP zvqp;V#ydmeN#lq*sx4pIl`QwY*yfKXV;^q&8~)6fJ^TCs@3=s_K}SzdjU5|>_JVp+ zjrB$3{20Ig_VWb!>)aFJfo{N`o0ek3QkK^2h_Bj!}`f0N)gY-bMT03w! zHy=-w&~61@BrW_9Z@8eNX~xtaW_F#7KFZWg_wrJv|E?XmMbalDVbk=G{;l=?m3^D$ zPMo(>t5Ht(vI*TsR-w(*a-XG^`wVY6b)9x(?d{97BWu)Xq6MEV7zMQ}$oD8L3sq549t=#H{<((*Ljm|BQQwS+@tEZ5(Z*T*$Xk>dd$nuH$3S z-kaISC0jii%QIU7>HY1vR>i#%w7tR6k-2+BPsV6t+$Ak{d+PMke|6HPe`BvlH_KtO zG3!c(lH{R1XjdIO`_LYg_EBOCIA;O)I3!C!&K{Q0T`1dL4uk=WMwzuv?IHP^u5x*i zZfqHp7?t@q%7=`e^iH!CS9}F1BSivQPcBL?Bl-GQe>c{Vex0{Rs0VMQv{1%=gzLlD z@69S_#S;4^HA!L5mom}R9qG6;7vWj!EcvOK+pLpL8yOTHC_{S2n~%`$kV|ZUw@XC0 ziKPCn5s}rgX5|DunW&$jjxhR+JtQyo8&fjU0+$oTgRGlt<0hTM=#>&J3h2DAidW6uhx6W{pVJA2abyhIh5Ee7qazPti}ENL);M8 zzFi#mDR7h8+H7iC7jM>$ca` z8u%STxaH+;L%TOCWL%_~Gi78^*roq^+$@l>%tpDRrZURyd+op|=c+=pKsL(5CS_na zHy9ZAVTOzO9UoYKuX5T<&RxRnc-*|l&x?=tjD9@(?QsVY@q}XJ2|4PuT7ORKg}AaO zGvr}+YmI};x$OXMRXP@*LhK)?BOxNTEVh>{c5Q(DVzBLMdi&tB_O!EtNUm^97nUrJ znt5zJpMQ-i+{nU(3h7AQy67f8F&V*gHF zC~8IodI+bJoNr|b^!#c*+%;6?No+kXjro=AMweL$MpcnnAx}42 zgGN;$$`AH|rI6ldRN*CFm0+$9>3y+~fouHW(&a{f(=zODM_*0X`#nnb7$LI~P#1|h zXgbxyZ_{uom!0;q&s9)79{0rY23k zH1?QP!D^f*`hBe>W_eIgs;ARI-aFBvKkArN@Ehef2+j^wZ^CU=>tLvL(%pGi$c08_0sr{|EXHiiXww9psiF4LbwyJA%cwQF zQfIOEdH#=bWl=zXSBhUuJ7xCa^fh#F`Q6yNToY&&2d|jMxpuQ0LJ{+4C>`Pm&FKF4 z$$ehY_=5POL9fB`jZFVm;rvi+xB-j%Mq(2prdF{DR%*A(u&I(r zO^V~?vUG9-^`%^!sY=wb_=A{Id>a`&A)~P>fEPB*kzp(8HF3VtlPc0%h%f}WK2#(O zt3vv_cyh*3jk*jNmp7r2*-W!M#Mbl05Axi(auK_EDh+!&j#WMt$IH&lAR=90KK`Iu zM<{gzspstRMW9|(lXQeqXzHCw)z~x1N>Yi|vq)c;WNrU7_J}-!SrteXW`XK^zQS>u zmBCaGH*2+jf551a<*YkGY%;HqW!sNEY2SUPj@51r`theKtkdEa1dkhOw+Hf!s*t4T z@jN&~F*-9RS1_lTb^goB2!mR9dl?aItJF(q*m_$i^;3MKvfG~BjInIJmH6UiyrFGk z4W-V;*r-UKh20r6%ji0m)HrS>TWppUr2onLT8e+e##|oCT>OuOiD?3sVRLh?vwXG7 zYQN37a+x_1IRKqI!vXz!BtoQbDUR2ob5yumMh3#gaFU3nI4-xXaMyf+s;o_xjW*@% z+>qdOgPl9JI1Wc^YOjzdkXdOMZ4twnl{ZJgmwbivLnE7U##pU)tBric?wqyBY}-`G zWk#i7{L^Mhl0Kf{uPdpA)V8C|Ji}+y1gu|Cs>53XNWUIPRr52a?!&t2uFTI_7<{ks z4zsc#^_J_*fTi=x5)etWnnGvc)oYx!tyvi|qjUt8-|`Z}pW_%|RtC*7y!0`cxrEN> zGh+e0Pkk5HBaYew_c&-qeJA}JGHamgChZ?m!JWiC>2D)HqqRR0QLb4Q+}m!}2FZ3b z$66O;OHU-V(Ozrzy@Pc70}*cNLAB6~hS0=U%`xW$@SsaRp42)R>%p^u*4oZ3Y*-7L zV(Vv4&Y<&yEdghjP*1AUsVXQqHd}N+D}CCkKJ>50jY+(7?L~b6Pg)@}b}fFK^%nJk zJAWkT$2gg0$#!TEWi2Uj15#()Jmm9@&7-sLIj}2$k^0ng+KIu>cl}}xXAS0M6d`t? zvH7ZO1h(BO{!)rf>D>C%+I}?pYMkHSNk7SNCQIR=AXGREc?O3K{&pV!|KE?#pCjbv z0IXO9kAmsY}J}Xej z$?*%|&#}I9Y(Nf%_%Wf7lY=Pze!tHLeqT;b4g!axA3sr6005V>aLTf4a)hy?#!44n znmZ%7pdxQhXu-(QV&ftJI3ECR#Gf&{_SDaezd$L2x%pSlzIsdn+%V0lOg*~#`ZEAd zgVXWik^1_{lPu6{IsHQ)%)ey$a)8B4 zmR7^UIso`=1DpxxoE?Vc03}muo5r16be0UoQ_piU1jc+Y8pgn>PynBSu`m@D!D&zk zH^J#}8C(a`;0#y;pM~jA1ZP4F&H@F_hA^B1<6to?fl^os8pNR)&V{eT6u2aVnx2PP zF+9Z1hl}B2c!*sLZ!`S+9y`W9Vh{bV-T4p%2_9l&;1ak3F#SjDBPKu(YlAlU7Tf}B z;V7$tqgj~Wr7w&bfe6foFnq)=&ic^8uY#nb&89#+u5(=^>_p2H${(oD?g__YwOhJWRfC!$a&l7WBKI!S~=1 z>+5>!jpcdN@(*fytNk&?Iw$r|9p6&N=dRPntk5sP4`4BT767&YW8Y-^+3rEPl*3gZ z!v!!NCO{QTg#Uuga3M^BIdC;>g0Dd}Tnv+;5+ZO5+zQ2T4_pMd!&X=icR&f~@C~>N zu(lQOZJ0^%9-+UN!}s9_a0U1w2d)GGav=}$Apobq2oNDiSVzJrFySju3|ru*AVG*y zmcV&%K5TY4>}0vHf-tPKFnj@K!AQ6fzDl_6gZtqDN`D*tH{1ycxEl;; zBMgI6ei6PzDG}ej4!*~sokFp$_#ex21AH021~R~O+h8AdmMv8k4EQ96H1nb~hXoc^0D z;k(A4Ki)ileE19PVeo~W38CoBQBqNO+_{gQ9X@~j#G*6j-m~TGtO(1(qoi=rnJZS_ zc>ehC*PO-fTmtLZN}wSmX+hIvS2~c zne*n&3(qSmDmruA#G2YEQ>H6d%(-gL0?MMMCVc+*vnB*Xqn+Y}FnNfZVuf5X2r?DKlZXo? zx0B^W_>i3}C&ItjrEnSii~WmDqrd3;_nZhHu#@FPm=4pSl>Vac(>M_hvXkXRc#oYd zC&E9Ow^InBz$bP8WFoxFyq!Xj;W5n^l*_wJgkI+D6oL%KHPgXxx#Qz;dYK4m=Is=M zWN=+EC~XG9eQ74bJIvcD1R0#d{=U-j*&**R5mL^L7eB z+_7i5(w4jYJWdZ2;UCP~DFjjADl2ZqkksycFt!MPXWmXBNOt_}uga|NzcUg3#=M}n^~P>dMzS0=*S%-bmh$)uY-2*(`f`)cyN%|v*M zc{_z58C>4JxlZ_7OoVwb5B|dN@27Pl9ALQ0I>0`?6CnzJW`AZ;`1DSM8d~?&z?%$x z{4e^3e%YbJy+!yFJ6TSIKeChML|91cTKxNIoe2NKPL>nl_v~aj5#C_Kx%%V4ywZs9 zIy+fTga&AU-!c6AX`KkaWf|9)^_2<#WIhpo!%mhH;n(bBIT50m>=$er{YBru=R|m!oh)~9<@=MlR_J0U z%Zbp*yq!W2Zz;knw3CVOBJ*|%LA+A&u;qg=zQ{!AVBSt4$ndzD2I1;pBJ5?}P9cal zu500QgD_!i5%w@|rx3)A>$*Yduh074!$jE4yq!W21#X}eE3(qLbFlrpnFvYd?G%F8 zG2QQ#SzjD-BP5v!FEDSX5X6n+`2H7|2)mfKQwVbW^c=d1-n*CxJDImr2r?AcO~aIL zCllf4%-bmh8H$UCG!Mb}b0)&`%-bmh84i~_{PXnnJQLwL=Is=MxYK0&R}cDrj*0Lr z^L7eBveRe2*0}sU^jRjt4(9C?f@D&A`PRBZcQ6rt#=Mj^8YjYk zvy;f?(|b%1Yx-@AiL# ziSTvi?G%FW*qdFcZUY6jxV~+CUuPnGjd?qTAa+cz_w8AsUt=PCm3cdbAYM4U!@kNy z_zLrO3PHTnd4+z3iSQuvb_zkfQeoKEA^09-B7B*7JB1*_;mQu*1{hm}2bi~02$G!! zzwQ`>$Byv;6XAa5?G%F8F|*&=pl^iU&qTP7c{_z5**M}JIP4hrF%iDRyq!W2JLd7< zI$&%OzR0|tLXZrOJ5PY`i%f)e=Is=MWN>-=?sCH0nFwEC-cBLNPz-lFsk32UU?SYh zyq!Xj?D$?^h821*6CuHdIzCrnxO>(*zCXc4xQBT=g&>)dw0V{)1HXrfU@~u~5QN7y zU1>6@vwbELp^bSvg&>*u_Y6v#fpA|N6Tx8KP9ezP6bdAUVBv8LCc@p!+bIOWc=ryI z+Ro<-3L$Ke;M9`VHQwZXP>q|rMU@V=9 z5NF;_A;@4{_j%&MSaBwT#=M4h6xR@}u2-}#qQwWm5 zbt2z3Cc;+c?G%D|WB9TM=B-SG+nKjh2*Pna=#h4CF1IrgwlHs}5M*$Q%=cGZehl5h zM7WK4JB1*bv_pMg%?i7XiLjY@JB1(_3}4GinF+Ujo0$mz#k`$D5Ibh({dJc=6N<4# zxRrT3g&;ikH?mT>F=YI=G7)ZJ-cBJ1kNc1-O(u1=?-nM)Cg$xFf@H_fe0|g9=b@XJ z2(8T9DFn%+9^Usb!CILJEzH{~1X18y$HC&p-@-(QF>j|3Boq7FSt&E&wlBs+P?@(= z2x7+^{Ql065S59rk$F3XAlW#+I|M@pzLANrfq6THAep#>ecu}tvVnX@!aC;d6oS~Xzn_)P4t2lRF%i}>Z>JC>6Z;2Q zDKp`=Z!HsH4fA#iLF|}A-;WInTf;EtYY3yA&5J*+yA4iFNCaOBHYNl zok9?I`r-Uf5adQC!b;}t6oL$werWhgCc+Bl?G%CxO_Lq+W9NGX6X6Et?G%D!r}X}M zlEQCbB3#eBokEaI>YogQ$&PV76X81M?G%F8G5PzaPRi_X{JM^b@Hyt~6oM%5lt;Ru zm@u{o*D`OX5X37LhHW2$?^-586Z3WoL59OMG`xw4u$*~2g&;%I3=Mgj!j>};mN9Rq z5M*e|;X;-%5w2n0P9ex}DHV8T5Y}s$2uqo_QwTB?*UtvwuwyJ`A}nFvP9caL^LXza z1YN>JSj@bgLXhL(;IL<{_hKf(BIfNBf}9wa9b*v_p^HWvOBVIovAZ>JE%E0uRxB@>~7c{_z5-suL1b^yi};VS0s z6oR-@y*LDi8+sKJp`3X;g&^+Ow!hQy*&+BYXClmE-cBKiJGQsK%L<>xL?~n4P9aDp z{Y%5(vSXAn5w2w3P9caLQ-OU>s!W*McO?_y3g+z;g1BQ3=YN?XS1=JSXWmXBNGAO+ zhQ-C>T+T$8$-JFHkPNO9`DQW^W-xE35M(HZUk-zH1`|PH!#EBZCZ$I>6QPuOJB1(~ zX}s_N#ui~Z^L7eBhD$j#d^!_h8uNAvK@|9vN4lYyFt!MnF>j|3M1fa4Qx3&;857}B z=Is=M3{5j!$fZn#sm$9c1j$bM>adtFwg{InZ>JC>8&~FQzst`njs3!MTv{`p!TG`$oG$@N9R+jev7ur1O1_<2x6|!nqKJQ{Zek7tVknK|TXx;9Ll} zVttnUd2lWiz^QN=eTf!)6coX^fENWF@4>r^j`tsbG68=f^>}gqT^QmP006Hk%X8&{ zzX^+XKAr;n>LfRQ5diQma{NE?6aIInALYsi!#^pGPa6;O!i(4KvV<)EXaE=k0H*=~ z{`k>n0AMWO9Zx`gce<;LXW+F>08j(~X9B=k0B|+{;FTeG1;=lRd`|MerUSbGDk z*sx*U29RTGZ&fV!r6vu4kqS2@2Pz5G=~QK+L=UF9N-H#-7#h=Se~mC?%i6$_!RskXAF zes*modKX0NW-pjOYcA9^MQaz#i(;yZ%E+wxx#+8_oxQMbRvnh8qB7$CEMKr-Zsn}` z79jJru&#FYd@R{)Drj}(BB*O>Tu@tKy_#z37ZASs`IR;GlyBt%D&+z!!&P$^EUavb z&Z@0M)C;1O^D`e9vaoV)2(DkX?xyQkSTBw$^Kpai<+vznHZFIN9hsN^rj>Bh$|fYS zn^yAlH?6clSV;O~<%i!ClRQrKtk@gZ#Wq~O!g|@YTC--wTC57adElxQtJhl%go)-X*?7yE>(;G?*xD7F z)~~o;U2#Kr{ED?V+_Z9hc%%9`bp@4U<1K5|&ut3xv2@-><-8jd-tgh`Hjc0YR;;~& zhuHy{u5!h?Va3X(>(;GXz2b9g?RYn>Rc-I86`O4DMs>qYYaLv?TK}iAGXamPI^+KT zoJ^LPBoH7hD(J98cF0T;5|C9EQIJJNQPB{R2?-=KAu|!8sHnK0XkBPU#jWlY>qgbO zR8(xyYTc+yMMaBBl`2-OyL`|8yzeB3)b{(n`#kW=|Ge*6?z!(hcbR+7P1|Z>wN)(* zZ88~ah*h_#=BoJOSlUyzUs|z=ZiA*1QqA>lCDXb?%Or%V8q((a+Vo$phth&8n*KW$ zuMt@vKdq{vz9vi+)>xFDlkM&GiEia|5!|@xzjd>Q6K%bvDQSo1*s_-T=2$Yc-!>W+ z_BJPmg=N#$#}|hYPBe$nRMnh}HFE=3FAXP7i#69aB$ngo*;D4toO&!~*2h~`glEK> z54!6XY#uLlq;il$9Q@E(6FViFz!U)&bh7k_;mxhE- zt7>R*C24ffHetd9=4ju{;c$IC68J=xQHiEl zT#D*fl^lTOmD_?fJ^s|E%@rQ;SzHy*+QgpUK$|{X$q!RE<#oP=A)wKZMZ8A))XPitvz; zA&k^8s7^GshEuIgv2amM2z80&;Z!1A+Z>Cf6DNe+_+43D)lgmOf`3f7h^d@HaIEYU z<1se92We5`5nj16jPRj{avte%=sOPKQ^PnJVVr_iG$Ic0N(wWk9y4p|%=EV3KN56b zg_e!<{srB+P#0SPi3?1aFafg@P07CD>9P*hb+PKD($a8I61ulS264F2TSIJlRdc*P zzIaSnk7D8Gn4ZLi#E%&UjCZ_l$TCXb^xX;AZ-r!jHrQI0-;CfF=OT0h|lqLIA%2 za1DT40q{E%j{tZYz>5I31NaEQUI0Jx9-sk&1}HE<9|H_Dz;FYU7+{hCW*OjE11vB= zjREQnkTAe<1Dt7q^Z6MJ16*N%8w_y20r<7eZ3ftBfUgaZX@NWo9AJR~7AUsBWDCr- zz^N9fvOt{$nk>+2fwTBoYztgzfejY8!vepxz@rv;+5#_G;BOXq&jPzGu-5{C3?MfH z=$ru@kOB0~01o91&YxMlV-!z0IK28N9Ubiw())S*@1-q%Sh8;NwsV^B^7>R=q9vtK z@^dB0;X2${pG@-5$u_3jP@8BDr|RmH;eqLtwu0Sc^ltf?{5-8{&%57AR(rnm@-z9R zkJ?M<&}aLX;rDM*a-dt|`gph~8J06xmslSU*VNb6#+qYs9(x*M;Z$8!Tn^m-m!-BU zRn@Tn(TxK@bG)iSP8Ej_k0-)a)jV^MV4N+#p?0hQOw?y zWB31Fn151BD$!V#s;{nUXlM;Dj>TimRlLS(tXdii%a}AKT$A95U#zA+#S?aQg|ZoN~wF)vaTAityhScS@6}m6&KdHwf1@ zCmJPBED&7!D6C8YpKHi+CQv5NL>LH+coPa}}P0B;pON;i`s) z#B%Mt`gn@hS#`W9a3%iiO1Sa2t|}Q`-ke~7wl>8^ga^ur&_FHJ-9!mjH7{=Ag?Q2p zMsoQau8P;RUD>$IUenytR#ZzeRuf*-`X4Kq92jnnahOac!fiLm(&50?bu4lJrDLBZ z2ePJQSk_=zcu`9#eM+8gGY^}3&5aKE_0+EIxXkYGqwPNzZ?9|)%W+sni4F&j|I8`N z{#mM9nt2RtXqBGV!%q9=m&;DSEIrZ z$N<9GKnZ`i?XX1nBd#v|o4@(`3qQyAzm^g&KmX?Mmj1$X+5feadHMan)644gAOB@3 z_wxIHrh{B{nA{LCBnu5fL%bpgtpb z-=hKhd6h)>ciUg3bLh>4j%)W{7ycg2ZN%U6xs>uc<4hI$dp{Tcj_q|V){ZcEc_iHL z;mptH0{9F-`Zw$JDf*T(0e{8fO{} zu-;0&?2mN4i#pVccYy(3hq62te_Drn2Yf8g6{MGR|2220cV@!4Ye{w?uP@W}a(`jD z>GhcSG4MmWFntz*3-=4JIY=c8KTPh*1FIL?Dw6hbQiH5={mV2b^+I? zGkImuzir#Hp54HXA@Ym`uQ6FKpS@t){PK48Fu0u$UFedox8vfc2k^yy&qrnKXJz?* z4bK8_$@{02;LZsQ`8a+U@*|*u+d=o!aNoo&`Lw`A-3`IlI05^udhx zBlx^lqdvzX+r{raHY0=;EU%l~qo6;(pjgojxI^<_31Dm?TdMCzF|xs3EZyhZw;{HD9OP7%P~M< zmvsIBx)~tP)4h4m#M6fw;PRnz&xGqUfqD?YBB@VcJzZEg{{`H=l$j%B9Hl+U`ip=M z)&C3w^!CbMZGc{$UTc6mivfP4kNL0VKH%AJ0bh@ReR6^TMq@EQQg@Bn+F5@xE=ldB?GzWo8DPn{{}GJ0((l}wiEp) z&`w){^v6*asF(uuFj5}x3x&P*F0sJ+SwODZ&$hs=vw_c4ud~3e1wh%)wkIEVTVR+} z>EdgX1-4bny)d?Cs|6lk*uH*mTHxhIxN(ej-e;QF1h=11|C{acH1|DznqJ~9;O;}U zFClc#0EV{>8`(IB=T>bFA$Py(D9=7H131Cc%v3$^05*DhZU*qMr&;&2o<1c5c+Jz*8NdgguFnAWc)BSA_|enLd4Gyw8 zmI&ee44}7Xza#?~=IJXkfWth!J_DHH=^HbEd7i#KLt;&q5bntU7J2qf89?0Ak8yjn zg>eW^X8>n<_UAHyD?I&j2JmZ7zmWml@9B3lfG0ftVFvJ$r*~%n?|S;n4B#_Qf0qH| zv>i6GVFEyRPv-=H13le202F(=M*yhsbf19STa_gn{R6^#+tU{ZfQLNIZTXa^*9U;Vdiury@Sdk{4*)woeNO=R%F~;;?b0X5$i`y< zAluVV2Y_y#el7qU?CF;SK#`~42mm8J%~%=Z=???I6i@FC0JA;)WdJzd)87T)&L3n6 z!LaS=F&ZHkYYRR9&Y3{Hr+Z`qOFi8u6FA$`12W}&BwhZ{OkkB)el!!FP}2*PdRI3H-*>%QAucJiQ_l*y8E4 zGl6$KeL*I$*VC6~0$tj!i?gvV6PWF3#%j22e-7c-nZOC2{VuMbXTL8KNO|^$xjvr# z5A1Kx{%j`j3s1km{`CA`WBqOM8N%N(fh#=!_t_tw-jxYF?CH-lfj@Zq-==Vk#vdb(>C(3uxHZpp?0SwL@3hqHhRPY=ujrg?fq7O=q6Wm!PV(_^!M zRi2)l1+4S*QCYy%o}QZpT<7WeS-|a{uFL{{=jqxk;9*ZUW&wZpbc*$R{e4Cju-Vh+ zW&!Ve{%f*;uRVQv7Vxd7ug(I#_w)@}K%niyD;u|E0X;muF$*}z(+_3=VNXAr1@!au zQ(69XWj3~E0RuhzOIg5BPrsf84EOXqS-?n7@63XCPbeFoa(jCAe`NvVJpFAJFvHWl zBs$U4+1Wsqr#oc>^`7pY4K#bYcQ$akr~79EXL))^HgLYDBfPKW>56Q4_mQ$OAsblZ z*{3m<+xGtuj?M;d_Uy-H%WshB_&zCHey>dHh1tMup8w)(;2uxMvw=;XZee~;ugnG} zdi9@|4LtAJFU|&5d3NsW+dcdGY+$ozzme8xt`47wiF81t)fF*cq5h#X*%XP=n^+~n!G zIl#M~K0XIHv~BwvoSXy1J-sl;j}L=b4sbx*_BU9P<8L2>rW_#Y*;{ge7d(A>4)Cp~ z&&~lZ^ww{64)DCE*W>{I^z<)sfaz`VX7I}#;8ss_?0&}6H?x1*w!gt0IlwAU-;)E} z=;;S@fO|as`y61Gr=QFLe)ROSIlye*FmsD>WB-YsekBL^m8ajx0q*zoJ2}9=J^l9_ z;4r@Iq~-mC?e+BMIlwiZ{wfE!#nU`C+~a8z1RnNub`bc3r}KlrpFQ0z2z=n_1A@TU zo<1Z9Wb=lewy!7%boVrm4TC++-vGvYn)lRad75K?i>D_CfuHz-l$L*F5Xj=oQmSVM zfv~6N1%XbUJ~;^V@HCGVgFL-B2o!s|F$lcFn^#(XG63f5~;hz3o5UBC= zW9&~)KNSQn@bsU8z}239F$mo0>DPk5?>+ri5O~qk?*)PPJ^f)2_{!6t27w@7Skv|U zA_(;H^w&Wk;^`lQz*J9Xgn$!09Si}Dp6(n1&ha#l4ZrmCK_TESPxlQ0Pk5Tgj#oTA zJOq5`X&x)S_4Mcvkk6OzbbWZQzptmKhJZ3p&jG}|GiKi1>Ur)D$fEzu12G`%y=Y)UJQSJQ^%LP`Ix9f&n;Bn91oC{p!*;{jg z&pmy1E>OiE)!brmK`!v#xORPMF0hV2TDZkvT`us7r?1NehD>O;|2h|FnB1=K$_0Mo z>HBhlwVr-B7uewGKjZ?ZdivR1U;rPibc?|Yxxf#e{k2?Ruc!Z(3v~1R-_Hd;4ABGJ+{5P5qUrkfAn#SL0KNKsqObtgRyzQZck6n1NM6Qs5~Ig%Re^{cx`@rdGqst ziJq>^10Fx2-Cmmq+~nCCS-+=Kc|hrj?fz%v0Zn}1)h!0+<^k7w_BDCHW1hY|5BQs> zug(MZc>0Dspu{Whwmjfm&%QAa*y-6H%mZHW^rLyepFI6k9`J;xx8?y4dite2;B8O8 zo(HTyxqW@!$ph~9^v*osLr;I22V^a1_y1QO(AU%7<^e}}nm<4;@-)xorhDae$_K9S z>^!&o?9}%1d*=fmdb)o;@NZ8K$p?P&bR-|hs%+0+kq>n8^n`q%m#3%Y0~7hd?3fu_4z;^e=Jr1rhK5l)64ULNuE9{AK2>Y^SS2BJ}}19*X9Fe1jos=fdCdCw7wG(s+s7 z1^?PNql2E;!GA#~VAoQ(-(6YW;!Z$#8L-UF!(eb)CtzKP{02z-d7XgGCGvYG^%Wh; zTTlOG?k7rTzoSF_zv~3Nkd){0ng5wiz)&ik)_@6JG~85pDG5AF=CU)ElKd1s(^61YI^Q#%7YBJw;x%R82;jsLKkkIYdW;=md?P&1AvEeWc@d?{4T)1 zw7!Qs1II;xHLCyE8CZJ?@R{nDIsQMfNo#ppZz6Zg0_^dN9rv>;ZQ|kLc z?SX*Ua|-tFzXJ+@nz;PF&i)w0mGIW5xPvY$0N(5>zp2uHYKQWU>EM522VK=cFX^D0 z3V@Y`aL?Va{M8-omv+$WI_T><=$om#1M{r($8QUO@G0{A6w7~9{do%31^IZk0GQts zINXT;O9iq&%KnytH<;hsUw0J1%{!8|?=FzoOY0vCfDOHXNxJ>`tU-EV)t&XX@$~-8 zXDfE}YLC}`9sGxM0qPC_4%hO^JJ`o{&{Mhq+XuDx=ll-!E$W~fI_MQ0$~(IYFs!(J ze_Y$aetidhYX^N-2mL@7VC_JF59D%tJW2Z?;BwWkcLDN>W$qW+-|qq}91Qmy4)s@E zfH|IhUl(A|5P80a_O4xl)kEZY1?s_FfnG!5p2MM@&~~py#@A_Gfo;QpJGK7#U4fOu zfr#oQU4i?C1J|iOqbsm#gv?*V@-FELtoQWQ^!N0wU4gBhexNI`!_%9)0^f{~=LK2b z%UyxOk?neWSD@I_|L6+L9NAv~H(h}m&z{{4STz#3MBCe|8?dd|Juc|VAJBF$NY;Ny z2Oa64M|T4zt^``Oys6Z4IMvI1a8;z zKko*FE8F`!qY!vJA@dHg{%(c9t&4#JbbJ`VNsM%1dBZ#CvO-{U9o%zE%ztztF!M0D z-?6CYckr+5plezGO5inZUrQlSaR%^9)#n!iFP|avBeA?+76Qe5mRs$2btv!t4*C(U z&*AOIzdscM+dci)LZEOm@PL;0ULmk`GQd+N*7pzUslZpNzbKSvA=BgO_l3Zmsq$PV z{qws6o2SY9bJT})2MVUQ@Bbsa1FNUYyKc0P?Jm#4rOP{_I}n%wT&eLfuRAd47+`^p z?={_lVaK<+9v0eDTf|EJx7IVS=Ys=sf$cPjgn?EzeLQhWV{J%HUO0pF?rAw7W2eCAJ&Kf`(e zGf#ngPSLGDbwb`{q&}kUUaXXVbPr(VsQ@pLX+NpQ{>S&)9>A7U0bbJ3p6UUNtptu# zy@u`c^oAb5x)|JZmGs}(19&{v?!UPQkW&ly+#>CN>jA8-1%9XHebED$vKZhc4ehyY z_kyLpeR=|8mjH8h{i8jBZA&>ei2vlC!1e^(bCt}0d{1EKvi9RatS2xi)qeh#>Iv*Q zL&h8WU)U4KSqbnK3-yMc`}YUjyIvzwRf|ScqqQ~FToq3?RHb74J6_dDHb?kh6s@g% zp`kh@e=JU<5@>C0l7uFesj5W{%;R37MQdv^l}I`?RX4S|jLB4UOLa=BZECKM>z|x{ z!o8_47MaPRwN>9A+)`OI`0()+HKhDy!?N znpuN;m9H|rRxNJMk=pv^WU4ZiL_?KOUb~CMYuxl1Y^cl64y;@pOI60%MtL2NNj3HD zl`gMORo7J};%@p3b#H2pomQV{NwTTZB+g_qYu?OCx0Tzg<6D(F4~jH_J(jMhIhK^S zw?`Da7h)=7E1Ig}HIjzfmWBp~$%qIlX=$#EHPkoO$NA!5Y#CfdmDP!scuHOdZ@1R8 zG$kWHml%~q7aNsqS|z(9)(o~PRx={X8A0@|^7>@`qWXsVRBL;hy!0ZPZ*ohk_!f)I zZo=0&`M!3O{N?&yCUD^PDNGTC1B`T#vC3{q|M_u+&DqJCD>L5i$T^VIs zgp?ZEEAV9si;gUDwB%Jq=qudK1wo-(hO4HD5*$0XOv_gCHY24DWf#I z)G$i&l}jn*Qf9g2E0+eAOPS@8y+T|h^db_65edymg?Ls-VG@xM3CW1WQAC0=s=*?G z8kLxdYRpJXMl~iSaw8JD5sBT11aDO0Fe(8Um2iwo5Jx45qY|-EiRFlfvFsBO*>R#0 zqfv>`sDxZp0x%kNYa5l2i%LvHCFY_MFHwoCs6(7nMkiO1MQO+@cb0QHist z1a(wGBP#I{m3WCtEJY>iq7rpciMptSTU3HCD)AYW$cjqPMkSV_5?N7+vvRlfWphU* z0;3XTQHipsL|Ig#EGmH*mGFv6Kt(0Iq7rOT3B;%bVpIYuD&ZBCV2erwMkNBH5@k_| ztEfa-RKhDNp%--xbnE6;-mRWn9k<$Uja-vln_W{~V7Z35t?MdwZE>}^N?aAL1Iiio zE|Oj3%Gl*X+C{4iOBZo2&}4X&VNu3D8Tw?blfg~KHW}JvNRtswMlu=5WE_)WEaHMF z;^IUGCmEY$Xp)gh1|}JhWOR~IDdIM>3{4R?(8$OVanU1#jf_K4wrxkY}8yoMU9E z3zkwhsFk{yDRtvqsq4>D*Tbc*hf7`Gmb$(zb>UO$;-}0FEoJWLSLP0WWp0!ybE8X{ zJLHwQ!(gc!-^yLjm%BbJcYR*&#*A{;d*!Z&%iUO1?uL|d*SF=a|I6K|RPIKca@X_a zZtIl0;ilY;Qsr*DjCT8Nq}c5Nqur`Tid|bq%TA%esWB%5cti%xh#d4HC9W-z5(&Z* z*UCtVYg(klwJlQOHeRH}ZOKT9+uV^77Xgt{cNmD2x*R>)}X+ zbWerb0+9+?=?WK-kqQ^EkqTLr3KzfOla8!=i z(Wr~wXw_5*K&T5*Nl%36yAw3+-r$+mE6pF5IFe zZtskixKoN~i5q32CGHprHpwU)we%VR}YHdHLO+uh5moSpqr7Ol2~bs^lB_?KSE9@XktKndm?+E;tuLb!By; zQCk*^*HqFG>3W=K%UToj)?j}VuOxI0czNb7rDW~gl#%XA&RrKtmH*j@L_Fp@q?RYZ zS+t~(hSRDV^sm?ox%`ri(SDuA2~%88yUSeHWcf?xHDQftP9#$8&91GFS2gfLR~l1U zSCy>O>m^Q2sF!Q*BFkMsxofAUmXzDHu@&{{D|UCe?zUOF*WB7CQ#G;XX2`{TElx}S zQOhD^^HwfvNu**ml{y7i<&m>1oiUkeuC8lF?egaORLo`Igpu{})PDV@w+*!Qtuc+f znwCc067_l$A(Lq8ftR+pGu@J+Fi0VTRduF4Y9Vld?c+s$|`FcT9S49<>hQanxMB2TscjN zru|bJV~w0jPn*#`;g6r9UFQ36QXWa*eGPx}P^Y&a|8DDF=h)VtRIX25soeSfLa5V) z@bCQ!@dh^9JSl;ZOf@H3wY9aJp%C)_;#evcKMhG8pxm7a9o^h?Nt`*9iLys<0;QT* zZM$F!RgzI2udYg=va*^ZR^=jYaM|D5rpj}YD=D3)cU!oBRLKOg&ZrZNw3Us@$`!oX zBMow4!=6gI(l~EpTd{JNL`E-nGsM*;Gp%yZZ?Cq#29=aGZWM29Oq?c-QxDEkRv)jF zY4O}z%g(zvmTIc6L9=v+>nvwzA4}_#mG1scgO1s3fsWa3>|wlf)a1I?*Kpn4;J`j; zYW0WAD$b(JTTilwCS=~&N={HH=`Pac=F~Ely(rO88Bb`6f4fS2+EQBMk|KApI7N); zC5iettI?tw6I#DZZ)=UqRhwvT)M8hpnyac)m9b@QE%cJwa<$ja8)TBTIuTD*)yLgf z&Z%%+Gj-a}{YJ+20>vkN`>nC5s#%XReu$--s~elrRX86xgu3!wn5S1U*4U)?*mxw> zu#>=%QKrQOI=7qKGu?q$4?sMG(cofzKeu%Fx?^ZMuZyJiB<`Zs?zkkuOU>rFQklt-pHwUFOC9!yML#(64g?TE`P??@2uC0jny`e=4s831*+}-ZB{il5m-C?-x z=;_K45w52)fKKawaz45y5i=PyFv8uvSQ#&^ce>6r1o!C1b}|AWC_ zI6q@1@ScH7&$XheMfuDeXE}{Vr3#tLZlfxLy4=svqC| zV|jcpljZT<;^181GwLjhz3P|4_xko36q2y$lLZ8i0Y*^=tb4DK?VF>13)C-0zhi;3 zsDCuLh|IRQEKAzScVAiVZ`J={`X2}P9$z5G;(ewEEIwBM@7160-LV}7*+6g}(3kp0 zgW=>)28WRWi%Hp1&phgV22~_1mN4J(z}3`2i|f_zx9az(`te=T;0eG>w1+G{pq>xx zqTN`0#`NzDy5z`q>X{?;4W-^^P)@?Scg}(*0<+a`p8D0RAKy!&-&r|8@FckRj2J)H zsozHRdqn-7qTk8D->82y*hywv_dX7{!%x&d8TUR-AlIU65H8Mpl6lt6)x-7`Q^R63 z-;-DXOrSOv4P?-|cNbaSdDQz1exd&B>3<4v2j4#lS@#ZL@KoSA+J7>5hs?M5JMCW^ z_nrmw^L+}|mlpzpl|T<_Yu$SiY}a(^pvA0^zeO9+N*)R)SWCca;2So{+;dQbMI_tgnFOBI1(1qa)DqCFo)V&oUDF) z&OFfBy64I1f0p`RNdFkzbK>mB_4LoM?m2F5hb@}_P5SRM*s1yc$$YgyMjo7BFi+ak zhkBpEU=kM5JRrCjn67@a)Nhgc#no>){p#SJFXsBa!Sn))FUTD0o|6r9vF`cTKv#J>5eJ2=ubZ>M@wR0w1Yu;^L{1d1$*$U`lP z$$=Kr3#EN?srMP2Ou{0@{HFsAnm@_(B8zqEe;xH;i`&T|7MtmR2JlDfp%&YyR|0Qq zzE8+u7JJFT);-U{^OmyiK=4f9Fg~v`)M74mCQwbD1uW6@JE+eF?x!xYc$yq&@e|Wm z0Xcl0qsZdm9zgIMU;y<{izqqBVjelrB1ZeUz*4ohk|QiG>;Ytqw77%z^MHHQ&gVFS ztARhN-lqN^GyQzvJMsb`zb6p95D1eO0VU)b;BfL{U?!ihD6&}GQ~JBHr^M?TrVqDx zgMOC)?@$l5IG~rbcW^HtxE2^mJ=9_hIl^L!+K=fa?XIQYr9gxFEhh(AoTGm0Xuk}& zvzOF=FVja^{Eqp{EuNq~0Q^b$qVjX~|5kP20P*Xp?0JBkXZBHDq#UZ8bbyq9B>hHP z%+>T0l&2`qJV4sDTK(71f0V^FTK;2de~SJYz#GcW~FU~!WAEmf{mUaGu7d9QM_a+`9O@&{!>Z>jeX zWrcF4a-lM%yhyo0d7pBN@=fJ#B|k*S^(#~kQjS&5QC9Ym^<1L*IqC@(Z}b5IWft#f z`flYeE?X zg~clRm0Mgy7Ft}Z`F>4Ku((V8ey{nrX!`T&_qvw%uG+s){hivg50P@ZDTf>)^_EeW zTZ|(MEsi=w+PQ%CeFk+TES53-a$q^Nu{e|d{Vgt4{|(gREjE%9EH*Pe0BlvhLtX*= zQ|mn>EcQWR@h>IETa00P1~5hKM>D;@#e7X)sJe;zO5kkGcOf~!;~eaSN)~_TQ&V* zrcbeWlALPsJktZfE9(C-In82^`hQQZ1409&-U8(TWB}-=9Hr?qlqYL?O!ZRba!o&1 z^+n2c1EfE1CnFa33;+U0SUjfor!?P-4^;B<(mFtd*n=u57mF4^57w2FB>A|9y>(JU8cNB(|@gcqw@D;0C-aMpOh~u zUst|I27rI74h$9DmE>HLL#5s!s!Nqe4g~^7SyQeHp?fNQm!n>GDz}#<`{eD4v ziN(#T@1TxY{9g5w)KQC9RKGzz-r^ssKc}8xVMa>5xg({#KB@;&M=VCGo=hFJn5X(= z>QakF)yq|{Rej}1>BkMqhepbFeO&d^%D*sumc=&J?<>Dh{+sq07C)%&RV?l8TP)}2 zV^vS39&NEeb&R^3#Y)xZP?uR;SS)dKh4MO*b6=|8!^Lv`^CVel@h7$KQ2TD`>w)iB zUZuss5g>R2Fdza17Fv{0-w2GSuCh3Sth9(lq}@xYPqkPUk^WsxJ<8%@>WLONQ!lc( zgSx-PpIF{az>7>b7H^S#Exy$9zE%J1sFaf*mGv1ImGa6|Poe!(i=&txv8bgUXOSSM zTePVEFUkHEk1^lPz*DpvixVAnt)lK`alMv%i>BX8_P2OW(_hl`w>A9}mU}B; zOQk(MOJ%$FQ4TMa`v%j&Lj)?3_8F0pt*`L33`vlPgvvG{`J z-T-_{`$CJHGKquEBBt_O&>n0tlom zmRA75JAkt)#P58j7g^lN^gDrjHT@w?|B&go0a>G^eSJm)!MlKR>V(BAa+1Xbqvbx? z4P+mSCz)PnQ8q^Ie;qeQ+J70@V(~axXYnH0&EjqP#Vqmq_=tr)wC}H{oz!*)R zrs?y?Nxez3+G0J^>nz@&eepqWF6d-V}MV_)3+0A0;6dr8-c${|5Ijs4fQ@%Gv?*DyAU10I0GGi)`vD%_)s+4o-R3LDH#nsApG=1+>S+Bm+ zr2Qk6Q>RINM^T?|QA3_<5m%3>US@BfyHCWch&C`_4`S6)^w@o;OWwyBdJ$gES(MnF0@##yiV;m zQ=ey1bEM>}KT`VfLFzRYPm!xF-c$R>wC7lSuIZUaNxp96YKucumyl~L#%uaKO|RDU zr0NURex;^=dz5U4gJwwk`_7Q|^`9x_Mab0_<5V9_j5Vv zfTlmE>2GNI$Ev?qd)CoX-!$cnqosc?pV) z>7&WD7N?NsS}ay3l;Z{pcFy&EzE( zPmoNj2 zx2TQ9dus1`oYd2sTw^hS9BEN;91#2?F#b64Urb(NkyNfbPS$fH{W5{anf?olca($X ziT(I_K;UwV<;ol9Nqvu!BQ2gL*I4{h{rA%E3X87COTYG3&OKhrn@@d(#c7(pN_mUg zx2gRT@;r-9C&+dka)Q)bOkH4cm~sZwM_SCM?rPCMUSV;`2~ywvC&>D3VfvL8uPgtq z`99Thv**k9JecfiQKpxvG{^4u=qiB z)`?PIrxT^T9^@K}gUQtvLzRcoFUMjUSzu9lqO8~HC(3%QVS1g#&E!=U8xPTu&16Sqq*Q6)O9X>nz5oeX??<+D}j}B-dFiKM4r_2{@D5SX^_GwC`@FX9D|F zA8;}d_@%|*lY!t?U?Q0b)M@$(>gRwf$>)LV$v*>k(q3ipIQc7!Elhs_cuVyj*^=iL``7(e%D7Vmlt;JucUkA2nzTM|r%Jhl$%PhU$n_S}X@3)#rS`a{uRT@c{!}1igT*VV-=Tjd@G;RX?fv6V*Kz0)d+>rYTP%ud`?(ud=v! zp|tB3)vqp;a=TQ?_0eqdDvL$rGK;IK#J;l%$hg{K&>|`Cu0?X5{04QCMQ*j!dqB06 zKUnoV@&=1~a+$?ivd&^~jg)gNd4mN%+sb->qx#RP-zA$YJ|dS{92%4Tb8Jl7HHEs5 zMVvg?;xzI=i;H7Y&vWYcs``D(^qVXWsg?XiwbG8;Rd1sHwZ#YIN{d~5CgwovJ^&QB z*&=tbw5J=n%%Y6E$>OBNQeF%7Efx={{^MfV?tf$YVvC-2!dRW8uTcGZo#g*W)AusH z+2Y`O@f%(*?K*;Nwm6Zz(IQFSX0cZJpz<$dv&ByGMhm+{{0>qcyF}_sERpihV)`u> zzad*Jz9!dMgqF&6K@ajQi!j;EqKI5+F3Vg5j zISsPiY8s@Ti^!zKHRLFZ=hgmia*aiHqm0v?$<-F+jZ)7l>OL0h8l{{Esn=L+R{yQ) z|F-&n*(mEfFfPx-j8@Kw1Hlh~xzxtu^thD2p6P!FZqW32)PW1lDmL0g*FTlIfb{Wq)sR`q{F{XbCuZ`FSv{SLCoTqe)!%t?GY{=3k@wX3c+xrr)diA65HvYJW-7-_Z0gHNAT? z5V*^tukx^F+3rV@2U^TwdV$4>f-^U`dPA^FWK#^9Ff| z#ox(uEIuXAw)m2~%wqg$@;uqr(`5Z#rOveYfXueoO*UB+E|>GEd&u8d>{%|`<16X{ zi|iFrZVz&m#n2T%@JnDCxfiG+zXHxB{|#JEehoZI|4S^MC(p5XRm*voyv*Wz@#XXIo4oS6NiI%6c?WXIh-C+{ScX|59IR@iBRc#pmQ@7DcDa`T0ch za*J7~i~ot#S6al#ODr16%Ph_y&#}0iJm2D4@?49@m0QW)7TwN}^uA}v_%`bd**-N) z=XoW0y2aDvRTkf>eINY~vgo=}{ClqyJzMoW>U%62R?4_|9?9p7$fU)MYJW-ncdV5A zmLHSf0AJ9r(js&w5d0P>I8)BYdYmcc7Bl@jpq%MN7Bi^72j;5ZiR2`U7`ejYEZTnn zE+BsdR`B`ZpMaI*KKTYlkn{Ud8-t5TYp_;%xpJLyy>f%{CNjg|Rx)64Cz)y7bIZXj zgZtEPlakLdv;4=E{N@Jr7BbslE16^P0vR-TnG6|hBXbSjB=ZcmlljJdb0gSEo`Vi{ zHrU1V0)yRT7lS=ySA)G|H-m4;LW3VjepHdqGj})c+cnfV)Yc$RS)eRb_9A;2^d_^7 z`-TnM$#0+rdm0QPdl?KPtvqKy|O@EvmVz8MUYOsYIX0TQ5 zFDPFohZ}4oM;N?Gjx_GuF~MSk9n=wnon+Kt7g=Jkn=CchLzWrrB}W;2LzWx-KytD$ zJ|8~XAV7{W?wc>c!;CzqKGvW>(+icol)aT?Efd>>`ga*iBA1*h3y^u$Mf_;2Uy=!4Kq2<398oJlY_@ z`&qLLa>&`n-3JTKF({y(YfwlYW6+B{)}S|eoN@Qbg7XXpP#yU~oCvXt0iq8>}Z21{=sG zgPX`@#(lGs_1sAvGuTKTVQ?Qg&0v%2N62P_$H}C@W-?{4g={g{N}gu$0=eAaWpahV zHnP>=P4aYu?c^B-JIIv=JION*c9CZp>{jj}&oc;8x|GYTroSWN;sOv%x0v*9MO$A17}y*i7DPutm9*yxHId z)i0B`8EhkOH|~Bcxt;nBgB|3Z#@(MKcd7qw@-Blts`rw=G5ChO+u#RsqXBpy_8x-( z`CEe=Wght(g97qigF^B?gI?tQ2ECQM4;*~JU;z1`!64-@@;-xNa+5(R`8$IO@*#t< z9)v@+E^!@fgZ!JpPV#MoUF3Fy-O4@6z2ut)-za}j^269n4=8h#dCCH1p|Y2< zH@V#)ta^Zwb8)h~Vaj4t9Ah#PdDN~xh zLb+18O1WBjk#eo_a^*VZdgTUkyTMK5I|jFs?;6~xWvQ}){J>x=`FDefnm$E2T{%-ZM|qrbzH)(bp_0Gv zu--ayr*XgY1V1!rqW;JrMSg6sLb+18O1WBjk#eo_a^*VZdgTUkm%&Y{Z&lu@+^D=y zxk<_2m)MTSm7A4Ylv|ZAC|_1?Q@*L(uH2#AsobU9O@3&why2K3ucm*a{6Pu+9`&(7 zK$)Y=Qx+%-mA#bw{fp}#CjVjF?_j}C3t2Gm2$Q6A|=01Pk+v%POej~S8h=9TjR9fs^q-q z)EkwY2bp@4@)70ZO3qzO`xfO^RaY6YRWPV5qB0HY?z%e*$fal58=zn=8neM0_5db; zU{5Q(=Nvb|s; z|MUFM^JNNls_Rspsy=n<)TvXaYHn{{5Dx?b;C=#70fi@k$6phWne;UUs$qhgl|F2N zDzP>-)Dvvn5@<+el7s06zB|1J(vP2m8FuH7+gki-xBt@Fv1Ids+A#oWt819^0nE01 z^X>`&u&pWo2&NHKha%?ytQjX-fN}OH;U;KckUfEA?Slax*k?Zx#`vTA4`Dqp(cFJ< zYOno`mk)8SGkWVz_5?k34jks3o4pZc;jYLqEcoZi*bXEu@T~Qo8Aq;n*JK&NmbQ zMif68G#TBWYPXIqWv zErhT%{tZ00nePRFwG-+xJ*i3iD*N5d=y1md2{k>~u9Eo_R;QWyl=5M!D;0Y+A}(7Xk?Up6^$7JpRf0F#r}X9g-4=IzGkv9LCC@2!26BJW+q^`VM0JY?w6IFjdO?q()U-qc4d4|}J-IlntC{W>kq@6|YGO!!RQ*Xq40y&@}dA=(baKtvt0J<*N zL1#3)^?}#lp*PG{qCge`8byBo8g@U5wHPt3l3FhVurzX*7?Q+~nJR$J&JKOxd+*@; zlE^0hH(v>wImu!A-iTmpF*KAN7Yj}; z#<^q5%t&H9IgBo*6R?B1e+sS;bj`hhvl0Ioj{B~MTvn2ckiH@`>OUPGN ze^|7MC`NyB2^!)!Md(CLU=2fFKXywcw2cs5CLgUaL+^0jDhN|dm->*)7cUKy;((Q2 zUxj3-L^6OraOyaZ43EDvk_->wC@dmF`Q($^_zvfZ1agLGx2~E`M{HfSC6yA)-Y^2Y z$N0R~m1W3BaPt{Bd<&F9andlPvxYbI?vR7MM(?ijL49zjwA~|6_YIW{ly1PGLWq_v z)w?TwP(FAxl(!;EB5{K0hg(_wklUNN^M*@agf$H1KH>~>Kf=s7T2&#+5cXx3x86R= ztN(&Bgv&;;;I!>WD}2w}C3GVJBUm;osi<@LQ0~J=LmES*zLd*KDyoS2|8~YSu=)s2 z8N0^-Wa~pXBNSCggXOKkqrLy2_X^nW^A8J!$`eQ~>xwFc3Z|sKh^2@ZanPCv!c?!> z8y?A9-CkCzVBUMH;8H9_L_nc�tjJD?0OsK2TMK>NHNQC>eAAcnb;OL35P=xjz-B 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

U>mUa3M_ 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

}TW2J6TcgPX|H4c3!c zgAL>?gN0)nGmOV}lJ!UXP~TJ>+f1U6&4RFnE~yc7sQikCAs6cfC4vr@>RycN#oHZZLRW z^%ioY!E5AQ25&02l0Px-`gZ7UgLkO!HrP&XG}uAjW3W^8F7jT3FUb20c9ZuT_j16{ zCWGLy{JqSeR9Q~mYtVyy(4Y_bkih`*VS|Cn2>DZkLFCU2hAKyr4;fUFj~K+sM-6Jo zpBqdhe_`Bp_s}m5rc*y=FiSa`eAHkr`749@suz-v8!RH9Fz)-gq0I&j)K3~Tk-s)b zk-sr$As;u$lTR76kxv_}B!6qLiu|3y1>`dZtI1~#E?2H0pEFoX{@!36`MkkRGt z$rlYakS`f*B)1scL%wXViG0Q2Ve(ajN6FU=9wT2j*i8Px;3@JAgJ;M$4W1|eXt0I+ zlfi4`pAFt5w;F6!ZX^F<@DBM`gYD#720N5HmAlA48+@VMt>nkGnI2T~_YUfEWe;T^ zC4c{5{y_3AgNW)u%Av}U%1UKiS)-h&oT8kroTZ$toU5F#T&P^6T&!$RHYro&TLvx4 zyr#D)S1S3vW%lO+lpoRRvAWwd1(576eT&27~xmtO-lE1sL+*&1nf1|#M{D;AM)fmG>w&DfxRH z%RQ=mOu1S4l=2zn^U5ts{;tRJZz{Jcw<+IIZddLgw;SvvKQP#(>0c;!E5YCCJ~Rj_ zOO@ry9?Cw-0m^~oKMW$|4ue7DKMjT|N0R?Cs3bo!h%0Nz9R?H0od#3Lj}4}ipBT&{ zKQ)+5?lPE5er7PA{I|hE@^gblBtPiRZ_o4DU?o4FN6k-*kbLhf$yXnfd>1vz&mNI{ zpFTNAIaJASA~3yD8CUXiKuqU5dr7{Zn4GTU=WM8FE9WZbEBWqS<}Xt6^Ci>`N`8Bu znxFL`Tat5rTjv^B@h|4D15x0dnEyPhF QZVKzQupSHJTo~8?5570G1^@s6 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.47.0