From: Michael Tremer Date: Sat, 18 Sep 2010 19:44:13 +0000 (+0200) Subject: kernel: Update to 2.6.35.4. X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=57199397231f6b394f83ce6961ebd2f77fa18054;p=ipfire-3.x.git kernel: Update to 2.6.35.4. --- diff --git a/pkgs/core/kernel/config b/pkgs/core/kernel/config index 1ffdbaeb4..e71d1ac4e 100644 --- a/pkgs/core/kernel/config +++ b/pkgs/core/kernel/config @@ -1,12 +1,13 @@ # # Automatically generated make config: don't edit -# Linux kernel version: 2.6.34.1 -# Thu Aug 26 09:14:53 2010 +# Linux kernel version: 2.6.35.4 +# Sat Sep 18 18:55:00 2010 # # CONFIG_64BIT is not set CONFIG_X86_32=y # CONFIG_X86_64 is not set CONFIG_X86=y +CONFIG_INSTRUCTION_DECODER=y CONFIG_OUTPUT_FORMAT="elf32-i386" CONFIG_ARCH_DEFCONFIG="arch/x86/configs/i386_defconfig" CONFIG_GENERIC_TIME=y @@ -20,6 +21,7 @@ CONFIG_HAVE_LATENCYTOP_SUPPORT=y CONFIG_MMU=y CONFIG_ZONE_DMA=y CONFIG_NEED_DMA_MAP_STATE=y +CONFIG_NEED_SG_DMA_LENGTH=y CONFIG_GENERIC_ISA_DMA=y CONFIG_GENERIC_IOMAP=y CONFIG_GENERIC_BUG=y @@ -55,6 +57,7 @@ CONFIG_USE_GENERIC_SMP_HELPERS=y CONFIG_X86_32_SMP=y CONFIG_X86_HT=y CONFIG_X86_TRAMPOLINE=y +CONFIG_ARCH_HWEIGHT_CFLAGS="-fcall-saved-ecx -fcall-saved-edx" CONFIG_KTIME_SCALAR=y CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" CONFIG_CONSTRUCTORS=y @@ -65,6 +68,7 @@ CONFIG_CONSTRUCTORS=y CONFIG_EXPERIMENTAL=y CONFIG_LOCK_KERNEL=y CONFIG_INIT_ENV_ARG_LIMIT=32 +CONFIG_CROSS_COMPILE="" CONFIG_LOCALVERSION="" CONFIG_LOCALVERSION_AUTO=y CONFIG_HAVE_KERNEL_GZIP=y @@ -82,7 +86,9 @@ CONFIG_POSIX_MQUEUE=y CONFIG_POSIX_MQUEUE_SYSCTL=y # CONFIG_BSD_PROCESS_ACCT is not set # CONFIG_TASKSTATS is not set -# CONFIG_AUDIT is not set +CONFIG_AUDIT=y +CONFIG_AUDITSYSCALL=y +CONFIG_AUDIT_TREE=y # # RCU Subsystem @@ -103,18 +109,18 @@ CONFIG_HAVE_UNSTABLE_SCHED_CLOCK=y # CONFIG_SYSFS_DEPRECATED_V2 is not set CONFIG_RELAY=y CONFIG_NAMESPACES=y -# CONFIG_UTS_NS is not set -# CONFIG_IPC_NS is not set -# CONFIG_USER_NS is not set -# CONFIG_PID_NS is not set -# CONFIG_NET_NS is not set +CONFIG_UTS_NS=y +CONFIG_IPC_NS=y +CONFIG_USER_NS=y +CONFIG_PID_NS=y +CONFIG_NET_NS=y CONFIG_BLK_DEV_INITRD=y CONFIG_INITRAMFS_SOURCE="" CONFIG_RD_GZIP=y CONFIG_RD_BZIP2=y CONFIG_RD_LZMA=y CONFIG_RD_LZO=y -# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set +CONFIG_CC_OPTIMIZE_FOR_SIZE=y CONFIG_SYSCTL=y CONFIG_ANON_INODES=y # CONFIG_EMBEDDED is not set @@ -165,6 +171,7 @@ CONFIG_HAVE_DMA_ATTRS=y CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y CONFIG_HAVE_DMA_API_DEBUG=y CONFIG_HAVE_HW_BREAKPOINT=y +CONFIG_HAVE_MIXED_BREAKPOINTS_REGS=y CONFIG_HAVE_USER_RETURN_NOTIFIER=y # @@ -304,7 +311,6 @@ CONFIG_CPU_SUP_AMD=y CONFIG_CPU_SUP_CENTAUR=y CONFIG_CPU_SUP_TRANSMETA_32=y CONFIG_CPU_SUP_UMC_32=y -# CONFIG_X86_DS is not set CONFIG_HPET_TIMER=y CONFIG_HPET_EMULATE_RTC=y CONFIG_DMI=y @@ -355,6 +361,8 @@ CONFIG_FLAT_NODE_MEM_MAP=y CONFIG_SPARSEMEM_STATIC=y CONFIG_PAGEFLAGS_EXTENDED=y CONFIG_SPLIT_PTLOCK_CPUS=4 +CONFIG_COMPACTION=y +CONFIG_MIGRATION=y # CONFIG_PHYS_ADDR_T_64BIT is not set CONFIG_ZONE_DMA_FLAG=1 CONFIG_BOUNCE=y @@ -416,6 +424,10 @@ CONFIG_ACPI_PCI_SLOT=y CONFIG_X86_PM_TIMER=y # CONFIG_ACPI_CONTAINER is not set # CONFIG_ACPI_SBS is not set +CONFIG_ACPI_HED=m +CONFIG_ACPI_APEI=y +CONFIG_ACPI_APEI_GHES=m +CONFIG_ACPI_APEI_EINJ=m # CONFIG_SFI is not set # @@ -465,6 +477,7 @@ CONFIG_X86_SPEEDSTEP_RELAXED_CAP_CHECK=y CONFIG_CPU_IDLE=y CONFIG_CPU_IDLE_GOV_LADDER=y CONFIG_CPU_IDLE_GOV_MENU=y +CONFIG_INTEL_IDLE=m # # Bus options (PCI etc.) @@ -480,6 +493,7 @@ CONFIG_PCI_DIRECT=y CONFIG_PCI_MMCONFIG=y CONFIG_PCI_OLPC=y CONFIG_PCI_DOMAINS=y +CONFIG_PCI_CNB20LE_QUIRK=y CONFIG_DMAR=y CONFIG_DMAR_DEFAULT_ON=y CONFIG_DMAR_FLOPPY_WA=y @@ -517,7 +531,7 @@ CONFIG_YENTA_ENE_TUNE=y CONFIG_YENTA_TOSHIBA=y CONFIG_PD6729=m CONFIG_I82092=m -CONFIG_PCCARD_NONSTATIC=m +CONFIG_PCCARD_NONSTATIC=y # CONFIG_HOTPLUG_PCI is not set # @@ -561,6 +575,7 @@ CONFIG_NET_IPIP=m CONFIG_NET_IPGRE=m CONFIG_NET_IPGRE_BROADCAST=y CONFIG_IP_MROUTE=y +CONFIG_IP_MROUTE_MULTIPLE_TABLES=y CONFIG_IP_PIMSM_V1=y CONFIG_IP_PIMSM_V2=y CONFIG_ARPD=y @@ -602,6 +617,7 @@ CONFIG_IPV6_TUNNEL=m CONFIG_IPV6_MULTIPLE_TABLES=y CONFIG_IPV6_SUBTREES=y CONFIG_IPV6_MROUTE=y +CONFIG_IPV6_MROUTE_MULTIPLE_TABLES=y CONFIG_IPV6_PIMSM_V2=y # CONFIG_NETLABEL is not set # CONFIG_NETWORK_SECMARK is not set @@ -637,6 +653,16 @@ CONFIG_NF_CONNTRACK_TFTP=m CONFIG_NF_CT_NETLINK=m CONFIG_NETFILTER_TPROXY=m CONFIG_NETFILTER_XTABLES=m + +# +# Xtables combined modules +# +CONFIG_NETFILTER_XT_MARK=m +CONFIG_NETFILTER_XT_CONNMARK=m + +# +# Xtables targets +# CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m CONFIG_NETFILTER_XT_TARGET_CONNMARK=m CONFIG_NETFILTER_XT_TARGET_CT=m @@ -648,10 +674,15 @@ CONFIG_NETFILTER_XT_TARGET_NFLOG=m CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m CONFIG_NETFILTER_XT_TARGET_NOTRACK=m CONFIG_NETFILTER_XT_TARGET_RATEEST=m +CONFIG_NETFILTER_XT_TARGET_TEE=m CONFIG_NETFILTER_XT_TARGET_TPROXY=m CONFIG_NETFILTER_XT_TARGET_TRACE=m CONFIG_NETFILTER_XT_TARGET_TCPMSS=m CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=m + +# +# Xtables matches +# CONFIG_NETFILTER_XT_MATCH_CLUSTER=m CONFIG_NETFILTER_XT_MATCH_COMMENT=m CONFIG_NETFILTER_XT_MATCH_CONNBYTES=m @@ -670,6 +701,7 @@ CONFIG_NETFILTER_XT_MATCH_LIMIT=m CONFIG_NETFILTER_XT_MATCH_MAC=m CONFIG_NETFILTER_XT_MATCH_MARK=m CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m +CONFIG_NETFILTER_XT_MATCH_OSF=m CONFIG_NETFILTER_XT_MATCH_OWNER=m CONFIG_NETFILTER_XT_MATCH_POLICY=m CONFIG_NETFILTER_XT_MATCH_PHYSDEV=m @@ -678,7 +710,6 @@ CONFIG_NETFILTER_XT_MATCH_QUOTA=m CONFIG_NETFILTER_XT_MATCH_RATEEST=m CONFIG_NETFILTER_XT_MATCH_REALM=m CONFIG_NETFILTER_XT_MATCH_RECENT=m -# CONFIG_NETFILTER_XT_MATCH_RECENT_PROC_COMPAT is not set CONFIG_NETFILTER_XT_MATCH_SCTP=m CONFIG_NETFILTER_XT_MATCH_SOCKET=m CONFIG_NETFILTER_XT_MATCH_STATE=m @@ -687,7 +718,6 @@ CONFIG_NETFILTER_XT_MATCH_STRING=m CONFIG_NETFILTER_XT_MATCH_TCPMSS=m CONFIG_NETFILTER_XT_MATCH_TIME=m CONFIG_NETFILTER_XT_MATCH_U32=m -CONFIG_NETFILTER_XT_MATCH_OSF=m # CONFIG_IP_VS is not set # @@ -786,6 +816,11 @@ CONFIG_ATM_CLIP=m # CONFIG_ATM_LANE is not set CONFIG_ATM_BR2684=m CONFIG_ATM_BR2684_IPFILTER=y +CONFIG_L2TP=m +CONFIG_L2TP_DEBUGFS=m +CONFIG_L2TP_V3=y +CONFIG_L2TP_IP=m +CONFIG_L2TP_ETH=m CONFIG_STP=m CONFIG_GARP=m CONFIG_BRIDGE=m @@ -868,6 +903,7 @@ CONFIG_NET_ACT_SKBEDIT=m CONFIG_NET_CLS_IND=y CONFIG_NET_SCH_FIFO=y CONFIG_DCB=y +CONFIG_RPS=y # # Network testing @@ -915,6 +951,7 @@ CONFIG_RFKILL=m CONFIG_RFKILL_LEDS=y CONFIG_RFKILL_INPUT=y # CONFIG_NET_9P is not set +# CONFIG_CAIF is not set # # Device Drivers @@ -1150,30 +1187,46 @@ CONFIG_ATA=m CONFIG_ATA_VERBOSE_ERROR=y CONFIG_ATA_ACPI=y CONFIG_SATA_PMP=y + +# +# Controllers with non-SFF native interface +# CONFIG_SATA_AHCI=m +CONFIG_SATA_AHCI_PLATFORM=m +CONFIG_SATA_INIC162X=m CONFIG_SATA_SIL24=m CONFIG_ATA_SFF=y -CONFIG_SATA_SVW=m + +# +# SFF controllers with custom DMA interface +# +CONFIG_PDC_ADMA=m +CONFIG_SATA_QSTOR=m +CONFIG_SATA_SX4=m +CONFIG_ATA_BMDMA=y + +# +# SATA SFF controllers with BMDMA +# CONFIG_ATA_PIIX=m CONFIG_SATA_MV=m CONFIG_SATA_NV=m -CONFIG_PDC_ADMA=m -CONFIG_SATA_QSTOR=m CONFIG_SATA_PROMISE=m -CONFIG_SATA_SX4=m CONFIG_SATA_SIL=m CONFIG_SATA_SIS=m +CONFIG_SATA_SVW=m CONFIG_SATA_ULI=m CONFIG_SATA_VIA=m CONFIG_SATA_VITESSE=m -CONFIG_SATA_INIC162X=m -CONFIG_PATA_ACPI=m + +# +# PATA SFF controllers with BMDMA +# CONFIG_PATA_ALI=m CONFIG_PATA_AMD=m CONFIG_PATA_ARTOP=m -CONFIG_PATA_ATP867X=m CONFIG_PATA_ATIIXP=m -CONFIG_PATA_CMD640_PCI=m +CONFIG_PATA_ATP867X=m CONFIG_PATA_CMD64X=m CONFIG_PATA_CS5520=m CONFIG_PATA_CS5530=m @@ -1181,40 +1234,50 @@ CONFIG_PATA_CS5535=m CONFIG_PATA_CS5536=m CONFIG_PATA_CYPRESS=m CONFIG_PATA_EFAR=m -CONFIG_ATA_GENERIC=m CONFIG_PATA_HPT366=m CONFIG_PATA_HPT37X=m CONFIG_PATA_HPT3X2N=m CONFIG_PATA_HPT3X3=m CONFIG_PATA_HPT3X3_DMA=y -CONFIG_PATA_IT821X=m CONFIG_PATA_IT8213=m +CONFIG_PATA_IT821X=m CONFIG_PATA_JMICRON=m -CONFIG_PATA_LEGACY=m -CONFIG_PATA_TRIFLEX=m CONFIG_PATA_MARVELL=m -CONFIG_PATA_MPIIX=m -CONFIG_PATA_OLDPIIX=m CONFIG_PATA_NETCELL=m CONFIG_PATA_NINJA32=m -CONFIG_PATA_NS87410=m CONFIG_PATA_NS87415=m -CONFIG_PATA_OPTI=m +CONFIG_PATA_OLDPIIX=m CONFIG_PATA_OPTIDMA=m -CONFIG_PATA_PCMCIA=m CONFIG_PATA_PDC2027X=m CONFIG_PATA_PDC_OLD=m CONFIG_PATA_RADISYS=m CONFIG_PATA_RDC=m -CONFIG_PATA_RZ1000=m CONFIG_PATA_SC1200=m +CONFIG_PATA_SCH=m CONFIG_PATA_SERVERWORKS=m CONFIG_PATA_SIL680=m CONFIG_PATA_SIS=m CONFIG_PATA_TOSHIBA=m +CONFIG_PATA_TRIFLEX=m CONFIG_PATA_VIA=m CONFIG_PATA_WINBOND=m -CONFIG_PATA_SCH=m + +# +# PIO-only SFF controllers +# +CONFIG_PATA_CMD640_PCI=m +CONFIG_PATA_MPIIX=m +CONFIG_PATA_NS87410=m +CONFIG_PATA_OPTI=m +CONFIG_PATA_PCMCIA=m +CONFIG_PATA_RZ1000=m + +# +# Generic fallback / legacy drivers +# +CONFIG_PATA_ACPI=m +CONFIG_ATA_GENERIC=m +CONFIG_PATA_LEGACY=m CONFIG_MD=y CONFIG_BLK_DEV_MD=m CONFIG_MD_LINEAR=m @@ -1348,7 +1411,6 @@ CONFIG_B44_PCI_AUTOSELECT=y CONFIG_B44_PCICORE_AUTOSELECT=y CONFIG_B44_PCI=y CONFIG_FORCEDETH=m -CONFIG_FORCEDETH_NAPI=y CONFIG_E100=m CONFIG_FEALNX=m CONFIG_NATSEMI=m @@ -1436,6 +1498,7 @@ CONFIG_BE2NET=m CONFIG_WLAN=y CONFIG_PCMCIA_RAYCS=m CONFIG_LIBERTAS_THINFIRM=m +# CONFIG_LIBERTAS_THINFIRM_DEBUG is not set CONFIG_LIBERTAS_THINFIRM_USB=m CONFIG_AIRO=m CONFIG_ATMEL=m @@ -1461,6 +1524,8 @@ CONFIG_ATH9K_HW=m CONFIG_ATH9K_COMMON=m CONFIG_ATH9K=m # CONFIG_ATH9K_DEBUGFS is not set +CONFIG_ATH9K_HTC=m +# CONFIG_ATH9K_HTC_DEBUGFS is not set CONFIG_AR9170_USB=m CONFIG_AR9170_LEDS=y CONFIG_B43=m @@ -1512,6 +1577,7 @@ CONFIG_LIBERTAS_CS=m # CONFIG_LIBERTAS_DEBUG is not set CONFIG_LIBERTAS_MESH=y CONFIG_HERMES=m +CONFIG_HERMES_PRISM=y CONFIG_HERMES_CACHE_FW_ON_INIT=y CONFIG_PLX_HERMES=m CONFIG_TMD_HERMES=m @@ -1519,6 +1585,7 @@ CONFIG_NORTEL_HERMES=m CONFIG_PCI_HERMES=m CONFIG_PCMCIA_HERMES=m CONFIG_PCMCIA_SPECTRUM=m +CONFIG_ORINOCO_USB=m CONFIG_P54_COMMON=m CONFIG_P54_USB=m CONFIG_P54_PCI=m @@ -1789,9 +1856,10 @@ CONFIG_INPUT_EVDEV=y CONFIG_INPUT_KEYBOARD=y CONFIG_KEYBOARD_ADP5588=m CONFIG_KEYBOARD_ATKBD=y -CONFIG_QT2160=m +CONFIG_KEYBOARD_QT2160=m # CONFIG_KEYBOARD_LKKBD is not set CONFIG_KEYBOARD_GPIO=m +CONFIG_KEYBOARD_TCA6416=m CONFIG_KEYBOARD_MATRIX=m CONFIG_KEYBOARD_LM8323=m CONFIG_KEYBOARD_MAX7359=m @@ -1846,6 +1914,7 @@ CONFIG_HW_CONSOLE=y # CONFIG_VT_HW_CONSOLE_BINDING is not set CONFIG_DEVKMEM=y # CONFIG_SERIAL_NONSTANDARD is not set +CONFIG_N_GSM=m CONFIG_NOZOMI=m # @@ -1869,6 +1938,8 @@ CONFIG_SERIAL_CORE=y CONFIG_SERIAL_CORE_CONSOLE=y # CONFIG_SERIAL_JSM is not set CONFIG_SERIAL_TIMBERDALE=m +# CONFIG_SERIAL_ALTERA_JTAGUART is not set +# CONFIG_SERIAL_ALTERA_UART is not set CONFIG_UNIX98_PTYS=y CONFIG_DEVPTS_MULTIPLE_INSTANCES=y CONFIG_LEGACY_PTYS=y @@ -1915,6 +1986,7 @@ CONFIG_HPET_MMAP=y # CONFIG_TCG_TPM is not set # CONFIG_TELCLOCK is not set CONFIG_DEVPORT=y +# CONFIG_RAMOOPS is not set CONFIG_I2C=m CONFIG_I2C_BOARDINFO=y # CONFIG_I2C_COMPAT is not set @@ -1958,6 +2030,7 @@ CONFIG_I2C_SCMI=m # CONFIG_I2C_GPIO=m CONFIG_I2C_OCORES=m +CONFIG_I2C_PCA_PLATFORM=m CONFIG_I2C_SIMTEC=m CONFIG_I2C_XILINX=m @@ -1972,7 +2045,6 @@ CONFIG_I2C_TINY_USB=m # # Other I2C/SMBus bus drivers # -CONFIG_I2C_PCA_PLATFORM=m CONFIG_I2C_STUB=m CONFIG_SCx200_ACB=m # CONFIG_I2C_DEBUG_CORE is not set @@ -2002,7 +2074,6 @@ CONFIG_GPIO_MAX7300=m CONFIG_GPIO_MAX732X=m CONFIG_GPIO_PCA953X=m CONFIG_GPIO_PCF857X=m -CONFIG_GPIO_WM8994=m CONFIG_GPIO_ADP5588=m # @@ -2011,6 +2082,7 @@ CONFIG_GPIO_ADP5588=m CONFIG_GPIO_CS5535=m CONFIG_GPIO_LANGWELL=y CONFIG_GPIO_TIMBERDALE=y +CONFIG_GPIO_RDC321X=m # # SPI GPIO expanders: @@ -2019,6 +2091,11 @@ CONFIG_GPIO_TIMBERDALE=y # # AC97 GPIO expanders: # + +# +# MODULbus GPIO expanders: +# +CONFIG_GPIO_JANZ_TTL=m CONFIG_W1=m CONFIG_W1_CON=y @@ -2043,6 +2120,7 @@ CONFIG_W1_SLAVE_BQ27000=m CONFIG_POWER_SUPPLY=y # CONFIG_POWER_SUPPLY_DEBUG is not set # CONFIG_PDA_POWER is not set +# CONFIG_TEST_POWER is not set CONFIG_BATTERY_DS2760=m CONFIG_BATTERY_DS2782=m CONFIG_BATTERY_OLPC=m @@ -2111,12 +2189,14 @@ CONFIG_SENSORS_PCF8591=m CONFIG_SENSORS_SHT15=m CONFIG_SENSORS_SIS5595=m CONFIG_SENSORS_DME1737=m +CONFIG_SENSORS_EMC1403=m CONFIG_SENSORS_SMSC47M1=m CONFIG_SENSORS_SMSC47M192=m CONFIG_SENSORS_SMSC47B397=m CONFIG_SENSORS_ADS7828=m CONFIG_SENSORS_AMC6821=m CONFIG_SENSORS_THMC50=m +CONFIG_SENSORS_TMP102=m CONFIG_SENSORS_TMP401=m CONFIG_SENSORS_TMP421=m CONFIG_SENSORS_VIA_CPUTEMP=m @@ -2207,23 +2287,23 @@ CONFIG_SSB_PCMCIAHOST=y # CONFIG_SSB_DEBUG is not set CONFIG_SSB_DRIVER_PCICORE_POSSIBLE=y CONFIG_SSB_DRIVER_PCICORE=y - -# -# Multifunction device drivers -# +CONFIG_MFD_SUPPORT=y CONFIG_MFD_CORE=m # CONFIG_MFD_SM501 is not set # CONFIG_HTC_PASIC3 is not set # CONFIG_UCB1400_CORE is not set CONFIG_TPS65010=m +CONFIG_TPS6507X=m # CONFIG_MFD_TMIO is not set CONFIG_MFD_WM8400=m -CONFIG_MFD_WM8994=m CONFIG_MFD_PCF50633=m CONFIG_PCF50633_ADC=m CONFIG_PCF50633_GPIO=m +CONFIG_ABX500_CORE=y CONFIG_MFD_TIMBERDALE=m CONFIG_LPC_SCH=m +CONFIG_MFD_RDC321X=m +CONFIG_MFD_JANZ_CMODIO=m CONFIG_REGULATOR=y # CONFIG_REGULATOR_DEBUG is not set CONFIG_REGULATOR_DUMMY=y @@ -2235,7 +2315,6 @@ CONFIG_REGULATOR_MAX1586=m CONFIG_REGULATOR_MAX8649=m CONFIG_REGULATOR_MAX8660=m CONFIG_REGULATOR_WM8400=m -CONFIG_REGULATOR_WM8994=m CONFIG_REGULATOR_PCF50633=m CONFIG_REGULATOR_LP3971=m CONFIG_REGULATOR_TPS65023=m @@ -2259,6 +2338,13 @@ CONFIG_VIDEO_SAA7146=m CONFIG_VIDEO_SAA7146_VV=m CONFIG_IR_CORE=m CONFIG_VIDEO_IR=m +CONFIG_RC_MAP=m +CONFIG_IR_NEC_DECODER=m +CONFIG_IR_RC5_DECODER=m +CONFIG_IR_RC6_DECODER=m +CONFIG_IR_JVC_DECODER=m +CONFIG_IR_SONY_DECODER=m +CONFIG_IR_IMON=m CONFIG_MEDIA_ATTACH=y CONFIG_MEDIA_TUNER=m # CONFIG_MEDIA_TUNER_CUSTOMISE is not set @@ -2323,9 +2409,11 @@ CONFIG_VIDEO_ADV7170=m CONFIG_VIDEO_ADV7175=m CONFIG_VIDEO_UPD64031A=m CONFIG_VIDEO_UPD64083=m -CONFIG_VIDEO_VIVI=m CONFIG_VIDEO_BT848=m CONFIG_VIDEO_BT848_DVB=y +CONFIG_VIDEO_BWQCAM=m +CONFIG_VIDEO_CQCAM=m +CONFIG_VIDEO_W9966=m CONFIG_VIDEO_SAA5246A=m CONFIG_VIDEO_SAA5249=m CONFIG_VIDEO_ZORAN=m @@ -2336,6 +2424,7 @@ CONFIG_VIDEO_ZORAN_DC10=m CONFIG_VIDEO_ZORAN_LML33=m CONFIG_VIDEO_ZORAN_LML33R10=m CONFIG_VIDEO_ZORAN_AVS6EYES=m +CONFIG_VIDEO_MEYE=m CONFIG_VIDEO_SAA7134=m CONFIG_VIDEO_SAA7134_ALSA=m CONFIG_VIDEO_SAA7134_DVB=m @@ -2390,7 +2479,6 @@ CONFIG_USB_GSPCA_PAC7302=m CONFIG_USB_GSPCA_PAC7311=m CONFIG_USB_GSPCA_SN9C2028=m CONFIG_USB_GSPCA_SN9C20X=m -CONFIG_USB_GSPCA_SN9C20X_EVDEV=y CONFIG_USB_GSPCA_SONIXB=m CONFIG_USB_GSPCA_SONIXJ=m CONFIG_USB_GSPCA_SPCA500=m @@ -2419,10 +2507,11 @@ CONFIG_VIDEO_CX231XX_DVB=m # CONFIG_USB_ET61X251 is not set # CONFIG_USB_SN9C102 is not set # CONFIG_USB_ZC0301 is not set -CONFIG_USB_PWC_INPUT_EVDEV=y # CONFIG_USB_ZR364XX is not set # CONFIG_USB_STKWEBCAM is not set CONFIG_USB_S2255=m +CONFIG_V4L_MEM2MEM_DRIVERS=y +# CONFIG_VIDEO_MEM2MEM_TESTDEV is not set CONFIG_RADIO_ADAPTERS=y # CONFIG_RADIO_GEMTEK_PCI is not set # CONFIG_RADIO_MAXIRADIO is not set @@ -2602,9 +2691,11 @@ CONFIG_DVB_S5H1411=m CONFIG_DVB_DIB8000=m CONFIG_DVB_PLL=m CONFIG_DVB_TUNER_DIB0070=m +CONFIG_DVB_TUNER_DIB0090=m CONFIG_DVB_LNBP21=m CONFIG_DVB_ISL6405=m CONFIG_DVB_ISL6421=m +CONFIG_DVB_ISL6423=m CONFIG_DVB_LGS8GXX=m CONFIG_DVB_ATBM8830=m CONFIG_DAB=y @@ -2709,6 +2800,7 @@ CONFIG_FB_SIS=m CONFIG_FB_SIS_300=y CONFIG_FB_SIS_315=y CONFIG_FB_VIA=m +# CONFIG_FB_VIA_DIRECT_PROCFS is not set CONFIG_FB_NEOMAGIC=m CONFIG_FB_KYRO=m CONFIG_FB_3DFX=m @@ -2735,7 +2827,6 @@ CONFIG_FB_MB862XX_PCI_GDC=y CONFIG_FB_BROADSHEET=m CONFIG_BACKLIGHT_LCD_SUPPORT=y CONFIG_LCD_CLASS_DEVICE=m -# CONFIG_LCD_ILI9320 is not set CONFIG_LCD_PLATFORM=m CONFIG_BACKLIGHT_CLASS_DEVICE=y CONFIG_BACKLIGHT_GENERIC=m @@ -2743,6 +2834,8 @@ CONFIG_BACKLIGHT_GENERIC=m # CONFIG_BACKLIGHT_CARILLO_RANCH is not set CONFIG_BACKLIGHT_MBP_NVIDIA=m CONFIG_BACKLIGHT_SAHARA=m +CONFIG_BACKLIGHT_ADP8860=m +CONFIG_BACKLIGHT_PCF50633=m # # Display device support @@ -2818,6 +2911,7 @@ CONFIG_SND_AD1889=m CONFIG_SND_ALS300=m CONFIG_SND_ALS4000=m CONFIG_SND_ALI5451=m +CONFIG_SND_ASIHPI=m CONFIG_SND_ATIIXP=m CONFIG_SND_ATIIXP_MODEM=m CONFIG_SND_AU8810=m @@ -2857,6 +2951,7 @@ CONFIG_SND_ENS1370=m CONFIG_SND_ENS1371=m CONFIG_SND_ES1938=m CONFIG_SND_ES1968=m +CONFIG_SND_ES1968_INPUT=y CONFIG_SND_FM801=m CONFIG_SND_FM801_TEA575X_BOOL=y CONFIG_SND_FM801_TEA575X=m @@ -2892,6 +2987,7 @@ CONFIG_SND_INTEL8X0M=m CONFIG_SND_KORG1212=m CONFIG_SND_LX6464ES=m CONFIG_SND_MAESTRO3=m +CONFIG_SND_MAESTRO3_INPUT=y CONFIG_SND_MIXART=m CONFIG_SND_NM256=m CONFIG_SND_PCXHR=m @@ -2921,6 +3017,7 @@ CONFIG_SND_SOC=m CONFIG_SND_SOC_I2C_AND_SPI=m CONFIG_SND_SOC_ALL_CODECS=m CONFIG_SND_SOC_WM_HUBS=m +CONFIG_SND_SOC_AD193X=m CONFIG_SND_SOC_AD73311=m CONFIG_SND_SOC_ADS117X=m CONFIG_SND_SOC_AK4535=m @@ -2961,11 +3058,11 @@ CONFIG_SND_SOC_WM8978=m CONFIG_SND_SOC_WM8988=m CONFIG_SND_SOC_WM8990=m CONFIG_SND_SOC_WM8993=m -CONFIG_SND_SOC_WM8994=m CONFIG_SND_SOC_WM9081=m CONFIG_SND_SOC_MAX9877=m CONFIG_SND_SOC_TPA6130A2=m CONFIG_SND_SOC_WM2000=m +CONFIG_SND_SOC_WM9090=m # CONFIG_SOUND_PRIME is not set CONFIG_AC97_BUS=m CONFIG_HID_SUPPORT=y @@ -2986,11 +3083,14 @@ CONFIG_HID_3M_PCT=m CONFIG_HID_A4TECH=m CONFIG_HID_APPLE=m CONFIG_HID_BELKIN=m +CONFIG_HID_CANDO=m CONFIG_HID_CHERRY=m CONFIG_HID_CHICONY=m +# CONFIG_HID_PRODIKEYS is not set CONFIG_HID_CYPRESS=m CONFIG_HID_DRAGONRISE=m # CONFIG_DRAGONRISE_FF is not set +CONFIG_HID_EGALAX=m CONFIG_HID_EZKEY=m CONFIG_HID_KYE=m CONFIG_HID_GYRATION=m @@ -3008,7 +3108,14 @@ CONFIG_HID_ORTEK=m CONFIG_HID_PANTHERLORD=m # CONFIG_PANTHERLORD_FF is not set CONFIG_HID_PETALYNX=m +CONFIG_HID_PICOLCD=m +CONFIG_HID_PICOLCD_FB=y +CONFIG_HID_PICOLCD_BACKLIGHT=y +CONFIG_HID_PICOLCD_LCD=y +CONFIG_HID_PICOLCD_LEDS=y CONFIG_HID_QUANTA=m +CONFIG_HID_ROCCAT=m +CONFIG_HID_ROCCAT_KONE=m CONFIG_HID_SAMSUNG=m CONFIG_HID_SONY=m CONFIG_HID_STANTUM=m @@ -3022,6 +3129,7 @@ CONFIG_HID_THRUSTMASTER=m # CONFIG_THRUSTMASTER_FF is not set CONFIG_HID_ZEROPLUS=m # CONFIG_ZEROPLUS_FF is not set +CONFIG_HID_ZYDACRON=m CONFIG_USB_SUPPORT=y CONFIG_USB_ARCH_HAS_HCD=y CONFIG_USB_ARCH_HAS_OHCI=y @@ -3156,6 +3264,7 @@ CONFIG_LEDS_CLASS=m # # LED drivers # +CONFIG_LEDS_NET5501=m CONFIG_LEDS_ALIX2=m CONFIG_LEDS_PCA9532=m CONFIG_LEDS_GPIO=m @@ -3177,7 +3286,7 @@ CONFIG_LEDS_TRIGGERS=y # CONFIG_LEDS_TRIGGER_HEARTBEAT is not set CONFIG_LEDS_TRIGGER_BACKLIGHT=m CONFIG_LEDS_TRIGGER_GPIO=m -# CONFIG_LEDS_TRIGGER_DEFAULT_ON is not set +CONFIG_LEDS_TRIGGER_DEFAULT_ON=m # # iptables trigger is under Netfilter config (LED target) @@ -3253,6 +3362,7 @@ CONFIG_DMADEVICES=y # CONFIG_ASYNC_TX_DISABLE_CHANNEL_SWITCH=y CONFIG_INTEL_IOATDMA=m +CONFIG_TIMB_DMA=m CONFIG_DMA_ENGINE=y # @@ -3271,10 +3381,6 @@ CONFIG_UIO=m # CONFIG_UIO_SERCOS3 is not set CONFIG_UIO_PCI_GENERIC=m CONFIG_UIO_NETX=m - -# -# TI VLYNQ -# # CONFIG_STAGING is not set CONFIG_X86_PLATFORM_DEVICES=y # CONFIG_ACER_WMI is not set @@ -3427,6 +3533,7 @@ CONFIG_MISC_FILESYSTEMS=y CONFIG_LOGFS=m # CONFIG_CRAMFS is not set CONFIG_SQUASHFS=m +CONFIG_SQUASHFS_XATTRS=y # CONFIG_SQUASHFS_EMBEDDED is not set CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3 # CONFIG_VXFS_FS is not set @@ -3438,20 +3545,6 @@ CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3 # CONFIG_SYSV_FS is not set # CONFIG_UFS_FS is not set # CONFIG_EXOFS_FS is not set -CONFIG_AUFS_FS=m -CONFIG_AUFS_BRANCH_MAX_127=y -# CONFIG_AUFS_BRANCH_MAX_511 is not set -# CONFIG_AUFS_BRANCH_MAX_1023 is not set -# CONFIG_AUFS_BRANCH_MAX_32767 is not set -# CONFIG_AUFS_HNOTIFY is not set -# CONFIG_AUFS_EXPORT is not set -# CONFIG_AUFS_RDU is not set -CONFIG_AUFS_SP_IATTR=y -# CONFIG_AUFS_SHWH is not set -# CONFIG_AUFS_BR_RAMFS is not set -# CONFIG_AUFS_BR_FUSE is not set -CONFIG_AUFS_BDEV_LOOP=y -# CONFIG_AUFS_DEBUG is not set CONFIG_NETWORK_FILESYSTEMS=y CONFIG_NFS_FS=m CONFIG_NFS_V3=y @@ -3571,6 +3664,7 @@ CONFIG_TRACING_SUPPORT=y # CONFIG_FIREWIRE_OHCI_REMOTE_DMA is not set # CONFIG_DYNAMIC_DEBUG is not set # CONFIG_DMA_API_DEBUG is not set +# CONFIG_ATOMIC64_SELFTEST is not set # CONFIG_SAMPLES is not set CONFIG_HAVE_ARCH_KGDB=y CONFIG_HAVE_ARCH_KMEMCHECK=y @@ -3717,7 +3811,7 @@ CONFIG_PAX_PAGEEXEC=y CONFIG_PAX_SEGMEXEC=y CONFIG_PAX_EMUTRAMP=y CONFIG_PAX_MPROTECT=y -CONFIG_PAX_NOELFRELOCS=y +CONFIG_PAX_ELFRELOCS=y CONFIG_PAX_KERNEXEC=y CONFIG_PAX_KERNEXEC_MODULE_TEXT=4 @@ -3743,6 +3837,7 @@ CONFIG_SECURITY_NETWORK=y CONFIG_SECURITY_NETWORK_XFRM=y # CONFIG_SECURITY_PATH is not set CONFIG_INTEL_TXT=y +# CONFIG_SECURITY_SELINUX is not set # CONFIG_SECURITY_TOMOYO is not set # CONFIG_IMA is not set # CONFIG_DEFAULT_SECURITY_SELINUX is not set @@ -3777,6 +3872,7 @@ CONFIG_CRYPTO_RNG2=y CONFIG_CRYPTO_PCOMP=y CONFIG_CRYPTO_MANAGER=m CONFIG_CRYPTO_MANAGER2=y +CONFIG_CRYPTO_MANAGER_TESTS=y CONFIG_CRYPTO_GF128MUL=m # CONFIG_CRYPTO_NULL is not set CONFIG_CRYPTO_PCRYPT=m @@ -3901,6 +3997,7 @@ CONFIG_CRC_ITU_T=m CONFIG_CRC32=y CONFIG_CRC7=m CONFIG_LIBCRC32C=m +CONFIG_AUDIT_GENERIC=y CONFIG_ZLIB_INFLATE=y CONFIG_ZLIB_DEFLATE=m CONFIG_LZO_COMPRESS=m diff --git a/pkgs/core/kernel/kernel.nm b/pkgs/core/kernel/kernel.nm index 49201b79f..57b9672fd 100644 --- a/pkgs/core/kernel/kernel.nm +++ b/pkgs/core/kernel/kernel.nm @@ -25,7 +25,7 @@ include $(PKGROOT)/Include PKG_NAME = linux -PKG_VER = 2.6.34.1 +PKG_VER = 2.6.35.4 PKG_REL = 0 PKG_MAINTAINER = Michael Tremer diff --git a/pkgs/core/kernel/patches/aufs2-2.6.33.1-1.patch b/pkgs/core/kernel/patches/aufs2-2.6.33.1-1.patch deleted file mode 100644 index 80377b2d5..000000000 --- a/pkgs/core/kernel/patches/aufs2-2.6.33.1-1.patch +++ /dev/null @@ -1,26270 +0,0 @@ -diff -Nur linux-2.6.33.1-vanilla/Documentation/ABI/testing/debugfs-aufs linux-2.6.33.1/Documentation/ABI/testing/debugfs-aufs ---- linux-2.6.33.1-vanilla/Documentation/ABI/testing/debugfs-aufs 1970-01-01 01:00:00.000000000 +0100 -+++ linux-2.6.33.1/Documentation/ABI/testing/debugfs-aufs 2010-04-05 16:48:57.000000000 +0200 -@@ -0,0 +1,40 @@ -+What: /debug/aufs/si_/ -+Date: March 2009 -+Contact: J. R. Okajima -+Description: -+ Under /debug/aufs, a directory named si_ is created -+ per aufs mount, where is a unique id generated -+ internally. -+ -+What: /debug/aufs/si_/xib -+Date: March 2009 -+Contact: J. R. Okajima -+Description: -+ It shows the consumed blocks by xib (External Inode Number -+ Bitmap), its block size and file size. -+ When the aufs mount option 'noxino' is specified, it -+ will be empty. About XINO files, see -+ Documentation/filesystems/aufs/aufs.5 in detail. -+ -+What: /debug/aufs/si_/xino0, xino1 ... xinoN -+Date: March 2009 -+Contact: J. R. Okajima -+Description: -+ It shows the consumed blocks by xino (External Inode Number -+ Translation Table), its link count, block size and file -+ size. -+ When the aufs mount option 'noxino' is specified, it -+ will be empty. About XINO files, see -+ Documentation/filesystems/aufs/aufs.5 in detail. -+ -+What: /debug/aufs/si_/xigen -+Date: March 2009 -+Contact: J. R. Okajima -+Description: -+ It shows the consumed blocks by xigen (External Inode -+ Generation Table), its block size and file size. -+ If CONFIG_AUFS_EXPORT is disabled, this entry will not -+ be created. -+ When the aufs mount option 'noxino' is specified, it -+ will be empty. About XINO files, see -+ Documentation/filesystems/aufs/aufs.5 in detail. -diff -Nur linux-2.6.33.1-vanilla/Documentation/ABI/testing/sysfs-aufs linux-2.6.33.1/Documentation/ABI/testing/sysfs-aufs ---- linux-2.6.33.1-vanilla/Documentation/ABI/testing/sysfs-aufs 1970-01-01 01:00:00.000000000 +0100 -+++ linux-2.6.33.1/Documentation/ABI/testing/sysfs-aufs 2010-04-05 16:48:57.000000000 +0200 -@@ -0,0 +1,25 @@ -+What: /sys/fs/aufs/si_/ -+Date: March 2009 -+Contact: J. R. Okajima -+Description: -+ Under /sys/fs/aufs, a directory named si_ is created -+ per aufs mount, where is a unique id generated -+ internally. -+ -+What: /sys/fs/aufs/si_/br0, br1 ... brN -+Date: March 2009 -+Contact: J. R. Okajima -+Description: -+ It shows the abolute path of a member directory (which -+ is called branch) in aufs, and its permission. -+ -+What: /sys/fs/aufs/si_/xi_path -+Date: March 2009 -+Contact: J. R. Okajima -+Description: -+ It shows the abolute path of XINO (External Inode Number -+ Bitmap, Translation Table and Generation Table) file -+ even if it is the default path. -+ When the aufs mount option 'noxino' is specified, it -+ will be empty. About XINO files, see -+ Documentation/filesystems/aufs/aufs.5 in detail. -diff -Nur linux-2.6.33.1-vanilla/fs/aufs/aufs.h linux-2.6.33.1/fs/aufs/aufs.h ---- linux-2.6.33.1-vanilla/fs/aufs/aufs.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-2.6.33.1/fs/aufs/aufs.h 2010-04-05 16:53:27.000000000 +0200 -@@ -0,0 +1,59 @@ -+/* -+ * Copyright (C) 2005-2010 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+/* -+ * all header files -+ */ -+ -+#ifndef __AUFS_H__ -+#define __AUFS_H__ -+ -+#ifdef __KERNEL__ -+ -+#define AuStub(type, name, body, ...) \ -+ static inline type name(__VA_ARGS__) { body; } -+ -+#define AuStubVoid(name, ...) \ -+ AuStub(void, name, , __VA_ARGS__) -+#define AuStubInt0(name, ...) \ -+ AuStub(int, name, return 0, __VA_ARGS__) -+ -+#include "debug.h" -+ -+#include "branch.h" -+#include "cpup.h" -+#include "dcsub.h" -+#include "dbgaufs.h" -+#include "dentry.h" -+#include "dir.h" -+#include "file.h" -+#include "fstype.h" -+#include "inode.h" -+#include "loop.h" -+#include "module.h" -+#include "opts.h" -+#include "rwsem.h" -+#include "spl.h" -+#include "super.h" -+#include "sysaufs.h" -+#include "vfsub.h" -+#include "whout.h" -+#include "wkq.h" -+ -+#endif /* __KERNEL__ */ -+#endif /* __AUFS_H__ */ -diff -Nur linux-2.6.33.1-vanilla/fs/aufs/branch.c linux-2.6.33.1/fs/aufs/branch.c ---- linux-2.6.33.1-vanilla/fs/aufs/branch.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-2.6.33.1/fs/aufs/branch.c 2010-04-05 16:53:27.000000000 +0200 -@@ -0,0 +1,996 @@ -+/* -+ * Copyright (C) 2005-2010 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+/* -+ * branch management -+ */ -+ -+#include -+#include -+#include "aufs.h" -+ -+/* -+ * free a single branch -+ */ -+static void au_br_do_free(struct au_branch *br) -+{ -+ int i; -+ struct au_wbr *wbr; -+ -+ if (br->br_xino.xi_file) -+ fput(br->br_xino.xi_file); -+ mutex_destroy(&br->br_xino.xi_nondir_mtx); -+ -+ AuDebugOn(atomic_read(&br->br_count)); -+ -+ wbr = br->br_wbr; -+ if (wbr) { -+ for (i = 0; i < AuBrWh_Last; i++) -+ dput(wbr->wbr_wh[i]); -+ AuDebugOn(atomic_read(&wbr->wbr_wh_running)); -+ AuRwDestroy(&wbr->wbr_wh_rwsem); -+ } -+ -+ /* some filesystems acquire extra lock */ -+ /* lockdep_off(); */ -+ mntput(br->br_mnt); -+ /* lockdep_on(); */ -+ -+ kfree(wbr); -+ kfree(br); -+} -+ -+/* -+ * frees all branches -+ */ -+void au_br_free(struct au_sbinfo *sbinfo) -+{ -+ aufs_bindex_t bmax; -+ struct au_branch **br; -+ -+ AuRwMustWriteLock(&sbinfo->si_rwsem); -+ -+ bmax = sbinfo->si_bend + 1; -+ br = sbinfo->si_branch; -+ while (bmax--) -+ au_br_do_free(*br++); -+} -+ -+/* -+ * find the index of a branch which is specified by @br_id. -+ */ -+int au_br_index(struct super_block *sb, aufs_bindex_t br_id) -+{ -+ aufs_bindex_t bindex, bend; -+ -+ bend = au_sbend(sb); -+ for (bindex = 0; bindex <= bend; bindex++) -+ if (au_sbr_id(sb, bindex) == br_id) -+ return bindex; -+ return -1; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * add a branch -+ */ -+ -+static int test_overlap(struct super_block *sb, struct dentry *h_d1, -+ struct dentry *h_d2) -+{ -+ if (unlikely(h_d1 == h_d2)) -+ return 1; -+ return !!au_test_subdir(h_d1, h_d2) -+ || !!au_test_subdir(h_d2, h_d1) -+ || au_test_loopback_overlap(sb, h_d1, h_d2) -+ || au_test_loopback_overlap(sb, h_d2, h_d1); -+} -+ -+/* -+ * returns a newly allocated branch. @new_nbranch is a number of branches -+ * after adding a branch. -+ */ -+static struct au_branch *au_br_alloc(struct super_block *sb, int new_nbranch, -+ int perm) -+{ -+ struct au_branch *add_branch; -+ struct dentry *root; -+ int err; -+ -+ err = -ENOMEM; -+ root = sb->s_root; -+ add_branch = kmalloc(sizeof(*add_branch), GFP_NOFS); -+ if (unlikely(!add_branch)) -+ goto out; -+ -+ add_branch->br_wbr = NULL; -+ if (au_br_writable(perm)) { -+ /* may be freed separately at changing the branch permission */ -+ add_branch->br_wbr = kmalloc(sizeof(*add_branch->br_wbr), -+ GFP_NOFS); -+ if (unlikely(!add_branch->br_wbr)) -+ goto out_br; -+ } -+ -+ err = au_sbr_realloc(au_sbi(sb), new_nbranch); -+ if (!err) -+ err = au_di_realloc(au_di(root), new_nbranch); -+ if (!err) -+ err = au_ii_realloc(au_ii(root->d_inode), new_nbranch); -+ if (!err) -+ return add_branch; /* success */ -+ -+ kfree(add_branch->br_wbr); -+ -+ out_br: -+ kfree(add_branch); -+ out: -+ return ERR_PTR(err); -+} -+ -+/* -+ * test if the branch permission is legal or not. -+ */ -+static int test_br(struct inode *inode, int brperm, char *path) -+{ -+ int err; -+ -+ err = (au_br_writable(brperm) && IS_RDONLY(inode)); -+ if (!err) -+ goto out; -+ -+ err = -EINVAL; -+ pr_err("write permission for readonly mount or inode, %s\n", path); -+ -+ out: -+ return err; -+} -+ -+/* -+ * returns: -+ * 0: success, the caller will add it -+ * plus: success, it is already unified, the caller should ignore it -+ * minus: error -+ */ -+static int test_add(struct super_block *sb, struct au_opt_add *add, int remount) -+{ -+ int err; -+ aufs_bindex_t bend, bindex; -+ struct dentry *root; -+ struct inode *inode, *h_inode; -+ -+ root = sb->s_root; -+ bend = au_sbend(sb); -+ if (unlikely(bend >= 0 -+ && au_find_dbindex(root, add->path.dentry) >= 0)) { -+ err = 1; -+ if (!remount) { -+ err = -EINVAL; -+ pr_err("%s duplicated\n", add->pathname); -+ } -+ goto out; -+ } -+ -+ err = -ENOSPC; /* -E2BIG; */ -+ if (unlikely(AUFS_BRANCH_MAX <= add->bindex -+ || AUFS_BRANCH_MAX - 1 <= bend)) { -+ pr_err("number of branches exceeded %s\n", add->pathname); -+ goto out; -+ } -+ -+ err = -EDOM; -+ if (unlikely(add->bindex < 0 || bend + 1 < add->bindex)) { -+ pr_err("bad index %d\n", add->bindex); -+ goto out; -+ } -+ -+ inode = add->path.dentry->d_inode; -+ err = -ENOENT; -+ if (unlikely(!inode->i_nlink)) { -+ pr_err("no existence %s\n", add->pathname); -+ goto out; -+ } -+ -+ err = -EINVAL; -+ if (unlikely(inode->i_sb == sb)) { -+ pr_err("%s must be outside\n", add->pathname); -+ goto out; -+ } -+ -+ if (unlikely(au_test_fs_unsuppoted(inode->i_sb))) { -+ pr_err("unsupported filesystem, %s (%s)\n", -+ add->pathname, au_sbtype(inode->i_sb)); -+ goto out; -+ } -+ -+ err = test_br(add->path.dentry->d_inode, add->perm, add->pathname); -+ if (unlikely(err)) -+ goto out; -+ -+ if (bend < 0) -+ return 0; /* success */ -+ -+ err = -EINVAL; -+ for (bindex = 0; bindex <= bend; bindex++) -+ if (unlikely(test_overlap(sb, add->path.dentry, -+ au_h_dptr(root, bindex)))) { -+ pr_err("%s is overlapped\n", add->pathname); -+ goto out; -+ } -+ -+ err = 0; -+ if (au_opt_test(au_mntflags(sb), WARN_PERM)) { -+ h_inode = au_h_dptr(root, 0)->d_inode; -+ if ((h_inode->i_mode & S_IALLUGO) != (inode->i_mode & S_IALLUGO) -+ || h_inode->i_uid != inode->i_uid -+ || h_inode->i_gid != inode->i_gid) -+ pr_warning("uid/gid/perm %s %u/%u/0%o, %u/%u/0%o\n", -+ add->pathname, -+ inode->i_uid, inode->i_gid, -+ (inode->i_mode & S_IALLUGO), -+ h_inode->i_uid, h_inode->i_gid, -+ (h_inode->i_mode & S_IALLUGO)); -+ } -+ -+ out: -+ return err; -+} -+ -+/* -+ * initialize or clean the whiteouts for an adding branch -+ */ -+static int au_br_init_wh(struct super_block *sb, struct au_branch *br, -+ int new_perm, struct dentry *h_root) -+{ -+ int err, old_perm; -+ aufs_bindex_t bindex; -+ struct mutex *h_mtx; -+ struct au_wbr *wbr; -+ struct au_hinode *hdir; -+ -+ wbr = br->br_wbr; -+ old_perm = br->br_perm; -+ br->br_perm = new_perm; -+ hdir = NULL; -+ h_mtx = NULL; -+ bindex = au_br_index(sb, br->br_id); -+ if (0 <= bindex) { -+ hdir = au_hi(sb->s_root->d_inode, bindex); -+ au_hn_imtx_lock_nested(hdir, AuLsc_I_PARENT); -+ } else { -+ h_mtx = &h_root->d_inode->i_mutex; -+ mutex_lock_nested(h_mtx, AuLsc_I_PARENT); -+ } -+ if (!wbr) -+ err = au_wh_init(h_root, br, sb); -+ else { -+ wbr_wh_write_lock(wbr); -+ err = au_wh_init(h_root, br, sb); -+ wbr_wh_write_unlock(wbr); -+ } -+ if (hdir) -+ au_hn_imtx_unlock(hdir); -+ else -+ mutex_unlock(h_mtx); -+ br->br_perm = old_perm; -+ -+ if (!err && wbr && !au_br_writable(new_perm)) { -+ kfree(wbr); -+ br->br_wbr = NULL; -+ } -+ -+ return err; -+} -+ -+static int au_wbr_init(struct au_branch *br, struct super_block *sb, -+ int perm, struct path *path) -+{ -+ int err; -+ struct kstatfs kst; -+ struct au_wbr *wbr; -+ struct dentry *h_dentry; -+ -+ wbr = br->br_wbr; -+ au_rw_init(&wbr->wbr_wh_rwsem); -+ memset(wbr->wbr_wh, 0, sizeof(wbr->wbr_wh)); -+ atomic_set(&wbr->wbr_wh_running, 0); -+ wbr->wbr_bytes = 0; -+ -+ /* -+ * a limit for rmdir/rename a dir -+ * cf. AUFS_MAX_NAMELEN in include/linux/aufs_type.h -+ */ -+ h_dentry = path->dentry; -+ err = vfs_statfs(h_dentry, &kst); -+ if (unlikely(err)) -+ goto out; -+ err = -EINVAL; -+ if (kst.f_namelen >= NAME_MAX) -+ err = au_br_init_wh(sb, br, perm, h_dentry); -+ else -+ pr_err("%.*s(%s), unsupported namelen %ld\n", -+ AuDLNPair(h_dentry), au_sbtype(h_dentry->d_sb), -+ kst.f_namelen); -+ -+ out: -+ return err; -+} -+ -+/* intialize a new branch */ -+static int au_br_init(struct au_branch *br, struct super_block *sb, -+ struct au_opt_add *add) -+{ -+ int err; -+ -+ err = 0; -+ memset(&br->br_xino, 0, sizeof(br->br_xino)); -+ mutex_init(&br->br_xino.xi_nondir_mtx); -+ br->br_perm = add->perm; -+ br->br_mnt = add->path.mnt; /* set first, mntget() later */ -+ atomic_set(&br->br_count, 0); -+ br->br_xino_upper = AUFS_XINO_TRUNC_INIT; -+ atomic_set(&br->br_xino_running, 0); -+ br->br_id = au_new_br_id(sb); -+ -+ if (au_br_writable(add->perm)) { -+ err = au_wbr_init(br, sb, add->perm, &add->path); -+ if (unlikely(err)) -+ goto out; -+ } -+ -+ if (au_opt_test(au_mntflags(sb), XINO)) { -+ err = au_xino_br(sb, br, add->path.dentry->d_inode->i_ino, -+ au_sbr(sb, 0)->br_xino.xi_file, /*do_test*/1); -+ if (unlikely(err)) { -+ AuDebugOn(br->br_xino.xi_file); -+ goto out; -+ } -+ } -+ -+ sysaufs_br_init(br); -+ mntget(add->path.mnt); -+ -+ out: -+ return err; -+} -+ -+static void au_br_do_add_brp(struct au_sbinfo *sbinfo, aufs_bindex_t bindex, -+ struct au_branch *br, aufs_bindex_t bend, -+ aufs_bindex_t amount) -+{ -+ struct au_branch **brp; -+ -+ AuRwMustWriteLock(&sbinfo->si_rwsem); -+ -+ brp = sbinfo->si_branch + bindex; -+ memmove(brp + 1, brp, sizeof(*brp) * amount); -+ *brp = br; -+ sbinfo->si_bend++; -+ if (unlikely(bend < 0)) -+ sbinfo->si_bend = 0; -+} -+ -+static void au_br_do_add_hdp(struct au_dinfo *dinfo, aufs_bindex_t bindex, -+ aufs_bindex_t bend, aufs_bindex_t amount) -+{ -+ struct au_hdentry *hdp; -+ -+ AuRwMustWriteLock(&dinfo->di_rwsem); -+ -+ hdp = dinfo->di_hdentry + bindex; -+ memmove(hdp + 1, hdp, sizeof(*hdp) * amount); -+ au_h_dentry_init(hdp); -+ dinfo->di_bend++; -+ if (unlikely(bend < 0)) -+ dinfo->di_bstart = 0; -+} -+ -+static void au_br_do_add_hip(struct au_iinfo *iinfo, aufs_bindex_t bindex, -+ aufs_bindex_t bend, aufs_bindex_t amount) -+{ -+ struct au_hinode *hip; -+ -+ AuRwMustWriteLock(&iinfo->ii_rwsem); -+ -+ hip = iinfo->ii_hinode + bindex; -+ memmove(hip + 1, hip, sizeof(*hip) * amount); -+ hip->hi_inode = NULL; -+ au_hn_init(hip); -+ iinfo->ii_bend++; -+ if (unlikely(bend < 0)) -+ iinfo->ii_bstart = 0; -+} -+ -+static void au_br_do_add(struct super_block *sb, struct dentry *h_dentry, -+ struct au_branch *br, aufs_bindex_t bindex) -+{ -+ struct dentry *root; -+ struct inode *root_inode; -+ aufs_bindex_t bend, amount; -+ -+ root = sb->s_root; -+ root_inode = root->d_inode; -+ au_plink_maint_block(sb); -+ bend = au_sbend(sb); -+ amount = bend + 1 - bindex; -+ au_br_do_add_brp(au_sbi(sb), bindex, br, bend, amount); -+ au_br_do_add_hdp(au_di(root), bindex, bend, amount); -+ au_br_do_add_hip(au_ii(root_inode), bindex, bend, amount); -+ au_set_h_dptr(root, bindex, dget(h_dentry)); -+ au_set_h_iptr(root_inode, bindex, au_igrab(h_dentry->d_inode), -+ /*flags*/0); -+} -+ -+int au_br_add(struct super_block *sb, struct au_opt_add *add, int remount) -+{ -+ int err; -+ aufs_bindex_t bend, add_bindex; -+ struct dentry *root, *h_dentry; -+ struct inode *root_inode; -+ struct au_branch *add_branch; -+ -+ root = sb->s_root; -+ root_inode = root->d_inode; -+ IMustLock(root_inode); -+ err = test_add(sb, add, remount); -+ if (unlikely(err < 0)) -+ goto out; -+ if (err) { -+ err = 0; -+ goto out; /* success */ -+ } -+ -+ bend = au_sbend(sb); -+ add_branch = au_br_alloc(sb, bend + 2, add->perm); -+ err = PTR_ERR(add_branch); -+ if (IS_ERR(add_branch)) -+ goto out; -+ -+ err = au_br_init(add_branch, sb, add); -+ if (unlikely(err)) { -+ au_br_do_free(add_branch); -+ goto out; -+ } -+ -+ add_bindex = add->bindex; -+ h_dentry = add->path.dentry; -+ if (!remount) -+ au_br_do_add(sb, h_dentry, add_branch, add_bindex); -+ else { -+ sysaufs_brs_del(sb, add_bindex); -+ au_br_do_add(sb, h_dentry, add_branch, add_bindex); -+ sysaufs_brs_add(sb, add_bindex); -+ } -+ -+ if (!add_bindex) { -+ au_cpup_attr_all(root_inode, /*force*/1); -+ sb->s_maxbytes = h_dentry->d_sb->s_maxbytes; -+ } else -+ au_add_nlink(root_inode, h_dentry->d_inode); -+ -+ /* -+ * this test/set prevents aufs from handling unnecesary notify events -+ * of xino files, in a case of re-adding a writable branch which was -+ * once detached from aufs. -+ */ -+ if (au_xino_brid(sb) < 0 -+ && au_br_writable(add_branch->br_perm) -+ && !au_test_fs_bad_xino(h_dentry->d_sb) -+ && add_branch->br_xino.xi_file -+ && add_branch->br_xino.xi_file->f_dentry->d_parent == h_dentry) -+ au_xino_brid_set(sb, add_branch->br_id); -+ -+ out: -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * delete a branch -+ */ -+ -+/* to show the line number, do not make it inlined function */ -+#define AuVerbose(do_info, fmt, ...) do { \ -+ if (do_info) \ -+ pr_info(fmt, ##__VA_ARGS__); \ -+} while (0) -+ -+/* -+ * test if the branch is deletable or not. -+ */ -+static int test_dentry_busy(struct dentry *root, aufs_bindex_t bindex, -+ unsigned int sigen) -+{ -+ int err, i, j, ndentry; -+ aufs_bindex_t bstart, bend; -+ unsigned char verbose; -+ struct au_dcsub_pages dpages; -+ struct au_dpage *dpage; -+ struct dentry *d; -+ struct inode *inode; -+ -+ err = au_dpages_init(&dpages, GFP_NOFS); -+ if (unlikely(err)) -+ goto out; -+ err = au_dcsub_pages(&dpages, root, NULL, NULL); -+ if (unlikely(err)) -+ goto out_dpages; -+ -+ verbose = !!au_opt_test(au_mntflags(root->d_sb), VERBOSE); -+ for (i = 0; !err && i < dpages.ndpage; i++) { -+ dpage = dpages.dpages + i; -+ ndentry = dpage->ndentry; -+ for (j = 0; !err && j < ndentry; j++) { -+ d = dpage->dentries[j]; -+ AuDebugOn(!atomic_read(&d->d_count)); -+ inode = d->d_inode; -+ if (au_digen(d) == sigen && au_iigen(inode) == sigen) -+ di_read_lock_child(d, AuLock_IR); -+ else { -+ di_write_lock_child(d); -+ err = au_reval_dpath(d, sigen); -+ if (!err) -+ di_downgrade_lock(d, AuLock_IR); -+ else { -+ di_write_unlock(d); -+ break; -+ } -+ } -+ -+ bstart = au_dbstart(d); -+ bend = au_dbend(d); -+ if (bstart <= bindex -+ && bindex <= bend -+ && au_h_dptr(d, bindex) -+ && (!S_ISDIR(inode->i_mode) || bstart == bend)) { -+ err = -EBUSY; -+ AuVerbose(verbose, "busy %.*s\n", AuDLNPair(d)); -+ } -+ di_read_unlock(d, AuLock_IR); -+ } -+ } -+ -+ out_dpages: -+ au_dpages_free(&dpages); -+ out: -+ return err; -+} -+ -+static int test_inode_busy(struct super_block *sb, aufs_bindex_t bindex, -+ unsigned int sigen) -+{ -+ int err; -+ struct inode *i; -+ aufs_bindex_t bstart, bend; -+ unsigned char verbose; -+ -+ err = 0; -+ verbose = !!au_opt_test(au_mntflags(sb), VERBOSE); -+ list_for_each_entry(i, &sb->s_inodes, i_sb_list) { -+ AuDebugOn(!atomic_read(&i->i_count)); -+ if (!list_empty(&i->i_dentry)) -+ continue; -+ -+ if (au_iigen(i) == sigen) -+ ii_read_lock_child(i); -+ else { -+ ii_write_lock_child(i); -+ err = au_refresh_hinode_self(i, /*do_attr*/1); -+ if (!err) -+ ii_downgrade_lock(i); -+ else { -+ ii_write_unlock(i); -+ break; -+ } -+ } -+ -+ bstart = au_ibstart(i); -+ bend = au_ibend(i); -+ if (bstart <= bindex -+ && bindex <= bend -+ && au_h_iptr(i, bindex) -+ && (!S_ISDIR(i->i_mode) || bstart == bend)) { -+ err = -EBUSY; -+ AuVerbose(verbose, "busy i%lu\n", i->i_ino); -+ ii_read_unlock(i); -+ break; -+ } -+ ii_read_unlock(i); -+ } -+ -+ return err; -+} -+ -+static int test_children_busy(struct dentry *root, aufs_bindex_t bindex) -+{ -+ int err; -+ unsigned int sigen; -+ -+ sigen = au_sigen(root->d_sb); -+ DiMustNoWaiters(root); -+ IiMustNoWaiters(root->d_inode); -+ di_write_unlock(root); -+ err = test_dentry_busy(root, bindex, sigen); -+ if (!err) -+ err = test_inode_busy(root->d_sb, bindex, sigen); -+ di_write_lock_child(root); /* aufs_write_lock() calls ..._child() */ -+ -+ return err; -+} -+ -+static void au_br_do_del_brp(struct au_sbinfo *sbinfo, -+ const aufs_bindex_t bindex, -+ const aufs_bindex_t bend) -+{ -+ struct au_branch **brp, **p; -+ -+ AuRwMustWriteLock(&sbinfo->si_rwsem); -+ -+ brp = sbinfo->si_branch + bindex; -+ if (bindex < bend) -+ memmove(brp, brp + 1, sizeof(*brp) * (bend - bindex)); -+ sbinfo->si_branch[0 + bend] = NULL; -+ sbinfo->si_bend--; -+ -+ p = krealloc(sbinfo->si_branch, sizeof(*p) * bend, GFP_NOFS); -+ if (p) -+ sbinfo->si_branch = p; -+ /* harmless error */ -+} -+ -+static void au_br_do_del_hdp(struct au_dinfo *dinfo, const aufs_bindex_t bindex, -+ const aufs_bindex_t bend) -+{ -+ struct au_hdentry *hdp, *p; -+ -+ AuRwMustWriteLock(&dinfo->di_rwsem); -+ -+ hdp = dinfo->di_hdentry + bindex; -+ if (bindex < bend) -+ memmove(hdp, hdp + 1, sizeof(*hdp) * (bend - bindex)); -+ dinfo->di_hdentry[0 + bend].hd_dentry = NULL; -+ dinfo->di_bend--; -+ -+ p = krealloc(dinfo->di_hdentry, sizeof(*p) * bend, GFP_NOFS); -+ if (p) -+ dinfo->di_hdentry = p; -+ /* harmless error */ -+} -+ -+static void au_br_do_del_hip(struct au_iinfo *iinfo, const aufs_bindex_t bindex, -+ const aufs_bindex_t bend) -+{ -+ struct au_hinode *hip, *p; -+ -+ AuRwMustWriteLock(&iinfo->ii_rwsem); -+ -+ hip = iinfo->ii_hinode + bindex; -+ if (bindex < bend) -+ memmove(hip, hip + 1, sizeof(*hip) * (bend - bindex)); -+ iinfo->ii_hinode[0 + bend].hi_inode = NULL; -+ au_hn_init(iinfo->ii_hinode + bend); -+ iinfo->ii_bend--; -+ -+ p = krealloc(iinfo->ii_hinode, sizeof(*p) * bend, GFP_NOFS); -+ if (p) -+ iinfo->ii_hinode = p; -+ /* harmless error */ -+} -+ -+static void au_br_do_del(struct super_block *sb, aufs_bindex_t bindex, -+ struct au_branch *br) -+{ -+ aufs_bindex_t bend; -+ struct au_sbinfo *sbinfo; -+ struct dentry *root; -+ struct inode *inode; -+ -+ SiMustWriteLock(sb); -+ -+ root = sb->s_root; -+ inode = root->d_inode; -+ au_plink_maint_block(sb); -+ sbinfo = au_sbi(sb); -+ bend = sbinfo->si_bend; -+ -+ dput(au_h_dptr(root, bindex)); -+ au_hiput(au_hi(inode, bindex)); -+ au_br_do_free(br); -+ -+ au_br_do_del_brp(sbinfo, bindex, bend); -+ au_br_do_del_hdp(au_di(root), bindex, bend); -+ au_br_do_del_hip(au_ii(inode), bindex, bend); -+} -+ -+int au_br_del(struct super_block *sb, struct au_opt_del *del, int remount) -+{ -+ int err, rerr, i; -+ unsigned int mnt_flags; -+ aufs_bindex_t bindex, bend, br_id; -+ unsigned char do_wh, verbose; -+ struct au_branch *br; -+ struct au_wbr *wbr; -+ -+ err = 0; -+ bindex = au_find_dbindex(sb->s_root, del->h_path.dentry); -+ if (bindex < 0) { -+ if (remount) -+ goto out; /* success */ -+ err = -ENOENT; -+ pr_err("%s no such branch\n", del->pathname); -+ goto out; -+ } -+ AuDbg("bindex b%d\n", bindex); -+ -+ err = -EBUSY; -+ mnt_flags = au_mntflags(sb); -+ verbose = !!au_opt_test(mnt_flags, VERBOSE); -+ bend = au_sbend(sb); -+ if (unlikely(!bend)) { -+ AuVerbose(verbose, "no more branches left\n"); -+ goto out; -+ } -+ br = au_sbr(sb, bindex); -+ i = atomic_read(&br->br_count); -+ if (unlikely(i)) { -+ AuVerbose(verbose, "%d file(s) opened\n", i); -+ goto out; -+ } -+ -+ wbr = br->br_wbr; -+ do_wh = wbr && (wbr->wbr_whbase || wbr->wbr_plink || wbr->wbr_orph); -+ if (do_wh) { -+ /* instead of WbrWhMustWriteLock(wbr) */ -+ SiMustWriteLock(sb); -+ for (i = 0; i < AuBrWh_Last; i++) { -+ dput(wbr->wbr_wh[i]); -+ wbr->wbr_wh[i] = NULL; -+ } -+ } -+ -+ err = test_children_busy(sb->s_root, bindex); -+ if (unlikely(err)) { -+ if (do_wh) -+ goto out_wh; -+ goto out; -+ } -+ -+ err = 0; -+ br_id = br->br_id; -+ if (!remount) -+ au_br_do_del(sb, bindex, br); -+ else { -+ sysaufs_brs_del(sb, bindex); -+ au_br_do_del(sb, bindex, br); -+ sysaufs_brs_add(sb, bindex); -+ } -+ -+ if (!bindex) { -+ au_cpup_attr_all(sb->s_root->d_inode, /*force*/1); -+ sb->s_maxbytes = au_sbr_sb(sb, 0)->s_maxbytes; -+ } else -+ au_sub_nlink(sb->s_root->d_inode, del->h_path.dentry->d_inode); -+ if (au_opt_test(mnt_flags, PLINK)) -+ au_plink_half_refresh(sb, br_id); -+ -+ if (au_xino_brid(sb) == br->br_id) -+ au_xino_brid_set(sb, -1); -+ goto out; /* success */ -+ -+ out_wh: -+ /* revert */ -+ rerr = au_br_init_wh(sb, br, br->br_perm, del->h_path.dentry); -+ if (rerr) -+ pr_warning("failed re-creating base whiteout, %s. (%d)\n", -+ del->pathname, rerr); -+ out: -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * change a branch permission -+ */ -+ -+static void au_warn_ima(void) -+{ -+#ifdef CONFIG_IMA -+ /* since it doesn't support mark_files_ro() */ -+ pr_warning("RW -> RO makes IMA to produce wrong message"); -+#endif -+} -+ -+static int do_need_sigen_inc(int a, int b) -+{ -+ return au_br_whable(a) && !au_br_whable(b); -+} -+ -+static int need_sigen_inc(int old, int new) -+{ -+ return do_need_sigen_inc(old, new) -+ || do_need_sigen_inc(new, old); -+} -+ -+static int au_br_mod_files_ro(struct super_block *sb, aufs_bindex_t bindex) -+{ -+ int err; -+ unsigned long n, ul, bytes, files; -+ aufs_bindex_t bstart; -+ struct file *file, *hf, **a; -+ const int step_bytes = 1024, /* memory allocation unit */ -+ step_files = step_bytes / sizeof(*a); -+ -+ err = -ENOMEM; -+ n = 0; -+ bytes = step_bytes; -+ files = step_files; -+ a = kmalloc(bytes, GFP_NOFS); -+ if (unlikely(!a)) -+ goto out; -+ -+ /* no need file_list_lock() since sbinfo is locked? defered? */ -+ list_for_each_entry(file, &sb->s_files, f_u.fu_list) { -+ if (special_file(file->f_dentry->d_inode->i_mode)) -+ continue; -+ -+ AuDbg("%.*s\n", AuDLNPair(file->f_dentry)); -+ fi_read_lock(file); -+ if (unlikely(au_test_mmapped(file))) { -+ err = -EBUSY; -+ FiMustNoWaiters(file); -+ fi_read_unlock(file); -+ goto out_free; -+ } -+ -+ bstart = au_fbstart(file); -+ if (!S_ISREG(file->f_dentry->d_inode->i_mode) -+ || !(file->f_mode & FMODE_WRITE) -+ || bstart != bindex) { -+ FiMustNoWaiters(file); -+ fi_read_unlock(file); -+ continue; -+ } -+ -+ hf = au_h_fptr(file, bstart); -+ FiMustNoWaiters(file); -+ fi_read_unlock(file); -+ -+ if (n < files) -+ a[n++] = hf; -+ else { -+ void *p; -+ -+ err = -ENOMEM; -+ bytes += step_bytes; -+ files += step_files; -+ p = krealloc(a, bytes, GFP_NOFS); -+ if (p) { -+ a = p; -+ a[n++] = hf; -+ } else -+ goto out_free; -+ } -+ } -+ -+ err = 0; -+ if (n) -+ au_warn_ima(); -+ for (ul = 0; ul < n; ul++) { -+ /* todo: already flushed? */ -+ /* cf. fs/super.c:mark_files_ro() */ -+ hf = a[ul]; -+ hf->f_mode &= ~FMODE_WRITE; -+ if (!file_check_writeable(hf)) { -+ file_release_write(hf); -+ mnt_drop_write(hf->f_vfsmnt); -+ } -+ } -+ -+ out_free: -+ kfree(a); -+ out: -+ return err; -+} -+ -+int au_br_mod(struct super_block *sb, struct au_opt_mod *mod, int remount, -+ int *do_update) -+{ -+ int err, rerr; -+ aufs_bindex_t bindex; -+ struct path path; -+ struct dentry *root; -+ struct au_branch *br; -+ -+ root = sb->s_root; -+ au_plink_maint_block(sb); -+ bindex = au_find_dbindex(root, mod->h_root); -+ if (bindex < 0) { -+ if (remount) -+ return 0; /* success */ -+ err = -ENOENT; -+ pr_err("%s no such branch\n", mod->path); -+ goto out; -+ } -+ AuDbg("bindex b%d\n", bindex); -+ -+ err = test_br(mod->h_root->d_inode, mod->perm, mod->path); -+ if (unlikely(err)) -+ goto out; -+ -+ br = au_sbr(sb, bindex); -+ if (br->br_perm == mod->perm) -+ return 0; /* success */ -+ -+ if (au_br_writable(br->br_perm)) { -+ /* remove whiteout base */ -+ err = au_br_init_wh(sb, br, mod->perm, mod->h_root); -+ if (unlikely(err)) -+ goto out; -+ -+ if (!au_br_writable(mod->perm)) { -+ /* rw --> ro, file might be mmapped */ -+ DiMustNoWaiters(root); -+ IiMustNoWaiters(root->d_inode); -+ di_write_unlock(root); -+ err = au_br_mod_files_ro(sb, bindex); -+ /* aufs_write_lock() calls ..._child() */ -+ di_write_lock_child(root); -+ -+ if (unlikely(err)) { -+ rerr = -ENOMEM; -+ br->br_wbr = kmalloc(sizeof(*br->br_wbr), -+ GFP_NOFS); -+ if (br->br_wbr) { -+ path.mnt = br->br_mnt; -+ path.dentry = mod->h_root; -+ rerr = au_wbr_init(br, sb, br->br_perm, -+ &path); -+ } -+ if (unlikely(rerr)) { -+ AuIOErr("nested error %d (%d)\n", -+ rerr, err); -+ br->br_perm = mod->perm; -+ } -+ } -+ } -+ } else if (au_br_writable(mod->perm)) { -+ /* ro --> rw */ -+ err = -ENOMEM; -+ br->br_wbr = kmalloc(sizeof(*br->br_wbr), GFP_NOFS); -+ if (br->br_wbr) { -+ path.mnt = br->br_mnt; -+ path.dentry = mod->h_root; -+ err = au_wbr_init(br, sb, mod->perm, &path); -+ if (unlikely(err)) { -+ kfree(br->br_wbr); -+ br->br_wbr = NULL; -+ } -+ } -+ } -+ -+ if (!err) { -+ *do_update |= need_sigen_inc(br->br_perm, mod->perm); -+ br->br_perm = mod->perm; -+ } -+ -+ out: -+ return err; -+} -diff -Nur linux-2.6.33.1-vanilla/fs/aufs/branch.h linux-2.6.33.1/fs/aufs/branch.h ---- linux-2.6.33.1-vanilla/fs/aufs/branch.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-2.6.33.1/fs/aufs/branch.h 2010-04-05 16:53:27.000000000 +0200 -@@ -0,0 +1,219 @@ -+/* -+ * Copyright (C) 2005-2010 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+/* -+ * branch filesystems and xino for them -+ */ -+ -+#ifndef __AUFS_BRANCH_H__ -+#define __AUFS_BRANCH_H__ -+ -+#ifdef __KERNEL__ -+ -+#include -+#include -+#include -+#include "rwsem.h" -+#include "super.h" -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* a xino file */ -+struct au_xino_file { -+ struct file *xi_file; -+ struct mutex xi_nondir_mtx; -+ -+ /* todo: make xino files an array to support huge inode number */ -+ -+#ifdef CONFIG_DEBUG_FS -+ struct dentry *xi_dbgaufs; -+#endif -+}; -+ -+/* members for writable branch only */ -+enum {AuBrWh_BASE, AuBrWh_PLINK, AuBrWh_ORPH, AuBrWh_Last}; -+struct au_wbr { -+ struct au_rwsem wbr_wh_rwsem; -+ struct dentry *wbr_wh[AuBrWh_Last]; -+ atomic_t wbr_wh_running; -+#define wbr_whbase wbr_wh[AuBrWh_BASE] /* whiteout base */ -+#define wbr_plink wbr_wh[AuBrWh_PLINK] /* pseudo-link dir */ -+#define wbr_orph wbr_wh[AuBrWh_ORPH] /* dir for orphans */ -+ -+ /* mfs mode */ -+ unsigned long long wbr_bytes; -+}; -+ -+/* protected by superblock rwsem */ -+struct au_branch { -+ struct au_xino_file br_xino; -+ -+ aufs_bindex_t br_id; -+ -+ int br_perm; -+ struct vfsmount *br_mnt; -+ atomic_t br_count; -+ -+ struct au_wbr *br_wbr; -+ -+ /* xino truncation */ -+ blkcnt_t br_xino_upper; /* watermark in blocks */ -+ atomic_t br_xino_running; -+ -+#ifdef CONFIG_SYSFS -+ /* an entry under sysfs per mount-point */ -+ char br_name[8]; -+ struct attribute br_attr; -+#endif -+}; -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* branch permission and attribute */ -+enum { -+ AuBrPerm_RW, /* writable, linkable wh */ -+ AuBrPerm_RO, /* readonly, no wh */ -+ AuBrPerm_RR, /* natively readonly, no wh */ -+ -+ AuBrPerm_RWNoLinkWH, /* un-linkable whiteouts */ -+ -+ AuBrPerm_ROWH, /* whiteout-able */ -+ AuBrPerm_RRWH, /* whiteout-able */ -+ -+ AuBrPerm_Last -+}; -+ -+static inline int au_br_writable(int brperm) -+{ -+ return brperm == AuBrPerm_RW || brperm == AuBrPerm_RWNoLinkWH; -+} -+ -+static inline int au_br_whable(int brperm) -+{ -+ return brperm == AuBrPerm_RW -+ || brperm == AuBrPerm_ROWH -+ || brperm == AuBrPerm_RRWH; -+} -+ -+static inline int au_br_rdonly(struct au_branch *br) -+{ -+ return ((br->br_mnt->mnt_sb->s_flags & MS_RDONLY) -+ || !au_br_writable(br->br_perm)) -+ ? -EROFS : 0; -+} -+ -+static inline int au_br_hnotifyable(int brperm __maybe_unused) -+{ -+#ifdef CONFIG_AUFS_HNOTIFY -+ return brperm != AuBrPerm_RR && brperm != AuBrPerm_RRWH; -+#else -+ return 0; -+#endif -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* branch.c */ -+struct au_sbinfo; -+void au_br_free(struct au_sbinfo *sinfo); -+int au_br_index(struct super_block *sb, aufs_bindex_t br_id); -+struct au_opt_add; -+int au_br_add(struct super_block *sb, struct au_opt_add *add, int remount); -+struct au_opt_del; -+int au_br_del(struct super_block *sb, struct au_opt_del *del, int remount); -+struct au_opt_mod; -+int au_br_mod(struct super_block *sb, struct au_opt_mod *mod, int remount, -+ int *do_update); -+ -+/* xino.c */ -+static const loff_t au_loff_max = LLONG_MAX; -+ -+int au_xib_trunc(struct super_block *sb); -+ssize_t xino_fread(au_readf_t func, struct file *file, void *buf, size_t size, -+ loff_t *pos); -+ssize_t xino_fwrite(au_writef_t func, struct file *file, void *buf, size_t size, -+ loff_t *pos); -+struct file *au_xino_create2(struct file *base_file, struct file *copy_src); -+struct file *au_xino_create(struct super_block *sb, char *fname, int silent); -+ino_t au_xino_new_ino(struct super_block *sb); -+int au_xino_write0(struct super_block *sb, aufs_bindex_t bindex, ino_t h_ino, -+ ino_t ino); -+int au_xino_write(struct super_block *sb, aufs_bindex_t bindex, ino_t h_ino, -+ ino_t ino); -+int au_xino_read(struct super_block *sb, aufs_bindex_t bindex, ino_t h_ino, -+ ino_t *ino); -+int au_xino_br(struct super_block *sb, struct au_branch *br, ino_t hino, -+ struct file *base_file, int do_test); -+int au_xino_trunc(struct super_block *sb, aufs_bindex_t bindex); -+ -+struct au_opt_xino; -+int au_xino_set(struct super_block *sb, struct au_opt_xino *xino, int remount); -+void au_xino_clr(struct super_block *sb); -+struct file *au_xino_def(struct super_block *sb); -+int au_xino_path(struct seq_file *seq, struct file *file); -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* Superblock to branch */ -+static inline -+aufs_bindex_t au_sbr_id(struct super_block *sb, aufs_bindex_t bindex) -+{ -+ return au_sbr(sb, bindex)->br_id; -+} -+ -+static inline -+struct vfsmount *au_sbr_mnt(struct super_block *sb, aufs_bindex_t bindex) -+{ -+ return au_sbr(sb, bindex)->br_mnt; -+} -+ -+static inline -+struct super_block *au_sbr_sb(struct super_block *sb, aufs_bindex_t bindex) -+{ -+ return au_sbr_mnt(sb, bindex)->mnt_sb; -+} -+ -+static inline void au_sbr_put(struct super_block *sb, aufs_bindex_t bindex) -+{ -+ atomic_dec_return(&au_sbr(sb, bindex)->br_count); -+} -+ -+static inline int au_sbr_perm(struct super_block *sb, aufs_bindex_t bindex) -+{ -+ return au_sbr(sb, bindex)->br_perm; -+} -+ -+static inline int au_sbr_whable(struct super_block *sb, aufs_bindex_t bindex) -+{ -+ return au_br_whable(au_sbr_perm(sb, bindex)); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * wbr_wh_read_lock, wbr_wh_write_lock -+ * wbr_wh_read_unlock, wbr_wh_write_unlock, wbr_wh_downgrade_lock -+ */ -+AuSimpleRwsemFuncs(wbr_wh, struct au_wbr *wbr, &wbr->wbr_wh_rwsem); -+ -+#define WbrWhMustNoWaiters(wbr) AuRwMustNoWaiters(&wbr->wbr_wh_rwsem) -+#define WbrWhMustAnyLock(wbr) AuRwMustAnyLock(&wbr->wbr_wh_rwsem) -+#define WbrWhMustWriteLock(wbr) AuRwMustWriteLock(&wbr->wbr_wh_rwsem) -+ -+#endif /* __KERNEL__ */ -+#endif /* __AUFS_BRANCH_H__ */ -diff -Nur linux-2.6.33.1-vanilla/fs/aufs/conf.mk linux-2.6.33.1/fs/aufs/conf.mk ---- linux-2.6.33.1-vanilla/fs/aufs/conf.mk 1970-01-01 01:00:00.000000000 +0100 -+++ linux-2.6.33.1/fs/aufs/conf.mk 2010-04-05 16:53:27.000000000 +0200 -@@ -0,0 +1,33 @@ -+ -+AuConfStr = CONFIG_AUFS_FS=${CONFIG_AUFS_FS} -+ -+define AuConf -+ifdef ${1} -+AuConfStr += ${1}=${${1}} -+endif -+endef -+ -+$(foreach i, BRANCH_MAX_127 BRANCH_MAX_511 BRANCH_MAX_1023 BRANCH_MAX_32767 \ -+ HNOTIFY HFSNOTIFY HINOTIFY \ -+ EXPORT INO_T_64 \ -+ RDU \ -+ SP_IATTR \ -+ SHWH \ -+ BR_RAMFS \ -+ BR_FUSE POLL \ -+ BR_HFSPLUS \ -+ BDEV_LOOP \ -+ DEBUG MAGIC_SYSRQ, \ -+ $(eval $(call AuConf,CONFIG_AUFS_${i}))) -+ -+AuConfName = ${obj}/conf.str -+${AuConfName}.tmp: FORCE -+ @echo ${AuConfStr} | tr ' ' '\n' | sed -e 's/^/"/' -e 's/$$/\\n"/' > $@ -+${AuConfName}: ${AuConfName}.tmp -+ @diff -q $< $@ > /dev/null 2>&1 || { \ -+ echo ' GEN ' $@; \ -+ cp -p $< $@; \ -+ } -+FORCE: -+clean-files += ${AuConfName} ${AuConfName}.tmp -+${obj}/sysfs.o: ${AuConfName} -diff -Nur linux-2.6.33.1-vanilla/fs/aufs/cpup.c linux-2.6.33.1/fs/aufs/cpup.c ---- linux-2.6.33.1-vanilla/fs/aufs/cpup.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-2.6.33.1/fs/aufs/cpup.c 2010-04-05 16:53:27.000000000 +0200 -@@ -0,0 +1,1049 @@ -+/* -+ * Copyright (C) 2005-2010 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+/* -+ * copy-up functions, see wbr_policy.c for copy-down -+ */ -+ -+#include -+#include -+#include -+#include -+#include "aufs.h" -+ -+void au_cpup_attr_flags(struct inode *dst, struct inode *src) -+{ -+ const unsigned int mask = S_DEAD | S_SWAPFILE | S_PRIVATE -+ | S_NOATIME | S_NOCMTIME; -+ -+ dst->i_flags |= src->i_flags & ~mask; -+ if (au_test_fs_notime(dst->i_sb)) -+ dst->i_flags |= S_NOATIME | S_NOCMTIME; -+} -+ -+void au_cpup_attr_timesizes(struct inode *inode) -+{ -+ struct inode *h_inode; -+ -+ h_inode = au_h_iptr(inode, au_ibstart(inode)); -+ fsstack_copy_attr_times(inode, h_inode); -+ fsstack_copy_inode_size(inode, h_inode); -+} -+ -+void au_cpup_attr_nlink(struct inode *inode, int force) -+{ -+ struct inode *h_inode; -+ struct super_block *sb; -+ aufs_bindex_t bindex, bend; -+ -+ sb = inode->i_sb; -+ bindex = au_ibstart(inode); -+ h_inode = au_h_iptr(inode, bindex); -+ if (!force -+ && !S_ISDIR(h_inode->i_mode) -+ && au_opt_test(au_mntflags(sb), PLINK) -+ && au_plink_test(inode)) -+ return; -+ -+ inode->i_nlink = h_inode->i_nlink; -+ -+ /* -+ * fewer nlink makes find(1) noisy, but larger nlink doesn't. -+ * it may includes whplink directory. -+ */ -+ if (S_ISDIR(h_inode->i_mode)) { -+ bend = au_ibend(inode); -+ for (bindex++; bindex <= bend; bindex++) { -+ h_inode = au_h_iptr(inode, bindex); -+ if (h_inode) -+ au_add_nlink(inode, h_inode); -+ } -+ } -+} -+ -+void au_cpup_attr_changeable(struct inode *inode) -+{ -+ struct inode *h_inode; -+ -+ h_inode = au_h_iptr(inode, au_ibstart(inode)); -+ inode->i_mode = h_inode->i_mode; -+ inode->i_uid = h_inode->i_uid; -+ inode->i_gid = h_inode->i_gid; -+ au_cpup_attr_timesizes(inode); -+ au_cpup_attr_flags(inode, h_inode); -+} -+ -+void au_cpup_igen(struct inode *inode, struct inode *h_inode) -+{ -+ struct au_iinfo *iinfo = au_ii(inode); -+ -+ IiMustWriteLock(inode); -+ -+ iinfo->ii_higen = h_inode->i_generation; -+ iinfo->ii_hsb1 = h_inode->i_sb; -+} -+ -+void au_cpup_attr_all(struct inode *inode, int force) -+{ -+ struct inode *h_inode; -+ -+ h_inode = au_h_iptr(inode, au_ibstart(inode)); -+ au_cpup_attr_changeable(inode); -+ if (inode->i_nlink > 0) -+ au_cpup_attr_nlink(inode, force); -+ inode->i_rdev = h_inode->i_rdev; -+ inode->i_blkbits = h_inode->i_blkbits; -+ au_cpup_igen(inode, h_inode); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* Note: dt_dentry and dt_h_dentry are not dget/dput-ed */ -+ -+/* keep the timestamps of the parent dir when cpup */ -+void au_dtime_store(struct au_dtime *dt, struct dentry *dentry, -+ struct path *h_path) -+{ -+ struct inode *h_inode; -+ -+ dt->dt_dentry = dentry; -+ dt->dt_h_path = *h_path; -+ h_inode = h_path->dentry->d_inode; -+ dt->dt_atime = h_inode->i_atime; -+ dt->dt_mtime = h_inode->i_mtime; -+ /* smp_mb(); */ -+} -+ -+void au_dtime_revert(struct au_dtime *dt) -+{ -+ struct iattr attr; -+ int err; -+ -+ attr.ia_atime = dt->dt_atime; -+ attr.ia_mtime = dt->dt_mtime; -+ attr.ia_valid = ATTR_FORCE | ATTR_MTIME | ATTR_MTIME_SET -+ | ATTR_ATIME | ATTR_ATIME_SET; -+ -+ err = vfsub_notify_change(&dt->dt_h_path, &attr); -+ if (unlikely(err)) -+ pr_warning("restoring timestamps failed(%d). ignored\n", err); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static noinline_for_stack -+int cpup_iattr(struct dentry *dst, aufs_bindex_t bindex, struct dentry *h_src) -+{ -+ int err, sbits; -+ struct iattr ia; -+ struct path h_path; -+ struct inode *h_isrc, *h_idst; -+ -+ h_path.dentry = au_h_dptr(dst, bindex); -+ h_idst = h_path.dentry->d_inode; -+ h_path.mnt = au_sbr_mnt(dst->d_sb, bindex); -+ h_isrc = h_src->d_inode; -+ ia.ia_valid = ATTR_FORCE | ATTR_UID | ATTR_GID -+ | ATTR_ATIME | ATTR_MTIME -+ | ATTR_ATIME_SET | ATTR_MTIME_SET; -+ ia.ia_uid = h_isrc->i_uid; -+ ia.ia_gid = h_isrc->i_gid; -+ ia.ia_atime = h_isrc->i_atime; -+ ia.ia_mtime = h_isrc->i_mtime; -+ if (h_idst->i_mode != h_isrc->i_mode -+ && !S_ISLNK(h_idst->i_mode)) { -+ ia.ia_valid |= ATTR_MODE; -+ ia.ia_mode = h_isrc->i_mode; -+ } -+ sbits = !!(h_isrc->i_mode & (S_ISUID | S_ISGID)); -+ au_cpup_attr_flags(h_idst, h_isrc); -+ err = vfsub_notify_change(&h_path, &ia); -+ -+ /* is this nfs only? */ -+ if (!err && sbits && au_test_nfs(h_path.dentry->d_sb)) { -+ ia.ia_valid = ATTR_FORCE | ATTR_MODE; -+ ia.ia_mode = h_isrc->i_mode; -+ err = vfsub_notify_change(&h_path, &ia); -+ } -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int au_do_copy_file(struct file *dst, struct file *src, loff_t len, -+ char *buf, unsigned long blksize) -+{ -+ int err; -+ size_t sz, rbytes, wbytes; -+ unsigned char all_zero; -+ char *p, *zp; -+ struct mutex *h_mtx; -+ /* reduce stack usage */ -+ struct iattr *ia; -+ -+ zp = page_address(ZERO_PAGE(0)); -+ if (unlikely(!zp)) -+ return -ENOMEM; /* possible? */ -+ -+ err = 0; -+ all_zero = 0; -+ while (len) { -+ AuDbg("len %lld\n", len); -+ sz = blksize; -+ if (len < blksize) -+ sz = len; -+ -+ rbytes = 0; -+ /* todo: signal_pending? */ -+ while (!rbytes || err == -EAGAIN || err == -EINTR) { -+ rbytes = vfsub_read_k(src, buf, sz, &src->f_pos); -+ err = rbytes; -+ } -+ if (unlikely(err < 0)) -+ break; -+ -+ all_zero = 0; -+ if (len >= rbytes && rbytes == blksize) -+ all_zero = !memcmp(buf, zp, rbytes); -+ if (!all_zero) { -+ wbytes = rbytes; -+ p = buf; -+ while (wbytes) { -+ size_t b; -+ -+ b = vfsub_write_k(dst, p, wbytes, &dst->f_pos); -+ err = b; -+ /* todo: signal_pending? */ -+ if (unlikely(err == -EAGAIN || err == -EINTR)) -+ continue; -+ if (unlikely(err < 0)) -+ break; -+ wbytes -= b; -+ p += b; -+ } -+ } else { -+ loff_t res; -+ -+ AuLabel(hole); -+ res = vfsub_llseek(dst, rbytes, SEEK_CUR); -+ err = res; -+ if (unlikely(res < 0)) -+ break; -+ } -+ len -= rbytes; -+ err = 0; -+ } -+ -+ /* the last block may be a hole */ -+ if (!err && all_zero) { -+ AuLabel(last hole); -+ -+ err = 1; -+ if (au_test_nfs(dst->f_dentry->d_sb)) { -+ /* nfs requires this step to make last hole */ -+ /* is this only nfs? */ -+ do { -+ /* todo: signal_pending? */ -+ err = vfsub_write_k(dst, "\0", 1, &dst->f_pos); -+ } while (err == -EAGAIN || err == -EINTR); -+ if (err == 1) -+ dst->f_pos--; -+ } -+ -+ if (err == 1) { -+ ia = (void *)buf; -+ ia->ia_size = dst->f_pos; -+ ia->ia_valid = ATTR_SIZE | ATTR_FILE; -+ ia->ia_file = dst; -+ h_mtx = &dst->f_dentry->d_inode->i_mutex; -+ mutex_lock_nested(h_mtx, AuLsc_I_CHILD2); -+ err = vfsub_notify_change(&dst->f_path, ia); -+ mutex_unlock(h_mtx); -+ } -+ } -+ -+ return err; -+} -+ -+int au_copy_file(struct file *dst, struct file *src, loff_t len) -+{ -+ int err; -+ unsigned long blksize; -+ unsigned char do_kfree; -+ char *buf; -+ -+ err = -ENOMEM; -+ blksize = dst->f_dentry->d_sb->s_blocksize; -+ if (!blksize || PAGE_SIZE < blksize) -+ blksize = PAGE_SIZE; -+ AuDbg("blksize %lu\n", blksize); -+ do_kfree = (blksize != PAGE_SIZE && blksize >= sizeof(struct iattr *)); -+ if (do_kfree) -+ buf = kmalloc(blksize, GFP_NOFS); -+ else -+ buf = (void *)__get_free_page(GFP_NOFS); -+ if (unlikely(!buf)) -+ goto out; -+ -+ if (len > (1 << 22)) -+ AuDbg("copying a large file %lld\n", (long long)len); -+ -+ src->f_pos = 0; -+ dst->f_pos = 0; -+ err = au_do_copy_file(dst, src, len, buf, blksize); -+ if (do_kfree) -+ kfree(buf); -+ else -+ free_page((unsigned long)buf); -+ -+ out: -+ return err; -+} -+ -+/* -+ * to support a sparse file which is opened with O_APPEND, -+ * we need to close the file. -+ */ -+static int au_cp_regular(struct dentry *dentry, aufs_bindex_t bdst, -+ aufs_bindex_t bsrc, loff_t len) -+{ -+ int err, i; -+ enum { SRC, DST }; -+ struct { -+ aufs_bindex_t bindex; -+ unsigned int flags; -+ struct dentry *dentry; -+ struct file *file; -+ void *label, *label_file; -+ } *f, file[] = { -+ { -+ .bindex = bsrc, -+ .flags = O_RDONLY | O_NOATIME | O_LARGEFILE, -+ .file = NULL, -+ .label = &&out, -+ .label_file = &&out_src -+ }, -+ { -+ .bindex = bdst, -+ .flags = O_WRONLY | O_NOATIME | O_LARGEFILE, -+ .file = NULL, -+ .label = &&out_src, -+ .label_file = &&out_dst -+ } -+ }; -+ struct super_block *sb; -+ -+ /* bsrc branch can be ro/rw. */ -+ sb = dentry->d_sb; -+ f = file; -+ for (i = 0; i < 2; i++, f++) { -+ f->dentry = au_h_dptr(dentry, f->bindex); -+ f->file = au_h_open(dentry, f->bindex, f->flags, /*file*/NULL); -+ err = PTR_ERR(f->file); -+ if (IS_ERR(f->file)) -+ goto *f->label; -+ err = -EINVAL; -+ if (unlikely(!f->file->f_op)) -+ goto *f->label_file; -+ } -+ -+ /* try stopping to update while we copyup */ -+ IMustLock(file[SRC].dentry->d_inode); -+ err = au_copy_file(file[DST].file, file[SRC].file, len); -+ -+ out_dst: -+ fput(file[DST].file); -+ au_sbr_put(sb, file[DST].bindex); -+ out_src: -+ fput(file[SRC].file); -+ au_sbr_put(sb, file[SRC].bindex); -+ out: -+ return err; -+} -+ -+static int au_do_cpup_regular(struct dentry *dentry, aufs_bindex_t bdst, -+ aufs_bindex_t bsrc, loff_t len, -+ struct inode *h_dir, struct path *h_path) -+{ -+ int err, rerr; -+ loff_t l; -+ -+ err = 0; -+ l = i_size_read(au_h_iptr(dentry->d_inode, bsrc)); -+ if (len == -1 || l < len) -+ len = l; -+ if (len) -+ err = au_cp_regular(dentry, bdst, bsrc, len); -+ if (!err) -+ goto out; /* success */ -+ -+ rerr = vfsub_unlink(h_dir, h_path, /*force*/0); -+ if (rerr) { -+ AuIOErr("failed unlinking cpup-ed %.*s(%d, %d)\n", -+ AuDLNPair(h_path->dentry), err, rerr); -+ err = -EIO; -+ } -+ -+ out: -+ return err; -+} -+ -+static int au_do_cpup_symlink(struct path *h_path, struct dentry *h_src, -+ struct inode *h_dir) -+{ -+ int err, symlen; -+ mm_segment_t old_fs; -+ char *sym; -+ -+ err = -ENOSYS; -+ if (unlikely(!h_src->d_inode->i_op->readlink)) -+ goto out; -+ -+ err = -ENOMEM; -+ sym = __getname_gfp(GFP_NOFS); -+ if (unlikely(!sym)) -+ goto out; -+ -+ old_fs = get_fs(); -+ set_fs(KERNEL_DS); -+ symlen = h_src->d_inode->i_op->readlink(h_src, (char __user *)sym, -+ PATH_MAX); -+ err = symlen; -+ set_fs(old_fs); -+ -+ if (symlen > 0) { -+ sym[symlen] = 0; -+ err = vfsub_symlink(h_dir, h_path, sym); -+ } -+ __putname(sym); -+ -+ out: -+ return err; -+} -+ -+/* return with the lower dst inode is locked */ -+static noinline_for_stack -+int cpup_entry(struct dentry *dentry, aufs_bindex_t bdst, -+ aufs_bindex_t bsrc, loff_t len, unsigned int flags, -+ struct dentry *dst_parent) -+{ -+ int err; -+ umode_t mode; -+ unsigned int mnt_flags; -+ unsigned char isdir; -+ const unsigned char do_dt = !!au_ftest_cpup(flags, DTIME); -+ struct au_dtime dt; -+ struct path h_path; -+ struct dentry *h_src, *h_dst, *h_parent; -+ struct inode *h_inode, *h_dir; -+ struct super_block *sb; -+ -+ /* bsrc branch can be ro/rw. */ -+ h_src = au_h_dptr(dentry, bsrc); -+ h_inode = h_src->d_inode; -+ AuDebugOn(h_inode != au_h_iptr(dentry->d_inode, bsrc)); -+ -+ /* try stopping to be referenced while we are creating */ -+ h_dst = au_h_dptr(dentry, bdst); -+ h_parent = h_dst->d_parent; /* dir inode is locked */ -+ h_dir = h_parent->d_inode; -+ IMustLock(h_dir); -+ AuDebugOn(h_parent != h_dst->d_parent); -+ -+ sb = dentry->d_sb; -+ h_path.mnt = au_sbr_mnt(sb, bdst); -+ if (do_dt) { -+ h_path.dentry = h_parent; -+ au_dtime_store(&dt, dst_parent, &h_path); -+ } -+ h_path.dentry = h_dst; -+ -+ isdir = 0; -+ mode = h_inode->i_mode; -+ switch (mode & S_IFMT) { -+ case S_IFREG: -+ /* try stopping to update while we are referencing */ -+ IMustLock(h_inode); -+ err = vfsub_create(h_dir, &h_path, mode | S_IWUSR); -+ if (!err) -+ err = au_do_cpup_regular -+ (dentry, bdst, bsrc, len, -+ au_h_iptr(dst_parent->d_inode, bdst), &h_path); -+ break; -+ case S_IFDIR: -+ isdir = 1; -+ err = vfsub_mkdir(h_dir, &h_path, mode); -+ if (!err) { -+ /* -+ * strange behaviour from the users view, -+ * particularry setattr case -+ */ -+ if (au_ibstart(dst_parent->d_inode) == bdst) -+ au_cpup_attr_nlink(dst_parent->d_inode, -+ /*force*/1); -+ au_cpup_attr_nlink(dentry->d_inode, /*force*/1); -+ } -+ break; -+ case S_IFLNK: -+ err = au_do_cpup_symlink(&h_path, h_src, h_dir); -+ break; -+ case S_IFCHR: -+ case S_IFBLK: -+ AuDebugOn(!capable(CAP_MKNOD)); -+ /*FALLTHROUGH*/ -+ case S_IFIFO: -+ case S_IFSOCK: -+ err = vfsub_mknod(h_dir, &h_path, mode, h_inode->i_rdev); -+ break; -+ default: -+ AuIOErr("Unknown inode type 0%o\n", mode); -+ err = -EIO; -+ } -+ -+ mnt_flags = au_mntflags(sb); -+ if (!au_opt_test(mnt_flags, UDBA_NONE) -+ && !isdir -+ && au_opt_test(mnt_flags, XINO) -+ && h_inode->i_nlink == 1 -+ /* todo: unnecessary? */ -+ /* && dentry->d_inode->i_nlink == 1 */ -+ && bdst < bsrc -+ && !au_ftest_cpup(flags, KEEPLINO)) -+ au_xino_write(sb, bsrc, h_inode->i_ino, /*ino*/0); -+ /* ignore this error */ -+ -+ if (do_dt) -+ au_dtime_revert(&dt); -+ return err; -+} -+ -+/* -+ * copyup the @dentry from @bsrc to @bdst. -+ * the caller must set the both of lower dentries. -+ * @len is for truncating when it is -1 copyup the entire file. -+ * in link/rename cases, @dst_parent may be different from the real one. -+ */ -+static int au_cpup_single(struct dentry *dentry, aufs_bindex_t bdst, -+ aufs_bindex_t bsrc, loff_t len, unsigned int flags, -+ struct dentry *dst_parent) -+{ -+ int err, rerr; -+ aufs_bindex_t old_ibstart; -+ unsigned char isdir, plink; -+ struct au_dtime dt; -+ struct path h_path; -+ struct dentry *h_src, *h_dst, *h_parent; -+ struct inode *dst_inode, *h_dir, *inode; -+ struct super_block *sb; -+ -+ AuDebugOn(bsrc <= bdst); -+ -+ sb = dentry->d_sb; -+ h_path.mnt = au_sbr_mnt(sb, bdst); -+ h_dst = au_h_dptr(dentry, bdst); -+ h_parent = h_dst->d_parent; /* dir inode is locked */ -+ h_dir = h_parent->d_inode; -+ IMustLock(h_dir); -+ -+ h_src = au_h_dptr(dentry, bsrc); -+ inode = dentry->d_inode; -+ -+ if (!dst_parent) -+ dst_parent = dget_parent(dentry); -+ else -+ dget(dst_parent); -+ -+ plink = !!au_opt_test(au_mntflags(sb), PLINK); -+ dst_inode = au_h_iptr(inode, bdst); -+ if (dst_inode) { -+ if (unlikely(!plink)) { -+ err = -EIO; -+ AuIOErr("i%lu exists on a upper branch " -+ "but plink is disabled\n", inode->i_ino); -+ goto out; -+ } -+ -+ if (dst_inode->i_nlink) { -+ const int do_dt = au_ftest_cpup(flags, DTIME); -+ -+ h_src = au_plink_lkup(inode, bdst); -+ err = PTR_ERR(h_src); -+ if (IS_ERR(h_src)) -+ goto out; -+ if (unlikely(!h_src->d_inode)) { -+ err = -EIO; -+ AuIOErr("i%lu exists on a upper branch " -+ "but plink is broken\n", inode->i_ino); -+ dput(h_src); -+ goto out; -+ } -+ -+ if (do_dt) { -+ h_path.dentry = h_parent; -+ au_dtime_store(&dt, dst_parent, &h_path); -+ } -+ h_path.dentry = h_dst; -+ err = vfsub_link(h_src, h_dir, &h_path); -+ if (do_dt) -+ au_dtime_revert(&dt); -+ dput(h_src); -+ goto out; -+ } else -+ /* todo: cpup_wh_file? */ -+ /* udba work */ -+ au_update_brange(inode, 1); -+ } -+ -+ old_ibstart = au_ibstart(inode); -+ err = cpup_entry(dentry, bdst, bsrc, len, flags, dst_parent); -+ if (unlikely(err)) -+ goto out; -+ dst_inode = h_dst->d_inode; -+ mutex_lock_nested(&dst_inode->i_mutex, AuLsc_I_CHILD2); -+ -+ err = cpup_iattr(dentry, bdst, h_src); -+ isdir = S_ISDIR(dst_inode->i_mode); -+ if (!err) { -+ if (bdst < old_ibstart) -+ au_set_ibstart(inode, bdst); -+ au_set_h_iptr(inode, bdst, au_igrab(dst_inode), -+ au_hi_flags(inode, isdir)); -+ mutex_unlock(&dst_inode->i_mutex); -+ if (!isdir -+ && h_src->d_inode->i_nlink > 1 -+ && plink) -+ au_plink_append(inode, bdst, h_dst); -+ goto out; /* success */ -+ } -+ -+ /* revert */ -+ h_path.dentry = h_parent; -+ mutex_unlock(&dst_inode->i_mutex); -+ au_dtime_store(&dt, dst_parent, &h_path); -+ h_path.dentry = h_dst; -+ if (!isdir) -+ rerr = vfsub_unlink(h_dir, &h_path, /*force*/0); -+ else -+ rerr = vfsub_rmdir(h_dir, &h_path); -+ au_dtime_revert(&dt); -+ if (rerr) { -+ AuIOErr("failed removing broken entry(%d, %d)\n", err, rerr); -+ err = -EIO; -+ } -+ -+ out: -+ dput(dst_parent); -+ return err; -+} -+ -+struct au_cpup_single_args { -+ int *errp; -+ struct dentry *dentry; -+ aufs_bindex_t bdst, bsrc; -+ loff_t len; -+ unsigned int flags; -+ struct dentry *dst_parent; -+}; -+ -+static void au_call_cpup_single(void *args) -+{ -+ struct au_cpup_single_args *a = args; -+ *a->errp = au_cpup_single(a->dentry, a->bdst, a->bsrc, a->len, -+ a->flags, a->dst_parent); -+} -+ -+int au_sio_cpup_single(struct dentry *dentry, aufs_bindex_t bdst, -+ aufs_bindex_t bsrc, loff_t len, unsigned int flags, -+ struct dentry *dst_parent) -+{ -+ int err, wkq_err; -+ umode_t mode; -+ struct dentry *h_dentry; -+ -+ h_dentry = au_h_dptr(dentry, bsrc); -+ mode = h_dentry->d_inode->i_mode & S_IFMT; -+ if ((mode != S_IFCHR && mode != S_IFBLK) -+ || capable(CAP_MKNOD)) -+ err = au_cpup_single(dentry, bdst, bsrc, len, flags, -+ dst_parent); -+ else { -+ struct au_cpup_single_args args = { -+ .errp = &err, -+ .dentry = dentry, -+ .bdst = bdst, -+ .bsrc = bsrc, -+ .len = len, -+ .flags = flags, -+ .dst_parent = dst_parent -+ }; -+ wkq_err = au_wkq_wait(au_call_cpup_single, &args); -+ if (unlikely(wkq_err)) -+ err = wkq_err; -+ } -+ -+ return err; -+} -+ -+/* -+ * copyup the @dentry from the first active lower branch to @bdst, -+ * using au_cpup_single(). -+ */ -+static int au_cpup_simple(struct dentry *dentry, aufs_bindex_t bdst, loff_t len, -+ unsigned int flags) -+{ -+ int err; -+ aufs_bindex_t bsrc, bend; -+ -+ bend = au_dbend(dentry); -+ for (bsrc = bdst + 1; bsrc <= bend; bsrc++) -+ if (au_h_dptr(dentry, bsrc)) -+ break; -+ -+ err = au_lkup_neg(dentry, bdst); -+ if (!err) { -+ err = au_cpup_single(dentry, bdst, bsrc, len, flags, NULL); -+ if (!err) -+ return 0; /* success */ -+ -+ /* revert */ -+ au_set_h_dptr(dentry, bdst, NULL); -+ au_set_dbstart(dentry, bsrc); -+ } -+ -+ return err; -+} -+ -+struct au_cpup_simple_args { -+ int *errp; -+ struct dentry *dentry; -+ aufs_bindex_t bdst; -+ loff_t len; -+ unsigned int flags; -+}; -+ -+static void au_call_cpup_simple(void *args) -+{ -+ struct au_cpup_simple_args *a = args; -+ *a->errp = au_cpup_simple(a->dentry, a->bdst, a->len, a->flags); -+} -+ -+int au_sio_cpup_simple(struct dentry *dentry, aufs_bindex_t bdst, loff_t len, -+ unsigned int flags) -+{ -+ int err, wkq_err; -+ unsigned char do_sio; -+ struct dentry *parent; -+ struct inode *h_dir; -+ -+ parent = dget_parent(dentry); -+ h_dir = au_h_iptr(parent->d_inode, bdst); -+ do_sio = !!au_test_h_perm_sio(h_dir, MAY_EXEC | MAY_WRITE); -+ if (!do_sio) { -+ /* -+ * testing CAP_MKNOD is for generic fs, -+ * but CAP_FSETID is for xfs only, currently. -+ */ -+ umode_t mode = dentry->d_inode->i_mode; -+ do_sio = (((mode & (S_IFCHR | S_IFBLK)) -+ && !capable(CAP_MKNOD)) -+ || ((mode & (S_ISUID | S_ISGID)) -+ && !capable(CAP_FSETID))); -+ } -+ if (!do_sio) -+ err = au_cpup_simple(dentry, bdst, len, flags); -+ else { -+ struct au_cpup_simple_args args = { -+ .errp = &err, -+ .dentry = dentry, -+ .bdst = bdst, -+ .len = len, -+ .flags = flags -+ }; -+ wkq_err = au_wkq_wait(au_call_cpup_simple, &args); -+ if (unlikely(wkq_err)) -+ err = wkq_err; -+ } -+ -+ dput(parent); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * copyup the deleted file for writing. -+ */ -+static int au_do_cpup_wh(struct dentry *dentry, aufs_bindex_t bdst, -+ struct dentry *wh_dentry, struct file *file, -+ loff_t len) -+{ -+ int err; -+ aufs_bindex_t bstart; -+ struct au_dinfo *dinfo; -+ struct dentry *h_d_dst, *h_d_start; -+ -+ dinfo = au_di(dentry); -+ AuRwMustWriteLock(&dinfo->di_rwsem); -+ -+ bstart = dinfo->di_bstart; -+ h_d_dst = dinfo->di_hdentry[0 + bdst].hd_dentry; -+ dinfo->di_bstart = bdst; -+ dinfo->di_hdentry[0 + bdst].hd_dentry = wh_dentry; -+ h_d_start = dinfo->di_hdentry[0 + bstart].hd_dentry; -+ if (file) -+ dinfo->di_hdentry[0 + bstart].hd_dentry -+ = au_h_fptr(file, au_fbstart(file))->f_dentry; -+ err = au_cpup_single(dentry, bdst, bstart, len, !AuCpup_DTIME, -+ /*h_parent*/NULL); -+ if (!err && file) { -+ err = au_reopen_nondir(file); -+ dinfo->di_hdentry[0 + bstart].hd_dentry = h_d_start; -+ } -+ dinfo->di_hdentry[0 + bdst].hd_dentry = h_d_dst; -+ dinfo->di_bstart = bstart; -+ -+ return err; -+} -+ -+static int au_cpup_wh(struct dentry *dentry, aufs_bindex_t bdst, loff_t len, -+ struct file *file) -+{ -+ int err; -+ struct au_dtime dt; -+ struct dentry *parent, *h_parent, *wh_dentry; -+ struct au_branch *br; -+ struct path h_path; -+ -+ br = au_sbr(dentry->d_sb, bdst); -+ parent = dget_parent(dentry); -+ h_parent = au_h_dptr(parent, bdst); -+ wh_dentry = au_whtmp_lkup(h_parent, br, &dentry->d_name); -+ err = PTR_ERR(wh_dentry); -+ if (IS_ERR(wh_dentry)) -+ goto out; -+ -+ h_path.dentry = h_parent; -+ h_path.mnt = br->br_mnt; -+ au_dtime_store(&dt, parent, &h_path); -+ err = au_do_cpup_wh(dentry, bdst, wh_dentry, file, len); -+ if (unlikely(err)) -+ goto out_wh; -+ -+ dget(wh_dentry); -+ h_path.dentry = wh_dentry; -+ if (!S_ISDIR(wh_dentry->d_inode->i_mode)) -+ err = vfsub_unlink(h_parent->d_inode, &h_path, /*force*/0); -+ else -+ err = vfsub_rmdir(h_parent->d_inode, &h_path); -+ if (unlikely(err)) { -+ AuIOErr("failed remove copied-up tmp file %.*s(%d)\n", -+ AuDLNPair(wh_dentry), err); -+ err = -EIO; -+ } -+ au_dtime_revert(&dt); -+ au_set_hi_wh(dentry->d_inode, bdst, wh_dentry); -+ -+ out_wh: -+ dput(wh_dentry); -+ out: -+ dput(parent); -+ return err; -+} -+ -+struct au_cpup_wh_args { -+ int *errp; -+ struct dentry *dentry; -+ aufs_bindex_t bdst; -+ loff_t len; -+ struct file *file; -+}; -+ -+static void au_call_cpup_wh(void *args) -+{ -+ struct au_cpup_wh_args *a = args; -+ *a->errp = au_cpup_wh(a->dentry, a->bdst, a->len, a->file); -+} -+ -+int au_sio_cpup_wh(struct dentry *dentry, aufs_bindex_t bdst, loff_t len, -+ struct file *file) -+{ -+ int err, wkq_err; -+ struct dentry *parent, *h_orph, *h_parent, *h_dentry; -+ struct inode *dir, *h_dir, *h_tmpdir, *h_inode; -+ struct au_wbr *wbr; -+ -+ parent = dget_parent(dentry); -+ dir = parent->d_inode; -+ h_orph = NULL; -+ h_parent = NULL; -+ h_dir = au_igrab(au_h_iptr(dir, bdst)); -+ h_tmpdir = h_dir; -+ if (!h_dir->i_nlink) { -+ wbr = au_sbr(dentry->d_sb, bdst)->br_wbr; -+ h_orph = wbr->wbr_orph; -+ -+ h_parent = dget(au_h_dptr(parent, bdst)); -+ au_set_h_dptr(parent, bdst, dget(h_orph)); -+ h_tmpdir = h_orph->d_inode; -+ au_set_h_iptr(dir, bdst, au_igrab(h_tmpdir), /*flags*/0); -+ -+ /* this temporary unlock is safe */ -+ if (file) -+ h_dentry = au_h_fptr(file, au_fbstart(file))->f_dentry; -+ else -+ h_dentry = au_h_dptr(dentry, au_dbstart(dentry)); -+ h_inode = h_dentry->d_inode; -+ IMustLock(h_inode); -+ mutex_unlock(&h_inode->i_mutex); -+ mutex_lock_nested(&h_tmpdir->i_mutex, AuLsc_I_PARENT3); -+ mutex_lock_nested(&h_inode->i_mutex, AuLsc_I_CHILD); -+ /* todo: au_h_open_pre()? */ -+ } -+ -+ if (!au_test_h_perm_sio(h_tmpdir, MAY_EXEC | MAY_WRITE)) -+ err = au_cpup_wh(dentry, bdst, len, file); -+ else { -+ struct au_cpup_wh_args args = { -+ .errp = &err, -+ .dentry = dentry, -+ .bdst = bdst, -+ .len = len, -+ .file = file -+ }; -+ wkq_err = au_wkq_wait(au_call_cpup_wh, &args); -+ if (unlikely(wkq_err)) -+ err = wkq_err; -+ } -+ -+ if (h_orph) { -+ mutex_unlock(&h_tmpdir->i_mutex); -+ /* todo: au_h_open_post()? */ -+ au_set_h_iptr(dir, bdst, au_igrab(h_dir), /*flags*/0); -+ au_set_h_dptr(parent, bdst, h_parent); -+ } -+ iput(h_dir); -+ dput(parent); -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * generic routine for both of copy-up and copy-down. -+ */ -+/* cf. revalidate function in file.c */ -+int au_cp_dirs(struct dentry *dentry, aufs_bindex_t bdst, -+ int (*cp)(struct dentry *dentry, aufs_bindex_t bdst, -+ struct dentry *h_parent, void *arg), -+ void *arg) -+{ -+ int err; -+ struct au_pin pin; -+ struct dentry *d, *parent, *h_parent, *real_parent; -+ -+ err = 0; -+ parent = dget_parent(dentry); -+ if (IS_ROOT(parent)) -+ goto out; -+ -+ au_pin_init(&pin, dentry, bdst, AuLsc_DI_PARENT2, AuLsc_I_PARENT2, -+ au_opt_udba(dentry->d_sb), AuPin_MNT_WRITE); -+ -+ /* do not use au_dpage */ -+ real_parent = parent; -+ while (1) { -+ dput(parent); -+ parent = dget_parent(dentry); -+ h_parent = au_h_dptr(parent, bdst); -+ if (h_parent) -+ goto out; /* success */ -+ -+ /* find top dir which is necessary to cpup */ -+ do { -+ d = parent; -+ dput(parent); -+ parent = dget_parent(d); -+ di_read_lock_parent3(parent, !AuLock_IR); -+ h_parent = au_h_dptr(parent, bdst); -+ di_read_unlock(parent, !AuLock_IR); -+ } while (!h_parent); -+ -+ if (d != real_parent) -+ di_write_lock_child3(d); -+ -+ /* somebody else might create while we were sleeping */ -+ if (!au_h_dptr(d, bdst) || !au_h_dptr(d, bdst)->d_inode) { -+ if (au_h_dptr(d, bdst)) -+ au_update_dbstart(d); -+ -+ au_pin_set_dentry(&pin, d); -+ err = au_do_pin(&pin); -+ if (!err) { -+ err = cp(d, bdst, h_parent, arg); -+ au_unpin(&pin); -+ } -+ } -+ -+ if (d != real_parent) -+ di_write_unlock(d); -+ if (unlikely(err)) -+ break; -+ } -+ -+ out: -+ dput(parent); -+ return err; -+} -+ -+static int au_cpup_dir(struct dentry *dentry, aufs_bindex_t bdst, -+ struct dentry *h_parent __maybe_unused , -+ void *arg __maybe_unused) -+{ -+ return au_sio_cpup_simple(dentry, bdst, -1, AuCpup_DTIME); -+} -+ -+int au_cpup_dirs(struct dentry *dentry, aufs_bindex_t bdst) -+{ -+ return au_cp_dirs(dentry, bdst, au_cpup_dir, NULL); -+} -+ -+int au_test_and_cpup_dirs(struct dentry *dentry, aufs_bindex_t bdst) -+{ -+ int err; -+ struct dentry *parent; -+ struct inode *dir; -+ -+ parent = dget_parent(dentry); -+ dir = parent->d_inode; -+ err = 0; -+ if (au_h_iptr(dir, bdst)) -+ goto out; -+ -+ di_read_unlock(parent, AuLock_IR); -+ di_write_lock_parent(parent); -+ /* someone else might change our inode while we were sleeping */ -+ if (!au_h_iptr(dir, bdst)) -+ err = au_cpup_dirs(dentry, bdst); -+ di_downgrade_lock(parent, AuLock_IR); -+ -+ out: -+ dput(parent); -+ return err; -+} -diff -Nur linux-2.6.33.1-vanilla/fs/aufs/cpup.h linux-2.6.33.1/fs/aufs/cpup.h ---- linux-2.6.33.1-vanilla/fs/aufs/cpup.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-2.6.33.1/fs/aufs/cpup.h 2010-04-05 16:53:27.000000000 +0200 -@@ -0,0 +1,81 @@ -+/* -+ * Copyright (C) 2005-2010 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+/* -+ * copy-up/down functions -+ */ -+ -+#ifndef __AUFS_CPUP_H__ -+#define __AUFS_CPUP_H__ -+ -+#ifdef __KERNEL__ -+ -+#include -+#include -+#include -+ -+struct inode; -+struct file; -+ -+void au_cpup_attr_flags(struct inode *dst, struct inode *src); -+void au_cpup_attr_timesizes(struct inode *inode); -+void au_cpup_attr_nlink(struct inode *inode, int force); -+void au_cpup_attr_changeable(struct inode *inode); -+void au_cpup_igen(struct inode *inode, struct inode *h_inode); -+void au_cpup_attr_all(struct inode *inode, int force); -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* cpup flags */ -+#define AuCpup_DTIME 1 /* do dtime_store/revert */ -+#define AuCpup_KEEPLINO (1 << 1) /* do not clear the lower xino, -+ for link(2) */ -+#define au_ftest_cpup(flags, name) ((flags) & AuCpup_##name) -+#define au_fset_cpup(flags, name) { (flags) |= AuCpup_##name; } -+#define au_fclr_cpup(flags, name) { (flags) &= ~AuCpup_##name; } -+ -+int au_copy_file(struct file *dst, struct file *src, loff_t len); -+int au_sio_cpup_single(struct dentry *dentry, aufs_bindex_t bdst, -+ aufs_bindex_t bsrc, loff_t len, unsigned int flags, -+ struct dentry *dst_parent); -+int au_sio_cpup_simple(struct dentry *dentry, aufs_bindex_t bdst, loff_t len, -+ unsigned int flags); -+int au_sio_cpup_wh(struct dentry *dentry, aufs_bindex_t bdst, loff_t len, -+ struct file *file); -+ -+int au_cp_dirs(struct dentry *dentry, aufs_bindex_t bdst, -+ int (*cp)(struct dentry *dentry, aufs_bindex_t bdst, -+ struct dentry *h_parent, void *arg), -+ void *arg); -+int au_cpup_dirs(struct dentry *dentry, aufs_bindex_t bdst); -+int au_test_and_cpup_dirs(struct dentry *dentry, aufs_bindex_t bdst); -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* keep timestamps when copyup */ -+struct au_dtime { -+ struct dentry *dt_dentry; -+ struct path dt_h_path; -+ struct timespec dt_atime, dt_mtime; -+}; -+void au_dtime_store(struct au_dtime *dt, struct dentry *dentry, -+ struct path *h_path); -+void au_dtime_revert(struct au_dtime *dt); -+ -+#endif /* __KERNEL__ */ -+#endif /* __AUFS_CPUP_H__ */ -diff -Nur linux-2.6.33.1-vanilla/fs/aufs/dbgaufs.c linux-2.6.33.1/fs/aufs/dbgaufs.c ---- linux-2.6.33.1-vanilla/fs/aufs/dbgaufs.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-2.6.33.1/fs/aufs/dbgaufs.c 2010-04-05 16:53:27.000000000 +0200 -@@ -0,0 +1,331 @@ -+/* -+ * Copyright (C) 2005-2010 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+/* -+ * debugfs interface -+ */ -+ -+#include -+#include "aufs.h" -+ -+#ifndef CONFIG_SYSFS -+#error DEBUG_FS depends upon SYSFS -+#endif -+ -+static struct dentry *dbgaufs; -+static const mode_t dbgaufs_mode = S_IRUSR | S_IRGRP | S_IROTH; -+ -+/* 20 is max digits length of ulong 64 */ -+struct dbgaufs_arg { -+ int n; -+ char a[20 * 4]; -+}; -+ -+/* -+ * common function for all XINO files -+ */ -+static int dbgaufs_xi_release(struct inode *inode __maybe_unused, -+ struct file *file) -+{ -+ kfree(file->private_data); -+ return 0; -+} -+ -+static int dbgaufs_xi_open(struct file *xf, struct file *file, int do_fcnt) -+{ -+ int err; -+ struct kstat st; -+ struct dbgaufs_arg *p; -+ -+ err = -ENOMEM; -+ p = kmalloc(sizeof(*p), GFP_NOFS); -+ if (unlikely(!p)) -+ goto out; -+ -+ err = 0; -+ p->n = 0; -+ file->private_data = p; -+ if (!xf) -+ goto out; -+ -+ err = vfs_getattr(xf->f_vfsmnt, xf->f_dentry, &st); -+ if (!err) { -+ if (do_fcnt) -+ p->n = snprintf -+ (p->a, sizeof(p->a), "%ld, %llux%lu %lld\n", -+ (long)file_count(xf), st.blocks, st.blksize, -+ (long long)st.size); -+ else -+ p->n = snprintf(p->a, sizeof(p->a), "%llux%lu %lld\n", -+ st.blocks, st.blksize, -+ (long long)st.size); -+ AuDebugOn(p->n >= sizeof(p->a)); -+ } else { -+ p->n = snprintf(p->a, sizeof(p->a), "err %d\n", err); -+ err = 0; -+ } -+ -+ out: -+ return err; -+ -+} -+ -+static ssize_t dbgaufs_xi_read(struct file *file, char __user *buf, -+ size_t count, loff_t *ppos) -+{ -+ struct dbgaufs_arg *p; -+ -+ p = file->private_data; -+ return simple_read_from_buffer(buf, count, ppos, p->a, p->n); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int dbgaufs_xib_open(struct inode *inode, struct file *file) -+{ -+ int err; -+ struct au_sbinfo *sbinfo; -+ struct super_block *sb; -+ -+ sbinfo = inode->i_private; -+ sb = sbinfo->si_sb; -+ si_noflush_read_lock(sb); -+ err = dbgaufs_xi_open(sbinfo->si_xib, file, /*do_fcnt*/0); -+ si_read_unlock(sb); -+ return err; -+} -+ -+static const struct file_operations dbgaufs_xib_fop = { -+ .open = dbgaufs_xib_open, -+ .release = dbgaufs_xi_release, -+ .read = dbgaufs_xi_read -+}; -+ -+/* ---------------------------------------------------------------------- */ -+ -+#define DbgaufsXi_PREFIX "xi" -+ -+static int dbgaufs_xino_open(struct inode *inode, struct file *file) -+{ -+ int err; -+ long l; -+ struct au_sbinfo *sbinfo; -+ struct super_block *sb; -+ struct file *xf; -+ struct qstr *name; -+ -+ err = -ENOENT; -+ xf = NULL; -+ name = &file->f_dentry->d_name; -+ if (unlikely(name->len < sizeof(DbgaufsXi_PREFIX) -+ || memcmp(name->name, DbgaufsXi_PREFIX, -+ sizeof(DbgaufsXi_PREFIX) - 1))) -+ goto out; -+ err = strict_strtol(name->name + sizeof(DbgaufsXi_PREFIX) - 1, 10, &l); -+ if (unlikely(err)) -+ goto out; -+ -+ sbinfo = inode->i_private; -+ sb = sbinfo->si_sb; -+ si_noflush_read_lock(sb); -+ if (l <= au_sbend(sb)) { -+ xf = au_sbr(sb, (aufs_bindex_t)l)->br_xino.xi_file; -+ err = dbgaufs_xi_open(xf, file, /*do_fcnt*/1); -+ } else -+ err = -ENOENT; -+ si_read_unlock(sb); -+ -+ out: -+ return err; -+} -+ -+static const struct file_operations dbgaufs_xino_fop = { -+ .open = dbgaufs_xino_open, -+ .release = dbgaufs_xi_release, -+ .read = dbgaufs_xi_read -+}; -+ -+void dbgaufs_brs_del(struct super_block *sb, aufs_bindex_t bindex) -+{ -+ aufs_bindex_t bend; -+ struct au_branch *br; -+ struct au_xino_file *xi; -+ -+ if (!au_sbi(sb)->si_dbgaufs) -+ return; -+ -+ bend = au_sbend(sb); -+ for (; bindex <= bend; bindex++) { -+ br = au_sbr(sb, bindex); -+ xi = &br->br_xino; -+ if (xi->xi_dbgaufs) { -+ debugfs_remove(xi->xi_dbgaufs); -+ xi->xi_dbgaufs = NULL; -+ } -+ } -+} -+ -+void dbgaufs_brs_add(struct super_block *sb, aufs_bindex_t bindex) -+{ -+ struct au_sbinfo *sbinfo; -+ struct dentry *parent; -+ struct au_branch *br; -+ struct au_xino_file *xi; -+ aufs_bindex_t bend; -+ char name[sizeof(DbgaufsXi_PREFIX) + 5]; /* "xi" bindex NULL */ -+ -+ sbinfo = au_sbi(sb); -+ parent = sbinfo->si_dbgaufs; -+ if (!parent) -+ return; -+ -+ bend = au_sbend(sb); -+ for (; bindex <= bend; bindex++) { -+ snprintf(name, sizeof(name), DbgaufsXi_PREFIX "%d", bindex); -+ br = au_sbr(sb, bindex); -+ xi = &br->br_xino; -+ AuDebugOn(xi->xi_dbgaufs); -+ xi->xi_dbgaufs = debugfs_create_file(name, dbgaufs_mode, parent, -+ sbinfo, &dbgaufs_xino_fop); -+ /* ignore an error */ -+ if (unlikely(!xi->xi_dbgaufs)) -+ AuWarn1("failed %s under debugfs\n", name); -+ } -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+#ifdef CONFIG_AUFS_EXPORT -+static int dbgaufs_xigen_open(struct inode *inode, struct file *file) -+{ -+ int err; -+ struct au_sbinfo *sbinfo; -+ struct super_block *sb; -+ -+ sbinfo = inode->i_private; -+ sb = sbinfo->si_sb; -+ si_noflush_read_lock(sb); -+ err = dbgaufs_xi_open(sbinfo->si_xigen, file, /*do_fcnt*/0); -+ si_read_unlock(sb); -+ return err; -+} -+ -+static const struct file_operations dbgaufs_xigen_fop = { -+ .open = dbgaufs_xigen_open, -+ .release = dbgaufs_xi_release, -+ .read = dbgaufs_xi_read -+}; -+ -+static int dbgaufs_xigen_init(struct au_sbinfo *sbinfo) -+{ -+ int err; -+ -+ /* -+ * This function is a dynamic '__init' fucntion actually, -+ * so the tiny check for si_rwsem is unnecessary. -+ */ -+ /* AuRwMustWriteLock(&sbinfo->si_rwsem); */ -+ -+ err = -EIO; -+ sbinfo->si_dbgaufs_xigen = debugfs_create_file -+ ("xigen", dbgaufs_mode, sbinfo->si_dbgaufs, sbinfo, -+ &dbgaufs_xigen_fop); -+ if (sbinfo->si_dbgaufs_xigen) -+ err = 0; -+ -+ return err; -+} -+#else -+static int dbgaufs_xigen_init(struct au_sbinfo *sbinfo) -+{ -+ return 0; -+} -+#endif /* CONFIG_AUFS_EXPORT */ -+ -+/* ---------------------------------------------------------------------- */ -+ -+void dbgaufs_si_fin(struct au_sbinfo *sbinfo) -+{ -+ /* -+ * This function is a dynamic '__init' fucntion actually, -+ * so the tiny check for si_rwsem is unnecessary. -+ */ -+ /* AuRwMustWriteLock(&sbinfo->si_rwsem); */ -+ -+ debugfs_remove_recursive(sbinfo->si_dbgaufs); -+ sbinfo->si_dbgaufs = NULL; -+ kobject_put(&sbinfo->si_kobj); -+} -+ -+int dbgaufs_si_init(struct au_sbinfo *sbinfo) -+{ -+ int err; -+ char name[SysaufsSiNameLen]; -+ -+ /* -+ * This function is a dynamic '__init' fucntion actually, -+ * so the tiny check for si_rwsem is unnecessary. -+ */ -+ /* AuRwMustWriteLock(&sbinfo->si_rwsem); */ -+ -+ err = -ENOENT; -+ if (!dbgaufs) { -+ AuErr1("/debug/aufs is uninitialized\n"); -+ goto out; -+ } -+ -+ err = -EIO; -+ sysaufs_name(sbinfo, name); -+ sbinfo->si_dbgaufs = debugfs_create_dir(name, dbgaufs); -+ if (unlikely(!sbinfo->si_dbgaufs)) -+ goto out; -+ kobject_get(&sbinfo->si_kobj); -+ -+ sbinfo->si_dbgaufs_xib = debugfs_create_file -+ ("xib", dbgaufs_mode, sbinfo->si_dbgaufs, sbinfo, -+ &dbgaufs_xib_fop); -+ if (unlikely(!sbinfo->si_dbgaufs_xib)) -+ goto out_dir; -+ -+ err = dbgaufs_xigen_init(sbinfo); -+ if (!err) -+ goto out; /* success */ -+ -+ out_dir: -+ dbgaufs_si_fin(sbinfo); -+ out: -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+void dbgaufs_fin(void) -+{ -+ debugfs_remove(dbgaufs); -+} -+ -+int __init dbgaufs_init(void) -+{ -+ int err; -+ -+ err = -EIO; -+ dbgaufs = debugfs_create_dir(AUFS_NAME, NULL); -+ if (dbgaufs) -+ err = 0; -+ return err; -+} -diff -Nur linux-2.6.33.1-vanilla/fs/aufs/dbgaufs.h linux-2.6.33.1/fs/aufs/dbgaufs.h ---- linux-2.6.33.1-vanilla/fs/aufs/dbgaufs.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-2.6.33.1/fs/aufs/dbgaufs.h 2010-04-05 16:53:27.000000000 +0200 -@@ -0,0 +1,52 @@ -+/* -+ * Copyright (C) 2005-2010 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+/* -+ * debugfs interface -+ */ -+ -+#ifndef __DBGAUFS_H__ -+#define __DBGAUFS_H__ -+ -+#ifdef __KERNEL__ -+ -+#include -+#include -+ -+struct super_block; -+struct au_sbinfo; -+ -+#ifdef CONFIG_DEBUG_FS -+/* dbgaufs.c */ -+void dbgaufs_brs_del(struct super_block *sb, aufs_bindex_t bindex); -+void dbgaufs_brs_add(struct super_block *sb, aufs_bindex_t bindex); -+void dbgaufs_si_fin(struct au_sbinfo *sbinfo); -+int dbgaufs_si_init(struct au_sbinfo *sbinfo); -+void dbgaufs_fin(void); -+int __init dbgaufs_init(void); -+#else -+AuStubVoid(dbgaufs_brs_del, struct super_block *sb, aufs_bindex_t bindex) -+AuStubVoid(dbgaufs_brs_add, struct super_block *sb, aufs_bindex_t bindex) -+AuStubVoid(dbgaufs_si_fin, struct au_sbinfo *sbinfo) -+AuStubInt0(dbgaufs_si_init, struct au_sbinfo *sbinfo) -+AuStubVoid(dbgaufs_fin, void) -+AuStubInt0(__init dbgaufs_init, void) -+#endif /* CONFIG_DEBUG_FS */ -+ -+#endif /* __KERNEL__ */ -+#endif /* __DBGAUFS_H__ */ -diff -Nur linux-2.6.33.1-vanilla/fs/aufs/dcsub.c linux-2.6.33.1/fs/aufs/dcsub.c ---- linux-2.6.33.1-vanilla/fs/aufs/dcsub.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-2.6.33.1/fs/aufs/dcsub.c 2010-04-05 16:53:27.000000000 +0200 -@@ -0,0 +1,223 @@ -+/* -+ * Copyright (C) 2005-2010 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+/* -+ * sub-routines for dentry cache -+ */ -+ -+#include "aufs.h" -+ -+static void au_dpage_free(struct au_dpage *dpage) -+{ -+ int i; -+ struct dentry **p; -+ -+ p = dpage->dentries; -+ for (i = 0; i < dpage->ndentry; i++) -+ dput(*p++); -+ free_page((unsigned long)dpage->dentries); -+} -+ -+int au_dpages_init(struct au_dcsub_pages *dpages, gfp_t gfp) -+{ -+ int err; -+ void *p; -+ -+ err = -ENOMEM; -+ dpages->dpages = kmalloc(sizeof(*dpages->dpages), gfp); -+ if (unlikely(!dpages->dpages)) -+ goto out; -+ -+ p = (void *)__get_free_page(gfp); -+ if (unlikely(!p)) -+ goto out_dpages; -+ -+ dpages->dpages[0].ndentry = 0; -+ dpages->dpages[0].dentries = p; -+ dpages->ndpage = 1; -+ return 0; /* success */ -+ -+ out_dpages: -+ kfree(dpages->dpages); -+ out: -+ return err; -+} -+ -+void au_dpages_free(struct au_dcsub_pages *dpages) -+{ -+ int i; -+ struct au_dpage *p; -+ -+ p = dpages->dpages; -+ for (i = 0; i < dpages->ndpage; i++) -+ au_dpage_free(p++); -+ kfree(dpages->dpages); -+} -+ -+static int au_dpages_append(struct au_dcsub_pages *dpages, -+ struct dentry *dentry, gfp_t gfp) -+{ -+ int err, sz; -+ struct au_dpage *dpage; -+ void *p; -+ -+ dpage = dpages->dpages + dpages->ndpage - 1; -+ sz = PAGE_SIZE / sizeof(dentry); -+ if (unlikely(dpage->ndentry >= sz)) { -+ AuLabel(new dpage); -+ err = -ENOMEM; -+ sz = dpages->ndpage * sizeof(*dpages->dpages); -+ p = au_kzrealloc(dpages->dpages, sz, -+ sz + sizeof(*dpages->dpages), gfp); -+ if (unlikely(!p)) -+ goto out; -+ -+ dpages->dpages = p; -+ dpage = dpages->dpages + dpages->ndpage; -+ p = (void *)__get_free_page(gfp); -+ if (unlikely(!p)) -+ goto out; -+ -+ dpage->ndentry = 0; -+ dpage->dentries = p; -+ dpages->ndpage++; -+ } -+ -+ dpage->dentries[dpage->ndentry++] = dget(dentry); -+ return 0; /* success */ -+ -+ out: -+ return err; -+} -+ -+int au_dcsub_pages(struct au_dcsub_pages *dpages, struct dentry *root, -+ au_dpages_test test, void *arg) -+{ -+ int err; -+ struct dentry *this_parent = root; -+ struct list_head *next; -+ struct super_block *sb = root->d_sb; -+ -+ err = 0; -+ spin_lock(&dcache_lock); -+ repeat: -+ next = this_parent->d_subdirs.next; -+ resume: -+ if (this_parent->d_sb == sb -+ && !IS_ROOT(this_parent) -+ && atomic_read(&this_parent->d_count) -+ && this_parent->d_inode -+ && (!test || test(this_parent, arg))) { -+ err = au_dpages_append(dpages, this_parent, GFP_ATOMIC); -+ if (unlikely(err)) -+ goto out; -+ } -+ -+ while (next != &this_parent->d_subdirs) { -+ struct list_head *tmp = next; -+ struct dentry *dentry = list_entry(tmp, struct dentry, -+ d_u.d_child); -+ next = tmp->next; -+ if (/*d_unhashed(dentry) || */!dentry->d_inode) -+ continue; -+ if (!list_empty(&dentry->d_subdirs)) { -+ this_parent = dentry; -+ goto repeat; -+ } -+ if (dentry->d_sb == sb -+ && atomic_read(&dentry->d_count) -+ && (!test || test(dentry, arg))) { -+ err = au_dpages_append(dpages, dentry, GFP_ATOMIC); -+ if (unlikely(err)) -+ goto out; -+ } -+ } -+ -+ if (this_parent != root) { -+ next = this_parent->d_u.d_child.next; -+ this_parent = this_parent->d_parent; /* dcache_lock is locked */ -+ goto resume; -+ } -+ out: -+ spin_unlock(&dcache_lock); -+ return err; -+} -+ -+int au_dcsub_pages_rev(struct au_dcsub_pages *dpages, struct dentry *dentry, -+ int do_include, au_dpages_test test, void *arg) -+{ -+ int err; -+ -+ err = 0; -+ spin_lock(&dcache_lock); -+ if (do_include && (!test || test(dentry, arg))) { -+ err = au_dpages_append(dpages, dentry, GFP_ATOMIC); -+ if (unlikely(err)) -+ goto out; -+ } -+ while (!IS_ROOT(dentry)) { -+ dentry = dentry->d_parent; /* dcache_lock is locked */ -+ if (!test || test(dentry, arg)) { -+ err = au_dpages_append(dpages, dentry, GFP_ATOMIC); -+ if (unlikely(err)) -+ break; -+ } -+ } -+ -+ out: -+ spin_unlock(&dcache_lock); -+ -+ return err; -+} -+ -+struct dentry *au_test_subdir(struct dentry *d1, struct dentry *d2) -+{ -+ struct dentry *trap, **dentries; -+ int err, i, j; -+ struct au_dcsub_pages dpages; -+ struct au_dpage *dpage; -+ -+ trap = ERR_PTR(-ENOMEM); -+ err = au_dpages_init(&dpages, GFP_NOFS); -+ if (unlikely(err)) -+ goto out; -+ err = au_dcsub_pages_rev(&dpages, d1, /*do_include*/1, NULL, NULL); -+ if (unlikely(err)) -+ goto out_dpages; -+ -+ trap = d1; -+ for (i = 0; !err && i < dpages.ndpage; i++) { -+ dpage = dpages.dpages + i; -+ dentries = dpage->dentries; -+ for (j = 0; !err && j < dpage->ndentry; j++) { -+ struct dentry *d; -+ -+ d = dentries[j]; -+ err = (d == d2); -+ if (!err) -+ trap = d; -+ } -+ } -+ if (!err) -+ trap = NULL; -+ -+ out_dpages: -+ au_dpages_free(&dpages); -+ out: -+ return trap; -+} -diff -Nur linux-2.6.33.1-vanilla/fs/aufs/dcsub.h linux-2.6.33.1/fs/aufs/dcsub.h ---- linux-2.6.33.1-vanilla/fs/aufs/dcsub.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-2.6.33.1/fs/aufs/dcsub.h 2010-04-05 16:53:27.000000000 +0200 -@@ -0,0 +1,54 @@ -+/* -+ * Copyright (C) 2005-2010 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+/* -+ * sub-routines for dentry cache -+ */ -+ -+#ifndef __AUFS_DCSUB_H__ -+#define __AUFS_DCSUB_H__ -+ -+#ifdef __KERNEL__ -+ -+#include -+ -+struct dentry; -+ -+struct au_dpage { -+ int ndentry; -+ struct dentry **dentries; -+}; -+ -+struct au_dcsub_pages { -+ int ndpage; -+ struct au_dpage *dpages; -+}; -+ -+/* ---------------------------------------------------------------------- */ -+ -+int au_dpages_init(struct au_dcsub_pages *dpages, gfp_t gfp); -+void au_dpages_free(struct au_dcsub_pages *dpages); -+typedef int (*au_dpages_test)(struct dentry *dentry, void *arg); -+int au_dcsub_pages(struct au_dcsub_pages *dpages, struct dentry *root, -+ au_dpages_test test, void *arg); -+int au_dcsub_pages_rev(struct au_dcsub_pages *dpages, struct dentry *dentry, -+ int do_include, au_dpages_test test, void *arg); -+struct dentry *au_test_subdir(struct dentry *d1, struct dentry *d2); -+ -+#endif /* __KERNEL__ */ -+#endif /* __AUFS_DCSUB_H__ */ -diff -Nur linux-2.6.33.1-vanilla/fs/aufs/debug.c linux-2.6.33.1/fs/aufs/debug.c ---- linux-2.6.33.1-vanilla/fs/aufs/debug.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-2.6.33.1/fs/aufs/debug.c 2010-04-05 16:53:27.000000000 +0200 -@@ -0,0 +1,432 @@ -+/* -+ * Copyright (C) 2005-2010 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+/* -+ * debug print functions -+ */ -+ -+#include -+#include -+#include "aufs.h" -+ -+int aufs_debug; -+MODULE_PARM_DESC(debug, "debug print"); -+module_param_named(debug, aufs_debug, int, S_IRUGO | S_IWUSR | S_IWGRP); -+ -+char *au_plevel = KERN_DEBUG; -+#define dpri(fmt, ...) do { \ -+ if (au_debug_test()) \ -+ printk("%s" fmt, au_plevel, ##__VA_ARGS__); \ -+} while (0) -+ -+/* ---------------------------------------------------------------------- */ -+ -+void au_dpri_whlist(struct au_nhash *whlist) -+{ -+ unsigned long ul, n; -+ struct hlist_head *head; -+ struct au_vdir_wh *tpos; -+ struct hlist_node *pos; -+ -+ n = whlist->nh_num; -+ head = whlist->nh_head; -+ for (ul = 0; ul < n; ul++) { -+ hlist_for_each_entry(tpos, pos, head, wh_hash) -+ dpri("b%d, %.*s, %d\n", -+ tpos->wh_bindex, -+ tpos->wh_str.len, tpos->wh_str.name, -+ tpos->wh_str.len); -+ head++; -+ } -+} -+ -+void au_dpri_vdir(struct au_vdir *vdir) -+{ -+ unsigned long ul; -+ union au_vdir_deblk_p p; -+ unsigned char *o; -+ -+ if (!vdir || IS_ERR(vdir)) { -+ dpri("err %ld\n", PTR_ERR(vdir)); -+ return; -+ } -+ -+ dpri("deblk %u, nblk %lu, deblk %p, last{%lu, %p}, ver %lu\n", -+ vdir->vd_deblk_sz, vdir->vd_nblk, vdir->vd_deblk, -+ vdir->vd_last.ul, vdir->vd_last.p.deblk, vdir->vd_version); -+ for (ul = 0; ul < vdir->vd_nblk; ul++) { -+ p.deblk = vdir->vd_deblk[ul]; -+ o = p.deblk; -+ dpri("[%lu]: %p\n", ul, o); -+ } -+} -+ -+static int do_pri_inode(aufs_bindex_t bindex, struct inode *inode, -+ struct dentry *wh) -+{ -+ char *n = NULL; -+ int l = 0; -+ -+ if (!inode || IS_ERR(inode)) { -+ dpri("i%d: err %ld\n", bindex, PTR_ERR(inode)); -+ return -1; -+ } -+ -+ /* the type of i_blocks depends upon CONFIG_LSF */ -+ BUILD_BUG_ON(sizeof(inode->i_blocks) != sizeof(unsigned long) -+ && sizeof(inode->i_blocks) != sizeof(u64)); -+ if (wh) { -+ n = (void *)wh->d_name.name; -+ l = wh->d_name.len; -+ } -+ -+ dpri("i%d: i%lu, %s, cnt %d, nl %u, 0%o, sz %llu, blk %llu," -+ " ct %lld, np %lu, st 0x%lx, f 0x%x, g %x%s%.*s\n", -+ bindex, -+ inode->i_ino, inode->i_sb ? au_sbtype(inode->i_sb) : "??", -+ atomic_read(&inode->i_count), inode->i_nlink, inode->i_mode, -+ i_size_read(inode), (unsigned long long)inode->i_blocks, -+ (long long)timespec_to_ns(&inode->i_ctime) & 0x0ffff, -+ inode->i_mapping ? inode->i_mapping->nrpages : 0, -+ inode->i_state, inode->i_flags, inode->i_generation, -+ l ? ", wh " : "", l, n); -+ return 0; -+} -+ -+void au_dpri_inode(struct inode *inode) -+{ -+ struct au_iinfo *iinfo; -+ aufs_bindex_t bindex; -+ int err; -+ -+ err = do_pri_inode(-1, inode, NULL); -+ if (err || !au_test_aufs(inode->i_sb)) -+ return; -+ -+ iinfo = au_ii(inode); -+ if (!iinfo) -+ return; -+ dpri("i-1: bstart %d, bend %d, gen %d\n", -+ iinfo->ii_bstart, iinfo->ii_bend, au_iigen(inode)); -+ if (iinfo->ii_bstart < 0) -+ return; -+ for (bindex = iinfo->ii_bstart; bindex <= iinfo->ii_bend; bindex++) -+ do_pri_inode(bindex, iinfo->ii_hinode[0 + bindex].hi_inode, -+ iinfo->ii_hinode[0 + bindex].hi_whdentry); -+} -+ -+static int do_pri_dentry(aufs_bindex_t bindex, struct dentry *dentry) -+{ -+ struct dentry *wh = NULL; -+ -+ if (!dentry || IS_ERR(dentry)) { -+ dpri("d%d: err %ld\n", bindex, PTR_ERR(dentry)); -+ return -1; -+ } -+ /* do not call dget_parent() here */ -+ dpri("d%d: %.*s?/%.*s, %s, cnt %d, flags 0x%x\n", -+ bindex, -+ AuDLNPair(dentry->d_parent), AuDLNPair(dentry), -+ dentry->d_sb ? au_sbtype(dentry->d_sb) : "??", -+ atomic_read(&dentry->d_count), dentry->d_flags); -+ if (bindex >= 0 && dentry->d_inode && au_test_aufs(dentry->d_sb)) { -+ struct au_iinfo *iinfo = au_ii(dentry->d_inode); -+ if (iinfo) -+ wh = iinfo->ii_hinode[0 + bindex].hi_whdentry; -+ } -+ do_pri_inode(bindex, dentry->d_inode, wh); -+ return 0; -+} -+ -+void au_dpri_dentry(struct dentry *dentry) -+{ -+ struct au_dinfo *dinfo; -+ aufs_bindex_t bindex; -+ int err; -+ -+ err = do_pri_dentry(-1, dentry); -+ if (err || !au_test_aufs(dentry->d_sb)) -+ return; -+ -+ dinfo = au_di(dentry); -+ if (!dinfo) -+ return; -+ dpri("d-1: bstart %d, bend %d, bwh %d, bdiropq %d, gen %d\n", -+ dinfo->di_bstart, dinfo->di_bend, -+ dinfo->di_bwh, dinfo->di_bdiropq, au_digen(dentry)); -+ if (dinfo->di_bstart < 0) -+ return; -+ for (bindex = dinfo->di_bstart; bindex <= dinfo->di_bend; bindex++) -+ do_pri_dentry(bindex, dinfo->di_hdentry[0 + bindex].hd_dentry); -+} -+ -+static int do_pri_file(aufs_bindex_t bindex, struct file *file) -+{ -+ char a[32]; -+ -+ if (!file || IS_ERR(file)) { -+ dpri("f%d: err %ld\n", bindex, PTR_ERR(file)); -+ return -1; -+ } -+ a[0] = 0; -+ if (bindex < 0 -+ && file->f_dentry -+ && au_test_aufs(file->f_dentry->d_sb) -+ && au_fi(file)) -+ snprintf(a, sizeof(a), ", mmapped %d", -+ !!au_fi(file)->fi_h_vm_ops); -+ dpri("f%d: mode 0x%x, flags 0%o, cnt %ld, pos %llu%s\n", -+ bindex, file->f_mode, file->f_flags, (long)file_count(file), -+ file->f_pos, a); -+ if (file->f_dentry) -+ do_pri_dentry(bindex, file->f_dentry); -+ return 0; -+} -+ -+void au_dpri_file(struct file *file) -+{ -+ struct au_finfo *finfo; -+ aufs_bindex_t bindex; -+ int err; -+ -+ err = do_pri_file(-1, file); -+ if (err || !file->f_dentry || !au_test_aufs(file->f_dentry->d_sb)) -+ return; -+ -+ finfo = au_fi(file); -+ if (!finfo) -+ return; -+ if (finfo->fi_bstart < 0) -+ return; -+ for (bindex = finfo->fi_bstart; bindex <= finfo->fi_bend; bindex++) { -+ struct au_hfile *hf; -+ -+ hf = finfo->fi_hfile + bindex; -+ do_pri_file(bindex, hf ? hf->hf_file : NULL); -+ } -+} -+ -+static int do_pri_br(aufs_bindex_t bindex, struct au_branch *br) -+{ -+ struct vfsmount *mnt; -+ struct super_block *sb; -+ -+ if (!br || IS_ERR(br)) -+ goto out; -+ mnt = br->br_mnt; -+ if (!mnt || IS_ERR(mnt)) -+ goto out; -+ sb = mnt->mnt_sb; -+ if (!sb || IS_ERR(sb)) -+ goto out; -+ -+ dpri("s%d: {perm 0x%x, cnt %d, wbr %p}, " -+ "%s, dev 0x%02x%02x, flags 0x%lx, cnt(BIAS) %d, active %d, " -+ "xino %d\n", -+ bindex, br->br_perm, atomic_read(&br->br_count), br->br_wbr, -+ au_sbtype(sb), MAJOR(sb->s_dev), MINOR(sb->s_dev), -+ sb->s_flags, sb->s_count - S_BIAS, -+ atomic_read(&sb->s_active), !!br->br_xino.xi_file); -+ return 0; -+ -+ out: -+ dpri("s%d: err %ld\n", bindex, PTR_ERR(br)); -+ return -1; -+} -+ -+void au_dpri_sb(struct super_block *sb) -+{ -+ struct au_sbinfo *sbinfo; -+ aufs_bindex_t bindex; -+ int err; -+ /* to reuduce stack size */ -+ struct { -+ struct vfsmount mnt; -+ struct au_branch fake; -+ } *a; -+ -+ /* this function can be called from magic sysrq */ -+ a = kzalloc(sizeof(*a), GFP_ATOMIC); -+ if (unlikely(!a)) { -+ dpri("no memory\n"); -+ return; -+ } -+ -+ a->mnt.mnt_sb = sb; -+ a->fake.br_perm = 0; -+ a->fake.br_mnt = &a->mnt; -+ a->fake.br_xino.xi_file = NULL; -+ atomic_set(&a->fake.br_count, 0); -+ smp_mb(); /* atomic_set */ -+ err = do_pri_br(-1, &a->fake); -+ kfree(a); -+ dpri("dev 0x%x\n", sb->s_dev); -+ if (err || !au_test_aufs(sb)) -+ return; -+ -+ sbinfo = au_sbi(sb); -+ if (!sbinfo) -+ return; -+ dpri("nw %d, gen %u, kobj %d\n", -+ atomic_read(&sbinfo->si_nowait.nw_len), sbinfo->si_generation, -+ atomic_read(&sbinfo->si_kobj.kref.refcount)); -+ for (bindex = 0; bindex <= sbinfo->si_bend; bindex++) -+ do_pri_br(bindex, sbinfo->si_branch[0 + bindex]); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+void au_dbg_sleep_jiffy(int jiffy) -+{ -+ while (jiffy) -+ jiffy = schedule_timeout_uninterruptible(jiffy); -+} -+ -+void au_dbg_iattr(struct iattr *ia) -+{ -+#define AuBit(name) if (ia->ia_valid & ATTR_ ## name) \ -+ dpri(#name "\n") -+ AuBit(MODE); -+ AuBit(UID); -+ AuBit(GID); -+ AuBit(SIZE); -+ AuBit(ATIME); -+ AuBit(MTIME); -+ AuBit(CTIME); -+ AuBit(ATIME_SET); -+ AuBit(MTIME_SET); -+ AuBit(FORCE); -+ AuBit(ATTR_FLAG); -+ AuBit(KILL_SUID); -+ AuBit(KILL_SGID); -+ AuBit(FILE); -+ AuBit(KILL_PRIV); -+ AuBit(OPEN); -+ AuBit(TIMES_SET); -+#undef AuBit -+ dpri("ia_file %p\n", ia->ia_file); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+void au_dbg_verify_dir_parent(struct dentry *dentry, unsigned int sigen) -+{ -+ struct dentry *parent; -+ -+ parent = dget_parent(dentry); -+ AuDebugOn(!S_ISDIR(dentry->d_inode->i_mode) -+ || IS_ROOT(dentry) -+ || au_digen(parent) != sigen); -+ dput(parent); -+} -+ -+void au_dbg_verify_nondir_parent(struct dentry *dentry, unsigned int sigen) -+{ -+ struct dentry *parent; -+ -+ parent = dget_parent(dentry); -+ AuDebugOn(S_ISDIR(dentry->d_inode->i_mode) -+ || au_digen(parent) != sigen); -+ dput(parent); -+} -+ -+void au_dbg_verify_gen(struct dentry *parent, unsigned int sigen) -+{ -+ int err, i, j; -+ struct au_dcsub_pages dpages; -+ struct au_dpage *dpage; -+ struct dentry **dentries; -+ -+ err = au_dpages_init(&dpages, GFP_NOFS); -+ AuDebugOn(err); -+ err = au_dcsub_pages_rev(&dpages, parent, /*do_include*/1, NULL, NULL); -+ AuDebugOn(err); -+ for (i = dpages.ndpage - 1; !err && i >= 0; i--) { -+ dpage = dpages.dpages + i; -+ dentries = dpage->dentries; -+ for (j = dpage->ndentry - 1; !err && j >= 0; j--) -+ AuDebugOn(au_digen(dentries[j]) != sigen); -+ } -+ au_dpages_free(&dpages); -+} -+ -+void au_dbg_verify_hf(struct au_finfo *finfo) -+{ -+ struct au_hfile *hf; -+ aufs_bindex_t bend, bindex; -+ -+ if (finfo->fi_bstart >= 0) { -+ bend = finfo->fi_bend; -+ for (bindex = finfo->fi_bstart; bindex <= bend; bindex++) { -+ hf = finfo->fi_hfile + bindex; -+ AuDebugOn(hf->hf_file || hf->hf_br); -+ } -+ } -+} -+ -+void au_dbg_verify_kthread(void) -+{ -+ if (au_test_wkq(current)) { -+ au_dbg_blocked(); -+ BUG(); -+ } -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+void au_debug_sbinfo_init(struct au_sbinfo *sbinfo __maybe_unused) -+{ -+#ifdef AuForceNoPlink -+ au_opt_clr(sbinfo->si_mntflags, PLINK); -+#endif -+#ifdef AuForceNoXino -+ au_opt_clr(sbinfo->si_mntflags, XINO); -+#endif -+#ifdef AuForceNoRefrof -+ au_opt_clr(sbinfo->si_mntflags, REFROF); -+#endif -+#ifdef AuForceHnotify -+ au_opt_set_udba(sbinfo->si_mntflags, UDBA_HNOTIFY); -+#endif -+#ifdef AuForceRd0 -+ sbinfo->si_rdblk = 0; -+ sbinfo->si_rdhash = 0; -+#endif -+} -+ -+int __init au_debug_init(void) -+{ -+ aufs_bindex_t bindex; -+ struct au_vdir_destr destr; -+ -+ bindex = -1; -+ AuDebugOn(bindex >= 0); -+ -+ destr.len = -1; -+ AuDebugOn(destr.len < NAME_MAX); -+ -+#ifdef CONFIG_4KSTACKS -+ pr_warning("CONFIG_4KSTACKS is defined.\n"); -+#endif -+ -+#ifdef AuForceNoBrs -+ sysaufs_brs = 0; -+#endif -+ -+ return 0; -+} -diff -Nur linux-2.6.33.1-vanilla/fs/aufs/debug.h linux-2.6.33.1/fs/aufs/debug.h ---- linux-2.6.33.1-vanilla/fs/aufs/debug.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-2.6.33.1/fs/aufs/debug.h 2010-04-05 16:53:27.000000000 +0200 -@@ -0,0 +1,229 @@ -+/* -+ * Copyright (C) 2005-2010 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+/* -+ * debug print functions -+ */ -+ -+#ifndef __AUFS_DEBUG_H__ -+#define __AUFS_DEBUG_H__ -+ -+#ifdef __KERNEL__ -+ -+#include -+#include -+/* #include */ -+#include -+/* #include */ -+#include -+/* #include */ -+/* #include */ -+#include -+#include -+ -+#include -+ -+#ifdef CONFIG_AUFS_DEBUG -+#define AuDebugOn(a) BUG_ON(a) -+ -+/* module parameter */ -+extern int aufs_debug; -+static inline void au_debug(int n) -+{ -+ aufs_debug = n; -+ smp_mb(); -+} -+ -+static inline int au_debug_test(void) -+{ -+ return aufs_debug; -+} -+#else -+#define AuDebugOn(a) do {} while (0) -+AuStubVoid(au_debug, int n) -+AuStubInt0(au_debug_test, void) -+#endif /* CONFIG_AUFS_DEBUG */ -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* debug print */ -+ -+#define AuDbg(fmt, ...) do { \ -+ if (au_debug_test()) \ -+ pr_debug("DEBUG: " fmt, ##__VA_ARGS__); \ -+} while (0) -+#define AuLabel(l) AuDbg(#l "\n") -+#define AuIOErr(fmt, ...) pr_err("I/O Error, " fmt, ##__VA_ARGS__) -+#define AuWarn1(fmt, ...) do { \ -+ static unsigned char _c; \ -+ if (!_c++) \ -+ pr_warning(fmt, ##__VA_ARGS__); \ -+} while (0) -+ -+#define AuErr1(fmt, ...) do { \ -+ static unsigned char _c; \ -+ if (!_c++) \ -+ pr_err(fmt, ##__VA_ARGS__); \ -+} while (0) -+ -+#define AuIOErr1(fmt, ...) do { \ -+ static unsigned char _c; \ -+ if (!_c++) \ -+ AuIOErr(fmt, ##__VA_ARGS__); \ -+} while (0) -+ -+#define AuUnsupportMsg "This operation is not supported." \ -+ " Please report this application to aufs-users ML." -+#define AuUnsupport(fmt, ...) do { \ -+ pr_err(AuUnsupportMsg "\n" fmt, ##__VA_ARGS__); \ -+ dump_stack(); \ -+} while (0) -+ -+#define AuTraceErr(e) do { \ -+ if (unlikely((e) < 0)) \ -+ AuDbg("err %d\n", (int)(e)); \ -+} while (0) -+ -+#define AuTraceErrPtr(p) do { \ -+ if (IS_ERR(p)) \ -+ AuDbg("err %ld\n", PTR_ERR(p)); \ -+} while (0) -+ -+/* dirty macros for debug print, use with "%.*s" and caution */ -+#define AuLNPair(qstr) (qstr)->len, (qstr)->name -+#define AuDLNPair(d) AuLNPair(&(d)->d_name) -+ -+/* ---------------------------------------------------------------------- */ -+ -+struct au_sbinfo; -+struct au_finfo; -+struct dentry; -+#ifdef CONFIG_AUFS_DEBUG -+extern char *au_plevel; -+struct au_nhash; -+void au_dpri_whlist(struct au_nhash *whlist); -+struct au_vdir; -+void au_dpri_vdir(struct au_vdir *vdir); -+struct inode; -+void au_dpri_inode(struct inode *inode); -+void au_dpri_dentry(struct dentry *dentry); -+struct file; -+void au_dpri_file(struct file *filp); -+struct super_block; -+void au_dpri_sb(struct super_block *sb); -+ -+void au_dbg_sleep_jiffy(int jiffy); -+struct iattr; -+void au_dbg_iattr(struct iattr *ia); -+ -+void au_dbg_verify_dir_parent(struct dentry *dentry, unsigned int sigen); -+void au_dbg_verify_nondir_parent(struct dentry *dentry, unsigned int sigen); -+void au_dbg_verify_gen(struct dentry *parent, unsigned int sigen); -+void au_dbg_verify_hf(struct au_finfo *finfo); -+void au_dbg_verify_kthread(void); -+ -+int __init au_debug_init(void); -+void au_debug_sbinfo_init(struct au_sbinfo *sbinfo); -+#define AuDbgWhlist(w) do { \ -+ AuDbg(#w "\n"); \ -+ au_dpri_whlist(w); \ -+} while (0) -+ -+#define AuDbgVdir(v) do { \ -+ AuDbg(#v "\n"); \ -+ au_dpri_vdir(v); \ -+} while (0) -+ -+#define AuDbgInode(i) do { \ -+ AuDbg(#i "\n"); \ -+ au_dpri_inode(i); \ -+} while (0) -+ -+#define AuDbgDentry(d) do { \ -+ AuDbg(#d "\n"); \ -+ au_dpri_dentry(d); \ -+} while (0) -+ -+#define AuDbgFile(f) do { \ -+ AuDbg(#f "\n"); \ -+ au_dpri_file(f); \ -+} while (0) -+ -+#define AuDbgSb(sb) do { \ -+ AuDbg(#sb "\n"); \ -+ au_dpri_sb(sb); \ -+} while (0) -+ -+#define AuDbgSleep(sec) do { \ -+ AuDbg("sleep %d sec\n", sec); \ -+ ssleep(sec); \ -+} while (0) -+ -+#define AuDbgSleepJiffy(jiffy) do { \ -+ AuDbg("sleep %d jiffies\n", jiffy); \ -+ au_dbg_sleep_jiffy(jiffy); \ -+} while (0) -+ -+#define AuDbgIAttr(ia) do { \ -+ AuDbg("ia_valid 0x%x\n", (ia)->ia_valid); \ -+ au_dbg_iattr(ia); \ -+} while (0) -+#else -+AuStubVoid(au_dbg_verify_dir_parent, struct dentry *dentry, unsigned int sigen) -+AuStubVoid(au_dbg_verify_nondir_parent, struct dentry *dentry, -+ unsigned int sigen) -+AuStubVoid(au_dbg_verify_gen, struct dentry *parent, unsigned int sigen) -+AuStubVoid(au_dbg_verify_hf, struct au_finfo *finfo) -+AuStubVoid(au_dbg_verify_kthread, void) -+AuStubInt0(__init au_debug_init, void) -+AuStubVoid(au_debug_sbinfo_init, struct au_sbinfo *sbinfo) -+ -+#define AuDbgWhlist(w) do {} while (0) -+#define AuDbgVdir(v) do {} while (0) -+#define AuDbgInode(i) do {} while (0) -+#define AuDbgDentry(d) do {} while (0) -+#define AuDbgFile(f) do {} while (0) -+#define AuDbgSb(sb) do {} while (0) -+#define AuDbgSleep(sec) do {} while (0) -+#define AuDbgSleepJiffy(jiffy) do {} while (0) -+#define AuDbgIAttr(ia) do {} while (0) -+#endif /* CONFIG_AUFS_DEBUG */ -+ -+/* ---------------------------------------------------------------------- */ -+ -+#ifdef CONFIG_AUFS_MAGIC_SYSRQ -+int __init au_sysrq_init(void); -+void au_sysrq_fin(void); -+ -+#ifdef CONFIG_HW_CONSOLE -+#define au_dbg_blocked() do { \ -+ WARN_ON(1); \ -+ handle_sysrq('w', vc_cons[fg_console].d->vc_tty); \ -+} while (0) -+#else -+AuStubVoid(au_dbg_blocked, void) -+#endif -+ -+#else -+AuStubInt0(__init au_sysrq_init, void) -+AuStubVoid(au_sysrq_fin, void) -+AuStubVoid(au_dbg_blocked, void) -+#endif /* CONFIG_AUFS_MAGIC_SYSRQ */ -+ -+#endif /* __KERNEL__ */ -+#endif /* __AUFS_DEBUG_H__ */ -diff -Nur linux-2.6.33.1-vanilla/fs/aufs/dentry.c linux-2.6.33.1/fs/aufs/dentry.c ---- linux-2.6.33.1-vanilla/fs/aufs/dentry.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-2.6.33.1/fs/aufs/dentry.c 2010-04-05 16:53:27.000000000 +0200 -@@ -0,0 +1,874 @@ -+/* -+ * Copyright (C) 2005-2010 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+/* -+ * lookup and dentry operations -+ */ -+ -+#include -+#include "aufs.h" -+ -+static void au_h_nd(struct nameidata *h_nd, struct nameidata *nd) -+{ -+ if (nd) { -+ *h_nd = *nd; -+ -+ /* -+ * gave up supporting LOOKUP_CREATE/OPEN for lower fs, -+ * due to whiteout and branch permission. -+ */ -+ h_nd->flags &= ~(/*LOOKUP_PARENT |*/ LOOKUP_OPEN | LOOKUP_CREATE -+ | LOOKUP_FOLLOW); -+ /* unnecessary? */ -+ h_nd->intent.open.file = NULL; -+ } else -+ memset(h_nd, 0, sizeof(*h_nd)); -+} -+ -+struct au_lkup_one_args { -+ struct dentry **errp; -+ struct qstr *name; -+ struct dentry *h_parent; -+ struct au_branch *br; -+ struct nameidata *nd; -+}; -+ -+struct dentry *au_lkup_one(struct qstr *name, struct dentry *h_parent, -+ struct au_branch *br, struct nameidata *nd) -+{ -+ struct dentry *h_dentry; -+ int err; -+ struct nameidata h_nd; -+ -+ if (au_test_fs_null_nd(h_parent->d_sb)) -+ return vfsub_lookup_one_len(name->name, h_parent, name->len); -+ -+ au_h_nd(&h_nd, nd); -+ h_nd.path.dentry = h_parent; -+ h_nd.path.mnt = br->br_mnt; -+ -+ err = __lookup_one_len(name->name, &h_nd.last, NULL, name->len); -+ h_dentry = ERR_PTR(err); -+ if (!err) { -+ path_get(&h_nd.path); -+ h_dentry = vfsub_lookup_hash(&h_nd); -+ path_put(&h_nd.path); -+ } -+ -+ AuTraceErrPtr(h_dentry); -+ return h_dentry; -+} -+ -+static void au_call_lkup_one(void *args) -+{ -+ struct au_lkup_one_args *a = args; -+ *a->errp = au_lkup_one(a->name, a->h_parent, a->br, a->nd); -+} -+ -+#define AuLkup_ALLOW_NEG 1 -+#define au_ftest_lkup(flags, name) ((flags) & AuLkup_##name) -+#define au_fset_lkup(flags, name) { (flags) |= AuLkup_##name; } -+#define au_fclr_lkup(flags, name) { (flags) &= ~AuLkup_##name; } -+ -+struct au_do_lookup_args { -+ unsigned int flags; -+ mode_t type; -+ struct nameidata *nd; -+}; -+ -+/* -+ * returns positive/negative dentry, NULL or an error. -+ * NULL means whiteout-ed or not-found. -+ */ -+static struct dentry* -+au_do_lookup(struct dentry *h_parent, struct dentry *dentry, -+ aufs_bindex_t bindex, struct qstr *wh_name, -+ struct au_do_lookup_args *args) -+{ -+ struct dentry *h_dentry; -+ struct inode *h_inode, *inode; -+ struct au_branch *br; -+ int wh_found, opq; -+ unsigned char wh_able; -+ const unsigned char allow_neg = !!au_ftest_lkup(args->flags, ALLOW_NEG); -+ -+ wh_found = 0; -+ br = au_sbr(dentry->d_sb, bindex); -+ wh_able = !!au_br_whable(br->br_perm); -+ if (wh_able) -+ wh_found = au_wh_test(h_parent, wh_name, br, /*try_sio*/0); -+ h_dentry = ERR_PTR(wh_found); -+ if (!wh_found) -+ goto real_lookup; -+ if (unlikely(wh_found < 0)) -+ goto out; -+ -+ /* We found a whiteout */ -+ /* au_set_dbend(dentry, bindex); */ -+ au_set_dbwh(dentry, bindex); -+ if (!allow_neg) -+ return NULL; /* success */ -+ -+ real_lookup: -+ h_dentry = au_lkup_one(&dentry->d_name, h_parent, br, args->nd); -+ if (IS_ERR(h_dentry)) -+ goto out; -+ -+ h_inode = h_dentry->d_inode; -+ if (!h_inode) { -+ if (!allow_neg) -+ goto out_neg; -+ } else if (wh_found -+ || (args->type && args->type != (h_inode->i_mode & S_IFMT))) -+ goto out_neg; -+ -+ if (au_dbend(dentry) <= bindex) -+ au_set_dbend(dentry, bindex); -+ if (au_dbstart(dentry) < 0 || bindex < au_dbstart(dentry)) -+ au_set_dbstart(dentry, bindex); -+ au_set_h_dptr(dentry, bindex, h_dentry); -+ -+ inode = dentry->d_inode; -+ if (!h_inode || !S_ISDIR(h_inode->i_mode) || !wh_able -+ || (inode && !S_ISDIR(inode->i_mode))) -+ goto out; /* success */ -+ -+ mutex_lock_nested(&h_inode->i_mutex, AuLsc_I_CHILD); -+ opq = au_diropq_test(h_dentry, br); -+ mutex_unlock(&h_inode->i_mutex); -+ if (opq > 0) -+ au_set_dbdiropq(dentry, bindex); -+ else if (unlikely(opq < 0)) { -+ au_set_h_dptr(dentry, bindex, NULL); -+ h_dentry = ERR_PTR(opq); -+ } -+ goto out; -+ -+ out_neg: -+ dput(h_dentry); -+ h_dentry = NULL; -+ out: -+ return h_dentry; -+} -+ -+static int au_test_shwh(struct super_block *sb, const struct qstr *name) -+{ -+ if (unlikely(!au_opt_test(au_mntflags(sb), SHWH) -+ && !strncmp(name->name, AUFS_WH_PFX, AUFS_WH_PFX_LEN))) -+ return -EPERM; -+ return 0; -+} -+ -+/* -+ * returns the number of lower positive dentries, -+ * otherwise an error. -+ * can be called at unlinking with @type is zero. -+ */ -+int au_lkup_dentry(struct dentry *dentry, aufs_bindex_t bstart, mode_t type, -+ struct nameidata *nd) -+{ -+ int npositive, err; -+ aufs_bindex_t bindex, btail, bdiropq; -+ unsigned char isdir; -+ struct qstr whname; -+ struct au_do_lookup_args args = { -+ .flags = 0, -+ .type = type, -+ .nd = nd -+ }; -+ const struct qstr *name = &dentry->d_name; -+ struct dentry *parent; -+ struct inode *inode; -+ -+ err = au_test_shwh(dentry->d_sb, name); -+ if (unlikely(err)) -+ goto out; -+ -+ err = au_wh_name_alloc(&whname, name); -+ if (unlikely(err)) -+ goto out; -+ -+ inode = dentry->d_inode; -+ isdir = !!(inode && S_ISDIR(inode->i_mode)); -+ if (!type) -+ au_fset_lkup(args.flags, ALLOW_NEG); -+ -+ npositive = 0; -+ parent = dget_parent(dentry); -+ btail = au_dbtaildir(parent); -+ for (bindex = bstart; bindex <= btail; bindex++) { -+ struct dentry *h_parent, *h_dentry; -+ struct inode *h_inode, *h_dir; -+ -+ h_dentry = au_h_dptr(dentry, bindex); -+ if (h_dentry) { -+ if (h_dentry->d_inode) -+ npositive++; -+ if (type != S_IFDIR) -+ break; -+ continue; -+ } -+ h_parent = au_h_dptr(parent, bindex); -+ if (!h_parent) -+ continue; -+ h_dir = h_parent->d_inode; -+ if (!h_dir || !S_ISDIR(h_dir->i_mode)) -+ continue; -+ -+ mutex_lock_nested(&h_dir->i_mutex, AuLsc_I_PARENT); -+ h_dentry = au_do_lookup(h_parent, dentry, bindex, &whname, -+ &args); -+ mutex_unlock(&h_dir->i_mutex); -+ err = PTR_ERR(h_dentry); -+ if (IS_ERR(h_dentry)) -+ goto out_parent; -+ au_fclr_lkup(args.flags, ALLOW_NEG); -+ -+ if (au_dbwh(dentry) >= 0) -+ break; -+ if (!h_dentry) -+ continue; -+ h_inode = h_dentry->d_inode; -+ if (!h_inode) -+ continue; -+ npositive++; -+ if (!args.type) -+ args.type = h_inode->i_mode & S_IFMT; -+ if (args.type != S_IFDIR) -+ break; -+ else if (isdir) { -+ /* the type of lower may be different */ -+ bdiropq = au_dbdiropq(dentry); -+ if (bdiropq >= 0 && bdiropq <= bindex) -+ break; -+ } -+ } -+ -+ if (npositive) { -+ AuLabel(positive); -+ au_update_dbstart(dentry); -+ } -+ err = npositive; -+ if (unlikely(!au_opt_test(au_mntflags(dentry->d_sb), UDBA_NONE) -+ && au_dbstart(dentry) < 0)) -+ /* both of real entry and whiteout found */ -+ err = -EIO; -+ -+ out_parent: -+ dput(parent); -+ kfree(whname.name); -+ out: -+ return err; -+} -+ -+struct dentry *au_sio_lkup_one(struct qstr *name, struct dentry *parent, -+ struct au_branch *br) -+{ -+ struct dentry *dentry; -+ int wkq_err; -+ -+ if (!au_test_h_perm_sio(parent->d_inode, MAY_EXEC)) -+ dentry = au_lkup_one(name, parent, br, /*nd*/NULL); -+ else { -+ struct au_lkup_one_args args = { -+ .errp = &dentry, -+ .name = name, -+ .h_parent = parent, -+ .br = br, -+ .nd = NULL -+ }; -+ -+ wkq_err = au_wkq_wait(au_call_lkup_one, &args); -+ if (unlikely(wkq_err)) -+ dentry = ERR_PTR(wkq_err); -+ } -+ -+ return dentry; -+} -+ -+/* -+ * lookup @dentry on @bindex which should be negative. -+ */ -+int au_lkup_neg(struct dentry *dentry, aufs_bindex_t bindex) -+{ -+ int err; -+ struct dentry *parent, *h_parent, *h_dentry; -+ -+ parent = dget_parent(dentry); -+ h_parent = au_h_dptr(parent, bindex); -+ h_dentry = au_sio_lkup_one(&dentry->d_name, h_parent, -+ au_sbr(dentry->d_sb, bindex)); -+ err = PTR_ERR(h_dentry); -+ if (IS_ERR(h_dentry)) -+ goto out; -+ if (unlikely(h_dentry->d_inode)) { -+ err = -EIO; -+ AuIOErr("b%d %.*s should be negative.\n", -+ bindex, AuDLNPair(h_dentry)); -+ dput(h_dentry); -+ goto out; -+ } -+ -+ err = 0; -+ if (bindex < au_dbstart(dentry)) -+ au_set_dbstart(dentry, bindex); -+ if (au_dbend(dentry) < bindex) -+ au_set_dbend(dentry, bindex); -+ au_set_h_dptr(dentry, bindex, h_dentry); -+ -+ out: -+ dput(parent); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* subset of struct inode */ -+struct au_iattr { -+ unsigned long i_ino; -+ /* unsigned int i_nlink; */ -+ uid_t i_uid; -+ gid_t i_gid; -+ u64 i_version; -+/* -+ loff_t i_size; -+ blkcnt_t i_blocks; -+*/ -+ umode_t i_mode; -+}; -+ -+static void au_iattr_save(struct au_iattr *ia, struct inode *h_inode) -+{ -+ ia->i_ino = h_inode->i_ino; -+ /* ia->i_nlink = h_inode->i_nlink; */ -+ ia->i_uid = h_inode->i_uid; -+ ia->i_gid = h_inode->i_gid; -+ ia->i_version = h_inode->i_version; -+/* -+ ia->i_size = h_inode->i_size; -+ ia->i_blocks = h_inode->i_blocks; -+*/ -+ ia->i_mode = (h_inode->i_mode & S_IFMT); -+} -+ -+static int au_iattr_test(struct au_iattr *ia, struct inode *h_inode) -+{ -+ return ia->i_ino != h_inode->i_ino -+ /* || ia->i_nlink != h_inode->i_nlink */ -+ || ia->i_uid != h_inode->i_uid -+ || ia->i_gid != h_inode->i_gid -+ || ia->i_version != h_inode->i_version -+/* -+ || ia->i_size != h_inode->i_size -+ || ia->i_blocks != h_inode->i_blocks -+*/ -+ || ia->i_mode != (h_inode->i_mode & S_IFMT); -+} -+ -+static int au_h_verify_dentry(struct dentry *h_dentry, struct dentry *h_parent, -+ struct au_branch *br) -+{ -+ int err; -+ struct au_iattr ia; -+ struct inode *h_inode; -+ struct dentry *h_d; -+ struct super_block *h_sb; -+ -+ err = 0; -+ memset(&ia, -1, sizeof(ia)); -+ h_sb = h_dentry->d_sb; -+ h_inode = h_dentry->d_inode; -+ if (h_inode) -+ au_iattr_save(&ia, h_inode); -+ else if (au_test_nfs(h_sb) || au_test_fuse(h_sb)) -+ /* nfs d_revalidate may return 0 for negative dentry */ -+ /* fuse d_revalidate always return 0 for negative dentry */ -+ goto out; -+ -+ /* main purpose is namei.c:cached_lookup() and d_revalidate */ -+ h_d = au_lkup_one(&h_dentry->d_name, h_parent, br, /*nd*/NULL); -+ err = PTR_ERR(h_d); -+ if (IS_ERR(h_d)) -+ goto out; -+ -+ err = 0; -+ if (unlikely(h_d != h_dentry -+ || h_d->d_inode != h_inode -+ || (h_inode && au_iattr_test(&ia, h_inode)))) -+ err = au_busy_or_stale(); -+ dput(h_d); -+ -+ out: -+ AuTraceErr(err); -+ return err; -+} -+ -+int au_h_verify(struct dentry *h_dentry, unsigned int udba, struct inode *h_dir, -+ struct dentry *h_parent, struct au_branch *br) -+{ -+ int err; -+ -+ err = 0; -+ if (udba == AuOpt_UDBA_REVAL) { -+ IMustLock(h_dir); -+ err = (h_dentry->d_parent->d_inode != h_dir); -+ } else if (udba == AuOpt_UDBA_HNOTIFY) -+ err = au_h_verify_dentry(h_dentry, h_parent, br); -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static void au_do_refresh_hdentry(struct au_hdentry *p, struct au_dinfo *dinfo, -+ struct dentry *parent) -+{ -+ struct dentry *h_d, *h_dp; -+ struct au_hdentry tmp, *q; -+ struct super_block *sb; -+ aufs_bindex_t new_bindex, bindex, bend, bwh, bdiropq; -+ -+ AuRwMustWriteLock(&dinfo->di_rwsem); -+ -+ bend = dinfo->di_bend; -+ bwh = dinfo->di_bwh; -+ bdiropq = dinfo->di_bdiropq; -+ for (bindex = dinfo->di_bstart; bindex <= bend; bindex++, p++) { -+ h_d = p->hd_dentry; -+ if (!h_d) -+ continue; -+ -+ h_dp = dget_parent(h_d); -+ if (h_dp == au_h_dptr(parent, bindex)) { -+ dput(h_dp); -+ continue; -+ } -+ -+ new_bindex = au_find_dbindex(parent, h_dp); -+ dput(h_dp); -+ if (dinfo->di_bwh == bindex) -+ bwh = new_bindex; -+ if (dinfo->di_bdiropq == bindex) -+ bdiropq = new_bindex; -+ if (new_bindex < 0) { -+ au_hdput(p); -+ p->hd_dentry = NULL; -+ continue; -+ } -+ -+ /* swap two lower dentries, and loop again */ -+ q = dinfo->di_hdentry + new_bindex; -+ tmp = *q; -+ *q = *p; -+ *p = tmp; -+ if (tmp.hd_dentry) { -+ bindex--; -+ p--; -+ } -+ } -+ -+ sb = parent->d_sb; -+ dinfo->di_bwh = -1; -+ if (bwh >= 0 && bwh <= au_sbend(sb) && au_sbr_whable(sb, bwh)) -+ dinfo->di_bwh = bwh; -+ -+ dinfo->di_bdiropq = -1; -+ if (bdiropq >= 0 -+ && bdiropq <= au_sbend(sb) -+ && au_sbr_whable(sb, bdiropq)) -+ dinfo->di_bdiropq = bdiropq; -+ -+ bend = au_dbend(parent); -+ p = dinfo->di_hdentry; -+ for (bindex = 0; bindex <= bend; bindex++, p++) -+ if (p->hd_dentry) { -+ dinfo->di_bstart = bindex; -+ break; -+ } -+ -+ p = dinfo->di_hdentry + bend; -+ for (bindex = bend; bindex >= 0; bindex--, p--) -+ if (p->hd_dentry) { -+ dinfo->di_bend = bindex; -+ break; -+ } -+} -+ -+/* -+ * returns the number of found lower positive dentries, -+ * otherwise an error. -+ */ -+int au_refresh_hdentry(struct dentry *dentry, mode_t type) -+{ -+ int npositive, err; -+ unsigned int sigen; -+ aufs_bindex_t bstart; -+ struct au_dinfo *dinfo; -+ struct super_block *sb; -+ struct dentry *parent; -+ -+ DiMustWriteLock(dentry); -+ -+ sb = dentry->d_sb; -+ AuDebugOn(IS_ROOT(dentry)); -+ sigen = au_sigen(sb); -+ parent = dget_parent(dentry); -+ AuDebugOn(au_digen(parent) != sigen -+ || au_iigen(parent->d_inode) != sigen); -+ -+ dinfo = au_di(dentry); -+ err = au_di_realloc(dinfo, au_sbend(sb) + 1); -+ npositive = err; -+ if (unlikely(err)) -+ goto out; -+ au_do_refresh_hdentry(dinfo->di_hdentry + dinfo->di_bstart, dinfo, -+ parent); -+ -+ npositive = 0; -+ bstart = au_dbstart(parent); -+ if (type != S_IFDIR && dinfo->di_bstart == bstart) -+ goto out_dgen; /* success */ -+ -+ npositive = au_lkup_dentry(dentry, bstart, type, /*nd*/NULL); -+ if (npositive < 0) -+ goto out; -+ if (dinfo->di_bwh >= 0 && dinfo->di_bwh <= dinfo->di_bstart) -+ d_drop(dentry); -+ -+ out_dgen: -+ au_update_digen(dentry); -+ out: -+ dput(parent); -+ AuTraceErr(npositive); -+ return npositive; -+} -+ -+static noinline_for_stack -+int au_do_h_d_reval(struct dentry *h_dentry, struct nameidata *nd, -+ struct dentry *dentry, aufs_bindex_t bindex) -+{ -+ int err, valid; -+ int (*reval)(struct dentry *, struct nameidata *); -+ -+ err = 0; -+ reval = NULL; -+ if (h_dentry->d_op) -+ reval = h_dentry->d_op->d_revalidate; -+ if (!reval) -+ goto out; -+ -+ AuDbg("b%d\n", bindex); -+ if (au_test_fs_null_nd(h_dentry->d_sb)) -+ /* it may return tri-state */ -+ valid = reval(h_dentry, NULL); -+ else { -+ struct nameidata h_nd; -+ int locked; -+ struct dentry *parent; -+ -+ au_h_nd(&h_nd, nd); -+ parent = nd->path.dentry; -+ locked = (nd && nd->path.dentry != dentry); -+ if (locked) -+ di_read_lock_parent(parent, AuLock_IR); -+ BUG_ON(bindex > au_dbend(parent)); -+ h_nd.path.dentry = au_h_dptr(parent, bindex); -+ BUG_ON(!h_nd.path.dentry); -+ h_nd.path.mnt = au_sbr(parent->d_sb, bindex)->br_mnt; -+ path_get(&h_nd.path); -+ valid = reval(h_dentry, &h_nd); -+ path_put(&h_nd.path); -+ if (locked) -+ di_read_unlock(parent, AuLock_IR); -+ } -+ -+ if (unlikely(valid < 0)) -+ err = valid; -+ else if (!valid) -+ err = -EINVAL; -+ -+ out: -+ AuTraceErr(err); -+ return err; -+} -+ -+/* todo: remove this */ -+static int h_d_revalidate(struct dentry *dentry, struct inode *inode, -+ struct nameidata *nd, int do_udba) -+{ -+ int err; -+ umode_t mode, h_mode; -+ aufs_bindex_t bindex, btail, bstart, ibs, ibe; -+ unsigned char plus, unhashed, is_root, h_plus; -+ struct inode *h_inode, *h_cached_inode; -+ struct dentry *h_dentry; -+ struct qstr *name, *h_name; -+ -+ err = 0; -+ plus = 0; -+ mode = 0; -+ ibs = -1; -+ ibe = -1; -+ unhashed = !!d_unhashed(dentry); -+ is_root = !!IS_ROOT(dentry); -+ name = &dentry->d_name; -+ -+ /* -+ * Theoretically, REVAL test should be unnecessary in case of INOTIFY. -+ * But inotify doesn't fire some necessary events, -+ * IN_ATTRIB for atime/nlink/pageio -+ * IN_DELETE for NFS dentry -+ * Let's do REVAL test too. -+ */ -+ if (do_udba && inode) { -+ mode = (inode->i_mode & S_IFMT); -+ plus = (inode->i_nlink > 0); -+ ibs = au_ibstart(inode); -+ ibe = au_ibend(inode); -+ } -+ -+ bstart = au_dbstart(dentry); -+ btail = bstart; -+ if (inode && S_ISDIR(inode->i_mode)) -+ btail = au_dbtaildir(dentry); -+ for (bindex = bstart; bindex <= btail; bindex++) { -+ h_dentry = au_h_dptr(dentry, bindex); -+ if (!h_dentry) -+ continue; -+ -+ AuDbg("b%d, %.*s\n", bindex, AuDLNPair(h_dentry)); -+ h_name = &h_dentry->d_name; -+ if (unlikely(do_udba -+ && !is_root -+ && (unhashed != !!d_unhashed(h_dentry) -+ || name->len != h_name->len -+ || memcmp(name->name, h_name->name, name->len)) -+ )) { -+ AuDbg("unhash 0x%x 0x%x, %.*s %.*s\n", -+ unhashed, d_unhashed(h_dentry), -+ AuDLNPair(dentry), AuDLNPair(h_dentry)); -+ goto err; -+ } -+ -+ err = au_do_h_d_reval(h_dentry, nd, dentry, bindex); -+ if (unlikely(err)) -+ /* do not goto err, to keep the errno */ -+ break; -+ -+ /* todo: plink too? */ -+ if (!do_udba) -+ continue; -+ -+ /* UDBA tests */ -+ h_inode = h_dentry->d_inode; -+ if (unlikely(!!inode != !!h_inode)) -+ goto err; -+ -+ h_plus = plus; -+ h_mode = mode; -+ h_cached_inode = h_inode; -+ if (h_inode) { -+ h_mode = (h_inode->i_mode & S_IFMT); -+ h_plus = (h_inode->i_nlink > 0); -+ } -+ if (inode && ibs <= bindex && bindex <= ibe) -+ h_cached_inode = au_h_iptr(inode, bindex); -+ -+ if (unlikely(plus != h_plus -+ || mode != h_mode -+ || h_cached_inode != h_inode)) -+ goto err; -+ continue; -+ -+ err: -+ err = -EINVAL; -+ break; -+ } -+ -+ return err; -+} -+ -+static int simple_reval_dpath(struct dentry *dentry, unsigned int sigen) -+{ -+ int err; -+ struct dentry *parent; -+ struct inode *inode; -+ -+ inode = dentry->d_inode; -+ if (au_digen(dentry) == sigen && au_iigen(inode) == sigen) -+ return 0; -+ -+ parent = dget_parent(dentry); -+ di_read_lock_parent(parent, AuLock_IR); -+ AuDebugOn(au_digen(parent) != sigen -+ || au_iigen(parent->d_inode) != sigen); -+ au_dbg_verify_gen(parent, sigen); -+ -+ /* returns a number of positive dentries */ -+ err = au_refresh_hdentry(dentry, inode->i_mode & S_IFMT); -+ if (err >= 0) -+ err = au_refresh_hinode(inode, dentry); -+ -+ di_read_unlock(parent, AuLock_IR); -+ dput(parent); -+ return err; -+} -+ -+int au_reval_dpath(struct dentry *dentry, unsigned int sigen) -+{ -+ int err; -+ struct dentry *d, *parent; -+ struct inode *inode; -+ -+ if (!au_ftest_si(au_sbi(dentry->d_sb), FAILED_REFRESH_DIRS)) -+ return simple_reval_dpath(dentry, sigen); -+ -+ /* slow loop, keep it simple and stupid */ -+ /* cf: au_cpup_dirs() */ -+ err = 0; -+ parent = NULL; -+ while (au_digen(dentry) != sigen -+ || au_iigen(dentry->d_inode) != sigen) { -+ d = dentry; -+ while (1) { -+ dput(parent); -+ parent = dget_parent(d); -+ if (au_digen(parent) == sigen -+ && au_iigen(parent->d_inode) == sigen) -+ break; -+ d = parent; -+ } -+ -+ inode = d->d_inode; -+ if (d != dentry) -+ di_write_lock_child(d); -+ -+ /* someone might update our dentry while we were sleeping */ -+ if (au_digen(d) != sigen || au_iigen(d->d_inode) != sigen) { -+ di_read_lock_parent(parent, AuLock_IR); -+ /* returns a number of positive dentries */ -+ err = au_refresh_hdentry(d, inode->i_mode & S_IFMT); -+ if (err >= 0) -+ err = au_refresh_hinode(inode, d); -+ di_read_unlock(parent, AuLock_IR); -+ } -+ -+ if (d != dentry) -+ di_write_unlock(d); -+ dput(parent); -+ if (unlikely(err)) -+ break; -+ } -+ -+ return err; -+} -+ -+/* -+ * if valid returns 1, otherwise 0. -+ */ -+static int aufs_d_revalidate(struct dentry *dentry, struct nameidata *nd) -+{ -+ int valid, err; -+ unsigned int sigen; -+ unsigned char do_udba; -+ struct super_block *sb; -+ struct inode *inode; -+ -+ err = -EINVAL; -+ sb = dentry->d_sb; -+ inode = dentry->d_inode; -+ aufs_read_lock(dentry, AuLock_FLUSH | AuLock_DW); -+ sigen = au_sigen(sb); -+ if (au_digen(dentry) != sigen) { -+ AuDebugOn(IS_ROOT(dentry)); -+ if (inode) -+ err = au_reval_dpath(dentry, sigen); -+ if (unlikely(err)) -+ goto out_dgrade; -+ AuDebugOn(au_digen(dentry) != sigen); -+ } -+ if (inode && au_iigen(inode) != sigen) { -+ AuDebugOn(IS_ROOT(dentry)); -+ err = au_refresh_hinode(inode, dentry); -+ if (unlikely(err)) -+ goto out_dgrade; -+ AuDebugOn(au_iigen(inode) != sigen); -+ } -+ di_downgrade_lock(dentry, AuLock_IR); -+ -+ AuDebugOn(au_digen(dentry) != sigen); -+ AuDebugOn(inode && au_iigen(inode) != sigen); -+ err = -EINVAL; -+ do_udba = !au_opt_test(au_mntflags(sb), UDBA_NONE); -+ if (do_udba && inode) { -+ aufs_bindex_t bstart = au_ibstart(inode); -+ -+ if (bstart >= 0 -+ && au_test_higen(inode, au_h_iptr(inode, bstart))) -+ goto out; -+ } -+ -+ err = h_d_revalidate(dentry, inode, nd, do_udba); -+ if (unlikely(!err && do_udba && au_dbstart(dentry) < 0)) -+ /* both of real entry and whiteout found */ -+ err = -EIO; -+ goto out; -+ -+ out_dgrade: -+ di_downgrade_lock(dentry, AuLock_IR); -+ out: -+ aufs_read_unlock(dentry, AuLock_IR); -+ AuTraceErr(err); -+ valid = !err; -+ if (!valid) -+ AuDbg("%.*s invalid\n", AuDLNPair(dentry)); -+ return valid; -+} -+ -+static void aufs_d_release(struct dentry *dentry) -+{ -+ struct au_dinfo *dinfo; -+ aufs_bindex_t bend, bindex; -+ -+ dinfo = dentry->d_fsdata; -+ if (!dinfo) -+ return; -+ -+ /* dentry may not be revalidated */ -+ bindex = dinfo->di_bstart; -+ if (bindex >= 0) { -+ struct au_hdentry *p; -+ -+ bend = dinfo->di_bend; -+ p = dinfo->di_hdentry + bindex; -+ while (bindex++ <= bend) { -+ if (p->hd_dentry) -+ au_hdput(p); -+ p++; -+ } -+ } -+ kfree(dinfo->di_hdentry); -+ AuRwDestroy(&dinfo->di_rwsem); -+ au_cache_free_dinfo(dinfo); -+ au_hn_di_reinit(dentry); -+} -+ -+const struct dentry_operations aufs_dop = { -+ .d_revalidate = aufs_d_revalidate, -+ .d_release = aufs_d_release -+}; -diff -Nur linux-2.6.33.1-vanilla/fs/aufs/dentry.h linux-2.6.33.1/fs/aufs/dentry.h ---- linux-2.6.33.1-vanilla/fs/aufs/dentry.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-2.6.33.1/fs/aufs/dentry.h 2010-04-05 16:53:27.000000000 +0200 -@@ -0,0 +1,228 @@ -+/* -+ * Copyright (C) 2005-2010 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+/* -+ * lookup and dentry operations -+ */ -+ -+#ifndef __AUFS_DENTRY_H__ -+#define __AUFS_DENTRY_H__ -+ -+#ifdef __KERNEL__ -+ -+#include -+#include -+#include "rwsem.h" -+ -+/* make a single member structure for future use */ -+/* todo: remove this structure */ -+struct au_hdentry { -+ struct dentry *hd_dentry; -+}; -+ -+struct au_dinfo { -+ atomic_t di_generation; -+ -+ struct au_rwsem di_rwsem; -+ aufs_bindex_t di_bstart, di_bend, di_bwh, di_bdiropq; -+ struct au_hdentry *di_hdentry; -+}; -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* dentry.c */ -+extern const struct dentry_operations aufs_dop; -+struct au_branch; -+struct dentry *au_lkup_one(struct qstr *name, struct dentry *h_parent, -+ struct au_branch *br, struct nameidata *nd); -+struct dentry *au_sio_lkup_one(struct qstr *name, struct dentry *parent, -+ struct au_branch *br); -+int au_h_verify(struct dentry *h_dentry, unsigned int udba, struct inode *h_dir, -+ struct dentry *h_parent, struct au_branch *br); -+ -+int au_lkup_dentry(struct dentry *dentry, aufs_bindex_t bstart, mode_t type, -+ struct nameidata *nd); -+int au_lkup_neg(struct dentry *dentry, aufs_bindex_t bindex); -+int au_refresh_hdentry(struct dentry *dentry, mode_t type); -+int au_reval_dpath(struct dentry *dentry, unsigned int sigen); -+ -+/* dinfo.c */ -+int au_alloc_dinfo(struct dentry *dentry); -+int au_di_realloc(struct au_dinfo *dinfo, int nbr); -+ -+void di_read_lock(struct dentry *d, int flags, unsigned int lsc); -+void di_read_unlock(struct dentry *d, int flags); -+void di_downgrade_lock(struct dentry *d, int flags); -+void di_write_lock(struct dentry *d, unsigned int lsc); -+void di_write_unlock(struct dentry *d); -+void di_write_lock2_child(struct dentry *d1, struct dentry *d2, int isdir); -+void di_write_lock2_parent(struct dentry *d1, struct dentry *d2, int isdir); -+void di_write_unlock2(struct dentry *d1, struct dentry *d2); -+ -+struct dentry *au_h_dptr(struct dentry *dentry, aufs_bindex_t bindex); -+aufs_bindex_t au_dbtail(struct dentry *dentry); -+aufs_bindex_t au_dbtaildir(struct dentry *dentry); -+ -+void au_set_h_dptr(struct dentry *dentry, aufs_bindex_t bindex, -+ struct dentry *h_dentry); -+void au_update_digen(struct dentry *dentry); -+void au_update_dbrange(struct dentry *dentry, int do_put_zero); -+void au_update_dbstart(struct dentry *dentry); -+void au_update_dbend(struct dentry *dentry); -+int au_find_dbindex(struct dentry *dentry, struct dentry *h_dentry); -+ -+/* ---------------------------------------------------------------------- */ -+ -+static inline struct au_dinfo *au_di(struct dentry *dentry) -+{ -+ return dentry->d_fsdata; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* lock subclass for dinfo */ -+enum { -+ AuLsc_DI_CHILD, /* child first */ -+ AuLsc_DI_CHILD2, /* rename(2), link(2), and cpup at hnotify */ -+ AuLsc_DI_CHILD3, /* copyup dirs */ -+ AuLsc_DI_PARENT, -+ AuLsc_DI_PARENT2, -+ AuLsc_DI_PARENT3 -+}; -+ -+/* -+ * di_read_lock_child, di_write_lock_child, -+ * di_read_lock_child2, di_write_lock_child2, -+ * di_read_lock_child3, di_write_lock_child3, -+ * di_read_lock_parent, di_write_lock_parent, -+ * di_read_lock_parent2, di_write_lock_parent2, -+ * di_read_lock_parent3, di_write_lock_parent3, -+ */ -+#define AuReadLockFunc(name, lsc) \ -+static inline void di_read_lock_##name(struct dentry *d, int flags) \ -+{ di_read_lock(d, flags, AuLsc_DI_##lsc); } -+ -+#define AuWriteLockFunc(name, lsc) \ -+static inline void di_write_lock_##name(struct dentry *d) \ -+{ di_write_lock(d, AuLsc_DI_##lsc); } -+ -+#define AuRWLockFuncs(name, lsc) \ -+ AuReadLockFunc(name, lsc) \ -+ AuWriteLockFunc(name, lsc) -+ -+AuRWLockFuncs(child, CHILD); -+AuRWLockFuncs(child2, CHILD2); -+AuRWLockFuncs(child3, CHILD3); -+AuRWLockFuncs(parent, PARENT); -+AuRWLockFuncs(parent2, PARENT2); -+AuRWLockFuncs(parent3, PARENT3); -+ -+#undef AuReadLockFunc -+#undef AuWriteLockFunc -+#undef AuRWLockFuncs -+ -+#define DiMustNoWaiters(d) AuRwMustNoWaiters(&au_di(d)->di_rwsem) -+#define DiMustAnyLock(d) AuRwMustAnyLock(&au_di(d)->di_rwsem) -+#define DiMustWriteLock(d) AuRwMustWriteLock(&au_di(d)->di_rwsem) -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* todo: memory barrier? */ -+static inline unsigned int au_digen(struct dentry *d) -+{ -+ return atomic_read(&au_di(d)->di_generation); -+} -+ -+static inline void au_h_dentry_init(struct au_hdentry *hdentry) -+{ -+ hdentry->hd_dentry = NULL; -+} -+ -+static inline void au_hdput(struct au_hdentry *hd) -+{ -+ dput(hd->hd_dentry); -+} -+ -+static inline aufs_bindex_t au_dbstart(struct dentry *dentry) -+{ -+ DiMustAnyLock(dentry); -+ return au_di(dentry)->di_bstart; -+} -+ -+static inline aufs_bindex_t au_dbend(struct dentry *dentry) -+{ -+ DiMustAnyLock(dentry); -+ return au_di(dentry)->di_bend; -+} -+ -+static inline aufs_bindex_t au_dbwh(struct dentry *dentry) -+{ -+ DiMustAnyLock(dentry); -+ return au_di(dentry)->di_bwh; -+} -+ -+static inline aufs_bindex_t au_dbdiropq(struct dentry *dentry) -+{ -+ DiMustAnyLock(dentry); -+ return au_di(dentry)->di_bdiropq; -+} -+ -+/* todo: hard/soft set? */ -+static inline void au_set_dbstart(struct dentry *dentry, aufs_bindex_t bindex) -+{ -+ DiMustWriteLock(dentry); -+ au_di(dentry)->di_bstart = bindex; -+} -+ -+static inline void au_set_dbend(struct dentry *dentry, aufs_bindex_t bindex) -+{ -+ DiMustWriteLock(dentry); -+ au_di(dentry)->di_bend = bindex; -+} -+ -+static inline void au_set_dbwh(struct dentry *dentry, aufs_bindex_t bindex) -+{ -+ DiMustWriteLock(dentry); -+ /* dbwh can be outside of bstart - bend range */ -+ au_di(dentry)->di_bwh = bindex; -+} -+ -+static inline void au_set_dbdiropq(struct dentry *dentry, aufs_bindex_t bindex) -+{ -+ DiMustWriteLock(dentry); -+ au_di(dentry)->di_bdiropq = bindex; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+#ifdef CONFIG_AUFS_HNOTIFY -+static inline void au_digen_dec(struct dentry *d) -+{ -+ atomic_dec_return(&au_di(d)->di_generation); -+} -+ -+static inline void au_hn_di_reinit(struct dentry *dentry) -+{ -+ dentry->d_fsdata = NULL; -+} -+#else -+AuStubVoid(au_hn_di_reinit, struct dentry *dentry __maybe_unused) -+#endif /* CONFIG_AUFS_HNOTIFY */ -+ -+#endif /* __KERNEL__ */ -+#endif /* __AUFS_DENTRY_H__ */ -diff -Nur linux-2.6.33.1-vanilla/fs/aufs/dinfo.c linux-2.6.33.1/fs/aufs/dinfo.c ---- linux-2.6.33.1-vanilla/fs/aufs/dinfo.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-2.6.33.1/fs/aufs/dinfo.c 2010-04-05 16:53:27.000000000 +0200 -@@ -0,0 +1,367 @@ -+/* -+ * Copyright (C) 2005-2010 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+/* -+ * dentry private data -+ */ -+ -+#include "aufs.h" -+ -+int au_alloc_dinfo(struct dentry *dentry) -+{ -+ struct au_dinfo *dinfo; -+ struct super_block *sb; -+ int nbr; -+ -+ dinfo = au_cache_alloc_dinfo(); -+ if (unlikely(!dinfo)) -+ goto out; -+ -+ sb = dentry->d_sb; -+ nbr = au_sbend(sb) + 1; -+ if (nbr <= 0) -+ nbr = 1; -+ dinfo->di_hdentry = kcalloc(nbr, sizeof(*dinfo->di_hdentry), GFP_NOFS); -+ if (unlikely(!dinfo->di_hdentry)) -+ goto out_dinfo; -+ -+ atomic_set(&dinfo->di_generation, au_sigen(sb)); -+ /* smp_mb(); */ /* atomic_set */ -+ au_rw_init_wlock_nested(&dinfo->di_rwsem, AuLsc_DI_CHILD); -+ dinfo->di_bstart = -1; -+ dinfo->di_bend = -1; -+ dinfo->di_bwh = -1; -+ dinfo->di_bdiropq = -1; -+ -+ dentry->d_fsdata = dinfo; -+ dentry->d_op = &aufs_dop; -+ return 0; /* success */ -+ -+ out_dinfo: -+ au_cache_free_dinfo(dinfo); -+ out: -+ return -ENOMEM; -+} -+ -+int au_di_realloc(struct au_dinfo *dinfo, int nbr) -+{ -+ int err, sz; -+ struct au_hdentry *hdp; -+ -+ AuRwMustWriteLock(&dinfo->di_rwsem); -+ -+ err = -ENOMEM; -+ sz = sizeof(*hdp) * (dinfo->di_bend + 1); -+ if (!sz) -+ sz = sizeof(*hdp); -+ hdp = au_kzrealloc(dinfo->di_hdentry, sz, sizeof(*hdp) * nbr, GFP_NOFS); -+ if (hdp) { -+ dinfo->di_hdentry = hdp; -+ err = 0; -+ } -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static void do_ii_write_lock(struct inode *inode, unsigned int lsc) -+{ -+ switch (lsc) { -+ case AuLsc_DI_CHILD: -+ ii_write_lock_child(inode); -+ break; -+ case AuLsc_DI_CHILD2: -+ ii_write_lock_child2(inode); -+ break; -+ case AuLsc_DI_CHILD3: -+ ii_write_lock_child3(inode); -+ break; -+ case AuLsc_DI_PARENT: -+ ii_write_lock_parent(inode); -+ break; -+ case AuLsc_DI_PARENT2: -+ ii_write_lock_parent2(inode); -+ break; -+ case AuLsc_DI_PARENT3: -+ ii_write_lock_parent3(inode); -+ break; -+ default: -+ BUG(); -+ } -+} -+ -+static void do_ii_read_lock(struct inode *inode, unsigned int lsc) -+{ -+ switch (lsc) { -+ case AuLsc_DI_CHILD: -+ ii_read_lock_child(inode); -+ break; -+ case AuLsc_DI_CHILD2: -+ ii_read_lock_child2(inode); -+ break; -+ case AuLsc_DI_CHILD3: -+ ii_read_lock_child3(inode); -+ break; -+ case AuLsc_DI_PARENT: -+ ii_read_lock_parent(inode); -+ break; -+ case AuLsc_DI_PARENT2: -+ ii_read_lock_parent2(inode); -+ break; -+ case AuLsc_DI_PARENT3: -+ ii_read_lock_parent3(inode); -+ break; -+ default: -+ BUG(); -+ } -+} -+ -+void di_read_lock(struct dentry *d, int flags, unsigned int lsc) -+{ -+ au_rw_read_lock_nested(&au_di(d)->di_rwsem, lsc); -+ if (d->d_inode) { -+ if (au_ftest_lock(flags, IW)) -+ do_ii_write_lock(d->d_inode, lsc); -+ else if (au_ftest_lock(flags, IR)) -+ do_ii_read_lock(d->d_inode, lsc); -+ } -+} -+ -+void di_read_unlock(struct dentry *d, int flags) -+{ -+ if (d->d_inode) { -+ if (au_ftest_lock(flags, IW)) -+ ii_write_unlock(d->d_inode); -+ else if (au_ftest_lock(flags, IR)) -+ ii_read_unlock(d->d_inode); -+ } -+ au_rw_read_unlock(&au_di(d)->di_rwsem); -+} -+ -+void di_downgrade_lock(struct dentry *d, int flags) -+{ -+ if (d->d_inode && au_ftest_lock(flags, IR)) -+ ii_downgrade_lock(d->d_inode); -+ au_rw_dgrade_lock(&au_di(d)->di_rwsem); -+} -+ -+void di_write_lock(struct dentry *d, unsigned int lsc) -+{ -+ au_rw_write_lock_nested(&au_di(d)->di_rwsem, lsc); -+ if (d->d_inode) -+ do_ii_write_lock(d->d_inode, lsc); -+} -+ -+void di_write_unlock(struct dentry *d) -+{ -+ if (d->d_inode) -+ ii_write_unlock(d->d_inode); -+ au_rw_write_unlock(&au_di(d)->di_rwsem); -+} -+ -+void di_write_lock2_child(struct dentry *d1, struct dentry *d2, int isdir) -+{ -+ AuDebugOn(d1 == d2 -+ || d1->d_inode == d2->d_inode -+ || d1->d_sb != d2->d_sb); -+ -+ if (isdir && au_test_subdir(d1, d2)) { -+ di_write_lock_child(d1); -+ di_write_lock_child2(d2); -+ } else { -+ /* there should be no races */ -+ di_write_lock_child(d2); -+ di_write_lock_child2(d1); -+ } -+} -+ -+void di_write_lock2_parent(struct dentry *d1, struct dentry *d2, int isdir) -+{ -+ AuDebugOn(d1 == d2 -+ || d1->d_inode == d2->d_inode -+ || d1->d_sb != d2->d_sb); -+ -+ if (isdir && au_test_subdir(d1, d2)) { -+ di_write_lock_parent(d1); -+ di_write_lock_parent2(d2); -+ } else { -+ /* there should be no races */ -+ di_write_lock_parent(d2); -+ di_write_lock_parent2(d1); -+ } -+} -+ -+void di_write_unlock2(struct dentry *d1, struct dentry *d2) -+{ -+ di_write_unlock(d1); -+ if (d1->d_inode == d2->d_inode) -+ au_rw_write_unlock(&au_di(d2)->di_rwsem); -+ else -+ di_write_unlock(d2); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+struct dentry *au_h_dptr(struct dentry *dentry, aufs_bindex_t bindex) -+{ -+ struct dentry *d; -+ -+ DiMustAnyLock(dentry); -+ -+ if (au_dbstart(dentry) < 0 || bindex < au_dbstart(dentry)) -+ return NULL; -+ AuDebugOn(bindex < 0); -+ d = au_di(dentry)->di_hdentry[0 + bindex].hd_dentry; -+ AuDebugOn(d && (atomic_read(&d->d_count) <= 0)); -+ return d; -+} -+ -+aufs_bindex_t au_dbtail(struct dentry *dentry) -+{ -+ aufs_bindex_t bend, bwh; -+ -+ bend = au_dbend(dentry); -+ if (0 <= bend) { -+ bwh = au_dbwh(dentry); -+ if (!bwh) -+ return bwh; -+ if (0 < bwh && bwh < bend) -+ return bwh - 1; -+ } -+ return bend; -+} -+ -+aufs_bindex_t au_dbtaildir(struct dentry *dentry) -+{ -+ aufs_bindex_t bend, bopq; -+ -+ bend = au_dbtail(dentry); -+ if (0 <= bend) { -+ bopq = au_dbdiropq(dentry); -+ if (0 <= bopq && bopq < bend) -+ bend = bopq; -+ } -+ return bend; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+void au_set_h_dptr(struct dentry *dentry, aufs_bindex_t bindex, -+ struct dentry *h_dentry) -+{ -+ struct au_hdentry *hd = au_di(dentry)->di_hdentry + bindex; -+ -+ DiMustWriteLock(dentry); -+ -+ if (hd->hd_dentry) -+ au_hdput(hd); -+ hd->hd_dentry = h_dentry; -+} -+ -+void au_update_digen(struct dentry *dentry) -+{ -+ atomic_set(&au_di(dentry)->di_generation, au_sigen(dentry->d_sb)); -+ /* smp_mb(); */ /* atomic_set */ -+} -+ -+void au_update_dbrange(struct dentry *dentry, int do_put_zero) -+{ -+ struct au_dinfo *dinfo; -+ struct dentry *h_d; -+ -+ DiMustWriteLock(dentry); -+ -+ dinfo = au_di(dentry); -+ if (!dinfo || dinfo->di_bstart < 0) -+ return; -+ -+ if (do_put_zero) { -+ aufs_bindex_t bindex, bend; -+ -+ bend = dinfo->di_bend; -+ for (bindex = dinfo->di_bstart; bindex <= bend; bindex++) { -+ h_d = dinfo->di_hdentry[0 + bindex].hd_dentry; -+ if (h_d && !h_d->d_inode) -+ au_set_h_dptr(dentry, bindex, NULL); -+ } -+ } -+ -+ dinfo->di_bstart = -1; -+ while (++dinfo->di_bstart <= dinfo->di_bend) -+ if (dinfo->di_hdentry[0 + dinfo->di_bstart].hd_dentry) -+ break; -+ if (dinfo->di_bstart > dinfo->di_bend) { -+ dinfo->di_bstart = -1; -+ dinfo->di_bend = -1; -+ return; -+ } -+ -+ dinfo->di_bend++; -+ while (0 <= --dinfo->di_bend) -+ if (dinfo->di_hdentry[0 + dinfo->di_bend].hd_dentry) -+ break; -+ AuDebugOn(dinfo->di_bstart > dinfo->di_bend || dinfo->di_bend < 0); -+} -+ -+void au_update_dbstart(struct dentry *dentry) -+{ -+ aufs_bindex_t bindex, bend; -+ struct dentry *h_dentry; -+ -+ bend = au_dbend(dentry); -+ for (bindex = au_dbstart(dentry); bindex <= bend; bindex++) { -+ h_dentry = au_h_dptr(dentry, bindex); -+ if (!h_dentry) -+ continue; -+ if (h_dentry->d_inode) { -+ au_set_dbstart(dentry, bindex); -+ return; -+ } -+ au_set_h_dptr(dentry, bindex, NULL); -+ } -+} -+ -+void au_update_dbend(struct dentry *dentry) -+{ -+ aufs_bindex_t bindex, bstart; -+ struct dentry *h_dentry; -+ -+ bstart = au_dbstart(dentry); -+ for (bindex = au_dbend(dentry); bindex <= bstart; bindex--) { -+ h_dentry = au_h_dptr(dentry, bindex); -+ if (!h_dentry) -+ continue; -+ if (h_dentry->d_inode) { -+ au_set_dbend(dentry, bindex); -+ return; -+ } -+ au_set_h_dptr(dentry, bindex, NULL); -+ } -+} -+ -+int au_find_dbindex(struct dentry *dentry, struct dentry *h_dentry) -+{ -+ aufs_bindex_t bindex, bend; -+ -+ bend = au_dbend(dentry); -+ for (bindex = au_dbstart(dentry); bindex <= bend; bindex++) -+ if (au_h_dptr(dentry, bindex) == h_dentry) -+ return bindex; -+ return -1; -+} -diff -Nur linux-2.6.33.1-vanilla/fs/aufs/dir.c linux-2.6.33.1/fs/aufs/dir.c ---- linux-2.6.33.1-vanilla/fs/aufs/dir.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-2.6.33.1/fs/aufs/dir.c 2010-04-05 16:53:27.000000000 +0200 -@@ -0,0 +1,579 @@ -+/* -+ * Copyright (C) 2005-2010 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+/* -+ * directory operations -+ */ -+ -+#include -+#include -+#include "aufs.h" -+ -+void au_add_nlink(struct inode *dir, struct inode *h_dir) -+{ -+ AuDebugOn(!S_ISDIR(dir->i_mode) || !S_ISDIR(h_dir->i_mode)); -+ -+ dir->i_nlink += h_dir->i_nlink - 2; -+ if (h_dir->i_nlink < 2) -+ dir->i_nlink += 2; -+} -+ -+void au_sub_nlink(struct inode *dir, struct inode *h_dir) -+{ -+ AuDebugOn(!S_ISDIR(dir->i_mode) || !S_ISDIR(h_dir->i_mode)); -+ -+ dir->i_nlink -= h_dir->i_nlink - 2; -+ if (h_dir->i_nlink < 2) -+ dir->i_nlink -= 2; -+} -+ -+loff_t au_dir_size(struct file *file, struct dentry *dentry) -+{ -+ loff_t sz; -+ aufs_bindex_t bindex, bend; -+ struct file *h_file; -+ struct dentry *h_dentry; -+ -+ sz = 0; -+ if (file) { -+ AuDebugOn(!file->f_dentry); -+ AuDebugOn(!file->f_dentry->d_inode); -+ AuDebugOn(!S_ISDIR(file->f_dentry->d_inode->i_mode)); -+ -+ bend = au_fbend(file); -+ for (bindex = au_fbstart(file); -+ bindex <= bend && sz < KMALLOC_MAX_SIZE; -+ bindex++) { -+ h_file = au_h_fptr(file, bindex); -+ if (h_file -+ && h_file->f_dentry -+ && h_file->f_dentry->d_inode) -+ sz += i_size_read(h_file->f_dentry->d_inode); -+ } -+ } else { -+ AuDebugOn(!dentry); -+ AuDebugOn(!dentry->d_inode); -+ AuDebugOn(!S_ISDIR(dentry->d_inode->i_mode)); -+ -+ bend = au_dbtaildir(dentry); -+ for (bindex = au_dbstart(dentry); -+ bindex <= bend && sz < KMALLOC_MAX_SIZE; -+ bindex++) { -+ h_dentry = au_h_dptr(dentry, bindex); -+ if (h_dentry && h_dentry->d_inode) -+ sz += i_size_read(h_dentry->d_inode); -+ } -+ } -+ if (sz < KMALLOC_MAX_SIZE) -+ sz = roundup_pow_of_two(sz); -+ if (sz > KMALLOC_MAX_SIZE) -+ sz = KMALLOC_MAX_SIZE; -+ else if (sz < NAME_MAX) { -+ BUILD_BUG_ON(AUFS_RDBLK_DEF < NAME_MAX); -+ sz = AUFS_RDBLK_DEF; -+ } -+ return sz; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int reopen_dir(struct file *file) -+{ -+ int err; -+ unsigned int flags; -+ aufs_bindex_t bindex, btail, bstart; -+ struct dentry *dentry, *h_dentry; -+ struct file *h_file; -+ -+ /* open all lower dirs */ -+ dentry = file->f_dentry; -+ bstart = au_dbstart(dentry); -+ for (bindex = au_fbstart(file); bindex < bstart; bindex++) -+ au_set_h_fptr(file, bindex, NULL); -+ au_set_fbstart(file, bstart); -+ -+ btail = au_dbtaildir(dentry); -+ for (bindex = au_fbend(file); btail < bindex; bindex--) -+ au_set_h_fptr(file, bindex, NULL); -+ au_set_fbend(file, btail); -+ -+ flags = vfsub_file_flags(file); -+ for (bindex = bstart; bindex <= btail; bindex++) { -+ h_dentry = au_h_dptr(dentry, bindex); -+ if (!h_dentry) -+ continue; -+ h_file = au_h_fptr(file, bindex); -+ if (h_file) -+ continue; -+ -+ h_file = au_h_open(dentry, bindex, flags, file); -+ err = PTR_ERR(h_file); -+ if (IS_ERR(h_file)) -+ goto out; /* close all? */ -+ au_set_h_fptr(file, bindex, h_file); -+ } -+ au_update_figen(file); -+ /* todo: necessary? */ -+ /* file->f_ra = h_file->f_ra; */ -+ err = 0; -+ -+ out: -+ return err; -+} -+ -+static int do_open_dir(struct file *file, int flags) -+{ -+ int err; -+ aufs_bindex_t bindex, btail; -+ struct dentry *dentry, *h_dentry; -+ struct file *h_file; -+ -+ FiMustWriteLock(file); -+ -+ err = 0; -+ dentry = file->f_dentry; -+ au_set_fvdir_cache(file, NULL); -+ file->f_version = dentry->d_inode->i_version; -+ bindex = au_dbstart(dentry); -+ au_set_fbstart(file, bindex); -+ btail = au_dbtaildir(dentry); -+ au_set_fbend(file, btail); -+ for (; !err && bindex <= btail; bindex++) { -+ h_dentry = au_h_dptr(dentry, bindex); -+ if (!h_dentry) -+ continue; -+ -+ h_file = au_h_open(dentry, bindex, flags, file); -+ if (IS_ERR(h_file)) { -+ err = PTR_ERR(h_file); -+ break; -+ } -+ au_set_h_fptr(file, bindex, h_file); -+ } -+ au_update_figen(file); -+ /* todo: necessary? */ -+ /* file->f_ra = h_file->f_ra; */ -+ if (!err) -+ return 0; /* success */ -+ -+ /* close all */ -+ for (bindex = au_fbstart(file); bindex <= btail; bindex++) -+ au_set_h_fptr(file, bindex, NULL); -+ au_set_fbstart(file, -1); -+ au_set_fbend(file, -1); -+ return err; -+} -+ -+static int aufs_open_dir(struct inode *inode __maybe_unused, -+ struct file *file) -+{ -+ return au_do_open(file, do_open_dir); -+} -+ -+static int aufs_release_dir(struct inode *inode __maybe_unused, -+ struct file *file) -+{ -+ struct au_vdir *vdir_cache; -+ struct super_block *sb; -+ -+ sb = file->f_dentry->d_sb; -+ vdir_cache = au_fi(file)->fi_vdir_cache; /* lock-free */ -+ if (vdir_cache) -+ au_vdir_free(vdir_cache); -+ au_plink_maint_leave(file); -+ au_finfo_fin(file); -+ return 0; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int au_do_fsync_dir_no_file(struct dentry *dentry, int datasync) -+{ -+ int err; -+ aufs_bindex_t bend, bindex; -+ struct inode *inode; -+ struct super_block *sb; -+ -+ err = 0; -+ sb = dentry->d_sb; -+ inode = dentry->d_inode; -+ IMustLock(inode); -+ bend = au_dbend(dentry); -+ for (bindex = au_dbstart(dentry); !err && bindex <= bend; bindex++) { -+ struct path h_path; -+ struct inode *h_inode; -+ -+ if (au_test_ro(sb, bindex, inode)) -+ continue; -+ h_path.dentry = au_h_dptr(dentry, bindex); -+ if (!h_path.dentry) -+ continue; -+ h_inode = h_path.dentry->d_inode; -+ if (!h_inode) -+ continue; -+ -+ /* no mnt_want_write() */ -+ /* cf. fs/nsfd/vfs.c and fs/nfsd/nfs4recover.c */ -+ /* todo: inotiry fired? */ -+ h_path.mnt = au_sbr_mnt(sb, bindex); -+ mutex_lock(&h_inode->i_mutex); -+ err = filemap_fdatawrite(h_inode->i_mapping); -+ AuDebugOn(!h_inode->i_fop); -+ if (!err && h_inode->i_fop->fsync) -+ err = h_inode->i_fop->fsync(NULL, h_path.dentry, -+ datasync); -+ if (!err) -+ err = filemap_fdatawrite(h_inode->i_mapping); -+ if (!err) -+ vfsub_update_h_iattr(&h_path, /*did*/NULL); /*ignore*/ -+ mutex_unlock(&h_inode->i_mutex); -+ } -+ -+ return err; -+} -+ -+static int au_do_fsync_dir(struct file *file, int datasync) -+{ -+ int err; -+ aufs_bindex_t bend, bindex; -+ struct file *h_file; -+ struct super_block *sb; -+ struct inode *inode; -+ struct mutex *h_mtx; -+ -+ err = au_reval_and_lock_fdi(file, reopen_dir, /*wlock*/1); -+ if (unlikely(err)) -+ goto out; -+ -+ sb = file->f_dentry->d_sb; -+ inode = file->f_dentry->d_inode; -+ bend = au_fbend(file); -+ for (bindex = au_fbstart(file); !err && bindex <= bend; bindex++) { -+ h_file = au_h_fptr(file, bindex); -+ if (!h_file || au_test_ro(sb, bindex, inode)) -+ continue; -+ -+ err = vfs_fsync(h_file, h_file->f_dentry, datasync); -+ if (!err) { -+ h_mtx = &h_file->f_dentry->d_inode->i_mutex; -+ mutex_lock(h_mtx); -+ vfsub_update_h_iattr(&h_file->f_path, /*did*/NULL); -+ /*ignore*/ -+ mutex_unlock(h_mtx); -+ } -+ } -+ -+ out: -+ return err; -+} -+ -+/* -+ * @file may be NULL -+ */ -+static int aufs_fsync_dir(struct file *file, struct dentry *dentry, -+ int datasync) -+{ -+ int err; -+ struct super_block *sb; -+ -+ IMustLock(dentry->d_inode); -+ -+ err = 0; -+ sb = dentry->d_sb; -+ si_noflush_read_lock(sb); -+ if (file) -+ err = au_do_fsync_dir(file, datasync); -+ else { -+ di_write_lock_child(dentry); -+ err = au_do_fsync_dir_no_file(dentry, datasync); -+ } -+ au_cpup_attr_timesizes(dentry->d_inode); -+ di_write_unlock(dentry); -+ if (file) -+ fi_write_unlock(file); -+ -+ si_read_unlock(sb); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int aufs_readdir(struct file *file, void *dirent, filldir_t filldir) -+{ -+ int err; -+ struct dentry *dentry; -+ struct inode *inode; -+ struct super_block *sb; -+ -+ dentry = file->f_dentry; -+ inode = dentry->d_inode; -+ IMustLock(inode); -+ -+ sb = dentry->d_sb; -+ si_read_lock(sb, AuLock_FLUSH); -+ err = au_reval_and_lock_fdi(file, reopen_dir, /*wlock*/1); -+ if (unlikely(err)) -+ goto out; -+ err = au_vdir_init(file); -+ di_downgrade_lock(dentry, AuLock_IR); -+ if (unlikely(err)) -+ goto out_unlock; -+ -+ if (!au_test_nfsd(current)) { -+ err = au_vdir_fill_de(file, dirent, filldir); -+ fsstack_copy_attr_atime(inode, -+ au_h_iptr(inode, au_ibstart(inode))); -+ } else { -+ /* -+ * nfsd filldir may call lookup_one_len(), vfs_getattr(), -+ * encode_fh() and others. -+ */ -+ struct inode *h_inode = au_h_iptr(inode, au_ibstart(inode)); -+ -+ di_read_unlock(dentry, AuLock_IR); -+ si_read_unlock(sb); -+ /* lockdep_off(); */ -+ err = au_vdir_fill_de(file, dirent, filldir); -+ /* lockdep_on(); */ -+ fsstack_copy_attr_atime(inode, h_inode); -+ fi_write_unlock(file); -+ -+ AuTraceErr(err); -+ return err; -+ } -+ -+ out_unlock: -+ di_read_unlock(dentry, AuLock_IR); -+ fi_write_unlock(file); -+ out: -+ si_read_unlock(sb); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+#define AuTestEmpty_WHONLY 1 -+#define AuTestEmpty_CALLED (1 << 1) -+#define AuTestEmpty_SHWH (1 << 2) -+#define au_ftest_testempty(flags, name) ((flags) & AuTestEmpty_##name) -+#define au_fset_testempty(flags, name) { (flags) |= AuTestEmpty_##name; } -+#define au_fclr_testempty(flags, name) { (flags) &= ~AuTestEmpty_##name; } -+ -+#ifndef CONFIG_AUFS_SHWH -+#undef AuTestEmpty_SHWH -+#define AuTestEmpty_SHWH 0 -+#endif -+ -+struct test_empty_arg { -+ struct au_nhash *whlist; -+ unsigned int flags; -+ int err; -+ aufs_bindex_t bindex; -+}; -+ -+static int test_empty_cb(void *__arg, const char *__name, int namelen, -+ loff_t offset __maybe_unused, u64 ino, -+ unsigned int d_type) -+{ -+ struct test_empty_arg *arg = __arg; -+ char *name = (void *)__name; -+ -+ arg->err = 0; -+ au_fset_testempty(arg->flags, CALLED); -+ /* smp_mb(); */ -+ if (name[0] == '.' -+ && (namelen == 1 || (name[1] == '.' && namelen == 2))) -+ goto out; /* success */ -+ -+ if (namelen <= AUFS_WH_PFX_LEN -+ || memcmp(name, AUFS_WH_PFX, AUFS_WH_PFX_LEN)) { -+ if (au_ftest_testempty(arg->flags, WHONLY) -+ && !au_nhash_test_known_wh(arg->whlist, name, namelen)) -+ arg->err = -ENOTEMPTY; -+ goto out; -+ } -+ -+ name += AUFS_WH_PFX_LEN; -+ namelen -= AUFS_WH_PFX_LEN; -+ if (!au_nhash_test_known_wh(arg->whlist, name, namelen)) -+ arg->err = au_nhash_append_wh -+ (arg->whlist, name, namelen, ino, d_type, arg->bindex, -+ au_ftest_testempty(arg->flags, SHWH)); -+ -+ out: -+ /* smp_mb(); */ -+ AuTraceErr(arg->err); -+ return arg->err; -+} -+ -+static int do_test_empty(struct dentry *dentry, struct test_empty_arg *arg) -+{ -+ int err; -+ struct file *h_file; -+ -+ h_file = au_h_open(dentry, arg->bindex, -+ O_RDONLY | O_NONBLOCK | O_DIRECTORY | O_LARGEFILE, -+ /*file*/NULL); -+ err = PTR_ERR(h_file); -+ if (IS_ERR(h_file)) -+ goto out; -+ -+ err = 0; -+ if (!au_opt_test(au_mntflags(dentry->d_sb), UDBA_NONE) -+ && !h_file->f_dentry->d_inode->i_nlink) -+ goto out_put; -+ -+ do { -+ arg->err = 0; -+ au_fclr_testempty(arg->flags, CALLED); -+ /* smp_mb(); */ -+ err = vfsub_readdir(h_file, test_empty_cb, arg); -+ if (err >= 0) -+ err = arg->err; -+ } while (!err && au_ftest_testempty(arg->flags, CALLED)); -+ -+ out_put: -+ fput(h_file); -+ au_sbr_put(dentry->d_sb, arg->bindex); -+ out: -+ return err; -+} -+ -+struct do_test_empty_args { -+ int *errp; -+ struct dentry *dentry; -+ struct test_empty_arg *arg; -+}; -+ -+static void call_do_test_empty(void *args) -+{ -+ struct do_test_empty_args *a = args; -+ *a->errp = do_test_empty(a->dentry, a->arg); -+} -+ -+static int sio_test_empty(struct dentry *dentry, struct test_empty_arg *arg) -+{ -+ int err, wkq_err; -+ struct dentry *h_dentry; -+ struct inode *h_inode; -+ -+ h_dentry = au_h_dptr(dentry, arg->bindex); -+ h_inode = h_dentry->d_inode; -+ mutex_lock_nested(&h_inode->i_mutex, AuLsc_I_CHILD); -+ err = au_test_h_perm_sio(h_inode, MAY_EXEC | MAY_READ); -+ mutex_unlock(&h_inode->i_mutex); -+ if (!err) -+ err = do_test_empty(dentry, arg); -+ else { -+ struct do_test_empty_args args = { -+ .errp = &err, -+ .dentry = dentry, -+ .arg = arg -+ }; -+ unsigned int flags = arg->flags; -+ -+ wkq_err = au_wkq_wait(call_do_test_empty, &args); -+ if (unlikely(wkq_err)) -+ err = wkq_err; -+ arg->flags = flags; -+ } -+ -+ return err; -+} -+ -+int au_test_empty_lower(struct dentry *dentry) -+{ -+ int err; -+ unsigned int rdhash; -+ aufs_bindex_t bindex, bstart, btail; -+ struct au_nhash whlist; -+ struct test_empty_arg arg; -+ -+ SiMustAnyLock(dentry->d_sb); -+ -+ rdhash = au_sbi(dentry->d_sb)->si_rdhash; -+ if (!rdhash) -+ rdhash = au_rdhash_est(au_dir_size(/*file*/NULL, dentry)); -+ err = au_nhash_alloc(&whlist, rdhash, GFP_NOFS); -+ if (unlikely(err)) -+ goto out; -+ -+ arg.flags = 0; -+ arg.whlist = &whlist; -+ bstart = au_dbstart(dentry); -+ if (au_opt_test(au_mntflags(dentry->d_sb), SHWH)) -+ au_fset_testempty(arg.flags, SHWH); -+ arg.bindex = bstart; -+ err = do_test_empty(dentry, &arg); -+ if (unlikely(err)) -+ goto out_whlist; -+ -+ au_fset_testempty(arg.flags, WHONLY); -+ btail = au_dbtaildir(dentry); -+ for (bindex = bstart + 1; !err && bindex <= btail; bindex++) { -+ struct dentry *h_dentry; -+ -+ h_dentry = au_h_dptr(dentry, bindex); -+ if (h_dentry && h_dentry->d_inode) { -+ arg.bindex = bindex; -+ err = do_test_empty(dentry, &arg); -+ } -+ } -+ -+ out_whlist: -+ au_nhash_wh_free(&whlist); -+ out: -+ return err; -+} -+ -+int au_test_empty(struct dentry *dentry, struct au_nhash *whlist) -+{ -+ int err; -+ struct test_empty_arg arg; -+ aufs_bindex_t bindex, btail; -+ -+ err = 0; -+ arg.whlist = whlist; -+ arg.flags = AuTestEmpty_WHONLY; -+ if (au_opt_test(au_mntflags(dentry->d_sb), SHWH)) -+ au_fset_testempty(arg.flags, SHWH); -+ btail = au_dbtaildir(dentry); -+ for (bindex = au_dbstart(dentry); !err && bindex <= btail; bindex++) { -+ struct dentry *h_dentry; -+ -+ h_dentry = au_h_dptr(dentry, bindex); -+ if (h_dentry && h_dentry->d_inode) { -+ arg.bindex = bindex; -+ err = sio_test_empty(dentry, &arg); -+ } -+ } -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+const struct file_operations aufs_dir_fop = { -+ .read = generic_read_dir, -+ .readdir = aufs_readdir, -+ .unlocked_ioctl = aufs_ioctl_dir, -+ .open = aufs_open_dir, -+ .release = aufs_release_dir, -+ .flush = aufs_flush, -+ .fsync = aufs_fsync_dir -+}; -diff -Nur linux-2.6.33.1-vanilla/fs/aufs/dir.h linux-2.6.33.1/fs/aufs/dir.h ---- linux-2.6.33.1-vanilla/fs/aufs/dir.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-2.6.33.1/fs/aufs/dir.h 2010-04-05 16:53:27.000000000 +0200 -@@ -0,0 +1,127 @@ -+/* -+ * Copyright (C) 2005-2010 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+/* -+ * directory operations -+ */ -+ -+#ifndef __AUFS_DIR_H__ -+#define __AUFS_DIR_H__ -+ -+#ifdef __KERNEL__ -+ -+#include -+#include -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* need to be faster and smaller */ -+ -+struct au_nhash { -+ unsigned int nh_num; -+ struct hlist_head *nh_head; -+}; -+ -+struct au_vdir_destr { -+ unsigned char len; -+ unsigned char name[0]; -+} __packed; -+ -+struct au_vdir_dehstr { -+ struct hlist_node hash; -+ struct au_vdir_destr *str; -+}; -+ -+struct au_vdir_de { -+ ino_t de_ino; -+ unsigned char de_type; -+ /* caution: packed */ -+ struct au_vdir_destr de_str; -+} __packed; -+ -+struct au_vdir_wh { -+ struct hlist_node wh_hash; -+#ifdef CONFIG_AUFS_SHWH -+ ino_t wh_ino; -+ aufs_bindex_t wh_bindex; -+ unsigned char wh_type; -+#else -+ aufs_bindex_t wh_bindex; -+#endif -+ /* caution: packed */ -+ struct au_vdir_destr wh_str; -+} __packed; -+ -+union au_vdir_deblk_p { -+ unsigned char *deblk; -+ struct au_vdir_de *de; -+}; -+ -+struct au_vdir { -+ unsigned char **vd_deblk; -+ unsigned long vd_nblk; -+ struct { -+ unsigned long ul; -+ union au_vdir_deblk_p p; -+ } vd_last; -+ -+ unsigned long vd_version; -+ unsigned int vd_deblk_sz; -+ unsigned long vd_jiffy; -+}; -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* dir.c */ -+extern const struct file_operations aufs_dir_fop; -+void au_add_nlink(struct inode *dir, struct inode *h_dir); -+void au_sub_nlink(struct inode *dir, struct inode *h_dir); -+loff_t au_dir_size(struct file *file, struct dentry *dentry); -+int au_test_empty_lower(struct dentry *dentry); -+int au_test_empty(struct dentry *dentry, struct au_nhash *whlist); -+ -+/* vdir.c */ -+unsigned int au_rdhash_est(loff_t sz); -+int au_nhash_alloc(struct au_nhash *nhash, unsigned int num_hash, gfp_t gfp); -+void au_nhash_wh_free(struct au_nhash *whlist); -+int au_nhash_test_longer_wh(struct au_nhash *whlist, aufs_bindex_t btgt, -+ int limit); -+int au_nhash_test_known_wh(struct au_nhash *whlist, char *name, int nlen); -+int au_nhash_append_wh(struct au_nhash *whlist, char *name, int nlen, ino_t ino, -+ unsigned int d_type, aufs_bindex_t bindex, -+ unsigned char shwh); -+void au_vdir_free(struct au_vdir *vdir); -+int au_vdir_init(struct file *file); -+int au_vdir_fill_de(struct file *file, void *dirent, filldir_t filldir); -+ -+/* ioctl.c */ -+long aufs_ioctl_dir(struct file *file, unsigned int cmd, unsigned long arg); -+ -+#ifdef CONFIG_AUFS_RDU -+/* rdu.c */ -+long au_rdu_ioctl(struct file *file, unsigned int cmd, unsigned long arg); -+#else -+static inline long au_rdu_ioctl(struct file *file, unsigned int cmd, -+ unsigned long arg) -+{ -+ return -EINVAL; -+} -+#endif -+ -+#endif /* __KERNEL__ */ -+#endif /* __AUFS_DIR_H__ */ -diff -Nur linux-2.6.33.1-vanilla/fs/aufs/export.c linux-2.6.33.1/fs/aufs/export.c ---- linux-2.6.33.1-vanilla/fs/aufs/export.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-2.6.33.1/fs/aufs/export.c 2010-04-05 16:53:27.000000000 +0200 -@@ -0,0 +1,745 @@ -+/* -+ * Copyright (C) 2005-2010 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+/* -+ * export via nfs -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include "aufs.h" -+ -+union conv { -+#ifdef CONFIG_AUFS_INO_T_64 -+ __u32 a[2]; -+#else -+ __u32 a[1]; -+#endif -+ ino_t ino; -+}; -+ -+static ino_t decode_ino(__u32 *a) -+{ -+ union conv u; -+ -+ BUILD_BUG_ON(sizeof(u.ino) != sizeof(u.a)); -+ u.a[0] = a[0]; -+#ifdef CONFIG_AUFS_INO_T_64 -+ u.a[1] = a[1]; -+#endif -+ return u.ino; -+} -+ -+static void encode_ino(__u32 *a, ino_t ino) -+{ -+ union conv u; -+ -+ u.ino = ino; -+ a[0] = u.a[0]; -+#ifdef CONFIG_AUFS_INO_T_64 -+ a[1] = u.a[1]; -+#endif -+} -+ -+/* NFS file handle */ -+enum { -+ Fh_br_id, -+ Fh_sigen, -+#ifdef CONFIG_AUFS_INO_T_64 -+ /* support 64bit inode number */ -+ Fh_ino1, -+ Fh_ino2, -+ Fh_dir_ino1, -+ Fh_dir_ino2, -+#else -+ Fh_ino1, -+ Fh_dir_ino1, -+#endif -+ Fh_igen, -+ Fh_h_type, -+ Fh_tail, -+ -+ Fh_ino = Fh_ino1, -+ Fh_dir_ino = Fh_dir_ino1 -+}; -+ -+static int au_test_anon(struct dentry *dentry) -+{ -+ return !!(dentry->d_flags & DCACHE_DISCONNECTED); -+} -+ -+/* ---------------------------------------------------------------------- */ -+/* inode generation external table */ -+ -+int au_xigen_inc(struct inode *inode) -+{ -+ int err; -+ loff_t pos; -+ ssize_t sz; -+ __u32 igen; -+ struct super_block *sb; -+ struct au_sbinfo *sbinfo; -+ -+ err = 0; -+ sb = inode->i_sb; -+ sbinfo = au_sbi(sb); -+ /* -+ * temporary workaround for escaping from SiMustAnyLock() in -+ * au_mntflags(), since this function is called from au_iinfo_fin(). -+ */ -+ if (unlikely(!au_opt_test(sbinfo->si_mntflags, XINO))) -+ goto out; -+ -+ pos = inode->i_ino; -+ pos *= sizeof(igen); -+ igen = inode->i_generation + 1; -+ sz = xino_fwrite(sbinfo->si_xwrite, sbinfo->si_xigen, &igen, -+ sizeof(igen), &pos); -+ if (sz == sizeof(igen)) -+ goto out; /* success */ -+ -+ err = sz; -+ if (unlikely(sz >= 0)) { -+ err = -EIO; -+ AuIOErr("xigen error (%zd)\n", sz); -+ } -+ -+ out: -+ return err; -+} -+ -+int au_xigen_new(struct inode *inode) -+{ -+ int err; -+ loff_t pos; -+ ssize_t sz; -+ struct super_block *sb; -+ struct au_sbinfo *sbinfo; -+ struct file *file; -+ -+ err = 0; -+ /* todo: dirty, at mount time */ -+ if (inode->i_ino == AUFS_ROOT_INO) -+ goto out; -+ sb = inode->i_sb; -+ SiMustAnyLock(sb); -+ if (unlikely(!au_opt_test(au_mntflags(sb), XINO))) -+ goto out; -+ -+ err = -EFBIG; -+ pos = inode->i_ino; -+ if (unlikely(au_loff_max / sizeof(inode->i_generation) - 1 < pos)) { -+ AuIOErr1("too large i%lld\n", pos); -+ goto out; -+ } -+ pos *= sizeof(inode->i_generation); -+ -+ err = 0; -+ sbinfo = au_sbi(sb); -+ file = sbinfo->si_xigen; -+ BUG_ON(!file); -+ -+ if (i_size_read(file->f_dentry->d_inode) -+ < pos + sizeof(inode->i_generation)) { -+ inode->i_generation = atomic_inc_return(&sbinfo->si_xigen_next); -+ sz = xino_fwrite(sbinfo->si_xwrite, file, &inode->i_generation, -+ sizeof(inode->i_generation), &pos); -+ } else -+ sz = xino_fread(sbinfo->si_xread, file, &inode->i_generation, -+ sizeof(inode->i_generation), &pos); -+ if (sz == sizeof(inode->i_generation)) -+ goto out; /* success */ -+ -+ err = sz; -+ if (unlikely(sz >= 0)) { -+ err = -EIO; -+ AuIOErr("xigen error (%zd)\n", sz); -+ } -+ -+ out: -+ return err; -+} -+ -+int au_xigen_set(struct super_block *sb, struct file *base) -+{ -+ int err; -+ struct au_sbinfo *sbinfo; -+ struct file *file; -+ -+ SiMustWriteLock(sb); -+ -+ sbinfo = au_sbi(sb); -+ file = au_xino_create2(base, sbinfo->si_xigen); -+ err = PTR_ERR(file); -+ if (IS_ERR(file)) -+ goto out; -+ err = 0; -+ if (sbinfo->si_xigen) -+ fput(sbinfo->si_xigen); -+ sbinfo->si_xigen = file; -+ -+ out: -+ return err; -+} -+ -+void au_xigen_clr(struct super_block *sb) -+{ -+ struct au_sbinfo *sbinfo; -+ -+ SiMustWriteLock(sb); -+ -+ sbinfo = au_sbi(sb); -+ if (sbinfo->si_xigen) { -+ fput(sbinfo->si_xigen); -+ sbinfo->si_xigen = NULL; -+ } -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static struct dentry *decode_by_ino(struct super_block *sb, ino_t ino, -+ ino_t dir_ino) -+{ -+ struct dentry *dentry, *d; -+ struct inode *inode; -+ unsigned int sigen; -+ -+ dentry = NULL; -+ inode = ilookup(sb, ino); -+ if (!inode) -+ goto out; -+ -+ dentry = ERR_PTR(-ESTALE); -+ sigen = au_sigen(sb); -+ if (unlikely(is_bad_inode(inode) -+ || IS_DEADDIR(inode) -+ || sigen != au_iigen(inode))) -+ goto out_iput; -+ -+ dentry = NULL; -+ if (!dir_ino || S_ISDIR(inode->i_mode)) -+ dentry = d_find_alias(inode); -+ else { -+ spin_lock(&dcache_lock); -+ list_for_each_entry(d, &inode->i_dentry, d_alias) -+ if (!au_test_anon(d) -+ && d->d_parent->d_inode->i_ino == dir_ino) { -+ dentry = dget_locked(d); -+ break; -+ } -+ spin_unlock(&dcache_lock); -+ } -+ if (unlikely(dentry && sigen != au_digen(dentry))) { -+ dput(dentry); -+ dentry = ERR_PTR(-ESTALE); -+ } -+ -+ out_iput: -+ iput(inode); -+ out: -+ return dentry; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* todo: dirty? */ -+/* if exportfs_decode_fh() passed vfsmount*, we could be happy */ -+static struct vfsmount *au_mnt_get(struct super_block *sb) -+{ -+ struct mnt_namespace *ns; -+ struct vfsmount *pos, *mnt; -+ -+ spin_lock(&vfsmount_lock); -+ /* no get/put ?? */ -+ AuDebugOn(!current->nsproxy); -+ ns = current->nsproxy->mnt_ns; -+ AuDebugOn(!ns); -+ mnt = NULL; -+ /* the order (reverse) will not be a problem */ -+ list_for_each_entry(pos, &ns->list, mnt_list) -+ if (pos->mnt_sb == sb) { -+ mnt = mntget(pos); -+ break; -+ } -+ spin_unlock(&vfsmount_lock); -+ AuDebugOn(!mnt); -+ -+ return mnt; -+} -+ -+struct au_nfsd_si_lock { -+ const unsigned int sigen; -+ const aufs_bindex_t br_id; -+ unsigned char force_lock; -+}; -+ -+static aufs_bindex_t si_nfsd_read_lock(struct super_block *sb, -+ struct au_nfsd_si_lock *nsi_lock) -+{ -+ aufs_bindex_t bindex; -+ -+ si_read_lock(sb, AuLock_FLUSH); -+ -+ /* branch id may be wrapped around */ -+ bindex = au_br_index(sb, nsi_lock->br_id); -+ if (bindex >= 0 && nsi_lock->sigen + AUFS_BRANCH_MAX > au_sigen(sb)) -+ goto out; /* success */ -+ -+ if (!nsi_lock->force_lock) -+ si_read_unlock(sb); -+ bindex = -1; -+ -+ out: -+ return bindex; -+} -+ -+struct find_name_by_ino { -+ int called, found; -+ ino_t ino; -+ char *name; -+ int namelen; -+}; -+ -+static int -+find_name_by_ino(void *arg, const char *name, int namelen, loff_t offset, -+ u64 ino, unsigned int d_type) -+{ -+ struct find_name_by_ino *a = arg; -+ -+ a->called++; -+ if (a->ino != ino) -+ return 0; -+ -+ memcpy(a->name, name, namelen); -+ a->namelen = namelen; -+ a->found = 1; -+ return 1; -+} -+ -+static struct dentry *au_lkup_by_ino(struct path *path, ino_t ino, -+ struct au_nfsd_si_lock *nsi_lock) -+{ -+ struct dentry *dentry, *parent; -+ struct file *file; -+ struct inode *dir; -+ struct find_name_by_ino arg; -+ int err; -+ -+ parent = path->dentry; -+ if (nsi_lock) -+ si_read_unlock(parent->d_sb); -+ file = vfsub_dentry_open(path, au_dir_roflags); -+ dentry = (void *)file; -+ if (IS_ERR(file)) -+ goto out; -+ -+ dentry = ERR_PTR(-ENOMEM); -+ arg.name = __getname_gfp(GFP_NOFS); -+ if (unlikely(!arg.name)) -+ goto out_file; -+ arg.ino = ino; -+ arg.found = 0; -+ do { -+ arg.called = 0; -+ /* smp_mb(); */ -+ err = vfsub_readdir(file, find_name_by_ino, &arg); -+ } while (!err && !arg.found && arg.called); -+ dentry = ERR_PTR(err); -+ if (unlikely(err)) -+ goto out_name; -+ dentry = ERR_PTR(-ENOENT); -+ if (!arg.found) -+ goto out_name; -+ -+ /* do not call au_lkup_one() */ -+ dir = parent->d_inode; -+ mutex_lock(&dir->i_mutex); -+ dentry = vfsub_lookup_one_len(arg.name, parent, arg.namelen); -+ mutex_unlock(&dir->i_mutex); -+ AuTraceErrPtr(dentry); -+ if (IS_ERR(dentry)) -+ goto out_name; -+ AuDebugOn(au_test_anon(dentry)); -+ if (unlikely(!dentry->d_inode)) { -+ dput(dentry); -+ dentry = ERR_PTR(-ENOENT); -+ } -+ -+ out_name: -+ __putname(arg.name); -+ out_file: -+ fput(file); -+ out: -+ if (unlikely(nsi_lock -+ && si_nfsd_read_lock(parent->d_sb, nsi_lock) < 0)) -+ if (!IS_ERR(dentry)) { -+ dput(dentry); -+ dentry = ERR_PTR(-ESTALE); -+ } -+ AuTraceErrPtr(dentry); -+ return dentry; -+} -+ -+static struct dentry *decode_by_dir_ino(struct super_block *sb, ino_t ino, -+ ino_t dir_ino, -+ struct au_nfsd_si_lock *nsi_lock) -+{ -+ struct dentry *dentry; -+ struct path path; -+ -+ if (dir_ino != AUFS_ROOT_INO) { -+ path.dentry = decode_by_ino(sb, dir_ino, 0); -+ dentry = path.dentry; -+ if (!path.dentry || IS_ERR(path.dentry)) -+ goto out; -+ AuDebugOn(au_test_anon(path.dentry)); -+ } else -+ path.dentry = dget(sb->s_root); -+ -+ path.mnt = au_mnt_get(sb); -+ dentry = au_lkup_by_ino(&path, ino, nsi_lock); -+ path_put(&path); -+ -+ out: -+ AuTraceErrPtr(dentry); -+ return dentry; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int h_acceptable(void *expv, struct dentry *dentry) -+{ -+ return 1; -+} -+ -+static char *au_build_path(struct dentry *h_parent, struct path *h_rootpath, -+ char *buf, int len, struct super_block *sb) -+{ -+ char *p; -+ int n; -+ struct path path; -+ -+ p = d_path(h_rootpath, buf, len); -+ if (IS_ERR(p)) -+ goto out; -+ n = strlen(p); -+ -+ path.mnt = h_rootpath->mnt; -+ path.dentry = h_parent; -+ p = d_path(&path, buf, len); -+ if (IS_ERR(p)) -+ goto out; -+ if (n != 1) -+ p += n; -+ -+ path.mnt = au_mnt_get(sb); -+ path.dentry = sb->s_root; -+ p = d_path(&path, buf, len - strlen(p)); -+ mntput(path.mnt); -+ if (IS_ERR(p)) -+ goto out; -+ if (n != 1) -+ p[strlen(p)] = '/'; -+ -+ out: -+ AuTraceErrPtr(p); -+ return p; -+} -+ -+static -+struct dentry *decode_by_path(struct super_block *sb, aufs_bindex_t bindex, -+ ino_t ino, __u32 *fh, int fh_len, -+ struct au_nfsd_si_lock *nsi_lock) -+{ -+ struct dentry *dentry, *h_parent, *root; -+ struct super_block *h_sb; -+ char *pathname, *p; -+ struct vfsmount *h_mnt; -+ struct au_branch *br; -+ int err; -+ struct path path; -+ -+ br = au_sbr(sb, bindex); -+ /* au_br_get(br); */ -+ h_mnt = br->br_mnt; -+ h_sb = h_mnt->mnt_sb; -+ /* todo: call lower fh_to_dentry()? fh_to_parent()? */ -+ h_parent = exportfs_decode_fh(h_mnt, (void *)(fh + Fh_tail), -+ fh_len - Fh_tail, fh[Fh_h_type], -+ h_acceptable, /*context*/NULL); -+ dentry = h_parent; -+ if (unlikely(!h_parent || IS_ERR(h_parent))) { -+ AuWarn1("%s decode_fh failed, %ld\n", -+ au_sbtype(h_sb), PTR_ERR(h_parent)); -+ goto out; -+ } -+ dentry = NULL; -+ if (unlikely(au_test_anon(h_parent))) { -+ AuWarn1("%s decode_fh returned a disconnected dentry\n", -+ au_sbtype(h_sb)); -+ goto out_h_parent; -+ } -+ -+ dentry = ERR_PTR(-ENOMEM); -+ pathname = (void *)__get_free_page(GFP_NOFS); -+ if (unlikely(!pathname)) -+ goto out_h_parent; -+ -+ root = sb->s_root; -+ path.mnt = h_mnt; -+ di_read_lock_parent(root, !AuLock_IR); -+ path.dentry = au_h_dptr(root, bindex); -+ di_read_unlock(root, !AuLock_IR); -+ p = au_build_path(h_parent, &path, pathname, PAGE_SIZE, sb); -+ dentry = (void *)p; -+ if (IS_ERR(p)) -+ goto out_pathname; -+ -+ si_read_unlock(sb); -+ err = vfsub_kern_path(p, LOOKUP_FOLLOW | LOOKUP_DIRECTORY, &path); -+ dentry = ERR_PTR(err); -+ if (unlikely(err)) -+ goto out_relock; -+ -+ dentry = ERR_PTR(-ENOENT); -+ AuDebugOn(au_test_anon(path.dentry)); -+ if (unlikely(!path.dentry->d_inode)) -+ goto out_path; -+ -+ if (ino != path.dentry->d_inode->i_ino) -+ dentry = au_lkup_by_ino(&path, ino, /*nsi_lock*/NULL); -+ else -+ dentry = dget(path.dentry); -+ -+ out_path: -+ path_put(&path); -+ out_relock: -+ if (unlikely(si_nfsd_read_lock(sb, nsi_lock) < 0)) -+ if (!IS_ERR(dentry)) { -+ dput(dentry); -+ dentry = ERR_PTR(-ESTALE); -+ } -+ out_pathname: -+ free_page((unsigned long)pathname); -+ out_h_parent: -+ dput(h_parent); -+ out: -+ /* au_br_put(br); */ -+ AuTraceErrPtr(dentry); -+ return dentry; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static struct dentry * -+aufs_fh_to_dentry(struct super_block *sb, struct fid *fid, int fh_len, -+ int fh_type) -+{ -+ struct dentry *dentry; -+ __u32 *fh = fid->raw; -+ ino_t ino, dir_ino; -+ aufs_bindex_t bindex; -+ struct au_nfsd_si_lock nsi_lock = { -+ .sigen = fh[Fh_sigen], -+ .br_id = fh[Fh_br_id], -+ .force_lock = 0 -+ }; -+ -+ AuDebugOn(fh_len < Fh_tail); -+ -+ dentry = ERR_PTR(-ESTALE); -+ /* branch id may be wrapped around */ -+ bindex = si_nfsd_read_lock(sb, &nsi_lock); -+ if (unlikely(bindex < 0)) -+ goto out; -+ nsi_lock.force_lock = 1; -+ -+ /* is this inode still cached? */ -+ ino = decode_ino(fh + Fh_ino); -+ AuDebugOn(ino == AUFS_ROOT_INO); -+ dir_ino = decode_ino(fh + Fh_dir_ino); -+ dentry = decode_by_ino(sb, ino, dir_ino); -+ if (IS_ERR(dentry)) -+ goto out_unlock; -+ if (dentry) -+ goto accept; -+ -+ /* is the parent dir cached? */ -+ dentry = decode_by_dir_ino(sb, ino, dir_ino, &nsi_lock); -+ if (IS_ERR(dentry)) -+ goto out_unlock; -+ if (dentry) -+ goto accept; -+ -+ /* lookup path */ -+ dentry = decode_by_path(sb, bindex, ino, fh, fh_len, &nsi_lock); -+ if (IS_ERR(dentry)) -+ goto out_unlock; -+ if (unlikely(!dentry)) -+ /* todo?: make it ESTALE */ -+ goto out_unlock; -+ -+ accept: -+ if (dentry->d_inode->i_generation == fh[Fh_igen]) -+ goto out_unlock; /* success */ -+ -+ dput(dentry); -+ dentry = ERR_PTR(-ESTALE); -+ out_unlock: -+ si_read_unlock(sb); -+ out: -+ AuTraceErrPtr(dentry); -+ return dentry; -+} -+ -+#if 0 /* reserved for future use */ -+/* support subtreecheck option */ -+static struct dentry *aufs_fh_to_parent(struct super_block *sb, struct fid *fid, -+ int fh_len, int fh_type) -+{ -+ struct dentry *parent; -+ __u32 *fh = fid->raw; -+ ino_t dir_ino; -+ -+ dir_ino = decode_ino(fh + Fh_dir_ino); -+ parent = decode_by_ino(sb, dir_ino, 0); -+ if (IS_ERR(parent)) -+ goto out; -+ if (!parent) -+ parent = decode_by_path(sb, au_br_index(sb, fh[Fh_br_id]), -+ dir_ino, fh, fh_len); -+ -+ out: -+ AuTraceErrPtr(parent); -+ return parent; -+} -+#endif -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int aufs_encode_fh(struct dentry *dentry, __u32 *fh, int *max_len, -+ int connectable) -+{ -+ int err; -+ aufs_bindex_t bindex, bend; -+ struct super_block *sb, *h_sb; -+ struct inode *inode; -+ struct dentry *parent, *h_parent; -+ struct au_branch *br; -+ -+ AuDebugOn(au_test_anon(dentry)); -+ -+ parent = NULL; -+ err = -ENOSPC; -+ if (unlikely(*max_len <= Fh_tail)) { -+ AuWarn1("NFSv2 client (max_len %d)?\n", *max_len); -+ goto out; -+ } -+ -+ err = FILEID_ROOT; -+ if (IS_ROOT(dentry)) { -+ AuDebugOn(dentry->d_inode->i_ino != AUFS_ROOT_INO); -+ goto out; -+ } -+ -+ err = -EIO; -+ h_parent = NULL; -+ sb = dentry->d_sb; -+ aufs_read_lock(dentry, AuLock_FLUSH | AuLock_IR); -+ parent = dget_parent(dentry); -+ di_read_lock_parent(parent, !AuLock_IR); -+ inode = dentry->d_inode; -+ AuDebugOn(!inode); -+#ifdef CONFIG_AUFS_DEBUG -+ if (unlikely(!au_opt_test(au_mntflags(sb), XINO))) -+ AuWarn1("NFS-exporting requires xino\n"); -+#endif -+ -+ bend = au_dbtaildir(parent); -+ for (bindex = au_dbstart(parent); bindex <= bend; bindex++) { -+ h_parent = au_h_dptr(parent, bindex); -+ if (h_parent) { -+ dget(h_parent); -+ break; -+ } -+ } -+ if (unlikely(!h_parent)) -+ goto out_unlock; -+ -+ err = -EPERM; -+ br = au_sbr(sb, bindex); -+ h_sb = br->br_mnt->mnt_sb; -+ if (unlikely(!h_sb->s_export_op)) { -+ AuErr1("%s branch is not exportable\n", au_sbtype(h_sb)); -+ goto out_dput; -+ } -+ -+ fh[Fh_br_id] = br->br_id; -+ fh[Fh_sigen] = au_sigen(sb); -+ encode_ino(fh + Fh_ino, inode->i_ino); -+ encode_ino(fh + Fh_dir_ino, parent->d_inode->i_ino); -+ fh[Fh_igen] = inode->i_generation; -+ -+ *max_len -= Fh_tail; -+ fh[Fh_h_type] = exportfs_encode_fh(h_parent, (void *)(fh + Fh_tail), -+ max_len, -+ /*connectable or subtreecheck*/0); -+ err = fh[Fh_h_type]; -+ *max_len += Fh_tail; -+ /* todo: macros? */ -+ if (err != 255) -+ err = 99; -+ else -+ AuWarn1("%s encode_fh failed\n", au_sbtype(h_sb)); -+ -+ out_dput: -+ dput(h_parent); -+ out_unlock: -+ di_read_unlock(parent, !AuLock_IR); -+ dput(parent); -+ aufs_read_unlock(dentry, AuLock_IR); -+ out: -+ if (unlikely(err < 0)) -+ err = 255; -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static struct export_operations aufs_export_op = { -+ .fh_to_dentry = aufs_fh_to_dentry, -+ /* .fh_to_parent = aufs_fh_to_parent, */ -+ .encode_fh = aufs_encode_fh -+}; -+ -+void au_export_init(struct super_block *sb) -+{ -+ struct au_sbinfo *sbinfo; -+ __u32 u; -+ -+ sb->s_export_op = &aufs_export_op; -+ sbinfo = au_sbi(sb); -+ sbinfo->si_xigen = NULL; -+ get_random_bytes(&u, sizeof(u)); -+ BUILD_BUG_ON(sizeof(u) != sizeof(int)); -+ atomic_set(&sbinfo->si_xigen_next, u); -+} -diff -Nur linux-2.6.33.1-vanilla/fs/aufs/file.c linux-2.6.33.1/fs/aufs/file.c ---- linux-2.6.33.1-vanilla/fs/aufs/file.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-2.6.33.1/fs/aufs/file.c 2010-04-05 16:53:27.000000000 +0200 -@@ -0,0 +1,606 @@ -+/* -+ * Copyright (C) 2005-2010 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+/* -+ * handling file/dir, and address_space operation -+ */ -+ -+#include -+#include -+#include -+#include -+#include "aufs.h" -+ -+/* drop flags for writing */ -+unsigned int au_file_roflags(unsigned int flags) -+{ -+ flags &= ~(O_WRONLY | O_RDWR | O_APPEND | O_CREAT | O_TRUNC); -+ flags |= O_RDONLY | O_NOATIME; -+ return flags; -+} -+ -+/* common functions to regular file and dir */ -+struct file *au_h_open(struct dentry *dentry, aufs_bindex_t bindex, int flags, -+ struct file *file) -+{ -+ struct file *h_file; -+ struct dentry *h_dentry; -+ struct inode *h_inode; -+ struct super_block *sb; -+ struct au_branch *br; -+ struct path h_path; -+ int err, exec_flag; -+ -+ /* a race condition can happen between open and unlink/rmdir */ -+ h_file = ERR_PTR(-ENOENT); -+ h_dentry = au_h_dptr(dentry, bindex); -+ if (au_test_nfsd(current) && !h_dentry) -+ goto out; -+ h_inode = h_dentry->d_inode; -+ if (au_test_nfsd(current) && !h_inode) -+ goto out; -+ if (unlikely((!d_unhashed(dentry) && d_unhashed(h_dentry)) -+ || !h_inode)) -+ goto out; -+ -+ sb = dentry->d_sb; -+ br = au_sbr(sb, bindex); -+ h_file = ERR_PTR(-EACCES); -+ exec_flag = flags & vfsub_fmode_to_uint(FMODE_EXEC); -+ if (exec_flag && (br->br_mnt->mnt_flags & MNT_NOEXEC)) -+ goto out; -+ -+ /* drop flags for writing */ -+ if (au_test_ro(sb, bindex, dentry->d_inode)) -+ flags = au_file_roflags(flags); -+ flags &= ~O_CREAT; -+ atomic_inc(&br->br_count); -+ h_path.dentry = h_dentry; -+ h_path.mnt = br->br_mnt; -+ if (!au_special_file(h_inode->i_mode)) -+ h_file = vfsub_dentry_open(&h_path, flags); -+ else { -+ /* this block depends upon the configuration */ -+ di_read_unlock(dentry, AuLock_IR); -+ fi_write_unlock(file); -+ si_read_unlock(sb); -+ h_file = vfsub_dentry_open(&h_path, flags); -+ si_noflush_read_lock(sb); -+ fi_write_lock(file); -+ di_read_lock_child(dentry, AuLock_IR); -+ } -+ if (IS_ERR(h_file)) -+ goto out_br; -+ -+ if (exec_flag) { -+ err = deny_write_access(h_file); -+ if (unlikely(err)) { -+ fput(h_file); -+ h_file = ERR_PTR(err); -+ goto out_br; -+ } -+ } -+ fsnotify_open(h_dentry); -+ goto out; /* success */ -+ -+ out_br: -+ atomic_dec(&br->br_count); -+ out: -+ return h_file; -+} -+ -+int au_do_open(struct file *file, int (*open)(struct file *file, int flags)) -+{ -+ int err; -+ struct dentry *dentry; -+ struct super_block *sb; -+ -+ dentry = file->f_dentry; -+ sb = dentry->d_sb; -+ si_read_lock(sb, AuLock_FLUSH); -+ err = au_finfo_init(file); -+ if (unlikely(err)) -+ goto out; -+ -+ di_read_lock_child(dentry, AuLock_IR); -+ err = open(file, vfsub_file_flags(file)); -+ di_read_unlock(dentry, AuLock_IR); -+ -+ fi_write_unlock(file); -+ if (unlikely(err)) -+ au_finfo_fin(file); -+ out: -+ si_read_unlock(sb); -+ return err; -+} -+ -+int au_reopen_nondir(struct file *file) -+{ -+ int err; -+ aufs_bindex_t bstart, bindex, bend; -+ struct dentry *dentry; -+ struct file *h_file, *h_file_tmp; -+ -+ dentry = file->f_dentry; -+ AuDebugOn(au_special_file(dentry->d_inode->i_mode)); -+ bstart = au_dbstart(dentry); -+ h_file_tmp = NULL; -+ if (au_fbstart(file) == bstart) { -+ h_file = au_h_fptr(file, bstart); -+ if (file->f_mode == h_file->f_mode) -+ return 0; /* success */ -+ h_file_tmp = h_file; -+ get_file(h_file_tmp); -+ au_set_h_fptr(file, bstart, NULL); -+ } -+ AuDebugOn(au_fbstart(file) < bstart -+ || au_fi(file)->fi_hfile[0 + bstart].hf_file); -+ -+ h_file = au_h_open(dentry, bstart, vfsub_file_flags(file) & ~O_TRUNC, -+ file); -+ err = PTR_ERR(h_file); -+ if (IS_ERR(h_file)) -+ goto out; /* todo: close all? */ -+ -+ err = 0; -+ au_set_fbstart(file, bstart); -+ au_set_h_fptr(file, bstart, h_file); -+ au_update_figen(file); -+ /* todo: necessary? */ -+ /* file->f_ra = h_file->f_ra; */ -+ -+ /* close lower files */ -+ bend = au_fbend(file); -+ for (bindex = bstart + 1; bindex <= bend; bindex++) -+ au_set_h_fptr(file, bindex, NULL); -+ au_set_fbend(file, bstart); -+ -+ out: -+ if (h_file_tmp) -+ fput(h_file_tmp); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int au_reopen_wh(struct file *file, aufs_bindex_t btgt, -+ struct dentry *hi_wh) -+{ -+ int err; -+ aufs_bindex_t bstart; -+ struct au_dinfo *dinfo; -+ struct dentry *h_dentry; -+ -+ dinfo = au_di(file->f_dentry); -+ AuRwMustWriteLock(&dinfo->di_rwsem); -+ -+ bstart = dinfo->di_bstart; -+ dinfo->di_bstart = btgt; -+ h_dentry = dinfo->di_hdentry[0 + btgt].hd_dentry; -+ dinfo->di_hdentry[0 + btgt].hd_dentry = hi_wh; -+ err = au_reopen_nondir(file); -+ dinfo->di_hdentry[0 + btgt].hd_dentry = h_dentry; -+ dinfo->di_bstart = bstart; -+ -+ return err; -+} -+ -+static int au_ready_to_write_wh(struct file *file, loff_t len, -+ aufs_bindex_t bcpup) -+{ -+ int err; -+ struct inode *inode; -+ struct dentry *dentry, *hi_wh; -+ -+ dentry = file->f_dentry; -+ au_update_dbstart(dentry); -+ inode = dentry->d_inode; -+ hi_wh = au_hi_wh(inode, bcpup); -+ if (!hi_wh) -+ err = au_sio_cpup_wh(dentry, bcpup, len, file); -+ else -+ /* already copied-up after unlink */ -+ err = au_reopen_wh(file, bcpup, hi_wh); -+ -+ if (!err -+ && inode->i_nlink > 1 -+ && au_opt_test(au_mntflags(dentry->d_sb), PLINK)) -+ au_plink_append(inode, bcpup, au_h_dptr(dentry, bcpup)); -+ -+ return err; -+} -+ -+/* -+ * prepare the @file for writing. -+ */ -+int au_ready_to_write(struct file *file, loff_t len, struct au_pin *pin) -+{ -+ int err; -+ aufs_bindex_t bstart, bcpup; -+ struct dentry *dentry, *parent, *h_dentry; -+ struct inode *h_inode, *inode; -+ struct super_block *sb; -+ struct file *h_file; -+ -+ dentry = file->f_dentry; -+ sb = dentry->d_sb; -+ inode = dentry->d_inode; -+ AuDebugOn(au_special_file(inode->i_mode)); -+ bstart = au_fbstart(file); -+ err = au_test_ro(sb, bstart, inode); -+ if (!err && (au_h_fptr(file, bstart)->f_mode & FMODE_WRITE)) { -+ err = au_pin(pin, dentry, bstart, AuOpt_UDBA_NONE, /*flags*/0); -+ goto out; -+ } -+ -+ /* need to cpup */ -+ parent = dget_parent(dentry); -+ di_write_lock_parent(parent); -+ err = AuWbrCopyup(au_sbi(sb), dentry); -+ bcpup = err; -+ if (unlikely(err < 0)) -+ goto out_dgrade; -+ err = 0; -+ -+ if (!au_h_dptr(parent, bcpup)) { -+ err = au_cpup_dirs(dentry, bcpup); -+ if (unlikely(err)) -+ goto out_dgrade; -+ } -+ -+ err = au_pin(pin, dentry, bcpup, AuOpt_UDBA_NONE, -+ AuPin_DI_LOCKED | AuPin_MNT_WRITE); -+ if (unlikely(err)) -+ goto out_dgrade; -+ -+ h_dentry = au_h_fptr(file, bstart)->f_dentry; -+ h_inode = h_dentry->d_inode; -+ mutex_lock_nested(&h_inode->i_mutex, AuLsc_I_CHILD); -+ h_file = au_h_open_pre(dentry, bstart); -+ if (IS_ERR(h_file)) { -+ err = PTR_ERR(h_file); -+ h_file = NULL; -+ } else if (d_unhashed(dentry) /* || d_unhashed(h_dentry) */ -+ /* || !h_inode->i_nlink */) { -+ err = au_ready_to_write_wh(file, len, bcpup); -+ di_downgrade_lock(parent, AuLock_IR); -+ } else { -+ di_downgrade_lock(parent, AuLock_IR); -+ if (!au_h_dptr(dentry, bcpup)) -+ err = au_sio_cpup_simple(dentry, bcpup, len, -+ AuCpup_DTIME); -+ if (!err) -+ err = au_reopen_nondir(file); -+ } -+ mutex_unlock(&h_inode->i_mutex); -+ au_h_open_post(dentry, bstart, h_file); -+ -+ if (!err) { -+ au_pin_set_parent_lflag(pin, /*lflag*/0); -+ goto out_dput; /* success */ -+ } -+ au_unpin(pin); -+ goto out_unlock; -+ -+ out_dgrade: -+ di_downgrade_lock(parent, AuLock_IR); -+ out_unlock: -+ di_read_unlock(parent, AuLock_IR); -+ out_dput: -+ dput(parent); -+ out: -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int au_file_refresh_by_inode(struct file *file, int *need_reopen) -+{ -+ int err; -+ aufs_bindex_t bstart; -+ struct au_pin pin; -+ struct au_finfo *finfo; -+ struct dentry *dentry, *parent, *hi_wh; -+ struct inode *inode; -+ struct super_block *sb; -+ -+ FiMustWriteLock(file); -+ -+ err = 0; -+ finfo = au_fi(file); -+ dentry = file->f_dentry; -+ sb = dentry->d_sb; -+ inode = dentry->d_inode; -+ bstart = au_ibstart(inode); -+ if (bstart == finfo->fi_bstart) -+ goto out; -+ -+ parent = dget_parent(dentry); -+ if (au_test_ro(sb, bstart, inode)) { -+ di_read_lock_parent(parent, !AuLock_IR); -+ err = AuWbrCopyup(au_sbi(sb), dentry); -+ bstart = err; -+ di_read_unlock(parent, !AuLock_IR); -+ if (unlikely(err < 0)) -+ goto out_parent; -+ err = 0; -+ } -+ -+ di_read_lock_parent(parent, AuLock_IR); -+ hi_wh = au_hi_wh(inode, bstart); -+ if (au_opt_test(au_mntflags(sb), PLINK) -+ && au_plink_test(inode) -+ && !d_unhashed(dentry)) { -+ err = au_test_and_cpup_dirs(dentry, bstart); -+ if (unlikely(err)) -+ goto out_unlock; -+ -+ /* always superio. */ -+ err = au_pin(&pin, dentry, bstart, AuOpt_UDBA_NONE, -+ AuPin_DI_LOCKED | AuPin_MNT_WRITE); -+ if (!err) -+ err = au_sio_cpup_simple(dentry, bstart, -1, -+ AuCpup_DTIME); -+ au_unpin(&pin); -+ } else if (hi_wh) { -+ /* already copied-up after unlink */ -+ err = au_reopen_wh(file, bstart, hi_wh); -+ *need_reopen = 0; -+ } -+ -+ out_unlock: -+ di_read_unlock(parent, AuLock_IR); -+ out_parent: -+ dput(parent); -+ out: -+ return err; -+} -+ -+static void au_do_refresh_file(struct file *file) -+{ -+ aufs_bindex_t bindex, bend, new_bindex, brid; -+ struct au_hfile *p, tmp, *q; -+ struct au_finfo *finfo; -+ struct super_block *sb; -+ -+ FiMustWriteLock(file); -+ -+ sb = file->f_dentry->d_sb; -+ finfo = au_fi(file); -+ p = finfo->fi_hfile + finfo->fi_bstart; -+ brid = p->hf_br->br_id; -+ bend = finfo->fi_bend; -+ for (bindex = finfo->fi_bstart; bindex <= bend; bindex++, p++) { -+ if (!p->hf_file) -+ continue; -+ -+ new_bindex = au_br_index(sb, p->hf_br->br_id); -+ if (new_bindex == bindex) -+ continue; -+ if (new_bindex < 0) { -+ au_set_h_fptr(file, bindex, NULL); -+ continue; -+ } -+ -+ /* swap two lower inode, and loop again */ -+ q = finfo->fi_hfile + new_bindex; -+ tmp = *q; -+ *q = *p; -+ *p = tmp; -+ if (tmp.hf_file) { -+ bindex--; -+ p--; -+ } -+ } -+ -+ p = finfo->fi_hfile; -+ if (!au_test_mmapped(file) && !d_unhashed(file->f_dentry)) { -+ bend = au_sbend(sb); -+ for (finfo->fi_bstart = 0; finfo->fi_bstart <= bend; -+ finfo->fi_bstart++, p++) -+ if (p->hf_file) { -+ if (p->hf_file->f_dentry -+ && p->hf_file->f_dentry->d_inode) -+ break; -+ else -+ au_hfput(p, file); -+ } -+ } else { -+ bend = au_br_index(sb, brid); -+ for (finfo->fi_bstart = 0; finfo->fi_bstart < bend; -+ finfo->fi_bstart++, p++) -+ if (p->hf_file) -+ au_hfput(p, file); -+ bend = au_sbend(sb); -+ } -+ -+ p = finfo->fi_hfile + bend; -+ for (finfo->fi_bend = bend; finfo->fi_bend >= finfo->fi_bstart; -+ finfo->fi_bend--, p--) -+ if (p->hf_file) { -+ if (p->hf_file->f_dentry -+ && p->hf_file->f_dentry->d_inode) -+ break; -+ else -+ au_hfput(p, file); -+ } -+ AuDebugOn(finfo->fi_bend < finfo->fi_bstart); -+} -+ -+/* -+ * after branch manipulating, refresh the file. -+ */ -+static int refresh_file(struct file *file, int (*reopen)(struct file *file)) -+{ -+ int err, need_reopen; -+ struct dentry *dentry; -+ aufs_bindex_t bend, bindex; -+ -+ dentry = file->f_dentry; -+ err = au_fi_realloc(au_fi(file), au_sbend(dentry->d_sb) + 1); -+ if (unlikely(err)) -+ goto out; -+ au_do_refresh_file(file); -+ -+ err = 0; -+ need_reopen = 1; -+ if (!au_test_mmapped(file)) -+ err = au_file_refresh_by_inode(file, &need_reopen); -+ if (!err && need_reopen && !d_unhashed(dentry)) -+ err = reopen(file); -+ if (!err) { -+ au_update_figen(file); -+ return 0; /* success */ -+ } -+ -+ /* error, close all lower files */ -+ bend = au_fbend(file); -+ for (bindex = au_fbstart(file); bindex <= bend; bindex++) -+ au_set_h_fptr(file, bindex, NULL); -+ -+ out: -+ return err; -+} -+ -+/* common function to regular file and dir */ -+int au_reval_and_lock_fdi(struct file *file, int (*reopen)(struct file *file), -+ int wlock) -+{ -+ int err; -+ unsigned int sigen, figen; -+ aufs_bindex_t bstart; -+ unsigned char pseudo_link; -+ struct dentry *dentry; -+ struct inode *inode; -+ -+ err = 0; -+ dentry = file->f_dentry; -+ inode = dentry->d_inode; -+ AuDebugOn(au_special_file(inode->i_mode)); -+ sigen = au_sigen(dentry->d_sb); -+ fi_write_lock(file); -+ figen = au_figen(file); -+ di_write_lock_child(dentry); -+ bstart = au_dbstart(dentry); -+ pseudo_link = (bstart != au_ibstart(inode)); -+ if (sigen == figen && !pseudo_link && au_fbstart(file) == bstart) { -+ if (!wlock) { -+ di_downgrade_lock(dentry, AuLock_IR); -+ fi_downgrade_lock(file); -+ } -+ goto out; /* success */ -+ } -+ -+ AuDbg("sigen %d, figen %d\n", sigen, figen); -+ if (sigen != au_digen(dentry) -+ || sigen != au_iigen(inode)) { -+ err = au_reval_dpath(dentry, sigen); -+ if (unlikely(err < 0)) -+ goto out; -+ AuDebugOn(au_digen(dentry) != sigen -+ || au_iigen(inode) != sigen); -+ } -+ -+ err = refresh_file(file, reopen); -+ if (!err) { -+ if (!wlock) { -+ di_downgrade_lock(dentry, AuLock_IR); -+ fi_downgrade_lock(file); -+ } -+ } else { -+ di_write_unlock(dentry); -+ fi_write_unlock(file); -+ } -+ -+ out: -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* cf. aufs_nopage() */ -+/* for madvise(2) */ -+static int aufs_readpage(struct file *file __maybe_unused, struct page *page) -+{ -+ unlock_page(page); -+ return 0; -+} -+ -+/* they will never be called. */ -+#ifdef CONFIG_AUFS_DEBUG -+static int aufs_write_begin(struct file *file, struct address_space *mapping, -+ loff_t pos, unsigned len, unsigned flags, -+ struct page **pagep, void **fsdata) -+{ AuUnsupport(); return 0; } -+static int aufs_write_end(struct file *file, struct address_space *mapping, -+ loff_t pos, unsigned len, unsigned copied, -+ struct page *page, void *fsdata) -+{ AuUnsupport(); return 0; } -+static int aufs_writepage(struct page *page, struct writeback_control *wbc) -+{ AuUnsupport(); return 0; } -+static void aufs_sync_page(struct page *page) -+{ AuUnsupport(); } -+ -+static int aufs_set_page_dirty(struct page *page) -+{ AuUnsupport(); return 0; } -+static void aufs_invalidatepage(struct page *page, unsigned long offset) -+{ AuUnsupport(); } -+static int aufs_releasepage(struct page *page, gfp_t gfp) -+{ AuUnsupport(); return 0; } -+static ssize_t aufs_direct_IO(int rw, struct kiocb *iocb, -+ const struct iovec *iov, loff_t offset, -+ unsigned long nr_segs) -+{ AuUnsupport(); return 0; } -+static int aufs_get_xip_mem(struct address_space *mapping, pgoff_t pgoff, -+ int create, void **kmem, unsigned long *pfn) -+{ AuUnsupport(); return 0; } -+static int aufs_migratepage(struct address_space *mapping, struct page *newpage, -+ struct page *page) -+{ AuUnsupport(); return 0; } -+static int aufs_launder_page(struct page *page) -+{ AuUnsupport(); return 0; } -+static int aufs_is_partially_uptodate(struct page *page, -+ read_descriptor_t *desc, -+ unsigned long from) -+{ AuUnsupport(); return 0; } -+static int aufs_error_remove_page(struct address_space *mapping, -+ struct page *page) -+{ AuUnsupport(); return 0; } -+#endif /* CONFIG_AUFS_DEBUG */ -+ -+const struct address_space_operations aufs_aop = { -+ .readpage = aufs_readpage, -+#ifdef CONFIG_AUFS_DEBUG -+ .writepage = aufs_writepage, -+ .sync_page = aufs_sync_page, -+ /* no writepages, because of writepage */ -+ .set_page_dirty = aufs_set_page_dirty, -+ /* no readpages, because of readpage */ -+ .write_begin = aufs_write_begin, -+ .write_end = aufs_write_end, -+ /* no bmap, no block device */ -+ .invalidatepage = aufs_invalidatepage, -+ .releasepage = aufs_releasepage, -+ .direct_IO = aufs_direct_IO, /* todo */ -+ .get_xip_mem = aufs_get_xip_mem, /* todo */ -+ .migratepage = aufs_migratepage, -+ .launder_page = aufs_launder_page, -+ .is_partially_uptodate = aufs_is_partially_uptodate, -+ .error_remove_page = aufs_error_remove_page -+#endif /* CONFIG_AUFS_DEBUG */ -+}; -diff -Nur linux-2.6.33.1-vanilla/fs/aufs/file.h linux-2.6.33.1/fs/aufs/file.h ---- linux-2.6.33.1-vanilla/fs/aufs/file.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-2.6.33.1/fs/aufs/file.h 2010-04-05 16:53:27.000000000 +0200 -@@ -0,0 +1,211 @@ -+/* -+ * Copyright (C) 2005-2010 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+/* -+ * file operations -+ */ -+ -+#ifndef __AUFS_FILE_H__ -+#define __AUFS_FILE_H__ -+ -+#ifdef __KERNEL__ -+ -+#include -+#include -+#include -+#include "rwsem.h" -+ -+struct au_branch; -+struct au_hfile { -+ struct file *hf_file; -+ struct au_branch *hf_br; -+}; -+ -+struct au_vdir; -+struct au_finfo { -+ atomic_t fi_generation; -+ -+ struct au_rwsem fi_rwsem; -+ struct au_hfile *fi_hfile; -+ aufs_bindex_t fi_bstart, fi_bend; -+ -+ union { -+ /* non-dir only */ -+ struct { -+ struct vm_operations_struct *fi_h_vm_ops; -+ struct vm_operations_struct *fi_vm_ops; -+ struct mutex fi_vm_mtx; -+ struct mutex fi_mmap; -+ }; -+ -+ /* dir only */ -+ struct { -+ struct au_vdir *fi_vdir_cache; -+ }; -+ }; -+}; -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* file.c */ -+extern const struct address_space_operations aufs_aop; -+unsigned int au_file_roflags(unsigned int flags); -+struct file *au_h_open(struct dentry *dentry, aufs_bindex_t bindex, int flags, -+ struct file *file); -+int au_do_open(struct file *file, int (*open)(struct file *file, int flags)); -+int au_reopen_nondir(struct file *file); -+struct au_pin; -+int au_ready_to_write(struct file *file, loff_t len, struct au_pin *pin); -+int au_reval_and_lock_fdi(struct file *file, int (*reopen)(struct file *file), -+ int wlock); -+ -+/* poll.c */ -+#ifdef CONFIG_AUFS_POLL -+unsigned int aufs_poll(struct file *file, poll_table *wait); -+#endif -+ -+#ifdef CONFIG_AUFS_BR_HFSPLUS -+/* hfsplus.c */ -+struct file *au_h_open_pre(struct dentry *dentry, aufs_bindex_t bindex); -+void au_h_open_post(struct dentry *dentry, aufs_bindex_t bindex, -+ struct file *h_file); -+#else -+static inline -+struct file *au_h_open_pre(struct dentry *dentry, aufs_bindex_t bindex) -+{ -+ return NULL; -+} -+ -+AuStubVoid(au_h_open_post, struct dentry *dentry, aufs_bindex_t bindex, -+ struct file *h_file); -+#endif -+ -+/* f_op.c */ -+extern const struct file_operations aufs_file_fop; -+int aufs_flush(struct file *file, fl_owner_t id); -+int au_do_open_nondir(struct file *file, int flags); -+int aufs_release_nondir(struct inode *inode __maybe_unused, struct file *file); -+ -+#ifdef CONFIG_AUFS_SP_IATTR -+/* f_op_sp.c */ -+int au_special_file(umode_t mode); -+void au_init_special_fop(struct inode *inode, umode_t mode, dev_t rdev); -+#else -+AuStubInt0(au_special_file, umode_t mode) -+static inline void au_init_special_fop(struct inode *inode, umode_t mode, -+ dev_t rdev) -+{ -+ init_special_inode(inode, mode, rdev); -+} -+#endif -+ -+/* finfo.c */ -+void au_hfput(struct au_hfile *hf, struct file *file); -+void au_set_h_fptr(struct file *file, aufs_bindex_t bindex, -+ struct file *h_file); -+ -+void au_update_figen(struct file *file); -+void au_fi_mmap_lock(struct file *file); -+void au_fi_mmap_unlock(struct file *file); -+ -+void au_finfo_fin(struct file *file); -+int au_finfo_init(struct file *file); -+int au_fi_realloc(struct au_finfo *finfo, int nbr); -+ -+/* ioctl.c */ -+long aufs_ioctl_nondir(struct file *file, unsigned int cmd, unsigned long arg); -+ -+/* ---------------------------------------------------------------------- */ -+ -+static inline struct au_finfo *au_fi(struct file *file) -+{ -+ return file->private_data; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * fi_read_lock, fi_write_lock, -+ * fi_read_unlock, fi_write_unlock, fi_downgrade_lock -+ */ -+AuSimpleRwsemFuncs(fi, struct file *f, &au_fi(f)->fi_rwsem); -+ -+#define FiMustNoWaiters(f) AuRwMustNoWaiters(&au_fi(f)->fi_rwsem) -+#define FiMustAnyLock(f) AuRwMustAnyLock(&au_fi(f)->fi_rwsem) -+#define FiMustWriteLock(f) AuRwMustWriteLock(&au_fi(f)->fi_rwsem) -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* todo: hard/soft set? */ -+static inline aufs_bindex_t au_fbstart(struct file *file) -+{ -+ FiMustAnyLock(file); -+ return au_fi(file)->fi_bstart; -+} -+ -+static inline aufs_bindex_t au_fbend(struct file *file) -+{ -+ FiMustAnyLock(file); -+ return au_fi(file)->fi_bend; -+} -+ -+static inline struct au_vdir *au_fvdir_cache(struct file *file) -+{ -+ FiMustAnyLock(file); -+ return au_fi(file)->fi_vdir_cache; -+} -+ -+static inline void au_set_fbstart(struct file *file, aufs_bindex_t bindex) -+{ -+ FiMustWriteLock(file); -+ au_fi(file)->fi_bstart = bindex; -+} -+ -+static inline void au_set_fbend(struct file *file, aufs_bindex_t bindex) -+{ -+ FiMustWriteLock(file); -+ au_fi(file)->fi_bend = bindex; -+} -+ -+static inline void au_set_fvdir_cache(struct file *file, -+ struct au_vdir *vdir_cache) -+{ -+ FiMustWriteLock(file); -+ au_fi(file)->fi_vdir_cache = vdir_cache; -+} -+ -+static inline struct file *au_h_fptr(struct file *file, aufs_bindex_t bindex) -+{ -+ FiMustAnyLock(file); -+ return au_fi(file)->fi_hfile[0 + bindex].hf_file; -+} -+ -+/* todo: memory barrier? */ -+static inline unsigned int au_figen(struct file *f) -+{ -+ return atomic_read(&au_fi(f)->fi_generation); -+} -+ -+static inline int au_test_mmapped(struct file *f) -+{ -+ FiMustAnyLock(f); -+ return !!(au_fi(f)->fi_h_vm_ops); -+} -+ -+#endif /* __KERNEL__ */ -+#endif /* __AUFS_FILE_H__ */ -diff -Nur linux-2.6.33.1-vanilla/fs/aufs/finfo.c linux-2.6.33.1/fs/aufs/finfo.c ---- linux-2.6.33.1-vanilla/fs/aufs/finfo.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-2.6.33.1/fs/aufs/finfo.c 2010-04-05 16:53:27.000000000 +0200 -@@ -0,0 +1,146 @@ -+/* -+ * Copyright (C) 2005-2010 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+/* -+ * file private data -+ */ -+ -+#include -+#include "aufs.h" -+ -+void au_hfput(struct au_hfile *hf, struct file *file) -+{ -+ /* todo: direct access f_flags */ -+ if (vfsub_file_flags(file) & vfsub_fmode_to_uint(FMODE_EXEC)) -+ allow_write_access(hf->hf_file); -+ fput(hf->hf_file); -+ hf->hf_file = NULL; -+ atomic_dec_return(&hf->hf_br->br_count); -+ hf->hf_br = NULL; -+} -+ -+void au_set_h_fptr(struct file *file, aufs_bindex_t bindex, struct file *val) -+{ -+ struct au_finfo *finfo = au_fi(file); -+ struct au_hfile *hf; -+ -+ hf = finfo->fi_hfile + bindex; -+ if (hf->hf_file) -+ au_hfput(hf, file); -+ if (val) { -+ FiMustWriteLock(file); -+ hf->hf_file = val; -+ hf->hf_br = au_sbr(file->f_dentry->d_sb, bindex); -+ } -+} -+ -+void au_update_figen(struct file *file) -+{ -+ atomic_set(&au_fi(file)->fi_generation, au_digen(file->f_dentry)); -+ /* smp_mb(); */ /* atomic_set */ -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+void au_fi_mmap_lock(struct file *file) -+{ -+ FiMustWriteLock(file); -+ lockdep_off(); -+ mutex_lock(&au_fi(file)->fi_mmap); -+ lockdep_on(); -+} -+ -+void au_fi_mmap_unlock(struct file *file) -+{ -+ lockdep_off(); -+ mutex_unlock(&au_fi(file)->fi_mmap); -+ lockdep_on(); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+void au_finfo_fin(struct file *file) -+{ -+ struct au_finfo *finfo; -+ aufs_bindex_t bindex, bend; -+ -+ finfo = au_fi(file); -+ bindex = finfo->fi_bstart; -+ if (bindex >= 0) { -+ /* -+ * calls fput() instead of filp_close(), -+ * since no dnotify or lock for the lower file. -+ */ -+ bend = finfo->fi_bend; -+ for (; bindex <= bend; bindex++) -+ au_set_h_fptr(file, bindex, NULL); -+ } -+ -+ au_dbg_verify_hf(finfo); -+ kfree(finfo->fi_hfile); -+ AuRwDestroy(&finfo->fi_rwsem); -+ au_cache_free_finfo(finfo); -+} -+ -+int au_finfo_init(struct file *file) -+{ -+ struct au_finfo *finfo; -+ struct dentry *dentry; -+ -+ dentry = file->f_dentry; -+ finfo = au_cache_alloc_finfo(); -+ if (unlikely(!finfo)) -+ goto out; -+ -+ finfo->fi_hfile = kcalloc(au_sbend(dentry->d_sb) + 1, -+ sizeof(*finfo->fi_hfile), GFP_NOFS); -+ if (unlikely(!finfo->fi_hfile)) -+ goto out_finfo; -+ -+ au_rw_init_wlock(&finfo->fi_rwsem); -+ finfo->fi_bstart = -1; -+ finfo->fi_bend = -1; -+ atomic_set(&finfo->fi_generation, au_digen(dentry)); -+ /* smp_mb(); */ /* atomic_set */ -+ -+ file->private_data = finfo; -+ return 0; /* success */ -+ -+ out_finfo: -+ au_cache_free_finfo(finfo); -+ out: -+ return -ENOMEM; -+} -+ -+int au_fi_realloc(struct au_finfo *finfo, int nbr) -+{ -+ int err, sz; -+ struct au_hfile *hfp; -+ -+ err = -ENOMEM; -+ sz = sizeof(*hfp) * (finfo->fi_bend + 1); -+ if (!sz) -+ sz = sizeof(*hfp); -+ hfp = au_kzrealloc(finfo->fi_hfile, sz, sizeof(*hfp) * nbr, GFP_NOFS); -+ if (hfp) { -+ finfo->fi_hfile = hfp; -+ err = 0; -+ } -+ -+ return err; -+} -diff -Nur linux-2.6.33.1-vanilla/fs/aufs/f_op.c linux-2.6.33.1/fs/aufs/f_op.c ---- linux-2.6.33.1-vanilla/fs/aufs/f_op.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-2.6.33.1/fs/aufs/f_op.c 2010-04-05 16:53:27.000000000 +0200 -@@ -0,0 +1,921 @@ -+/* -+ * Copyright (C) 2005-2010 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+/* -+ * file and vm operations -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include "aufs.h" -+ -+/* common function to regular file and dir */ -+int aufs_flush(struct file *file, fl_owner_t id) -+{ -+ int err; -+ aufs_bindex_t bindex, bend; -+ struct dentry *dentry; -+ struct file *h_file; -+ -+ dentry = file->f_dentry; -+ si_noflush_read_lock(dentry->d_sb); -+ fi_read_lock(file); -+ di_read_lock_child(dentry, AuLock_IW); -+ -+ err = 0; -+ bend = au_fbend(file); -+ for (bindex = au_fbstart(file); !err && bindex <= bend; bindex++) { -+ h_file = au_h_fptr(file, bindex); -+ if (!h_file || !h_file->f_op || !h_file->f_op->flush) -+ continue; -+ -+ err = h_file->f_op->flush(h_file, id); -+ if (!err) -+ vfsub_update_h_iattr(&h_file->f_path, /*did*/NULL); -+ /*ignore*/ -+ } -+ au_cpup_attr_timesizes(dentry->d_inode); -+ -+ di_read_unlock(dentry, AuLock_IW); -+ fi_read_unlock(file); -+ si_read_unlock(dentry->d_sb); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+int au_do_open_nondir(struct file *file, int flags) -+{ -+ int err; -+ aufs_bindex_t bindex; -+ struct file *h_file; -+ struct dentry *dentry; -+ struct au_finfo *finfo; -+ -+ FiMustWriteLock(file); -+ -+ err = 0; -+ dentry = file->f_dentry; -+ finfo = au_fi(file); -+ finfo->fi_h_vm_ops = NULL; -+ finfo->fi_vm_ops = NULL; -+ mutex_init(&finfo->fi_mmap); /* regular file only? */ -+ bindex = au_dbstart(dentry); -+ h_file = au_h_open(dentry, bindex, flags, file); -+ if (IS_ERR(h_file)) -+ err = PTR_ERR(h_file); -+ else { -+ au_set_fbstart(file, bindex); -+ au_set_fbend(file, bindex); -+ au_set_h_fptr(file, bindex, h_file); -+ au_update_figen(file); -+ /* todo: necessary? */ -+ /* file->f_ra = h_file->f_ra; */ -+ } -+ return err; -+} -+ -+static int aufs_open_nondir(struct inode *inode __maybe_unused, -+ struct file *file) -+{ -+ AuDbg("%.*s, f_ flags 0x%x, f_mode 0x%x\n", -+ AuDLNPair(file->f_dentry), vfsub_file_flags(file), -+ file->f_mode); -+ return au_do_open(file, au_do_open_nondir); -+} -+ -+int aufs_release_nondir(struct inode *inode __maybe_unused, struct file *file) -+{ -+ kfree(au_fi(file)->fi_vm_ops); -+ au_finfo_fin(file); -+ return 0; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static ssize_t aufs_read(struct file *file, char __user *buf, size_t count, -+ loff_t *ppos) -+{ -+ ssize_t err; -+ struct dentry *dentry; -+ struct file *h_file; -+ struct super_block *sb; -+ -+ dentry = file->f_dentry; -+ sb = dentry->d_sb; -+ si_read_lock(sb, AuLock_FLUSH); -+ err = au_reval_and_lock_fdi(file, au_reopen_nondir, /*wlock*/0); -+ if (unlikely(err)) -+ goto out; -+ -+ h_file = au_h_fptr(file, au_fbstart(file)); -+ err = vfsub_read_u(h_file, buf, count, ppos); -+ /* todo: necessary? */ -+ /* file->f_ra = h_file->f_ra; */ -+ fsstack_copy_attr_atime(dentry->d_inode, h_file->f_dentry->d_inode); -+ -+ di_read_unlock(dentry, AuLock_IR); -+ fi_read_unlock(file); -+ out: -+ si_read_unlock(sb); -+ return err; -+} -+ -+static ssize_t aufs_write(struct file *file, const char __user *ubuf, -+ size_t count, loff_t *ppos) -+{ -+ ssize_t err; -+ aufs_bindex_t bstart; -+ struct au_pin pin; -+ struct dentry *dentry; -+ struct inode *inode; -+ struct super_block *sb; -+ struct file *h_file; -+ char __user *buf = (char __user *)ubuf; -+ -+ dentry = file->f_dentry; -+ sb = dentry->d_sb; -+ inode = dentry->d_inode; -+ mutex_lock(&inode->i_mutex); -+ si_read_lock(sb, AuLock_FLUSH); -+ -+ err = au_reval_and_lock_fdi(file, au_reopen_nondir, /*wlock*/1); -+ if (unlikely(err)) -+ goto out; -+ -+ err = au_ready_to_write(file, -1, &pin); -+ di_downgrade_lock(dentry, AuLock_IR); -+ if (unlikely(err)) -+ goto out_unlock; -+ -+ bstart = au_fbstart(file); -+ h_file = au_h_fptr(file, bstart); -+ au_unpin(&pin); -+ err = vfsub_write_u(h_file, buf, count, ppos); -+ au_cpup_attr_timesizes(inode); -+ inode->i_mode = h_file->f_dentry->d_inode->i_mode; -+ -+ out_unlock: -+ di_read_unlock(dentry, AuLock_IR); -+ fi_write_unlock(file); -+ out: -+ si_read_unlock(sb); -+ mutex_unlock(&inode->i_mutex); -+ return err; -+} -+ -+static ssize_t au_do_aio(struct file *h_file, int rw, struct kiocb *kio, -+ const struct iovec *iov, unsigned long nv, loff_t pos) -+{ -+ ssize_t err; -+ struct file *file; -+ -+ err = security_file_permission(h_file, rw); -+ if (unlikely(err)) -+ goto out; -+ -+ file = kio->ki_filp; -+ if (!is_sync_kiocb(kio)) { -+ get_file(h_file); -+ fput(file); -+ } -+ kio->ki_filp = h_file; -+ if (rw == MAY_READ) -+ err = h_file->f_op->aio_read(kio, iov, nv, pos); -+ else if (rw == MAY_WRITE) -+ err = h_file->f_op->aio_write(kio, iov, nv, pos); -+ else -+ BUG(); -+ /* do not restore kio->ki_filp */ -+ -+ out: -+ return err; -+} -+ -+static ssize_t aufs_aio_read(struct kiocb *kio, const struct iovec *iov, -+ unsigned long nv, loff_t pos) -+{ -+ ssize_t err; -+ struct file *file, *h_file; -+ struct dentry *dentry; -+ struct super_block *sb; -+ -+ file = kio->ki_filp; -+ dentry = file->f_dentry; -+ sb = dentry->d_sb; -+ si_read_lock(sb, AuLock_FLUSH); -+ err = au_reval_and_lock_fdi(file, au_reopen_nondir, /*wlock*/0); -+ if (unlikely(err)) -+ goto out; -+ -+ err = -ENOSYS; -+ h_file = au_h_fptr(file, au_fbstart(file)); -+ if (h_file->f_op && h_file->f_op->aio_read) { -+ err = au_do_aio(h_file, MAY_READ, kio, iov, nv, pos); -+ /* todo: necessary? */ -+ /* file->f_ra = h_file->f_ra; */ -+ fsstack_copy_attr_atime(dentry->d_inode, -+ h_file->f_dentry->d_inode); -+ } else -+ /* currently there is no such fs */ -+ WARN_ON_ONCE(h_file->f_op && h_file->f_op->read); -+ -+ di_read_unlock(dentry, AuLock_IR); -+ fi_read_unlock(file); -+ -+ out: -+ si_read_unlock(sb); -+ return err; -+} -+ -+static ssize_t aufs_aio_write(struct kiocb *kio, const struct iovec *iov, -+ unsigned long nv, loff_t pos) -+{ -+ ssize_t err; -+ struct au_pin pin; -+ struct dentry *dentry; -+ struct inode *inode; -+ struct super_block *sb; -+ struct file *file, *h_file; -+ -+ file = kio->ki_filp; -+ dentry = file->f_dentry; -+ sb = dentry->d_sb; -+ inode = dentry->d_inode; -+ mutex_lock(&inode->i_mutex); -+ si_read_lock(sb, AuLock_FLUSH); -+ -+ err = au_reval_and_lock_fdi(file, au_reopen_nondir, /*wlock*/1); -+ if (unlikely(err)) -+ goto out; -+ -+ err = au_ready_to_write(file, -1, &pin); -+ di_downgrade_lock(dentry, AuLock_IR); -+ if (unlikely(err)) -+ goto out_unlock; -+ -+ err = -ENOSYS; -+ h_file = au_h_fptr(file, au_fbstart(file)); -+ au_unpin(&pin); -+ if (h_file->f_op && h_file->f_op->aio_write) { -+ err = au_do_aio(h_file, MAY_WRITE, kio, iov, nv, pos); -+ au_cpup_attr_timesizes(inode); -+ inode->i_mode = h_file->f_dentry->d_inode->i_mode; -+ } else -+ /* currently there is no such fs */ -+ WARN_ON_ONCE(h_file->f_op && h_file->f_op->write); -+ -+ out_unlock: -+ di_read_unlock(dentry, AuLock_IR); -+ fi_write_unlock(file); -+ out: -+ si_read_unlock(sb); -+ mutex_unlock(&inode->i_mutex); -+ return err; -+} -+ -+static ssize_t aufs_splice_read(struct file *file, loff_t *ppos, -+ struct pipe_inode_info *pipe, size_t len, -+ unsigned int flags) -+{ -+ ssize_t err; -+ struct file *h_file; -+ struct dentry *dentry; -+ struct super_block *sb; -+ -+ dentry = file->f_dentry; -+ sb = dentry->d_sb; -+ si_read_lock(sb, AuLock_FLUSH); -+ err = au_reval_and_lock_fdi(file, au_reopen_nondir, /*wlock*/0); -+ if (unlikely(err)) -+ goto out; -+ -+ err = -EINVAL; -+ h_file = au_h_fptr(file, au_fbstart(file)); -+ if (au_test_loopback_kthread()) { -+ file->f_mapping = h_file->f_mapping; -+ smp_mb(); /* unnecessary? */ -+ } -+ err = vfsub_splice_to(h_file, ppos, pipe, len, flags); -+ /* todo: necessasry? */ -+ /* file->f_ra = h_file->f_ra; */ -+ fsstack_copy_attr_atime(dentry->d_inode, h_file->f_dentry->d_inode); -+ -+ di_read_unlock(dentry, AuLock_IR); -+ fi_read_unlock(file); -+ -+ out: -+ si_read_unlock(sb); -+ return err; -+} -+ -+static ssize_t -+aufs_splice_write(struct pipe_inode_info *pipe, struct file *file, loff_t *ppos, -+ size_t len, unsigned int flags) -+{ -+ ssize_t err; -+ struct au_pin pin; -+ struct dentry *dentry; -+ struct inode *inode; -+ struct super_block *sb; -+ struct file *h_file; -+ -+ dentry = file->f_dentry; -+ inode = dentry->d_inode; -+ mutex_lock(&inode->i_mutex); -+ sb = dentry->d_sb; -+ si_read_lock(sb, AuLock_FLUSH); -+ -+ err = au_reval_and_lock_fdi(file, au_reopen_nondir, /*wlock*/1); -+ if (unlikely(err)) -+ goto out; -+ -+ err = au_ready_to_write(file, -1, &pin); -+ di_downgrade_lock(dentry, AuLock_IR); -+ if (unlikely(err)) -+ goto out_unlock; -+ -+ h_file = au_h_fptr(file, au_fbstart(file)); -+ au_unpin(&pin); -+ err = vfsub_splice_from(pipe, h_file, ppos, len, flags); -+ au_cpup_attr_timesizes(inode); -+ inode->i_mode = h_file->f_dentry->d_inode->i_mode; -+ -+ out_unlock: -+ di_read_unlock(dentry, AuLock_IR); -+ fi_write_unlock(file); -+ out: -+ si_read_unlock(sb); -+ mutex_unlock(&inode->i_mutex); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static struct file *au_safe_file(struct vm_area_struct *vma) -+{ -+ struct file *file; -+ -+ file = vma->vm_file; -+ if (file->private_data && au_test_aufs(file->f_dentry->d_sb)) -+ return file; -+ return NULL; -+} -+ -+static void au_reset_file(struct vm_area_struct *vma, struct file *file) -+{ -+ vma->vm_file = file; -+ /* smp_mb(); */ /* flush vm_file */ -+} -+ -+static int aufs_fault(struct vm_area_struct *vma, struct vm_fault *vmf) -+{ -+ int err; -+ static DECLARE_WAIT_QUEUE_HEAD(wq); -+ struct file *file, *h_file; -+ struct au_finfo *finfo; -+ -+ /* todo: non-robr mode, user vm_file as it is? */ -+ wait_event(wq, (file = au_safe_file(vma))); -+ -+ /* do not revalidate, no si lock */ -+ finfo = au_fi(file); -+ h_file = finfo->fi_hfile[0 + finfo->fi_bstart].hf_file; -+ AuDebugOn(!h_file || !finfo->fi_h_vm_ops); -+ -+ mutex_lock(&finfo->fi_vm_mtx); -+ vma->vm_file = h_file; -+ err = finfo->fi_h_vm_ops->fault(vma, vmf); -+ /* todo: necessary? */ -+ /* file->f_ra = h_file->f_ra; */ -+ au_reset_file(vma, file); -+ mutex_unlock(&finfo->fi_vm_mtx); -+#if 0 /* def CONFIG_SMP */ -+ /* wake_up_nr(&wq, online_cpu - 1); */ -+ wake_up_all(&wq); -+#else -+ wake_up(&wq); -+#endif -+ -+ return err; -+} -+ -+static int aufs_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf) -+{ -+ int err; -+ static DECLARE_WAIT_QUEUE_HEAD(wq); -+ struct file *file, *h_file; -+ struct au_finfo *finfo; -+ -+ wait_event(wq, (file = au_safe_file(vma))); -+ -+ finfo = au_fi(file); -+ h_file = finfo->fi_hfile[0 + finfo->fi_bstart].hf_file; -+ AuDebugOn(!h_file || !finfo->fi_h_vm_ops); -+ -+ mutex_lock(&finfo->fi_vm_mtx); -+ vma->vm_file = h_file; -+ err = finfo->fi_h_vm_ops->page_mkwrite(vma, vmf); -+ au_reset_file(vma, file); -+ mutex_unlock(&finfo->fi_vm_mtx); -+ wake_up(&wq); -+ -+ return err; -+} -+ -+static void aufs_vm_close(struct vm_area_struct *vma) -+{ -+ static DECLARE_WAIT_QUEUE_HEAD(wq); -+ struct file *file, *h_file; -+ struct au_finfo *finfo; -+ -+ wait_event(wq, (file = au_safe_file(vma))); -+ -+ finfo = au_fi(file); -+ h_file = finfo->fi_hfile[0 + finfo->fi_bstart].hf_file; -+ AuDebugOn(!h_file || !finfo->fi_h_vm_ops); -+ -+ mutex_lock(&finfo->fi_vm_mtx); -+ vma->vm_file = h_file; -+ finfo->fi_h_vm_ops->close(vma); -+ au_reset_file(vma, file); -+ mutex_unlock(&finfo->fi_vm_mtx); -+ wake_up(&wq); -+} -+ -+static struct vm_operations_struct aufs_vm_ops = { -+ /* .close and .page_mkwrite are not set by default */ -+ .fault = aufs_fault, -+}; -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* cf. linux/include/linux/mman.h: calc_vm_prot_bits() */ -+#define AuConv_VM_PROT(f, b) _calc_vm_trans(f, VM_##b, PROT_##b) -+ -+static unsigned long au_arch_prot_conv(unsigned long flags) -+{ -+ /* currently ppc64 only */ -+#ifdef CONFIG_PPC64 -+ /* cf. linux/arch/powerpc/include/asm/mman.h */ -+ AuDebugOn(arch_calc_vm_prot_bits(-1) != VM_SAO); -+ return AuConv_VM_PROT(flags, SAO); -+#else -+ AuDebugOn(arch_calc_vm_prot_bits(-1)); -+ return 0; -+#endif -+} -+ -+static unsigned long au_prot_conv(unsigned long flags) -+{ -+ return AuConv_VM_PROT(flags, READ) -+ | AuConv_VM_PROT(flags, WRITE) -+ | AuConv_VM_PROT(flags, EXEC) -+ | au_arch_prot_conv(flags); -+} -+ -+/* cf. linux/include/linux/mman.h: calc_vm_flag_bits() */ -+#define AuConv_VM_MAP(f, b) _calc_vm_trans(f, VM_##b, MAP_##b) -+ -+static unsigned long au_flag_conv(unsigned long flags) -+{ -+ return AuConv_VM_MAP(flags, GROWSDOWN) -+ | AuConv_VM_MAP(flags, DENYWRITE) -+ | AuConv_VM_MAP(flags, EXECUTABLE) -+ | AuConv_VM_MAP(flags, LOCKED); -+} -+ -+static struct vm_operations_struct *au_vm_ops(struct file *h_file, -+ struct vm_area_struct *vma) -+{ -+ struct vm_operations_struct *vm_ops; -+ unsigned long prot; -+ int err; -+ -+ vm_ops = ERR_PTR(-ENODEV); -+ if (!h_file->f_op || !h_file->f_op->mmap) -+ goto out; -+ -+ prot = au_prot_conv(vma->vm_flags); -+ err = security_file_mmap(h_file, /*reqprot*/prot, prot, -+ au_flag_conv(vma->vm_flags), vma->vm_start, 0); -+ vm_ops = ERR_PTR(err); -+ if (unlikely(err)) -+ goto out; -+ -+ err = h_file->f_op->mmap(h_file, vma); -+ vm_ops = ERR_PTR(err); -+ if (unlikely(err)) -+ goto out; -+ -+ /* oops, it became 'const' */ -+ vm_ops = (struct vm_operations_struct *)vma->vm_ops; -+ err = do_munmap(current->mm, vma->vm_start, -+ vma->vm_end - vma->vm_start); -+ if (unlikely(err)) { -+ AuIOErr("failed internal unmapping %.*s, %d\n", -+ AuDLNPair(h_file->f_dentry), err); -+ vm_ops = ERR_PTR(-EIO); -+ } -+ -+ out: -+ return vm_ops; -+} -+ -+static int au_custom_vm_ops(struct au_finfo *finfo, struct vm_area_struct *vma) -+{ -+ int err; -+ struct vm_operations_struct *h_ops; -+ -+ MtxMustLock(&finfo->fi_mmap); -+ -+ err = 0; -+ h_ops = finfo->fi_h_vm_ops; -+ AuDebugOn(!h_ops); -+ if ((!h_ops->page_mkwrite && !h_ops->close) -+ || finfo->fi_vm_ops) -+ goto out; -+ -+ err = -ENOMEM; -+ finfo->fi_vm_ops = kmemdup(&aufs_vm_ops, sizeof(aufs_vm_ops), GFP_NOFS); -+ if (unlikely(!finfo->fi_vm_ops)) -+ goto out; -+ -+ err = 0; -+ if (h_ops->page_mkwrite) -+ finfo->fi_vm_ops->page_mkwrite = aufs_page_mkwrite; -+ if (h_ops->close) -+ finfo->fi_vm_ops->close = aufs_vm_close; -+ -+ vma->vm_ops = finfo->fi_vm_ops; -+ -+ out: -+ return err; -+} -+ -+/* -+ * This is another ugly approach to keep the lock order, particularly -+ * mm->mmap_sem and aufs rwsem. The previous approach was reverted and you can -+ * find it in git-log, if you want. -+ * -+ * native readdir: i_mutex, copy_to_user, mmap_sem -+ * aufs readdir: i_mutex, rwsem, nested-i_mutex, copy_to_user, mmap_sem -+ * -+ * Before aufs_mmap() mmap_sem is acquired already, but aufs_mmap() has to -+ * acquire aufs rwsem. It introduces a circular locking dependency. -+ * To address this problem, aufs_mmap() delegates the part which requires aufs -+ * rwsem to its internal workqueue. -+ */ -+ -+/* very ugly approach */ -+#ifdef CONFIG_DEBUG_MUTEXES -+#include <../kernel/mutex-debug.h> -+#else -+#include <../kernel/mutex.h> -+#endif -+ -+struct au_mmap_pre_args { -+ /* input */ -+ struct file *file; -+ struct vm_area_struct *vma; -+ -+ /* output */ -+ int *errp; -+ struct file *h_file; -+ int mmapped; -+}; -+ -+static int au_mmap_pre(struct file *file, struct vm_area_struct *vma, -+ struct file **h_file, int *mmapped) -+{ -+ int err; -+ const unsigned char wlock -+ = !!(file->f_mode & FMODE_WRITE) && (vma->vm_flags & VM_SHARED); -+ struct dentry *dentry; -+ struct super_block *sb; -+ -+ dentry = file->f_dentry; -+ sb = dentry->d_sb; -+ si_read_lock(sb, !AuLock_FLUSH); -+ err = au_reval_and_lock_fdi(file, au_reopen_nondir, /*wlock*/1); -+ if (unlikely(err)) -+ goto out; -+ -+ *mmapped = !!au_test_mmapped(file); -+ if (wlock) { -+ struct au_pin pin; -+ -+ err = au_ready_to_write(file, -1, &pin); -+ di_write_unlock(dentry); -+ if (unlikely(err)) -+ goto out_unlock; -+ au_unpin(&pin); -+ } else -+ di_write_unlock(dentry); -+ *h_file = au_h_fptr(file, au_fbstart(file)); -+ get_file(*h_file); -+ au_fi_mmap_lock(file); -+ -+out_unlock: -+ fi_write_unlock(file); -+out: -+ si_read_unlock(sb); -+ return err; -+} -+ -+static void au_call_mmap_pre(void *args) -+{ -+ struct au_mmap_pre_args *a = args; -+ *a->errp = au_mmap_pre(a->file, a->vma, &a->h_file, &a->mmapped); -+} -+ -+static int aufs_mmap(struct file *file, struct vm_area_struct *vma) -+{ -+ int err, wkq_err; -+ struct au_finfo *finfo; -+ struct dentry *h_dentry; -+ struct vm_operations_struct *vm_ops; -+ struct au_mmap_pre_args args = { -+ .file = file, -+ .vma = vma, -+ .errp = &err -+ }; -+ -+ wkq_err = au_wkq_wait(au_call_mmap_pre, &args); -+ if (unlikely(wkq_err)) -+ err = wkq_err; -+ if (unlikely(err)) -+ goto out; -+ finfo = au_fi(file); -+ mutex_set_owner(&finfo->fi_mmap); -+ -+ h_dentry = args.h_file->f_dentry; -+ if (!args.mmapped && au_test_fs_bad_mapping(h_dentry->d_sb)) { -+ /* -+ * by this assignment, f_mapping will differs from aufs inode -+ * i_mapping. -+ * if someone else mixes the use of f_dentry->d_inode and -+ * f_mapping->host, then a problem may arise. -+ */ -+ file->f_mapping = args.h_file->f_mapping; -+ } -+ -+ vm_ops = NULL; -+ if (!args.mmapped) { -+ vm_ops = au_vm_ops(args.h_file, vma); -+ err = PTR_ERR(vm_ops); -+ if (IS_ERR(vm_ops)) -+ goto out_unlock; -+ } -+ -+ /* -+ * unnecessary to handle MAP_DENYWRITE and deny_write_access()? -+ * currently MAP_DENYWRITE from userspace is ignored, but elf loader -+ * sets it. when FMODE_EXEC is set (by open_exec() or sys_uselib()), -+ * both of the aufs file and the lower file is deny_write_access()-ed. -+ * finally I hope we can skip handlling MAP_DENYWRITE here. -+ */ -+ err = generic_file_mmap(file, vma); -+ if (unlikely(err)) -+ goto out_unlock; -+ -+ vma->vm_ops = &aufs_vm_ops; -+ if (!args.mmapped) { -+ finfo->fi_h_vm_ops = vm_ops; -+ mutex_init(&finfo->fi_vm_mtx); -+ } -+ -+ err = au_custom_vm_ops(finfo, vma); -+ if (unlikely(err)) -+ goto out_unlock; -+ -+ vfsub_file_accessed(args.h_file); -+ /* update without lock, I don't think it a problem */ -+ fsstack_copy_attr_atime(file->f_dentry->d_inode, h_dentry->d_inode); -+ -+ out_unlock: -+ au_fi_mmap_unlock(file); -+ fput(args.h_file); -+ out: -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int aufs_fsync_nondir(struct file *file, struct dentry *dentry, -+ int datasync) -+{ -+ int err; -+ struct au_pin pin; -+ struct inode *inode; -+ struct file *h_file; -+ struct super_block *sb; -+ -+ inode = dentry->d_inode; -+ IMustLock(file->f_mapping->host); -+ if (inode != file->f_mapping->host) { -+ mutex_unlock(&file->f_mapping->host->i_mutex); -+ mutex_lock(&inode->i_mutex); -+ } -+ IMustLock(inode); -+ -+ sb = dentry->d_sb; -+ si_read_lock(sb, AuLock_FLUSH); -+ -+ err = 0; /* -EBADF; */ /* posix? */ -+ if (unlikely(!(file->f_mode & FMODE_WRITE))) -+ goto out; -+ err = au_reval_and_lock_fdi(file, au_reopen_nondir, /*wlock*/1); -+ if (unlikely(err)) -+ goto out; -+ -+ err = au_ready_to_write(file, -1, &pin); -+ di_downgrade_lock(dentry, AuLock_IR); -+ if (unlikely(err)) -+ goto out_unlock; -+ au_unpin(&pin); -+ -+ err = -EINVAL; -+ h_file = au_h_fptr(file, au_fbstart(file)); -+ if (h_file->f_op && h_file->f_op->fsync) { -+ struct dentry *h_d; -+ struct mutex *h_mtx; -+ -+ /* -+ * no filemap_fdatawrite() since aufs file has no its own -+ * mapping, but dir. -+ */ -+ h_d = h_file->f_dentry; -+ h_mtx = &h_d->d_inode->i_mutex; -+ mutex_lock_nested(h_mtx, AuLsc_I_CHILD); -+ err = h_file->f_op->fsync(h_file, h_d, datasync); -+ if (!err) -+ vfsub_update_h_iattr(&h_file->f_path, /*did*/NULL); -+ /*ignore*/ -+ au_cpup_attr_timesizes(inode); -+ mutex_unlock(h_mtx); -+ } -+ -+ out_unlock: -+ di_read_unlock(dentry, AuLock_IR); -+ fi_write_unlock(file); -+ out: -+ si_read_unlock(sb); -+ if (inode != file->f_mapping->host) { -+ mutex_unlock(&inode->i_mutex); -+ mutex_lock(&file->f_mapping->host->i_mutex); -+ } -+ return err; -+} -+ -+/* no one supports this operation, currently */ -+#if 0 -+static int aufs_aio_fsync_nondir(struct kiocb *kio, int datasync) -+{ -+ int err; -+ struct au_pin pin; -+ struct dentry *dentry; -+ struct inode *inode; -+ struct file *file, *h_file; -+ struct super_block *sb; -+ -+ file = kio->ki_filp; -+ dentry = file->f_dentry; -+ inode = dentry->d_inode; -+ mutex_lock(&inode->i_mutex); -+ -+ sb = dentry->d_sb; -+ si_read_lock(sb, AuLock_FLUSH); -+ -+ err = 0; /* -EBADF; */ /* posix? */ -+ if (unlikely(!(file->f_mode & FMODE_WRITE))) -+ goto out; -+ err = au_reval_and_lock_fdi(file, au_reopen_nondir, /*wlock*/1); -+ if (unlikely(err)) -+ goto out; -+ -+ err = au_ready_to_write(file, -1, &pin); -+ di_downgrade_lock(dentry, AuLock_IR); -+ if (unlikely(err)) -+ goto out_unlock; -+ au_unpin(&pin); -+ -+ err = -ENOSYS; -+ h_file = au_h_fptr(file, au_fbstart(file)); -+ if (h_file->f_op && h_file->f_op->aio_fsync) { -+ struct dentry *h_d; -+ struct mutex *h_mtx; -+ -+ h_d = h_file->f_dentry; -+ h_mtx = &h_d->d_inode->i_mutex; -+ if (!is_sync_kiocb(kio)) { -+ get_file(h_file); -+ fput(file); -+ } -+ kio->ki_filp = h_file; -+ err = h_file->f_op->aio_fsync(kio, datasync); -+ mutex_lock_nested(h_mtx, AuLsc_I_CHILD); -+ if (!err) -+ vfsub_update_h_iattr(&h_file->f_path, /*did*/NULL); -+ /*ignore*/ -+ au_cpup_attr_timesizes(inode); -+ mutex_unlock(h_mtx); -+ } -+ -+ out_unlock: -+ di_read_unlock(dentry, AuLock_IR); -+ fi_write_unlock(file); -+ out: -+ si_read_unlock(sb); -+ mutex_unlock(&inode->i_mutex); -+ return err; -+} -+#endif -+ -+static int aufs_fasync(int fd, struct file *file, int flag) -+{ -+ int err; -+ struct file *h_file; -+ struct dentry *dentry; -+ struct super_block *sb; -+ -+ dentry = file->f_dentry; -+ sb = dentry->d_sb; -+ si_read_lock(sb, AuLock_FLUSH); -+ err = au_reval_and_lock_fdi(file, au_reopen_nondir, /*wlock*/0); -+ if (unlikely(err)) -+ goto out; -+ -+ h_file = au_h_fptr(file, au_fbstart(file)); -+ if (h_file->f_op && h_file->f_op->fasync) -+ err = h_file->f_op->fasync(fd, h_file, flag); -+ -+ di_read_unlock(dentry, AuLock_IR); -+ fi_read_unlock(file); -+ -+ out: -+ si_read_unlock(sb); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* no one supports this operation, currently */ -+#if 0 -+static ssize_t aufs_sendpage(struct file *file, struct page *page, int offset, -+ size_t len, loff_t *pos , int more) -+{ -+} -+#endif -+ -+/* ---------------------------------------------------------------------- */ -+ -+const struct file_operations aufs_file_fop = { -+ /* -+ * while generic_file_llseek/_unlocked() don't use BKL, -+ * don't use it since it operates file->f_mapping->host. -+ * in aufs, it may be a real file and may confuse users by UDBA. -+ */ -+ /* .llseek = generic_file_llseek, */ -+ -+ .read = aufs_read, -+ .write = aufs_write, -+ .aio_read = aufs_aio_read, -+ .aio_write = aufs_aio_write, -+#ifdef CONFIG_AUFS_POLL -+ .poll = aufs_poll, -+#endif -+ .unlocked_ioctl = aufs_ioctl_nondir, -+ .mmap = aufs_mmap, -+ .open = aufs_open_nondir, -+ .flush = aufs_flush, -+ .release = aufs_release_nondir, -+ .fsync = aufs_fsync_nondir, -+ /* .aio_fsync = aufs_aio_fsync_nondir, */ -+ .fasync = aufs_fasync, -+ /* .sendpage = aufs_sendpage, */ -+ .splice_write = aufs_splice_write, -+ .splice_read = aufs_splice_read, -+#if 0 -+ .aio_splice_write = aufs_aio_splice_write, -+ .aio_splice_read = aufs_aio_splice_read -+#endif -+}; -diff -Nur linux-2.6.33.1-vanilla/fs/aufs/f_op_sp.c linux-2.6.33.1/fs/aufs/f_op_sp.c ---- linux-2.6.33.1-vanilla/fs/aufs/f_op_sp.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-2.6.33.1/fs/aufs/f_op_sp.c 2010-04-05 16:53:27.000000000 +0200 -@@ -0,0 +1,290 @@ -+/* -+ * Copyright (C) 2005-2010 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+/* -+ * file operations for special files. -+ * while they exist in aufs virtually, -+ * their file I/O is handled out of aufs. -+ */ -+ -+#include -+#include "aufs.h" -+ -+static ssize_t aufs_aio_read_sp(struct kiocb *kio, const struct iovec *iov, -+ unsigned long nv, loff_t pos) -+{ -+ ssize_t err; -+ aufs_bindex_t bstart; -+ unsigned char wbr; -+ struct file *file, *h_file; -+ struct super_block *sb; -+ -+ file = kio->ki_filp; -+ sb = file->f_dentry->d_sb; -+ si_read_lock(sb, AuLock_FLUSH); -+ fi_read_lock(file); -+ bstart = au_fbstart(file); -+ h_file = au_h_fptr(file, bstart); -+ fi_read_unlock(file); -+ wbr = !!au_br_writable(au_sbr(sb, bstart)->br_perm); -+ si_read_unlock(sb); -+ -+ /* do not change the file in kio */ -+ AuDebugOn(!h_file->f_op || !h_file->f_op->aio_read); -+ err = h_file->f_op->aio_read(kio, iov, nv, pos); -+ if (err > 0 && wbr) -+ file_accessed(h_file); -+ -+ return err; -+} -+ -+static ssize_t aufs_aio_write_sp(struct kiocb *kio, const struct iovec *iov, -+ unsigned long nv, loff_t pos) -+{ -+ ssize_t err; -+ aufs_bindex_t bstart; -+ unsigned char wbr; -+ struct super_block *sb; -+ struct file *file, *h_file; -+ -+ file = kio->ki_filp; -+ sb = file->f_dentry->d_sb; -+ si_read_lock(sb, AuLock_FLUSH); -+ fi_read_lock(file); -+ bstart = au_fbstart(file); -+ h_file = au_h_fptr(file, bstart); -+ fi_read_unlock(file); -+ wbr = !!au_br_writable(au_sbr(sb, bstart)->br_perm); -+ si_read_unlock(sb); -+ -+ /* do not change the file in kio */ -+ AuDebugOn(!h_file->f_op || !h_file->f_op->aio_write); -+ err = h_file->f_op->aio_write(kio, iov, nv, pos); -+ if (err > 0 && wbr) -+ file_update_time(h_file); -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int aufs_release_sp(struct inode *inode, struct file *file) -+{ -+ int err; -+ struct file *h_file; -+ -+ fi_read_lock(file); -+ h_file = au_h_fptr(file, au_fbstart(file)); -+ fi_read_unlock(file); -+ /* close this fifo in aufs */ -+ err = h_file->f_op->release(inode, file); /* ignore */ -+ aufs_release_nondir(inode, file); /* ignore */ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* currently, support only FIFO */ -+enum {AuSp_FIFO, AuSp_FIFO_R, AuSp_FIFO_W, AuSp_FIFO_RW, -+ /* AuSp_SOCK, AuSp_CHR, AuSp_BLK, */ -+ AuSp_Last}; -+static int aufs_open_sp(struct inode *inode, struct file *file); -+static struct au_sp_fop { -+ int done; -+ struct file_operations fop; /* not 'const' */ -+ spinlock_t spin; -+} au_sp_fop[AuSp_Last] = { -+ [AuSp_FIFO] = { -+ .fop = { -+ .open = aufs_open_sp -+ } -+ } -+}; -+ -+static void au_init_fop_sp(struct file *file) -+{ -+ struct au_sp_fop *p; -+ int i; -+ struct file *h_file; -+ -+ p = au_sp_fop; -+ if (unlikely(!p->done)) { -+ /* initialize first time only */ -+ static DEFINE_SPINLOCK(spin); -+ -+ spin_lock(&spin); -+ if (!p->done) { -+ BUILD_BUG_ON(sizeof(au_sp_fop)/sizeof(*au_sp_fop) -+ != AuSp_Last); -+ for (i = 0; i < AuSp_Last; i++) -+ spin_lock_init(&p[i].spin); -+ p->done = 1; -+ } -+ spin_unlock(&spin); -+ } -+ -+ switch (file->f_mode & (FMODE_READ | FMODE_WRITE)) { -+ case FMODE_READ: -+ i = AuSp_FIFO_R; -+ break; -+ case FMODE_WRITE: -+ i = AuSp_FIFO_W; -+ break; -+ case FMODE_READ | FMODE_WRITE: -+ i = AuSp_FIFO_RW; -+ break; -+ default: -+ BUG(); -+ } -+ -+ p += i; -+ if (unlikely(!p->done)) { -+ /* initialize first time only */ -+ h_file = au_h_fptr(file, au_fbstart(file)); -+ spin_lock(&p->spin); -+ if (!p->done) { -+ p->fop = *h_file->f_op; -+ if (p->fop.aio_read) -+ p->fop.aio_read = aufs_aio_read_sp; -+ if (p->fop.aio_write) -+ p->fop.aio_write = aufs_aio_write_sp; -+ p->fop.release = aufs_release_sp; -+ p->done = 1; -+ } -+ spin_unlock(&p->spin); -+ } -+ file->f_op = &p->fop; -+} -+ -+static int au_cpup_sp(struct dentry *dentry) -+{ -+ int err; -+ aufs_bindex_t bcpup; -+ struct au_pin pin; -+ struct au_wr_dir_args wr_dir_args = { -+ .force_btgt = -1, -+ .flags = 0 -+ }; -+ -+ AuDbg("%.*s\n", AuDLNPair(dentry)); -+ -+ di_read_unlock(dentry, AuLock_IR); -+ di_write_lock_child(dentry); -+ err = au_wr_dir(dentry, /*src_dentry*/NULL, &wr_dir_args); -+ if (unlikely(err < 0)) -+ goto out; -+ bcpup = err; -+ err = 0; -+ if (bcpup == au_dbstart(dentry)) -+ goto out; /* success */ -+ -+ err = au_pin(&pin, dentry, bcpup, au_opt_udba(dentry->d_sb), -+ AuPin_MNT_WRITE); -+ if (!err) { -+ err = au_sio_cpup_simple(dentry, bcpup, -1, AuCpup_DTIME); -+ au_unpin(&pin); -+ } -+ -+ out: -+ di_downgrade_lock(dentry, AuLock_IR); -+ return err; -+} -+ -+static int au_do_open_sp(struct file *file, int flags) -+{ -+ int err; -+ struct dentry *dentry; -+ struct super_block *sb; -+ struct file *h_file; -+ struct inode *h_inode; -+ -+ dentry = file->f_dentry; -+ AuDbg("%.*s\n", AuDLNPair(dentry)); -+ -+ /* -+ * try copying-up. -+ * operate on the ro branch is not an error. -+ */ -+ au_cpup_sp(dentry); /* ignore */ -+ -+ /* prepare h_file */ -+ err = au_do_open_nondir(file, vfsub_file_flags(file)); -+ if (unlikely(err)) -+ goto out; -+ -+ sb = dentry->d_sb; -+ h_file = au_h_fptr(file, au_fbstart(file)); -+ h_inode = h_file->f_dentry->d_inode; -+ di_read_unlock(dentry, AuLock_IR); -+ fi_write_unlock(file); -+ si_read_unlock(sb); -+ /* open this fifo in aufs */ -+ err = h_inode->i_fop->open(file->f_dentry->d_inode, file); -+ si_noflush_read_lock(sb); -+ fi_write_lock(file); -+ di_read_lock_child(dentry, AuLock_IR); -+ if (!err) -+ au_init_fop_sp(file); -+ else -+ au_finfo_fin(file); -+ -+ out: -+ return err; -+} -+ -+static int aufs_open_sp(struct inode *inode, struct file *file) -+{ -+ return au_do_open(file, au_do_open_sp); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+void au_init_special_fop(struct inode *inode, umode_t mode, dev_t rdev) -+{ -+ init_special_inode(inode, mode, rdev); -+ -+ switch (mode & S_IFMT) { -+ case S_IFIFO: -+ inode->i_fop = &au_sp_fop[AuSp_FIFO].fop; -+ /*FALLTHROUGH*/ -+ case S_IFCHR: -+ case S_IFBLK: -+ case S_IFSOCK: -+ break; -+ default: -+ AuDebugOn(1); -+ } -+} -+ -+int au_special_file(umode_t mode) -+{ -+ int ret; -+ -+ ret = 0; -+ switch (mode & S_IFMT) { -+ case S_IFIFO: -+#if 0 -+ case S_IFCHR: -+ case S_IFBLK: -+ case S_IFSOCK: -+#endif -+ ret = 1; -+ } -+ -+ return ret; -+} -diff -Nur linux-2.6.33.1-vanilla/fs/aufs/fstype.h linux-2.6.33.1/fs/aufs/fstype.h ---- linux-2.6.33.1-vanilla/fs/aufs/fstype.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-2.6.33.1/fs/aufs/fstype.h 2010-04-05 16:53:27.000000000 +0200 -@@ -0,0 +1,497 @@ -+/* -+ * Copyright (C) 2005-2010 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+/* -+ * judging filesystem type -+ */ -+ -+#ifndef __AUFS_FSTYPE_H__ -+#define __AUFS_FSTYPE_H__ -+ -+#ifdef __KERNEL__ -+ -+#include -+#include -+#include -+#include -+ -+static inline int au_test_aufs(struct super_block *sb) -+{ -+ return sb->s_magic == AUFS_SUPER_MAGIC; -+} -+ -+static inline const char *au_sbtype(struct super_block *sb) -+{ -+ return sb->s_type->name; -+} -+ -+static inline int au_test_iso9660(struct super_block *sb __maybe_unused) -+{ -+#if defined(CONFIG_ROMFS_FS) || defined(CONFIG_ROMFS_FS_MODULE) -+ return sb->s_magic == ROMFS_MAGIC; -+#else -+ return 0; -+#endif -+} -+ -+static inline int au_test_romfs(struct super_block *sb __maybe_unused) -+{ -+#if defined(CONFIG_ISO9660_FS) || defined(CONFIG_ISO9660_FS_MODULE) -+ return sb->s_magic == ISOFS_SUPER_MAGIC; -+#else -+ return 0; -+#endif -+} -+ -+static inline int au_test_cramfs(struct super_block *sb __maybe_unused) -+{ -+#if defined(CONFIG_CRAMFS) || defined(CONFIG_CRAMFS_MODULE) -+ return sb->s_magic == CRAMFS_MAGIC; -+#endif -+ return 0; -+} -+ -+static inline int au_test_nfs(struct super_block *sb __maybe_unused) -+{ -+#if defined(CONFIG_NFS_FS) || defined(CONFIG_NFS_FS_MODULE) -+ return sb->s_magic == NFS_SUPER_MAGIC; -+#else -+ return 0; -+#endif -+} -+ -+static inline int au_test_fuse(struct super_block *sb __maybe_unused) -+{ -+#if defined(CONFIG_FUSE_FS) || defined(CONFIG_FUSE_FS_MODULE) -+ return sb->s_magic == FUSE_SUPER_MAGIC; -+#else -+ return 0; -+#endif -+} -+ -+static inline int au_test_xfs(struct super_block *sb __maybe_unused) -+{ -+#if defined(CONFIG_XFS_FS) || defined(CONFIG_XFS_FS_MODULE) -+ return sb->s_magic == XFS_SB_MAGIC; -+#else -+ return 0; -+#endif -+} -+ -+static inline int au_test_tmpfs(struct super_block *sb __maybe_unused) -+{ -+#ifdef CONFIG_TMPFS -+ return sb->s_magic == TMPFS_MAGIC; -+#else -+ return 0; -+#endif -+} -+ -+static inline int au_test_ecryptfs(struct super_block *sb __maybe_unused) -+{ -+#if defined(CONFIG_ECRYPT_FS) || defined(CONFIG_ECRYPT_FS_MODULE) -+ return !strcmp(au_sbtype(sb), "ecryptfs"); -+#else -+ return 0; -+#endif -+} -+ -+static inline int au_test_smbfs(struct super_block *sb __maybe_unused) -+{ -+#if defined(CONFIG_SMB_FS) || defined(CONFIG_SMB_FS_MODULE) -+ return sb->s_magic == SMB_SUPER_MAGIC; -+#else -+ return 0; -+#endif -+} -+ -+static inline int au_test_ocfs2(struct super_block *sb __maybe_unused) -+{ -+#if defined(CONFIG_OCFS2_FS) || defined(CONFIG_OCFS2_FS_MODULE) -+ return sb->s_magic == OCFS2_SUPER_MAGIC; -+#else -+ return 0; -+#endif -+} -+ -+static inline int au_test_ocfs2_dlmfs(struct super_block *sb __maybe_unused) -+{ -+#if defined(CONFIG_OCFS2_FS_O2CB) || defined(CONFIG_OCFS2_FS_O2CB_MODULE) -+ return sb->s_magic == DLMFS_MAGIC; -+#else -+ return 0; -+#endif -+} -+ -+static inline int au_test_coda(struct super_block *sb __maybe_unused) -+{ -+#if defined(CONFIG_CODA_FS) || defined(CONFIG_CODA_FS_MODULE) -+ return sb->s_magic == CODA_SUPER_MAGIC; -+#else -+ return 0; -+#endif -+} -+ -+static inline int au_test_v9fs(struct super_block *sb __maybe_unused) -+{ -+#if defined(CONFIG_9P_FS) || defined(CONFIG_9P_FS_MODULE) -+ return sb->s_magic == V9FS_MAGIC; -+#else -+ return 0; -+#endif -+} -+ -+static inline int au_test_ext4(struct super_block *sb __maybe_unused) -+{ -+#if defined(CONFIG_EXT4DEV_FS) || defined(CONFIG_EXT4DEV_FS_MODULE) -+ return sb->s_magic == EXT4_SUPER_MAGIC; -+#else -+ return 0; -+#endif -+} -+ -+static inline int au_test_sysv(struct super_block *sb __maybe_unused) -+{ -+#if defined(CONFIG_SYSV_FS) || defined(CONFIG_SYSV_FS_MODULE) -+ return !strcmp(au_sbtype(sb), "sysv"); -+#else -+ return 0; -+#endif -+} -+ -+static inline int au_test_ramfs(struct super_block *sb) -+{ -+ return sb->s_magic == RAMFS_MAGIC; -+} -+ -+static inline int au_test_ubifs(struct super_block *sb __maybe_unused) -+{ -+#if defined(CONFIG_UBIFS_FS) || defined(CONFIG_UBIFS_FS_MODULE) -+ return sb->s_magic == UBIFS_SUPER_MAGIC; -+#else -+ return 0; -+#endif -+} -+ -+static inline int au_test_procfs(struct super_block *sb __maybe_unused) -+{ -+#ifdef CONFIG_PROC_FS -+ return sb->s_magic == PROC_SUPER_MAGIC; -+#else -+ return 0; -+#endif -+} -+ -+static inline int au_test_sysfs(struct super_block *sb __maybe_unused) -+{ -+#ifdef CONFIG_SYSFS -+ return sb->s_magic == SYSFS_MAGIC; -+#else -+ return 0; -+#endif -+} -+ -+static inline int au_test_configfs(struct super_block *sb __maybe_unused) -+{ -+#if defined(CONFIG_CONFIGFS_FS) || defined(CONFIG_CONFIGFS_FS_MODULE) -+ return sb->s_magic == CONFIGFS_MAGIC; -+#else -+ return 0; -+#endif -+} -+ -+static inline int au_test_minix(struct super_block *sb __maybe_unused) -+{ -+#if defined(CONFIG_MINIX_FS) || defined(CONFIG_MINIX_FS_MODULE) -+ return sb->s_magic == MINIX3_SUPER_MAGIC -+ || sb->s_magic == MINIX2_SUPER_MAGIC -+ || sb->s_magic == MINIX2_SUPER_MAGIC2 -+ || sb->s_magic == MINIX_SUPER_MAGIC -+ || sb->s_magic == MINIX_SUPER_MAGIC2; -+#else -+ return 0; -+#endif -+} -+ -+static inline int au_test_cifs(struct super_block *sb __maybe_unused) -+{ -+#if defined(CONFIG_CIFS_FS) || defined(CONFIGCIFS_FS_MODULE) -+ return sb->s_magic == CIFS_MAGIC_NUMBER; -+#else -+ return 0; -+#endif -+} -+ -+static inline int au_test_fat(struct super_block *sb __maybe_unused) -+{ -+#if defined(CONFIG_FAT_FS) || defined(CONFIG_FAT_FS_MODULE) -+ return sb->s_magic == MSDOS_SUPER_MAGIC; -+#else -+ return 0; -+#endif -+} -+ -+static inline int au_test_msdos(struct super_block *sb) -+{ -+ return au_test_fat(sb); -+} -+ -+static inline int au_test_vfat(struct super_block *sb) -+{ -+ return au_test_fat(sb); -+} -+ -+static inline int au_test_securityfs(struct super_block *sb __maybe_unused) -+{ -+#ifdef CONFIG_SECURITYFS -+ return sb->s_magic == SECURITYFS_MAGIC; -+#else -+ return 0; -+#endif -+} -+ -+static inline int au_test_squashfs(struct super_block *sb __maybe_unused) -+{ -+#if defined(CONFIG_SQUASHFS) || defined(CONFIG_SQUASHFS_MODULE) -+ return sb->s_magic == SQUASHFS_MAGIC; -+#else -+ return 0; -+#endif -+} -+ -+static inline int au_test_btrfs(struct super_block *sb __maybe_unused) -+{ -+#if defined(CONFIG_BTRFS_FS) || defined(CONFIG_BTRFS_FS_MODULE) -+ return sb->s_magic == BTRFS_SUPER_MAGIC; -+#else -+ return 0; -+#endif -+} -+ -+static inline int au_test_xenfs(struct super_block *sb __maybe_unused) -+{ -+#if defined(CONFIG_XENFS) || defined(CONFIG_XENFS_MODULE) -+ return sb->s_magic == XENFS_SUPER_MAGIC; -+#else -+ return 0; -+#endif -+} -+ -+static inline int au_test_debugfs(struct super_block *sb __maybe_unused) -+{ -+#ifdef CONFIG_DEBUG_FS -+ return sb->s_magic == DEBUGFS_MAGIC; -+#else -+ return 0; -+#endif -+} -+ -+static inline int au_test_nilfs(struct super_block *sb __maybe_unused) -+{ -+#if defined(CONFIG_NILFS) || defined(CONFIG_NILFS_MODULE) -+ return sb->s_magic == NILFS_SUPER_MAGIC; -+#else -+ return 0; -+#endif -+} -+ -+static inline int au_test_hfsplus(struct super_block *sb __maybe_unused) -+{ -+#if defined(CONFIG_HFSPLUS_FS) || defined(CONFIG_HFSPLUS_FS_MODULE) -+ return sb->s_magic == HFSPLUS_SUPER_MAGIC; -+#else -+ return 0; -+#endif -+} -+ -+/* ---------------------------------------------------------------------- */ -+/* -+ * they can't be an aufs branch. -+ */ -+static inline int au_test_fs_unsuppoted(struct super_block *sb) -+{ -+ return -+#ifndef CONFIG_AUFS_BR_RAMFS -+ au_test_ramfs(sb) || -+#endif -+ au_test_procfs(sb) -+ || au_test_sysfs(sb) -+ || au_test_configfs(sb) -+ || au_test_debugfs(sb) -+ || au_test_securityfs(sb) -+ || au_test_xenfs(sb) -+ || au_test_ecryptfs(sb) -+ /* || !strcmp(au_sbtype(sb), "unionfs") */ -+ || au_test_aufs(sb); /* will be supported in next version */ -+} -+ -+/* -+ * If the filesystem supports NFS-export, then it has to support NULL as -+ * a nameidata parameter for ->create(), ->lookup() and ->d_revalidate(). -+ * We can apply this principle when we handle a lower filesystem. -+ */ -+static inline int au_test_fs_null_nd(struct super_block *sb) -+{ -+ return !!sb->s_export_op; -+} -+ -+static inline int au_test_fs_remote(struct super_block *sb) -+{ -+ return !au_test_tmpfs(sb) -+#ifdef CONFIG_AUFS_BR_RAMFS -+ && !au_test_ramfs(sb) -+#endif -+ && !(sb->s_type->fs_flags & FS_REQUIRES_DEV); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * Note: these functions (below) are created after reading ->getattr() in all -+ * filesystems under linux/fs. it means we have to do so in every update... -+ */ -+ -+/* -+ * some filesystems require getattr to refresh the inode attributes before -+ * referencing. -+ * in most cases, we can rely on the inode attribute in NFS (or every remote fs) -+ * and leave the work for d_revalidate() -+ */ -+static inline int au_test_fs_refresh_iattr(struct super_block *sb) -+{ -+ return au_test_nfs(sb) -+ || au_test_fuse(sb) -+ /* || au_test_smbfs(sb) */ /* untested */ -+ /* || au_test_ocfs2(sb) */ /* untested */ -+ /* || au_test_btrfs(sb) */ /* untested */ -+ /* || au_test_coda(sb) */ /* untested */ -+ /* || au_test_v9fs(sb) */ /* untested */ -+ ; -+} -+ -+/* -+ * filesystems which don't maintain i_size or i_blocks. -+ */ -+static inline int au_test_fs_bad_iattr_size(struct super_block *sb) -+{ -+ return au_test_xfs(sb) -+ || au_test_btrfs(sb) -+ || au_test_ubifs(sb) -+ || au_test_hfsplus(sb) /* maintained, but incorrect */ -+ /* || au_test_ext4(sb) */ /* untested */ -+ /* || au_test_ocfs2(sb) */ /* untested */ -+ /* || au_test_ocfs2_dlmfs(sb) */ /* untested */ -+ /* || au_test_sysv(sb) */ /* untested */ -+ /* || au_test_minix(sb) */ /* untested */ -+ ; -+} -+ -+/* -+ * filesystems which don't store the correct value in some of their inode -+ * attributes. -+ */ -+static inline int au_test_fs_bad_iattr(struct super_block *sb) -+{ -+ return au_test_fs_bad_iattr_size(sb) -+ /* || au_test_cifs(sb) */ /* untested */ -+ || au_test_fat(sb) -+ || au_test_msdos(sb) -+ || au_test_vfat(sb); -+} -+ -+/* they don't check i_nlink in link(2) */ -+static inline int au_test_fs_no_limit_nlink(struct super_block *sb) -+{ -+ return au_test_tmpfs(sb) -+#ifdef CONFIG_AUFS_BR_RAMFS -+ || au_test_ramfs(sb) -+#endif -+ || au_test_ubifs(sb) -+ || au_test_btrfs(sb) -+ || au_test_hfsplus(sb); -+} -+ -+/* -+ * filesystems which sets S_NOATIME and S_NOCMTIME. -+ */ -+static inline int au_test_fs_notime(struct super_block *sb) -+{ -+ return au_test_nfs(sb) -+ || au_test_fuse(sb) -+ || au_test_ubifs(sb) -+ /* || au_test_cifs(sb) */ /* untested */ -+ ; -+} -+ -+/* -+ * filesystems which requires replacing i_mapping. -+ */ -+static inline int au_test_fs_bad_mapping(struct super_block *sb) -+{ -+ return au_test_fuse(sb) -+ || au_test_ubifs(sb); -+} -+ -+/* temporary support for i#1 in cramfs */ -+static inline int au_test_fs_unique_ino(struct inode *inode) -+{ -+ if (au_test_cramfs(inode->i_sb)) -+ return inode->i_ino != 1; -+ return 1; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * the filesystem where the xino files placed must support i/o after unlink and -+ * maintain i_size and i_blocks. -+ */ -+static inline int au_test_fs_bad_xino(struct super_block *sb) -+{ -+ return au_test_fs_remote(sb) -+ || au_test_fs_bad_iattr_size(sb) -+#ifdef CONFIG_AUFS_BR_RAMFS -+ || !(au_test_ramfs(sb) || au_test_fs_null_nd(sb)) -+#else -+ || !au_test_fs_null_nd(sb) /* to keep xino code simple */ -+#endif -+ /* don't want unnecessary work for xino */ -+ || au_test_aufs(sb) -+ || au_test_ecryptfs(sb) -+ || au_test_nilfs(sb); -+} -+ -+static inline int au_test_fs_trunc_xino(struct super_block *sb) -+{ -+ return au_test_tmpfs(sb) -+ || au_test_ramfs(sb); -+} -+ -+/* -+ * test if the @sb is real-readonly. -+ */ -+static inline int au_test_fs_rr(struct super_block *sb) -+{ -+ return au_test_squashfs(sb) -+ || au_test_iso9660(sb) -+ || au_test_cramfs(sb) -+ || au_test_romfs(sb); -+} -+ -+#endif /* __KERNEL__ */ -+#endif /* __AUFS_FSTYPE_H__ */ -diff -Nur linux-2.6.33.1-vanilla/fs/aufs/hfsnotify.c linux-2.6.33.1/fs/aufs/hfsnotify.c ---- linux-2.6.33.1-vanilla/fs/aufs/hfsnotify.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-2.6.33.1/fs/aufs/hfsnotify.c 2010-04-05 16:53:27.000000000 +0200 -@@ -0,0 +1,230 @@ -+/* -+ * Copyright (C) 2005-2010 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+/* -+ * fsnotify for the lower directories -+ */ -+ -+#include "aufs.h" -+ -+/* FS_IN_IGNORED is unnecessary */ -+static const __u32 AuHfsnMask = (FS_MOVED_TO | FS_MOVED_FROM | FS_DELETE -+ | FS_CREATE | FS_EVENT_ON_CHILD); -+static struct fsnotify_group *au_hfsn_group; -+ -+static void au_hfsn_free_mark(struct fsnotify_mark_entry *entry) -+{ -+#if 0 -+ struct au_hnotify *hn = container_of(entry, struct au_hnotify, -+ hn_entry); -+ au_cache_free_hnotify(hn); -+#endif -+ AuDbg("here\n"); -+} -+ -+static int au_hfsn_alloc(struct au_hnotify *hn, struct inode *h_inode) -+{ -+ struct fsnotify_mark_entry *entry; -+ -+ entry = &hn->hn_entry; -+ fsnotify_init_mark(entry, au_hfsn_free_mark); -+ entry->mask = AuHfsnMask; -+ return fsnotify_add_mark(entry, au_hfsn_group, h_inode); -+} -+ -+static void au_hfsn_free(struct au_hnotify *hn) -+{ -+ struct fsnotify_mark_entry *entry; -+ -+ entry = &hn->hn_entry; -+ fsnotify_destroy_mark_by_entry(entry); -+ fsnotify_put_mark(entry); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static void au_hfsn_ctl(struct au_hinode *hinode, int do_set) -+{ -+ struct fsnotify_mark_entry *entry; -+ -+ entry = &hinode->hi_notify->hn_entry; -+ spin_lock(&entry->lock); -+ if (do_set) { -+ AuDebugOn(entry->mask & AuHfsnMask); -+ entry->mask |= AuHfsnMask; -+ } else { -+ AuDebugOn(!(entry->mask & AuHfsnMask)); -+ entry->mask &= ~AuHfsnMask; -+ } -+ spin_unlock(&entry->lock); -+ /* fsnotify_recalc_inode_mask(hinode->hi_inode); */ -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* #define AuDbgHnotify */ -+#ifdef AuDbgHnotify -+static char *au_hfsn_name(u32 mask) -+{ -+#ifdef CONFIG_AUFS_DEBUG -+#define test_ret(flag) if (mask & flag) \ -+ return #flag; -+ test_ret(FS_ACCESS); -+ test_ret(FS_MODIFY); -+ test_ret(FS_ATTRIB); -+ test_ret(FS_CLOSE_WRITE); -+ test_ret(FS_CLOSE_NOWRITE); -+ test_ret(FS_OPEN); -+ test_ret(FS_MOVED_FROM); -+ test_ret(FS_MOVED_TO); -+ test_ret(FS_CREATE); -+ test_ret(FS_DELETE); -+ test_ret(FS_DELETE_SELF); -+ test_ret(FS_MOVE_SELF); -+ test_ret(FS_UNMOUNT); -+ test_ret(FS_Q_OVERFLOW); -+ test_ret(FS_IN_IGNORED); -+ test_ret(FS_IN_ISDIR); -+ test_ret(FS_IN_ONESHOT); -+ test_ret(FS_EVENT_ON_CHILD); -+ return ""; -+#undef test_ret -+#else -+ return "??"; -+#endif -+} -+#endif -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int au_hfsn_handle_event(struct fsnotify_group *group, -+ struct fsnotify_event *event) -+{ -+ int err; -+ struct au_hnotify *hnotify; -+ struct inode *h_dir, *h_inode; -+ __u32 mask; -+ struct fsnotify_mark_entry *entry; -+ struct qstr h_child_qstr = { -+ .name = event->file_name, -+ .len = event->name_len -+ }; -+ -+ AuDebugOn(event->data_type != FSNOTIFY_EVENT_INODE); -+ -+ err = 0; -+ /* if IN_UNMOUNT happens, there must be another bug */ -+ mask = event->mask; -+ AuDebugOn(mask & FS_UNMOUNT); -+ if (mask & (IN_IGNORED | IN_UNMOUNT)) -+ goto out; -+ -+ h_dir = event->to_tell; -+ h_inode = event->inode; -+#ifdef AuDbgHnotify -+ au_debug(1); -+ if (1 || h_child_qstr.len != sizeof(AUFS_XINO_FNAME) - 1 -+ || strncmp(h_child_qstr.name, AUFS_XINO_FNAME, h_child_qstr.len)) { -+ AuDbg("i%lu, mask 0x%x %s, hcname %.*s, hi%lu\n", -+ h_dir->i_ino, mask, au_hfsn_name(mask), -+ AuLNPair(&h_child_qstr), h_inode ? h_inode->i_ino : 0); -+ /* WARN_ON(1); */ -+ } -+ au_debug(0); -+#endif -+ -+ spin_lock(&h_dir->i_lock); -+ entry = fsnotify_find_mark_entry(group, h_dir); -+ spin_unlock(&h_dir->i_lock); -+ if (entry) { -+ hnotify = container_of(entry, struct au_hnotify, hn_entry); -+ err = au_hnotify(h_dir, hnotify, mask, &h_child_qstr, h_inode); -+ fsnotify_put_mark(entry); -+ } -+ -+out: -+ return err; -+} -+ -+/* copied from linux/fs/notify/inotify/inotify_fsnotiry.c */ -+/* it should be exported to modules */ -+static bool au_hfsn_should_send_event(struct fsnotify_group *group, -+ struct inode *h_inode, __u32 mask) -+{ -+ struct fsnotify_mark_entry *entry; -+ bool send; -+ -+ spin_lock(&h_inode->i_lock); -+ entry = fsnotify_find_mark_entry(group, h_inode); -+ spin_unlock(&h_inode->i_lock); -+ if (!entry) -+ return false; -+ -+ mask = (mask & ~FS_EVENT_ON_CHILD); -+ send = (entry->mask & mask); -+ -+ /* find took a reference */ -+ fsnotify_put_mark(entry); -+ -+ return send; -+} -+ -+static struct fsnotify_ops au_hfsn_ops = { -+ .should_send_event = au_hfsn_should_send_event, -+ .handle_event = au_hfsn_handle_event -+}; -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int __init au_hfsn_init(void) -+{ -+ int err; -+ unsigned int gn; -+ const unsigned int gn_max = 10; -+ -+ gn = 0; -+ for (gn = 0; gn < gn_max; gn++) { -+ au_hfsn_group = fsnotify_obtain_group(gn, AuHfsnMask, -+ &au_hfsn_ops); -+ if (au_hfsn_group != ERR_PTR(-EEXIST)) -+ break; -+ } -+ -+ err = 0; -+ if (IS_ERR(au_hfsn_group)) { -+ pr_err("fsnotify_obtain_group() failed %u times\n", gn_max); -+ err = PTR_ERR(au_hfsn_group); -+ } -+ -+ AuTraceErr(err); -+ return err; -+} -+ -+static void au_hfsn_fin(void) -+{ -+ fsnotify_put_group(au_hfsn_group); -+} -+ -+const struct au_hnotify_op au_hnotify_op = { -+ .ctl = au_hfsn_ctl, -+ .alloc = au_hfsn_alloc, -+ .free = au_hfsn_free, -+ -+ .fin = au_hfsn_fin, -+ .init = au_hfsn_init -+}; -diff -Nur linux-2.6.33.1-vanilla/fs/aufs/hfsplus.c linux-2.6.33.1/fs/aufs/hfsplus.c ---- linux-2.6.33.1-vanilla/fs/aufs/hfsplus.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-2.6.33.1/fs/aufs/hfsplus.c 2010-04-05 16:53:27.000000000 +0200 -@@ -0,0 +1,58 @@ -+/* -+ * Copyright (C) 2010 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+/* -+ * special support for filesystems which aqucires an inode mutex -+ * at final closing a file, eg, hfsplus. -+ * -+ * This trick is very simple and stupid, just to open the file before really -+ * neceeary open to tell hfsplus that this is not the final closing. -+ * The caller should call au_h_open_pre() after acquiring the inode mutex, -+ * and au_h_open_post() after releasing it. -+ */ -+ -+#include -+#include "aufs.h" -+ -+struct file *au_h_open_pre(struct dentry *dentry, aufs_bindex_t bindex) -+{ -+ struct file *h_file; -+ struct dentry *h_dentry; -+ -+ h_dentry = au_h_dptr(dentry, bindex); -+ AuDebugOn(!h_dentry); -+ AuDebugOn(!h_dentry->d_inode); -+ IMustLock(h_dentry->d_inode); -+ -+ h_file = NULL; -+ if (au_test_hfsplus(h_dentry->d_sb) -+ && S_ISREG(h_dentry->d_inode->i_mode)) -+ h_file = au_h_open(dentry, bindex, -+ O_RDONLY | O_NOATIME | O_LARGEFILE, -+ /*file*/NULL); -+ return h_file; -+} -+ -+void au_h_open_post(struct dentry *dentry, aufs_bindex_t bindex, -+ struct file *h_file) -+{ -+ if (h_file) { -+ fput(h_file); -+ au_sbr_put(dentry->d_sb, bindex); -+ } -+} -diff -Nur linux-2.6.33.1-vanilla/fs/aufs/hinotify.c linux-2.6.33.1/fs/aufs/hinotify.c ---- linux-2.6.33.1-vanilla/fs/aufs/hinotify.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-2.6.33.1/fs/aufs/hinotify.c 2010-04-05 16:53:27.000000000 +0200 -@@ -0,0 +1,227 @@ -+/* -+ * Copyright (C) 2005-2010 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+/* -+ * inotify for the lower directories (deprecated) -+ */ -+ -+#include "aufs.h" -+ -+static const __u32 AuHinMask = (IN_MOVE | IN_DELETE | IN_CREATE); -+static struct inotify_handle *au_hin_handle; -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int au_hin_alloc(struct au_hnotify *hn, struct inode *h_inode) -+{ -+ int err; -+ s32 wd; -+ struct inotify_watch *watch; -+ -+ err = -EEXIST; -+ wd = inotify_find_watch(au_hin_handle, h_inode, &watch); -+ if (wd >= 0) { -+ put_inotify_watch(watch); -+ goto out; -+ } -+ -+ err = 0; -+ inotify_init_watch(&hn->hn_watch); -+ wd = inotify_add_watch(au_hin_handle, &hn->hn_watch, h_inode, -+ AuHinMask); -+ if (unlikely(wd < 0)) { -+ err = wd; -+ put_inotify_watch(&hn->hn_watch); -+ } -+ -+out: -+ return err; -+} -+ -+static void au_hin_free(struct au_hnotify *hn) -+{ -+ int err; -+ -+ err = 0; -+ if (atomic_read(&hn->hn_watch.count)) -+ err = inotify_rm_watch(au_hin_handle, &hn->hn_watch); -+ if (unlikely(err)) -+ /* it means the watch is already removed */ -+ pr_warning("failed inotify_rm_watch() %d\n", err); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static void au_hin_ctl(struct au_hinode *hinode, int do_set) -+{ -+ struct inode *h_inode; -+ struct inotify_watch *watch; -+ -+ h_inode = hinode->hi_inode; -+ IMustLock(h_inode); -+ -+ /* todo: try inotify_find_update_watch()? */ -+ watch = &hinode->hi_notify->hn_watch; -+ mutex_lock(&h_inode->inotify_mutex); -+ /* mutex_lock(&watch->ih->mutex); */ -+ if (do_set) { -+ AuDebugOn(watch->mask & AuHinMask); -+ watch->mask |= AuHinMask; -+ } else { -+ AuDebugOn(!(watch->mask & AuHinMask)); -+ watch->mask &= ~AuHinMask; -+ } -+ /* mutex_unlock(&watch->ih->mutex); */ -+ mutex_unlock(&h_inode->inotify_mutex); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+#ifdef AuDbgHnotify -+static char *in_name(u32 mask) -+{ -+#ifdef CONFIG_AUFS_DEBUG -+#define test_ret(flag) if (mask & flag) \ -+ return #flag; -+ test_ret(IN_ACCESS); -+ test_ret(IN_MODIFY); -+ test_ret(IN_ATTRIB); -+ test_ret(IN_CLOSE_WRITE); -+ test_ret(IN_CLOSE_NOWRITE); -+ test_ret(IN_OPEN); -+ test_ret(IN_MOVED_FROM); -+ test_ret(IN_MOVED_TO); -+ test_ret(IN_CREATE); -+ test_ret(IN_DELETE); -+ test_ret(IN_DELETE_SELF); -+ test_ret(IN_MOVE_SELF); -+ test_ret(IN_UNMOUNT); -+ test_ret(IN_Q_OVERFLOW); -+ test_ret(IN_IGNORED); -+ return ""; -+#undef test_ret -+#else -+ return "??"; -+#endif -+} -+#endif -+ -+static u32 au_hin_conv_mask(u32 mask) -+{ -+ u32 conv; -+ -+ conv = 0; -+#define do_conv(flag) conv |= (mask & IN_ ## flag) ? FS_ ## flag : 0 -+ do_conv(ACCESS); -+ do_conv(MODIFY); -+ do_conv(ATTRIB); -+ do_conv(CLOSE_WRITE); -+ do_conv(CLOSE_NOWRITE); -+ do_conv(OPEN); -+ do_conv(MOVED_FROM); -+ do_conv(MOVED_TO); -+ do_conv(CREATE); -+ do_conv(DELETE); -+ do_conv(DELETE_SELF); -+ do_conv(MOVE_SELF); -+ do_conv(UNMOUNT); -+ do_conv(Q_OVERFLOW); -+#undef do_conv -+#define do_conv(flag) conv |= (mask & IN_ ## flag) ? FS_IN_ ## flag : 0 -+ do_conv(IGNORED); -+ /* do_conv(ISDIR); */ -+ /* do_conv(ONESHOT); */ -+#undef do_conv -+ -+ return conv; -+} -+ -+static void aufs_inotify(struct inotify_watch *watch, u32 wd __maybe_unused, -+ u32 mask, u32 cookie __maybe_unused, -+ const char *h_child_name, struct inode *h_child_inode) -+{ -+ struct au_hnotify *hnotify; -+ struct qstr h_child_qstr = { -+ .name = h_child_name -+ }; -+ -+ /* if IN_UNMOUNT happens, there must be another bug */ -+ AuDebugOn(mask & IN_UNMOUNT); -+ if (mask & (IN_IGNORED | IN_UNMOUNT)) { -+ put_inotify_watch(watch); -+ return; -+ } -+ -+#ifdef AuDbgHnotify -+ au_debug(1); -+ if (1 || !h_child_name || strcmp(h_child_name, AUFS_XINO_FNAME)) { -+ AuDbg("i%lu, wd %d, mask 0x%x %s, cookie 0x%x, hcname %s," -+ " hi%lu\n", -+ watch->inode->i_ino, wd, mask, in_name(mask), cookie, -+ h_child_name ? h_child_name : "", -+ h_child_inode ? h_child_inode->i_ino : 0); -+ WARN_ON(1); -+ } -+ au_debug(0); -+#endif -+ -+ if (h_child_name) -+ h_child_qstr.len = strlen(h_child_name); -+ hnotify = container_of(watch, struct au_hnotify, hn_watch); -+ mask = au_hin_conv_mask(mask); -+ au_hnotify(watch->inode, hnotify, mask, &h_child_qstr, h_child_inode); -+} -+ -+static void aufs_inotify_destroy(struct inotify_watch *watch __maybe_unused) -+{ -+ return; -+} -+ -+static struct inotify_operations aufs_inotify_ops = { -+ .handle_event = aufs_inotify, -+ .destroy_watch = aufs_inotify_destroy -+}; -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int __init au_hin_init(void) -+{ -+ int err; -+ -+ err = 0; -+ au_hin_handle = inotify_init(&aufs_inotify_ops); -+ if (IS_ERR(au_hin_handle)) -+ err = PTR_ERR(au_hin_handle); -+ -+ AuTraceErr(err); -+ return err; -+} -+ -+static void au_hin_fin(void) -+{ -+ inotify_destroy(au_hin_handle); -+} -+ -+const struct au_hnotify_op au_hnotify_op = { -+ .ctl = au_hin_ctl, -+ .alloc = au_hin_alloc, -+ .free = au_hin_free, -+ -+ .fin = au_hin_fin, -+ .init = au_hin_init -+}; -diff -Nur linux-2.6.33.1-vanilla/fs/aufs/hnotify.c linux-2.6.33.1/fs/aufs/hnotify.c ---- linux-2.6.33.1-vanilla/fs/aufs/hnotify.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-2.6.33.1/fs/aufs/hnotify.c 2010-04-05 16:53:27.000000000 +0200 -@@ -0,0 +1,671 @@ -+/* -+ * Copyright (C) 2005-2010 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+/* -+ * abstraction to notify the direct changes on lower directories -+ */ -+ -+#include "aufs.h" -+ -+int au_hn_alloc(struct au_hinode *hinode, struct inode *inode, -+ struct inode *h_inode) -+{ -+ int err; -+ struct au_hnotify *hn; -+ -+ err = -ENOMEM; -+ hn = au_cache_alloc_hnotify(); -+ if (hn) { -+ hn->hn_aufs_inode = inode; -+ err = au_hnotify_op.alloc(hn, h_inode); -+ if (!err) -+ hinode->hi_notify = hn; -+ else { -+ au_cache_free_hnotify(hn); -+ /* -+ * The upper dir was removed by udba, but the same named -+ * dir left. In this case, aufs assignes a new inode -+ * number and set the monitor again. -+ * For the lower dir, the old monitnor is still left. -+ */ -+ if (err == -EEXIST) -+ err = 0; -+ } -+ } -+ -+ return err; -+} -+ -+void au_hn_free(struct au_hinode *hinode) -+{ -+ struct au_hnotify *hn; -+ -+ hn = hinode->hi_notify; -+ if (hn) { -+ au_hnotify_op.free(hn); -+ au_cache_free_hnotify(hn); -+ hinode->hi_notify = NULL; -+ } -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+void au_hn_ctl(struct au_hinode *hinode, int do_set) -+{ -+ if (hinode->hi_notify) -+ au_hnotify_op.ctl(hinode, do_set); -+} -+ -+void au_hn_reset(struct inode *inode, unsigned int flags) -+{ -+ aufs_bindex_t bindex, bend; -+ struct inode *hi; -+ struct dentry *iwhdentry; -+ -+ bend = au_ibend(inode); -+ for (bindex = au_ibstart(inode); bindex <= bend; bindex++) { -+ hi = au_h_iptr(inode, bindex); -+ if (!hi) -+ continue; -+ -+ /* mutex_lock_nested(&hi->i_mutex, AuLsc_I_CHILD); */ -+ iwhdentry = au_hi_wh(inode, bindex); -+ if (iwhdentry) -+ dget(iwhdentry); -+ au_igrab(hi); -+ au_set_h_iptr(inode, bindex, NULL, 0); -+ au_set_h_iptr(inode, bindex, au_igrab(hi), -+ flags & ~AuHi_XINO); -+ iput(hi); -+ dput(iwhdentry); -+ /* mutex_unlock(&hi->i_mutex); */ -+ } -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int hn_xino(struct inode *inode, struct inode *h_inode) -+{ -+ int err; -+ aufs_bindex_t bindex, bend, bfound, bstart; -+ struct inode *h_i; -+ -+ err = 0; -+ if (unlikely(inode->i_ino == AUFS_ROOT_INO)) { -+ pr_warning("branch root dir was changed\n"); -+ goto out; -+ } -+ -+ bfound = -1; -+ bend = au_ibend(inode); -+ bstart = au_ibstart(inode); -+#if 0 /* reserved for future use */ -+ if (bindex == bend) { -+ /* keep this ino in rename case */ -+ goto out; -+ } -+#endif -+ for (bindex = bstart; bindex <= bend; bindex++) -+ if (au_h_iptr(inode, bindex) == h_inode) { -+ bfound = bindex; -+ break; -+ } -+ if (bfound < 0) -+ goto out; -+ -+ for (bindex = bstart; bindex <= bend; bindex++) { -+ h_i = au_h_iptr(inode, bindex); -+ if (!h_i) -+ continue; -+ -+ err = au_xino_write(inode->i_sb, bindex, h_i->i_ino, /*ino*/0); -+ /* ignore this error */ -+ /* bad action? */ -+ } -+ -+ /* children inode number will be broken */ -+ -+ out: -+ AuTraceErr(err); -+ return err; -+} -+ -+static int hn_gen_tree(struct dentry *dentry) -+{ -+ int err, i, j, ndentry; -+ struct au_dcsub_pages dpages; -+ struct au_dpage *dpage; -+ struct dentry **dentries; -+ -+ err = au_dpages_init(&dpages, GFP_NOFS); -+ if (unlikely(err)) -+ goto out; -+ err = au_dcsub_pages(&dpages, dentry, NULL, NULL); -+ if (unlikely(err)) -+ goto out_dpages; -+ -+ for (i = 0; i < dpages.ndpage; i++) { -+ dpage = dpages.dpages + i; -+ dentries = dpage->dentries; -+ ndentry = dpage->ndentry; -+ for (j = 0; j < ndentry; j++) { -+ struct dentry *d; -+ -+ d = dentries[j]; -+ if (IS_ROOT(d)) -+ continue; -+ -+ d_drop(d); -+ au_digen_dec(d); -+ if (d->d_inode) -+ /* todo: reset children xino? -+ cached children only? */ -+ au_iigen_dec(d->d_inode); -+ } -+ } -+ -+ out_dpages: -+ au_dpages_free(&dpages); -+ -+ /* discard children */ -+ dentry_unhash(dentry); -+ dput(dentry); -+ out: -+ return err; -+} -+ -+/* -+ * return 0 if processed. -+ */ -+static int hn_gen_by_inode(char *name, unsigned int nlen, struct inode *inode, -+ const unsigned int isdir) -+{ -+ int err; -+ struct dentry *d; -+ struct qstr *dname; -+ -+ err = 1; -+ if (unlikely(inode->i_ino == AUFS_ROOT_INO)) { -+ pr_warning("branch root dir was changed\n"); -+ err = 0; -+ goto out; -+ } -+ -+ if (!isdir) { -+ AuDebugOn(!name); -+ au_iigen_dec(inode); -+ spin_lock(&dcache_lock); -+ list_for_each_entry(d, &inode->i_dentry, d_alias) { -+ dname = &d->d_name; -+ if (dname->len != nlen -+ && memcmp(dname->name, name, nlen)) -+ continue; -+ err = 0; -+ spin_lock(&d->d_lock); -+ __d_drop(d); -+ au_digen_dec(d); -+ spin_unlock(&d->d_lock); -+ break; -+ } -+ spin_unlock(&dcache_lock); -+ } else { -+ au_fset_si(au_sbi(inode->i_sb), FAILED_REFRESH_DIRS); -+ d = d_find_alias(inode); -+ if (!d) { -+ au_iigen_dec(inode); -+ goto out; -+ } -+ -+ dname = &d->d_name; -+ if (dname->len == nlen && !memcmp(dname->name, name, nlen)) -+ err = hn_gen_tree(d); -+ dput(d); -+ } -+ -+ out: -+ AuTraceErr(err); -+ return err; -+} -+ -+static int hn_gen_by_name(struct dentry *dentry, const unsigned int isdir) -+{ -+ int err; -+ struct inode *inode; -+ -+ inode = dentry->d_inode; -+ if (IS_ROOT(dentry) -+ /* || (inode && inode->i_ino == AUFS_ROOT_INO) */ -+ ) { -+ pr_warning("branch root dir was changed\n"); -+ return 0; -+ } -+ -+ err = 0; -+ if (!isdir) { -+ d_drop(dentry); -+ au_digen_dec(dentry); -+ if (inode) -+ au_iigen_dec(inode); -+ } else { -+ au_fset_si(au_sbi(dentry->d_sb), FAILED_REFRESH_DIRS); -+ if (inode) -+ err = hn_gen_tree(dentry); -+ } -+ -+ AuTraceErr(err); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* hnotify job flags */ -+#define AuHnJob_XINO0 1 -+#define AuHnJob_GEN (1 << 1) -+#define AuHnJob_DIRENT (1 << 2) -+#define AuHnJob_ISDIR (1 << 3) -+#define AuHnJob_TRYXINO0 (1 << 4) -+#define AuHnJob_MNTPNT (1 << 5) -+#define au_ftest_hnjob(flags, name) ((flags) & AuHnJob_##name) -+#define au_fset_hnjob(flags, name) { (flags) |= AuHnJob_##name; } -+#define au_fclr_hnjob(flags, name) { (flags) &= ~AuHnJob_##name; } -+ -+enum { -+ AuHn_CHILD, -+ AuHn_PARENT, -+ AuHnLast -+}; -+ -+struct au_hnotify_args { -+ struct inode *h_dir, *dir, *h_child_inode; -+ u32 mask; -+ unsigned int flags[AuHnLast]; -+ unsigned int h_child_nlen; -+ char h_child_name[]; -+}; -+ -+struct hn_job_args { -+ unsigned int flags; -+ struct inode *inode, *h_inode, *dir, *h_dir; -+ struct dentry *dentry; -+ char *h_name; -+ int h_nlen; -+}; -+ -+static int hn_job(struct hn_job_args *a) -+{ -+ const unsigned int isdir = au_ftest_hnjob(a->flags, ISDIR); -+ -+ /* reset xino */ -+ if (au_ftest_hnjob(a->flags, XINO0) && a->inode) -+ hn_xino(a->inode, a->h_inode); /* ignore this error */ -+ -+ if (au_ftest_hnjob(a->flags, TRYXINO0) -+ && a->inode -+ && a->h_inode) { -+ mutex_lock_nested(&a->h_inode->i_mutex, AuLsc_I_CHILD); -+ if (!a->h_inode->i_nlink) -+ hn_xino(a->inode, a->h_inode); /* ignore this error */ -+ mutex_unlock(&a->h_inode->i_mutex); -+ } -+ -+ /* make the generation obsolete */ -+ if (au_ftest_hnjob(a->flags, GEN)) { -+ int err = -1; -+ if (a->inode) -+ err = hn_gen_by_inode(a->h_name, a->h_nlen, a->inode, -+ isdir); -+ if (err && a->dentry) -+ hn_gen_by_name(a->dentry, isdir); -+ /* ignore this error */ -+ } -+ -+ /* make dir entries obsolete */ -+ if (au_ftest_hnjob(a->flags, DIRENT) && a->inode) { -+ struct au_vdir *vdir; -+ -+ vdir = au_ivdir(a->inode); -+ if (vdir) -+ vdir->vd_jiffy = 0; -+ /* IMustLock(a->inode); */ -+ /* a->inode->i_version++; */ -+ } -+ -+ /* can do nothing but warn */ -+ if (au_ftest_hnjob(a->flags, MNTPNT) -+ && a->dentry -+ && d_mountpoint(a->dentry)) -+ pr_warning("mount-point %.*s is removed or renamed\n", -+ AuDLNPair(a->dentry)); -+ -+ return 0; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static struct dentry *lookup_wlock_by_name(char *name, unsigned int nlen, -+ struct inode *dir) -+{ -+ struct dentry *dentry, *d, *parent; -+ struct qstr *dname; -+ -+ parent = d_find_alias(dir); -+ if (!parent) -+ return NULL; -+ -+ dentry = NULL; -+ spin_lock(&dcache_lock); -+ list_for_each_entry(d, &parent->d_subdirs, d_u.d_child) { -+ /* AuDbg("%.*s\n", AuDLNPair(d)); */ -+ dname = &d->d_name; -+ if (dname->len != nlen || memcmp(dname->name, name, nlen)) -+ continue; -+ if (!atomic_read(&d->d_count) || !d->d_fsdata) { -+ spin_lock(&d->d_lock); -+ __d_drop(d); -+ spin_unlock(&d->d_lock); -+ continue; -+ } -+ -+ dentry = dget(d); -+ break; -+ } -+ spin_unlock(&dcache_lock); -+ dput(parent); -+ -+ if (dentry) -+ di_write_lock_child(dentry); -+ -+ return dentry; -+} -+ -+static struct inode *lookup_wlock_by_ino(struct super_block *sb, -+ aufs_bindex_t bindex, ino_t h_ino) -+{ -+ struct inode *inode; -+ ino_t ino; -+ int err; -+ -+ inode = NULL; -+ err = au_xino_read(sb, bindex, h_ino, &ino); -+ if (!err && ino) -+ inode = ilookup(sb, ino); -+ if (!inode) -+ goto out; -+ -+ if (unlikely(inode->i_ino == AUFS_ROOT_INO)) { -+ pr_warning("wrong root branch\n"); -+ iput(inode); -+ inode = NULL; -+ goto out; -+ } -+ -+ ii_write_lock_child(inode); -+ -+ out: -+ return inode; -+} -+ -+static void au_hn_bh(void *_args) -+{ -+ struct au_hnotify_args *a = _args; -+ struct super_block *sb; -+ aufs_bindex_t bindex, bend, bfound; -+ unsigned char xino, try_iput; -+ int err; -+ struct inode *inode; -+ ino_t h_ino; -+ struct hn_job_args args; -+ struct dentry *dentry; -+ struct au_sbinfo *sbinfo; -+ -+ AuDebugOn(!_args); -+ AuDebugOn(!a->h_dir); -+ AuDebugOn(!a->dir); -+ AuDebugOn(!a->mask); -+ AuDbg("mask 0x%x, i%lu, hi%lu, hci%lu\n", -+ a->mask, a->dir->i_ino, a->h_dir->i_ino, -+ a->h_child_inode ? a->h_child_inode->i_ino : 0); -+ -+ inode = NULL; -+ dentry = NULL; -+ /* -+ * do not lock a->dir->i_mutex here -+ * because of d_revalidate() may cause a deadlock. -+ */ -+ sb = a->dir->i_sb; -+ AuDebugOn(!sb); -+ sbinfo = au_sbi(sb); -+ AuDebugOn(!sbinfo); -+ /* big aufs lock */ -+ si_noflush_write_lock(sb); -+ -+ ii_read_lock_parent(a->dir); -+ bfound = -1; -+ bend = au_ibend(a->dir); -+ for (bindex = au_ibstart(a->dir); bindex <= bend; bindex++) -+ if (au_h_iptr(a->dir, bindex) == a->h_dir) { -+ bfound = bindex; -+ break; -+ } -+ ii_read_unlock(a->dir); -+ if (unlikely(bfound < 0)) -+ goto out; -+ -+ xino = !!au_opt_test(au_mntflags(sb), XINO); -+ h_ino = 0; -+ if (a->h_child_inode) -+ h_ino = a->h_child_inode->i_ino; -+ -+ if (a->h_child_nlen -+ && (au_ftest_hnjob(a->flags[AuHn_CHILD], GEN) -+ || au_ftest_hnjob(a->flags[AuHn_CHILD], MNTPNT))) -+ dentry = lookup_wlock_by_name(a->h_child_name, a->h_child_nlen, -+ a->dir); -+ try_iput = 0; -+ if (dentry) -+ inode = dentry->d_inode; -+ if (xino && !inode && h_ino -+ && (au_ftest_hnjob(a->flags[AuHn_CHILD], XINO0) -+ || au_ftest_hnjob(a->flags[AuHn_CHILD], TRYXINO0) -+ || au_ftest_hnjob(a->flags[AuHn_CHILD], GEN))) { -+ inode = lookup_wlock_by_ino(sb, bfound, h_ino); -+ try_iput = 1; -+ } -+ -+ args.flags = a->flags[AuHn_CHILD]; -+ args.dentry = dentry; -+ args.inode = inode; -+ args.h_inode = a->h_child_inode; -+ args.dir = a->dir; -+ args.h_dir = a->h_dir; -+ args.h_name = a->h_child_name; -+ args.h_nlen = a->h_child_nlen; -+ err = hn_job(&args); -+ if (dentry) { -+ if (dentry->d_fsdata) -+ di_write_unlock(dentry); -+ dput(dentry); -+ } -+ if (inode && try_iput) { -+ ii_write_unlock(inode); -+ iput(inode); -+ } -+ -+ ii_write_lock_parent(a->dir); -+ args.flags = a->flags[AuHn_PARENT]; -+ args.dentry = NULL; -+ args.inode = a->dir; -+ args.h_inode = a->h_dir; -+ args.dir = NULL; -+ args.h_dir = NULL; -+ args.h_name = NULL; -+ args.h_nlen = 0; -+ err = hn_job(&args); -+ ii_write_unlock(a->dir); -+ -+ out: -+ au_nwt_done(&sbinfo->si_nowait); -+ si_write_unlock(sb); -+ -+ iput(a->h_child_inode); -+ iput(a->h_dir); -+ iput(a->dir); -+ kfree(a); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+int au_hnotify(struct inode *h_dir, struct au_hnotify *hnotify, u32 mask, -+ struct qstr *h_child_qstr, struct inode *h_child_inode) -+{ -+ int err, len; -+ unsigned int flags[AuHnLast]; -+ unsigned char isdir, isroot, wh; -+ struct inode *dir; -+ struct au_hnotify_args *args; -+ char *p, *h_child_name; -+ -+ err = 0; -+ AuDebugOn(!hnotify || !hnotify->hn_aufs_inode); -+ dir = igrab(hnotify->hn_aufs_inode); -+ if (!dir) -+ goto out; -+ -+ isroot = (dir->i_ino == AUFS_ROOT_INO); -+ wh = 0; -+ h_child_name = (void *)h_child_qstr->name; -+ len = h_child_qstr->len; -+ if (h_child_name) { -+ if (len > AUFS_WH_PFX_LEN -+ && !memcmp(h_child_name, AUFS_WH_PFX, AUFS_WH_PFX_LEN)) { -+ h_child_name += AUFS_WH_PFX_LEN; -+ len -= AUFS_WH_PFX_LEN; -+ wh = 1; -+ } -+ } -+ -+ isdir = 0; -+ if (h_child_inode) -+ isdir = !!S_ISDIR(h_child_inode->i_mode); -+ flags[AuHn_PARENT] = AuHnJob_ISDIR; -+ flags[AuHn_CHILD] = 0; -+ if (isdir) -+ flags[AuHn_CHILD] = AuHnJob_ISDIR; -+ au_fset_hnjob(flags[AuHn_PARENT], DIRENT); -+ au_fset_hnjob(flags[AuHn_CHILD], GEN); -+ switch (mask & FS_EVENTS_POSS_ON_CHILD) { -+ case FS_MOVED_FROM: -+ case FS_MOVED_TO: -+ au_fset_hnjob(flags[AuHn_CHILD], XINO0); -+ au_fset_hnjob(flags[AuHn_CHILD], MNTPNT); -+ /*FALLTHROUGH*/ -+ case FS_CREATE: -+ AuDebugOn(!h_child_name || !h_child_inode); -+ break; -+ -+ case FS_DELETE: -+ /* -+ * aufs never be able to get this child inode. -+ * revalidation should be in d_revalidate() -+ * by checking i_nlink, i_generation or d_unhashed(). -+ */ -+ AuDebugOn(!h_child_name); -+ au_fset_hnjob(flags[AuHn_CHILD], TRYXINO0); -+ au_fset_hnjob(flags[AuHn_CHILD], MNTPNT); -+ break; -+ -+ default: -+ AuDebugOn(1); -+ } -+ -+ if (wh) -+ h_child_inode = NULL; -+ -+ err = -ENOMEM; -+ /* iput() and kfree() will be called in au_hnotify() */ -+ /* -+ * inotify_mutex is already acquired and kmalloc/prune_icache may lock -+ * iprune_mutex. strange. -+ */ -+ /* lockdep_off(); */ -+ args = kmalloc(sizeof(*args) + len + 1, GFP_NOFS); -+ /* lockdep_on(); */ -+ if (unlikely(!args)) { -+ AuErr1("no memory\n"); -+ iput(dir); -+ goto out; -+ } -+ args->flags[AuHn_PARENT] = flags[AuHn_PARENT]; -+ args->flags[AuHn_CHILD] = flags[AuHn_CHILD]; -+ args->mask = mask; -+ args->dir = dir; -+ args->h_dir = igrab(h_dir); -+ if (h_child_inode) -+ h_child_inode = igrab(h_child_inode); /* can be NULL */ -+ args->h_child_inode = h_child_inode; -+ args->h_child_nlen = len; -+ if (len) { -+ p = (void *)args; -+ p += sizeof(*args); -+ memcpy(p, h_child_name, len); -+ p[len] = 0; -+ } -+ -+ /* lockdep_off(); */ -+ err = au_wkq_nowait(au_hn_bh, args, dir->i_sb); -+ /* lockdep_on(); */ -+ if (unlikely(err)) { -+ pr_err("wkq %d\n", err); -+ iput(args->h_child_inode); -+ iput(args->h_dir); -+ iput(args->dir); -+ kfree(args); -+ } -+ -+out: -+ return err; -+} -+ -+static void au_hn_destroy_cache(void) -+{ -+ kmem_cache_destroy(au_cachep[AuCache_HNOTIFY]); -+ au_cachep[AuCache_HNOTIFY] = NULL; -+} -+ -+int __init au_hnotify_init(void) -+{ -+ int err; -+ -+ err = -ENOMEM; -+ au_cachep[AuCache_HNOTIFY] = AuCache(au_hnotify); -+ if (au_cachep[AuCache_HNOTIFY]) { -+ err = au_hnotify_op.init(); -+ if (unlikely(err)) -+ au_hn_destroy_cache(); -+ } -+ AuTraceErr(err); -+ return err; -+} -+ -+void au_hnotify_fin(void) -+{ -+ au_hnotify_op.fin(); -+ /* cf. au_cache_fin() */ -+ if (au_cachep[AuCache_HNOTIFY]) -+ au_hn_destroy_cache(); -+} -diff -Nur linux-2.6.33.1-vanilla/fs/aufs/iinfo.c linux-2.6.33.1/fs/aufs/iinfo.c ---- linux-2.6.33.1-vanilla/fs/aufs/iinfo.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-2.6.33.1/fs/aufs/iinfo.c 2010-04-05 16:53:27.000000000 +0200 -@@ -0,0 +1,282 @@ -+/* -+ * Copyright (C) 2005-2010 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+/* -+ * inode private data -+ */ -+ -+#include "aufs.h" -+ -+struct inode *au_h_iptr(struct inode *inode, aufs_bindex_t bindex) -+{ -+ struct inode *h_inode; -+ -+ IiMustAnyLock(inode); -+ -+ h_inode = au_ii(inode)->ii_hinode[0 + bindex].hi_inode; -+ AuDebugOn(h_inode && atomic_read(&h_inode->i_count) <= 0); -+ return h_inode; -+} -+ -+/* todo: hard/soft set? */ -+void au_set_ibstart(struct inode *inode, aufs_bindex_t bindex) -+{ -+ struct au_iinfo *iinfo = au_ii(inode); -+ struct inode *h_inode; -+ -+ IiMustWriteLock(inode); -+ -+ iinfo->ii_bstart = bindex; -+ h_inode = iinfo->ii_hinode[bindex + 0].hi_inode; -+ if (h_inode) -+ au_cpup_igen(inode, h_inode); -+} -+ -+void au_hiput(struct au_hinode *hinode) -+{ -+ au_hn_free(hinode); -+ dput(hinode->hi_whdentry); -+ iput(hinode->hi_inode); -+} -+ -+unsigned int au_hi_flags(struct inode *inode, int isdir) -+{ -+ unsigned int flags; -+ const unsigned int mnt_flags = au_mntflags(inode->i_sb); -+ -+ flags = 0; -+ if (au_opt_test(mnt_flags, XINO)) -+ au_fset_hi(flags, XINO); -+ if (isdir && au_opt_test(mnt_flags, UDBA_HNOTIFY)) -+ au_fset_hi(flags, HNOTIFY); -+ return flags; -+} -+ -+void au_set_h_iptr(struct inode *inode, aufs_bindex_t bindex, -+ struct inode *h_inode, unsigned int flags) -+{ -+ struct au_hinode *hinode; -+ struct inode *hi; -+ struct au_iinfo *iinfo = au_ii(inode); -+ -+ IiMustWriteLock(inode); -+ -+ hinode = iinfo->ii_hinode + bindex; -+ hi = hinode->hi_inode; -+ AuDebugOn(h_inode && atomic_read(&h_inode->i_count) <= 0); -+ -+ if (hi) -+ au_hiput(hinode); -+ hinode->hi_inode = h_inode; -+ if (h_inode) { -+ int err; -+ struct super_block *sb = inode->i_sb; -+ struct au_branch *br; -+ -+ if (bindex == iinfo->ii_bstart) -+ au_cpup_igen(inode, h_inode); -+ br = au_sbr(sb, bindex); -+ hinode->hi_id = br->br_id; -+ if (au_ftest_hi(flags, XINO)) { -+ err = au_xino_write(sb, bindex, h_inode->i_ino, -+ inode->i_ino); -+ if (unlikely(err)) -+ AuIOErr1("failed au_xino_write() %d\n", err); -+ } -+ -+ if (au_ftest_hi(flags, HNOTIFY) -+ && au_br_hnotifyable(br->br_perm)) { -+ err = au_hn_alloc(hinode, inode, h_inode); -+ if (unlikely(err)) -+ AuIOErr1("au_hn_alloc() %d\n", err); -+ } -+ } -+} -+ -+void au_set_hi_wh(struct inode *inode, aufs_bindex_t bindex, -+ struct dentry *h_wh) -+{ -+ struct au_hinode *hinode; -+ -+ IiMustWriteLock(inode); -+ -+ hinode = au_ii(inode)->ii_hinode + bindex; -+ AuDebugOn(hinode->hi_whdentry); -+ hinode->hi_whdentry = h_wh; -+} -+ -+void au_update_iigen(struct inode *inode) -+{ -+ atomic_set(&au_ii(inode)->ii_generation, au_sigen(inode->i_sb)); -+ /* smp_mb(); */ /* atomic_set */ -+} -+ -+/* it may be called at remount time, too */ -+void au_update_brange(struct inode *inode, int do_put_zero) -+{ -+ struct au_iinfo *iinfo; -+ -+ iinfo = au_ii(inode); -+ if (!iinfo || iinfo->ii_bstart < 0) -+ return; -+ -+ IiMustWriteLock(inode); -+ -+ if (do_put_zero) { -+ aufs_bindex_t bindex; -+ -+ for (bindex = iinfo->ii_bstart; bindex <= iinfo->ii_bend; -+ bindex++) { -+ struct inode *h_i; -+ -+ h_i = iinfo->ii_hinode[0 + bindex].hi_inode; -+ if (h_i && !h_i->i_nlink) -+ au_set_h_iptr(inode, bindex, NULL, 0); -+ } -+ } -+ -+ iinfo->ii_bstart = -1; -+ while (++iinfo->ii_bstart <= iinfo->ii_bend) -+ if (iinfo->ii_hinode[0 + iinfo->ii_bstart].hi_inode) -+ break; -+ if (iinfo->ii_bstart > iinfo->ii_bend) { -+ iinfo->ii_bstart = -1; -+ iinfo->ii_bend = -1; -+ return; -+ } -+ -+ iinfo->ii_bend++; -+ while (0 <= --iinfo->ii_bend) -+ if (iinfo->ii_hinode[0 + iinfo->ii_bend].hi_inode) -+ break; -+ AuDebugOn(iinfo->ii_bstart > iinfo->ii_bend || iinfo->ii_bend < 0); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+int au_iinfo_init(struct inode *inode) -+{ -+ struct au_iinfo *iinfo; -+ struct super_block *sb; -+ int nbr, i; -+ -+ sb = inode->i_sb; -+ iinfo = &(container_of(inode, struct au_icntnr, vfs_inode)->iinfo); -+ nbr = au_sbend(sb) + 1; -+ if (unlikely(nbr <= 0)) -+ nbr = 1; -+ iinfo->ii_hinode = kcalloc(nbr, sizeof(*iinfo->ii_hinode), GFP_NOFS); -+ if (iinfo->ii_hinode) { -+ for (i = 0; i < nbr; i++) -+ iinfo->ii_hinode[i].hi_id = -1; -+ -+ atomic_set(&iinfo->ii_generation, au_sigen(sb)); -+ /* smp_mb(); */ /* atomic_set */ -+ au_rw_init(&iinfo->ii_rwsem); -+ iinfo->ii_bstart = -1; -+ iinfo->ii_bend = -1; -+ iinfo->ii_vdir = NULL; -+ return 0; -+ } -+ return -ENOMEM; -+} -+ -+int au_ii_realloc(struct au_iinfo *iinfo, int nbr) -+{ -+ int err, sz; -+ struct au_hinode *hip; -+ -+ AuRwMustWriteLock(&iinfo->ii_rwsem); -+ -+ err = -ENOMEM; -+ sz = sizeof(*hip) * (iinfo->ii_bend + 1); -+ if (!sz) -+ sz = sizeof(*hip); -+ hip = au_kzrealloc(iinfo->ii_hinode, sz, sizeof(*hip) * nbr, GFP_NOFS); -+ if (hip) { -+ iinfo->ii_hinode = hip; -+ err = 0; -+ } -+ -+ return err; -+} -+ -+static int au_iinfo_write0(struct super_block *sb, struct au_hinode *hinode, -+ ino_t ino) -+{ -+ int err; -+ aufs_bindex_t bindex; -+ unsigned char locked; -+ -+ err = 0; -+ locked = !!si_noflush_read_trylock(sb); -+ bindex = au_br_index(sb, hinode->hi_id); -+ if (bindex >= 0) -+ err = au_xino_write0(sb, bindex, hinode->hi_inode->i_ino, ino); -+ /* error action? */ -+ if (locked) -+ si_read_unlock(sb); -+ return err; -+} -+ -+void au_iinfo_fin(struct inode *inode) -+{ -+ ino_t ino; -+ aufs_bindex_t bend; -+ unsigned char unlinked = !inode->i_nlink; -+ struct au_iinfo *iinfo; -+ struct au_hinode *hi; -+ struct super_block *sb; -+ -+ if (unlinked) { -+ int err = au_xigen_inc(inode); -+ if (unlikely(err)) -+ AuWarn1("failed resetting i_generation, %d\n", err); -+ } -+ -+ iinfo = au_ii(inode); -+ /* bad_inode case */ -+ if (!iinfo) -+ return; -+ -+ if (iinfo->ii_vdir) -+ au_vdir_free(iinfo->ii_vdir); -+ -+ if (iinfo->ii_bstart >= 0) { -+ sb = inode->i_sb; -+ ino = 0; -+ if (unlinked) -+ ino = inode->i_ino; -+ hi = iinfo->ii_hinode + iinfo->ii_bstart; -+ bend = iinfo->ii_bend; -+ while (iinfo->ii_bstart++ <= bend) { -+ if (hi->hi_inode) { -+ if (unlinked || !hi->hi_inode->i_nlink) { -+ au_iinfo_write0(sb, hi, ino); -+ /* ignore this error */ -+ ino = 0; -+ } -+ au_hiput(hi); -+ } -+ hi++; -+ } -+ } -+ -+ kfree(iinfo->ii_hinode); -+ AuRwDestroy(&iinfo->ii_rwsem); -+} -diff -Nur linux-2.6.33.1-vanilla/fs/aufs/inode.c linux-2.6.33.1/fs/aufs/inode.c ---- linux-2.6.33.1-vanilla/fs/aufs/inode.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-2.6.33.1/fs/aufs/inode.c 2010-04-05 16:53:27.000000000 +0200 -@@ -0,0 +1,412 @@ -+/* -+ * Copyright (C) 2005-2010 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+/* -+ * inode functions -+ */ -+ -+#include "aufs.h" -+ -+struct inode *au_igrab(struct inode *inode) -+{ -+ if (inode) { -+ AuDebugOn(!atomic_read(&inode->i_count)); -+ atomic_inc_return(&inode->i_count); -+ } -+ return inode; -+} -+ -+static void au_refresh_hinode_attr(struct inode *inode, int do_version) -+{ -+ au_cpup_attr_all(inode, /*force*/0); -+ au_update_iigen(inode); -+ if (do_version) -+ inode->i_version++; -+} -+ -+int au_refresh_hinode_self(struct inode *inode, int do_attr) -+{ -+ int err; -+ aufs_bindex_t bindex, new_bindex; -+ unsigned char update; -+ struct au_hinode *p, *q, tmp; -+ struct super_block *sb; -+ struct au_iinfo *iinfo; -+ -+ IiMustWriteLock(inode); -+ -+ update = 0; -+ sb = inode->i_sb; -+ iinfo = au_ii(inode); -+ err = au_ii_realloc(iinfo, au_sbend(sb) + 1); -+ if (unlikely(err)) -+ goto out; -+ -+ p = iinfo->ii_hinode + iinfo->ii_bstart; -+ err = 0; -+ for (bindex = iinfo->ii_bstart; bindex <= iinfo->ii_bend; -+ bindex++, p++) { -+ if (!p->hi_inode) -+ continue; -+ -+ new_bindex = au_br_index(sb, p->hi_id); -+ if (new_bindex == bindex) -+ continue; -+ -+ if (new_bindex < 0) { -+ update = 1; -+ au_hiput(p); -+ p->hi_inode = NULL; -+ continue; -+ } -+ -+ if (new_bindex < iinfo->ii_bstart) -+ iinfo->ii_bstart = new_bindex; -+ if (iinfo->ii_bend < new_bindex) -+ iinfo->ii_bend = new_bindex; -+ /* swap two lower inode, and loop again */ -+ q = iinfo->ii_hinode + new_bindex; -+ tmp = *q; -+ *q = *p; -+ *p = tmp; -+ if (tmp.hi_inode) { -+ bindex--; -+ p--; -+ } -+ } -+ au_update_brange(inode, /*do_put_zero*/0); -+ if (do_attr) -+ au_refresh_hinode_attr(inode, update && S_ISDIR(inode->i_mode)); -+ -+ out: -+ return err; -+} -+ -+int au_refresh_hinode(struct inode *inode, struct dentry *dentry) -+{ -+ int err; -+ unsigned int flags; -+ aufs_bindex_t bindex, bend; -+ unsigned char isdir, update; -+ struct au_hinode *p; -+ struct au_iinfo *iinfo; -+ -+ err = au_refresh_hinode_self(inode, /*do_attr*/0); -+ if (unlikely(err)) -+ goto out; -+ -+ update = 0; -+ iinfo = au_ii(inode); -+ p = iinfo->ii_hinode + iinfo->ii_bstart; -+ isdir = S_ISDIR(inode->i_mode); -+ flags = au_hi_flags(inode, isdir); -+ bend = au_dbend(dentry); -+ for (bindex = au_dbstart(dentry); bindex <= bend; bindex++) { -+ struct inode *h_i; -+ struct dentry *h_d; -+ -+ h_d = au_h_dptr(dentry, bindex); -+ if (!h_d || !h_d->d_inode) -+ continue; -+ -+ if (iinfo->ii_bstart <= bindex && bindex <= iinfo->ii_bend) { -+ h_i = au_h_iptr(inode, bindex); -+ if (h_i) { -+ if (h_i == h_d->d_inode) -+ continue; -+ err = -EIO; -+ break; -+ } -+ } -+ if (bindex < iinfo->ii_bstart) -+ iinfo->ii_bstart = bindex; -+ if (iinfo->ii_bend < bindex) -+ iinfo->ii_bend = bindex; -+ au_set_h_iptr(inode, bindex, au_igrab(h_d->d_inode), flags); -+ update = 1; -+ } -+ au_update_brange(inode, /*do_put_zero*/0); -+ -+ if (unlikely(err)) -+ goto out; -+ -+ au_refresh_hinode_attr(inode, update && isdir); -+ -+ out: -+ AuTraceErr(err); -+ return err; -+} -+ -+static int set_inode(struct inode *inode, struct dentry *dentry) -+{ -+ int err; -+ unsigned int flags; -+ umode_t mode; -+ aufs_bindex_t bindex, bstart, btail; -+ unsigned char isdir; -+ struct dentry *h_dentry; -+ struct inode *h_inode; -+ struct au_iinfo *iinfo; -+ -+ IiMustWriteLock(inode); -+ -+ err = 0; -+ isdir = 0; -+ bstart = au_dbstart(dentry); -+ h_inode = au_h_dptr(dentry, bstart)->d_inode; -+ mode = h_inode->i_mode; -+ switch (mode & S_IFMT) { -+ case S_IFREG: -+ btail = au_dbtail(dentry); -+ inode->i_op = &aufs_iop; -+ inode->i_fop = &aufs_file_fop; -+ inode->i_mapping->a_ops = &aufs_aop; -+ break; -+ case S_IFDIR: -+ isdir = 1; -+ btail = au_dbtaildir(dentry); -+ inode->i_op = &aufs_dir_iop; -+ inode->i_fop = &aufs_dir_fop; -+ break; -+ case S_IFLNK: -+ btail = au_dbtail(dentry); -+ inode->i_op = &aufs_symlink_iop; -+ break; -+ case S_IFBLK: -+ case S_IFCHR: -+ case S_IFIFO: -+ case S_IFSOCK: -+ btail = au_dbtail(dentry); -+ inode->i_op = &aufs_iop; -+ au_init_special_fop(inode, mode, h_inode->i_rdev); -+ break; -+ default: -+ AuIOErr("Unknown file type 0%o\n", mode); -+ err = -EIO; -+ goto out; -+ } -+ -+ /* do not set hnotify for whiteouted dirs (SHWH mode) */ -+ flags = au_hi_flags(inode, isdir); -+ if (au_opt_test(au_mntflags(dentry->d_sb), SHWH) -+ && au_ftest_hi(flags, HNOTIFY) -+ && dentry->d_name.len > AUFS_WH_PFX_LEN -+ && !memcmp(dentry->d_name.name, AUFS_WH_PFX, AUFS_WH_PFX_LEN)) -+ au_fclr_hi(flags, HNOTIFY); -+ iinfo = au_ii(inode); -+ iinfo->ii_bstart = bstart; -+ iinfo->ii_bend = btail; -+ for (bindex = bstart; bindex <= btail; bindex++) { -+ h_dentry = au_h_dptr(dentry, bindex); -+ if (h_dentry) -+ au_set_h_iptr(inode, bindex, -+ au_igrab(h_dentry->d_inode), flags); -+ } -+ au_cpup_attr_all(inode, /*force*/1); -+ -+ out: -+ return err; -+} -+ -+/* successful returns with iinfo write_locked */ -+static int reval_inode(struct inode *inode, struct dentry *dentry, int *matched) -+{ -+ int err; -+ aufs_bindex_t bindex, bend; -+ struct inode *h_inode, *h_dinode; -+ -+ *matched = 0; -+ -+ /* -+ * before this function, if aufs got any iinfo lock, it must be only -+ * one, the parent dir. -+ * it can happen by UDBA and the obsoleted inode number. -+ */ -+ err = -EIO; -+ if (unlikely(inode->i_ino == parent_ino(dentry))) -+ goto out; -+ -+ err = 0; -+ ii_write_lock_new_child(inode); -+ h_dinode = au_h_dptr(dentry, au_dbstart(dentry))->d_inode; -+ bend = au_ibend(inode); -+ for (bindex = au_ibstart(inode); bindex <= bend; bindex++) { -+ h_inode = au_h_iptr(inode, bindex); -+ if (h_inode && h_inode == h_dinode) { -+ *matched = 1; -+ err = 0; -+ if (au_iigen(inode) != au_digen(dentry)) -+ err = au_refresh_hinode(inode, dentry); -+ break; -+ } -+ } -+ -+ if (unlikely(err)) -+ ii_write_unlock(inode); -+ out: -+ return err; -+} -+ -+int au_ino(struct super_block *sb, aufs_bindex_t bindex, ino_t h_ino, -+ unsigned int d_type, ino_t *ino) -+{ -+ int err; -+ struct mutex *mtx; -+ const int isdir = (d_type == DT_DIR); -+ -+ /* prevent hardlinks from race condition */ -+ mtx = NULL; -+ if (!isdir) { -+ mtx = &au_sbr(sb, bindex)->br_xino.xi_nondir_mtx; -+ mutex_lock(mtx); -+ } -+ err = au_xino_read(sb, bindex, h_ino, ino); -+ if (unlikely(err)) -+ goto out; -+ -+ if (!*ino) { -+ err = -EIO; -+ *ino = au_xino_new_ino(sb); -+ if (unlikely(!*ino)) -+ goto out; -+ err = au_xino_write(sb, bindex, h_ino, *ino); -+ if (unlikely(err)) -+ goto out; -+ } -+ -+ out: -+ if (!isdir) -+ mutex_unlock(mtx); -+ return err; -+} -+ -+/* successful returns with iinfo write_locked */ -+/* todo: return with unlocked? */ -+struct inode *au_new_inode(struct dentry *dentry, int must_new) -+{ -+ struct inode *inode; -+ struct dentry *h_dentry; -+ struct super_block *sb; -+ ino_t h_ino, ino; -+ int err, match; -+ aufs_bindex_t bstart; -+ -+ sb = dentry->d_sb; -+ bstart = au_dbstart(dentry); -+ h_dentry = au_h_dptr(dentry, bstart); -+ h_ino = h_dentry->d_inode->i_ino; -+ err = au_xino_read(sb, bstart, h_ino, &ino); -+ inode = ERR_PTR(err); -+ if (unlikely(err)) -+ goto out; -+ new_ino: -+ if (!ino) { -+ ino = au_xino_new_ino(sb); -+ if (unlikely(!ino)) { -+ inode = ERR_PTR(-EIO); -+ goto out; -+ } -+ } -+ -+ AuDbg("i%lu\n", (unsigned long)ino); -+ inode = au_iget_locked(sb, ino); -+ err = PTR_ERR(inode); -+ if (IS_ERR(inode)) -+ goto out; -+ -+ AuDbg("%lx, new %d\n", inode->i_state, !!(inode->i_state & I_NEW)); -+ if (inode->i_state & I_NEW) { -+ ii_write_lock_new_child(inode); -+ err = set_inode(inode, dentry); -+ if (!err) { -+ unlock_new_inode(inode); -+ goto out; /* success */ -+ } -+ -+ ii_write_unlock(inode); -+ iget_failed(inode); -+ goto out_err; -+ } else if (!must_new) { -+ err = reval_inode(inode, dentry, &match); -+ if (!err) -+ goto out; /* success */ -+ else if (match) -+ goto out_iput; -+ } -+ -+ if (unlikely(au_test_fs_unique_ino(h_dentry->d_inode))) -+ AuWarn1("Warning: Un-notified UDBA or repeatedly renamed dir," -+ " b%d, %s, %.*s, hi%lu, i%lu.\n", -+ bstart, au_sbtype(h_dentry->d_sb), AuDLNPair(dentry), -+ (unsigned long)h_ino, (unsigned long)ino); -+ ino = 0; -+ err = au_xino_write(sb, bstart, h_ino, /*ino*/0); -+ if (!err) { -+ iput(inode); -+ goto new_ino; -+ } -+ -+ out_iput: -+ iput(inode); -+ out_err: -+ inode = ERR_PTR(err); -+ out: -+ return inode; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+int au_test_ro(struct super_block *sb, aufs_bindex_t bindex, -+ struct inode *inode) -+{ -+ int err; -+ -+ err = au_br_rdonly(au_sbr(sb, bindex)); -+ -+ /* pseudo-link after flushed may happen out of bounds */ -+ if (!err -+ && inode -+ && au_ibstart(inode) <= bindex -+ && bindex <= au_ibend(inode)) { -+ /* -+ * permission check is unnecessary since vfsub routine -+ * will be called later -+ */ -+ struct inode *hi = au_h_iptr(inode, bindex); -+ if (hi) -+ err = IS_IMMUTABLE(hi) ? -EROFS : 0; -+ } -+ -+ return err; -+} -+ -+int au_test_h_perm(struct inode *h_inode, int mask) -+{ -+ if (!current_fsuid()) -+ return 0; -+ return inode_permission(h_inode, mask); -+} -+ -+int au_test_h_perm_sio(struct inode *h_inode, int mask) -+{ -+ if (au_test_nfs(h_inode->i_sb) -+ && (mask & MAY_WRITE) -+ && S_ISDIR(h_inode->i_mode)) -+ mask |= MAY_READ; /* force permission check */ -+ return au_test_h_perm(h_inode, mask); -+} -diff -Nur linux-2.6.33.1-vanilla/fs/aufs/inode.h linux-2.6.33.1/fs/aufs/inode.h ---- linux-2.6.33.1-vanilla/fs/aufs/inode.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-2.6.33.1/fs/aufs/inode.h 2010-04-05 16:53:27.000000000 +0200 -@@ -0,0 +1,492 @@ -+/* -+ * Copyright (C) 2005-2010 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+/* -+ * inode operations -+ */ -+ -+#ifndef __AUFS_INODE_H__ -+#define __AUFS_INODE_H__ -+ -+#ifdef __KERNEL__ -+ -+#include -+#include -+#include -+#include "rwsem.h" -+ -+struct vfsmount; -+ -+struct au_hnotify { -+#ifdef CONFIG_AUFS_HNOTIFY -+#ifdef CONFIG_AUFS_HFSNOTIFY -+ struct fsnotify_mark_entry hn_entry; -+#else -+ struct inotify_watch hn_watch; -+#endif -+ struct inode *hn_aufs_inode; /* no get/put */ -+#endif -+}; -+ -+struct au_hinode { -+ struct inode *hi_inode; -+ aufs_bindex_t hi_id; -+#ifdef CONFIG_AUFS_HNOTIFY -+ struct au_hnotify *hi_notify; -+#endif -+ -+ /* reference to the copied-up whiteout with get/put */ -+ struct dentry *hi_whdentry; -+}; -+ -+struct au_vdir; -+struct au_iinfo { -+ atomic_t ii_generation; -+ struct super_block *ii_hsb1; /* no get/put */ -+ -+ struct au_rwsem ii_rwsem; -+ aufs_bindex_t ii_bstart, ii_bend; -+ __u32 ii_higen; -+ struct au_hinode *ii_hinode; -+ struct au_vdir *ii_vdir; -+}; -+ -+struct au_icntnr { -+ struct au_iinfo iinfo; -+ struct inode vfs_inode; -+}; -+ -+/* au_pin flags */ -+#define AuPin_DI_LOCKED 1 -+#define AuPin_MNT_WRITE (1 << 1) -+#define au_ftest_pin(flags, name) ((flags) & AuPin_##name) -+#define au_fset_pin(flags, name) { (flags) |= AuPin_##name; } -+#define au_fclr_pin(flags, name) { (flags) &= ~AuPin_##name; } -+ -+struct au_pin { -+ /* input */ -+ struct dentry *dentry; -+ unsigned int udba; -+ unsigned char lsc_di, lsc_hi, flags; -+ aufs_bindex_t bindex; -+ -+ /* output */ -+ struct dentry *parent; -+ struct au_hinode *hdir; -+ struct vfsmount *h_mnt; -+}; -+ -+/* ---------------------------------------------------------------------- */ -+ -+static inline struct au_iinfo *au_ii(struct inode *inode) -+{ -+ struct au_iinfo *iinfo; -+ -+ iinfo = &(container_of(inode, struct au_icntnr, vfs_inode)->iinfo); -+ if (iinfo->ii_hinode) -+ return iinfo; -+ return NULL; /* debugging bad_inode case */ -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* inode.c */ -+struct inode *au_igrab(struct inode *inode); -+int au_refresh_hinode_self(struct inode *inode, int do_attr); -+int au_refresh_hinode(struct inode *inode, struct dentry *dentry); -+int au_ino(struct super_block *sb, aufs_bindex_t bindex, ino_t h_ino, -+ unsigned int d_type, ino_t *ino); -+struct inode *au_new_inode(struct dentry *dentry, int must_new); -+int au_test_ro(struct super_block *sb, aufs_bindex_t bindex, -+ struct inode *inode); -+int au_test_h_perm(struct inode *h_inode, int mask); -+int au_test_h_perm_sio(struct inode *h_inode, int mask); -+ -+static inline int au_wh_ino(struct super_block *sb, aufs_bindex_t bindex, -+ ino_t h_ino, unsigned int d_type, ino_t *ino) -+{ -+#ifdef CONFIG_AUFS_SHWH -+ return au_ino(sb, bindex, h_ino, d_type, ino); -+#else -+ return 0; -+#endif -+} -+ -+/* i_op.c */ -+extern struct inode_operations aufs_iop, aufs_symlink_iop, aufs_dir_iop; -+ -+/* au_wr_dir flags */ -+#define AuWrDir_ADD_ENTRY 1 -+#define AuWrDir_ISDIR (1 << 1) -+#define au_ftest_wrdir(flags, name) ((flags) & AuWrDir_##name) -+#define au_fset_wrdir(flags, name) { (flags) |= AuWrDir_##name; } -+#define au_fclr_wrdir(flags, name) { (flags) &= ~AuWrDir_##name; } -+ -+struct au_wr_dir_args { -+ aufs_bindex_t force_btgt; -+ unsigned char flags; -+}; -+int au_wr_dir(struct dentry *dentry, struct dentry *src_dentry, -+ struct au_wr_dir_args *args); -+ -+struct dentry *au_pinned_h_parent(struct au_pin *pin); -+void au_pin_init(struct au_pin *pin, struct dentry *dentry, -+ aufs_bindex_t bindex, int lsc_di, int lsc_hi, -+ unsigned int udba, unsigned char flags); -+int au_pin(struct au_pin *pin, struct dentry *dentry, aufs_bindex_t bindex, -+ unsigned int udba, unsigned char flags) __must_check; -+int au_do_pin(struct au_pin *pin) __must_check; -+void au_unpin(struct au_pin *pin); -+ -+/* i_op_add.c */ -+int au_may_add(struct dentry *dentry, aufs_bindex_t bindex, -+ struct dentry *h_parent, int isdir); -+int aufs_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t dev); -+int aufs_symlink(struct inode *dir, struct dentry *dentry, const char *symname); -+int aufs_create(struct inode *dir, struct dentry *dentry, int mode, -+ struct nameidata *nd); -+int aufs_link(struct dentry *src_dentry, struct inode *dir, -+ struct dentry *dentry); -+int aufs_mkdir(struct inode *dir, struct dentry *dentry, int mode); -+ -+/* i_op_del.c */ -+int au_wr_dir_need_wh(struct dentry *dentry, int isdir, aufs_bindex_t *bcpup); -+int au_may_del(struct dentry *dentry, aufs_bindex_t bindex, -+ struct dentry *h_parent, int isdir); -+int aufs_unlink(struct inode *dir, struct dentry *dentry); -+int aufs_rmdir(struct inode *dir, struct dentry *dentry); -+ -+/* i_op_ren.c */ -+int au_wbr(struct dentry *dentry, aufs_bindex_t btgt); -+int aufs_rename(struct inode *src_dir, struct dentry *src_dentry, -+ struct inode *dir, struct dentry *dentry); -+ -+/* iinfo.c */ -+struct inode *au_h_iptr(struct inode *inode, aufs_bindex_t bindex); -+void au_hiput(struct au_hinode *hinode); -+void au_set_ibstart(struct inode *inode, aufs_bindex_t bindex); -+void au_set_hi_wh(struct inode *inode, aufs_bindex_t bindex, -+ struct dentry *h_wh); -+unsigned int au_hi_flags(struct inode *inode, int isdir); -+ -+/* hinode flags */ -+#define AuHi_XINO 1 -+#define AuHi_HNOTIFY (1 << 1) -+#define au_ftest_hi(flags, name) ((flags) & AuHi_##name) -+#define au_fset_hi(flags, name) { (flags) |= AuHi_##name; } -+#define au_fclr_hi(flags, name) { (flags) &= ~AuHi_##name; } -+ -+#ifndef CONFIG_AUFS_HNOTIFY -+#undef AuHi_HNOTIFY -+#define AuHi_HNOTIFY 0 -+#endif -+ -+void au_set_h_iptr(struct inode *inode, aufs_bindex_t bindex, -+ struct inode *h_inode, unsigned int flags); -+ -+void au_update_iigen(struct inode *inode); -+void au_update_brange(struct inode *inode, int do_put_zero); -+ -+int au_iinfo_init(struct inode *inode); -+void au_iinfo_fin(struct inode *inode); -+int au_ii_realloc(struct au_iinfo *iinfo, int nbr); -+ -+/* plink.c */ -+void au_plink_maint_block(struct super_block *sb); -+void au_plink_maint_leave(struct file *file); -+#ifdef CONFIG_AUFS_DEBUG -+void au_plink_list(struct super_block *sb); -+#else -+AuStubVoid(au_plink_list, struct super_block *sb) -+#endif -+int au_plink_test(struct inode *inode); -+struct dentry *au_plink_lkup(struct inode *inode, aufs_bindex_t bindex); -+void au_plink_append(struct inode *inode, aufs_bindex_t bindex, -+ struct dentry *h_dentry); -+void au_plink_put(struct super_block *sb); -+void au_plink_half_refresh(struct super_block *sb, aufs_bindex_t br_id); -+long au_plink_ioctl(struct file *file, unsigned int cmd); -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* lock subclass for iinfo */ -+enum { -+ AuLsc_II_CHILD, /* child first */ -+ AuLsc_II_CHILD2, /* rename(2), link(2), and cpup at hnotify */ -+ AuLsc_II_CHILD3, /* copyup dirs */ -+ AuLsc_II_PARENT, /* see AuLsc_I_PARENT in vfsub.h */ -+ AuLsc_II_PARENT2, -+ AuLsc_II_PARENT3, /* copyup dirs */ -+ AuLsc_II_NEW_CHILD -+}; -+ -+/* -+ * ii_read_lock_child, ii_write_lock_child, -+ * ii_read_lock_child2, ii_write_lock_child2, -+ * ii_read_lock_child3, ii_write_lock_child3, -+ * ii_read_lock_parent, ii_write_lock_parent, -+ * ii_read_lock_parent2, ii_write_lock_parent2, -+ * ii_read_lock_parent3, ii_write_lock_parent3, -+ * ii_read_lock_new_child, ii_write_lock_new_child, -+ */ -+#define AuReadLockFunc(name, lsc) \ -+static inline void ii_read_lock_##name(struct inode *i) \ -+{ \ -+ au_rw_read_lock_nested(&au_ii(i)->ii_rwsem, AuLsc_II_##lsc); \ -+} -+ -+#define AuWriteLockFunc(name, lsc) \ -+static inline void ii_write_lock_##name(struct inode *i) \ -+{ \ -+ au_rw_write_lock_nested(&au_ii(i)->ii_rwsem, AuLsc_II_##lsc); \ -+} -+ -+#define AuRWLockFuncs(name, lsc) \ -+ AuReadLockFunc(name, lsc) \ -+ AuWriteLockFunc(name, lsc) -+ -+AuRWLockFuncs(child, CHILD); -+AuRWLockFuncs(child2, CHILD2); -+AuRWLockFuncs(child3, CHILD3); -+AuRWLockFuncs(parent, PARENT); -+AuRWLockFuncs(parent2, PARENT2); -+AuRWLockFuncs(parent3, PARENT3); -+AuRWLockFuncs(new_child, NEW_CHILD); -+ -+#undef AuReadLockFunc -+#undef AuWriteLockFunc -+#undef AuRWLockFuncs -+ -+/* -+ * ii_read_unlock, ii_write_unlock, ii_downgrade_lock -+ */ -+AuSimpleUnlockRwsemFuncs(ii, struct inode *i, &au_ii(i)->ii_rwsem); -+ -+#define IiMustNoWaiters(i) AuRwMustNoWaiters(&au_ii(i)->ii_rwsem) -+#define IiMustAnyLock(i) AuRwMustAnyLock(&au_ii(i)->ii_rwsem) -+#define IiMustWriteLock(i) AuRwMustWriteLock(&au_ii(i)->ii_rwsem) -+ -+/* ---------------------------------------------------------------------- */ -+ -+static inline unsigned int au_iigen(struct inode *inode) -+{ -+ return atomic_read(&au_ii(inode)->ii_generation); -+} -+ -+/* tiny test for inode number */ -+/* tmpfs generation is too rough */ -+static inline int au_test_higen(struct inode *inode, struct inode *h_inode) -+{ -+ struct au_iinfo *iinfo; -+ -+ iinfo = au_ii(inode); -+ AuRwMustAnyLock(&iinfo->ii_rwsem); -+ return !(iinfo->ii_hsb1 == h_inode->i_sb -+ && iinfo->ii_higen == h_inode->i_generation); -+} -+ -+static inline void au_iigen_dec(struct inode *inode) -+{ -+#ifdef CONFIG_AUFS_HNOTIFY -+ atomic_dec_return(&au_ii(inode)->ii_generation); -+#endif -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static inline aufs_bindex_t au_ii_br_id(struct inode *inode, -+ aufs_bindex_t bindex) -+{ -+ IiMustAnyLock(inode); -+ return au_ii(inode)->ii_hinode[0 + bindex].hi_id; -+} -+ -+static inline aufs_bindex_t au_ibstart(struct inode *inode) -+{ -+ IiMustAnyLock(inode); -+ return au_ii(inode)->ii_bstart; -+} -+ -+static inline aufs_bindex_t au_ibend(struct inode *inode) -+{ -+ IiMustAnyLock(inode); -+ return au_ii(inode)->ii_bend; -+} -+ -+static inline struct au_vdir *au_ivdir(struct inode *inode) -+{ -+ IiMustAnyLock(inode); -+ return au_ii(inode)->ii_vdir; -+} -+ -+static inline struct dentry *au_hi_wh(struct inode *inode, aufs_bindex_t bindex) -+{ -+ IiMustAnyLock(inode); -+ return au_ii(inode)->ii_hinode[0 + bindex].hi_whdentry; -+} -+ -+static inline void au_set_ibend(struct inode *inode, aufs_bindex_t bindex) -+{ -+ IiMustWriteLock(inode); -+ au_ii(inode)->ii_bend = bindex; -+} -+ -+static inline void au_set_ivdir(struct inode *inode, struct au_vdir *vdir) -+{ -+ IiMustWriteLock(inode); -+ au_ii(inode)->ii_vdir = vdir; -+} -+ -+static inline struct au_hinode *au_hi(struct inode *inode, aufs_bindex_t bindex) -+{ -+ IiMustAnyLock(inode); -+ return au_ii(inode)->ii_hinode + bindex; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static inline struct dentry *au_pinned_parent(struct au_pin *pin) -+{ -+ if (pin) -+ return pin->parent; -+ return NULL; -+} -+ -+static inline struct inode *au_pinned_h_dir(struct au_pin *pin) -+{ -+ if (pin && pin->hdir) -+ return pin->hdir->hi_inode; -+ return NULL; -+} -+ -+static inline struct au_hinode *au_pinned_hdir(struct au_pin *pin) -+{ -+ if (pin) -+ return pin->hdir; -+ return NULL; -+} -+ -+static inline void au_pin_set_dentry(struct au_pin *pin, struct dentry *dentry) -+{ -+ if (pin) -+ pin->dentry = dentry; -+} -+ -+static inline void au_pin_set_parent_lflag(struct au_pin *pin, -+ unsigned char lflag) -+{ -+ if (pin) { -+ /* dirty macros require brackets */ -+ if (lflag) { -+ au_fset_pin(pin->flags, DI_LOCKED); -+ } else { -+ au_fclr_pin(pin->flags, DI_LOCKED); -+ } -+ } -+} -+ -+static inline void au_pin_set_parent(struct au_pin *pin, struct dentry *parent) -+{ -+ if (pin) { -+ dput(pin->parent); -+ pin->parent = dget(parent); -+ } -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+#ifdef CONFIG_AUFS_HNOTIFY -+struct au_hnotify_op { -+ void (*ctl)(struct au_hinode *hinode, int do_set); -+ int (*alloc)(struct au_hnotify *hn, struct inode *h_inode); -+ void (*free)(struct au_hnotify *hn); -+ -+ void (*fin)(void); -+ int (*init)(void); -+}; -+ -+/* hnotify.c */ -+int au_hn_alloc(struct au_hinode *hinode, struct inode *inode, -+ struct inode *h_inode); -+void au_hn_free(struct au_hinode *hinode); -+void au_hn_ctl(struct au_hinode *hinode, int do_set); -+void au_hn_reset(struct inode *inode, unsigned int flags); -+int au_hnotify(struct inode *h_dir, struct au_hnotify *hnotify, u32 mask, -+ struct qstr *h_child_qstr, struct inode *h_child_inode); -+int __init au_hnotify_init(void); -+void au_hnotify_fin(void); -+ -+/* hinotify.c */ -+extern const struct au_hnotify_op au_hnotify_op; -+ -+static inline -+void au_hn_init(struct au_hinode *hinode) -+{ -+ hinode->hi_notify = NULL; -+} -+ -+#else -+static inline -+int au_hn_alloc(struct au_hinode *hinode __maybe_unused, -+ struct inode *inode __maybe_unused, -+ struct inode *h_inode __maybe_unused) -+{ -+ return -EOPNOTSUPP; -+} -+ -+AuStubVoid(au_hn_free, struct au_hinode *hinode __maybe_unused) -+AuStubVoid(au_hn_ctl, struct au_hinode *hinode __maybe_unused, -+ int do_set __maybe_unused) -+AuStubVoid(au_hn_reset, struct inode *inode __maybe_unused, -+ unsigned int flags __maybe_unused) -+AuStubInt0(__init au_hnotify_init, void) -+AuStubVoid(au_hnotify_fin, void) -+AuStubVoid(au_hn_init, struct au_hinode *hinode __maybe_unused) -+#endif /* CONFIG_AUFS_HNOTIFY */ -+ -+static inline void au_hn_suspend(struct au_hinode *hdir) -+{ -+ au_hn_ctl(hdir, /*do_set*/0); -+} -+ -+static inline void au_hn_resume(struct au_hinode *hdir) -+{ -+ au_hn_ctl(hdir, /*do_set*/1); -+} -+ -+static inline void au_hn_imtx_lock(struct au_hinode *hdir) -+{ -+ mutex_lock(&hdir->hi_inode->i_mutex); -+ au_hn_suspend(hdir); -+} -+ -+static inline void au_hn_imtx_lock_nested(struct au_hinode *hdir, -+ unsigned int sc __maybe_unused) -+{ -+ mutex_lock_nested(&hdir->hi_inode->i_mutex, sc); -+ au_hn_suspend(hdir); -+} -+ -+static inline void au_hn_imtx_unlock(struct au_hinode *hdir) -+{ -+ au_hn_resume(hdir); -+ mutex_unlock(&hdir->hi_inode->i_mutex); -+} -+ -+#endif /* __KERNEL__ */ -+#endif /* __AUFS_INODE_H__ */ -diff -Nur linux-2.6.33.1-vanilla/fs/aufs/ioctl.c linux-2.6.33.1/fs/aufs/ioctl.c ---- linux-2.6.33.1-vanilla/fs/aufs/ioctl.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-2.6.33.1/fs/aufs/ioctl.c 2010-04-05 16:53:27.000000000 +0200 -@@ -0,0 +1,129 @@ -+/* -+ * Copyright (C) 2005-2010 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+/* -+ * ioctl -+ * plink-management and readdir in userspace. -+ * assist the pathconf(3) wrapper library. -+ */ -+ -+#include -+#include "aufs.h" -+ -+static int au_wbr_fd(struct path *path) -+{ -+ int err, fd, flags; -+ aufs_bindex_t wbi, bindex, bend; -+ struct file *h_file; -+ struct super_block *sb; -+ struct dentry *root; -+ struct au_branch *wbr; -+ -+ err = get_unused_fd(); -+ if (unlikely(err < 0)) -+ goto out; -+ fd = err; -+ -+ flags = O_RDONLY | O_DIRECTORY; -+ if (force_o_largefile()) -+ flags |= O_LARGEFILE; -+ -+ wbi = 0; -+ sb = path->dentry->d_sb; -+ root = sb->s_root; -+ aufs_read_lock(root, AuLock_IR); -+ wbr = au_sbr(sb, wbi); -+ if (!(path->mnt->mnt_flags & MNT_READONLY) -+ && !au_br_writable(wbr->br_perm)) { -+ bend = au_sbend(sb); -+ for (bindex = 1; bindex <= bend; bindex++) { -+ wbr = au_sbr(sb, bindex); -+ if (au_br_writable(wbr->br_perm)) { -+ wbi = bindex; -+ break; -+ } -+ } -+ wbr = au_sbr(sb, wbi); -+ } -+ AuDbg("wbi %d\n", wbi); -+ h_file = au_h_open(root, wbi, flags, NULL); -+ aufs_read_unlock(root, AuLock_IR); -+ err = PTR_ERR(h_file); -+ if (IS_ERR(h_file)) -+ goto out_fd; -+ -+ atomic_dec(&wbr->br_count); /* cf. au_h_open() */ -+ fd_install(fd, h_file); -+ err = fd; -+ goto out; /* success */ -+ -+ out_fd: -+ put_unused_fd(fd); -+ out: -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+long aufs_ioctl_dir(struct file *file, unsigned int cmd, unsigned long arg) -+{ -+ long err; -+ -+ switch (cmd) { -+ case AUFS_CTL_PLINK_MAINT: -+ case AUFS_CTL_PLINK_CLEAN: -+ err = au_plink_ioctl(file, cmd); -+ break; -+ -+ case AUFS_CTL_RDU: -+ case AUFS_CTL_RDU_INO: -+ err = au_rdu_ioctl(file, cmd, arg); -+ break; -+ -+ case AUFS_CTL_WBR_FD: -+ err = au_wbr_fd(&file->f_path); -+ break; -+ -+ default: -+ /* do not call the lower */ -+ AuDbg("0x%x\n", cmd); -+ err = -ENOTTY; -+ } -+ -+ AuTraceErr(err); -+ return err; -+} -+ -+long aufs_ioctl_nondir(struct file *file, unsigned int cmd, unsigned long arg) -+{ -+ long err; -+ -+ switch (cmd) { -+ case AUFS_CTL_WBR_FD: -+ err = au_wbr_fd(&file->f_path); -+ break; -+ -+ default: -+ /* do not call the lower */ -+ AuDbg("0x%x\n", cmd); -+ err = -ENOTTY; -+ } -+ -+ AuTraceErr(err); -+ return err; -+} -diff -Nur linux-2.6.33.1-vanilla/fs/aufs/i_op_add.c linux-2.6.33.1/fs/aufs/i_op_add.c ---- linux-2.6.33.1-vanilla/fs/aufs/i_op_add.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-2.6.33.1/fs/aufs/i_op_add.c 2010-04-05 16:53:27.000000000 +0200 -@@ -0,0 +1,672 @@ -+/* -+ * Copyright (C) 2005-2010 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+/* -+ * inode operations (add entry) -+ */ -+ -+#include "aufs.h" -+ -+/* -+ * final procedure of adding a new entry, except link(2). -+ * remove whiteout, instantiate, copyup the parent dir's times and size -+ * and update version. -+ * if it failed, re-create the removed whiteout. -+ */ -+static int epilog(struct inode *dir, aufs_bindex_t bindex, -+ struct dentry *wh_dentry, struct dentry *dentry) -+{ -+ int err, rerr; -+ aufs_bindex_t bwh; -+ struct path h_path; -+ struct inode *inode, *h_dir; -+ struct dentry *wh; -+ -+ bwh = -1; -+ if (wh_dentry) { -+ h_dir = wh_dentry->d_parent->d_inode; /* dir inode is locked */ -+ IMustLock(h_dir); -+ AuDebugOn(au_h_iptr(dir, bindex) != h_dir); -+ bwh = au_dbwh(dentry); -+ h_path.dentry = wh_dentry; -+ h_path.mnt = au_sbr_mnt(dir->i_sb, bindex); -+ err = au_wh_unlink_dentry(au_h_iptr(dir, bindex), &h_path, -+ dentry); -+ if (unlikely(err)) -+ goto out; -+ } -+ -+ inode = au_new_inode(dentry, /*must_new*/1); -+ if (!IS_ERR(inode)) { -+ d_instantiate(dentry, inode); -+ dir = dentry->d_parent->d_inode; /* dir inode is locked */ -+ IMustLock(dir); -+ if (au_ibstart(dir) == au_dbstart(dentry)) -+ au_cpup_attr_timesizes(dir); -+ dir->i_version++; -+ return 0; /* success */ -+ } -+ -+ err = PTR_ERR(inode); -+ if (!wh_dentry) -+ goto out; -+ -+ /* revert */ -+ /* dir inode is locked */ -+ wh = au_wh_create(dentry, bwh, wh_dentry->d_parent); -+ rerr = PTR_ERR(wh); -+ if (IS_ERR(wh)) { -+ AuIOErr("%.*s reverting whiteout failed(%d, %d)\n", -+ AuDLNPair(dentry), err, rerr); -+ err = -EIO; -+ } else -+ dput(wh); -+ -+ out: -+ return err; -+} -+ -+/* -+ * simple tests for the adding inode operations. -+ * following the checks in vfs, plus the parent-child relationship. -+ */ -+int au_may_add(struct dentry *dentry, aufs_bindex_t bindex, -+ struct dentry *h_parent, int isdir) -+{ -+ int err; -+ umode_t h_mode; -+ struct dentry *h_dentry; -+ struct inode *h_inode; -+ -+ err = -ENAMETOOLONG; -+ if (unlikely(dentry->d_name.len > AUFS_MAX_NAMELEN)) -+ goto out; -+ -+ h_dentry = au_h_dptr(dentry, bindex); -+ h_inode = h_dentry->d_inode; -+ if (!dentry->d_inode) { -+ err = -EEXIST; -+ if (unlikely(h_inode)) -+ goto out; -+ } else { -+ /* rename(2) case */ -+ err = -EIO; -+ if (unlikely(!h_inode || !h_inode->i_nlink)) -+ goto out; -+ -+ h_mode = h_inode->i_mode; -+ if (!isdir) { -+ err = -EISDIR; -+ if (unlikely(S_ISDIR(h_mode))) -+ goto out; -+ } else if (unlikely(!S_ISDIR(h_mode))) { -+ err = -ENOTDIR; -+ goto out; -+ } -+ } -+ -+ err = 0; -+ /* expected parent dir is locked */ -+ if (unlikely(h_parent != h_dentry->d_parent)) -+ err = -EIO; -+ -+ out: -+ AuTraceErr(err); -+ return err; -+} -+ -+/* -+ * initial procedure of adding a new entry. -+ * prepare writable branch and the parent dir, lock it, -+ * and lookup whiteout for the new entry. -+ */ -+static struct dentry* -+lock_hdir_lkup_wh(struct dentry *dentry, struct au_dtime *dt, -+ struct dentry *src_dentry, struct au_pin *pin, -+ struct au_wr_dir_args *wr_dir_args) -+{ -+ struct dentry *wh_dentry, *h_parent; -+ struct super_block *sb; -+ struct au_branch *br; -+ int err; -+ unsigned int udba; -+ aufs_bindex_t bcpup; -+ -+ AuDbg("%.*s\n", AuDLNPair(dentry)); -+ -+ err = au_wr_dir(dentry, src_dentry, wr_dir_args); -+ bcpup = err; -+ wh_dentry = ERR_PTR(err); -+ if (unlikely(err < 0)) -+ goto out; -+ -+ sb = dentry->d_sb; -+ udba = au_opt_udba(sb); -+ err = au_pin(pin, dentry, bcpup, udba, -+ AuPin_DI_LOCKED | AuPin_MNT_WRITE); -+ wh_dentry = ERR_PTR(err); -+ if (unlikely(err)) -+ goto out; -+ -+ h_parent = au_pinned_h_parent(pin); -+ if (udba != AuOpt_UDBA_NONE -+ && au_dbstart(dentry) == bcpup) -+ err = au_may_add(dentry, bcpup, h_parent, -+ au_ftest_wrdir(wr_dir_args->flags, ISDIR)); -+ else if (unlikely(dentry->d_name.len > AUFS_MAX_NAMELEN)) -+ err = -ENAMETOOLONG; -+ wh_dentry = ERR_PTR(err); -+ if (unlikely(err)) -+ goto out_unpin; -+ -+ br = au_sbr(sb, bcpup); -+ if (dt) { -+ struct path tmp = { -+ .dentry = h_parent, -+ .mnt = br->br_mnt -+ }; -+ au_dtime_store(dt, au_pinned_parent(pin), &tmp); -+ } -+ -+ wh_dentry = NULL; -+ if (bcpup != au_dbwh(dentry)) -+ goto out; /* success */ -+ -+ wh_dentry = au_wh_lkup(h_parent, &dentry->d_name, br); -+ -+ out_unpin: -+ if (IS_ERR(wh_dentry)) -+ au_unpin(pin); -+ out: -+ return wh_dentry; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+enum { Mknod, Symlink, Creat }; -+struct simple_arg { -+ int type; -+ union { -+ struct { -+ int mode; -+ struct nameidata *nd; -+ } c; -+ struct { -+ const char *symname; -+ } s; -+ struct { -+ int mode; -+ dev_t dev; -+ } m; -+ } u; -+}; -+ -+static int add_simple(struct inode *dir, struct dentry *dentry, -+ struct simple_arg *arg) -+{ -+ int err; -+ aufs_bindex_t bstart; -+ unsigned char created; -+ struct au_dtime dt; -+ struct au_pin pin; -+ struct path h_path; -+ struct dentry *wh_dentry, *parent; -+ struct inode *h_dir; -+ struct au_wr_dir_args wr_dir_args = { -+ .force_btgt = -1, -+ .flags = AuWrDir_ADD_ENTRY -+ }; -+ -+ AuDbg("%.*s\n", AuDLNPair(dentry)); -+ IMustLock(dir); -+ -+ parent = dentry->d_parent; /* dir inode is locked */ -+ aufs_read_lock(dentry, AuLock_DW); -+ di_write_lock_parent(parent); -+ wh_dentry = lock_hdir_lkup_wh(dentry, &dt, /*src_dentry*/NULL, &pin, -+ &wr_dir_args); -+ err = PTR_ERR(wh_dentry); -+ if (IS_ERR(wh_dentry)) -+ goto out; -+ -+ bstart = au_dbstart(dentry); -+ h_path.dentry = au_h_dptr(dentry, bstart); -+ h_path.mnt = au_sbr_mnt(dentry->d_sb, bstart); -+ h_dir = au_pinned_h_dir(&pin); -+ switch (arg->type) { -+ case Creat: -+ err = vfsub_create(h_dir, &h_path, arg->u.c.mode); -+ break; -+ case Symlink: -+ err = vfsub_symlink(h_dir, &h_path, arg->u.s.symname); -+ break; -+ case Mknod: -+ err = vfsub_mknod(h_dir, &h_path, arg->u.m.mode, arg->u.m.dev); -+ break; -+ default: -+ BUG(); -+ } -+ created = !err; -+ if (!err) -+ err = epilog(dir, bstart, wh_dentry, dentry); -+ -+ /* revert */ -+ if (unlikely(created && err && h_path.dentry->d_inode)) { -+ int rerr; -+ rerr = vfsub_unlink(h_dir, &h_path, /*force*/0); -+ if (rerr) { -+ AuIOErr("%.*s revert failure(%d, %d)\n", -+ AuDLNPair(dentry), err, rerr); -+ err = -EIO; -+ } -+ au_dtime_revert(&dt); -+ d_drop(dentry); -+ } -+ -+ au_unpin(&pin); -+ dput(wh_dentry); -+ -+ out: -+ if (unlikely(err)) { -+ au_update_dbstart(dentry); -+ d_drop(dentry); -+ } -+ di_write_unlock(parent); -+ aufs_read_unlock(dentry, AuLock_DW); -+ return err; -+} -+ -+int aufs_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t dev) -+{ -+ struct simple_arg arg = { -+ .type = Mknod, -+ .u.m = { -+ .mode = mode, -+ .dev = dev -+ } -+ }; -+ return add_simple(dir, dentry, &arg); -+} -+ -+int aufs_symlink(struct inode *dir, struct dentry *dentry, const char *symname) -+{ -+ struct simple_arg arg = { -+ .type = Symlink, -+ .u.s.symname = symname -+ }; -+ return add_simple(dir, dentry, &arg); -+} -+ -+int aufs_create(struct inode *dir, struct dentry *dentry, int mode, -+ struct nameidata *nd) -+{ -+ struct simple_arg arg = { -+ .type = Creat, -+ .u.c = { -+ .mode = mode, -+ .nd = nd -+ } -+ }; -+ return add_simple(dir, dentry, &arg); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+struct au_link_args { -+ aufs_bindex_t bdst, bsrc; -+ struct au_pin pin; -+ struct path h_path; -+ struct dentry *src_parent, *parent; -+}; -+ -+static int au_cpup_before_link(struct dentry *src_dentry, -+ struct au_link_args *a) -+{ -+ int err; -+ struct dentry *h_src_dentry; -+ struct mutex *h_mtx; -+ struct file *h_file; -+ -+ di_read_lock_parent(a->src_parent, AuLock_IR); -+ err = au_test_and_cpup_dirs(src_dentry, a->bdst); -+ if (unlikely(err)) -+ goto out; -+ -+ h_src_dentry = au_h_dptr(src_dentry, a->bsrc); -+ h_mtx = &h_src_dentry->d_inode->i_mutex; -+ err = au_pin(&a->pin, src_dentry, a->bdst, -+ au_opt_udba(src_dentry->d_sb), -+ AuPin_DI_LOCKED | AuPin_MNT_WRITE); -+ if (unlikely(err)) -+ goto out; -+ mutex_lock_nested(h_mtx, AuLsc_I_CHILD); -+ h_file = au_h_open_pre(src_dentry, a->bsrc); -+ if (IS_ERR(h_file)) { -+ err = PTR_ERR(h_file); -+ h_file = NULL; -+ } else -+ err = au_sio_cpup_simple(src_dentry, a->bdst, a->bsrc, -+ AuCpup_DTIME /* | AuCpup_KEEPLINO */); -+ mutex_unlock(h_mtx); -+ au_h_open_post(src_dentry, a->bsrc, h_file); -+ au_unpin(&a->pin); -+ -+ out: -+ di_read_unlock(a->src_parent, AuLock_IR); -+ return err; -+} -+ -+static int au_cpup_or_link(struct dentry *src_dentry, struct au_link_args *a) -+{ -+ int err; -+ unsigned char plink; -+ struct inode *h_inode, *inode; -+ struct dentry *h_src_dentry; -+ struct super_block *sb; -+ struct file *h_file; -+ -+ plink = 0; -+ h_inode = NULL; -+ sb = src_dentry->d_sb; -+ inode = src_dentry->d_inode; -+ if (au_ibstart(inode) <= a->bdst) -+ h_inode = au_h_iptr(inode, a->bdst); -+ if (!h_inode || !h_inode->i_nlink) { -+ /* copyup src_dentry as the name of dentry. */ -+ au_set_dbstart(src_dentry, a->bdst); -+ au_set_h_dptr(src_dentry, a->bdst, dget(a->h_path.dentry)); -+ h_inode = au_h_dptr(src_dentry, a->bsrc)->d_inode; -+ mutex_lock_nested(&h_inode->i_mutex, AuLsc_I_CHILD); -+ h_file = au_h_open_pre(src_dentry, a->bsrc); -+ if (IS_ERR(h_file)) { -+ err = PTR_ERR(h_file); -+ h_file = NULL; -+ } else -+ err = au_sio_cpup_single(src_dentry, a->bdst, a->bsrc, -+ -1, AuCpup_KEEPLINO, -+ a->parent); -+ mutex_unlock(&h_inode->i_mutex); -+ au_h_open_post(src_dentry, a->bsrc, h_file); -+ au_set_h_dptr(src_dentry, a->bdst, NULL); -+ au_set_dbstart(src_dentry, a->bsrc); -+ } else { -+ /* the inode of src_dentry already exists on a.bdst branch */ -+ h_src_dentry = d_find_alias(h_inode); -+ if (!h_src_dentry && au_plink_test(inode)) { -+ plink = 1; -+ h_src_dentry = au_plink_lkup(inode, a->bdst); -+ err = PTR_ERR(h_src_dentry); -+ if (IS_ERR(h_src_dentry)) -+ goto out; -+ -+ if (unlikely(!h_src_dentry->d_inode)) { -+ dput(h_src_dentry); -+ h_src_dentry = NULL; -+ } -+ -+ } -+ if (h_src_dentry) { -+ err = vfsub_link(h_src_dentry, au_pinned_h_dir(&a->pin), -+ &a->h_path); -+ dput(h_src_dentry); -+ } else { -+ AuIOErr("no dentry found for hi%lu on b%d\n", -+ h_inode->i_ino, a->bdst); -+ err = -EIO; -+ } -+ } -+ -+ if (!err && !plink) -+ au_plink_append(inode, a->bdst, a->h_path.dentry); -+ -+out: -+ return err; -+} -+ -+int aufs_link(struct dentry *src_dentry, struct inode *dir, -+ struct dentry *dentry) -+{ -+ int err, rerr; -+ struct au_dtime dt; -+ struct au_link_args *a; -+ struct dentry *wh_dentry, *h_src_dentry; -+ struct inode *inode; -+ struct super_block *sb; -+ struct au_wr_dir_args wr_dir_args = { -+ /* .force_btgt = -1, */ -+ .flags = AuWrDir_ADD_ENTRY -+ }; -+ -+ IMustLock(dir); -+ inode = src_dentry->d_inode; -+ IMustLock(inode); -+ -+ err = -ENOENT; -+ if (unlikely(!inode->i_nlink)) -+ goto out; -+ -+ err = -ENOMEM; -+ a = kzalloc(sizeof(*a), GFP_NOFS); -+ if (unlikely(!a)) -+ goto out; -+ -+ a->parent = dentry->d_parent; /* dir inode is locked */ -+ aufs_read_and_write_lock2(dentry, src_dentry, /*AuLock_FLUSH*/0); -+ a->src_parent = dget_parent(src_dentry); -+ wr_dir_args.force_btgt = au_dbstart(src_dentry); -+ -+ di_write_lock_parent(a->parent); -+ wr_dir_args.force_btgt = au_wbr(dentry, wr_dir_args.force_btgt); -+ wh_dentry = lock_hdir_lkup_wh(dentry, &dt, src_dentry, &a->pin, -+ &wr_dir_args); -+ err = PTR_ERR(wh_dentry); -+ if (IS_ERR(wh_dentry)) -+ goto out_unlock; -+ -+ err = 0; -+ sb = dentry->d_sb; -+ a->bdst = au_dbstart(dentry); -+ a->h_path.dentry = au_h_dptr(dentry, a->bdst); -+ a->h_path.mnt = au_sbr_mnt(sb, a->bdst); -+ a->bsrc = au_dbstart(src_dentry); -+ if (au_opt_test(au_mntflags(sb), PLINK)) { -+ if (a->bdst < a->bsrc -+ /* && h_src_dentry->d_sb != a->h_path.dentry->d_sb */) -+ err = au_cpup_or_link(src_dentry, a); -+ else { -+ h_src_dentry = au_h_dptr(src_dentry, a->bdst); -+ err = vfsub_link(h_src_dentry, au_pinned_h_dir(&a->pin), -+ &a->h_path); -+ } -+ } else { -+ /* -+ * copyup src_dentry to the branch we process, -+ * and then link(2) to it. -+ */ -+ if (a->bdst < a->bsrc -+ /* && h_src_dentry->d_sb != a->h_path.dentry->d_sb */) { -+ au_unpin(&a->pin); -+ di_write_unlock(a->parent); -+ err = au_cpup_before_link(src_dentry, a); -+ di_write_lock_parent(a->parent); -+ if (!err) -+ err = au_pin(&a->pin, dentry, a->bdst, -+ au_opt_udba(sb), -+ AuPin_DI_LOCKED | AuPin_MNT_WRITE); -+ if (unlikely(err)) -+ goto out_wh; -+ } -+ if (!err) { -+ h_src_dentry = au_h_dptr(src_dentry, a->bdst); -+ err = -ENOENT; -+ if (h_src_dentry && h_src_dentry->d_inode) -+ err = vfsub_link(h_src_dentry, -+ au_pinned_h_dir(&a->pin), -+ &a->h_path); -+ } -+ } -+ if (unlikely(err)) -+ goto out_unpin; -+ -+ if (wh_dentry) { -+ a->h_path.dentry = wh_dentry; -+ err = au_wh_unlink_dentry(au_pinned_h_dir(&a->pin), &a->h_path, -+ dentry); -+ if (unlikely(err)) -+ goto out_revert; -+ } -+ -+ dir->i_version++; -+ if (au_ibstart(dir) == au_dbstart(dentry)) -+ au_cpup_attr_timesizes(dir); -+ inc_nlink(inode); -+ inode->i_ctime = dir->i_ctime; -+ if (!d_unhashed(a->h_path.dentry)) -+ d_instantiate(dentry, au_igrab(inode)); -+ else -+ /* some filesystem calls d_drop() */ -+ d_drop(dentry); -+ goto out_unpin; /* success */ -+ -+ out_revert: -+ rerr = vfsub_unlink(au_pinned_h_dir(&a->pin), &a->h_path, /*force*/0); -+ if (!rerr) -+ goto out_dt; -+ AuIOErr("%.*s reverting failed(%d, %d)\n", -+ AuDLNPair(dentry), err, rerr); -+ err = -EIO; -+ out_dt: -+ d_drop(dentry); -+ au_dtime_revert(&dt); -+ out_unpin: -+ au_unpin(&a->pin); -+ out_wh: -+ dput(wh_dentry); -+ out_unlock: -+ if (unlikely(err)) { -+ au_update_dbstart(dentry); -+ d_drop(dentry); -+ } -+ di_write_unlock(a->parent); -+ dput(a->src_parent); -+ aufs_read_and_write_unlock2(dentry, src_dentry); -+ kfree(a); -+ out: -+ return err; -+} -+ -+int aufs_mkdir(struct inode *dir, struct dentry *dentry, int mode) -+{ -+ int err, rerr; -+ aufs_bindex_t bindex; -+ unsigned char diropq; -+ struct path h_path; -+ struct dentry *wh_dentry, *parent, *opq_dentry; -+ struct mutex *h_mtx; -+ struct super_block *sb; -+ struct { -+ struct au_pin pin; -+ struct au_dtime dt; -+ } *a; /* reduce the stack usage */ -+ struct au_wr_dir_args wr_dir_args = { -+ .force_btgt = -1, -+ .flags = AuWrDir_ADD_ENTRY | AuWrDir_ISDIR -+ }; -+ -+ IMustLock(dir); -+ -+ err = -ENOMEM; -+ a = kmalloc(sizeof(*a), GFP_NOFS); -+ if (unlikely(!a)) -+ goto out; -+ -+ aufs_read_lock(dentry, AuLock_DW); -+ parent = dentry->d_parent; /* dir inode is locked */ -+ di_write_lock_parent(parent); -+ wh_dentry = lock_hdir_lkup_wh(dentry, &a->dt, /*src_dentry*/NULL, -+ &a->pin, &wr_dir_args); -+ err = PTR_ERR(wh_dentry); -+ if (IS_ERR(wh_dentry)) -+ goto out_free; -+ -+ sb = dentry->d_sb; -+ bindex = au_dbstart(dentry); -+ h_path.dentry = au_h_dptr(dentry, bindex); -+ h_path.mnt = au_sbr_mnt(sb, bindex); -+ err = vfsub_mkdir(au_pinned_h_dir(&a->pin), &h_path, mode); -+ if (unlikely(err)) -+ goto out_unlock; -+ -+ /* make the dir opaque */ -+ diropq = 0; -+ h_mtx = &h_path.dentry->d_inode->i_mutex; -+ if (wh_dentry -+ || au_opt_test(au_mntflags(sb), ALWAYS_DIROPQ)) { -+ mutex_lock_nested(h_mtx, AuLsc_I_CHILD); -+ opq_dentry = au_diropq_create(dentry, bindex); -+ mutex_unlock(h_mtx); -+ err = PTR_ERR(opq_dentry); -+ if (IS_ERR(opq_dentry)) -+ goto out_dir; -+ dput(opq_dentry); -+ diropq = 1; -+ } -+ -+ err = epilog(dir, bindex, wh_dentry, dentry); -+ if (!err) { -+ inc_nlink(dir); -+ goto out_unlock; /* success */ -+ } -+ -+ /* revert */ -+ if (diropq) { -+ AuLabel(revert opq); -+ mutex_lock_nested(h_mtx, AuLsc_I_CHILD); -+ rerr = au_diropq_remove(dentry, bindex); -+ mutex_unlock(h_mtx); -+ if (rerr) { -+ AuIOErr("%.*s reverting diropq failed(%d, %d)\n", -+ AuDLNPair(dentry), err, rerr); -+ err = -EIO; -+ } -+ } -+ -+ out_dir: -+ AuLabel(revert dir); -+ rerr = vfsub_rmdir(au_pinned_h_dir(&a->pin), &h_path); -+ if (rerr) { -+ AuIOErr("%.*s reverting dir failed(%d, %d)\n", -+ AuDLNPair(dentry), err, rerr); -+ err = -EIO; -+ } -+ d_drop(dentry); -+ au_dtime_revert(&a->dt); -+ out_unlock: -+ au_unpin(&a->pin); -+ dput(wh_dentry); -+ out_free: -+ if (unlikely(err)) { -+ au_update_dbstart(dentry); -+ d_drop(dentry); -+ } -+ di_write_unlock(parent); -+ aufs_read_unlock(dentry, AuLock_DW); -+ kfree(a); -+ out: -+ return err; -+} -diff -Nur linux-2.6.33.1-vanilla/fs/aufs/i_op.c linux-2.6.33.1/fs/aufs/i_op.c ---- linux-2.6.33.1-vanilla/fs/aufs/i_op.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-2.6.33.1/fs/aufs/i_op.c 2010-04-05 16:53:27.000000000 +0200 -@@ -0,0 +1,909 @@ -+/* -+ * Copyright (C) 2005-2010 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+/* -+ * inode operations (except add/del/rename) -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include "aufs.h" -+ -+static int h_permission(struct inode *h_inode, int mask, -+ struct vfsmount *h_mnt, int brperm) -+{ -+ int err; -+ const unsigned char write_mask = !!(mask & (MAY_WRITE | MAY_APPEND)); -+ -+ err = -EACCES; -+ if ((write_mask && IS_IMMUTABLE(h_inode)) -+ || ((mask & MAY_EXEC) -+ && S_ISREG(h_inode->i_mode) -+ && ((h_mnt->mnt_flags & MNT_NOEXEC) -+ || !(h_inode->i_mode & S_IXUGO)))) -+ goto out; -+ -+ /* -+ * - skip the lower fs test in the case of write to ro branch. -+ * - nfs dir permission write check is optimized, but a policy for -+ * link/rename requires a real check. -+ */ -+ if ((write_mask && !au_br_writable(brperm)) -+ || (au_test_nfs(h_inode->i_sb) && S_ISDIR(h_inode->i_mode) -+ && write_mask && !(mask & MAY_READ)) -+ || !h_inode->i_op->permission) { -+ /* AuLabel(generic_permission); */ -+ err = generic_permission(h_inode, mask, -+ h_inode->i_op->check_acl); -+ } else { -+ /* AuLabel(h_inode->permission); */ -+ err = h_inode->i_op->permission(h_inode, mask); -+ AuTraceErr(err); -+ } -+ -+ if (!err) -+ err = devcgroup_inode_permission(h_inode, mask); -+ if (!err) { -+ mask &= (MAY_READ | MAY_WRITE | MAY_EXEC | MAY_APPEND); -+ err = security_inode_permission(h_inode, mask); -+ } -+ -+#if 0 -+ if (!err) { -+ /* todo: do we need to call ima_path_check()? */ -+ struct path h_path = { -+ .dentry = -+ .mnt = h_mnt -+ }; -+ err = ima_path_check(&h_path, -+ mask & (MAY_READ | MAY_WRITE | MAY_EXEC), -+ IMA_COUNT_LEAVE); -+ } -+#endif -+ -+ out: -+ return err; -+} -+ -+static int aufs_permission(struct inode *inode, int mask) -+{ -+ int err; -+ aufs_bindex_t bindex, bend; -+ const unsigned char isdir = !!S_ISDIR(inode->i_mode), -+ write_mask = !!(mask & (MAY_WRITE | MAY_APPEND)); -+ struct inode *h_inode; -+ struct super_block *sb; -+ struct au_branch *br; -+ -+ sb = inode->i_sb; -+ si_read_lock(sb, AuLock_FLUSH); -+ ii_read_lock_child(inode); -+ -+ if (!isdir || write_mask) { -+ err = au_busy_or_stale(); -+ h_inode = au_h_iptr(inode, au_ibstart(inode)); -+ if (unlikely(!h_inode -+ || (h_inode->i_mode & S_IFMT) -+ != (inode->i_mode & S_IFMT))) -+ goto out; -+ -+ err = 0; -+ bindex = au_ibstart(inode); -+ br = au_sbr(sb, bindex); -+ err = h_permission(h_inode, mask, br->br_mnt, br->br_perm); -+ if (write_mask -+ && !err -+ && !special_file(h_inode->i_mode)) { -+ /* test whether the upper writable branch exists */ -+ err = -EROFS; -+ for (; bindex >= 0; bindex--) -+ if (!au_br_rdonly(au_sbr(sb, bindex))) { -+ err = 0; -+ break; -+ } -+ } -+ goto out; -+ } -+ -+ /* non-write to dir */ -+ err = 0; -+ bend = au_ibend(inode); -+ for (bindex = au_ibstart(inode); !err && bindex <= bend; bindex++) { -+ h_inode = au_h_iptr(inode, bindex); -+ if (h_inode) { -+ err = au_busy_or_stale(); -+ if (unlikely(!S_ISDIR(h_inode->i_mode))) -+ break; -+ -+ br = au_sbr(sb, bindex); -+ err = h_permission(h_inode, mask, br->br_mnt, -+ br->br_perm); -+ } -+ } -+ -+ out: -+ ii_read_unlock(inode); -+ si_read_unlock(sb); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static struct dentry *aufs_lookup(struct inode *dir, struct dentry *dentry, -+ struct nameidata *nd) -+{ -+ struct dentry *ret, *parent; -+ struct inode *inode, *h_inode; -+ struct mutex *mtx; -+ struct super_block *sb; -+ int err, npositive; -+ aufs_bindex_t bstart; -+ -+ IMustLock(dir); -+ -+ sb = dir->i_sb; -+ si_read_lock(sb, AuLock_FLUSH); -+ ret = ERR_PTR(-ENAMETOOLONG); -+ if (unlikely(dentry->d_name.len > AUFS_MAX_NAMELEN)) -+ goto out; -+ err = au_alloc_dinfo(dentry); -+ ret = ERR_PTR(err); -+ if (unlikely(err)) -+ goto out; -+ -+ parent = dentry->d_parent; /* dir inode is locked */ -+ di_read_lock_parent(parent, AuLock_IR); -+ npositive = au_lkup_dentry(dentry, au_dbstart(parent), /*type*/0, nd); -+ di_read_unlock(parent, AuLock_IR); -+ err = npositive; -+ ret = ERR_PTR(err); -+ if (unlikely(err < 0)) -+ goto out_unlock; -+ -+ inode = NULL; -+ if (npositive) { -+ bstart = au_dbstart(dentry); -+ h_inode = au_h_dptr(dentry, bstart)->d_inode; -+ if (!S_ISDIR(h_inode->i_mode)) { -+ /* -+ * stop 'race'-ing between hardlinks under different -+ * parents. -+ */ -+ mtx = &au_sbr(sb, bstart)->br_xino.xi_nondir_mtx; -+ mutex_lock(mtx); -+ inode = au_new_inode(dentry, /*must_new*/0); -+ mutex_unlock(mtx); -+ } else -+ inode = au_new_inode(dentry, /*must_new*/0); -+ ret = (void *)inode; -+ } -+ if (IS_ERR(inode)) -+ goto out_unlock; -+ -+ ret = d_splice_alias(inode, dentry); -+ if (unlikely(IS_ERR(ret) && inode)) -+ ii_write_unlock(inode); -+ -+ out_unlock: -+ di_write_unlock(dentry); -+ out: -+ si_read_unlock(sb); -+ return ret; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int au_wr_dir_cpup(struct dentry *dentry, struct dentry *parent, -+ const unsigned char add_entry, aufs_bindex_t bcpup, -+ aufs_bindex_t bstart) -+{ -+ int err; -+ struct dentry *h_parent; -+ struct inode *h_dir; -+ -+ if (add_entry) { -+ au_update_dbstart(dentry); -+ IMustLock(parent->d_inode); -+ } else -+ di_write_lock_parent(parent); -+ -+ err = 0; -+ if (!au_h_dptr(parent, bcpup)) { -+ if (bstart < bcpup) -+ err = au_cpdown_dirs(dentry, bcpup); -+ else -+ err = au_cpup_dirs(dentry, bcpup); -+ } -+ if (!err && add_entry) { -+ h_parent = au_h_dptr(parent, bcpup); -+ h_dir = h_parent->d_inode; -+ mutex_lock_nested(&h_dir->i_mutex, AuLsc_I_PARENT); -+ err = au_lkup_neg(dentry, bcpup); -+ /* todo: no unlock here */ -+ mutex_unlock(&h_dir->i_mutex); -+ if (bstart < bcpup && au_dbstart(dentry) < 0) { -+ au_set_dbstart(dentry, 0); -+ au_update_dbrange(dentry, /*do_put_zero*/0); -+ } -+ } -+ -+ if (!add_entry) -+ di_write_unlock(parent); -+ if (!err) -+ err = bcpup; /* success */ -+ -+ return err; -+} -+ -+/* -+ * decide the branch and the parent dir where we will create a new entry. -+ * returns new bindex or an error. -+ * copyup the parent dir if needed. -+ */ -+int au_wr_dir(struct dentry *dentry, struct dentry *src_dentry, -+ struct au_wr_dir_args *args) -+{ -+ int err; -+ aufs_bindex_t bcpup, bstart, src_bstart; -+ const unsigned char add_entry = !!au_ftest_wrdir(args->flags, -+ ADD_ENTRY); -+ struct super_block *sb; -+ struct dentry *parent; -+ struct au_sbinfo *sbinfo; -+ -+ sb = dentry->d_sb; -+ sbinfo = au_sbi(sb); -+ parent = dget_parent(dentry); -+ bstart = au_dbstart(dentry); -+ bcpup = bstart; -+ if (args->force_btgt < 0) { -+ if (src_dentry) { -+ src_bstart = au_dbstart(src_dentry); -+ if (src_bstart < bstart) -+ bcpup = src_bstart; -+ } else if (add_entry) { -+ err = AuWbrCreate(sbinfo, dentry, -+ au_ftest_wrdir(args->flags, ISDIR)); -+ bcpup = err; -+ } -+ -+ if (bcpup < 0 || au_test_ro(sb, bcpup, dentry->d_inode)) { -+ if (add_entry) -+ err = AuWbrCopyup(sbinfo, dentry); -+ else { -+ if (!IS_ROOT(dentry)) { -+ di_read_lock_parent(parent, !AuLock_IR); -+ err = AuWbrCopyup(sbinfo, dentry); -+ di_read_unlock(parent, !AuLock_IR); -+ } else -+ err = AuWbrCopyup(sbinfo, dentry); -+ } -+ bcpup = err; -+ if (unlikely(err < 0)) -+ goto out; -+ } -+ } else { -+ bcpup = args->force_btgt; -+ AuDebugOn(au_test_ro(sb, bcpup, dentry->d_inode)); -+ } -+ AuDbg("bstart %d, bcpup %d\n", bstart, bcpup); -+ if (bstart < bcpup) -+ au_update_dbrange(dentry, /*do_put_zero*/1); -+ -+ err = bcpup; -+ if (bcpup == bstart) -+ goto out; /* success */ -+ -+ /* copyup the new parent into the branch we process */ -+ err = au_wr_dir_cpup(dentry, parent, add_entry, bcpup, bstart); -+ -+ out: -+ dput(parent); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+struct dentry *au_pinned_h_parent(struct au_pin *pin) -+{ -+ if (pin && pin->parent) -+ return au_h_dptr(pin->parent, pin->bindex); -+ return NULL; -+} -+ -+void au_unpin(struct au_pin *p) -+{ -+ if (au_ftest_pin(p->flags, MNT_WRITE)) -+ mnt_drop_write(p->h_mnt); -+ if (!p->hdir) -+ return; -+ -+ au_hn_imtx_unlock(p->hdir); -+ if (!au_ftest_pin(p->flags, DI_LOCKED)) -+ di_read_unlock(p->parent, AuLock_IR); -+ iput(p->hdir->hi_inode); -+ dput(p->parent); -+ p->parent = NULL; -+ p->hdir = NULL; -+ p->h_mnt = NULL; -+} -+ -+int au_do_pin(struct au_pin *p) -+{ -+ int err; -+ struct super_block *sb; -+ struct dentry *h_dentry, *h_parent; -+ struct au_branch *br; -+ struct inode *h_dir; -+ -+ err = 0; -+ sb = p->dentry->d_sb; -+ br = au_sbr(sb, p->bindex); -+ if (IS_ROOT(p->dentry)) { -+ if (au_ftest_pin(p->flags, MNT_WRITE)) { -+ p->h_mnt = br->br_mnt; -+ err = mnt_want_write(p->h_mnt); -+ if (unlikely(err)) { -+ au_fclr_pin(p->flags, MNT_WRITE); -+ goto out_err; -+ } -+ } -+ goto out; -+ } -+ -+ h_dentry = NULL; -+ if (p->bindex <= au_dbend(p->dentry)) -+ h_dentry = au_h_dptr(p->dentry, p->bindex); -+ -+ p->parent = dget_parent(p->dentry); -+ if (!au_ftest_pin(p->flags, DI_LOCKED)) -+ di_read_lock(p->parent, AuLock_IR, p->lsc_di); -+ -+ h_dir = NULL; -+ h_parent = au_h_dptr(p->parent, p->bindex); -+ p->hdir = au_hi(p->parent->d_inode, p->bindex); -+ if (p->hdir) -+ h_dir = p->hdir->hi_inode; -+ -+ /* udba case */ -+ if (unlikely(!p->hdir || !h_dir)) { -+ if (!au_ftest_pin(p->flags, DI_LOCKED)) -+ di_read_unlock(p->parent, AuLock_IR); -+ dput(p->parent); -+ p->parent = NULL; -+ goto out_err; -+ } -+ -+ au_igrab(h_dir); -+ au_hn_imtx_lock_nested(p->hdir, p->lsc_hi); -+ -+ if (unlikely(p->hdir->hi_inode != h_parent->d_inode)) { -+ err = -EBUSY; -+ goto out_unpin; -+ } -+ if (h_dentry) { -+ err = au_h_verify(h_dentry, p->udba, h_dir, h_parent, br); -+ if (unlikely(err)) { -+ au_fclr_pin(p->flags, MNT_WRITE); -+ goto out_unpin; -+ } -+ } -+ -+ if (au_ftest_pin(p->flags, MNT_WRITE)) { -+ p->h_mnt = br->br_mnt; -+ err = mnt_want_write(p->h_mnt); -+ if (unlikely(err)) { -+ au_fclr_pin(p->flags, MNT_WRITE); -+ goto out_unpin; -+ } -+ } -+ goto out; /* success */ -+ -+ out_unpin: -+ au_unpin(p); -+ out_err: -+ pr_err("err %d\n", err); -+ err = au_busy_or_stale(); -+ out: -+ return err; -+} -+ -+void au_pin_init(struct au_pin *p, struct dentry *dentry, -+ aufs_bindex_t bindex, int lsc_di, int lsc_hi, -+ unsigned int udba, unsigned char flags) -+{ -+ p->dentry = dentry; -+ p->udba = udba; -+ p->lsc_di = lsc_di; -+ p->lsc_hi = lsc_hi; -+ p->flags = flags; -+ p->bindex = bindex; -+ -+ p->parent = NULL; -+ p->hdir = NULL; -+ p->h_mnt = NULL; -+} -+ -+int au_pin(struct au_pin *pin, struct dentry *dentry, aufs_bindex_t bindex, -+ unsigned int udba, unsigned char flags) -+{ -+ au_pin_init(pin, dentry, bindex, AuLsc_DI_PARENT, AuLsc_I_PARENT2, -+ udba, flags); -+ return au_do_pin(pin); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+#define AuIcpup_DID_CPUP 1 -+#define au_ftest_icpup(flags, name) ((flags) & AuIcpup_##name) -+#define au_fset_icpup(flags, name) { (flags) |= AuIcpup_##name; } -+#define au_fclr_icpup(flags, name) { (flags) &= ~AuIcpup_##name; } -+ -+struct au_icpup_args { -+ unsigned char flags; -+ unsigned char pin_flags; -+ aufs_bindex_t btgt; -+ struct au_pin pin; -+ struct path h_path; -+ struct inode *h_inode; -+}; -+ -+static int au_lock_and_icpup(struct dentry *dentry, struct iattr *ia, -+ struct au_icpup_args *a) -+{ -+ int err; -+ unsigned int udba; -+ loff_t sz; -+ aufs_bindex_t bstart; -+ struct dentry *hi_wh, *parent; -+ struct inode *inode; -+ struct file *h_file; -+ struct au_wr_dir_args wr_dir_args = { -+ .force_btgt = -1, -+ .flags = 0 -+ }; -+ -+ di_write_lock_child(dentry); -+ bstart = au_dbstart(dentry); -+ inode = dentry->d_inode; -+ if (S_ISDIR(inode->i_mode)) -+ au_fset_wrdir(wr_dir_args.flags, ISDIR); -+ /* plink or hi_wh() case */ -+ if (bstart != au_ibstart(inode)) -+ wr_dir_args.force_btgt = au_ibstart(inode); -+ err = au_wr_dir(dentry, /*src_dentry*/NULL, &wr_dir_args); -+ if (unlikely(err < 0)) -+ goto out_dentry; -+ a->btgt = err; -+ if (err != bstart) -+ au_fset_icpup(a->flags, DID_CPUP); -+ -+ err = 0; -+ a->pin_flags = AuPin_MNT_WRITE; -+ parent = NULL; -+ if (!IS_ROOT(dentry)) { -+ au_fset_pin(a->pin_flags, DI_LOCKED); -+ parent = dget_parent(dentry); -+ di_write_lock_parent(parent); -+ } -+ -+ udba = au_opt_udba(dentry->d_sb); -+ if (d_unhashed(dentry) || (ia->ia_valid & ATTR_FILE)) -+ udba = AuOpt_UDBA_NONE; -+ err = au_pin(&a->pin, dentry, a->btgt, udba, a->pin_flags); -+ if (unlikely(err)) -+ goto out_parent; -+ -+ a->h_path.dentry = au_h_dptr(dentry, bstart); -+ a->h_inode = a->h_path.dentry->d_inode; -+ mutex_lock_nested(&a->h_inode->i_mutex, AuLsc_I_CHILD); -+ sz = -1; -+ if ((ia->ia_valid & ATTR_SIZE) && ia->ia_size < i_size_read(a->h_inode)) -+ sz = ia->ia_size; -+ -+ h_file = NULL; -+ hi_wh = NULL; -+ if (au_ftest_icpup(a->flags, DID_CPUP) && d_unhashed(dentry)) { -+ hi_wh = au_hi_wh(inode, a->btgt); -+ if (!hi_wh) { -+ err = au_sio_cpup_wh(dentry, a->btgt, sz, /*file*/NULL); -+ if (unlikely(err)) -+ goto out_unlock; -+ hi_wh = au_hi_wh(inode, a->btgt); -+ /* todo: revalidate hi_wh? */ -+ } -+ } -+ -+ if (parent) { -+ au_pin_set_parent_lflag(&a->pin, /*lflag*/0); -+ di_downgrade_lock(parent, AuLock_IR); -+ dput(parent); -+ parent = NULL; -+ } -+ if (!au_ftest_icpup(a->flags, DID_CPUP)) -+ goto out; /* success */ -+ -+ if (!d_unhashed(dentry)) { -+ h_file = au_h_open_pre(dentry, bstart); -+ if (IS_ERR(h_file)) { -+ err = PTR_ERR(h_file); -+ h_file = NULL; -+ } else -+ err = au_sio_cpup_simple(dentry, a->btgt, sz, -+ AuCpup_DTIME); -+ if (!err) -+ a->h_path.dentry = au_h_dptr(dentry, a->btgt); -+ } else if (!hi_wh) -+ a->h_path.dentry = au_h_dptr(dentry, a->btgt); -+ else -+ a->h_path.dentry = hi_wh; /* do not dget here */ -+ -+ out_unlock: -+ mutex_unlock(&a->h_inode->i_mutex); -+ au_h_open_post(dentry, bstart, h_file); -+ a->h_inode = a->h_path.dentry->d_inode; -+ if (!err) { -+ mutex_lock_nested(&a->h_inode->i_mutex, AuLsc_I_CHILD); -+ goto out; /* success */ -+ } -+ -+ au_unpin(&a->pin); -+ out_parent: -+ if (parent) { -+ di_write_unlock(parent); -+ dput(parent); -+ } -+ out_dentry: -+ di_write_unlock(dentry); -+ out: -+ return err; -+} -+ -+static int aufs_setattr(struct dentry *dentry, struct iattr *ia) -+{ -+ int err; -+ struct inode *inode; -+ struct super_block *sb; -+ struct file *file; -+ struct au_icpup_args *a; -+ -+ err = -ENOMEM; -+ a = kzalloc(sizeof(*a), GFP_NOFS); -+ if (unlikely(!a)) -+ goto out; -+ -+ inode = dentry->d_inode; -+ IMustLock(inode); -+ sb = dentry->d_sb; -+ si_read_lock(sb, AuLock_FLUSH); -+ -+ file = NULL; -+ if (ia->ia_valid & ATTR_FILE) { -+ /* currently ftruncate(2) only */ -+ file = ia->ia_file; -+ fi_write_lock(file); -+ ia->ia_file = au_h_fptr(file, au_fbstart(file)); -+ } -+ -+ if (ia->ia_valid & (ATTR_KILL_SUID | ATTR_KILL_SGID)) -+ ia->ia_valid &= ~ATTR_MODE; -+ -+ err = au_lock_and_icpup(dentry, ia, a); -+ if (unlikely(err < 0)) -+ goto out_si; -+ if (au_ftest_icpup(a->flags, DID_CPUP)) { -+ ia->ia_file = NULL; -+ ia->ia_valid &= ~ATTR_FILE; -+ } -+ -+ a->h_path.mnt = au_sbr_mnt(sb, a->btgt); -+ if ((ia->ia_valid & (ATTR_MODE | ATTR_CTIME)) -+ == (ATTR_MODE | ATTR_CTIME)) { -+ err = security_path_chmod(a->h_path.dentry, a->h_path.mnt, -+ ia->ia_mode); -+ if (unlikely(err)) -+ goto out_unlock; -+ } else if ((ia->ia_valid & (ATTR_UID | ATTR_GID)) -+ && (ia->ia_valid & ATTR_CTIME)) { -+ err = security_path_chown(&a->h_path, ia->ia_uid, ia->ia_gid); -+ if (unlikely(err)) -+ goto out_unlock; -+ } -+ -+ if (ia->ia_valid & ATTR_SIZE) { -+ struct file *f; -+ -+ if (ia->ia_size < i_size_read(inode)) { -+ /* unmap only */ -+ err = vmtruncate(inode, ia->ia_size); -+ if (unlikely(err)) -+ goto out_unlock; -+ } -+ -+ f = NULL; -+ if (ia->ia_valid & ATTR_FILE) -+ f = ia->ia_file; -+ mutex_unlock(&a->h_inode->i_mutex); -+ err = vfsub_trunc(&a->h_path, ia->ia_size, ia->ia_valid, f); -+ mutex_lock_nested(&a->h_inode->i_mutex, AuLsc_I_CHILD); -+ } else -+ err = vfsub_notify_change(&a->h_path, ia); -+ if (!err) -+ au_cpup_attr_changeable(inode); -+ -+ out_unlock: -+ mutex_unlock(&a->h_inode->i_mutex); -+ au_unpin(&a->pin); -+ di_write_unlock(dentry); -+ out_si: -+ if (file) { -+ fi_write_unlock(file); -+ ia->ia_file = file; -+ ia->ia_valid |= ATTR_FILE; -+ } -+ si_read_unlock(sb); -+ kfree(a); -+ out: -+ return err; -+} -+ -+static int au_getattr_lock_reval(struct dentry *dentry, unsigned int sigen) -+{ -+ int err; -+ struct inode *inode; -+ struct dentry *parent; -+ -+ err = 0; -+ inode = dentry->d_inode; -+ di_write_lock_child(dentry); -+ if (au_digen(dentry) != sigen || au_iigen(inode) != sigen) { -+ parent = dget_parent(dentry); -+ di_read_lock_parent(parent, AuLock_IR); -+ /* returns a number of positive dentries */ -+ err = au_refresh_hdentry(dentry, inode->i_mode & S_IFMT); -+ if (err >= 0) -+ err = au_refresh_hinode(inode, dentry); -+ di_read_unlock(parent, AuLock_IR); -+ dput(parent); -+ } -+ di_downgrade_lock(dentry, AuLock_IR); -+ if (unlikely(err)) -+ di_read_unlock(dentry, AuLock_IR); -+ -+ AuTraceErr(err); -+ return err; -+} -+ -+static void au_refresh_iattr(struct inode *inode, struct kstat *st, -+ unsigned int nlink) -+{ -+ inode->i_mode = st->mode; -+ inode->i_uid = st->uid; -+ inode->i_gid = st->gid; -+ inode->i_atime = st->atime; -+ inode->i_mtime = st->mtime; -+ inode->i_ctime = st->ctime; -+ -+ au_cpup_attr_nlink(inode, /*force*/0); -+ if (S_ISDIR(inode->i_mode)) { -+ inode->i_nlink -= nlink; -+ inode->i_nlink += st->nlink; -+ } -+ -+ spin_lock(&inode->i_lock); -+ inode->i_blocks = st->blocks; -+ i_size_write(inode, st->size); -+ spin_unlock(&inode->i_lock); -+} -+ -+static int aufs_getattr(struct vfsmount *mnt __maybe_unused, -+ struct dentry *dentry, struct kstat *st) -+{ -+ int err; -+ unsigned int mnt_flags; -+ aufs_bindex_t bindex; -+ unsigned char udba_none, positive; -+ struct super_block *sb, *h_sb; -+ struct inode *inode; -+ struct vfsmount *h_mnt; -+ struct dentry *h_dentry; -+ -+ err = 0; -+ sb = dentry->d_sb; -+ inode = dentry->d_inode; -+ si_read_lock(sb, AuLock_FLUSH); -+ mnt_flags = au_mntflags(sb); -+ udba_none = !!au_opt_test(mnt_flags, UDBA_NONE); -+ -+ /* support fstat(2) */ -+ if (!d_unhashed(dentry) && !udba_none) { -+ unsigned int sigen = au_sigen(sb); -+ if (au_digen(dentry) == sigen && au_iigen(inode) == sigen) -+ di_read_lock_child(dentry, AuLock_IR); -+ else { -+ AuDebugOn(IS_ROOT(dentry)); -+ err = au_getattr_lock_reval(dentry, sigen); -+ if (unlikely(err)) -+ goto out; -+ } -+ } else -+ di_read_lock_child(dentry, AuLock_IR); -+ -+ bindex = au_ibstart(inode); -+ h_mnt = au_sbr_mnt(sb, bindex); -+ h_sb = h_mnt->mnt_sb; -+ if (!au_test_fs_bad_iattr(h_sb) && udba_none) -+ goto out_fill; /* success */ -+ -+ h_dentry = NULL; -+ if (au_dbstart(dentry) == bindex) -+ h_dentry = dget(au_h_dptr(dentry, bindex)); -+ else if (au_opt_test(mnt_flags, PLINK) && au_plink_test(inode)) { -+ h_dentry = au_plink_lkup(inode, bindex); -+ if (IS_ERR(h_dentry)) -+ goto out_fill; /* pretending success */ -+ } -+ /* illegally overlapped or something */ -+ if (unlikely(!h_dentry)) -+ goto out_fill; /* pretending success */ -+ -+ positive = !!h_dentry->d_inode; -+ if (positive) -+ err = vfs_getattr(h_mnt, h_dentry, st); -+ dput(h_dentry); -+ if (!err) { -+ if (positive) -+ au_refresh_iattr(inode, st, h_dentry->d_inode->i_nlink); -+ goto out_fill; /* success */ -+ } -+ goto out_unlock; -+ -+ out_fill: -+ generic_fillattr(inode, st); -+ out_unlock: -+ di_read_unlock(dentry, AuLock_IR); -+ out: -+ si_read_unlock(sb); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int h_readlink(struct dentry *dentry, int bindex, char __user *buf, -+ int bufsiz) -+{ -+ int err; -+ struct super_block *sb; -+ struct dentry *h_dentry; -+ -+ err = -EINVAL; -+ h_dentry = au_h_dptr(dentry, bindex); -+ if (unlikely(!h_dentry->d_inode->i_op->readlink)) -+ goto out; -+ -+ err = security_inode_readlink(h_dentry); -+ if (unlikely(err)) -+ goto out; -+ -+ sb = dentry->d_sb; -+ if (!au_test_ro(sb, bindex, dentry->d_inode)) { -+ vfsub_touch_atime(au_sbr_mnt(sb, bindex), h_dentry); -+ fsstack_copy_attr_atime(dentry->d_inode, h_dentry->d_inode); -+ } -+ err = h_dentry->d_inode->i_op->readlink(h_dentry, buf, bufsiz); -+ -+ out: -+ return err; -+} -+ -+static int aufs_readlink(struct dentry *dentry, char __user *buf, int bufsiz) -+{ -+ int err; -+ -+ aufs_read_lock(dentry, AuLock_IR); -+ err = h_readlink(dentry, au_dbstart(dentry), buf, bufsiz); -+ aufs_read_unlock(dentry, AuLock_IR); -+ -+ return err; -+} -+ -+static void *aufs_follow_link(struct dentry *dentry, struct nameidata *nd) -+{ -+ int err; -+ char *buf; -+ mm_segment_t old_fs; -+ -+ err = -ENOMEM; -+ buf = __getname_gfp(GFP_NOFS); -+ if (unlikely(!buf)) -+ goto out; -+ -+ aufs_read_lock(dentry, AuLock_IR); -+ old_fs = get_fs(); -+ set_fs(KERNEL_DS); -+ err = h_readlink(dentry, au_dbstart(dentry), (char __user *)buf, -+ PATH_MAX); -+ set_fs(old_fs); -+ aufs_read_unlock(dentry, AuLock_IR); -+ -+ if (err >= 0) { -+ buf[err] = 0; -+ /* will be freed by put_link */ -+ nd_set_link(nd, buf); -+ return NULL; /* success */ -+ } -+ __putname(buf); -+ -+ out: -+ path_put(&nd->path); -+ AuTraceErr(err); -+ return ERR_PTR(err); -+} -+ -+static void aufs_put_link(struct dentry *dentry __maybe_unused, -+ struct nameidata *nd, void *cookie __maybe_unused) -+{ -+ __putname(nd_get_link(nd)); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static void aufs_truncate_range(struct inode *inode __maybe_unused, -+ loff_t start __maybe_unused, -+ loff_t end __maybe_unused) -+{ -+ AuUnsupport(); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+struct inode_operations aufs_symlink_iop = { -+ .permission = aufs_permission, -+ .setattr = aufs_setattr, -+ .getattr = aufs_getattr, -+ .readlink = aufs_readlink, -+ .follow_link = aufs_follow_link, -+ .put_link = aufs_put_link -+}; -+ -+struct inode_operations aufs_dir_iop = { -+ .create = aufs_create, -+ .lookup = aufs_lookup, -+ .link = aufs_link, -+ .unlink = aufs_unlink, -+ .symlink = aufs_symlink, -+ .mkdir = aufs_mkdir, -+ .rmdir = aufs_rmdir, -+ .mknod = aufs_mknod, -+ .rename = aufs_rename, -+ -+ .permission = aufs_permission, -+ .setattr = aufs_setattr, -+ .getattr = aufs_getattr -+}; -+ -+struct inode_operations aufs_iop = { -+ .permission = aufs_permission, -+ .setattr = aufs_setattr, -+ .getattr = aufs_getattr, -+ .truncate_range = aufs_truncate_range -+}; -diff -Nur linux-2.6.33.1-vanilla/fs/aufs/i_op_del.c linux-2.6.33.1/fs/aufs/i_op_del.c ---- linux-2.6.33.1-vanilla/fs/aufs/i_op_del.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-2.6.33.1/fs/aufs/i_op_del.c 2010-04-05 16:53:27.000000000 +0200 -@@ -0,0 +1,472 @@ -+/* -+ * Copyright (C) 2005-2010 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+/* -+ * inode operations (del entry) -+ */ -+ -+#include "aufs.h" -+ -+/* -+ * decide if a new whiteout for @dentry is necessary or not. -+ * when it is necessary, prepare the parent dir for the upper branch whose -+ * branch index is @bcpup for creation. the actual creation of the whiteout will -+ * be done by caller. -+ * return value: -+ * 0: wh is unnecessary -+ * plus: wh is necessary -+ * minus: error -+ */ -+int au_wr_dir_need_wh(struct dentry *dentry, int isdir, aufs_bindex_t *bcpup) -+{ -+ int need_wh, err; -+ aufs_bindex_t bstart; -+ struct super_block *sb; -+ -+ sb = dentry->d_sb; -+ bstart = au_dbstart(dentry); -+ if (*bcpup < 0) { -+ *bcpup = bstart; -+ if (au_test_ro(sb, bstart, dentry->d_inode)) { -+ err = AuWbrCopyup(au_sbi(sb), dentry); -+ *bcpup = err; -+ if (unlikely(err < 0)) -+ goto out; -+ } -+ } else -+ AuDebugOn(bstart < *bcpup -+ || au_test_ro(sb, *bcpup, dentry->d_inode)); -+ AuDbg("bcpup %d, bstart %d\n", *bcpup, bstart); -+ -+ if (*bcpup != bstart) { -+ err = au_cpup_dirs(dentry, *bcpup); -+ if (unlikely(err)) -+ goto out; -+ need_wh = 1; -+ } else { -+ aufs_bindex_t old_bend, new_bend, bdiropq = -1; -+ -+ old_bend = au_dbend(dentry); -+ if (isdir) { -+ bdiropq = au_dbdiropq(dentry); -+ au_set_dbdiropq(dentry, -1); -+ } -+ need_wh = au_lkup_dentry(dentry, bstart + 1, /*type*/0, -+ /*nd*/NULL); -+ err = need_wh; -+ if (isdir) -+ au_set_dbdiropq(dentry, bdiropq); -+ if (unlikely(err < 0)) -+ goto out; -+ new_bend = au_dbend(dentry); -+ if (!need_wh && old_bend != new_bend) { -+ au_set_h_dptr(dentry, new_bend, NULL); -+ au_set_dbend(dentry, old_bend); -+ } -+ } -+ AuDbg("need_wh %d\n", need_wh); -+ err = need_wh; -+ -+ out: -+ return err; -+} -+ -+/* -+ * simple tests for the del-entry operations. -+ * following the checks in vfs, plus the parent-child relationship. -+ */ -+int au_may_del(struct dentry *dentry, aufs_bindex_t bindex, -+ struct dentry *h_parent, int isdir) -+{ -+ int err; -+ umode_t h_mode; -+ struct dentry *h_dentry, *h_latest; -+ struct inode *h_inode; -+ -+ h_dentry = au_h_dptr(dentry, bindex); -+ h_inode = h_dentry->d_inode; -+ if (dentry->d_inode) { -+ err = -ENOENT; -+ if (unlikely(!h_inode || !h_inode->i_nlink)) -+ goto out; -+ -+ h_mode = h_inode->i_mode; -+ if (!isdir) { -+ err = -EISDIR; -+ if (unlikely(S_ISDIR(h_mode))) -+ goto out; -+ } else if (unlikely(!S_ISDIR(h_mode))) { -+ err = -ENOTDIR; -+ goto out; -+ } -+ } else { -+ /* rename(2) case */ -+ err = -EIO; -+ if (unlikely(h_inode)) -+ goto out; -+ } -+ -+ err = -ENOENT; -+ /* expected parent dir is locked */ -+ if (unlikely(h_parent != h_dentry->d_parent)) -+ goto out; -+ err = 0; -+ -+ /* -+ * rmdir a dir may break the consistency on some filesystem. -+ * let's try heavy test. -+ */ -+ err = -EACCES; -+ if (unlikely(au_test_h_perm(h_parent->d_inode, MAY_EXEC | MAY_WRITE))) -+ goto out; -+ -+ h_latest = au_sio_lkup_one(&dentry->d_name, h_parent, -+ au_sbr(dentry->d_sb, bindex)); -+ err = -EIO; -+ if (IS_ERR(h_latest)) -+ goto out; -+ if (h_latest == h_dentry) -+ err = 0; -+ dput(h_latest); -+ -+ out: -+ return err; -+} -+ -+/* -+ * decide the branch where we operate for @dentry. the branch index will be set -+ * @rbcpup. after diciding it, 'pin' it and store the timestamps of the parent -+ * dir for reverting. -+ * when a new whiteout is necessary, create it. -+ */ -+static struct dentry* -+lock_hdir_create_wh(struct dentry *dentry, int isdir, aufs_bindex_t *rbcpup, -+ struct au_dtime *dt, struct au_pin *pin) -+{ -+ struct dentry *wh_dentry; -+ struct super_block *sb; -+ struct path h_path; -+ int err, need_wh; -+ unsigned int udba; -+ aufs_bindex_t bcpup; -+ -+ need_wh = au_wr_dir_need_wh(dentry, isdir, rbcpup); -+ wh_dentry = ERR_PTR(need_wh); -+ if (unlikely(need_wh < 0)) -+ goto out; -+ -+ sb = dentry->d_sb; -+ udba = au_opt_udba(sb); -+ bcpup = *rbcpup; -+ err = au_pin(pin, dentry, bcpup, udba, -+ AuPin_DI_LOCKED | AuPin_MNT_WRITE); -+ wh_dentry = ERR_PTR(err); -+ if (unlikely(err)) -+ goto out; -+ -+ h_path.dentry = au_pinned_h_parent(pin); -+ if (udba != AuOpt_UDBA_NONE -+ && au_dbstart(dentry) == bcpup) { -+ err = au_may_del(dentry, bcpup, h_path.dentry, isdir); -+ wh_dentry = ERR_PTR(err); -+ if (unlikely(err)) -+ goto out_unpin; -+ } -+ -+ h_path.mnt = au_sbr_mnt(sb, bcpup); -+ au_dtime_store(dt, au_pinned_parent(pin), &h_path); -+ wh_dentry = NULL; -+ if (!need_wh) -+ goto out; /* success, no need to create whiteout */ -+ -+ wh_dentry = au_wh_create(dentry, bcpup, h_path.dentry); -+ if (IS_ERR(wh_dentry)) -+ goto out_unpin; -+ -+ /* returns with the parent is locked and wh_dentry is dget-ed */ -+ goto out; /* success */ -+ -+ out_unpin: -+ au_unpin(pin); -+ out: -+ return wh_dentry; -+} -+ -+/* -+ * when removing a dir, rename it to a unique temporary whiteout-ed name first -+ * in order to be revertible and save time for removing many child whiteouts -+ * under the dir. -+ * returns 1 when there are too many child whiteout and caller should remove -+ * them asynchronously. returns 0 when the number of children is enough small to -+ * remove now or the branch fs is a remote fs. -+ * otherwise return an error. -+ */ -+static int renwh_and_rmdir(struct dentry *dentry, aufs_bindex_t bindex, -+ struct au_nhash *whlist, struct inode *dir) -+{ -+ int rmdir_later, err, dirwh; -+ struct dentry *h_dentry; -+ struct super_block *sb; -+ -+ sb = dentry->d_sb; -+ SiMustAnyLock(sb); -+ h_dentry = au_h_dptr(dentry, bindex); -+ err = au_whtmp_ren(h_dentry, au_sbr(sb, bindex)); -+ if (unlikely(err)) -+ goto out; -+ -+ /* stop monitoring */ -+ au_hn_free(au_hi(dentry->d_inode, bindex)); -+ -+ if (!au_test_fs_remote(h_dentry->d_sb)) { -+ dirwh = au_sbi(sb)->si_dirwh; -+ rmdir_later = (dirwh <= 1); -+ if (!rmdir_later) -+ rmdir_later = au_nhash_test_longer_wh(whlist, bindex, -+ dirwh); -+ if (rmdir_later) -+ return rmdir_later; -+ } -+ -+ err = au_whtmp_rmdir(dir, bindex, h_dentry, whlist); -+ if (unlikely(err)) { -+ AuIOErr("rmdir %.*s, b%d failed, %d. ignored\n", -+ AuDLNPair(h_dentry), bindex, err); -+ err = 0; -+ } -+ -+ out: -+ AuTraceErr(err); -+ return err; -+} -+ -+/* -+ * final procedure for deleting a entry. -+ * maintain dentry and iattr. -+ */ -+static void epilog(struct inode *dir, struct dentry *dentry, -+ aufs_bindex_t bindex) -+{ -+ struct inode *inode; -+ -+ inode = dentry->d_inode; -+ d_drop(dentry); -+ inode->i_ctime = dir->i_ctime; -+ -+ if (atomic_read(&dentry->d_count) == 1) { -+ au_set_h_dptr(dentry, au_dbstart(dentry), NULL); -+ au_update_dbstart(dentry); -+ } -+ if (au_ibstart(dir) == bindex) -+ au_cpup_attr_timesizes(dir); -+ dir->i_version++; -+} -+ -+/* -+ * when an error happened, remove the created whiteout and revert everything. -+ */ -+static int do_revert(int err, struct inode *dir, aufs_bindex_t bwh, -+ struct dentry *wh_dentry, struct dentry *dentry, -+ struct au_dtime *dt) -+{ -+ int rerr; -+ struct path h_path = { -+ .dentry = wh_dentry, -+ .mnt = au_sbr_mnt(dir->i_sb, bwh) -+ }; -+ -+ rerr = au_wh_unlink_dentry(au_h_iptr(dir, bwh), &h_path, dentry); -+ if (!rerr) { -+ au_set_dbwh(dentry, bwh); -+ au_dtime_revert(dt); -+ return 0; -+ } -+ -+ AuIOErr("%.*s reverting whiteout failed(%d, %d)\n", -+ AuDLNPair(dentry), err, rerr); -+ return -EIO; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+int aufs_unlink(struct inode *dir, struct dentry *dentry) -+{ -+ int err; -+ aufs_bindex_t bwh, bindex, bstart; -+ struct au_dtime dt; -+ struct au_pin pin; -+ struct path h_path; -+ struct inode *inode, *h_dir; -+ struct dentry *parent, *wh_dentry; -+ -+ IMustLock(dir); -+ inode = dentry->d_inode; -+ if (unlikely(!inode)) -+ return -ENOENT; /* possible? */ -+ IMustLock(inode); -+ -+ aufs_read_lock(dentry, AuLock_DW); -+ parent = dentry->d_parent; /* dir inode is locked */ -+ di_write_lock_parent(parent); -+ -+ bstart = au_dbstart(dentry); -+ bwh = au_dbwh(dentry); -+ bindex = -1; -+ wh_dentry = lock_hdir_create_wh(dentry, /*isdir*/0, &bindex, &dt, &pin); -+ err = PTR_ERR(wh_dentry); -+ if (IS_ERR(wh_dentry)) -+ goto out; -+ -+ h_path.mnt = au_sbr_mnt(dentry->d_sb, bstart); -+ h_path.dentry = au_h_dptr(dentry, bstart); -+ dget(h_path.dentry); -+ if (bindex == bstart) { -+ h_dir = au_pinned_h_dir(&pin); -+ err = vfsub_unlink(h_dir, &h_path, /*force*/0); -+ } else { -+ /* dir inode is locked */ -+ h_dir = wh_dentry->d_parent->d_inode; -+ IMustLock(h_dir); -+ err = 0; -+ } -+ -+ if (!err) { -+ drop_nlink(inode); -+ epilog(dir, dentry, bindex); -+ -+ /* update target timestamps */ -+ if (bindex == bstart) { -+ vfsub_update_h_iattr(&h_path, /*did*/NULL); /*ignore*/ -+ inode->i_ctime = h_path.dentry->d_inode->i_ctime; -+ } else -+ /* todo: this timestamp may be reverted later */ -+ inode->i_ctime = h_dir->i_ctime; -+ goto out_unlock; /* success */ -+ } -+ -+ /* revert */ -+ if (wh_dentry) { -+ int rerr; -+ -+ rerr = do_revert(err, dir, bwh, wh_dentry, dentry, &dt); -+ if (rerr) -+ err = rerr; -+ } -+ -+ out_unlock: -+ au_unpin(&pin); -+ dput(wh_dentry); -+ dput(h_path.dentry); -+ out: -+ di_write_unlock(parent); -+ aufs_read_unlock(dentry, AuLock_DW); -+ return err; -+} -+ -+int aufs_rmdir(struct inode *dir, struct dentry *dentry) -+{ -+ int err, rmdir_later; -+ aufs_bindex_t bwh, bindex, bstart; -+ struct au_dtime dt; -+ struct au_pin pin; -+ struct inode *inode; -+ struct dentry *parent, *wh_dentry, *h_dentry; -+ struct au_whtmp_rmdir *args; -+ -+ IMustLock(dir); -+ inode = dentry->d_inode; -+ err = -ENOENT; /* possible? */ -+ if (unlikely(!inode)) -+ goto out; -+ IMustLock(inode); -+ -+ aufs_read_lock(dentry, AuLock_DW | AuLock_FLUSH); -+ err = -ENOMEM; -+ args = au_whtmp_rmdir_alloc(dir->i_sb, GFP_NOFS); -+ if (unlikely(!args)) -+ goto out_unlock; -+ -+ parent = dentry->d_parent; /* dir inode is locked */ -+ di_write_lock_parent(parent); -+ err = au_test_empty(dentry, &args->whlist); -+ if (unlikely(err)) -+ goto out_args; -+ -+ bstart = au_dbstart(dentry); -+ bwh = au_dbwh(dentry); -+ bindex = -1; -+ wh_dentry = lock_hdir_create_wh(dentry, /*isdir*/1, &bindex, &dt, &pin); -+ err = PTR_ERR(wh_dentry); -+ if (IS_ERR(wh_dentry)) -+ goto out_args; -+ -+ h_dentry = au_h_dptr(dentry, bstart); -+ dget(h_dentry); -+ rmdir_later = 0; -+ if (bindex == bstart) { -+ err = renwh_and_rmdir(dentry, bstart, &args->whlist, dir); -+ if (err > 0) { -+ rmdir_later = err; -+ err = 0; -+ } -+ } else { -+ /* stop monitoring */ -+ au_hn_free(au_hi(inode, bstart)); -+ -+ /* dir inode is locked */ -+ IMustLock(wh_dentry->d_parent->d_inode); -+ err = 0; -+ } -+ -+ if (!err) { -+ clear_nlink(inode); -+ au_set_dbdiropq(dentry, -1); -+ epilog(dir, dentry, bindex); -+ -+ if (rmdir_later) { -+ au_whtmp_kick_rmdir(dir, bstart, h_dentry, args); -+ args = NULL; -+ } -+ -+ goto out_unpin; /* success */ -+ } -+ -+ /* revert */ -+ AuLabel(revert); -+ if (wh_dentry) { -+ int rerr; -+ -+ rerr = do_revert(err, dir, bwh, wh_dentry, dentry, &dt); -+ if (rerr) -+ err = rerr; -+ } -+ -+ out_unpin: -+ au_unpin(&pin); -+ dput(wh_dentry); -+ dput(h_dentry); -+ out_args: -+ di_write_unlock(parent); -+ if (args) -+ au_whtmp_rmdir_free(args); -+ out_unlock: -+ aufs_read_unlock(dentry, AuLock_DW); -+ out: -+ AuTraceErr(err); -+ return err; -+} -diff -Nur linux-2.6.33.1-vanilla/fs/aufs/i_op_ren.c linux-2.6.33.1/fs/aufs/i_op_ren.c ---- linux-2.6.33.1-vanilla/fs/aufs/i_op_ren.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-2.6.33.1/fs/aufs/i_op_ren.c 2010-04-05 16:53:27.000000000 +0200 -@@ -0,0 +1,977 @@ -+/* -+ * Copyright (C) 2005-2010 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+/* -+ * inode operation (rename entry) -+ * todo: this is crazy monster -+ */ -+ -+#include "aufs.h" -+ -+enum { AuSRC, AuDST, AuSrcDst }; -+enum { AuPARENT, AuCHILD, AuParentChild }; -+ -+#define AuRen_ISDIR 1 -+#define AuRen_ISSAMEDIR (1 << 1) -+#define AuRen_WHSRC (1 << 2) -+#define AuRen_WHDST (1 << 3) -+#define AuRen_MNT_WRITE (1 << 4) -+#define AuRen_DT_DSTDIR (1 << 5) -+#define AuRen_DIROPQ (1 << 6) -+#define AuRen_CPUP (1 << 7) -+#define au_ftest_ren(flags, name) ((flags) & AuRen_##name) -+#define au_fset_ren(flags, name) { (flags) |= AuRen_##name; } -+#define au_fclr_ren(flags, name) { (flags) &= ~AuRen_##name; } -+ -+struct au_ren_args { -+ struct { -+ struct dentry *dentry, *h_dentry, *parent, *h_parent, -+ *wh_dentry; -+ struct inode *dir, *inode; -+ struct au_hinode *hdir; -+ struct au_dtime dt[AuParentChild]; -+ aufs_bindex_t bstart; -+ } sd[AuSrcDst]; -+ -+#define src_dentry sd[AuSRC].dentry -+#define src_dir sd[AuSRC].dir -+#define src_inode sd[AuSRC].inode -+#define src_h_dentry sd[AuSRC].h_dentry -+#define src_parent sd[AuSRC].parent -+#define src_h_parent sd[AuSRC].h_parent -+#define src_wh_dentry sd[AuSRC].wh_dentry -+#define src_hdir sd[AuSRC].hdir -+#define src_h_dir sd[AuSRC].hdir->hi_inode -+#define src_dt sd[AuSRC].dt -+#define src_bstart sd[AuSRC].bstart -+ -+#define dst_dentry sd[AuDST].dentry -+#define dst_dir sd[AuDST].dir -+#define dst_inode sd[AuDST].inode -+#define dst_h_dentry sd[AuDST].h_dentry -+#define dst_parent sd[AuDST].parent -+#define dst_h_parent sd[AuDST].h_parent -+#define dst_wh_dentry sd[AuDST].wh_dentry -+#define dst_hdir sd[AuDST].hdir -+#define dst_h_dir sd[AuDST].hdir->hi_inode -+#define dst_dt sd[AuDST].dt -+#define dst_bstart sd[AuDST].bstart -+ -+ struct dentry *h_trap; -+ struct au_branch *br; -+ struct au_hinode *src_hinode; -+ struct path h_path; -+ struct au_nhash whlist; -+ aufs_bindex_t btgt; -+ -+ unsigned int flags; -+ -+ struct au_whtmp_rmdir *thargs; -+ struct dentry *h_dst; -+}; -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * functions for reverting. -+ * when an error happened in a single rename systemcall, we should revert -+ * everything as if nothing happend. -+ * we don't need to revert the copied-up/down the parent dir since they are -+ * harmless. -+ */ -+ -+#define RevertFailure(fmt, ...) do { \ -+ AuIOErr("revert failure: " fmt " (%d, %d)\n", \ -+ ##__VA_ARGS__, err, rerr); \ -+ err = -EIO; \ -+} while (0) -+ -+static void au_ren_rev_diropq(int err, struct au_ren_args *a) -+{ -+ int rerr; -+ -+ au_hn_imtx_lock_nested(a->src_hinode, AuLsc_I_CHILD); -+ rerr = au_diropq_remove(a->src_dentry, a->btgt); -+ au_hn_imtx_unlock(a->src_hinode); -+ if (rerr) -+ RevertFailure("remove diropq %.*s", AuDLNPair(a->src_dentry)); -+} -+ -+static void au_ren_rev_rename(int err, struct au_ren_args *a) -+{ -+ int rerr; -+ -+ a->h_path.dentry = au_lkup_one(&a->src_dentry->d_name, a->src_h_parent, -+ a->br, /*nd*/NULL); -+ rerr = PTR_ERR(a->h_path.dentry); -+ if (IS_ERR(a->h_path.dentry)) { -+ RevertFailure("au_lkup_one %.*s", AuDLNPair(a->src_dentry)); -+ return; -+ } -+ -+ rerr = vfsub_rename(a->dst_h_dir, -+ au_h_dptr(a->src_dentry, a->btgt), -+ a->src_h_dir, &a->h_path); -+ d_drop(a->h_path.dentry); -+ dput(a->h_path.dentry); -+ /* au_set_h_dptr(a->src_dentry, a->btgt, NULL); */ -+ if (rerr) -+ RevertFailure("rename %.*s", AuDLNPair(a->src_dentry)); -+} -+ -+static void au_ren_rev_cpup(int err, struct au_ren_args *a) -+{ -+ int rerr; -+ -+ a->h_path.dentry = a->dst_h_dentry; -+ rerr = vfsub_unlink(a->dst_h_dir, &a->h_path, /*force*/0); -+ au_set_h_dptr(a->src_dentry, a->btgt, NULL); -+ au_set_dbstart(a->src_dentry, a->src_bstart); -+ if (rerr) -+ RevertFailure("unlink %.*s", AuDLNPair(a->dst_h_dentry)); -+} -+ -+static void au_ren_rev_whtmp(int err, struct au_ren_args *a) -+{ -+ int rerr; -+ -+ a->h_path.dentry = au_lkup_one(&a->dst_dentry->d_name, a->dst_h_parent, -+ a->br, /*nd*/NULL); -+ rerr = PTR_ERR(a->h_path.dentry); -+ if (IS_ERR(a->h_path.dentry)) { -+ RevertFailure("lookup %.*s", AuDLNPair(a->dst_dentry)); -+ return; -+ } -+ if (a->h_path.dentry->d_inode) { -+ d_drop(a->h_path.dentry); -+ dput(a->h_path.dentry); -+ return; -+ } -+ -+ rerr = vfsub_rename(a->dst_h_dir, a->h_dst, a->dst_h_dir, &a->h_path); -+ d_drop(a->h_path.dentry); -+ dput(a->h_path.dentry); -+ if (!rerr) -+ au_set_h_dptr(a->dst_dentry, a->btgt, dget(a->h_dst)); -+ else -+ RevertFailure("rename %.*s", AuDLNPair(a->h_dst)); -+} -+ -+static void au_ren_rev_whsrc(int err, struct au_ren_args *a) -+{ -+ int rerr; -+ -+ a->h_path.dentry = a->src_wh_dentry; -+ rerr = au_wh_unlink_dentry(a->src_h_dir, &a->h_path, a->src_dentry); -+ if (rerr) -+ RevertFailure("unlink %.*s", AuDLNPair(a->src_wh_dentry)); -+} -+ -+static void au_ren_rev_drop(struct au_ren_args *a) -+{ -+ struct dentry *d, *h_d; -+ int i; -+ aufs_bindex_t bend, bindex; -+ -+ for (i = 0; i < AuSrcDst; i++) { -+ d = a->sd[i].dentry; -+ d_drop(d); -+ bend = au_dbend(d); -+ for (bindex = au_dbstart(d); bindex <= bend; bindex++) { -+ h_d = au_h_dptr(d, bindex); -+ if (h_d) -+ d_drop(h_d); -+ } -+ } -+ -+ au_update_dbstart(a->dst_dentry); -+ if (a->thargs) -+ d_drop(a->h_dst); -+} -+#undef RevertFailure -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * when we have to copyup the renaming entry, do it with the rename-target name -+ * in order to minimize the cost (the later actual rename is unnecessary). -+ * otherwise rename it on the target branch. -+ */ -+static int au_ren_or_cpup(struct au_ren_args *a) -+{ -+ int err; -+ struct dentry *d; -+ -+ d = a->src_dentry; -+ if (au_dbstart(d) == a->btgt) { -+ a->h_path.dentry = a->dst_h_dentry; -+ if (au_ftest_ren(a->flags, DIROPQ) -+ && au_dbdiropq(d) == a->btgt) -+ au_fclr_ren(a->flags, DIROPQ); -+ AuDebugOn(au_dbstart(d) != a->btgt); -+ err = vfsub_rename(a->src_h_dir, au_h_dptr(d, a->btgt), -+ a->dst_h_dir, &a->h_path); -+ } else { -+ struct mutex *h_mtx = &a->src_h_dentry->d_inode->i_mutex; -+ struct file *h_file; -+ -+ au_fset_ren(a->flags, CPUP); -+ mutex_lock_nested(h_mtx, AuLsc_I_CHILD); -+ au_set_dbstart(d, a->btgt); -+ au_set_h_dptr(d, a->btgt, dget(a->dst_h_dentry)); -+ h_file = au_h_open_pre(d, a->src_bstart); -+ if (IS_ERR(h_file)) { -+ err = PTR_ERR(h_file); -+ h_file = NULL; -+ } else -+ err = au_sio_cpup_single(d, a->btgt, a->src_bstart, -1, -+ !AuCpup_DTIME, a->dst_parent); -+ mutex_unlock(h_mtx); -+ au_h_open_post(d, a->src_bstart, h_file); -+ if (!err) { -+ d = a->dst_dentry; -+ au_set_h_dptr(d, a->btgt, NULL); -+ au_update_dbstart(d); -+ } else { -+ au_set_h_dptr(d, a->btgt, NULL); -+ au_set_dbstart(d, a->src_bstart); -+ } -+ } -+ -+ return err; -+} -+ -+/* cf. aufs_rmdir() */ -+static int au_ren_del_whtmp(struct au_ren_args *a) -+{ -+ int err; -+ struct inode *dir; -+ -+ dir = a->dst_dir; -+ SiMustAnyLock(dir->i_sb); -+ if (!au_nhash_test_longer_wh(&a->whlist, a->btgt, -+ au_sbi(dir->i_sb)->si_dirwh) -+ || au_test_fs_remote(a->h_dst->d_sb)) { -+ err = au_whtmp_rmdir(dir, a->btgt, a->h_dst, &a->whlist); -+ if (unlikely(err)) -+ pr_warning("failed removing whtmp dir %.*s (%d), " -+ "ignored.\n", AuDLNPair(a->h_dst), err); -+ } else { -+ au_nhash_wh_free(&a->thargs->whlist); -+ a->thargs->whlist = a->whlist; -+ a->whlist.nh_num = 0; -+ au_whtmp_kick_rmdir(dir, a->btgt, a->h_dst, a->thargs); -+ dput(a->h_dst); -+ a->thargs = NULL; -+ } -+ -+ return 0; -+} -+ -+/* make it 'opaque' dir. */ -+static int au_ren_diropq(struct au_ren_args *a) -+{ -+ int err; -+ struct dentry *diropq; -+ -+ err = 0; -+ a->src_hinode = au_hi(a->src_inode, a->btgt); -+ au_hn_imtx_lock_nested(a->src_hinode, AuLsc_I_CHILD); -+ diropq = au_diropq_create(a->src_dentry, a->btgt); -+ au_hn_imtx_unlock(a->src_hinode); -+ if (IS_ERR(diropq)) -+ err = PTR_ERR(diropq); -+ dput(diropq); -+ -+ return err; -+} -+ -+static int do_rename(struct au_ren_args *a) -+{ -+ int err; -+ struct dentry *d, *h_d; -+ -+ /* prepare workqueue args for asynchronous rmdir */ -+ h_d = a->dst_h_dentry; -+ if (au_ftest_ren(a->flags, ISDIR) && h_d->d_inode) { -+ err = -ENOMEM; -+ a->thargs = au_whtmp_rmdir_alloc(a->src_dentry->d_sb, GFP_NOFS); -+ if (unlikely(!a->thargs)) -+ goto out; -+ a->h_dst = dget(h_d); -+ } -+ -+ /* create whiteout for src_dentry */ -+ if (au_ftest_ren(a->flags, WHSRC)) { -+ a->src_wh_dentry -+ = au_wh_create(a->src_dentry, a->btgt, a->src_h_parent); -+ err = PTR_ERR(a->src_wh_dentry); -+ if (IS_ERR(a->src_wh_dentry)) -+ goto out_thargs; -+ } -+ -+ /* lookup whiteout for dentry */ -+ if (au_ftest_ren(a->flags, WHDST)) { -+ h_d = au_wh_lkup(a->dst_h_parent, &a->dst_dentry->d_name, -+ a->br); -+ err = PTR_ERR(h_d); -+ if (IS_ERR(h_d)) -+ goto out_whsrc; -+ if (!h_d->d_inode) -+ dput(h_d); -+ else -+ a->dst_wh_dentry = h_d; -+ } -+ -+ /* rename dentry to tmpwh */ -+ if (a->thargs) { -+ err = au_whtmp_ren(a->dst_h_dentry, a->br); -+ if (unlikely(err)) -+ goto out_whdst; -+ -+ d = a->dst_dentry; -+ au_set_h_dptr(d, a->btgt, NULL); -+ err = au_lkup_neg(d, a->btgt); -+ if (unlikely(err)) -+ goto out_whtmp; -+ a->dst_h_dentry = au_h_dptr(d, a->btgt); -+ } -+ -+ /* cpup src */ -+ if (a->dst_h_dentry->d_inode && a->src_bstart != a->btgt) { -+ struct mutex *h_mtx = &a->src_h_dentry->d_inode->i_mutex; -+ struct file *h_file; -+ -+ mutex_lock_nested(h_mtx, AuLsc_I_CHILD); -+ AuDebugOn(au_dbstart(a->src_dentry) != a->src_bstart); -+ h_file = au_h_open_pre(a->src_dentry, a->src_bstart); -+ if (IS_ERR(h_file)) { -+ err = PTR_ERR(h_file); -+ h_file = NULL; -+ } else -+ err = au_sio_cpup_simple(a->src_dentry, a->btgt, -1, -+ !AuCpup_DTIME); -+ mutex_unlock(h_mtx); -+ au_h_open_post(a->src_dentry, a->src_bstart, h_file); -+ if (unlikely(err)) -+ goto out_whtmp; -+ } -+ -+ /* rename by vfs_rename or cpup */ -+ d = a->dst_dentry; -+ if (au_ftest_ren(a->flags, ISDIR) -+ && (a->dst_wh_dentry -+ || au_dbdiropq(d) == a->btgt -+ /* hide the lower to keep xino */ -+ || a->btgt < au_dbend(d) -+ || au_opt_test(au_mntflags(d->d_sb), ALWAYS_DIROPQ))) -+ au_fset_ren(a->flags, DIROPQ); -+ err = au_ren_or_cpup(a); -+ if (unlikely(err)) -+ /* leave the copied-up one */ -+ goto out_whtmp; -+ -+ /* make dir opaque */ -+ if (au_ftest_ren(a->flags, DIROPQ)) { -+ err = au_ren_diropq(a); -+ if (unlikely(err)) -+ goto out_rename; -+ } -+ -+ /* update target timestamps */ -+ AuDebugOn(au_dbstart(a->src_dentry) != a->btgt); -+ a->h_path.dentry = au_h_dptr(a->src_dentry, a->btgt); -+ vfsub_update_h_iattr(&a->h_path, /*did*/NULL); /*ignore*/ -+ a->src_inode->i_ctime = a->h_path.dentry->d_inode->i_ctime; -+ -+ /* remove whiteout for dentry */ -+ if (a->dst_wh_dentry) { -+ a->h_path.dentry = a->dst_wh_dentry; -+ err = au_wh_unlink_dentry(a->dst_h_dir, &a->h_path, -+ a->dst_dentry); -+ if (unlikely(err)) -+ goto out_diropq; -+ } -+ -+ /* remove whtmp */ -+ if (a->thargs) -+ au_ren_del_whtmp(a); /* ignore this error */ -+ -+ err = 0; -+ goto out_success; -+ -+ out_diropq: -+ if (au_ftest_ren(a->flags, DIROPQ)) -+ au_ren_rev_diropq(err, a); -+ out_rename: -+ if (!au_ftest_ren(a->flags, CPUP)) -+ au_ren_rev_rename(err, a); -+ else -+ au_ren_rev_cpup(err, a); -+ out_whtmp: -+ if (a->thargs) -+ au_ren_rev_whtmp(err, a); -+ out_whdst: -+ dput(a->dst_wh_dentry); -+ a->dst_wh_dentry = NULL; -+ out_whsrc: -+ if (a->src_wh_dentry) -+ au_ren_rev_whsrc(err, a); -+ au_ren_rev_drop(a); -+ out_success: -+ dput(a->src_wh_dentry); -+ dput(a->dst_wh_dentry); -+ out_thargs: -+ if (a->thargs) { -+ dput(a->h_dst); -+ au_whtmp_rmdir_free(a->thargs); -+ a->thargs = NULL; -+ } -+ out: -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * test if @dentry dir can be rename destination or not. -+ * success means, it is a logically empty dir. -+ */ -+static int may_rename_dstdir(struct dentry *dentry, struct au_nhash *whlist) -+{ -+ return au_test_empty(dentry, whlist); -+} -+ -+/* -+ * test if @dentry dir can be rename source or not. -+ * if it can, return 0 and @children is filled. -+ * success means, -+ * - it is a logically empty dir. -+ * - or, it exists on writable branch and has no children including whiteouts -+ * on the lower branch. -+ */ -+static int may_rename_srcdir(struct dentry *dentry, aufs_bindex_t btgt) -+{ -+ int err; -+ unsigned int rdhash; -+ aufs_bindex_t bstart; -+ -+ bstart = au_dbstart(dentry); -+ if (bstart != btgt) { -+ struct au_nhash whlist; -+ -+ SiMustAnyLock(dentry->d_sb); -+ rdhash = au_sbi(dentry->d_sb)->si_rdhash; -+ if (!rdhash) -+ rdhash = au_rdhash_est(au_dir_size(/*file*/NULL, -+ dentry)); -+ err = au_nhash_alloc(&whlist, rdhash, GFP_NOFS); -+ if (unlikely(err)) -+ goto out; -+ err = au_test_empty(dentry, &whlist); -+ au_nhash_wh_free(&whlist); -+ goto out; -+ } -+ -+ if (bstart == au_dbtaildir(dentry)) -+ return 0; /* success */ -+ -+ err = au_test_empty_lower(dentry); -+ -+ out: -+ if (err == -ENOTEMPTY) { -+ AuWarn1("renaming dir who has child(ren) on multiple branches," -+ " is not supported\n"); -+ err = -EXDEV; -+ } -+ return err; -+} -+ -+/* side effect: sets whlist and h_dentry */ -+static int au_ren_may_dir(struct au_ren_args *a) -+{ -+ int err; -+ unsigned int rdhash; -+ struct dentry *d; -+ -+ d = a->dst_dentry; -+ SiMustAnyLock(d->d_sb); -+ -+ err = 0; -+ if (au_ftest_ren(a->flags, ISDIR) && a->dst_inode) { -+ rdhash = au_sbi(d->d_sb)->si_rdhash; -+ if (!rdhash) -+ rdhash = au_rdhash_est(au_dir_size(/*file*/NULL, d)); -+ err = au_nhash_alloc(&a->whlist, rdhash, GFP_NOFS); -+ if (unlikely(err)) -+ goto out; -+ -+ au_set_dbstart(d, a->dst_bstart); -+ err = may_rename_dstdir(d, &a->whlist); -+ au_set_dbstart(d, a->btgt); -+ } -+ a->dst_h_dentry = au_h_dptr(d, au_dbstart(d)); -+ if (unlikely(err)) -+ goto out; -+ -+ d = a->src_dentry; -+ a->src_h_dentry = au_h_dptr(d, au_dbstart(d)); -+ if (au_ftest_ren(a->flags, ISDIR)) { -+ err = may_rename_srcdir(d, a->btgt); -+ if (unlikely(err)) { -+ au_nhash_wh_free(&a->whlist); -+ a->whlist.nh_num = 0; -+ } -+ } -+ out: -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * simple tests for rename. -+ * following the checks in vfs, plus the parent-child relationship. -+ */ -+static int au_may_ren(struct au_ren_args *a) -+{ -+ int err, isdir; -+ struct inode *h_inode; -+ -+ if (a->src_bstart == a->btgt) { -+ err = au_may_del(a->src_dentry, a->btgt, a->src_h_parent, -+ au_ftest_ren(a->flags, ISDIR)); -+ if (unlikely(err)) -+ goto out; -+ err = -EINVAL; -+ if (unlikely(a->src_h_dentry == a->h_trap)) -+ goto out; -+ } -+ -+ err = 0; -+ if (a->dst_bstart != a->btgt) -+ goto out; -+ -+ err = -EIO; -+ h_inode = a->dst_h_dentry->d_inode; -+ isdir = !!au_ftest_ren(a->flags, ISDIR); -+ if (!a->dst_dentry->d_inode) { -+ if (unlikely(h_inode)) -+ goto out; -+ err = au_may_add(a->dst_dentry, a->btgt, a->dst_h_parent, -+ isdir); -+ } else { -+ if (unlikely(!h_inode || !h_inode->i_nlink)) -+ goto out; -+ err = au_may_del(a->dst_dentry, a->btgt, a->dst_h_parent, -+ isdir); -+ if (unlikely(err)) -+ goto out; -+ err = -ENOTEMPTY; -+ if (unlikely(a->dst_h_dentry == a->h_trap)) -+ goto out; -+ err = 0; -+ } -+ -+ out: -+ if (unlikely(err == -ENOENT || err == -EEXIST)) -+ err = -EIO; -+ AuTraceErr(err); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * locking order -+ * (VFS) -+ * - src_dir and dir by lock_rename() -+ * - inode if exitsts -+ * (aufs) -+ * - lock all -+ * + src_dentry and dentry by aufs_read_and_write_lock2() which calls, -+ * + si_read_lock -+ * + di_write_lock2_child() -+ * + di_write_lock_child() -+ * + ii_write_lock_child() -+ * + di_write_lock_child2() -+ * + ii_write_lock_child2() -+ * + src_parent and parent -+ * + di_write_lock_parent() -+ * + ii_write_lock_parent() -+ * + di_write_lock_parent2() -+ * + ii_write_lock_parent2() -+ * + lower src_dir and dir by vfsub_lock_rename() -+ * + verify the every relationships between child and parent. if any -+ * of them failed, unlock all and return -EBUSY. -+ */ -+static void au_ren_unlock(struct au_ren_args *a) -+{ -+ struct super_block *sb; -+ -+ sb = a->dst_dentry->d_sb; -+ if (au_ftest_ren(a->flags, MNT_WRITE)) -+ mnt_drop_write(a->br->br_mnt); -+ vfsub_unlock_rename(a->src_h_parent, a->src_hdir, -+ a->dst_h_parent, a->dst_hdir); -+} -+ -+static int au_ren_lock(struct au_ren_args *a) -+{ -+ int err; -+ unsigned int udba; -+ -+ err = 0; -+ a->src_h_parent = au_h_dptr(a->src_parent, a->btgt); -+ a->src_hdir = au_hi(a->src_dir, a->btgt); -+ a->dst_h_parent = au_h_dptr(a->dst_parent, a->btgt); -+ a->dst_hdir = au_hi(a->dst_dir, a->btgt); -+ a->h_trap = vfsub_lock_rename(a->src_h_parent, a->src_hdir, -+ a->dst_h_parent, a->dst_hdir); -+ udba = au_opt_udba(a->src_dentry->d_sb); -+ if (unlikely(a->src_hdir->hi_inode != a->src_h_parent->d_inode -+ || a->dst_hdir->hi_inode != a->dst_h_parent->d_inode)) -+ err = au_busy_or_stale(); -+ if (!err && au_dbstart(a->src_dentry) == a->btgt) -+ err = au_h_verify(a->src_h_dentry, udba, -+ a->src_h_parent->d_inode, a->src_h_parent, -+ a->br); -+ if (!err && au_dbstart(a->dst_dentry) == a->btgt) -+ err = au_h_verify(a->dst_h_dentry, udba, -+ a->dst_h_parent->d_inode, a->dst_h_parent, -+ a->br); -+ if (!err) { -+ err = mnt_want_write(a->br->br_mnt); -+ if (unlikely(err)) -+ goto out_unlock; -+ au_fset_ren(a->flags, MNT_WRITE); -+ goto out; /* success */ -+ } -+ -+ err = au_busy_or_stale(); -+ -+ out_unlock: -+ au_ren_unlock(a); -+ out: -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static void au_ren_refresh_dir(struct au_ren_args *a) -+{ -+ struct inode *dir; -+ -+ dir = a->dst_dir; -+ dir->i_version++; -+ if (au_ftest_ren(a->flags, ISDIR)) { -+ /* is this updating defined in POSIX? */ -+ au_cpup_attr_timesizes(a->src_inode); -+ au_cpup_attr_nlink(dir, /*force*/1); -+ if (a->dst_inode) { -+ clear_nlink(a->dst_inode); -+ au_cpup_attr_timesizes(a->dst_inode); -+ } -+ } -+ if (au_ibstart(dir) == a->btgt) -+ au_cpup_attr_timesizes(dir); -+ -+ if (au_ftest_ren(a->flags, ISSAMEDIR)) -+ return; -+ -+ dir = a->src_dir; -+ dir->i_version++; -+ if (au_ftest_ren(a->flags, ISDIR)) -+ au_cpup_attr_nlink(dir, /*force*/1); -+ if (au_ibstart(dir) == a->btgt) -+ au_cpup_attr_timesizes(dir); -+} -+ -+static void au_ren_refresh(struct au_ren_args *a) -+{ -+ aufs_bindex_t bend, bindex; -+ struct dentry *d, *h_d; -+ struct inode *i, *h_i; -+ struct super_block *sb; -+ -+ d = a->src_dentry; -+ au_set_dbwh(d, -1); -+ bend = au_dbend(d); -+ for (bindex = a->btgt + 1; bindex <= bend; bindex++) { -+ h_d = au_h_dptr(d, bindex); -+ if (h_d) -+ au_set_h_dptr(d, bindex, NULL); -+ } -+ au_set_dbend(d, a->btgt); -+ -+ sb = d->d_sb; -+ i = a->src_inode; -+ if (au_opt_test(au_mntflags(sb), PLINK) && au_plink_test(i)) -+ return; /* success */ -+ -+ bend = au_ibend(i); -+ for (bindex = a->btgt + 1; bindex <= bend; bindex++) { -+ h_i = au_h_iptr(i, bindex); -+ if (h_i) { -+ au_xino_write(sb, bindex, h_i->i_ino, /*ino*/0); -+ /* ignore this error */ -+ au_set_h_iptr(i, bindex, NULL, 0); -+ } -+ } -+ au_set_ibend(i, a->btgt); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* mainly for link(2) and rename(2) */ -+int au_wbr(struct dentry *dentry, aufs_bindex_t btgt) -+{ -+ aufs_bindex_t bdiropq, bwh; -+ struct dentry *parent; -+ struct au_branch *br; -+ -+ parent = dentry->d_parent; -+ IMustLock(parent->d_inode); /* dir is locked */ -+ -+ bdiropq = au_dbdiropq(parent); -+ bwh = au_dbwh(dentry); -+ br = au_sbr(dentry->d_sb, btgt); -+ if (au_br_rdonly(br) -+ || (0 <= bdiropq && bdiropq < btgt) -+ || (0 <= bwh && bwh < btgt)) -+ btgt = -1; -+ -+ AuDbg("btgt %d\n", btgt); -+ return btgt; -+} -+ -+/* sets src_bstart, dst_bstart and btgt */ -+static int au_ren_wbr(struct au_ren_args *a) -+{ -+ int err; -+ struct au_wr_dir_args wr_dir_args = { -+ /* .force_btgt = -1, */ -+ .flags = AuWrDir_ADD_ENTRY -+ }; -+ -+ a->src_bstart = au_dbstart(a->src_dentry); -+ a->dst_bstart = au_dbstart(a->dst_dentry); -+ if (au_ftest_ren(a->flags, ISDIR)) -+ au_fset_wrdir(wr_dir_args.flags, ISDIR); -+ wr_dir_args.force_btgt = a->src_bstart; -+ if (a->dst_inode && a->dst_bstart < a->src_bstart) -+ wr_dir_args.force_btgt = a->dst_bstart; -+ wr_dir_args.force_btgt = au_wbr(a->dst_dentry, wr_dir_args.force_btgt); -+ err = au_wr_dir(a->dst_dentry, a->src_dentry, &wr_dir_args); -+ a->btgt = err; -+ -+ return err; -+} -+ -+static void au_ren_dt(struct au_ren_args *a) -+{ -+ a->h_path.dentry = a->src_h_parent; -+ au_dtime_store(a->src_dt + AuPARENT, a->src_parent, &a->h_path); -+ if (!au_ftest_ren(a->flags, ISSAMEDIR)) { -+ a->h_path.dentry = a->dst_h_parent; -+ au_dtime_store(a->dst_dt + AuPARENT, a->dst_parent, &a->h_path); -+ } -+ -+ au_fclr_ren(a->flags, DT_DSTDIR); -+ if (!au_ftest_ren(a->flags, ISDIR)) -+ return; -+ -+ a->h_path.dentry = a->src_h_dentry; -+ au_dtime_store(a->src_dt + AuCHILD, a->src_dentry, &a->h_path); -+ if (a->dst_h_dentry->d_inode) { -+ au_fset_ren(a->flags, DT_DSTDIR); -+ a->h_path.dentry = a->dst_h_dentry; -+ au_dtime_store(a->dst_dt + AuCHILD, a->dst_dentry, &a->h_path); -+ } -+} -+ -+static void au_ren_rev_dt(int err, struct au_ren_args *a) -+{ -+ struct dentry *h_d; -+ struct mutex *h_mtx; -+ -+ au_dtime_revert(a->src_dt + AuPARENT); -+ if (!au_ftest_ren(a->flags, ISSAMEDIR)) -+ au_dtime_revert(a->dst_dt + AuPARENT); -+ -+ if (au_ftest_ren(a->flags, ISDIR) && err != -EIO) { -+ h_d = a->src_dt[AuCHILD].dt_h_path.dentry; -+ h_mtx = &h_d->d_inode->i_mutex; -+ mutex_lock_nested(h_mtx, AuLsc_I_CHILD); -+ au_dtime_revert(a->src_dt + AuCHILD); -+ mutex_unlock(h_mtx); -+ -+ if (au_ftest_ren(a->flags, DT_DSTDIR)) { -+ h_d = a->dst_dt[AuCHILD].dt_h_path.dentry; -+ h_mtx = &h_d->d_inode->i_mutex; -+ mutex_lock_nested(h_mtx, AuLsc_I_CHILD); -+ au_dtime_revert(a->dst_dt + AuCHILD); -+ mutex_unlock(h_mtx); -+ } -+ } -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+int aufs_rename(struct inode *_src_dir, struct dentry *_src_dentry, -+ struct inode *_dst_dir, struct dentry *_dst_dentry) -+{ -+ int err; -+ /* reduce stack space */ -+ struct au_ren_args *a; -+ -+ AuDbg("%.*s, %.*s\n", AuDLNPair(_src_dentry), AuDLNPair(_dst_dentry)); -+ IMustLock(_src_dir); -+ IMustLock(_dst_dir); -+ -+ err = -ENOMEM; -+ BUILD_BUG_ON(sizeof(*a) > PAGE_SIZE); -+ a = kzalloc(sizeof(*a), GFP_NOFS); -+ if (unlikely(!a)) -+ goto out; -+ -+ a->src_dir = _src_dir; -+ a->src_dentry = _src_dentry; -+ a->src_inode = a->src_dentry->d_inode; -+ a->src_parent = a->src_dentry->d_parent; /* dir inode is locked */ -+ a->dst_dir = _dst_dir; -+ a->dst_dentry = _dst_dentry; -+ a->dst_inode = a->dst_dentry->d_inode; -+ a->dst_parent = a->dst_dentry->d_parent; /* dir inode is locked */ -+ if (a->dst_inode) { -+ IMustLock(a->dst_inode); -+ au_igrab(a->dst_inode); -+ } -+ -+ err = -ENOTDIR; -+ if (S_ISDIR(a->src_inode->i_mode)) { -+ au_fset_ren(a->flags, ISDIR); -+ if (unlikely(a->dst_inode && !S_ISDIR(a->dst_inode->i_mode))) -+ goto out_free; -+ aufs_read_and_write_lock2(a->dst_dentry, a->src_dentry, -+ AuLock_DIR | AuLock_FLUSH); -+ } else -+ aufs_read_and_write_lock2(a->dst_dentry, a->src_dentry, -+ AuLock_FLUSH); -+ -+ au_fset_ren(a->flags, ISSAMEDIR); /* temporary */ -+ di_write_lock_parent(a->dst_parent); -+ -+ /* which branch we process */ -+ err = au_ren_wbr(a); -+ if (unlikely(err < 0)) -+ goto out_unlock; -+ a->br = au_sbr(a->dst_dentry->d_sb, a->btgt); -+ a->h_path.mnt = a->br->br_mnt; -+ -+ /* are they available to be renamed */ -+ err = au_ren_may_dir(a); -+ if (unlikely(err)) -+ goto out_children; -+ -+ /* prepare the writable parent dir on the same branch */ -+ if (a->dst_bstart == a->btgt) { -+ au_fset_ren(a->flags, WHDST); -+ } else { -+ err = au_cpup_dirs(a->dst_dentry, a->btgt); -+ if (unlikely(err)) -+ goto out_children; -+ } -+ -+ if (a->src_dir != a->dst_dir) { -+ /* -+ * this temporary unlock is safe, -+ * because both dir->i_mutex are locked. -+ */ -+ di_write_unlock(a->dst_parent); -+ di_write_lock_parent(a->src_parent); -+ err = au_wr_dir_need_wh(a->src_dentry, -+ au_ftest_ren(a->flags, ISDIR), -+ &a->btgt); -+ di_write_unlock(a->src_parent); -+ di_write_lock2_parent(a->src_parent, a->dst_parent, /*isdir*/1); -+ au_fclr_ren(a->flags, ISSAMEDIR); -+ } else -+ err = au_wr_dir_need_wh(a->src_dentry, -+ au_ftest_ren(a->flags, ISDIR), -+ &a->btgt); -+ if (unlikely(err < 0)) -+ goto out_children; -+ if (err) -+ au_fset_ren(a->flags, WHSRC); -+ -+ /* lock them all */ -+ err = au_ren_lock(a); -+ if (unlikely(err)) -+ goto out_children; -+ -+ if (!au_opt_test(au_mntflags(a->dst_dir->i_sb), UDBA_NONE)) -+ err = au_may_ren(a); -+ else if (unlikely(a->dst_dentry->d_name.len > AUFS_MAX_NAMELEN)) -+ err = -ENAMETOOLONG; -+ if (unlikely(err)) -+ goto out_hdir; -+ -+ /* store timestamps to be revertible */ -+ au_ren_dt(a); -+ -+ /* here we go */ -+ err = do_rename(a); -+ if (unlikely(err)) -+ goto out_dt; -+ -+ /* update dir attributes */ -+ au_ren_refresh_dir(a); -+ -+ /* dput/iput all lower dentries */ -+ au_ren_refresh(a); -+ -+ goto out_hdir; /* success */ -+ -+ out_dt: -+ au_ren_rev_dt(err, a); -+ out_hdir: -+ au_ren_unlock(a); -+ out_children: -+ au_nhash_wh_free(&a->whlist); -+ out_unlock: -+ if (unlikely(err && au_ftest_ren(a->flags, ISDIR))) { -+ au_update_dbstart(a->dst_dentry); -+ d_drop(a->dst_dentry); -+ } -+ if (!err) -+ d_move(a->src_dentry, a->dst_dentry); -+ if (au_ftest_ren(a->flags, ISSAMEDIR)) -+ di_write_unlock(a->dst_parent); -+ else -+ di_write_unlock2(a->src_parent, a->dst_parent); -+ aufs_read_and_write_unlock2(a->dst_dentry, a->src_dentry); -+ out_free: -+ iput(a->dst_inode); -+ if (a->thargs) -+ au_whtmp_rmdir_free(a->thargs); -+ kfree(a); -+ out: -+ AuTraceErr(err); -+ return err; -+} -diff -Nur linux-2.6.33.1-vanilla/fs/aufs/Kconfig linux-2.6.33.1/fs/aufs/Kconfig ---- linux-2.6.33.1-vanilla/fs/aufs/Kconfig 1970-01-01 01:00:00.000000000 +0100 -+++ linux-2.6.33.1/fs/aufs/Kconfig 2010-04-05 16:53:27.000000000 +0200 -@@ -0,0 +1,172 @@ -+config AUFS_FS -+ tristate "Aufs (Advanced multi layered unification filesystem) support" -+ depends on EXPERIMENTAL -+ help -+ Aufs is a stackable unification filesystem such as Unionfs, -+ which unifies several directories and provides a merged single -+ directory. -+ In the early days, aufs was entirely re-designed and -+ re-implemented Unionfs Version 1.x series. Introducing many -+ original ideas, approaches and improvements, it becomes totally -+ different from Unionfs while keeping the basic features. -+ -+if AUFS_FS -+choice -+ prompt "Maximum number of branches" -+ default AUFS_BRANCH_MAX_127 -+ help -+ Specifies the maximum number of branches (or member directories) -+ in a single aufs. The larger value consumes more system -+ resources and has a minor impact to performance. -+config AUFS_BRANCH_MAX_127 -+ bool "127" -+ help -+ Specifies the maximum number of branches (or member directories) -+ in a single aufs. The larger value consumes more system -+ resources and has a minor impact to performance. -+config AUFS_BRANCH_MAX_511 -+ bool "511" -+ help -+ Specifies the maximum number of branches (or member directories) -+ in a single aufs. The larger value consumes more system -+ resources and has a minor impact to performance. -+config AUFS_BRANCH_MAX_1023 -+ bool "1023" -+ help -+ Specifies the maximum number of branches (or member directories) -+ in a single aufs. The larger value consumes more system -+ resources and has a minor impact to performance. -+config AUFS_BRANCH_MAX_32767 -+ bool "32767" -+ help -+ Specifies the maximum number of branches (or member directories) -+ in a single aufs. The larger value consumes more system -+ resources and has a minor impact to performance. -+endchoice -+ -+config AUFS_HNOTIFY -+ bool "Detect direct branch access (bypassing aufs)" -+ help -+ If you want to modify files on branches directly, eg. bypassing aufs, -+ and want aufs to detect the changes of them fully, then enable this -+ option and use 'udba=notify' mount option. -+ It will have a negative impact to the performance. -+ See detail in aufs.5. -+ -+if AUFS_HNOTIFY -+choice -+ prompt "" -+ default AUFS_HFSNOTIFY -+config AUFS_HFSNOTIFY -+ bool "fsnotify" -+ select FSNOTIFY -+config AUFS_HINOTIFY -+ bool "inotify (DEPRECATED)" -+ depends on INOTIFY -+endchoice -+endif -+ -+config AUFS_EXPORT -+ bool "NFS-exportable aufs" -+ depends on (AUFS_FS = y && EXPORTFS = y) || (AUFS_FS = m && EXPORTFS) -+ help -+ If you want to export your mounted aufs via NFS, then enable this -+ option. There are several requirements for this configuration. -+ See detail in aufs.5. -+ -+config AUFS_INO_T_64 -+ bool -+ depends on AUFS_EXPORT -+ depends on 64BIT && !(ALPHA || S390) -+ default y -+ help -+ Automatic configuration for internal use. -+ /* typedef unsigned long/int __kernel_ino_t */ -+ /* alpha and s390x are int */ -+ -+config AUFS_RDU -+ bool "Readdir in userspace" -+ help -+ If you have millions of files under a single aufs directory, and -+ meet the out of memory, then enable this option and set -+ environment variables for your readdir(3). -+ See detail in aufs.5. -+ -+config AUFS_SP_IATTR -+ bool "Respect the attributes (mtime/ctime mainly) of special files" -+ help -+ When you write something to a special file, some attributes of it -+ (mtime/ctime mainly) may be updated. Generally such updates are -+ less important (actually some device drivers and NFS ignore -+ it). But some applications (such like test program) requires -+ such updates. If you need these updates, then enable this -+ configuration which introduces some overhead. -+ Currently this configuration handles FIFO only. -+ -+config AUFS_SHWH -+ bool "Show whiteouts" -+ help -+ If you want to make the whiteouts in aufs visible, then enable -+ this option and specify 'shwh' mount option. Although it may -+ sounds like philosophy or something, but in technically it -+ simply shows the name of whiteout with keeping its behaviour. -+ -+config AUFS_BR_RAMFS -+ bool "Ramfs (initramfs/rootfs) as an aufs branch" -+ help -+ If you want to use ramfs as an aufs branch fs, then enable this -+ option. Generally tmpfs is recommended. -+ Aufs prohibited them to be a branch fs by default, because -+ initramfs becomes unusable after switch_root or something -+ generally. If you sets initramfs as an aufs branch and boot your -+ system by switch_root, you will meet a problem easily since the -+ files in initramfs may be inaccessible. -+ Unless you are going to use ramfs as an aufs branch fs without -+ switch_root or something, leave it N. -+ -+config AUFS_BR_FUSE -+ bool "Fuse fs as an aufs branch" -+ depends on FUSE_FS -+ select AUFS_POLL -+ help -+ If you want to use fuse-based userspace filesystem as an aufs -+ branch fs, then enable this option. -+ It implements the internal poll(2) operation which is -+ implemented by fuse only (curretnly). -+ -+config AUFS_POLL -+ bool -+ help -+ Automatic configuration for internal use. -+ -+config AUFS_BR_HFSPLUS -+ bool "Hfsplus as an aufs branch" -+ depends on HFSPLUS_FS -+ default y -+ help -+ If you want to use hfsplus fs as an aufs branch fs, then enable -+ this option. This option introduces a small overhead at -+ copying-up a file on hfsplus. -+ -+config AUFS_BDEV_LOOP -+ bool -+ depends on BLK_DEV_LOOP -+ default y -+ help -+ Automatic configuration for internal use. -+ Convert =[ym] into =y. -+ -+config AUFS_DEBUG -+ bool "Debug aufs" -+ help -+ Enable this to compile aufs internal debug code. -+ It will have a negative impact to the performance. -+ -+config AUFS_MAGIC_SYSRQ -+ bool -+ depends on AUFS_DEBUG && MAGIC_SYSRQ -+ default y -+ help -+ Automatic configuration for internal use. -+ When aufs supports Magic SysRq, enabled automatically. -+endif -diff -Nur linux-2.6.33.1-vanilla/fs/aufs/loop.c linux-2.6.33.1/fs/aufs/loop.c ---- linux-2.6.33.1-vanilla/fs/aufs/loop.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-2.6.33.1/fs/aufs/loop.c 2010-04-05 16:53:27.000000000 +0200 -@@ -0,0 +1,55 @@ -+/* -+ * Copyright (C) 2005-2010 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+/* -+ * support for loopback block device as a branch -+ */ -+ -+#include -+#include "aufs.h" -+ -+/* -+ * test if two lower dentries have overlapping branches. -+ */ -+int au_test_loopback_overlap(struct super_block *sb, struct dentry *h_d1, -+ struct dentry *h_d2) -+{ -+ struct inode *h_inode; -+ struct loop_device *l; -+ -+ h_inode = h_d1->d_inode; -+ if (MAJOR(h_inode->i_sb->s_dev) != LOOP_MAJOR) -+ return 0; -+ -+ l = h_inode->i_sb->s_bdev->bd_disk->private_data; -+ h_d1 = l->lo_backing_file->f_dentry; -+ /* h_d1 can be local NFS. in this case aufs cannot detect the loop */ -+ if (unlikely(h_d1->d_sb == sb)) -+ return 1; -+ return !!au_test_subdir(h_d1, h_d2); -+} -+ -+/* true if a kernel thread named 'loop[0-9].*' accesses a file */ -+int au_test_loopback_kthread(void) -+{ -+ const char c = current->comm[4]; -+ -+ return current->mm == NULL -+ && '0' <= c && c <= '9' -+ && strncmp(current->comm, "loop", 4) == 0; -+} -diff -Nur linux-2.6.33.1-vanilla/fs/aufs/loop.h linux-2.6.33.1/fs/aufs/loop.h ---- linux-2.6.33.1-vanilla/fs/aufs/loop.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-2.6.33.1/fs/aufs/loop.h 2010-04-05 16:53:27.000000000 +0200 -@@ -0,0 +1,43 @@ -+/* -+ * Copyright (C) 2005-2010 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+/* -+ * support for loopback mount as a branch -+ */ -+ -+#ifndef __AUFS_LOOP_H__ -+#define __AUFS_LOOP_H__ -+ -+#ifdef __KERNEL__ -+ -+struct dentry; -+struct super_block; -+ -+#ifdef CONFIG_AUFS_BDEV_LOOP -+/* loop.c */ -+int au_test_loopback_overlap(struct super_block *sb, struct dentry *h_d1, -+ struct dentry *h_d2); -+int au_test_loopback_kthread(void); -+#else -+AuStubInt0(au_test_loopback_overlap, struct super_block *sb, -+ struct dentry *h_d1, struct dentry *h_d2) -+AuStubInt0(au_test_loopback_kthread, void) -+#endif /* BLK_DEV_LOOP */ -+ -+#endif /* __KERNEL__ */ -+#endif /* __AUFS_LOOP_H__ */ -diff -Nur linux-2.6.33.1-vanilla/fs/aufs/magic.mk linux-2.6.33.1/fs/aufs/magic.mk ---- linux-2.6.33.1-vanilla/fs/aufs/magic.mk 1970-01-01 01:00:00.000000000 +0100 -+++ linux-2.6.33.1/fs/aufs/magic.mk 2010-04-05 16:53:27.000000000 +0200 -@@ -0,0 +1,54 @@ -+ -+# defined in ${srctree}/fs/fuse/inode.c -+# tristate -+ifdef CONFIG_FUSE_FS -+ccflags-y += -DFUSE_SUPER_MAGIC=0x65735546 -+endif -+ -+# defined in ${srctree}/fs/ocfs2/ocfs2_fs.h -+# tristate -+ifdef CONFIG_OCFS2_FS -+ccflags-y += -DOCFS2_SUPER_MAGIC=0x7461636f -+endif -+ -+# defined in ${srctree}/fs/ocfs2/dlm/userdlm.h -+# tristate -+ifdef CONFIG_OCFS2_FS_O2CB -+ccflags-y += -DDLMFS_MAGIC=0x76a9f425 -+endif -+ -+# defined in ${srctree}/fs/cifs/cifsfs.c -+# tristate -+ifdef CONFIG_CIFS_FS -+ccflags-y += -DCIFS_MAGIC_NUMBER=0xFF534D42 -+endif -+ -+# defined in ${srctree}/fs/xfs/xfs_sb.h -+# tristate -+ifdef CONFIG_XFS_FS -+ccflags-y += -DXFS_SB_MAGIC=0x58465342 -+endif -+ -+# defined in ${srctree}/fs/configfs/mount.c -+# tristate -+ifdef CONFIG_CONFIGFS_FS -+ccflags-y += -DCONFIGFS_MAGIC=0x62656570 -+endif -+ -+# defined in ${srctree}/fs/9p/v9fs.h -+# tristate -+ifdef CONFIG_9P_FS -+ccflags-y += -DV9FS_MAGIC=0x01021997 -+endif -+ -+# defined in ${srctree}/fs/ubifs/ubifs.h -+# tristate -+ifdef CONFIG_UBIFS_FS -+ccflags-y += -DUBIFS_SUPER_MAGIC=0x24051905 -+endif -+ -+# defined in ${srctree}/fs/hfsplus/hfsplus_raw.h -+# tristate -+ifdef CONFIG_HFSPLUS_FS -+ccflags-y += -DHFSPLUS_SUPER_MAGIC=0x482b -+endif -diff -Nur linux-2.6.33.1-vanilla/fs/aufs/Makefile linux-2.6.33.1/fs/aufs/Makefile ---- linux-2.6.33.1-vanilla/fs/aufs/Makefile 1970-01-01 01:00:00.000000000 +0100 -+++ linux-2.6.33.1/fs/aufs/Makefile 2010-04-05 16:53:27.000000000 +0200 -@@ -0,0 +1,37 @@ -+ -+include ${src}/magic.mk -+ifeq (${CONFIG_AUFS_FS},m) -+include ${src}/conf.mk -+endif -+-include ${src}/priv_def.mk -+ -+# cf. include/linux/kernel.h -+# enable pr_debug -+ccflags-y += -DDEBUG -+ccflags-y += -D'pr_fmt(fmt)="aufs %s:%d:%s[%d]: " fmt, \ -+ __func__, __LINE__, current->comm, current->pid' -+ -+obj-$(CONFIG_AUFS_FS) += aufs.o -+aufs-y := module.o sbinfo.o super.o branch.o xino.o sysaufs.o opts.o \ -+ wkq.o vfsub.o dcsub.o \ -+ cpup.o whout.o plink.o wbr_policy.o \ -+ dinfo.o dentry.o \ -+ finfo.o file.o f_op.o \ -+ dir.o vdir.o \ -+ iinfo.o inode.o i_op.o i_op_add.o i_op_del.o i_op_ren.o \ -+ ioctl.o -+ -+# all are boolean -+aufs-$(CONFIG_SYSFS) += sysfs.o -+aufs-$(CONFIG_DEBUG_FS) += dbgaufs.o -+aufs-$(CONFIG_AUFS_BDEV_LOOP) += loop.o -+aufs-$(CONFIG_AUFS_HNOTIFY) += hnotify.o -+aufs-$(CONFIG_AUFS_HFSNOTIFY) += hfsnotify.o -+aufs-$(CONFIG_AUFS_HINOTIFY) += hinotify.o -+aufs-$(CONFIG_AUFS_EXPORT) += export.o -+aufs-$(CONFIG_AUFS_POLL) += poll.o -+aufs-$(CONFIG_AUFS_RDU) += rdu.o -+aufs-$(CONFIG_AUFS_SP_IATTR) += f_op_sp.o -+aufs-$(CONFIG_AUFS_BR_HFSPLUS) += hfsplus.o -+aufs-$(CONFIG_AUFS_DEBUG) += debug.o -+aufs-$(CONFIG_AUFS_MAGIC_SYSRQ) += sysrq.o -diff -Nur linux-2.6.33.1-vanilla/fs/aufs/module.c linux-2.6.33.1/fs/aufs/module.c ---- linux-2.6.33.1-vanilla/fs/aufs/module.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-2.6.33.1/fs/aufs/module.c 2010-04-05 16:53:27.000000000 +0200 -@@ -0,0 +1,166 @@ -+/* -+ * Copyright (C) 2005-2010 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+/* -+ * module global variables and operations -+ */ -+ -+#include -+#include -+#include "aufs.h" -+ -+void *au_kzrealloc(void *p, unsigned int nused, unsigned int new_sz, gfp_t gfp) -+{ -+ if (new_sz <= nused) -+ return p; -+ -+ p = krealloc(p, new_sz, gfp); -+ if (p) -+ memset(p + nused, 0, new_sz - nused); -+ return p; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * aufs caches -+ */ -+struct kmem_cache *au_cachep[AuCache_Last]; -+static int __init au_cache_init(void) -+{ -+ au_cachep[AuCache_DINFO] = AuCache(au_dinfo); -+ if (au_cachep[AuCache_DINFO]) -+ au_cachep[AuCache_ICNTNR] = AuCache(au_icntnr); -+ if (au_cachep[AuCache_ICNTNR]) -+ au_cachep[AuCache_FINFO] = AuCache(au_finfo); -+ if (au_cachep[AuCache_FINFO]) -+ au_cachep[AuCache_VDIR] = AuCache(au_vdir); -+ if (au_cachep[AuCache_VDIR]) -+ au_cachep[AuCache_DEHSTR] = AuCache(au_vdir_dehstr); -+ if (au_cachep[AuCache_DEHSTR]) -+ return 0; -+ -+ return -ENOMEM; -+} -+ -+static void au_cache_fin(void) -+{ -+ int i; -+ -+ /* including AuCache_HNOTIFY */ -+ for (i = 0; i < AuCache_Last; i++) -+ if (au_cachep[i]) { -+ kmem_cache_destroy(au_cachep[i]); -+ au_cachep[i] = NULL; -+ } -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+int au_dir_roflags; -+ -+/* -+ * functions for module interface. -+ */ -+MODULE_LICENSE("GPL"); -+/* MODULE_LICENSE("GPL v2"); */ -+MODULE_AUTHOR("Junjiro R. Okajima "); -+MODULE_DESCRIPTION(AUFS_NAME -+ " -- Advanced multi layered unification filesystem"); -+MODULE_VERSION(AUFS_VERSION); -+ -+/* this module parameter has no meaning when SYSFS is disabled */ -+int sysaufs_brs = 1; -+MODULE_PARM_DESC(brs, "use /fs/aufs/si_*/brN"); -+module_param_named(brs, sysaufs_brs, int, S_IRUGO); -+ -+/* ---------------------------------------------------------------------- */ -+ -+static char au_esc_chars[0x20 + 3]; /* 0x01-0x20, backslash, del, and NULL */ -+ -+int au_seq_path(struct seq_file *seq, struct path *path) -+{ -+ return seq_path(seq, path, au_esc_chars); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int __init aufs_init(void) -+{ -+ int err, i; -+ char *p; -+ -+ p = au_esc_chars; -+ for (i = 1; i <= ' '; i++) -+ *p++ = i; -+ *p++ = '\\'; -+ *p++ = '\x7f'; -+ *p = 0; -+ -+ au_dir_roflags = au_file_roflags(O_DIRECTORY | O_LARGEFILE); -+ -+ sysaufs_brs_init(); -+ au_debug_init(); -+ err = sysaufs_init(); -+ if (unlikely(err)) -+ goto out; -+ err = au_wkq_init(); -+ if (unlikely(err)) -+ goto out_sysaufs; -+ err = au_hnotify_init(); -+ if (unlikely(err)) -+ goto out_wkq; -+ err = au_sysrq_init(); -+ if (unlikely(err)) -+ goto out_hin; -+ err = au_cache_init(); -+ if (unlikely(err)) -+ goto out_sysrq; -+ err = register_filesystem(&aufs_fs_type); -+ if (unlikely(err)) -+ goto out_cache; -+ /* since we define pr_fmt, call printk directly */ -+ printk(KERN_INFO AUFS_NAME " " AUFS_VERSION "\n"); -+ goto out; /* success */ -+ -+ out_cache: -+ au_cache_fin(); -+ out_sysrq: -+ au_sysrq_fin(); -+ out_hin: -+ au_hnotify_fin(); -+ out_wkq: -+ au_wkq_fin(); -+ out_sysaufs: -+ sysaufs_fin(); -+ out: -+ return err; -+} -+ -+static void __exit aufs_exit(void) -+{ -+ unregister_filesystem(&aufs_fs_type); -+ au_cache_fin(); -+ au_sysrq_fin(); -+ au_hnotify_fin(); -+ au_wkq_fin(); -+ sysaufs_fin(); -+} -+ -+module_init(aufs_init); -+module_exit(aufs_exit); -diff -Nur linux-2.6.33.1-vanilla/fs/aufs/module.h linux-2.6.33.1/fs/aufs/module.h ---- linux-2.6.33.1-vanilla/fs/aufs/module.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-2.6.33.1/fs/aufs/module.h 2010-04-05 16:53:27.000000000 +0200 -@@ -0,0 +1,78 @@ -+/* -+ * Copyright (C) 2005-2010 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+/* -+ * module initialization and module-global -+ */ -+ -+#ifndef __AUFS_MODULE_H__ -+#define __AUFS_MODULE_H__ -+ -+#ifdef __KERNEL__ -+ -+#include -+ -+struct path; -+struct seq_file; -+ -+/* module parameters */ -+extern int sysaufs_brs; -+ -+/* ---------------------------------------------------------------------- */ -+ -+extern int au_dir_roflags; -+ -+void *au_kzrealloc(void *p, unsigned int nused, unsigned int new_sz, gfp_t gfp); -+int au_seq_path(struct seq_file *seq, struct path *path); -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* kmem cache */ -+enum { -+ AuCache_DINFO, -+ AuCache_ICNTNR, -+ AuCache_FINFO, -+ AuCache_VDIR, -+ AuCache_DEHSTR, -+#ifdef CONFIG_AUFS_HNOTIFY -+ AuCache_HNOTIFY, -+#endif -+ AuCache_Last -+}; -+ -+#define AuCache(type) KMEM_CACHE(type, SLAB_RECLAIM_ACCOUNT | SLAB_MEM_SPREAD) -+ -+extern struct kmem_cache *au_cachep[]; -+ -+#define AuCacheFuncs(name, index) \ -+static inline struct au_##name *au_cache_alloc_##name(void) \ -+{ return kmem_cache_alloc(au_cachep[AuCache_##index], GFP_NOFS); } \ -+static inline void au_cache_free_##name(struct au_##name *p) \ -+{ kmem_cache_free(au_cachep[AuCache_##index], p); } -+ -+AuCacheFuncs(dinfo, DINFO); -+AuCacheFuncs(icntnr, ICNTNR); -+AuCacheFuncs(finfo, FINFO); -+AuCacheFuncs(vdir, VDIR); -+AuCacheFuncs(vdir_dehstr, DEHSTR); -+#ifdef CONFIG_AUFS_HNOTIFY -+AuCacheFuncs(hnotify, HNOTIFY); -+#endif -+ -+#endif /* __KERNEL__ */ -+#endif /* __AUFS_MODULE_H__ */ -diff -Nur linux-2.6.33.1-vanilla/fs/aufs/opts.c linux-2.6.33.1/fs/aufs/opts.c ---- linux-2.6.33.1-vanilla/fs/aufs/opts.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-2.6.33.1/fs/aufs/opts.c 2010-04-05 16:53:27.000000000 +0200 -@@ -0,0 +1,1565 @@ -+/* -+ * Copyright (C) 2005-2010 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+/* -+ * mount options/flags -+ */ -+ -+#include -+#include -+#include /* a distribution requires */ -+#include -+#include "aufs.h" -+ -+/* ---------------------------------------------------------------------- */ -+ -+enum { -+ Opt_br, -+ Opt_add, Opt_del, Opt_mod, Opt_reorder, Opt_append, Opt_prepend, -+ Opt_idel, Opt_imod, Opt_ireorder, -+ Opt_dirwh, Opt_rdcache, Opt_rdblk, Opt_rdhash, Opt_rendir, -+ Opt_rdblk_def, Opt_rdhash_def, -+ Opt_xino, Opt_zxino, Opt_noxino, -+ Opt_trunc_xino, Opt_trunc_xino_v, Opt_notrunc_xino, -+ Opt_trunc_xino_path, Opt_itrunc_xino, -+ Opt_trunc_xib, Opt_notrunc_xib, -+ Opt_shwh, Opt_noshwh, -+ Opt_plink, Opt_noplink, Opt_list_plink, -+ Opt_udba, -+ /* Opt_lock, Opt_unlock, */ -+ Opt_cmd, Opt_cmd_args, -+ Opt_diropq_a, Opt_diropq_w, -+ Opt_warn_perm, Opt_nowarn_perm, -+ Opt_wbr_copyup, Opt_wbr_create, -+ Opt_refrof, Opt_norefrof, -+ Opt_verbose, Opt_noverbose, -+ Opt_sum, Opt_nosum, Opt_wsum, -+ Opt_tail, Opt_ignore, Opt_ignore_silent, Opt_err -+}; -+ -+static match_table_t options = { -+ {Opt_br, "br=%s"}, -+ {Opt_br, "br:%s"}, -+ -+ {Opt_add, "add=%d:%s"}, -+ {Opt_add, "add:%d:%s"}, -+ {Opt_add, "ins=%d:%s"}, -+ {Opt_add, "ins:%d:%s"}, -+ {Opt_append, "append=%s"}, -+ {Opt_append, "append:%s"}, -+ {Opt_prepend, "prepend=%s"}, -+ {Opt_prepend, "prepend:%s"}, -+ -+ {Opt_del, "del=%s"}, -+ {Opt_del, "del:%s"}, -+ /* {Opt_idel, "idel:%d"}, */ -+ {Opt_mod, "mod=%s"}, -+ {Opt_mod, "mod:%s"}, -+ /* {Opt_imod, "imod:%d:%s"}, */ -+ -+ {Opt_dirwh, "dirwh=%d"}, -+ -+ {Opt_xino, "xino=%s"}, -+ {Opt_noxino, "noxino"}, -+ {Opt_trunc_xino, "trunc_xino"}, -+ {Opt_trunc_xino_v, "trunc_xino_v=%d:%d"}, -+ {Opt_notrunc_xino, "notrunc_xino"}, -+ {Opt_trunc_xino_path, "trunc_xino=%s"}, -+ {Opt_itrunc_xino, "itrunc_xino=%d"}, -+ /* {Opt_zxino, "zxino=%s"}, */ -+ {Opt_trunc_xib, "trunc_xib"}, -+ {Opt_notrunc_xib, "notrunc_xib"}, -+ -+ {Opt_plink, "plink"}, -+ {Opt_noplink, "noplink"}, -+#ifdef CONFIG_AUFS_DEBUG -+ {Opt_list_plink, "list_plink"}, -+#endif -+ -+ {Opt_udba, "udba=%s"}, -+ -+ {Opt_diropq_a, "diropq=always"}, -+ {Opt_diropq_a, "diropq=a"}, -+ {Opt_diropq_w, "diropq=whiteouted"}, -+ {Opt_diropq_w, "diropq=w"}, -+ -+ {Opt_warn_perm, "warn_perm"}, -+ {Opt_nowarn_perm, "nowarn_perm"}, -+ -+ /* keep them temporary */ -+ {Opt_ignore_silent, "coo=%s"}, -+ {Opt_ignore_silent, "nodlgt"}, -+ {Opt_ignore_silent, "nodirperm1"}, -+ {Opt_ignore_silent, "clean_plink"}, -+ -+#ifdef CONFIG_AUFS_SHWH -+ {Opt_shwh, "shwh"}, -+#endif -+ {Opt_noshwh, "noshwh"}, -+ -+ {Opt_rendir, "rendir=%d"}, -+ -+ {Opt_refrof, "refrof"}, -+ {Opt_norefrof, "norefrof"}, -+ -+ {Opt_verbose, "verbose"}, -+ {Opt_verbose, "v"}, -+ {Opt_noverbose, "noverbose"}, -+ {Opt_noverbose, "quiet"}, -+ {Opt_noverbose, "q"}, -+ {Opt_noverbose, "silent"}, -+ -+ {Opt_sum, "sum"}, -+ {Opt_nosum, "nosum"}, -+ {Opt_wsum, "wsum"}, -+ -+ {Opt_rdcache, "rdcache=%d"}, -+ {Opt_rdblk, "rdblk=%d"}, -+ {Opt_rdblk_def, "rdblk=def"}, -+ {Opt_rdhash, "rdhash=%d"}, -+ {Opt_rdhash_def, "rdhash=def"}, -+ -+ {Opt_wbr_create, "create=%s"}, -+ {Opt_wbr_create, "create_policy=%s"}, -+ {Opt_wbr_copyup, "cpup=%s"}, -+ {Opt_wbr_copyup, "copyup=%s"}, -+ {Opt_wbr_copyup, "copyup_policy=%s"}, -+ -+ /* internal use for the scripts */ -+ {Opt_ignore_silent, "si=%s"}, -+ -+ {Opt_br, "dirs=%s"}, -+ {Opt_ignore, "debug=%d"}, -+ {Opt_ignore, "delete=whiteout"}, -+ {Opt_ignore, "delete=all"}, -+ {Opt_ignore, "imap=%s"}, -+ -+ /* temporary workaround, due to old mount(8)? */ -+ {Opt_ignore_silent, "relatime"}, -+ -+ {Opt_err, NULL} -+}; -+ -+/* ---------------------------------------------------------------------- */ -+ -+static const char *au_parser_pattern(int val, struct match_token *token) -+{ -+ while (token->pattern) { -+ if (token->token == val) -+ return token->pattern; -+ token++; -+ } -+ BUG(); -+ return "??"; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static match_table_t brperms = { -+ {AuBrPerm_RO, AUFS_BRPERM_RO}, -+ {AuBrPerm_RR, AUFS_BRPERM_RR}, -+ {AuBrPerm_RW, AUFS_BRPERM_RW}, -+ -+ {AuBrPerm_ROWH, AUFS_BRPERM_ROWH}, -+ {AuBrPerm_RRWH, AUFS_BRPERM_RRWH}, -+ {AuBrPerm_RWNoLinkWH, AUFS_BRPERM_RWNLWH}, -+ -+ {AuBrPerm_ROWH, "nfsro"}, -+ {AuBrPerm_RO, NULL} -+}; -+ -+static int noinline_for_stack br_perm_val(char *perm) -+{ -+ int val; -+ substring_t args[MAX_OPT_ARGS]; -+ -+ val = match_token(perm, brperms, args); -+ return val; -+} -+ -+const char *au_optstr_br_perm(int brperm) -+{ -+ return au_parser_pattern(brperm, (void *)brperms); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static match_table_t udbalevel = { -+ {AuOpt_UDBA_REVAL, "reval"}, -+ {AuOpt_UDBA_NONE, "none"}, -+#ifdef CONFIG_AUFS_HNOTIFY -+ {AuOpt_UDBA_HNOTIFY, "notify"}, /* abstraction */ -+#ifdef CONFIG_AUFS_HFSNOTIFY -+ {AuOpt_UDBA_HNOTIFY, "fsnotify"}, -+#else -+ {AuOpt_UDBA_HNOTIFY, "inotify"}, -+#endif -+#endif -+ {-1, NULL} -+}; -+ -+static void au_warn_inotify(int val, char *str) -+{ -+#ifdef CONFIG_AUFS_HINOTIFY -+ if (val == AuOpt_UDBA_HNOTIFY -+ && !strcmp(str, "inotify")) -+ AuWarn1("udba=inotify is deprecated, use udba=notify\n"); -+#endif -+} -+ -+static int noinline_for_stack udba_val(char *str) -+{ -+ int val; -+ substring_t args[MAX_OPT_ARGS]; -+ -+ val = match_token(str, udbalevel, args); -+ au_warn_inotify(val, str); -+ return val; -+} -+ -+const char *au_optstr_udba(int udba) -+{ -+ return au_parser_pattern(udba, (void *)udbalevel); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static match_table_t au_wbr_create_policy = { -+ {AuWbrCreate_TDP, "tdp"}, -+ {AuWbrCreate_TDP, "top-down-parent"}, -+ {AuWbrCreate_RR, "rr"}, -+ {AuWbrCreate_RR, "round-robin"}, -+ {AuWbrCreate_MFS, "mfs"}, -+ {AuWbrCreate_MFS, "most-free-space"}, -+ {AuWbrCreate_MFSV, "mfs:%d"}, -+ {AuWbrCreate_MFSV, "most-free-space:%d"}, -+ -+ {AuWbrCreate_MFSRR, "mfsrr:%d"}, -+ {AuWbrCreate_MFSRRV, "mfsrr:%d:%d"}, -+ {AuWbrCreate_PMFS, "pmfs"}, -+ {AuWbrCreate_PMFSV, "pmfs:%d"}, -+ -+ {-1, NULL} -+}; -+ -+/* -+ * cf. linux/lib/parser.c and cmdline.c -+ * gave up calling memparse() since it uses simple_strtoull() instead of -+ * strict_...(). -+ */ -+static int noinline_for_stack -+au_match_ull(substring_t *s, unsigned long long *result) -+{ -+ int err; -+ unsigned int len; -+ char a[32]; -+ -+ err = -ERANGE; -+ len = s->to - s->from; -+ if (len + 1 <= sizeof(a)) { -+ memcpy(a, s->from, len); -+ a[len] = '\0'; -+ err = strict_strtoull(a, 0, result); -+ } -+ return err; -+} -+ -+static int au_wbr_mfs_wmark(substring_t *arg, char *str, -+ struct au_opt_wbr_create *create) -+{ -+ int err; -+ unsigned long long ull; -+ -+ err = 0; -+ if (!au_match_ull(arg, &ull)) -+ create->mfsrr_watermark = ull; -+ else { -+ pr_err("bad integer in %s\n", str); -+ err = -EINVAL; -+ } -+ -+ return err; -+} -+ -+static int au_wbr_mfs_sec(substring_t *arg, char *str, -+ struct au_opt_wbr_create *create) -+{ -+ int n, err; -+ -+ err = 0; -+ if (!match_int(arg, &n) && 0 <= n) -+ create->mfs_second = n; -+ else { -+ pr_err("bad integer in %s\n", str); -+ err = -EINVAL; -+ } -+ -+ return err; -+} -+ -+static int noinline_for_stack -+au_wbr_create_val(char *str, struct au_opt_wbr_create *create) -+{ -+ int err, e; -+ substring_t args[MAX_OPT_ARGS]; -+ -+ err = match_token(str, au_wbr_create_policy, args); -+ create->wbr_create = err; -+ switch (err) { -+ case AuWbrCreate_MFSRRV: -+ e = au_wbr_mfs_wmark(&args[0], str, create); -+ if (!e) -+ e = au_wbr_mfs_sec(&args[1], str, create); -+ if (unlikely(e)) -+ err = e; -+ break; -+ case AuWbrCreate_MFSRR: -+ e = au_wbr_mfs_wmark(&args[0], str, create); -+ if (unlikely(e)) { -+ err = e; -+ break; -+ } -+ /*FALLTHROUGH*/ -+ case AuWbrCreate_MFS: -+ case AuWbrCreate_PMFS: -+ create->mfs_second = AUFS_MFS_SECOND_DEF; -+ break; -+ case AuWbrCreate_MFSV: -+ case AuWbrCreate_PMFSV: -+ e = au_wbr_mfs_sec(&args[0], str, create); -+ if (unlikely(e)) -+ err = e; -+ break; -+ } -+ -+ return err; -+} -+ -+const char *au_optstr_wbr_create(int wbr_create) -+{ -+ return au_parser_pattern(wbr_create, (void *)au_wbr_create_policy); -+} -+ -+static match_table_t au_wbr_copyup_policy = { -+ {AuWbrCopyup_TDP, "tdp"}, -+ {AuWbrCopyup_TDP, "top-down-parent"}, -+ {AuWbrCopyup_BUP, "bup"}, -+ {AuWbrCopyup_BUP, "bottom-up-parent"}, -+ {AuWbrCopyup_BU, "bu"}, -+ {AuWbrCopyup_BU, "bottom-up"}, -+ {-1, NULL} -+}; -+ -+static int noinline_for_stack au_wbr_copyup_val(char *str) -+{ -+ substring_t args[MAX_OPT_ARGS]; -+ -+ return match_token(str, au_wbr_copyup_policy, args); -+} -+ -+const char *au_optstr_wbr_copyup(int wbr_copyup) -+{ -+ return au_parser_pattern(wbr_copyup, (void *)au_wbr_copyup_policy); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static const int lkup_dirflags = LOOKUP_FOLLOW | LOOKUP_DIRECTORY; -+ -+static void dump_opts(struct au_opts *opts) -+{ -+#ifdef CONFIG_AUFS_DEBUG -+ /* reduce stack space */ -+ union { -+ struct au_opt_add *add; -+ struct au_opt_del *del; -+ struct au_opt_mod *mod; -+ struct au_opt_xino *xino; -+ struct au_opt_xino_itrunc *xino_itrunc; -+ struct au_opt_wbr_create *create; -+ } u; -+ struct au_opt *opt; -+ -+ opt = opts->opt; -+ while (opt->type != Opt_tail) { -+ switch (opt->type) { -+ case Opt_add: -+ u.add = &opt->add; -+ AuDbg("add {b%d, %s, 0x%x, %p}\n", -+ u.add->bindex, u.add->pathname, u.add->perm, -+ u.add->path.dentry); -+ break; -+ case Opt_del: -+ case Opt_idel: -+ u.del = &opt->del; -+ AuDbg("del {%s, %p}\n", -+ u.del->pathname, u.del->h_path.dentry); -+ break; -+ case Opt_mod: -+ case Opt_imod: -+ u.mod = &opt->mod; -+ AuDbg("mod {%s, 0x%x, %p}\n", -+ u.mod->path, u.mod->perm, u.mod->h_root); -+ break; -+ case Opt_append: -+ u.add = &opt->add; -+ AuDbg("append {b%d, %s, 0x%x, %p}\n", -+ u.add->bindex, u.add->pathname, u.add->perm, -+ u.add->path.dentry); -+ break; -+ case Opt_prepend: -+ u.add = &opt->add; -+ AuDbg("prepend {b%d, %s, 0x%x, %p}\n", -+ u.add->bindex, u.add->pathname, u.add->perm, -+ u.add->path.dentry); -+ break; -+ case Opt_dirwh: -+ AuDbg("dirwh %d\n", opt->dirwh); -+ break; -+ case Opt_rdcache: -+ AuDbg("rdcache %d\n", opt->rdcache); -+ break; -+ case Opt_rdblk: -+ AuDbg("rdblk %u\n", opt->rdblk); -+ break; -+ case Opt_rdblk_def: -+ AuDbg("rdblk_def\n"); -+ break; -+ case Opt_rdhash: -+ AuDbg("rdhash %u\n", opt->rdhash); -+ break; -+ case Opt_rdhash_def: -+ AuDbg("rdhash_def\n"); -+ break; -+ case Opt_xino: -+ u.xino = &opt->xino; -+ AuDbg("xino {%s %.*s}\n", -+ u.xino->path, -+ AuDLNPair(u.xino->file->f_dentry)); -+ break; -+ case Opt_trunc_xino: -+ AuLabel(trunc_xino); -+ break; -+ case Opt_notrunc_xino: -+ AuLabel(notrunc_xino); -+ break; -+ case Opt_trunc_xino_path: -+ case Opt_itrunc_xino: -+ u.xino_itrunc = &opt->xino_itrunc; -+ AuDbg("trunc_xino %d\n", u.xino_itrunc->bindex); -+ break; -+ -+ case Opt_noxino: -+ AuLabel(noxino); -+ break; -+ case Opt_trunc_xib: -+ AuLabel(trunc_xib); -+ break; -+ case Opt_notrunc_xib: -+ AuLabel(notrunc_xib); -+ break; -+ case Opt_shwh: -+ AuLabel(shwh); -+ break; -+ case Opt_noshwh: -+ AuLabel(noshwh); -+ break; -+ case Opt_plink: -+ AuLabel(plink); -+ break; -+ case Opt_noplink: -+ AuLabel(noplink); -+ break; -+ case Opt_list_plink: -+ AuLabel(list_plink); -+ break; -+ case Opt_udba: -+ AuDbg("udba %d, %s\n", -+ opt->udba, au_optstr_udba(opt->udba)); -+ break; -+ case Opt_diropq_a: -+ AuLabel(diropq_a); -+ break; -+ case Opt_diropq_w: -+ AuLabel(diropq_w); -+ break; -+ case Opt_warn_perm: -+ AuLabel(warn_perm); -+ break; -+ case Opt_nowarn_perm: -+ AuLabel(nowarn_perm); -+ break; -+ case Opt_refrof: -+ AuLabel(refrof); -+ break; -+ case Opt_norefrof: -+ AuLabel(norefrof); -+ break; -+ case Opt_verbose: -+ AuLabel(verbose); -+ break; -+ case Opt_noverbose: -+ AuLabel(noverbose); -+ break; -+ case Opt_sum: -+ AuLabel(sum); -+ break; -+ case Opt_nosum: -+ AuLabel(nosum); -+ break; -+ case Opt_wsum: -+ AuLabel(wsum); -+ break; -+ case Opt_wbr_create: -+ u.create = &opt->wbr_create; -+ AuDbg("create %d, %s\n", u.create->wbr_create, -+ au_optstr_wbr_create(u.create->wbr_create)); -+ switch (u.create->wbr_create) { -+ case AuWbrCreate_MFSV: -+ case AuWbrCreate_PMFSV: -+ AuDbg("%d sec\n", u.create->mfs_second); -+ break; -+ case AuWbrCreate_MFSRR: -+ AuDbg("%llu watermark\n", -+ u.create->mfsrr_watermark); -+ break; -+ case AuWbrCreate_MFSRRV: -+ AuDbg("%llu watermark, %d sec\n", -+ u.create->mfsrr_watermark, -+ u.create->mfs_second); -+ break; -+ } -+ break; -+ case Opt_wbr_copyup: -+ AuDbg("copyup %d, %s\n", opt->wbr_copyup, -+ au_optstr_wbr_copyup(opt->wbr_copyup)); -+ break; -+ default: -+ BUG(); -+ } -+ opt++; -+ } -+#endif -+} -+ -+void au_opts_free(struct au_opts *opts) -+{ -+ struct au_opt *opt; -+ -+ opt = opts->opt; -+ while (opt->type != Opt_tail) { -+ switch (opt->type) { -+ case Opt_add: -+ case Opt_append: -+ case Opt_prepend: -+ path_put(&opt->add.path); -+ break; -+ case Opt_del: -+ case Opt_idel: -+ path_put(&opt->del.h_path); -+ break; -+ case Opt_mod: -+ case Opt_imod: -+ dput(opt->mod.h_root); -+ break; -+ case Opt_xino: -+ fput(opt->xino.file); -+ break; -+ } -+ opt++; -+ } -+} -+ -+static int opt_add(struct au_opt *opt, char *opt_str, unsigned long sb_flags, -+ aufs_bindex_t bindex) -+{ -+ int err; -+ struct au_opt_add *add = &opt->add; -+ char *p; -+ -+ add->bindex = bindex; -+ add->perm = AuBrPerm_Last; -+ add->pathname = opt_str; -+ p = strchr(opt_str, '='); -+ if (p) { -+ *p++ = 0; -+ if (*p) -+ add->perm = br_perm_val(p); -+ } -+ -+ err = vfsub_kern_path(add->pathname, lkup_dirflags, &add->path); -+ if (!err) { -+ if (!p) { -+ add->perm = AuBrPerm_RO; -+ if (au_test_fs_rr(add->path.dentry->d_sb)) -+ add->perm = AuBrPerm_RR; -+ else if (!bindex && !(sb_flags & MS_RDONLY)) -+ add->perm = AuBrPerm_RW; -+ } -+ opt->type = Opt_add; -+ goto out; -+ } -+ pr_err("lookup failed %s (%d)\n", add->pathname, err); -+ err = -EINVAL; -+ -+ out: -+ return err; -+} -+ -+static int au_opts_parse_del(struct au_opt_del *del, substring_t args[]) -+{ -+ int err; -+ -+ del->pathname = args[0].from; -+ AuDbg("del path %s\n", del->pathname); -+ -+ err = vfsub_kern_path(del->pathname, lkup_dirflags, &del->h_path); -+ if (unlikely(err)) -+ pr_err("lookup failed %s (%d)\n", del->pathname, err); -+ -+ return err; -+} -+ -+#if 0 /* reserved for future use */ -+static int au_opts_parse_idel(struct super_block *sb, aufs_bindex_t bindex, -+ struct au_opt_del *del, substring_t args[]) -+{ -+ int err; -+ struct dentry *root; -+ -+ err = -EINVAL; -+ root = sb->s_root; -+ aufs_read_lock(root, AuLock_FLUSH); -+ if (bindex < 0 || au_sbend(sb) < bindex) { -+ pr_err("out of bounds, %d\n", bindex); -+ goto out; -+ } -+ -+ err = 0; -+ del->h_path.dentry = dget(au_h_dptr(root, bindex)); -+ del->h_path.mnt = mntget(au_sbr_mnt(sb, bindex)); -+ -+ out: -+ aufs_read_unlock(root, !AuLock_IR); -+ return err; -+} -+#endif -+ -+static int noinline_for_stack -+au_opts_parse_mod(struct au_opt_mod *mod, substring_t args[]) -+{ -+ int err; -+ struct path path; -+ char *p; -+ -+ err = -EINVAL; -+ mod->path = args[0].from; -+ p = strchr(mod->path, '='); -+ if (unlikely(!p)) { -+ pr_err("no permssion %s\n", args[0].from); -+ goto out; -+ } -+ -+ *p++ = 0; -+ err = vfsub_kern_path(mod->path, lkup_dirflags, &path); -+ if (unlikely(err)) { -+ pr_err("lookup failed %s (%d)\n", mod->path, err); -+ goto out; -+ } -+ -+ mod->perm = br_perm_val(p); -+ AuDbg("mod path %s, perm 0x%x, %s\n", mod->path, mod->perm, p); -+ mod->h_root = dget(path.dentry); -+ path_put(&path); -+ -+ out: -+ return err; -+} -+ -+#if 0 /* reserved for future use */ -+static int au_opts_parse_imod(struct super_block *sb, aufs_bindex_t bindex, -+ struct au_opt_mod *mod, substring_t args[]) -+{ -+ int err; -+ struct dentry *root; -+ -+ err = -EINVAL; -+ root = sb->s_root; -+ aufs_read_lock(root, AuLock_FLUSH); -+ if (bindex < 0 || au_sbend(sb) < bindex) { -+ pr_err("out of bounds, %d\n", bindex); -+ goto out; -+ } -+ -+ err = 0; -+ mod->perm = br_perm_val(args[1].from); -+ AuDbg("mod path %s, perm 0x%x, %s\n", -+ mod->path, mod->perm, args[1].from); -+ mod->h_root = dget(au_h_dptr(root, bindex)); -+ -+ out: -+ aufs_read_unlock(root, !AuLock_IR); -+ return err; -+} -+#endif -+ -+static int au_opts_parse_xino(struct super_block *sb, struct au_opt_xino *xino, -+ substring_t args[]) -+{ -+ int err; -+ struct file *file; -+ -+ file = au_xino_create(sb, args[0].from, /*silent*/0); -+ err = PTR_ERR(file); -+ if (IS_ERR(file)) -+ goto out; -+ -+ err = -EINVAL; -+ if (unlikely(file->f_dentry->d_sb == sb)) { -+ fput(file); -+ pr_err("%s must be outside\n", args[0].from); -+ goto out; -+ } -+ -+ err = 0; -+ xino->file = file; -+ xino->path = args[0].from; -+ -+ out: -+ return err; -+} -+ -+static int noinline_for_stack -+au_opts_parse_xino_itrunc_path(struct super_block *sb, -+ struct au_opt_xino_itrunc *xino_itrunc, -+ substring_t args[]) -+{ -+ int err; -+ aufs_bindex_t bend, bindex; -+ struct path path; -+ struct dentry *root; -+ -+ err = vfsub_kern_path(args[0].from, lkup_dirflags, &path); -+ if (unlikely(err)) { -+ pr_err("lookup failed %s (%d)\n", args[0].from, err); -+ goto out; -+ } -+ -+ xino_itrunc->bindex = -1; -+ root = sb->s_root; -+ aufs_read_lock(root, AuLock_FLUSH); -+ bend = au_sbend(sb); -+ for (bindex = 0; bindex <= bend; bindex++) { -+ if (au_h_dptr(root, bindex) == path.dentry) { -+ xino_itrunc->bindex = bindex; -+ break; -+ } -+ } -+ aufs_read_unlock(root, !AuLock_IR); -+ path_put(&path); -+ -+ if (unlikely(xino_itrunc->bindex < 0)) { -+ pr_err("no such branch %s\n", args[0].from); -+ err = -EINVAL; -+ } -+ -+ out: -+ return err; -+} -+ -+/* called without aufs lock */ -+int au_opts_parse(struct super_block *sb, char *str, struct au_opts *opts) -+{ -+ int err, n, token; -+ aufs_bindex_t bindex; -+ unsigned char skipped; -+ struct dentry *root; -+ struct au_opt *opt, *opt_tail; -+ char *opt_str; -+ /* reduce the stack space */ -+ union { -+ struct au_opt_xino_itrunc *xino_itrunc; -+ struct au_opt_wbr_create *create; -+ } u; -+ struct { -+ substring_t args[MAX_OPT_ARGS]; -+ } *a; -+ -+ err = -ENOMEM; -+ a = kmalloc(sizeof(*a), GFP_NOFS); -+ if (unlikely(!a)) -+ goto out; -+ -+ root = sb->s_root; -+ err = 0; -+ bindex = 0; -+ opt = opts->opt; -+ opt_tail = opt + opts->max_opt - 1; -+ opt->type = Opt_tail; -+ while (!err && (opt_str = strsep(&str, ",")) && *opt_str) { -+ err = -EINVAL; -+ skipped = 0; -+ token = match_token(opt_str, options, a->args); -+ switch (token) { -+ case Opt_br: -+ err = 0; -+ while (!err && (opt_str = strsep(&a->args[0].from, ":")) -+ && *opt_str) { -+ err = opt_add(opt, opt_str, opts->sb_flags, -+ bindex++); -+ if (unlikely(!err && ++opt > opt_tail)) { -+ err = -E2BIG; -+ break; -+ } -+ opt->type = Opt_tail; -+ skipped = 1; -+ } -+ break; -+ case Opt_add: -+ if (unlikely(match_int(&a->args[0], &n))) { -+ pr_err("bad integer in %s\n", opt_str); -+ break; -+ } -+ bindex = n; -+ err = opt_add(opt, a->args[1].from, opts->sb_flags, -+ bindex); -+ if (!err) -+ opt->type = token; -+ break; -+ case Opt_append: -+ err = opt_add(opt, a->args[0].from, opts->sb_flags, -+ /*dummy bindex*/1); -+ if (!err) -+ opt->type = token; -+ break; -+ case Opt_prepend: -+ err = opt_add(opt, a->args[0].from, opts->sb_flags, -+ /*bindex*/0); -+ if (!err) -+ opt->type = token; -+ break; -+ case Opt_del: -+ err = au_opts_parse_del(&opt->del, a->args); -+ if (!err) -+ opt->type = token; -+ break; -+#if 0 /* reserved for future use */ -+ case Opt_idel: -+ del->pathname = "(indexed)"; -+ if (unlikely(match_int(&args[0], &n))) { -+ pr_err("bad integer in %s\n", opt_str); -+ break; -+ } -+ err = au_opts_parse_idel(sb, n, &opt->del, a->args); -+ if (!err) -+ opt->type = token; -+ break; -+#endif -+ case Opt_mod: -+ err = au_opts_parse_mod(&opt->mod, a->args); -+ if (!err) -+ opt->type = token; -+ break; -+#ifdef IMOD /* reserved for future use */ -+ case Opt_imod: -+ u.mod->path = "(indexed)"; -+ if (unlikely(match_int(&a->args[0], &n))) { -+ pr_err("bad integer in %s\n", opt_str); -+ break; -+ } -+ err = au_opts_parse_imod(sb, n, &opt->mod, a->args); -+ if (!err) -+ opt->type = token; -+ break; -+#endif -+ case Opt_xino: -+ err = au_opts_parse_xino(sb, &opt->xino, a->args); -+ if (!err) -+ opt->type = token; -+ break; -+ -+ case Opt_trunc_xino_path: -+ err = au_opts_parse_xino_itrunc_path -+ (sb, &opt->xino_itrunc, a->args); -+ if (!err) -+ opt->type = token; -+ break; -+ -+ case Opt_itrunc_xino: -+ u.xino_itrunc = &opt->xino_itrunc; -+ if (unlikely(match_int(&a->args[0], &n))) { -+ pr_err("bad integer in %s\n", opt_str); -+ break; -+ } -+ u.xino_itrunc->bindex = n; -+ aufs_read_lock(root, AuLock_FLUSH); -+ if (n < 0 || au_sbend(sb) < n) { -+ pr_err("out of bounds, %d\n", n); -+ aufs_read_unlock(root, !AuLock_IR); -+ break; -+ } -+ aufs_read_unlock(root, !AuLock_IR); -+ err = 0; -+ opt->type = token; -+ break; -+ -+ case Opt_dirwh: -+ if (unlikely(match_int(&a->args[0], &opt->dirwh))) -+ break; -+ err = 0; -+ opt->type = token; -+ break; -+ -+ case Opt_rdcache: -+ if (unlikely(match_int(&a->args[0], &opt->rdcache))) -+ break; -+ err = 0; -+ opt->type = token; -+ break; -+ case Opt_rdblk: -+ if (unlikely(match_int(&a->args[0], &n) -+ || n < 0 -+ || n > KMALLOC_MAX_SIZE)) { -+ pr_err("bad integer in %s\n", opt_str); -+ break; -+ } -+ if (unlikely(n && n < NAME_MAX)) { -+ pr_err("rdblk must be larger than %d\n", -+ NAME_MAX); -+ break; -+ } -+ opt->rdblk = n; -+ err = 0; -+ opt->type = token; -+ break; -+ case Opt_rdhash: -+ if (unlikely(match_int(&a->args[0], &n) -+ || n < 0 -+ || n * sizeof(struct hlist_head) -+ > KMALLOC_MAX_SIZE)) { -+ pr_err("bad integer in %s\n", opt_str); -+ break; -+ } -+ opt->rdhash = n; -+ err = 0; -+ opt->type = token; -+ break; -+ -+ case Opt_trunc_xino: -+ case Opt_notrunc_xino: -+ case Opt_noxino: -+ case Opt_trunc_xib: -+ case Opt_notrunc_xib: -+ case Opt_shwh: -+ case Opt_noshwh: -+ case Opt_plink: -+ case Opt_noplink: -+ case Opt_list_plink: -+ case Opt_diropq_a: -+ case Opt_diropq_w: -+ case Opt_warn_perm: -+ case Opt_nowarn_perm: -+ case Opt_refrof: -+ case Opt_norefrof: -+ case Opt_verbose: -+ case Opt_noverbose: -+ case Opt_sum: -+ case Opt_nosum: -+ case Opt_wsum: -+ case Opt_rdblk_def: -+ case Opt_rdhash_def: -+ err = 0; -+ opt->type = token; -+ break; -+ -+ case Opt_udba: -+ opt->udba = udba_val(a->args[0].from); -+ if (opt->udba >= 0) { -+ err = 0; -+ opt->type = token; -+ } else -+ pr_err("wrong value, %s\n", opt_str); -+ break; -+ -+ case Opt_wbr_create: -+ u.create = &opt->wbr_create; -+ u.create->wbr_create -+ = au_wbr_create_val(a->args[0].from, u.create); -+ if (u.create->wbr_create >= 0) { -+ err = 0; -+ opt->type = token; -+ } else -+ pr_err("wrong value, %s\n", opt_str); -+ break; -+ case Opt_wbr_copyup: -+ opt->wbr_copyup = au_wbr_copyup_val(a->args[0].from); -+ if (opt->wbr_copyup >= 0) { -+ err = 0; -+ opt->type = token; -+ } else -+ pr_err("wrong value, %s\n", opt_str); -+ break; -+ -+ case Opt_ignore: -+ pr_warning("ignored %s\n", opt_str); -+ /*FALLTHROUGH*/ -+ case Opt_ignore_silent: -+ skipped = 1; -+ err = 0; -+ break; -+ case Opt_err: -+ pr_err("unknown option %s\n", opt_str); -+ break; -+ } -+ -+ if (!err && !skipped) { -+ if (unlikely(++opt > opt_tail)) { -+ err = -E2BIG; -+ opt--; -+ opt->type = Opt_tail; -+ break; -+ } -+ opt->type = Opt_tail; -+ } -+ } -+ -+ kfree(a); -+ dump_opts(opts); -+ if (unlikely(err)) -+ au_opts_free(opts); -+ -+ out: -+ return err; -+} -+ -+static int au_opt_wbr_create(struct super_block *sb, -+ struct au_opt_wbr_create *create) -+{ -+ int err; -+ struct au_sbinfo *sbinfo; -+ -+ SiMustWriteLock(sb); -+ -+ err = 1; /* handled */ -+ sbinfo = au_sbi(sb); -+ if (sbinfo->si_wbr_create_ops->fin) { -+ err = sbinfo->si_wbr_create_ops->fin(sb); -+ if (!err) -+ err = 1; -+ } -+ -+ sbinfo->si_wbr_create = create->wbr_create; -+ sbinfo->si_wbr_create_ops = au_wbr_create_ops + create->wbr_create; -+ switch (create->wbr_create) { -+ case AuWbrCreate_MFSRRV: -+ case AuWbrCreate_MFSRR: -+ sbinfo->si_wbr_mfs.mfsrr_watermark = create->mfsrr_watermark; -+ /*FALLTHROUGH*/ -+ case AuWbrCreate_MFS: -+ case AuWbrCreate_MFSV: -+ case AuWbrCreate_PMFS: -+ case AuWbrCreate_PMFSV: -+ sbinfo->si_wbr_mfs.mfs_expire = create->mfs_second * HZ; -+ break; -+ } -+ -+ if (sbinfo->si_wbr_create_ops->init) -+ sbinfo->si_wbr_create_ops->init(sb); /* ignore */ -+ -+ return err; -+} -+ -+/* -+ * returns, -+ * plus: processed without an error -+ * zero: unprocessed -+ */ -+static int au_opt_simple(struct super_block *sb, struct au_opt *opt, -+ struct au_opts *opts) -+{ -+ int err; -+ struct au_sbinfo *sbinfo; -+ -+ SiMustWriteLock(sb); -+ -+ err = 1; /* handled */ -+ sbinfo = au_sbi(sb); -+ switch (opt->type) { -+ case Opt_udba: -+ sbinfo->si_mntflags &= ~AuOptMask_UDBA; -+ sbinfo->si_mntflags |= opt->udba; -+ opts->given_udba |= opt->udba; -+ break; -+ -+ case Opt_plink: -+ au_opt_set(sbinfo->si_mntflags, PLINK); -+ break; -+ case Opt_noplink: -+ if (au_opt_test(sbinfo->si_mntflags, PLINK)) -+ au_plink_put(sb); -+ au_opt_clr(sbinfo->si_mntflags, PLINK); -+ break; -+ case Opt_list_plink: -+ if (au_opt_test(sbinfo->si_mntflags, PLINK)) -+ au_plink_list(sb); -+ break; -+ -+ case Opt_diropq_a: -+ au_opt_set(sbinfo->si_mntflags, ALWAYS_DIROPQ); -+ break; -+ case Opt_diropq_w: -+ au_opt_clr(sbinfo->si_mntflags, ALWAYS_DIROPQ); -+ break; -+ -+ case Opt_warn_perm: -+ au_opt_set(sbinfo->si_mntflags, WARN_PERM); -+ break; -+ case Opt_nowarn_perm: -+ au_opt_clr(sbinfo->si_mntflags, WARN_PERM); -+ break; -+ -+ case Opt_refrof: -+ au_opt_set(sbinfo->si_mntflags, REFROF); -+ break; -+ case Opt_norefrof: -+ au_opt_clr(sbinfo->si_mntflags, REFROF); -+ break; -+ -+ case Opt_verbose: -+ au_opt_set(sbinfo->si_mntflags, VERBOSE); -+ break; -+ case Opt_noverbose: -+ au_opt_clr(sbinfo->si_mntflags, VERBOSE); -+ break; -+ -+ case Opt_sum: -+ au_opt_set(sbinfo->si_mntflags, SUM); -+ break; -+ case Opt_wsum: -+ au_opt_clr(sbinfo->si_mntflags, SUM); -+ au_opt_set(sbinfo->si_mntflags, SUM_W); -+ case Opt_nosum: -+ au_opt_clr(sbinfo->si_mntflags, SUM); -+ au_opt_clr(sbinfo->si_mntflags, SUM_W); -+ break; -+ -+ case Opt_wbr_create: -+ err = au_opt_wbr_create(sb, &opt->wbr_create); -+ break; -+ case Opt_wbr_copyup: -+ sbinfo->si_wbr_copyup = opt->wbr_copyup; -+ sbinfo->si_wbr_copyup_ops = au_wbr_copyup_ops + opt->wbr_copyup; -+ break; -+ -+ case Opt_dirwh: -+ sbinfo->si_dirwh = opt->dirwh; -+ break; -+ -+ case Opt_rdcache: -+ sbinfo->si_rdcache = opt->rdcache * HZ; -+ break; -+ case Opt_rdblk: -+ sbinfo->si_rdblk = opt->rdblk; -+ break; -+ case Opt_rdblk_def: -+ sbinfo->si_rdblk = AUFS_RDBLK_DEF; -+ break; -+ case Opt_rdhash: -+ sbinfo->si_rdhash = opt->rdhash; -+ break; -+ case Opt_rdhash_def: -+ sbinfo->si_rdhash = AUFS_RDHASH_DEF; -+ break; -+ -+ case Opt_shwh: -+ au_opt_set(sbinfo->si_mntflags, SHWH); -+ break; -+ case Opt_noshwh: -+ au_opt_clr(sbinfo->si_mntflags, SHWH); -+ break; -+ -+ case Opt_trunc_xino: -+ au_opt_set(sbinfo->si_mntflags, TRUNC_XINO); -+ break; -+ case Opt_notrunc_xino: -+ au_opt_clr(sbinfo->si_mntflags, TRUNC_XINO); -+ break; -+ -+ case Opt_trunc_xino_path: -+ case Opt_itrunc_xino: -+ err = au_xino_trunc(sb, opt->xino_itrunc.bindex); -+ if (!err) -+ err = 1; -+ break; -+ -+ case Opt_trunc_xib: -+ au_fset_opts(opts->flags, TRUNC_XIB); -+ break; -+ case Opt_notrunc_xib: -+ au_fclr_opts(opts->flags, TRUNC_XIB); -+ break; -+ -+ default: -+ err = 0; -+ break; -+ } -+ -+ return err; -+} -+ -+/* -+ * returns tri-state. -+ * plus: processed without an error -+ * zero: unprocessed -+ * minus: error -+ */ -+static int au_opt_br(struct super_block *sb, struct au_opt *opt, -+ struct au_opts *opts) -+{ -+ int err, do_refresh; -+ -+ err = 0; -+ switch (opt->type) { -+ case Opt_append: -+ opt->add.bindex = au_sbend(sb) + 1; -+ if (opt->add.bindex < 0) -+ opt->add.bindex = 0; -+ goto add; -+ case Opt_prepend: -+ opt->add.bindex = 0; -+ add: -+ case Opt_add: -+ err = au_br_add(sb, &opt->add, -+ au_ftest_opts(opts->flags, REMOUNT)); -+ if (!err) { -+ err = 1; -+ au_fset_opts(opts->flags, REFRESH_DIR); -+ if (au_br_whable(opt->add.perm)) -+ au_fset_opts(opts->flags, REFRESH_NONDIR); -+ } -+ break; -+ -+ case Opt_del: -+ case Opt_idel: -+ err = au_br_del(sb, &opt->del, -+ au_ftest_opts(opts->flags, REMOUNT)); -+ if (!err) { -+ err = 1; -+ au_fset_opts(opts->flags, TRUNC_XIB); -+ au_fset_opts(opts->flags, REFRESH_DIR); -+ au_fset_opts(opts->flags, REFRESH_NONDIR); -+ } -+ break; -+ -+ case Opt_mod: -+ case Opt_imod: -+ err = au_br_mod(sb, &opt->mod, -+ au_ftest_opts(opts->flags, REMOUNT), -+ &do_refresh); -+ if (!err) { -+ err = 1; -+ if (do_refresh) { -+ au_fset_opts(opts->flags, REFRESH_DIR); -+ au_fset_opts(opts->flags, REFRESH_NONDIR); -+ } -+ } -+ break; -+ } -+ -+ return err; -+} -+ -+static int au_opt_xino(struct super_block *sb, struct au_opt *opt, -+ struct au_opt_xino **opt_xino, -+ struct au_opts *opts) -+{ -+ int err; -+ aufs_bindex_t bend, bindex; -+ struct dentry *root, *parent, *h_root; -+ -+ err = 0; -+ switch (opt->type) { -+ case Opt_xino: -+ err = au_xino_set(sb, &opt->xino, -+ !!au_ftest_opts(opts->flags, REMOUNT)); -+ if (unlikely(err)) -+ break; -+ -+ *opt_xino = &opt->xino; -+ au_xino_brid_set(sb, -1); -+ -+ /* safe d_parent access */ -+ parent = opt->xino.file->f_dentry->d_parent; -+ root = sb->s_root; -+ bend = au_sbend(sb); -+ for (bindex = 0; bindex <= bend; bindex++) { -+ h_root = au_h_dptr(root, bindex); -+ if (h_root == parent) { -+ au_xino_brid_set(sb, au_sbr_id(sb, bindex)); -+ break; -+ } -+ } -+ break; -+ -+ case Opt_noxino: -+ au_xino_clr(sb); -+ au_xino_brid_set(sb, -1); -+ *opt_xino = (void *)-1; -+ break; -+ } -+ -+ return err; -+} -+ -+int au_opts_verify(struct super_block *sb, unsigned long sb_flags, -+ unsigned int pending) -+{ -+ int err; -+ aufs_bindex_t bindex, bend; -+ unsigned char do_plink, skip, do_free; -+ struct au_branch *br; -+ struct au_wbr *wbr; -+ struct dentry *root; -+ struct inode *dir, *h_dir; -+ struct au_sbinfo *sbinfo; -+ struct au_hinode *hdir; -+ -+ SiMustAnyLock(sb); -+ -+ sbinfo = au_sbi(sb); -+ AuDebugOn(!(sbinfo->si_mntflags & AuOptMask_UDBA)); -+ -+ if (!(sb_flags & MS_RDONLY)) { -+ if (unlikely(!au_br_writable(au_sbr_perm(sb, 0)))) -+ pr_warning("first branch should be rw\n"); -+ if (unlikely(au_opt_test(sbinfo->si_mntflags, SHWH))) -+ pr_warning("shwh should be used with ro\n"); -+ } -+ -+ if (au_opt_test((sbinfo->si_mntflags | pending), UDBA_HNOTIFY) -+ && !au_opt_test(sbinfo->si_mntflags, XINO)) -+ pr_warning("udba=*notify requires xino\n"); -+ -+ err = 0; -+ root = sb->s_root; -+ dir = sb->s_root->d_inode; -+ do_plink = !!au_opt_test(sbinfo->si_mntflags, PLINK); -+ bend = au_sbend(sb); -+ for (bindex = 0; !err && bindex <= bend; bindex++) { -+ skip = 0; -+ h_dir = au_h_iptr(dir, bindex); -+ br = au_sbr(sb, bindex); -+ do_free = 0; -+ -+ wbr = br->br_wbr; -+ if (wbr) -+ wbr_wh_read_lock(wbr); -+ -+ switch (br->br_perm) { -+ case AuBrPerm_RO: -+ case AuBrPerm_ROWH: -+ case AuBrPerm_RR: -+ case AuBrPerm_RRWH: -+ do_free = !!wbr; -+ skip = (!wbr -+ || (!wbr->wbr_whbase -+ && !wbr->wbr_plink -+ && !wbr->wbr_orph)); -+ break; -+ -+ case AuBrPerm_RWNoLinkWH: -+ /* skip = (!br->br_whbase && !br->br_orph); */ -+ skip = (!wbr || !wbr->wbr_whbase); -+ if (skip && wbr) { -+ if (do_plink) -+ skip = !!wbr->wbr_plink; -+ else -+ skip = !wbr->wbr_plink; -+ } -+ break; -+ -+ case AuBrPerm_RW: -+ /* skip = (br->br_whbase && br->br_ohph); */ -+ skip = (wbr && wbr->wbr_whbase); -+ if (skip) { -+ if (do_plink) -+ skip = !!wbr->wbr_plink; -+ else -+ skip = !wbr->wbr_plink; -+ } -+ break; -+ -+ default: -+ BUG(); -+ } -+ if (wbr) -+ wbr_wh_read_unlock(wbr); -+ -+ if (skip) -+ continue; -+ -+ hdir = au_hi(dir, bindex); -+ au_hn_imtx_lock_nested(hdir, AuLsc_I_PARENT); -+ if (wbr) -+ wbr_wh_write_lock(wbr); -+ err = au_wh_init(au_h_dptr(root, bindex), br, sb); -+ if (wbr) -+ wbr_wh_write_unlock(wbr); -+ au_hn_imtx_unlock(hdir); -+ -+ if (!err && do_free) { -+ kfree(wbr); -+ br->br_wbr = NULL; -+ } -+ } -+ -+ return err; -+} -+ -+int au_opts_mount(struct super_block *sb, struct au_opts *opts) -+{ -+ int err; -+ unsigned int tmp; -+ aufs_bindex_t bend; -+ struct au_opt *opt; -+ struct au_opt_xino *opt_xino, xino; -+ struct au_sbinfo *sbinfo; -+ -+ SiMustWriteLock(sb); -+ -+ err = 0; -+ opt_xino = NULL; -+ opt = opts->opt; -+ while (err >= 0 && opt->type != Opt_tail) -+ err = au_opt_simple(sb, opt++, opts); -+ if (err > 0) -+ err = 0; -+ else if (unlikely(err < 0)) -+ goto out; -+ -+ /* disable xino and udba temporary */ -+ sbinfo = au_sbi(sb); -+ tmp = sbinfo->si_mntflags; -+ au_opt_clr(sbinfo->si_mntflags, XINO); -+ au_opt_set_udba(sbinfo->si_mntflags, UDBA_REVAL); -+ -+ opt = opts->opt; -+ while (err >= 0 && opt->type != Opt_tail) -+ err = au_opt_br(sb, opt++, opts); -+ if (err > 0) -+ err = 0; -+ else if (unlikely(err < 0)) -+ goto out; -+ -+ bend = au_sbend(sb); -+ if (unlikely(bend < 0)) { -+ err = -EINVAL; -+ pr_err("no branches\n"); -+ goto out; -+ } -+ -+ if (au_opt_test(tmp, XINO)) -+ au_opt_set(sbinfo->si_mntflags, XINO); -+ opt = opts->opt; -+ while (!err && opt->type != Opt_tail) -+ err = au_opt_xino(sb, opt++, &opt_xino, opts); -+ if (unlikely(err)) -+ goto out; -+ -+ err = au_opts_verify(sb, sb->s_flags, tmp); -+ if (unlikely(err)) -+ goto out; -+ -+ /* restore xino */ -+ if (au_opt_test(tmp, XINO) && !opt_xino) { -+ xino.file = au_xino_def(sb); -+ err = PTR_ERR(xino.file); -+ if (IS_ERR(xino.file)) -+ goto out; -+ -+ err = au_xino_set(sb, &xino, /*remount*/0); -+ fput(xino.file); -+ if (unlikely(err)) -+ goto out; -+ } -+ -+ /* restore udba */ -+ sbinfo->si_mntflags &= ~AuOptMask_UDBA; -+ sbinfo->si_mntflags |= (tmp & AuOptMask_UDBA); -+ if (au_opt_test(tmp, UDBA_HNOTIFY)) { -+ struct inode *dir = sb->s_root->d_inode; -+ au_hn_reset(dir, au_hi_flags(dir, /*isdir*/1) & ~AuHi_XINO); -+ } -+ -+ out: -+ return err; -+} -+ -+int au_opts_remount(struct super_block *sb, struct au_opts *opts) -+{ -+ int err, rerr; -+ struct inode *dir; -+ struct au_opt_xino *opt_xino; -+ struct au_opt *opt; -+ struct au_sbinfo *sbinfo; -+ -+ SiMustWriteLock(sb); -+ -+ dir = sb->s_root->d_inode; -+ sbinfo = au_sbi(sb); -+ err = 0; -+ opt_xino = NULL; -+ opt = opts->opt; -+ while (err >= 0 && opt->type != Opt_tail) { -+ err = au_opt_simple(sb, opt, opts); -+ if (!err) -+ err = au_opt_br(sb, opt, opts); -+ if (!err) -+ err = au_opt_xino(sb, opt, &opt_xino, opts); -+ opt++; -+ } -+ if (err > 0) -+ err = 0; -+ AuTraceErr(err); -+ /* go on even err */ -+ -+ rerr = au_opts_verify(sb, opts->sb_flags, /*pending*/0); -+ if (unlikely(rerr && !err)) -+ err = rerr; -+ -+ if (au_ftest_opts(opts->flags, TRUNC_XIB)) { -+ rerr = au_xib_trunc(sb); -+ if (unlikely(rerr && !err)) -+ err = rerr; -+ } -+ -+ /* will be handled by the caller */ -+ if (!au_ftest_opts(opts->flags, REFRESH_DIR) -+ && (opts->given_udba || au_opt_test(sbinfo->si_mntflags, XINO))) -+ au_fset_opts(opts->flags, REFRESH_DIR); -+ -+ AuDbg("status 0x%x\n", opts->flags); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+unsigned int au_opt_udba(struct super_block *sb) -+{ -+ return au_mntflags(sb) & AuOptMask_UDBA; -+} -diff -Nur linux-2.6.33.1-vanilla/fs/aufs/opts.h linux-2.6.33.1/fs/aufs/opts.h ---- linux-2.6.33.1-vanilla/fs/aufs/opts.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-2.6.33.1/fs/aufs/opts.h 2010-04-05 16:53:27.000000000 +0200 -@@ -0,0 +1,196 @@ -+/* -+ * Copyright (C) 2005-2010 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+/* -+ * mount options/flags -+ */ -+ -+#ifndef __AUFS_OPTS_H__ -+#define __AUFS_OPTS_H__ -+ -+#ifdef __KERNEL__ -+ -+#include -+#include -+ -+struct file; -+struct super_block; -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* mount flags */ -+#define AuOpt_XINO 1 /* external inode number bitmap -+ and translation table */ -+#define AuOpt_TRUNC_XINO (1 << 1) /* truncate xino files */ -+#define AuOpt_UDBA_NONE (1 << 2) /* users direct branch access */ -+#define AuOpt_UDBA_REVAL (1 << 3) -+#define AuOpt_UDBA_HNOTIFY (1 << 4) -+#define AuOpt_SHWH (1 << 5) /* show whiteout */ -+#define AuOpt_PLINK (1 << 6) /* pseudo-link */ -+#define AuOpt_DIRPERM1 (1 << 7) /* unimplemented */ -+#define AuOpt_REFROF (1 << 8) /* unimplemented */ -+#define AuOpt_ALWAYS_DIROPQ (1 << 9) /* policy to creating diropq */ -+#define AuOpt_SUM (1 << 10) /* summation for statfs(2) */ -+#define AuOpt_SUM_W (1 << 11) /* unimplemented */ -+#define AuOpt_WARN_PERM (1 << 12) /* warn when add-branch */ -+#define AuOpt_VERBOSE (1 << 13) /* busy inode when del-branch */ -+ -+#ifndef CONFIG_AUFS_HNOTIFY -+#undef AuOpt_UDBA_HNOTIFY -+#define AuOpt_UDBA_HNOTIFY 0 -+#endif -+#ifndef CONFIG_AUFS_SHWH -+#undef AuOpt_SHWH -+#define AuOpt_SHWH 0 -+#endif -+ -+#define AuOpt_Def (AuOpt_XINO \ -+ | AuOpt_UDBA_REVAL \ -+ | AuOpt_PLINK \ -+ /* | AuOpt_DIRPERM1 */ \ -+ | AuOpt_WARN_PERM) -+#define AuOptMask_UDBA (AuOpt_UDBA_NONE \ -+ | AuOpt_UDBA_REVAL \ -+ | AuOpt_UDBA_HNOTIFY) -+ -+#define au_opt_test(flags, name) (flags & AuOpt_##name) -+#define au_opt_set(flags, name) do { \ -+ BUILD_BUG_ON(AuOpt_##name & AuOptMask_UDBA); \ -+ ((flags) |= AuOpt_##name); \ -+} while (0) -+#define au_opt_set_udba(flags, name) do { \ -+ (flags) &= ~AuOptMask_UDBA; \ -+ ((flags) |= AuOpt_##name); \ -+} while (0) -+#define au_opt_clr(flags, name) { ((flags) &= ~AuOpt_##name); } -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* policies to select one among multiple writable branches */ -+enum { -+ AuWbrCreate_TDP, /* top down parent */ -+ AuWbrCreate_RR, /* round robin */ -+ AuWbrCreate_MFS, /* most free space */ -+ AuWbrCreate_MFSV, /* mfs with seconds */ -+ AuWbrCreate_MFSRR, /* mfs then rr */ -+ AuWbrCreate_MFSRRV, /* mfs then rr with seconds */ -+ AuWbrCreate_PMFS, /* parent and mfs */ -+ AuWbrCreate_PMFSV, /* parent and mfs with seconds */ -+ -+ AuWbrCreate_Def = AuWbrCreate_TDP -+}; -+ -+enum { -+ AuWbrCopyup_TDP, /* top down parent */ -+ AuWbrCopyup_BUP, /* bottom up parent */ -+ AuWbrCopyup_BU, /* bottom up */ -+ -+ AuWbrCopyup_Def = AuWbrCopyup_TDP -+}; -+ -+/* ---------------------------------------------------------------------- */ -+ -+struct au_opt_add { -+ aufs_bindex_t bindex; -+ char *pathname; -+ int perm; -+ struct path path; -+}; -+ -+struct au_opt_del { -+ char *pathname; -+ struct path h_path; -+}; -+ -+struct au_opt_mod { -+ char *path; -+ int perm; -+ struct dentry *h_root; -+}; -+ -+struct au_opt_xino { -+ char *path; -+ struct file *file; -+}; -+ -+struct au_opt_xino_itrunc { -+ aufs_bindex_t bindex; -+}; -+ -+struct au_opt_wbr_create { -+ int wbr_create; -+ int mfs_second; -+ unsigned long long mfsrr_watermark; -+}; -+ -+struct au_opt { -+ int type; -+ union { -+ struct au_opt_xino xino; -+ struct au_opt_xino_itrunc xino_itrunc; -+ struct au_opt_add add; -+ struct au_opt_del del; -+ struct au_opt_mod mod; -+ int dirwh; -+ int rdcache; -+ unsigned int rdblk; -+ unsigned int rdhash; -+ int udba; -+ struct au_opt_wbr_create wbr_create; -+ int wbr_copyup; -+ }; -+}; -+ -+/* opts flags */ -+#define AuOpts_REMOUNT 1 -+#define AuOpts_REFRESH_DIR (1 << 1) -+#define AuOpts_REFRESH_NONDIR (1 << 2) -+#define AuOpts_TRUNC_XIB (1 << 3) -+#define au_ftest_opts(flags, name) ((flags) & AuOpts_##name) -+#define au_fset_opts(flags, name) { (flags) |= AuOpts_##name; } -+#define au_fclr_opts(flags, name) { (flags) &= ~AuOpts_##name; } -+ -+struct au_opts { -+ struct au_opt *opt; -+ int max_opt; -+ -+ unsigned int given_udba; -+ unsigned int flags; -+ unsigned long sb_flags; -+}; -+ -+/* ---------------------------------------------------------------------- */ -+ -+const char *au_optstr_br_perm(int brperm); -+const char *au_optstr_udba(int udba); -+const char *au_optstr_wbr_copyup(int wbr_copyup); -+const char *au_optstr_wbr_create(int wbr_create); -+ -+void au_opts_free(struct au_opts *opts); -+int au_opts_parse(struct super_block *sb, char *str, struct au_opts *opts); -+int au_opts_verify(struct super_block *sb, unsigned long sb_flags, -+ unsigned int pending); -+int au_opts_mount(struct super_block *sb, struct au_opts *opts); -+int au_opts_remount(struct super_block *sb, struct au_opts *opts); -+ -+unsigned int au_opt_udba(struct super_block *sb); -+ -+/* ---------------------------------------------------------------------- */ -+ -+#endif /* __KERNEL__ */ -+#endif /* __AUFS_OPTS_H__ */ -diff -Nur linux-2.6.33.1-vanilla/fs/aufs/plink.c linux-2.6.33.1/fs/aufs/plink.c ---- linux-2.6.33.1-vanilla/fs/aufs/plink.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-2.6.33.1/fs/aufs/plink.c 2010-04-05 16:53:27.000000000 +0200 -@@ -0,0 +1,430 @@ -+/* -+ * Copyright (C) 2005-2010 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+/* -+ * pseudo-link -+ */ -+ -+#include "aufs.h" -+ -+/* -+ * during a user process maintains the pseudo-links, -+ * prohibit adding a new plink and branch manipulation. -+ */ -+void au_plink_maint_block(struct super_block *sb) -+{ -+ struct au_sbinfo *sbi = au_sbi(sb); -+ -+ SiMustAnyLock(sb); -+ -+ /* gave up wake_up_bit() */ -+ wait_event(sbi->si_plink_wq, !sbi->si_plink_maint); -+} -+ -+void au_plink_maint_leave(struct file *file) -+{ -+ struct au_sbinfo *sbinfo; -+ int iam; -+ -+ AuDebugOn(atomic_long_read(&file->f_count)); -+ -+ sbinfo = au_sbi(file->f_dentry->d_sb); -+ spin_lock(&sbinfo->si_plink_maint_lock); -+ iam = (sbinfo->si_plink_maint == file); -+ if (iam) -+ sbinfo->si_plink_maint = NULL; -+ spin_unlock(&sbinfo->si_plink_maint_lock); -+ if (iam) -+ wake_up_all(&sbinfo->si_plink_wq); -+} -+ -+static int au_plink_maint_enter(struct file *file) -+{ -+ int err; -+ struct super_block *sb; -+ struct au_sbinfo *sbinfo; -+ -+ err = 0; -+ sb = file->f_dentry->d_sb; -+ sbinfo = au_sbi(sb); -+ /* make sure i am the only one in this fs */ -+ si_write_lock(sb); -+ /* spin_lock(&sbinfo->si_plink_maint_lock); */ -+ if (!sbinfo->si_plink_maint) -+ sbinfo->si_plink_maint = file; -+ else -+ err = -EBUSY; -+ /* spin_unlock(&sbinfo->si_plink_maint_lock); */ -+ si_write_unlock(sb); -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+struct pseudo_link { -+ struct list_head list; -+ struct inode *inode; -+}; -+ -+#ifdef CONFIG_AUFS_DEBUG -+void au_plink_list(struct super_block *sb) -+{ -+ struct au_sbinfo *sbinfo; -+ struct list_head *plink_list; -+ struct pseudo_link *plink; -+ -+ SiMustAnyLock(sb); -+ -+ sbinfo = au_sbi(sb); -+ AuDebugOn(!au_opt_test(au_mntflags(sb), PLINK)); -+ -+ plink_list = &sbinfo->si_plink.head; -+ spin_lock(&sbinfo->si_plink.spin); -+ list_for_each_entry(plink, plink_list, list) -+ AuDbg("%lu\n", plink->inode->i_ino); -+ spin_unlock(&sbinfo->si_plink.spin); -+} -+#endif -+ -+/* is the inode pseudo-linked? */ -+int au_plink_test(struct inode *inode) -+{ -+ int found; -+ struct au_sbinfo *sbinfo; -+ struct list_head *plink_list; -+ struct pseudo_link *plink; -+ -+ sbinfo = au_sbi(inode->i_sb); -+ AuRwMustAnyLock(&sbinfo->si_rwsem); -+ AuDebugOn(!au_opt_test(au_mntflags(inode->i_sb), PLINK)); -+ -+ found = 0; -+ plink_list = &sbinfo->si_plink.head; -+ spin_lock(&sbinfo->si_plink.spin); -+ list_for_each_entry(plink, plink_list, list) -+ if (plink->inode == inode) { -+ found = 1; -+ break; -+ } -+ spin_unlock(&sbinfo->si_plink.spin); -+ return found; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * generate a name for plink. -+ * the file will be stored under AUFS_WH_PLINKDIR. -+ */ -+/* 20 is max digits length of ulong 64 */ -+#define PLINK_NAME_LEN ((20 + 1) * 2) -+ -+static int plink_name(char *name, int len, struct inode *inode, -+ aufs_bindex_t bindex) -+{ -+ int rlen; -+ struct inode *h_inode; -+ -+ h_inode = au_h_iptr(inode, bindex); -+ rlen = snprintf(name, len, "%lu.%lu", inode->i_ino, h_inode->i_ino); -+ return rlen; -+} -+ -+/* lookup the plink-ed @inode under the branch at @bindex */ -+struct dentry *au_plink_lkup(struct inode *inode, aufs_bindex_t bindex) -+{ -+ struct dentry *h_dentry, *h_parent; -+ struct au_branch *br; -+ struct inode *h_dir; -+ char a[PLINK_NAME_LEN]; -+ struct qstr tgtname = { -+ .name = a -+ }; -+ -+ br = au_sbr(inode->i_sb, bindex); -+ h_parent = br->br_wbr->wbr_plink; -+ h_dir = h_parent->d_inode; -+ tgtname.len = plink_name(a, sizeof(a), inode, bindex); -+ -+ /* always superio. */ -+ mutex_lock_nested(&h_dir->i_mutex, AuLsc_I_CHILD2); -+ h_dentry = au_sio_lkup_one(&tgtname, h_parent, br); -+ mutex_unlock(&h_dir->i_mutex); -+ return h_dentry; -+} -+ -+/* create a pseudo-link */ -+static int do_whplink(struct qstr *tgt, struct dentry *h_parent, -+ struct dentry *h_dentry, struct au_branch *br) -+{ -+ int err; -+ struct path h_path = { -+ .mnt = br->br_mnt -+ }; -+ struct inode *h_dir; -+ -+ h_dir = h_parent->d_inode; -+ again: -+ h_path.dentry = au_lkup_one(tgt, h_parent, br, /*nd*/NULL); -+ err = PTR_ERR(h_path.dentry); -+ if (IS_ERR(h_path.dentry)) -+ goto out; -+ -+ err = 0; -+ /* wh.plink dir is not monitored */ -+ if (h_path.dentry->d_inode -+ && h_path.dentry->d_inode != h_dentry->d_inode) { -+ err = vfsub_unlink(h_dir, &h_path, /*force*/0); -+ dput(h_path.dentry); -+ h_path.dentry = NULL; -+ if (!err) -+ goto again; -+ } -+ if (!err && !h_path.dentry->d_inode) -+ err = vfsub_link(h_dentry, h_dir, &h_path); -+ dput(h_path.dentry); -+ -+ out: -+ return err; -+} -+ -+struct do_whplink_args { -+ int *errp; -+ struct qstr *tgt; -+ struct dentry *h_parent; -+ struct dentry *h_dentry; -+ struct au_branch *br; -+}; -+ -+static void call_do_whplink(void *args) -+{ -+ struct do_whplink_args *a = args; -+ *a->errp = do_whplink(a->tgt, a->h_parent, a->h_dentry, a->br); -+} -+ -+static int whplink(struct dentry *h_dentry, struct inode *inode, -+ aufs_bindex_t bindex, struct au_branch *br) -+{ -+ int err, wkq_err; -+ struct au_wbr *wbr; -+ struct dentry *h_parent; -+ struct inode *h_dir; -+ char a[PLINK_NAME_LEN]; -+ struct qstr tgtname = { -+ .name = a -+ }; -+ -+ wbr = au_sbr(inode->i_sb, bindex)->br_wbr; -+ h_parent = wbr->wbr_plink; -+ h_dir = h_parent->d_inode; -+ tgtname.len = plink_name(a, sizeof(a), inode, bindex); -+ -+ /* always superio. */ -+ mutex_lock_nested(&h_dir->i_mutex, AuLsc_I_CHILD2); -+ if (!au_test_wkq(current)) { -+ struct do_whplink_args args = { -+ .errp = &err, -+ .tgt = &tgtname, -+ .h_parent = h_parent, -+ .h_dentry = h_dentry, -+ .br = br -+ }; -+ wkq_err = au_wkq_wait(call_do_whplink, &args); -+ if (unlikely(wkq_err)) -+ err = wkq_err; -+ } else -+ err = do_whplink(&tgtname, h_parent, h_dentry, br); -+ mutex_unlock(&h_dir->i_mutex); -+ -+ return err; -+} -+ -+/* free a single plink */ -+static void do_put_plink(struct pseudo_link *plink, int do_del) -+{ -+ iput(plink->inode); -+ if (do_del) -+ list_del(&plink->list); -+ kfree(plink); -+} -+ -+/* -+ * create a new pseudo-link for @h_dentry on @bindex. -+ * the linked inode is held in aufs @inode. -+ */ -+void au_plink_append(struct inode *inode, aufs_bindex_t bindex, -+ struct dentry *h_dentry) -+{ -+ struct super_block *sb; -+ struct au_sbinfo *sbinfo; -+ struct list_head *plink_list; -+ struct pseudo_link *plink; -+ int found, err, cnt; -+ -+ sb = inode->i_sb; -+ sbinfo = au_sbi(sb); -+ AuDebugOn(!au_opt_test(au_mntflags(sb), PLINK)); -+ -+ err = 0; -+ cnt = 0; -+ found = 0; -+ plink_list = &sbinfo->si_plink.head; -+ spin_lock(&sbinfo->si_plink.spin); -+ list_for_each_entry(plink, plink_list, list) { -+ cnt++; -+ if (plink->inode == inode) { -+ found = 1; -+ break; -+ } -+ } -+ if (found) { -+ spin_unlock(&sbinfo->si_plink.spin); -+ return; -+ } -+ -+ plink = NULL; -+ if (!found) { -+ plink = kmalloc(sizeof(*plink), GFP_ATOMIC); -+ if (plink) { -+ plink->inode = au_igrab(inode); -+ list_add(&plink->list, plink_list); -+ cnt++; -+ } else -+ err = -ENOMEM; -+ } -+ spin_unlock(&sbinfo->si_plink.spin); -+ -+ if (!err) { -+ au_plink_maint_block(sb); -+ err = whplink(h_dentry, inode, bindex, au_sbr(sb, bindex)); -+ } -+ -+ if (unlikely(cnt > AUFS_PLINK_WARN)) -+ AuWarn1("unexpectedly many pseudo links, %d\n", cnt); -+ if (unlikely(err)) { -+ pr_warning("err %d, damaged pseudo link.\n", err); -+ if (!found && plink) -+ do_put_plink(plink, /*do_del*/1); -+ } -+} -+ -+/* free all plinks */ -+void au_plink_put(struct super_block *sb) -+{ -+ struct au_sbinfo *sbinfo; -+ struct list_head *plink_list; -+ struct pseudo_link *plink, *tmp; -+ -+ SiMustWriteLock(sb); -+ -+ sbinfo = au_sbi(sb); -+ AuDebugOn(!au_opt_test(au_mntflags(sb), PLINK)); -+ -+ plink_list = &sbinfo->si_plink.head; -+ /* no spin_lock since sbinfo is write-locked */ -+ list_for_each_entry_safe(plink, tmp, plink_list, list) -+ do_put_plink(plink, 0); -+ INIT_LIST_HEAD(plink_list); -+} -+ -+/* free the plinks on a branch specified by @br_id */ -+void au_plink_half_refresh(struct super_block *sb, aufs_bindex_t br_id) -+{ -+ struct au_sbinfo *sbinfo; -+ struct list_head *plink_list; -+ struct pseudo_link *plink, *tmp; -+ struct inode *inode; -+ aufs_bindex_t bstart, bend, bindex; -+ unsigned char do_put; -+ -+ SiMustWriteLock(sb); -+ -+ sbinfo = au_sbi(sb); -+ AuDebugOn(!au_opt_test(au_mntflags(sb), PLINK)); -+ -+ plink_list = &sbinfo->si_plink.head; -+ /* no spin_lock since sbinfo is write-locked */ -+ list_for_each_entry_safe(plink, tmp, plink_list, list) { -+ do_put = 0; -+ inode = au_igrab(plink->inode); -+ ii_write_lock_child(inode); -+ bstart = au_ibstart(inode); -+ bend = au_ibend(inode); -+ if (bstart >= 0) { -+ for (bindex = bstart; bindex <= bend; bindex++) { -+ if (!au_h_iptr(inode, bindex) -+ || au_ii_br_id(inode, bindex) != br_id) -+ continue; -+ au_set_h_iptr(inode, bindex, NULL, 0); -+ do_put = 1; -+ break; -+ } -+ } else -+ do_put_plink(plink, 1); -+ -+ if (do_put) { -+ for (bindex = bstart; bindex <= bend; bindex++) -+ if (au_h_iptr(inode, bindex)) { -+ do_put = 0; -+ break; -+ } -+ if (do_put) -+ do_put_plink(plink, 1); -+ } -+ ii_write_unlock(inode); -+ iput(inode); -+ } -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+long au_plink_ioctl(struct file *file, unsigned int cmd) -+{ -+ long err; -+ struct super_block *sb; -+ struct au_sbinfo *sbinfo; -+ -+ err = -EACCES; -+ if (!capable(CAP_SYS_ADMIN)) -+ goto out; -+ -+ err = 0; -+ sb = file->f_dentry->d_sb; -+ sbinfo = au_sbi(sb); -+ switch (cmd) { -+ case AUFS_CTL_PLINK_MAINT: -+ /* -+ * pseudo-link maintenance mode, -+ * cleared by aufs_release_dir() -+ */ -+ err = au_plink_maint_enter(file); -+ break; -+ case AUFS_CTL_PLINK_CLEAN: -+ aufs_write_lock(sb->s_root); -+ if (au_opt_test(sbinfo->si_mntflags, PLINK)) -+ au_plink_put(sb); -+ aufs_write_unlock(sb->s_root); -+ break; -+ default: -+ /* err = -ENOTTY; */ -+ err = -EINVAL; -+ } -+ out: -+ return err; -+} -diff -Nur linux-2.6.33.1-vanilla/fs/aufs/poll.c linux-2.6.33.1/fs/aufs/poll.c ---- linux-2.6.33.1-vanilla/fs/aufs/poll.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-2.6.33.1/fs/aufs/poll.c 2010-04-05 16:53:27.000000000 +0200 -@@ -0,0 +1,56 @@ -+/* -+ * Copyright (C) 2005-2010 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+/* -+ * poll operation -+ * There is only one filesystem which implements ->poll operation, currently. -+ */ -+ -+#include "aufs.h" -+ -+unsigned int aufs_poll(struct file *file, poll_table *wait) -+{ -+ unsigned int mask; -+ int err; -+ struct file *h_file; -+ struct dentry *dentry; -+ struct super_block *sb; -+ -+ /* We should pretend an error happened. */ -+ mask = POLLERR /* | POLLIN | POLLOUT */; -+ dentry = file->f_dentry; -+ sb = dentry->d_sb; -+ si_read_lock(sb, AuLock_FLUSH); -+ err = au_reval_and_lock_fdi(file, au_reopen_nondir, /*wlock*/0); -+ if (unlikely(err)) -+ goto out; -+ -+ /* it is not an error if h_file has no operation */ -+ mask = DEFAULT_POLLMASK; -+ h_file = au_h_fptr(file, au_fbstart(file)); -+ if (h_file->f_op && h_file->f_op->poll) -+ mask = h_file->f_op->poll(h_file, wait); -+ -+ di_read_unlock(dentry, AuLock_IR); -+ fi_read_unlock(file); -+ -+ out: -+ si_read_unlock(sb); -+ AuTraceErr((int)mask); -+ return mask; -+} -diff -Nur linux-2.6.33.1-vanilla/fs/aufs/rdu.c linux-2.6.33.1/fs/aufs/rdu.c ---- linux-2.6.33.1-vanilla/fs/aufs/rdu.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-2.6.33.1/fs/aufs/rdu.c 2010-04-05 16:53:27.000000000 +0200 -@@ -0,0 +1,330 @@ -+/* -+ * Copyright (C) 2005-2010 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+/* -+ * readdir in userspace. -+ */ -+ -+#include -+#include -+#include -+#include -+#include "aufs.h" -+ -+/* bits for struct aufs_rdu.flags */ -+#define AuRdu_CALLED 1 -+#define AuRdu_CONT (1 << 1) -+#define AuRdu_FULL (1 << 2) -+#define au_ftest_rdu(flags, name) ((flags) & AuRdu_##name) -+#define au_fset_rdu(flags, name) { (flags) |= AuRdu_##name; } -+#define au_fclr_rdu(flags, name) { (flags) &= ~AuRdu_##name; } -+ -+struct au_rdu_arg { -+ struct aufs_rdu *rdu; -+ union au_rdu_ent_ul ent; -+ unsigned long end; -+ -+ struct super_block *sb; -+ int err; -+}; -+ -+static int au_rdu_fill(void *__arg, const char *name, int nlen, -+ loff_t offset, u64 h_ino, unsigned int d_type) -+{ -+ int err, len; -+ struct au_rdu_arg *arg = __arg; -+ struct aufs_rdu *rdu = arg->rdu; -+ struct au_rdu_ent ent; -+ -+ err = 0; -+ arg->err = 0; -+ au_fset_rdu(rdu->cookie.flags, CALLED); -+ len = au_rdu_len(nlen); -+ if (arg->ent.ul + len < arg->end) { -+ ent.ino = h_ino; -+ ent.bindex = rdu->cookie.bindex; -+ ent.type = d_type; -+ ent.nlen = nlen; -+ if (unlikely(nlen > AUFS_MAX_NAMELEN)) -+ ent.type = DT_UNKNOWN; -+ -+ err = -EFAULT; -+ if (copy_to_user(arg->ent.e, &ent, sizeof(ent))) -+ goto out; -+ if (copy_to_user(arg->ent.e->name, name, nlen)) -+ goto out; -+ /* the terminating NULL */ -+ if (__put_user(0, arg->ent.e->name + nlen)) -+ goto out; -+ err = 0; -+ /* AuDbg("%p, %.*s\n", arg->ent.p, nlen, name); */ -+ arg->ent.ul += len; -+ rdu->rent++; -+ } else { -+ err = -EFAULT; -+ au_fset_rdu(rdu->cookie.flags, FULL); -+ rdu->full = 1; -+ rdu->tail = arg->ent; -+ } -+ -+ out: -+ /* AuTraceErr(err); */ -+ return err; -+} -+ -+static int au_rdu_do(struct file *h_file, struct au_rdu_arg *arg) -+{ -+ int err; -+ loff_t offset; -+ struct au_rdu_cookie *cookie = &arg->rdu->cookie; -+ -+ offset = vfsub_llseek(h_file, cookie->h_pos, SEEK_SET); -+ err = offset; -+ if (unlikely(offset != cookie->h_pos)) -+ goto out; -+ -+ err = 0; -+ do { -+ arg->err = 0; -+ au_fclr_rdu(cookie->flags, CALLED); -+ /* smp_mb(); */ -+ err = vfsub_readdir(h_file, au_rdu_fill, arg); -+ if (err >= 0) -+ err = arg->err; -+ } while (!err -+ && au_ftest_rdu(cookie->flags, CALLED) -+ && !au_ftest_rdu(cookie->flags, FULL)); -+ cookie->h_pos = h_file->f_pos; -+ -+ out: -+ AuTraceErr(err); -+ return err; -+} -+ -+static int au_rdu(struct file *file, struct aufs_rdu *rdu) -+{ -+ int err; -+ aufs_bindex_t bend; -+ struct au_rdu_arg arg; -+ struct dentry *dentry; -+ struct inode *inode; -+ struct file *h_file; -+ struct au_rdu_cookie *cookie = &rdu->cookie; -+ -+ err = !access_ok(VERIFY_WRITE, rdu->ent.e, rdu->sz); -+ if (unlikely(err)) { -+ err = -EFAULT; -+ AuTraceErr(err); -+ goto out; -+ } -+ rdu->rent = 0; -+ rdu->tail = rdu->ent; -+ rdu->full = 0; -+ arg.rdu = rdu; -+ arg.ent = rdu->ent; -+ arg.end = arg.ent.ul; -+ arg.end += rdu->sz; -+ -+ err = -ENOTDIR; -+ if (unlikely(!file->f_op || !file->f_op->readdir)) -+ goto out; -+ -+ err = security_file_permission(file, MAY_READ); -+ AuTraceErr(err); -+ if (unlikely(err)) -+ goto out; -+ -+ dentry = file->f_dentry; -+ inode = dentry->d_inode; -+#if 1 -+ mutex_lock(&inode->i_mutex); -+#else -+ err = mutex_lock_killable(&inode->i_mutex); -+ AuTraceErr(err); -+ if (unlikely(err)) -+ goto out; -+#endif -+ err = -ENOENT; -+ if (unlikely(IS_DEADDIR(inode))) -+ goto out_mtx; -+ -+ arg.sb = inode->i_sb; -+ si_read_lock(arg.sb, AuLock_FLUSH); -+ fi_read_lock(file); -+ -+ err = -EAGAIN; -+ if (unlikely(au_ftest_rdu(cookie->flags, CONT) -+ && cookie->generation != au_figen(file))) -+ goto out_unlock; -+ -+ err = 0; -+ if (!rdu->blk) { -+ rdu->blk = au_sbi(arg.sb)->si_rdblk; -+ if (!rdu->blk) -+ rdu->blk = au_dir_size(file, /*dentry*/NULL); -+ } -+ bend = au_fbstart(file); -+ if (cookie->bindex < bend) -+ cookie->bindex = bend; -+ bend = au_fbend(file); -+ /* AuDbg("b%d, b%d\n", cookie->bindex, bend); */ -+ for (; !err && cookie->bindex <= bend; -+ cookie->bindex++, cookie->h_pos = 0) { -+ h_file = au_h_fptr(file, cookie->bindex); -+ if (!h_file) -+ continue; -+ -+ au_fclr_rdu(cookie->flags, FULL); -+ err = au_rdu_do(h_file, &arg); -+ AuTraceErr(err); -+ if (unlikely(au_ftest_rdu(cookie->flags, FULL) || err)) -+ break; -+ } -+ AuDbg("rent %llu\n", rdu->rent); -+ -+ if (!err && !au_ftest_rdu(cookie->flags, CONT)) { -+ rdu->shwh = !!au_opt_test(au_sbi(arg.sb)->si_mntflags, SHWH); -+ au_fset_rdu(cookie->flags, CONT); -+ cookie->generation = au_figen(file); -+ } -+ -+ ii_read_lock_child(inode); -+ fsstack_copy_attr_atime(inode, au_h_iptr(inode, au_ibstart(inode))); -+ ii_read_unlock(inode); -+ -+ out_unlock: -+ fi_read_unlock(file); -+ si_read_unlock(arg.sb); -+ out_mtx: -+ mutex_unlock(&inode->i_mutex); -+ out: -+ AuTraceErr(err); -+ return err; -+} -+ -+static int au_rdu_ino(struct file *file, struct aufs_rdu *rdu) -+{ -+ int err; -+ ino_t ino; -+ unsigned long long nent; -+ union au_rdu_ent_ul *u; -+ struct au_rdu_ent ent; -+ struct super_block *sb; -+ -+ err = 0; -+ nent = rdu->nent; -+ u = &rdu->ent; -+ sb = file->f_dentry->d_sb; -+ si_read_lock(sb, AuLock_FLUSH); -+ while (nent-- > 0) { -+ err = copy_from_user(&ent, u->e, sizeof(ent)); -+ if (!err) -+ err = !access_ok(VERIFY_WRITE, &u->e->ino, sizeof(ino)); -+ if (unlikely(err)) { -+ err = -EFAULT; -+ AuTraceErr(err); -+ break; -+ } -+ -+ /* AuDbg("b%d, i%llu\n", ent.bindex, ent.ino); */ -+ if (!ent.wh) -+ err = au_ino(sb, ent.bindex, ent.ino, ent.type, &ino); -+ else -+ err = au_wh_ino(sb, ent.bindex, ent.ino, ent.type, -+ &ino); -+ if (unlikely(err)) { -+ AuTraceErr(err); -+ break; -+ } -+ -+ err = __put_user(ino, &u->e->ino); -+ if (unlikely(err)) { -+ err = -EFAULT; -+ AuTraceErr(err); -+ break; -+ } -+ u->ul += au_rdu_len(ent.nlen); -+ } -+ si_read_unlock(sb); -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int au_rdu_verify(struct aufs_rdu *rdu) -+{ -+ AuDbg("rdu{%llu, %p, (%u, %u) | %u | %llu, %u, %u | " -+ "%llu, b%d, 0x%x, g%u}\n", -+ rdu->sz, rdu->ent.e, rdu->verify[0], rdu->verify[1], -+ rdu->blk, -+ rdu->rent, rdu->shwh, rdu->full, -+ rdu->cookie.h_pos, rdu->cookie.bindex, rdu->cookie.flags, -+ rdu->cookie.generation); -+ -+ if (rdu->verify[AufsCtlRduV_SZ] == sizeof(*rdu) -+ && rdu->verify[AufsCtlRduV_SZ_PTR] == sizeof(rdu)) -+ return 0; -+ -+ AuDbg("%u:%u, %u:%u\n", -+ rdu->verify[AufsCtlRduV_SZ], (unsigned int)sizeof(*rdu), -+ rdu->verify[AufsCtlRduV_SZ_PTR], (unsigned int)sizeof(rdu)); -+ return -EINVAL; -+} -+ -+long au_rdu_ioctl(struct file *file, unsigned int cmd, unsigned long arg) -+{ -+ long err, e; -+ struct aufs_rdu rdu; -+ void __user *p = (void __user *)arg; -+ -+ err = copy_from_user(&rdu, p, sizeof(rdu)); -+ if (unlikely(err)) { -+ err = -EFAULT; -+ AuTraceErr(err); -+ goto out; -+ } -+ err = au_rdu_verify(&rdu); -+ if (unlikely(err)) -+ goto out; -+ -+ switch (cmd) { -+ case AUFS_CTL_RDU: -+ err = au_rdu(file, &rdu); -+ if (unlikely(err)) -+ break; -+ -+ e = copy_to_user(p, &rdu, sizeof(rdu)); -+ if (unlikely(e)) { -+ err = -EFAULT; -+ AuTraceErr(err); -+ } -+ break; -+ case AUFS_CTL_RDU_INO: -+ err = au_rdu_ino(file, &rdu); -+ break; -+ -+ default: -+ /* err = -ENOTTY; */ -+ err = -EINVAL; -+ } -+ -+ out: -+ AuTraceErr(err); -+ return err; -+} -diff -Nur linux-2.6.33.1-vanilla/fs/aufs/rwsem.h linux-2.6.33.1/fs/aufs/rwsem.h ---- linux-2.6.33.1-vanilla/fs/aufs/rwsem.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-2.6.33.1/fs/aufs/rwsem.h 2010-04-05 16:53:27.000000000 +0200 -@@ -0,0 +1,187 @@ -+/* -+ * Copyright (C) 2005-2010 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+/* -+ * simple read-write semaphore wrappers -+ */ -+ -+#ifndef __AUFS_RWSEM_H__ -+#define __AUFS_RWSEM_H__ -+ -+#ifdef __KERNEL__ -+ -+#include -+#include "debug.h" -+ -+struct au_rwsem { -+ struct rw_semaphore rwsem; -+#ifdef CONFIG_AUFS_DEBUG -+ /* just for debugging, not almighty counter */ -+ atomic_t rcnt, wcnt; -+#endif -+}; -+ -+#ifdef CONFIG_AUFS_DEBUG -+#define AuDbgCntInit(rw) do { \ -+ atomic_set(&(rw)->rcnt, 0); \ -+ atomic_set(&(rw)->wcnt, 0); \ -+ smp_mb(); /* atomic set */ \ -+} while (0) -+ -+#define AuDbgRcntInc(rw) atomic_inc_return(&(rw)->rcnt) -+#define AuDbgRcntDec(rw) WARN_ON(atomic_dec_return(&(rw)->rcnt) < 0) -+#define AuDbgWcntInc(rw) WARN_ON(atomic_inc_return(&(rw)->wcnt) > 1) -+#define AuDbgWcntDec(rw) WARN_ON(atomic_dec_return(&(rw)->wcnt) < 0) -+#else -+#define AuDbgCntInit(rw) do {} while (0) -+#define AuDbgRcntInc(rw) do {} while (0) -+#define AuDbgRcntDec(rw) do {} while (0) -+#define AuDbgWcntInc(rw) do {} while (0) -+#define AuDbgWcntDec(rw) do {} while (0) -+#endif /* CONFIG_AUFS_DEBUG */ -+ -+/* to debug easier, do not make them inlined functions */ -+#define AuRwMustNoWaiters(rw) AuDebugOn(!list_empty(&(rw)->rwsem.wait_list)) -+/* rwsem_is_locked() is unusable */ -+#define AuRwMustReadLock(rw) AuDebugOn(atomic_read(&(rw)->rcnt) <= 0) -+#define AuRwMustWriteLock(rw) AuDebugOn(atomic_read(&(rw)->wcnt) <= 0) -+#define AuRwMustAnyLock(rw) AuDebugOn(atomic_read(&(rw)->rcnt) <= 0 \ -+ && atomic_read(&(rw)->wcnt) <= 0) -+#define AuRwDestroy(rw) AuDebugOn(atomic_read(&(rw)->rcnt) \ -+ || atomic_read(&(rw)->wcnt)) -+ -+static inline void au_rw_init(struct au_rwsem *rw) -+{ -+ AuDbgCntInit(rw); -+ init_rwsem(&rw->rwsem); -+} -+ -+static inline void au_rw_init_wlock(struct au_rwsem *rw) -+{ -+ au_rw_init(rw); -+ down_write(&rw->rwsem); -+ AuDbgWcntInc(rw); -+} -+ -+static inline void au_rw_init_wlock_nested(struct au_rwsem *rw, -+ unsigned int lsc) -+{ -+ au_rw_init(rw); -+ down_write_nested(&rw->rwsem, lsc); -+ AuDbgWcntInc(rw); -+} -+ -+static inline void au_rw_read_lock(struct au_rwsem *rw) -+{ -+ down_read(&rw->rwsem); -+ AuDbgRcntInc(rw); -+} -+ -+static inline void au_rw_read_lock_nested(struct au_rwsem *rw, unsigned int lsc) -+{ -+ down_read_nested(&rw->rwsem, lsc); -+ AuDbgRcntInc(rw); -+} -+ -+static inline void au_rw_read_unlock(struct au_rwsem *rw) -+{ -+ AuRwMustReadLock(rw); -+ AuDbgRcntDec(rw); -+ up_read(&rw->rwsem); -+} -+ -+static inline void au_rw_dgrade_lock(struct au_rwsem *rw) -+{ -+ AuRwMustWriteLock(rw); -+ AuDbgRcntInc(rw); -+ AuDbgWcntDec(rw); -+ downgrade_write(&rw->rwsem); -+} -+ -+static inline void au_rw_write_lock(struct au_rwsem *rw) -+{ -+ down_write(&rw->rwsem); -+ AuDbgWcntInc(rw); -+} -+ -+static inline void au_rw_write_lock_nested(struct au_rwsem *rw, -+ unsigned int lsc) -+{ -+ down_write_nested(&rw->rwsem, lsc); -+ AuDbgWcntInc(rw); -+} -+ -+static inline void au_rw_write_unlock(struct au_rwsem *rw) -+{ -+ AuRwMustWriteLock(rw); -+ AuDbgWcntDec(rw); -+ up_write(&rw->rwsem); -+} -+ -+/* why is not _nested version defined */ -+static inline int au_rw_read_trylock(struct au_rwsem *rw) -+{ -+ int ret = down_read_trylock(&rw->rwsem); -+ if (ret) -+ AuDbgRcntInc(rw); -+ return ret; -+} -+ -+static inline int au_rw_write_trylock(struct au_rwsem *rw) -+{ -+ int ret = down_write_trylock(&rw->rwsem); -+ if (ret) -+ AuDbgWcntInc(rw); -+ return ret; -+} -+ -+#undef AuDbgCntInit -+#undef AuDbgRcntInc -+#undef AuDbgRcntDec -+#undef AuDbgWcntInc -+#undef AuDbgWcntDec -+ -+#define AuSimpleLockRwsemFuncs(prefix, param, rwsem) \ -+static inline void prefix##_read_lock(param) \ -+{ au_rw_read_lock(rwsem); } \ -+static inline void prefix##_write_lock(param) \ -+{ au_rw_write_lock(rwsem); } \ -+static inline int prefix##_read_trylock(param) \ -+{ return au_rw_read_trylock(rwsem); } \ -+static inline int prefix##_write_trylock(param) \ -+{ return au_rw_write_trylock(rwsem); } -+/* why is not _nested version defined */ -+/* static inline void prefix##_read_trylock_nested(param, lsc) -+{ au_rw_read_trylock_nested(rwsem, lsc)); } -+static inline void prefix##_write_trylock_nestd(param, lsc) -+{ au_rw_write_trylock_nested(rwsem, lsc); } */ -+ -+#define AuSimpleUnlockRwsemFuncs(prefix, param, rwsem) \ -+static inline void prefix##_read_unlock(param) \ -+{ au_rw_read_unlock(rwsem); } \ -+static inline void prefix##_write_unlock(param) \ -+{ au_rw_write_unlock(rwsem); } \ -+static inline void prefix##_downgrade_lock(param) \ -+{ au_rw_dgrade_lock(rwsem); } -+ -+#define AuSimpleRwsemFuncs(prefix, param, rwsem) \ -+ AuSimpleLockRwsemFuncs(prefix, param, rwsem) \ -+ AuSimpleUnlockRwsemFuncs(prefix, param, rwsem) -+ -+#endif /* __KERNEL__ */ -+#endif /* __AUFS_RWSEM_H__ */ -diff -Nur linux-2.6.33.1-vanilla/fs/aufs/sbinfo.c linux-2.6.33.1/fs/aufs/sbinfo.c ---- linux-2.6.33.1-vanilla/fs/aufs/sbinfo.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-2.6.33.1/fs/aufs/sbinfo.c 2010-04-05 16:53:27.000000000 +0200 -@@ -0,0 +1,202 @@ -+/* -+ * Copyright (C) 2005-2010 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+/* -+ * superblock private data -+ */ -+ -+#include "aufs.h" -+ -+/* -+ * they are necessary regardless sysfs is disabled. -+ */ -+void au_si_free(struct kobject *kobj) -+{ -+ struct au_sbinfo *sbinfo; -+ struct super_block *sb; -+ -+ sbinfo = container_of(kobj, struct au_sbinfo, si_kobj); -+ AuDebugOn(!list_empty(&sbinfo->si_plink.head)); -+ AuDebugOn(sbinfo->si_plink_maint); -+ -+ sb = sbinfo->si_sb; -+ si_write_lock(sb); -+ au_xino_clr(sb); -+ au_br_free(sbinfo); -+ kfree(sbinfo->si_branch); -+ mutex_destroy(&sbinfo->si_xib_mtx); -+ si_write_unlock(sb); -+ AuRwDestroy(&sbinfo->si_rwsem); -+ -+ kfree(sbinfo); -+} -+ -+int au_si_alloc(struct super_block *sb) -+{ -+ int err; -+ struct au_sbinfo *sbinfo; -+ -+ err = -ENOMEM; -+ sbinfo = kzalloc(sizeof(*sbinfo), GFP_NOFS); -+ if (unlikely(!sbinfo)) -+ goto out; -+ -+ /* will be reallocated separately */ -+ sbinfo->si_branch = kzalloc(sizeof(*sbinfo->si_branch), GFP_NOFS); -+ if (unlikely(!sbinfo->si_branch)) -+ goto out_sbinfo; -+ -+ err = sysaufs_si_init(sbinfo); -+ if (unlikely(err)) -+ goto out_br; -+ -+ au_nwt_init(&sbinfo->si_nowait); -+ au_rw_init_wlock(&sbinfo->si_rwsem); -+ sbinfo->si_bend = -1; -+ -+ sbinfo->si_wbr_copyup = AuWbrCopyup_Def; -+ sbinfo->si_wbr_create = AuWbrCreate_Def; -+ sbinfo->si_wbr_copyup_ops = au_wbr_copyup_ops + sbinfo->si_wbr_copyup; -+ sbinfo->si_wbr_create_ops = au_wbr_create_ops + sbinfo->si_wbr_create; -+ -+ sbinfo->si_mntflags = AuOpt_Def; -+ -+ mutex_init(&sbinfo->si_xib_mtx); -+ sbinfo->si_xino_brid = -1; -+ /* leave si_xib_last_pindex and si_xib_next_bit */ -+ -+ sbinfo->si_rdcache = AUFS_RDCACHE_DEF * HZ; -+ sbinfo->si_rdblk = AUFS_RDBLK_DEF; -+ sbinfo->si_rdhash = AUFS_RDHASH_DEF; -+ sbinfo->si_dirwh = AUFS_DIRWH_DEF; -+ -+ au_spl_init(&sbinfo->si_plink); -+ init_waitqueue_head(&sbinfo->si_plink_wq); -+ spin_lock_init(&sbinfo->si_plink_maint_lock); -+ -+ /* leave other members for sysaufs and si_mnt. */ -+ sbinfo->si_sb = sb; -+ sb->s_fs_info = sbinfo; -+ au_debug_sbinfo_init(sbinfo); -+ return 0; /* success */ -+ -+ out_br: -+ kfree(sbinfo->si_branch); -+ out_sbinfo: -+ kfree(sbinfo); -+ out: -+ return err; -+} -+ -+int au_sbr_realloc(struct au_sbinfo *sbinfo, int nbr) -+{ -+ int err, sz; -+ struct au_branch **brp; -+ -+ AuRwMustWriteLock(&sbinfo->si_rwsem); -+ -+ err = -ENOMEM; -+ sz = sizeof(*brp) * (sbinfo->si_bend + 1); -+ if (unlikely(!sz)) -+ sz = sizeof(*brp); -+ brp = au_kzrealloc(sbinfo->si_branch, sz, sizeof(*brp) * nbr, GFP_NOFS); -+ if (brp) { -+ sbinfo->si_branch = brp; -+ err = 0; -+ } -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+unsigned int au_sigen_inc(struct super_block *sb) -+{ -+ unsigned int gen; -+ -+ SiMustWriteLock(sb); -+ -+ gen = ++au_sbi(sb)->si_generation; -+ au_update_digen(sb->s_root); -+ au_update_iigen(sb->s_root->d_inode); -+ sb->s_root->d_inode->i_version++; -+ return gen; -+} -+ -+aufs_bindex_t au_new_br_id(struct super_block *sb) -+{ -+ aufs_bindex_t br_id; -+ int i; -+ struct au_sbinfo *sbinfo; -+ -+ SiMustWriteLock(sb); -+ -+ sbinfo = au_sbi(sb); -+ for (i = 0; i <= AUFS_BRANCH_MAX; i++) { -+ br_id = ++sbinfo->si_last_br_id; -+ if (br_id && au_br_index(sb, br_id) < 0) -+ return br_id; -+ } -+ -+ return -1; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* dentry and super_block lock. call at entry point */ -+void aufs_read_lock(struct dentry *dentry, int flags) -+{ -+ si_read_lock(dentry->d_sb, flags); -+ if (au_ftest_lock(flags, DW)) -+ di_write_lock_child(dentry); -+ else -+ di_read_lock_child(dentry, flags); -+} -+ -+void aufs_read_unlock(struct dentry *dentry, int flags) -+{ -+ if (au_ftest_lock(flags, DW)) -+ di_write_unlock(dentry); -+ else -+ di_read_unlock(dentry, flags); -+ si_read_unlock(dentry->d_sb); -+} -+ -+void aufs_write_lock(struct dentry *dentry) -+{ -+ si_write_lock(dentry->d_sb); -+ di_write_lock_child(dentry); -+} -+ -+void aufs_write_unlock(struct dentry *dentry) -+{ -+ di_write_unlock(dentry); -+ si_write_unlock(dentry->d_sb); -+} -+ -+void aufs_read_and_write_lock2(struct dentry *d1, struct dentry *d2, int flags) -+{ -+ si_read_lock(d1->d_sb, flags); -+ di_write_lock2_child(d1, d2, au_ftest_lock(flags, DIR)); -+} -+ -+void aufs_read_and_write_unlock2(struct dentry *d1, struct dentry *d2) -+{ -+ di_write_unlock2(d1, d2); -+ si_read_unlock(d1->d_sb); -+} -diff -Nur linux-2.6.33.1-vanilla/fs/aufs/spl.h linux-2.6.33.1/fs/aufs/spl.h ---- linux-2.6.33.1-vanilla/fs/aufs/spl.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-2.6.33.1/fs/aufs/spl.h 2010-04-05 16:53:27.000000000 +0200 -@@ -0,0 +1,57 @@ -+/* -+ * Copyright (C) 2005-2010 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+/* -+ * simple list protected by a spinlock -+ */ -+ -+#ifndef __AUFS_SPL_H__ -+#define __AUFS_SPL_H__ -+ -+#ifdef __KERNEL__ -+ -+#include -+#include -+ -+struct au_splhead { -+ spinlock_t spin; -+ struct list_head head; -+}; -+ -+static inline void au_spl_init(struct au_splhead *spl) -+{ -+ spin_lock_init(&spl->spin); -+ INIT_LIST_HEAD(&spl->head); -+} -+ -+static inline void au_spl_add(struct list_head *list, struct au_splhead *spl) -+{ -+ spin_lock(&spl->spin); -+ list_add(list, &spl->head); -+ spin_unlock(&spl->spin); -+} -+ -+static inline void au_spl_del(struct list_head *list, struct au_splhead *spl) -+{ -+ spin_lock(&spl->spin); -+ list_del(list); -+ spin_unlock(&spl->spin); -+} -+ -+#endif /* __KERNEL__ */ -+#endif /* __AUFS_SPL_H__ */ -diff -Nur linux-2.6.33.1-vanilla/fs/aufs/super.c linux-2.6.33.1/fs/aufs/super.c ---- linux-2.6.33.1-vanilla/fs/aufs/super.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-2.6.33.1/fs/aufs/super.c 2010-04-05 16:53:27.000000000 +0200 -@@ -0,0 +1,838 @@ -+/* -+ * Copyright (C) 2005-2010 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+/* -+ * mount and super_block operations -+ */ -+ -+#include -+#include -+#include -+#include -+#include "aufs.h" -+ -+/* -+ * super_operations -+ */ -+static struct inode *aufs_alloc_inode(struct super_block *sb __maybe_unused) -+{ -+ struct au_icntnr *c; -+ -+ c = au_cache_alloc_icntnr(); -+ if (c) { -+ inode_init_once(&c->vfs_inode); -+ c->vfs_inode.i_version = 1; /* sigen(sb); */ -+ c->iinfo.ii_hinode = NULL; -+ return &c->vfs_inode; -+ } -+ return NULL; -+} -+ -+static void aufs_destroy_inode(struct inode *inode) -+{ -+ au_iinfo_fin(inode); -+ au_cache_free_icntnr(container_of(inode, struct au_icntnr, vfs_inode)); -+} -+ -+struct inode *au_iget_locked(struct super_block *sb, ino_t ino) -+{ -+ struct inode *inode; -+ int err; -+ -+ inode = iget_locked(sb, ino); -+ if (unlikely(!inode)) { -+ inode = ERR_PTR(-ENOMEM); -+ goto out; -+ } -+ if (!(inode->i_state & I_NEW)) -+ goto out; -+ -+ err = au_xigen_new(inode); -+ if (!err) -+ err = au_iinfo_init(inode); -+ if (!err) -+ inode->i_version++; -+ else { -+ iget_failed(inode); -+ inode = ERR_PTR(err); -+ } -+ -+ out: -+ /* never return NULL */ -+ AuDebugOn(!inode); -+ AuTraceErrPtr(inode); -+ return inode; -+} -+ -+/* lock free root dinfo */ -+static int au_show_brs(struct seq_file *seq, struct super_block *sb) -+{ -+ int err; -+ aufs_bindex_t bindex, bend; -+ struct path path; -+ struct au_hdentry *hd; -+ struct au_branch *br; -+ -+ err = 0; -+ bend = au_sbend(sb); -+ hd = au_di(sb->s_root)->di_hdentry; -+ for (bindex = 0; !err && bindex <= bend; bindex++) { -+ br = au_sbr(sb, bindex); -+ path.mnt = br->br_mnt; -+ path.dentry = hd[bindex].hd_dentry; -+ err = au_seq_path(seq, &path); -+ if (err > 0) -+ err = seq_printf(seq, "=%s", -+ au_optstr_br_perm(br->br_perm)); -+ if (!err && bindex != bend) -+ err = seq_putc(seq, ':'); -+ } -+ -+ return err; -+} -+ -+static void au_show_wbr_create(struct seq_file *m, int v, -+ struct au_sbinfo *sbinfo) -+{ -+ const char *pat; -+ -+ AuRwMustAnyLock(&sbinfo->si_rwsem); -+ -+ seq_printf(m, ",create="); -+ pat = au_optstr_wbr_create(v); -+ switch (v) { -+ case AuWbrCreate_TDP: -+ case AuWbrCreate_RR: -+ case AuWbrCreate_MFS: -+ case AuWbrCreate_PMFS: -+ seq_printf(m, pat); -+ break; -+ case AuWbrCreate_MFSV: -+ seq_printf(m, /*pat*/"mfs:%lu", -+ sbinfo->si_wbr_mfs.mfs_expire / HZ); -+ break; -+ case AuWbrCreate_PMFSV: -+ seq_printf(m, /*pat*/"pmfs:%lu", -+ sbinfo->si_wbr_mfs.mfs_expire / HZ); -+ break; -+ case AuWbrCreate_MFSRR: -+ seq_printf(m, /*pat*/"mfsrr:%llu", -+ sbinfo->si_wbr_mfs.mfsrr_watermark); -+ break; -+ case AuWbrCreate_MFSRRV: -+ seq_printf(m, /*pat*/"mfsrr:%llu:%lu", -+ sbinfo->si_wbr_mfs.mfsrr_watermark, -+ sbinfo->si_wbr_mfs.mfs_expire / HZ); -+ break; -+ } -+} -+ -+static int au_show_xino(struct seq_file *seq, struct vfsmount *mnt) -+{ -+#ifdef CONFIG_SYSFS -+ return 0; -+#else -+ int err; -+ const int len = sizeof(AUFS_XINO_FNAME) - 1; -+ aufs_bindex_t bindex, brid; -+ struct super_block *sb; -+ struct qstr *name; -+ struct file *f; -+ struct dentry *d, *h_root; -+ -+ AuRwMustAnyLock(&sbinfo->si_rwsem); -+ -+ err = 0; -+ sb = mnt->mnt_sb; -+ f = au_sbi(sb)->si_xib; -+ if (!f) -+ goto out; -+ -+ /* stop printing the default xino path on the first writable branch */ -+ h_root = NULL; -+ brid = au_xino_brid(sb); -+ if (brid >= 0) { -+ bindex = au_br_index(sb, brid); -+ h_root = au_di(sb->s_root)->di_hdentry[0 + bindex].hd_dentry; -+ } -+ d = f->f_dentry; -+ name = &d->d_name; -+ /* safe ->d_parent because the file is unlinked */ -+ if (d->d_parent == h_root -+ && name->len == len -+ && !memcmp(name->name, AUFS_XINO_FNAME, len)) -+ goto out; -+ -+ seq_puts(seq, ",xino="); -+ err = au_xino_path(seq, f); -+ -+ out: -+ return err; -+#endif -+} -+ -+/* seq_file will re-call me in case of too long string */ -+static int aufs_show_options(struct seq_file *m, struct vfsmount *mnt) -+{ -+ int err, n; -+ unsigned int mnt_flags, v; -+ struct super_block *sb; -+ struct au_sbinfo *sbinfo; -+ -+#define AuBool(name, str) do { \ -+ v = au_opt_test(mnt_flags, name); \ -+ if (v != au_opt_test(AuOpt_Def, name)) \ -+ seq_printf(m, ",%s" #str, v ? "" : "no"); \ -+} while (0) -+ -+#define AuStr(name, str) do { \ -+ v = mnt_flags & AuOptMask_##name; \ -+ if (v != (AuOpt_Def & AuOptMask_##name)) \ -+ seq_printf(m, "," #str "=%s", au_optstr_##str(v)); \ -+} while (0) -+ -+#define AuUInt(name, str, val) do { \ -+ if (val != AUFS_##name##_DEF) \ -+ seq_printf(m, "," #str "=%u", val); \ -+} while (0) -+ -+ /* lock free root dinfo */ -+ sb = mnt->mnt_sb; -+ si_noflush_read_lock(sb); -+ sbinfo = au_sbi(sb); -+ seq_printf(m, ",si=%lx", sysaufs_si_id(sbinfo)); -+ -+ mnt_flags = au_mntflags(sb); -+ if (au_opt_test(mnt_flags, XINO)) { -+ err = au_show_xino(m, mnt); -+ if (unlikely(err)) -+ goto out; -+ } else -+ seq_puts(m, ",noxino"); -+ -+ AuBool(TRUNC_XINO, trunc_xino); -+ AuStr(UDBA, udba); -+ AuBool(SHWH, shwh); -+ AuBool(PLINK, plink); -+ /* AuBool(DIRPERM1, dirperm1); */ -+ /* AuBool(REFROF, refrof); */ -+ -+ v = sbinfo->si_wbr_create; -+ if (v != AuWbrCreate_Def) -+ au_show_wbr_create(m, v, sbinfo); -+ -+ v = sbinfo->si_wbr_copyup; -+ if (v != AuWbrCopyup_Def) -+ seq_printf(m, ",cpup=%s", au_optstr_wbr_copyup(v)); -+ -+ v = au_opt_test(mnt_flags, ALWAYS_DIROPQ); -+ if (v != au_opt_test(AuOpt_Def, ALWAYS_DIROPQ)) -+ seq_printf(m, ",diropq=%c", v ? 'a' : 'w'); -+ -+ AuUInt(DIRWH, dirwh, sbinfo->si_dirwh); -+ -+ n = sbinfo->si_rdcache / HZ; -+ AuUInt(RDCACHE, rdcache, n); -+ -+ AuUInt(RDBLK, rdblk, sbinfo->si_rdblk); -+ AuUInt(RDHASH, rdhash, sbinfo->si_rdhash); -+ -+ AuBool(SUM, sum); -+ /* AuBool(SUM_W, wsum); */ -+ AuBool(WARN_PERM, warn_perm); -+ AuBool(VERBOSE, verbose); -+ -+ out: -+ /* be sure to print "br:" last */ -+ if (!sysaufs_brs) { -+ seq_puts(m, ",br:"); -+ au_show_brs(m, sb); -+ } -+ si_read_unlock(sb); -+ return 0; -+ -+#undef AuBool -+#undef AuStr -+#undef AuUInt -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* sum mode which returns the summation for statfs(2) */ -+ -+static u64 au_add_till_max(u64 a, u64 b) -+{ -+ u64 old; -+ -+ old = a; -+ a += b; -+ if (old < a) -+ return a; -+ return ULLONG_MAX; -+} -+ -+static int au_statfs_sum(struct super_block *sb, struct kstatfs *buf) -+{ -+ int err; -+ u64 blocks, bfree, bavail, files, ffree; -+ aufs_bindex_t bend, bindex, i; -+ unsigned char shared; -+ struct vfsmount *h_mnt; -+ struct super_block *h_sb; -+ -+ blocks = 0; -+ bfree = 0; -+ bavail = 0; -+ files = 0; -+ ffree = 0; -+ -+ err = 0; -+ bend = au_sbend(sb); -+ for (bindex = bend; bindex >= 0; bindex--) { -+ h_mnt = au_sbr_mnt(sb, bindex); -+ h_sb = h_mnt->mnt_sb; -+ shared = 0; -+ for (i = bindex + 1; !shared && i <= bend; i++) -+ shared = (au_sbr_sb(sb, i) == h_sb); -+ if (shared) -+ continue; -+ -+ /* sb->s_root for NFS is unreliable */ -+ err = vfs_statfs(h_mnt->mnt_root, buf); -+ if (unlikely(err)) -+ goto out; -+ -+ blocks = au_add_till_max(blocks, buf->f_blocks); -+ bfree = au_add_till_max(bfree, buf->f_bfree); -+ bavail = au_add_till_max(bavail, buf->f_bavail); -+ files = au_add_till_max(files, buf->f_files); -+ ffree = au_add_till_max(ffree, buf->f_ffree); -+ } -+ -+ buf->f_blocks = blocks; -+ buf->f_bfree = bfree; -+ buf->f_bavail = bavail; -+ buf->f_files = files; -+ buf->f_ffree = ffree; -+ -+ out: -+ return err; -+} -+ -+static int aufs_statfs(struct dentry *dentry, struct kstatfs *buf) -+{ -+ int err; -+ struct super_block *sb; -+ -+ /* lock free root dinfo */ -+ sb = dentry->d_sb; -+ si_noflush_read_lock(sb); -+ if (!au_opt_test(au_mntflags(sb), SUM)) -+ /* sb->s_root for NFS is unreliable */ -+ err = vfs_statfs(au_sbr_mnt(sb, 0)->mnt_root, buf); -+ else -+ err = au_statfs_sum(sb, buf); -+ si_read_unlock(sb); -+ -+ if (!err) { -+ buf->f_type = AUFS_SUPER_MAGIC; -+ buf->f_namelen = AUFS_MAX_NAMELEN; -+ memset(&buf->f_fsid, 0, sizeof(buf->f_fsid)); -+ } -+ /* buf->f_bsize = buf->f_blocks = buf->f_bfree = buf->f_bavail = -1; */ -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * this IS NOT for super_operations. -+ * I guess it will be reverted someday. -+ */ -+static void aufs_umount_begin(struct super_block *sb) -+{ -+ struct au_sbinfo *sbinfo; -+ -+ sbinfo = au_sbi(sb); -+ if (!sbinfo) -+ return; -+ -+ si_write_lock(sb); -+ if (au_opt_test(au_mntflags(sb), PLINK)) -+ au_plink_put(sb); -+ if (sbinfo->si_wbr_create_ops->fin) -+ sbinfo->si_wbr_create_ops->fin(sb); -+ si_write_unlock(sb); -+} -+ -+/* final actions when unmounting a file system */ -+static void aufs_put_super(struct super_block *sb) -+{ -+ struct au_sbinfo *sbinfo; -+ -+ sbinfo = au_sbi(sb); -+ if (!sbinfo) -+ return; -+ -+ aufs_umount_begin(sb); -+ dbgaufs_si_fin(sbinfo); -+ kobject_put(&sbinfo->si_kobj); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * refresh dentry and inode at remount time. -+ */ -+static int do_refresh(struct dentry *dentry, mode_t type, -+ unsigned int dir_flags) -+{ -+ int err; -+ struct dentry *parent; -+ -+ di_write_lock_child(dentry); -+ parent = dget_parent(dentry); -+ di_read_lock_parent(parent, AuLock_IR); -+ -+ /* returns the number of positive dentries */ -+ err = au_refresh_hdentry(dentry, type); -+ if (err >= 0) { -+ struct inode *inode = dentry->d_inode; -+ err = au_refresh_hinode(inode, dentry); -+ if (!err && type == S_IFDIR) -+ au_hn_reset(inode, dir_flags); -+ } -+ if (unlikely(err)) -+ pr_err("unrecoverable error %d, %.*s\n", -+ err, AuDLNPair(dentry)); -+ -+ di_read_unlock(parent, AuLock_IR); -+ dput(parent); -+ di_write_unlock(dentry); -+ -+ return err; -+} -+ -+static int test_dir(struct dentry *dentry, void *arg __maybe_unused) -+{ -+ return S_ISDIR(dentry->d_inode->i_mode); -+} -+ -+/* gave up consolidating with refresh_nondir() */ -+static int refresh_dir(struct dentry *root, unsigned int sigen) -+{ -+ int err, i, j, ndentry, e; -+ struct au_dcsub_pages dpages; -+ struct au_dpage *dpage; -+ struct dentry **dentries; -+ struct inode *inode; -+ const unsigned int flags = au_hi_flags(root->d_inode, /*isdir*/1); -+ -+ err = 0; -+ list_for_each_entry(inode, &root->d_sb->s_inodes, i_sb_list) -+ if (S_ISDIR(inode->i_mode) && au_iigen(inode) != sigen) { -+ ii_write_lock_child(inode); -+ e = au_refresh_hinode_self(inode, /*do_attr*/1); -+ ii_write_unlock(inode); -+ if (unlikely(e)) { -+ AuDbg("e %d, i%lu\n", e, inode->i_ino); -+ if (!err) -+ err = e; -+ /* go on even if err */ -+ } -+ } -+ -+ e = au_dpages_init(&dpages, GFP_NOFS); -+ if (unlikely(e)) { -+ if (!err) -+ err = e; -+ goto out; -+ } -+ e = au_dcsub_pages(&dpages, root, test_dir, NULL); -+ if (unlikely(e)) { -+ if (!err) -+ err = e; -+ goto out_dpages; -+ } -+ -+ for (i = 0; !e && i < dpages.ndpage; i++) { -+ dpage = dpages.dpages + i; -+ dentries = dpage->dentries; -+ ndentry = dpage->ndentry; -+ for (j = 0; !e && j < ndentry; j++) { -+ struct dentry *d; -+ -+ d = dentries[j]; -+ au_dbg_verify_dir_parent(d, sigen); -+ if (au_digen(d) != sigen) { -+ e = do_refresh(d, S_IFDIR, flags); -+ if (unlikely(e && !err)) -+ err = e; -+ /* break on err */ -+ } -+ } -+ } -+ -+ out_dpages: -+ au_dpages_free(&dpages); -+ out: -+ return err; -+} -+ -+static int test_nondir(struct dentry *dentry, void *arg __maybe_unused) -+{ -+ return !S_ISDIR(dentry->d_inode->i_mode); -+} -+ -+static int refresh_nondir(struct dentry *root, unsigned int sigen, -+ int do_dentry) -+{ -+ int err, i, j, ndentry, e; -+ struct au_dcsub_pages dpages; -+ struct au_dpage *dpage; -+ struct dentry **dentries; -+ struct inode *inode; -+ -+ err = 0; -+ list_for_each_entry(inode, &root->d_sb->s_inodes, i_sb_list) -+ if (!S_ISDIR(inode->i_mode) && au_iigen(inode) != sigen) { -+ ii_write_lock_child(inode); -+ e = au_refresh_hinode_self(inode, /*do_attr*/1); -+ ii_write_unlock(inode); -+ if (unlikely(e)) { -+ AuDbg("e %d, i%lu\n", e, inode->i_ino); -+ if (!err) -+ err = e; -+ /* go on even if err */ -+ } -+ } -+ -+ if (!do_dentry) -+ goto out; -+ -+ e = au_dpages_init(&dpages, GFP_NOFS); -+ if (unlikely(e)) { -+ if (!err) -+ err = e; -+ goto out; -+ } -+ e = au_dcsub_pages(&dpages, root, test_nondir, NULL); -+ if (unlikely(e)) { -+ if (!err) -+ err = e; -+ goto out_dpages; -+ } -+ -+ for (i = 0; i < dpages.ndpage; i++) { -+ dpage = dpages.dpages + i; -+ dentries = dpage->dentries; -+ ndentry = dpage->ndentry; -+ for (j = 0; j < ndentry; j++) { -+ struct dentry *d; -+ -+ d = dentries[j]; -+ au_dbg_verify_nondir_parent(d, sigen); -+ inode = d->d_inode; -+ if (inode && au_digen(d) != sigen) { -+ e = do_refresh(d, inode->i_mode & S_IFMT, -+ /*dir_flags*/0); -+ if (unlikely(e && !err)) -+ err = e; -+ /* go on even err */ -+ } -+ } -+ } -+ -+ out_dpages: -+ au_dpages_free(&dpages); -+ out: -+ return err; -+} -+ -+static void au_remount_refresh(struct super_block *sb, unsigned int flags) -+{ -+ int err; -+ unsigned int sigen; -+ struct au_sbinfo *sbinfo; -+ struct dentry *root; -+ struct inode *inode; -+ -+ au_sigen_inc(sb); -+ sigen = au_sigen(sb); -+ sbinfo = au_sbi(sb); -+ au_fclr_si(sbinfo, FAILED_REFRESH_DIRS); -+ -+ root = sb->s_root; -+ DiMustNoWaiters(root); -+ inode = root->d_inode; -+ IiMustNoWaiters(inode); -+ au_hn_reset(inode, au_hi_flags(inode, /*isdir*/1)); -+ di_write_unlock(root); -+ -+ err = refresh_dir(root, sigen); -+ if (unlikely(err)) { -+ au_fset_si(sbinfo, FAILED_REFRESH_DIRS); -+ pr_warning("Refreshing directories failed, ignored (%d)\n", -+ err); -+ } -+ -+ if (au_ftest_opts(flags, REFRESH_NONDIR)) { -+ err = refresh_nondir(root, sigen, !err); -+ if (unlikely(err)) -+ pr_warning("Refreshing non-directories failed, ignored" -+ "(%d)\n", err); -+ } -+ -+ /* aufs_write_lock() calls ..._child() */ -+ di_write_lock_child(root); -+ au_cpup_attr_all(root->d_inode, /*force*/1); -+} -+ -+/* stop extra interpretation of errno in mount(8), and strange error messages */ -+static int cvt_err(int err) -+{ -+ AuTraceErr(err); -+ -+ switch (err) { -+ case -ENOENT: -+ case -ENOTDIR: -+ case -EEXIST: -+ case -EIO: -+ err = -EINVAL; -+ } -+ return err; -+} -+ -+static int aufs_remount_fs(struct super_block *sb, int *flags, char *data) -+{ -+ int err; -+ struct au_opts opts; -+ struct dentry *root; -+ struct inode *inode; -+ struct au_sbinfo *sbinfo; -+ -+ err = 0; -+ root = sb->s_root; -+ if (!data || !*data) { -+ aufs_write_lock(root); -+ err = au_opts_verify(sb, *flags, /*pending*/0); -+ aufs_write_unlock(root); -+ goto out; -+ } -+ -+ err = -ENOMEM; -+ memset(&opts, 0, sizeof(opts)); -+ opts.opt = (void *)__get_free_page(GFP_NOFS); -+ if (unlikely(!opts.opt)) -+ goto out; -+ opts.max_opt = PAGE_SIZE / sizeof(*opts.opt); -+ opts.flags = AuOpts_REMOUNT; -+ opts.sb_flags = *flags; -+ -+ /* parse it before aufs lock */ -+ err = au_opts_parse(sb, data, &opts); -+ if (unlikely(err)) -+ goto out_opts; -+ -+ sbinfo = au_sbi(sb); -+ inode = root->d_inode; -+ mutex_lock(&inode->i_mutex); -+ aufs_write_lock(root); -+ -+ /* au_opts_remount() may return an error */ -+ err = au_opts_remount(sb, &opts); -+ au_opts_free(&opts); -+ -+ if (au_ftest_opts(opts.flags, REFRESH_DIR) -+ || au_ftest_opts(opts.flags, REFRESH_NONDIR)) -+ au_remount_refresh(sb, opts.flags); -+ -+ aufs_write_unlock(root); -+ mutex_unlock(&inode->i_mutex); -+ -+ out_opts: -+ free_page((unsigned long)opts.opt); -+ out: -+ err = cvt_err(err); -+ AuTraceErr(err); -+ return err; -+} -+ -+static const struct super_operations aufs_sop = { -+ .alloc_inode = aufs_alloc_inode, -+ .destroy_inode = aufs_destroy_inode, -+ .drop_inode = generic_delete_inode, -+ .show_options = aufs_show_options, -+ .statfs = aufs_statfs, -+ .put_super = aufs_put_super, -+ .remount_fs = aufs_remount_fs -+}; -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int alloc_root(struct super_block *sb) -+{ -+ int err; -+ struct inode *inode; -+ struct dentry *root; -+ -+ err = -ENOMEM; -+ inode = au_iget_locked(sb, AUFS_ROOT_INO); -+ err = PTR_ERR(inode); -+ if (IS_ERR(inode)) -+ goto out; -+ -+ inode->i_op = &aufs_dir_iop; -+ inode->i_fop = &aufs_dir_fop; -+ inode->i_mode = S_IFDIR; -+ inode->i_nlink = 2; -+ unlock_new_inode(inode); -+ -+ root = d_alloc_root(inode); -+ if (unlikely(!root)) -+ goto out_iput; -+ err = PTR_ERR(root); -+ if (IS_ERR(root)) -+ goto out_iput; -+ -+ err = au_alloc_dinfo(root); -+ if (!err) { -+ sb->s_root = root; -+ return 0; /* success */ -+ } -+ dput(root); -+ goto out; /* do not iput */ -+ -+ out_iput: -+ iget_failed(inode); -+ iput(inode); -+ out: -+ return err; -+ -+} -+ -+static int aufs_fill_super(struct super_block *sb, void *raw_data, -+ int silent __maybe_unused) -+{ -+ int err; -+ struct au_opts opts; -+ struct dentry *root; -+ struct inode *inode; -+ char *arg = raw_data; -+ -+ if (unlikely(!arg || !*arg)) { -+ err = -EINVAL; -+ pr_err("no arg\n"); -+ goto out; -+ } -+ -+ err = -ENOMEM; -+ memset(&opts, 0, sizeof(opts)); -+ opts.opt = (void *)__get_free_page(GFP_NOFS); -+ if (unlikely(!opts.opt)) -+ goto out; -+ opts.max_opt = PAGE_SIZE / sizeof(*opts.opt); -+ opts.sb_flags = sb->s_flags; -+ -+ err = au_si_alloc(sb); -+ if (unlikely(err)) -+ goto out_opts; -+ -+ /* all timestamps always follow the ones on the branch */ -+ sb->s_flags |= MS_NOATIME | MS_NODIRATIME; -+ sb->s_op = &aufs_sop; -+ sb->s_magic = AUFS_SUPER_MAGIC; -+ sb->s_maxbytes = 0; -+ au_export_init(sb); -+ -+ err = alloc_root(sb); -+ if (unlikely(err)) { -+ si_write_unlock(sb); -+ goto out_info; -+ } -+ root = sb->s_root; -+ inode = root->d_inode; -+ -+ /* -+ * actually we can parse options regardless aufs lock here. -+ * but at remount time, parsing must be done before aufs lock. -+ * so we follow the same rule. -+ */ -+ ii_write_lock_parent(inode); -+ aufs_write_unlock(root); -+ err = au_opts_parse(sb, arg, &opts); -+ if (unlikely(err)) -+ goto out_root; -+ -+ /* lock vfs_inode first, then aufs. */ -+ mutex_lock(&inode->i_mutex); -+ aufs_write_lock(root); -+ err = au_opts_mount(sb, &opts); -+ au_opts_free(&opts); -+ aufs_write_unlock(root); -+ mutex_unlock(&inode->i_mutex); -+ if (!err) -+ goto out_opts; /* success */ -+ -+ out_root: -+ dput(root); -+ sb->s_root = NULL; -+ out_info: -+ kobject_put(&au_sbi(sb)->si_kobj); -+ sb->s_fs_info = NULL; -+ out_opts: -+ free_page((unsigned long)opts.opt); -+ out: -+ AuTraceErr(err); -+ err = cvt_err(err); -+ AuTraceErr(err); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int aufs_get_sb(struct file_system_type *fs_type, int flags, -+ const char *dev_name __maybe_unused, void *raw_data, -+ struct vfsmount *mnt) -+{ -+ int err; -+ struct super_block *sb; -+ -+ /* all timestamps always follow the ones on the branch */ -+ /* mnt->mnt_flags |= MNT_NOATIME | MNT_NODIRATIME; */ -+ err = get_sb_nodev(fs_type, flags, raw_data, aufs_fill_super, mnt); -+ if (!err) { -+ sb = mnt->mnt_sb; -+ si_write_lock(sb); -+ sysaufs_brs_add(sb, 0); -+ si_write_unlock(sb); -+ } -+ return err; -+} -+ -+struct file_system_type aufs_fs_type = { -+ .name = AUFS_FSTYPE, -+ .fs_flags = -+ FS_RENAME_DOES_D_MOVE /* a race between rename and others */ -+ | FS_REVAL_DOT, /* for NFS branch and udba */ -+ .get_sb = aufs_get_sb, -+ .kill_sb = generic_shutdown_super, -+ /* no need to __module_get() and module_put(). */ -+ .owner = THIS_MODULE, -+}; -diff -Nur linux-2.6.33.1-vanilla/fs/aufs/super.h linux-2.6.33.1/fs/aufs/super.h ---- linux-2.6.33.1-vanilla/fs/aufs/super.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-2.6.33.1/fs/aufs/super.h 2010-04-05 16:53:27.000000000 +0200 -@@ -0,0 +1,361 @@ -+/* -+ * Copyright (C) 2005-2010 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+/* -+ * super_block operations -+ */ -+ -+#ifndef __AUFS_SUPER_H__ -+#define __AUFS_SUPER_H__ -+ -+#ifdef __KERNEL__ -+ -+#include -+#include -+#include "rwsem.h" -+#include "spl.h" -+#include "wkq.h" -+ -+typedef ssize_t (*au_readf_t)(struct file *, char __user *, size_t, loff_t *); -+typedef ssize_t (*au_writef_t)(struct file *, const char __user *, size_t, -+ loff_t *); -+ -+/* policies to select one among multiple writable branches */ -+struct au_wbr_copyup_operations { -+ int (*copyup)(struct dentry *dentry); -+}; -+ -+struct au_wbr_create_operations { -+ int (*create)(struct dentry *dentry, int isdir); -+ int (*init)(struct super_block *sb); -+ int (*fin)(struct super_block *sb); -+}; -+ -+struct au_wbr_mfs { -+ struct mutex mfs_lock; /* protect this structure */ -+ unsigned long mfs_jiffy; -+ unsigned long mfs_expire; -+ aufs_bindex_t mfs_bindex; -+ -+ unsigned long long mfsrr_bytes; -+ unsigned long long mfsrr_watermark; -+}; -+ -+struct au_branch; -+struct au_sbinfo { -+ /* nowait tasks in the system-wide workqueue */ -+ struct au_nowait_tasks si_nowait; -+ -+ struct au_rwsem si_rwsem; -+ -+ /* branch management */ -+ unsigned int si_generation; -+ -+ /* see above flags */ -+ unsigned char au_si_status; -+ -+ aufs_bindex_t si_bend; -+ aufs_bindex_t si_last_br_id; -+ struct au_branch **si_branch; -+ -+ /* policy to select a writable branch */ -+ unsigned char si_wbr_copyup; -+ unsigned char si_wbr_create; -+ struct au_wbr_copyup_operations *si_wbr_copyup_ops; -+ struct au_wbr_create_operations *si_wbr_create_ops; -+ -+ /* round robin */ -+ atomic_t si_wbr_rr_next; -+ -+ /* most free space */ -+ struct au_wbr_mfs si_wbr_mfs; -+ -+ /* mount flags */ -+ /* include/asm-ia64/siginfo.h defines a macro named si_flags */ -+ unsigned int si_mntflags; -+ -+ /* external inode number (bitmap and translation table) */ -+ au_readf_t si_xread; -+ au_writef_t si_xwrite; -+ struct file *si_xib; -+ struct mutex si_xib_mtx; /* protect xib members */ -+ unsigned long *si_xib_buf; -+ unsigned long si_xib_last_pindex; -+ int si_xib_next_bit; -+ aufs_bindex_t si_xino_brid; -+ /* reserved for future use */ -+ /* unsigned long long si_xib_limit; */ /* Max xib file size */ -+ -+#ifdef CONFIG_AUFS_EXPORT -+ /* i_generation */ -+ struct file *si_xigen; -+ atomic_t si_xigen_next; -+#endif -+ -+ /* vdir parameters */ -+ unsigned long si_rdcache; /* max cache time in HZ */ -+ unsigned int si_rdblk; /* deblk size */ -+ unsigned int si_rdhash; /* hash size */ -+ -+ /* -+ * If the number of whiteouts are larger than si_dirwh, leave all of -+ * them after au_whtmp_ren to reduce the cost of rmdir(2). -+ * future fsck.aufs or kernel thread will remove them later. -+ * Otherwise, remove all whiteouts and the dir in rmdir(2). -+ */ -+ unsigned int si_dirwh; -+ -+ /* -+ * rename(2) a directory with all children. -+ */ -+ /* reserved for future use */ -+ /* int si_rendir; */ -+ -+ /* pseudo_link list */ -+ struct au_splhead si_plink; -+ wait_queue_head_t si_plink_wq; -+ spinlock_t si_plink_maint_lock; -+ struct file *si_plink_maint; -+ -+ /* -+ * sysfs and lifetime management. -+ * this is not a small structure and it may be a waste of memory in case -+ * of sysfs is disabled, particulary when many aufs-es are mounted. -+ * but using sysfs is majority. -+ */ -+ struct kobject si_kobj; -+#ifdef CONFIG_DEBUG_FS -+ struct dentry *si_dbgaufs, *si_dbgaufs_xib; -+#ifdef CONFIG_AUFS_EXPORT -+ struct dentry *si_dbgaufs_xigen; -+#endif -+#endif -+ -+ /* dirty, necessary for unmounting, sysfs and sysrq */ -+ struct super_block *si_sb; -+}; -+ -+/* sbinfo status flags */ -+/* -+ * set true when refresh_dirs() failed at remount time. -+ * then try refreshing dirs at access time again. -+ * if it is false, refreshing dirs at access time is unnecesary -+ */ -+#define AuSi_FAILED_REFRESH_DIRS 1 -+static inline unsigned char au_do_ftest_si(struct au_sbinfo *sbi, -+ unsigned int flag) -+{ -+ AuRwMustAnyLock(&sbi->si_rwsem); -+ return sbi->au_si_status & flag; -+} -+#define au_ftest_si(sbinfo, name) au_do_ftest_si(sbinfo, AuSi_##name) -+#define au_fset_si(sbinfo, name) do { \ -+ AuRwMustWriteLock(&(sbinfo)->si_rwsem); \ -+ (sbinfo)->au_si_status |= AuSi_##name; \ -+} while (0) -+#define au_fclr_si(sbinfo, name) do { \ -+ AuRwMustWriteLock(&(sbinfo)->si_rwsem); \ -+ (sbinfo)->au_si_status &= ~AuSi_##name; \ -+} while (0) -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* policy to select one among writable branches */ -+#define AuWbrCopyup(sbinfo, ...) \ -+ ((sbinfo)->si_wbr_copyup_ops->copyup(__VA_ARGS__)) -+#define AuWbrCreate(sbinfo, ...) \ -+ ((sbinfo)->si_wbr_create_ops->create(__VA_ARGS__)) -+ -+/* flags for si_read_lock()/aufs_read_lock()/di_read_lock() */ -+#define AuLock_DW 1 /* write-lock dentry */ -+#define AuLock_IR (1 << 1) /* read-lock inode */ -+#define AuLock_IW (1 << 2) /* write-lock inode */ -+#define AuLock_FLUSH (1 << 3) /* wait for 'nowait' tasks */ -+#define AuLock_DIR (1 << 4) /* target is a dir */ -+#define au_ftest_lock(flags, name) ((flags) & AuLock_##name) -+#define au_fset_lock(flags, name) { (flags) |= AuLock_##name; } -+#define au_fclr_lock(flags, name) { (flags) &= ~AuLock_##name; } -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* super.c */ -+extern struct file_system_type aufs_fs_type; -+struct inode *au_iget_locked(struct super_block *sb, ino_t ino); -+ -+/* sbinfo.c */ -+void au_si_free(struct kobject *kobj); -+int au_si_alloc(struct super_block *sb); -+int au_sbr_realloc(struct au_sbinfo *sbinfo, int nbr); -+ -+unsigned int au_sigen_inc(struct super_block *sb); -+aufs_bindex_t au_new_br_id(struct super_block *sb); -+ -+void aufs_read_lock(struct dentry *dentry, int flags); -+void aufs_read_unlock(struct dentry *dentry, int flags); -+void aufs_write_lock(struct dentry *dentry); -+void aufs_write_unlock(struct dentry *dentry); -+void aufs_read_and_write_lock2(struct dentry *d1, struct dentry *d2, int isdir); -+void aufs_read_and_write_unlock2(struct dentry *d1, struct dentry *d2); -+ -+/* wbr_policy.c */ -+extern struct au_wbr_copyup_operations au_wbr_copyup_ops[]; -+extern struct au_wbr_create_operations au_wbr_create_ops[]; -+int au_cpdown_dirs(struct dentry *dentry, aufs_bindex_t bdst); -+ -+/* ---------------------------------------------------------------------- */ -+ -+static inline struct au_sbinfo *au_sbi(struct super_block *sb) -+{ -+ return sb->s_fs_info; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+#ifdef CONFIG_AUFS_EXPORT -+void au_export_init(struct super_block *sb); -+ -+static inline int au_test_nfsd(struct task_struct *tsk) -+{ -+ return !tsk->mm && !strcmp(tsk->comm, "nfsd"); -+} -+ -+int au_xigen_inc(struct inode *inode); -+int au_xigen_new(struct inode *inode); -+int au_xigen_set(struct super_block *sb, struct file *base); -+void au_xigen_clr(struct super_block *sb); -+ -+static inline int au_busy_or_stale(void) -+{ -+ if (!au_test_nfsd(current)) -+ return -EBUSY; -+ return -ESTALE; -+} -+#else -+AuStubVoid(au_export_init, struct super_block *sb) -+AuStubInt0(au_test_nfsd, struct task_struct *tsk) -+AuStubInt0(au_xigen_inc, struct inode *inode) -+AuStubInt0(au_xigen_new, struct inode *inode) -+AuStubInt0(au_xigen_set, struct super_block *sb, struct file *base) -+AuStubVoid(au_xigen_clr, struct super_block *sb) -+static inline int au_busy_or_stale(void) -+{ -+ return -EBUSY; -+} -+#endif /* CONFIG_AUFS_EXPORT */ -+ -+/* ---------------------------------------------------------------------- */ -+ -+static inline void dbgaufs_si_null(struct au_sbinfo *sbinfo) -+{ -+ /* -+ * This function is a dynamic '__init' fucntion actually, -+ * so the tiny check for si_rwsem is unnecessary. -+ */ -+ /* AuRwMustWriteLock(&sbinfo->si_rwsem); */ -+#ifdef CONFIG_DEBUG_FS -+ sbinfo->si_dbgaufs = NULL; -+ sbinfo->si_dbgaufs_xib = NULL; -+#ifdef CONFIG_AUFS_EXPORT -+ sbinfo->si_dbgaufs_xigen = NULL; -+#endif -+#endif -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* lock superblock. mainly for entry point functions */ -+/* -+ * si_noflush_read_lock, si_noflush_write_lock, -+ * si_read_unlock, si_write_unlock, si_downgrade_lock -+ */ -+AuSimpleLockRwsemFuncs(si_noflush, struct super_block *sb, -+ &au_sbi(sb)->si_rwsem); -+AuSimpleUnlockRwsemFuncs(si, struct super_block *sb, &au_sbi(sb)->si_rwsem); -+ -+#define SiMustNoWaiters(sb) AuRwMustNoWaiters(&au_sbi(sb)->si_rwsem) -+#define SiMustAnyLock(sb) AuRwMustAnyLock(&au_sbi(sb)->si_rwsem) -+#define SiMustWriteLock(sb) AuRwMustWriteLock(&au_sbi(sb)->si_rwsem) -+ -+static inline void si_read_lock(struct super_block *sb, int flags) -+{ -+ if (au_ftest_lock(flags, FLUSH)) -+ au_nwt_flush(&au_sbi(sb)->si_nowait); -+ si_noflush_read_lock(sb); -+} -+ -+static inline void si_write_lock(struct super_block *sb) -+{ -+ au_nwt_flush(&au_sbi(sb)->si_nowait); -+ si_noflush_write_lock(sb); -+} -+ -+static inline int si_read_trylock(struct super_block *sb, int flags) -+{ -+ if (au_ftest_lock(flags, FLUSH)) -+ au_nwt_flush(&au_sbi(sb)->si_nowait); -+ return si_noflush_read_trylock(sb); -+} -+ -+static inline int si_write_trylock(struct super_block *sb, int flags) -+{ -+ if (au_ftest_lock(flags, FLUSH)) -+ au_nwt_flush(&au_sbi(sb)->si_nowait); -+ return si_noflush_write_trylock(sb); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static inline aufs_bindex_t au_sbend(struct super_block *sb) -+{ -+ SiMustAnyLock(sb); -+ return au_sbi(sb)->si_bend; -+} -+ -+static inline unsigned int au_mntflags(struct super_block *sb) -+{ -+ SiMustAnyLock(sb); -+ return au_sbi(sb)->si_mntflags; -+} -+ -+static inline unsigned int au_sigen(struct super_block *sb) -+{ -+ SiMustAnyLock(sb); -+ return au_sbi(sb)->si_generation; -+} -+ -+static inline struct au_branch *au_sbr(struct super_block *sb, -+ aufs_bindex_t bindex) -+{ -+ SiMustAnyLock(sb); -+ return au_sbi(sb)->si_branch[0 + bindex]; -+} -+ -+static inline void au_xino_brid_set(struct super_block *sb, aufs_bindex_t brid) -+{ -+ SiMustWriteLock(sb); -+ au_sbi(sb)->si_xino_brid = brid; -+} -+ -+static inline aufs_bindex_t au_xino_brid(struct super_block *sb) -+{ -+ SiMustAnyLock(sb); -+ return au_sbi(sb)->si_xino_brid; -+} -+ -+#endif /* __KERNEL__ */ -+#endif /* __AUFS_SUPER_H__ */ -diff -Nur linux-2.6.33.1-vanilla/fs/aufs/sysaufs.c linux-2.6.33.1/fs/aufs/sysaufs.c ---- linux-2.6.33.1-vanilla/fs/aufs/sysaufs.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-2.6.33.1/fs/aufs/sysaufs.c 2010-04-05 16:53:27.000000000 +0200 -@@ -0,0 +1,107 @@ -+/* -+ * Copyright (C) 2005-2010 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+/* -+ * sysfs interface and lifetime management -+ * they are necessary regardless sysfs is disabled. -+ */ -+ -+#include -+#include -+#include -+#include "aufs.h" -+ -+unsigned long sysaufs_si_mask; -+struct kset *sysaufs_ket; -+ -+#define AuSiAttr(_name) { \ -+ .attr = { .name = __stringify(_name), .mode = 0444 }, \ -+ .show = sysaufs_si_##_name, \ -+} -+ -+static struct sysaufs_si_attr sysaufs_si_attr_xi_path = AuSiAttr(xi_path); -+struct attribute *sysaufs_si_attrs[] = { -+ &sysaufs_si_attr_xi_path.attr, -+ NULL, -+}; -+ -+static struct sysfs_ops au_sbi_ops = { -+ .show = sysaufs_si_show -+}; -+ -+static struct kobj_type au_sbi_ktype = { -+ .release = au_si_free, -+ .sysfs_ops = &au_sbi_ops, -+ .default_attrs = sysaufs_si_attrs -+}; -+ -+/* ---------------------------------------------------------------------- */ -+ -+int sysaufs_si_init(struct au_sbinfo *sbinfo) -+{ -+ int err; -+ -+ sbinfo->si_kobj.kset = sysaufs_ket; -+ /* cf. sysaufs_name() */ -+ err = kobject_init_and_add -+ (&sbinfo->si_kobj, &au_sbi_ktype, /*&sysaufs_ket->kobj*/NULL, -+ SysaufsSiNamePrefix "%lx", sysaufs_si_id(sbinfo)); -+ -+ dbgaufs_si_null(sbinfo); -+ if (!err) { -+ err = dbgaufs_si_init(sbinfo); -+ if (unlikely(err)) -+ kobject_put(&sbinfo->si_kobj); -+ } -+ return err; -+} -+ -+void sysaufs_fin(void) -+{ -+ dbgaufs_fin(); -+ sysfs_remove_group(&sysaufs_ket->kobj, sysaufs_attr_group); -+ kset_unregister(sysaufs_ket); -+} -+ -+int __init sysaufs_init(void) -+{ -+ int err; -+ -+ do { -+ get_random_bytes(&sysaufs_si_mask, sizeof(sysaufs_si_mask)); -+ } while (!sysaufs_si_mask); -+ -+ err = -EINVAL; -+ sysaufs_ket = kset_create_and_add(AUFS_NAME, NULL, fs_kobj); -+ if (unlikely(!sysaufs_ket)) -+ goto out; -+ err = PTR_ERR(sysaufs_ket); -+ if (IS_ERR(sysaufs_ket)) -+ goto out; -+ err = sysfs_create_group(&sysaufs_ket->kobj, sysaufs_attr_group); -+ if (unlikely(err)) { -+ kset_unregister(sysaufs_ket); -+ goto out; -+ } -+ -+ err = dbgaufs_init(); -+ if (unlikely(err)) -+ sysaufs_fin(); -+ out: -+ return err; -+} -diff -Nur linux-2.6.33.1-vanilla/fs/aufs/sysaufs.h linux-2.6.33.1/fs/aufs/sysaufs.h ---- linux-2.6.33.1-vanilla/fs/aufs/sysaufs.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-2.6.33.1/fs/aufs/sysaufs.h 2010-04-05 16:53:27.000000000 +0200 -@@ -0,0 +1,105 @@ -+/* -+ * Copyright (C) 2005-2010 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+/* -+ * sysfs interface and mount lifetime management -+ */ -+ -+#ifndef __SYSAUFS_H__ -+#define __SYSAUFS_H__ -+ -+#ifdef __KERNEL__ -+ -+#include -+#include -+#include "module.h" -+ -+struct super_block; -+struct au_sbinfo; -+ -+struct sysaufs_si_attr { -+ struct attribute attr; -+ int (*show)(struct seq_file *seq, struct super_block *sb); -+}; -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* sysaufs.c */ -+extern unsigned long sysaufs_si_mask; -+extern struct kset *sysaufs_ket; -+extern struct attribute *sysaufs_si_attrs[]; -+int sysaufs_si_init(struct au_sbinfo *sbinfo); -+int __init sysaufs_init(void); -+void sysaufs_fin(void); -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* some people doesn't like to show a pointer in kernel */ -+static inline unsigned long sysaufs_si_id(struct au_sbinfo *sbinfo) -+{ -+ return sysaufs_si_mask ^ (unsigned long)sbinfo; -+} -+ -+#define SysaufsSiNamePrefix "si_" -+#define SysaufsSiNameLen (sizeof(SysaufsSiNamePrefix) + 16) -+static inline void sysaufs_name(struct au_sbinfo *sbinfo, char *name) -+{ -+ snprintf(name, SysaufsSiNameLen, SysaufsSiNamePrefix "%lx", -+ sysaufs_si_id(sbinfo)); -+} -+ -+struct au_branch; -+#ifdef CONFIG_SYSFS -+/* sysfs.c */ -+extern struct attribute_group *sysaufs_attr_group; -+ -+int sysaufs_si_xi_path(struct seq_file *seq, struct super_block *sb); -+ssize_t sysaufs_si_show(struct kobject *kobj, struct attribute *attr, -+ char *buf); -+ -+void sysaufs_br_init(struct au_branch *br); -+void sysaufs_brs_add(struct super_block *sb, aufs_bindex_t bindex); -+void sysaufs_brs_del(struct super_block *sb, aufs_bindex_t bindex); -+ -+#define sysaufs_brs_init() do {} while (0) -+ -+#else -+#define sysaufs_attr_group NULL -+ -+AuStubInt0(sysaufs_si_xi_path, struct seq_file *seq, struct super_block *sb) -+ -+static inline -+ssize_t sysaufs_si_show(struct kobject *kobj, struct attribute *attr, -+ char *buf) -+{ -+ return 0; -+} -+ -+AuStubVoid(sysaufs_br_init, struct au_branch *br) -+AuStubVoid(sysaufs_brs_add, struct super_block *sb, aufs_bindex_t bindex) -+AuStubVoid(sysaufs_brs_del, struct super_block *sb, aufs_bindex_t bindex) -+ -+static inline void sysaufs_brs_init(void) -+{ -+ sysaufs_brs = 0; -+} -+ -+#endif /* CONFIG_SYSFS */ -+ -+#endif /* __KERNEL__ */ -+#endif /* __SYSAUFS_H__ */ -diff -Nur linux-2.6.33.1-vanilla/fs/aufs/sysfs.c linux-2.6.33.1/fs/aufs/sysfs.c ---- linux-2.6.33.1-vanilla/fs/aufs/sysfs.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-2.6.33.1/fs/aufs/sysfs.c 2010-04-05 16:53:27.000000000 +0200 -@@ -0,0 +1,248 @@ -+/* -+ * Copyright (C) 2005-2010 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+/* -+ * sysfs interface -+ */ -+ -+#include -+#include -+#include -+#include -+#include "aufs.h" -+ -+#ifdef CONFIG_AUFS_FS_MODULE -+/* this entry violates the "one line per file" policy of sysfs */ -+static ssize_t config_show(struct kobject *kobj, struct kobj_attribute *attr, -+ char *buf) -+{ -+ ssize_t err; -+ static char *conf = -+/* this file is generated at compiling */ -+#include "conf.str" -+ ; -+ -+ err = snprintf(buf, PAGE_SIZE, conf); -+ if (unlikely(err >= PAGE_SIZE)) -+ err = -EFBIG; -+ return err; -+} -+ -+static struct kobj_attribute au_config_attr = __ATTR_RO(config); -+#endif -+ -+static struct attribute *au_attr[] = { -+#ifdef CONFIG_AUFS_FS_MODULE -+ &au_config_attr.attr, -+#endif -+ NULL, /* need to NULL terminate the list of attributes */ -+}; -+ -+static struct attribute_group sysaufs_attr_group_body = { -+ .attrs = au_attr -+}; -+ -+struct attribute_group *sysaufs_attr_group = &sysaufs_attr_group_body; -+ -+/* ---------------------------------------------------------------------- */ -+ -+int sysaufs_si_xi_path(struct seq_file *seq, struct super_block *sb) -+{ -+ int err; -+ -+ SiMustAnyLock(sb); -+ -+ err = 0; -+ if (au_opt_test(au_mntflags(sb), XINO)) { -+ err = au_xino_path(seq, au_sbi(sb)->si_xib); -+ seq_putc(seq, '\n'); -+ } -+ return err; -+} -+ -+/* -+ * the lifetime of branch is independent from the entry under sysfs. -+ * sysfs handles the lifetime of the entry, and never call ->show() after it is -+ * unlinked. -+ */ -+static int sysaufs_si_br(struct seq_file *seq, struct super_block *sb, -+ aufs_bindex_t bindex) -+{ -+ struct path path; -+ struct dentry *root; -+ struct au_branch *br; -+ -+ AuDbg("b%d\n", bindex); -+ -+ root = sb->s_root; -+ di_read_lock_parent(root, !AuLock_IR); -+ br = au_sbr(sb, bindex); -+ path.mnt = br->br_mnt; -+ path.dentry = au_h_dptr(root, bindex); -+ au_seq_path(seq, &path); -+ di_read_unlock(root, !AuLock_IR); -+ seq_printf(seq, "=%s\n", au_optstr_br_perm(br->br_perm)); -+ return 0; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static struct seq_file *au_seq(char *p, ssize_t len) -+{ -+ struct seq_file *seq; -+ -+ seq = kzalloc(sizeof(*seq), GFP_NOFS); -+ if (seq) { -+ /* mutex_init(&seq.lock); */ -+ seq->buf = p; -+ seq->size = len; -+ return seq; /* success */ -+ } -+ -+ seq = ERR_PTR(-ENOMEM); -+ return seq; -+} -+ -+#define SysaufsBr_PREFIX "br" -+ -+/* todo: file size may exceed PAGE_SIZE */ -+ssize_t sysaufs_si_show(struct kobject *kobj, struct attribute *attr, -+ char *buf) -+{ -+ ssize_t err; -+ long l; -+ aufs_bindex_t bend; -+ struct au_sbinfo *sbinfo; -+ struct super_block *sb; -+ struct seq_file *seq; -+ char *name; -+ struct attribute **cattr; -+ -+ sbinfo = container_of(kobj, struct au_sbinfo, si_kobj); -+ sb = sbinfo->si_sb; -+ -+ /* -+ * prevent a race condition between sysfs and aufs. -+ * for instance, sysfs_file_read() calls sysfs_get_active_two() which -+ * prohibits maintaining the sysfs entries. -+ * hew we acquire read lock after sysfs_get_active_two(). -+ * on the other hand, the remount process may maintain the sysfs/aufs -+ * entries after acquiring write lock. -+ * it can cause a deadlock. -+ * simply we gave up processing read here. -+ */ -+ err = -EBUSY; -+ if (unlikely(!si_noflush_read_trylock(sb))) -+ goto out; -+ -+ seq = au_seq(buf, PAGE_SIZE); -+ err = PTR_ERR(seq); -+ if (IS_ERR(seq)) -+ goto out_unlock; -+ -+ name = (void *)attr->name; -+ cattr = sysaufs_si_attrs; -+ while (*cattr) { -+ if (!strcmp(name, (*cattr)->name)) { -+ err = container_of(*cattr, struct sysaufs_si_attr, attr) -+ ->show(seq, sb); -+ goto out_seq; -+ } -+ cattr++; -+ } -+ -+ bend = au_sbend(sb); -+ if (!strncmp(name, SysaufsBr_PREFIX, sizeof(SysaufsBr_PREFIX) - 1)) { -+ name += sizeof(SysaufsBr_PREFIX) - 1; -+ err = strict_strtol(name, 10, &l); -+ if (!err) { -+ if (l <= bend) -+ err = sysaufs_si_br(seq, sb, (aufs_bindex_t)l); -+ else -+ err = -ENOENT; -+ } -+ goto out_seq; -+ } -+ BUG(); -+ -+ out_seq: -+ if (!err) { -+ err = seq->count; -+ /* sysfs limit */ -+ if (unlikely(err == PAGE_SIZE)) -+ err = -EFBIG; -+ } -+ kfree(seq); -+ out_unlock: -+ si_read_unlock(sb); -+ out: -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+void sysaufs_br_init(struct au_branch *br) -+{ -+ br->br_attr.name = br->br_name; -+ br->br_attr.mode = S_IRUGO; -+ br->br_attr.owner = THIS_MODULE; -+} -+ -+void sysaufs_brs_del(struct super_block *sb, aufs_bindex_t bindex) -+{ -+ struct au_branch *br; -+ struct kobject *kobj; -+ aufs_bindex_t bend; -+ -+ dbgaufs_brs_del(sb, bindex); -+ -+ if (!sysaufs_brs) -+ return; -+ -+ kobj = &au_sbi(sb)->si_kobj; -+ bend = au_sbend(sb); -+ for (; bindex <= bend; bindex++) { -+ br = au_sbr(sb, bindex); -+ sysfs_remove_file(kobj, &br->br_attr); -+ } -+} -+ -+void sysaufs_brs_add(struct super_block *sb, aufs_bindex_t bindex) -+{ -+ int err; -+ aufs_bindex_t bend; -+ struct kobject *kobj; -+ struct au_branch *br; -+ -+ dbgaufs_brs_add(sb, bindex); -+ -+ if (!sysaufs_brs) -+ return; -+ -+ kobj = &au_sbi(sb)->si_kobj; -+ bend = au_sbend(sb); -+ for (; bindex <= bend; bindex++) { -+ br = au_sbr(sb, bindex); -+ snprintf(br->br_name, sizeof(br->br_name), SysaufsBr_PREFIX -+ "%d", bindex); -+ err = sysfs_create_file(kobj, &br->br_attr); -+ if (unlikely(err)) -+ pr_warning("failed %s under sysfs(%d)\n", -+ br->br_name, err); -+ } -+} -diff -Nur linux-2.6.33.1-vanilla/fs/aufs/sysrq.c linux-2.6.33.1/fs/aufs/sysrq.c ---- linux-2.6.33.1-vanilla/fs/aufs/sysrq.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-2.6.33.1/fs/aufs/sysrq.c 2010-04-05 16:53:27.000000000 +0200 -@@ -0,0 +1,119 @@ -+/* -+ * Copyright (C) 2005-2010 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+/* -+ * magic sysrq hanlder -+ */ -+ -+#include -+#include -+#include -+/* #include */ -+#include "aufs.h" -+ -+/* ---------------------------------------------------------------------- */ -+ -+static void sysrq_sb(struct super_block *sb) -+{ -+ char *plevel; -+ struct au_sbinfo *sbinfo; -+ struct file *file; -+ -+ plevel = au_plevel; -+ au_plevel = KERN_WARNING; -+ au_debug(1); -+ -+ sbinfo = au_sbi(sb); -+ /* since we define pr_fmt, call printk directly */ -+ printk(KERN_WARNING "si=%lx\n", sysaufs_si_id(sbinfo)); -+ printk(KERN_WARNING AUFS_NAME ": superblock\n"); -+ au_dpri_sb(sb); -+ printk(KERN_WARNING AUFS_NAME ": root dentry\n"); -+ au_dpri_dentry(sb->s_root); -+ printk(KERN_WARNING AUFS_NAME ": root inode\n"); -+ au_dpri_inode(sb->s_root->d_inode); -+#if 0 -+ struct inode *i; -+ printk(KERN_WARNING AUFS_NAME ": isolated inode\n"); -+ list_for_each_entry(i, &sb->s_inodes, i_sb_list) -+ if (list_empty(&i->i_dentry)) -+ au_dpri_inode(i); -+#endif -+ printk(KERN_WARNING AUFS_NAME ": files\n"); -+ list_for_each_entry(file, &sb->s_files, f_u.fu_list) { -+ umode_t mode; -+ mode = file->f_dentry->d_inode->i_mode; -+ if (!special_file(mode) || au_special_file(mode)) -+ au_dpri_file(file); -+ } -+ -+ au_plevel = plevel; -+ au_debug(0); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* module parameter */ -+static char *aufs_sysrq_key = "a"; -+module_param_named(sysrq, aufs_sysrq_key, charp, S_IRUGO); -+MODULE_PARM_DESC(sysrq, "MagicSysRq key for " AUFS_NAME); -+ -+static void au_sysrq(int key __maybe_unused, -+ struct tty_struct *tty __maybe_unused) -+{ -+ struct kobject *kobj; -+ struct au_sbinfo *sbinfo; -+ -+ /* spin_lock(&sysaufs_ket->list_lock); */ -+ list_for_each_entry(kobj, &sysaufs_ket->list, entry) { -+ sbinfo = container_of(kobj, struct au_sbinfo, si_kobj); -+ sysrq_sb(sbinfo->si_sb); -+ } -+ /* spin_unlock(&sysaufs_ket->list_lock); */ -+} -+ -+static struct sysrq_key_op au_sysrq_op = { -+ .handler = au_sysrq, -+ .help_msg = "Aufs", -+ .action_msg = "Aufs", -+ .enable_mask = SYSRQ_ENABLE_DUMP -+}; -+ -+/* ---------------------------------------------------------------------- */ -+ -+int __init au_sysrq_init(void) -+{ -+ int err; -+ char key; -+ -+ err = -1; -+ key = *aufs_sysrq_key; -+ if ('a' <= key && key <= 'z') -+ err = register_sysrq_key(key, &au_sysrq_op); -+ if (unlikely(err)) -+ pr_err("err %d, sysrq=%c\n", err, key); -+ return err; -+} -+ -+void au_sysrq_fin(void) -+{ -+ int err; -+ err = unregister_sysrq_key(*aufs_sysrq_key, &au_sysrq_op); -+ if (unlikely(err)) -+ pr_err("err %d (ignored)\n", err); -+} -diff -Nur linux-2.6.33.1-vanilla/fs/aufs/vdir.c linux-2.6.33.1/fs/aufs/vdir.c ---- linux-2.6.33.1-vanilla/fs/aufs/vdir.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-2.6.33.1/fs/aufs/vdir.c 2010-04-05 16:53:27.000000000 +0200 -@@ -0,0 +1,884 @@ -+/* -+ * Copyright (C) 2005-2010 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+/* -+ * virtual or vertical directory -+ */ -+ -+#include -+#include "aufs.h" -+ -+static unsigned int calc_size(int nlen) -+{ -+ return ALIGN(sizeof(struct au_vdir_de) + nlen, sizeof(ino_t)); -+} -+ -+static int set_deblk_end(union au_vdir_deblk_p *p, -+ union au_vdir_deblk_p *deblk_end) -+{ -+ if (calc_size(0) <= deblk_end->deblk - p->deblk) { -+ p->de->de_str.len = 0; -+ /* smp_mb(); */ -+ return 0; -+ } -+ return -1; /* error */ -+} -+ -+/* returns true or false */ -+static int is_deblk_end(union au_vdir_deblk_p *p, -+ union au_vdir_deblk_p *deblk_end) -+{ -+ if (calc_size(0) <= deblk_end->deblk - p->deblk) -+ return !p->de->de_str.len; -+ return 1; -+} -+ -+static unsigned char *last_deblk(struct au_vdir *vdir) -+{ -+ return vdir->vd_deblk[vdir->vd_nblk - 1]; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* estimate the apropriate size for name hash table */ -+unsigned int au_rdhash_est(loff_t sz) -+{ -+ unsigned int n; -+ -+ n = UINT_MAX; -+ sz >>= 10; -+ if (sz < n) -+ n = sz; -+ if (sz < AUFS_RDHASH_DEF) -+ n = AUFS_RDHASH_DEF; -+ /* pr_info("n %u\n", n); */ -+ return n; -+} -+ -+/* -+ * the allocated memory has to be freed by -+ * au_nhash_wh_free() or au_nhash_de_free(). -+ */ -+int au_nhash_alloc(struct au_nhash *nhash, unsigned int num_hash, gfp_t gfp) -+{ -+ struct hlist_head *head; -+ unsigned int u; -+ -+ head = kmalloc(sizeof(*nhash->nh_head) * num_hash, gfp); -+ if (head) { -+ nhash->nh_num = num_hash; -+ nhash->nh_head = head; -+ for (u = 0; u < num_hash; u++) -+ INIT_HLIST_HEAD(head++); -+ return 0; /* success */ -+ } -+ -+ return -ENOMEM; -+} -+ -+static void nhash_count(struct hlist_head *head) -+{ -+#if 0 -+ unsigned long n; -+ struct hlist_node *pos; -+ -+ n = 0; -+ hlist_for_each(pos, head) -+ n++; -+ pr_info("%lu\n", n); -+#endif -+} -+ -+static void au_nhash_wh_do_free(struct hlist_head *head) -+{ -+ struct au_vdir_wh *tpos; -+ struct hlist_node *pos, *node; -+ -+ hlist_for_each_entry_safe(tpos, pos, node, head, wh_hash) { -+ /* hlist_del(pos); */ -+ kfree(tpos); -+ } -+} -+ -+static void au_nhash_de_do_free(struct hlist_head *head) -+{ -+ struct au_vdir_dehstr *tpos; -+ struct hlist_node *pos, *node; -+ -+ hlist_for_each_entry_safe(tpos, pos, node, head, hash) { -+ /* hlist_del(pos); */ -+ au_cache_free_vdir_dehstr(tpos); -+ } -+} -+ -+static void au_nhash_do_free(struct au_nhash *nhash, -+ void (*free)(struct hlist_head *head)) -+{ -+ unsigned int n; -+ struct hlist_head *head; -+ -+ n = nhash->nh_num; -+ if (!n) -+ return; -+ -+ head = nhash->nh_head; -+ while (n-- > 0) { -+ nhash_count(head); -+ free(head++); -+ } -+ kfree(nhash->nh_head); -+} -+ -+void au_nhash_wh_free(struct au_nhash *whlist) -+{ -+ au_nhash_do_free(whlist, au_nhash_wh_do_free); -+} -+ -+static void au_nhash_de_free(struct au_nhash *delist) -+{ -+ au_nhash_do_free(delist, au_nhash_de_do_free); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+int au_nhash_test_longer_wh(struct au_nhash *whlist, aufs_bindex_t btgt, -+ int limit) -+{ -+ int num; -+ unsigned int u, n; -+ struct hlist_head *head; -+ struct au_vdir_wh *tpos; -+ struct hlist_node *pos; -+ -+ num = 0; -+ n = whlist->nh_num; -+ head = whlist->nh_head; -+ for (u = 0; u < n; u++, head++) -+ hlist_for_each_entry(tpos, pos, head, wh_hash) -+ if (tpos->wh_bindex == btgt && ++num > limit) -+ return 1; -+ return 0; -+} -+ -+static struct hlist_head *au_name_hash(struct au_nhash *nhash, -+ unsigned char *name, -+ unsigned int len) -+{ -+ unsigned int v; -+ /* const unsigned int magic_bit = 12; */ -+ -+ AuDebugOn(!nhash->nh_num || !nhash->nh_head); -+ -+ v = 0; -+ while (len--) -+ v += *name++; -+ /* v = hash_long(v, magic_bit); */ -+ v %= nhash->nh_num; -+ return nhash->nh_head + v; -+} -+ -+static int au_nhash_test_name(struct au_vdir_destr *str, const char *name, -+ int nlen) -+{ -+ return str->len == nlen && !memcmp(str->name, name, nlen); -+} -+ -+/* returns found or not */ -+int au_nhash_test_known_wh(struct au_nhash *whlist, char *name, int nlen) -+{ -+ struct hlist_head *head; -+ struct au_vdir_wh *tpos; -+ struct hlist_node *pos; -+ struct au_vdir_destr *str; -+ -+ head = au_name_hash(whlist, name, nlen); -+ hlist_for_each_entry(tpos, pos, head, wh_hash) { -+ str = &tpos->wh_str; -+ AuDbg("%.*s\n", str->len, str->name); -+ if (au_nhash_test_name(str, name, nlen)) -+ return 1; -+ } -+ return 0; -+} -+ -+/* returns found(true) or not */ -+static int test_known(struct au_nhash *delist, char *name, int nlen) -+{ -+ struct hlist_head *head; -+ struct au_vdir_dehstr *tpos; -+ struct hlist_node *pos; -+ struct au_vdir_destr *str; -+ -+ head = au_name_hash(delist, name, nlen); -+ hlist_for_each_entry(tpos, pos, head, hash) { -+ str = tpos->str; -+ AuDbg("%.*s\n", str->len, str->name); -+ if (au_nhash_test_name(str, name, nlen)) -+ return 1; -+ } -+ return 0; -+} -+ -+static void au_shwh_init_wh(struct au_vdir_wh *wh, ino_t ino, -+ unsigned char d_type) -+{ -+#ifdef CONFIG_AUFS_SHWH -+ wh->wh_ino = ino; -+ wh->wh_type = d_type; -+#endif -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+int au_nhash_append_wh(struct au_nhash *whlist, char *name, int nlen, ino_t ino, -+ unsigned int d_type, aufs_bindex_t bindex, -+ unsigned char shwh) -+{ -+ int err; -+ struct au_vdir_destr *str; -+ struct au_vdir_wh *wh; -+ -+ AuDbg("%.*s\n", nlen, name); -+ AuDebugOn(!whlist->nh_num || !whlist->nh_head); -+ -+ err = -ENOMEM; -+ wh = kmalloc(sizeof(*wh) + nlen, GFP_NOFS); -+ if (unlikely(!wh)) -+ goto out; -+ -+ err = 0; -+ wh->wh_bindex = bindex; -+ if (shwh) -+ au_shwh_init_wh(wh, ino, d_type); -+ str = &wh->wh_str; -+ str->len = nlen; -+ memcpy(str->name, name, nlen); -+ hlist_add_head(&wh->wh_hash, au_name_hash(whlist, name, nlen)); -+ /* smp_mb(); */ -+ -+ out: -+ return err; -+} -+ -+static int append_deblk(struct au_vdir *vdir) -+{ -+ int err; -+ unsigned long ul; -+ const unsigned int deblk_sz = vdir->vd_deblk_sz; -+ union au_vdir_deblk_p p, deblk_end; -+ unsigned char **o; -+ -+ err = -ENOMEM; -+ o = krealloc(vdir->vd_deblk, sizeof(*o) * (vdir->vd_nblk + 1), -+ GFP_NOFS); -+ if (unlikely(!o)) -+ goto out; -+ -+ vdir->vd_deblk = o; -+ p.deblk = kmalloc(deblk_sz, GFP_NOFS); -+ if (p.deblk) { -+ ul = vdir->vd_nblk++; -+ vdir->vd_deblk[ul] = p.deblk; -+ vdir->vd_last.ul = ul; -+ vdir->vd_last.p.deblk = p.deblk; -+ deblk_end.deblk = p.deblk + deblk_sz; -+ err = set_deblk_end(&p, &deblk_end); -+ } -+ -+ out: -+ return err; -+} -+ -+static int append_de(struct au_vdir *vdir, char *name, int nlen, ino_t ino, -+ unsigned int d_type, struct au_nhash *delist) -+{ -+ int err; -+ unsigned int sz; -+ const unsigned int deblk_sz = vdir->vd_deblk_sz; -+ union au_vdir_deblk_p p, *room, deblk_end; -+ struct au_vdir_dehstr *dehstr; -+ -+ p.deblk = last_deblk(vdir); -+ deblk_end.deblk = p.deblk + deblk_sz; -+ room = &vdir->vd_last.p; -+ AuDebugOn(room->deblk < p.deblk || deblk_end.deblk <= room->deblk -+ || !is_deblk_end(room, &deblk_end)); -+ -+ sz = calc_size(nlen); -+ if (unlikely(sz > deblk_end.deblk - room->deblk)) { -+ err = append_deblk(vdir); -+ if (unlikely(err)) -+ goto out; -+ -+ p.deblk = last_deblk(vdir); -+ deblk_end.deblk = p.deblk + deblk_sz; -+ /* smp_mb(); */ -+ AuDebugOn(room->deblk != p.deblk); -+ } -+ -+ err = -ENOMEM; -+ dehstr = au_cache_alloc_vdir_dehstr(); -+ if (unlikely(!dehstr)) -+ goto out; -+ -+ dehstr->str = &room->de->de_str; -+ hlist_add_head(&dehstr->hash, au_name_hash(delist, name, nlen)); -+ room->de->de_ino = ino; -+ room->de->de_type = d_type; -+ room->de->de_str.len = nlen; -+ memcpy(room->de->de_str.name, name, nlen); -+ -+ err = 0; -+ room->deblk += sz; -+ if (unlikely(set_deblk_end(room, &deblk_end))) -+ err = append_deblk(vdir); -+ /* smp_mb(); */ -+ -+ out: -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+void au_vdir_free(struct au_vdir *vdir) -+{ -+ unsigned char **deblk; -+ -+ deblk = vdir->vd_deblk; -+ while (vdir->vd_nblk--) -+ kfree(*deblk++); -+ kfree(vdir->vd_deblk); -+ au_cache_free_vdir(vdir); -+} -+ -+static struct au_vdir *alloc_vdir(struct file *file) -+{ -+ struct au_vdir *vdir; -+ struct super_block *sb; -+ int err; -+ -+ sb = file->f_dentry->d_sb; -+ SiMustAnyLock(sb); -+ -+ err = -ENOMEM; -+ vdir = au_cache_alloc_vdir(); -+ if (unlikely(!vdir)) -+ goto out; -+ -+ vdir->vd_deblk = kzalloc(sizeof(*vdir->vd_deblk), GFP_NOFS); -+ if (unlikely(!vdir->vd_deblk)) -+ goto out_free; -+ -+ vdir->vd_deblk_sz = au_sbi(sb)->si_rdblk; -+ if (!vdir->vd_deblk_sz) { -+ /* estimate the apropriate size for deblk */ -+ vdir->vd_deblk_sz = au_dir_size(file, /*dentry*/NULL); -+ /* pr_info("vd_deblk_sz %u\n", vdir->vd_deblk_sz); */ -+ } -+ vdir->vd_nblk = 0; -+ vdir->vd_version = 0; -+ vdir->vd_jiffy = 0; -+ err = append_deblk(vdir); -+ if (!err) -+ return vdir; /* success */ -+ -+ kfree(vdir->vd_deblk); -+ -+ out_free: -+ au_cache_free_vdir(vdir); -+ out: -+ vdir = ERR_PTR(err); -+ return vdir; -+} -+ -+static int reinit_vdir(struct au_vdir *vdir) -+{ -+ int err; -+ union au_vdir_deblk_p p, deblk_end; -+ -+ while (vdir->vd_nblk > 1) { -+ kfree(vdir->vd_deblk[vdir->vd_nblk - 1]); -+ /* vdir->vd_deblk[vdir->vd_nblk - 1] = NULL; */ -+ vdir->vd_nblk--; -+ } -+ p.deblk = vdir->vd_deblk[0]; -+ deblk_end.deblk = p.deblk + vdir->vd_deblk_sz; -+ err = set_deblk_end(&p, &deblk_end); -+ /* keep vd_dblk_sz */ -+ vdir->vd_last.ul = 0; -+ vdir->vd_last.p.deblk = vdir->vd_deblk[0]; -+ vdir->vd_version = 0; -+ vdir->vd_jiffy = 0; -+ /* smp_mb(); */ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+#define AuFillVdir_CALLED 1 -+#define AuFillVdir_WHABLE (1 << 1) -+#define AuFillVdir_SHWH (1 << 2) -+#define au_ftest_fillvdir(flags, name) ((flags) & AuFillVdir_##name) -+#define au_fset_fillvdir(flags, name) { (flags) |= AuFillVdir_##name; } -+#define au_fclr_fillvdir(flags, name) { (flags) &= ~AuFillVdir_##name; } -+ -+#ifndef CONFIG_AUFS_SHWH -+#undef AuFillVdir_SHWH -+#define AuFillVdir_SHWH 0 -+#endif -+ -+struct fillvdir_arg { -+ struct file *file; -+ struct au_vdir *vdir; -+ struct au_nhash delist; -+ struct au_nhash whlist; -+ aufs_bindex_t bindex; -+ unsigned int flags; -+ int err; -+}; -+ -+static int fillvdir(void *__arg, const char *__name, int nlen, -+ loff_t offset __maybe_unused, u64 h_ino, -+ unsigned int d_type) -+{ -+ struct fillvdir_arg *arg = __arg; -+ char *name = (void *)__name; -+ struct super_block *sb; -+ ino_t ino; -+ const unsigned char shwh = !!au_ftest_fillvdir(arg->flags, SHWH); -+ -+ arg->err = 0; -+ sb = arg->file->f_dentry->d_sb; -+ au_fset_fillvdir(arg->flags, CALLED); -+ /* smp_mb(); */ -+ if (nlen <= AUFS_WH_PFX_LEN -+ || memcmp(name, AUFS_WH_PFX, AUFS_WH_PFX_LEN)) { -+ if (test_known(&arg->delist, name, nlen) -+ || au_nhash_test_known_wh(&arg->whlist, name, nlen)) -+ goto out; /* already exists or whiteouted */ -+ -+ sb = arg->file->f_dentry->d_sb; -+ arg->err = au_ino(sb, arg->bindex, h_ino, d_type, &ino); -+ if (!arg->err) { -+ if (unlikely(nlen > AUFS_MAX_NAMELEN)) -+ d_type = DT_UNKNOWN; -+ arg->err = append_de(arg->vdir, name, nlen, ino, -+ d_type, &arg->delist); -+ } -+ } else if (au_ftest_fillvdir(arg->flags, WHABLE)) { -+ name += AUFS_WH_PFX_LEN; -+ nlen -= AUFS_WH_PFX_LEN; -+ if (au_nhash_test_known_wh(&arg->whlist, name, nlen)) -+ goto out; /* already whiteouted */ -+ -+ if (shwh) -+ arg->err = au_wh_ino(sb, arg->bindex, h_ino, d_type, -+ &ino); -+ if (!arg->err) { -+ if (nlen <= AUFS_MAX_NAMELEN + AUFS_WH_PFX_LEN) -+ d_type = DT_UNKNOWN; -+ arg->err = au_nhash_append_wh -+ (&arg->whlist, name, nlen, ino, d_type, -+ arg->bindex, shwh); -+ } -+ } -+ -+ out: -+ if (!arg->err) -+ arg->vdir->vd_jiffy = jiffies; -+ /* smp_mb(); */ -+ AuTraceErr(arg->err); -+ return arg->err; -+} -+ -+static int au_handle_shwh(struct super_block *sb, struct au_vdir *vdir, -+ struct au_nhash *whlist, struct au_nhash *delist) -+{ -+#ifdef CONFIG_AUFS_SHWH -+ int err; -+ unsigned int nh, u; -+ struct hlist_head *head; -+ struct au_vdir_wh *tpos; -+ struct hlist_node *pos, *n; -+ char *p, *o; -+ struct au_vdir_destr *destr; -+ -+ AuDebugOn(!au_opt_test(au_mntflags(sb), SHWH)); -+ -+ err = -ENOMEM; -+ o = p = __getname_gfp(GFP_NOFS); -+ if (unlikely(!p)) -+ goto out; -+ -+ err = 0; -+ nh = whlist->nh_num; -+ memcpy(p, AUFS_WH_PFX, AUFS_WH_PFX_LEN); -+ p += AUFS_WH_PFX_LEN; -+ for (u = 0; u < nh; u++) { -+ head = whlist->nh_head + u; -+ hlist_for_each_entry_safe(tpos, pos, n, head, wh_hash) { -+ destr = &tpos->wh_str; -+ memcpy(p, destr->name, destr->len); -+ err = append_de(vdir, o, destr->len + AUFS_WH_PFX_LEN, -+ tpos->wh_ino, tpos->wh_type, delist); -+ if (unlikely(err)) -+ break; -+ } -+ } -+ -+ __putname(o); -+ -+ out: -+ AuTraceErr(err); -+ return err; -+#else -+ return 0; -+#endif -+} -+ -+static int au_do_read_vdir(struct fillvdir_arg *arg) -+{ -+ int err; -+ unsigned int rdhash; -+ loff_t offset; -+ aufs_bindex_t bend, bindex, bstart; -+ unsigned char shwh; -+ struct file *hf, *file; -+ struct super_block *sb; -+ -+ file = arg->file; -+ sb = file->f_dentry->d_sb; -+ SiMustAnyLock(sb); -+ -+ rdhash = au_sbi(sb)->si_rdhash; -+ if (!rdhash) -+ rdhash = au_rdhash_est(au_dir_size(file, /*dentry*/NULL)); -+ err = au_nhash_alloc(&arg->delist, rdhash, GFP_NOFS); -+ if (unlikely(err)) -+ goto out; -+ err = au_nhash_alloc(&arg->whlist, rdhash, GFP_NOFS); -+ if (unlikely(err)) -+ goto out_delist; -+ -+ err = 0; -+ arg->flags = 0; -+ shwh = 0; -+ if (au_opt_test(au_mntflags(sb), SHWH)) { -+ shwh = 1; -+ au_fset_fillvdir(arg->flags, SHWH); -+ } -+ bstart = au_fbstart(file); -+ bend = au_fbend(file); -+ for (bindex = bstart; !err && bindex <= bend; bindex++) { -+ hf = au_h_fptr(file, bindex); -+ if (!hf) -+ continue; -+ -+ offset = vfsub_llseek(hf, 0, SEEK_SET); -+ err = offset; -+ if (unlikely(offset)) -+ break; -+ -+ arg->bindex = bindex; -+ au_fclr_fillvdir(arg->flags, WHABLE); -+ if (shwh -+ || (bindex != bend -+ && au_br_whable(au_sbr_perm(sb, bindex)))) -+ au_fset_fillvdir(arg->flags, WHABLE); -+ do { -+ arg->err = 0; -+ au_fclr_fillvdir(arg->flags, CALLED); -+ /* smp_mb(); */ -+ err = vfsub_readdir(hf, fillvdir, arg); -+ if (err >= 0) -+ err = arg->err; -+ } while (!err && au_ftest_fillvdir(arg->flags, CALLED)); -+ } -+ -+ if (!err && shwh) -+ err = au_handle_shwh(sb, arg->vdir, &arg->whlist, &arg->delist); -+ -+ au_nhash_wh_free(&arg->whlist); -+ -+ out_delist: -+ au_nhash_de_free(&arg->delist); -+ out: -+ return err; -+} -+ -+static int read_vdir(struct file *file, int may_read) -+{ -+ int err; -+ unsigned long expire; -+ unsigned char do_read; -+ struct fillvdir_arg arg; -+ struct inode *inode; -+ struct au_vdir *vdir, *allocated; -+ -+ err = 0; -+ inode = file->f_dentry->d_inode; -+ IMustLock(inode); -+ SiMustAnyLock(inode->i_sb); -+ -+ allocated = NULL; -+ do_read = 0; -+ expire = au_sbi(inode->i_sb)->si_rdcache; -+ vdir = au_ivdir(inode); -+ if (!vdir) { -+ do_read = 1; -+ vdir = alloc_vdir(file); -+ err = PTR_ERR(vdir); -+ if (IS_ERR(vdir)) -+ goto out; -+ err = 0; -+ allocated = vdir; -+ } else if (may_read -+ && (inode->i_version != vdir->vd_version -+ || time_after(jiffies, vdir->vd_jiffy + expire))) { -+ do_read = 1; -+ err = reinit_vdir(vdir); -+ if (unlikely(err)) -+ goto out; -+ } -+ -+ if (!do_read) -+ return 0; /* success */ -+ -+ arg.file = file; -+ arg.vdir = vdir; -+ err = au_do_read_vdir(&arg); -+ if (!err) { -+ /* file->f_pos = 0; */ -+ vdir->vd_version = inode->i_version; -+ vdir->vd_last.ul = 0; -+ vdir->vd_last.p.deblk = vdir->vd_deblk[0]; -+ if (allocated) -+ au_set_ivdir(inode, allocated); -+ } else if (allocated) -+ au_vdir_free(allocated); -+ -+ out: -+ return err; -+} -+ -+static int copy_vdir(struct au_vdir *tgt, struct au_vdir *src) -+{ -+ int err, rerr; -+ unsigned long ul, n; -+ const unsigned int deblk_sz = src->vd_deblk_sz; -+ -+ AuDebugOn(tgt->vd_nblk != 1); -+ -+ err = -ENOMEM; -+ if (tgt->vd_nblk < src->vd_nblk) { -+ unsigned char **p; -+ -+ p = krealloc(tgt->vd_deblk, sizeof(*p) * src->vd_nblk, -+ GFP_NOFS); -+ if (unlikely(!p)) -+ goto out; -+ tgt->vd_deblk = p; -+ } -+ -+ if (tgt->vd_deblk_sz != deblk_sz) { -+ unsigned char *p; -+ -+ tgt->vd_deblk_sz = deblk_sz; -+ p = krealloc(tgt->vd_deblk[0], deblk_sz, GFP_NOFS); -+ if (unlikely(!p)) -+ goto out; -+ tgt->vd_deblk[0] = p; -+ } -+ memcpy(tgt->vd_deblk[0], src->vd_deblk[0], deblk_sz); -+ tgt->vd_version = src->vd_version; -+ tgt->vd_jiffy = src->vd_jiffy; -+ -+ n = src->vd_nblk; -+ for (ul = 1; ul < n; ul++) { -+ tgt->vd_deblk[ul] = kmemdup(src->vd_deblk[ul], deblk_sz, -+ GFP_NOFS); -+ if (unlikely(!tgt->vd_deblk[ul])) -+ goto out; -+ tgt->vd_nblk++; -+ } -+ tgt->vd_nblk = n; -+ tgt->vd_last.ul = tgt->vd_last.ul; -+ tgt->vd_last.p.deblk = tgt->vd_deblk[tgt->vd_last.ul]; -+ tgt->vd_last.p.deblk += src->vd_last.p.deblk -+ - src->vd_deblk[src->vd_last.ul]; -+ /* smp_mb(); */ -+ return 0; /* success */ -+ -+ out: -+ rerr = reinit_vdir(tgt); -+ BUG_ON(rerr); -+ return err; -+} -+ -+int au_vdir_init(struct file *file) -+{ -+ int err; -+ struct inode *inode; -+ struct au_vdir *vdir_cache, *allocated; -+ -+ err = read_vdir(file, !file->f_pos); -+ if (unlikely(err)) -+ goto out; -+ -+ allocated = NULL; -+ vdir_cache = au_fvdir_cache(file); -+ if (!vdir_cache) { -+ vdir_cache = alloc_vdir(file); -+ err = PTR_ERR(vdir_cache); -+ if (IS_ERR(vdir_cache)) -+ goto out; -+ allocated = vdir_cache; -+ } else if (!file->f_pos && vdir_cache->vd_version != file->f_version) { -+ err = reinit_vdir(vdir_cache); -+ if (unlikely(err)) -+ goto out; -+ } else -+ return 0; /* success */ -+ -+ inode = file->f_dentry->d_inode; -+ err = copy_vdir(vdir_cache, au_ivdir(inode)); -+ if (!err) { -+ file->f_version = inode->i_version; -+ if (allocated) -+ au_set_fvdir_cache(file, allocated); -+ } else if (allocated) -+ au_vdir_free(allocated); -+ -+ out: -+ return err; -+} -+ -+static loff_t calc_offset(struct au_vdir *vdir) -+{ -+ loff_t offset; -+ union au_vdir_deblk_p p; -+ -+ p.deblk = vdir->vd_deblk[vdir->vd_last.ul]; -+ offset = vdir->vd_last.p.deblk - p.deblk; -+ offset += vdir->vd_deblk_sz * vdir->vd_last.ul; -+ return offset; -+} -+ -+/* returns true or false */ -+static int seek_vdir(struct file *file) -+{ -+ int valid; -+ unsigned int deblk_sz; -+ unsigned long ul, n; -+ loff_t offset; -+ union au_vdir_deblk_p p, deblk_end; -+ struct au_vdir *vdir_cache; -+ -+ valid = 1; -+ vdir_cache = au_fvdir_cache(file); -+ offset = calc_offset(vdir_cache); -+ AuDbg("offset %lld\n", offset); -+ if (file->f_pos == offset) -+ goto out; -+ -+ vdir_cache->vd_last.ul = 0; -+ vdir_cache->vd_last.p.deblk = vdir_cache->vd_deblk[0]; -+ if (!file->f_pos) -+ goto out; -+ -+ valid = 0; -+ deblk_sz = vdir_cache->vd_deblk_sz; -+ ul = div64_u64(file->f_pos, deblk_sz); -+ AuDbg("ul %lu\n", ul); -+ if (ul >= vdir_cache->vd_nblk) -+ goto out; -+ -+ n = vdir_cache->vd_nblk; -+ for (; ul < n; ul++) { -+ p.deblk = vdir_cache->vd_deblk[ul]; -+ deblk_end.deblk = p.deblk + deblk_sz; -+ offset = ul; -+ offset *= deblk_sz; -+ while (!is_deblk_end(&p, &deblk_end) && offset < file->f_pos) { -+ unsigned int l; -+ -+ l = calc_size(p.de->de_str.len); -+ offset += l; -+ p.deblk += l; -+ } -+ if (!is_deblk_end(&p, &deblk_end)) { -+ valid = 1; -+ vdir_cache->vd_last.ul = ul; -+ vdir_cache->vd_last.p = p; -+ break; -+ } -+ } -+ -+ out: -+ /* smp_mb(); */ -+ AuTraceErr(!valid); -+ return valid; -+} -+ -+int au_vdir_fill_de(struct file *file, void *dirent, filldir_t filldir) -+{ -+ int err; -+ unsigned int l, deblk_sz; -+ union au_vdir_deblk_p deblk_end; -+ struct au_vdir *vdir_cache; -+ struct au_vdir_de *de; -+ -+ vdir_cache = au_fvdir_cache(file); -+ if (!seek_vdir(file)) -+ return 0; -+ -+ deblk_sz = vdir_cache->vd_deblk_sz; -+ while (1) { -+ deblk_end.deblk = vdir_cache->vd_deblk[vdir_cache->vd_last.ul]; -+ deblk_end.deblk += deblk_sz; -+ while (!is_deblk_end(&vdir_cache->vd_last.p, &deblk_end)) { -+ de = vdir_cache->vd_last.p.de; -+ AuDbg("%.*s, off%lld, i%lu, dt%d\n", -+ de->de_str.len, de->de_str.name, file->f_pos, -+ (unsigned long)de->de_ino, de->de_type); -+ err = filldir(dirent, de->de_str.name, de->de_str.len, -+ file->f_pos, de->de_ino, de->de_type); -+ if (unlikely(err)) { -+ AuTraceErr(err); -+ /* todo: ignore the error caused by udba? */ -+ /* return err; */ -+ return 0; -+ } -+ -+ l = calc_size(de->de_str.len); -+ vdir_cache->vd_last.p.deblk += l; -+ file->f_pos += l; -+ } -+ if (vdir_cache->vd_last.ul < vdir_cache->vd_nblk - 1) { -+ vdir_cache->vd_last.ul++; -+ vdir_cache->vd_last.p.deblk -+ = vdir_cache->vd_deblk[vdir_cache->vd_last.ul]; -+ file->f_pos = deblk_sz * vdir_cache->vd_last.ul; -+ continue; -+ } -+ break; -+ } -+ -+ /* smp_mb(); */ -+ return 0; -+} -diff -Nur linux-2.6.33.1-vanilla/fs/aufs/vfsub.c linux-2.6.33.1/fs/aufs/vfsub.c ---- linux-2.6.33.1-vanilla/fs/aufs/vfsub.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-2.6.33.1/fs/aufs/vfsub.c 2010-04-05 16:53:27.000000000 +0200 -@@ -0,0 +1,790 @@ -+/* -+ * Copyright (C) 2005-2010 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+/* -+ * sub-routines for VFS -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include "aufs.h" -+ -+int vfsub_update_h_iattr(struct path *h_path, int *did) -+{ -+ int err; -+ struct kstat st; -+ struct super_block *h_sb; -+ -+ /* for remote fs, leave work for its getattr or d_revalidate */ -+ /* for bad i_attr fs, handle them in aufs_getattr() */ -+ /* still some fs may acquire i_mutex. we need to skip them */ -+ err = 0; -+ if (!did) -+ did = &err; -+ h_sb = h_path->dentry->d_sb; -+ *did = (!au_test_fs_remote(h_sb) && au_test_fs_refresh_iattr(h_sb)); -+ if (*did) -+ err = vfs_getattr(h_path->mnt, h_path->dentry, &st); -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int au_conv_oflags(int flags) -+{ -+ int mask = 0; -+ -+#ifdef CONFIG_IMA -+ fmode_t fmode; -+ -+ /* mask = MAY_OPEN; */ -+ fmode = OPEN_FMODE(flags); -+ if (fmode & FMODE_READ) -+ mask |= MAY_READ; -+ if ((fmode & FMODE_WRITE) -+ || (flags & O_TRUNC)) -+ mask |= MAY_WRITE; -+ /* -+ * if (flags & O_APPEND) -+ * mask |= MAY_APPEND; -+ */ -+ if (flags & vfsub_fmode_to_uint(FMODE_EXEC)) -+ mask |= MAY_EXEC; -+ -+ AuDbg("flags 0x%x, mask 0x%x\n", flags, mask); -+#endif -+ -+ return mask; -+} -+ -+struct file *vfsub_dentry_open(struct path *path, int flags) -+{ -+ struct file *file; -+ int err; -+ -+ path_get(path); -+ file = dentry_open(path->dentry, path->mnt, flags, current_cred()); -+ if (IS_ERR(file)) -+ goto out; -+ -+ err = ima_file_check(file, au_conv_oflags(flags)); -+ if (unlikely(err)) { -+ fput(file); -+ file = ERR_PTR(err); -+ } -+out: -+ return file; -+} -+ -+struct file *vfsub_filp_open(const char *path, int oflags, int mode) -+{ -+ struct file *file; -+ -+ /* lockdep_off(); */ -+ file = filp_open(path, oflags, mode); -+ /* lockdep_on(); */ -+ if (IS_ERR(file)) -+ goto out; -+ vfsub_update_h_iattr(&file->f_path, /*did*/NULL); /*ignore*/ -+ -+ out: -+ return file; -+} -+ -+int vfsub_kern_path(const char *name, unsigned int flags, struct path *path) -+{ -+ int err; -+ -+ /* lockdep_off(); */ -+ err = kern_path(name, flags, path); -+ /* lockdep_on(); */ -+ if (!err && path->dentry->d_inode) -+ vfsub_update_h_iattr(path, /*did*/NULL); /*ignore*/ -+ return err; -+} -+ -+struct dentry *vfsub_lookup_one_len(const char *name, struct dentry *parent, -+ int len) -+{ -+ struct path path = { -+ .mnt = NULL -+ }; -+ -+ /* VFS checks it too, but by WARN_ON_ONCE() */ -+ IMustLock(parent->d_inode); -+ -+ path.dentry = lookup_one_len(name, parent, len); -+ if (IS_ERR(path.dentry)) -+ goto out; -+ if (path.dentry->d_inode) -+ vfsub_update_h_iattr(&path, /*did*/NULL); /*ignore*/ -+ -+ out: -+ AuTraceErrPtr(path.dentry); -+ return path.dentry; -+} -+ -+struct dentry *vfsub_lookup_hash(struct nameidata *nd) -+{ -+ struct path path = { -+ .mnt = nd->path.mnt -+ }; -+ -+ IMustLock(nd->path.dentry->d_inode); -+ -+ path.dentry = lookup_hash(nd); -+ if (IS_ERR(path.dentry)) -+ goto out; -+ if (path.dentry->d_inode) -+ vfsub_update_h_iattr(&path, /*did*/NULL); /*ignore*/ -+ -+ out: -+ AuTraceErrPtr(path.dentry); -+ return path.dentry; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+struct dentry *vfsub_lock_rename(struct dentry *d1, struct au_hinode *hdir1, -+ struct dentry *d2, struct au_hinode *hdir2) -+{ -+ struct dentry *d; -+ -+ lockdep_off(); -+ d = lock_rename(d1, d2); -+ lockdep_on(); -+ au_hn_suspend(hdir1); -+ if (hdir1 != hdir2) -+ au_hn_suspend(hdir2); -+ -+ return d; -+} -+ -+void vfsub_unlock_rename(struct dentry *d1, struct au_hinode *hdir1, -+ struct dentry *d2, struct au_hinode *hdir2) -+{ -+ au_hn_resume(hdir1); -+ if (hdir1 != hdir2) -+ au_hn_resume(hdir2); -+ lockdep_off(); -+ unlock_rename(d1, d2); -+ lockdep_on(); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+int vfsub_create(struct inode *dir, struct path *path, int mode) -+{ -+ int err; -+ struct dentry *d; -+ -+ IMustLock(dir); -+ -+ d = path->dentry; -+ path->dentry = d->d_parent; -+ err = security_path_mknod(path, path->dentry, mode, 0); -+ path->dentry = d; -+ if (unlikely(err)) -+ goto out; -+ -+ if (au_test_fs_null_nd(dir->i_sb)) -+ err = vfs_create(dir, path->dentry, mode, NULL); -+ else { -+ struct nameidata h_nd; -+ -+ memset(&h_nd, 0, sizeof(h_nd)); -+ h_nd.flags = LOOKUP_CREATE; -+ h_nd.intent.open.flags = O_CREAT -+ | vfsub_fmode_to_uint(FMODE_READ); -+ h_nd.intent.open.create_mode = mode; -+ h_nd.path.dentry = path->dentry->d_parent; -+ h_nd.path.mnt = path->mnt; -+ path_get(&h_nd.path); -+ err = vfs_create(dir, path->dentry, mode, &h_nd); -+ path_put(&h_nd.path); -+ } -+ -+ if (!err) { -+ struct path tmp = *path; -+ int did; -+ -+ vfsub_update_h_iattr(&tmp, &did); -+ if (did) { -+ tmp.dentry = path->dentry->d_parent; -+ vfsub_update_h_iattr(&tmp, /*did*/NULL); -+ } -+ /*ignore*/ -+ } -+ -+ out: -+ return err; -+} -+ -+int vfsub_symlink(struct inode *dir, struct path *path, const char *symname) -+{ -+ int err; -+ struct dentry *d; -+ -+ IMustLock(dir); -+ -+ d = path->dentry; -+ path->dentry = d->d_parent; -+ err = security_path_symlink(path, path->dentry, symname); -+ path->dentry = d; -+ if (unlikely(err)) -+ goto out; -+ -+ err = vfs_symlink(dir, path->dentry, symname); -+ if (!err) { -+ struct path tmp = *path; -+ int did; -+ -+ vfsub_update_h_iattr(&tmp, &did); -+ if (did) { -+ tmp.dentry = path->dentry->d_parent; -+ vfsub_update_h_iattr(&tmp, /*did*/NULL); -+ } -+ /*ignore*/ -+ } -+ -+ out: -+ return err; -+} -+ -+int vfsub_mknod(struct inode *dir, struct path *path, int mode, dev_t dev) -+{ -+ int err; -+ struct dentry *d; -+ -+ IMustLock(dir); -+ -+ d = path->dentry; -+ path->dentry = d->d_parent; -+ err = security_path_mknod(path, path->dentry, mode, dev); -+ path->dentry = d; -+ if (unlikely(err)) -+ goto out; -+ -+ err = vfs_mknod(dir, path->dentry, mode, dev); -+ if (!err) { -+ struct path tmp = *path; -+ int did; -+ -+ vfsub_update_h_iattr(&tmp, &did); -+ if (did) { -+ tmp.dentry = path->dentry->d_parent; -+ vfsub_update_h_iattr(&tmp, /*did*/NULL); -+ } -+ /*ignore*/ -+ } -+ -+ out: -+ return err; -+} -+ -+static int au_test_nlink(struct inode *inode) -+{ -+ const unsigned int link_max = UINT_MAX >> 1; /* rough margin */ -+ -+ if (!au_test_fs_no_limit_nlink(inode->i_sb) -+ || inode->i_nlink < link_max) -+ return 0; -+ return -EMLINK; -+} -+ -+int vfsub_link(struct dentry *src_dentry, struct inode *dir, struct path *path) -+{ -+ int err; -+ struct dentry *d; -+ -+ IMustLock(dir); -+ -+ err = au_test_nlink(src_dentry->d_inode); -+ if (unlikely(err)) -+ return err; -+ -+ d = path->dentry; -+ path->dentry = d->d_parent; -+ err = security_path_link(src_dentry, path, path->dentry); -+ path->dentry = d; -+ if (unlikely(err)) -+ goto out; -+ -+ /* lockdep_off(); */ -+ err = vfs_link(src_dentry, dir, path->dentry); -+ /* lockdep_on(); */ -+ if (!err) { -+ struct path tmp = *path; -+ int did; -+ -+ /* fuse has different memory inode for the same inumber */ -+ vfsub_update_h_iattr(&tmp, &did); -+ if (did) { -+ tmp.dentry = path->dentry->d_parent; -+ vfsub_update_h_iattr(&tmp, /*did*/NULL); -+ tmp.dentry = src_dentry; -+ vfsub_update_h_iattr(&tmp, /*did*/NULL); -+ } -+ /*ignore*/ -+ } -+ -+ out: -+ return err; -+} -+ -+int vfsub_rename(struct inode *src_dir, struct dentry *src_dentry, -+ struct inode *dir, struct path *path) -+{ -+ int err; -+ struct path tmp = { -+ .mnt = path->mnt -+ }; -+ struct dentry *d; -+ -+ IMustLock(dir); -+ IMustLock(src_dir); -+ -+ d = path->dentry; -+ path->dentry = d->d_parent; -+ tmp.dentry = src_dentry->d_parent; -+ err = security_path_rename(&tmp, src_dentry, path, path->dentry); -+ path->dentry = d; -+ if (unlikely(err)) -+ goto out; -+ -+ /* lockdep_off(); */ -+ err = vfs_rename(src_dir, src_dentry, dir, path->dentry); -+ /* lockdep_on(); */ -+ if (!err) { -+ int did; -+ -+ tmp.dentry = d->d_parent; -+ vfsub_update_h_iattr(&tmp, &did); -+ if (did) { -+ tmp.dentry = src_dentry; -+ vfsub_update_h_iattr(&tmp, /*did*/NULL); -+ tmp.dentry = src_dentry->d_parent; -+ vfsub_update_h_iattr(&tmp, /*did*/NULL); -+ } -+ /*ignore*/ -+ } -+ -+ out: -+ return err; -+} -+ -+int vfsub_mkdir(struct inode *dir, struct path *path, int mode) -+{ -+ int err; -+ struct dentry *d; -+ -+ IMustLock(dir); -+ -+ d = path->dentry; -+ path->dentry = d->d_parent; -+ err = security_path_mkdir(path, path->dentry, mode); -+ path->dentry = d; -+ if (unlikely(err)) -+ goto out; -+ -+ err = vfs_mkdir(dir, path->dentry, mode); -+ if (!err) { -+ struct path tmp = *path; -+ int did; -+ -+ vfsub_update_h_iattr(&tmp, &did); -+ if (did) { -+ tmp.dentry = path->dentry->d_parent; -+ vfsub_update_h_iattr(&tmp, /*did*/NULL); -+ } -+ /*ignore*/ -+ } -+ -+ out: -+ return err; -+} -+ -+int vfsub_rmdir(struct inode *dir, struct path *path) -+{ -+ int err; -+ struct dentry *d; -+ -+ IMustLock(dir); -+ -+ d = path->dentry; -+ path->dentry = d->d_parent; -+ err = security_path_rmdir(path, path->dentry); -+ path->dentry = d; -+ if (unlikely(err)) -+ goto out; -+ -+ /* lockdep_off(); */ -+ err = vfs_rmdir(dir, path->dentry); -+ /* lockdep_on(); */ -+ if (!err) { -+ struct path tmp = { -+ .dentry = path->dentry->d_parent, -+ .mnt = path->mnt -+ }; -+ -+ vfsub_update_h_iattr(&tmp, /*did*/NULL); /*ignore*/ -+ } -+ -+ out: -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+ssize_t vfsub_read_u(struct file *file, char __user *ubuf, size_t count, -+ loff_t *ppos) -+{ -+ ssize_t err; -+ -+ err = vfs_read(file, ubuf, count, ppos); -+ if (err >= 0) -+ vfsub_update_h_iattr(&file->f_path, /*did*/NULL); /*ignore*/ -+ return err; -+} -+ -+/* todo: kernel_read()? */ -+ssize_t vfsub_read_k(struct file *file, void *kbuf, size_t count, -+ loff_t *ppos) -+{ -+ ssize_t err; -+ mm_segment_t oldfs; -+ -+ oldfs = get_fs(); -+ set_fs(KERNEL_DS); -+ err = vfsub_read_u(file, (char __user *)kbuf, count, ppos); -+ set_fs(oldfs); -+ return err; -+} -+ -+ssize_t vfsub_write_u(struct file *file, const char __user *ubuf, size_t count, -+ loff_t *ppos) -+{ -+ ssize_t err; -+ -+ /* lockdep_off(); */ -+ err = vfs_write(file, ubuf, count, ppos); -+ /* lockdep_on(); */ -+ if (err >= 0) -+ vfsub_update_h_iattr(&file->f_path, /*did*/NULL); /*ignore*/ -+ return err; -+} -+ -+ssize_t vfsub_write_k(struct file *file, void *kbuf, size_t count, loff_t *ppos) -+{ -+ ssize_t err; -+ mm_segment_t oldfs; -+ -+ oldfs = get_fs(); -+ set_fs(KERNEL_DS); -+ err = vfsub_write_u(file, (const char __user *)kbuf, count, ppos); -+ set_fs(oldfs); -+ return err; -+} -+ -+int vfsub_readdir(struct file *file, filldir_t filldir, void *arg) -+{ -+ int err; -+ -+ /* lockdep_off(); */ -+ err = vfs_readdir(file, filldir, arg); -+ /* lockdep_on(); */ -+ if (err >= 0) -+ vfsub_update_h_iattr(&file->f_path, /*did*/NULL); /*ignore*/ -+ return err; -+} -+ -+long vfsub_splice_to(struct file *in, loff_t *ppos, -+ struct pipe_inode_info *pipe, size_t len, -+ unsigned int flags) -+{ -+ long err; -+ -+ /* lockdep_off(); */ -+ err = do_splice_to(in, ppos, pipe, len, flags); -+ /* lockdep_on(); */ -+ if (err >= 0) -+ vfsub_update_h_iattr(&in->f_path, /*did*/NULL); /*ignore*/ -+ return err; -+} -+ -+long vfsub_splice_from(struct pipe_inode_info *pipe, struct file *out, -+ loff_t *ppos, size_t len, unsigned int flags) -+{ -+ long err; -+ -+ /* lockdep_off(); */ -+ err = do_splice_from(pipe, out, ppos, len, flags); -+ /* lockdep_on(); */ -+ if (err >= 0) -+ vfsub_update_h_iattr(&out->f_path, /*did*/NULL); /*ignore*/ -+ return err; -+} -+ -+/* cf. open.c:do_sys_truncate() and do_sys_ftruncate() */ -+int vfsub_trunc(struct path *h_path, loff_t length, unsigned int attr, -+ struct file *h_file) -+{ -+ int err; -+ struct inode *h_inode; -+ -+ h_inode = h_path->dentry->d_inode; -+ if (!h_file) { -+ err = mnt_want_write(h_path->mnt); -+ if (err) -+ goto out; -+ err = inode_permission(h_inode, MAY_WRITE); -+ if (err) -+ goto out_mnt; -+ err = get_write_access(h_inode); -+ if (err) -+ goto out_mnt; -+ err = break_lease(h_inode, vfsub_fmode_to_uint(FMODE_WRITE)); -+ if (err) -+ goto out_inode; -+ } -+ -+ err = locks_verify_truncate(h_inode, h_file, length); -+ if (!err) -+ err = security_path_truncate(h_path, length, attr); -+ if (!err) { -+ /* lockdep_off(); */ -+ err = do_truncate(h_path->dentry, length, attr, h_file); -+ /* lockdep_on(); */ -+ } -+ -+ out_inode: -+ if (!h_file) -+ put_write_access(h_inode); -+ out_mnt: -+ if (!h_file) -+ mnt_drop_write(h_path->mnt); -+ out: -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+struct au_vfsub_mkdir_args { -+ int *errp; -+ struct inode *dir; -+ struct path *path; -+ int mode; -+}; -+ -+static void au_call_vfsub_mkdir(void *args) -+{ -+ struct au_vfsub_mkdir_args *a = args; -+ *a->errp = vfsub_mkdir(a->dir, a->path, a->mode); -+} -+ -+int vfsub_sio_mkdir(struct inode *dir, struct path *path, int mode) -+{ -+ int err, do_sio, wkq_err; -+ -+ do_sio = au_test_h_perm_sio(dir, MAY_EXEC | MAY_WRITE); -+ if (!do_sio) -+ err = vfsub_mkdir(dir, path, mode); -+ else { -+ struct au_vfsub_mkdir_args args = { -+ .errp = &err, -+ .dir = dir, -+ .path = path, -+ .mode = mode -+ }; -+ wkq_err = au_wkq_wait(au_call_vfsub_mkdir, &args); -+ if (unlikely(wkq_err)) -+ err = wkq_err; -+ } -+ -+ return err; -+} -+ -+struct au_vfsub_rmdir_args { -+ int *errp; -+ struct inode *dir; -+ struct path *path; -+}; -+ -+static void au_call_vfsub_rmdir(void *args) -+{ -+ struct au_vfsub_rmdir_args *a = args; -+ *a->errp = vfsub_rmdir(a->dir, a->path); -+} -+ -+int vfsub_sio_rmdir(struct inode *dir, struct path *path) -+{ -+ int err, do_sio, wkq_err; -+ -+ do_sio = au_test_h_perm_sio(dir, MAY_EXEC | MAY_WRITE); -+ if (!do_sio) -+ err = vfsub_rmdir(dir, path); -+ else { -+ struct au_vfsub_rmdir_args args = { -+ .errp = &err, -+ .dir = dir, -+ .path = path -+ }; -+ wkq_err = au_wkq_wait(au_call_vfsub_rmdir, &args); -+ if (unlikely(wkq_err)) -+ err = wkq_err; -+ } -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+struct notify_change_args { -+ int *errp; -+ struct path *path; -+ struct iattr *ia; -+}; -+ -+static void call_notify_change(void *args) -+{ -+ struct notify_change_args *a = args; -+ struct inode *h_inode; -+ -+ h_inode = a->path->dentry->d_inode; -+ IMustLock(h_inode); -+ -+ *a->errp = -EPERM; -+ if (!IS_IMMUTABLE(h_inode) && !IS_APPEND(h_inode)) { -+ /* lockdep_off(); */ -+ *a->errp = notify_change(a->path->dentry, a->ia); -+ /* lockdep_on(); */ -+ if (!*a->errp) -+ vfsub_update_h_iattr(a->path, /*did*/NULL); /*ignore*/ -+ } -+ AuTraceErr(*a->errp); -+} -+ -+int vfsub_notify_change(struct path *path, struct iattr *ia) -+{ -+ int err; -+ struct notify_change_args args = { -+ .errp = &err, -+ .path = path, -+ .ia = ia -+ }; -+ -+ call_notify_change(&args); -+ -+ return err; -+} -+ -+int vfsub_sio_notify_change(struct path *path, struct iattr *ia) -+{ -+ int err, wkq_err; -+ struct notify_change_args args = { -+ .errp = &err, -+ .path = path, -+ .ia = ia -+ }; -+ -+ wkq_err = au_wkq_wait(call_notify_change, &args); -+ if (unlikely(wkq_err)) -+ err = wkq_err; -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+struct unlink_args { -+ int *errp; -+ struct inode *dir; -+ struct path *path; -+}; -+ -+static void call_unlink(void *args) -+{ -+ struct unlink_args *a = args; -+ struct dentry *d = a->path->dentry; -+ struct inode *h_inode; -+ const int stop_sillyrename = (au_test_nfs(d->d_sb) -+ && atomic_read(&d->d_count) == 1); -+ -+ IMustLock(a->dir); -+ -+ a->path->dentry = d->d_parent; -+ *a->errp = security_path_unlink(a->path, d); -+ a->path->dentry = d; -+ if (unlikely(*a->errp)) -+ return; -+ -+ if (!stop_sillyrename) -+ dget(d); -+ h_inode = d->d_inode; -+ if (h_inode) -+ atomic_inc(&h_inode->i_count); -+ -+ /* lockdep_off(); */ -+ *a->errp = vfs_unlink(a->dir, d); -+ /* lockdep_on(); */ -+ if (!*a->errp) { -+ struct path tmp = { -+ .dentry = d->d_parent, -+ .mnt = a->path->mnt -+ }; -+ vfsub_update_h_iattr(&tmp, /*did*/NULL); /*ignore*/ -+ } -+ -+ if (!stop_sillyrename) -+ dput(d); -+ if (h_inode) -+ iput(h_inode); -+ -+ AuTraceErr(*a->errp); -+} -+ -+/* -+ * @dir: must be locked. -+ * @dentry: target dentry. -+ */ -+int vfsub_unlink(struct inode *dir, struct path *path, int force) -+{ -+ int err; -+ struct unlink_args args = { -+ .errp = &err, -+ .dir = dir, -+ .path = path -+ }; -+ -+ if (!force) -+ call_unlink(&args); -+ else { -+ int wkq_err; -+ -+ wkq_err = au_wkq_wait(call_unlink, &args); -+ if (unlikely(wkq_err)) -+ err = wkq_err; -+ } -+ -+ return err; -+} -diff -Nur linux-2.6.33.1-vanilla/fs/aufs/vfsub.h linux-2.6.33.1/fs/aufs/vfsub.h ---- linux-2.6.33.1-vanilla/fs/aufs/vfsub.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-2.6.33.1/fs/aufs/vfsub.h 2010-04-05 16:53:27.000000000 +0200 -@@ -0,0 +1,175 @@ -+/* -+ * Copyright (C) 2005-2010 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+/* -+ * sub-routines for VFS -+ */ -+ -+#ifndef __AUFS_VFSUB_H__ -+#define __AUFS_VFSUB_H__ -+ -+#ifdef __KERNEL__ -+ -+#include -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* lock subclass for lower inode */ -+/* default MAX_LOCKDEP_SUBCLASSES(8) is not enough */ -+/* reduce? gave up. */ -+enum { -+ AuLsc_I_Begin = I_MUTEX_QUOTA, /* 4 */ -+ AuLsc_I_PARENT, /* lower inode, parent first */ -+ AuLsc_I_PARENT2, /* copyup dirs */ -+ AuLsc_I_PARENT3, /* copyup wh */ -+ AuLsc_I_CHILD, -+ AuLsc_I_CHILD2, -+ AuLsc_I_End -+}; -+ -+/* to debug easier, do not make them inlined functions */ -+#define MtxMustLock(mtx) AuDebugOn(!mutex_is_locked(mtx)) -+#define IMustLock(i) MtxMustLock(&(i)->i_mutex) -+ -+/* ---------------------------------------------------------------------- */ -+ -+int vfsub_update_h_iattr(struct path *h_path, int *did); -+struct file *vfsub_dentry_open(struct path *path, int flags); -+struct file *vfsub_filp_open(const char *path, int oflags, int mode); -+int vfsub_kern_path(const char *name, unsigned int flags, struct path *path); -+struct dentry *vfsub_lookup_one_len(const char *name, struct dentry *parent, -+ int len); -+struct dentry *vfsub_lookup_hash(struct nameidata *nd); -+ -+/* ---------------------------------------------------------------------- */ -+ -+struct au_hinode; -+struct dentry *vfsub_lock_rename(struct dentry *d1, struct au_hinode *hdir1, -+ struct dentry *d2, struct au_hinode *hdir2); -+void vfsub_unlock_rename(struct dentry *d1, struct au_hinode *hdir1, -+ struct dentry *d2, struct au_hinode *hdir2); -+ -+int vfsub_create(struct inode *dir, struct path *path, int mode); -+int vfsub_symlink(struct inode *dir, struct path *path, -+ const char *symname); -+int vfsub_mknod(struct inode *dir, struct path *path, int mode, dev_t dev); -+int vfsub_link(struct dentry *src_dentry, struct inode *dir, -+ struct path *path); -+int vfsub_rename(struct inode *src_hdir, struct dentry *src_dentry, -+ struct inode *hdir, struct path *path); -+int vfsub_mkdir(struct inode *dir, struct path *path, int mode); -+int vfsub_rmdir(struct inode *dir, struct path *path); -+ -+/* ---------------------------------------------------------------------- */ -+ -+ssize_t vfsub_read_u(struct file *file, char __user *ubuf, size_t count, -+ loff_t *ppos); -+ssize_t vfsub_read_k(struct file *file, void *kbuf, size_t count, -+ loff_t *ppos); -+ssize_t vfsub_write_u(struct file *file, const char __user *ubuf, size_t count, -+ loff_t *ppos); -+ssize_t vfsub_write_k(struct file *file, void *kbuf, size_t count, -+ loff_t *ppos); -+int vfsub_readdir(struct file *file, filldir_t filldir, void *arg); -+ -+static inline unsigned int vfsub_file_flags(struct file *file) -+{ -+ unsigned int flags; -+ -+ spin_lock(&file->f_lock); -+ flags = file->f_flags; -+ spin_unlock(&file->f_lock); -+ -+ return flags; -+} -+ -+static inline void vfsub_file_accessed(struct file *h_file) -+{ -+ file_accessed(h_file); -+ vfsub_update_h_iattr(&h_file->f_path, /*did*/NULL); /*ignore*/ -+} -+ -+static inline void vfsub_touch_atime(struct vfsmount *h_mnt, -+ struct dentry *h_dentry) -+{ -+ struct path h_path = { -+ .dentry = h_dentry, -+ .mnt = h_mnt -+ }; -+ touch_atime(h_mnt, h_dentry); -+ vfsub_update_h_iattr(&h_path, /*did*/NULL); /*ignore*/ -+} -+ -+long vfsub_splice_to(struct file *in, loff_t *ppos, -+ struct pipe_inode_info *pipe, size_t len, -+ unsigned int flags); -+long vfsub_splice_from(struct pipe_inode_info *pipe, struct file *out, -+ loff_t *ppos, size_t len, unsigned int flags); -+int vfsub_trunc(struct path *h_path, loff_t length, unsigned int attr, -+ struct file *h_file); -+ -+/* ---------------------------------------------------------------------- */ -+ -+static inline loff_t vfsub_llseek(struct file *file, loff_t offset, int origin) -+{ -+ loff_t err; -+ -+ /* lockdep_off(); */ -+ err = vfs_llseek(file, offset, origin); -+ /* lockdep_on(); */ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* dirty workaround for strict type of fmode_t */ -+union vfsub_fmu { -+ fmode_t fm; -+ unsigned int ui; -+}; -+ -+static inline unsigned int vfsub_fmode_to_uint(fmode_t fm) -+{ -+ union vfsub_fmu u = { -+ .fm = fm -+ }; -+ -+ BUILD_BUG_ON(sizeof(u.fm) != sizeof(u.ui)); -+ -+ return u.ui; -+} -+ -+static inline fmode_t vfsub_uint_to_fmode(unsigned int ui) -+{ -+ union vfsub_fmu u = { -+ .ui = ui -+ }; -+ -+ return u.fm; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+int vfsub_sio_mkdir(struct inode *dir, struct path *path, int mode); -+int vfsub_sio_rmdir(struct inode *dir, struct path *path); -+int vfsub_sio_notify_change(struct path *path, struct iattr *ia); -+int vfsub_notify_change(struct path *path, struct iattr *ia); -+int vfsub_unlink(struct inode *dir, struct path *path, int force); -+ -+#endif /* __KERNEL__ */ -+#endif /* __AUFS_VFSUB_H__ */ -diff -Nur linux-2.6.33.1-vanilla/fs/aufs/wbr_policy.c linux-2.6.33.1/fs/aufs/wbr_policy.c ---- linux-2.6.33.1-vanilla/fs/aufs/wbr_policy.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-2.6.33.1/fs/aufs/wbr_policy.c 2010-04-05 16:53:27.000000000 +0200 -@@ -0,0 +1,637 @@ -+/* -+ * Copyright (C) 2005-2010 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+/* -+ * policies for selecting one among multiple writable branches -+ */ -+ -+#include -+#include "aufs.h" -+ -+/* subset of cpup_attr() */ -+static noinline_for_stack -+int au_cpdown_attr(struct path *h_path, struct dentry *h_src) -+{ -+ int err, sbits; -+ struct iattr ia; -+ struct inode *h_isrc; -+ -+ h_isrc = h_src->d_inode; -+ ia.ia_valid = ATTR_FORCE | ATTR_MODE | ATTR_UID | ATTR_GID; -+ ia.ia_mode = h_isrc->i_mode; -+ ia.ia_uid = h_isrc->i_uid; -+ ia.ia_gid = h_isrc->i_gid; -+ sbits = !!(ia.ia_mode & (S_ISUID | S_ISGID)); -+ au_cpup_attr_flags(h_path->dentry->d_inode, h_isrc); -+ err = vfsub_sio_notify_change(h_path, &ia); -+ -+ /* is this nfs only? */ -+ if (!err && sbits && au_test_nfs(h_path->dentry->d_sb)) { -+ ia.ia_valid = ATTR_FORCE | ATTR_MODE; -+ ia.ia_mode = h_isrc->i_mode; -+ err = vfsub_sio_notify_change(h_path, &ia); -+ } -+ -+ return err; -+} -+ -+#define AuCpdown_PARENT_OPQ 1 -+#define AuCpdown_WHED (1 << 1) -+#define AuCpdown_MADE_DIR (1 << 2) -+#define AuCpdown_DIROPQ (1 << 3) -+#define au_ftest_cpdown(flags, name) ((flags) & AuCpdown_##name) -+#define au_fset_cpdown(flags, name) { (flags) |= AuCpdown_##name; } -+#define au_fclr_cpdown(flags, name) { (flags) &= ~AuCpdown_##name; } -+ -+struct au_cpdown_dir_args { -+ struct dentry *parent; -+ unsigned int flags; -+}; -+ -+static int au_cpdown_dir_opq(struct dentry *dentry, aufs_bindex_t bdst, -+ struct au_cpdown_dir_args *a) -+{ -+ int err; -+ struct dentry *opq_dentry; -+ -+ opq_dentry = au_diropq_create(dentry, bdst); -+ err = PTR_ERR(opq_dentry); -+ if (IS_ERR(opq_dentry)) -+ goto out; -+ dput(opq_dentry); -+ au_fset_cpdown(a->flags, DIROPQ); -+ -+ out: -+ return err; -+} -+ -+static int au_cpdown_dir_wh(struct dentry *dentry, struct dentry *h_parent, -+ struct inode *dir, aufs_bindex_t bdst) -+{ -+ int err; -+ struct path h_path; -+ struct au_branch *br; -+ -+ br = au_sbr(dentry->d_sb, bdst); -+ h_path.dentry = au_wh_lkup(h_parent, &dentry->d_name, br); -+ err = PTR_ERR(h_path.dentry); -+ if (IS_ERR(h_path.dentry)) -+ goto out; -+ -+ err = 0; -+ if (h_path.dentry->d_inode) { -+ h_path.mnt = br->br_mnt; -+ err = au_wh_unlink_dentry(au_h_iptr(dir, bdst), &h_path, -+ dentry); -+ } -+ dput(h_path.dentry); -+ -+ out: -+ return err; -+} -+ -+static int au_cpdown_dir(struct dentry *dentry, aufs_bindex_t bdst, -+ struct dentry *h_parent, void *arg) -+{ -+ int err, rerr; -+ aufs_bindex_t bopq, bstart; -+ struct path h_path; -+ struct dentry *parent; -+ struct inode *h_dir, *h_inode, *inode, *dir; -+ struct au_cpdown_dir_args *args = arg; -+ -+ bstart = au_dbstart(dentry); -+ /* dentry is di-locked */ -+ parent = dget_parent(dentry); -+ dir = parent->d_inode; -+ h_dir = h_parent->d_inode; -+ AuDebugOn(h_dir != au_h_iptr(dir, bdst)); -+ IMustLock(h_dir); -+ -+ err = au_lkup_neg(dentry, bdst); -+ if (unlikely(err < 0)) -+ goto out; -+ h_path.dentry = au_h_dptr(dentry, bdst); -+ h_path.mnt = au_sbr_mnt(dentry->d_sb, bdst); -+ err = vfsub_sio_mkdir(au_h_iptr(dir, bdst), &h_path, -+ S_IRWXU | S_IRUGO | S_IXUGO); -+ if (unlikely(err)) -+ goto out_put; -+ au_fset_cpdown(args->flags, MADE_DIR); -+ -+ bopq = au_dbdiropq(dentry); -+ au_fclr_cpdown(args->flags, WHED); -+ au_fclr_cpdown(args->flags, DIROPQ); -+ if (au_dbwh(dentry) == bdst) -+ au_fset_cpdown(args->flags, WHED); -+ if (!au_ftest_cpdown(args->flags, PARENT_OPQ) && bopq <= bdst) -+ au_fset_cpdown(args->flags, PARENT_OPQ); -+ h_inode = h_path.dentry->d_inode; -+ mutex_lock_nested(&h_inode->i_mutex, AuLsc_I_CHILD); -+ if (au_ftest_cpdown(args->flags, WHED)) { -+ err = au_cpdown_dir_opq(dentry, bdst, args); -+ if (unlikely(err)) { -+ mutex_unlock(&h_inode->i_mutex); -+ goto out_dir; -+ } -+ } -+ -+ err = au_cpdown_attr(&h_path, au_h_dptr(dentry, bstart)); -+ mutex_unlock(&h_inode->i_mutex); -+ if (unlikely(err)) -+ goto out_opq; -+ -+ if (au_ftest_cpdown(args->flags, WHED)) { -+ err = au_cpdown_dir_wh(dentry, h_parent, dir, bdst); -+ if (unlikely(err)) -+ goto out_opq; -+ } -+ -+ inode = dentry->d_inode; -+ if (au_ibend(inode) < bdst) -+ au_set_ibend(inode, bdst); -+ au_set_h_iptr(inode, bdst, au_igrab(h_inode), -+ au_hi_flags(inode, /*isdir*/1)); -+ goto out; /* success */ -+ -+ /* revert */ -+ out_opq: -+ if (au_ftest_cpdown(args->flags, DIROPQ)) { -+ mutex_lock_nested(&h_inode->i_mutex, AuLsc_I_CHILD); -+ rerr = au_diropq_remove(dentry, bdst); -+ mutex_unlock(&h_inode->i_mutex); -+ if (unlikely(rerr)) { -+ AuIOErr("failed removing diropq for %.*s b%d (%d)\n", -+ AuDLNPair(dentry), bdst, rerr); -+ err = -EIO; -+ goto out; -+ } -+ } -+ out_dir: -+ if (au_ftest_cpdown(args->flags, MADE_DIR)) { -+ rerr = vfsub_sio_rmdir(au_h_iptr(dir, bdst), &h_path); -+ if (unlikely(rerr)) { -+ AuIOErr("failed removing %.*s b%d (%d)\n", -+ AuDLNPair(dentry), bdst, rerr); -+ err = -EIO; -+ } -+ } -+ out_put: -+ au_set_h_dptr(dentry, bdst, NULL); -+ if (au_dbend(dentry) == bdst) -+ au_update_dbend(dentry); -+ out: -+ dput(parent); -+ return err; -+} -+ -+int au_cpdown_dirs(struct dentry *dentry, aufs_bindex_t bdst) -+{ -+ int err; -+ struct au_cpdown_dir_args args = { -+ .parent = dget_parent(dentry), -+ .flags = 0 -+ }; -+ -+ err = au_cp_dirs(dentry, bdst, au_cpdown_dir, &args); -+ dput(args.parent); -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* policies for create */ -+ -+static int au_wbr_bu(struct super_block *sb, aufs_bindex_t bindex) -+{ -+ for (; bindex >= 0; bindex--) -+ if (!au_br_rdonly(au_sbr(sb, bindex))) -+ return bindex; -+ return -EROFS; -+} -+ -+/* top down parent */ -+static int au_wbr_create_tdp(struct dentry *dentry, int isdir __maybe_unused) -+{ -+ int err; -+ aufs_bindex_t bstart, bindex; -+ struct super_block *sb; -+ struct dentry *parent, *h_parent; -+ -+ sb = dentry->d_sb; -+ bstart = au_dbstart(dentry); -+ err = bstart; -+ if (!au_br_rdonly(au_sbr(sb, bstart))) -+ goto out; -+ -+ err = -EROFS; -+ parent = dget_parent(dentry); -+ for (bindex = au_dbstart(parent); bindex < bstart; bindex++) { -+ h_parent = au_h_dptr(parent, bindex); -+ if (!h_parent || !h_parent->d_inode) -+ continue; -+ -+ if (!au_br_rdonly(au_sbr(sb, bindex))) { -+ err = bindex; -+ break; -+ } -+ } -+ dput(parent); -+ -+ /* bottom up here */ -+ if (unlikely(err < 0)) -+ err = au_wbr_bu(sb, bstart - 1); -+ -+ out: -+ AuDbg("b%d\n", err); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* an exception for the policy other than tdp */ -+static int au_wbr_create_exp(struct dentry *dentry) -+{ -+ int err; -+ aufs_bindex_t bwh, bdiropq; -+ struct dentry *parent; -+ -+ err = -1; -+ bwh = au_dbwh(dentry); -+ parent = dget_parent(dentry); -+ bdiropq = au_dbdiropq(parent); -+ if (bwh >= 0) { -+ if (bdiropq >= 0) -+ err = min(bdiropq, bwh); -+ else -+ err = bwh; -+ AuDbg("%d\n", err); -+ } else if (bdiropq >= 0) { -+ err = bdiropq; -+ AuDbg("%d\n", err); -+ } -+ dput(parent); -+ -+ if (err >= 0 && au_br_rdonly(au_sbr(dentry->d_sb, err))) -+ err = -1; -+ -+ AuDbg("%d\n", err); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* round robin */ -+static int au_wbr_create_init_rr(struct super_block *sb) -+{ -+ int err; -+ -+ err = au_wbr_bu(sb, au_sbend(sb)); -+ atomic_set(&au_sbi(sb)->si_wbr_rr_next, -err); /* less important */ -+ /* smp_mb(); */ -+ -+ AuDbg("b%d\n", err); -+ return err; -+} -+ -+static int au_wbr_create_rr(struct dentry *dentry, int isdir) -+{ -+ int err, nbr; -+ unsigned int u; -+ aufs_bindex_t bindex, bend; -+ struct super_block *sb; -+ atomic_t *next; -+ -+ err = au_wbr_create_exp(dentry); -+ if (err >= 0) -+ goto out; -+ -+ sb = dentry->d_sb; -+ next = &au_sbi(sb)->si_wbr_rr_next; -+ bend = au_sbend(sb); -+ nbr = bend + 1; -+ for (bindex = 0; bindex <= bend; bindex++) { -+ if (!isdir) { -+ err = atomic_dec_return(next) + 1; -+ /* modulo for 0 is meaningless */ -+ if (unlikely(!err)) -+ err = atomic_dec_return(next) + 1; -+ } else -+ err = atomic_read(next); -+ AuDbg("%d\n", err); -+ u = err; -+ err = u % nbr; -+ AuDbg("%d\n", err); -+ if (!au_br_rdonly(au_sbr(sb, err))) -+ break; -+ err = -EROFS; -+ } -+ -+ out: -+ AuDbg("%d\n", err); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* most free space */ -+static void au_mfs(struct dentry *dentry) -+{ -+ struct super_block *sb; -+ struct au_branch *br; -+ struct au_wbr_mfs *mfs; -+ aufs_bindex_t bindex, bend; -+ int err; -+ unsigned long long b, bavail; -+ /* reduce the stack usage */ -+ struct kstatfs *st; -+ -+ st = kmalloc(sizeof(*st), GFP_NOFS); -+ if (unlikely(!st)) { -+ AuWarn1("failed updating mfs(%d), ignored\n", -ENOMEM); -+ return; -+ } -+ -+ bavail = 0; -+ sb = dentry->d_sb; -+ mfs = &au_sbi(sb)->si_wbr_mfs; -+ MtxMustLock(&mfs->mfs_lock); -+ mfs->mfs_bindex = -EROFS; -+ mfs->mfsrr_bytes = 0; -+ bend = au_sbend(sb); -+ for (bindex = 0; bindex <= bend; bindex++) { -+ br = au_sbr(sb, bindex); -+ if (au_br_rdonly(br)) -+ continue; -+ -+ /* sb->s_root for NFS is unreliable */ -+ err = vfs_statfs(br->br_mnt->mnt_root, st); -+ if (unlikely(err)) { -+ AuWarn1("failed statfs, b%d, %d\n", bindex, err); -+ continue; -+ } -+ -+ /* when the available size is equal, select the lower one */ -+ BUILD_BUG_ON(sizeof(b) < sizeof(st->f_bavail) -+ || sizeof(b) < sizeof(st->f_bsize)); -+ b = st->f_bavail * st->f_bsize; -+ br->br_wbr->wbr_bytes = b; -+ if (b >= bavail) { -+ bavail = b; -+ mfs->mfs_bindex = bindex; -+ mfs->mfs_jiffy = jiffies; -+ } -+ } -+ -+ mfs->mfsrr_bytes = bavail; -+ AuDbg("b%d\n", mfs->mfs_bindex); -+ kfree(st); -+} -+ -+static int au_wbr_create_mfs(struct dentry *dentry, int isdir __maybe_unused) -+{ -+ int err; -+ struct super_block *sb; -+ struct au_wbr_mfs *mfs; -+ -+ err = au_wbr_create_exp(dentry); -+ if (err >= 0) -+ goto out; -+ -+ sb = dentry->d_sb; -+ mfs = &au_sbi(sb)->si_wbr_mfs; -+ mutex_lock(&mfs->mfs_lock); -+ if (time_after(jiffies, mfs->mfs_jiffy + mfs->mfs_expire) -+ || mfs->mfs_bindex < 0 -+ || au_br_rdonly(au_sbr(sb, mfs->mfs_bindex))) -+ au_mfs(dentry); -+ mutex_unlock(&mfs->mfs_lock); -+ err = mfs->mfs_bindex; -+ -+ out: -+ AuDbg("b%d\n", err); -+ return err; -+} -+ -+static int au_wbr_create_init_mfs(struct super_block *sb) -+{ -+ struct au_wbr_mfs *mfs; -+ -+ mfs = &au_sbi(sb)->si_wbr_mfs; -+ mutex_init(&mfs->mfs_lock); -+ mfs->mfs_jiffy = 0; -+ mfs->mfs_bindex = -EROFS; -+ -+ return 0; -+} -+ -+static int au_wbr_create_fin_mfs(struct super_block *sb __maybe_unused) -+{ -+ mutex_destroy(&au_sbi(sb)->si_wbr_mfs.mfs_lock); -+ return 0; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* most free space and then round robin */ -+static int au_wbr_create_mfsrr(struct dentry *dentry, int isdir) -+{ -+ int err; -+ struct au_wbr_mfs *mfs; -+ -+ err = au_wbr_create_mfs(dentry, isdir); -+ if (err >= 0) { -+ mfs = &au_sbi(dentry->d_sb)->si_wbr_mfs; -+ mutex_lock(&mfs->mfs_lock); -+ if (mfs->mfsrr_bytes < mfs->mfsrr_watermark) -+ err = au_wbr_create_rr(dentry, isdir); -+ mutex_unlock(&mfs->mfs_lock); -+ } -+ -+ AuDbg("b%d\n", err); -+ return err; -+} -+ -+static int au_wbr_create_init_mfsrr(struct super_block *sb) -+{ -+ int err; -+ -+ au_wbr_create_init_mfs(sb); /* ignore */ -+ err = au_wbr_create_init_rr(sb); -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* top down parent and most free space */ -+static int au_wbr_create_pmfs(struct dentry *dentry, int isdir) -+{ -+ int err, e2; -+ unsigned long long b; -+ aufs_bindex_t bindex, bstart, bend; -+ struct super_block *sb; -+ struct dentry *parent, *h_parent; -+ struct au_branch *br; -+ -+ err = au_wbr_create_tdp(dentry, isdir); -+ if (unlikely(err < 0)) -+ goto out; -+ parent = dget_parent(dentry); -+ bstart = au_dbstart(parent); -+ bend = au_dbtaildir(parent); -+ if (bstart == bend) -+ goto out_parent; /* success */ -+ -+ e2 = au_wbr_create_mfs(dentry, isdir); -+ if (e2 < 0) -+ goto out_parent; /* success */ -+ -+ /* when the available size is equal, select upper one */ -+ sb = dentry->d_sb; -+ br = au_sbr(sb, err); -+ b = br->br_wbr->wbr_bytes; -+ AuDbg("b%d, %llu\n", err, b); -+ -+ for (bindex = bstart; bindex <= bend; bindex++) { -+ h_parent = au_h_dptr(parent, bindex); -+ if (!h_parent || !h_parent->d_inode) -+ continue; -+ -+ br = au_sbr(sb, bindex); -+ if (!au_br_rdonly(br) && br->br_wbr->wbr_bytes > b) { -+ b = br->br_wbr->wbr_bytes; -+ err = bindex; -+ AuDbg("b%d, %llu\n", err, b); -+ } -+ } -+ -+ out_parent: -+ dput(parent); -+ out: -+ AuDbg("b%d\n", err); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* policies for copyup */ -+ -+/* top down parent */ -+static int au_wbr_copyup_tdp(struct dentry *dentry) -+{ -+ return au_wbr_create_tdp(dentry, /*isdir, anything is ok*/0); -+} -+ -+/* bottom up parent */ -+static int au_wbr_copyup_bup(struct dentry *dentry) -+{ -+ int err; -+ aufs_bindex_t bindex, bstart; -+ struct dentry *parent, *h_parent; -+ struct super_block *sb; -+ -+ err = -EROFS; -+ sb = dentry->d_sb; -+ parent = dget_parent(dentry); -+ bstart = au_dbstart(parent); -+ for (bindex = au_dbstart(dentry); bindex >= bstart; bindex--) { -+ h_parent = au_h_dptr(parent, bindex); -+ if (!h_parent || !h_parent->d_inode) -+ continue; -+ -+ if (!au_br_rdonly(au_sbr(sb, bindex))) { -+ err = bindex; -+ break; -+ } -+ } -+ dput(parent); -+ -+ /* bottom up here */ -+ if (unlikely(err < 0)) -+ err = au_wbr_bu(sb, bstart - 1); -+ -+ AuDbg("b%d\n", err); -+ return err; -+} -+ -+/* bottom up */ -+static int au_wbr_copyup_bu(struct dentry *dentry) -+{ -+ int err; -+ -+ err = au_wbr_bu(dentry->d_sb, au_dbstart(dentry)); -+ -+ AuDbg("b%d\n", err); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+struct au_wbr_copyup_operations au_wbr_copyup_ops[] = { -+ [AuWbrCopyup_TDP] = { -+ .copyup = au_wbr_copyup_tdp -+ }, -+ [AuWbrCopyup_BUP] = { -+ .copyup = au_wbr_copyup_bup -+ }, -+ [AuWbrCopyup_BU] = { -+ .copyup = au_wbr_copyup_bu -+ } -+}; -+ -+struct au_wbr_create_operations au_wbr_create_ops[] = { -+ [AuWbrCreate_TDP] = { -+ .create = au_wbr_create_tdp -+ }, -+ [AuWbrCreate_RR] = { -+ .create = au_wbr_create_rr, -+ .init = au_wbr_create_init_rr -+ }, -+ [AuWbrCreate_MFS] = { -+ .create = au_wbr_create_mfs, -+ .init = au_wbr_create_init_mfs, -+ .fin = au_wbr_create_fin_mfs -+ }, -+ [AuWbrCreate_MFSV] = { -+ .create = au_wbr_create_mfs, -+ .init = au_wbr_create_init_mfs, -+ .fin = au_wbr_create_fin_mfs -+ }, -+ [AuWbrCreate_MFSRR] = { -+ .create = au_wbr_create_mfsrr, -+ .init = au_wbr_create_init_mfsrr, -+ .fin = au_wbr_create_fin_mfs -+ }, -+ [AuWbrCreate_MFSRRV] = { -+ .create = au_wbr_create_mfsrr, -+ .init = au_wbr_create_init_mfsrr, -+ .fin = au_wbr_create_fin_mfs -+ }, -+ [AuWbrCreate_PMFS] = { -+ .create = au_wbr_create_pmfs, -+ .init = au_wbr_create_init_mfs, -+ .fin = au_wbr_create_fin_mfs -+ }, -+ [AuWbrCreate_PMFSV] = { -+ .create = au_wbr_create_pmfs, -+ .init = au_wbr_create_init_mfs, -+ .fin = au_wbr_create_fin_mfs -+ } -+}; -diff -Nur linux-2.6.33.1-vanilla/fs/aufs/whout.c linux-2.6.33.1/fs/aufs/whout.c ---- linux-2.6.33.1-vanilla/fs/aufs/whout.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-2.6.33.1/fs/aufs/whout.c 2010-04-05 16:53:27.000000000 +0200 -@@ -0,0 +1,1052 @@ -+/* -+ * Copyright (C) 2005-2010 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+/* -+ * whiteout for logical deletion and opaque directory -+ */ -+ -+#include -+#include "aufs.h" -+ -+#define WH_MASK S_IRUGO -+ -+/* -+ * If a directory contains this file, then it is opaque. We start with the -+ * .wh. flag so that it is blocked by lookup. -+ */ -+static struct qstr diropq_name = { -+ .name = AUFS_WH_DIROPQ, -+ .len = sizeof(AUFS_WH_DIROPQ) - 1 -+}; -+ -+/* -+ * generate whiteout name, which is NOT terminated by NULL. -+ * @name: original d_name.name -+ * @len: original d_name.len -+ * @wh: whiteout qstr -+ * returns zero when succeeds, otherwise error. -+ * succeeded value as wh->name should be freed by kfree(). -+ */ -+int au_wh_name_alloc(struct qstr *wh, const struct qstr *name) -+{ -+ char *p; -+ -+ if (unlikely(name->len > PATH_MAX - AUFS_WH_PFX_LEN)) -+ return -ENAMETOOLONG; -+ -+ wh->len = name->len + AUFS_WH_PFX_LEN; -+ p = kmalloc(wh->len, GFP_NOFS); -+ wh->name = p; -+ if (p) { -+ memcpy(p, AUFS_WH_PFX, AUFS_WH_PFX_LEN); -+ memcpy(p + AUFS_WH_PFX_LEN, name->name, name->len); -+ /* smp_mb(); */ -+ return 0; -+ } -+ return -ENOMEM; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * test if the @wh_name exists under @h_parent. -+ * @try_sio specifies the necessary of super-io. -+ */ -+int au_wh_test(struct dentry *h_parent, struct qstr *wh_name, -+ struct au_branch *br, int try_sio) -+{ -+ int err; -+ struct dentry *wh_dentry; -+ -+ if (!try_sio) -+ wh_dentry = au_lkup_one(wh_name, h_parent, br, /*nd*/NULL); -+ else -+ wh_dentry = au_sio_lkup_one(wh_name, h_parent, br); -+ err = PTR_ERR(wh_dentry); -+ if (IS_ERR(wh_dentry)) -+ goto out; -+ -+ err = 0; -+ if (!wh_dentry->d_inode) -+ goto out_wh; /* success */ -+ -+ err = 1; -+ if (S_ISREG(wh_dentry->d_inode->i_mode)) -+ goto out_wh; /* success */ -+ -+ err = -EIO; -+ AuIOErr("%.*s Invalid whiteout entry type 0%o.\n", -+ AuDLNPair(wh_dentry), wh_dentry->d_inode->i_mode); -+ -+ out_wh: -+ dput(wh_dentry); -+ out: -+ return err; -+} -+ -+/* -+ * test if the @h_dentry sets opaque or not. -+ */ -+int au_diropq_test(struct dentry *h_dentry, struct au_branch *br) -+{ -+ int err; -+ struct inode *h_dir; -+ -+ h_dir = h_dentry->d_inode; -+ err = au_wh_test(h_dentry, &diropq_name, br, -+ au_test_h_perm_sio(h_dir, MAY_EXEC)); -+ return err; -+} -+ -+/* -+ * returns a negative dentry whose name is unique and temporary. -+ */ -+struct dentry *au_whtmp_lkup(struct dentry *h_parent, struct au_branch *br, -+ struct qstr *prefix) -+{ -+ struct dentry *dentry; -+ int i; -+ char defname[NAME_MAX - AUFS_MAX_NAMELEN + DNAME_INLINE_LEN_MIN + 1], -+ *name, *p; -+ static unsigned short cnt; -+ struct qstr qs; -+ -+ BUILD_BUG_ON(sizeof(cnt) * 2 > AUFS_WH_TMP_LEN); -+ -+ name = defname; -+ qs.len = sizeof(defname) - DNAME_INLINE_LEN_MIN + prefix->len - 1; -+ if (unlikely(prefix->len > DNAME_INLINE_LEN_MIN)) { -+ dentry = ERR_PTR(-ENAMETOOLONG); -+ if (unlikely(qs.len > NAME_MAX)) -+ goto out; -+ dentry = ERR_PTR(-ENOMEM); -+ name = kmalloc(qs.len + 1, GFP_NOFS); -+ if (unlikely(!name)) -+ goto out; -+ } -+ -+ /* doubly whiteout-ed */ -+ memcpy(name, AUFS_WH_PFX AUFS_WH_PFX, AUFS_WH_PFX_LEN * 2); -+ p = name + AUFS_WH_PFX_LEN * 2; -+ memcpy(p, prefix->name, prefix->len); -+ p += prefix->len; -+ *p++ = '.'; -+ AuDebugOn(name + qs.len + 1 - p <= AUFS_WH_TMP_LEN); -+ -+ qs.name = name; -+ for (i = 0; i < 3; i++) { -+ sprintf(p, "%.*d", AUFS_WH_TMP_LEN, cnt++); -+ dentry = au_sio_lkup_one(&qs, h_parent, br); -+ if (IS_ERR(dentry) || !dentry->d_inode) -+ goto out_name; -+ dput(dentry); -+ } -+ /* pr_warning("could not get random name\n"); */ -+ dentry = ERR_PTR(-EEXIST); -+ AuDbg("%.*s\n", AuLNPair(&qs)); -+ BUG(); -+ -+ out_name: -+ if (name != defname) -+ kfree(name); -+ out: -+ AuTraceErrPtr(dentry); -+ return dentry; -+} -+ -+/* -+ * rename the @h_dentry on @br to the whiteouted temporary name. -+ */ -+int au_whtmp_ren(struct dentry *h_dentry, struct au_branch *br) -+{ -+ int err; -+ struct path h_path = { -+ .mnt = br->br_mnt -+ }; -+ struct inode *h_dir; -+ struct dentry *h_parent; -+ -+ h_parent = h_dentry->d_parent; /* dir inode is locked */ -+ h_dir = h_parent->d_inode; -+ IMustLock(h_dir); -+ -+ h_path.dentry = au_whtmp_lkup(h_parent, br, &h_dentry->d_name); -+ err = PTR_ERR(h_path.dentry); -+ if (IS_ERR(h_path.dentry)) -+ goto out; -+ -+ /* under the same dir, no need to lock_rename() */ -+ err = vfsub_rename(h_dir, h_dentry, h_dir, &h_path); -+ AuTraceErr(err); -+ dput(h_path.dentry); -+ -+ out: -+ AuTraceErr(err); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+/* -+ * functions for removing a whiteout -+ */ -+ -+static int do_unlink_wh(struct inode *h_dir, struct path *h_path) -+{ -+ int force; -+ -+ /* -+ * forces superio when the dir has a sticky bit. -+ * this may be a violation of unix fs semantics. -+ */ -+ force = (h_dir->i_mode & S_ISVTX) -+ && h_path->dentry->d_inode->i_uid != current_fsuid(); -+ return vfsub_unlink(h_dir, h_path, force); -+} -+ -+int au_wh_unlink_dentry(struct inode *h_dir, struct path *h_path, -+ struct dentry *dentry) -+{ -+ int err; -+ -+ err = do_unlink_wh(h_dir, h_path); -+ if (!err && dentry) -+ au_set_dbwh(dentry, -1); -+ -+ return err; -+} -+ -+static int unlink_wh_name(struct dentry *h_parent, struct qstr *wh, -+ struct au_branch *br) -+{ -+ int err; -+ struct path h_path = { -+ .mnt = br->br_mnt -+ }; -+ -+ err = 0; -+ h_path.dentry = au_lkup_one(wh, h_parent, br, /*nd*/NULL); -+ if (IS_ERR(h_path.dentry)) -+ err = PTR_ERR(h_path.dentry); -+ else { -+ if (h_path.dentry->d_inode -+ && S_ISREG(h_path.dentry->d_inode->i_mode)) -+ err = do_unlink_wh(h_parent->d_inode, &h_path); -+ dput(h_path.dentry); -+ } -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+/* -+ * initialize/clean whiteout for a branch -+ */ -+ -+static void au_wh_clean(struct inode *h_dir, struct path *whpath, -+ const int isdir) -+{ -+ int err; -+ -+ if (!whpath->dentry->d_inode) -+ return; -+ -+ err = mnt_want_write(whpath->mnt); -+ if (!err) { -+ if (isdir) -+ err = vfsub_rmdir(h_dir, whpath); -+ else -+ err = vfsub_unlink(h_dir, whpath, /*force*/0); -+ mnt_drop_write(whpath->mnt); -+ } -+ if (unlikely(err)) -+ pr_warning("failed removing %.*s (%d), ignored.\n", -+ AuDLNPair(whpath->dentry), err); -+} -+ -+static int test_linkable(struct dentry *h_root) -+{ -+ struct inode *h_dir = h_root->d_inode; -+ -+ if (h_dir->i_op->link) -+ return 0; -+ -+ pr_err("%.*s (%s) doesn't support link(2), use noplink and rw+nolwh\n", -+ AuDLNPair(h_root), au_sbtype(h_root->d_sb)); -+ return -ENOSYS; -+} -+ -+/* todo: should this mkdir be done in /sbin/mount.aufs helper? */ -+static int au_whdir(struct inode *h_dir, struct path *path) -+{ -+ int err; -+ -+ err = -EEXIST; -+ if (!path->dentry->d_inode) { -+ int mode = S_IRWXU; -+ -+ if (au_test_nfs(path->dentry->d_sb)) -+ mode |= S_IXUGO; -+ err = mnt_want_write(path->mnt); -+ if (!err) { -+ err = vfsub_mkdir(h_dir, path, mode); -+ mnt_drop_write(path->mnt); -+ } -+ } else if (S_ISDIR(path->dentry->d_inode->i_mode)) -+ err = 0; -+ else -+ pr_err("unknown %.*s exists\n", AuDLNPair(path->dentry)); -+ -+ return err; -+} -+ -+struct au_wh_base { -+ const struct qstr *name; -+ struct dentry *dentry; -+}; -+ -+static void au_wh_init_ro(struct inode *h_dir, struct au_wh_base base[], -+ struct path *h_path) -+{ -+ h_path->dentry = base[AuBrWh_BASE].dentry; -+ au_wh_clean(h_dir, h_path, /*isdir*/0); -+ h_path->dentry = base[AuBrWh_PLINK].dentry; -+ au_wh_clean(h_dir, h_path, /*isdir*/1); -+ h_path->dentry = base[AuBrWh_ORPH].dentry; -+ au_wh_clean(h_dir, h_path, /*isdir*/1); -+} -+ -+/* -+ * returns tri-state, -+ * minus: error, caller should print the mesage -+ * zero: succuess -+ * plus: error, caller should NOT print the mesage -+ */ -+static int au_wh_init_rw_nolink(struct dentry *h_root, struct au_wbr *wbr, -+ int do_plink, struct au_wh_base base[], -+ struct path *h_path) -+{ -+ int err; -+ struct inode *h_dir; -+ -+ h_dir = h_root->d_inode; -+ h_path->dentry = base[AuBrWh_BASE].dentry; -+ au_wh_clean(h_dir, h_path, /*isdir*/0); -+ h_path->dentry = base[AuBrWh_PLINK].dentry; -+ if (do_plink) { -+ err = test_linkable(h_root); -+ if (unlikely(err)) { -+ err = 1; -+ goto out; -+ } -+ -+ err = au_whdir(h_dir, h_path); -+ if (unlikely(err)) -+ goto out; -+ wbr->wbr_plink = dget(base[AuBrWh_PLINK].dentry); -+ } else -+ au_wh_clean(h_dir, h_path, /*isdir*/1); -+ h_path->dentry = base[AuBrWh_ORPH].dentry; -+ err = au_whdir(h_dir, h_path); -+ if (unlikely(err)) -+ goto out; -+ wbr->wbr_orph = dget(base[AuBrWh_ORPH].dentry); -+ -+ out: -+ return err; -+} -+ -+/* -+ * for the moment, aufs supports the branch filesystem which does not support -+ * link(2). testing on FAT which does not support i_op->setattr() fully either, -+ * copyup failed. finally, such filesystem will not be used as the writable -+ * branch. -+ * -+ * returns tri-state, see above. -+ */ -+static int au_wh_init_rw(struct dentry *h_root, struct au_wbr *wbr, -+ int do_plink, struct au_wh_base base[], -+ struct path *h_path) -+{ -+ int err; -+ struct inode *h_dir; -+ -+ WbrWhMustWriteLock(wbr); -+ -+ err = test_linkable(h_root); -+ if (unlikely(err)) { -+ err = 1; -+ goto out; -+ } -+ -+ /* -+ * todo: should this create be done in /sbin/mount.aufs helper? -+ */ -+ err = -EEXIST; -+ h_dir = h_root->d_inode; -+ if (!base[AuBrWh_BASE].dentry->d_inode) { -+ err = mnt_want_write(h_path->mnt); -+ if (!err) { -+ h_path->dentry = base[AuBrWh_BASE].dentry; -+ err = vfsub_create(h_dir, h_path, WH_MASK); -+ mnt_drop_write(h_path->mnt); -+ } -+ } else if (S_ISREG(base[AuBrWh_BASE].dentry->d_inode->i_mode)) -+ err = 0; -+ else -+ pr_err("unknown %.*s/%.*s exists\n", -+ AuDLNPair(h_root), AuDLNPair(base[AuBrWh_BASE].dentry)); -+ if (unlikely(err)) -+ goto out; -+ -+ h_path->dentry = base[AuBrWh_PLINK].dentry; -+ if (do_plink) { -+ err = au_whdir(h_dir, h_path); -+ if (unlikely(err)) -+ goto out; -+ wbr->wbr_plink = dget(base[AuBrWh_PLINK].dentry); -+ } else -+ au_wh_clean(h_dir, h_path, /*isdir*/1); -+ wbr->wbr_whbase = dget(base[AuBrWh_BASE].dentry); -+ -+ h_path->dentry = base[AuBrWh_ORPH].dentry; -+ err = au_whdir(h_dir, h_path); -+ if (unlikely(err)) -+ goto out; -+ wbr->wbr_orph = dget(base[AuBrWh_ORPH].dentry); -+ -+ out: -+ return err; -+} -+ -+/* -+ * initialize the whiteout base file/dir for @br. -+ */ -+int au_wh_init(struct dentry *h_root, struct au_branch *br, -+ struct super_block *sb) -+{ -+ int err, i; -+ const unsigned char do_plink -+ = !!au_opt_test(au_mntflags(sb), PLINK); -+ struct path path = { -+ .mnt = br->br_mnt -+ }; -+ struct inode *h_dir; -+ struct au_wbr *wbr = br->br_wbr; -+ static const struct qstr base_name[] = { -+ [AuBrWh_BASE] = { -+ .name = AUFS_BASE_NAME, -+ .len = sizeof(AUFS_BASE_NAME) - 1 -+ }, -+ [AuBrWh_PLINK] = { -+ .name = AUFS_PLINKDIR_NAME, -+ .len = sizeof(AUFS_PLINKDIR_NAME) - 1 -+ }, -+ [AuBrWh_ORPH] = { -+ .name = AUFS_ORPHDIR_NAME, -+ .len = sizeof(AUFS_ORPHDIR_NAME) - 1 -+ } -+ }; -+ struct au_wh_base base[] = { -+ [AuBrWh_BASE] = { -+ .name = base_name + AuBrWh_BASE, -+ .dentry = NULL -+ }, -+ [AuBrWh_PLINK] = { -+ .name = base_name + AuBrWh_PLINK, -+ .dentry = NULL -+ }, -+ [AuBrWh_ORPH] = { -+ .name = base_name + AuBrWh_ORPH, -+ .dentry = NULL -+ } -+ }; -+ -+ if (wbr) -+ WbrWhMustWriteLock(wbr); -+ -+ for (i = 0; i < AuBrWh_Last; i++) { -+ /* doubly whiteouted */ -+ struct dentry *d; -+ -+ d = au_wh_lkup(h_root, (void *)base[i].name, br); -+ err = PTR_ERR(d); -+ if (IS_ERR(d)) -+ goto out; -+ -+ base[i].dentry = d; -+ AuDebugOn(wbr -+ && wbr->wbr_wh[i] -+ && wbr->wbr_wh[i] != base[i].dentry); -+ } -+ -+ if (wbr) -+ for (i = 0; i < AuBrWh_Last; i++) { -+ dput(wbr->wbr_wh[i]); -+ wbr->wbr_wh[i] = NULL; -+ } -+ -+ err = 0; -+ switch (br->br_perm) { -+ case AuBrPerm_RO: -+ case AuBrPerm_ROWH: -+ case AuBrPerm_RR: -+ case AuBrPerm_RRWH: -+ h_dir = h_root->d_inode; -+ au_wh_init_ro(h_dir, base, &path); -+ break; -+ -+ case AuBrPerm_RWNoLinkWH: -+ err = au_wh_init_rw_nolink(h_root, wbr, do_plink, base, &path); -+ if (err > 0) -+ goto out; -+ else if (err) -+ goto out_err; -+ break; -+ -+ case AuBrPerm_RW: -+ err = au_wh_init_rw(h_root, wbr, do_plink, base, &path); -+ if (err > 0) -+ goto out; -+ else if (err) -+ goto out_err; -+ break; -+ -+ default: -+ BUG(); -+ } -+ goto out; /* success */ -+ -+ out_err: -+ pr_err("an error(%d) on the writable branch %.*s(%s)\n", -+ err, AuDLNPair(h_root), au_sbtype(h_root->d_sb)); -+ out: -+ for (i = 0; i < AuBrWh_Last; i++) -+ dput(base[i].dentry); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+/* -+ * whiteouts are all hard-linked usually. -+ * when its link count reaches a ceiling, we create a new whiteout base -+ * asynchronously. -+ */ -+ -+struct reinit_br_wh { -+ struct super_block *sb; -+ struct au_branch *br; -+}; -+ -+static void reinit_br_wh(void *arg) -+{ -+ int err; -+ aufs_bindex_t bindex; -+ struct path h_path; -+ struct reinit_br_wh *a = arg; -+ struct au_wbr *wbr; -+ struct inode *dir; -+ struct dentry *h_root; -+ struct au_hinode *hdir; -+ -+ err = 0; -+ wbr = a->br->br_wbr; -+ /* big aufs lock */ -+ si_noflush_write_lock(a->sb); -+ if (!au_br_writable(a->br->br_perm)) -+ goto out; -+ bindex = au_br_index(a->sb, a->br->br_id); -+ if (unlikely(bindex < 0)) -+ goto out; -+ -+ di_read_lock_parent(a->sb->s_root, AuLock_IR); -+ dir = a->sb->s_root->d_inode; -+ hdir = au_hi(dir, bindex); -+ h_root = au_h_dptr(a->sb->s_root, bindex); -+ -+ au_hn_imtx_lock_nested(hdir, AuLsc_I_PARENT); -+ wbr_wh_write_lock(wbr); -+ err = au_h_verify(wbr->wbr_whbase, au_opt_udba(a->sb), hdir->hi_inode, -+ h_root, a->br); -+ if (!err) { -+ err = mnt_want_write(a->br->br_mnt); -+ if (!err) { -+ h_path.dentry = wbr->wbr_whbase; -+ h_path.mnt = a->br->br_mnt; -+ err = vfsub_unlink(hdir->hi_inode, &h_path, /*force*/0); -+ mnt_drop_write(a->br->br_mnt); -+ } -+ } else { -+ pr_warning("%.*s is moved, ignored\n", -+ AuDLNPair(wbr->wbr_whbase)); -+ err = 0; -+ } -+ dput(wbr->wbr_whbase); -+ wbr->wbr_whbase = NULL; -+ if (!err) -+ err = au_wh_init(h_root, a->br, a->sb); -+ wbr_wh_write_unlock(wbr); -+ au_hn_imtx_unlock(hdir); -+ di_read_unlock(a->sb->s_root, AuLock_IR); -+ -+ out: -+ if (wbr) -+ atomic_dec(&wbr->wbr_wh_running); -+ atomic_dec(&a->br->br_count); -+ au_nwt_done(&au_sbi(a->sb)->si_nowait); -+ si_write_unlock(a->sb); -+ kfree(arg); -+ if (unlikely(err)) -+ AuIOErr("err %d\n", err); -+} -+ -+static void kick_reinit_br_wh(struct super_block *sb, struct au_branch *br) -+{ -+ int do_dec, wkq_err; -+ struct reinit_br_wh *arg; -+ -+ do_dec = 1; -+ if (atomic_inc_return(&br->br_wbr->wbr_wh_running) != 1) -+ goto out; -+ -+ /* ignore ENOMEM */ -+ arg = kmalloc(sizeof(*arg), GFP_NOFS); -+ if (arg) { -+ /* -+ * dec(wh_running), kfree(arg) and dec(br_count) -+ * in reinit function -+ */ -+ arg->sb = sb; -+ arg->br = br; -+ atomic_inc(&br->br_count); -+ wkq_err = au_wkq_nowait(reinit_br_wh, arg, sb); -+ if (unlikely(wkq_err)) { -+ atomic_dec(&br->br_wbr->wbr_wh_running); -+ atomic_dec(&br->br_count); -+ kfree(arg); -+ } -+ do_dec = 0; -+ } -+ -+ out: -+ if (do_dec) -+ atomic_dec(&br->br_wbr->wbr_wh_running); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * create the whiteout @wh. -+ */ -+static int link_or_create_wh(struct super_block *sb, aufs_bindex_t bindex, -+ struct dentry *wh) -+{ -+ int err; -+ struct path h_path = { -+ .dentry = wh -+ }; -+ struct au_branch *br; -+ struct au_wbr *wbr; -+ struct dentry *h_parent; -+ struct inode *h_dir; -+ -+ h_parent = wh->d_parent; /* dir inode is locked */ -+ h_dir = h_parent->d_inode; -+ IMustLock(h_dir); -+ -+ br = au_sbr(sb, bindex); -+ h_path.mnt = br->br_mnt; -+ wbr = br->br_wbr; -+ wbr_wh_read_lock(wbr); -+ if (wbr->wbr_whbase) { -+ err = vfsub_link(wbr->wbr_whbase, h_dir, &h_path); -+ if (!err || err != -EMLINK) -+ goto out; -+ -+ /* link count full. re-initialize br_whbase. */ -+ kick_reinit_br_wh(sb, br); -+ } -+ -+ /* return this error in this context */ -+ err = vfsub_create(h_dir, &h_path, WH_MASK); -+ -+ out: -+ wbr_wh_read_unlock(wbr); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * create or remove the diropq. -+ */ -+static struct dentry *do_diropq(struct dentry *dentry, aufs_bindex_t bindex, -+ unsigned int flags) -+{ -+ struct dentry *opq_dentry, *h_dentry; -+ struct super_block *sb; -+ struct au_branch *br; -+ int err; -+ -+ sb = dentry->d_sb; -+ br = au_sbr(sb, bindex); -+ h_dentry = au_h_dptr(dentry, bindex); -+ opq_dentry = au_lkup_one(&diropq_name, h_dentry, br, /*nd*/NULL); -+ if (IS_ERR(opq_dentry)) -+ goto out; -+ -+ if (au_ftest_diropq(flags, CREATE)) { -+ err = link_or_create_wh(sb, bindex, opq_dentry); -+ if (!err) { -+ au_set_dbdiropq(dentry, bindex); -+ goto out; /* success */ -+ } -+ } else { -+ struct path tmp = { -+ .dentry = opq_dentry, -+ .mnt = br->br_mnt -+ }; -+ err = do_unlink_wh(au_h_iptr(dentry->d_inode, bindex), &tmp); -+ if (!err) -+ au_set_dbdiropq(dentry, -1); -+ } -+ dput(opq_dentry); -+ opq_dentry = ERR_PTR(err); -+ -+ out: -+ return opq_dentry; -+} -+ -+struct do_diropq_args { -+ struct dentry **errp; -+ struct dentry *dentry; -+ aufs_bindex_t bindex; -+ unsigned int flags; -+}; -+ -+static void call_do_diropq(void *args) -+{ -+ struct do_diropq_args *a = args; -+ *a->errp = do_diropq(a->dentry, a->bindex, a->flags); -+} -+ -+struct dentry *au_diropq_sio(struct dentry *dentry, aufs_bindex_t bindex, -+ unsigned int flags) -+{ -+ struct dentry *diropq, *h_dentry; -+ -+ h_dentry = au_h_dptr(dentry, bindex); -+ if (!au_test_h_perm_sio(h_dentry->d_inode, MAY_EXEC | MAY_WRITE)) -+ diropq = do_diropq(dentry, bindex, flags); -+ else { -+ int wkq_err; -+ struct do_diropq_args args = { -+ .errp = &diropq, -+ .dentry = dentry, -+ .bindex = bindex, -+ .flags = flags -+ }; -+ -+ wkq_err = au_wkq_wait(call_do_diropq, &args); -+ if (unlikely(wkq_err)) -+ diropq = ERR_PTR(wkq_err); -+ } -+ -+ return diropq; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * lookup whiteout dentry. -+ * @h_parent: lower parent dentry which must exist and be locked -+ * @base_name: name of dentry which will be whiteouted -+ * returns dentry for whiteout. -+ */ -+struct dentry *au_wh_lkup(struct dentry *h_parent, struct qstr *base_name, -+ struct au_branch *br) -+{ -+ int err; -+ struct qstr wh_name; -+ struct dentry *wh_dentry; -+ -+ err = au_wh_name_alloc(&wh_name, base_name); -+ wh_dentry = ERR_PTR(err); -+ if (!err) { -+ wh_dentry = au_lkup_one(&wh_name, h_parent, br, /*nd*/NULL); -+ kfree(wh_name.name); -+ } -+ return wh_dentry; -+} -+ -+/* -+ * link/create a whiteout for @dentry on @bindex. -+ */ -+struct dentry *au_wh_create(struct dentry *dentry, aufs_bindex_t bindex, -+ struct dentry *h_parent) -+{ -+ struct dentry *wh_dentry; -+ struct super_block *sb; -+ int err; -+ -+ sb = dentry->d_sb; -+ wh_dentry = au_wh_lkup(h_parent, &dentry->d_name, au_sbr(sb, bindex)); -+ if (!IS_ERR(wh_dentry) && !wh_dentry->d_inode) { -+ err = link_or_create_wh(sb, bindex, wh_dentry); -+ if (!err) -+ au_set_dbwh(dentry, bindex); -+ else { -+ dput(wh_dentry); -+ wh_dentry = ERR_PTR(err); -+ } -+ } -+ -+ return wh_dentry; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* Delete all whiteouts in this directory on branch bindex. */ -+static int del_wh_children(struct dentry *h_dentry, struct au_nhash *whlist, -+ aufs_bindex_t bindex, struct au_branch *br) -+{ -+ int err; -+ unsigned long ul, n; -+ struct qstr wh_name; -+ char *p; -+ struct hlist_head *head; -+ struct au_vdir_wh *tpos; -+ struct hlist_node *pos; -+ struct au_vdir_destr *str; -+ -+ err = -ENOMEM; -+ p = __getname_gfp(GFP_NOFS); -+ wh_name.name = p; -+ if (unlikely(!wh_name.name)) -+ goto out; -+ -+ err = 0; -+ memcpy(p, AUFS_WH_PFX, AUFS_WH_PFX_LEN); -+ p += AUFS_WH_PFX_LEN; -+ n = whlist->nh_num; -+ head = whlist->nh_head; -+ for (ul = 0; !err && ul < n; ul++, head++) { -+ hlist_for_each_entry(tpos, pos, head, wh_hash) { -+ if (tpos->wh_bindex != bindex) -+ continue; -+ -+ str = &tpos->wh_str; -+ if (str->len + AUFS_WH_PFX_LEN <= PATH_MAX) { -+ memcpy(p, str->name, str->len); -+ wh_name.len = AUFS_WH_PFX_LEN + str->len; -+ err = unlink_wh_name(h_dentry, &wh_name, br); -+ if (!err) -+ continue; -+ break; -+ } -+ AuIOErr("whiteout name too long %.*s\n", -+ str->len, str->name); -+ err = -EIO; -+ break; -+ } -+ } -+ __putname(wh_name.name); -+ -+ out: -+ return err; -+} -+ -+struct del_wh_children_args { -+ int *errp; -+ struct dentry *h_dentry; -+ struct au_nhash *whlist; -+ aufs_bindex_t bindex; -+ struct au_branch *br; -+}; -+ -+static void call_del_wh_children(void *args) -+{ -+ struct del_wh_children_args *a = args; -+ *a->errp = del_wh_children(a->h_dentry, a->whlist, a->bindex, a->br); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+struct au_whtmp_rmdir *au_whtmp_rmdir_alloc(struct super_block *sb, gfp_t gfp) -+{ -+ struct au_whtmp_rmdir *whtmp; -+ int err; -+ unsigned int rdhash; -+ -+ SiMustAnyLock(sb); -+ -+ whtmp = kmalloc(sizeof(*whtmp), gfp); -+ if (unlikely(!whtmp)) { -+ whtmp = ERR_PTR(-ENOMEM); -+ goto out; -+ } -+ -+ whtmp->dir = NULL; -+ whtmp->wh_dentry = NULL; -+ /* no estimation for dir size */ -+ rdhash = au_sbi(sb)->si_rdhash; -+ if (!rdhash) -+ rdhash = AUFS_RDHASH_DEF; -+ err = au_nhash_alloc(&whtmp->whlist, rdhash, gfp); -+ if (unlikely(err)) { -+ kfree(whtmp); -+ whtmp = ERR_PTR(err); -+ } -+ -+ out: -+ return whtmp; -+} -+ -+void au_whtmp_rmdir_free(struct au_whtmp_rmdir *whtmp) -+{ -+ dput(whtmp->wh_dentry); -+ iput(whtmp->dir); -+ au_nhash_wh_free(&whtmp->whlist); -+ kfree(whtmp); -+} -+ -+/* -+ * rmdir the whiteouted temporary named dir @h_dentry. -+ * @whlist: whiteouted children. -+ */ -+int au_whtmp_rmdir(struct inode *dir, aufs_bindex_t bindex, -+ struct dentry *wh_dentry, struct au_nhash *whlist) -+{ -+ int err; -+ struct path h_tmp; -+ struct inode *wh_inode, *h_dir; -+ struct au_branch *br; -+ -+ h_dir = wh_dentry->d_parent->d_inode; /* dir inode is locked */ -+ IMustLock(h_dir); -+ -+ br = au_sbr(dir->i_sb, bindex); -+ wh_inode = wh_dentry->d_inode; -+ mutex_lock_nested(&wh_inode->i_mutex, AuLsc_I_CHILD); -+ -+ /* -+ * someone else might change some whiteouts while we were sleeping. -+ * it means this whlist may have an obsoleted entry. -+ */ -+ if (!au_test_h_perm_sio(wh_inode, MAY_EXEC | MAY_WRITE)) -+ err = del_wh_children(wh_dentry, whlist, bindex, br); -+ else { -+ int wkq_err; -+ struct del_wh_children_args args = { -+ .errp = &err, -+ .h_dentry = wh_dentry, -+ .whlist = whlist, -+ .bindex = bindex, -+ .br = br -+ }; -+ -+ wkq_err = au_wkq_wait(call_del_wh_children, &args); -+ if (unlikely(wkq_err)) -+ err = wkq_err; -+ } -+ mutex_unlock(&wh_inode->i_mutex); -+ -+ if (!err) { -+ h_tmp.dentry = wh_dentry; -+ h_tmp.mnt = br->br_mnt; -+ err = vfsub_rmdir(h_dir, &h_tmp); -+ /* d_drop(h_dentry); */ -+ } -+ -+ if (!err) { -+ if (au_ibstart(dir) == bindex) { -+ au_cpup_attr_timesizes(dir); -+ drop_nlink(dir); -+ } -+ return 0; /* success */ -+ } -+ -+ pr_warning("failed removing %.*s(%d), ignored\n", -+ AuDLNPair(wh_dentry), err); -+ return err; -+} -+ -+static void call_rmdir_whtmp(void *args) -+{ -+ int err; -+ struct au_whtmp_rmdir *a = args; -+ struct super_block *sb; -+ struct dentry *h_parent; -+ struct inode *h_dir; -+ struct au_branch *br; -+ struct au_hinode *hdir; -+ -+ /* rmdir by nfsd may cause deadlock with this i_mutex */ -+ /* mutex_lock(&a->dir->i_mutex); */ -+ sb = a->dir->i_sb; -+ si_noflush_read_lock(sb); -+ err = au_test_ro(sb, a->bindex, NULL); -+ if (unlikely(err)) -+ goto out; -+ -+ err = -EIO; -+ br = au_sbr(sb, a->bindex); -+ ii_write_lock_parent(a->dir); -+ h_parent = dget_parent(a->wh_dentry); -+ h_dir = h_parent->d_inode; -+ hdir = au_hi(a->dir, a->bindex); -+ au_hn_imtx_lock_nested(hdir, AuLsc_I_PARENT); -+ err = au_h_verify(a->wh_dentry, au_opt_udba(sb), h_dir, h_parent, br); -+ if (!err) { -+ err = mnt_want_write(br->br_mnt); -+ if (!err) { -+ err = au_whtmp_rmdir(a->dir, a->bindex, a->wh_dentry, -+ &a->whlist); -+ mnt_drop_write(br->br_mnt); -+ } -+ } -+ au_hn_imtx_unlock(hdir); -+ dput(h_parent); -+ ii_write_unlock(a->dir); -+ -+ out: -+ /* mutex_unlock(&a->dir->i_mutex); */ -+ au_nwt_done(&au_sbi(sb)->si_nowait); -+ si_read_unlock(sb); -+ au_whtmp_rmdir_free(a); -+ if (unlikely(err)) -+ AuIOErr("err %d\n", err); -+} -+ -+void au_whtmp_kick_rmdir(struct inode *dir, aufs_bindex_t bindex, -+ struct dentry *wh_dentry, struct au_whtmp_rmdir *args) -+{ -+ int wkq_err; -+ -+ IMustLock(dir); -+ -+ /* all post-process will be done in do_rmdir_whtmp(). */ -+ args->dir = au_igrab(dir); -+ args->bindex = bindex; -+ args->wh_dentry = dget(wh_dentry); -+ wkq_err = au_wkq_nowait(call_rmdir_whtmp, args, dir->i_sb); -+ if (unlikely(wkq_err)) { -+ pr_warning("rmdir error %.*s (%d), ignored\n", -+ AuDLNPair(wh_dentry), wkq_err); -+ au_whtmp_rmdir_free(args); -+ } -+} -diff -Nur linux-2.6.33.1-vanilla/fs/aufs/whout.h linux-2.6.33.1/fs/aufs/whout.h ---- linux-2.6.33.1-vanilla/fs/aufs/whout.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-2.6.33.1/fs/aufs/whout.h 2010-04-05 16:53:27.000000000 +0200 -@@ -0,0 +1,87 @@ -+/* -+ * Copyright (C) 2005-2010 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+/* -+ * whiteout for logical deletion and opaque directory -+ */ -+ -+#ifndef __AUFS_WHOUT_H__ -+#define __AUFS_WHOUT_H__ -+ -+#ifdef __KERNEL__ -+ -+#include -+#include "dir.h" -+ -+/* whout.c */ -+int au_wh_name_alloc(struct qstr *wh, const struct qstr *name); -+struct au_branch; -+int au_wh_test(struct dentry *h_parent, struct qstr *wh_name, -+ struct au_branch *br, int try_sio); -+int au_diropq_test(struct dentry *h_dentry, struct au_branch *br); -+struct dentry *au_whtmp_lkup(struct dentry *h_parent, struct au_branch *br, -+ struct qstr *prefix); -+int au_whtmp_ren(struct dentry *h_dentry, struct au_branch *br); -+int au_wh_unlink_dentry(struct inode *h_dir, struct path *h_path, -+ struct dentry *dentry); -+int au_wh_init(struct dentry *h_parent, struct au_branch *br, -+ struct super_block *sb); -+ -+/* diropq flags */ -+#define AuDiropq_CREATE 1 -+#define au_ftest_diropq(flags, name) ((flags) & AuDiropq_##name) -+#define au_fset_diropq(flags, name) { (flags) |= AuDiropq_##name; } -+#define au_fclr_diropq(flags, name) { (flags) &= ~AuDiropq_##name; } -+ -+struct dentry *au_diropq_sio(struct dentry *dentry, aufs_bindex_t bindex, -+ unsigned int flags); -+struct dentry *au_wh_lkup(struct dentry *h_parent, struct qstr *base_name, -+ struct au_branch *br); -+struct dentry *au_wh_create(struct dentry *dentry, aufs_bindex_t bindex, -+ struct dentry *h_parent); -+ -+/* real rmdir for the whiteout-ed dir */ -+struct au_whtmp_rmdir { -+ struct inode *dir; -+ aufs_bindex_t bindex; -+ struct dentry *wh_dentry; -+ struct au_nhash whlist; -+}; -+ -+struct au_whtmp_rmdir *au_whtmp_rmdir_alloc(struct super_block *sb, gfp_t gfp); -+void au_whtmp_rmdir_free(struct au_whtmp_rmdir *whtmp); -+int au_whtmp_rmdir(struct inode *dir, aufs_bindex_t bindex, -+ struct dentry *wh_dentry, struct au_nhash *whlist); -+void au_whtmp_kick_rmdir(struct inode *dir, aufs_bindex_t bindex, -+ struct dentry *wh_dentry, struct au_whtmp_rmdir *args); -+ -+/* ---------------------------------------------------------------------- */ -+ -+static inline struct dentry *au_diropq_create(struct dentry *dentry, -+ aufs_bindex_t bindex) -+{ -+ return au_diropq_sio(dentry, bindex, AuDiropq_CREATE); -+} -+ -+static inline int au_diropq_remove(struct dentry *dentry, aufs_bindex_t bindex) -+{ -+ return PTR_ERR(au_diropq_sio(dentry, bindex, !AuDiropq_CREATE)); -+} -+ -+#endif /* __KERNEL__ */ -+#endif /* __AUFS_WHOUT_H__ */ -diff -Nur linux-2.6.33.1-vanilla/fs/aufs/wkq.c linux-2.6.33.1/fs/aufs/wkq.c ---- linux-2.6.33.1-vanilla/fs/aufs/wkq.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-2.6.33.1/fs/aufs/wkq.c 2010-04-05 16:53:27.000000000 +0200 -@@ -0,0 +1,183 @@ -+/* -+ * Copyright (C) 2005-2010 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+/* -+ * workqueue for asynchronous/super-io operations -+ * todo: try new dredential scheme -+ */ -+ -+#include -+#include "aufs.h" -+ -+/* internal workqueue named AUFS_WKQ_NAME */ -+static struct workqueue_struct *au_wkq; -+ -+struct au_wkinfo { -+ struct work_struct wk; -+ struct super_block *sb; -+ -+ unsigned int flags; /* see wkq.h */ -+ -+ au_wkq_func_t func; -+ void *args; -+ -+ struct completion *comp; -+}; -+ -+/* ---------------------------------------------------------------------- */ -+ -+static void wkq_func(struct work_struct *wk) -+{ -+ struct au_wkinfo *wkinfo = container_of(wk, struct au_wkinfo, wk); -+ -+ wkinfo->func(wkinfo->args); -+ if (au_ftest_wkq(wkinfo->flags, WAIT)) -+ complete(wkinfo->comp); -+ else { -+ kobject_put(&au_sbi(wkinfo->sb)->si_kobj); -+ module_put(THIS_MODULE); -+ kfree(wkinfo); -+ } -+} -+ -+/* -+ * Since struct completion is large, try allocating it dynamically. -+ */ -+#if defined(CONFIG_4KSTACKS) || defined(AuTest4KSTACKS) -+#define AuWkqCompDeclare(name) struct completion *comp = NULL -+ -+static int au_wkq_comp_alloc(struct au_wkinfo *wkinfo, struct completion **comp) -+{ -+ *comp = kmalloc(sizeof(**comp), GFP_NOFS); -+ if (*comp) { -+ init_completion(*comp); -+ wkinfo->comp = *comp; -+ return 0; -+ } -+ return -ENOMEM; -+} -+ -+static void au_wkq_comp_free(struct completion *comp) -+{ -+ kfree(comp); -+} -+ -+#else -+ -+/* no braces */ -+#define AuWkqCompDeclare(name) \ -+ DECLARE_COMPLETION_ONSTACK(_ ## name); \ -+ struct completion *comp = &_ ## name -+ -+static int au_wkq_comp_alloc(struct au_wkinfo *wkinfo, struct completion **comp) -+{ -+ wkinfo->comp = *comp; -+ return 0; -+} -+ -+static void au_wkq_comp_free(struct completion *comp __maybe_unused) -+{ -+ /* empty */ -+} -+#endif /* 4KSTACKS */ -+ -+static void au_wkq_run(struct au_wkinfo *wkinfo, int do_wait) -+{ -+ au_dbg_verify_kthread(); -+ if (do_wait) { -+ INIT_WORK_ON_STACK(&wkinfo->wk, wkq_func); -+ queue_work(au_wkq, &wkinfo->wk); -+ } else { -+ INIT_WORK(&wkinfo->wk, wkq_func); -+ schedule_work(&wkinfo->wk); -+ } -+} -+ -+int au_wkq_wait(au_wkq_func_t func, void *args) -+{ -+ int err; -+ AuWkqCompDeclare(comp); -+ struct au_wkinfo wkinfo = { -+ .flags = AuWkq_WAIT, -+ .func = func, -+ .args = args -+ }; -+ -+ err = au_wkq_comp_alloc(&wkinfo, &comp); -+ if (!err) { -+ au_wkq_run(&wkinfo, AuWkq_WAIT); -+ /* no timeout, no interrupt */ -+ wait_for_completion(wkinfo.comp); -+ au_wkq_comp_free(comp); -+ destroy_work_on_stack(&wkinfo.wk); -+ } -+ -+ return err; -+ -+} -+ -+int au_wkq_nowait(au_wkq_func_t func, void *args, struct super_block *sb) -+{ -+ int err; -+ struct au_wkinfo *wkinfo; -+ -+ atomic_inc(&au_sbi(sb)->si_nowait.nw_len); -+ -+ /* -+ * wkq_func() must free this wkinfo. -+ * it highly depends upon the implementation of workqueue. -+ */ -+ err = 0; -+ wkinfo = kmalloc(sizeof(*wkinfo), GFP_NOFS); -+ if (wkinfo) { -+ wkinfo->sb = sb; -+ wkinfo->flags = !AuWkq_WAIT; -+ wkinfo->func = func; -+ wkinfo->args = args; -+ wkinfo->comp = NULL; -+ kobject_get(&au_sbi(sb)->si_kobj); -+ __module_get(THIS_MODULE); -+ -+ au_wkq_run(wkinfo, !AuWkq_WAIT); -+ } else { -+ err = -ENOMEM; -+ atomic_dec(&au_sbi(sb)->si_nowait.nw_len); -+ } -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+void au_nwt_init(struct au_nowait_tasks *nwt) -+{ -+ atomic_set(&nwt->nw_len, 0); -+ /* smp_mb(); */ /* atomic_set */ -+ init_waitqueue_head(&nwt->nw_wq); -+} -+ -+void au_wkq_fin(void) -+{ -+ destroy_workqueue(au_wkq); -+} -+ -+int __init au_wkq_init(void) -+{ -+ au_wkq = create_workqueue(AUFS_WKQ_NAME); -+ return 0; -+} -diff -Nur linux-2.6.33.1-vanilla/fs/aufs/wkq.h linux-2.6.33.1/fs/aufs/wkq.h ---- linux-2.6.33.1-vanilla/fs/aufs/wkq.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-2.6.33.1/fs/aufs/wkq.h 2010-04-05 16:53:27.000000000 +0200 -@@ -0,0 +1,84 @@ -+/* -+ * Copyright (C) 2005-2010 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+/* -+ * workqueue for asynchronous/super-io operations -+ * todo: try new credentials management scheme -+ */ -+ -+#ifndef __AUFS_WKQ_H__ -+#define __AUFS_WKQ_H__ -+ -+#ifdef __KERNEL__ -+ -+#include -+#include -+#include -+ -+struct super_block; -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * in the next operation, wait for the 'nowait' tasks in system-wide workqueue -+ */ -+struct au_nowait_tasks { -+ atomic_t nw_len; -+ wait_queue_head_t nw_wq; -+}; -+ -+/* ---------------------------------------------------------------------- */ -+ -+typedef void (*au_wkq_func_t)(void *args); -+ -+/* wkq flags */ -+#define AuWkq_WAIT 1 -+#define au_ftest_wkq(flags, name) ((flags) & AuWkq_##name) -+#define au_fset_wkq(flags, name) { (flags) |= AuWkq_##name; } -+#define au_fclr_wkq(flags, name) { (flags) &= ~AuWkq_##name; } -+ -+/* wkq.c */ -+int au_wkq_wait(au_wkq_func_t func, void *args); -+int au_wkq_nowait(au_wkq_func_t func, void *args, struct super_block *sb); -+void au_nwt_init(struct au_nowait_tasks *nwt); -+int __init au_wkq_init(void); -+void au_wkq_fin(void); -+ -+/* ---------------------------------------------------------------------- */ -+ -+static inline int au_test_wkq(struct task_struct *tsk) -+{ -+ return !tsk->mm -+ && !strncmp(tsk->comm, AUFS_WKQ_NAME "/", -+ sizeof(AUFS_WKQ_NAME)); -+} -+ -+static inline void au_nwt_done(struct au_nowait_tasks *nwt) -+{ -+ if (!atomic_dec_return(&nwt->nw_len)) -+ wake_up_all(&nwt->nw_wq); -+} -+ -+static inline int au_nwt_flush(struct au_nowait_tasks *nwt) -+{ -+ wait_event(nwt->nw_wq, !atomic_read(&nwt->nw_len)); -+ return 0; -+} -+ -+#endif /* __KERNEL__ */ -+#endif /* __AUFS_WKQ_H__ */ -diff -Nur linux-2.6.33.1-vanilla/fs/aufs/xino.c linux-2.6.33.1/fs/aufs/xino.c ---- linux-2.6.33.1-vanilla/fs/aufs/xino.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-2.6.33.1/fs/aufs/xino.c 2010-04-05 16:53:27.000000000 +0200 -@@ -0,0 +1,1202 @@ -+/* -+ * Copyright (C) 2005-2010 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+/* -+ * external inode number translation table and bitmap -+ */ -+ -+#include -+#include -+#include -+#include "aufs.h" -+ -+ssize_t xino_fread(au_readf_t func, struct file *file, void *buf, size_t size, -+ loff_t *pos) -+{ -+ ssize_t err; -+ mm_segment_t oldfs; -+ -+ oldfs = get_fs(); -+ set_fs(KERNEL_DS); -+ do { -+ /* todo: signal_pending? */ -+ err = func(file, (char __user *)buf, size, pos); -+ } while (err == -EAGAIN || err == -EINTR); -+ set_fs(oldfs); -+ -+#if 0 /* reserved for future use */ -+ if (err > 0) -+ fsnotify_access(file->f_dentry); -+#endif -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static ssize_t do_xino_fwrite(au_writef_t func, struct file *file, void *buf, -+ size_t size, loff_t *pos) -+{ -+ ssize_t err; -+ mm_segment_t oldfs; -+ -+ oldfs = get_fs(); -+ set_fs(KERNEL_DS); -+ /* lockdep_off(); */ -+ do { -+ /* todo: signal_pending? */ -+ err = func(file, (const char __user *)buf, size, pos); -+ } while (err == -EAGAIN || err == -EINTR); -+ /* lockdep_on(); */ -+ set_fs(oldfs); -+ -+#if 0 /* reserved for future use */ -+ if (err > 0) -+ fsnotify_modify(file->f_dentry); -+#endif -+ -+ return err; -+} -+ -+struct do_xino_fwrite_args { -+ ssize_t *errp; -+ au_writef_t func; -+ struct file *file; -+ void *buf; -+ size_t size; -+ loff_t *pos; -+}; -+ -+static void call_do_xino_fwrite(void *args) -+{ -+ struct do_xino_fwrite_args *a = args; -+ *a->errp = do_xino_fwrite(a->func, a->file, a->buf, a->size, a->pos); -+} -+ -+ssize_t xino_fwrite(au_writef_t func, struct file *file, void *buf, size_t size, -+ loff_t *pos) -+{ -+ ssize_t err; -+ -+ /* todo: signal block and no wkq? */ -+ /* todo: new credential scheme */ -+ /* -+ * it breaks RLIMIT_FSIZE and normal user's limit, -+ * users should care about quota and real 'filesystem full.' -+ */ -+ if (!au_test_wkq(current)) { -+ int wkq_err; -+ struct do_xino_fwrite_args args = { -+ .errp = &err, -+ .func = func, -+ .file = file, -+ .buf = buf, -+ .size = size, -+ .pos = pos -+ }; -+ -+ wkq_err = au_wkq_wait(call_do_xino_fwrite, &args); -+ if (unlikely(wkq_err)) -+ err = wkq_err; -+ } else -+ err = do_xino_fwrite(func, file, buf, size, pos); -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * create a new xinofile at the same place/path as @base_file. -+ */ -+struct file *au_xino_create2(struct file *base_file, struct file *copy_src) -+{ -+ struct file *file; -+ struct dentry *base, *parent; -+ struct inode *dir; -+ struct qstr *name; -+ struct path path; -+ int err; -+ -+ base = base_file->f_dentry; -+ parent = base->d_parent; /* dir inode is locked */ -+ dir = parent->d_inode; -+ IMustLock(dir); -+ -+ file = ERR_PTR(-EINVAL); -+ name = &base->d_name; -+ path.dentry = vfsub_lookup_one_len(name->name, parent, name->len); -+ if (IS_ERR(path.dentry)) { -+ file = (void *)path.dentry; -+ pr_err("%.*s lookup err %ld\n", -+ AuLNPair(name), PTR_ERR(path.dentry)); -+ goto out; -+ } -+ -+ /* no need to mnt_want_write() since we call dentry_open() later */ -+ err = vfs_create(dir, path.dentry, S_IRUGO | S_IWUGO, NULL); -+ if (unlikely(err)) { -+ file = ERR_PTR(err); -+ pr_err("%.*s create err %d\n", AuLNPair(name), err); -+ goto out_dput; -+ } -+ -+ path.mnt = base_file->f_vfsmnt; -+ file = vfsub_dentry_open(&path, -+ O_RDWR | O_CREAT | O_EXCL | O_LARGEFILE); -+ if (IS_ERR(file)) { -+ pr_err("%.*s open err %ld\n", AuLNPair(name), PTR_ERR(file)); -+ goto out_dput; -+ } -+ -+ err = vfsub_unlink(dir, &file->f_path, /*force*/0); -+ if (unlikely(err)) { -+ pr_err("%.*s unlink err %d\n", AuLNPair(name), err); -+ goto out_fput; -+ } -+ -+ if (copy_src) { -+ /* no one can touch copy_src xino */ -+ err = au_copy_file(file, copy_src, -+ i_size_read(copy_src->f_dentry->d_inode)); -+ if (unlikely(err)) { -+ pr_err("%.*s copy err %d\n", AuLNPair(name), err); -+ goto out_fput; -+ } -+ } -+ goto out_dput; /* success */ -+ -+ out_fput: -+ fput(file); -+ file = ERR_PTR(err); -+ out_dput: -+ dput(path.dentry); -+ out: -+ return file; -+} -+ -+struct au_xino_lock_dir { -+ struct au_hinode *hdir; -+ struct dentry *parent; -+ struct mutex *mtx; -+}; -+ -+static void au_xino_lock_dir(struct super_block *sb, struct file *xino, -+ struct au_xino_lock_dir *ldir) -+{ -+ aufs_bindex_t brid, bindex; -+ -+ ldir->hdir = NULL; -+ bindex = -1; -+ brid = au_xino_brid(sb); -+ if (brid >= 0) -+ bindex = au_br_index(sb, brid); -+ if (bindex >= 0) { -+ ldir->hdir = au_hi(sb->s_root->d_inode, bindex); -+ au_hn_imtx_lock_nested(ldir->hdir, AuLsc_I_PARENT); -+ } else { -+ ldir->parent = dget_parent(xino->f_dentry); -+ ldir->mtx = &ldir->parent->d_inode->i_mutex; -+ mutex_lock_nested(ldir->mtx, AuLsc_I_PARENT); -+ } -+} -+ -+static void au_xino_unlock_dir(struct au_xino_lock_dir *ldir) -+{ -+ if (ldir->hdir) -+ au_hn_imtx_unlock(ldir->hdir); -+ else { -+ mutex_unlock(ldir->mtx); -+ dput(ldir->parent); -+ } -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* trucate xino files asynchronously */ -+ -+int au_xino_trunc(struct super_block *sb, aufs_bindex_t bindex) -+{ -+ int err; -+ aufs_bindex_t bi, bend; -+ struct au_branch *br; -+ struct file *new_xino, *file; -+ struct super_block *h_sb; -+ struct au_xino_lock_dir ldir; -+ -+ err = -EINVAL; -+ bend = au_sbend(sb); -+ if (unlikely(bindex < 0 || bend < bindex)) -+ goto out; -+ br = au_sbr(sb, bindex); -+ file = br->br_xino.xi_file; -+ if (!file) -+ goto out; -+ -+ au_xino_lock_dir(sb, file, &ldir); -+ /* mnt_want_write() is unnecessary here */ -+ new_xino = au_xino_create2(file, file); -+ au_xino_unlock_dir(&ldir); -+ err = PTR_ERR(new_xino); -+ if (IS_ERR(new_xino)) -+ goto out; -+ err = 0; -+ fput(file); -+ br->br_xino.xi_file = new_xino; -+ -+ h_sb = br->br_mnt->mnt_sb; -+ for (bi = 0; bi <= bend; bi++) { -+ if (unlikely(bi == bindex)) -+ continue; -+ br = au_sbr(sb, bi); -+ if (br->br_mnt->mnt_sb != h_sb) -+ continue; -+ -+ fput(br->br_xino.xi_file); -+ br->br_xino.xi_file = new_xino; -+ get_file(new_xino); -+ } -+ -+ out: -+ return err; -+} -+ -+struct xino_do_trunc_args { -+ struct super_block *sb; -+ struct au_branch *br; -+}; -+ -+static void xino_do_trunc(void *_args) -+{ -+ struct xino_do_trunc_args *args = _args; -+ struct super_block *sb; -+ struct au_branch *br; -+ struct inode *dir; -+ int err; -+ aufs_bindex_t bindex; -+ -+ err = 0; -+ sb = args->sb; -+ dir = sb->s_root->d_inode; -+ br = args->br; -+ -+ si_noflush_write_lock(sb); -+ ii_read_lock_parent(dir); -+ bindex = au_br_index(sb, br->br_id); -+ err = au_xino_trunc(sb, bindex); -+ if (!err -+ && br->br_xino.xi_file->f_dentry->d_inode->i_blocks -+ >= br->br_xino_upper) -+ br->br_xino_upper += AUFS_XINO_TRUNC_STEP; -+ -+ ii_read_unlock(dir); -+ if (unlikely(err)) -+ pr_warning("err b%d, (%d)\n", bindex, err); -+ atomic_dec(&br->br_xino_running); -+ atomic_dec(&br->br_count); -+ au_nwt_done(&au_sbi(sb)->si_nowait); -+ si_write_unlock(sb); -+ kfree(args); -+} -+ -+static void xino_try_trunc(struct super_block *sb, struct au_branch *br) -+{ -+ struct xino_do_trunc_args *args; -+ int wkq_err; -+ -+ if (br->br_xino.xi_file->f_dentry->d_inode->i_blocks -+ < br->br_xino_upper) -+ return; -+ -+ if (atomic_inc_return(&br->br_xino_running) > 1) -+ goto out; -+ -+ /* lock and kfree() will be called in trunc_xino() */ -+ args = kmalloc(sizeof(*args), GFP_NOFS); -+ if (unlikely(!args)) { -+ AuErr1("no memory\n"); -+ goto out_args; -+ } -+ -+ atomic_inc_return(&br->br_count); -+ args->sb = sb; -+ args->br = br; -+ wkq_err = au_wkq_nowait(xino_do_trunc, args, sb); -+ if (!wkq_err) -+ return; /* success */ -+ -+ pr_err("wkq %d\n", wkq_err); -+ atomic_dec_return(&br->br_count); -+ -+ out_args: -+ kfree(args); -+ out: -+ atomic_dec_return(&br->br_xino_running); -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+static int au_xino_do_write(au_writef_t write, struct file *file, -+ ino_t h_ino, ino_t ino) -+{ -+ loff_t pos; -+ ssize_t sz; -+ -+ pos = h_ino; -+ if (unlikely(au_loff_max / sizeof(ino) - 1 < pos)) { -+ AuIOErr1("too large hi%lu\n", (unsigned long)h_ino); -+ return -EFBIG; -+ } -+ pos *= sizeof(ino); -+ sz = xino_fwrite(write, file, &ino, sizeof(ino), &pos); -+ if (sz == sizeof(ino)) -+ return 0; /* success */ -+ -+ AuIOErr("write failed (%zd)\n", sz); -+ return -EIO; -+} -+ -+/* -+ * write @ino to the xinofile for the specified branch{@sb, @bindex} -+ * at the position of @h_ino. -+ * even if @ino is zero, it is written to the xinofile and means no entry. -+ * if the size of the xino file on a specific filesystem exceeds the watermark, -+ * try truncating it. -+ */ -+int au_xino_write(struct super_block *sb, aufs_bindex_t bindex, ino_t h_ino, -+ ino_t ino) -+{ -+ int err; -+ unsigned int mnt_flags; -+ struct au_branch *br; -+ -+ BUILD_BUG_ON(sizeof(long long) != sizeof(au_loff_max) -+ || ((loff_t)-1) > 0); -+ SiMustAnyLock(sb); -+ -+ mnt_flags = au_mntflags(sb); -+ if (!au_opt_test(mnt_flags, XINO)) -+ return 0; -+ -+ br = au_sbr(sb, bindex); -+ err = au_xino_do_write(au_sbi(sb)->si_xwrite, br->br_xino.xi_file, -+ h_ino, ino); -+ if (!err) { -+ if (au_opt_test(mnt_flags, TRUNC_XINO) -+ && au_test_fs_trunc_xino(br->br_mnt->mnt_sb)) -+ xino_try_trunc(sb, br); -+ return 0; /* success */ -+ } -+ -+ AuIOErr("write failed (%d)\n", err); -+ return -EIO; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* aufs inode number bitmap */ -+ -+static const int page_bits = (int)PAGE_SIZE * BITS_PER_BYTE; -+static ino_t xib_calc_ino(unsigned long pindex, int bit) -+{ -+ ino_t ino; -+ -+ AuDebugOn(bit < 0 || page_bits <= bit); -+ ino = AUFS_FIRST_INO + pindex * page_bits + bit; -+ return ino; -+} -+ -+static void xib_calc_bit(ino_t ino, unsigned long *pindex, int *bit) -+{ -+ AuDebugOn(ino < AUFS_FIRST_INO); -+ ino -= AUFS_FIRST_INO; -+ *pindex = ino / page_bits; -+ *bit = ino % page_bits; -+} -+ -+static int xib_pindex(struct super_block *sb, unsigned long pindex) -+{ -+ int err; -+ loff_t pos; -+ ssize_t sz; -+ struct au_sbinfo *sbinfo; -+ struct file *xib; -+ unsigned long *p; -+ -+ sbinfo = au_sbi(sb); -+ MtxMustLock(&sbinfo->si_xib_mtx); -+ AuDebugOn(pindex > ULONG_MAX / PAGE_SIZE -+ || !au_opt_test(sbinfo->si_mntflags, XINO)); -+ -+ if (pindex == sbinfo->si_xib_last_pindex) -+ return 0; -+ -+ xib = sbinfo->si_xib; -+ p = sbinfo->si_xib_buf; -+ pos = sbinfo->si_xib_last_pindex; -+ pos *= PAGE_SIZE; -+ sz = xino_fwrite(sbinfo->si_xwrite, xib, p, PAGE_SIZE, &pos); -+ if (unlikely(sz != PAGE_SIZE)) -+ goto out; -+ -+ pos = pindex; -+ pos *= PAGE_SIZE; -+ if (i_size_read(xib->f_dentry->d_inode) >= pos + PAGE_SIZE) -+ sz = xino_fread(sbinfo->si_xread, xib, p, PAGE_SIZE, &pos); -+ else { -+ memset(p, 0, PAGE_SIZE); -+ sz = xino_fwrite(sbinfo->si_xwrite, xib, p, PAGE_SIZE, &pos); -+ } -+ if (sz == PAGE_SIZE) { -+ sbinfo->si_xib_last_pindex = pindex; -+ return 0; /* success */ -+ } -+ -+ out: -+ AuIOErr1("write failed (%zd)\n", sz); -+ err = sz; -+ if (sz >= 0) -+ err = -EIO; -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+int au_xino_write0(struct super_block *sb, aufs_bindex_t bindex, ino_t h_ino, -+ ino_t ino) -+{ -+ int err, bit; -+ unsigned long pindex; -+ struct au_sbinfo *sbinfo; -+ -+ if (!au_opt_test(au_mntflags(sb), XINO)) -+ return 0; -+ -+ err = 0; -+ if (ino) { -+ sbinfo = au_sbi(sb); -+ xib_calc_bit(ino, &pindex, &bit); -+ AuDebugOn(page_bits <= bit); -+ mutex_lock(&sbinfo->si_xib_mtx); -+ err = xib_pindex(sb, pindex); -+ if (!err) { -+ clear_bit(bit, sbinfo->si_xib_buf); -+ sbinfo->si_xib_next_bit = bit; -+ } -+ mutex_unlock(&sbinfo->si_xib_mtx); -+ } -+ -+ if (!err) -+ err = au_xino_write(sb, bindex, h_ino, 0); -+ return err; -+} -+ -+/* get an unused inode number from bitmap */ -+ino_t au_xino_new_ino(struct super_block *sb) -+{ -+ ino_t ino; -+ unsigned long *p, pindex, ul, pend; -+ struct au_sbinfo *sbinfo; -+ struct file *file; -+ int free_bit, err; -+ -+ if (!au_opt_test(au_mntflags(sb), XINO)) -+ return iunique(sb, AUFS_FIRST_INO); -+ -+ sbinfo = au_sbi(sb); -+ mutex_lock(&sbinfo->si_xib_mtx); -+ p = sbinfo->si_xib_buf; -+ free_bit = sbinfo->si_xib_next_bit; -+ if (free_bit < page_bits && !test_bit(free_bit, p)) -+ goto out; /* success */ -+ free_bit = find_first_zero_bit(p, page_bits); -+ if (free_bit < page_bits) -+ goto out; /* success */ -+ -+ pindex = sbinfo->si_xib_last_pindex; -+ for (ul = pindex - 1; ul < ULONG_MAX; ul--) { -+ err = xib_pindex(sb, ul); -+ if (unlikely(err)) -+ goto out_err; -+ free_bit = find_first_zero_bit(p, page_bits); -+ if (free_bit < page_bits) -+ goto out; /* success */ -+ } -+ -+ file = sbinfo->si_xib; -+ pend = i_size_read(file->f_dentry->d_inode) / PAGE_SIZE; -+ for (ul = pindex + 1; ul <= pend; ul++) { -+ err = xib_pindex(sb, ul); -+ if (unlikely(err)) -+ goto out_err; -+ free_bit = find_first_zero_bit(p, page_bits); -+ if (free_bit < page_bits) -+ goto out; /* success */ -+ } -+ BUG(); -+ -+ out: -+ set_bit(free_bit, p); -+ sbinfo->si_xib_next_bit++; -+ pindex = sbinfo->si_xib_last_pindex; -+ mutex_unlock(&sbinfo->si_xib_mtx); -+ ino = xib_calc_ino(pindex, free_bit); -+ AuDbg("i%lu\n", (unsigned long)ino); -+ return ino; -+ out_err: -+ mutex_unlock(&sbinfo->si_xib_mtx); -+ AuDbg("i0\n"); -+ return 0; -+} -+ -+/* -+ * read @ino from xinofile for the specified branch{@sb, @bindex} -+ * at the position of @h_ino. -+ * if @ino does not exist and @do_new is true, get new one. -+ */ -+int au_xino_read(struct super_block *sb, aufs_bindex_t bindex, ino_t h_ino, -+ ino_t *ino) -+{ -+ int err; -+ ssize_t sz; -+ loff_t pos; -+ struct file *file; -+ struct au_sbinfo *sbinfo; -+ -+ *ino = 0; -+ if (!au_opt_test(au_mntflags(sb), XINO)) -+ return 0; /* no xino */ -+ -+ err = 0; -+ sbinfo = au_sbi(sb); -+ pos = h_ino; -+ if (unlikely(au_loff_max / sizeof(*ino) - 1 < pos)) { -+ AuIOErr1("too large hi%lu\n", (unsigned long)h_ino); -+ return -EFBIG; -+ } -+ pos *= sizeof(*ino); -+ -+ file = au_sbr(sb, bindex)->br_xino.xi_file; -+ if (i_size_read(file->f_dentry->d_inode) < pos + sizeof(*ino)) -+ return 0; /* no ino */ -+ -+ sz = xino_fread(sbinfo->si_xread, file, ino, sizeof(*ino), &pos); -+ if (sz == sizeof(*ino)) -+ return 0; /* success */ -+ -+ err = sz; -+ if (unlikely(sz >= 0)) { -+ err = -EIO; -+ AuIOErr("xino read error (%zd)\n", sz); -+ } -+ -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* create and set a new xino file */ -+ -+struct file *au_xino_create(struct super_block *sb, char *fname, int silent) -+{ -+ struct file *file; -+ struct dentry *h_parent, *d; -+ struct inode *h_dir; -+ int err; -+ -+ /* -+ * at mount-time, and the xino file is the default path, -+ * hnotify is disabled so we have no notify events to ignore. -+ * when a user specified the xino, we cannot get au_hdir to be ignored. -+ */ -+ file = vfsub_filp_open(fname, O_RDWR | O_CREAT | O_EXCL | O_LARGEFILE, -+ S_IRUGO | S_IWUGO); -+ if (IS_ERR(file)) { -+ if (!silent) -+ pr_err("open %s(%ld)\n", fname, PTR_ERR(file)); -+ return file; -+ } -+ -+ /* keep file count */ -+ h_parent = dget_parent(file->f_dentry); -+ h_dir = h_parent->d_inode; -+ mutex_lock_nested(&h_dir->i_mutex, AuLsc_I_PARENT); -+ /* mnt_want_write() is unnecessary here */ -+ err = vfsub_unlink(h_dir, &file->f_path, /*force*/0); -+ mutex_unlock(&h_dir->i_mutex); -+ dput(h_parent); -+ if (unlikely(err)) { -+ if (!silent) -+ pr_err("unlink %s(%d)\n", fname, err); -+ goto out; -+ } -+ -+ err = -EINVAL; -+ d = file->f_dentry; -+ if (unlikely(sb == d->d_sb)) { -+ if (!silent) -+ pr_err("%s must be outside\n", fname); -+ goto out; -+ } -+ if (unlikely(au_test_fs_bad_xino(d->d_sb))) { -+ if (!silent) -+ pr_err("xino doesn't support %s(%s)\n", -+ fname, au_sbtype(d->d_sb)); -+ goto out; -+ } -+ return file; /* success */ -+ -+ out: -+ fput(file); -+ file = ERR_PTR(err); -+ return file; -+} -+ -+/* -+ * find another branch who is on the same filesystem of the specified -+ * branch{@btgt}. search until @bend. -+ */ -+static int is_sb_shared(struct super_block *sb, aufs_bindex_t btgt, -+ aufs_bindex_t bend) -+{ -+ aufs_bindex_t bindex; -+ struct super_block *tgt_sb = au_sbr_sb(sb, btgt); -+ -+ for (bindex = 0; bindex < btgt; bindex++) -+ if (unlikely(tgt_sb == au_sbr_sb(sb, bindex))) -+ return bindex; -+ for (bindex++; bindex <= bend; bindex++) -+ if (unlikely(tgt_sb == au_sbr_sb(sb, bindex))) -+ return bindex; -+ return -1; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * initialize the xinofile for the specified branch @br -+ * at the place/path where @base_file indicates. -+ * test whether another branch is on the same filesystem or not, -+ * if @do_test is true. -+ */ -+int au_xino_br(struct super_block *sb, struct au_branch *br, ino_t h_ino, -+ struct file *base_file, int do_test) -+{ -+ int err; -+ ino_t ino; -+ aufs_bindex_t bend, bindex; -+ struct au_branch *shared_br, *b; -+ struct file *file; -+ struct super_block *tgt_sb; -+ -+ shared_br = NULL; -+ bend = au_sbend(sb); -+ if (do_test) { -+ tgt_sb = br->br_mnt->mnt_sb; -+ for (bindex = 0; bindex <= bend; bindex++) { -+ b = au_sbr(sb, bindex); -+ if (tgt_sb == b->br_mnt->mnt_sb) { -+ shared_br = b; -+ break; -+ } -+ } -+ } -+ -+ if (!shared_br || !shared_br->br_xino.xi_file) { -+ struct au_xino_lock_dir ldir; -+ -+ au_xino_lock_dir(sb, base_file, &ldir); -+ /* mnt_want_write() is unnecessary here */ -+ file = au_xino_create2(base_file, NULL); -+ au_xino_unlock_dir(&ldir); -+ err = PTR_ERR(file); -+ if (IS_ERR(file)) -+ goto out; -+ br->br_xino.xi_file = file; -+ } else { -+ br->br_xino.xi_file = shared_br->br_xino.xi_file; -+ get_file(br->br_xino.xi_file); -+ } -+ -+ ino = AUFS_ROOT_INO; -+ err = au_xino_do_write(au_sbi(sb)->si_xwrite, br->br_xino.xi_file, -+ h_ino, ino); -+ if (!err) -+ return 0; /* success */ -+ -+ -+ out: -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* trucate a xino bitmap file */ -+ -+/* todo: slow */ -+static int do_xib_restore(struct super_block *sb, struct file *file, void *page) -+{ -+ int err, bit; -+ ssize_t sz; -+ unsigned long pindex; -+ loff_t pos, pend; -+ struct au_sbinfo *sbinfo; -+ au_readf_t func; -+ ino_t *ino; -+ unsigned long *p; -+ -+ err = 0; -+ sbinfo = au_sbi(sb); -+ MtxMustLock(&sbinfo->si_xib_mtx); -+ p = sbinfo->si_xib_buf; -+ func = sbinfo->si_xread; -+ pend = i_size_read(file->f_dentry->d_inode); -+ pos = 0; -+ while (pos < pend) { -+ sz = xino_fread(func, file, page, PAGE_SIZE, &pos); -+ err = sz; -+ if (unlikely(sz <= 0)) -+ goto out; -+ -+ err = 0; -+ for (ino = page; sz > 0; ino++, sz -= sizeof(ino)) { -+ if (unlikely(*ino < AUFS_FIRST_INO)) -+ continue; -+ -+ xib_calc_bit(*ino, &pindex, &bit); -+ AuDebugOn(page_bits <= bit); -+ err = xib_pindex(sb, pindex); -+ if (!err) -+ set_bit(bit, p); -+ else -+ goto out; -+ } -+ } -+ -+ out: -+ return err; -+} -+ -+static int xib_restore(struct super_block *sb) -+{ -+ int err; -+ aufs_bindex_t bindex, bend; -+ void *page; -+ -+ err = -ENOMEM; -+ page = (void *)__get_free_page(GFP_NOFS); -+ if (unlikely(!page)) -+ goto out; -+ -+ err = 0; -+ bend = au_sbend(sb); -+ for (bindex = 0; !err && bindex <= bend; bindex++) -+ if (!bindex || is_sb_shared(sb, bindex, bindex - 1) < 0) -+ err = do_xib_restore -+ (sb, au_sbr(sb, bindex)->br_xino.xi_file, page); -+ else -+ AuDbg("b%d\n", bindex); -+ free_page((unsigned long)page); -+ -+ out: -+ return err; -+} -+ -+int au_xib_trunc(struct super_block *sb) -+{ -+ int err; -+ ssize_t sz; -+ loff_t pos; -+ struct au_xino_lock_dir ldir; -+ struct au_sbinfo *sbinfo; -+ unsigned long *p; -+ struct file *file; -+ -+ SiMustWriteLock(sb); -+ -+ err = 0; -+ sbinfo = au_sbi(sb); -+ if (!au_opt_test(sbinfo->si_mntflags, XINO)) -+ goto out; -+ -+ file = sbinfo->si_xib; -+ if (i_size_read(file->f_dentry->d_inode) <= PAGE_SIZE) -+ goto out; -+ -+ au_xino_lock_dir(sb, file, &ldir); -+ /* mnt_want_write() is unnecessary here */ -+ file = au_xino_create2(sbinfo->si_xib, NULL); -+ au_xino_unlock_dir(&ldir); -+ err = PTR_ERR(file); -+ if (IS_ERR(file)) -+ goto out; -+ fput(sbinfo->si_xib); -+ sbinfo->si_xib = file; -+ -+ p = sbinfo->si_xib_buf; -+ memset(p, 0, PAGE_SIZE); -+ pos = 0; -+ sz = xino_fwrite(sbinfo->si_xwrite, sbinfo->si_xib, p, PAGE_SIZE, &pos); -+ if (unlikely(sz != PAGE_SIZE)) { -+ err = sz; -+ AuIOErr("err %d\n", err); -+ if (sz >= 0) -+ err = -EIO; -+ goto out; -+ } -+ -+ mutex_lock(&sbinfo->si_xib_mtx); -+ /* mnt_want_write() is unnecessary here */ -+ err = xib_restore(sb); -+ mutex_unlock(&sbinfo->si_xib_mtx); -+ -+out: -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * xino mount option handlers -+ */ -+static au_readf_t find_readf(struct file *h_file) -+{ -+ const struct file_operations *fop = h_file->f_op; -+ -+ if (fop) { -+ if (fop->read) -+ return fop->read; -+ if (fop->aio_read) -+ return do_sync_read; -+ } -+ return ERR_PTR(-ENOSYS); -+} -+ -+static au_writef_t find_writef(struct file *h_file) -+{ -+ const struct file_operations *fop = h_file->f_op; -+ -+ if (fop) { -+ if (fop->write) -+ return fop->write; -+ if (fop->aio_write) -+ return do_sync_write; -+ } -+ return ERR_PTR(-ENOSYS); -+} -+ -+/* xino bitmap */ -+static void xino_clear_xib(struct super_block *sb) -+{ -+ struct au_sbinfo *sbinfo; -+ -+ SiMustWriteLock(sb); -+ -+ sbinfo = au_sbi(sb); -+ sbinfo->si_xread = NULL; -+ sbinfo->si_xwrite = NULL; -+ if (sbinfo->si_xib) -+ fput(sbinfo->si_xib); -+ sbinfo->si_xib = NULL; -+ free_page((unsigned long)sbinfo->si_xib_buf); -+ sbinfo->si_xib_buf = NULL; -+} -+ -+static int au_xino_set_xib(struct super_block *sb, struct file *base) -+{ -+ int err; -+ loff_t pos; -+ struct au_sbinfo *sbinfo; -+ struct file *file; -+ -+ SiMustWriteLock(sb); -+ -+ sbinfo = au_sbi(sb); -+ file = au_xino_create2(base, sbinfo->si_xib); -+ err = PTR_ERR(file); -+ if (IS_ERR(file)) -+ goto out; -+ if (sbinfo->si_xib) -+ fput(sbinfo->si_xib); -+ sbinfo->si_xib = file; -+ sbinfo->si_xread = find_readf(file); -+ sbinfo->si_xwrite = find_writef(file); -+ -+ err = -ENOMEM; -+ if (!sbinfo->si_xib_buf) -+ sbinfo->si_xib_buf = (void *)get_zeroed_page(GFP_NOFS); -+ if (unlikely(!sbinfo->si_xib_buf)) -+ goto out_unset; -+ -+ sbinfo->si_xib_last_pindex = 0; -+ sbinfo->si_xib_next_bit = 0; -+ if (i_size_read(file->f_dentry->d_inode) < PAGE_SIZE) { -+ pos = 0; -+ err = xino_fwrite(sbinfo->si_xwrite, file, sbinfo->si_xib_buf, -+ PAGE_SIZE, &pos); -+ if (unlikely(err != PAGE_SIZE)) -+ goto out_free; -+ } -+ err = 0; -+ goto out; /* success */ -+ -+ out_free: -+ free_page((unsigned long)sbinfo->si_xib_buf); -+ sbinfo->si_xib_buf = NULL; -+ if (err >= 0) -+ err = -EIO; -+ out_unset: -+ fput(sbinfo->si_xib); -+ sbinfo->si_xib = NULL; -+ sbinfo->si_xread = NULL; -+ sbinfo->si_xwrite = NULL; -+ out: -+ return err; -+} -+ -+/* xino for each branch */ -+static void xino_clear_br(struct super_block *sb) -+{ -+ aufs_bindex_t bindex, bend; -+ struct au_branch *br; -+ -+ bend = au_sbend(sb); -+ for (bindex = 0; bindex <= bend; bindex++) { -+ br = au_sbr(sb, bindex); -+ if (!br || !br->br_xino.xi_file) -+ continue; -+ -+ fput(br->br_xino.xi_file); -+ br->br_xino.xi_file = NULL; -+ } -+} -+ -+static int au_xino_set_br(struct super_block *sb, struct file *base) -+{ -+ int err; -+ ino_t ino; -+ aufs_bindex_t bindex, bend, bshared; -+ struct { -+ struct file *old, *new; -+ } *fpair, *p; -+ struct au_branch *br; -+ struct inode *inode; -+ au_writef_t writef; -+ -+ SiMustWriteLock(sb); -+ -+ err = -ENOMEM; -+ bend = au_sbend(sb); -+ fpair = kcalloc(bend + 1, sizeof(*fpair), GFP_NOFS); -+ if (unlikely(!fpair)) -+ goto out; -+ -+ inode = sb->s_root->d_inode; -+ ino = AUFS_ROOT_INO; -+ writef = au_sbi(sb)->si_xwrite; -+ for (bindex = 0, p = fpair; bindex <= bend; bindex++, p++) { -+ br = au_sbr(sb, bindex); -+ bshared = is_sb_shared(sb, bindex, bindex - 1); -+ if (bshared >= 0) { -+ /* shared xino */ -+ *p = fpair[bshared]; -+ get_file(p->new); -+ } -+ -+ if (!p->new) { -+ /* new xino */ -+ p->old = br->br_xino.xi_file; -+ p->new = au_xino_create2(base, br->br_xino.xi_file); -+ err = PTR_ERR(p->new); -+ if (IS_ERR(p->new)) { -+ p->new = NULL; -+ goto out_pair; -+ } -+ } -+ -+ err = au_xino_do_write(writef, p->new, -+ au_h_iptr(inode, bindex)->i_ino, ino); -+ if (unlikely(err)) -+ goto out_pair; -+ } -+ -+ for (bindex = 0, p = fpair; bindex <= bend; bindex++, p++) { -+ br = au_sbr(sb, bindex); -+ if (br->br_xino.xi_file) -+ fput(br->br_xino.xi_file); -+ get_file(p->new); -+ br->br_xino.xi_file = p->new; -+ } -+ -+ out_pair: -+ for (bindex = 0, p = fpair; bindex <= bend; bindex++, p++) -+ if (p->new) -+ fput(p->new); -+ else -+ break; -+ kfree(fpair); -+ out: -+ return err; -+} -+ -+void au_xino_clr(struct super_block *sb) -+{ -+ struct au_sbinfo *sbinfo; -+ -+ au_xigen_clr(sb); -+ xino_clear_xib(sb); -+ xino_clear_br(sb); -+ sbinfo = au_sbi(sb); -+ /* lvalue, do not call au_mntflags() */ -+ au_opt_clr(sbinfo->si_mntflags, XINO); -+} -+ -+int au_xino_set(struct super_block *sb, struct au_opt_xino *xino, int remount) -+{ -+ int err, skip; -+ struct dentry *parent, *cur_parent; -+ struct qstr *dname, *cur_name; -+ struct file *cur_xino; -+ struct inode *dir; -+ struct au_sbinfo *sbinfo; -+ -+ SiMustWriteLock(sb); -+ -+ err = 0; -+ sbinfo = au_sbi(sb); -+ parent = dget_parent(xino->file->f_dentry); -+ if (remount) { -+ skip = 0; -+ dname = &xino->file->f_dentry->d_name; -+ cur_xino = sbinfo->si_xib; -+ if (cur_xino) { -+ cur_parent = dget_parent(cur_xino->f_dentry); -+ cur_name = &cur_xino->f_dentry->d_name; -+ skip = (cur_parent == parent -+ && dname->len == cur_name->len -+ && !memcmp(dname->name, cur_name->name, -+ dname->len)); -+ dput(cur_parent); -+ } -+ if (skip) -+ goto out; -+ } -+ -+ au_opt_set(sbinfo->si_mntflags, XINO); -+ dir = parent->d_inode; -+ mutex_lock_nested(&dir->i_mutex, AuLsc_I_PARENT); -+ /* mnt_want_write() is unnecessary here */ -+ err = au_xino_set_xib(sb, xino->file); -+ if (!err) -+ err = au_xigen_set(sb, xino->file); -+ if (!err) -+ err = au_xino_set_br(sb, xino->file); -+ mutex_unlock(&dir->i_mutex); -+ if (!err) -+ goto out; /* success */ -+ -+ /* reset all */ -+ AuIOErr("failed creating xino(%d).\n", err); -+ -+ out: -+ dput(parent); -+ return err; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* -+ * create a xinofile at the default place/path. -+ */ -+struct file *au_xino_def(struct super_block *sb) -+{ -+ struct file *file; -+ char *page, *p; -+ struct au_branch *br; -+ struct super_block *h_sb; -+ struct path path; -+ aufs_bindex_t bend, bindex, bwr; -+ -+ br = NULL; -+ bend = au_sbend(sb); -+ bwr = -1; -+ for (bindex = 0; bindex <= bend; bindex++) { -+ br = au_sbr(sb, bindex); -+ if (au_br_writable(br->br_perm) -+ && !au_test_fs_bad_xino(br->br_mnt->mnt_sb)) { -+ bwr = bindex; -+ break; -+ } -+ } -+ -+ if (bwr >= 0) { -+ file = ERR_PTR(-ENOMEM); -+ page = __getname_gfp(GFP_NOFS); -+ if (unlikely(!page)) -+ goto out; -+ path.mnt = br->br_mnt; -+ path.dentry = au_h_dptr(sb->s_root, bwr); -+ p = d_path(&path, page, PATH_MAX - sizeof(AUFS_XINO_FNAME)); -+ file = (void *)p; -+ if (!IS_ERR(p)) { -+ strcat(p, "/" AUFS_XINO_FNAME); -+ AuDbg("%s\n", p); -+ file = au_xino_create(sb, p, /*silent*/0); -+ if (!IS_ERR(file)) -+ au_xino_brid_set(sb, br->br_id); -+ } -+ __putname(page); -+ } else { -+ file = au_xino_create(sb, AUFS_XINO_DEFPATH, /*silent*/0); -+ if (IS_ERR(file)) -+ goto out; -+ h_sb = file->f_dentry->d_sb; -+ if (unlikely(au_test_fs_bad_xino(h_sb))) { -+ pr_err("xino doesn't support %s(%s)\n", -+ AUFS_XINO_DEFPATH, au_sbtype(h_sb)); -+ fput(file); -+ file = ERR_PTR(-EINVAL); -+ } -+ if (!IS_ERR(file)) -+ au_xino_brid_set(sb, -1); -+ } -+ -+ out: -+ return file; -+} -+ -+/* ---------------------------------------------------------------------- */ -+ -+int au_xino_path(struct seq_file *seq, struct file *file) -+{ -+ int err; -+ -+ err = au_seq_path(seq, &file->f_path); -+ if (unlikely(err < 0)) -+ goto out; -+ -+ err = 0; -+#define Deleted "\\040(deleted)" -+ seq->count -= sizeof(Deleted) - 1; -+ AuDebugOn(memcmp(seq->buf + seq->count, Deleted, -+ sizeof(Deleted) - 1)); -+#undef Deleted -+ -+ out: -+ return err; -+} -diff -Nur linux-2.6.33.1-vanilla/fs/Kconfig linux-2.6.33.1/fs/Kconfig ---- linux-2.6.33.1-vanilla/fs/Kconfig 2010-03-15 17:09:39.000000000 +0100 -+++ linux-2.6.33.1/fs/Kconfig 2010-04-05 16:54:40.000000000 +0200 -@@ -188,6 +188,7 @@ - source "fs/sysv/Kconfig" - source "fs/ufs/Kconfig" - source "fs/exofs/Kconfig" -+source "fs/aufs/Kconfig" - - endif # MISC_FILESYSTEMS - -diff -Nur linux-2.6.33.1-vanilla/fs/Makefile linux-2.6.33.1/fs/Makefile ---- linux-2.6.33.1-vanilla/fs/Makefile 2010-03-15 17:09:39.000000000 +0100 -+++ linux-2.6.33.1/fs/Makefile 2010-04-05 16:54:40.000000000 +0200 -@@ -124,3 +124,4 @@ - obj-$(CONFIG_GFS2_FS) += gfs2/ - obj-$(CONFIG_EXOFS_FS) += exofs/ - obj-$(CONFIG_CEPH_FS) += ceph/ -+obj-$(CONFIG_AUFS_FS) += aufs/ -diff -Nur linux-2.6.33.1-vanilla/fs/namei.c linux-2.6.33.1/fs/namei.c ---- linux-2.6.33.1-vanilla/fs/namei.c 2010-03-15 17:09:39.000000000 +0100 -+++ linux-2.6.33.1/fs/namei.c 2010-04-05 16:54:44.000000000 +0200 -@@ -349,6 +349,7 @@ - - return 0; - } -+EXPORT_SYMBOL(deny_write_access); - - /** - * path_get - get a reference to a path -@@ -1207,7 +1208,7 @@ - * needs parent already locked. Doesn't follow mounts. - * SMP-safe. - */ --static struct dentry *lookup_hash(struct nameidata *nd) -+struct dentry *lookup_hash(struct nameidata *nd) - { - int err; - -@@ -1216,8 +1217,9 @@ - return ERR_PTR(err); - return __lookup_hash(&nd->last, nd->path.dentry, nd); - } -+EXPORT_SYMBOL(lookup_hash); - --static int __lookup_one_len(const char *name, struct qstr *this, -+int __lookup_one_len(const char *name, struct qstr *this, - struct dentry *base, int len) - { - unsigned long hash; -@@ -1238,6 +1240,7 @@ - this->hash = end_name_hash(hash); - return 0; - } -+EXPORT_SYMBOL(__lookup_one_len); - - /** - * lookup_one_len - filesystem helper to lookup single pathname component -diff -Nur linux-2.6.33.1-vanilla/fs/namespace.c linux-2.6.33.1/fs/namespace.c ---- linux-2.6.33.1-vanilla/fs/namespace.c 2010-03-15 17:09:39.000000000 +0100 -+++ linux-2.6.33.1/fs/namespace.c 2010-04-05 16:54:44.000000000 +0200 -@@ -39,6 +39,7 @@ - - /* spinlock for vfsmount related operations, inplace of dcache_lock */ - __cacheline_aligned_in_smp DEFINE_SPINLOCK(vfsmount_lock); -+EXPORT_SYMBOL(vfsmount_lock); - - static int event; - static DEFINE_IDA(mnt_id_ida); -diff -Nur linux-2.6.33.1-vanilla/fs/notify/group.c linux-2.6.33.1/fs/notify/group.c ---- linux-2.6.33.1-vanilla/fs/notify/group.c 2010-03-15 17:09:39.000000000 +0100 -+++ linux-2.6.33.1/fs/notify/group.c 2010-04-05 16:54:44.000000000 +0200 -@@ -22,6 +22,7 @@ - #include - #include - #include -+#include - - #include - #include "fsnotify.h" -@@ -169,6 +170,7 @@ - fsnotify_recalc_global_mask(); - fsnotify_destroy_group(group); - } -+EXPORT_SYMBOL(fsnotify_put_group); - - /* - * Simply run the fsnotify_groups list and find a group which matches -@@ -252,3 +254,4 @@ - - return group; - } -+EXPORT_SYMBOL(fsnotify_obtain_group); -diff -Nur linux-2.6.33.1-vanilla/fs/notify/inode_mark.c linux-2.6.33.1/fs/notify/inode_mark.c ---- linux-2.6.33.1-vanilla/fs/notify/inode_mark.c 2010-03-15 17:09:39.000000000 +0100 -+++ linux-2.6.33.1/fs/notify/inode_mark.c 2010-04-05 16:54:44.000000000 +0200 -@@ -106,6 +106,7 @@ - if (atomic_dec_and_test(&entry->refcnt)) - entry->free_mark(entry); - } -+EXPORT_SYMBOL(fsnotify_put_mark); - - /* - * Recalculate the mask of events relevant to a given inode locked. -@@ -216,6 +217,7 @@ - if (unlikely(atomic_dec_and_test(&group->num_marks))) - fsnotify_final_destroy_group(group); - } -+EXPORT_SYMBOL(fsnotify_destroy_mark_by_entry); - - /* - * Given a group, destroy all of the marks associated with that group. -@@ -282,6 +284,7 @@ - } - return NULL; - } -+EXPORT_SYMBOL(fsnotify_find_mark_entry); - - /* - * Nothing fancy, just initialize lists and locks and counters. -@@ -298,6 +301,7 @@ - entry->inode = NULL; - entry->free_mark = free_mark; - } -+EXPORT_SYMBOL(fsnotify_init_mark); - - /* - * Attach an initialized mark entry to a given group and inode. -@@ -353,6 +357,7 @@ - - return ret; - } -+EXPORT_SYMBOL(fsnotify_add_mark); - - /** - * fsnotify_unmount_inodes - an sb is unmounting. handle any watched inodes. -diff -Nur linux-2.6.33.1-vanilla/fs/open.c linux-2.6.33.1/fs/open.c ---- linux-2.6.33.1-vanilla/fs/open.c 2010-03-15 17:09:39.000000000 +0100 -+++ linux-2.6.33.1/fs/open.c 2010-04-05 16:54:44.000000000 +0200 -@@ -226,6 +226,7 @@ - mutex_unlock(&dentry->d_inode->i_mutex); - return ret; - } -+EXPORT_SYMBOL(do_truncate); - - static long do_sys_truncate(const char __user *pathname, loff_t length) - { -diff -Nur linux-2.6.33.1-vanilla/fs/splice.c linux-2.6.33.1/fs/splice.c ---- linux-2.6.33.1-vanilla/fs/splice.c 2010-03-15 17:09:39.000000000 +0100 -+++ linux-2.6.33.1/fs/splice.c 2010-04-05 16:54:44.000000000 +0200 -@@ -1053,8 +1053,8 @@ - /* - * Attempt to initiate a splice from pipe to file. - */ --static long do_splice_from(struct pipe_inode_info *pipe, struct file *out, -- loff_t *ppos, size_t len, unsigned int flags) -+long do_splice_from(struct pipe_inode_info *pipe, struct file *out, -+ loff_t *ppos, size_t len, unsigned int flags) - { - ssize_t (*splice_write)(struct pipe_inode_info *, struct file *, - loff_t *, size_t, unsigned int); -@@ -1077,13 +1077,14 @@ - - return splice_write(pipe, out, ppos, len, flags); - } -+EXPORT_SYMBOL(do_splice_from); - - /* - * Attempt to initiate a splice from a file to a pipe. - */ --static long do_splice_to(struct file *in, loff_t *ppos, -- struct pipe_inode_info *pipe, size_t len, -- unsigned int flags) -+long do_splice_to(struct file *in, loff_t *ppos, -+ struct pipe_inode_info *pipe, size_t len, -+ unsigned int flags) - { - ssize_t (*splice_read)(struct file *, loff_t *, - struct pipe_inode_info *, size_t, unsigned int); -@@ -1103,6 +1104,7 @@ - - return splice_read(in, ppos, pipe, len, flags); - } -+EXPORT_SYMBOL(do_splice_to); - - /** - * splice_direct_to_actor - splices data directly between two non-pipes -diff -Nur linux-2.6.33.1-vanilla/include/linux/aufs_type.h linux-2.6.33.1/include/linux/aufs_type.h ---- linux-2.6.33.1-vanilla/include/linux/aufs_type.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-2.6.33.1/include/linux/aufs_type.h 2010-04-05 16:53:31.000000000 +0200 -@@ -0,0 +1,198 @@ -+/* -+ * Copyright (C) 2005-2010 Junjiro R. Okajima -+ * -+ * This program, aufs is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+#ifndef __AUFS_TYPE_H__ -+#define __AUFS_TYPE_H__ -+ -+#include -+/* for those who didn't "make headers_install" */ -+#ifdef __KERNEL__ -+#include -+#endif -+#include -+#include -+ -+#define AUFS_VERSION "2-standalone.tree-33-20100405" -+ -+/* todo? move this to linux-2.6.19/include/magic.h */ -+#define AUFS_SUPER_MAGIC ('a' << 24 | 'u' << 16 | 'f' << 8 | 's') -+ -+/* ---------------------------------------------------------------------- */ -+ -+#ifdef CONFIG_AUFS_BRANCH_MAX_127 -+typedef __s8 aufs_bindex_t; -+#define AUFS_BRANCH_MAX 127 -+#else -+typedef __s16 aufs_bindex_t; -+#ifdef CONFIG_AUFS_BRANCH_MAX_511 -+#define AUFS_BRANCH_MAX 511 -+#elif defined(CONFIG_AUFS_BRANCH_MAX_1023) -+#define AUFS_BRANCH_MAX 1023 -+#elif defined(CONFIG_AUFS_BRANCH_MAX_32767) -+#define AUFS_BRANCH_MAX 32767 -+#endif -+#endif -+ -+#ifdef __KERNEL__ -+#ifndef AUFS_BRANCH_MAX -+#error unknown CONFIG_AUFS_BRANCH_MAX value -+#endif -+#endif /* __KERNEL__ */ -+ -+/* ---------------------------------------------------------------------- */ -+ -+#define AUFS_NAME "aufs" -+#define AUFS_FSTYPE AUFS_NAME -+ -+#define AUFS_ROOT_INO 2 -+#define AUFS_FIRST_INO 11 -+ -+#define AUFS_WH_PFX ".wh." -+#define AUFS_WH_PFX_LEN ((int)sizeof(AUFS_WH_PFX) - 1) -+#define AUFS_WH_TMP_LEN 4 -+/* a limit for rmdir/rename a dir */ -+#define AUFS_MAX_NAMELEN (NAME_MAX \ -+ - AUFS_WH_PFX_LEN * 2 /* doubly whiteouted */\ -+ - 1 /* dot */\ -+ - AUFS_WH_TMP_LEN) /* hex */ -+#define AUFS_XINO_FNAME "." AUFS_NAME ".xino" -+#define AUFS_XINO_DEFPATH "/tmp/" AUFS_XINO_FNAME -+#define AUFS_XINO_TRUNC_INIT 64 /* blocks */ -+#define AUFS_XINO_TRUNC_STEP 4 /* blocks */ -+#define AUFS_DIRWH_DEF 3 -+#define AUFS_RDCACHE_DEF 10 /* seconds */ -+#define AUFS_RDBLK_DEF 512 /* bytes */ -+#define AUFS_RDHASH_DEF 32 -+#define AUFS_WKQ_NAME AUFS_NAME "d" -+#define AUFS_MFS_SECOND_DEF 30 /* seconds */ -+#define AUFS_PLINK_WARN 100 /* number of plinks */ -+ -+#define AUFS_DIROPQ_NAME AUFS_WH_PFX ".opq" /* whiteouted doubly */ -+#define AUFS_WH_DIROPQ AUFS_WH_PFX AUFS_DIROPQ_NAME -+ -+#define AUFS_BASE_NAME AUFS_WH_PFX AUFS_NAME -+#define AUFS_PLINKDIR_NAME AUFS_WH_PFX "plnk" -+#define AUFS_ORPHDIR_NAME AUFS_WH_PFX "orph" -+ -+/* doubly whiteouted */ -+#define AUFS_WH_BASE AUFS_WH_PFX AUFS_BASE_NAME -+#define AUFS_WH_PLINKDIR AUFS_WH_PFX AUFS_PLINKDIR_NAME -+#define AUFS_WH_ORPHDIR AUFS_WH_PFX AUFS_ORPHDIR_NAME -+ -+/* branch permission */ -+#define AUFS_BRPERM_RW "rw" -+#define AUFS_BRPERM_RO "ro" -+#define AUFS_BRPERM_RR "rr" -+#define AUFS_BRPERM_WH "wh" -+#define AUFS_BRPERM_NLWH "nolwh" -+#define AUFS_BRPERM_ROWH AUFS_BRPERM_RO "+" AUFS_BRPERM_WH -+#define AUFS_BRPERM_RRWH AUFS_BRPERM_RR "+" AUFS_BRPERM_WH -+#define AUFS_BRPERM_RWNLWH AUFS_BRPERM_RW "+" AUFS_BRPERM_NLWH -+ -+/* ---------------------------------------------------------------------- */ -+ -+/* ioctl */ -+enum { -+ AuCtl_PLINK_MAINT, -+ AuCtl_PLINK_CLEAN, -+ -+ /* readdir in userspace */ -+ AuCtl_RDU, -+ AuCtl_RDU_INO, -+ -+ /* pathconf wrapper */ -+ AuCtl_WBR_FD -+}; -+ -+/* borrowed from linux/include/linux/kernel.h */ -+#ifndef ALIGN -+#define ALIGN(x, a) __ALIGN_MASK(x, (typeof(x))(a)-1) -+#define __ALIGN_MASK(x, mask) (((x)+(mask))&~(mask)) -+#endif -+ -+/* borrowed from linux/include/linux/compiler-gcc3.h */ -+#ifndef __aligned -+#define __aligned(x) __attribute__((aligned(x))) -+#define __packed __attribute__((packed)) -+#endif -+ -+struct au_rdu_cookie { -+ __u64 h_pos; -+ __s16 bindex; -+ __u8 flags; -+ __u8 pad; -+ __u32 generation; -+} __aligned(8); -+ -+struct au_rdu_ent { -+ __u64 ino; -+ __s16 bindex; -+ __u8 type; -+ __u8 nlen; -+ __u8 wh; -+ char name[0]; -+} __aligned(8); -+ -+static inline int au_rdu_len(int nlen) -+{ -+ /* include the terminating NULL */ -+ return ALIGN(sizeof(struct au_rdu_ent) + nlen + 1, -+ sizeof(__u64)); -+} -+ -+union au_rdu_ent_ul { -+ struct au_rdu_ent __user *e; -+ unsigned long ul; -+}; -+ -+enum { -+ AufsCtlRduV_SZ, -+ AufsCtlRduV_SZ_PTR, -+ AufsCtlRduV_End -+}; -+ -+struct aufs_rdu { -+ /* input */ -+ union { -+ __u64 sz; /* AuCtl_RDU */ -+ __u64 nent; /* AuCtl_RDU_INO */ -+ }; -+ union au_rdu_ent_ul ent; -+ __u16 verify[AufsCtlRduV_End]; -+ -+ /* input/output */ -+ __u32 blk; -+ -+ /* output */ -+ union au_rdu_ent_ul tail; -+ /* number of entries which were added in a single call */ -+ __u64 rent; -+ __u8 full; -+ __u8 shwh; -+ -+ struct au_rdu_cookie cookie; -+} __aligned(8); -+ -+#define AuCtlType 'A' -+#define AUFS_CTL_PLINK_MAINT _IO(AuCtlType, AuCtl_PLINK_MAINT) -+#define AUFS_CTL_PLINK_CLEAN _IO(AuCtlType, AuCtl_PLINK_CLEAN) -+#define AUFS_CTL_RDU _IOWR(AuCtlType, AuCtl_RDU, struct aufs_rdu) -+#define AUFS_CTL_RDU_INO _IOWR(AuCtlType, AuCtl_RDU_INO, struct aufs_rdu) -+#define AUFS_CTL_WBR_FD _IO(AuCtlType, AuCtl_WBR_FD) -+ -+#endif /* __AUFS_TYPE_H__ */ -diff -Nur linux-2.6.33.1-vanilla/include/linux/Kbuild linux-2.6.33.1/include/linux/Kbuild ---- linux-2.6.33.1-vanilla/include/linux/Kbuild 2010-03-15 17:09:39.000000000 +0100 -+++ linux-2.6.33.1/include/linux/Kbuild 2010-04-05 16:54:40.000000000 +0200 -@@ -34,6 +34,7 @@ - header-y += atmsap.h - header-y += atmsvc.h - header-y += atm_zatm.h -+header-y += aufs_type.h - header-y += auto_fs4.h - header-y += ax25.h - header-y += b1lli.h -diff -Nur linux-2.6.33.1-vanilla/include/linux/namei.h linux-2.6.33.1/include/linux/namei.h ---- linux-2.6.33.1-vanilla/include/linux/namei.h 2010-03-15 17:09:39.000000000 +0100 -+++ linux-2.6.33.1/include/linux/namei.h 2010-04-05 16:54:34.000000000 +0200 -@@ -73,6 +73,9 @@ - extern struct file *lookup_instantiate_filp(struct nameidata *nd, struct dentry *dentry, - int (*open)(struct inode *, struct file *)); - -+extern struct dentry *lookup_hash(struct nameidata *nd); -+extern int __lookup_one_len(const char *name, struct qstr *this, -+ struct dentry *base, int len); - extern struct dentry *lookup_one_len(const char *, struct dentry *, int); - - extern int follow_down(struct path *); -diff -Nur linux-2.6.33.1-vanilla/include/linux/splice.h linux-2.6.33.1/include/linux/splice.h ---- linux-2.6.33.1-vanilla/include/linux/splice.h 2010-03-15 17:09:39.000000000 +0100 -+++ linux-2.6.33.1/include/linux/splice.h 2010-04-05 16:54:34.000000000 +0200 -@@ -82,4 +82,10 @@ - extern ssize_t splice_direct_to_actor(struct file *, struct splice_desc *, - splice_direct_actor *); - -+extern long do_splice_from(struct pipe_inode_info *pipe, struct file *out, -+ loff_t *ppos, size_t len, unsigned int flags); -+extern long do_splice_to(struct file *in, loff_t *ppos, -+ struct pipe_inode_info *pipe, size_t len, -+ unsigned int flags); -+ - #endif -diff -Nur linux-2.6.33.1-vanilla/security/commoncap.c linux-2.6.33.1/security/commoncap.c ---- linux-2.6.33.1-vanilla/security/commoncap.c 2010-03-15 17:09:39.000000000 +0100 -+++ linux-2.6.33.1/security/commoncap.c 2010-04-05 16:54:44.000000000 +0200 -@@ -946,3 +946,4 @@ - } - return ret; - } -+EXPORT_SYMBOL(cap_file_mmap); -diff -Nur linux-2.6.33.1-vanilla/security/device_cgroup.c linux-2.6.33.1/security/device_cgroup.c ---- linux-2.6.33.1-vanilla/security/device_cgroup.c 2010-03-15 17:09:39.000000000 +0100 -+++ linux-2.6.33.1/security/device_cgroup.c 2010-04-05 16:54:44.000000000 +0200 -@@ -514,6 +514,7 @@ - - return -EPERM; - } -+EXPORT_SYMBOL(devcgroup_inode_permission); - - int devcgroup_inode_mknod(int mode, dev_t dev) - { -diff -Nur linux-2.6.33.1-vanilla/security/security.c linux-2.6.33.1/security/security.c ---- linux-2.6.33.1-vanilla/security/security.c 2010-03-15 17:09:39.000000000 +0100 -+++ linux-2.6.33.1/security/security.c 2010-04-05 16:54:44.000000000 +0200 -@@ -404,6 +404,7 @@ - return 0; - return security_ops->path_mkdir(path, dentry, mode); - } -+EXPORT_SYMBOL(security_path_mkdir); - - int security_path_rmdir(struct path *path, struct dentry *dentry) - { -@@ -411,6 +412,7 @@ - return 0; - return security_ops->path_rmdir(path, dentry); - } -+EXPORT_SYMBOL(security_path_rmdir); - - int security_path_unlink(struct path *path, struct dentry *dentry) - { -@@ -418,6 +420,7 @@ - return 0; - return security_ops->path_unlink(path, dentry); - } -+EXPORT_SYMBOL(security_path_unlink); - - int security_path_symlink(struct path *path, struct dentry *dentry, - const char *old_name) -@@ -426,6 +429,7 @@ - return 0; - return security_ops->path_symlink(path, dentry, old_name); - } -+EXPORT_SYMBOL(security_path_symlink); - - int security_path_link(struct dentry *old_dentry, struct path *new_dir, - struct dentry *new_dentry) -@@ -434,6 +438,7 @@ - return 0; - return security_ops->path_link(old_dentry, new_dir, new_dentry); - } -+EXPORT_SYMBOL(security_path_link); - - int security_path_rename(struct path *old_dir, struct dentry *old_dentry, - struct path *new_dir, struct dentry *new_dentry) -@@ -444,6 +449,7 @@ - return security_ops->path_rename(old_dir, old_dentry, new_dir, - new_dentry); - } -+EXPORT_SYMBOL(security_path_rename); - - int security_path_truncate(struct path *path, loff_t length, - unsigned int time_attrs) -@@ -452,6 +458,7 @@ - return 0; - return security_ops->path_truncate(path, length, time_attrs); - } -+EXPORT_SYMBOL(security_path_truncate); - - int security_path_chmod(struct dentry *dentry, struct vfsmount *mnt, - mode_t mode) -@@ -460,6 +467,7 @@ - return 0; - return security_ops->path_chmod(dentry, mnt, mode); - } -+EXPORT_SYMBOL(security_path_chmod); - - int security_path_chown(struct path *path, uid_t uid, gid_t gid) - { -@@ -467,6 +475,7 @@ - return 0; - return security_ops->path_chown(path, uid, gid); - } -+EXPORT_SYMBOL(security_path_chown); - - int security_path_chroot(struct path *path) - { -@@ -543,6 +552,7 @@ - return 0; - return security_ops->inode_readlink(dentry); - } -+EXPORT_SYMBOL(security_inode_readlink); - - int security_inode_follow_link(struct dentry *dentry, struct nameidata *nd) - { -@@ -557,6 +567,7 @@ - return 0; - return security_ops->inode_permission(inode, mask); - } -+EXPORT_SYMBOL(security_inode_permission); - - int security_inode_setattr(struct dentry *dentry, struct iattr *attr) - { -@@ -657,6 +668,7 @@ - { - return security_ops->file_permission(file, mask); - } -+EXPORT_SYMBOL(security_file_permission); - - int security_file_alloc(struct file *file) - { -@@ -684,6 +696,7 @@ - return ret; - return ima_file_mmap(file, prot); - } -+EXPORT_SYMBOL(security_file_mmap); - - int security_file_mprotect(struct vm_area_struct *vma, unsigned long reqprot, - unsigned long prot) diff --git a/pkgs/core/kernel/patches/grsecurity-2.2.0-2.6.34.1-201007070910.patch b/pkgs/core/kernel/patches/grsecurity-2.2.0-2.6.35.4-201009172030.patch similarity index 79% rename from pkgs/core/kernel/patches/grsecurity-2.2.0-2.6.34.1-201007070910.patch rename to pkgs/core/kernel/patches/grsecurity-2.2.0-2.6.35.4-201009172030.patch index f7c53241b..ff2fb9b6a 100644 --- a/pkgs/core/kernel/patches/grsecurity-2.2.0-2.6.34.1-201007070910.patch +++ b/pkgs/core/kernel/patches/grsecurity-2.2.0-2.6.35.4-201009172030.patch @@ -1,174 +1,6 @@ -diff -urNp linux-2.6.34.1/Documentation/dontdiff linux-2.6.34.1/Documentation/dontdiff ---- linux-2.6.34.1/Documentation/dontdiff 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/Documentation/dontdiff 2010-07-07 09:04:49.000000000 -0400 -@@ -3,6 +3,7 @@ - *.bin - *.cpio - *.csp -+*.dbg - *.dsp - *.dvi - *.elf -@@ -40,6 +41,7 @@ - *.ver - *.xml - *_MODULES -+*_reg_safe.h - *_vga16.c - *~ - *.9 -@@ -49,11 +51,16 @@ - 53c700_d.h - CVS - ChangeSet -+GPATH -+GRTAGS -+GSYMS -+GTAGS - Image - Kerntypes - Module.markers - Module.symvers - PENDING -+PERF* - SCCS - System.map* - TAGS -@@ -76,7 +83,10 @@ btfixupprep - build - bvmlinux - bzImage* -+capflags.c - classlist.h* -+clut_vga16.c -+common-cmds.h - comp*.log - compile.h* - conf -@@ -106,13 +116,15 @@ generated - genheaders - genksyms - *_gray256.c -+hash - ihex2fw - ikconfig.h* -+inat-tables.c - initramfs_data.cpio -+initramfs_data.cpio.bz2 - initramfs_data.cpio.gz - initramfs_list - kallsyms --kconfig - keywords.c - ksym.c* - ksym.h* -@@ -136,10 +148,13 @@ mkboot - mkbugboot - mkcpustr - mkdep -+mkpiggy - mkprep -+mkregtable - mktables - mktree - modpost -+modules.builtin - modules.order - modversions.h* - ncscope.* -@@ -152,6 +167,7 @@ patches* - pca200e.bin - pca200e_ecd.bin2 - piggy.gz -+piggy.S - piggyback - pnmtologo - ppc_defs.h* -@@ -166,6 +182,7 @@ setup - setup.bin - setup.elf - sImage -+slabinfo - sm_tbl* - split-include - syscalltab.h -@@ -189,14 +206,20 @@ version.h* - vmlinux - vmlinux-* - vmlinux.aout -+vmlinux.bin.all -+vmlinux.bin.bz2 - vmlinux.lds -+vmlinux.relocs -+voffset.h - vsyscall.lds - vsyscall_32.lds - wanxlfw.inc - uImage - unifdef -+utsrelease.h - wakeup.bin - wakeup.elf - wakeup.lds - zImage* - zconf.hash.c -+zoffset.h -diff -urNp linux-2.6.34.1/Documentation/filesystems/sysfs.txt linux-2.6.34.1/Documentation/filesystems/sysfs.txt ---- linux-2.6.34.1/Documentation/filesystems/sysfs.txt 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/Documentation/filesystems/sysfs.txt 2010-07-07 09:04:50.000000000 -0400 -@@ -123,8 +123,8 @@ set of sysfs operations for forwarding r - show and store methods of the attribute owners. - - struct sysfs_ops { -- ssize_t (*show)(struct kobject *, struct attribute *, char *); -- ssize_t (*store)(struct kobject *, struct attribute *, const char *); -+ ssize_t (* const show)(struct kobject *, struct attribute *, char *); -+ ssize_t (* const store)(struct kobject *, struct attribute *, const char *); - }; - - [ Subsystems should have already defined a struct kobj_type as a -diff -urNp linux-2.6.34.1/Documentation/kernel-parameters.txt linux-2.6.34.1/Documentation/kernel-parameters.txt ---- linux-2.6.34.1/Documentation/kernel-parameters.txt 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/Documentation/kernel-parameters.txt 2010-07-07 09:04:50.000000000 -0400 -@@ -1875,6 +1875,12 @@ and is between 256 and 4096 characters. - the specified number of seconds. This is to be used if - your oopses keep scrolling off the screen. - -+ pax_nouderef [X86-32] disables UDEREF. Most likely needed under certain -+ virtualization environments that don't cope well with the -+ expand down segment used by UDEREF on X86-32. -+ -+ pax_softmode= [X86-32] 0/1 to disable/enable PaX softmode on boot already. -+ - pcbit= [HW,ISDN] - - pcd. [PARIDE] -diff -urNp linux-2.6.34.1/Makefile linux-2.6.34.1/Makefile ---- linux-2.6.34.1/Makefile 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/Makefile 2010-07-07 09:04:57.000000000 -0400 -@@ -227,8 +227,8 @@ CONFIG_SHELL := $(shell if [ -x "$$BASH" - - HOSTCC = gcc - HOSTCXX = g++ --HOSTCFLAGS = -Wall -Wmissing-prototypes -Wstrict-prototypes -O2 -fomit-frame-pointer --HOSTCXXFLAGS = -O2 -+HOSTCFLAGS = -Wall -W -Wmissing-prototypes -Wstrict-prototypes -O2 -fomit-frame-pointer -fno-delete-null-pointer-checks -+HOSTCXXFLAGS = -O2 -fno-delete-null-pointer-checks - - # Decide whether to build built-in, modular, or both. - # Normally, just do built-in. -@@ -650,7 +650,7 @@ export mod_strip_cmd - - - ifeq ($(KBUILD_EXTMOD),) --core-y += kernel/ mm/ fs/ ipc/ security/ crypto/ block/ -+core-y += kernel/ mm/ fs/ ipc/ security/ crypto/ block/ grsecurity/ - - vmlinux-dirs := $(patsubst %/,%,$(filter %/, $(init-y) $(init-m) \ - $(core-y) $(core-m) $(drivers-y) $(drivers-m) \ -diff -urNp linux-2.6.34.1/arch/alpha/include/asm/dma-mapping.h linux-2.6.34.1/arch/alpha/include/asm/dma-mapping.h ---- linux-2.6.34.1/arch/alpha/include/asm/dma-mapping.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/alpha/include/asm/dma-mapping.h 2010-07-07 09:04:42.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/alpha/include/asm/dma-mapping.h linux-2.6.35.4/arch/alpha/include/asm/dma-mapping.h +--- linux-2.6.35.4/arch/alpha/include/asm/dma-mapping.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/alpha/include/asm/dma-mapping.h 2010-09-17 20:12:09.000000000 -0400 @@ -3,9 +3,9 @@ #include @@ -181,9 +13,9 @@ diff -urNp linux-2.6.34.1/arch/alpha/include/asm/dma-mapping.h linux-2.6.34.1/ar { return dma_ops; } -diff -urNp linux-2.6.34.1/arch/alpha/include/asm/elf.h linux-2.6.34.1/arch/alpha/include/asm/elf.h ---- linux-2.6.34.1/arch/alpha/include/asm/elf.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/alpha/include/asm/elf.h 2010-07-07 09:04:42.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/alpha/include/asm/elf.h linux-2.6.35.4/arch/alpha/include/asm/elf.h +--- linux-2.6.35.4/arch/alpha/include/asm/elf.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/alpha/include/asm/elf.h 2010-09-17 20:12:09.000000000 -0400 @@ -90,6 +90,13 @@ typedef elf_fpreg_t elf_fpregset_t[ELF_N #define ELF_ET_DYN_BASE (TASK_UNMAPPED_BASE + 0x1000000) @@ -198,9 +30,9 @@ diff -urNp linux-2.6.34.1/arch/alpha/include/asm/elf.h linux-2.6.34.1/arch/alpha /* $0 is set by ld.so to a pointer to a function which might be registered using atexit. This provides a mean for the dynamic linker to call DT_FINI functions for shared libraries that have -diff -urNp linux-2.6.34.1/arch/alpha/include/asm/pgtable.h linux-2.6.34.1/arch/alpha/include/asm/pgtable.h ---- linux-2.6.34.1/arch/alpha/include/asm/pgtable.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/alpha/include/asm/pgtable.h 2010-07-07 09:04:42.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/alpha/include/asm/pgtable.h linux-2.6.35.4/arch/alpha/include/asm/pgtable.h +--- linux-2.6.35.4/arch/alpha/include/asm/pgtable.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/alpha/include/asm/pgtable.h 2010-09-17 20:12:09.000000000 -0400 @@ -101,6 +101,17 @@ struct vm_area_struct; #define PAGE_SHARED __pgprot(_PAGE_VALID | __ACCESS_BITS) #define PAGE_COPY __pgprot(_PAGE_VALID | __ACCESS_BITS | _PAGE_FOW) @@ -219,9 +51,9 @@ diff -urNp linux-2.6.34.1/arch/alpha/include/asm/pgtable.h linux-2.6.34.1/arch/a #define PAGE_KERNEL __pgprot(_PAGE_VALID | _PAGE_ASM | _PAGE_KRE | _PAGE_KWE) #define _PAGE_NORMAL(x) __pgprot(_PAGE_VALID | __ACCESS_BITS | (x)) -diff -urNp linux-2.6.34.1/arch/alpha/kernel/module.c linux-2.6.34.1/arch/alpha/kernel/module.c ---- linux-2.6.34.1/arch/alpha/kernel/module.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/alpha/kernel/module.c 2010-07-07 09:04:42.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/alpha/kernel/module.c linux-2.6.35.4/arch/alpha/kernel/module.c +--- linux-2.6.35.4/arch/alpha/kernel/module.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/alpha/kernel/module.c 2010-09-17 20:12:09.000000000 -0400 @@ -182,7 +182,7 @@ apply_relocate_add(Elf64_Shdr *sechdrs, /* The small sections were sorted to the end of the segment. @@ -231,9 +63,18 @@ diff -urNp linux-2.6.34.1/arch/alpha/kernel/module.c linux-2.6.34.1/arch/alpha/k got = sechdrs[me->arch.gotsecindex].sh_addr; for (i = 0; i < n; i++) { -diff -urNp linux-2.6.34.1/arch/alpha/kernel/osf_sys.c linux-2.6.34.1/arch/alpha/kernel/osf_sys.c ---- linux-2.6.34.1/arch/alpha/kernel/osf_sys.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/alpha/kernel/osf_sys.c 2010-07-07 09:04:42.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/alpha/kernel/osf_sys.c linux-2.6.35.4/arch/alpha/kernel/osf_sys.c +--- linux-2.6.35.4/arch/alpha/kernel/osf_sys.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/alpha/kernel/osf_sys.c 2010-09-17 20:12:09.000000000 -0400 +@@ -1170,7 +1170,7 @@ arch_get_unmapped_area_1(unsigned long a + /* At this point: (!vma || addr < vma->vm_end). */ + if (limit - len < addr) + return -ENOMEM; +- if (!vma || addr + len <= vma->vm_start) ++ if (check_heap_stack_gap(vma, addr, len)) + return addr; + addr = vma->vm_end; + vma = vma->vm_next; @@ -1206,6 +1206,10 @@ arch_get_unmapped_area(struct file *filp merely specific addresses, but regions of memory -- perhaps this feature should be incorporated into all ports? */ @@ -256,9 +97,28 @@ diff -urNp linux-2.6.34.1/arch/alpha/kernel/osf_sys.c linux-2.6.34.1/arch/alpha/ if (addr != (unsigned long) -ENOMEM) return addr; -diff -urNp linux-2.6.34.1/arch/alpha/kernel/pci-noop.c linux-2.6.34.1/arch/alpha/kernel/pci-noop.c ---- linux-2.6.34.1/arch/alpha/kernel/pci-noop.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/alpha/kernel/pci-noop.c 2010-07-07 09:04:42.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/alpha/kernel/pci_iommu.c linux-2.6.35.4/arch/alpha/kernel/pci_iommu.c +--- linux-2.6.35.4/arch/alpha/kernel/pci_iommu.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/alpha/kernel/pci_iommu.c 2010-09-17 20:12:09.000000000 -0400 +@@ -950,7 +950,7 @@ static int alpha_pci_set_mask(struct dev + return 0; + } + +-struct dma_map_ops alpha_pci_ops = { ++const struct dma_map_ops alpha_pci_ops = { + .alloc_coherent = alpha_pci_alloc_coherent, + .free_coherent = alpha_pci_free_coherent, + .map_page = alpha_pci_map_page, +@@ -962,5 +962,5 @@ struct dma_map_ops alpha_pci_ops = { + .set_dma_mask = alpha_pci_set_mask, + }; + +-struct dma_map_ops *dma_ops = &alpha_pci_ops; ++const struct dma_map_ops *dma_ops = &alpha_pci_ops; + EXPORT_SYMBOL(dma_ops); +diff -urNp linux-2.6.35.4/arch/alpha/kernel/pci-noop.c linux-2.6.35.4/arch/alpha/kernel/pci-noop.c +--- linux-2.6.35.4/arch/alpha/kernel/pci-noop.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/alpha/kernel/pci-noop.c 2010-09-17 20:12:09.000000000 -0400 @@ -173,7 +173,7 @@ static int alpha_noop_set_mask(struct de return 0; } @@ -277,28 +137,9 @@ diff -urNp linux-2.6.34.1/arch/alpha/kernel/pci-noop.c linux-2.6.34.1/arch/alpha EXPORT_SYMBOL(dma_ops); void __iomem *pci_iomap(struct pci_dev *dev, int bar, unsigned long maxlen) -diff -urNp linux-2.6.34.1/arch/alpha/kernel/pci_iommu.c linux-2.6.34.1/arch/alpha/kernel/pci_iommu.c ---- linux-2.6.34.1/arch/alpha/kernel/pci_iommu.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/alpha/kernel/pci_iommu.c 2010-07-07 09:04:42.000000000 -0400 -@@ -950,7 +950,7 @@ static int alpha_pci_set_mask(struct dev - return 0; - } - --struct dma_map_ops alpha_pci_ops = { -+const struct dma_map_ops alpha_pci_ops = { - .alloc_coherent = alpha_pci_alloc_coherent, - .free_coherent = alpha_pci_free_coherent, - .map_page = alpha_pci_map_page, -@@ -962,5 +962,5 @@ struct dma_map_ops alpha_pci_ops = { - .set_dma_mask = alpha_pci_set_mask, - }; - --struct dma_map_ops *dma_ops = &alpha_pci_ops; -+const struct dma_map_ops *dma_ops = &alpha_pci_ops; - EXPORT_SYMBOL(dma_ops); -diff -urNp linux-2.6.34.1/arch/alpha/mm/fault.c linux-2.6.34.1/arch/alpha/mm/fault.c ---- linux-2.6.34.1/arch/alpha/mm/fault.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/alpha/mm/fault.c 2010-07-07 09:04:42.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/alpha/mm/fault.c linux-2.6.35.4/arch/alpha/mm/fault.c +--- linux-2.6.35.4/arch/alpha/mm/fault.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/alpha/mm/fault.c 2010-09-17 20:12:09.000000000 -0400 @@ -54,6 +54,124 @@ __load_new_mm_context(struct mm_struct * __reload_thread(pcb); } @@ -455,9 +296,9 @@ diff -urNp linux-2.6.34.1/arch/alpha/mm/fault.c linux-2.6.34.1/arch/alpha/mm/fau } else if (!cause) { /* Allow reads even for write-only mappings */ if (!(vma->vm_flags & (VM_READ | VM_WRITE))) -diff -urNp linux-2.6.34.1/arch/arm/include/asm/elf.h linux-2.6.34.1/arch/arm/include/asm/elf.h ---- linux-2.6.34.1/arch/arm/include/asm/elf.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/arm/include/asm/elf.h 2010-07-07 09:04:42.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/arm/include/asm/elf.h linux-2.6.35.4/arch/arm/include/asm/elf.h +--- linux-2.6.35.4/arch/arm/include/asm/elf.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/arm/include/asm/elf.h 2010-09-17 20:12:09.000000000 -0400 @@ -111,7 +111,14 @@ int dump_task_regs(struct task_struct *t the loader. We need to make sure that it is out of the way of the program that it will "exec", and that there is sufficient room for the brk. */ @@ -474,20 +315,20 @@ diff -urNp linux-2.6.34.1/arch/arm/include/asm/elf.h linux-2.6.34.1/arch/arm/inc /* When the program starts, a1 contains a pointer to a function to be registered with atexit, as per the SVR4 ABI. A value of 0 means we -diff -urNp linux-2.6.34.1/arch/arm/include/asm/kmap_types.h linux-2.6.34.1/arch/arm/include/asm/kmap_types.h ---- linux-2.6.34.1/arch/arm/include/asm/kmap_types.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/arm/include/asm/kmap_types.h 2010-07-07 09:04:42.000000000 -0400 -@@ -20,6 +20,7 @@ enum km_type { - KM_SOFTIRQ1, +diff -urNp linux-2.6.35.4/arch/arm/include/asm/kmap_types.h linux-2.6.35.4/arch/arm/include/asm/kmap_types.h +--- linux-2.6.35.4/arch/arm/include/asm/kmap_types.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/arm/include/asm/kmap_types.h 2010-09-17 20:12:09.000000000 -0400 +@@ -21,6 +21,7 @@ enum km_type { KM_L1_CACHE, KM_L2_CACHE, + KM_KDB, + KM_CLEARPAGE, KM_TYPE_NR }; -diff -urNp linux-2.6.34.1/arch/arm/include/asm/uaccess.h linux-2.6.34.1/arch/arm/include/asm/uaccess.h ---- linux-2.6.34.1/arch/arm/include/asm/uaccess.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/arm/include/asm/uaccess.h 2010-07-07 09:04:42.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/arm/include/asm/uaccess.h linux-2.6.35.4/arch/arm/include/asm/uaccess.h +--- linux-2.6.35.4/arch/arm/include/asm/uaccess.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/arm/include/asm/uaccess.h 2010-09-17 20:12:09.000000000 -0400 @@ -403,6 +403,9 @@ extern unsigned long __must_check __strn static inline unsigned long __must_check copy_from_user(void *to, const void __user *from, unsigned long n) @@ -508,10 +349,10 @@ diff -urNp linux-2.6.34.1/arch/arm/include/asm/uaccess.h linux-2.6.34.1/arch/arm if (access_ok(VERIFY_WRITE, to, n)) n = __copy_to_user(to, from, n); return n; -diff -urNp linux-2.6.34.1/arch/arm/kernel/kgdb.c linux-2.6.34.1/arch/arm/kernel/kgdb.c ---- linux-2.6.34.1/arch/arm/kernel/kgdb.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/arm/kernel/kgdb.c 2010-07-07 09:04:42.000000000 -0400 -@@ -203,7 +203,7 @@ void kgdb_arch_exit(void) +diff -urNp linux-2.6.35.4/arch/arm/kernel/kgdb.c linux-2.6.35.4/arch/arm/kernel/kgdb.c +--- linux-2.6.35.4/arch/arm/kernel/kgdb.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/arm/kernel/kgdb.c 2010-09-17 20:12:09.000000000 -0400 +@@ -208,7 +208,7 @@ void kgdb_arch_exit(void) * and we handle the normal undef case within the do_undefinstr * handler. */ @@ -520,9 +361,9 @@ diff -urNp linux-2.6.34.1/arch/arm/kernel/kgdb.c linux-2.6.34.1/arch/arm/kernel/ #ifndef __ARMEB__ .gdb_bpt_instr = {0xfe, 0xde, 0xff, 0xe7} #else /* ! __ARMEB__ */ -diff -urNp linux-2.6.34.1/arch/arm/mach-at91/pm.c linux-2.6.34.1/arch/arm/mach-at91/pm.c ---- linux-2.6.34.1/arch/arm/mach-at91/pm.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/arm/mach-at91/pm.c 2010-07-07 09:04:42.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/arm/mach-at91/pm.c linux-2.6.35.4/arch/arm/mach-at91/pm.c +--- linux-2.6.35.4/arch/arm/mach-at91/pm.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/arm/mach-at91/pm.c 2010-09-17 20:12:09.000000000 -0400 @@ -294,7 +294,7 @@ static void at91_pm_end(void) } @@ -532,9 +373,9 @@ diff -urNp linux-2.6.34.1/arch/arm/mach-at91/pm.c linux-2.6.34.1/arch/arm/mach-a .valid = at91_pm_valid_state, .begin = at91_pm_begin, .enter = at91_pm_enter, -diff -urNp linux-2.6.34.1/arch/arm/mach-davinci/pm.c linux-2.6.34.1/arch/arm/mach-davinci/pm.c ---- linux-2.6.34.1/arch/arm/mach-davinci/pm.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/arm/mach-davinci/pm.c 2010-07-07 09:04:42.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/arm/mach-davinci/pm.c linux-2.6.35.4/arch/arm/mach-davinci/pm.c +--- linux-2.6.35.4/arch/arm/mach-davinci/pm.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/arm/mach-davinci/pm.c 2010-09-17 20:12:09.000000000 -0400 @@ -110,7 +110,7 @@ static int davinci_pm_enter(suspend_stat return ret; } @@ -544,9 +385,20 @@ diff -urNp linux-2.6.34.1/arch/arm/mach-davinci/pm.c linux-2.6.34.1/arch/arm/mac .enter = davinci_pm_enter, .valid = suspend_valid_only_mem, }; -diff -urNp linux-2.6.34.1/arch/arm/mach-omap1/pm.c linux-2.6.34.1/arch/arm/mach-omap1/pm.c ---- linux-2.6.34.1/arch/arm/mach-omap1/pm.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/arm/mach-omap1/pm.c 2010-07-07 09:04:42.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/arm/mach-msm/last_radio_log.c linux-2.6.35.4/arch/arm/mach-msm/last_radio_log.c +--- linux-2.6.35.4/arch/arm/mach-msm/last_radio_log.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/arm/mach-msm/last_radio_log.c 2010-09-17 20:12:09.000000000 -0400 +@@ -47,6 +47,7 @@ static ssize_t last_radio_log_read(struc + return count; + } + ++/* cannot be const, see msm_init_last_radio_log */ + static struct file_operations last_radio_log_fops = { + .read = last_radio_log_read + }; +diff -urNp linux-2.6.35.4/arch/arm/mach-omap1/pm.c linux-2.6.35.4/arch/arm/mach-omap1/pm.c +--- linux-2.6.35.4/arch/arm/mach-omap1/pm.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/arm/mach-omap1/pm.c 2010-09-17 20:12:09.000000000 -0400 @@ -647,7 +647,7 @@ static struct irqaction omap_wakeup_irq @@ -556,10 +408,10 @@ diff -urNp linux-2.6.34.1/arch/arm/mach-omap1/pm.c linux-2.6.34.1/arch/arm/mach- .prepare = omap_pm_prepare, .enter = omap_pm_enter, .finish = omap_pm_finish, -diff -urNp linux-2.6.34.1/arch/arm/mach-omap2/pm24xx.c linux-2.6.34.1/arch/arm/mach-omap2/pm24xx.c ---- linux-2.6.34.1/arch/arm/mach-omap2/pm24xx.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/arm/mach-omap2/pm24xx.c 2010-07-07 09:04:42.000000000 -0400 -@@ -324,7 +324,7 @@ static void omap2_pm_finish(void) +diff -urNp linux-2.6.35.4/arch/arm/mach-omap2/pm24xx.c linux-2.6.35.4/arch/arm/mach-omap2/pm24xx.c +--- linux-2.6.35.4/arch/arm/mach-omap2/pm24xx.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/arm/mach-omap2/pm24xx.c 2010-09-17 20:12:09.000000000 -0400 +@@ -325,7 +325,7 @@ static void omap2_pm_finish(void) enable_hlt(); } @@ -568,10 +420,10 @@ diff -urNp linux-2.6.34.1/arch/arm/mach-omap2/pm24xx.c linux-2.6.34.1/arch/arm/m .prepare = omap2_pm_prepare, .enter = omap2_pm_enter, .finish = omap2_pm_finish, -diff -urNp linux-2.6.34.1/arch/arm/mach-omap2/pm34xx.c linux-2.6.34.1/arch/arm/mach-omap2/pm34xx.c ---- linux-2.6.34.1/arch/arm/mach-omap2/pm34xx.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/arm/mach-omap2/pm34xx.c 2010-07-07 09:04:42.000000000 -0400 -@@ -651,7 +651,7 @@ static void omap3_pm_end(void) +diff -urNp linux-2.6.35.4/arch/arm/mach-omap2/pm34xx.c linux-2.6.35.4/arch/arm/mach-omap2/pm34xx.c +--- linux-2.6.35.4/arch/arm/mach-omap2/pm34xx.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/arm/mach-omap2/pm34xx.c 2010-09-17 20:12:09.000000000 -0400 +@@ -669,7 +669,7 @@ static void omap3_pm_end(void) return; } @@ -580,9 +432,9 @@ diff -urNp linux-2.6.34.1/arch/arm/mach-omap2/pm34xx.c linux-2.6.34.1/arch/arm/m .begin = omap3_pm_begin, .end = omap3_pm_end, .prepare = omap3_pm_prepare, -diff -urNp linux-2.6.34.1/arch/arm/mach-pnx4008/pm.c linux-2.6.34.1/arch/arm/mach-pnx4008/pm.c ---- linux-2.6.34.1/arch/arm/mach-pnx4008/pm.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/arm/mach-pnx4008/pm.c 2010-07-07 09:04:42.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/arm/mach-pnx4008/pm.c linux-2.6.35.4/arch/arm/mach-pnx4008/pm.c +--- linux-2.6.35.4/arch/arm/mach-pnx4008/pm.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/arm/mach-pnx4008/pm.c 2010-09-17 20:12:09.000000000 -0400 @@ -119,7 +119,7 @@ static int pnx4008_pm_valid(suspend_stat (state == PM_SUSPEND_MEM); } @@ -592,9 +444,9 @@ diff -urNp linux-2.6.34.1/arch/arm/mach-pnx4008/pm.c linux-2.6.34.1/arch/arm/mac .enter = pnx4008_pm_enter, .valid = pnx4008_pm_valid, }; -diff -urNp linux-2.6.34.1/arch/arm/mach-pxa/pm.c linux-2.6.34.1/arch/arm/mach-pxa/pm.c ---- linux-2.6.34.1/arch/arm/mach-pxa/pm.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/arm/mach-pxa/pm.c 2010-07-07 09:04:42.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/arm/mach-pxa/pm.c linux-2.6.35.4/arch/arm/mach-pxa/pm.c +--- linux-2.6.35.4/arch/arm/mach-pxa/pm.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/arm/mach-pxa/pm.c 2010-09-17 20:12:09.000000000 -0400 @@ -96,7 +96,7 @@ void pxa_pm_finish(void) pxa_cpu_pm_fns->finish(); } @@ -604,10 +456,10 @@ diff -urNp linux-2.6.34.1/arch/arm/mach-pxa/pm.c linux-2.6.34.1/arch/arm/mach-px .valid = pxa_pm_valid, .enter = pxa_pm_enter, .prepare = pxa_pm_prepare, -diff -urNp linux-2.6.34.1/arch/arm/mach-pxa/sharpsl_pm.c linux-2.6.34.1/arch/arm/mach-pxa/sharpsl_pm.c ---- linux-2.6.34.1/arch/arm/mach-pxa/sharpsl_pm.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/arm/mach-pxa/sharpsl_pm.c 2010-07-07 09:04:42.000000000 -0400 -@@ -892,7 +892,7 @@ static void sharpsl_apm_get_power_status +diff -urNp linux-2.6.35.4/arch/arm/mach-pxa/sharpsl_pm.c linux-2.6.35.4/arch/arm/mach-pxa/sharpsl_pm.c +--- linux-2.6.35.4/arch/arm/mach-pxa/sharpsl_pm.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/arm/mach-pxa/sharpsl_pm.c 2010-09-17 20:12:09.000000000 -0400 +@@ -891,7 +891,7 @@ static void sharpsl_apm_get_power_status } #ifdef CONFIG_PM @@ -616,9 +468,9 @@ diff -urNp linux-2.6.34.1/arch/arm/mach-pxa/sharpsl_pm.c linux-2.6.34.1/arch/arm .prepare = pxa_pm_prepare, .finish = pxa_pm_finish, .enter = corgi_pxa_pm_enter, -diff -urNp linux-2.6.34.1/arch/arm/mach-sa1100/pm.c linux-2.6.34.1/arch/arm/mach-sa1100/pm.c ---- linux-2.6.34.1/arch/arm/mach-sa1100/pm.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/arm/mach-sa1100/pm.c 2010-07-07 09:04:42.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/arm/mach-sa1100/pm.c linux-2.6.35.4/arch/arm/mach-sa1100/pm.c +--- linux-2.6.35.4/arch/arm/mach-sa1100/pm.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/arm/mach-sa1100/pm.c 2010-09-17 20:12:09.000000000 -0400 @@ -120,7 +120,7 @@ unsigned long sleep_phys_sp(void *sp) return virt_to_phys(sp); } @@ -628,9 +480,9 @@ diff -urNp linux-2.6.34.1/arch/arm/mach-sa1100/pm.c linux-2.6.34.1/arch/arm/mach .enter = sa11x0_pm_enter, .valid = suspend_valid_only_mem, }; -diff -urNp linux-2.6.34.1/arch/arm/mm/fault.c linux-2.6.34.1/arch/arm/mm/fault.c ---- linux-2.6.34.1/arch/arm/mm/fault.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/arm/mm/fault.c 2010-07-07 09:04:42.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/arm/mm/fault.c linux-2.6.35.4/arch/arm/mm/fault.c +--- linux-2.6.35.4/arch/arm/mm/fault.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/arm/mm/fault.c 2010-09-17 20:12:09.000000000 -0400 @@ -167,6 +167,13 @@ __do_user_fault(struct task_struct *tsk, } #endif @@ -679,9 +531,9 @@ diff -urNp linux-2.6.34.1/arch/arm/mm/fault.c linux-2.6.34.1/arch/arm/mm/fault.c /* * First Level Translation Fault Handler * -diff -urNp linux-2.6.34.1/arch/arm/mm/mmap.c linux-2.6.34.1/arch/arm/mm/mmap.c ---- linux-2.6.34.1/arch/arm/mm/mmap.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/arm/mm/mmap.c 2010-07-07 09:04:42.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/arm/mm/mmap.c linux-2.6.35.4/arch/arm/mm/mmap.c +--- linux-2.6.35.4/arch/arm/mm/mmap.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/arm/mm/mmap.c 2010-09-17 20:12:09.000000000 -0400 @@ -63,6 +63,10 @@ arch_get_unmapped_area(struct file *filp if (len > TASK_SIZE) return -ENOMEM; @@ -693,7 +545,13 @@ diff -urNp linux-2.6.34.1/arch/arm/mm/mmap.c linux-2.6.34.1/arch/arm/mm/mmap.c if (addr) { if (do_align) addr = COLOUR_ALIGN(addr, pgoff); -@@ -75,10 +79,10 @@ arch_get_unmapped_area(struct file *filp +@@ -70,15 +74,14 @@ arch_get_unmapped_area(struct file *filp + addr = PAGE_ALIGN(addr); + + vma = find_vma(mm, addr); +- if (TASK_SIZE - len >= addr && +- (!vma || addr + len <= vma->vm_start)) ++ if (TASK_SIZE - len >= addr && check_heap_stack_gap(vma, addr, len)) return addr; } if (len > mm->cached_hole_size) { @@ -707,7 +565,7 @@ diff -urNp linux-2.6.34.1/arch/arm/mm/mmap.c linux-2.6.34.1/arch/arm/mm/mmap.c } full_search: -@@ -94,8 +98,8 @@ full_search: +@@ -94,14 +97,14 @@ full_search: * Start a new search - just in case we missed * some holes. */ @@ -718,9 +576,16 @@ diff -urNp linux-2.6.34.1/arch/arm/mm/mmap.c linux-2.6.34.1/arch/arm/mm/mmap.c mm->cached_hole_size = 0; goto full_search; } -diff -urNp linux-2.6.34.1/arch/arm/plat-samsung/pm.c linux-2.6.34.1/arch/arm/plat-samsung/pm.c ---- linux-2.6.34.1/arch/arm/plat-samsung/pm.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/arm/plat-samsung/pm.c 2010-07-07 09:04:42.000000000 -0400 + return -ENOMEM; + } +- if (!vma || addr + len <= vma->vm_start) { ++ if (check_heap_stack_gap(vma, addr, len)) { + /* + * Remember the place where we stopped the search: + */ +diff -urNp linux-2.6.35.4/arch/arm/plat-samsung/pm.c linux-2.6.35.4/arch/arm/plat-samsung/pm.c +--- linux-2.6.35.4/arch/arm/plat-samsung/pm.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/arm/plat-samsung/pm.c 2010-09-17 20:12:09.000000000 -0400 @@ -355,7 +355,7 @@ static void s3c_pm_finish(void) s3c_pm_check_cleanup(); } @@ -730,9 +595,9 @@ diff -urNp linux-2.6.34.1/arch/arm/plat-samsung/pm.c linux-2.6.34.1/arch/arm/pla .enter = s3c_pm_enter, .prepare = s3c_pm_prepare, .finish = s3c_pm_finish, -diff -urNp linux-2.6.34.1/arch/avr32/include/asm/elf.h linux-2.6.34.1/arch/avr32/include/asm/elf.h ---- linux-2.6.34.1/arch/avr32/include/asm/elf.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/avr32/include/asm/elf.h 2010-07-07 09:04:42.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/avr32/include/asm/elf.h linux-2.6.35.4/arch/avr32/include/asm/elf.h +--- linux-2.6.35.4/arch/avr32/include/asm/elf.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/avr32/include/asm/elf.h 2010-09-17 20:12:09.000000000 -0400 @@ -84,8 +84,14 @@ typedef struct user_fpu_struct elf_fpreg the loader. We need to make sure that it is out of the way of the program that it will "exec", and that there is sufficient room for the brk. */ @@ -749,9 +614,9 @@ diff -urNp linux-2.6.34.1/arch/avr32/include/asm/elf.h linux-2.6.34.1/arch/avr32 /* This yields a mask that user programs can use to figure out what instruction set this CPU supports. This could be done in user space, -diff -urNp linux-2.6.34.1/arch/avr32/include/asm/kmap_types.h linux-2.6.34.1/arch/avr32/include/asm/kmap_types.h ---- linux-2.6.34.1/arch/avr32/include/asm/kmap_types.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/avr32/include/asm/kmap_types.h 2010-07-07 09:04:42.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/avr32/include/asm/kmap_types.h linux-2.6.35.4/arch/avr32/include/asm/kmap_types.h +--- linux-2.6.35.4/arch/avr32/include/asm/kmap_types.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/avr32/include/asm/kmap_types.h 2010-09-17 20:12:09.000000000 -0400 @@ -22,7 +22,8 @@ D(10) KM_IRQ0, D(11) KM_IRQ1, D(12) KM_SOFTIRQ0, @@ -762,9 +627,9 @@ diff -urNp linux-2.6.34.1/arch/avr32/include/asm/kmap_types.h linux-2.6.34.1/arc }; #undef D -diff -urNp linux-2.6.34.1/arch/avr32/mach-at32ap/pm.c linux-2.6.34.1/arch/avr32/mach-at32ap/pm.c ---- linux-2.6.34.1/arch/avr32/mach-at32ap/pm.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/avr32/mach-at32ap/pm.c 2010-07-07 09:04:42.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/avr32/mach-at32ap/pm.c linux-2.6.35.4/arch/avr32/mach-at32ap/pm.c +--- linux-2.6.35.4/arch/avr32/mach-at32ap/pm.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/avr32/mach-at32ap/pm.c 2010-09-17 20:12:09.000000000 -0400 @@ -176,7 +176,7 @@ out: return 0; } @@ -774,9 +639,9 @@ diff -urNp linux-2.6.34.1/arch/avr32/mach-at32ap/pm.c linux-2.6.34.1/arch/avr32/ .valid = avr32_pm_valid_state, .enter = avr32_pm_enter, }; -diff -urNp linux-2.6.34.1/arch/avr32/mm/fault.c linux-2.6.34.1/arch/avr32/mm/fault.c ---- linux-2.6.34.1/arch/avr32/mm/fault.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/avr32/mm/fault.c 2010-07-07 09:04:42.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/avr32/mm/fault.c linux-2.6.35.4/arch/avr32/mm/fault.c +--- linux-2.6.35.4/arch/avr32/mm/fault.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/avr32/mm/fault.c 2010-09-17 20:12:09.000000000 -0400 @@ -41,6 +41,23 @@ static inline int notify_page_fault(stru int exception_trace = 1; @@ -818,9 +683,9 @@ diff -urNp linux-2.6.34.1/arch/avr32/mm/fault.c linux-2.6.34.1/arch/avr32/mm/fau if (exception_trace && printk_ratelimit()) printk("%s%s[%d]: segfault at %08lx pc %08lx " "sp %08lx ecr %lu\n", -diff -urNp linux-2.6.34.1/arch/blackfin/kernel/kgdb.c linux-2.6.34.1/arch/blackfin/kernel/kgdb.c ---- linux-2.6.34.1/arch/blackfin/kernel/kgdb.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/blackfin/kernel/kgdb.c 2010-07-07 09:04:42.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/blackfin/kernel/kgdb.c linux-2.6.35.4/arch/blackfin/kernel/kgdb.c +--- linux-2.6.35.4/arch/blackfin/kernel/kgdb.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/blackfin/kernel/kgdb.c 2010-09-17 20:12:09.000000000 -0400 @@ -397,7 +397,7 @@ int kgdb_arch_handle_exception(int vecto return -1; /* this means that we do not want to exit from the handler */ } @@ -830,10 +695,10 @@ diff -urNp linux-2.6.34.1/arch/blackfin/kernel/kgdb.c linux-2.6.34.1/arch/blackf .gdb_bpt_instr = {0xa1}, #ifdef CONFIG_SMP .flags = KGDB_HW_BREAKPOINT|KGDB_THR_PROC_SWAP, -diff -urNp linux-2.6.34.1/arch/blackfin/mach-common/pm.c linux-2.6.34.1/arch/blackfin/mach-common/pm.c ---- linux-2.6.34.1/arch/blackfin/mach-common/pm.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/blackfin/mach-common/pm.c 2010-07-07 09:04:42.000000000 -0400 -@@ -256,7 +256,7 @@ static int bfin_pm_enter(suspend_state_t +diff -urNp linux-2.6.35.4/arch/blackfin/mach-common/pm.c linux-2.6.35.4/arch/blackfin/mach-common/pm.c +--- linux-2.6.35.4/arch/blackfin/mach-common/pm.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/blackfin/mach-common/pm.c 2010-09-17 20:12:09.000000000 -0400 +@@ -232,7 +232,7 @@ static int bfin_pm_enter(suspend_state_t return 0; } @@ -842,9 +707,9 @@ diff -urNp linux-2.6.34.1/arch/blackfin/mach-common/pm.c linux-2.6.34.1/arch/bla .enter = bfin_pm_enter, .valid = bfin_pm_valid, }; -diff -urNp linux-2.6.34.1/arch/blackfin/mm/maccess.c linux-2.6.34.1/arch/blackfin/mm/maccess.c ---- linux-2.6.34.1/arch/blackfin/mm/maccess.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/blackfin/mm/maccess.c 2010-07-07 09:04:42.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/blackfin/mm/maccess.c linux-2.6.35.4/arch/blackfin/mm/maccess.c +--- linux-2.6.35.4/arch/blackfin/mm/maccess.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/blackfin/mm/maccess.c 2010-09-17 20:12:09.000000000 -0400 @@ -16,7 +16,7 @@ static int validate_memory_access_addres return bfin_mem_access_type(addr, size); } @@ -863,9 +728,9 @@ diff -urNp linux-2.6.34.1/arch/blackfin/mm/maccess.c linux-2.6.34.1/arch/blackfi { unsigned long ldst = (unsigned long)dst; int mem_type; -diff -urNp linux-2.6.34.1/arch/frv/include/asm/kmap_types.h linux-2.6.34.1/arch/frv/include/asm/kmap_types.h ---- linux-2.6.34.1/arch/frv/include/asm/kmap_types.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/frv/include/asm/kmap_types.h 2010-07-07 09:04:42.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/frv/include/asm/kmap_types.h linux-2.6.35.4/arch/frv/include/asm/kmap_types.h +--- linux-2.6.35.4/arch/frv/include/asm/kmap_types.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/frv/include/asm/kmap_types.h 2010-09-17 20:12:09.000000000 -0400 @@ -23,6 +23,7 @@ enum km_type { KM_IRQ1, KM_SOFTIRQ0, @@ -874,9 +739,40 @@ diff -urNp linux-2.6.34.1/arch/frv/include/asm/kmap_types.h linux-2.6.34.1/arch/ KM_TYPE_NR }; -diff -urNp linux-2.6.34.1/arch/ia64/hp/common/hwsw_iommu.c linux-2.6.34.1/arch/ia64/hp/common/hwsw_iommu.c ---- linux-2.6.34.1/arch/ia64/hp/common/hwsw_iommu.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/ia64/hp/common/hwsw_iommu.c 2010-07-07 09:04:42.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/frv/mm/elf-fdpic.c linux-2.6.35.4/arch/frv/mm/elf-fdpic.c +--- linux-2.6.35.4/arch/frv/mm/elf-fdpic.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/frv/mm/elf-fdpic.c 2010-09-17 20:12:09.000000000 -0400 +@@ -73,8 +73,7 @@ unsigned long arch_get_unmapped_area(str + if (addr) { + addr = PAGE_ALIGN(addr); + vma = find_vma(current->mm, addr); +- if (TASK_SIZE - len >= addr && +- (!vma || addr + len <= vma->vm_start)) ++ if (TASK_SIZE - len >= addr && check_heap_stack_gap(vma, addr, len)) + goto success; + } + +@@ -89,7 +88,7 @@ unsigned long arch_get_unmapped_area(str + for (; vma; vma = vma->vm_next) { + if (addr > limit) + break; +- if (addr + len <= vma->vm_start) ++ if (check_heap_stack_gap(vma, addr, len)) + goto success; + addr = vma->vm_end; + } +@@ -104,7 +103,7 @@ unsigned long arch_get_unmapped_area(str + for (; vma; vma = vma->vm_next) { + if (addr > limit) + break; +- if (addr + len <= vma->vm_start) ++ if (check_heap_stack_gap(vma, addr, len)) + goto success; + addr = vma->vm_end; + } +diff -urNp linux-2.6.35.4/arch/ia64/hp/common/hwsw_iommu.c linux-2.6.35.4/arch/ia64/hp/common/hwsw_iommu.c +--- linux-2.6.35.4/arch/ia64/hp/common/hwsw_iommu.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/ia64/hp/common/hwsw_iommu.c 2010-09-17 20:12:09.000000000 -0400 @@ -17,7 +17,7 @@ #include #include @@ -895,9 +791,9 @@ diff -urNp linux-2.6.34.1/arch/ia64/hp/common/hwsw_iommu.c linux-2.6.34.1/arch/i { if (use_swiotlb(dev)) return &swiotlb_dma_ops; -diff -urNp linux-2.6.34.1/arch/ia64/hp/common/sba_iommu.c linux-2.6.34.1/arch/ia64/hp/common/sba_iommu.c ---- linux-2.6.34.1/arch/ia64/hp/common/sba_iommu.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/ia64/hp/common/sba_iommu.c 2010-07-07 09:04:42.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/ia64/hp/common/sba_iommu.c linux-2.6.35.4/arch/ia64/hp/common/sba_iommu.c +--- linux-2.6.35.4/arch/ia64/hp/common/sba_iommu.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/ia64/hp/common/sba_iommu.c 2010-09-17 20:12:09.000000000 -0400 @@ -2097,7 +2097,7 @@ static struct acpi_driver acpi_sba_ioc_d }, }; @@ -916,9 +812,21 @@ diff -urNp linux-2.6.34.1/arch/ia64/hp/common/sba_iommu.c linux-2.6.34.1/arch/ia .alloc_coherent = sba_alloc_coherent, .free_coherent = sba_free_coherent, .map_page = sba_map_page, -diff -urNp linux-2.6.34.1/arch/ia64/include/asm/dma-mapping.h linux-2.6.34.1/arch/ia64/include/asm/dma-mapping.h ---- linux-2.6.34.1/arch/ia64/include/asm/dma-mapping.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/ia64/include/asm/dma-mapping.h 2010-07-07 09:04:42.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/ia64/include/asm/compat.h linux-2.6.35.4/arch/ia64/include/asm/compat.h +--- linux-2.6.35.4/arch/ia64/include/asm/compat.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/ia64/include/asm/compat.h 2010-09-17 20:12:37.000000000 -0400 +@@ -199,7 +199,7 @@ ptr_to_compat(void __user *uptr) + } + + static __inline__ void __user * +-compat_alloc_user_space (long len) ++arch_compat_alloc_user_space (long len) + { + struct pt_regs *regs = task_pt_regs(current); + return (void __user *) (((regs->r12 & 0xffffffff) & -16) - len); +diff -urNp linux-2.6.35.4/arch/ia64/include/asm/dma-mapping.h linux-2.6.35.4/arch/ia64/include/asm/dma-mapping.h +--- linux-2.6.35.4/arch/ia64/include/asm/dma-mapping.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/ia64/include/asm/dma-mapping.h 2010-09-17 20:12:09.000000000 -0400 @@ -12,7 +12,7 @@ #define ARCH_HAS_DMA_GET_REQUIRED_MASK @@ -962,9 +870,9 @@ diff -urNp linux-2.6.34.1/arch/ia64/include/asm/dma-mapping.h linux-2.6.34.1/arc return ops->dma_supported(dev, mask); } -diff -urNp linux-2.6.34.1/arch/ia64/include/asm/elf.h linux-2.6.34.1/arch/ia64/include/asm/elf.h ---- linux-2.6.34.1/arch/ia64/include/asm/elf.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/ia64/include/asm/elf.h 2010-07-07 09:04:42.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/ia64/include/asm/elf.h linux-2.6.35.4/arch/ia64/include/asm/elf.h +--- linux-2.6.35.4/arch/ia64/include/asm/elf.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/ia64/include/asm/elf.h 2010-09-17 20:12:09.000000000 -0400 @@ -42,6 +42,13 @@ */ #define ELF_ET_DYN_BASE (TASK_UNMAPPED_BASE + 0x800000000UL) @@ -979,9 +887,9 @@ diff -urNp linux-2.6.34.1/arch/ia64/include/asm/elf.h linux-2.6.34.1/arch/ia64/i #define PT_IA_64_UNWIND 0x70000001 /* IA-64 relocations: */ -diff -urNp linux-2.6.34.1/arch/ia64/include/asm/machvec.h linux-2.6.34.1/arch/ia64/include/asm/machvec.h ---- linux-2.6.34.1/arch/ia64/include/asm/machvec.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/ia64/include/asm/machvec.h 2010-07-07 09:04:42.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/ia64/include/asm/machvec.h linux-2.6.35.4/arch/ia64/include/asm/machvec.h +--- linux-2.6.35.4/arch/ia64/include/asm/machvec.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/ia64/include/asm/machvec.h 2010-09-17 20:12:09.000000000 -0400 @@ -45,7 +45,7 @@ typedef void ia64_mv_kernel_launch_event /* DMA-mapping interface: */ typedef void ia64_mv_dma_init (void); @@ -1000,9 +908,18 @@ diff -urNp linux-2.6.34.1/arch/ia64/include/asm/machvec.h linux-2.6.34.1/arch/ia /* * Define default versions so we can extend machvec for new platforms without having -diff -urNp linux-2.6.34.1/arch/ia64/include/asm/pgtable.h linux-2.6.34.1/arch/ia64/include/asm/pgtable.h ---- linux-2.6.34.1/arch/ia64/include/asm/pgtable.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/ia64/include/asm/pgtable.h 2010-07-07 09:04:42.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/ia64/include/asm/pgtable.h linux-2.6.35.4/arch/ia64/include/asm/pgtable.h +--- linux-2.6.35.4/arch/ia64/include/asm/pgtable.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/ia64/include/asm/pgtable.h 2010-09-17 20:12:09.000000000 -0400 +@@ -12,7 +12,7 @@ + * David Mosberger-Tang + */ + +- ++#include + #include + #include + #include @@ -143,6 +143,17 @@ #define PAGE_READONLY __pgprot(__ACCESS_BITS | _PAGE_PL_3 | _PAGE_AR_R) #define PAGE_COPY __pgprot(__ACCESS_BITS | _PAGE_PL_3 | _PAGE_AR_R) @@ -1021,9 +938,9 @@ diff -urNp linux-2.6.34.1/arch/ia64/include/asm/pgtable.h linux-2.6.34.1/arch/ia #define PAGE_GATE __pgprot(__ACCESS_BITS | _PAGE_PL_0 | _PAGE_AR_X_RX) #define PAGE_KERNEL __pgprot(__DIRTY_BITS | _PAGE_PL_0 | _PAGE_AR_RWX) #define PAGE_KERNELRX __pgprot(__ACCESS_BITS | _PAGE_PL_0 | _PAGE_AR_RX) -diff -urNp linux-2.6.34.1/arch/ia64/include/asm/uaccess.h linux-2.6.34.1/arch/ia64/include/asm/uaccess.h ---- linux-2.6.34.1/arch/ia64/include/asm/uaccess.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/ia64/include/asm/uaccess.h 2010-07-07 09:04:42.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/ia64/include/asm/uaccess.h linux-2.6.35.4/arch/ia64/include/asm/uaccess.h +--- linux-2.6.35.4/arch/ia64/include/asm/uaccess.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/ia64/include/asm/uaccess.h 2010-09-17 20:12:09.000000000 -0400 @@ -257,7 +257,7 @@ __copy_from_user (void *to, const void _ const void *__cu_from = (from); \ long __cu_len = (n); \ @@ -1042,9 +959,9 @@ diff -urNp linux-2.6.34.1/arch/ia64/include/asm/uaccess.h linux-2.6.34.1/arch/ia __cu_len = __copy_user((__force void __user *) __cu_to, __cu_from, __cu_len); \ __cu_len; \ }) -diff -urNp linux-2.6.34.1/arch/ia64/kernel/dma-mapping.c linux-2.6.34.1/arch/ia64/kernel/dma-mapping.c ---- linux-2.6.34.1/arch/ia64/kernel/dma-mapping.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/ia64/kernel/dma-mapping.c 2010-07-07 09:04:42.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/ia64/kernel/dma-mapping.c linux-2.6.35.4/arch/ia64/kernel/dma-mapping.c +--- linux-2.6.35.4/arch/ia64/kernel/dma-mapping.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/ia64/kernel/dma-mapping.c 2010-09-17 20:12:09.000000000 -0400 @@ -3,7 +3,7 @@ /* Set this to 1 if there is a HW IOMMU in the system */ int iommu_detected __read_mostly; @@ -1063,9 +980,9 @@ diff -urNp linux-2.6.34.1/arch/ia64/kernel/dma-mapping.c linux-2.6.34.1/arch/ia6 { return dma_ops; } -diff -urNp linux-2.6.34.1/arch/ia64/kernel/module.c linux-2.6.34.1/arch/ia64/kernel/module.c ---- linux-2.6.34.1/arch/ia64/kernel/module.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/ia64/kernel/module.c 2010-07-07 09:04:42.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/ia64/kernel/module.c linux-2.6.35.4/arch/ia64/kernel/module.c +--- linux-2.6.35.4/arch/ia64/kernel/module.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/ia64/kernel/module.c 2010-09-17 20:12:09.000000000 -0400 @@ -315,8 +315,7 @@ module_alloc (unsigned long size) void module_free (struct module *mod, void *module_region) @@ -1154,9 +1071,9 @@ diff -urNp linux-2.6.34.1/arch/ia64/kernel/module.c linux-2.6.34.1/arch/ia64/ker mod->arch.gp = gp; DEBUGP("%s: placing gp at 0x%lx\n", __func__, gp); } -diff -urNp linux-2.6.34.1/arch/ia64/kernel/pci-dma.c linux-2.6.34.1/arch/ia64/kernel/pci-dma.c ---- linux-2.6.34.1/arch/ia64/kernel/pci-dma.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/ia64/kernel/pci-dma.c 2010-07-07 09:04:42.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/ia64/kernel/pci-dma.c linux-2.6.35.4/arch/ia64/kernel/pci-dma.c +--- linux-2.6.35.4/arch/ia64/kernel/pci-dma.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/ia64/kernel/pci-dma.c 2010-09-17 20:12:09.000000000 -0400 @@ -43,7 +43,7 @@ struct device fallback_dev = { .dma_mask = &fallback_dev.coherent_dma_mask, }; @@ -1166,9 +1083,9 @@ diff -urNp linux-2.6.34.1/arch/ia64/kernel/pci-dma.c linux-2.6.34.1/arch/ia64/ke static int __init pci_iommu_init(void) { -diff -urNp linux-2.6.34.1/arch/ia64/kernel/pci-swiotlb.c linux-2.6.34.1/arch/ia64/kernel/pci-swiotlb.c ---- linux-2.6.34.1/arch/ia64/kernel/pci-swiotlb.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/ia64/kernel/pci-swiotlb.c 2010-07-07 09:04:42.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/ia64/kernel/pci-swiotlb.c linux-2.6.35.4/arch/ia64/kernel/pci-swiotlb.c +--- linux-2.6.35.4/arch/ia64/kernel/pci-swiotlb.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/ia64/kernel/pci-swiotlb.c 2010-09-17 20:12:09.000000000 -0400 @@ -22,7 +22,7 @@ static void *ia64_swiotlb_alloc_coherent return swiotlb_alloc_coherent(dev, size, dma_handle, gfp); } @@ -1178,9 +1095,9 @@ diff -urNp linux-2.6.34.1/arch/ia64/kernel/pci-swiotlb.c linux-2.6.34.1/arch/ia6 .alloc_coherent = ia64_swiotlb_alloc_coherent, .free_coherent = swiotlb_free_coherent, .map_page = swiotlb_map_page, -diff -urNp linux-2.6.34.1/arch/ia64/kernel/sys_ia64.c linux-2.6.34.1/arch/ia64/kernel/sys_ia64.c ---- linux-2.6.34.1/arch/ia64/kernel/sys_ia64.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/ia64/kernel/sys_ia64.c 2010-07-07 09:04:42.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/ia64/kernel/sys_ia64.c linux-2.6.35.4/arch/ia64/kernel/sys_ia64.c +--- linux-2.6.35.4/arch/ia64/kernel/sys_ia64.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/ia64/kernel/sys_ia64.c 2010-09-17 20:12:09.000000000 -0400 @@ -43,6 +43,13 @@ arch_get_unmapped_area (struct file *fil if (REGION_NUMBER(addr) == RGN_HPAGE) addr = 0; @@ -1195,7 +1112,7 @@ diff -urNp linux-2.6.34.1/arch/ia64/kernel/sys_ia64.c linux-2.6.34.1/arch/ia64/k if (!addr) addr = mm->free_area_cache; -@@ -61,9 +68,9 @@ arch_get_unmapped_area (struct file *fil +@@ -61,14 +68,14 @@ arch_get_unmapped_area (struct file *fil for (vma = find_vma(mm, addr); ; vma = vma->vm_next) { /* At this point: (!vma || addr < vma->vm_end). */ if (TASK_SIZE - len < addr || RGN_MAP_LIMIT - len < REGION_OFFSET(addr)) { @@ -1207,9 +1124,15 @@ diff -urNp linux-2.6.34.1/arch/ia64/kernel/sys_ia64.c linux-2.6.34.1/arch/ia64/k goto full_search; } return -ENOMEM; -diff -urNp linux-2.6.34.1/arch/ia64/kernel/vmlinux.lds.S linux-2.6.34.1/arch/ia64/kernel/vmlinux.lds.S ---- linux-2.6.34.1/arch/ia64/kernel/vmlinux.lds.S 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/ia64/kernel/vmlinux.lds.S 2010-07-07 09:04:42.000000000 -0400 + } +- if (!vma || addr + len <= vma->vm_start) { ++ if (check_heap_stack_gap(vma, addr, len)) { + /* Remember the address where we stopped this search: */ + mm->free_area_cache = addr + len; + return addr; +diff -urNp linux-2.6.35.4/arch/ia64/kernel/vmlinux.lds.S linux-2.6.35.4/arch/ia64/kernel/vmlinux.lds.S +--- linux-2.6.35.4/arch/ia64/kernel/vmlinux.lds.S 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/ia64/kernel/vmlinux.lds.S 2010-09-17 20:12:09.000000000 -0400 @@ -196,7 +196,7 @@ SECTIONS /* Per-cpu data: */ . = ALIGN(PERCPU_PAGE_SIZE); @@ -1219,9 +1142,9 @@ diff -urNp linux-2.6.34.1/arch/ia64/kernel/vmlinux.lds.S linux-2.6.34.1/arch/ia6 . = __phys_per_cpu_start + PERCPU_PAGE_SIZE; /* ensure percpu data fits * into percpu page size */ -diff -urNp linux-2.6.34.1/arch/ia64/mm/fault.c linux-2.6.34.1/arch/ia64/mm/fault.c ---- linux-2.6.34.1/arch/ia64/mm/fault.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/ia64/mm/fault.c 2010-07-07 09:04:42.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/ia64/mm/fault.c linux-2.6.35.4/arch/ia64/mm/fault.c +--- linux-2.6.35.4/arch/ia64/mm/fault.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/ia64/mm/fault.c 2010-09-17 20:12:09.000000000 -0400 @@ -72,6 +72,23 @@ mapped_kernel_page_is_present (unsigned return pte_present(pte); } @@ -1268,12 +1191,24 @@ diff -urNp linux-2.6.34.1/arch/ia64/mm/fault.c linux-2.6.34.1/arch/ia64/mm/fault + } + - survive: /* * If for any reason at all we couldn't handle the fault, make -diff -urNp linux-2.6.34.1/arch/ia64/mm/init.c linux-2.6.34.1/arch/ia64/mm/init.c ---- linux-2.6.34.1/arch/ia64/mm/init.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/ia64/mm/init.c 2010-07-07 09:04:42.000000000 -0400 + * sure we exit gracefully rather than endlessly redo the +diff -urNp linux-2.6.35.4/arch/ia64/mm/hugetlbpage.c linux-2.6.35.4/arch/ia64/mm/hugetlbpage.c +--- linux-2.6.35.4/arch/ia64/mm/hugetlbpage.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/ia64/mm/hugetlbpage.c 2010-09-17 20:12:09.000000000 -0400 +@@ -171,7 +171,7 @@ unsigned long hugetlb_get_unmapped_area( + /* At this point: (!vmm || addr < vmm->vm_end). */ + if (REGION_OFFSET(addr) + len > RGN_MAP_LIMIT) + return -ENOMEM; +- if (!vmm || (addr + len) <= vmm->vm_start) ++ if (check_heap_stack_gap(vmm, addr, len)) + return addr; + addr = ALIGN(vmm->vm_end, HPAGE_SIZE); + } +diff -urNp linux-2.6.35.4/arch/ia64/mm/init.c linux-2.6.35.4/arch/ia64/mm/init.c +--- linux-2.6.35.4/arch/ia64/mm/init.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/ia64/mm/init.c 2010-09-17 20:12:09.000000000 -0400 @@ -122,6 +122,19 @@ ia64_init_addr_space (void) vma->vm_start = current->thread.rbs_bot & PAGE_MASK; vma->vm_end = vma->vm_start + PAGE_SIZE; @@ -1294,9 +1229,9 @@ diff -urNp linux-2.6.34.1/arch/ia64/mm/init.c linux-2.6.34.1/arch/ia64/mm/init.c vma->vm_page_prot = vm_get_page_prot(vma->vm_flags); down_write(¤t->mm->mmap_sem); if (insert_vm_struct(current->mm, vma)) { -diff -urNp linux-2.6.34.1/arch/ia64/sn/pci/pci_dma.c linux-2.6.34.1/arch/ia64/sn/pci/pci_dma.c ---- linux-2.6.34.1/arch/ia64/sn/pci/pci_dma.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/ia64/sn/pci/pci_dma.c 2010-07-07 09:04:42.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/ia64/sn/pci/pci_dma.c linux-2.6.35.4/arch/ia64/sn/pci/pci_dma.c +--- linux-2.6.35.4/arch/ia64/sn/pci/pci_dma.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/ia64/sn/pci/pci_dma.c 2010-09-17 20:12:09.000000000 -0400 @@ -465,7 +465,7 @@ int sn_pci_legacy_write(struct pci_bus * return ret; } @@ -1306,9 +1241,9 @@ diff -urNp linux-2.6.34.1/arch/ia64/sn/pci/pci_dma.c linux-2.6.34.1/arch/ia64/sn .alloc_coherent = sn_dma_alloc_coherent, .free_coherent = sn_dma_free_coherent, .map_page = sn_dma_map_page, -diff -urNp linux-2.6.34.1/arch/m32r/lib/usercopy.c linux-2.6.34.1/arch/m32r/lib/usercopy.c ---- linux-2.6.34.1/arch/m32r/lib/usercopy.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/m32r/lib/usercopy.c 2010-07-07 09:04:42.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/m32r/lib/usercopy.c linux-2.6.35.4/arch/m32r/lib/usercopy.c +--- linux-2.6.35.4/arch/m32r/lib/usercopy.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/m32r/lib/usercopy.c 2010-09-17 20:12:09.000000000 -0400 @@ -14,6 +14,9 @@ unsigned long __generic_copy_to_user(void __user *to, const void *from, unsigned long n) @@ -1329,21 +1264,21 @@ diff -urNp linux-2.6.34.1/arch/m32r/lib/usercopy.c linux-2.6.34.1/arch/m32r/lib/ prefetchw(to); if (access_ok(VERIFY_READ, from, n)) __copy_user_zeroing(to,from,n); -diff -urNp linux-2.6.34.1/arch/microblaze/include/asm/device.h linux-2.6.34.1/arch/microblaze/include/asm/device.h ---- linux-2.6.34.1/arch/microblaze/include/asm/device.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/microblaze/include/asm/device.h 2010-07-07 09:04:42.000000000 -0400 -@@ -16,7 +16,7 @@ struct dev_archdata { - struct device_node *of_node; +diff -urNp linux-2.6.35.4/arch/microblaze/include/asm/device.h linux-2.6.35.4/arch/microblaze/include/asm/device.h +--- linux-2.6.35.4/arch/microblaze/include/asm/device.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/microblaze/include/asm/device.h 2010-09-17 20:12:09.000000000 -0400 +@@ -13,7 +13,7 @@ struct device_node; + struct dev_archdata { /* DMA operations on that device */ - struct dma_map_ops *dma_ops; + const struct dma_map_ops *dma_ops; void *dma_data; }; -diff -urNp linux-2.6.34.1/arch/microblaze/include/asm/dma-mapping.h linux-2.6.34.1/arch/microblaze/include/asm/dma-mapping.h ---- linux-2.6.34.1/arch/microblaze/include/asm/dma-mapping.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/microblaze/include/asm/dma-mapping.h 2010-07-07 09:04:42.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/microblaze/include/asm/dma-mapping.h linux-2.6.35.4/arch/microblaze/include/asm/dma-mapping.h +--- linux-2.6.35.4/arch/microblaze/include/asm/dma-mapping.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/microblaze/include/asm/dma-mapping.h 2010-09-17 20:12:09.000000000 -0400 @@ -43,14 +43,14 @@ static inline unsigned long device_to_ma return 0xfffffffful; } @@ -1415,9 +1350,9 @@ diff -urNp linux-2.6.34.1/arch/microblaze/include/asm/dma-mapping.h linux-2.6.34 BUG_ON(!ops); debug_dma_free_coherent(dev, size, cpu_addr, dma_handle); -diff -urNp linux-2.6.34.1/arch/microblaze/include/asm/pci.h linux-2.6.34.1/arch/microblaze/include/asm/pci.h ---- linux-2.6.34.1/arch/microblaze/include/asm/pci.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/microblaze/include/asm/pci.h 2010-07-07 09:04:42.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/microblaze/include/asm/pci.h linux-2.6.35.4/arch/microblaze/include/asm/pci.h +--- linux-2.6.35.4/arch/microblaze/include/asm/pci.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/microblaze/include/asm/pci.h 2010-09-17 20:12:09.000000000 -0400 @@ -54,8 +54,8 @@ static inline void pcibios_penalize_isa_ } @@ -1429,10 +1364,10 @@ diff -urNp linux-2.6.34.1/arch/microblaze/include/asm/pci.h linux-2.6.34.1/arch/ #else /* CONFIG_PCI */ #define set_pci_dma_ops(d) #define get_pci_dma_ops() NULL -diff -urNp linux-2.6.34.1/arch/microblaze/kernel/dma.c linux-2.6.34.1/arch/microblaze/kernel/dma.c ---- linux-2.6.34.1/arch/microblaze/kernel/dma.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/microblaze/kernel/dma.c 2010-07-07 09:04:42.000000000 -0400 -@@ -134,7 +134,7 @@ static inline void dma_direct_unmap_page +diff -urNp linux-2.6.35.4/arch/microblaze/kernel/dma.c linux-2.6.35.4/arch/microblaze/kernel/dma.c +--- linux-2.6.35.4/arch/microblaze/kernel/dma.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/microblaze/kernel/dma.c 2010-09-17 20:12:09.000000000 -0400 +@@ -133,7 +133,7 @@ static inline void dma_direct_unmap_page __dma_sync_page(dma_address, 0 , size, direction); } @@ -1441,9 +1376,9 @@ diff -urNp linux-2.6.34.1/arch/microblaze/kernel/dma.c linux-2.6.34.1/arch/micro .alloc_coherent = dma_direct_alloc_coherent, .free_coherent = dma_direct_free_coherent, .map_sg = dma_direct_map_sg, -diff -urNp linux-2.6.34.1/arch/microblaze/pci/pci-common.c linux-2.6.34.1/arch/microblaze/pci/pci-common.c ---- linux-2.6.34.1/arch/microblaze/pci/pci-common.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/microblaze/pci/pci-common.c 2010-07-07 09:04:42.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/microblaze/pci/pci-common.c linux-2.6.35.4/arch/microblaze/pci/pci-common.c +--- linux-2.6.35.4/arch/microblaze/pci/pci-common.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/microblaze/pci/pci-common.c 2010-09-17 20:12:09.000000000 -0400 @@ -46,14 +46,14 @@ resource_size_t isa_mem_base; /* Default PCI flags is 0 on ppc32, modified at boot on ppc64 */ unsigned int pci_flags; @@ -1462,9 +1397,9 @@ diff -urNp linux-2.6.34.1/arch/microblaze/pci/pci-common.c linux-2.6.34.1/arch/m { return pci_dma_ops; } -diff -urNp linux-2.6.34.1/arch/mips/alchemy/devboards/pm.c linux-2.6.34.1/arch/mips/alchemy/devboards/pm.c ---- linux-2.6.34.1/arch/mips/alchemy/devboards/pm.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/mips/alchemy/devboards/pm.c 2010-07-07 09:04:42.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/mips/alchemy/devboards/pm.c linux-2.6.35.4/arch/mips/alchemy/devboards/pm.c +--- linux-2.6.35.4/arch/mips/alchemy/devboards/pm.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/mips/alchemy/devboards/pm.c 2010-09-17 20:12:09.000000000 -0400 @@ -110,7 +110,7 @@ static void db1x_pm_end(void) } @@ -1474,9 +1409,21 @@ diff -urNp linux-2.6.34.1/arch/mips/alchemy/devboards/pm.c linux-2.6.34.1/arch/m .valid = suspend_valid_only_mem, .begin = db1x_pm_begin, .enter = db1x_pm_enter, -diff -urNp linux-2.6.34.1/arch/mips/include/asm/elf.h linux-2.6.34.1/arch/mips/include/asm/elf.h ---- linux-2.6.34.1/arch/mips/include/asm/elf.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/mips/include/asm/elf.h 2010-07-07 09:04:42.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/mips/include/asm/compat.h linux-2.6.35.4/arch/mips/include/asm/compat.h +--- linux-2.6.35.4/arch/mips/include/asm/compat.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/mips/include/asm/compat.h 2010-09-17 20:12:37.000000000 -0400 +@@ -145,7 +145,7 @@ static inline compat_uptr_t ptr_to_compa + return (u32)(unsigned long)uptr; + } + +-static inline void __user *compat_alloc_user_space(long len) ++static inline void __user *arch_compat_alloc_user_space(long len) + { + struct pt_regs *regs = (struct pt_regs *) + ((unsigned long) current_thread_info() + THREAD_SIZE - 32) - 1; +diff -urNp linux-2.6.35.4/arch/mips/include/asm/elf.h linux-2.6.35.4/arch/mips/include/asm/elf.h +--- linux-2.6.35.4/arch/mips/include/asm/elf.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/mips/include/asm/elf.h 2010-09-17 20:12:09.000000000 -0400 @@ -368,6 +368,13 @@ extern const char *__elf_platform; #define ELF_ET_DYN_BASE (TASK_SIZE / 3 * 2) #endif @@ -1491,9 +1438,9 @@ diff -urNp linux-2.6.34.1/arch/mips/include/asm/elf.h linux-2.6.34.1/arch/mips/i #define ARCH_HAS_SETUP_ADDITIONAL_PAGES 1 struct linux_binprm; extern int arch_setup_additional_pages(struct linux_binprm *bprm, -diff -urNp linux-2.6.34.1/arch/mips/include/asm/page.h linux-2.6.34.1/arch/mips/include/asm/page.h ---- linux-2.6.34.1/arch/mips/include/asm/page.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/mips/include/asm/page.h 2010-07-07 09:04:42.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/mips/include/asm/page.h linux-2.6.35.4/arch/mips/include/asm/page.h +--- linux-2.6.35.4/arch/mips/include/asm/page.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/mips/include/asm/page.h 2010-09-17 20:12:09.000000000 -0400 @@ -93,7 +93,7 @@ extern void copy_user_highpage(struct pa #ifdef CONFIG_CPU_MIPS32 typedef struct { unsigned long pte_low, pte_high; } pte_t; @@ -1503,9 +1450,9 @@ diff -urNp linux-2.6.34.1/arch/mips/include/asm/page.h linux-2.6.34.1/arch/mips/ #else typedef struct { unsigned long long pte; } pte_t; #define pte_val(x) ((x).pte) -diff -urNp linux-2.6.34.1/arch/mips/include/asm/system.h linux-2.6.34.1/arch/mips/include/asm/system.h ---- linux-2.6.34.1/arch/mips/include/asm/system.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/mips/include/asm/system.h 2010-07-07 09:04:42.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/mips/include/asm/system.h linux-2.6.35.4/arch/mips/include/asm/system.h +--- linux-2.6.35.4/arch/mips/include/asm/system.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/mips/include/asm/system.h 2010-09-17 20:12:09.000000000 -0400 @@ -234,6 +234,6 @@ extern void per_cpu_trap_init(void); */ #define __ARCH_WANT_UNLOCKED_CTXSW @@ -1514,9 +1461,9 @@ diff -urNp linux-2.6.34.1/arch/mips/include/asm/system.h linux-2.6.34.1/arch/mip +#define arch_align_stack(x) ((x) & ALMASK) #endif /* _ASM_SYSTEM_H */ -diff -urNp linux-2.6.34.1/arch/mips/kernel/binfmt_elfn32.c linux-2.6.34.1/arch/mips/kernel/binfmt_elfn32.c ---- linux-2.6.34.1/arch/mips/kernel/binfmt_elfn32.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/mips/kernel/binfmt_elfn32.c 2010-07-07 09:04:42.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/mips/kernel/binfmt_elfn32.c linux-2.6.35.4/arch/mips/kernel/binfmt_elfn32.c +--- linux-2.6.35.4/arch/mips/kernel/binfmt_elfn32.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/mips/kernel/binfmt_elfn32.c 2010-09-17 20:12:09.000000000 -0400 @@ -50,6 +50,13 @@ typedef elf_fpreg_t elf_fpregset_t[ELF_N #undef ELF_ET_DYN_BASE #define ELF_ET_DYN_BASE (TASK32_SIZE / 3 * 2) @@ -1531,9 +1478,9 @@ diff -urNp linux-2.6.34.1/arch/mips/kernel/binfmt_elfn32.c linux-2.6.34.1/arch/m #include #include #include -diff -urNp linux-2.6.34.1/arch/mips/kernel/binfmt_elfo32.c linux-2.6.34.1/arch/mips/kernel/binfmt_elfo32.c ---- linux-2.6.34.1/arch/mips/kernel/binfmt_elfo32.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/mips/kernel/binfmt_elfo32.c 2010-07-07 09:04:42.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/mips/kernel/binfmt_elfo32.c linux-2.6.35.4/arch/mips/kernel/binfmt_elfo32.c +--- linux-2.6.35.4/arch/mips/kernel/binfmt_elfo32.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/mips/kernel/binfmt_elfo32.c 2010-09-17 20:12:09.000000000 -0400 @@ -52,6 +52,13 @@ typedef elf_fpreg_t elf_fpregset_t[ELF_N #undef ELF_ET_DYN_BASE #define ELF_ET_DYN_BASE (TASK32_SIZE / 3 * 2) @@ -1548,10 +1495,10 @@ diff -urNp linux-2.6.34.1/arch/mips/kernel/binfmt_elfo32.c linux-2.6.34.1/arch/m #include /* -diff -urNp linux-2.6.34.1/arch/mips/kernel/kgdb.c linux-2.6.34.1/arch/mips/kernel/kgdb.c ---- linux-2.6.34.1/arch/mips/kernel/kgdb.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/mips/kernel/kgdb.c 2010-07-07 09:04:42.000000000 -0400 -@@ -245,6 +245,7 @@ int kgdb_arch_handle_exception(int vecto +diff -urNp linux-2.6.35.4/arch/mips/kernel/kgdb.c linux-2.6.35.4/arch/mips/kernel/kgdb.c +--- linux-2.6.35.4/arch/mips/kernel/kgdb.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/mips/kernel/kgdb.c 2010-09-17 20:12:09.000000000 -0400 +@@ -270,6 +270,7 @@ int kgdb_arch_handle_exception(int vecto return -1; } @@ -1559,9 +1506,9 @@ diff -urNp linux-2.6.34.1/arch/mips/kernel/kgdb.c linux-2.6.34.1/arch/mips/kerne struct kgdb_arch arch_kgdb_ops; /* -diff -urNp linux-2.6.34.1/arch/mips/kernel/process.c linux-2.6.34.1/arch/mips/kernel/process.c ---- linux-2.6.34.1/arch/mips/kernel/process.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/mips/kernel/process.c 2010-07-07 09:04:42.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/mips/kernel/process.c linux-2.6.35.4/arch/mips/kernel/process.c +--- linux-2.6.35.4/arch/mips/kernel/process.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/mips/kernel/process.c 2010-09-17 20:12:09.000000000 -0400 @@ -474,15 +474,3 @@ unsigned long get_wchan(struct task_stru out: return pc; @@ -1578,10 +1525,10 @@ diff -urNp linux-2.6.34.1/arch/mips/kernel/process.c linux-2.6.34.1/arch/mips/ke - - return sp & ALMASK; -} -diff -urNp linux-2.6.34.1/arch/mips/kernel/syscall.c linux-2.6.34.1/arch/mips/kernel/syscall.c ---- linux-2.6.34.1/arch/mips/kernel/syscall.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/mips/kernel/syscall.c 2010-07-07 09:04:42.000000000 -0400 -@@ -106,6 +106,11 @@ unsigned long arch_get_unmapped_area(str +diff -urNp linux-2.6.35.4/arch/mips/kernel/syscall.c linux-2.6.35.4/arch/mips/kernel/syscall.c +--- linux-2.6.35.4/arch/mips/kernel/syscall.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/mips/kernel/syscall.c 2010-09-17 20:12:09.000000000 -0400 +@@ -106,17 +106,21 @@ unsigned long arch_get_unmapped_area(str do_color_align = 0; if (filp || (flags & MAP_SHARED)) do_color_align = 1; @@ -1593,8 +1540,12 @@ diff -urNp linux-2.6.34.1/arch/mips/kernel/syscall.c linux-2.6.34.1/arch/mips/ke if (addr) { if (do_color_align) addr = COLOUR_ALIGN(addr, pgoff); -@@ -116,7 +121,7 @@ unsigned long arch_get_unmapped_area(str - (!vmm || addr + len <= vmm->vm_start)) + else + addr = PAGE_ALIGN(addr); + vmm = find_vma(current->mm, addr); +- if (task_size - len >= addr && +- (!vmm || addr + len <= vmm->vm_start)) ++ if (task_size - len >= addr && check_heap_stack_gap(vmm, addr, len)) return addr; } - addr = TASK_UNMAPPED_BASE; @@ -1602,9 +1553,18 @@ diff -urNp linux-2.6.34.1/arch/mips/kernel/syscall.c linux-2.6.34.1/arch/mips/ke if (do_color_align) addr = COLOUR_ALIGN(addr, pgoff); else -diff -urNp linux-2.6.34.1/arch/mips/loongson/common/pm.c linux-2.6.34.1/arch/mips/loongson/common/pm.c ---- linux-2.6.34.1/arch/mips/loongson/common/pm.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/mips/loongson/common/pm.c 2010-07-07 09:04:42.000000000 -0400 +@@ -126,7 +130,7 @@ unsigned long arch_get_unmapped_area(str + /* At this point: (!vmm || addr < vmm->vm_end). */ + if (task_size - len < addr) + return -ENOMEM; +- if (!vmm || addr + len <= vmm->vm_start) ++ if (check_heap_stack_gap(vmm, addr, len)) + return addr; + addr = vmm->vm_end; + if (do_color_align) +diff -urNp linux-2.6.35.4/arch/mips/loongson/common/pm.c linux-2.6.35.4/arch/mips/loongson/common/pm.c +--- linux-2.6.35.4/arch/mips/loongson/common/pm.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/mips/loongson/common/pm.c 2010-09-17 20:12:09.000000000 -0400 @@ -147,7 +147,7 @@ static int loongson_pm_valid_state(suspe } } @@ -1614,9 +1574,9 @@ diff -urNp linux-2.6.34.1/arch/mips/loongson/common/pm.c linux-2.6.34.1/arch/mip .valid = loongson_pm_valid_state, .enter = loongson_pm_enter, }; -diff -urNp linux-2.6.34.1/arch/mips/mm/fault.c linux-2.6.34.1/arch/mips/mm/fault.c ---- linux-2.6.34.1/arch/mips/mm/fault.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/mips/mm/fault.c 2010-07-07 09:04:42.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/mips/mm/fault.c linux-2.6.35.4/arch/mips/mm/fault.c +--- linux-2.6.35.4/arch/mips/mm/fault.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/mips/mm/fault.c 2010-09-17 20:12:09.000000000 -0400 @@ -26,6 +26,23 @@ #include #include /* For VMALLOC_END */ @@ -1641,9 +1601,21 @@ diff -urNp linux-2.6.34.1/arch/mips/mm/fault.c linux-2.6.34.1/arch/mips/mm/fault /* * This routine handles page faults. It determines the address, * and the problem, and then passes it off to one of the appropriate -diff -urNp linux-2.6.34.1/arch/parisc/include/asm/elf.h linux-2.6.34.1/arch/parisc/include/asm/elf.h ---- linux-2.6.34.1/arch/parisc/include/asm/elf.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/parisc/include/asm/elf.h 2010-07-07 09:04:42.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/parisc/include/asm/compat.h linux-2.6.35.4/arch/parisc/include/asm/compat.h +--- linux-2.6.35.4/arch/parisc/include/asm/compat.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/parisc/include/asm/compat.h 2010-09-17 20:12:37.000000000 -0400 +@@ -147,7 +147,7 @@ static inline compat_uptr_t ptr_to_compa + return (u32)(unsigned long)uptr; + } + +-static __inline__ void __user *compat_alloc_user_space(long len) ++static __inline__ void __user *arch_compat_alloc_user_space(long len) + { + struct pt_regs *regs = ¤t->thread.regs; + return (void __user *)regs->gr[30]; +diff -urNp linux-2.6.35.4/arch/parisc/include/asm/elf.h linux-2.6.35.4/arch/parisc/include/asm/elf.h +--- linux-2.6.35.4/arch/parisc/include/asm/elf.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/parisc/include/asm/elf.h 2010-09-17 20:12:09.000000000 -0400 @@ -342,6 +342,13 @@ struct pt_regs; /* forward declaration.. #define ELF_ET_DYN_BASE (TASK_UNMAPPED_BASE + 0x01000000) @@ -1658,9 +1630,9 @@ diff -urNp linux-2.6.34.1/arch/parisc/include/asm/elf.h linux-2.6.34.1/arch/pari /* This yields a mask that user programs can use to figure out what instruction set this CPU supports. This could be done in user space, but it's not easy, and we've already done it here. */ -diff -urNp linux-2.6.34.1/arch/parisc/include/asm/pgtable.h linux-2.6.34.1/arch/parisc/include/asm/pgtable.h ---- linux-2.6.34.1/arch/parisc/include/asm/pgtable.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/parisc/include/asm/pgtable.h 2010-07-07 09:04:42.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/parisc/include/asm/pgtable.h linux-2.6.35.4/arch/parisc/include/asm/pgtable.h +--- linux-2.6.35.4/arch/parisc/include/asm/pgtable.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/parisc/include/asm/pgtable.h 2010-09-17 20:12:09.000000000 -0400 @@ -207,6 +207,17 @@ #define PAGE_EXECREAD __pgprot(_PAGE_PRESENT | _PAGE_USER | _PAGE_READ | _PAGE_EXEC |_PAGE_ACCESSED) #define PAGE_COPY PAGE_EXECREAD @@ -1679,9 +1651,9 @@ diff -urNp linux-2.6.34.1/arch/parisc/include/asm/pgtable.h linux-2.6.34.1/arch/ #define PAGE_KERNEL __pgprot(_PAGE_KERNEL) #define PAGE_KERNEL_RO __pgprot(_PAGE_KERNEL & ~_PAGE_WRITE) #define PAGE_KERNEL_UNC __pgprot(_PAGE_KERNEL | _PAGE_NO_CACHE) -diff -urNp linux-2.6.34.1/arch/parisc/kernel/module.c linux-2.6.34.1/arch/parisc/kernel/module.c ---- linux-2.6.34.1/arch/parisc/kernel/module.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/parisc/kernel/module.c 2010-07-07 09:04:42.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/parisc/kernel/module.c linux-2.6.35.4/arch/parisc/kernel/module.c +--- linux-2.6.35.4/arch/parisc/kernel/module.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/parisc/kernel/module.c 2010-09-17 20:12:09.000000000 -0400 @@ -96,16 +96,38 @@ /* three functions to determine where in the module core @@ -1782,9 +1754,27 @@ diff -urNp linux-2.6.34.1/arch/parisc/kernel/module.c linux-2.6.34.1/arch/parisc DEBUGP("register_unwind_table(), sect = %d at 0x%p - 0x%p (gp=0x%lx)\n", me->arch.unwind_section, table, end, gp); -diff -urNp linux-2.6.34.1/arch/parisc/kernel/sys_parisc.c linux-2.6.34.1/arch/parisc/kernel/sys_parisc.c ---- linux-2.6.34.1/arch/parisc/kernel/sys_parisc.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/parisc/kernel/sys_parisc.c 2010-07-07 09:04:42.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/parisc/kernel/sys_parisc.c linux-2.6.35.4/arch/parisc/kernel/sys_parisc.c +--- linux-2.6.35.4/arch/parisc/kernel/sys_parisc.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/parisc/kernel/sys_parisc.c 2010-09-17 20:12:09.000000000 -0400 +@@ -43,7 +43,7 @@ static unsigned long get_unshared_area(u + /* At this point: (!vma || addr < vma->vm_end). */ + if (TASK_SIZE - len < addr) + return -ENOMEM; +- if (!vma || addr + len <= vma->vm_start) ++ if (check_heap_stack_gap(vma, addr, len)) + return addr; + addr = vma->vm_end; + } +@@ -79,7 +79,7 @@ static unsigned long get_shared_area(str + /* At this point: (!vma || addr < vma->vm_end). */ + if (TASK_SIZE - len < addr) + return -ENOMEM; +- if (!vma || addr + len <= vma->vm_start) ++ if (check_heap_stack_gap(vma, addr, len)) + return addr; + addr = DCACHE_ALIGN(vma->vm_end - offset) + offset; + if (addr < vma->vm_end) /* handle wraparound */ @@ -98,7 +98,7 @@ unsigned long arch_get_unmapped_area(str if (flags & MAP_FIXED) return addr; @@ -1794,9 +1784,9 @@ diff -urNp linux-2.6.34.1/arch/parisc/kernel/sys_parisc.c linux-2.6.34.1/arch/pa if (filp) { addr = get_shared_area(filp->f_mapping, addr, len, pgoff); -diff -urNp linux-2.6.34.1/arch/parisc/kernel/traps.c linux-2.6.34.1/arch/parisc/kernel/traps.c ---- linux-2.6.34.1/arch/parisc/kernel/traps.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/parisc/kernel/traps.c 2010-07-07 09:04:42.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/parisc/kernel/traps.c linux-2.6.35.4/arch/parisc/kernel/traps.c +--- linux-2.6.35.4/arch/parisc/kernel/traps.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/parisc/kernel/traps.c 2010-09-17 20:12:09.000000000 -0400 @@ -733,9 +733,7 @@ void notrace handle_interruption(int cod down_read(¤t->mm->mmap_sem); @@ -1808,9 +1798,9 @@ diff -urNp linux-2.6.34.1/arch/parisc/kernel/traps.c linux-2.6.34.1/arch/parisc/ fault_address = regs->iaoq[0]; fault_space = regs->iasq[0]; -diff -urNp linux-2.6.34.1/arch/parisc/mm/fault.c linux-2.6.34.1/arch/parisc/mm/fault.c ---- linux-2.6.34.1/arch/parisc/mm/fault.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/parisc/mm/fault.c 2010-07-07 09:04:42.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/parisc/mm/fault.c linux-2.6.35.4/arch/parisc/mm/fault.c +--- linux-2.6.35.4/arch/parisc/mm/fault.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/parisc/mm/fault.c 2010-09-17 20:12:09.000000000 -0400 @@ -15,6 +15,7 @@ #include #include @@ -1980,27 +1970,40 @@ diff -urNp linux-2.6.34.1/arch/parisc/mm/fault.c linux-2.6.34.1/arch/parisc/mm/f /* * If for any reason at all we couldn't handle the fault, make -diff -urNp linux-2.6.34.1/arch/powerpc/include/asm/device.h linux-2.6.34.1/arch/powerpc/include/asm/device.h ---- linux-2.6.34.1/arch/powerpc/include/asm/device.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/powerpc/include/asm/device.h 2010-07-07 09:04:42.000000000 -0400 -@@ -14,7 +14,7 @@ struct dev_archdata { - struct device_node *of_node; +diff -urNp linux-2.6.35.4/arch/powerpc/include/asm/compat.h linux-2.6.35.4/arch/powerpc/include/asm/compat.h +--- linux-2.6.35.4/arch/powerpc/include/asm/compat.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/powerpc/include/asm/compat.h 2010-09-17 20:12:37.000000000 -0400 +@@ -134,7 +134,7 @@ static inline compat_uptr_t ptr_to_compa + return (u32)(unsigned long)uptr; + } + +-static inline void __user *compat_alloc_user_space(long len) ++static inline void __user *arch_compat_alloc_user_space(long len) + { + struct pt_regs *regs = current->thread.regs; + unsigned long usp = regs->gpr[1]; +diff -urNp linux-2.6.35.4/arch/powerpc/include/asm/device.h linux-2.6.35.4/arch/powerpc/include/asm/device.h +--- linux-2.6.35.4/arch/powerpc/include/asm/device.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/powerpc/include/asm/device.h 2010-09-17 20:12:09.000000000 -0400 +@@ -11,7 +11,7 @@ struct device_node; + struct dev_archdata { /* DMA operations on that device */ - struct dma_map_ops *dma_ops; + const struct dma_map_ops *dma_ops; /* * When an iommu is in use, dma_data is used as a ptr to the base of the -diff -urNp linux-2.6.34.1/arch/powerpc/include/asm/dma-mapping.h linux-2.6.34.1/arch/powerpc/include/asm/dma-mapping.h ---- linux-2.6.34.1/arch/powerpc/include/asm/dma-mapping.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/powerpc/include/asm/dma-mapping.h 2010-07-07 09:04:42.000000000 -0400 -@@ -67,11 +67,11 @@ static inline unsigned long device_to_ma +diff -urNp linux-2.6.35.4/arch/powerpc/include/asm/dma-mapping.h linux-2.6.35.4/arch/powerpc/include/asm/dma-mapping.h +--- linux-2.6.35.4/arch/powerpc/include/asm/dma-mapping.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/powerpc/include/asm/dma-mapping.h 2010-09-17 20:12:09.000000000 -0400 +@@ -66,12 +66,13 @@ static inline unsigned long device_to_ma + /* * Available generic sets of operations */ ++/* cannot be const */ #ifdef CONFIG_PPC64 --extern struct dma_map_ops dma_iommu_ops; -+extern const struct dma_map_ops dma_iommu_ops; + extern struct dma_map_ops dma_iommu_ops; #endif -extern struct dma_map_ops dma_direct_ops; +extern const struct dma_map_ops dma_direct_ops; @@ -2010,7 +2013,7 @@ diff -urNp linux-2.6.34.1/arch/powerpc/include/asm/dma-mapping.h linux-2.6.34.1/ { /* We don't handle the NULL dev case for ISA for now. We could * do it via an out of line call but it is not needed for now. The -@@ -84,7 +84,7 @@ static inline struct dma_map_ops *get_dm +@@ -84,7 +85,7 @@ static inline struct dma_map_ops *get_dm return dev->archdata.dma_ops; } @@ -2019,7 +2022,7 @@ diff -urNp linux-2.6.34.1/arch/powerpc/include/asm/dma-mapping.h linux-2.6.34.1/ { dev->archdata.dma_ops = ops; } -@@ -118,7 +118,7 @@ static inline void set_dma_offset(struct +@@ -118,7 +119,7 @@ static inline void set_dma_offset(struct static inline int dma_supported(struct device *dev, u64 mask) { @@ -2028,7 +2031,7 @@ diff -urNp linux-2.6.34.1/arch/powerpc/include/asm/dma-mapping.h linux-2.6.34.1/ if (unlikely(dma_ops == NULL)) return 0; -@@ -129,7 +129,7 @@ static inline int dma_supported(struct d +@@ -129,7 +130,7 @@ static inline int dma_supported(struct d static inline int dma_set_mask(struct device *dev, u64 dma_mask) { @@ -2037,7 +2040,7 @@ diff -urNp linux-2.6.34.1/arch/powerpc/include/asm/dma-mapping.h linux-2.6.34.1/ if (unlikely(dma_ops == NULL)) return -EIO; -@@ -144,7 +144,7 @@ static inline int dma_set_mask(struct de +@@ -144,7 +145,7 @@ static inline int dma_set_mask(struct de static inline void *dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *dma_handle, gfp_t flag) { @@ -2046,7 +2049,7 @@ diff -urNp linux-2.6.34.1/arch/powerpc/include/asm/dma-mapping.h linux-2.6.34.1/ void *cpu_addr; BUG_ON(!dma_ops); -@@ -159,7 +159,7 @@ static inline void *dma_alloc_coherent(s +@@ -159,7 +160,7 @@ static inline void *dma_alloc_coherent(s static inline void dma_free_coherent(struct device *dev, size_t size, void *cpu_addr, dma_addr_t dma_handle) { @@ -2055,7 +2058,7 @@ diff -urNp linux-2.6.34.1/arch/powerpc/include/asm/dma-mapping.h linux-2.6.34.1/ BUG_ON(!dma_ops); -@@ -170,7 +170,7 @@ static inline void dma_free_coherent(str +@@ -170,7 +171,7 @@ static inline void dma_free_coherent(str static inline int dma_mapping_error(struct device *dev, dma_addr_t dma_addr) { @@ -2064,9 +2067,9 @@ diff -urNp linux-2.6.34.1/arch/powerpc/include/asm/dma-mapping.h linux-2.6.34.1/ if (dma_ops->mapping_error) return dma_ops->mapping_error(dev, dma_addr); -diff -urNp linux-2.6.34.1/arch/powerpc/include/asm/elf.h linux-2.6.34.1/arch/powerpc/include/asm/elf.h ---- linux-2.6.34.1/arch/powerpc/include/asm/elf.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/powerpc/include/asm/elf.h 2010-07-07 09:04:42.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/powerpc/include/asm/elf.h linux-2.6.35.4/arch/powerpc/include/asm/elf.h +--- linux-2.6.35.4/arch/powerpc/include/asm/elf.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/powerpc/include/asm/elf.h 2010-09-17 20:12:09.000000000 -0400 @@ -178,8 +178,19 @@ typedef elf_fpreg_t elf_vsrreghalf_t32[E the loader. We need to make sure that it is out of the way of the program that it will "exec", and that there is sufficient room for the brk. */ @@ -2099,9 +2102,9 @@ diff -urNp linux-2.6.34.1/arch/powerpc/include/asm/elf.h linux-2.6.34.1/arch/pow #endif /* __KERNEL__ */ /* -diff -urNp linux-2.6.34.1/arch/powerpc/include/asm/iommu.h linux-2.6.34.1/arch/powerpc/include/asm/iommu.h ---- linux-2.6.34.1/arch/powerpc/include/asm/iommu.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/powerpc/include/asm/iommu.h 2010-07-07 09:04:42.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/powerpc/include/asm/iommu.h linux-2.6.35.4/arch/powerpc/include/asm/iommu.h +--- linux-2.6.35.4/arch/powerpc/include/asm/iommu.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/powerpc/include/asm/iommu.h 2010-09-17 20:12:09.000000000 -0400 @@ -116,6 +116,9 @@ extern void iommu_init_early_iSeries(voi extern void iommu_init_early_dart(void); extern void iommu_init_early_pasemi(void); @@ -2112,46 +2115,21 @@ diff -urNp linux-2.6.34.1/arch/powerpc/include/asm/iommu.h linux-2.6.34.1/arch/p #ifdef CONFIG_PCI extern void pci_iommu_init(void); extern void pci_direct_iommu_init(void); -diff -urNp linux-2.6.34.1/arch/powerpc/include/asm/kmap_types.h linux-2.6.34.1/arch/powerpc/include/asm/kmap_types.h ---- linux-2.6.34.1/arch/powerpc/include/asm/kmap_types.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/powerpc/include/asm/kmap_types.h 2010-07-07 09:04:42.000000000 -0400 -@@ -26,6 +26,7 @@ enum km_type { - KM_SOFTIRQ1, +diff -urNp linux-2.6.35.4/arch/powerpc/include/asm/kmap_types.h linux-2.6.35.4/arch/powerpc/include/asm/kmap_types.h +--- linux-2.6.35.4/arch/powerpc/include/asm/kmap_types.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/powerpc/include/asm/kmap_types.h 2010-09-17 20:12:09.000000000 -0400 +@@ -27,6 +27,7 @@ enum km_type { KM_PPC_SYNC_PAGE, KM_PPC_SYNC_ICACHE, + KM_KDB, + KM_CLEARPAGE, KM_TYPE_NR }; -diff -urNp linux-2.6.34.1/arch/powerpc/include/asm/page.h linux-2.6.34.1/arch/powerpc/include/asm/page.h ---- linux-2.6.34.1/arch/powerpc/include/asm/page.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/powerpc/include/asm/page.h 2010-07-07 09:04:42.000000000 -0400 -@@ -129,8 +129,9 @@ extern phys_addr_t kernstart_addr; - * and needs to be executable. This means the whole heap ends - * up being executable. - */ --#define VM_DATA_DEFAULT_FLAGS32 (VM_READ | VM_WRITE | VM_EXEC | \ -- VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC) -+#define VM_DATA_DEFAULT_FLAGS32 \ -+ (((current->personality & READ_IMPLIES_EXEC) ? VM_EXEC : 0) | \ -+ VM_READ | VM_WRITE | VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC) - - #define VM_DATA_DEFAULT_FLAGS64 (VM_READ | VM_WRITE | \ - VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC) -@@ -158,6 +159,9 @@ extern phys_addr_t kernstart_addr; - #define is_kernel_addr(x) ((x) >= PAGE_OFFSET) - #endif - -+#define ktla_ktva(addr) (addr) -+#define ktva_ktla(addr) (addr) -+ - #ifndef __ASSEMBLY__ - - #undef STRICT_MM_TYPECHECKS -diff -urNp linux-2.6.34.1/arch/powerpc/include/asm/page_64.h linux-2.6.34.1/arch/powerpc/include/asm/page_64.h ---- linux-2.6.34.1/arch/powerpc/include/asm/page_64.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/powerpc/include/asm/page_64.h 2010-07-07 09:04:42.000000000 -0400 -@@ -180,15 +180,18 @@ do { \ +diff -urNp linux-2.6.35.4/arch/powerpc/include/asm/page_64.h linux-2.6.35.4/arch/powerpc/include/asm/page_64.h +--- linux-2.6.35.4/arch/powerpc/include/asm/page_64.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/powerpc/include/asm/page_64.h 2010-09-17 20:12:09.000000000 -0400 +@@ -172,15 +172,18 @@ do { \ * stack by default, so in the absense of a PT_GNU_STACK program header * we turn execute permission off. */ @@ -2172,9 +2150,34 @@ diff -urNp linux-2.6.34.1/arch/powerpc/include/asm/page_64.h linux-2.6.34.1/arch #include -diff -urNp linux-2.6.34.1/arch/powerpc/include/asm/pci.h linux-2.6.34.1/arch/powerpc/include/asm/pci.h ---- linux-2.6.34.1/arch/powerpc/include/asm/pci.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/powerpc/include/asm/pci.h 2010-07-07 09:04:42.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/powerpc/include/asm/page.h linux-2.6.35.4/arch/powerpc/include/asm/page.h +--- linux-2.6.35.4/arch/powerpc/include/asm/page.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/powerpc/include/asm/page.h 2010-09-17 20:12:09.000000000 -0400 +@@ -129,8 +129,9 @@ extern phys_addr_t kernstart_addr; + * and needs to be executable. This means the whole heap ends + * up being executable. + */ +-#define VM_DATA_DEFAULT_FLAGS32 (VM_READ | VM_WRITE | VM_EXEC | \ +- VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC) ++#define VM_DATA_DEFAULT_FLAGS32 \ ++ (((current->personality & READ_IMPLIES_EXEC) ? VM_EXEC : 0) | \ ++ VM_READ | VM_WRITE | VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC) + + #define VM_DATA_DEFAULT_FLAGS64 (VM_READ | VM_WRITE | \ + VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC) +@@ -158,6 +159,9 @@ extern phys_addr_t kernstart_addr; + #define is_kernel_addr(x) ((x) >= PAGE_OFFSET) + #endif + ++#define ktla_ktva(addr) (addr) ++#define ktva_ktla(addr) (addr) ++ + #ifndef __ASSEMBLY__ + + #undef STRICT_MM_TYPECHECKS +diff -urNp linux-2.6.35.4/arch/powerpc/include/asm/pci.h linux-2.6.35.4/arch/powerpc/include/asm/pci.h +--- linux-2.6.35.4/arch/powerpc/include/asm/pci.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/powerpc/include/asm/pci.h 2010-09-17 20:12:09.000000000 -0400 @@ -65,8 +65,8 @@ static inline int pci_get_legacy_ide_irq } @@ -2186,9 +2189,9 @@ diff -urNp linux-2.6.34.1/arch/powerpc/include/asm/pci.h linux-2.6.34.1/arch/pow #else /* CONFIG_PCI */ #define set_pci_dma_ops(d) #define get_pci_dma_ops() NULL -diff -urNp linux-2.6.34.1/arch/powerpc/include/asm/pte-hash32.h linux-2.6.34.1/arch/powerpc/include/asm/pte-hash32.h ---- linux-2.6.34.1/arch/powerpc/include/asm/pte-hash32.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/powerpc/include/asm/pte-hash32.h 2010-07-07 09:04:42.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/powerpc/include/asm/pte-hash32.h linux-2.6.35.4/arch/powerpc/include/asm/pte-hash32.h +--- linux-2.6.35.4/arch/powerpc/include/asm/pte-hash32.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/powerpc/include/asm/pte-hash32.h 2010-09-17 20:12:09.000000000 -0400 @@ -21,6 +21,7 @@ #define _PAGE_FILE 0x004 /* when !present: nonlinear file mapping */ #define _PAGE_USER 0x004 /* usermode access allowed */ @@ -2197,9 +2200,9 @@ diff -urNp linux-2.6.34.1/arch/powerpc/include/asm/pte-hash32.h linux-2.6.34.1/a #define _PAGE_COHERENT 0x010 /* M: enforce memory coherence (SMP systems) */ #define _PAGE_NO_CACHE 0x020 /* I: cache inhibit */ #define _PAGE_WRITETHRU 0x040 /* W: cache write-through */ -diff -urNp linux-2.6.34.1/arch/powerpc/include/asm/reg.h linux-2.6.34.1/arch/powerpc/include/asm/reg.h ---- linux-2.6.34.1/arch/powerpc/include/asm/reg.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/powerpc/include/asm/reg.h 2010-07-07 09:04:42.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/powerpc/include/asm/reg.h linux-2.6.35.4/arch/powerpc/include/asm/reg.h +--- linux-2.6.35.4/arch/powerpc/include/asm/reg.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/powerpc/include/asm/reg.h 2010-09-17 20:12:09.000000000 -0400 @@ -191,6 +191,7 @@ #define SPRN_DBCR 0x136 /* e300 Data Breakpoint Control Reg */ #define SPRN_DSISR 0x012 /* Data Storage Interrupt Status Register */ @@ -2208,9 +2211,9 @@ diff -urNp linux-2.6.34.1/arch/powerpc/include/asm/reg.h linux-2.6.34.1/arch/pow #define DSISR_PROTFAULT 0x08000000 /* protection fault */ #define DSISR_ISSTORE 0x02000000 /* access was a store */ #define DSISR_DABRMATCH 0x00400000 /* hit data breakpoint */ -diff -urNp linux-2.6.34.1/arch/powerpc/include/asm/swiotlb.h linux-2.6.34.1/arch/powerpc/include/asm/swiotlb.h ---- linux-2.6.34.1/arch/powerpc/include/asm/swiotlb.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/powerpc/include/asm/swiotlb.h 2010-07-07 09:04:42.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/powerpc/include/asm/swiotlb.h linux-2.6.35.4/arch/powerpc/include/asm/swiotlb.h +--- linux-2.6.35.4/arch/powerpc/include/asm/swiotlb.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/powerpc/include/asm/swiotlb.h 2010-09-17 20:12:09.000000000 -0400 @@ -13,7 +13,7 @@ #include @@ -2220,9 +2223,9 @@ diff -urNp linux-2.6.34.1/arch/powerpc/include/asm/swiotlb.h linux-2.6.34.1/arch static inline void dma_mark_clean(void *addr, size_t size) {} -diff -urNp linux-2.6.34.1/arch/powerpc/include/asm/uaccess.h linux-2.6.34.1/arch/powerpc/include/asm/uaccess.h ---- linux-2.6.34.1/arch/powerpc/include/asm/uaccess.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/powerpc/include/asm/uaccess.h 2010-07-07 09:04:42.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/powerpc/include/asm/uaccess.h linux-2.6.35.4/arch/powerpc/include/asm/uaccess.h +--- linux-2.6.35.4/arch/powerpc/include/asm/uaccess.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/powerpc/include/asm/uaccess.h 2010-09-17 20:12:09.000000000 -0400 @@ -13,6 +13,8 @@ #define VERIFY_READ 0 #define VERIFY_WRITE 1 @@ -2400,9 +2403,21 @@ diff -urNp linux-2.6.34.1/arch/powerpc/include/asm/uaccess.h linux-2.6.34.1/arch extern unsigned long __clear_user(void __user *addr, unsigned long size); static inline unsigned long clear_user(void __user *addr, unsigned long size) -diff -urNp linux-2.6.34.1/arch/powerpc/kernel/dma-iommu.c linux-2.6.34.1/arch/powerpc/kernel/dma-iommu.c ---- linux-2.6.34.1/arch/powerpc/kernel/dma-iommu.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/powerpc/kernel/dma-iommu.c 2010-07-07 09:04:42.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/powerpc/kernel/dma.c linux-2.6.35.4/arch/powerpc/kernel/dma.c +--- linux-2.6.35.4/arch/powerpc/kernel/dma.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/powerpc/kernel/dma.c 2010-09-17 20:12:09.000000000 -0400 +@@ -135,7 +135,7 @@ static inline void dma_direct_sync_singl + } + #endif + +-struct dma_map_ops dma_direct_ops = { ++const struct dma_map_ops dma_direct_ops = { + .alloc_coherent = dma_direct_alloc_coherent, + .free_coherent = dma_direct_free_coherent, + .map_sg = dma_direct_map_sg, +diff -urNp linux-2.6.35.4/arch/powerpc/kernel/dma-iommu.c linux-2.6.35.4/arch/powerpc/kernel/dma-iommu.c +--- linux-2.6.35.4/arch/powerpc/kernel/dma-iommu.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/powerpc/kernel/dma-iommu.c 2010-09-17 20:12:09.000000000 -0400 @@ -70,7 +70,7 @@ static void dma_iommu_unmap_sg(struct de } @@ -2412,18 +2427,9 @@ diff -urNp linux-2.6.34.1/arch/powerpc/kernel/dma-iommu.c linux-2.6.34.1/arch/po { struct iommu_table *tbl = get_iommu_table_base(dev); -@@ -89,7 +89,7 @@ static int dma_iommu_dma_supported(struc - return 1; - } - --struct dma_map_ops dma_iommu_ops = { -+const struct dma_map_ops dma_iommu_ops = { - .alloc_coherent = dma_iommu_alloc_coherent, - .free_coherent = dma_iommu_free_coherent, - .map_sg = dma_iommu_map_sg, -diff -urNp linux-2.6.34.1/arch/powerpc/kernel/dma-swiotlb.c linux-2.6.34.1/arch/powerpc/kernel/dma-swiotlb.c ---- linux-2.6.34.1/arch/powerpc/kernel/dma-swiotlb.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/powerpc/kernel/dma-swiotlb.c 2010-07-07 09:04:42.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/powerpc/kernel/dma-swiotlb.c linux-2.6.35.4/arch/powerpc/kernel/dma-swiotlb.c +--- linux-2.6.35.4/arch/powerpc/kernel/dma-swiotlb.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/powerpc/kernel/dma-swiotlb.c 2010-09-17 20:12:09.000000000 -0400 @@ -31,7 +31,7 @@ unsigned int ppc_swiotlb_enable; * map_page, and unmap_page on highmem, use normal dma_ops * for everything else. @@ -2433,21 +2439,9 @@ diff -urNp linux-2.6.34.1/arch/powerpc/kernel/dma-swiotlb.c linux-2.6.34.1/arch/ .alloc_coherent = dma_direct_alloc_coherent, .free_coherent = dma_direct_free_coherent, .map_sg = swiotlb_map_sg_attrs, -diff -urNp linux-2.6.34.1/arch/powerpc/kernel/dma.c linux-2.6.34.1/arch/powerpc/kernel/dma.c ---- linux-2.6.34.1/arch/powerpc/kernel/dma.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/powerpc/kernel/dma.c 2010-07-07 09:04:42.000000000 -0400 -@@ -135,7 +135,7 @@ static inline void dma_direct_sync_singl - } - #endif - --struct dma_map_ops dma_direct_ops = { -+const struct dma_map_ops dma_direct_ops = { - .alloc_coherent = dma_direct_alloc_coherent, - .free_coherent = dma_direct_free_coherent, - .map_sg = dma_direct_map_sg, -diff -urNp linux-2.6.34.1/arch/powerpc/kernel/exceptions-64e.S linux-2.6.34.1/arch/powerpc/kernel/exceptions-64e.S ---- linux-2.6.34.1/arch/powerpc/kernel/exceptions-64e.S 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/powerpc/kernel/exceptions-64e.S 2010-07-07 09:04:42.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/powerpc/kernel/exceptions-64e.S linux-2.6.35.4/arch/powerpc/kernel/exceptions-64e.S +--- linux-2.6.35.4/arch/powerpc/kernel/exceptions-64e.S 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/powerpc/kernel/exceptions-64e.S 2010-09-17 20:12:09.000000000 -0400 @@ -455,6 +455,7 @@ storage_fault_common: std r14,_DAR(r1) std r15,_DSISR(r1) @@ -2466,10 +2460,10 @@ diff -urNp linux-2.6.34.1/arch/powerpc/kernel/exceptions-64e.S linux-2.6.34.1/ar addi r3,r1,STACK_FRAME_OVERHEAD ld r4,_DAR(r1) bl .bad_page_fault -diff -urNp linux-2.6.34.1/arch/powerpc/kernel/exceptions-64s.S linux-2.6.34.1/arch/powerpc/kernel/exceptions-64s.S ---- linux-2.6.34.1/arch/powerpc/kernel/exceptions-64s.S 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/powerpc/kernel/exceptions-64s.S 2010-07-07 09:04:42.000000000 -0400 -@@ -829,10 +829,10 @@ handle_page_fault: +diff -urNp linux-2.6.35.4/arch/powerpc/kernel/exceptions-64s.S linux-2.6.35.4/arch/powerpc/kernel/exceptions-64s.S +--- linux-2.6.35.4/arch/powerpc/kernel/exceptions-64s.S 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/powerpc/kernel/exceptions-64s.S 2010-09-17 20:12:09.000000000 -0400 +@@ -840,10 +840,10 @@ handle_page_fault: 11: ld r4,_DAR(r1) ld r5,_DSISR(r1) addi r3,r1,STACK_FRAME_OVERHEAD @@ -2481,9 +2475,9 @@ diff -urNp linux-2.6.34.1/arch/powerpc/kernel/exceptions-64s.S linux-2.6.34.1/ar mr r5,r3 addi r3,r1,STACK_FRAME_OVERHEAD lwz r4,_DAR(r1) -diff -urNp linux-2.6.34.1/arch/powerpc/kernel/ibmebus.c linux-2.6.34.1/arch/powerpc/kernel/ibmebus.c ---- linux-2.6.34.1/arch/powerpc/kernel/ibmebus.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/powerpc/kernel/ibmebus.c 2010-07-07 09:04:42.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/powerpc/kernel/ibmebus.c linux-2.6.35.4/arch/powerpc/kernel/ibmebus.c +--- linux-2.6.35.4/arch/powerpc/kernel/ibmebus.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/powerpc/kernel/ibmebus.c 2010-09-17 20:12:09.000000000 -0400 @@ -128,7 +128,7 @@ static int ibmebus_dma_supported(struct return 1; } @@ -2493,11 +2487,11 @@ diff -urNp linux-2.6.34.1/arch/powerpc/kernel/ibmebus.c linux-2.6.34.1/arch/powe .alloc_coherent = ibmebus_alloc_coherent, .free_coherent = ibmebus_free_coherent, .map_sg = ibmebus_map_sg, -diff -urNp linux-2.6.34.1/arch/powerpc/kernel/kgdb.c linux-2.6.34.1/arch/powerpc/kernel/kgdb.c ---- linux-2.6.34.1/arch/powerpc/kernel/kgdb.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/powerpc/kernel/kgdb.c 2010-07-07 09:04:42.000000000 -0400 -@@ -126,7 +126,7 @@ static int kgdb_handle_breakpoint(struct - if (kgdb_handle_exception(0, SIGTRAP, 0, regs) != 0) +diff -urNp linux-2.6.35.4/arch/powerpc/kernel/kgdb.c linux-2.6.35.4/arch/powerpc/kernel/kgdb.c +--- linux-2.6.35.4/arch/powerpc/kernel/kgdb.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/powerpc/kernel/kgdb.c 2010-09-17 20:12:09.000000000 -0400 +@@ -128,7 +128,7 @@ static int kgdb_handle_breakpoint(struct + if (kgdb_handle_exception(1, SIGTRAP, 0, regs) != 0) return 0; - if (*(u32 *) (regs->nip) == *(u32 *) (&arch_kgdb_ops.gdb_bpt_instr)) @@ -2505,7 +2499,7 @@ diff -urNp linux-2.6.34.1/arch/powerpc/kernel/kgdb.c linux-2.6.34.1/arch/powerpc regs->nip += 4; return 1; -@@ -353,7 +353,7 @@ int kgdb_arch_handle_exception(int vecto +@@ -360,7 +360,7 @@ int kgdb_arch_handle_exception(int vecto /* * Global data */ @@ -2514,9 +2508,41 @@ diff -urNp linux-2.6.34.1/arch/powerpc/kernel/kgdb.c linux-2.6.34.1/arch/powerpc .gdb_bpt_instr = {0x7d, 0x82, 0x10, 0x08}, }; -diff -urNp linux-2.6.34.1/arch/powerpc/kernel/module.c linux-2.6.34.1/arch/powerpc/kernel/module.c ---- linux-2.6.34.1/arch/powerpc/kernel/module.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/powerpc/kernel/module.c 2010-07-07 09:04:42.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/powerpc/kernel/module_32.c linux-2.6.35.4/arch/powerpc/kernel/module_32.c +--- linux-2.6.35.4/arch/powerpc/kernel/module_32.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/powerpc/kernel/module_32.c 2010-09-17 20:12:09.000000000 -0400 +@@ -162,7 +162,7 @@ int module_frob_arch_sections(Elf32_Ehdr + me->arch.core_plt_section = i; + } + if (!me->arch.core_plt_section || !me->arch.init_plt_section) { +- printk("Module doesn't contain .plt or .init.plt sections.\n"); ++ printk("Module %s doesn't contain .plt or .init.plt sections.\n", me->name); + return -ENOEXEC; + } + +@@ -203,11 +203,16 @@ static uint32_t do_plt_call(void *locati + + DEBUGP("Doing plt for call to 0x%x at 0x%x\n", val, (unsigned int)location); + /* Init, or core PLT? */ +- if (location >= mod->module_core +- && location < mod->module_core + mod->core_size) ++ if ((location >= mod->module_core_rx && location < mod->module_core_rx + mod->core_size_rx) || ++ (location >= mod->module_core_rw && location < mod->module_core_rw + mod->core_size_rw)) + entry = (void *)sechdrs[mod->arch.core_plt_section].sh_addr; +- else ++ else if ((location >= mod->module_init_rx && location < mod->module_init_rx + mod->init_size_rx) || ++ (location >= mod->module_init_rw && location < mod->module_init_rw + mod->init_size_rw)) + entry = (void *)sechdrs[mod->arch.init_plt_section].sh_addr; ++ else { ++ printk(KERN_ERR "%s: invalid R_PPC_REL24 entry found\n", mod->name); ++ return ~0UL; ++ } + + /* Find this entry, or if that fails, the next avail. entry */ + while (entry->jump[0]) { +diff -urNp linux-2.6.35.4/arch/powerpc/kernel/module.c linux-2.6.35.4/arch/powerpc/kernel/module.c +--- linux-2.6.35.4/arch/powerpc/kernel/module.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/powerpc/kernel/module.c 2010-09-17 20:12:09.000000000 -0400 @@ -31,11 +31,24 @@ LIST_HEAD(module_bug_list); @@ -2556,41 +2582,9 @@ diff -urNp linux-2.6.34.1/arch/powerpc/kernel/module.c linux-2.6.34.1/arch/power static const Elf_Shdr *find_section(const Elf_Ehdr *hdr, const Elf_Shdr *sechdrs, const char *name) -diff -urNp linux-2.6.34.1/arch/powerpc/kernel/module_32.c linux-2.6.34.1/arch/powerpc/kernel/module_32.c ---- linux-2.6.34.1/arch/powerpc/kernel/module_32.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/powerpc/kernel/module_32.c 2010-07-07 09:04:42.000000000 -0400 -@@ -162,7 +162,7 @@ int module_frob_arch_sections(Elf32_Ehdr - me->arch.core_plt_section = i; - } - if (!me->arch.core_plt_section || !me->arch.init_plt_section) { -- printk("Module doesn't contain .plt or .init.plt sections.\n"); -+ printk("Module %s doesn't contain .plt or .init.plt sections.\n", me->name); - return -ENOEXEC; - } - -@@ -203,11 +203,16 @@ static uint32_t do_plt_call(void *locati - - DEBUGP("Doing plt for call to 0x%x at 0x%x\n", val, (unsigned int)location); - /* Init, or core PLT? */ -- if (location >= mod->module_core -- && location < mod->module_core + mod->core_size) -+ if ((location >= mod->module_core_rx && location < mod->module_core_rx + mod->core_size_rx) || -+ (location >= mod->module_core_rw && location < mod->module_core_rw + mod->core_size_rw)) - entry = (void *)sechdrs[mod->arch.core_plt_section].sh_addr; -- else -+ else if ((location >= mod->module_init_rx && location < mod->module_init_rx + mod->init_size_rx) || -+ (location >= mod->module_init_rw && location < mod->module_init_rw + mod->init_size_rw)) - entry = (void *)sechdrs[mod->arch.init_plt_section].sh_addr; -+ else { -+ printk(KERN_ERR "%s: invalid R_PPC_REL24 entry found\n", mod->name); -+ return ~0UL; -+ } - - /* Find this entry, or if that fails, the next avail. entry */ - while (entry->jump[0]) { -diff -urNp linux-2.6.34.1/arch/powerpc/kernel/pci-common.c linux-2.6.34.1/arch/powerpc/kernel/pci-common.c ---- linux-2.6.34.1/arch/powerpc/kernel/pci-common.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/powerpc/kernel/pci-common.c 2010-07-07 09:04:43.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/powerpc/kernel/pci-common.c linux-2.6.35.4/arch/powerpc/kernel/pci-common.c +--- linux-2.6.35.4/arch/powerpc/kernel/pci-common.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/powerpc/kernel/pci-common.c 2010-09-17 20:12:09.000000000 -0400 @@ -51,14 +51,14 @@ resource_size_t isa_mem_base; unsigned int ppc_pci_flags = 0; @@ -2609,10 +2603,10 @@ diff -urNp linux-2.6.34.1/arch/powerpc/kernel/pci-common.c linux-2.6.34.1/arch/p { return pci_dma_ops; } -diff -urNp linux-2.6.34.1/arch/powerpc/kernel/process.c linux-2.6.34.1/arch/powerpc/kernel/process.c ---- linux-2.6.34.1/arch/powerpc/kernel/process.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/powerpc/kernel/process.c 2010-07-07 09:04:43.000000000 -0400 -@@ -1217,51 +1217,3 @@ unsigned long arch_align_stack(unsigned +diff -urNp linux-2.6.35.4/arch/powerpc/kernel/process.c linux-2.6.35.4/arch/powerpc/kernel/process.c +--- linux-2.6.35.4/arch/powerpc/kernel/process.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/powerpc/kernel/process.c 2010-09-17 20:12:09.000000000 -0400 +@@ -1215,51 +1215,3 @@ unsigned long arch_align_stack(unsigned sp -= get_random_int() & ~PAGE_MASK; return sp & ~0xf; } @@ -2664,9 +2658,9 @@ diff -urNp linux-2.6.34.1/arch/powerpc/kernel/process.c linux-2.6.34.1/arch/powe - - return ret; -} -diff -urNp linux-2.6.34.1/arch/powerpc/kernel/signal_32.c linux-2.6.34.1/arch/powerpc/kernel/signal_32.c ---- linux-2.6.34.1/arch/powerpc/kernel/signal_32.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/powerpc/kernel/signal_32.c 2010-07-07 09:04:43.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/powerpc/kernel/signal_32.c linux-2.6.35.4/arch/powerpc/kernel/signal_32.c +--- linux-2.6.35.4/arch/powerpc/kernel/signal_32.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/powerpc/kernel/signal_32.c 2010-09-17 20:12:09.000000000 -0400 @@ -857,7 +857,7 @@ int handle_rt_signal32(unsigned long sig /* Save user registers on the stack */ frame = &rt_sf->uc.uc_mcontext; @@ -2676,9 +2670,9 @@ diff -urNp linux-2.6.34.1/arch/powerpc/kernel/signal_32.c linux-2.6.34.1/arch/po if (save_user_regs(regs, frame, 0, 1)) goto badframe; regs->link = current->mm->context.vdso_base + vdso32_rt_sigtramp; -diff -urNp linux-2.6.34.1/arch/powerpc/kernel/signal_64.c linux-2.6.34.1/arch/powerpc/kernel/signal_64.c ---- linux-2.6.34.1/arch/powerpc/kernel/signal_64.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/powerpc/kernel/signal_64.c 2010-07-07 09:04:43.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/powerpc/kernel/signal_64.c linux-2.6.35.4/arch/powerpc/kernel/signal_64.c +--- linux-2.6.35.4/arch/powerpc/kernel/signal_64.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/powerpc/kernel/signal_64.c 2010-09-17 20:12:09.000000000 -0400 @@ -429,7 +429,7 @@ int handle_rt_signal64(int signr, struct current->thread.fpscr.val = 0; @@ -2688,9 +2682,9 @@ diff -urNp linux-2.6.34.1/arch/powerpc/kernel/signal_64.c linux-2.6.34.1/arch/po regs->link = current->mm->context.vdso_base + vdso64_rt_sigtramp; } else { err |= setup_trampoline(__NR_rt_sigreturn, &frame->tramp[0]); -diff -urNp linux-2.6.34.1/arch/powerpc/kernel/vdso.c linux-2.6.34.1/arch/powerpc/kernel/vdso.c ---- linux-2.6.34.1/arch/powerpc/kernel/vdso.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/powerpc/kernel/vdso.c 2010-07-07 09:04:43.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/powerpc/kernel/vdso.c linux-2.6.35.4/arch/powerpc/kernel/vdso.c +--- linux-2.6.35.4/arch/powerpc/kernel/vdso.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/powerpc/kernel/vdso.c 2010-09-17 20:12:09.000000000 -0400 @@ -36,6 +36,7 @@ #include #include @@ -2717,9 +2711,9 @@ diff -urNp linux-2.6.34.1/arch/powerpc/kernel/vdso.c linux-2.6.34.1/arch/powerpc if (IS_ERR_VALUE(vdso_base)) { rc = vdso_base; goto fail_mmapsem; -diff -urNp linux-2.6.34.1/arch/powerpc/kernel/vio.c linux-2.6.34.1/arch/powerpc/kernel/vio.c ---- linux-2.6.34.1/arch/powerpc/kernel/vio.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/powerpc/kernel/vio.c 2010-07-07 09:04:43.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/powerpc/kernel/vio.c linux-2.6.35.4/arch/powerpc/kernel/vio.c +--- linux-2.6.35.4/arch/powerpc/kernel/vio.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/powerpc/kernel/vio.c 2010-09-17 20:12:09.000000000 -0400 @@ -602,11 +602,12 @@ static void vio_dma_iommu_unmap_sg(struc vio_cmo_dealloc(viodev, alloc_size); } @@ -2734,7 +2728,7 @@ diff -urNp linux-2.6.34.1/arch/powerpc/kernel/vio.c linux-2.6.34.1/arch/powerpc/ .map_page = vio_dma_iommu_map_page, .unmap_page = vio_dma_iommu_unmap_page, -@@ -858,7 +859,6 @@ static void vio_cmo_bus_remove(struct vi +@@ -860,7 +861,6 @@ static void vio_cmo_bus_remove(struct vi static void vio_cmo_set_dma_ops(struct vio_dev *viodev) { @@ -2742,9 +2736,9 @@ diff -urNp linux-2.6.34.1/arch/powerpc/kernel/vio.c linux-2.6.34.1/arch/powerpc/ viodev->dev.archdata.dma_ops = &vio_dma_mapping_ops; } -diff -urNp linux-2.6.34.1/arch/powerpc/lib/usercopy_64.c linux-2.6.34.1/arch/powerpc/lib/usercopy_64.c ---- linux-2.6.34.1/arch/powerpc/lib/usercopy_64.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/powerpc/lib/usercopy_64.c 2010-07-07 09:04:43.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/powerpc/lib/usercopy_64.c linux-2.6.35.4/arch/powerpc/lib/usercopy_64.c +--- linux-2.6.35.4/arch/powerpc/lib/usercopy_64.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/powerpc/lib/usercopy_64.c 2010-09-17 20:12:09.000000000 -0400 @@ -9,22 +9,6 @@ #include #include @@ -2776,9 +2770,9 @@ diff -urNp linux-2.6.34.1/arch/powerpc/lib/usercopy_64.c linux-2.6.34.1/arch/pow -EXPORT_SYMBOL(copy_to_user); EXPORT_SYMBOL(copy_in_user); -diff -urNp linux-2.6.34.1/arch/powerpc/mm/fault.c linux-2.6.34.1/arch/powerpc/mm/fault.c ---- linux-2.6.34.1/arch/powerpc/mm/fault.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/powerpc/mm/fault.c 2010-07-07 09:04:43.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/powerpc/mm/fault.c linux-2.6.35.4/arch/powerpc/mm/fault.c +--- linux-2.6.35.4/arch/powerpc/mm/fault.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/powerpc/mm/fault.c 2010-09-17 20:12:09.000000000 -0400 @@ -30,6 +30,10 @@ #include #include @@ -2841,7 +2835,7 @@ diff -urNp linux-2.6.34.1/arch/powerpc/mm/fault.c linux-2.6.34.1/arch/powerpc/mm else is_write = error_code & DSISR_ISSTORE; #else -@@ -256,7 +288,7 @@ good_area: +@@ -257,7 +289,7 @@ good_area: * "undefined". Of those that can be set, this is the only * one which seems bad. */ @@ -2850,7 +2844,7 @@ diff -urNp linux-2.6.34.1/arch/powerpc/mm/fault.c linux-2.6.34.1/arch/powerpc/mm /* Guarded storage error. */ goto bad_area; #endif /* CONFIG_8xx */ -@@ -271,7 +303,7 @@ good_area: +@@ -272,7 +304,7 @@ good_area: * processors use the same I/D cache coherency mechanism * as embedded. */ @@ -2883,9 +2877,9 @@ diff -urNp linux-2.6.34.1/arch/powerpc/mm/fault.c linux-2.6.34.1/arch/powerpc/mm _exception(SIGSEGV, regs, code, address); return 0; } -diff -urNp linux-2.6.34.1/arch/powerpc/mm/mmap_64.c linux-2.6.34.1/arch/powerpc/mm/mmap_64.c ---- linux-2.6.34.1/arch/powerpc/mm/mmap_64.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/powerpc/mm/mmap_64.c 2010-07-07 09:04:43.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/powerpc/mm/mmap_64.c linux-2.6.35.4/arch/powerpc/mm/mmap_64.c +--- linux-2.6.35.4/arch/powerpc/mm/mmap_64.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/powerpc/mm/mmap_64.c 2010-09-17 20:12:09.000000000 -0400 @@ -99,10 +99,22 @@ void arch_pick_mmap_layout(struct mm_str */ if (mmap_is_legacy()) { @@ -2909,10 +2903,40 @@ diff -urNp linux-2.6.34.1/arch/powerpc/mm/mmap_64.c linux-2.6.34.1/arch/powerpc/ mm->get_unmapped_area = arch_get_unmapped_area_topdown; mm->unmap_area = arch_unmap_area_topdown; } -diff -urNp linux-2.6.34.1/arch/powerpc/mm/slice.c linux-2.6.34.1/arch/powerpc/mm/slice.c ---- linux-2.6.34.1/arch/powerpc/mm/slice.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/powerpc/mm/slice.c 2010-07-07 09:04:43.000000000 -0400 -@@ -426,6 +426,11 @@ unsigned long slice_get_unmapped_area(un +diff -urNp linux-2.6.35.4/arch/powerpc/mm/slice.c linux-2.6.35.4/arch/powerpc/mm/slice.c +--- linux-2.6.35.4/arch/powerpc/mm/slice.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/powerpc/mm/slice.c 2010-09-17 20:12:09.000000000 -0400 +@@ -98,10 +98,9 @@ static int slice_area_is_free(struct mm_ + if ((mm->task_size - len) < addr) + return 0; + vma = find_vma(mm, addr); +- return (!vma || (addr + len) <= vma->vm_start); ++ return check_heap_stack_gap(vma, addr, len); + } + +-static int slice_low_has_vma(struct mm_struct *mm, unsigned long slice) + { + return !slice_area_is_free(mm, slice << SLICE_LOW_SHIFT, + 1ul << SLICE_LOW_SHIFT); +@@ -256,7 +255,7 @@ full_search: + addr = _ALIGN_UP(addr + 1, 1ul << SLICE_HIGH_SHIFT); + continue; + } +- if (!vma || addr + len <= vma->vm_start) { ++ if (check_heap_stack_gap(vma, addr, len)) { + /* + * Remember the place where we stopped the search: + */ +@@ -336,7 +335,7 @@ static unsigned long slice_find_area_top + * return with success: + */ + vma = find_vma(mm, addr); +- if (!vma || (addr + len) <= vma->vm_start) { ++ if (check_heap_stack_gap(vma, addr, len)) { + /* remember the address as a hint for next time */ + if (use_cache) + mm->free_area_cache = addr; +@@ -426,6 +425,11 @@ unsigned long slice_get_unmapped_area(un if (fixed && addr > (mm->task_size - len)) return -EINVAL; @@ -2924,9 +2948,9 @@ diff -urNp linux-2.6.34.1/arch/powerpc/mm/slice.c linux-2.6.34.1/arch/powerpc/mm /* If hint, make sure it matches our alignment restrictions */ if (!fixed && addr) { addr = _ALIGN_UP(addr, 1ul << pshift); -diff -urNp linux-2.6.34.1/arch/powerpc/platforms/52xx/lite5200_pm.c linux-2.6.34.1/arch/powerpc/platforms/52xx/lite5200_pm.c ---- linux-2.6.34.1/arch/powerpc/platforms/52xx/lite5200_pm.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/powerpc/platforms/52xx/lite5200_pm.c 2010-07-07 09:04:43.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/powerpc/platforms/52xx/lite5200_pm.c linux-2.6.35.4/arch/powerpc/platforms/52xx/lite5200_pm.c +--- linux-2.6.35.4/arch/powerpc/platforms/52xx/lite5200_pm.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/powerpc/platforms/52xx/lite5200_pm.c 2010-09-17 20:12:09.000000000 -0400 @@ -235,7 +235,7 @@ static void lite5200_pm_end(void) lite5200_pm_target_state = PM_SUSPEND_ON; } @@ -2936,10 +2960,10 @@ diff -urNp linux-2.6.34.1/arch/powerpc/platforms/52xx/lite5200_pm.c linux-2.6.34 .valid = lite5200_pm_valid, .begin = lite5200_pm_begin, .prepare = lite5200_pm_prepare, -diff -urNp linux-2.6.34.1/arch/powerpc/platforms/52xx/mpc52xx_pm.c linux-2.6.34.1/arch/powerpc/platforms/52xx/mpc52xx_pm.c ---- linux-2.6.34.1/arch/powerpc/platforms/52xx/mpc52xx_pm.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/powerpc/platforms/52xx/mpc52xx_pm.c 2010-07-07 09:04:43.000000000 -0400 -@@ -180,7 +180,7 @@ void mpc52xx_pm_finish(void) +diff -urNp linux-2.6.35.4/arch/powerpc/platforms/52xx/mpc52xx_pm.c linux-2.6.35.4/arch/powerpc/platforms/52xx/mpc52xx_pm.c +--- linux-2.6.35.4/arch/powerpc/platforms/52xx/mpc52xx_pm.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/powerpc/platforms/52xx/mpc52xx_pm.c 2010-09-17 20:12:09.000000000 -0400 +@@ -189,7 +189,7 @@ void mpc52xx_pm_finish(void) iounmap(mbar); } @@ -2948,9 +2972,9 @@ diff -urNp linux-2.6.34.1/arch/powerpc/platforms/52xx/mpc52xx_pm.c linux-2.6.34. .valid = mpc52xx_pm_valid, .prepare = mpc52xx_pm_prepare, .enter = mpc52xx_pm_enter, -diff -urNp linux-2.6.34.1/arch/powerpc/platforms/83xx/suspend.c linux-2.6.34.1/arch/powerpc/platforms/83xx/suspend.c ---- linux-2.6.34.1/arch/powerpc/platforms/83xx/suspend.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/powerpc/platforms/83xx/suspend.c 2010-07-07 09:04:43.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/powerpc/platforms/83xx/suspend.c linux-2.6.35.4/arch/powerpc/platforms/83xx/suspend.c +--- linux-2.6.35.4/arch/powerpc/platforms/83xx/suspend.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/powerpc/platforms/83xx/suspend.c 2010-09-17 20:12:09.000000000 -0400 @@ -311,7 +311,7 @@ static int mpc83xx_is_pci_agent(void) return ret; } @@ -2960,10 +2984,10 @@ diff -urNp linux-2.6.34.1/arch/powerpc/platforms/83xx/suspend.c linux-2.6.34.1/a .valid = mpc83xx_suspend_valid, .begin = mpc83xx_suspend_begin, .enter = mpc83xx_suspend_enter, -diff -urNp linux-2.6.34.1/arch/powerpc/platforms/cell/iommu.c linux-2.6.34.1/arch/powerpc/platforms/cell/iommu.c ---- linux-2.6.34.1/arch/powerpc/platforms/cell/iommu.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/powerpc/platforms/cell/iommu.c 2010-07-07 09:04:43.000000000 -0400 -@@ -643,7 +643,7 @@ static int dma_fixed_dma_supported(struc +diff -urNp linux-2.6.35.4/arch/powerpc/platforms/cell/iommu.c linux-2.6.35.4/arch/powerpc/platforms/cell/iommu.c +--- linux-2.6.35.4/arch/powerpc/platforms/cell/iommu.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/powerpc/platforms/cell/iommu.c 2010-09-17 20:12:09.000000000 -0400 +@@ -642,7 +642,7 @@ static int dma_fixed_dma_supported(struc static int dma_set_mask_and_switch(struct device *dev, u64 dma_mask); @@ -2972,9 +2996,9 @@ diff -urNp linux-2.6.34.1/arch/powerpc/platforms/cell/iommu.c linux-2.6.34.1/arc .alloc_coherent = dma_fixed_alloc_coherent, .free_coherent = dma_fixed_free_coherent, .map_sg = dma_fixed_map_sg, -diff -urNp linux-2.6.34.1/arch/powerpc/platforms/ps3/system-bus.c linux-2.6.34.1/arch/powerpc/platforms/ps3/system-bus.c ---- linux-2.6.34.1/arch/powerpc/platforms/ps3/system-bus.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/powerpc/platforms/ps3/system-bus.c 2010-07-07 09:04:43.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/powerpc/platforms/ps3/system-bus.c linux-2.6.35.4/arch/powerpc/platforms/ps3/system-bus.c +--- linux-2.6.35.4/arch/powerpc/platforms/ps3/system-bus.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/powerpc/platforms/ps3/system-bus.c 2010-09-17 20:12:09.000000000 -0400 @@ -695,7 +695,7 @@ static int ps3_dma_supported(struct devi return mask >= DMA_BIT_MASK(32); } @@ -2993,9 +3017,9 @@ diff -urNp linux-2.6.34.1/arch/powerpc/platforms/ps3/system-bus.c linux-2.6.34.1 .alloc_coherent = ps3_alloc_coherent, .free_coherent = ps3_free_coherent, .map_sg = ps3_ioc0_map_sg, -diff -urNp linux-2.6.34.1/arch/powerpc/sysdev/fsl_pmc.c linux-2.6.34.1/arch/powerpc/sysdev/fsl_pmc.c ---- linux-2.6.34.1/arch/powerpc/sysdev/fsl_pmc.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/powerpc/sysdev/fsl_pmc.c 2010-07-07 09:04:43.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/powerpc/sysdev/fsl_pmc.c linux-2.6.35.4/arch/powerpc/sysdev/fsl_pmc.c +--- linux-2.6.35.4/arch/powerpc/sysdev/fsl_pmc.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/powerpc/sysdev/fsl_pmc.c 2010-09-17 20:12:09.000000000 -0400 @@ -53,7 +53,7 @@ static int pmc_suspend_valid(suspend_sta return 1; } @@ -3005,30 +3029,21 @@ diff -urNp linux-2.6.34.1/arch/powerpc/sysdev/fsl_pmc.c linux-2.6.34.1/arch/powe .valid = pmc_suspend_valid, .enter = pmc_suspend_enter, }; -diff -urNp linux-2.6.34.1/arch/s390/Kconfig linux-2.6.34.1/arch/s390/Kconfig ---- linux-2.6.34.1/arch/s390/Kconfig 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/s390/Kconfig 2010-07-07 09:04:43.000000000 -0400 -@@ -229,13 +229,12 @@ config AUDIT_ARCH +diff -urNp linux-2.6.35.4/arch/s390/include/asm/compat.h linux-2.6.35.4/arch/s390/include/asm/compat.h +--- linux-2.6.35.4/arch/s390/include/asm/compat.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/s390/include/asm/compat.h 2010-09-17 20:12:37.000000000 -0400 +@@ -181,7 +181,7 @@ static inline int is_compat_task(void) - config S390_EXEC_PROTECT - bool "Data execute protection" -+ default y - help - This option allows to enable a buffer overflow protection for user -- space programs and it also selects the addressing mode option above. -- The kernel parameter noexec=on will enable this feature and also -- switch the addressing modes, default is disabled. Enabling this (via -- kernel parameter) on machines earlier than IBM System z9-109 EC/BC -- will reduce system performance. -+ space programs. -+ Enabling this on machines earlier than IBM System z9-109 EC/BC will -+ reduce system performance. + #endif - comment "Code generation options" +-static inline void __user *compat_alloc_user_space(long len) ++static inline void __user *arch_compat_alloc_user_space(long len) + { + unsigned long stack; -diff -urNp linux-2.6.34.1/arch/s390/include/asm/elf.h linux-2.6.34.1/arch/s390/include/asm/elf.h ---- linux-2.6.34.1/arch/s390/include/asm/elf.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/s390/include/asm/elf.h 2010-07-07 09:04:43.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/s390/include/asm/elf.h linux-2.6.35.4/arch/s390/include/asm/elf.h +--- linux-2.6.35.4/arch/s390/include/asm/elf.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/s390/include/asm/elf.h 2010-09-17 20:12:09.000000000 -0400 @@ -163,6 +163,13 @@ extern unsigned int vdso_enabled; that it will "exec", and that there is sufficient room for the brk. */ #define ELF_ET_DYN_BASE (STACK_TOP / 3 * 2) @@ -3043,9 +3058,9 @@ diff -urNp linux-2.6.34.1/arch/s390/include/asm/elf.h linux-2.6.34.1/arch/s390/i /* This yields a mask that user programs can use to figure out what instruction set this CPU supports. */ -diff -urNp linux-2.6.34.1/arch/s390/include/asm/uaccess.h linux-2.6.34.1/arch/s390/include/asm/uaccess.h ---- linux-2.6.34.1/arch/s390/include/asm/uaccess.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/s390/include/asm/uaccess.h 2010-07-07 09:04:43.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/s390/include/asm/uaccess.h linux-2.6.35.4/arch/s390/include/asm/uaccess.h +--- linux-2.6.35.4/arch/s390/include/asm/uaccess.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/s390/include/asm/uaccess.h 2010-09-17 20:12:09.000000000 -0400 @@ -234,6 +234,10 @@ static inline unsigned long __must_check copy_to_user(void __user *to, const void *from, unsigned long n) { @@ -3078,10 +3093,31 @@ diff -urNp linux-2.6.34.1/arch/s390/include/asm/uaccess.h linux-2.6.34.1/arch/s3 if (unlikely(sz != -1 && sz < n)) { copy_from_user_overflow(); return n; -diff -urNp linux-2.6.34.1/arch/s390/kernel/module.c linux-2.6.34.1/arch/s390/kernel/module.c ---- linux-2.6.34.1/arch/s390/kernel/module.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/s390/kernel/module.c 2010-07-07 09:04:43.000000000 -0400 -@@ -166,11 +166,11 @@ module_frob_arch_sections(Elf_Ehdr *hdr, +diff -urNp linux-2.6.35.4/arch/s390/Kconfig linux-2.6.35.4/arch/s390/Kconfig +--- linux-2.6.35.4/arch/s390/Kconfig 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/s390/Kconfig 2010-09-17 20:12:09.000000000 -0400 +@@ -230,13 +230,12 @@ config AUDIT_ARCH + + config S390_EXEC_PROTECT + bool "Data execute protection" ++ default y + help + This option allows to enable a buffer overflow protection for user +- space programs and it also selects the addressing mode option above. +- The kernel parameter noexec=on will enable this feature and also +- switch the addressing modes, default is disabled. Enabling this (via +- kernel parameter) on machines earlier than IBM System z9-109 EC/BC +- will reduce system performance. ++ space programs. ++ Enabling this on machines earlier than IBM System z9-109 EC/BC will ++ reduce system performance. + + comment "Code generation options" + +diff -urNp linux-2.6.35.4/arch/s390/kernel/module.c linux-2.6.35.4/arch/s390/kernel/module.c +--- linux-2.6.35.4/arch/s390/kernel/module.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/s390/kernel/module.c 2010-09-17 20:12:09.000000000 -0400 +@@ -168,11 +168,11 @@ module_frob_arch_sections(Elf_Ehdr *hdr, /* Increase core size by size of got & plt and set start offsets for got and plt. */ @@ -3098,7 +3134,7 @@ diff -urNp linux-2.6.34.1/arch/s390/kernel/module.c linux-2.6.34.1/arch/s390/ker return 0; } -@@ -256,7 +256,7 @@ apply_rela(Elf_Rela *rela, Elf_Addr base +@@ -258,7 +258,7 @@ apply_rela(Elf_Rela *rela, Elf_Addr base if (info->got_initialized == 0) { Elf_Addr *gotent; @@ -3107,7 +3143,7 @@ diff -urNp linux-2.6.34.1/arch/s390/kernel/module.c linux-2.6.34.1/arch/s390/ker info->got_offset; *gotent = val; info->got_initialized = 1; -@@ -280,7 +280,7 @@ apply_rela(Elf_Rela *rela, Elf_Addr base +@@ -282,7 +282,7 @@ apply_rela(Elf_Rela *rela, Elf_Addr base else if (r_type == R_390_GOTENT || r_type == R_390_GOTPLTENT) *(unsigned int *) loc = @@ -3116,7 +3152,7 @@ diff -urNp linux-2.6.34.1/arch/s390/kernel/module.c linux-2.6.34.1/arch/s390/ker else if (r_type == R_390_GOT64 || r_type == R_390_GOTPLT64) *(unsigned long *) loc = val; -@@ -294,7 +294,7 @@ apply_rela(Elf_Rela *rela, Elf_Addr base +@@ -296,7 +296,7 @@ apply_rela(Elf_Rela *rela, Elf_Addr base case R_390_PLTOFF64: /* 16 bit offset from GOT to PLT. */ if (info->plt_initialized == 0) { unsigned int *ip; @@ -3125,7 +3161,7 @@ diff -urNp linux-2.6.34.1/arch/s390/kernel/module.c linux-2.6.34.1/arch/s390/ker info->plt_offset; #ifndef CONFIG_64BIT ip[0] = 0x0d105810; /* basr 1,0; l 1,6(1); br 1 */ -@@ -319,7 +319,7 @@ apply_rela(Elf_Rela *rela, Elf_Addr base +@@ -321,7 +321,7 @@ apply_rela(Elf_Rela *rela, Elf_Addr base val - loc + 0xffffUL < 0x1ffffeUL) || (r_type == R_390_PLT32DBL && val - loc + 0xffffffffULL < 0x1fffffffeULL))) @@ -3134,7 +3170,7 @@ diff -urNp linux-2.6.34.1/arch/s390/kernel/module.c linux-2.6.34.1/arch/s390/ker me->arch.plt_offset + info->plt_offset; val += rela->r_addend - loc; -@@ -341,7 +341,7 @@ apply_rela(Elf_Rela *rela, Elf_Addr base +@@ -343,7 +343,7 @@ apply_rela(Elf_Rela *rela, Elf_Addr base case R_390_GOTOFF32: /* 32 bit offset to GOT. */ case R_390_GOTOFF64: /* 64 bit offset to GOT. */ val = val + rela->r_addend - @@ -3143,7 +3179,7 @@ diff -urNp linux-2.6.34.1/arch/s390/kernel/module.c linux-2.6.34.1/arch/s390/ker if (r_type == R_390_GOTOFF16) *(unsigned short *) loc = val; else if (r_type == R_390_GOTOFF32) -@@ -351,7 +351,7 @@ apply_rela(Elf_Rela *rela, Elf_Addr base +@@ -353,7 +353,7 @@ apply_rela(Elf_Rela *rela, Elf_Addr base break; case R_390_GOTPC: /* 32 bit PC relative offset to GOT. */ case R_390_GOTPCDBL: /* 32 bit PC rel. off. to GOT shifted by 1. */ @@ -3152,10 +3188,10 @@ diff -urNp linux-2.6.34.1/arch/s390/kernel/module.c linux-2.6.34.1/arch/s390/ker rela->r_addend - loc; if (r_type == R_390_GOTPC) *(unsigned int *) loc = val; -diff -urNp linux-2.6.34.1/arch/s390/kernel/setup.c linux-2.6.34.1/arch/s390/kernel/setup.c ---- linux-2.6.34.1/arch/s390/kernel/setup.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/s390/kernel/setup.c 2010-07-07 09:04:43.000000000 -0400 -@@ -297,7 +297,7 @@ static int __init early_parse_mem(char * +diff -urNp linux-2.6.35.4/arch/s390/kernel/setup.c linux-2.6.35.4/arch/s390/kernel/setup.c +--- linux-2.6.35.4/arch/s390/kernel/setup.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/s390/kernel/setup.c 2010-09-17 20:12:09.000000000 -0400 +@@ -281,7 +281,7 @@ static int __init early_parse_mem(char * } early_param("mem", early_parse_mem); @@ -3164,7 +3200,7 @@ diff -urNp linux-2.6.34.1/arch/s390/kernel/setup.c linux-2.6.34.1/arch/s390/kern EXPORT_SYMBOL_GPL(user_mode); static int set_amode_and_uaccess(unsigned long user_amode, -@@ -326,17 +326,6 @@ static int set_amode_and_uaccess(unsigne +@@ -310,17 +310,6 @@ static int set_amode_and_uaccess(unsigne } } @@ -3182,7 +3218,7 @@ diff -urNp linux-2.6.34.1/arch/s390/kernel/setup.c linux-2.6.34.1/arch/s390/kern static int __init early_parse_user_mode(char *p) { if (p && strcmp(p, "primary") == 0) -@@ -353,20 +342,6 @@ static int __init early_parse_user_mode( +@@ -337,20 +326,6 @@ static int __init early_parse_user_mode( } early_param("user_mode", early_parse_user_mode); @@ -3203,9 +3239,9 @@ diff -urNp linux-2.6.34.1/arch/s390/kernel/setup.c linux-2.6.34.1/arch/s390/kern static void setup_addressing_mode(void) { if (user_mode == SECONDARY_SPACE_MODE) { -diff -urNp linux-2.6.34.1/arch/s390/mm/maccess.c linux-2.6.34.1/arch/s390/mm/maccess.c ---- linux-2.6.34.1/arch/s390/mm/maccess.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/s390/mm/maccess.c 2010-07-07 09:04:43.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/s390/mm/maccess.c linux-2.6.35.4/arch/s390/mm/maccess.c +--- linux-2.6.35.4/arch/s390/mm/maccess.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/s390/mm/maccess.c 2010-09-17 20:12:09.000000000 -0400 @@ -45,7 +45,7 @@ static long probe_kernel_write_odd(void return rc ? rc : count; } @@ -3215,9 +3251,9 @@ diff -urNp linux-2.6.34.1/arch/s390/mm/maccess.c linux-2.6.34.1/arch/s390/mm/mac { long copied = 0; -diff -urNp linux-2.6.34.1/arch/s390/mm/mmap.c linux-2.6.34.1/arch/s390/mm/mmap.c ---- linux-2.6.34.1/arch/s390/mm/mmap.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/s390/mm/mmap.c 2010-07-07 09:04:43.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/s390/mm/mmap.c linux-2.6.35.4/arch/s390/mm/mmap.c +--- linux-2.6.35.4/arch/s390/mm/mmap.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/s390/mm/mmap.c 2010-09-17 20:12:09.000000000 -0400 @@ -78,10 +78,22 @@ void arch_pick_mmap_layout(struct mm_str */ if (mmap_is_legacy()) { @@ -3264,9 +3300,9 @@ diff -urNp linux-2.6.34.1/arch/s390/mm/mmap.c linux-2.6.34.1/arch/s390/mm/mmap.c mm->get_unmapped_area = s390_get_unmapped_area_topdown; mm->unmap_area = arch_unmap_area_topdown; } -diff -urNp linux-2.6.34.1/arch/sh/boards/mach-hp6xx/pm.c linux-2.6.34.1/arch/sh/boards/mach-hp6xx/pm.c ---- linux-2.6.34.1/arch/sh/boards/mach-hp6xx/pm.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/sh/boards/mach-hp6xx/pm.c 2010-07-07 09:04:43.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/sh/boards/mach-hp6xx/pm.c linux-2.6.35.4/arch/sh/boards/mach-hp6xx/pm.c +--- linux-2.6.35.4/arch/sh/boards/mach-hp6xx/pm.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/sh/boards/mach-hp6xx/pm.c 2010-09-17 20:12:09.000000000 -0400 @@ -143,7 +143,7 @@ static int hp6x0_pm_enter(suspend_state_ return 0; } @@ -3276,9 +3312,9 @@ diff -urNp linux-2.6.34.1/arch/sh/boards/mach-hp6xx/pm.c linux-2.6.34.1/arch/sh/ .enter = hp6x0_pm_enter, .valid = suspend_valid_only_mem, }; -diff -urNp linux-2.6.34.1/arch/sh/include/asm/dma-mapping.h linux-2.6.34.1/arch/sh/include/asm/dma-mapping.h ---- linux-2.6.34.1/arch/sh/include/asm/dma-mapping.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/sh/include/asm/dma-mapping.h 2010-07-07 09:04:43.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/sh/include/asm/dma-mapping.h linux-2.6.35.4/arch/sh/include/asm/dma-mapping.h +--- linux-2.6.35.4/arch/sh/include/asm/dma-mapping.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/sh/include/asm/dma-mapping.h 2010-09-17 20:12:09.000000000 -0400 @@ -1,10 +1,10 @@ #ifndef __ASM_SH_DMA_MAPPING_H #define __ASM_SH_DMA_MAPPING_H @@ -3337,9 +3373,9 @@ diff -urNp linux-2.6.34.1/arch/sh/include/asm/dma-mapping.h linux-2.6.34.1/arch/ if (dma_release_from_coherent(dev, get_order(size), vaddr)) return; -diff -urNp linux-2.6.34.1/arch/sh/kernel/cpu/shmobile/pm.c linux-2.6.34.1/arch/sh/kernel/cpu/shmobile/pm.c ---- linux-2.6.34.1/arch/sh/kernel/cpu/shmobile/pm.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/sh/kernel/cpu/shmobile/pm.c 2010-07-07 09:04:43.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/sh/kernel/cpu/shmobile/pm.c linux-2.6.35.4/arch/sh/kernel/cpu/shmobile/pm.c +--- linux-2.6.35.4/arch/sh/kernel/cpu/shmobile/pm.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/sh/kernel/cpu/shmobile/pm.c 2010-09-17 20:12:09.000000000 -0400 @@ -141,7 +141,7 @@ static int sh_pm_enter(suspend_state_t s return 0; } @@ -3349,9 +3385,9 @@ diff -urNp linux-2.6.34.1/arch/sh/kernel/cpu/shmobile/pm.c linux-2.6.34.1/arch/s .enter = sh_pm_enter, .valid = suspend_valid_only_mem, }; -diff -urNp linux-2.6.34.1/arch/sh/kernel/dma-nommu.c linux-2.6.34.1/arch/sh/kernel/dma-nommu.c ---- linux-2.6.34.1/arch/sh/kernel/dma-nommu.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/sh/kernel/dma-nommu.c 2010-07-07 09:04:43.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/sh/kernel/dma-nommu.c linux-2.6.35.4/arch/sh/kernel/dma-nommu.c +--- linux-2.6.35.4/arch/sh/kernel/dma-nommu.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/sh/kernel/dma-nommu.c 2010-09-17 20:12:09.000000000 -0400 @@ -62,7 +62,7 @@ static void nommu_sync_sg(struct device } #endif @@ -3361,10 +3397,10 @@ diff -urNp linux-2.6.34.1/arch/sh/kernel/dma-nommu.c linux-2.6.34.1/arch/sh/kern .alloc_coherent = dma_generic_alloc_coherent, .free_coherent = dma_generic_free_coherent, .map_page = nommu_map_page, -diff -urNp linux-2.6.34.1/arch/sh/kernel/kgdb.c linux-2.6.34.1/arch/sh/kernel/kgdb.c ---- linux-2.6.34.1/arch/sh/kernel/kgdb.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/sh/kernel/kgdb.c 2010-07-07 09:04:43.000000000 -0400 -@@ -307,7 +307,7 @@ void kgdb_arch_exit(void) +diff -urNp linux-2.6.35.4/arch/sh/kernel/kgdb.c linux-2.6.35.4/arch/sh/kernel/kgdb.c +--- linux-2.6.35.4/arch/sh/kernel/kgdb.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/sh/kernel/kgdb.c 2010-09-17 20:12:09.000000000 -0400 +@@ -319,7 +319,7 @@ void kgdb_arch_exit(void) unregister_die_notifier(&kgdb_notifier); } @@ -3373,9 +3409,9 @@ diff -urNp linux-2.6.34.1/arch/sh/kernel/kgdb.c linux-2.6.34.1/arch/sh/kernel/kg /* Breakpoint instruction: trapa #0x3c */ #ifdef CONFIG_CPU_LITTLE_ENDIAN .gdb_bpt_instr = { 0x3c, 0xc3 }, -diff -urNp linux-2.6.34.1/arch/sh/mm/consistent.c linux-2.6.34.1/arch/sh/mm/consistent.c ---- linux-2.6.34.1/arch/sh/mm/consistent.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/sh/mm/consistent.c 2010-07-07 09:04:43.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/sh/mm/consistent.c linux-2.6.35.4/arch/sh/mm/consistent.c +--- linux-2.6.35.4/arch/sh/mm/consistent.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/sh/mm/consistent.c 2010-09-17 20:12:09.000000000 -0400 @@ -22,7 +22,7 @@ #define PREALLOC_DMA_DEBUG_ENTRIES 4096 @@ -3385,30 +3421,68 @@ diff -urNp linux-2.6.34.1/arch/sh/mm/consistent.c linux-2.6.34.1/arch/sh/mm/cons EXPORT_SYMBOL(dma_ops); static int __init dma_init(void) -diff -urNp linux-2.6.34.1/arch/sparc/Makefile linux-2.6.34.1/arch/sparc/Makefile ---- linux-2.6.34.1/arch/sparc/Makefile 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/sparc/Makefile 2010-07-07 09:04:44.000000000 -0400 -@@ -75,7 +75,7 @@ drivers-$(CONFIG_OPROFILE) += arch/sparc - # Export what is needed by arch/sparc/boot/Makefile - export VMLINUX_INIT VMLINUX_MAIN - VMLINUX_INIT := $(head-y) $(init-y) --VMLINUX_MAIN := $(core-y) kernel/ mm/ fs/ ipc/ security/ crypto/ block/ -+VMLINUX_MAIN := $(core-y) kernel/ mm/ fs/ ipc/ security/ crypto/ block/ grsecurity/ - VMLINUX_MAIN += $(patsubst %/, %/lib.a, $(libs-y)) $(libs-y) - VMLINUX_MAIN += $(drivers-y) $(net-y) +diff -urNp linux-2.6.35.4/arch/sh/mm/mmap.c linux-2.6.35.4/arch/sh/mm/mmap.c +--- linux-2.6.35.4/arch/sh/mm/mmap.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/sh/mm/mmap.c 2010-09-17 20:12:09.000000000 -0400 +@@ -74,8 +74,7 @@ unsigned long arch_get_unmapped_area(str + addr = PAGE_ALIGN(addr); + + vma = find_vma(mm, addr); +- if (TASK_SIZE - len >= addr && +- (!vma || addr + len <= vma->vm_start)) ++ if (TASK_SIZE - len >= addr && check_heap_stack_gap(vma, addr, len)) + return addr; + } -diff -urNp linux-2.6.34.1/arch/sparc/include/asm/atomic_64.h linux-2.6.34.1/arch/sparc/include/asm/atomic_64.h ---- linux-2.6.34.1/arch/sparc/include/asm/atomic_64.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/sparc/include/asm/atomic_64.h 2010-07-07 09:04:43.000000000 -0400 -@@ -14,18 +14,39 @@ +@@ -106,7 +105,7 @@ full_search: + } + return -ENOMEM; + } +- if (likely(!vma || addr + len <= vma->vm_start)) { ++ if (likely(check_heap_stack_gap(vma, addr, len))) { + /* + * Remember the place where we stopped the search: + */ +@@ -157,8 +156,7 @@ arch_get_unmapped_area_topdown(struct fi + addr = PAGE_ALIGN(addr); + + vma = find_vma(mm, addr); +- if (TASK_SIZE - len >= addr && +- (!vma || addr + len <= vma->vm_start)) ++ if (TASK_SIZE - len >= addr && check_heap_stack_gap(vma, addr, len)) + return addr; + } + +@@ -179,7 +177,7 @@ arch_get_unmapped_area_topdown(struct fi + /* make sure it can fit in the remaining address space */ + if (likely(addr > len)) { + vma = find_vma(mm, addr-len); +- if (!vma || addr <= vma->vm_start) { ++ if (check_heap_stack_gap(vma, addr - len, len)) { + /* remember the address as a hint for next time */ + return (mm->free_area_cache = addr-len); + } +@@ -199,7 +197,7 @@ arch_get_unmapped_area_topdown(struct fi + * return with success: + */ + vma = find_vma(mm, addr); +- if (likely(!vma || addr+len <= vma->vm_start)) { ++ if (likely(check_heap_stack_gap(vma, addr, len))) { + /* remember the address as a hint for next time */ + return (mm->free_area_cache = addr); + } +diff -urNp linux-2.6.35.4/arch/sparc/include/asm/atomic_64.h linux-2.6.35.4/arch/sparc/include/asm/atomic_64.h +--- linux-2.6.35.4/arch/sparc/include/asm/atomic_64.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/sparc/include/asm/atomic_64.h 2010-09-17 20:12:09.000000000 -0400 +@@ -14,18 +14,40 @@ #define ATOMIC64_INIT(i) { (i) } - #define atomic_read(v) ((v)->counter) + #define atomic_read(v) (*(volatile int *)&(v)->counter) +static inline int atomic_read_unchecked(const atomic_unchecked_t *v) +{ + return v->counter; +} - #define atomic64_read(v) ((v)->counter) + #define atomic64_read(v) (*(volatile long *)&(v)->counter) +static inline long atomic64_read_unchecked(const atomic64_unchecked_t *v) +{ + return v->counter; @@ -3427,28 +3501,37 @@ diff -urNp linux-2.6.34.1/arch/sparc/include/asm/atomic_64.h linux-2.6.34.1/arch extern void atomic_add(int, atomic_t *); +extern void atomic_add_unchecked(int, atomic_unchecked_t *); - extern void atomic64_add(int, atomic64_t *); -+extern void atomic64_add_unchecked(int, atomic64_unchecked_t *); + extern void atomic64_add(long, atomic64_t *); ++extern void atomic64_add_unchecked(long, atomic64_unchecked_t *); extern void atomic_sub(int, atomic_t *); +extern void atomic_sub_unchecked(int, atomic_unchecked_t *); - extern void atomic64_sub(int, atomic64_t *); -+extern void atomic64_sub_unchecked(int, atomic64_unchecked_t *); + extern void atomic64_sub(long, atomic64_t *); ++extern void atomic64_sub_unchecked(long, atomic64_unchecked_t *); extern int atomic_add_ret(int, atomic_t *); - extern int atomic64_add_ret(int, atomic64_t *); -+extern int atomic64_add_ret_unchecked(int, atomic64_unchecked_t *); ++extern int atomic_add_ret_unchecked(int, atomic_unchecked_t *); + extern long atomic64_add_ret(long, atomic64_t *); ++extern long atomic64_add_ret_unchecked(long, atomic64_unchecked_t *); extern int atomic_sub_ret(int, atomic_t *); - extern int atomic64_sub_ret(int, atomic64_t *); + extern long atomic64_sub_ret(long, atomic64_t *); -@@ -34,6 +55,7 @@ extern int atomic64_sub_ret(int, atomic6 +@@ -33,7 +55,15 @@ extern long atomic64_sub_ret(long, atomi + #define atomic64_dec_return(v) atomic64_sub_ret(1, v) #define atomic_inc_return(v) atomic_add_ret(1, v) ++static inline int atomic_inc_return_unchecked(atomic_unchecked_t *v) ++{ ++ return atomic_add_ret_unchecked(1, v); ++} #define atomic64_inc_return(v) atomic64_add_ret(1, v) -+#define atomic64_inc_return_unchecked(v) atomic64_add_ret_unchecked(1, v) ++static inline long atomic64_inc_return_unchecked(atomic64_unchecked_t *v) ++{ ++ return atomic64_add_ret_unchecked(1, v); ++} #define atomic_sub_return(i, v) atomic_sub_ret(i, v) #define atomic64_sub_return(i, v) atomic64_sub_ret(i, v) -@@ -59,10 +81,26 @@ extern int atomic64_sub_ret(int, atomic6 +@@ -59,10 +89,26 @@ extern long atomic64_sub_ret(long, atomi #define atomic64_dec_and_test(v) (atomic64_sub_ret(1, v) == 0) #define atomic_inc(v) atomic_add(1, v) @@ -3475,7 +3558,7 @@ diff -urNp linux-2.6.34.1/arch/sparc/include/asm/atomic_64.h linux-2.6.34.1/arch #define atomic_add_negative(i, v) (atomic_add_ret(i, v) < 0) #define atomic64_add_negative(i, v) (atomic64_add_ret(i, v) < 0) -@@ -72,17 +110,28 @@ extern int atomic64_sub_ret(int, atomic6 +@@ -72,17 +118,28 @@ extern long atomic64_sub_ret(long, atomi static inline int atomic_add_unless(atomic_t *v, int a, int u) { @@ -3508,9 +3591,9 @@ diff -urNp linux-2.6.34.1/arch/sparc/include/asm/atomic_64.h linux-2.6.34.1/arch } #define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0) -@@ -93,17 +142,28 @@ static inline int atomic_add_unless(atom +@@ -93,17 +150,28 @@ static inline int atomic_add_unless(atom - static inline int atomic64_add_unless(atomic64_t *v, long a, long u) + static inline long atomic64_add_unless(atomic64_t *v, long a, long u) { - long c, old; + long c, old, new; @@ -3541,9 +3624,21 @@ diff -urNp linux-2.6.34.1/arch/sparc/include/asm/atomic_64.h linux-2.6.34.1/arch } #define atomic64_inc_not_zero(v) atomic64_add_unless((v), 1, 0) -diff -urNp linux-2.6.34.1/arch/sparc/include/asm/dma-mapping.h linux-2.6.34.1/arch/sparc/include/asm/dma-mapping.h ---- linux-2.6.34.1/arch/sparc/include/asm/dma-mapping.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/sparc/include/asm/dma-mapping.h 2010-07-07 09:04:43.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/sparc/include/asm/compat.h linux-2.6.35.4/arch/sparc/include/asm/compat.h +--- linux-2.6.35.4/arch/sparc/include/asm/compat.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/sparc/include/asm/compat.h 2010-09-17 20:12:37.000000000 -0400 +@@ -167,7 +167,7 @@ static inline compat_uptr_t ptr_to_compa + return (u32)(unsigned long)uptr; + } + +-static inline void __user *compat_alloc_user_space(long len) ++static inline void __user *arch_compat_alloc_user_space(long len) + { + struct pt_regs *regs = current_thread_info()->kregs; + unsigned long usp = regs->u_regs[UREG_I6]; +diff -urNp linux-2.6.35.4/arch/sparc/include/asm/dma-mapping.h linux-2.6.35.4/arch/sparc/include/asm/dma-mapping.h +--- linux-2.6.35.4/arch/sparc/include/asm/dma-mapping.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/sparc/include/asm/dma-mapping.h 2010-09-17 20:12:09.000000000 -0400 @@ -13,10 +13,10 @@ extern int dma_supported(struct device * #define dma_free_noncoherent(d, s, v, h) dma_free_coherent(d, s, v, h) #define dma_is_consistent(d, h) (1) @@ -3575,9 +3670,9 @@ diff -urNp linux-2.6.34.1/arch/sparc/include/asm/dma-mapping.h linux-2.6.34.1/ar debug_dma_free_coherent(dev, size, cpu_addr, dma_handle); ops->free_coherent(dev, size, cpu_addr, dma_handle); -diff -urNp linux-2.6.34.1/arch/sparc/include/asm/elf_32.h linux-2.6.34.1/arch/sparc/include/asm/elf_32.h ---- linux-2.6.34.1/arch/sparc/include/asm/elf_32.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/sparc/include/asm/elf_32.h 2010-07-07 09:04:43.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/sparc/include/asm/elf_32.h linux-2.6.35.4/arch/sparc/include/asm/elf_32.h +--- linux-2.6.35.4/arch/sparc/include/asm/elf_32.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/sparc/include/asm/elf_32.h 2010-09-17 20:12:09.000000000 -0400 @@ -114,6 +114,13 @@ typedef struct { #define ELF_ET_DYN_BASE (TASK_UNMAPPED_BASE) @@ -3592,9 +3687,9 @@ diff -urNp linux-2.6.34.1/arch/sparc/include/asm/elf_32.h linux-2.6.34.1/arch/sp /* This yields a mask that user programs can use to figure out what instruction set this cpu supports. This can NOT be done in userspace on Sparc. */ -diff -urNp linux-2.6.34.1/arch/sparc/include/asm/elf_64.h linux-2.6.34.1/arch/sparc/include/asm/elf_64.h ---- linux-2.6.34.1/arch/sparc/include/asm/elf_64.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/sparc/include/asm/elf_64.h 2010-07-07 09:04:43.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/sparc/include/asm/elf_64.h linux-2.6.35.4/arch/sparc/include/asm/elf_64.h +--- linux-2.6.35.4/arch/sparc/include/asm/elf_64.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/sparc/include/asm/elf_64.h 2010-09-17 20:12:09.000000000 -0400 @@ -162,6 +162,12 @@ typedef struct { #define ELF_ET_DYN_BASE 0x0000010000000000UL #define COMPAT_ELF_ET_DYN_BASE 0x0000000070000000UL @@ -3608,9 +3703,9 @@ diff -urNp linux-2.6.34.1/arch/sparc/include/asm/elf_64.h linux-2.6.34.1/arch/sp /* This yields a mask that user programs can use to figure out what instruction set this cpu supports. */ -diff -urNp linux-2.6.34.1/arch/sparc/include/asm/pgtable_32.h linux-2.6.34.1/arch/sparc/include/asm/pgtable_32.h ---- linux-2.6.34.1/arch/sparc/include/asm/pgtable_32.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/sparc/include/asm/pgtable_32.h 2010-07-07 09:04:43.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/sparc/include/asm/pgtable_32.h linux-2.6.35.4/arch/sparc/include/asm/pgtable_32.h +--- linux-2.6.35.4/arch/sparc/include/asm/pgtable_32.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/sparc/include/asm/pgtable_32.h 2010-09-17 20:12:09.000000000 -0400 @@ -43,6 +43,13 @@ BTFIXUPDEF_SIMM13(user_ptrs_per_pgd) BTFIXUPDEF_INT(page_none) BTFIXUPDEF_INT(page_copy) @@ -3642,9 +3737,9 @@ diff -urNp linux-2.6.34.1/arch/sparc/include/asm/pgtable_32.h linux-2.6.34.1/arc extern unsigned long page_kernel; #ifdef MODULE -diff -urNp linux-2.6.34.1/arch/sparc/include/asm/pgtsrmmu.h linux-2.6.34.1/arch/sparc/include/asm/pgtsrmmu.h ---- linux-2.6.34.1/arch/sparc/include/asm/pgtsrmmu.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/sparc/include/asm/pgtsrmmu.h 2010-07-07 09:04:43.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/sparc/include/asm/pgtsrmmu.h linux-2.6.35.4/arch/sparc/include/asm/pgtsrmmu.h +--- linux-2.6.35.4/arch/sparc/include/asm/pgtsrmmu.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/sparc/include/asm/pgtsrmmu.h 2010-09-17 20:12:09.000000000 -0400 @@ -115,6 +115,13 @@ SRMMU_EXEC | SRMMU_REF) #define SRMMU_PAGE_RDONLY __pgprot(SRMMU_VALID | SRMMU_CACHE | \ @@ -3659,9 +3754,9 @@ diff -urNp linux-2.6.34.1/arch/sparc/include/asm/pgtsrmmu.h linux-2.6.34.1/arch/ #define SRMMU_PAGE_KERNEL __pgprot(SRMMU_VALID | SRMMU_CACHE | SRMMU_PRIV | \ SRMMU_DIRTY | SRMMU_REF) -diff -urNp linux-2.6.34.1/arch/sparc/include/asm/spinlock_64.h linux-2.6.34.1/arch/sparc/include/asm/spinlock_64.h ---- linux-2.6.34.1/arch/sparc/include/asm/spinlock_64.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/sparc/include/asm/spinlock_64.h 2010-07-07 09:04:43.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/sparc/include/asm/spinlock_64.h linux-2.6.35.4/arch/sparc/include/asm/spinlock_64.h +--- linux-2.6.35.4/arch/sparc/include/asm/spinlock_64.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/sparc/include/asm/spinlock_64.h 2010-09-17 20:12:09.000000000 -0400 @@ -99,7 +99,12 @@ static void inline arch_read_lock(arch_r __asm__ __volatile__ ( "1: ldsw [%2], %0\n" @@ -3713,21 +3808,9 @@ diff -urNp linux-2.6.34.1/arch/sparc/include/asm/spinlock_64.h linux-2.6.34.1/ar " cas [%2], %0, %1\n" " cmp %0, %1\n" " bne,pn %%xcc, 1b\n" -diff -urNp linux-2.6.34.1/arch/sparc/include/asm/uaccess.h linux-2.6.34.1/arch/sparc/include/asm/uaccess.h ---- linux-2.6.34.1/arch/sparc/include/asm/uaccess.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/sparc/include/asm/uaccess.h 2010-07-07 09:04:43.000000000 -0400 -@@ -1,5 +1,8 @@ - #ifndef ___ASM_SPARC_UACCESS_H - #define ___ASM_SPARC_UACCESS_H -+ -+extern void check_object_size(const void *ptr, unsigned long n, bool to); -+ - #if defined(__sparc__) && defined(__arch64__) - #include - #else -diff -urNp linux-2.6.34.1/arch/sparc/include/asm/uaccess_32.h linux-2.6.34.1/arch/sparc/include/asm/uaccess_32.h ---- linux-2.6.34.1/arch/sparc/include/asm/uaccess_32.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/sparc/include/asm/uaccess_32.h 2010-07-07 09:04:43.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/sparc/include/asm/uaccess_32.h linux-2.6.35.4/arch/sparc/include/asm/uaccess_32.h +--- linux-2.6.35.4/arch/sparc/include/asm/uaccess_32.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/sparc/include/asm/uaccess_32.h 2010-09-17 20:12:09.000000000 -0400 @@ -249,14 +249,25 @@ extern unsigned long __copy_user(void __ static inline unsigned long copy_to_user(void __user *to, const void *from, unsigned long n) @@ -3786,9 +3869,9 @@ diff -urNp linux-2.6.34.1/arch/sparc/include/asm/uaccess_32.h linux-2.6.34.1/arc return __copy_user((__force void __user *) to, from, n); } -diff -urNp linux-2.6.34.1/arch/sparc/include/asm/uaccess_64.h linux-2.6.34.1/arch/sparc/include/asm/uaccess_64.h ---- linux-2.6.34.1/arch/sparc/include/asm/uaccess_64.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/sparc/include/asm/uaccess_64.h 2010-07-07 09:04:43.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/sparc/include/asm/uaccess_64.h linux-2.6.35.4/arch/sparc/include/asm/uaccess_64.h +--- linux-2.6.35.4/arch/sparc/include/asm/uaccess_64.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/sparc/include/asm/uaccess_64.h 2010-09-17 20:12:09.000000000 -0400 @@ -10,6 +10,7 @@ #include #include @@ -3827,21 +3910,26 @@ diff -urNp linux-2.6.34.1/arch/sparc/include/asm/uaccess_64.h linux-2.6.34.1/arc if (unlikely(ret)) ret = copy_to_user_fixup(to, from, size); return ret; -diff -urNp linux-2.6.34.1/arch/sparc/kernel/Makefile linux-2.6.34.1/arch/sparc/kernel/Makefile ---- linux-2.6.34.1/arch/sparc/kernel/Makefile 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/sparc/kernel/Makefile 2010-07-07 09:04:43.000000000 -0400 -@@ -3,7 +3,7 @@ - # - - asflags-y := -ansi --ccflags-y := -Werror -+#ccflags-y := -Werror - - extra-y := head_$(BITS).o - extra-y += init_task.o -diff -urNp linux-2.6.34.1/arch/sparc/kernel/iommu.c linux-2.6.34.1/arch/sparc/kernel/iommu.c ---- linux-2.6.34.1/arch/sparc/kernel/iommu.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/sparc/kernel/iommu.c 2010-07-07 09:04:43.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/sparc/include/asm/uaccess.h linux-2.6.35.4/arch/sparc/include/asm/uaccess.h +--- linux-2.6.35.4/arch/sparc/include/asm/uaccess.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/sparc/include/asm/uaccess.h 2010-09-17 20:12:09.000000000 -0400 +@@ -1,5 +1,13 @@ + #ifndef ___ASM_SPARC_UACCESS_H + #define ___ASM_SPARC_UACCESS_H ++ ++#ifdef __KERNEL__ ++#ifndef __ASSEMBLY__ ++#include ++extern void check_object_size(const void *ptr, unsigned long n, bool to); ++#endif ++#endif ++ + #if defined(__sparc__) && defined(__arch64__) + #include + #else +diff -urNp linux-2.6.35.4/arch/sparc/kernel/iommu.c linux-2.6.35.4/arch/sparc/kernel/iommu.c +--- linux-2.6.35.4/arch/sparc/kernel/iommu.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/sparc/kernel/iommu.c 2010-09-17 20:12:09.000000000 -0400 @@ -828,7 +828,7 @@ static void dma_4u_sync_sg_for_cpu(struc spin_unlock_irqrestore(&iommu->lock, flags); } @@ -3860,9 +3948,9 @@ diff -urNp linux-2.6.34.1/arch/sparc/kernel/iommu.c linux-2.6.34.1/arch/sparc/ke EXPORT_SYMBOL(dma_ops); extern int pci64_dma_supported(struct pci_dev *pdev, u64 device_mask); -diff -urNp linux-2.6.34.1/arch/sparc/kernel/ioport.c linux-2.6.34.1/arch/sparc/kernel/ioport.c ---- linux-2.6.34.1/arch/sparc/kernel/ioport.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/sparc/kernel/ioport.c 2010-07-07 09:04:43.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/sparc/kernel/ioport.c linux-2.6.35.4/arch/sparc/kernel/ioport.c +--- linux-2.6.35.4/arch/sparc/kernel/ioport.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/sparc/kernel/ioport.c 2010-09-17 20:12:09.000000000 -0400 @@ -397,7 +397,7 @@ static void sbus_sync_sg_for_device(stru BUG(); } @@ -3890,11 +3978,11 @@ diff -urNp linux-2.6.34.1/arch/sparc/kernel/ioport.c linux-2.6.34.1/arch/sparc/k .alloc_coherent = pci32_alloc_coherent, .free_coherent = pci32_free_coherent, .map_page = pci32_map_page, -diff -urNp linux-2.6.34.1/arch/sparc/kernel/kgdb_32.c linux-2.6.34.1/arch/sparc/kernel/kgdb_32.c ---- linux-2.6.34.1/arch/sparc/kernel/kgdb_32.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/sparc/kernel/kgdb_32.c 2010-07-07 09:04:43.000000000 -0400 -@@ -158,7 +158,7 @@ void kgdb_arch_exit(void) - { +diff -urNp linux-2.6.35.4/arch/sparc/kernel/kgdb_32.c linux-2.6.35.4/arch/sparc/kernel/kgdb_32.c +--- linux-2.6.35.4/arch/sparc/kernel/kgdb_32.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/sparc/kernel/kgdb_32.c 2010-09-17 20:12:09.000000000 -0400 +@@ -164,7 +164,7 @@ void kgdb_arch_set_pc(struct pt_regs *re + regs->npc = regs->pc + 4; } -struct kgdb_arch arch_kgdb_ops = { @@ -3902,11 +3990,11 @@ diff -urNp linux-2.6.34.1/arch/sparc/kernel/kgdb_32.c linux-2.6.34.1/arch/sparc/ /* Breakpoint instruction: ta 0x7d */ .gdb_bpt_instr = { 0x91, 0xd0, 0x20, 0x7d }, }; -diff -urNp linux-2.6.34.1/arch/sparc/kernel/kgdb_64.c linux-2.6.34.1/arch/sparc/kernel/kgdb_64.c ---- linux-2.6.34.1/arch/sparc/kernel/kgdb_64.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/sparc/kernel/kgdb_64.c 2010-07-07 09:04:43.000000000 -0400 -@@ -181,7 +181,7 @@ void kgdb_arch_exit(void) - { +diff -urNp linux-2.6.35.4/arch/sparc/kernel/kgdb_64.c linux-2.6.35.4/arch/sparc/kernel/kgdb_64.c +--- linux-2.6.35.4/arch/sparc/kernel/kgdb_64.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/sparc/kernel/kgdb_64.c 2010-09-17 20:12:09.000000000 -0400 +@@ -187,7 +187,7 @@ void kgdb_arch_set_pc(struct pt_regs *re + regs->tnpc = regs->tpc + 4; } -struct kgdb_arch arch_kgdb_ops = { @@ -3914,9 +4002,21 @@ diff -urNp linux-2.6.34.1/arch/sparc/kernel/kgdb_64.c linux-2.6.34.1/arch/sparc/ /* Breakpoint instruction: ta 0x72 */ .gdb_bpt_instr = { 0x91, 0xd0, 0x20, 0x72 }, }; -diff -urNp linux-2.6.34.1/arch/sparc/kernel/pci_sun4v.c linux-2.6.34.1/arch/sparc/kernel/pci_sun4v.c ---- linux-2.6.34.1/arch/sparc/kernel/pci_sun4v.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/sparc/kernel/pci_sun4v.c 2010-07-07 09:04:43.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/sparc/kernel/Makefile linux-2.6.35.4/arch/sparc/kernel/Makefile +--- linux-2.6.35.4/arch/sparc/kernel/Makefile 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/sparc/kernel/Makefile 2010-09-17 20:12:09.000000000 -0400 +@@ -3,7 +3,7 @@ + # + + asflags-y := -ansi +-ccflags-y := -Werror ++#ccflags-y := -Werror + + extra-y := head_$(BITS).o + extra-y += init_task.o +diff -urNp linux-2.6.35.4/arch/sparc/kernel/pci_sun4v.c linux-2.6.35.4/arch/sparc/kernel/pci_sun4v.c +--- linux-2.6.35.4/arch/sparc/kernel/pci_sun4v.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/sparc/kernel/pci_sun4v.c 2010-09-17 20:12:09.000000000 -0400 @@ -525,7 +525,7 @@ static void dma_4v_unmap_sg(struct devic spin_unlock_irqrestore(&iommu->lock, flags); } @@ -3926,9 +4026,9 @@ diff -urNp linux-2.6.34.1/arch/sparc/kernel/pci_sun4v.c linux-2.6.34.1/arch/spar .alloc_coherent = dma_4v_alloc_coherent, .free_coherent = dma_4v_free_coherent, .map_page = dma_4v_map_page, -diff -urNp linux-2.6.34.1/arch/sparc/kernel/sys_sparc_32.c linux-2.6.34.1/arch/sparc/kernel/sys_sparc_32.c ---- linux-2.6.34.1/arch/sparc/kernel/sys_sparc_32.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/sparc/kernel/sys_sparc_32.c 2010-07-07 09:04:43.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/sparc/kernel/sys_sparc_32.c linux-2.6.35.4/arch/sparc/kernel/sys_sparc_32.c +--- linux-2.6.35.4/arch/sparc/kernel/sys_sparc_32.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/sparc/kernel/sys_sparc_32.c 2010-09-17 20:12:09.000000000 -0400 @@ -57,7 +57,7 @@ unsigned long arch_get_unmapped_area(str if (ARCH_SUN4C && len > 0x20000000) return -ENOMEM; @@ -3938,9 +4038,18 @@ diff -urNp linux-2.6.34.1/arch/sparc/kernel/sys_sparc_32.c linux-2.6.34.1/arch/s if (flags & MAP_SHARED) addr = COLOUR_ALIGN(addr); -diff -urNp linux-2.6.34.1/arch/sparc/kernel/sys_sparc_64.c linux-2.6.34.1/arch/sparc/kernel/sys_sparc_64.c ---- linux-2.6.34.1/arch/sparc/kernel/sys_sparc_64.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/sparc/kernel/sys_sparc_64.c 2010-07-07 09:04:43.000000000 -0400 +@@ -72,7 +72,7 @@ unsigned long arch_get_unmapped_area(str + } + if (TASK_SIZE - PAGE_SIZE - len < addr) + return -ENOMEM; +- if (!vmm || addr + len <= vmm->vm_start) ++ if (check_heap_stack_gap(vmm, addr, len)) + return addr; + addr = vmm->vm_end; + if (flags & MAP_SHARED) +diff -urNp linux-2.6.35.4/arch/sparc/kernel/sys_sparc_64.c linux-2.6.35.4/arch/sparc/kernel/sys_sparc_64.c +--- linux-2.6.35.4/arch/sparc/kernel/sys_sparc_64.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/sparc/kernel/sys_sparc_64.c 2010-09-17 20:12:09.000000000 -0400 @@ -124,7 +124,7 @@ unsigned long arch_get_unmapped_area(str /* We do not accept a shared mapping if it would violate * cache aliasing constraints. @@ -3961,7 +4070,14 @@ diff -urNp linux-2.6.34.1/arch/sparc/kernel/sys_sparc_64.c linux-2.6.34.1/arch/s if (addr) { if (do_color_align) addr = COLOUR_ALIGN(addr, pgoff); -@@ -152,9 +156,9 @@ unsigned long arch_get_unmapped_area(str +@@ -146,15 +150,14 @@ unsigned long arch_get_unmapped_area(str + addr = PAGE_ALIGN(addr); + + vma = find_vma(mm, addr); +- if (task_size - len >= addr && +- (!vma || addr + len <= vma->vm_start)) ++ if (task_size - len >= addr && check_heap_stack_gap(vma, addr, len)) + return addr; } if (len > mm->cached_hole_size) { @@ -3973,7 +4089,7 @@ diff -urNp linux-2.6.34.1/arch/sparc/kernel/sys_sparc_64.c linux-2.6.34.1/arch/s mm->cached_hole_size = 0; } -@@ -174,8 +178,8 @@ full_search: +@@ -174,14 +177,14 @@ full_search: vma = find_vma(mm, VA_EXCLUDE_END); } if (unlikely(task_size < addr)) { @@ -3984,7 +4100,14 @@ diff -urNp linux-2.6.34.1/arch/sparc/kernel/sys_sparc_64.c linux-2.6.34.1/arch/s mm->cached_hole_size = 0; goto full_search; } -@@ -215,7 +219,7 @@ arch_get_unmapped_area_topdown(struct fi + return -ENOMEM; + } +- if (likely(!vma || addr + len <= vma->vm_start)) { ++ if (likely(check_heap_stack_gap(vma, addr, len))) { + /* + * Remember the place where we stopped the search: + */ +@@ -215,7 +218,7 @@ arch_get_unmapped_area_topdown(struct fi /* We do not accept a shared mapping if it would violate * cache aliasing constraints. */ @@ -3993,7 +4116,35 @@ diff -urNp linux-2.6.34.1/arch/sparc/kernel/sys_sparc_64.c linux-2.6.34.1/arch/s ((addr - (pgoff << PAGE_SHIFT)) & (SHMLBA - 1))) return -EINVAL; return addr; -@@ -385,6 +389,12 @@ void arch_pick_mmap_layout(struct mm_str +@@ -236,8 +239,7 @@ arch_get_unmapped_area_topdown(struct fi + addr = PAGE_ALIGN(addr); + + vma = find_vma(mm, addr); +- if (task_size - len >= addr && +- (!vma || addr + len <= vma->vm_start)) ++ if (task_size - len >= addr && check_heap_stack_gap(vma, addr, len)) + return addr; + } + +@@ -258,7 +260,7 @@ arch_get_unmapped_area_topdown(struct fi + /* make sure it can fit in the remaining address space */ + if (likely(addr > len)) { + vma = find_vma(mm, addr-len); +- if (!vma || addr <= vma->vm_start) { ++ if (check_heap_stack_gap(vma, addr - len, len)) { + /* remember the address as a hint for next time */ + return (mm->free_area_cache = addr-len); + } +@@ -278,7 +280,7 @@ arch_get_unmapped_area_topdown(struct fi + * return with success: + */ + vma = find_vma(mm, addr); +- if (likely(!vma || addr+len <= vma->vm_start)) { ++ if (likely(check_heap_stack_gap(vma, addr, len))) { + /* remember the address as a hint for next time */ + return (mm->free_area_cache = addr); + } +@@ -385,6 +387,12 @@ void arch_pick_mmap_layout(struct mm_str gap == RLIM_INFINITY || sysctl_legacy_va_layout) { mm->mmap_base = TASK_UNMAPPED_BASE + random_factor; @@ -4006,7 +4157,7 @@ diff -urNp linux-2.6.34.1/arch/sparc/kernel/sys_sparc_64.c linux-2.6.34.1/arch/s mm->get_unmapped_area = arch_get_unmapped_area; mm->unmap_area = arch_unmap_area; } else { -@@ -397,6 +407,12 @@ void arch_pick_mmap_layout(struct mm_str +@@ -397,6 +405,12 @@ void arch_pick_mmap_layout(struct mm_str gap = (task_size / 6 * 5); mm->mmap_base = PAGE_ALIGN(task_size - gap - random_factor); @@ -4019,10 +4170,10 @@ diff -urNp linux-2.6.34.1/arch/sparc/kernel/sys_sparc_64.c linux-2.6.34.1/arch/s mm->get_unmapped_area = arch_get_unmapped_area_topdown; mm->unmap_area = arch_unmap_area_topdown; } -diff -urNp linux-2.6.34.1/arch/sparc/kernel/traps_64.c linux-2.6.34.1/arch/sparc/kernel/traps_64.c ---- linux-2.6.34.1/arch/sparc/kernel/traps_64.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/sparc/kernel/traps_64.c 2010-07-07 09:04:43.000000000 -0400 -@@ -94,6 +94,12 @@ void bad_trap(struct pt_regs *regs, long +diff -urNp linux-2.6.35.4/arch/sparc/kernel/traps_64.c linux-2.6.35.4/arch/sparc/kernel/traps_64.c +--- linux-2.6.35.4/arch/sparc/kernel/traps_64.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/sparc/kernel/traps_64.c 2010-09-17 20:12:09.000000000 -0400 +@@ -95,6 +95,12 @@ void bad_trap(struct pt_regs *regs, long lvl -= 0x100; if (regs->tstate & TSTATE_PRIV) { @@ -4035,7 +4186,7 @@ diff -urNp linux-2.6.34.1/arch/sparc/kernel/traps_64.c linux-2.6.34.1/arch/sparc sprintf(buffer, "Kernel bad sw trap %lx", lvl); die_if_kernel(buffer, regs); } -@@ -112,11 +118,16 @@ void bad_trap(struct pt_regs *regs, long +@@ -113,11 +119,16 @@ void bad_trap(struct pt_regs *regs, long void bad_trap_tl1(struct pt_regs *regs, long lvl) { char buffer[32]; @@ -4053,9 +4204,9 @@ diff -urNp linux-2.6.34.1/arch/sparc/kernel/traps_64.c linux-2.6.34.1/arch/sparc dump_tl1_traplog((struct tl1_traplog *)(regs + 1)); sprintf (buffer, "Bad trap %lx at tl>0", lvl); -diff -urNp linux-2.6.34.1/arch/sparc/lib/atomic_64.S linux-2.6.34.1/arch/sparc/lib/atomic_64.S ---- linux-2.6.34.1/arch/sparc/lib/atomic_64.S 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/sparc/lib/atomic_64.S 2010-07-07 09:04:44.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/sparc/lib/atomic_64.S linux-2.6.35.4/arch/sparc/lib/atomic_64.S +--- linux-2.6.35.4/arch/sparc/lib/atomic_64.S 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/sparc/lib/atomic_64.S 2010-09-17 20:12:37.000000000 -0400 @@ -18,7 +18,12 @@ atomic_add: /* %o0 = increment, %o1 = atomic_ptr */ BACKOFF_SETUP(%o2) @@ -4138,7 +4289,28 @@ diff -urNp linux-2.6.34.1/arch/sparc/lib/atomic_64.S linux-2.6.34.1/arch/sparc/l cas [%o1], %g1, %g7 cmp %g1, %g7 bne,pn %icc, 2f -@@ -64,7 +109,12 @@ atomic_add_ret: /* %o0 = increment, %o1 +@@ -59,12 +104,33 @@ atomic_add_ret: /* %o0 = increment, %o1 + 2: BACKOFF_SPIN(%o2, %o3, 1b) + .size atomic_add_ret, .-atomic_add_ret + ++ .globl atomic_add_ret_unchecked ++ .type atomic_add_ret_unchecked,#function ++atomic_add_ret_unchecked: /* %o0 = increment, %o1 = atomic_ptr */ ++ BACKOFF_SETUP(%o2) ++1: lduw [%o1], %g1 ++ addcc %g1, %o0, %g7 ++ cas [%o1], %g1, %g7 ++ cmp %g1, %g7 ++ bne,pn %icc, 2f ++ add %g7, %o0, %g7 ++ sra %g7, 0, %o0 ++ retl ++ nop ++2: BACKOFF_SPIN(%o2, %o3, 1b) ++ .size atomic_add_ret_unchecked, .-atomic_add_ret_unchecked ++ + .globl atomic_sub_ret + .type atomic_sub_ret,#function atomic_sub_ret: /* %o0 = decrement, %o1 = atomic_ptr */ BACKOFF_SETUP(%o2) 1: lduw [%o1], %g1 @@ -4152,7 +4324,7 @@ diff -urNp linux-2.6.34.1/arch/sparc/lib/atomic_64.S linux-2.6.34.1/arch/sparc/l cas [%o1], %g1, %g7 cmp %g1, %g7 bne,pn %icc, 2f -@@ -80,7 +130,12 @@ atomic_sub_ret: /* %o0 = decrement, %o1 +@@ -80,7 +146,12 @@ atomic_sub_ret: /* %o0 = decrement, %o1 atomic64_add: /* %o0 = increment, %o1 = atomic_ptr */ BACKOFF_SETUP(%o2) 1: ldx [%o1], %g1 @@ -4166,7 +4338,7 @@ diff -urNp linux-2.6.34.1/arch/sparc/lib/atomic_64.S linux-2.6.34.1/arch/sparc/l casx [%o1], %g1, %g7 cmp %g1, %g7 bne,pn %xcc, 2f -@@ -90,12 +145,32 @@ atomic64_add: /* %o0 = increment, %o1 = +@@ -90,12 +161,32 @@ atomic64_add: /* %o0 = increment, %o1 = 2: BACKOFF_SPIN(%o2, %o3, 1b) .size atomic64_add, .-atomic64_add @@ -4200,7 +4372,7 @@ diff -urNp linux-2.6.34.1/arch/sparc/lib/atomic_64.S linux-2.6.34.1/arch/sparc/l casx [%o1], %g1, %g7 cmp %g1, %g7 bne,pn %xcc, 2f -@@ -105,12 +180,32 @@ atomic64_sub: /* %o0 = decrement, %o1 = +@@ -105,12 +196,32 @@ atomic64_sub: /* %o0 = decrement, %o1 = 2: BACKOFF_SPIN(%o2, %o3, 1b) .size atomic64_sub, .-atomic64_sub @@ -4234,7 +4406,7 @@ diff -urNp linux-2.6.34.1/arch/sparc/lib/atomic_64.S linux-2.6.34.1/arch/sparc/l casx [%o1], %g1, %g7 cmp %g1, %g7 bne,pn %xcc, 2f -@@ -121,12 +216,33 @@ atomic64_add_ret: /* %o0 = increment, %o +@@ -121,12 +232,33 @@ atomic64_add_ret: /* %o0 = increment, %o 2: BACKOFF_SPIN(%o2, %o3, 1b) .size atomic64_add_ret, .-atomic64_add_ret @@ -4269,10 +4441,10 @@ diff -urNp linux-2.6.34.1/arch/sparc/lib/atomic_64.S linux-2.6.34.1/arch/sparc/l casx [%o1], %g1, %g7 cmp %g1, %g7 bne,pn %xcc, 2f -diff -urNp linux-2.6.34.1/arch/sparc/lib/ksyms.c linux-2.6.34.1/arch/sparc/lib/ksyms.c ---- linux-2.6.34.1/arch/sparc/lib/ksyms.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/sparc/lib/ksyms.c 2010-07-07 09:04:44.000000000 -0400 -@@ -142,12 +142,15 @@ EXPORT_SYMBOL(__downgrade_write); +diff -urNp linux-2.6.35.4/arch/sparc/lib/ksyms.c linux-2.6.35.4/arch/sparc/lib/ksyms.c +--- linux-2.6.35.4/arch/sparc/lib/ksyms.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/sparc/lib/ksyms.c 2010-09-17 20:12:09.000000000 -0400 +@@ -142,12 +142,17 @@ EXPORT_SYMBOL(__downgrade_write); /* Atomic counter implementation. */ EXPORT_SYMBOL(atomic_add); @@ -4282,15 +4454,17 @@ diff -urNp linux-2.6.34.1/arch/sparc/lib/ksyms.c linux-2.6.34.1/arch/sparc/lib/k +EXPORT_SYMBOL(atomic_sub_unchecked); EXPORT_SYMBOL(atomic_sub_ret); EXPORT_SYMBOL(atomic64_add); ++EXPORT_SYMBOL(atomic64_add_unchecked); EXPORT_SYMBOL(atomic64_add_ret); ++EXPORT_SYMBOL(atomic64_add_ret_unchecked); EXPORT_SYMBOL(atomic64_sub); +EXPORT_SYMBOL(atomic64_sub_unchecked); EXPORT_SYMBOL(atomic64_sub_ret); /* Atomic bit operations. */ -diff -urNp linux-2.6.34.1/arch/sparc/lib/rwsem_64.S linux-2.6.34.1/arch/sparc/lib/rwsem_64.S ---- linux-2.6.34.1/arch/sparc/lib/rwsem_64.S 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/sparc/lib/rwsem_64.S 2010-07-07 09:04:44.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/sparc/lib/rwsem_64.S linux-2.6.35.4/arch/sparc/lib/rwsem_64.S +--- linux-2.6.35.4/arch/sparc/lib/rwsem_64.S 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/sparc/lib/rwsem_64.S 2010-09-17 20:12:09.000000000 -0400 @@ -11,7 +11,12 @@ .globl __down_read __down_read: @@ -4389,21 +4563,21 @@ diff -urNp linux-2.6.34.1/arch/sparc/lib/rwsem_64.S linux-2.6.34.1/arch/sparc/li cas [%o0], %g3, %g7 cmp %g3, %g7 bne,pn %icc, 1b -diff -urNp linux-2.6.34.1/arch/sparc/mm/Makefile linux-2.6.34.1/arch/sparc/mm/Makefile ---- linux-2.6.34.1/arch/sparc/mm/Makefile 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/sparc/mm/Makefile 2010-07-07 09:04:44.000000000 -0400 -@@ -2,7 +2,7 @@ - # - - asflags-y := -ansi --ccflags-y := -Werror -+#ccflags-y := -Werror +diff -urNp linux-2.6.35.4/arch/sparc/Makefile linux-2.6.35.4/arch/sparc/Makefile +--- linux-2.6.35.4/arch/sparc/Makefile 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/sparc/Makefile 2010-09-17 20:12:37.000000000 -0400 +@@ -75,7 +75,7 @@ drivers-$(CONFIG_OPROFILE) += arch/sparc + # Export what is needed by arch/sparc/boot/Makefile + export VMLINUX_INIT VMLINUX_MAIN + VMLINUX_INIT := $(head-y) $(init-y) +-VMLINUX_MAIN := $(core-y) kernel/ mm/ fs/ ipc/ security/ crypto/ block/ ++VMLINUX_MAIN := $(core-y) kernel/ mm/ fs/ ipc/ security/ crypto/ block/ grsecurity/ + VMLINUX_MAIN += $(patsubst %/, %/lib.a, $(libs-y)) $(libs-y) + VMLINUX_MAIN += $(drivers-y) $(net-y) - obj-$(CONFIG_SPARC64) += ultra.o tlb.o tsb.o - obj-y += fault_$(BITS).o -diff -urNp linux-2.6.34.1/arch/sparc/mm/fault_32.c linux-2.6.34.1/arch/sparc/mm/fault_32.c ---- linux-2.6.34.1/arch/sparc/mm/fault_32.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/sparc/mm/fault_32.c 2010-07-07 09:04:44.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/sparc/mm/fault_32.c linux-2.6.35.4/arch/sparc/mm/fault_32.c +--- linux-2.6.35.4/arch/sparc/mm/fault_32.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/sparc/mm/fault_32.c 2010-09-17 20:12:09.000000000 -0400 @@ -22,6 +22,9 @@ #include #include @@ -4708,9 +4882,9 @@ diff -urNp linux-2.6.34.1/arch/sparc/mm/fault_32.c linux-2.6.34.1/arch/sparc/mm/ /* Allow reads even for write-only mappings */ if(!(vma->vm_flags & (VM_READ | VM_EXEC))) goto bad_area; -diff -urNp linux-2.6.34.1/arch/sparc/mm/fault_64.c linux-2.6.34.1/arch/sparc/mm/fault_64.c ---- linux-2.6.34.1/arch/sparc/mm/fault_64.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/sparc/mm/fault_64.c 2010-07-07 09:04:44.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/sparc/mm/fault_64.c linux-2.6.35.4/arch/sparc/mm/fault_64.c +--- linux-2.6.35.4/arch/sparc/mm/fault_64.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/sparc/mm/fault_64.c 2010-09-17 20:12:09.000000000 -0400 @@ -21,6 +21,9 @@ #include #include @@ -5209,9 +5383,49 @@ diff -urNp linux-2.6.34.1/arch/sparc/mm/fault_64.c linux-2.6.34.1/arch/sparc/mm/ /* Pure DTLB misses do not tell us whether the fault causing * load/store/atomic was a write or not, it only says that there * was no match. So in such a case we (carefully) read the -diff -urNp linux-2.6.34.1/arch/sparc/mm/init_32.c linux-2.6.34.1/arch/sparc/mm/init_32.c ---- linux-2.6.34.1/arch/sparc/mm/init_32.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/sparc/mm/init_32.c 2010-07-07 09:04:44.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/sparc/mm/hugetlbpage.c linux-2.6.35.4/arch/sparc/mm/hugetlbpage.c +--- linux-2.6.35.4/arch/sparc/mm/hugetlbpage.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/sparc/mm/hugetlbpage.c 2010-09-17 20:12:09.000000000 -0400 +@@ -68,7 +68,7 @@ full_search: + } + return -ENOMEM; + } +- if (likely(!vma || addr + len <= vma->vm_start)) { ++ if (likely(check_heap_stack_gap(vma, addr, len))) { + /* + * Remember the place where we stopped the search: + */ +@@ -107,7 +107,7 @@ hugetlb_get_unmapped_area_topdown(struct + /* make sure it can fit in the remaining address space */ + if (likely(addr > len)) { + vma = find_vma(mm, addr-len); +- if (!vma || addr <= vma->vm_start) { ++ if (check_heap_stack_gap(vma, addr - len, len)) { + /* remember the address as a hint for next time */ + return (mm->free_area_cache = addr-len); + } +@@ -125,7 +125,7 @@ hugetlb_get_unmapped_area_topdown(struct + * return with success: + */ + vma = find_vma(mm, addr); +- if (likely(!vma || addr+len <= vma->vm_start)) { ++ if (likely(check_heap_stack_gap(vma, addr, len))) { + /* remember the address as a hint for next time */ + return (mm->free_area_cache = addr); + } +@@ -182,8 +182,7 @@ hugetlb_get_unmapped_area(struct file *f + if (addr) { + addr = ALIGN(addr, HPAGE_SIZE); + vma = find_vma(mm, addr); +- if (task_size - len >= addr && +- (!vma || addr + len <= vma->vm_start)) ++ if (task_size - len >= addr && check_heap_stack_gap(vma, addr, len)) + return addr; + } + if (mm->get_unmapped_area == arch_get_unmapped_area) +diff -urNp linux-2.6.35.4/arch/sparc/mm/init_32.c linux-2.6.35.4/arch/sparc/mm/init_32.c +--- linux-2.6.35.4/arch/sparc/mm/init_32.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/sparc/mm/init_32.c 2010-09-17 20:12:09.000000000 -0400 @@ -318,6 +318,9 @@ extern void device_scan(void); pgprot_t PAGE_SHARED __read_mostly; EXPORT_SYMBOL(PAGE_SHARED); @@ -5246,9 +5460,21 @@ diff -urNp linux-2.6.34.1/arch/sparc/mm/init_32.c linux-2.6.34.1/arch/sparc/mm/i protection_map[12] = PAGE_READONLY; protection_map[13] = PAGE_READONLY; protection_map[14] = PAGE_SHARED; -diff -urNp linux-2.6.34.1/arch/sparc/mm/srmmu.c linux-2.6.34.1/arch/sparc/mm/srmmu.c ---- linux-2.6.34.1/arch/sparc/mm/srmmu.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/sparc/mm/srmmu.c 2010-07-07 09:04:44.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/sparc/mm/Makefile linux-2.6.35.4/arch/sparc/mm/Makefile +--- linux-2.6.35.4/arch/sparc/mm/Makefile 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/sparc/mm/Makefile 2010-09-17 20:12:09.000000000 -0400 +@@ -2,7 +2,7 @@ + # + + asflags-y := -ansi +-ccflags-y := -Werror ++#ccflags-y := -Werror + + obj-$(CONFIG_SPARC64) += ultra.o tlb.o tsb.o + obj-y += fault_$(BITS).o +diff -urNp linux-2.6.35.4/arch/sparc/mm/srmmu.c linux-2.6.35.4/arch/sparc/mm/srmmu.c +--- linux-2.6.35.4/arch/sparc/mm/srmmu.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/sparc/mm/srmmu.c 2010-09-17 20:12:09.000000000 -0400 @@ -2198,6 +2198,13 @@ void __init ld_mmu_srmmu(void) PAGE_SHARED = pgprot_val(SRMMU_PAGE_SHARED); BTFIXUPSET_INT(page_copy, pgprot_val(SRMMU_PAGE_COPY)); @@ -5263,9 +5489,9 @@ diff -urNp linux-2.6.34.1/arch/sparc/mm/srmmu.c linux-2.6.34.1/arch/sparc/mm/srm BTFIXUPSET_INT(page_kernel, pgprot_val(SRMMU_PAGE_KERNEL)); page_kernel = pgprot_val(SRMMU_PAGE_KERNEL); -diff -urNp linux-2.6.34.1/arch/um/include/asm/kmap_types.h linux-2.6.34.1/arch/um/include/asm/kmap_types.h ---- linux-2.6.34.1/arch/um/include/asm/kmap_types.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/um/include/asm/kmap_types.h 2010-07-07 09:04:44.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/um/include/asm/kmap_types.h linux-2.6.35.4/arch/um/include/asm/kmap_types.h +--- linux-2.6.35.4/arch/um/include/asm/kmap_types.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/um/include/asm/kmap_types.h 2010-09-17 20:12:09.000000000 -0400 @@ -23,6 +23,7 @@ enum km_type { KM_IRQ1, KM_SOFTIRQ0, @@ -5274,9 +5500,9 @@ diff -urNp linux-2.6.34.1/arch/um/include/asm/kmap_types.h linux-2.6.34.1/arch/u KM_TYPE_NR }; -diff -urNp linux-2.6.34.1/arch/um/include/asm/page.h linux-2.6.34.1/arch/um/include/asm/page.h ---- linux-2.6.34.1/arch/um/include/asm/page.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/um/include/asm/page.h 2010-07-07 09:04:44.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/um/include/asm/page.h linux-2.6.35.4/arch/um/include/asm/page.h +--- linux-2.6.35.4/arch/um/include/asm/page.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/um/include/asm/page.h 2010-09-17 20:12:09.000000000 -0400 @@ -14,6 +14,9 @@ #define PAGE_SIZE (_AC(1, UL) << PAGE_SHIFT) #define PAGE_MASK (~(PAGE_SIZE-1)) @@ -5287,9 +5513,9 @@ diff -urNp linux-2.6.34.1/arch/um/include/asm/page.h linux-2.6.34.1/arch/um/incl #ifndef __ASSEMBLY__ struct page; -diff -urNp linux-2.6.34.1/arch/um/sys-i386/syscalls.c linux-2.6.34.1/arch/um/sys-i386/syscalls.c ---- linux-2.6.34.1/arch/um/sys-i386/syscalls.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/um/sys-i386/syscalls.c 2010-07-07 09:04:44.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/um/sys-i386/syscalls.c linux-2.6.35.4/arch/um/sys-i386/syscalls.c +--- linux-2.6.35.4/arch/um/sys-i386/syscalls.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/um/sys-i386/syscalls.c 2010-09-17 20:12:09.000000000 -0400 @@ -11,6 +11,21 @@ #include "asm/uaccess.h" #include "asm/unistd.h" @@ -5312,116 +5538,9 @@ diff -urNp linux-2.6.34.1/arch/um/sys-i386/syscalls.c linux-2.6.34.1/arch/um/sys /* * The prototype on i386 is: * -diff -urNp linux-2.6.34.1/arch/x86/Kconfig linux-2.6.34.1/arch/x86/Kconfig ---- linux-2.6.34.1/arch/x86/Kconfig 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/Kconfig 2010-07-07 09:04:46.000000000 -0400 -@@ -1123,7 +1123,7 @@ config PAGE_OFFSET - hex - default 0xB0000000 if VMSPLIT_3G_OPT - default 0x80000000 if VMSPLIT_2G -- default 0x78000000 if VMSPLIT_2G_OPT -+ default 0x70000000 if VMSPLIT_2G_OPT - default 0x40000000 if VMSPLIT_1G - default 0xC0000000 - depends on X86_32 -@@ -1457,7 +1457,7 @@ config ARCH_USES_PG_UNCACHED - - config EFI - bool "EFI runtime service support" -- depends on ACPI -+ depends on ACPI && !PAX_KERNEXEC - ---help--- - This enables the kernel to use EFI runtime services that are - available (such as the EFI variable services). -@@ -1544,6 +1544,7 @@ config KEXEC_JUMP - config PHYSICAL_START - hex "Physical address where the kernel is loaded" if (EMBEDDED || CRASH_DUMP) - default "0x1000000" -+ range 0x400000 0x40000000 - ---help--- - This gives the physical address where the kernel is loaded. - -@@ -1608,6 +1609,7 @@ config PHYSICAL_ALIGN - hex - prompt "Alignment value to which kernel should be aligned" if X86_32 - default "0x1000000" -+ range 0x400000 0x1000000 if PAX_KERNEXEC - range 0x2000 0x1000000 - ---help--- - This value puts the alignment restrictions on physical address -@@ -1639,9 +1641,10 @@ config HOTPLUG_CPU - Say N if you want to disable CPU hotplug. - - config COMPAT_VDSO -- def_bool y -+ def_bool n - prompt "Compat VDSO support" - depends on X86_32 || IA32_EMULATION -+ depends on !PAX_NOEXEC && !PAX_MEMORY_UDEREF - ---help--- - Map the 32-bit VDSO to the predictable old-style address too. - -diff -urNp linux-2.6.34.1/arch/x86/Kconfig.cpu linux-2.6.34.1/arch/x86/Kconfig.cpu ---- linux-2.6.34.1/arch/x86/Kconfig.cpu 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/Kconfig.cpu 2010-07-07 09:04:46.000000000 -0400 -@@ -336,7 +336,7 @@ config X86_PPRO_FENCE - - config X86_F00F_BUG - def_bool y -- depends on M586MMX || M586TSC || M586 || M486 || M386 -+ depends on (M586MMX || M586TSC || M586 || M486 || M386) && !PAX_KERNEXEC - - config X86_WP_WORKS_OK - def_bool y -@@ -356,7 +356,7 @@ config X86_POPAD_OK - - config X86_ALIGNMENT_16 - def_bool y -- depends on MWINCHIP3D || MWINCHIPC6 || MCYRIXIII || X86_ELAN || MK6 || M586MMX || M586TSC || M586 || M486 || MVIAC3_2 || MGEODEGX1 -+ depends on MWINCHIP3D || MWINCHIPC6 || MCYRIXIII || X86_ELAN || MK8 || MK7 || MK6 || MCORE2 || MPENTIUM4 || MPENTIUMIII || MPENTIUMII || M686 || M586MMX || M586TSC || M586 || M486 || MVIAC3_2 || MGEODEGX1 - - config X86_INTEL_USERCOPY - def_bool y -@@ -402,7 +402,7 @@ config X86_CMPXCHG64 - # generates cmov. - config X86_CMOV - def_bool y -- depends on (MK8 || MK7 || MCORE2 || MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M686 || MVIAC3_2 || MVIAC7 || MCRUSOE || MEFFICEON || X86_64 || MATOM || MGEODE_LX) -+ depends on (MK8 || MK7 || MCORE2 || MPSC || MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M686 || MVIAC3_2 || MVIAC7 || MCRUSOE || MEFFICEON || X86_64 || MATOM || MGEODE_LX) - - config X86_MINIMUM_CPU_FAMILY - int -diff -urNp linux-2.6.34.1/arch/x86/Kconfig.debug linux-2.6.34.1/arch/x86/Kconfig.debug ---- linux-2.6.34.1/arch/x86/Kconfig.debug 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/Kconfig.debug 2010-07-07 09:04:46.000000000 -0400 -@@ -99,7 +99,7 @@ config X86_PTDUMP - config DEBUG_RODATA - bool "Write protect kernel read-only data structures" - default y -- depends on DEBUG_KERNEL -+ depends on DEBUG_KERNEL && BROKEN - ---help--- - Mark the kernel read-only data as write-protected in the pagetables, - in order to catch accidental (and incorrect) writes to such const -diff -urNp linux-2.6.34.1/arch/x86/Makefile linux-2.6.34.1/arch/x86/Makefile ---- linux-2.6.34.1/arch/x86/Makefile 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/Makefile 2010-07-07 09:04:49.000000000 -0400 -@@ -190,3 +190,12 @@ define archhelp - echo ' FDARGS="..." arguments for the booted kernel' - echo ' FDINITRD=file initrd for the booted kernel' - endef -+ -+define OLD_LD -+ -+*** ${VERSION}.${PATCHLEVEL} PaX kernels no longer build correctly with old versions of binutils. -+*** Please upgrade your binutils to 2.18 or newer -+endef -+ -+archprepare: -+ $(if $(LDFLAGS_BUILD_ID),,$(error $(OLD_LD))) -diff -urNp linux-2.6.34.1/arch/x86/boot/bitops.h linux-2.6.34.1/arch/x86/boot/bitops.h ---- linux-2.6.34.1/arch/x86/boot/bitops.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/boot/bitops.h 2010-07-07 09:04:44.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/boot/bitops.h linux-2.6.35.4/arch/x86/boot/bitops.h +--- linux-2.6.35.4/arch/x86/boot/bitops.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/boot/bitops.h 2010-09-17 20:12:09.000000000 -0400 @@ -26,7 +26,7 @@ static inline int variable_test_bit(int u8 v; const u32 *p = (const u32 *)addr; @@ -5440,9 +5559,9 @@ diff -urNp linux-2.6.34.1/arch/x86/boot/bitops.h linux-2.6.34.1/arch/x86/boot/bi } #endif /* BOOT_BITOPS_H */ -diff -urNp linux-2.6.34.1/arch/x86/boot/boot.h linux-2.6.34.1/arch/x86/boot/boot.h ---- linux-2.6.34.1/arch/x86/boot/boot.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/boot/boot.h 2010-07-07 09:04:44.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/boot/boot.h linux-2.6.35.4/arch/x86/boot/boot.h +--- linux-2.6.35.4/arch/x86/boot/boot.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/boot/boot.h 2010-09-17 20:12:09.000000000 -0400 @@ -82,7 +82,7 @@ static inline void io_delay(void) static inline u16 ds(void) { @@ -5461,9 +5580,9 @@ diff -urNp linux-2.6.34.1/arch/x86/boot/boot.h linux-2.6.34.1/arch/x86/boot/boot : "=qm" (diff), "+D" (s1), "+S" (s2), "+c" (len)); return diff; } -diff -urNp linux-2.6.34.1/arch/x86/boot/compressed/head_32.S linux-2.6.34.1/arch/x86/boot/compressed/head_32.S ---- linux-2.6.34.1/arch/x86/boot/compressed/head_32.S 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/boot/compressed/head_32.S 2010-07-07 09:04:44.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/boot/compressed/head_32.S linux-2.6.35.4/arch/x86/boot/compressed/head_32.S +--- linux-2.6.35.4/arch/x86/boot/compressed/head_32.S 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/boot/compressed/head_32.S 2010-09-17 20:12:09.000000000 -0400 @@ -76,7 +76,7 @@ ENTRY(startup_32) notl %eax andl %eax, %ebx @@ -5492,9 +5611,9 @@ diff -urNp linux-2.6.34.1/arch/x86/boot/compressed/head_32.S linux-2.6.34.1/arch addl %ebx, -__PAGE_OFFSET(%ebx, %ecx) jmp 1b 2: -diff -urNp linux-2.6.34.1/arch/x86/boot/compressed/head_64.S linux-2.6.34.1/arch/x86/boot/compressed/head_64.S ---- linux-2.6.34.1/arch/x86/boot/compressed/head_64.S 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/boot/compressed/head_64.S 2010-07-07 09:04:45.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/boot/compressed/head_64.S linux-2.6.35.4/arch/x86/boot/compressed/head_64.S +--- linux-2.6.35.4/arch/x86/boot/compressed/head_64.S 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/boot/compressed/head_64.S 2010-09-17 20:12:09.000000000 -0400 @@ -91,7 +91,7 @@ ENTRY(startup_32) notl %eax andl %eax, %ebx @@ -5513,9 +5632,9 @@ diff -urNp linux-2.6.34.1/arch/x86/boot/compressed/head_64.S linux-2.6.34.1/arch #endif /* Target address to relocate to for decompression */ -diff -urNp linux-2.6.34.1/arch/x86/boot/compressed/misc.c linux-2.6.34.1/arch/x86/boot/compressed/misc.c ---- linux-2.6.34.1/arch/x86/boot/compressed/misc.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/boot/compressed/misc.c 2010-07-07 09:04:45.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/boot/compressed/misc.c linux-2.6.35.4/arch/x86/boot/compressed/misc.c +--- linux-2.6.35.4/arch/x86/boot/compressed/misc.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/boot/compressed/misc.c 2010-09-17 20:12:09.000000000 -0400 @@ -285,7 +285,7 @@ static void parse_elf(void *output) case PT_LOAD: #ifdef CONFIG_RELOCATABLE @@ -5534,9 +5653,9 @@ diff -urNp linux-2.6.34.1/arch/x86/boot/compressed/misc.c linux-2.6.34.1/arch/x8 error("Wrong destination address"); #endif -diff -urNp linux-2.6.34.1/arch/x86/boot/compressed/mkpiggy.c linux-2.6.34.1/arch/x86/boot/compressed/mkpiggy.c ---- linux-2.6.34.1/arch/x86/boot/compressed/mkpiggy.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/boot/compressed/mkpiggy.c 2010-07-07 09:04:45.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/boot/compressed/mkpiggy.c linux-2.6.35.4/arch/x86/boot/compressed/mkpiggy.c +--- linux-2.6.35.4/arch/x86/boot/compressed/mkpiggy.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/boot/compressed/mkpiggy.c 2010-09-17 20:12:09.000000000 -0400 @@ -74,7 +74,7 @@ int main(int argc, char *argv[]) offs = (olen > ilen) ? olen - ilen : 0; @@ -5545,10 +5664,10 @@ diff -urNp linux-2.6.34.1/arch/x86/boot/compressed/mkpiggy.c linux-2.6.34.1/arch + offs += 64*1024; /* Add 64K bytes slack */ offs = (offs+4095) & ~4095; /* Round to a 4K boundary */ - printf(".section \".rodata.compressed\",\"a\",@progbits\n"); -diff -urNp linux-2.6.34.1/arch/x86/boot/compressed/relocs.c linux-2.6.34.1/arch/x86/boot/compressed/relocs.c ---- linux-2.6.34.1/arch/x86/boot/compressed/relocs.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/boot/compressed/relocs.c 2010-07-07 09:04:45.000000000 -0400 + printf(".section \".rodata..compressed\",\"a\",@progbits\n"); +diff -urNp linux-2.6.35.4/arch/x86/boot/compressed/relocs.c linux-2.6.35.4/arch/x86/boot/compressed/relocs.c +--- linux-2.6.35.4/arch/x86/boot/compressed/relocs.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/boot/compressed/relocs.c 2010-09-17 20:12:09.000000000 -0400 @@ -13,8 +13,11 @@ static void die(char *fmt, ...); @@ -5706,12 +5825,12 @@ diff -urNp linux-2.6.34.1/arch/x86/boot/compressed/relocs.c linux-2.6.34.1/arch/ continue; } + /* Don't relocate actual per-cpu variables, they are absolute indices, not addresses */ -+ if (!strcmp(sec_name(sym->st_shndx), ".data.percpu") && strcmp(sym_name(sym_strtab, sym), "__per_cpu_load")) ++ if (!strcmp(sec_name(sym->st_shndx), ".data..percpu") && strcmp(sym_name(sym_strtab, sym), "__per_cpu_load")) + continue; + +#if defined(CONFIG_PAX_KERNEXEC) && defined(CONFIG_X86_32) + /* Don't relocate actual code, they are relocated implicitly by the base address of KERNEL_CS */ -+ if (!strcmp(sec_name(sym->st_shndx), ".data") && !strcmp(sym_name(sym_strtab, sym), "_etext")) ++ if (!strcmp(sec_name(sym->st_shndx), ".module.text") && !strcmp(sym_name(sym_strtab, sym), "_etext")) + continue; + if (!strcmp(sec_name(sym->st_shndx), ".init.text")) + continue; @@ -5741,9 +5860,9 @@ diff -urNp linux-2.6.34.1/arch/x86/boot/compressed/relocs.c linux-2.6.34.1/arch/ read_shdrs(fp); read_strtabs(fp); read_symtabs(fp); -diff -urNp linux-2.6.34.1/arch/x86/boot/cpucheck.c linux-2.6.34.1/arch/x86/boot/cpucheck.c ---- linux-2.6.34.1/arch/x86/boot/cpucheck.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/boot/cpucheck.c 2010-07-07 09:04:45.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/boot/cpucheck.c linux-2.6.35.4/arch/x86/boot/cpucheck.c +--- linux-2.6.35.4/arch/x86/boot/cpucheck.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/boot/cpucheck.c 2010-09-17 20:12:09.000000000 -0400 @@ -74,7 +74,7 @@ static int has_fpu(void) u16 fcw = -1, fsw = -1; u32 cr0; @@ -5839,9 +5958,9 @@ diff -urNp linux-2.6.34.1/arch/x86/boot/cpucheck.c linux-2.6.34.1/arch/x86/boot/ err = check_flags(); } -diff -urNp linux-2.6.34.1/arch/x86/boot/header.S linux-2.6.34.1/arch/x86/boot/header.S ---- linux-2.6.34.1/arch/x86/boot/header.S 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/boot/header.S 2010-07-07 09:04:45.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/boot/header.S linux-2.6.35.4/arch/x86/boot/header.S +--- linux-2.6.35.4/arch/x86/boot/header.S 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/boot/header.S 2010-09-17 20:12:09.000000000 -0400 @@ -224,7 +224,7 @@ setup_data: .quad 0 # 64-bit physical # single linked list of # struct setup_data @@ -5851,9 +5970,9 @@ diff -urNp linux-2.6.34.1/arch/x86/boot/header.S linux-2.6.34.1/arch/x86/boot/he #define ZO_INIT_SIZE (ZO__end - ZO_startup_32 + ZO_z_extract_offset) #define VO_INIT_SIZE (VO__end - VO__text) -diff -urNp linux-2.6.34.1/arch/x86/boot/memory.c linux-2.6.34.1/arch/x86/boot/memory.c ---- linux-2.6.34.1/arch/x86/boot/memory.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/boot/memory.c 2010-07-07 09:04:45.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/boot/memory.c linux-2.6.35.4/arch/x86/boot/memory.c +--- linux-2.6.35.4/arch/x86/boot/memory.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/boot/memory.c 2010-09-17 20:12:09.000000000 -0400 @@ -19,7 +19,7 @@ static int detect_memory_e820(void) @@ -5863,20 +5982,9 @@ diff -urNp linux-2.6.34.1/arch/x86/boot/memory.c linux-2.6.34.1/arch/x86/boot/me struct biosregs ireg, oreg; struct e820entry *desc = boot_params.e820_map; static struct e820entry buf; /* static so it is zeroed */ -diff -urNp linux-2.6.34.1/arch/x86/boot/video-vesa.c linux-2.6.34.1/arch/x86/boot/video-vesa.c ---- linux-2.6.34.1/arch/x86/boot/video-vesa.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/boot/video-vesa.c 2010-07-07 09:04:45.000000000 -0400 -@@ -200,6 +200,7 @@ static void vesa_store_pm_info(void) - - boot_params.screen_info.vesapm_seg = oreg.es; - boot_params.screen_info.vesapm_off = oreg.di; -+ boot_params.screen_info.vesapm_size = oreg.cx; - } - - /* -diff -urNp linux-2.6.34.1/arch/x86/boot/video.c linux-2.6.34.1/arch/x86/boot/video.c ---- linux-2.6.34.1/arch/x86/boot/video.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/boot/video.c 2010-07-07 09:04:45.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/boot/video.c linux-2.6.35.4/arch/x86/boot/video.c +--- linux-2.6.35.4/arch/x86/boot/video.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/boot/video.c 2010-09-17 20:12:09.000000000 -0400 @@ -96,7 +96,7 @@ static void store_mode_params(void) static unsigned int get_entry(void) { @@ -5886,30 +5994,20 @@ diff -urNp linux-2.6.34.1/arch/x86/boot/video.c linux-2.6.34.1/arch/x86/boot/vid int key; unsigned int v; -diff -urNp linux-2.6.34.1/arch/x86/ia32/ia32_signal.c linux-2.6.34.1/arch/x86/ia32/ia32_signal.c ---- linux-2.6.34.1/arch/x86/ia32/ia32_signal.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/ia32/ia32_signal.c 2010-07-07 09:04:45.000000000 -0400 -@@ -403,7 +403,7 @@ static void __user *get_sigframe(struct - sp -= frame_size; - /* Align the stack pointer according to the i386 ABI, - * i.e. so that on function entry ((sp + 4) & 15) == 0. */ -- sp = ((sp + 4) & -16ul) - 4; -+ sp = ((sp - 12) & -16ul) - 4; - return (void __user *) sp; - } +diff -urNp linux-2.6.35.4/arch/x86/boot/video-vesa.c linux-2.6.35.4/arch/x86/boot/video-vesa.c +--- linux-2.6.35.4/arch/x86/boot/video-vesa.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/boot/video-vesa.c 2010-09-17 20:12:09.000000000 -0400 +@@ -200,6 +200,7 @@ static void vesa_store_pm_info(void) -@@ -503,7 +503,7 @@ int ia32_setup_rt_frame(int sig, struct - 0xb8, - __NR_ia32_rt_sigreturn, - 0x80cd, -- 0, -+ 0 - }; + boot_params.screen_info.vesapm_seg = oreg.es; + boot_params.screen_info.vesapm_off = oreg.di; ++ boot_params.screen_info.vesapm_size = oreg.cx; + } - frame = get_sigframe(ka, regs, sizeof(*frame), &fpstate); -diff -urNp linux-2.6.34.1/arch/x86/ia32/ia32entry.S linux-2.6.34.1/arch/x86/ia32/ia32entry.S ---- linux-2.6.34.1/arch/x86/ia32/ia32entry.S 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/ia32/ia32entry.S 2010-07-07 09:04:45.000000000 -0400 + /* +diff -urNp linux-2.6.35.4/arch/x86/ia32/ia32entry.S linux-2.6.35.4/arch/x86/ia32/ia32entry.S +--- linux-2.6.35.4/arch/x86/ia32/ia32entry.S 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/ia32/ia32entry.S 2010-09-17 20:12:37.000000000 -0400 @@ -13,6 +13,7 @@ #include #include @@ -5918,7 +6016,29 @@ diff -urNp linux-2.6.34.1/arch/x86/ia32/ia32entry.S linux-2.6.34.1/arch/x86/ia32 #include /* Avoid __ASSEMBLER__'ifying just for this. */ -@@ -114,6 +115,11 @@ ENTRY(ia32_sysenter_target) +@@ -50,7 +51,12 @@ + /* + * Reload arg registers from stack in case ptrace changed them. + * We don't reload %eax because syscall_trace_enter() returned +- * the value it wants us to use in the table lookup. ++ * the %rax value we should see. Instead, we just truncate that ++ * value to 32 bits again as we did on entry from user mode. ++ * If it's a new value set by user_regset during entry tracing, ++ * this matches the normal truncation of the user-mode value. ++ * If it's -1 to make us punt the syscall, then (u32)-1 is still ++ * an appropriately invalid value. + */ + .macro LOAD_ARGS32 offset, _r9=0 + .if \_r9 +@@ -60,6 +66,7 @@ + movl \offset+48(%rsp),%edx + movl \offset+56(%rsp),%esi + movl \offset+64(%rsp),%edi ++ movl %eax,%eax /* zero extension */ + .endm + + .macro CFI_STARTPROC32 simple +@@ -114,6 +121,11 @@ ENTRY(ia32_sysenter_target) SWAPGS_UNSAFE_STACK movq PER_CPU_VAR(kernel_stack), %rsp addq $(KERNEL_STACK_OFFSET),%rsp @@ -5930,7 +6050,7 @@ diff -urNp linux-2.6.34.1/arch/x86/ia32/ia32entry.S linux-2.6.34.1/arch/x86/ia32 /* * No need to follow this irqs on/off section: the syscall * disabled irqs, here we enable it straight after entry: -@@ -144,6 +150,12 @@ ENTRY(ia32_sysenter_target) +@@ -144,6 +156,12 @@ ENTRY(ia32_sysenter_target) SAVE_ARGS 0,0,1 /* no need to do an access_ok check here because rbp has been 32bit zero extended */ @@ -5943,7 +6063,16 @@ diff -urNp linux-2.6.34.1/arch/x86/ia32/ia32entry.S linux-2.6.34.1/arch/x86/ia32 1: movl (%rbp),%ebp .section __ex_table,"a" .quad 1b,ia32_badarg -@@ -166,6 +178,11 @@ sysenter_dispatch: +@@ -153,7 +171,7 @@ ENTRY(ia32_sysenter_target) + testl $_TIF_WORK_SYSCALL_ENTRY,TI_flags(%r10) + CFI_REMEMBER_STATE + jnz sysenter_tracesys +- cmpl $(IA32_NR_syscalls-1),%eax ++ cmpq $(IA32_NR_syscalls-1),%rax + ja ia32_badsys + sysenter_do_call: + IA32_ARG_FIXUP +@@ -166,6 +184,11 @@ sysenter_dispatch: testl $_TIF_ALLWORK_MASK,TI_flags(%r10) jnz sysexit_audit sysexit_from_sys_call: @@ -5955,7 +6084,25 @@ diff -urNp linux-2.6.34.1/arch/x86/ia32/ia32entry.S linux-2.6.34.1/arch/x86/ia32 andl $~TS_COMPAT,TI_status(%r10) /* clear IF, that popfq doesn't enable interrupts early */ andl $~0x200,EFLAGS-R11(%rsp) -@@ -284,6 +301,11 @@ ENTRY(ia32_cstar_target) +@@ -195,7 +218,7 @@ sysexit_from_sys_call: + movl $AUDIT_ARCH_I386,%edi /* 1st arg: audit arch */ + call audit_syscall_entry + movl RAX-ARGOFFSET(%rsp),%eax /* reload syscall number */ +- cmpl $(IA32_NR_syscalls-1),%eax ++ cmpq $(IA32_NR_syscalls-1),%rax + ja ia32_badsys + movl %ebx,%edi /* reload 1st syscall arg */ + movl RCX-ARGOFFSET(%rsp),%esi /* reload 2nd syscall arg */ +@@ -248,7 +271,7 @@ sysenter_tracesys: + call syscall_trace_enter + LOAD_ARGS32 ARGOFFSET /* reload args from stack in case ptrace changed it */ + RESTORE_REST +- cmpl $(IA32_NR_syscalls-1),%eax ++ cmpq $(IA32_NR_syscalls-1),%rax + ja int_ret_from_sys_call /* sysenter_tracesys has set RAX(%rsp) */ + jmp sysenter_do_call + CFI_ENDPROC +@@ -284,6 +307,11 @@ ENTRY(ia32_cstar_target) movl %esp,%r8d CFI_REGISTER rsp,r8 movq PER_CPU_VAR(kernel_stack),%rsp @@ -5967,7 +6114,7 @@ diff -urNp linux-2.6.34.1/arch/x86/ia32/ia32entry.S linux-2.6.34.1/arch/x86/ia32 /* * No need to follow this irqs on/off section: the syscall * disabled irqs and here we enable it straight after entry: -@@ -305,6 +327,12 @@ ENTRY(ia32_cstar_target) +@@ -305,6 +333,12 @@ ENTRY(ia32_cstar_target) /* no need to do an access_ok check here because r8 has been 32bit zero extended */ /* hardware stack frame is complete now */ @@ -5980,7 +6127,16 @@ diff -urNp linux-2.6.34.1/arch/x86/ia32/ia32entry.S linux-2.6.34.1/arch/x86/ia32 1: movl (%r8),%r9d .section __ex_table,"a" .quad 1b,ia32_badarg -@@ -327,6 +355,11 @@ cstar_dispatch: +@@ -314,7 +348,7 @@ ENTRY(ia32_cstar_target) + testl $_TIF_WORK_SYSCALL_ENTRY,TI_flags(%r10) + CFI_REMEMBER_STATE + jnz cstar_tracesys +- cmpl $IA32_NR_syscalls-1,%eax ++ cmpq $IA32_NR_syscalls-1,%rax + ja ia32_badsys + cstar_do_call: + IA32_ARG_FIXUP 1 +@@ -327,6 +361,11 @@ cstar_dispatch: testl $_TIF_ALLWORK_MASK,TI_flags(%r10) jnz sysretl_audit sysretl_from_sys_call: @@ -5992,7 +6148,16 @@ diff -urNp linux-2.6.34.1/arch/x86/ia32/ia32entry.S linux-2.6.34.1/arch/x86/ia32 andl $~TS_COMPAT,TI_status(%r10) RESTORE_ARGS 1,-ARG_SKIP,1,1,1 movl RIP-ARGOFFSET(%rsp),%ecx -@@ -409,6 +442,11 @@ ENTRY(ia32_syscall) +@@ -367,7 +406,7 @@ cstar_tracesys: + LOAD_ARGS32 ARGOFFSET, 1 /* reload args from stack in case ptrace changed it */ + RESTORE_REST + xchgl %ebp,%r9d +- cmpl $(IA32_NR_syscalls-1),%eax ++ cmpq $(IA32_NR_syscalls-1),%rax + ja int_ret_from_sys_call /* cstar_tracesys has set RAX(%rsp) */ + jmp cstar_do_call + END(ia32_cstar_target) +@@ -409,6 +448,11 @@ ENTRY(ia32_syscall) CFI_REL_OFFSET rip,RIP-RIP PARAVIRT_ADJUST_EXCEPTION_FRAME SWAPGS @@ -6004,9 +6169,48 @@ diff -urNp linux-2.6.34.1/arch/x86/ia32/ia32entry.S linux-2.6.34.1/arch/x86/ia32 /* * No need to follow this irqs on/off section: the syscall * disabled irqs and here we enable it straight after entry: -diff -urNp linux-2.6.34.1/arch/x86/include/asm/alternative.h linux-2.6.34.1/arch/x86/include/asm/alternative.h ---- linux-2.6.34.1/arch/x86/include/asm/alternative.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/include/asm/alternative.h 2010-07-07 09:04:45.000000000 -0400 +@@ -425,7 +469,7 @@ ENTRY(ia32_syscall) + orl $TS_COMPAT,TI_status(%r10) + testl $_TIF_WORK_SYSCALL_ENTRY,TI_flags(%r10) + jnz ia32_tracesys +- cmpl $(IA32_NR_syscalls-1),%eax ++ cmpq $(IA32_NR_syscalls-1),%rax + ja ia32_badsys + ia32_do_call: + IA32_ARG_FIXUP +@@ -444,7 +488,7 @@ ia32_tracesys: + call syscall_trace_enter + LOAD_ARGS32 ARGOFFSET /* reload args from stack in case ptrace changed it */ + RESTORE_REST +- cmpl $(IA32_NR_syscalls-1),%eax ++ cmpq $(IA32_NR_syscalls-1),%rax + ja int_ret_from_sys_call /* ia32_tracesys has set RAX(%rsp) */ + jmp ia32_do_call + END(ia32_syscall) +diff -urNp linux-2.6.35.4/arch/x86/ia32/ia32_signal.c linux-2.6.35.4/arch/x86/ia32/ia32_signal.c +--- linux-2.6.35.4/arch/x86/ia32/ia32_signal.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/ia32/ia32_signal.c 2010-09-17 20:12:09.000000000 -0400 +@@ -403,7 +403,7 @@ static void __user *get_sigframe(struct + sp -= frame_size; + /* Align the stack pointer according to the i386 ABI, + * i.e. so that on function entry ((sp + 4) & 15) == 0. */ +- sp = ((sp + 4) & -16ul) - 4; ++ sp = ((sp - 12) & -16ul) - 4; + return (void __user *) sp; + } + +@@ -503,7 +503,7 @@ int ia32_setup_rt_frame(int sig, struct + 0xb8, + __NR_ia32_rt_sigreturn, + 0x80cd, +- 0, ++ 0 + }; + + frame = get_sigframe(ka, regs, sizeof(*frame), &fpstate); +diff -urNp linux-2.6.35.4/arch/x86/include/asm/alternative.h linux-2.6.35.4/arch/x86/include/asm/alternative.h +--- linux-2.6.35.4/arch/x86/include/asm/alternative.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/include/asm/alternative.h 2010-09-17 20:12:09.000000000 -0400 @@ -91,7 +91,7 @@ static inline int alternatives_text_rese " .byte 664f-663f\n" /* replacementlen */ \ " .byte 0xff + (664f-663f) - (662b-661b)\n" /* rlen <= slen */ \ @@ -6016,9 +6220,9 @@ diff -urNp linux-2.6.34.1/arch/x86/include/asm/alternative.h linux-2.6.34.1/arch "663:\n\t" newinstr "\n664:\n" /* replacement */ \ ".previous" -diff -urNp linux-2.6.34.1/arch/x86/include/asm/apm.h linux-2.6.34.1/arch/x86/include/asm/apm.h ---- linux-2.6.34.1/arch/x86/include/asm/apm.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/include/asm/apm.h 2010-07-07 09:04:45.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/include/asm/apm.h linux-2.6.35.4/arch/x86/include/asm/apm.h +--- linux-2.6.35.4/arch/x86/include/asm/apm.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/include/asm/apm.h 2010-09-17 20:12:09.000000000 -0400 @@ -34,7 +34,7 @@ static inline void apm_bios_call_asm(u32 __asm__ __volatile__(APM_DO_ZERO_SEGS "pushl %%edi\n\t" @@ -6037,9 +6241,9 @@ diff -urNp linux-2.6.34.1/arch/x86/include/asm/apm.h linux-2.6.34.1/arch/x86/inc "setc %%bl\n\t" "popl %%ebp\n\t" "popl %%edi\n\t" -diff -urNp linux-2.6.34.1/arch/x86/include/asm/asm.h linux-2.6.34.1/arch/x86/include/asm/asm.h ---- linux-2.6.34.1/arch/x86/include/asm/asm.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/include/asm/asm.h 2010-07-07 09:04:45.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/include/asm/asm.h linux-2.6.35.4/arch/x86/include/asm/asm.h +--- linux-2.6.35.4/arch/x86/include/asm/asm.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/include/asm/asm.h 2010-09-17 20:12:09.000000000 -0400 @@ -37,6 +37,12 @@ #define _ASM_SI __ASM_REG(si) #define _ASM_DI __ASM_REG(di) @@ -6053,330 +6257,9 @@ diff -urNp linux-2.6.34.1/arch/x86/include/asm/asm.h linux-2.6.34.1/arch/x86/inc /* Exception table entry */ #ifdef __ASSEMBLY__ # define _ASM_EXTABLE(from,to) \ -diff -urNp linux-2.6.34.1/arch/x86/include/asm/atomic.h linux-2.6.34.1/arch/x86/include/asm/atomic.h ---- linux-2.6.34.1/arch/x86/include/asm/atomic.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/include/asm/atomic.h 2010-07-07 09:04:45.000000000 -0400 -@@ -26,6 +26,17 @@ static inline int atomic_read(const atom - } - - /** -+ * atomic_read_unchecked - read atomic variable -+ * @v: pointer of type atomic_unchecked_t -+ * -+ * Atomically reads the value of @v. -+ */ -+static inline int atomic_read_unchecked(const atomic_unchecked_t *v) -+{ -+ return v->counter; -+} -+ -+/** - * atomic_set - set atomic variable - * @v: pointer of type atomic_t - * @i: required value -@@ -38,6 +49,18 @@ static inline void atomic_set(atomic_t * - } - - /** -+ * atomic_set_unchecked - set atomic variable -+ * @v: pointer of type atomic_unchecked_t -+ * @i: required value -+ * -+ * Atomically sets the value of @v to @i. -+ */ -+static inline void atomic_set_unchecked(atomic_unchecked_t *v, int i) -+{ -+ v->counter = i; -+} -+ -+/** - * atomic_add - add integer to atomic variable - * @i: integer value to add - * @v: pointer of type atomic_t -@@ -46,7 +69,29 @@ static inline void atomic_set(atomic_t * - */ - static inline void atomic_add(int i, atomic_t *v) - { -- asm volatile(LOCK_PREFIX "addl %1,%0" -+ asm volatile(LOCK_PREFIX "addl %1,%0\n" -+ -+#ifdef CONFIG_PAX_REFCOUNT -+ "jno 0f\n" -+ LOCK_PREFIX "subl %1,%0\n" -+ _ASM_INTO "\n0:\n" -+ _ASM_EXTABLE(0b, 0b) -+#endif -+ -+ : "+m" (v->counter) -+ : "ir" (i)); -+} -+ -+/** -+ * atomic_add_unchecked - add integer to atomic variable -+ * @i: integer value to add -+ * @v: pointer of type atomic_unchecked_t -+ * -+ * Atomically adds @i to @v. -+ */ -+static inline void atomic_add_unchecked(int i, atomic_unchecked_t *v) -+{ -+ asm volatile(LOCK_PREFIX "addl %1,%0\n" - : "+m" (v->counter) - : "ir" (i)); - } -@@ -60,7 +105,29 @@ static inline void atomic_add(int i, ato - */ - static inline void atomic_sub(int i, atomic_t *v) - { -- asm volatile(LOCK_PREFIX "subl %1,%0" -+ asm volatile(LOCK_PREFIX "subl %1,%0\n" -+ -+#ifdef CONFIG_PAX_REFCOUNT -+ "jno 0f\n" -+ LOCK_PREFIX "addl %1,%0\n" -+ _ASM_INTO "\n0:\n" -+ _ASM_EXTABLE(0b, 0b) -+#endif -+ -+ : "+m" (v->counter) -+ : "ir" (i)); -+} -+ -+/** -+ * atomic_sub_unchecked - subtract integer from atomic variable -+ * @i: integer value to subtract -+ * @v: pointer of type atomic_t -+ * -+ * Atomically subtracts @i from @v. -+ */ -+static inline void atomic_sub_unchecked(int i, atomic_unchecked_t *v) -+{ -+ asm volatile(LOCK_PREFIX "subl %1,%0\n" - : "+m" (v->counter) - : "ir" (i)); - } -@@ -78,7 +145,16 @@ static inline int atomic_sub_and_test(in - { - unsigned char c; - -- asm volatile(LOCK_PREFIX "subl %2,%0; sete %1" -+ asm volatile(LOCK_PREFIX "subl %2,%0\n" -+ -+#ifdef CONFIG_PAX_REFCOUNT -+ "jno 0f\n" -+ LOCK_PREFIX "addl %2,%0\n" -+ _ASM_INTO "\n0:\n" -+ _ASM_EXTABLE(0b, 0b) -+#endif -+ -+ "sete %1\n" - : "+m" (v->counter), "=qm" (c) - : "ir" (i) : "memory"); - return c; -@@ -92,7 +168,27 @@ static inline int atomic_sub_and_test(in - */ - static inline void atomic_inc(atomic_t *v) - { -- asm volatile(LOCK_PREFIX "incl %0" -+ asm volatile(LOCK_PREFIX "incl %0\n" -+ -+#ifdef CONFIG_PAX_REFCOUNT -+ "jno 0f\n" -+ LOCK_PREFIX "decl %0\n" -+ _ASM_INTO "\n0:\n" -+ _ASM_EXTABLE(0b, 0b) -+#endif -+ -+ : "+m" (v->counter)); -+} -+ -+/** -+ * atomic_inc_unchecked - increment atomic variable -+ * @v: pointer of type atomic_unchecked_t -+ * -+ * Atomically increments @v by 1. -+ */ -+static inline void atomic_inc_unchecked(atomic_unchecked_t *v) -+{ -+ asm volatile(LOCK_PREFIX "incl %0\n" - : "+m" (v->counter)); - } - -@@ -104,7 +200,27 @@ static inline void atomic_inc(atomic_t * - */ - static inline void atomic_dec(atomic_t *v) - { -- asm volatile(LOCK_PREFIX "decl %0" -+ asm volatile(LOCK_PREFIX "decl %0\n" -+ -+#ifdef CONFIG_PAX_REFCOUNT -+ "jno 0f\n" -+ LOCK_PREFIX "incl %0\n" -+ _ASM_INTO "\n0:\n" -+ _ASM_EXTABLE(0b, 0b) -+#endif -+ -+ : "+m" (v->counter)); -+} -+ -+/** -+ * atomic_dec_unchecked - decrement atomic variable -+ * @v: pointer of type atomic_t -+ * -+ * Atomically decrements @v by 1. -+ */ -+static inline void atomic_dec_unchecked(atomic_unchecked_t *v) -+{ -+ asm volatile(LOCK_PREFIX "decl %0\n" - : "+m" (v->counter)); - } - -@@ -120,7 +236,16 @@ static inline int atomic_dec_and_test(at - { - unsigned char c; - -- asm volatile(LOCK_PREFIX "decl %0; sete %1" -+ asm volatile(LOCK_PREFIX "decl %0\n" -+ -+#ifdef CONFIG_PAX_REFCOUNT -+ "jno 0f\n" -+ LOCK_PREFIX "incl %0\n" -+ _ASM_INTO "\n0:\n" -+ _ASM_EXTABLE(0b, 0b) -+#endif -+ -+ "sete %1\n" - : "+m" (v->counter), "=qm" (c) - : : "memory"); - return c != 0; -@@ -138,7 +263,16 @@ static inline int atomic_inc_and_test(at - { - unsigned char c; - -- asm volatile(LOCK_PREFIX "incl %0; sete %1" -+ asm volatile(LOCK_PREFIX "incl %0\n" -+ -+#ifdef CONFIG_PAX_REFCOUNT -+ "jno 0f\n" -+ LOCK_PREFIX "decl %0\n" -+ _ASM_INTO "\n0:\n" -+ _ASM_EXTABLE(0b, 0b) -+#endif -+ -+ "sete %1\n" - : "+m" (v->counter), "=qm" (c) - : : "memory"); - return c != 0; -@@ -157,7 +291,16 @@ static inline int atomic_add_negative(in - { - unsigned char c; - -- asm volatile(LOCK_PREFIX "addl %2,%0; sets %1" -+ asm volatile(LOCK_PREFIX "addl %2,%0\n" -+ -+#ifdef CONFIG_PAX_REFCOUNT -+ "jno 0f\n" -+ LOCK_PREFIX "subl %2,%0\n" -+ _ASM_INTO "\n0:\n" -+ _ASM_EXTABLE(0b, 0b) -+#endif -+ -+ "sets %1\n" - : "+m" (v->counter), "=qm" (c) - : "ir" (i) : "memory"); - return c; -@@ -180,6 +323,46 @@ static inline int atomic_add_return(int - #endif - /* Modern 486+ processor */ - __i = i; -+ asm volatile(LOCK_PREFIX "xaddl %0, %1\n" -+ -+#ifdef CONFIG_PAX_REFCOUNT -+ "jno 0f\n" -+ "movl %0, %1\n" -+ _ASM_INTO "\n0:\n" -+ _ASM_EXTABLE(0b, 0b) -+#endif -+ -+ : "+r" (i), "+m" (v->counter) -+ : : "memory"); -+ return i + __i; -+ -+#ifdef CONFIG_M386 -+no_xadd: /* Legacy 386 processor */ -+ local_irq_save(flags); -+ __i = atomic_read(v); -+ atomic_set(v, i + __i); -+ local_irq_restore(flags); -+ return i + __i; -+#endif -+} -+ -+/** -+ * atomic_add_return_unchecked - add integer and return -+ * @v: pointer of type atomic_unchecked_t -+ * @i: integer value to add -+ * -+ * Atomically adds @i to @v and returns @i + @v -+ */ -+static inline int atomic_add_return_unchecked(int i, atomic_unchecked_t *v) -+{ -+ int __i; -+#ifdef CONFIG_M386 -+ unsigned long flags; -+ if (unlikely(boot_cpu_data.x86 <= 3)) -+ goto no_xadd; -+#endif -+ /* Modern 486+ processor */ -+ __i = i; - asm volatile(LOCK_PREFIX "xaddl %0, %1" - : "+r" (i), "+m" (v->counter) - : : "memory"); -@@ -208,6 +391,7 @@ static inline int atomic_sub_return(int - } - - #define atomic_inc_return(v) (atomic_add_return(1, v)) -+#define atomic_inc_return_unchecked(v) (atomic_add_return_unchecked(1, v)) - #define atomic_dec_return(v) (atomic_sub_return(1, v)) - - static inline int atomic_cmpxchg(atomic_t *v, int old, int new) -@@ -231,17 +415,29 @@ static inline int atomic_xchg(atomic_t * - */ - static inline int atomic_add_unless(atomic_t *v, int a, int u) - { -- int c, old; -+ int c, old, new; - c = atomic_read(v); - for (;;) { -- if (unlikely(c == (u))) -+ if (unlikely(c == u)) - break; -- old = atomic_cmpxchg((v), c, c + (a)); -+ -+ asm volatile("addl %2,%0\n" -+ -+#ifdef CONFIG_PAX_REFCOUNT -+ "jno 0f\n" -+ _ASM_INTO "\n0:\n" -+ _ASM_EXTABLE(0b, 0b) -+#endif -+ -+ : "=r" (new) -+ : "0" (c), "ir" (a)); -+ -+ old = atomic_cmpxchg(v, c, new); - if (likely(old == c)) - break; - c = old; - } -- return c != (u); -+ return c != u; - } - - #define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0) -diff -urNp linux-2.6.34.1/arch/x86/include/asm/atomic64_32.h linux-2.6.34.1/arch/x86/include/asm/atomic64_32.h ---- linux-2.6.34.1/arch/x86/include/asm/atomic64_32.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/include/asm/atomic64_32.h 2010-07-07 09:04:45.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/include/asm/atomic64_32.h linux-2.6.35.4/arch/x86/include/asm/atomic64_32.h +--- linux-2.6.35.4/arch/x86/include/asm/atomic64_32.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/include/asm/atomic64_32.h 2010-09-17 20:12:09.000000000 -0400 @@ -12,6 +12,14 @@ typedef struct { u64 __aligned(8) counter; } atomic64_t; @@ -6391,10 +6274,10 @@ diff -urNp linux-2.6.34.1/arch/x86/include/asm/atomic64_32.h linux-2.6.34.1/arch + #define ATOMIC64_INIT(val) { (val) } - extern u64 atomic64_cmpxchg(atomic64_t *ptr, u64 old_val, u64 new_val); -diff -urNp linux-2.6.34.1/arch/x86/include/asm/atomic64_64.h linux-2.6.34.1/arch/x86/include/asm/atomic64_64.h ---- linux-2.6.34.1/arch/x86/include/asm/atomic64_64.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/include/asm/atomic64_64.h 2010-07-07 09:04:45.000000000 -0400 + #ifdef CONFIG_X86_CMPXCHG64 +diff -urNp linux-2.6.35.4/arch/x86/include/asm/atomic64_64.h linux-2.6.35.4/arch/x86/include/asm/atomic64_64.h +--- linux-2.6.35.4/arch/x86/include/asm/atomic64_64.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/include/asm/atomic64_64.h 2010-09-17 20:12:09.000000000 -0400 @@ -22,6 +22,18 @@ static inline long atomic64_read(const a } @@ -6658,15 +6541,18 @@ diff -urNp linux-2.6.34.1/arch/x86/include/asm/atomic64_64.h linux-2.6.34.1/arch : "+r" (i), "+m" (v->counter) : : "memory"); return i + __i; -@@ -183,6 +355,7 @@ static inline long atomic64_sub_return(l +@@ -183,6 +355,10 @@ static inline long atomic64_sub_return(l } #define atomic64_inc_return(v) (atomic64_add_return(1, (v))) -+#define atomic64_inc_return_unchecked(v) (atomic64_add_return_unchecked(1, (v))) ++static inline long atomic64_inc_return_unchecked(atomic64_unchecked_t *v) ++{ ++ return atomic64_add_return_unchecked(1, v); ++} #define atomic64_dec_return(v) (atomic64_sub_return(1, (v))) static inline long atomic64_cmpxchg(atomic64_t *v, long old, long new) -@@ -206,17 +379,29 @@ static inline long atomic64_xchg(atomic6 +@@ -206,17 +382,29 @@ static inline long atomic64_xchg(atomic6 */ static inline int atomic64_add_unless(atomic64_t *v, long a, long u) { @@ -6700,9 +6586,333 @@ diff -urNp linux-2.6.34.1/arch/x86/include/asm/atomic64_64.h linux-2.6.34.1/arch } #define atomic64_inc_not_zero(v) atomic64_add_unless((v), 1, 0) -diff -urNp linux-2.6.34.1/arch/x86/include/asm/boot.h linux-2.6.34.1/arch/x86/include/asm/boot.h ---- linux-2.6.34.1/arch/x86/include/asm/boot.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/include/asm/boot.h 2010-07-07 09:04:45.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/include/asm/atomic.h linux-2.6.35.4/arch/x86/include/asm/atomic.h +--- linux-2.6.35.4/arch/x86/include/asm/atomic.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/include/asm/atomic.h 2010-09-17 20:12:09.000000000 -0400 +@@ -26,6 +26,17 @@ static inline int atomic_read(const atom + } + + /** ++ * atomic_read_unchecked - read atomic variable ++ * @v: pointer of type atomic_unchecked_t ++ * ++ * Atomically reads the value of @v. ++ */ ++static inline int atomic_read_unchecked(const atomic_unchecked_t *v) ++{ ++ return v->counter; ++} ++ ++/** + * atomic_set - set atomic variable + * @v: pointer of type atomic_t + * @i: required value +@@ -38,6 +49,18 @@ static inline void atomic_set(atomic_t * + } + + /** ++ * atomic_set_unchecked - set atomic variable ++ * @v: pointer of type atomic_unchecked_t ++ * @i: required value ++ * ++ * Atomically sets the value of @v to @i. ++ */ ++static inline void atomic_set_unchecked(atomic_unchecked_t *v, int i) ++{ ++ v->counter = i; ++} ++ ++/** + * atomic_add - add integer to atomic variable + * @i: integer value to add + * @v: pointer of type atomic_t +@@ -46,7 +69,29 @@ static inline void atomic_set(atomic_t * + */ + static inline void atomic_add(int i, atomic_t *v) + { +- asm volatile(LOCK_PREFIX "addl %1,%0" ++ asm volatile(LOCK_PREFIX "addl %1,%0\n" ++ ++#ifdef CONFIG_PAX_REFCOUNT ++ "jno 0f\n" ++ LOCK_PREFIX "subl %1,%0\n" ++ _ASM_INTO "\n0:\n" ++ _ASM_EXTABLE(0b, 0b) ++#endif ++ ++ : "+m" (v->counter) ++ : "ir" (i)); ++} ++ ++/** ++ * atomic_add_unchecked - add integer to atomic variable ++ * @i: integer value to add ++ * @v: pointer of type atomic_unchecked_t ++ * ++ * Atomically adds @i to @v. ++ */ ++static inline void atomic_add_unchecked(int i, atomic_unchecked_t *v) ++{ ++ asm volatile(LOCK_PREFIX "addl %1,%0\n" + : "+m" (v->counter) + : "ir" (i)); + } +@@ -60,7 +105,29 @@ static inline void atomic_add(int i, ato + */ + static inline void atomic_sub(int i, atomic_t *v) + { +- asm volatile(LOCK_PREFIX "subl %1,%0" ++ asm volatile(LOCK_PREFIX "subl %1,%0\n" ++ ++#ifdef CONFIG_PAX_REFCOUNT ++ "jno 0f\n" ++ LOCK_PREFIX "addl %1,%0\n" ++ _ASM_INTO "\n0:\n" ++ _ASM_EXTABLE(0b, 0b) ++#endif ++ ++ : "+m" (v->counter) ++ : "ir" (i)); ++} ++ ++/** ++ * atomic_sub_unchecked - subtract integer from atomic variable ++ * @i: integer value to subtract ++ * @v: pointer of type atomic_t ++ * ++ * Atomically subtracts @i from @v. ++ */ ++static inline void atomic_sub_unchecked(int i, atomic_unchecked_t *v) ++{ ++ asm volatile(LOCK_PREFIX "subl %1,%0\n" + : "+m" (v->counter) + : "ir" (i)); + } +@@ -78,7 +145,16 @@ static inline int atomic_sub_and_test(in + { + unsigned char c; + +- asm volatile(LOCK_PREFIX "subl %2,%0; sete %1" ++ asm volatile(LOCK_PREFIX "subl %2,%0\n" ++ ++#ifdef CONFIG_PAX_REFCOUNT ++ "jno 0f\n" ++ LOCK_PREFIX "addl %2,%0\n" ++ _ASM_INTO "\n0:\n" ++ _ASM_EXTABLE(0b, 0b) ++#endif ++ ++ "sete %1\n" + : "+m" (v->counter), "=qm" (c) + : "ir" (i) : "memory"); + return c; +@@ -92,7 +168,27 @@ static inline int atomic_sub_and_test(in + */ + static inline void atomic_inc(atomic_t *v) + { +- asm volatile(LOCK_PREFIX "incl %0" ++ asm volatile(LOCK_PREFIX "incl %0\n" ++ ++#ifdef CONFIG_PAX_REFCOUNT ++ "jno 0f\n" ++ LOCK_PREFIX "decl %0\n" ++ _ASM_INTO "\n0:\n" ++ _ASM_EXTABLE(0b, 0b) ++#endif ++ ++ : "+m" (v->counter)); ++} ++ ++/** ++ * atomic_inc_unchecked - increment atomic variable ++ * @v: pointer of type atomic_unchecked_t ++ * ++ * Atomically increments @v by 1. ++ */ ++static inline void atomic_inc_unchecked(atomic_unchecked_t *v) ++{ ++ asm volatile(LOCK_PREFIX "incl %0\n" + : "+m" (v->counter)); + } + +@@ -104,7 +200,27 @@ static inline void atomic_inc(atomic_t * + */ + static inline void atomic_dec(atomic_t *v) + { +- asm volatile(LOCK_PREFIX "decl %0" ++ asm volatile(LOCK_PREFIX "decl %0\n" ++ ++#ifdef CONFIG_PAX_REFCOUNT ++ "jno 0f\n" ++ LOCK_PREFIX "incl %0\n" ++ _ASM_INTO "\n0:\n" ++ _ASM_EXTABLE(0b, 0b) ++#endif ++ ++ : "+m" (v->counter)); ++} ++ ++/** ++ * atomic_dec_unchecked - decrement atomic variable ++ * @v: pointer of type atomic_t ++ * ++ * Atomically decrements @v by 1. ++ */ ++static inline void atomic_dec_unchecked(atomic_unchecked_t *v) ++{ ++ asm volatile(LOCK_PREFIX "decl %0\n" + : "+m" (v->counter)); + } + +@@ -120,7 +236,16 @@ static inline int atomic_dec_and_test(at + { + unsigned char c; + +- asm volatile(LOCK_PREFIX "decl %0; sete %1" ++ asm volatile(LOCK_PREFIX "decl %0\n" ++ ++#ifdef CONFIG_PAX_REFCOUNT ++ "jno 0f\n" ++ LOCK_PREFIX "incl %0\n" ++ _ASM_INTO "\n0:\n" ++ _ASM_EXTABLE(0b, 0b) ++#endif ++ ++ "sete %1\n" + : "+m" (v->counter), "=qm" (c) + : : "memory"); + return c != 0; +@@ -138,7 +263,16 @@ static inline int atomic_inc_and_test(at + { + unsigned char c; + +- asm volatile(LOCK_PREFIX "incl %0; sete %1" ++ asm volatile(LOCK_PREFIX "incl %0\n" ++ ++#ifdef CONFIG_PAX_REFCOUNT ++ "jno 0f\n" ++ LOCK_PREFIX "decl %0\n" ++ _ASM_INTO "\n0:\n" ++ _ASM_EXTABLE(0b, 0b) ++#endif ++ ++ "sete %1\n" + : "+m" (v->counter), "=qm" (c) + : : "memory"); + return c != 0; +@@ -157,7 +291,16 @@ static inline int atomic_add_negative(in + { + unsigned char c; + +- asm volatile(LOCK_PREFIX "addl %2,%0; sets %1" ++ asm volatile(LOCK_PREFIX "addl %2,%0\n" ++ ++#ifdef CONFIG_PAX_REFCOUNT ++ "jno 0f\n" ++ LOCK_PREFIX "subl %2,%0\n" ++ _ASM_INTO "\n0:\n" ++ _ASM_EXTABLE(0b, 0b) ++#endif ++ ++ "sets %1\n" + : "+m" (v->counter), "=qm" (c) + : "ir" (i) : "memory"); + return c; +@@ -180,6 +323,46 @@ static inline int atomic_add_return(int + #endif + /* Modern 486+ processor */ + __i = i; ++ asm volatile(LOCK_PREFIX "xaddl %0, %1\n" ++ ++#ifdef CONFIG_PAX_REFCOUNT ++ "jno 0f\n" ++ "movl %0, %1\n" ++ _ASM_INTO "\n0:\n" ++ _ASM_EXTABLE(0b, 0b) ++#endif ++ ++ : "+r" (i), "+m" (v->counter) ++ : : "memory"); ++ return i + __i; ++ ++#ifdef CONFIG_M386 ++no_xadd: /* Legacy 386 processor */ ++ local_irq_save(flags); ++ __i = atomic_read(v); ++ atomic_set(v, i + __i); ++ local_irq_restore(flags); ++ return i + __i; ++#endif ++} ++ ++/** ++ * atomic_add_return_unchecked - add integer and return ++ * @v: pointer of type atomic_unchecked_t ++ * @i: integer value to add ++ * ++ * Atomically adds @i to @v and returns @i + @v ++ */ ++static inline int atomic_add_return_unchecked(int i, atomic_unchecked_t *v) ++{ ++ int __i; ++#ifdef CONFIG_M386 ++ unsigned long flags; ++ if (unlikely(boot_cpu_data.x86 <= 3)) ++ goto no_xadd; ++#endif ++ /* Modern 486+ processor */ ++ __i = i; + asm volatile(LOCK_PREFIX "xaddl %0, %1" + : "+r" (i), "+m" (v->counter) + : : "memory"); +@@ -208,6 +391,10 @@ static inline int atomic_sub_return(int + } + + #define atomic_inc_return(v) (atomic_add_return(1, v)) ++static inline int atomic_inc_return_unchecked(atomic_unchecked_t *v) ++{ ++ return atomic_add_return_unchecked(1, v); ++} + #define atomic_dec_return(v) (atomic_sub_return(1, v)) + + static inline int atomic_cmpxchg(atomic_t *v, int old, int new) +@@ -231,17 +418,29 @@ static inline int atomic_xchg(atomic_t * + */ + static inline int atomic_add_unless(atomic_t *v, int a, int u) + { +- int c, old; ++ int c, old, new; + c = atomic_read(v); + for (;;) { +- if (unlikely(c == (u))) ++ if (unlikely(c == u)) + break; +- old = atomic_cmpxchg((v), c, c + (a)); ++ ++ asm volatile("addl %2,%0\n" ++ ++#ifdef CONFIG_PAX_REFCOUNT ++ "jno 0f\n" ++ _ASM_INTO "\n0:\n" ++ _ASM_EXTABLE(0b, 0b) ++#endif ++ ++ : "=r" (new) ++ : "0" (c), "ir" (a)); ++ ++ old = atomic_cmpxchg(v, c, new); + if (likely(old == c)) + break; + c = old; + } +- return c != (u); ++ return c != u; + } + + #define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0) +diff -urNp linux-2.6.35.4/arch/x86/include/asm/boot.h linux-2.6.35.4/arch/x86/include/asm/boot.h +--- linux-2.6.35.4/arch/x86/include/asm/boot.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/include/asm/boot.h 2010-09-17 20:12:09.000000000 -0400 @@ -11,10 +11,15 @@ #include @@ -6720,41 +6930,32 @@ diff -urNp linux-2.6.34.1/arch/x86/include/asm/boot.h linux-2.6.34.1/arch/x86/in /* Minimum kernel alignment, as a power of two */ #ifdef CONFIG_X86_64 #define MIN_KERNEL_ALIGN_LG2 PMD_SHIFT -diff -urNp linux-2.6.34.1/arch/x86/include/asm/cache.h linux-2.6.34.1/arch/x86/include/asm/cache.h ---- linux-2.6.34.1/arch/x86/include/asm/cache.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/include/asm/cache.h 2010-07-07 09:04:45.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/include/asm/cacheflush.h linux-2.6.35.4/arch/x86/include/asm/cacheflush.h +--- linux-2.6.35.4/arch/x86/include/asm/cacheflush.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/include/asm/cacheflush.h 2010-09-17 20:12:09.000000000 -0400 +@@ -66,7 +66,7 @@ static inline unsigned long get_page_mem + unsigned long pg_flags = pg->flags & _PGMT_MASK; + + if (pg_flags == _PGMT_DEFAULT) +- return -1; ++ return ~0UL; + else if (pg_flags == _PGMT_WC) + return _PAGE_CACHE_WC; + else if (pg_flags == _PGMT_UC_MINUS) +diff -urNp linux-2.6.35.4/arch/x86/include/asm/cache.h linux-2.6.35.4/arch/x86/include/asm/cache.h +--- linux-2.6.35.4/arch/x86/include/asm/cache.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/include/asm/cache.h 2010-09-17 20:12:09.000000000 -0400 @@ -8,6 +8,7 @@ #define L1_CACHE_BYTES (1 << L1_CACHE_SHIFT) - #define __read_mostly __attribute__((__section__(".data.read_mostly"))) -+#define __read_only __attribute__((__section__(".data.read_only"))) + #define __read_mostly __attribute__((__section__(".data..read_mostly"))) ++#define __read_only __attribute__((__section__(".data..read_only"))) #define INTERNODE_CACHE_SHIFT CONFIG_X86_INTERNODE_CACHE_SHIFT #define INTERNODE_CACHE_BYTES (1 << INTERNODE_CACHE_SHIFT) -diff -urNp linux-2.6.34.1/arch/x86/include/asm/cacheflush.h linux-2.6.34.1/arch/x86/include/asm/cacheflush.h ---- linux-2.6.34.1/arch/x86/include/asm/cacheflush.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/include/asm/cacheflush.h 2010-07-07 09:04:45.000000000 -0400 -@@ -61,7 +61,7 @@ PAGEFLAG(WC, WC) - static inline unsigned long get_page_memtype(struct page *pg) - { - if (!PageUncached(pg) && !PageWC(pg)) -- return -1; -+ return ~0UL; - else if (!PageUncached(pg) && PageWC(pg)) - return _PAGE_CACHE_WC; - else if (PageUncached(pg) && !PageWC(pg)) -@@ -86,7 +86,7 @@ static inline void set_page_memtype(stru - SetPageWC(pg); - break; - default: -- case -1: -+ case ~0UL: - ClearPageUncached(pg); - ClearPageWC(pg); - break; -diff -urNp linux-2.6.34.1/arch/x86/include/asm/checksum_32.h linux-2.6.34.1/arch/x86/include/asm/checksum_32.h ---- linux-2.6.34.1/arch/x86/include/asm/checksum_32.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/include/asm/checksum_32.h 2010-07-07 09:04:45.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/include/asm/checksum_32.h linux-2.6.35.4/arch/x86/include/asm/checksum_32.h +--- linux-2.6.35.4/arch/x86/include/asm/checksum_32.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/include/asm/checksum_32.h 2010-09-17 20:12:09.000000000 -0400 @@ -31,6 +31,14 @@ asmlinkage __wsum csum_partial_copy_gene int len, __wsum sum, int *src_err_ptr, int *dst_err_ptr); @@ -6788,9 +6989,33 @@ diff -urNp linux-2.6.34.1/arch/x86/include/asm/checksum_32.h linux-2.6.34.1/arch len, sum, NULL, err_ptr); if (len) -diff -urNp linux-2.6.34.1/arch/x86/include/asm/desc.h linux-2.6.34.1/arch/x86/include/asm/desc.h ---- linux-2.6.34.1/arch/x86/include/asm/desc.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/include/asm/desc.h 2010-07-07 09:04:45.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/include/asm/compat.h linux-2.6.35.4/arch/x86/include/asm/compat.h +--- linux-2.6.35.4/arch/x86/include/asm/compat.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/include/asm/compat.h 2010-09-17 20:12:37.000000000 -0400 +@@ -205,7 +205,7 @@ static inline compat_uptr_t ptr_to_compa + return (u32)(unsigned long)uptr; + } + +-static inline void __user *compat_alloc_user_space(long len) ++static inline void __user *arch_compat_alloc_user_space(long len) + { + struct pt_regs *regs = task_pt_regs(current); + return (void __user *)regs->sp - len; +diff -urNp linux-2.6.35.4/arch/x86/include/asm/cpufeature.h linux-2.6.35.4/arch/x86/include/asm/cpufeature.h +--- linux-2.6.35.4/arch/x86/include/asm/cpufeature.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/include/asm/cpufeature.h 2010-09-17 20:12:09.000000000 -0400 +@@ -323,7 +323,7 @@ static __always_inline __pure bool __sta + " .byte 4f - 3f\n" /* replacement len */ + " .byte 0xff + (4f-3f) - (2b-1b)\n" /* padding */ + ".previous\n" +- ".section .altinstr_replacement,\"ax\"\n" ++ ".section .altinstr_replacement,\"a\"\n" + "3: movb $1,%0\n" + "4:\n" + ".previous\n" +diff -urNp linux-2.6.35.4/arch/x86/include/asm/desc.h linux-2.6.35.4/arch/x86/include/asm/desc.h +--- linux-2.6.35.4/arch/x86/include/asm/desc.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/include/asm/desc.h 2010-09-17 20:12:09.000000000 -0400 @@ -4,6 +4,7 @@ #include #include @@ -6960,9 +7185,9 @@ diff -urNp linux-2.6.34.1/arch/x86/include/asm/desc.h linux-2.6.34.1/arch/x86/in +#endif + #endif /* _ASM_X86_DESC_H */ -diff -urNp linux-2.6.34.1/arch/x86/include/asm/device.h linux-2.6.34.1/arch/x86/include/asm/device.h ---- linux-2.6.34.1/arch/x86/include/asm/device.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/include/asm/device.h 2010-07-07 09:04:45.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/include/asm/device.h linux-2.6.35.4/arch/x86/include/asm/device.h +--- linux-2.6.35.4/arch/x86/include/asm/device.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/include/asm/device.h 2010-09-17 20:12:09.000000000 -0400 @@ -6,7 +6,7 @@ struct dev_archdata { void *acpi_handle; #endif @@ -6972,9 +7197,9 @@ diff -urNp linux-2.6.34.1/arch/x86/include/asm/device.h linux-2.6.34.1/arch/x86/ #endif #if defined(CONFIG_DMAR) || defined(CONFIG_AMD_IOMMU) void *iommu; /* hook for IOMMU specific extension */ -diff -urNp linux-2.6.34.1/arch/x86/include/asm/dma-mapping.h linux-2.6.34.1/arch/x86/include/asm/dma-mapping.h ---- linux-2.6.34.1/arch/x86/include/asm/dma-mapping.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/include/asm/dma-mapping.h 2010-07-07 09:04:45.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/include/asm/dma-mapping.h linux-2.6.35.4/arch/x86/include/asm/dma-mapping.h +--- linux-2.6.35.4/arch/x86/include/asm/dma-mapping.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/include/asm/dma-mapping.h 2010-09-17 20:12:09.000000000 -0400 @@ -26,9 +26,9 @@ extern int iommu_merge; extern struct device x86_dma_fallback_dev; extern int panic_on_overflow; @@ -7014,10 +7239,10 @@ diff -urNp linux-2.6.34.1/arch/x86/include/asm/dma-mapping.h linux-2.6.34.1/arch WARN_ON(irqs_disabled()); /* for portability */ -diff -urNp linux-2.6.34.1/arch/x86/include/asm/e820.h linux-2.6.34.1/arch/x86/include/asm/e820.h ---- linux-2.6.34.1/arch/x86/include/asm/e820.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/include/asm/e820.h 2010-07-07 09:04:45.000000000 -0400 -@@ -64,7 +64,7 @@ struct e820map { +diff -urNp linux-2.6.35.4/arch/x86/include/asm/e820.h linux-2.6.35.4/arch/x86/include/asm/e820.h +--- linux-2.6.35.4/arch/x86/include/asm/e820.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/include/asm/e820.h 2010-09-17 20:12:09.000000000 -0400 +@@ -69,7 +69,7 @@ struct e820map { #define ISA_START_ADDRESS 0xa0000 #define ISA_END_ADDRESS 0x100000 @@ -7026,9 +7251,9 @@ diff -urNp linux-2.6.34.1/arch/x86/include/asm/e820.h linux-2.6.34.1/arch/x86/in #define BIOS_END 0x00100000 #ifdef __KERNEL__ -diff -urNp linux-2.6.34.1/arch/x86/include/asm/elf.h linux-2.6.34.1/arch/x86/include/asm/elf.h ---- linux-2.6.34.1/arch/x86/include/asm/elf.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/include/asm/elf.h 2010-07-07 09:04:45.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/include/asm/elf.h linux-2.6.35.4/arch/x86/include/asm/elf.h +--- linux-2.6.35.4/arch/x86/include/asm/elf.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/include/asm/elf.h 2010-09-17 20:12:09.000000000 -0400 @@ -237,7 +237,25 @@ extern int force_personality32; the loader. We need to make sure that it is out of the way of the program that it will "exec", and that there is sufficient room for the brk. */ @@ -7082,9 +7307,9 @@ diff -urNp linux-2.6.34.1/arch/x86/include/asm/elf.h linux-2.6.34.1/arch/x86/inc -#define arch_randomize_brk arch_randomize_brk - #endif /* _ASM_X86_ELF_H */ -diff -urNp linux-2.6.34.1/arch/x86/include/asm/futex.h linux-2.6.34.1/arch/x86/include/asm/futex.h ---- linux-2.6.34.1/arch/x86/include/asm/futex.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/include/asm/futex.h 2010-07-07 09:04:45.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/include/asm/futex.h linux-2.6.35.4/arch/x86/include/asm/futex.h +--- linux-2.6.35.4/arch/x86/include/asm/futex.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/include/asm/futex.h 2010-09-17 20:12:09.000000000 -0400 @@ -11,17 +11,54 @@ #include #include @@ -7221,10 +7446,10 @@ diff -urNp linux-2.6.34.1/arch/x86/include/asm/futex.h linux-2.6.34.1/arch/x86/i : "memory" ); -diff -urNp linux-2.6.34.1/arch/x86/include/asm/i387.h linux-2.6.34.1/arch/x86/include/asm/i387.h ---- linux-2.6.34.1/arch/x86/include/asm/i387.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/include/asm/i387.h 2010-07-07 09:04:45.000000000 -0400 -@@ -70,6 +70,11 @@ static inline int fxrstor_checking(struc +diff -urNp linux-2.6.35.4/arch/x86/include/asm/i387.h linux-2.6.35.4/arch/x86/include/asm/i387.h +--- linux-2.6.35.4/arch/x86/include/asm/i387.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/include/asm/i387.h 2010-09-17 20:12:09.000000000 -0400 +@@ -77,6 +77,11 @@ static inline int fxrstor_checking(struc { int err; @@ -7236,7 +7461,7 @@ diff -urNp linux-2.6.34.1/arch/x86/include/asm/i387.h linux-2.6.34.1/arch/x86/in asm volatile("1: rex64/fxrstor (%[fx])\n\t" "2:\n" ".section .fixup,\"ax\"\n" -@@ -115,6 +120,11 @@ static inline int fxsave_user(struct i38 +@@ -127,6 +132,11 @@ static inline int fxsave_user(struct i38 { int err; @@ -7248,7 +7473,7 @@ diff -urNp linux-2.6.34.1/arch/x86/include/asm/i387.h linux-2.6.34.1/arch/x86/in asm volatile("1: rex64/fxsave (%[fx])\n\t" "2:\n" ".section .fixup,\"ax\"\n" -@@ -205,13 +215,8 @@ static inline int fxrstor_checking(struc +@@ -220,13 +230,8 @@ static inline int fxrstor_checking(struc } /* We need a safe address that is cheap to find and that is already @@ -7264,9 +7489,9 @@ diff -urNp linux-2.6.34.1/arch/x86/include/asm/i387.h linux-2.6.34.1/arch/x86/in /* * These must be called with preempt disabled -diff -urNp linux-2.6.34.1/arch/x86/include/asm/io.h linux-2.6.34.1/arch/x86/include/asm/io.h ---- linux-2.6.34.1/arch/x86/include/asm/io.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/include/asm/io.h 2010-07-07 09:04:45.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/include/asm/io.h linux-2.6.35.4/arch/x86/include/asm/io.h +--- linux-2.6.35.4/arch/x86/include/asm/io.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/include/asm/io.h 2010-09-17 20:12:09.000000000 -0400 @@ -213,6 +213,17 @@ extern void iounmap(volatile void __iome #include @@ -7285,9 +7510,9 @@ diff -urNp linux-2.6.34.1/arch/x86/include/asm/io.h linux-2.6.34.1/arch/x86/incl /* * Convert a virtual cached pointer to an uncached pointer */ -diff -urNp linux-2.6.34.1/arch/x86/include/asm/iommu.h linux-2.6.34.1/arch/x86/include/asm/iommu.h ---- linux-2.6.34.1/arch/x86/include/asm/iommu.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/include/asm/iommu.h 2010-07-07 09:04:45.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/include/asm/iommu.h linux-2.6.35.4/arch/x86/include/asm/iommu.h +--- linux-2.6.35.4/arch/x86/include/asm/iommu.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/include/asm/iommu.h 2010-09-17 20:12:09.000000000 -0400 @@ -1,7 +1,7 @@ #ifndef _ASM_X86_IOMMU_H #define _ASM_X86_IOMMU_H @@ -7297,9 +7522,9 @@ diff -urNp linux-2.6.34.1/arch/x86/include/asm/iommu.h linux-2.6.34.1/arch/x86/i extern int force_iommu, no_iommu; extern int iommu_detected; extern int iommu_pass_through; -diff -urNp linux-2.6.34.1/arch/x86/include/asm/irqflags.h linux-2.6.34.1/arch/x86/include/asm/irqflags.h ---- linux-2.6.34.1/arch/x86/include/asm/irqflags.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/include/asm/irqflags.h 2010-07-07 09:04:45.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/include/asm/irqflags.h linux-2.6.35.4/arch/x86/include/asm/irqflags.h +--- linux-2.6.35.4/arch/x86/include/asm/irqflags.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/include/asm/irqflags.h 2010-09-17 20:12:09.000000000 -0400 @@ -142,6 +142,11 @@ static inline unsigned long __raw_local_ sti; \ sysexit @@ -7312,10 +7537,10 @@ diff -urNp linux-2.6.34.1/arch/x86/include/asm/irqflags.h linux-2.6.34.1/arch/x8 #else #define INTERRUPT_RETURN iret #define ENABLE_INTERRUPTS_SYSEXIT sti; sysexit -diff -urNp linux-2.6.34.1/arch/x86/include/asm/kvm_host.h linux-2.6.34.1/arch/x86/include/asm/kvm_host.h ---- linux-2.6.34.1/arch/x86/include/asm/kvm_host.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/include/asm/kvm_host.h 2010-07-07 09:04:45.000000000 -0400 -@@ -547,7 +547,7 @@ struct kvm_x86_ops { +diff -urNp linux-2.6.35.4/arch/x86/include/asm/kvm_host.h linux-2.6.35.4/arch/x86/include/asm/kvm_host.h +--- linux-2.6.35.4/arch/x86/include/asm/kvm_host.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/include/asm/kvm_host.h 2010-09-17 20:12:09.000000000 -0400 +@@ -536,7 +536,7 @@ struct kvm_x86_ops { const struct trace_print_flags *exit_reasons_str; }; @@ -7324,9 +7549,9 @@ diff -urNp linux-2.6.34.1/arch/x86/include/asm/kvm_host.h linux-2.6.34.1/arch/x8 int kvm_mmu_module_init(void); void kvm_mmu_module_exit(void); -diff -urNp linux-2.6.34.1/arch/x86/include/asm/local.h linux-2.6.34.1/arch/x86/include/asm/local.h ---- linux-2.6.34.1/arch/x86/include/asm/local.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/include/asm/local.h 2010-07-07 09:04:45.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/include/asm/local.h linux-2.6.35.4/arch/x86/include/asm/local.h +--- linux-2.6.35.4/arch/x86/include/asm/local.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/include/asm/local.h 2010-09-17 20:12:09.000000000 -0400 @@ -18,26 +18,90 @@ typedef struct { static inline void local_inc(local_t *l) @@ -7551,9 +7776,9 @@ diff -urNp linux-2.6.34.1/arch/x86/include/asm/local.h linux-2.6.34.1/arch/x86/i : "+r" (i), "+m" (l->a.counter) : : "memory"); return i + __i; -diff -urNp linux-2.6.34.1/arch/x86/include/asm/mc146818rtc.h linux-2.6.34.1/arch/x86/include/asm/mc146818rtc.h ---- linux-2.6.34.1/arch/x86/include/asm/mc146818rtc.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/include/asm/mc146818rtc.h 2010-07-07 09:04:45.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/include/asm/mc146818rtc.h linux-2.6.35.4/arch/x86/include/asm/mc146818rtc.h +--- linux-2.6.35.4/arch/x86/include/asm/mc146818rtc.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/include/asm/mc146818rtc.h 2010-09-17 20:12:09.000000000 -0400 @@ -81,8 +81,8 @@ static inline unsigned char current_lock #else #define lock_cmos_prefix(reg) do {} while (0) @@ -7565,9 +7790,9 @@ diff -urNp linux-2.6.34.1/arch/x86/include/asm/mc146818rtc.h linux-2.6.34.1/arch #define do_i_have_lock_cmos() 0 #define current_lock_cmos_reg() 0 #endif -diff -urNp linux-2.6.34.1/arch/x86/include/asm/microcode.h linux-2.6.34.1/arch/x86/include/asm/microcode.h ---- linux-2.6.34.1/arch/x86/include/asm/microcode.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/include/asm/microcode.h 2010-07-07 09:04:45.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/include/asm/microcode.h linux-2.6.35.4/arch/x86/include/asm/microcode.h +--- linux-2.6.35.4/arch/x86/include/asm/microcode.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/include/asm/microcode.h 2010-09-17 20:12:09.000000000 -0400 @@ -12,13 +12,13 @@ struct device; enum ucode_state { UCODE_ERROR, UCODE_OK, UCODE_NFOUND }; @@ -7608,9 +7833,9 @@ diff -urNp linux-2.6.34.1/arch/x86/include/asm/microcode.h linux-2.6.34.1/arch/x { return NULL; } -diff -urNp linux-2.6.34.1/arch/x86/include/asm/mman.h linux-2.6.34.1/arch/x86/include/asm/mman.h ---- linux-2.6.34.1/arch/x86/include/asm/mman.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/include/asm/mman.h 2010-07-07 09:04:45.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/include/asm/mman.h linux-2.6.35.4/arch/x86/include/asm/mman.h +--- linux-2.6.35.4/arch/x86/include/asm/mman.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/include/asm/mman.h 2010-09-17 20:12:09.000000000 -0400 @@ -5,4 +5,14 @@ #include @@ -7626,38 +7851,9 @@ diff -urNp linux-2.6.34.1/arch/x86/include/asm/mman.h linux-2.6.34.1/arch/x86/in +#endif + #endif /* _ASM_X86_MMAN_H */ -diff -urNp linux-2.6.34.1/arch/x86/include/asm/mmu.h linux-2.6.34.1/arch/x86/include/asm/mmu.h ---- linux-2.6.34.1/arch/x86/include/asm/mmu.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/include/asm/mmu.h 2010-07-07 09:04:45.000000000 -0400 -@@ -9,10 +9,23 @@ - * we put the segment information here. - */ - typedef struct { -- void *ldt; -+ struct desc_struct *ldt; - int size; - struct mutex lock; -- void *vdso; -+ unsigned long vdso; -+ -+#ifdef CONFIG_X86_32 -+#if defined(CONFIG_PAX_PAGEEXEC) || defined(CONFIG_PAX_SEGMEXEC) -+ unsigned long user_cs_base; -+ unsigned long user_cs_limit; -+ -+#if defined(CONFIG_PAX_PAGEEXEC) && defined(CONFIG_SMP) -+ cpumask_t cpu_user_cs_mask; -+#endif -+ -+#endif -+#endif -+ - } mm_context_t; - - #ifdef CONFIG_SMP -diff -urNp linux-2.6.34.1/arch/x86/include/asm/mmu_context.h linux-2.6.34.1/arch/x86/include/asm/mmu_context.h ---- linux-2.6.34.1/arch/x86/include/asm/mmu_context.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/include/asm/mmu_context.h 2010-07-07 09:04:45.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/include/asm/mmu_context.h linux-2.6.35.4/arch/x86/include/asm/mmu_context.h +--- linux-2.6.35.4/arch/x86/include/asm/mmu_context.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/include/asm/mmu_context.h 2010-09-17 20:12:09.000000000 -0400 @@ -24,6 +24,21 @@ void destroy_context(struct mm_struct *m static inline void enter_lazy_tlb(struct mm_struct *mm, struct task_struct *tsk) @@ -7782,9 +7978,38 @@ diff -urNp linux-2.6.34.1/arch/x86/include/asm/mmu_context.h linux-2.6.34.1/arch } #define activate_mm(prev, next) \ -diff -urNp linux-2.6.34.1/arch/x86/include/asm/module.h linux-2.6.34.1/arch/x86/include/asm/module.h ---- linux-2.6.34.1/arch/x86/include/asm/module.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/include/asm/module.h 2010-07-07 09:04:45.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/include/asm/mmu.h linux-2.6.35.4/arch/x86/include/asm/mmu.h +--- linux-2.6.35.4/arch/x86/include/asm/mmu.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/include/asm/mmu.h 2010-09-17 20:12:09.000000000 -0400 +@@ -9,10 +9,23 @@ + * we put the segment information here. + */ + typedef struct { +- void *ldt; ++ struct desc_struct *ldt; + int size; + struct mutex lock; +- void *vdso; ++ unsigned long vdso; ++ ++#ifdef CONFIG_X86_32 ++#if defined(CONFIG_PAX_PAGEEXEC) || defined(CONFIG_PAX_SEGMEXEC) ++ unsigned long user_cs_base; ++ unsigned long user_cs_limit; ++ ++#if defined(CONFIG_PAX_PAGEEXEC) && defined(CONFIG_SMP) ++ cpumask_t cpu_user_cs_mask; ++#endif ++ ++#endif ++#endif ++ + } mm_context_t; + + #ifdef CONFIG_SMP +diff -urNp linux-2.6.35.4/arch/x86/include/asm/module.h linux-2.6.35.4/arch/x86/include/asm/module.h +--- linux-2.6.35.4/arch/x86/include/asm/module.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/include/asm/module.h 2010-09-17 20:12:37.000000000 -0400 @@ -59,13 +59,31 @@ #error unknown processor family #endif @@ -7818,9 +8043,9 @@ diff -urNp linux-2.6.34.1/arch/x86/include/asm/module.h linux-2.6.34.1/arch/x86/ #endif #endif /* _ASM_X86_MODULE_H */ -diff -urNp linux-2.6.34.1/arch/x86/include/asm/page_32_types.h linux-2.6.34.1/arch/x86/include/asm/page_32_types.h ---- linux-2.6.34.1/arch/x86/include/asm/page_32_types.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/include/asm/page_32_types.h 2010-07-07 09:04:45.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/include/asm/page_32_types.h linux-2.6.35.4/arch/x86/include/asm/page_32_types.h +--- linux-2.6.35.4/arch/x86/include/asm/page_32_types.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/include/asm/page_32_types.h 2010-09-17 20:12:09.000000000 -0400 @@ -15,6 +15,10 @@ */ #define __PAGE_OFFSET _AC(CONFIG_PAGE_OFFSET, UL) @@ -7832,22 +8057,9 @@ diff -urNp linux-2.6.34.1/arch/x86/include/asm/page_32_types.h linux-2.6.34.1/ar #ifdef CONFIG_4KSTACKS #define THREAD_ORDER 0 #else -diff -urNp linux-2.6.34.1/arch/x86/include/asm/page_64_types.h linux-2.6.34.1/arch/x86/include/asm/page_64_types.h ---- linux-2.6.34.1/arch/x86/include/asm/page_64_types.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/include/asm/page_64_types.h 2010-07-07 09:04:45.000000000 -0400 -@@ -39,6 +39,9 @@ - #define __START_KERNEL (__START_KERNEL_map + __PHYSICAL_START) - #define __START_KERNEL_map _AC(0xffffffff80000000, UL) - -+#define ktla_ktva(addr) (addr) -+#define ktva_ktla(addr) (addr) -+ - /* See Documentation/x86/x86_64/mm.txt for a description of the memory map. */ - #define __PHYSICAL_MASK_SHIFT 46 - #define __VIRTUAL_MASK_SHIFT 47 -diff -urNp linux-2.6.34.1/arch/x86/include/asm/paravirt.h linux-2.6.34.1/arch/x86/include/asm/paravirt.h ---- linux-2.6.34.1/arch/x86/include/asm/paravirt.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/include/asm/paravirt.h 2010-07-07 09:04:45.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/include/asm/paravirt.h linux-2.6.35.4/arch/x86/include/asm/paravirt.h +--- linux-2.6.35.4/arch/x86/include/asm/paravirt.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/include/asm/paravirt.h 2010-09-17 20:12:09.000000000 -0400 @@ -720,6 +720,21 @@ static inline void __set_fixmap(unsigned pv_mmu_ops.set_fixmap(idx, phys, flags); } @@ -7901,9 +8113,9 @@ diff -urNp linux-2.6.34.1/arch/x86/include/asm/paravirt.h linux-2.6.34.1/arch/x8 #endif /* CONFIG_X86_32 */ #endif /* __ASSEMBLY__ */ -diff -urNp linux-2.6.34.1/arch/x86/include/asm/paravirt_types.h linux-2.6.34.1/arch/x86/include/asm/paravirt_types.h ---- linux-2.6.34.1/arch/x86/include/asm/paravirt_types.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/include/asm/paravirt_types.h 2010-07-07 09:04:45.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/include/asm/paravirt_types.h linux-2.6.35.4/arch/x86/include/asm/paravirt_types.h +--- linux-2.6.35.4/arch/x86/include/asm/paravirt_types.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/include/asm/paravirt_types.h 2010-09-17 20:12:09.000000000 -0400 @@ -312,6 +312,12 @@ struct pv_mmu_ops { an mfn. We can tell which is which from the index. */ void (*set_fixmap)(unsigned /* enum fixed_addresses */ idx, @@ -7917,10 +8129,10 @@ diff -urNp linux-2.6.34.1/arch/x86/include/asm/paravirt_types.h linux-2.6.34.1/a }; struct arch_spinlock; -diff -urNp linux-2.6.34.1/arch/x86/include/asm/pci_x86.h linux-2.6.34.1/arch/x86/include/asm/pci_x86.h ---- linux-2.6.34.1/arch/x86/include/asm/pci_x86.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/include/asm/pci_x86.h 2010-07-07 09:04:45.000000000 -0400 -@@ -89,16 +89,16 @@ extern int (*pcibios_enable_irq)(struct +diff -urNp linux-2.6.35.4/arch/x86/include/asm/pci_x86.h linux-2.6.35.4/arch/x86/include/asm/pci_x86.h +--- linux-2.6.35.4/arch/x86/include/asm/pci_x86.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/include/asm/pci_x86.h 2010-09-17 20:12:09.000000000 -0400 +@@ -91,16 +91,16 @@ extern int (*pcibios_enable_irq)(struct extern void (*pcibios_disable_irq)(struct pci_dev *dev); struct pci_raw_ops { @@ -7942,9 +8154,9 @@ diff -urNp linux-2.6.34.1/arch/x86/include/asm/pci_x86.h linux-2.6.34.1/arch/x86 extern bool port_cf9_safe; /* arch_initcall level */ -diff -urNp linux-2.6.34.1/arch/x86/include/asm/pgalloc.h linux-2.6.34.1/arch/x86/include/asm/pgalloc.h ---- linux-2.6.34.1/arch/x86/include/asm/pgalloc.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/include/asm/pgalloc.h 2010-07-07 09:04:45.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/include/asm/pgalloc.h linux-2.6.35.4/arch/x86/include/asm/pgalloc.h +--- linux-2.6.35.4/arch/x86/include/asm/pgalloc.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/include/asm/pgalloc.h 2010-09-17 20:12:09.000000000 -0400 @@ -63,6 +63,13 @@ static inline void pmd_populate_kernel(s pmd_t *pmd, pte_t *pte) { @@ -7959,9 +8171,9 @@ diff -urNp linux-2.6.34.1/arch/x86/include/asm/pgalloc.h linux-2.6.34.1/arch/x86 set_pmd(pmd, __pmd(__pa(pte) | _PAGE_TABLE)); } -diff -urNp linux-2.6.34.1/arch/x86/include/asm/pgtable-2level.h linux-2.6.34.1/arch/x86/include/asm/pgtable-2level.h ---- linux-2.6.34.1/arch/x86/include/asm/pgtable-2level.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/include/asm/pgtable-2level.h 2010-07-07 09:04:45.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/include/asm/pgtable-2level.h linux-2.6.35.4/arch/x86/include/asm/pgtable-2level.h +--- linux-2.6.35.4/arch/x86/include/asm/pgtable-2level.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/include/asm/pgtable-2level.h 2010-09-17 20:12:09.000000000 -0400 @@ -18,7 +18,9 @@ static inline void native_set_pte(pte_t static inline void native_set_pmd(pmd_t *pmdp, pmd_t pmd) @@ -7972,9 +8184,85 @@ diff -urNp linux-2.6.34.1/arch/x86/include/asm/pgtable-2level.h linux-2.6.34.1/a } static inline void native_set_pte_atomic(pte_t *ptep, pte_t pte) -diff -urNp linux-2.6.34.1/arch/x86/include/asm/pgtable-3level.h linux-2.6.34.1/arch/x86/include/asm/pgtable-3level.h ---- linux-2.6.34.1/arch/x86/include/asm/pgtable-3level.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/include/asm/pgtable-3level.h 2010-07-07 09:04:45.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/include/asm/pgtable_32.h linux-2.6.35.4/arch/x86/include/asm/pgtable_32.h +--- linux-2.6.35.4/arch/x86/include/asm/pgtable_32.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/include/asm/pgtable_32.h 2010-09-17 20:12:09.000000000 -0400 +@@ -25,8 +25,6 @@ + struct mm_struct; + struct vm_area_struct; + +-extern pgd_t swapper_pg_dir[1024]; +- + static inline void pgtable_cache_init(void) { } + static inline void check_pgt_cache(void) { } + void paging_init(void); +@@ -47,6 +45,11 @@ extern void set_pmd_pfn(unsigned long, u + # include + #endif + ++extern pgd_t swapper_pg_dir[PTRS_PER_PGD]; ++#ifdef CONFIG_X86_PAE ++extern pmd_t swapper_pm_dir[PTRS_PER_PGD][PTRS_PER_PMD]; ++#endif ++ + #if defined(CONFIG_HIGHPTE) + #define __KM_PTE \ + (in_nmi() ? KM_NMI_PTE : \ +@@ -71,7 +74,9 @@ extern void set_pmd_pfn(unsigned long, u + /* Clear a kernel PTE and flush it from the TLB */ + #define kpte_clear_flush(ptep, vaddr) \ + do { \ ++ pax_open_kernel(); \ + pte_clear(&init_mm, (vaddr), (ptep)); \ ++ pax_close_kernel(); \ + __flush_tlb_one((vaddr)); \ + } while (0) + +@@ -83,6 +88,9 @@ do { \ + + #endif /* !__ASSEMBLY__ */ + ++#define HAVE_ARCH_UNMAPPED_AREA ++#define HAVE_ARCH_UNMAPPED_AREA_TOPDOWN ++ + /* + * kern_addr_valid() is (1) for FLATMEM and (0) for + * SPARSEMEM and DISCONTIGMEM +diff -urNp linux-2.6.35.4/arch/x86/include/asm/pgtable_32_types.h linux-2.6.35.4/arch/x86/include/asm/pgtable_32_types.h +--- linux-2.6.35.4/arch/x86/include/asm/pgtable_32_types.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/include/asm/pgtable_32_types.h 2010-09-17 20:12:09.000000000 -0400 +@@ -8,7 +8,7 @@ + */ + #ifdef CONFIG_X86_PAE + # include +-# define PMD_SIZE (1UL << PMD_SHIFT) ++# define PMD_SIZE (_AC(1, UL) << PMD_SHIFT) + # define PMD_MASK (~(PMD_SIZE - 1)) + #else + # include +@@ -46,6 +46,19 @@ extern bool __vmalloc_start_set; /* set + # define VMALLOC_END (FIXADDR_START - 2 * PAGE_SIZE) + #endif + ++#ifdef CONFIG_PAX_KERNEXEC ++#ifndef __ASSEMBLY__ ++extern unsigned char MODULES_EXEC_VADDR[]; ++extern unsigned char MODULES_EXEC_END[]; ++#endif ++#include ++#define ktla_ktva(addr) (addr + LOAD_PHYSICAL_ADDR + PAGE_OFFSET) ++#define ktva_ktla(addr) (addr - LOAD_PHYSICAL_ADDR - PAGE_OFFSET) ++#else ++#define ktla_ktva(addr) (addr) ++#define ktva_ktla(addr) (addr) ++#endif ++ + #define MODULES_VADDR VMALLOC_START + #define MODULES_END VMALLOC_END + #define MODULES_LEN (MODULES_VADDR - MODULES_END) +diff -urNp linux-2.6.35.4/arch/x86/include/asm/pgtable-3level.h linux-2.6.35.4/arch/x86/include/asm/pgtable-3level.h +--- linux-2.6.35.4/arch/x86/include/asm/pgtable-3level.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/include/asm/pgtable-3level.h 2010-09-17 20:12:09.000000000 -0400 @@ -38,12 +38,16 @@ static inline void native_set_pte_atomic static inline void native_set_pmd(pmd_t *pmdp, pmd_t pmd) @@ -7992,9 +8280,62 @@ diff -urNp linux-2.6.34.1/arch/x86/include/asm/pgtable-3level.h linux-2.6.34.1/a } /* -diff -urNp linux-2.6.34.1/arch/x86/include/asm/pgtable.h linux-2.6.34.1/arch/x86/include/asm/pgtable.h ---- linux-2.6.34.1/arch/x86/include/asm/pgtable.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/include/asm/pgtable.h 2010-07-07 09:04:45.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/include/asm/pgtable_64.h linux-2.6.35.4/arch/x86/include/asm/pgtable_64.h +--- linux-2.6.35.4/arch/x86/include/asm/pgtable_64.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/include/asm/pgtable_64.h 2010-09-17 20:12:09.000000000 -0400 +@@ -16,10 +16,13 @@ + + extern pud_t level3_kernel_pgt[512]; + extern pud_t level3_ident_pgt[512]; ++extern pud_t level3_vmalloc_pgt[512]; ++extern pud_t level3_vmemmap_pgt[512]; ++extern pud_t level2_vmemmap_pgt[512]; + extern pmd_t level2_kernel_pgt[512]; + extern pmd_t level2_fixmap_pgt[512]; +-extern pmd_t level2_ident_pgt[512]; +-extern pgd_t init_level4_pgt[]; ++extern pmd_t level2_ident_pgt[512*2]; ++extern pgd_t init_level4_pgt[512]; + + #define swapper_pg_dir init_level4_pgt + +@@ -74,7 +77,9 @@ static inline pte_t native_ptep_get_and_ + + static inline void native_set_pmd(pmd_t *pmdp, pmd_t pmd) + { ++ pax_open_kernel(); + *pmdp = pmd; ++ pax_close_kernel(); + } + + static inline void native_pmd_clear(pmd_t *pmd) +@@ -94,7 +99,9 @@ static inline void native_pud_clear(pud_ + + static inline void native_set_pgd(pgd_t *pgdp, pgd_t pgd) + { ++ pax_open_kernel(); + *pgdp = pgd; ++ pax_close_kernel(); + } + + static inline void native_pgd_clear(pgd_t *pgd) +diff -urNp linux-2.6.35.4/arch/x86/include/asm/pgtable_64_types.h linux-2.6.35.4/arch/x86/include/asm/pgtable_64_types.h +--- linux-2.6.35.4/arch/x86/include/asm/pgtable_64_types.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/include/asm/pgtable_64_types.h 2010-09-17 20:12:09.000000000 -0400 +@@ -59,5 +59,10 @@ typedef struct { pteval_t pte; } pte_t; + #define MODULES_VADDR _AC(0xffffffffa0000000, UL) + #define MODULES_END _AC(0xffffffffff000000, UL) + #define MODULES_LEN (MODULES_END - MODULES_VADDR) ++#define MODULES_EXEC_VADDR MODULES_VADDR ++#define MODULES_EXEC_END MODULES_END ++ ++#define ktla_ktva(addr) (addr) ++#define ktva_ktla(addr) (addr) + + #endif /* _ASM_X86_PGTABLE_64_DEFS_H */ +diff -urNp linux-2.6.35.4/arch/x86/include/asm/pgtable.h linux-2.6.35.4/arch/x86/include/asm/pgtable.h +--- linux-2.6.35.4/arch/x86/include/asm/pgtable.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/include/asm/pgtable.h 2010-09-17 20:12:09.000000000 -0400 @@ -76,12 +76,51 @@ extern struct list_head pgd_list; #define arch_end_context_switch(prev) do {} while(0) @@ -8164,135 +8505,9 @@ diff -urNp linux-2.6.34.1/arch/x86/include/asm/pgtable.h linux-2.6.34.1/arch/x86 #include #endif /* __ASSEMBLY__ */ -diff -urNp linux-2.6.34.1/arch/x86/include/asm/pgtable_32.h linux-2.6.34.1/arch/x86/include/asm/pgtable_32.h ---- linux-2.6.34.1/arch/x86/include/asm/pgtable_32.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/include/asm/pgtable_32.h 2010-07-07 09:04:45.000000000 -0400 -@@ -25,8 +25,6 @@ - struct mm_struct; - struct vm_area_struct; - --extern pgd_t swapper_pg_dir[1024]; -- - static inline void pgtable_cache_init(void) { } - static inline void check_pgt_cache(void) { } - void paging_init(void); -@@ -47,6 +45,11 @@ extern void set_pmd_pfn(unsigned long, u - # include - #endif - -+extern pgd_t swapper_pg_dir[PTRS_PER_PGD]; -+#ifdef CONFIG_X86_PAE -+extern pmd_t swapper_pm_dir[PTRS_PER_PGD][PTRS_PER_PMD]; -+#endif -+ - #if defined(CONFIG_HIGHPTE) - #define __KM_PTE \ - (in_nmi() ? KM_NMI_PTE : \ -@@ -71,7 +74,9 @@ extern void set_pmd_pfn(unsigned long, u - /* Clear a kernel PTE and flush it from the TLB */ - #define kpte_clear_flush(ptep, vaddr) \ - do { \ -+ pax_open_kernel(); \ - pte_clear(&init_mm, (vaddr), (ptep)); \ -+ pax_close_kernel(); \ - __flush_tlb_one((vaddr)); \ - } while (0) - -@@ -83,6 +88,9 @@ do { \ - - #endif /* !__ASSEMBLY__ */ - -+#define HAVE_ARCH_UNMAPPED_AREA -+#define HAVE_ARCH_UNMAPPED_AREA_TOPDOWN -+ - /* - * kern_addr_valid() is (1) for FLATMEM and (0) for - * SPARSEMEM and DISCONTIGMEM -diff -urNp linux-2.6.34.1/arch/x86/include/asm/pgtable_32_types.h linux-2.6.34.1/arch/x86/include/asm/pgtable_32_types.h ---- linux-2.6.34.1/arch/x86/include/asm/pgtable_32_types.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/include/asm/pgtable_32_types.h 2010-07-07 09:04:45.000000000 -0400 -@@ -8,7 +8,7 @@ - */ - #ifdef CONFIG_X86_PAE - # include --# define PMD_SIZE (1UL << PMD_SHIFT) -+# define PMD_SIZE (_AC(1, UL) << PMD_SHIFT) - # define PMD_MASK (~(PMD_SIZE - 1)) - #else - # include -@@ -46,6 +46,19 @@ extern bool __vmalloc_start_set; /* set - # define VMALLOC_END (FIXADDR_START - 2 * PAGE_SIZE) - #endif - -+#ifdef CONFIG_PAX_KERNEXEC -+#ifndef __ASSEMBLY__ -+extern unsigned char MODULES_EXEC_VADDR[]; -+extern unsigned char MODULES_EXEC_END[]; -+#endif -+#include -+#define ktla_ktva(addr) (addr + LOAD_PHYSICAL_ADDR + PAGE_OFFSET) -+#define ktva_ktla(addr) (addr - LOAD_PHYSICAL_ADDR - PAGE_OFFSET) -+#else -+#define ktla_ktva(addr) (addr) -+#define ktva_ktla(addr) (addr) -+#endif -+ - #define MODULES_VADDR VMALLOC_START - #define MODULES_END VMALLOC_END - #define MODULES_LEN (MODULES_VADDR - MODULES_END) -diff -urNp linux-2.6.34.1/arch/x86/include/asm/pgtable_64.h linux-2.6.34.1/arch/x86/include/asm/pgtable_64.h ---- linux-2.6.34.1/arch/x86/include/asm/pgtable_64.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/include/asm/pgtable_64.h 2010-07-07 09:04:45.000000000 -0400 -@@ -16,10 +16,13 @@ - - extern pud_t level3_kernel_pgt[512]; - extern pud_t level3_ident_pgt[512]; -+extern pud_t level3_vmalloc_pgt[512]; -+extern pud_t level3_vmemmap_pgt[512]; -+extern pud_t level2_vmemmap_pgt[512]; - extern pmd_t level2_kernel_pgt[512]; - extern pmd_t level2_fixmap_pgt[512]; --extern pmd_t level2_ident_pgt[512]; --extern pgd_t init_level4_pgt[]; -+extern pmd_t level2_ident_pgt[512*2]; -+extern pgd_t init_level4_pgt[512]; - - #define swapper_pg_dir init_level4_pgt - -@@ -74,7 +77,9 @@ static inline pte_t native_ptep_get_and_ - - static inline void native_set_pmd(pmd_t *pmdp, pmd_t pmd) - { -+ pax_open_kernel(); - *pmdp = pmd; -+ pax_close_kernel(); - } - - static inline void native_pmd_clear(pmd_t *pmd) -@@ -94,7 +99,9 @@ static inline void native_pud_clear(pud_ - - static inline void native_set_pgd(pgd_t *pgdp, pgd_t pgd) - { -+ pax_open_kernel(); - *pgdp = pgd; -+ pax_close_kernel(); - } - - static inline void native_pgd_clear(pgd_t *pgd) -diff -urNp linux-2.6.34.1/arch/x86/include/asm/pgtable_64_types.h linux-2.6.34.1/arch/x86/include/asm/pgtable_64_types.h ---- linux-2.6.34.1/arch/x86/include/asm/pgtable_64_types.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/include/asm/pgtable_64_types.h 2010-07-07 09:04:45.000000000 -0400 -@@ -59,5 +59,7 @@ typedef struct { pteval_t pte; } pte_t; - #define MODULES_VADDR _AC(0xffffffffa0000000, UL) - #define MODULES_END _AC(0xffffffffff000000, UL) - #define MODULES_LEN (MODULES_END - MODULES_VADDR) -+#define MODULES_EXEC_VADDR MODULES_VADDR -+#define MODULES_EXEC_END MODULES_END - - #endif /* _ASM_X86_PGTABLE_64_DEFS_H */ -diff -urNp linux-2.6.34.1/arch/x86/include/asm/pgtable_types.h linux-2.6.34.1/arch/x86/include/asm/pgtable_types.h ---- linux-2.6.34.1/arch/x86/include/asm/pgtable_types.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/include/asm/pgtable_types.h 2010-07-07 09:04:46.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/include/asm/pgtable_types.h linux-2.6.35.4/arch/x86/include/asm/pgtable_types.h +--- linux-2.6.35.4/arch/x86/include/asm/pgtable_types.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/include/asm/pgtable_types.h 2010-09-17 20:12:09.000000000 -0400 @@ -16,12 +16,11 @@ #define _PAGE_BIT_PSE 7 /* 4 MB (or 2MB) page */ #define _PAGE_BIT_PAT 7 /* on 4KB pages */ @@ -8360,7 +8575,43 @@ diff -urNp linux-2.6.34.1/arch/x86/include/asm/pgtable_types.h linux-2.6.34.1/ar #define PGD_IDENT_ATTR 0x001 /* PRESENT (no other attributes) */ #endif -@@ -278,7 +281,6 @@ typedef struct page *pgtable_t; +@@ -202,7 +205,17 @@ static inline pgdval_t pgd_flags(pgd_t p + { + return native_pgd_val(pgd) & PTE_FLAGS_MASK; + } ++#endif + ++#if PAGETABLE_LEVELS == 3 ++#include ++#endif ++ ++#if PAGETABLE_LEVELS == 2 ++#include ++#endif ++ ++#ifndef __ASSEMBLY__ + #if PAGETABLE_LEVELS > 3 + typedef struct { pudval_t pud; } pud_t; + +@@ -216,8 +229,6 @@ static inline pudval_t native_pud_val(pu + return pud.pud; + } + #else +-#include +- + static inline pudval_t native_pud_val(pud_t pud) + { + return native_pgd_val(pud.pgd); +@@ -237,8 +248,6 @@ static inline pmdval_t native_pmd_val(pm + return pmd.pmd; + } + #else +-#include +- + static inline pmdval_t native_pmd_val(pmd_t pmd) + { + return native_pgd_val(pmd.pud.pgd); +@@ -278,7 +287,6 @@ typedef struct page *pgtable_t; extern pteval_t __supported_pte_mask; extern void set_nx(void); @@ -8368,10 +8619,10 @@ diff -urNp linux-2.6.34.1/arch/x86/include/asm/pgtable_types.h linux-2.6.34.1/ar #define pgprot_writecombine pgprot_writecombine extern pgprot_t pgprot_writecombine(pgprot_t prot); -diff -urNp linux-2.6.34.1/arch/x86/include/asm/processor.h linux-2.6.34.1/arch/x86/include/asm/processor.h ---- linux-2.6.34.1/arch/x86/include/asm/processor.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/include/asm/processor.h 2010-07-07 09:04:46.000000000 -0400 -@@ -273,7 +273,7 @@ struct tss_struct { +diff -urNp linux-2.6.35.4/arch/x86/include/asm/processor.h linux-2.6.35.4/arch/x86/include/asm/processor.h +--- linux-2.6.35.4/arch/x86/include/asm/processor.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/include/asm/processor.h 2010-09-17 20:12:09.000000000 -0400 +@@ -269,7 +269,7 @@ struct tss_struct { } ____cacheline_aligned; @@ -8380,7 +8631,7 @@ diff -urNp linux-2.6.34.1/arch/x86/include/asm/processor.h linux-2.6.34.1/arch/x /* * Save the original ist values for checking stack pointers during debugging -@@ -913,8 +913,15 @@ static inline void spin_lock_prefetch(co +@@ -884,8 +884,15 @@ static inline void spin_lock_prefetch(co */ #define TASK_SIZE PAGE_OFFSET #define TASK_SIZE_MAX TASK_SIZE @@ -8397,7 +8648,7 @@ diff -urNp linux-2.6.34.1/arch/x86/include/asm/processor.h linux-2.6.34.1/arch/x #define INIT_THREAD { \ .sp0 = sizeof(init_stack) + (long)&init_stack, \ -@@ -931,7 +938,7 @@ static inline void spin_lock_prefetch(co +@@ -902,7 +909,7 @@ static inline void spin_lock_prefetch(co */ #define INIT_TSS { \ .x86_tss = { \ @@ -8406,7 +8657,7 @@ diff -urNp linux-2.6.34.1/arch/x86/include/asm/processor.h linux-2.6.34.1/arch/x .ss0 = __KERNEL_DS, \ .ss1 = __KERNEL_CS, \ .io_bitmap_base = INVALID_IO_BITMAP_OFFSET, \ -@@ -942,11 +949,7 @@ static inline void spin_lock_prefetch(co +@@ -913,11 +920,7 @@ static inline void spin_lock_prefetch(co extern unsigned long thread_saved_pc(struct task_struct *tsk); #define THREAD_SIZE_LONGS (THREAD_SIZE/sizeof(unsigned long)) @@ -8419,7 +8670,7 @@ diff -urNp linux-2.6.34.1/arch/x86/include/asm/processor.h linux-2.6.34.1/arch/x /* * The below -8 is to reserve 8 bytes on top of the ring0 stack. -@@ -961,7 +964,7 @@ extern unsigned long thread_saved_pc(str +@@ -932,7 +935,7 @@ extern unsigned long thread_saved_pc(str #define task_pt_regs(task) \ ({ \ struct pt_regs *__regs__; \ @@ -8428,7 +8679,7 @@ diff -urNp linux-2.6.34.1/arch/x86/include/asm/processor.h linux-2.6.34.1/arch/x __regs__ - 1; \ }) -@@ -971,13 +974,13 @@ extern unsigned long thread_saved_pc(str +@@ -942,13 +945,13 @@ extern unsigned long thread_saved_pc(str /* * User space process size. 47bits minus one guard page. */ @@ -8444,7 +8695,7 @@ diff -urNp linux-2.6.34.1/arch/x86/include/asm/processor.h linux-2.6.34.1/arch/x #define TASK_SIZE (test_thread_flag(TIF_IA32) ? \ IA32_PAGE_OFFSET : TASK_SIZE_MAX) -@@ -1014,6 +1017,10 @@ extern void start_thread(struct pt_regs +@@ -985,6 +988,10 @@ extern void start_thread(struct pt_regs */ #define TASK_UNMAPPED_BASE (PAGE_ALIGN(TASK_SIZE / 3)) @@ -8455,9 +8706,9 @@ diff -urNp linux-2.6.34.1/arch/x86/include/asm/processor.h linux-2.6.34.1/arch/x #define KSTK_EIP(task) (task_pt_regs(task)->ip) /* Get/set a process' ability to use the timestamp counter instruction */ -diff -urNp linux-2.6.34.1/arch/x86/include/asm/ptrace.h linux-2.6.34.1/arch/x86/include/asm/ptrace.h ---- linux-2.6.34.1/arch/x86/include/asm/ptrace.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/include/asm/ptrace.h 2010-07-07 09:04:46.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/include/asm/ptrace.h linux-2.6.35.4/arch/x86/include/asm/ptrace.h +--- linux-2.6.35.4/arch/x86/include/asm/ptrace.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/include/asm/ptrace.h 2010-09-17 20:12:09.000000000 -0400 @@ -152,28 +152,29 @@ static inline unsigned long regs_return_ } @@ -8494,9 +8745,9 @@ diff -urNp linux-2.6.34.1/arch/x86/include/asm/ptrace.h linux-2.6.34.1/arch/x86/ #endif } -diff -urNp linux-2.6.34.1/arch/x86/include/asm/reboot.h linux-2.6.34.1/arch/x86/include/asm/reboot.h ---- linux-2.6.34.1/arch/x86/include/asm/reboot.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/include/asm/reboot.h 2010-07-07 09:04:46.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/include/asm/reboot.h linux-2.6.35.4/arch/x86/include/asm/reboot.h +--- linux-2.6.35.4/arch/x86/include/asm/reboot.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/include/asm/reboot.h 2010-09-17 20:12:09.000000000 -0400 @@ -18,7 +18,7 @@ extern struct machine_ops machine_ops; void native_machine_crash_shutdown(struct pt_regs *regs); @@ -8506,9 +8757,9 @@ diff -urNp linux-2.6.34.1/arch/x86/include/asm/reboot.h linux-2.6.34.1/arch/x86/ typedef void (*nmi_shootdown_cb)(int, struct die_args*); void nmi_shootdown_cpus(nmi_shootdown_cb callback); -diff -urNp linux-2.6.34.1/arch/x86/include/asm/rwsem.h linux-2.6.34.1/arch/x86/include/asm/rwsem.h ---- linux-2.6.34.1/arch/x86/include/asm/rwsem.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/include/asm/rwsem.h 2010-07-07 09:04:46.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/include/asm/rwsem.h linux-2.6.35.4/arch/x86/include/asm/rwsem.h +--- linux-2.6.35.4/arch/x86/include/asm/rwsem.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/include/asm/rwsem.h 2010-09-17 20:12:09.000000000 -0400 @@ -118,10 +118,26 @@ static inline void __down_read(struct rw { asm volatile("# beginning down_read\n\t" @@ -8744,9 +8995,9 @@ diff -urNp linux-2.6.34.1/arch/x86/include/asm/rwsem.h linux-2.6.34.1/arch/x86/i : "+r" (tmp), "+m" (sem->count) : : "memory"); -diff -urNp linux-2.6.34.1/arch/x86/include/asm/segment.h linux-2.6.34.1/arch/x86/include/asm/segment.h ---- linux-2.6.34.1/arch/x86/include/asm/segment.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/include/asm/segment.h 2010-07-07 09:04:46.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/include/asm/segment.h linux-2.6.35.4/arch/x86/include/asm/segment.h +--- linux-2.6.35.4/arch/x86/include/asm/segment.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/include/asm/segment.h 2010-09-17 20:12:09.000000000 -0400 @@ -62,8 +62,8 @@ * 26 - ESPFIX small SS * 27 - per-cpu [ offset to per-cpu data area ] @@ -8815,9 +9066,9 @@ diff -urNp linux-2.6.34.1/arch/x86/include/asm/segment.h linux-2.6.34.1/arch/x86 #define __KERNEL_DS (GDT_ENTRY_KERNEL_DS * 8) #define __USER_DS (GDT_ENTRY_DEFAULT_USER_DS* 8 + 3) #define __USER_CS (GDT_ENTRY_DEFAULT_USER_CS* 8 + 3) -diff -urNp linux-2.6.34.1/arch/x86/include/asm/spinlock.h linux-2.6.34.1/arch/x86/include/asm/spinlock.h ---- linux-2.6.34.1/arch/x86/include/asm/spinlock.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/include/asm/spinlock.h 2010-07-07 09:04:46.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/include/asm/spinlock.h linux-2.6.35.4/arch/x86/include/asm/spinlock.h +--- linux-2.6.35.4/arch/x86/include/asm/spinlock.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/include/asm/spinlock.h 2010-09-17 20:12:09.000000000 -0400 @@ -249,18 +249,50 @@ static inline int arch_write_can_lock(ar static inline void arch_read_lock(arch_rwlock_t *rw) { @@ -8921,9 +9172,9 @@ diff -urNp linux-2.6.34.1/arch/x86/include/asm/spinlock.h linux-2.6.34.1/arch/x8 : "+m" (rw->lock) : "i" (RW_LOCK_BIAS) : "memory"); } -diff -urNp linux-2.6.34.1/arch/x86/include/asm/system.h linux-2.6.34.1/arch/x86/include/asm/system.h ---- linux-2.6.34.1/arch/x86/include/asm/system.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/include/asm/system.h 2010-07-07 09:04:46.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/include/asm/system.h linux-2.6.35.4/arch/x86/include/asm/system.h +--- linux-2.6.35.4/arch/x86/include/asm/system.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/include/asm/system.h 2010-09-17 20:12:09.000000000 -0400 @@ -202,7 +202,7 @@ static inline unsigned long get_limit(un { unsigned long __limit; @@ -8942,236 +9193,9 @@ diff -urNp linux-2.6.34.1/arch/x86/include/asm/system.h linux-2.6.34.1/arch/x86/ extern void free_init_pages(char *what, unsigned long begin, unsigned long end); void default_idle(void); -diff -urNp linux-2.6.34.1/arch/x86/include/asm/uaccess.h linux-2.6.34.1/arch/x86/include/asm/uaccess.h ---- linux-2.6.34.1/arch/x86/include/asm/uaccess.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/include/asm/uaccess.h 2010-07-07 09:04:46.000000000 -0400 -@@ -8,12 +8,15 @@ - #include - #include - #include -+#include - #include - #include - - #define VERIFY_READ 0 - #define VERIFY_WRITE 1 - -+extern void check_object_size(const void *ptr, unsigned long n, bool to); -+ - /* - * The fs value determines whether argument validity checking should be - * performed or not. If get_fs() == USER_DS, checking is performed, with -@@ -29,7 +32,12 @@ - - #define get_ds() (KERNEL_DS) - #define get_fs() (current_thread_info()->addr_limit) -+#ifdef CONFIG_X86_32 -+void __set_fs(mm_segment_t x, int cpu); -+void set_fs(mm_segment_t x); -+#else - #define set_fs(x) (current_thread_info()->addr_limit = (x)) -+#endif - - #define segment_eq(a, b) ((a).seg == (b).seg) - -@@ -77,7 +85,33 @@ - * checks that the pointer is in the user space range - after calling - * this function, memory access functions may still return -EFAULT. - */ --#define access_ok(type, addr, size) (likely(__range_not_ok(addr, size) == 0)) -+#define __access_ok(type, addr, size) (likely(__range_not_ok(addr, size) == 0)) -+#define access_ok(type, addr, size) \ -+({ \ -+ long __size = size; \ -+ unsigned long __addr = (unsigned long)addr; \ -+ unsigned long __addr_ao = __addr & PAGE_MASK; \ -+ unsigned long __end_ao = __addr + __size - 1; \ -+ bool __ret_ao = __range_not_ok(__addr, __size) == 0; \ -+ if (__ret_ao && unlikely((__end_ao ^ __addr_ao) & PAGE_MASK)) { \ -+ while(__addr_ao <= __end_ao) { \ -+ char __c_ao; \ -+ __addr_ao += PAGE_SIZE; \ -+ if (__size > PAGE_SIZE) \ -+ cond_resched(); \ -+ if (__get_user(__c_ao, (char __user *)__addr)) \ -+ break; \ -+ if (type != VERIFY_WRITE) { \ -+ __addr = __addr_ao; \ -+ continue; \ -+ } \ -+ if (__put_user(__c_ao, (char __user *)__addr)) \ -+ break; \ -+ __addr = __addr_ao; \ -+ } \ -+ } \ -+ __ret_ao; \ -+}) - - /* - * The exception table consists of pairs of addresses: the first is the -@@ -183,13 +217,21 @@ extern int __get_user_bad(void); - asm volatile("call __put_user_" #size : "=a" (__ret_pu) \ - : "0" ((typeof(*(ptr)))(x)), "c" (ptr) : "ebx") - -- -+#ifdef CONFIG_X86_32 -+#define _ASM_LOAD_USER_DS(ds) "movw %w" #ds ",%%ds\n" -+#define _ASM_LOAD_KERNEL_DS "pushl %%ss; popl %%ds\n" -+#else -+#define _ASM_LOAD_USER_DS(ds) -+#define _ASM_LOAD_KERNEL_DS -+#endif - - #ifdef CONFIG_X86_32 - #define __put_user_asm_u64(x, addr, err, errret) \ -- asm volatile("1: movl %%eax,0(%2)\n" \ -- "2: movl %%edx,4(%2)\n" \ -+ asm volatile(_ASM_LOAD_USER_DS(5) \ -+ "1: movl %%eax,%%ds:0(%2)\n" \ -+ "2: movl %%edx,%%ds:4(%2)\n" \ - "3:\n" \ -+ _ASM_LOAD_KERNEL_DS \ - ".section .fixup,\"ax\"\n" \ - "4: movl %3,%0\n" \ - " jmp 3b\n" \ -@@ -197,15 +239,18 @@ extern int __get_user_bad(void); - _ASM_EXTABLE(1b, 4b) \ - _ASM_EXTABLE(2b, 4b) \ - : "=r" (err) \ -- : "A" (x), "r" (addr), "i" (errret), "0" (err)) -+ : "A" (x), "r" (addr), "i" (errret), "0" (err), \ -+ "r"(__USER_DS)) - - #define __put_user_asm_ex_u64(x, addr) \ -- asm volatile("1: movl %%eax,0(%1)\n" \ -- "2: movl %%edx,4(%1)\n" \ -+ asm volatile(_ASM_LOAD_USER_DS(2) \ -+ "1: movl %%eax,%%ds:0(%1)\n" \ -+ "2: movl %%edx,%%ds:4(%1)\n" \ - "3:\n" \ -+ _ASM_LOAD_KERNEL_DS \ - _ASM_EXTABLE(1b, 2b - 1b) \ - _ASM_EXTABLE(2b, 3b - 2b) \ -- : : "A" (x), "r" (addr)) -+ : : "A" (x), "r" (addr), "r"(__USER_DS)) - - #define __put_user_x8(x, ptr, __ret_pu) \ - asm volatile("call __put_user_8" : "=a" (__ret_pu) \ -@@ -374,16 +419,18 @@ do { \ - } while (0) - - #define __get_user_asm(x, addr, err, itype, rtype, ltype, errret) \ -- asm volatile("1: mov"itype" %2,%"rtype"1\n" \ -+ asm volatile(_ASM_LOAD_USER_DS(5) \ -+ "1: mov"itype" %%ds:%2,%"rtype"1\n" \ - "2:\n" \ -+ _ASM_LOAD_KERNEL_DS \ - ".section .fixup,\"ax\"\n" \ - "3: mov %3,%0\n" \ - " xor"itype" %"rtype"1,%"rtype"1\n" \ - " jmp 2b\n" \ - ".previous\n" \ - _ASM_EXTABLE(1b, 3b) \ -- : "=r" (err), ltype(x) \ -- : "m" (__m(addr)), "i" (errret), "0" (err)) -+ : "=r" (err), ltype (x) \ -+ : "m" (__m(addr)), "i" (errret), "0" (err), "r"(__USER_DS)) - - #define __get_user_size_ex(x, ptr, size) \ - do { \ -@@ -407,10 +454,12 @@ do { \ - } while (0) - - #define __get_user_asm_ex(x, addr, itype, rtype, ltype) \ -- asm volatile("1: mov"itype" %1,%"rtype"0\n" \ -+ asm volatile(_ASM_LOAD_USER_DS(2) \ -+ "1: mov"itype" %%ds:%1,%"rtype"0\n" \ - "2:\n" \ -+ _ASM_LOAD_KERNEL_DS \ - _ASM_EXTABLE(1b, 2b - 1b) \ -- : ltype(x) : "m" (__m(addr))) -+ : ltype(x) : "m" (__m(addr)), "r"(__USER_DS)) - - #define __put_user_nocheck(x, ptr, size) \ - ({ \ -@@ -424,13 +473,24 @@ do { \ - int __gu_err; \ - unsigned long __gu_val; \ - __get_user_size(__gu_val, (ptr), (size), __gu_err, -EFAULT); \ -- (x) = (__force __typeof__(*(ptr)))__gu_val; \ -+ (x) = (__typeof__(*(ptr)))__gu_val; \ - __gu_err; \ - }) - - /* FIXME: this hack is definitely wrong -AK */ - struct __large_struct { unsigned long buf[100]; }; --#define __m(x) (*(struct __large_struct __user *)(x)) -+#if defined(CONFIG_X86_64) && defined(CONFIG_PAX_MEMORY_UDEREF) -+#define ____m(x) \ -+({ \ -+ unsigned long ____x = (unsigned long)(x); \ -+ if (____x < PAX_USER_SHADOW_BASE) \ -+ ____x += PAX_USER_SHADOW_BASE; \ -+ (void __user *)____x; \ -+}) -+#else -+#define ____m(x) (x) -+#endif -+#define __m(x) (*(struct __large_struct __user *)____m(x)) - - /* - * Tell gcc we read from memory instead of writing: this is because -@@ -438,21 +498,26 @@ struct __large_struct { unsigned long bu - * aliasing issues. - */ - #define __put_user_asm(x, addr, err, itype, rtype, ltype, errret) \ -- asm volatile("1: mov"itype" %"rtype"1,%2\n" \ -+ asm volatile(_ASM_LOAD_USER_DS(5) \ -+ "1: mov"itype" %"rtype"1,%%ds:%2\n" \ - "2:\n" \ -+ _ASM_LOAD_KERNEL_DS \ - ".section .fixup,\"ax\"\n" \ - "3: mov %3,%0\n" \ - " jmp 2b\n" \ - ".previous\n" \ - _ASM_EXTABLE(1b, 3b) \ - : "=r"(err) \ -- : ltype(x), "m" (__m(addr)), "i" (errret), "0" (err)) -+ : ltype (x), "m" (__m(addr)), "i" (errret), "0" (err),\ -+ "r"(__USER_DS)) - - #define __put_user_asm_ex(x, addr, itype, rtype, ltype) \ -- asm volatile("1: mov"itype" %"rtype"0,%1\n" \ -+ asm volatile(_ASM_LOAD_USER_DS(2) \ -+ "1: mov"itype" %"rtype"0,%%ds:%1\n" \ - "2:\n" \ -+ _ASM_LOAD_KERNEL_DS \ - _ASM_EXTABLE(1b, 2b - 1b) \ -- : : ltype(x), "m" (__m(addr))) -+ : : ltype(x), "m" (__m(addr)), "r"(__USER_DS)) - - /* - * uaccess_try and catch -@@ -530,7 +595,7 @@ struct __large_struct { unsigned long bu - #define get_user_ex(x, ptr) do { \ - unsigned long __gue_val; \ - __get_user_size_ex((__gue_val), (ptr), (sizeof(*(ptr)))); \ -- (x) = (__force __typeof__(*(ptr)))__gue_val; \ -+ (x) = (__typeof__(*(ptr)))__gue_val; \ - } while (0) - - #ifdef CONFIG_X86_WP_WORKS_OK -@@ -567,6 +632,7 @@ extern struct movsl_mask { - - #define ARCH_HAS_NOCACHE_UACCESS 1 - -+#define ARCH_HAS_SORT_EXTABLE - #ifdef CONFIG_X86_32 - # include "uaccess_32.h" - #else -diff -urNp linux-2.6.34.1/arch/x86/include/asm/uaccess_32.h linux-2.6.34.1/arch/x86/include/asm/uaccess_32.h ---- linux-2.6.34.1/arch/x86/include/asm/uaccess_32.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/include/asm/uaccess_32.h 2010-07-07 09:04:46.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/include/asm/uaccess_32.h linux-2.6.35.4/arch/x86/include/asm/uaccess_32.h +--- linux-2.6.35.4/arch/x86/include/asm/uaccess_32.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/include/asm/uaccess_32.h 2010-09-17 20:12:09.000000000 -0400 @@ -44,6 +44,9 @@ unsigned long __must_check __copy_from_u static __always_inline unsigned long __must_check __copy_to_user_inatomic(void __user *to, const void *from, unsigned long n) @@ -9328,9 +9352,9 @@ diff -urNp linux-2.6.34.1/arch/x86/include/asm/uaccess_32.h linux-2.6.34.1/arch/ return n; } -diff -urNp linux-2.6.34.1/arch/x86/include/asm/uaccess_64.h linux-2.6.34.1/arch/x86/include/asm/uaccess_64.h ---- linux-2.6.34.1/arch/x86/include/asm/uaccess_64.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/include/asm/uaccess_64.h 2010-07-07 09:04:46.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/include/asm/uaccess_64.h linux-2.6.35.4/arch/x86/include/asm/uaccess_64.h +--- linux-2.6.35.4/arch/x86/include/asm/uaccess_64.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/include/asm/uaccess_64.h 2010-09-17 20:12:37.000000000 -0400 @@ -11,6 +11,11 @@ #include #include @@ -9561,9 +9585,236 @@ diff -urNp linux-2.6.34.1/arch/x86/include/asm/uaccess_64.h linux-2.6.34.1/arch/ copy_user_handle_tail(char *to, char *from, unsigned len, unsigned zerorest); #endif /* _ASM_X86_UACCESS_64_H */ -diff -urNp linux-2.6.34.1/arch/x86/include/asm/vgtod.h linux-2.6.34.1/arch/x86/include/asm/vgtod.h ---- linux-2.6.34.1/arch/x86/include/asm/vgtod.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/include/asm/vgtod.h 2010-07-07 09:04:46.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/include/asm/uaccess.h linux-2.6.35.4/arch/x86/include/asm/uaccess.h +--- linux-2.6.35.4/arch/x86/include/asm/uaccess.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/include/asm/uaccess.h 2010-09-17 20:12:09.000000000 -0400 +@@ -8,12 +8,15 @@ + #include + #include + #include ++#include + #include + #include + + #define VERIFY_READ 0 + #define VERIFY_WRITE 1 + ++extern void check_object_size(const void *ptr, unsigned long n, bool to); ++ + /* + * The fs value determines whether argument validity checking should be + * performed or not. If get_fs() == USER_DS, checking is performed, with +@@ -29,7 +32,12 @@ + + #define get_ds() (KERNEL_DS) + #define get_fs() (current_thread_info()->addr_limit) ++#ifdef CONFIG_X86_32 ++void __set_fs(mm_segment_t x, int cpu); ++void set_fs(mm_segment_t x); ++#else + #define set_fs(x) (current_thread_info()->addr_limit = (x)) ++#endif + + #define segment_eq(a, b) ((a).seg == (b).seg) + +@@ -77,7 +85,33 @@ + * checks that the pointer is in the user space range - after calling + * this function, memory access functions may still return -EFAULT. + */ +-#define access_ok(type, addr, size) (likely(__range_not_ok(addr, size) == 0)) ++#define __access_ok(type, addr, size) (likely(__range_not_ok(addr, size) == 0)) ++#define access_ok(type, addr, size) \ ++({ \ ++ long __size = size; \ ++ unsigned long __addr = (unsigned long)addr; \ ++ unsigned long __addr_ao = __addr & PAGE_MASK; \ ++ unsigned long __end_ao = __addr + __size - 1; \ ++ bool __ret_ao = __range_not_ok(__addr, __size) == 0; \ ++ if (__ret_ao && unlikely((__end_ao ^ __addr_ao) & PAGE_MASK)) { \ ++ while(__addr_ao <= __end_ao) { \ ++ char __c_ao; \ ++ __addr_ao += PAGE_SIZE; \ ++ if (__size > PAGE_SIZE) \ ++ cond_resched(); \ ++ if (__get_user(__c_ao, (char __user *)__addr)) \ ++ break; \ ++ if (type != VERIFY_WRITE) { \ ++ __addr = __addr_ao; \ ++ continue; \ ++ } \ ++ if (__put_user(__c_ao, (char __user *)__addr)) \ ++ break; \ ++ __addr = __addr_ao; \ ++ } \ ++ } \ ++ __ret_ao; \ ++}) + + /* + * The exception table consists of pairs of addresses: the first is the +@@ -183,13 +217,21 @@ extern int __get_user_bad(void); + asm volatile("call __put_user_" #size : "=a" (__ret_pu) \ + : "0" ((typeof(*(ptr)))(x)), "c" (ptr) : "ebx") + +- ++#ifdef CONFIG_X86_32 ++#define _ASM_LOAD_USER_DS(ds) "movw %w" #ds ",%%ds\n" ++#define _ASM_LOAD_KERNEL_DS "pushl %%ss; popl %%ds\n" ++#else ++#define _ASM_LOAD_USER_DS(ds) ++#define _ASM_LOAD_KERNEL_DS ++#endif + + #ifdef CONFIG_X86_32 + #define __put_user_asm_u64(x, addr, err, errret) \ +- asm volatile("1: movl %%eax,0(%2)\n" \ +- "2: movl %%edx,4(%2)\n" \ ++ asm volatile(_ASM_LOAD_USER_DS(5) \ ++ "1: movl %%eax,%%ds:0(%2)\n" \ ++ "2: movl %%edx,%%ds:4(%2)\n" \ + "3:\n" \ ++ _ASM_LOAD_KERNEL_DS \ + ".section .fixup,\"ax\"\n" \ + "4: movl %3,%0\n" \ + " jmp 3b\n" \ +@@ -197,15 +239,18 @@ extern int __get_user_bad(void); + _ASM_EXTABLE(1b, 4b) \ + _ASM_EXTABLE(2b, 4b) \ + : "=r" (err) \ +- : "A" (x), "r" (addr), "i" (errret), "0" (err)) ++ : "A" (x), "r" (addr), "i" (errret), "0" (err), \ ++ "r"(__USER_DS)) + + #define __put_user_asm_ex_u64(x, addr) \ +- asm volatile("1: movl %%eax,0(%1)\n" \ +- "2: movl %%edx,4(%1)\n" \ ++ asm volatile(_ASM_LOAD_USER_DS(2) \ ++ "1: movl %%eax,%%ds:0(%1)\n" \ ++ "2: movl %%edx,%%ds:4(%1)\n" \ + "3:\n" \ ++ _ASM_LOAD_KERNEL_DS \ + _ASM_EXTABLE(1b, 2b - 1b) \ + _ASM_EXTABLE(2b, 3b - 2b) \ +- : : "A" (x), "r" (addr)) ++ : : "A" (x), "r" (addr), "r"(__USER_DS)) + + #define __put_user_x8(x, ptr, __ret_pu) \ + asm volatile("call __put_user_8" : "=a" (__ret_pu) \ +@@ -374,16 +419,18 @@ do { \ + } while (0) + + #define __get_user_asm(x, addr, err, itype, rtype, ltype, errret) \ +- asm volatile("1: mov"itype" %2,%"rtype"1\n" \ ++ asm volatile(_ASM_LOAD_USER_DS(5) \ ++ "1: mov"itype" %%ds:%2,%"rtype"1\n" \ + "2:\n" \ ++ _ASM_LOAD_KERNEL_DS \ + ".section .fixup,\"ax\"\n" \ + "3: mov %3,%0\n" \ + " xor"itype" %"rtype"1,%"rtype"1\n" \ + " jmp 2b\n" \ + ".previous\n" \ + _ASM_EXTABLE(1b, 3b) \ +- : "=r" (err), ltype(x) \ +- : "m" (__m(addr)), "i" (errret), "0" (err)) ++ : "=r" (err), ltype (x) \ ++ : "m" (__m(addr)), "i" (errret), "0" (err), "r"(__USER_DS)) + + #define __get_user_size_ex(x, ptr, size) \ + do { \ +@@ -407,10 +454,12 @@ do { \ + } while (0) + + #define __get_user_asm_ex(x, addr, itype, rtype, ltype) \ +- asm volatile("1: mov"itype" %1,%"rtype"0\n" \ ++ asm volatile(_ASM_LOAD_USER_DS(2) \ ++ "1: mov"itype" %%ds:%1,%"rtype"0\n" \ + "2:\n" \ ++ _ASM_LOAD_KERNEL_DS \ + _ASM_EXTABLE(1b, 2b - 1b) \ +- : ltype(x) : "m" (__m(addr))) ++ : ltype(x) : "m" (__m(addr)), "r"(__USER_DS)) + + #define __put_user_nocheck(x, ptr, size) \ + ({ \ +@@ -424,13 +473,24 @@ do { \ + int __gu_err; \ + unsigned long __gu_val; \ + __get_user_size(__gu_val, (ptr), (size), __gu_err, -EFAULT); \ +- (x) = (__force __typeof__(*(ptr)))__gu_val; \ ++ (x) = (__typeof__(*(ptr)))__gu_val; \ + __gu_err; \ + }) + + /* FIXME: this hack is definitely wrong -AK */ + struct __large_struct { unsigned long buf[100]; }; +-#define __m(x) (*(struct __large_struct __user *)(x)) ++#if defined(CONFIG_X86_64) && defined(CONFIG_PAX_MEMORY_UDEREF) ++#define ____m(x) \ ++({ \ ++ unsigned long ____x = (unsigned long)(x); \ ++ if (____x < PAX_USER_SHADOW_BASE) \ ++ ____x += PAX_USER_SHADOW_BASE; \ ++ (void __user *)____x; \ ++}) ++#else ++#define ____m(x) (x) ++#endif ++#define __m(x) (*(struct __large_struct __user *)____m(x)) + + /* + * Tell gcc we read from memory instead of writing: this is because +@@ -438,21 +498,26 @@ struct __large_struct { unsigned long bu + * aliasing issues. + */ + #define __put_user_asm(x, addr, err, itype, rtype, ltype, errret) \ +- asm volatile("1: mov"itype" %"rtype"1,%2\n" \ ++ asm volatile(_ASM_LOAD_USER_DS(5) \ ++ "1: mov"itype" %"rtype"1,%%ds:%2\n" \ + "2:\n" \ ++ _ASM_LOAD_KERNEL_DS \ + ".section .fixup,\"ax\"\n" \ + "3: mov %3,%0\n" \ + " jmp 2b\n" \ + ".previous\n" \ + _ASM_EXTABLE(1b, 3b) \ + : "=r"(err) \ +- : ltype(x), "m" (__m(addr)), "i" (errret), "0" (err)) ++ : ltype (x), "m" (__m(addr)), "i" (errret), "0" (err),\ ++ "r"(__USER_DS)) + + #define __put_user_asm_ex(x, addr, itype, rtype, ltype) \ +- asm volatile("1: mov"itype" %"rtype"0,%1\n" \ ++ asm volatile(_ASM_LOAD_USER_DS(2) \ ++ "1: mov"itype" %"rtype"0,%%ds:%1\n" \ + "2:\n" \ ++ _ASM_LOAD_KERNEL_DS \ + _ASM_EXTABLE(1b, 2b - 1b) \ +- : : ltype(x), "m" (__m(addr))) ++ : : ltype(x), "m" (__m(addr)), "r"(__USER_DS)) + + /* + * uaccess_try and catch +@@ -530,7 +595,7 @@ struct __large_struct { unsigned long bu + #define get_user_ex(x, ptr) do { \ + unsigned long __gue_val; \ + __get_user_size_ex((__gue_val), (ptr), (sizeof(*(ptr)))); \ +- (x) = (__force __typeof__(*(ptr)))__gue_val; \ ++ (x) = (__typeof__(*(ptr)))__gue_val; \ + } while (0) + + #ifdef CONFIG_X86_WP_WORKS_OK +@@ -567,6 +632,7 @@ extern struct movsl_mask { + + #define ARCH_HAS_NOCACHE_UACCESS 1 + ++#define ARCH_HAS_SORT_EXTABLE + #ifdef CONFIG_X86_32 + # include "uaccess_32.h" + #else +diff -urNp linux-2.6.35.4/arch/x86/include/asm/vgtod.h linux-2.6.35.4/arch/x86/include/asm/vgtod.h +--- linux-2.6.35.4/arch/x86/include/asm/vgtod.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/include/asm/vgtod.h 2010-09-17 20:12:09.000000000 -0400 @@ -14,6 +14,7 @@ struct vsyscall_gtod_data { int sysctl_enabled; struct timezone sys_tz; @@ -9572,9 +9823,9 @@ diff -urNp linux-2.6.34.1/arch/x86/include/asm/vgtod.h linux-2.6.34.1/arch/x86/i cycle_t (*vread)(void); cycle_t cycle_last; cycle_t mask; -diff -urNp linux-2.6.34.1/arch/x86/include/asm/vmi.h linux-2.6.34.1/arch/x86/include/asm/vmi.h ---- linux-2.6.34.1/arch/x86/include/asm/vmi.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/include/asm/vmi.h 2010-07-07 09:04:46.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/include/asm/vmi.h linux-2.6.35.4/arch/x86/include/asm/vmi.h +--- linux-2.6.35.4/arch/x86/include/asm/vmi.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/include/asm/vmi.h 2010-09-17 20:12:09.000000000 -0400 @@ -191,6 +191,7 @@ struct vrom_header { u8 reserved[96]; /* Reserved for headers */ char vmi_init[8]; /* VMI_Init jump point */ @@ -9583,9 +9834,9 @@ diff -urNp linux-2.6.34.1/arch/x86/include/asm/vmi.h linux-2.6.34.1/arch/x86/inc } __attribute__((packed)); struct pnp_header { -diff -urNp linux-2.6.34.1/arch/x86/include/asm/vsyscall.h linux-2.6.34.1/arch/x86/include/asm/vsyscall.h ---- linux-2.6.34.1/arch/x86/include/asm/vsyscall.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/include/asm/vsyscall.h 2010-07-07 09:04:46.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/include/asm/vsyscall.h linux-2.6.35.4/arch/x86/include/asm/vsyscall.h +--- linux-2.6.35.4/arch/x86/include/asm/vsyscall.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/include/asm/vsyscall.h 2010-09-17 20:12:09.000000000 -0400 @@ -15,9 +15,10 @@ enum vsyscall_num { #ifdef __KERNEL__ @@ -9616,10 +9867,10 @@ diff -urNp linux-2.6.34.1/arch/x86/include/asm/vsyscall.h linux-2.6.34.1/arch/x8 #endif /* __KERNEL__ */ #endif /* _ASM_X86_VSYSCALL_H */ -diff -urNp linux-2.6.34.1/arch/x86/include/asm/xsave.h linux-2.6.34.1/arch/x86/include/asm/xsave.h ---- linux-2.6.34.1/arch/x86/include/asm/xsave.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/include/asm/xsave.h 2010-07-07 09:04:46.000000000 -0400 -@@ -58,6 +58,12 @@ static inline int xrstor_checking(struct +diff -urNp linux-2.6.35.4/arch/x86/include/asm/xsave.h linux-2.6.35.4/arch/x86/include/asm/xsave.h +--- linux-2.6.35.4/arch/x86/include/asm/xsave.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/include/asm/xsave.h 2010-09-17 20:12:09.000000000 -0400 +@@ -59,6 +59,12 @@ static inline int fpu_xrstor_checking(st static inline int xsave_user(struct xsave_struct __user *buf) { int err; @@ -9632,7 +9883,7 @@ diff -urNp linux-2.6.34.1/arch/x86/include/asm/xsave.h linux-2.6.34.1/arch/x86/i __asm__ __volatile__("1: .byte " REX_PREFIX "0x0f,0xae,0x27\n" "2:\n" ".section .fixup,\"ax\"\n" -@@ -84,6 +90,11 @@ static inline int xrestore_user(struct x +@@ -85,6 +91,11 @@ static inline int xrestore_user(struct x u32 lmask = mask; u32 hmask = mask >> 32; @@ -9644,10 +9895,119 @@ diff -urNp linux-2.6.34.1/arch/x86/include/asm/xsave.h linux-2.6.34.1/arch/x86/i __asm__ __volatile__("1: .byte " REX_PREFIX "0x0f,0xae,0x2f\n" "2:\n" ".section .fixup,\"ax\"\n" -diff -urNp linux-2.6.34.1/arch/x86/kernel/acpi/boot.c linux-2.6.34.1/arch/x86/kernel/acpi/boot.c ---- linux-2.6.34.1/arch/x86/kernel/acpi/boot.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/kernel/acpi/boot.c 2010-07-07 09:04:46.000000000 -0400 -@@ -1436,7 +1436,7 @@ static struct dmi_system_id __initdata a +diff -urNp linux-2.6.35.4/arch/x86/Kconfig linux-2.6.35.4/arch/x86/Kconfig +--- linux-2.6.35.4/arch/x86/Kconfig 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/Kconfig 2010-09-17 20:12:37.000000000 -0400 +@@ -1038,7 +1038,7 @@ choice + + config NOHIGHMEM + bool "off" +- depends on !X86_NUMAQ ++ depends on !X86_NUMAQ && !(PAX_PAGEEXEC && PAX_ENABLE_PAE) + ---help--- + Linux can use up to 64 Gigabytes of physical memory on x86 systems. + However, the address space of 32-bit x86 processors is only 4 +@@ -1075,7 +1075,7 @@ config NOHIGHMEM + + config HIGHMEM4G + bool "4GB" +- depends on !X86_NUMAQ ++ depends on !X86_NUMAQ && !(PAX_PAGEEXEC && PAX_ENABLE_PAE) + ---help--- + Select this if you have a 32-bit processor and between 1 and 4 + gigabytes of physical RAM. +@@ -1129,7 +1129,7 @@ config PAGE_OFFSET + hex + default 0xB0000000 if VMSPLIT_3G_OPT + default 0x80000000 if VMSPLIT_2G +- default 0x78000000 if VMSPLIT_2G_OPT ++ default 0x70000000 if VMSPLIT_2G_OPT + default 0x40000000 if VMSPLIT_1G + default 0xC0000000 + depends on X86_32 +@@ -1461,7 +1461,7 @@ config ARCH_USES_PG_UNCACHED + + config EFI + bool "EFI runtime service support" +- depends on ACPI ++ depends on ACPI && !PAX_KERNEXEC + ---help--- + This enables the kernel to use EFI runtime services that are + available (such as the EFI variable services). +@@ -1548,6 +1548,7 @@ config KEXEC_JUMP + config PHYSICAL_START + hex "Physical address where the kernel is loaded" if (EMBEDDED || CRASH_DUMP) + default "0x1000000" ++ range 0x400000 0x40000000 + ---help--- + This gives the physical address where the kernel is loaded. + +@@ -1611,6 +1612,7 @@ config X86_NEED_RELOCS + config PHYSICAL_ALIGN + hex "Alignment value to which kernel should be aligned" if X86_32 + default "0x1000000" ++ range 0x400000 0x1000000 if PAX_KERNEXEC + range 0x2000 0x1000000 + ---help--- + This value puts the alignment restrictions on physical address +@@ -1642,9 +1644,10 @@ config HOTPLUG_CPU + Say N if you want to disable CPU hotplug. + + config COMPAT_VDSO +- def_bool y ++ def_bool n + prompt "Compat VDSO support" + depends on X86_32 || IA32_EMULATION ++ depends on !PAX_NOEXEC && !PAX_MEMORY_UDEREF + ---help--- + Map the 32-bit VDSO to the predictable old-style address too. + +diff -urNp linux-2.6.35.4/arch/x86/Kconfig.cpu linux-2.6.35.4/arch/x86/Kconfig.cpu +--- linux-2.6.35.4/arch/x86/Kconfig.cpu 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/Kconfig.cpu 2010-09-17 20:12:09.000000000 -0400 +@@ -336,7 +336,7 @@ config X86_PPRO_FENCE + + config X86_F00F_BUG + def_bool y +- depends on M586MMX || M586TSC || M586 || M486 || M386 ++ depends on (M586MMX || M586TSC || M586 || M486 || M386) && !PAX_KERNEXEC + + config X86_INVD_BUG + def_bool y +@@ -360,7 +360,7 @@ config X86_POPAD_OK + + config X86_ALIGNMENT_16 + def_bool y +- depends on MWINCHIP3D || MWINCHIPC6 || MCYRIXIII || X86_ELAN || MK6 || M586MMX || M586TSC || M586 || M486 || MVIAC3_2 || MGEODEGX1 ++ depends on MWINCHIP3D || MWINCHIPC6 || MCYRIXIII || X86_ELAN || MK8 || MK7 || MK6 || MCORE2 || MPENTIUM4 || MPENTIUMIII || MPENTIUMII || M686 || M586MMX || M586TSC || M586 || M486 || MVIAC3_2 || MGEODEGX1 + + config X86_INTEL_USERCOPY + def_bool y +@@ -406,7 +406,7 @@ config X86_CMPXCHG64 + # generates cmov. + config X86_CMOV + def_bool y +- depends on (MK8 || MK7 || MCORE2 || MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M686 || MVIAC3_2 || MVIAC7 || MCRUSOE || MEFFICEON || X86_64 || MATOM || MGEODE_LX) ++ depends on (MK8 || MK7 || MCORE2 || MPSC || MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M686 || MVIAC3_2 || MVIAC7 || MCRUSOE || MEFFICEON || X86_64 || MATOM || MGEODE_LX) + + config X86_MINIMUM_CPU_FAMILY + int +diff -urNp linux-2.6.35.4/arch/x86/Kconfig.debug linux-2.6.35.4/arch/x86/Kconfig.debug +--- linux-2.6.35.4/arch/x86/Kconfig.debug 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/Kconfig.debug 2010-09-17 20:12:09.000000000 -0400 +@@ -97,7 +97,7 @@ config X86_PTDUMP + config DEBUG_RODATA + bool "Write protect kernel read-only data structures" + default y +- depends on DEBUG_KERNEL ++ depends on DEBUG_KERNEL && BROKEN + ---help--- + Mark the kernel read-only data as write-protected in the pagetables, + in order to catch accidental (and incorrect) writes to such const +diff -urNp linux-2.6.35.4/arch/x86/kernel/acpi/boot.c linux-2.6.35.4/arch/x86/kernel/acpi/boot.c +--- linux-2.6.35.4/arch/x86/kernel/acpi/boot.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/kernel/acpi/boot.c 2010-09-17 20:12:09.000000000 -0400 +@@ -1472,7 +1472,7 @@ static struct dmi_system_id __initdata a DMI_MATCH(DMI_PRODUCT_NAME, "HP Compaq 6715b"), }, }, @@ -9656,9 +10016,9 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/acpi/boot.c linux-2.6.34.1/arch/x86/ke }; /* -diff -urNp linux-2.6.34.1/arch/x86/kernel/acpi/realmode/wakeup.S linux-2.6.34.1/arch/x86/kernel/acpi/realmode/wakeup.S ---- linux-2.6.34.1/arch/x86/kernel/acpi/realmode/wakeup.S 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/kernel/acpi/realmode/wakeup.S 2010-07-07 09:04:46.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/kernel/acpi/realmode/wakeup.S linux-2.6.35.4/arch/x86/kernel/acpi/realmode/wakeup.S +--- linux-2.6.35.4/arch/x86/kernel/acpi/realmode/wakeup.S 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/kernel/acpi/realmode/wakeup.S 2010-09-17 20:12:09.000000000 -0400 @@ -104,7 +104,7 @@ _start: movl %eax, %ecx orl %edx, %ecx @@ -9668,9 +10028,9 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/acpi/realmode/wakeup.S linux-2.6.34.1/ wrmsr 1: -diff -urNp linux-2.6.34.1/arch/x86/kernel/acpi/sleep.c linux-2.6.34.1/arch/x86/kernel/acpi/sleep.c ---- linux-2.6.34.1/arch/x86/kernel/acpi/sleep.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/kernel/acpi/sleep.c 2010-07-07 09:04:46.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/kernel/acpi/sleep.c linux-2.6.35.4/arch/x86/kernel/acpi/sleep.c +--- linux-2.6.35.4/arch/x86/kernel/acpi/sleep.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/kernel/acpi/sleep.c 2010-09-17 20:12:09.000000000 -0400 @@ -11,11 +11,12 @@ #include #include @@ -9698,9 +10058,9 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/acpi/sleep.c linux-2.6.34.1/arch/x86/k initial_gs = per_cpu_offset(smp_processor_id()); #endif initial_code = (unsigned long)wakeup_long64; -diff -urNp linux-2.6.34.1/arch/x86/kernel/acpi/wakeup_32.S linux-2.6.34.1/arch/x86/kernel/acpi/wakeup_32.S ---- linux-2.6.34.1/arch/x86/kernel/acpi/wakeup_32.S 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/kernel/acpi/wakeup_32.S 2010-07-07 09:04:46.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/kernel/acpi/wakeup_32.S linux-2.6.35.4/arch/x86/kernel/acpi/wakeup_32.S +--- linux-2.6.35.4/arch/x86/kernel/acpi/wakeup_32.S 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/kernel/acpi/wakeup_32.S 2010-09-17 20:12:09.000000000 -0400 @@ -30,13 +30,11 @@ wakeup_pmode_return: # and restore the stack ... but you need gdt for this to work movl saved_context_esp, %esp @@ -9717,10 +10077,28 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/acpi/wakeup_32.S linux-2.6.34.1/arch/x bogus_magic: jmp bogus_magic -diff -urNp linux-2.6.34.1/arch/x86/kernel/alternative.c linux-2.6.34.1/arch/x86/kernel/alternative.c ---- linux-2.6.34.1/arch/x86/kernel/alternative.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/kernel/alternative.c 2010-07-07 09:04:46.000000000 -0400 -@@ -429,7 +429,7 @@ void __init_or_module apply_paravirt(str +diff -urNp linux-2.6.35.4/arch/x86/kernel/alternative.c linux-2.6.35.4/arch/x86/kernel/alternative.c +--- linux-2.6.35.4/arch/x86/kernel/alternative.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/kernel/alternative.c 2010-09-17 20:12:09.000000000 -0400 +@@ -247,7 +247,7 @@ static void alternatives_smp_lock(const + if (!*poff || ptr < text || ptr >= text_end) + continue; + /* turn DS segment override prefix into lock prefix */ +- if (*ptr == 0x3e) ++ if (*ktla_ktva(ptr) == 0x3e) + text_poke(ptr, ((unsigned char []){0xf0}), 1); + }; + mutex_unlock(&text_mutex); +@@ -268,7 +268,7 @@ static void alternatives_smp_unlock(cons + if (!*poff || ptr < text || ptr >= text_end) + continue; + /* turn lock prefix into DS segment override prefix */ +- if (*ptr == 0xf0) ++ if (*ktla_ktva(ptr) == 0xf0) + text_poke(ptr, ((unsigned char []){0x3E}), 1); + }; + mutex_unlock(&text_mutex); +@@ -436,7 +436,7 @@ void __init_or_module apply_paravirt(str BUG_ON(p->len > MAX_PATCH_LEN); /* prep the buffer with the original instructions */ @@ -9729,7 +10107,7 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/alternative.c linux-2.6.34.1/arch/x86/ used = pv_init_ops.patch(p->instrtype, p->clobbers, insnbuf, (unsigned long)p->instr, p->len); -@@ -497,7 +497,7 @@ void __init alternative_instructions(voi +@@ -504,7 +504,7 @@ void __init alternative_instructions(voi if (smp_alt_once) free_init_pages("SMP alternatives", (unsigned long)__smp_locks, @@ -9738,7 +10116,7 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/alternative.c linux-2.6.34.1/arch/x86/ restart_nmi(); } -@@ -514,12 +514,16 @@ void __init alternative_instructions(voi +@@ -521,13 +521,17 @@ void __init alternative_instructions(voi * instructions. And on the local CPU you need to be protected again NMI or MCE * handlers seeing an inconsistent instruction while you patch. */ @@ -9752,12 +10130,13 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/alternative.c linux-2.6.34.1/arch/x86/ + + pax_open_kernel(); + memcpy(ktla_ktva(addr), opcode, len); + sync_core(); + pax_close_kernel(); + - sync_core(); local_irq_restore(flags); /* Could also do a CLFLUSH here to speed up CPU recovery; but -@@ -542,36 +546,22 @@ static void *__init_or_module text_poke_ + that causes hangs on some VIA CPUs. */ +@@ -549,36 +553,22 @@ static void *__init_or_module text_poke_ */ void *__kprobes text_poke(void *addr, const void *opcode, size_t len) { @@ -9802,10 +10181,10 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/alternative.c linux-2.6.34.1/arch/x86/ return addr; } -diff -urNp linux-2.6.34.1/arch/x86/kernel/amd_iommu.c linux-2.6.34.1/arch/x86/kernel/amd_iommu.c ---- linux-2.6.34.1/arch/x86/kernel/amd_iommu.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/kernel/amd_iommu.c 2010-07-07 09:04:46.000000000 -0400 -@@ -2217,7 +2217,7 @@ static void prealloc_protection_domains( +diff -urNp linux-2.6.35.4/arch/x86/kernel/amd_iommu.c linux-2.6.35.4/arch/x86/kernel/amd_iommu.c +--- linux-2.6.35.4/arch/x86/kernel/amd_iommu.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/kernel/amd_iommu.c 2010-09-17 20:12:09.000000000 -0400 +@@ -2284,7 +2284,7 @@ static void prealloc_protection_domains( } } @@ -9814,10 +10193,10 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/amd_iommu.c linux-2.6.34.1/arch/x86/ke .alloc_coherent = alloc_coherent, .free_coherent = free_coherent, .map_page = map_page, -diff -urNp linux-2.6.34.1/arch/x86/kernel/apic/io_apic.c linux-2.6.34.1/arch/x86/kernel/apic/io_apic.c ---- linux-2.6.34.1/arch/x86/kernel/apic/io_apic.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/kernel/apic/io_apic.c 2010-07-07 09:04:46.000000000 -0400 -@@ -688,7 +688,7 @@ struct IO_APIC_route_entry **alloc_ioapi +diff -urNp linux-2.6.35.4/arch/x86/kernel/apic/io_apic.c linux-2.6.35.4/arch/x86/kernel/apic/io_apic.c +--- linux-2.6.35.4/arch/x86/kernel/apic/io_apic.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/kernel/apic/io_apic.c 2010-09-17 20:12:09.000000000 -0400 +@@ -691,7 +691,7 @@ struct IO_APIC_route_entry **alloc_ioapi ioapic_entries = kzalloc(sizeof(*ioapic_entries) * nr_ioapics, GFP_ATOMIC); if (!ioapic_entries) @@ -9826,7 +10205,7 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/apic/io_apic.c linux-2.6.34.1/arch/x86 for (apic = 0; apic < nr_ioapics; apic++) { ioapic_entries[apic] = -@@ -705,7 +705,7 @@ nomem: +@@ -708,7 +708,7 @@ nomem: kfree(ioapic_entries[apic]); kfree(ioapic_entries); @@ -9835,7 +10214,7 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/apic/io_apic.c linux-2.6.34.1/arch/x86 } /* -@@ -1122,7 +1122,7 @@ int IO_APIC_get_PCI_irq_vector(int bus, +@@ -1118,7 +1118,7 @@ int IO_APIC_get_PCI_irq_vector(int bus, } EXPORT_SYMBOL(IO_APIC_get_PCI_irq_vector); @@ -9844,7 +10223,7 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/apic/io_apic.c linux-2.6.34.1/arch/x86 { /* Used to the online set of cpus does not change * during assign_irq_vector. -@@ -1130,7 +1130,7 @@ void lock_vector_lock(void) +@@ -1126,7 +1126,7 @@ void lock_vector_lock(void) raw_spin_lock(&vector_lock); } @@ -9853,9 +10232,9 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/apic/io_apic.c linux-2.6.34.1/arch/x86 { raw_spin_unlock(&vector_lock); } -diff -urNp linux-2.6.34.1/arch/x86/kernel/apm_32.c linux-2.6.34.1/arch/x86/kernel/apm_32.c ---- linux-2.6.34.1/arch/x86/kernel/apm_32.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/kernel/apm_32.c 2010-07-07 09:04:47.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/kernel/apm_32.c linux-2.6.35.4/arch/x86/kernel/apm_32.c +--- linux-2.6.35.4/arch/x86/kernel/apm_32.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/kernel/apm_32.c 2010-09-17 20:12:09.000000000 -0400 @@ -410,7 +410,7 @@ static DEFINE_MUTEX(apm_mutex); * This is for buggy BIOS's that refer to (real mode) segment 0x40 * even though they are called in protected mode. @@ -9957,9 +10336,9 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/apm_32.c linux-2.6.34.1/arch/x86/kerne proc_create("apm", 0, NULL, &apm_file_ops); -diff -urNp linux-2.6.34.1/arch/x86/kernel/asm-offsets_32.c linux-2.6.34.1/arch/x86/kernel/asm-offsets_32.c ---- linux-2.6.34.1/arch/x86/kernel/asm-offsets_32.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/kernel/asm-offsets_32.c 2010-07-07 09:04:48.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/kernel/asm-offsets_32.c linux-2.6.35.4/arch/x86/kernel/asm-offsets_32.c +--- linux-2.6.35.4/arch/x86/kernel/asm-offsets_32.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/kernel/asm-offsets_32.c 2010-09-17 20:12:09.000000000 -0400 @@ -115,6 +115,11 @@ void foo(void) OFFSET(PV_CPU_iret, pv_cpu_ops, iret); OFFSET(PV_CPU_irq_enable_sysexit, pv_cpu_ops, irq_enable_sysexit); @@ -9972,9 +10351,9 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/asm-offsets_32.c linux-2.6.34.1/arch/x #endif #ifdef CONFIG_XEN -diff -urNp linux-2.6.34.1/arch/x86/kernel/asm-offsets_64.c linux-2.6.34.1/arch/x86/kernel/asm-offsets_64.c ---- linux-2.6.34.1/arch/x86/kernel/asm-offsets_64.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/kernel/asm-offsets_64.c 2010-07-07 09:04:48.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/kernel/asm-offsets_64.c linux-2.6.35.4/arch/x86/kernel/asm-offsets_64.c +--- linux-2.6.35.4/arch/x86/kernel/asm-offsets_64.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/kernel/asm-offsets_64.c 2010-09-17 20:12:09.000000000 -0400 @@ -63,6 +63,18 @@ int main(void) OFFSET(PV_CPU_irq_enable_sysexit, pv_cpu_ops, irq_enable_sysexit); OFFSET(PV_CPU_swapgs, pv_cpu_ops, swapgs); @@ -10002,23 +10381,9 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/asm-offsets_64.c linux-2.6.34.1/arch/x DEFINE(TSS_ist, offsetof(struct tss_struct, x86_tss.ist)); BLANK(); DEFINE(crypto_tfm_ctx_offset, offsetof(struct crypto_tfm, __crt_ctx)); -diff -urNp linux-2.6.34.1/arch/x86/kernel/cpu/Makefile linux-2.6.34.1/arch/x86/kernel/cpu/Makefile ---- linux-2.6.34.1/arch/x86/kernel/cpu/Makefile 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/kernel/cpu/Makefile 2010-07-07 09:04:48.000000000 -0400 -@@ -8,10 +8,6 @@ CFLAGS_REMOVE_common.o = -pg - CFLAGS_REMOVE_perf_event.o = -pg - endif - --# Make sure load_percpu_segment has no stackprotector --nostackp := $(call cc-option, -fno-stack-protector) --CFLAGS_common.o := $(nostackp) -- - obj-y := intel_cacheinfo.o addon_cpuid_features.o - obj-y += proc.o capflags.o powerflags.o common.o - obj-y += vmware.o hypervisor.o sched.o -diff -urNp linux-2.6.34.1/arch/x86/kernel/cpu/common.c linux-2.6.34.1/arch/x86/kernel/cpu/common.c ---- linux-2.6.34.1/arch/x86/kernel/cpu/common.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/kernel/cpu/common.c 2010-07-07 09:04:48.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/kernel/cpu/common.c linux-2.6.35.4/arch/x86/kernel/cpu/common.c +--- linux-2.6.35.4/arch/x86/kernel/cpu/common.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/kernel/cpu/common.c 2010-09-17 20:12:09.000000000 -0400 @@ -83,60 +83,6 @@ static const struct cpu_dev __cpuinitcon static const struct cpu_dev *this_cpu __cpuinitdata = &default_cpu; @@ -10100,7 +10465,7 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/cpu/common.c linux-2.6.34.1/arch/x86/k /* If the model name is still unset, do table lookup. */ if (!c->x86_model_id[0]) { const char *p; -@@ -1103,7 +1053,7 @@ void __cpuinit cpu_init(void) +@@ -1117,7 +1067,7 @@ void __cpuinit cpu_init(void) int i; cpu = stack_smp_processor_id(); @@ -10109,7 +10474,7 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/cpu/common.c linux-2.6.34.1/arch/x86/k oist = &per_cpu(orig_ist, cpu); #ifdef CONFIG_NUMA -@@ -1129,7 +1079,7 @@ void __cpuinit cpu_init(void) +@@ -1143,7 +1093,7 @@ void __cpuinit cpu_init(void) switch_to_new_gdt(cpu); loadsegment(fs, 0); @@ -10118,7 +10483,7 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/cpu/common.c linux-2.6.34.1/arch/x86/k memset(me->thread.tls_array, 0, GDT_ENTRY_TLS_ENTRIES * 8); syscall_init(); -@@ -1201,7 +1151,7 @@ void __cpuinit cpu_init(void) +@@ -1205,7 +1155,7 @@ void __cpuinit cpu_init(void) { int cpu = smp_processor_id(); struct task_struct *curr = current; @@ -10127,10 +10492,10 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/cpu/common.c linux-2.6.34.1/arch/x86/k struct thread_struct *thread = &curr->thread; if (cpumask_test_and_set_cpu(cpu, cpu_initialized_mask)) { -diff -urNp linux-2.6.34.1/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c linux-2.6.34.1/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c ---- linux-2.6.34.1/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c 2010-07-07 09:04:48.000000000 -0400 -@@ -524,7 +524,7 @@ static const struct dmi_system_id sw_any +diff -urNp linux-2.6.35.4/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c linux-2.6.35.4/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c +--- linux-2.6.35.4/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c 2010-09-17 20:12:09.000000000 -0400 +@@ -484,7 +484,7 @@ static const struct dmi_system_id sw_any DMI_MATCH(DMI_PRODUCT_NAME, "X6DLP"), }, }, @@ -10139,9 +10504,9 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c linux-2.6.3 }; static int acpi_cpufreq_blacklist(struct cpuinfo_x86 *c) -diff -urNp linux-2.6.34.1/arch/x86/kernel/cpu/cpufreq/speedstep-centrino.c linux-2.6.34.1/arch/x86/kernel/cpu/cpufreq/speedstep-centrino.c ---- linux-2.6.34.1/arch/x86/kernel/cpu/cpufreq/speedstep-centrino.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/kernel/cpu/cpufreq/speedstep-centrino.c 2010-07-07 09:04:48.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/kernel/cpu/cpufreq/speedstep-centrino.c linux-2.6.35.4/arch/x86/kernel/cpu/cpufreq/speedstep-centrino.c +--- linux-2.6.35.4/arch/x86/kernel/cpu/cpufreq/speedstep-centrino.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/kernel/cpu/cpufreq/speedstep-centrino.c 2010-09-17 20:12:09.000000000 -0400 @@ -226,7 +226,7 @@ static struct cpu_model models[] = { &cpu_ids[CPU_MP4HT_D0], NULL, 0, NULL }, { &cpu_ids[CPU_MP4HT_E0], NULL, 0, NULL }, @@ -10151,10 +10516,10 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/cpu/cpufreq/speedstep-centrino.c linux }; #undef _BANIAS #undef BANIAS -diff -urNp linux-2.6.34.1/arch/x86/kernel/cpu/intel.c linux-2.6.34.1/arch/x86/kernel/cpu/intel.c ---- linux-2.6.34.1/arch/x86/kernel/cpu/intel.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/kernel/cpu/intel.c 2010-07-07 09:04:48.000000000 -0400 -@@ -161,7 +161,7 @@ static void __cpuinit trap_init_f00f_bug +diff -urNp linux-2.6.35.4/arch/x86/kernel/cpu/intel.c linux-2.6.35.4/arch/x86/kernel/cpu/intel.c +--- linux-2.6.35.4/arch/x86/kernel/cpu/intel.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/kernel/cpu/intel.c 2010-09-17 20:12:09.000000000 -0400 +@@ -160,7 +160,7 @@ static void __cpuinit trap_init_f00f_bug * Update the IDT descriptor and reload the IDT so that * it uses the read-only mapped virtual address. */ @@ -10163,10 +10528,24 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/cpu/intel.c linux-2.6.34.1/arch/x86/ke load_idt(&idt_descr); } #endif -diff -urNp linux-2.6.34.1/arch/x86/kernel/cpu/mcheck/mce.c linux-2.6.34.1/arch/x86/kernel/cpu/mcheck/mce.c ---- linux-2.6.34.1/arch/x86/kernel/cpu/mcheck/mce.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/kernel/cpu/mcheck/mce.c 2010-07-07 09:04:48.000000000 -0400 -@@ -209,7 +209,7 @@ static void print_mce(struct mce *m) +diff -urNp linux-2.6.35.4/arch/x86/kernel/cpu/Makefile linux-2.6.35.4/arch/x86/kernel/cpu/Makefile +--- linux-2.6.35.4/arch/x86/kernel/cpu/Makefile 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/kernel/cpu/Makefile 2010-09-17 20:12:09.000000000 -0400 +@@ -8,10 +8,6 @@ CFLAGS_REMOVE_common.o = -pg + CFLAGS_REMOVE_perf_event.o = -pg + endif + +-# Make sure load_percpu_segment has no stackprotector +-nostackp := $(call cc-option, -fno-stack-protector) +-CFLAGS_common.o := $(nostackp) +- + obj-y := intel_cacheinfo.o addon_cpuid_features.o + obj-y += proc.o capflags.o powerflags.o common.o + obj-y += vmware.o hypervisor.o sched.o mshyperv.o +diff -urNp linux-2.6.35.4/arch/x86/kernel/cpu/mcheck/mce.c linux-2.6.35.4/arch/x86/kernel/cpu/mcheck/mce.c +--- linux-2.6.35.4/arch/x86/kernel/cpu/mcheck/mce.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/kernel/cpu/mcheck/mce.c 2010-09-17 20:12:09.000000000 -0400 +@@ -219,7 +219,7 @@ static void print_mce(struct mce *m) !(m->mcgstatus & MCG_STATUS_EIPV) ? " !INEXACT!" : "", m->cs, m->ip); @@ -10175,7 +10554,7 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/cpu/mcheck/mce.c linux-2.6.34.1/arch/x print_symbol("{%s}", m->ip); pr_cont("\n"); } -@@ -1452,14 +1452,14 @@ void __cpuinit mcheck_cpu_init(struct cp +@@ -1471,14 +1471,14 @@ void __cpuinit mcheck_cpu_init(struct cp */ static DEFINE_SPINLOCK(mce_state_lock); @@ -10192,7 +10571,7 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/cpu/mcheck/mce.c linux-2.6.34.1/arch/x spin_unlock(&mce_state_lock); return -EBUSY; -@@ -1467,7 +1467,7 @@ static int mce_open(struct inode *inode, +@@ -1486,7 +1486,7 @@ static int mce_open(struct inode *inode, if (file->f_flags & O_EXCL) open_exclu = 1; @@ -10201,7 +10580,7 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/cpu/mcheck/mce.c linux-2.6.34.1/arch/x spin_unlock(&mce_state_lock); -@@ -1478,7 +1478,7 @@ static int mce_release(struct inode *ino +@@ -1497,7 +1497,7 @@ static int mce_release(struct inode *ino { spin_lock(&mce_state_lock); @@ -10210,7 +10589,7 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/cpu/mcheck/mce.c linux-2.6.34.1/arch/x open_exclu = 0; spin_unlock(&mce_state_lock); -@@ -1616,6 +1616,7 @@ static struct miscdevice mce_log_device +@@ -1683,6 +1683,7 @@ static struct miscdevice mce_log_device MISC_MCELOG_MINOR, "mcelog", &mce_chrdev_ops, @@ -10218,9 +10597,9 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/cpu/mcheck/mce.c linux-2.6.34.1/arch/x }; /* -diff -urNp linux-2.6.34.1/arch/x86/kernel/cpu/mtrr/generic.c linux-2.6.34.1/arch/x86/kernel/cpu/mtrr/generic.c ---- linux-2.6.34.1/arch/x86/kernel/cpu/mtrr/generic.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/kernel/cpu/mtrr/generic.c 2010-07-07 09:04:48.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/kernel/cpu/mtrr/generic.c linux-2.6.35.4/arch/x86/kernel/cpu/mtrr/generic.c +--- linux-2.6.35.4/arch/x86/kernel/cpu/mtrr/generic.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/kernel/cpu/mtrr/generic.c 2010-09-17 20:12:09.000000000 -0400 @@ -28,7 +28,7 @@ static struct fixed_range_block fixed_ra { MSR_MTRRfix64K_00000, 1 }, /* one 64k MTRR */ { MSR_MTRRfix16K_80000, 2 }, /* two 16k MTRRs */ @@ -10230,10 +10609,10 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/cpu/mtrr/generic.c linux-2.6.34.1/arch }; static unsigned long smp_changes_mask; -diff -urNp linux-2.6.34.1/arch/x86/kernel/cpu/mtrr/main.c linux-2.6.34.1/arch/x86/kernel/cpu/mtrr/main.c ---- linux-2.6.34.1/arch/x86/kernel/cpu/mtrr/main.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/kernel/cpu/mtrr/main.c 2010-07-07 09:04:48.000000000 -0400 -@@ -60,7 +60,7 @@ static DEFINE_MUTEX(mtrr_mutex); +diff -urNp linux-2.6.35.4/arch/x86/kernel/cpu/mtrr/main.c linux-2.6.35.4/arch/x86/kernel/cpu/mtrr/main.c +--- linux-2.6.35.4/arch/x86/kernel/cpu/mtrr/main.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/kernel/cpu/mtrr/main.c 2010-09-17 20:12:09.000000000 -0400 +@@ -61,7 +61,7 @@ static DEFINE_MUTEX(mtrr_mutex); u64 size_or_mask, size_and_mask; static bool mtrr_aps_delayed_init; @@ -10242,9 +10621,9 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/cpu/mtrr/main.c linux-2.6.34.1/arch/x8 const struct mtrr_ops *mtrr_if; -diff -urNp linux-2.6.34.1/arch/x86/kernel/cpu/mtrr/mtrr.h linux-2.6.34.1/arch/x86/kernel/cpu/mtrr/mtrr.h ---- linux-2.6.34.1/arch/x86/kernel/cpu/mtrr/mtrr.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/kernel/cpu/mtrr/mtrr.h 2010-07-07 09:04:48.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/kernel/cpu/mtrr/mtrr.h linux-2.6.35.4/arch/x86/kernel/cpu/mtrr/mtrr.h +--- linux-2.6.35.4/arch/x86/kernel/cpu/mtrr/mtrr.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/kernel/cpu/mtrr/mtrr.h 2010-09-17 20:12:09.000000000 -0400 @@ -12,19 +12,19 @@ extern unsigned int mtrr_usage_table[MTRR_MAX_VAR_RANGES]; @@ -10273,21 +10652,9 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/cpu/mtrr/mtrr.h linux-2.6.34.1/arch/x8 }; extern int generic_get_free_region(unsigned long base, unsigned long size, -diff -urNp linux-2.6.34.1/arch/x86/kernel/cpu/perf_event.c linux-2.6.34.1/arch/x86/kernel/cpu/perf_event.c ---- linux-2.6.34.1/arch/x86/kernel/cpu/perf_event.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/kernel/cpu/perf_event.c 2010-07-07 09:04:48.000000000 -0400 -@@ -1702,7 +1702,7 @@ perf_callchain_user(struct pt_regs *regs - break; - - callchain_store(entry, frame.return_address); -- fp = frame.next_frame; -+ fp = (__force const void __user *)frame.next_frame; - } - } - -diff -urNp linux-2.6.34.1/arch/x86/kernel/cpu/perfctr-watchdog.c linux-2.6.34.1/arch/x86/kernel/cpu/perfctr-watchdog.c ---- linux-2.6.34.1/arch/x86/kernel/cpu/perfctr-watchdog.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/kernel/cpu/perfctr-watchdog.c 2010-07-07 09:04:48.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/kernel/cpu/perfctr-watchdog.c linux-2.6.35.4/arch/x86/kernel/cpu/perfctr-watchdog.c +--- linux-2.6.35.4/arch/x86/kernel/cpu/perfctr-watchdog.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/kernel/cpu/perfctr-watchdog.c 2010-09-17 20:12:09.000000000 -0400 @@ -30,11 +30,11 @@ struct nmi_watchdog_ctlblk { /* Interface defining a CPU specific perfctr watchdog */ @@ -10321,9 +10688,21 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/cpu/perfctr-watchdog.c linux-2.6.34.1/ static struct wd_ops intel_arch_wd_ops __read_mostly = { .reserve = single_msr_reserve, .unreserve = single_msr_unreserve, -diff -urNp linux-2.6.34.1/arch/x86/kernel/crash.c linux-2.6.34.1/arch/x86/kernel/crash.c ---- linux-2.6.34.1/arch/x86/kernel/crash.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/kernel/crash.c 2010-07-07 09:04:48.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/kernel/cpu/perf_event.c linux-2.6.35.4/arch/x86/kernel/cpu/perf_event.c +--- linux-2.6.35.4/arch/x86/kernel/cpu/perf_event.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/kernel/cpu/perf_event.c 2010-09-17 20:12:09.000000000 -0400 +@@ -1685,7 +1685,7 @@ perf_callchain_user(struct pt_regs *regs + break; + + callchain_store(entry, frame.return_address); +- fp = frame.next_frame; ++ fp = (__force const void __user *)frame.next_frame; + } + } + +diff -urNp linux-2.6.35.4/arch/x86/kernel/crash.c linux-2.6.35.4/arch/x86/kernel/crash.c +--- linux-2.6.35.4/arch/x86/kernel/crash.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/kernel/crash.c 2010-09-17 20:12:09.000000000 -0400 @@ -40,7 +40,7 @@ static void kdump_nmi_callback(int cpu, regs = args->regs; @@ -10333,9 +10712,9 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/crash.c linux-2.6.34.1/arch/x86/kernel crash_fixup_ss_esp(&fixed_regs, regs); regs = &fixed_regs; } -diff -urNp linux-2.6.34.1/arch/x86/kernel/doublefault_32.c linux-2.6.34.1/arch/x86/kernel/doublefault_32.c ---- linux-2.6.34.1/arch/x86/kernel/doublefault_32.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/kernel/doublefault_32.c 2010-07-07 09:04:48.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/kernel/doublefault_32.c linux-2.6.35.4/arch/x86/kernel/doublefault_32.c +--- linux-2.6.35.4/arch/x86/kernel/doublefault_32.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/kernel/doublefault_32.c 2010-09-17 20:12:09.000000000 -0400 @@ -11,7 +11,7 @@ #define DOUBLEFAULT_STACKSIZE (1024) @@ -10367,48 +10746,9 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/doublefault_32.c linux-2.6.34.1/arch/x .fs = __KERNEL_PERCPU, .__cr3 = __pa_nodebug(swapper_pg_dir), -diff -urNp linux-2.6.34.1/arch/x86/kernel/dumpstack.c linux-2.6.34.1/arch/x86/kernel/dumpstack.c ---- linux-2.6.34.1/arch/x86/kernel/dumpstack.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/kernel/dumpstack.c 2010-07-07 09:04:48.000000000 -0400 -@@ -207,7 +207,7 @@ void dump_stack(void) - #endif - - printk("Pid: %d, comm: %.20s %s %s %.*s\n", -- current->pid, current->comm, print_tainted(), -+ task_pid_nr(current), current->comm, print_tainted(), - init_utsname()->release, - (int)strcspn(init_utsname()->version, " "), - init_utsname()->version); -@@ -268,7 +268,7 @@ void __kprobes oops_end(unsigned long fl - panic("Fatal exception in interrupt"); - if (panic_on_oops) - panic("Fatal exception"); -- do_exit(signr); -+ do_group_exit(signr); - } - - int __kprobes __die(const char *str, struct pt_regs *regs, long err) -@@ -295,7 +295,7 @@ int __kprobes __die(const char *str, str - - show_registers(regs); - #ifdef CONFIG_X86_32 -- if (user_mode_vm(regs)) { -+ if (user_mode(regs)) { - sp = regs->sp; - ss = regs->ss & 0xffff; - } else { -@@ -323,7 +323,7 @@ void die(const char *str, struct pt_regs - unsigned long flags = oops_begin(); - int sig = SIGSEGV; - -- if (!user_mode_vm(regs)) -+ if (!user_mode(regs)) - report_bug(regs->ip, regs); - - if (__die(str, regs, err)) -diff -urNp linux-2.6.34.1/arch/x86/kernel/dumpstack_32.c linux-2.6.34.1/arch/x86/kernel/dumpstack_32.c ---- linux-2.6.34.1/arch/x86/kernel/dumpstack_32.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/kernel/dumpstack_32.c 2010-07-07 09:04:48.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/kernel/dumpstack_32.c linux-2.6.35.4/arch/x86/kernel/dumpstack_32.c +--- linux-2.6.35.4/arch/x86/kernel/dumpstack_32.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/kernel/dumpstack_32.c 2010-09-17 20:12:09.000000000 -0400 @@ -107,11 +107,12 @@ void show_registers(struct pt_regs *regs * When in-kernel, we also print out the stack and code at the * time of the fault.. @@ -10453,9 +10793,48 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/dumpstack_32.c linux-2.6.34.1/arch/x86 if (ip < PAGE_OFFSET) return 0; if (probe_kernel_address((unsigned short *)ip, ud2)) -diff -urNp linux-2.6.34.1/arch/x86/kernel/efi_32.c linux-2.6.34.1/arch/x86/kernel/efi_32.c ---- linux-2.6.34.1/arch/x86/kernel/efi_32.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/kernel/efi_32.c 2010-07-07 09:04:48.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/kernel/dumpstack.c linux-2.6.35.4/arch/x86/kernel/dumpstack.c +--- linux-2.6.35.4/arch/x86/kernel/dumpstack.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/kernel/dumpstack.c 2010-09-17 20:12:09.000000000 -0400 +@@ -207,7 +207,7 @@ void dump_stack(void) + #endif + + printk("Pid: %d, comm: %.20s %s %s %.*s\n", +- current->pid, current->comm, print_tainted(), ++ task_pid_nr(current), current->comm, print_tainted(), + init_utsname()->release, + (int)strcspn(init_utsname()->version, " "), + init_utsname()->version); +@@ -263,7 +263,7 @@ void __kprobes oops_end(unsigned long fl + panic("Fatal exception in interrupt"); + if (panic_on_oops) + panic("Fatal exception"); +- do_exit(signr); ++ do_group_exit(signr); + } + + int __kprobes __die(const char *str, struct pt_regs *regs, long err) +@@ -290,7 +290,7 @@ int __kprobes __die(const char *str, str + + show_registers(regs); + #ifdef CONFIG_X86_32 +- if (user_mode_vm(regs)) { ++ if (user_mode(regs)) { + sp = regs->sp; + ss = regs->ss & 0xffff; + } else { +@@ -318,7 +318,7 @@ void die(const char *str, struct pt_regs + unsigned long flags = oops_begin(); + int sig = SIGSEGV; + +- if (!user_mode_vm(regs)) ++ if (!user_mode(regs)) + report_bug(regs->ip, regs); + + if (__die(str, regs, err)) +diff -urNp linux-2.6.35.4/arch/x86/kernel/efi_32.c linux-2.6.35.4/arch/x86/kernel/efi_32.c +--- linux-2.6.35.4/arch/x86/kernel/efi_32.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/kernel/efi_32.c 2010-09-17 20:12:09.000000000 -0400 @@ -38,70 +38,38 @@ */ @@ -10536,9 +10915,9 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/efi_32.c linux-2.6.34.1/arch/x86/kerne /* * After the lock is released, the original page table is restored. -diff -urNp linux-2.6.34.1/arch/x86/kernel/efi_stub_32.S linux-2.6.34.1/arch/x86/kernel/efi_stub_32.S ---- linux-2.6.34.1/arch/x86/kernel/efi_stub_32.S 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/kernel/efi_stub_32.S 2010-07-07 09:04:48.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/kernel/efi_stub_32.S linux-2.6.35.4/arch/x86/kernel/efi_stub_32.S +--- linux-2.6.35.4/arch/x86/kernel/efi_stub_32.S 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/kernel/efi_stub_32.S 2010-09-17 20:12:09.000000000 -0400 @@ -6,6 +6,7 @@ */ @@ -10637,10 +11016,10 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/efi_stub_32.S linux-2.6.34.1/arch/x86/ saved_return_addr: .long 0 efi_rt_function_ptr: -diff -urNp linux-2.6.34.1/arch/x86/kernel/entry_32.S linux-2.6.34.1/arch/x86/kernel/entry_32.S ---- linux-2.6.34.1/arch/x86/kernel/entry_32.S 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/kernel/entry_32.S 2010-07-07 09:04:48.000000000 -0400 -@@ -191,7 +191,67 @@ +diff -urNp linux-2.6.35.4/arch/x86/kernel/entry_32.S linux-2.6.35.4/arch/x86/kernel/entry_32.S +--- linux-2.6.35.4/arch/x86/kernel/entry_32.S 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/kernel/entry_32.S 2010-09-17 20:12:09.000000000 -0400 +@@ -192,7 +192,67 @@ #endif /* CONFIG_X86_32_LAZY_GS */ @@ -10709,7 +11088,7 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/entry_32.S linux-2.6.34.1/arch/x86/ker cld PUSH_GS pushl %fs -@@ -224,7 +284,7 @@ +@@ -225,7 +285,7 @@ pushl %ebx CFI_ADJUST_CFA_OFFSET 4 CFI_REL_OFFSET ebx, 0 @@ -10718,7 +11097,7 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/entry_32.S linux-2.6.34.1/arch/x86/ker movl %edx, %ds movl %edx, %es movl $(__KERNEL_PERCPU), %edx -@@ -232,6 +292,15 @@ +@@ -233,6 +293,15 @@ SET_KERNEL_GS %edx .endm @@ -10734,7 +11113,7 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/entry_32.S linux-2.6.34.1/arch/x86/ker .macro RESTORE_INT_REGS popl %ebx CFI_ADJUST_CFA_OFFSET -4 -@@ -356,7 +425,15 @@ check_userspace: +@@ -357,7 +426,15 @@ check_userspace: movb PT_CS(%esp), %al andl $(X86_EFLAGS_VM | SEGMENT_RPL_MASK), %eax cmpl $USER_RPL, %eax @@ -10750,7 +11129,7 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/entry_32.S linux-2.6.34.1/arch/x86/ker ENTRY(resume_userspace) LOCKDEP_SYS_EXIT -@@ -422,10 +499,9 @@ sysenter_past_esp: +@@ -423,10 +500,9 @@ sysenter_past_esp: /*CFI_REL_OFFSET cs, 0*/ /* * Push current_thread_info()->sysenter_return to the stack. @@ -10763,7 +11142,7 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/entry_32.S linux-2.6.34.1/arch/x86/ker CFI_ADJUST_CFA_OFFSET 4 CFI_REL_OFFSET eip, 0 -@@ -438,9 +514,19 @@ sysenter_past_esp: +@@ -439,9 +515,19 @@ sysenter_past_esp: * Load the potential sixth argument from user stack. * Careful about security. */ @@ -10783,7 +11162,7 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/entry_32.S linux-2.6.34.1/arch/x86/ker movl %ebp,PT_EBP(%esp) .section __ex_table,"a" .align 4 -@@ -463,12 +549,23 @@ sysenter_do_call: +@@ -464,12 +550,23 @@ sysenter_do_call: testl $_TIF_ALLWORK_MASK, %ecx jne sysexit_audit sysenter_exit: @@ -10807,7 +11186,7 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/entry_32.S linux-2.6.34.1/arch/x86/ker PTGS_TO_GS ENABLE_INTERRUPTS_SYSEXIT -@@ -512,11 +609,17 @@ sysexit_audit: +@@ -513,11 +610,17 @@ sysexit_audit: CFI_ENDPROC .pushsection .fixup,"ax" @@ -10827,7 +11206,7 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/entry_32.S linux-2.6.34.1/arch/x86/ker .popsection PTGS_TO_GS_EX ENDPROC(ia32_sysenter_target) -@@ -550,6 +653,10 @@ syscall_exit: +@@ -551,6 +654,10 @@ syscall_exit: testl $_TIF_ALLWORK_MASK, %ecx # current->work jne syscall_exit_work @@ -10838,7 +11217,7 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/entry_32.S linux-2.6.34.1/arch/x86/ker restore_all: TRACE_IRQS_IRET restore_all_notrace: -@@ -614,7 +721,13 @@ ldt_ss: +@@ -615,7 +722,13 @@ ldt_ss: mov PT_OLDESP(%esp), %eax /* load userspace esp */ mov %dx, %ax /* eax: new kernel esp */ sub %eax, %edx /* offset (low word is 0) */ @@ -10853,7 +11232,7 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/entry_32.S linux-2.6.34.1/arch/x86/ker shr $16, %edx mov %dl, GDT_ENTRY_ESPFIX_SS * 8 + 4(%ebx) /* bits 16..23 */ mov %dh, GDT_ENTRY_ESPFIX_SS * 8 + 7(%ebx) /* bits 24..31 */ -@@ -654,25 +767,19 @@ work_resched: +@@ -655,25 +768,19 @@ work_resched: work_notifysig: # deal with pending signals and # notify-resume requests @@ -10882,7 +11261,7 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/entry_32.S linux-2.6.34.1/arch/x86/ker #endif xorl %edx, %edx call do_notify_resume -@@ -707,6 +814,10 @@ END(syscall_exit_work) +@@ -708,6 +815,10 @@ END(syscall_exit_work) RING0_INT_FRAME # can't unwind into user space anyway syscall_fault: @@ -10893,7 +11272,7 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/entry_32.S linux-2.6.34.1/arch/x86/ker GET_THREAD_INFO(%ebp) movl $-EFAULT,PT_EAX(%esp) jmp resume_userspace -@@ -790,7 +901,13 @@ ptregs_clone: +@@ -791,7 +902,13 @@ ptregs_clone: * normal stack and adjusts ESP with the matching offset. */ /* fixup the stack */ @@ -10908,7 +11287,7 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/entry_32.S linux-2.6.34.1/arch/x86/ker mov GDT_ENTRY_ESPFIX_SS * 8 + 4(%ebx), %al /* bits 16..23 */ mov GDT_ENTRY_ESPFIX_SS * 8 + 7(%ebx), %ah /* bits 24..31 */ shl $16, %eax -@@ -1254,7 +1371,6 @@ return_to_handler: +@@ -1273,7 +1390,6 @@ return_to_handler: jmp *%ecx #endif @@ -10916,7 +11295,7 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/entry_32.S linux-2.6.34.1/arch/x86/ker #include "syscall_table_32.S" syscall_table_size=(.-sys_call_table) -@@ -1311,9 +1427,12 @@ error_code: +@@ -1330,9 +1446,12 @@ error_code: movl $-1, PT_ORIG_EAX(%esp) # no syscall to restart REG_TO_PTGS %ecx SET_KERNEL_GS %ecx @@ -10930,7 +11309,7 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/entry_32.S linux-2.6.34.1/arch/x86/ker TRACE_IRQS_OFF movl %esp,%eax # pt_regs pointer call *%edi -@@ -1407,6 +1526,9 @@ nmi_stack_correct: +@@ -1426,6 +1545,9 @@ nmi_stack_correct: xorl %edx,%edx # zero error code movl %esp,%eax # pt_regs pointer call do_nmi @@ -10940,7 +11319,7 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/entry_32.S linux-2.6.34.1/arch/x86/ker jmp restore_all_notrace CFI_ENDPROC -@@ -1447,6 +1569,9 @@ nmi_espfix_stack: +@@ -1466,6 +1588,9 @@ nmi_espfix_stack: FIXUP_ESPFIX_STACK # %eax == %esp xorl %edx,%edx # zero error code call do_nmi @@ -10950,9 +11329,9 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/entry_32.S linux-2.6.34.1/arch/x86/ker RESTORE_REGS lss 12+4(%esp), %esp # back to espfix stack CFI_ADJUST_CFA_OFFSET -24 -diff -urNp linux-2.6.34.1/arch/x86/kernel/entry_64.S linux-2.6.34.1/arch/x86/kernel/entry_64.S ---- linux-2.6.34.1/arch/x86/kernel/entry_64.S 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/kernel/entry_64.S 2010-07-07 09:04:48.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/kernel/entry_64.S linux-2.6.35.4/arch/x86/kernel/entry_64.S +--- linux-2.6.35.4/arch/x86/kernel/entry_64.S 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/kernel/entry_64.S 2010-09-17 20:12:09.000000000 -0400 @@ -53,6 +53,7 @@ #include #include @@ -11410,9 +11789,9 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/entry_64.S linux-2.6.34.1/arch/x86/ker RESTORE_ALL 8 jmp irq_return nmi_userspace: -diff -urNp linux-2.6.34.1/arch/x86/kernel/ftrace.c linux-2.6.34.1/arch/x86/kernel/ftrace.c ---- linux-2.6.34.1/arch/x86/kernel/ftrace.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/kernel/ftrace.c 2010-07-07 09:04:48.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/kernel/ftrace.c linux-2.6.35.4/arch/x86/kernel/ftrace.c +--- linux-2.6.35.4/arch/x86/kernel/ftrace.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/kernel/ftrace.c 2010-09-17 20:12:09.000000000 -0400 @@ -174,7 +174,9 @@ void ftrace_nmi_enter(void) if (atomic_inc_return(&nmi_running) & MOD_CODE_WRITE_FLAG) { @@ -11478,9 +11857,9 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/ftrace.c linux-2.6.34.1/arch/x86/kerne if (probe_kernel_read(code, (void *)ip, MCOUNT_INSN_SIZE)) return -EFAULT; -diff -urNp linux-2.6.34.1/arch/x86/kernel/head32.c linux-2.6.34.1/arch/x86/kernel/head32.c ---- linux-2.6.34.1/arch/x86/kernel/head32.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/kernel/head32.c 2010-07-07 09:04:48.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/kernel/head32.c linux-2.6.35.4/arch/x86/kernel/head32.c +--- linux-2.6.35.4/arch/x86/kernel/head32.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/kernel/head32.c 2010-09-17 20:12:09.000000000 -0400 @@ -17,6 +17,7 @@ #include #include @@ -11498,9 +11877,9 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/head32.c linux-2.6.34.1/arch/x86/kerne #ifdef CONFIG_BLK_DEV_INITRD /* Reserve INITRD */ -diff -urNp linux-2.6.34.1/arch/x86/kernel/head_32.S linux-2.6.34.1/arch/x86/kernel/head_32.S ---- linux-2.6.34.1/arch/x86/kernel/head_32.S 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/kernel/head_32.S 2010-07-07 09:04:48.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/kernel/head_32.S linux-2.6.35.4/arch/x86/kernel/head_32.S +--- linux-2.6.35.4/arch/x86/kernel/head_32.S 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/kernel/head_32.S 2010-09-17 20:12:09.000000000 -0400 @@ -25,6 +25,12 @@ /* Physical address */ #define pa(X) ((X) - __PAGE_OFFSET) @@ -11933,9 +12312,9 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/head_32.S linux-2.6.34.1/arch/x86/kern + /* Be sure this is zeroed to avoid false validations in Xen */ + .fill PAGE_SIZE_asm - GDT_SIZE,1,0 + .endr -diff -urNp linux-2.6.34.1/arch/x86/kernel/head_64.S linux-2.6.34.1/arch/x86/kernel/head_64.S ---- linux-2.6.34.1/arch/x86/kernel/head_64.S 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/kernel/head_64.S 2010-07-07 09:04:48.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/kernel/head_64.S linux-2.6.35.4/arch/x86/kernel/head_64.S +--- linux-2.6.35.4/arch/x86/kernel/head_64.S 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/kernel/head_64.S 2010-09-17 20:12:09.000000000 -0400 @@ -19,6 +19,7 @@ #include #include @@ -12197,9 +12576,9 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/head_64.S linux-2.6.34.1/arch/x86/kern __PAGE_ALIGNED_BSS .align PAGE_SIZE -diff -urNp linux-2.6.34.1/arch/x86/kernel/i386_ksyms_32.c linux-2.6.34.1/arch/x86/kernel/i386_ksyms_32.c ---- linux-2.6.34.1/arch/x86/kernel/i386_ksyms_32.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/kernel/i386_ksyms_32.c 2010-07-07 09:04:48.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/kernel/i386_ksyms_32.c linux-2.6.35.4/arch/x86/kernel/i386_ksyms_32.c +--- linux-2.6.35.4/arch/x86/kernel/i386_ksyms_32.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/kernel/i386_ksyms_32.c 2010-09-17 20:12:09.000000000 -0400 @@ -20,8 +20,12 @@ extern void cmpxchg8b_emu(void); EXPORT_SYMBOL(cmpxchg8b_emu); #endif @@ -12221,9 +12600,9 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/i386_ksyms_32.c linux-2.6.34.1/arch/x8 +#ifdef CONFIG_PAX_KERNEXEC +EXPORT_SYMBOL(__LOAD_PHYSICAL_ADDR); +#endif -diff -urNp linux-2.6.34.1/arch/x86/kernel/init_task.c linux-2.6.34.1/arch/x86/kernel/init_task.c ---- linux-2.6.34.1/arch/x86/kernel/init_task.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/kernel/init_task.c 2010-07-07 09:04:48.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/kernel/init_task.c linux-2.6.35.4/arch/x86/kernel/init_task.c +--- linux-2.6.35.4/arch/x86/kernel/init_task.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/kernel/init_task.c 2010-09-17 20:12:09.000000000 -0400 @@ -38,5 +38,5 @@ EXPORT_SYMBOL(init_task); * section. Since TSS's are completely CPU-local, we want them * on exact cacheline boundaries, to eliminate cacheline ping-pong. @@ -12232,9 +12611,9 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/init_task.c linux-2.6.34.1/arch/x86/ke - +struct tss_struct init_tss[NR_CPUS] ____cacheline_internodealigned_in_smp = { [0 ... NR_CPUS-1] = INIT_TSS }; +EXPORT_SYMBOL(init_tss); -diff -urNp linux-2.6.34.1/arch/x86/kernel/ioport.c linux-2.6.34.1/arch/x86/kernel/ioport.c ---- linux-2.6.34.1/arch/x86/kernel/ioport.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/kernel/ioport.c 2010-07-07 09:04:48.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/kernel/ioport.c linux-2.6.35.4/arch/x86/kernel/ioport.c +--- linux-2.6.35.4/arch/x86/kernel/ioport.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/kernel/ioport.c 2010-09-17 20:12:37.000000000 -0400 @@ -6,6 +6,7 @@ #include #include @@ -12278,9 +12657,9 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/ioport.c linux-2.6.34.1/arch/x86/kerne if (!capable(CAP_SYS_RAWIO)) return -EPERM; } -diff -urNp linux-2.6.34.1/arch/x86/kernel/irq_32.c linux-2.6.34.1/arch/x86/kernel/irq_32.c ---- linux-2.6.34.1/arch/x86/kernel/irq_32.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/kernel/irq_32.c 2010-07-07 09:04:48.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/kernel/irq_32.c linux-2.6.35.4/arch/x86/kernel/irq_32.c +--- linux-2.6.35.4/arch/x86/kernel/irq_32.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/kernel/irq_32.c 2010-09-17 20:12:09.000000000 -0400 @@ -94,7 +94,7 @@ execute_on_irq_stack(int overflow, struc return 0; @@ -12299,10 +12678,10 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/irq_32.c linux-2.6.34.1/arch/x86/kerne call_on_stack(__do_softirq, isp); /* -diff -urNp linux-2.6.34.1/arch/x86/kernel/kgdb.c linux-2.6.34.1/arch/x86/kernel/kgdb.c ---- linux-2.6.34.1/arch/x86/kernel/kgdb.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/kernel/kgdb.c 2010-07-07 09:04:48.000000000 -0400 -@@ -89,7 +89,7 @@ void pt_regs_to_gdb_regs(unsigned long * +diff -urNp linux-2.6.35.4/arch/x86/kernel/kgdb.c linux-2.6.35.4/arch/x86/kernel/kgdb.c +--- linux-2.6.35.4/arch/x86/kernel/kgdb.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/kernel/kgdb.c 2010-09-17 20:12:09.000000000 -0400 +@@ -77,7 +77,7 @@ void pt_regs_to_gdb_regs(unsigned long * gdb_regs[GDB_CS] = regs->cs; gdb_regs[GDB_FS] = 0xFFFF; gdb_regs[GDB_GS] = 0xFFFF; @@ -12311,8 +12690,8 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/kgdb.c linux-2.6.34.1/arch/x86/kernel/ gdb_regs[GDB_SS] = regs->ss; gdb_regs[GDB_SP] = regs->sp; } else { -@@ -690,7 +690,7 @@ unsigned long kgdb_arch_pc(int exception - return instruction_pointer(regs); +@@ -720,7 +720,7 @@ void kgdb_arch_set_pc(struct pt_regs *re + regs->ip = ip; } -struct kgdb_arch arch_kgdb_ops = { @@ -12320,9 +12699,9 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/kgdb.c linux-2.6.34.1/arch/x86/kernel/ /* Breakpoint instruction: */ .gdb_bpt_instr = { 0xcc }, .flags = KGDB_HW_BREAKPOINT, -diff -urNp linux-2.6.34.1/arch/x86/kernel/kprobes.c linux-2.6.34.1/arch/x86/kernel/kprobes.c ---- linux-2.6.34.1/arch/x86/kernel/kprobes.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/kernel/kprobes.c 2010-07-07 09:04:48.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/kernel/kprobes.c linux-2.6.35.4/arch/x86/kernel/kprobes.c +--- linux-2.6.35.4/arch/x86/kernel/kprobes.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/kernel/kprobes.c 2010-09-17 20:12:09.000000000 -0400 @@ -114,9 +114,12 @@ static void __kprobes __synthesize_relat s32 raddr; } __attribute__((packed)) *insn; @@ -12372,7 +12751,7 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/kprobes.c linux-2.6.34.1/arch/x86/kern } int __kprobes arch_prepare_kprobe(struct kprobe *p) -@@ -467,7 +474,7 @@ static void __kprobes setup_singlestep(s +@@ -475,7 +482,7 @@ static void __kprobes setup_singlestep(s * nor set current_kprobe, because it doesn't use single * stepping. */ @@ -12381,7 +12760,7 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/kprobes.c linux-2.6.34.1/arch/x86/kern preempt_enable_no_resched(); return; } -@@ -486,7 +493,7 @@ static void __kprobes setup_singlestep(s +@@ -494,7 +501,7 @@ static void __kprobes setup_singlestep(s if (p->opcode == BREAKPOINT_INSTRUCTION) regs->ip = (unsigned long)p->addr; else @@ -12390,7 +12769,7 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/kprobes.c linux-2.6.34.1/arch/x86/kern } /* -@@ -565,7 +572,7 @@ static int __kprobes kprobe_handler(stru +@@ -573,7 +580,7 @@ static int __kprobes kprobe_handler(stru setup_singlestep(p, regs, kcb, 0); return 1; } @@ -12399,7 +12778,7 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/kprobes.c linux-2.6.34.1/arch/x86/kern /* * The breakpoint instruction was removed right * after we hit it. Another cpu has removed -@@ -791,7 +798,7 @@ static void __kprobes resume_execution(s +@@ -799,7 +806,7 @@ static void __kprobes resume_execution(s struct pt_regs *regs, struct kprobe_ctlblk *kcb) { unsigned long *tos = stack_addr(regs); @@ -12408,7 +12787,7 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/kprobes.c linux-2.6.34.1/arch/x86/kern unsigned long orig_ip = (unsigned long)p->addr; kprobe_opcode_t *insn = p->ainsn.insn; -@@ -974,7 +981,7 @@ int __kprobes kprobe_exceptions_notify(s +@@ -982,7 +989,7 @@ int __kprobes kprobe_exceptions_notify(s struct die_args *args = data; int ret = NOTIFY_DONE; @@ -12417,9 +12796,9 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/kprobes.c linux-2.6.34.1/arch/x86/kern return ret; switch (val) { -diff -urNp linux-2.6.34.1/arch/x86/kernel/ldt.c linux-2.6.34.1/arch/x86/kernel/ldt.c ---- linux-2.6.34.1/arch/x86/kernel/ldt.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/kernel/ldt.c 2010-07-07 09:04:48.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/kernel/ldt.c linux-2.6.35.4/arch/x86/kernel/ldt.c +--- linux-2.6.35.4/arch/x86/kernel/ldt.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/kernel/ldt.c 2010-09-17 20:12:09.000000000 -0400 @@ -67,13 +67,13 @@ static int alloc_ldt(mm_context_t *pc, i if (reload) { #ifdef CONFIG_SMP @@ -12484,9 +12863,9 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/ldt.c linux-2.6.34.1/arch/x86/kernel/l fill_ldt(&ldt, &ldt_info); if (oldmode) ldt.avl = 0; -diff -urNp linux-2.6.34.1/arch/x86/kernel/machine_kexec_32.c linux-2.6.34.1/arch/x86/kernel/machine_kexec_32.c ---- linux-2.6.34.1/arch/x86/kernel/machine_kexec_32.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/kernel/machine_kexec_32.c 2010-07-07 09:04:48.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/kernel/machine_kexec_32.c linux-2.6.35.4/arch/x86/kernel/machine_kexec_32.c +--- linux-2.6.35.4/arch/x86/kernel/machine_kexec_32.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/kernel/machine_kexec_32.c 2010-09-17 20:12:09.000000000 -0400 @@ -27,7 +27,7 @@ #include #include @@ -12514,9 +12893,9 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/machine_kexec_32.c linux-2.6.34.1/arch relocate_kernel_ptr = control_page; page_list[PA_CONTROL_PAGE] = __pa(control_page); -diff -urNp linux-2.6.34.1/arch/x86/kernel/microcode_amd.c linux-2.6.34.1/arch/x86/kernel/microcode_amd.c ---- linux-2.6.34.1/arch/x86/kernel/microcode_amd.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/kernel/microcode_amd.c 2010-07-07 09:04:48.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/kernel/microcode_amd.c linux-2.6.35.4/arch/x86/kernel/microcode_amd.c +--- linux-2.6.35.4/arch/x86/kernel/microcode_amd.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/kernel/microcode_amd.c 2010-09-17 20:12:09.000000000 -0400 @@ -331,7 +331,7 @@ static void microcode_fini_cpu_amd(int c uci->mc = NULL; } @@ -12535,9 +12914,9 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/microcode_amd.c linux-2.6.34.1/arch/x8 { return µcode_amd_ops; } -diff -urNp linux-2.6.34.1/arch/x86/kernel/microcode_core.c linux-2.6.34.1/arch/x86/kernel/microcode_core.c ---- linux-2.6.34.1/arch/x86/kernel/microcode_core.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/kernel/microcode_core.c 2010-07-07 09:04:48.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/kernel/microcode_core.c linux-2.6.35.4/arch/x86/kernel/microcode_core.c +--- linux-2.6.35.4/arch/x86/kernel/microcode_core.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/kernel/microcode_core.c 2010-09-17 20:12:09.000000000 -0400 @@ -92,7 +92,7 @@ MODULE_LICENSE("GPL"); #define MICROCODE_VERSION "2.00" @@ -12547,10 +12926,10 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/microcode_core.c linux-2.6.34.1/arch/x /* * Synchronization. -diff -urNp linux-2.6.34.1/arch/x86/kernel/microcode_intel.c linux-2.6.34.1/arch/x86/kernel/microcode_intel.c ---- linux-2.6.34.1/arch/x86/kernel/microcode_intel.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/kernel/microcode_intel.c 2010-07-07 09:04:48.000000000 -0400 -@@ -436,13 +436,13 @@ static enum ucode_state request_microcod +diff -urNp linux-2.6.35.4/arch/x86/kernel/microcode_intel.c linux-2.6.35.4/arch/x86/kernel/microcode_intel.c +--- linux-2.6.35.4/arch/x86/kernel/microcode_intel.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/kernel/microcode_intel.c 2010-09-17 20:12:09.000000000 -0400 +@@ -446,13 +446,13 @@ static enum ucode_state request_microcod static int get_ucode_user(void *to, const void *from, size_t n) { @@ -12566,7 +12945,7 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/microcode_intel.c linux-2.6.34.1/arch/ } static void microcode_fini_cpu(int cpu) -@@ -453,7 +453,7 @@ static void microcode_fini_cpu(int cpu) +@@ -463,7 +463,7 @@ static void microcode_fini_cpu(int cpu) uci->mc = NULL; } @@ -12575,7 +12954,7 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/microcode_intel.c linux-2.6.34.1/arch/ .request_microcode_user = request_microcode_user, .request_microcode_fw = request_microcode_fw, .collect_cpu_info = collect_cpu_info, -@@ -461,7 +461,7 @@ static struct microcode_ops microcode_in +@@ -471,7 +471,7 @@ static struct microcode_ops microcode_in .microcode_fini_cpu = microcode_fini_cpu, }; @@ -12584,9 +12963,9 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/microcode_intel.c linux-2.6.34.1/arch/ { return µcode_intel_ops; } -diff -urNp linux-2.6.34.1/arch/x86/kernel/module.c linux-2.6.34.1/arch/x86/kernel/module.c ---- linux-2.6.34.1/arch/x86/kernel/module.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/kernel/module.c 2010-07-07 09:04:48.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/kernel/module.c linux-2.6.35.4/arch/x86/kernel/module.c +--- linux-2.6.35.4/arch/x86/kernel/module.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/kernel/module.c 2010-09-17 20:12:09.000000000 -0400 @@ -35,7 +35,7 @@ #define DEBUGP(fmt...) #endif @@ -12727,21 +13106,9 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/module.c linux-2.6.34.1/arch/x86/kerne #if 0 if ((s64)val != *(s32 *)loc) goto overflow; -diff -urNp linux-2.6.34.1/arch/x86/kernel/paravirt-spinlocks.c linux-2.6.34.1/arch/x86/kernel/paravirt-spinlocks.c ---- linux-2.6.34.1/arch/x86/kernel/paravirt-spinlocks.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/kernel/paravirt-spinlocks.c 2010-07-07 09:04:48.000000000 -0400 -@@ -13,7 +13,7 @@ default_spin_lock_flags(arch_spinlock_t - arch_spin_lock(lock); - } - --struct pv_lock_ops pv_lock_ops = { -+struct pv_lock_ops pv_lock_ops __read_only = { - #ifdef CONFIG_SMP - .spin_is_locked = __ticket_spin_is_locked, - .spin_is_contended = __ticket_spin_is_contended, -diff -urNp linux-2.6.34.1/arch/x86/kernel/paravirt.c linux-2.6.34.1/arch/x86/kernel/paravirt.c ---- linux-2.6.34.1/arch/x86/kernel/paravirt.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/kernel/paravirt.c 2010-07-07 09:04:48.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/kernel/paravirt.c linux-2.6.35.4/arch/x86/kernel/paravirt.c +--- linux-2.6.35.4/arch/x86/kernel/paravirt.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/kernel/paravirt.c 2010-09-17 20:12:09.000000000 -0400 @@ -122,7 +122,7 @@ unsigned paravirt_patch_jmp(void *insnbu * corresponding structure. */ static void *get_call_destination(u8 type) @@ -12845,10 +13212,22 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/paravirt.c linux-2.6.34.1/arch/x86/ker }; EXPORT_SYMBOL_GPL(pv_time_ops); -diff -urNp linux-2.6.34.1/arch/x86/kernel/pci-calgary_64.c linux-2.6.34.1/arch/x86/kernel/pci-calgary_64.c ---- linux-2.6.34.1/arch/x86/kernel/pci-calgary_64.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/kernel/pci-calgary_64.c 2010-07-07 09:04:48.000000000 -0400 -@@ -470,7 +470,7 @@ static void calgary_free_coherent(struct +diff -urNp linux-2.6.35.4/arch/x86/kernel/paravirt-spinlocks.c linux-2.6.35.4/arch/x86/kernel/paravirt-spinlocks.c +--- linux-2.6.35.4/arch/x86/kernel/paravirt-spinlocks.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/kernel/paravirt-spinlocks.c 2010-09-17 20:12:09.000000000 -0400 +@@ -13,7 +13,7 @@ default_spin_lock_flags(arch_spinlock_t + arch_spin_lock(lock); + } + +-struct pv_lock_ops pv_lock_ops = { ++struct pv_lock_ops pv_lock_ops __read_only = { + #ifdef CONFIG_SMP + .spin_is_locked = __ticket_spin_is_locked, + .spin_is_contended = __ticket_spin_is_contended, +diff -urNp linux-2.6.35.4/arch/x86/kernel/pci-calgary_64.c linux-2.6.35.4/arch/x86/kernel/pci-calgary_64.c +--- linux-2.6.35.4/arch/x86/kernel/pci-calgary_64.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/kernel/pci-calgary_64.c 2010-09-17 20:12:09.000000000 -0400 +@@ -475,7 +475,7 @@ static void calgary_free_coherent(struct free_pages((unsigned long)vaddr, get_order(size)); } @@ -12857,9 +13236,9 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/pci-calgary_64.c linux-2.6.34.1/arch/x .alloc_coherent = calgary_alloc_coherent, .free_coherent = calgary_free_coherent, .map_sg = calgary_map_sg, -diff -urNp linux-2.6.34.1/arch/x86/kernel/pci-dma.c linux-2.6.34.1/arch/x86/kernel/pci-dma.c ---- linux-2.6.34.1/arch/x86/kernel/pci-dma.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/kernel/pci-dma.c 2010-07-07 09:04:48.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/kernel/pci-dma.c linux-2.6.35.4/arch/x86/kernel/pci-dma.c +--- linux-2.6.35.4/arch/x86/kernel/pci-dma.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/kernel/pci-dma.c 2010-09-17 20:12:09.000000000 -0400 @@ -16,7 +16,7 @@ static int forbid_dac __read_mostly; @@ -12878,9 +13257,9 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/pci-dma.c linux-2.6.34.1/arch/x86/kern #ifdef CONFIG_PCI if (mask > 0xffffffff && forbid_dac > 0) { -diff -urNp linux-2.6.34.1/arch/x86/kernel/pci-gart_64.c linux-2.6.34.1/arch/x86/kernel/pci-gart_64.c ---- linux-2.6.34.1/arch/x86/kernel/pci-gart_64.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/kernel/pci-gart_64.c 2010-07-07 09:04:48.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/kernel/pci-gart_64.c linux-2.6.35.4/arch/x86/kernel/pci-gart_64.c +--- linux-2.6.35.4/arch/x86/kernel/pci-gart_64.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/kernel/pci-gart_64.c 2010-09-17 20:12:09.000000000 -0400 @@ -699,7 +699,7 @@ static __init int init_k8_gatt(struct ag return -1; } @@ -12890,9 +13269,9 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/pci-gart_64.c linux-2.6.34.1/arch/x86/ .map_sg = gart_map_sg, .unmap_sg = gart_unmap_sg, .map_page = gart_map_page, -diff -urNp linux-2.6.34.1/arch/x86/kernel/pci-nommu.c linux-2.6.34.1/arch/x86/kernel/pci-nommu.c ---- linux-2.6.34.1/arch/x86/kernel/pci-nommu.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/kernel/pci-nommu.c 2010-07-07 09:04:48.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/kernel/pci-nommu.c linux-2.6.35.4/arch/x86/kernel/pci-nommu.c +--- linux-2.6.35.4/arch/x86/kernel/pci-nommu.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/kernel/pci-nommu.c 2010-09-17 20:12:09.000000000 -0400 @@ -95,7 +95,7 @@ static void nommu_sync_sg_for_device(str flush_write_buffers(); } @@ -12902,9 +13281,9 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/pci-nommu.c linux-2.6.34.1/arch/x86/ke .alloc_coherent = dma_generic_alloc_coherent, .free_coherent = nommu_free_coherent, .map_sg = nommu_map_sg, -diff -urNp linux-2.6.34.1/arch/x86/kernel/pci-swiotlb.c linux-2.6.34.1/arch/x86/kernel/pci-swiotlb.c ---- linux-2.6.34.1/arch/x86/kernel/pci-swiotlb.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/kernel/pci-swiotlb.c 2010-07-07 09:04:48.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/kernel/pci-swiotlb.c linux-2.6.35.4/arch/x86/kernel/pci-swiotlb.c +--- linux-2.6.35.4/arch/x86/kernel/pci-swiotlb.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/kernel/pci-swiotlb.c 2010-09-17 20:12:09.000000000 -0400 @@ -25,7 +25,7 @@ static void *x86_swiotlb_alloc_coherent( return swiotlb_alloc_coherent(hwdev, size, dma_handle, flags); } @@ -12914,10 +13293,132 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/pci-swiotlb.c linux-2.6.34.1/arch/x86/ .mapping_error = swiotlb_dma_mapping_error, .alloc_coherent = x86_swiotlb_alloc_coherent, .free_coherent = swiotlb_free_coherent, -diff -urNp linux-2.6.34.1/arch/x86/kernel/process.c linux-2.6.34.1/arch/x86/kernel/process.c ---- linux-2.6.34.1/arch/x86/kernel/process.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/kernel/process.c 2010-07-07 09:04:48.000000000 -0400 -@@ -78,7 +78,7 @@ void exit_thread(void) +diff -urNp linux-2.6.35.4/arch/x86/kernel/process_32.c linux-2.6.35.4/arch/x86/kernel/process_32.c +--- linux-2.6.35.4/arch/x86/kernel/process_32.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/kernel/process_32.c 2010-09-17 20:12:09.000000000 -0400 +@@ -65,6 +65,7 @@ asmlinkage void ret_from_fork(void) __as + unsigned long thread_saved_pc(struct task_struct *tsk) + { + return ((unsigned long *)tsk->thread.sp)[3]; ++//XXX return tsk->thread.eip; + } + + #ifndef CONFIG_SMP +@@ -126,7 +127,7 @@ void __show_regs(struct pt_regs *regs, i + unsigned long sp; + unsigned short ss, gs; + +- if (user_mode_vm(regs)) { ++ if (user_mode(regs)) { + sp = regs->sp; + ss = regs->ss & 0xffff; + gs = get_user_gs(regs); +@@ -196,7 +197,7 @@ int copy_thread(unsigned long clone_flag + struct task_struct *tsk; + int err; + +- childregs = task_pt_regs(p); ++ childregs = task_stack_page(p) + THREAD_SIZE - sizeof(struct pt_regs) - 8; + *childregs = *regs; + childregs->ax = 0; + childregs->sp = sp; +@@ -230,6 +231,7 @@ int copy_thread(unsigned long clone_flag + * Set a new TLS for the child thread? + */ + if (clone_flags & CLONE_SETTLS) ++//XXX needs set_fs()? + err = do_set_thread_area(p, -1, + (struct user_desc __user *)childregs->si, 0); + +@@ -293,7 +295,7 @@ __switch_to(struct task_struct *prev_p, + struct thread_struct *prev = &prev_p->thread, + *next = &next_p->thread; + int cpu = smp_processor_id(); +- struct tss_struct *tss = &per_cpu(init_tss, cpu); ++ struct tss_struct *tss = init_tss + cpu; + bool preload_fpu; + + /* never put a printk in __switch_to... printk() calls wake_up*() indirectly */ +@@ -328,6 +330,11 @@ __switch_to(struct task_struct *prev_p, + */ + lazy_save_gs(prev->gs); + ++#ifdef CONFIG_PAX_MEMORY_UDEREF ++ if (!segment_eq(task_thread_info(prev_p)->addr_limit, task_thread_info(next_p)->addr_limit)) ++ __set_fs(task_thread_info(next_p)->addr_limit, cpu); ++#endif ++ + /* + * Load the per-thread Thread-Local Storage descriptor. + */ +@@ -404,3 +411,27 @@ unsigned long get_wchan(struct task_stru + return 0; + } + ++#ifdef CONFIG_PAX_RANDKSTACK ++asmlinkage void pax_randomize_kstack(void) ++{ ++ struct thread_struct *thread = ¤t->thread; ++ unsigned long time; ++ ++ if (!randomize_va_space) ++ return; ++ ++ rdtscl(time); ++ ++ /* P4 seems to return a 0 LSB, ignore it */ ++#ifdef CONFIG_MPENTIUM4 ++ time &= 0x1EUL; ++ time <<= 2; ++#else ++ time &= 0xFUL; ++ time <<= 3; ++#endif ++ ++ thread->sp0 ^= time; ++ load_sp0(init_tss + smp_processor_id(), thread); ++} ++#endif +diff -urNp linux-2.6.35.4/arch/x86/kernel/process_64.c linux-2.6.35.4/arch/x86/kernel/process_64.c +--- linux-2.6.35.4/arch/x86/kernel/process_64.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/kernel/process_64.c 2010-09-17 20:12:09.000000000 -0400 +@@ -87,7 +87,7 @@ static void __exit_idle(void) + void exit_idle(void) + { + /* idle loop has pid 0 */ +- if (current->pid) ++ if (task_pid_nr(current)) + return; + __exit_idle(); + } +@@ -375,7 +375,7 @@ __switch_to(struct task_struct *prev_p, + struct thread_struct *prev = &prev_p->thread; + struct thread_struct *next = &next_p->thread; + int cpu = smp_processor_id(); +- struct tss_struct *tss = &per_cpu(init_tss, cpu); ++ struct tss_struct *tss = init_tss + cpu; + unsigned fsindex, gsindex; + bool preload_fpu; + +@@ -528,12 +528,11 @@ unsigned long get_wchan(struct task_stru + if (!p || p == current || p->state == TASK_RUNNING) + return 0; + stack = (unsigned long)task_stack_page(p); +- if (p->thread.sp < stack || p->thread.sp >= stack+THREAD_SIZE) ++ if (p->thread.sp < stack || p->thread.sp > stack+THREAD_SIZE-8-sizeof(u64)) + return 0; + fp = *(u64 *)(p->thread.sp); + do { +- if (fp < (unsigned long)stack || +- fp >= (unsigned long)stack+THREAD_SIZE) ++ if (fp < stack || fp > stack+THREAD_SIZE-8-sizeof(u64)) + return 0; + ip = *(u64 *)(fp+8); + if (!in_sched_functions(ip)) +diff -urNp linux-2.6.35.4/arch/x86/kernel/process.c linux-2.6.35.4/arch/x86/kernel/process.c +--- linux-2.6.35.4/arch/x86/kernel/process.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/kernel/process.c 2010-09-17 20:12:09.000000000 -0400 +@@ -73,7 +73,7 @@ void exit_thread(void) unsigned long *bp = t->io_bitmap_ptr; if (bp) { @@ -12926,7 +13427,7 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/process.c linux-2.6.34.1/arch/x86/kern t->io_bitmap_ptr = NULL; clear_thread_flag(TIF_IO_BITMAP); -@@ -112,7 +112,7 @@ void show_regs_common(void) +@@ -107,7 +107,7 @@ void show_regs_common(void) printk(KERN_CONT "\n"); printk(KERN_DEFAULT "Pid: %d, comm: %.20s %s %s %.*s %s/%s\n", @@ -12935,7 +13436,7 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/process.c linux-2.6.34.1/arch/x86/kern init_utsname()->release, (int)strcspn(init_utsname()->version, " "), init_utsname()->version, board, product); -@@ -122,6 +122,9 @@ void flush_thread(void) +@@ -117,6 +117,9 @@ void flush_thread(void) { struct task_struct *tsk = current; @@ -12974,132 +13475,10 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/process.c linux-2.6.34.1/arch/x86/kern - return randomize_range(mm->brk, range_end, 0) ? : mm->brk; -} - -diff -urNp linux-2.6.34.1/arch/x86/kernel/process_32.c linux-2.6.34.1/arch/x86/kernel/process_32.c ---- linux-2.6.34.1/arch/x86/kernel/process_32.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/kernel/process_32.c 2010-07-07 09:04:48.000000000 -0400 -@@ -66,6 +66,7 @@ asmlinkage void ret_from_fork(void) __as - unsigned long thread_saved_pc(struct task_struct *tsk) - { - return ((unsigned long *)tsk->thread.sp)[3]; -+//XXX return tsk->thread.eip; - } - - #ifndef CONFIG_SMP -@@ -127,7 +128,7 @@ void __show_regs(struct pt_regs *regs, i - unsigned long sp; - unsigned short ss, gs; - -- if (user_mode_vm(regs)) { -+ if (user_mode(regs)) { - sp = regs->sp; - ss = regs->ss & 0xffff; - gs = get_user_gs(regs); -@@ -197,7 +198,7 @@ int copy_thread(unsigned long clone_flag - struct task_struct *tsk; - int err; - -- childregs = task_pt_regs(p); -+ childregs = task_stack_page(p) + THREAD_SIZE - sizeof(struct pt_regs) - 8; - *childregs = *regs; - childregs->ax = 0; - childregs->sp = sp; -@@ -231,6 +232,7 @@ int copy_thread(unsigned long clone_flag - * Set a new TLS for the child thread? - */ - if (clone_flags & CLONE_SETTLS) -+//XXX needs set_fs()? - err = do_set_thread_area(p, -1, - (struct user_desc __user *)childregs->si, 0); - -@@ -301,7 +303,7 @@ __switch_to(struct task_struct *prev_p, - struct thread_struct *prev = &prev_p->thread, - *next = &next_p->thread; - int cpu = smp_processor_id(); -- struct tss_struct *tss = &per_cpu(init_tss, cpu); -+ struct tss_struct *tss = init_tss + cpu; - bool preload_fpu; - - /* never put a printk in __switch_to... printk() calls wake_up*() indirectly */ -@@ -336,6 +338,11 @@ __switch_to(struct task_struct *prev_p, - */ - lazy_save_gs(prev->gs); - -+#ifdef CONFIG_PAX_MEMORY_UDEREF -+ if (!segment_eq(task_thread_info(prev_p)->addr_limit, task_thread_info(next_p)->addr_limit)) -+ __set_fs(task_thread_info(next_p)->addr_limit, cpu); -+#endif -+ - /* - * Load the per-thread Thread-Local Storage descriptor. - */ -@@ -412,3 +419,27 @@ unsigned long get_wchan(struct task_stru - return 0; - } - -+#ifdef CONFIG_PAX_RANDKSTACK -+asmlinkage void pax_randomize_kstack(void) -+{ -+ struct thread_struct *thread = ¤t->thread; -+ unsigned long time; -+ -+ if (!randomize_va_space) -+ return; -+ -+ rdtscl(time); -+ -+ /* P4 seems to return a 0 LSB, ignore it */ -+#ifdef CONFIG_MPENTIUM4 -+ time &= 0x1EUL; -+ time <<= 2; -+#else -+ time &= 0xFUL; -+ time <<= 3; -+#endif -+ -+ thread->sp0 ^= time; -+ load_sp0(init_tss + smp_processor_id(), thread); -+} -+#endif -diff -urNp linux-2.6.34.1/arch/x86/kernel/process_64.c linux-2.6.34.1/arch/x86/kernel/process_64.c ---- linux-2.6.34.1/arch/x86/kernel/process_64.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/kernel/process_64.c 2010-07-07 09:04:48.000000000 -0400 -@@ -88,7 +88,7 @@ static void __exit_idle(void) - void exit_idle(void) - { - /* idle loop has pid 0 */ -- if (current->pid) -+ if (task_pid_nr(current)) - return; - __exit_idle(); - } -@@ -383,7 +383,7 @@ __switch_to(struct task_struct *prev_p, - struct thread_struct *prev = &prev_p->thread; - struct thread_struct *next = &next_p->thread; - int cpu = smp_processor_id(); -- struct tss_struct *tss = &per_cpu(init_tss, cpu); -+ struct tss_struct *tss = init_tss + cpu; - unsigned fsindex, gsindex; - bool preload_fpu; - -@@ -536,12 +536,11 @@ unsigned long get_wchan(struct task_stru - if (!p || p == current || p->state == TASK_RUNNING) - return 0; - stack = (unsigned long)task_stack_page(p); -- if (p->thread.sp < stack || p->thread.sp >= stack+THREAD_SIZE) -+ if (p->thread.sp < stack || p->thread.sp > stack+THREAD_SIZE-8-sizeof(u64)) - return 0; - fp = *(u64 *)(p->thread.sp); - do { -- if (fp < (unsigned long)stack || -- fp >= (unsigned long)stack+THREAD_SIZE) -+ if (fp < stack || fp > stack+THREAD_SIZE-8-sizeof(u64)) - return 0; - ip = *(u64 *)(fp+8); - if (!in_sched_functions(ip)) -diff -urNp linux-2.6.34.1/arch/x86/kernel/ptrace.c linux-2.6.34.1/arch/x86/kernel/ptrace.c ---- linux-2.6.34.1/arch/x86/kernel/ptrace.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/kernel/ptrace.c 2010-07-07 09:04:48.000000000 -0400 -@@ -1145,7 +1145,7 @@ static const struct user_regset_view use +diff -urNp linux-2.6.35.4/arch/x86/kernel/ptrace.c linux-2.6.35.4/arch/x86/kernel/ptrace.c +--- linux-2.6.35.4/arch/x86/kernel/ptrace.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/kernel/ptrace.c 2010-09-17 20:12:09.000000000 -0400 +@@ -804,7 +804,7 @@ static const struct user_regset_view use long arch_ptrace(struct task_struct *child, long request, long addr, long data) { int ret; @@ -13108,7 +13487,7 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/ptrace.c linux-2.6.34.1/arch/x86/kerne switch (request) { /* read the word at location addr in the USER area. */ -@@ -1232,14 +1232,14 @@ long arch_ptrace(struct task_struct *chi +@@ -891,14 +891,14 @@ long arch_ptrace(struct task_struct *chi if (addr < 0) return -EIO; ret = do_get_thread_area(child, addr, @@ -13125,40 +13504,7 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/ptrace.c linux-2.6.34.1/arch/x86/kerne break; #endif -@@ -1258,12 +1258,12 @@ long arch_ptrace(struct task_struct *chi - #ifdef CONFIG_X86_PTRACE_BTS - case PTRACE_BTS_CONFIG: - ret = ptrace_bts_config -- (child, data, (struct ptrace_bts_config __user *)addr); -+ (child, data, (__force struct ptrace_bts_config __user *)addr); - break; - - case PTRACE_BTS_STATUS: - ret = ptrace_bts_status -- (child, data, (struct ptrace_bts_config __user *)addr); -+ (child, data, (__force struct ptrace_bts_config __user *)addr); - break; - - case PTRACE_BTS_SIZE: -@@ -1272,7 +1272,7 @@ long arch_ptrace(struct task_struct *chi - - case PTRACE_BTS_GET: - ret = ptrace_bts_read_record -- (child, data, (struct bts_struct __user *) addr); -+ (child, data, (__force struct bts_struct __user *) addr); - break; - - case PTRACE_BTS_CLEAR: -@@ -1281,7 +1281,7 @@ long arch_ptrace(struct task_struct *chi - - case PTRACE_BTS_DRAIN: - ret = ptrace_bts_drain -- (child, data, (struct bts_struct __user *) addr); -+ (child, data, (__force struct bts_struct __user *) addr); - break; - #endif /* CONFIG_X86_PTRACE_BTS */ - -@@ -1697,7 +1697,7 @@ static void fill_sigtrap_info(struct tas +@@ -1315,7 +1315,7 @@ static void fill_sigtrap_info(struct tas memset(info, 0, sizeof(*info)); info->si_signo = SIGTRAP; info->si_code = si_code; @@ -13167,9 +13513,9 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/ptrace.c linux-2.6.34.1/arch/x86/kerne } void user_single_step_siginfo(struct task_struct *tsk, -diff -urNp linux-2.6.34.1/arch/x86/kernel/reboot.c linux-2.6.34.1/arch/x86/kernel/reboot.c ---- linux-2.6.34.1/arch/x86/kernel/reboot.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/kernel/reboot.c 2010-07-07 09:04:48.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/kernel/reboot.c linux-2.6.35.4/arch/x86/kernel/reboot.c +--- linux-2.6.35.4/arch/x86/kernel/reboot.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/kernel/reboot.c 2010-09-17 20:12:09.000000000 -0400 @@ -33,7 +33,7 @@ void (*pm_power_off)(void); EXPORT_SYMBOL(pm_power_off); @@ -13179,7 +13525,7 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/reboot.c linux-2.6.34.1/arch/x86/kerne enum reboot_type reboot_type = BOOT_KBD; int reboot_force; -@@ -276,7 +276,7 @@ static struct dmi_system_id __initdata r +@@ -284,7 +284,7 @@ static struct dmi_system_id __initdata r DMI_MATCH(DMI_BOARD_NAME, "P4S800"), }, }, @@ -13188,7 +13534,7 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/reboot.c linux-2.6.34.1/arch/x86/kerne }; static int __init reboot_init(void) -@@ -292,12 +292,12 @@ core_initcall(reboot_init); +@@ -300,12 +300,12 @@ core_initcall(reboot_init); controller to pulse the CPU reset line, which is more thorough, but doesn't work with at least one type of 486 motherboard. It is easy to stop this code working; hence the copious comments. */ @@ -13206,7 +13552,7 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/reboot.c linux-2.6.34.1/arch/x86/kerne }; static const struct desc_ptr -@@ -346,7 +346,7 @@ static const unsigned char jump_to_bios +@@ -354,7 +354,7 @@ static const unsigned char jump_to_bios * specified by the code and length parameters. * We assume that length will aways be less that 100! */ @@ -13215,7 +13561,7 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/reboot.c linux-2.6.34.1/arch/x86/kerne { local_irq_disable(); -@@ -366,8 +366,8 @@ void machine_real_restart(const unsigned +@@ -374,8 +374,8 @@ void machine_real_restart(const unsigned /* Remap the kernel at virtual address zero, as well as offset zero from the kernel segment. This assumes the kernel segment starts at virtual address PAGE_OFFSET. */ @@ -13226,7 +13572,7 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/reboot.c linux-2.6.34.1/arch/x86/kerne /* * Use `swapper_pg_dir' as our page directory. -@@ -379,16 +379,15 @@ void machine_real_restart(const unsigned +@@ -387,16 +387,15 @@ void machine_real_restart(const unsigned boot)". This seems like a fairly standard thing that gets set by REBOOT.COM programs, and the previous reset routine did this too. */ @@ -13246,9 +13592,9 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/reboot.c linux-2.6.34.1/arch/x86/kerne /* Set up the IDT for real mode. */ load_idt(&real_mode_idt); -diff -urNp linux-2.6.34.1/arch/x86/kernel/setup.c linux-2.6.34.1/arch/x86/kernel/setup.c ---- linux-2.6.34.1/arch/x86/kernel/setup.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/kernel/setup.c 2010-07-07 09:04:48.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/kernel/setup.c linux-2.6.35.4/arch/x86/kernel/setup.c +--- linux-2.6.35.4/arch/x86/kernel/setup.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/kernel/setup.c 2010-09-17 20:12:09.000000000 -0400 @@ -704,7 +704,7 @@ static void __init trim_bios_range(void) * area (640->1Mb) as ram even though it is not. * take them out. @@ -13258,7 +13604,7 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/setup.c linux-2.6.34.1/arch/x86/kernel sanitize_e820_map(e820.map, ARRAY_SIZE(e820.map), &e820.nr_map); } -@@ -790,14 +790,14 @@ void __init setup_arch(char **cmdline_p) +@@ -791,14 +791,14 @@ void __init setup_arch(char **cmdline_p) if (!boot_params.hdr.root_flags) root_mountflags &= ~MS_RDONLY; @@ -13278,12 +13624,12 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/setup.c linux-2.6.34.1/arch/x86/kernel data_resource.end = virt_to_phys(_edata)-1; bss_resource.start = virt_to_phys(&__bss_start); bss_resource.end = virt_to_phys(&__bss_stop)-1; -diff -urNp linux-2.6.34.1/arch/x86/kernel/setup_percpu.c linux-2.6.34.1/arch/x86/kernel/setup_percpu.c ---- linux-2.6.34.1/arch/x86/kernel/setup_percpu.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/kernel/setup_percpu.c 2010-07-07 09:04:48.000000000 -0400 -@@ -27,19 +27,17 @@ - # define DBG(fmt, ...) do { if (0) pr_dbg(fmt, ##__VA_ARGS__); } while (0) - #endif +diff -urNp linux-2.6.35.4/arch/x86/kernel/setup_percpu.c linux-2.6.35.4/arch/x86/kernel/setup_percpu.c +--- linux-2.6.35.4/arch/x86/kernel/setup_percpu.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/kernel/setup_percpu.c 2010-09-17 20:12:09.000000000 -0400 +@@ -21,19 +21,17 @@ + #include + #include +#ifdef CONFIG_SMP DEFINE_PER_CPU(int, cpu_number); @@ -13304,7 +13650,7 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/setup_percpu.c linux-2.6.34.1/arch/x86 [0 ... NR_CPUS-1] = BOOT_PERCPU_OFFSET, }; EXPORT_SYMBOL(__per_cpu_offset); -@@ -167,10 +165,10 @@ static inline void setup_percpu_segment( +@@ -161,10 +159,10 @@ static inline void setup_percpu_segment( { #ifdef CONFIG_X86_32 struct desc_struct gdt; @@ -13318,7 +13664,7 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/setup_percpu.c linux-2.6.34.1/arch/x86 write_gdt_entry(get_cpu_gdt_table(cpu), GDT_ENTRY_PERCPU, &gdt, DESCTYPE_S); #endif -@@ -219,6 +217,11 @@ void __init setup_per_cpu_areas(void) +@@ -213,6 +211,11 @@ void __init setup_per_cpu_areas(void) /* alrighty, percpu areas up and running */ delta = (unsigned long)pcpu_base_addr - (unsigned long)__per_cpu_start; for_each_possible_cpu(cpu) { @@ -13330,8 +13676,8 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/setup_percpu.c linux-2.6.34.1/arch/x86 per_cpu_offset(cpu) = delta + pcpu_unit_offsets[cpu]; per_cpu(this_cpu_off, cpu) = per_cpu_offset(cpu); per_cpu(cpu_number, cpu) = cpu; -@@ -246,6 +249,12 @@ void __init setup_per_cpu_areas(void) - early_per_cpu_map(x86_cpu_to_node_map, cpu); +@@ -249,6 +252,12 @@ void __init setup_per_cpu_areas(void) + set_cpu_numa_node(cpu, early_cpu_to_node(cpu)); #endif #endif +#ifdef CONFIG_CC_STACKPROTECTOR @@ -13341,11 +13687,11 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/setup_percpu.c linux-2.6.34.1/arch/x86 +#endif +#endif /* - * Up to this point, the boot CPU has been using .data.init + * Up to this point, the boot CPU has been using .init.data * area. Reload any changed state for the boot CPU. -diff -urNp linux-2.6.34.1/arch/x86/kernel/signal.c linux-2.6.34.1/arch/x86/kernel/signal.c ---- linux-2.6.34.1/arch/x86/kernel/signal.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/kernel/signal.c 2010-07-07 09:04:48.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/kernel/signal.c linux-2.6.35.4/arch/x86/kernel/signal.c +--- linux-2.6.35.4/arch/x86/kernel/signal.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/kernel/signal.c 2010-09-17 20:12:09.000000000 -0400 @@ -198,7 +198,7 @@ static unsigned long align_sigframe(unsi * Align the stack pointer according to the i386 ABI, * i.e. so that on function entry ((sp + 4) & 15) == 0. @@ -13417,10 +13763,10 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/signal.c linux-2.6.34.1/arch/x86/kerne return; if (current_thread_info()->status & TS_RESTORE_SIGMASK) -diff -urNp linux-2.6.34.1/arch/x86/kernel/smpboot.c linux-2.6.34.1/arch/x86/kernel/smpboot.c ---- linux-2.6.34.1/arch/x86/kernel/smpboot.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/kernel/smpboot.c 2010-07-07 09:04:48.000000000 -0400 -@@ -761,7 +761,11 @@ do_rest: +diff -urNp linux-2.6.35.4/arch/x86/kernel/smpboot.c linux-2.6.35.4/arch/x86/kernel/smpboot.c +--- linux-2.6.35.4/arch/x86/kernel/smpboot.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/kernel/smpboot.c 2010-09-17 20:12:09.000000000 -0400 +@@ -780,7 +780,11 @@ do_rest: (unsigned long)task_stack_page(c_idle.idle) - KERNEL_STACK_OFFSET + THREAD_SIZE; #endif @@ -13432,7 +13778,7 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/smpboot.c linux-2.6.34.1/arch/x86/kern initial_code = (unsigned long)start_secondary; stack_start.sp = (void *) c_idle.idle->thread.sp; -@@ -894,6 +898,12 @@ int __cpuinit native_cpu_up(unsigned int +@@ -920,6 +924,12 @@ int __cpuinit native_cpu_up(unsigned int per_cpu(cpu_state, cpu) = CPU_UP_PREPARE; @@ -13445,9 +13791,9 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/smpboot.c linux-2.6.34.1/arch/x86/kern #ifdef CONFIG_X86_32 /* init low mem mapping */ clone_pgd_range(swapper_pg_dir, swapper_pg_dir + KERNEL_PGD_BOUNDARY, -diff -urNp linux-2.6.34.1/arch/x86/kernel/step.c linux-2.6.34.1/arch/x86/kernel/step.c ---- linux-2.6.34.1/arch/x86/kernel/step.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/kernel/step.c 2010-07-07 09:04:48.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/kernel/step.c linux-2.6.35.4/arch/x86/kernel/step.c +--- linux-2.6.35.4/arch/x86/kernel/step.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/kernel/step.c 2010-09-17 20:12:09.000000000 -0400 @@ -27,10 +27,10 @@ unsigned long convert_ip_to_linear(struc struct desc_struct *desc; unsigned long base; @@ -13480,10 +13826,18 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/step.c linux-2.6.34.1/arch/x86/kernel/ /* 32-bit mode: register increment */ return 0; /* 64-bit mode: REX prefix */ -diff -urNp linux-2.6.34.1/arch/x86/kernel/sys_i386_32.c linux-2.6.34.1/arch/x86/kernel/sys_i386_32.c ---- linux-2.6.34.1/arch/x86/kernel/sys_i386_32.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/kernel/sys_i386_32.c 2010-07-07 09:04:48.000000000 -0400 -@@ -24,6 +24,221 @@ +diff -urNp linux-2.6.35.4/arch/x86/kernel/syscall_table_32.S linux-2.6.35.4/arch/x86/kernel/syscall_table_32.S +--- linux-2.6.35.4/arch/x86/kernel/syscall_table_32.S 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/kernel/syscall_table_32.S 2010-09-17 20:12:09.000000000 -0400 +@@ -1,3 +1,4 @@ ++.section .rodata,"a",@progbits + ENTRY(sys_call_table) + .long sys_restart_syscall /* 0 - old "setup()" system call, used for restarting */ + .long sys_exit +diff -urNp linux-2.6.35.4/arch/x86/kernel/sys_i386_32.c linux-2.6.35.4/arch/x86/kernel/sys_i386_32.c +--- linux-2.6.35.4/arch/x86/kernel/sys_i386_32.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/kernel/sys_i386_32.c 2010-09-17 20:12:09.000000000 -0400 +@@ -24,6 +24,224 @@ #include @@ -13527,10 +13881,11 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/sys_i386_32.c linux-2.6.34.1/arch/x86/ + + if (addr) { + addr = PAGE_ALIGN(addr); -+ vma = find_vma(mm, addr); -+ if (pax_task_size - len >= addr && -+ (!vma || addr + len <= vma->vm_start)) -+ return addr; ++ if (pax_task_size - len >= addr) { ++ vma = find_vma(mm, addr); ++ if (check_heap_stack_gap(vma, addr, len)) ++ return addr; ++ } + } + if (len > mm->cached_hole_size) { + start_addr = addr = mm->free_area_cache; @@ -13570,13 +13925,8 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/sys_i386_32.c linux-2.6.34.1/arch/x86/ + } + return -ENOMEM; + } -+ if (!vma || addr + len <= vma->vm_start) { -+ /* -+ * Remember the place where we stopped the search: -+ */ -+ mm->free_area_cache = addr + len; -+ return addr; -+ } ++ if (check_heap_stack_gap(vma, addr, len)) ++ break; + if (addr + mm->cached_hole_size < vma->vm_start) + mm->cached_hole_size = vma->vm_start - addr; + addr = vma->vm_end; @@ -13586,6 +13936,12 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/sys_i386_32.c linux-2.6.34.1/arch/x86/ + goto full_search; + } + } ++ ++ /* ++ * Remember the place where we stopped the search: ++ */ ++ mm->free_area_cache = addr + len; ++ return addr; +} + +unsigned long @@ -13621,10 +13977,11 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/sys_i386_32.c linux-2.6.34.1/arch/x86/ + /* requesting a specific address */ + if (addr) { + addr = PAGE_ALIGN(addr); -+ vma = find_vma(mm, addr); -+ if (pax_task_size - len >= addr && -+ (!vma || addr + len <= vma->vm_start)) -+ return addr; ++ if (pax_task_size - len >= addr) { ++ vma = find_vma(mm, addr); ++ if (check_heap_stack_gap(vma, addr, len)) ++ return addr; ++ } + } + + /* check if free_area_cache is useful for us */ @@ -13639,7 +13996,7 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/sys_i386_32.c linux-2.6.34.1/arch/x86/ + /* make sure it can fit in the remaining address space */ + if (addr > len) { + vma = find_vma(mm, addr-len); -+ if (!vma || addr <= vma->vm_start) ++ if (check_heap_stack_gap(vma, addr - len, len)) + /* remember the address as a hint for next time */ + return (mm->free_area_cache = addr-len); + } @@ -13656,7 +14013,7 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/sys_i386_32.c linux-2.6.34.1/arch/x86/ + * return with success: + */ + vma = find_vma(mm, addr); -+ if (!vma || addr+len <= vma->vm_start) ++ if (check_heap_stack_gap(vma, addr, len)) + /* remember the address as a hint for next time */ + return (mm->free_area_cache = addr); + @@ -13705,9 +14062,9 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/sys_i386_32.c linux-2.6.34.1/arch/x86/ /* * Do a system call from kernel instead of calling sys_execve so we * end up with proper pt_regs. -diff -urNp linux-2.6.34.1/arch/x86/kernel/sys_x86_64.c linux-2.6.34.1/arch/x86/kernel/sys_x86_64.c ---- linux-2.6.34.1/arch/x86/kernel/sys_x86_64.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/kernel/sys_x86_64.c 2010-07-07 09:04:48.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/kernel/sys_x86_64.c linux-2.6.35.4/arch/x86/kernel/sys_x86_64.c +--- linux-2.6.35.4/arch/x86/kernel/sys_x86_64.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/kernel/sys_x86_64.c 2010-09-17 20:12:09.000000000 -0400 @@ -32,8 +32,8 @@ out: return error; } @@ -13728,7 +14085,7 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/sys_x86_64.c linux-2.6.34.1/arch/x86/k *end = TASK_SIZE; } } -@@ -69,11 +69,15 @@ arch_get_unmapped_area(struct file *filp +@@ -69,16 +69,19 @@ arch_get_unmapped_area(struct file *filp if (flags & MAP_FIXED) return addr; @@ -13745,7 +14102,22 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/sys_x86_64.c linux-2.6.34.1/arch/x86/k if (addr) { addr = PAGE_ALIGN(addr); vma = find_vma(mm, addr); -@@ -128,7 +132,7 @@ arch_get_unmapped_area_topdown(struct fi +- if (end - len >= addr && +- (!vma || addr + len <= vma->vm_start)) ++ if (end - len >= addr && check_heap_stack_gap(vma, addr, len)) + return addr; + } + if (((flags & MAP_32BIT) || test_thread_flag(TIF_IA32)) +@@ -106,7 +109,7 @@ full_search: + } + return -ENOMEM; + } +- if (!vma || addr + len <= vma->vm_start) { ++ if (check_heap_stack_gap(vma, addr, len)) { + /* + * Remember the place where we stopped the search: + */ +@@ -128,7 +131,7 @@ arch_get_unmapped_area_topdown(struct fi { struct vm_area_struct *vma; struct mm_struct *mm = current->mm; @@ -13754,7 +14126,7 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/sys_x86_64.c linux-2.6.34.1/arch/x86/k /* requested length too big for entire address space */ if (len > TASK_SIZE) -@@ -141,6 +145,10 @@ arch_get_unmapped_area_topdown(struct fi +@@ -141,12 +144,15 @@ arch_get_unmapped_area_topdown(struct fi if (!test_thread_flag(TIF_IA32) && (flags & MAP_32BIT)) goto bottomup; @@ -13765,7 +14137,32 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/sys_x86_64.c linux-2.6.34.1/arch/x86/k /* requesting a specific address */ if (addr) { addr = PAGE_ALIGN(addr); -@@ -198,13 +206,21 @@ bottomup: + vma = find_vma(mm, addr); +- if (TASK_SIZE - len >= addr && +- (!vma || addr + len <= vma->vm_start)) ++ if (TASK_SIZE - len >= addr && check_heap_stack_gap(vma, addr, len)) + return addr; + } + +@@ -162,7 +168,7 @@ arch_get_unmapped_area_topdown(struct fi + /* make sure it can fit in the remaining address space */ + if (addr > len) { + vma = find_vma(mm, addr-len); +- if (!vma || addr <= vma->vm_start) ++ if (check_heap_stack_gap(vma, addr - len, len)) + /* remember the address as a hint for next time */ + return mm->free_area_cache = addr-len; + } +@@ -179,7 +185,7 @@ arch_get_unmapped_area_topdown(struct fi + * return with success: + */ + vma = find_vma(mm, addr); +- if (!vma || addr+len <= vma->vm_start) ++ if (check_heap_stack_gap(vma, addr, len)) + /* remember the address as a hint for next time */ + return mm->free_area_cache = addr; + +@@ -198,13 +204,21 @@ bottomup: * can happen with large stack limits and large mmap() * allocations. */ @@ -13789,17 +14186,9 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/sys_x86_64.c linux-2.6.34.1/arch/x86/k mm->cached_hole_size = ~0UL; return addr; -diff -urNp linux-2.6.34.1/arch/x86/kernel/syscall_table_32.S linux-2.6.34.1/arch/x86/kernel/syscall_table_32.S ---- linux-2.6.34.1/arch/x86/kernel/syscall_table_32.S 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/kernel/syscall_table_32.S 2010-07-07 09:04:48.000000000 -0400 -@@ -1,3 +1,4 @@ -+.section .rodata,"a",@progbits - ENTRY(sys_call_table) - .long sys_restart_syscall /* 0 - old "setup()" system call, used for restarting */ - .long sys_exit -diff -urNp linux-2.6.34.1/arch/x86/kernel/time.c linux-2.6.34.1/arch/x86/kernel/time.c ---- linux-2.6.34.1/arch/x86/kernel/time.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/kernel/time.c 2010-07-07 09:04:48.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/kernel/time.c linux-2.6.35.4/arch/x86/kernel/time.c +--- linux-2.6.35.4/arch/x86/kernel/time.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/kernel/time.c 2010-09-17 20:12:09.000000000 -0400 @@ -26,17 +26,13 @@ int timer_ack; #endif @@ -13838,9 +14227,9 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/time.c linux-2.6.34.1/arch/x86/kernel/ } return pc; } -diff -urNp linux-2.6.34.1/arch/x86/kernel/tls.c linux-2.6.34.1/arch/x86/kernel/tls.c ---- linux-2.6.34.1/arch/x86/kernel/tls.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/kernel/tls.c 2010-07-07 09:04:48.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/kernel/tls.c linux-2.6.35.4/arch/x86/kernel/tls.c +--- linux-2.6.35.4/arch/x86/kernel/tls.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/kernel/tls.c 2010-09-17 20:12:09.000000000 -0400 @@ -85,6 +85,11 @@ int do_set_thread_area(struct task_struc if (idx < GDT_ENTRY_TLS_MIN || idx > GDT_ENTRY_TLS_MAX) return -EINVAL; @@ -13853,9 +14242,9 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/tls.c linux-2.6.34.1/arch/x86/kernel/t set_tls_desc(p, idx, &info, 1); return 0; -diff -urNp linux-2.6.34.1/arch/x86/kernel/trampoline_32.S linux-2.6.34.1/arch/x86/kernel/trampoline_32.S ---- linux-2.6.34.1/arch/x86/kernel/trampoline_32.S 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/kernel/trampoline_32.S 2010-07-07 09:04:48.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/kernel/trampoline_32.S linux-2.6.35.4/arch/x86/kernel/trampoline_32.S +--- linux-2.6.35.4/arch/x86/kernel/trampoline_32.S 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/kernel/trampoline_32.S 2010-09-17 20:12:09.000000000 -0400 @@ -32,6 +32,12 @@ #include #include @@ -13878,10 +14267,10 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/trampoline_32.S linux-2.6.34.1/arch/x8 # These need to be in the same 64K segment as the above; # hence we don't use the boot_gdt_descr defined in head.S -diff -urNp linux-2.6.34.1/arch/x86/kernel/traps.c linux-2.6.34.1/arch/x86/kernel/traps.c ---- linux-2.6.34.1/arch/x86/kernel/traps.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/kernel/traps.c 2010-07-07 09:04:48.000000000 -0400 -@@ -69,12 +69,6 @@ asmlinkage int system_call(void); +diff -urNp linux-2.6.35.4/arch/x86/kernel/traps.c linux-2.6.35.4/arch/x86/kernel/traps.c +--- linux-2.6.35.4/arch/x86/kernel/traps.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/kernel/traps.c 2010-09-17 20:12:09.000000000 -0400 +@@ -70,12 +70,6 @@ asmlinkage int system_call(void); /* Do we ignore FPU interrupts ? */ char ignore_fpu_irq; @@ -13894,15 +14283,8 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/traps.c linux-2.6.34.1/arch/x86/kernel #endif DECLARE_BITMAP(used_vectors, NR_VECTORS); -@@ -112,19 +106,19 @@ static inline void preempt_conditional_c - static inline void - die_if_kernel(const char *str, struct pt_regs *regs, long err) - { -- if (!user_mode_vm(regs)) -+ if (!user_mode(regs)) - die(str, regs, err); +@@ -110,13 +104,13 @@ static inline void preempt_conditional_c } - #endif static void __kprobes -do_trap(int trapnr, int signr, char *str, struct pt_regs *regs, @@ -13917,7 +14299,7 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/traps.c linux-2.6.34.1/arch/x86/kernel /* * traps 0, 1, 3, 4, and 5 should be forwarded to vm86. * On nmi (interrupt 2), do_trap should not be called. -@@ -135,7 +129,7 @@ do_trap(int trapnr, int signr, char *str +@@ -127,7 +121,7 @@ do_trap(int trapnr, int signr, char *str } #endif @@ -13926,7 +14308,7 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/traps.c linux-2.6.34.1/arch/x86/kernel goto kernel_trap; #ifdef CONFIG_X86_32 -@@ -158,7 +152,7 @@ trap_signal: +@@ -150,7 +144,7 @@ trap_signal: printk_ratelimit()) { printk(KERN_INFO "%s[%d] trap %s ip:%lx sp:%lx error:%lx", @@ -13935,7 +14317,7 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/traps.c linux-2.6.34.1/arch/x86/kernel regs->ip, regs->sp, error_code); print_vma_addr(" in ", regs->ip); printk("\n"); -@@ -175,8 +169,20 @@ kernel_trap: +@@ -167,8 +161,20 @@ kernel_trap: if (!fixup_exception(regs)) { tsk->thread.error_code = error_code; tsk->thread.trap_no = trapnr; @@ -13956,7 +14338,7 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/traps.c linux-2.6.34.1/arch/x86/kernel return; #ifdef CONFIG_X86_32 -@@ -265,14 +271,30 @@ do_general_protection(struct pt_regs *re +@@ -257,14 +263,30 @@ do_general_protection(struct pt_regs *re conditional_sti(regs); #ifdef CONFIG_X86_32 @@ -13989,7 +14371,7 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/traps.c linux-2.6.34.1/arch/x86/kernel tsk->thread.error_code = error_code; tsk->thread.trap_no = 13; -@@ -305,6 +327,13 @@ gp_in_kernel: +@@ -297,6 +319,13 @@ gp_in_kernel: if (notify_die(DIE_GPF, "general protection fault", regs, error_code, 13, SIGSEGV) == NOTIFY_STOP) return; @@ -14003,7 +14385,7 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/traps.c linux-2.6.34.1/arch/x86/kernel die("general protection fault", regs, error_code); } -@@ -559,7 +588,7 @@ dotraplinkage void __kprobes do_debug(st +@@ -565,7 +594,7 @@ dotraplinkage void __kprobes do_debug(st /* It's safe to allow irq's after DR6 has been saved */ preempt_conditional_sti(regs); @@ -14012,7 +14394,7 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/traps.c linux-2.6.34.1/arch/x86/kernel handle_vm86_trap((struct kernel_vm86_regs *) regs, error_code, 1); return; -@@ -572,7 +601,7 @@ dotraplinkage void __kprobes do_debug(st +@@ -578,7 +607,7 @@ dotraplinkage void __kprobes do_debug(st * We already checked v86 mode above, so we can check for kernel mode * by just checking the CPL of CS. */ @@ -14021,18 +14403,18 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/traps.c linux-2.6.34.1/arch/x86/kernel tsk->thread.debugreg6 &= ~DR_STEP; set_tsk_thread_flag(tsk, TIF_SINGLESTEP); regs->flags &= ~X86_EFLAGS_TF; -@@ -739,7 +768,7 @@ do_simd_coprocessor_error(struct pt_regs - * Handle strange cache flush from user space exception - * in all other cases. This is undocumented behaviour. - */ -- if (regs->flags & X86_VM_MASK) { -+ if (v8086_mode(regs)) { - handle_vm86_fault((struct kernel_vm86_regs *)regs, error_code); +@@ -607,7 +636,7 @@ void math_error(struct pt_regs *regs, in return; - } -diff -urNp linux-2.6.34.1/arch/x86/kernel/tsc.c linux-2.6.34.1/arch/x86/kernel/tsc.c ---- linux-2.6.34.1/arch/x86/kernel/tsc.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/kernel/tsc.c 2010-07-07 09:04:48.000000000 -0400 + conditional_sti(regs); + +- if (!user_mode_vm(regs)) ++ if (!user_mode(regs)) + { + if (!fixup_exception(regs)) { + task->thread.error_code = error_code; +diff -urNp linux-2.6.35.4/arch/x86/kernel/tsc.c linux-2.6.35.4/arch/x86/kernel/tsc.c +--- linux-2.6.35.4/arch/x86/kernel/tsc.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/kernel/tsc.c 2010-09-17 20:12:09.000000000 -0400 @@ -795,7 +795,7 @@ static struct dmi_system_id __initdata b DMI_MATCH(DMI_BOARD_NAME, "2635FA0"), }, @@ -14042,9 +14424,9 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/tsc.c linux-2.6.34.1/arch/x86/kernel/t }; static void __init check_system_tsc_reliable(void) -diff -urNp linux-2.6.34.1/arch/x86/kernel/vm86_32.c linux-2.6.34.1/arch/x86/kernel/vm86_32.c ---- linux-2.6.34.1/arch/x86/kernel/vm86_32.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/kernel/vm86_32.c 2010-07-07 09:04:48.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/kernel/vm86_32.c linux-2.6.35.4/arch/x86/kernel/vm86_32.c +--- linux-2.6.35.4/arch/x86/kernel/vm86_32.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/kernel/vm86_32.c 2010-09-17 20:12:37.000000000 -0400 @@ -41,6 +41,7 @@ #include #include @@ -14109,9 +14491,9 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/vm86_32.c linux-2.6.34.1/arch/x86/kern if (get_user(segoffs, intr_ptr)) goto cannot_handle; if ((segoffs >> 16) == BIOSSEG) -diff -urNp linux-2.6.34.1/arch/x86/kernel/vmi_32.c linux-2.6.34.1/arch/x86/kernel/vmi_32.c ---- linux-2.6.34.1/arch/x86/kernel/vmi_32.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/kernel/vmi_32.c 2010-07-07 09:04:48.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/kernel/vmi_32.c linux-2.6.35.4/arch/x86/kernel/vmi_32.c +--- linux-2.6.35.4/arch/x86/kernel/vmi_32.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/kernel/vmi_32.c 2010-09-17 20:12:09.000000000 -0400 @@ -46,12 +46,17 @@ typedef u32 __attribute__((regparm(1))) typedef u64 __attribute__((regparm(2))) (VROMLONGFUNC)(int); @@ -14271,24 +14653,15 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/vmi_32.c linux-2.6.34.1/arch/x86/kerne return; local_irq_save(flags); -diff -urNp linux-2.6.34.1/arch/x86/kernel/vmlinux.lds.S linux-2.6.34.1/arch/x86/kernel/vmlinux.lds.S ---- linux-2.6.34.1/arch/x86/kernel/vmlinux.lds.S 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/kernel/vmlinux.lds.S 2010-07-07 09:04:48.000000000 -0400 -@@ -26,6 +26,22 @@ +diff -urNp linux-2.6.35.4/arch/x86/kernel/vmlinux.lds.S linux-2.6.35.4/arch/x86/kernel/vmlinux.lds.S +--- linux-2.6.35.4/arch/x86/kernel/vmlinux.lds.S 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/kernel/vmlinux.lds.S 2010-09-17 20:12:09.000000000 -0400 +@@ -26,6 +26,13 @@ #include #include #include +#include + -+#undef PMD_SIZE -+#undef PMD_SHIFT -+#if defined(CONFIG_X86_64) || defined(CONFIG_X86_PAE) -+#define PMD_SHIFT 21 -+#else -+#define PMD_SHIFT 22 -+#endif -+#define PMD_SIZE (1 << PMD_SHIFT) -+ +#if defined(CONFIG_X86_32) && defined(CONFIG_PAX_KERNEXEC) +#define __KERNEL_TEXT_OFFSET (LOAD_OFFSET + ____LOAD_PHYSICAL_ADDR) +#else @@ -14297,7 +14670,7 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/vmlinux.lds.S linux-2.6.34.1/arch/x86/ #undef i386 /* in case the preprocessor is a 32bit one */ -@@ -34,13 +50,13 @@ OUTPUT_FORMAT(CONFIG_OUTPUT_FORMAT, CONF +@@ -34,13 +41,13 @@ OUTPUT_FORMAT(CONFIG_OUTPUT_FORMAT, CONF #ifdef CONFIG_X86_32 OUTPUT_ARCH(i386) ENTRY(phys_startup_32) @@ -14313,19 +14686,19 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/vmlinux.lds.S linux-2.6.34.1/arch/x86/ #if defined(CONFIG_X86_64) && defined(CONFIG_DEBUG_RODATA) /* * On 64-bit, align RODATA to 2MB so that even with CONFIG_DEBUG_RODATA -@@ -69,31 +85,46 @@ jiffies_64 = jiffies; +@@ -69,31 +76,46 @@ jiffies_64 = jiffies; PHDRS { text PT_LOAD FLAGS(5); /* R_E */ - data PT_LOAD FLAGS(7); /* RWE */ ++#ifdef CONFIG_X86_32 ++ module PT_LOAD FLAGS(5); /* R_E */ ++#endif +#ifdef CONFIG_XEN + rodata PT_LOAD FLAGS(5); /* R_E */ +#else + rodata PT_LOAD FLAGS(4); /* R__ */ +#endif -+#ifdef CONFIG_X86_32 -+ module PT_LOAD FLAGS(5); /* R_E */ -+#endif + data PT_LOAD FLAGS(6); /* RW_ */ #ifdef CONFIG_X86_64 user PT_LOAD FLAGS(5); /* R_E */ @@ -14368,7 +14741,7 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/vmlinux.lds.S linux-2.6.34.1/arch/x86/ HEAD_TEXT #ifdef CONFIG_X86_32 . = ALIGN(PAGE_SIZE); -@@ -108,30 +139,66 @@ SECTIONS +@@ -108,13 +130,50 @@ SECTIONS IRQENTRY_TEXT *(.fixup) *(.gnu.warning) @@ -14378,28 +14751,9 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/vmlinux.lds.S linux-2.6.34.1/arch/x86/ - NOTES :text :note + . += __KERNEL_TEXT_OFFSET; - -- EXCEPTION_TABLE(16) :text = 0x9090 -+ . = ALIGN(PAGE_SIZE); -+ NOTES :rodata :note + -+ EXCEPTION_TABLE(16) :rodata - - X64_ALIGN_DEBUG_RODATA_BEGIN - RO_DATA(PAGE_SIZE) - X64_ALIGN_DEBUG_RODATA_END - +#ifdef CONFIG_X86_32 + . = ALIGN(PAGE_SIZE); -+ .rodata.page_aligned : AT(ADDR(.rodata.page_aligned) - LOAD_OFFSET) { -+ *(.idt) -+ . = ALIGN(PAGE_SIZE); -+ *(.empty_zero_page) -+ *(.swapper_pg_pmd) -+ *(.swapper_pg_dir) -+ } -+ -+ . = ALIGN(PAGE_SIZE); + .vmi.rom : AT(ADDR(.vmi.rom) - LOAD_OFFSET) { + *(.vmi.rom) + } :module @@ -14411,20 +14765,44 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/vmlinux.lds.S linux-2.6.34.1/arch/x86/ + MODULES_EXEC_VADDR = .; + BYTE(0) + . += (CONFIG_PAX_KERNEXEC_MODULE_TEXT * 1024 * 1024); -+ . = ALIGN(PMD_SIZE); ++ . = ALIGN(HPAGE_SIZE); + MODULES_EXEC_END = . - 1; +#endif + + } :module +#endif + - /* Data */ - .data : AT(ADDR(.data) - LOAD_OFFSET) { ++ .text.end : AT(ADDR(.text.end) - LOAD_OFFSET) { + /* End of text section */ + _etext = . - __KERNEL_TEXT_OFFSET; ++ } ++ ++#ifdef CONFIG_X86_32 ++ . = ALIGN(PAGE_SIZE); ++ .rodata.page_aligned : AT(ADDR(.rodata.page_aligned) - LOAD_OFFSET) { ++ *(.idt) ++ . = ALIGN(PAGE_SIZE); ++ *(.empty_zero_page) ++ *(.swapper_pg_pmd) ++ *(.swapper_pg_dir) ++ } :rodata ++#endif ++ ++ . = ALIGN(PAGE_SIZE); ++ NOTES :rodata :note + +- EXCEPTION_TABLE(16) :text = 0x9090 ++ EXCEPTION_TABLE(16) :rodata + + X64_ALIGN_DEBUG_RODATA_BEGIN + RO_DATA(PAGE_SIZE) +@@ -122,16 +181,20 @@ SECTIONS + + /* Data */ + .data : AT(ADDR(.data) - LOAD_OFFSET) { + +#ifdef CONFIG_PAX_KERNEXEC -+ . = ALIGN(PMD_SIZE); ++ . = ALIGN(HPAGE_SIZE); +#else + . = ALIGN(PAGE_SIZE); +#endif @@ -14442,7 +14820,7 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/vmlinux.lds.S linux-2.6.34.1/arch/x86/ PAGE_ALIGNED_DATA(PAGE_SIZE) -@@ -194,12 +261,6 @@ SECTIONS +@@ -194,12 +257,6 @@ SECTIONS } vgetcpu_mode = VVIRT(.vgetcpu_mode); @@ -14455,7 +14833,7 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/vmlinux.lds.S linux-2.6.34.1/arch/x86/ .vsyscall_3 ADDR(.vsyscall_0) + 3072: AT(VLOAD(.vsyscall_3)) { *(.vsyscall_3) } -@@ -215,12 +276,19 @@ SECTIONS +@@ -215,12 +272,19 @@ SECTIONS #endif /* CONFIG_X86_64 */ /* Init code and data - will be freed after init */ @@ -14464,7 +14842,7 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/vmlinux.lds.S linux-2.6.34.1/arch/x86/ + BYTE(0) + +#ifdef CONFIG_PAX_KERNEXEC -+ . = ALIGN(PMD_SIZE); ++ . = ALIGN(HPAGE_SIZE); +#else + . = ALIGN(PAGE_SIZE); +#endif @@ -14478,7 +14856,7 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/vmlinux.lds.S linux-2.6.34.1/arch/x86/ /* * percpu offsets are zero-based on SMP. PERCPU_VADDR() changes the * output PHDR, so the next output section - .init.text - should -@@ -229,12 +297,27 @@ SECTIONS +@@ -229,12 +293,27 @@ SECTIONS PERCPU_VADDR(0, :percpu) #endif @@ -14494,24 +14872,24 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/vmlinux.lds.S linux-2.6.34.1/arch/x86/ + VMLINUX_SYMBOL(_einittext) = .; + . = ALIGN(PAGE_SIZE); + } :text.init - -- INIT_DATA_SECTION(16) ++ + /* + * .exit.text is discard at runtime, not link time, to deal with + * references from .altinstructions and .eh_frame + */ -+ .exit.text : AT(ADDR(.exit.text) - LOAD_OFFSET) { ++ .exit.text : AT(ADDR(.exit.text) - LOAD_OFFSET + __KERNEL_TEXT_OFFSET) { + EXIT_TEXT + . = ALIGN(16); + } :text.exit + . = init_begin + SIZEOF(.init.text) + SIZEOF(.exit.text); -+ + +- INIT_DATA_SECTION(16) + . = ALIGN(PAGE_SIZE); + INIT_DATA_SECTION(16) :init .x86_cpu_dev.init : AT(ADDR(.x86_cpu_dev.init) - LOAD_OFFSET) { __x86_cpu_dev_start = .; -@@ -260,19 +343,11 @@ SECTIONS +@@ -260,19 +339,11 @@ SECTIONS *(.altinstr_replacement) } @@ -14532,7 +14910,7 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/vmlinux.lds.S linux-2.6.34.1/arch/x86/ PERCPU(PAGE_SIZE) #endif -@@ -291,16 +366,10 @@ SECTIONS +@@ -291,16 +362,10 @@ SECTIONS .smp_locks : AT(ADDR(.smp_locks) - LOAD_OFFSET) { __smp_locks = .; *(.smp_locks) @@ -14550,15 +14928,15 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/vmlinux.lds.S linux-2.6.34.1/arch/x86/ /* BSS */ . = ALIGN(PAGE_SIZE); .bss : AT(ADDR(.bss) - LOAD_OFFSET) { -@@ -316,6 +385,7 @@ SECTIONS +@@ -316,6 +381,7 @@ SECTIONS __brk_base = .; . += 64 * 1024; /* 64k alignment slop space */ *(.brk_reservation) /* areas brk users have reserved */ -+ . = ALIGN(PMD_SIZE); ++ . = ALIGN(HPAGE_SIZE); __brk_limit = .; } -@@ -342,13 +412,12 @@ SECTIONS +@@ -342,13 +408,12 @@ SECTIONS * for the boot processor. */ #define INIT_PER_CPU(x) init_per_cpu__##x = x + __per_cpu_load @@ -14573,9 +14951,9 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/vmlinux.lds.S linux-2.6.34.1/arch/x86/ "kernel image bigger than KERNEL_IMAGE_SIZE"); #ifdef CONFIG_SMP -diff -urNp linux-2.6.34.1/arch/x86/kernel/vsyscall_64.c linux-2.6.34.1/arch/x86/kernel/vsyscall_64.c ---- linux-2.6.34.1/arch/x86/kernel/vsyscall_64.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/kernel/vsyscall_64.c 2010-07-07 09:04:49.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/kernel/vsyscall_64.c linux-2.6.35.4/arch/x86/kernel/vsyscall_64.c +--- linux-2.6.35.4/arch/x86/kernel/vsyscall_64.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/kernel/vsyscall_64.c 2010-09-17 20:12:09.000000000 -0400 @@ -80,6 +80,7 @@ void update_vsyscall(struct timespec *wa write_seqlock_irqsave(&vsyscall_gtod_data.lock, flags); @@ -14593,9 +14971,9 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/vsyscall_64.c linux-2.6.34.1/arch/x86/ p = tcache->blob[1]; } else if (__vgetcpu_mode == VGETCPU_RDTSCP) { /* Load per CPU data from RDTSCP */ -diff -urNp linux-2.6.34.1/arch/x86/kernel/x8664_ksyms_64.c linux-2.6.34.1/arch/x86/kernel/x8664_ksyms_64.c ---- linux-2.6.34.1/arch/x86/kernel/x8664_ksyms_64.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/kernel/x8664_ksyms_64.c 2010-07-07 09:04:49.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/kernel/x8664_ksyms_64.c linux-2.6.35.4/arch/x86/kernel/x8664_ksyms_64.c +--- linux-2.6.35.4/arch/x86/kernel/x8664_ksyms_64.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/kernel/x8664_ksyms_64.c 2010-09-17 20:12:09.000000000 -0400 @@ -29,8 +29,6 @@ EXPORT_SYMBOL(__put_user_8); EXPORT_SYMBOL(copy_user_generic_string); EXPORT_SYMBOL(copy_user_generic_unrolled); @@ -14605,9 +14983,9 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/x8664_ksyms_64.c linux-2.6.34.1/arch/x EXPORT_SYMBOL(copy_page); EXPORT_SYMBOL(clear_page); -diff -urNp linux-2.6.34.1/arch/x86/kernel/xsave.c linux-2.6.34.1/arch/x86/kernel/xsave.c ---- linux-2.6.34.1/arch/x86/kernel/xsave.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/kernel/xsave.c 2010-07-07 09:04:49.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/kernel/xsave.c linux-2.6.35.4/arch/x86/kernel/xsave.c +--- linux-2.6.35.4/arch/x86/kernel/xsave.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/kernel/xsave.c 2010-09-17 20:12:09.000000000 -0400 @@ -54,7 +54,7 @@ int check_for_xstate(struct i387_fxsave_ fx_sw_user->xstate_size > fx_sw_user->extended_size) return -1; @@ -14627,7 +15005,7 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/xsave.c linux-2.6.34.1/arch/x86/kernel /* @@ -228,7 +228,7 @@ int restore_i387_xstate(void __user *buf - if (task_thread_info(tsk)->status & TS_XSAVE) + if (use_xsave()) err = restore_user_xstate(buf); else - err = fxrstor_checking((__force struct i387_fxsave_struct *) @@ -14635,21 +15013,25 @@ diff -urNp linux-2.6.34.1/arch/x86/kernel/xsave.c linux-2.6.34.1/arch/x86/kernel buf); if (unlikely(err)) { /* -diff -urNp linux-2.6.34.1/arch/x86/kvm/emulate.c linux-2.6.34.1/arch/x86/kvm/emulate.c ---- linux-2.6.34.1/arch/x86/kvm/emulate.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/kvm/emulate.c 2010-07-07 09:04:49.000000000 -0400 -@@ -84,8 +84,8 @@ +diff -urNp linux-2.6.35.4/arch/x86/kvm/emulate.c linux-2.6.35.4/arch/x86/kvm/emulate.c +--- linux-2.6.35.4/arch/x86/kvm/emulate.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/kvm/emulate.c 2010-09-17 20:12:09.000000000 -0400 +@@ -88,11 +88,11 @@ #define Src2CL (1<<29) #define Src2ImmByte (2<<29) #define Src2One (3<<29) -#define Src2Imm16 (4<<29) --#define Src2Mask (7<<29) +-#define Src2Mem16 (5<<29) /* Used for Ep encoding. First argument has to be +#define Src2Imm16 (4U<<29) ++#define Src2Mem16 (5U<<29) /* Used for Ep encoding. First argument has to be + in memory and second argument is located + immediately after the first one in memory. */ +-#define Src2Mask (7<<29) +#define Src2Mask (7U<<29) enum { Group1_80, Group1_81, Group1_82, Group1_83, -@@ -438,6 +438,7 @@ static u32 group2_table[] = { +@@ -446,6 +446,7 @@ static u32 group2_table[] = { #define ____emulate_2op(_op, _src, _dst, _eflags, _x, _y, _suffix) \ do { \ @@ -14657,7 +15039,7 @@ diff -urNp linux-2.6.34.1/arch/x86/kvm/emulate.c linux-2.6.34.1/arch/x86/kvm/emu __asm__ __volatile__ ( \ _PRE_EFLAGS("0", "4", "2") \ _op _suffix " %"_x"3,%1; " \ -@@ -451,8 +452,6 @@ static u32 group2_table[] = { +@@ -459,8 +460,6 @@ static u32 group2_table[] = { /* Raw emulation: instruction has two explicit operands. */ #define __emulate_2op_nobyte(_op,_src,_dst,_eflags,_wx,_wy,_lx,_ly,_qx,_qy) \ do { \ @@ -14666,7 +15048,7 @@ diff -urNp linux-2.6.34.1/arch/x86/kvm/emulate.c linux-2.6.34.1/arch/x86/kvm/emu switch ((_dst).bytes) { \ case 2: \ ____emulate_2op(_op,_src,_dst,_eflags,_wx,_wy,"w"); \ -@@ -468,7 +467,6 @@ static u32 group2_table[] = { +@@ -476,7 +475,6 @@ static u32 group2_table[] = { #define __emulate_2op(_op,_src,_dst,_eflags,_bx,_by,_wx,_wy,_lx,_ly,_qx,_qy) \ do { \ @@ -14674,9 +15056,9 @@ diff -urNp linux-2.6.34.1/arch/x86/kvm/emulate.c linux-2.6.34.1/arch/x86/kvm/emu switch ((_dst).bytes) { \ case 1: \ ____emulate_2op(_op,_src,_dst,_eflags,_bx,_by,"b"); \ -diff -urNp linux-2.6.34.1/arch/x86/kvm/lapic.c linux-2.6.34.1/arch/x86/kvm/lapic.c ---- linux-2.6.34.1/arch/x86/kvm/lapic.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/kvm/lapic.c 2010-07-07 09:04:49.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/kvm/lapic.c linux-2.6.35.4/arch/x86/kvm/lapic.c +--- linux-2.6.35.4/arch/x86/kvm/lapic.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/kvm/lapic.c 2010-09-17 20:12:09.000000000 -0400 @@ -52,7 +52,7 @@ #define APIC_BUS_CYCLE_NS 1 @@ -14686,10 +15068,10 @@ diff -urNp linux-2.6.34.1/arch/x86/kvm/lapic.c linux-2.6.34.1/arch/x86/kvm/lapic #define APIC_LVT_NUM 6 /* 14 is the version for Xeon and Pentium 8.4.8*/ -diff -urNp linux-2.6.34.1/arch/x86/kvm/svm.c linux-2.6.34.1/arch/x86/kvm/svm.c ---- linux-2.6.34.1/arch/x86/kvm/svm.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/kvm/svm.c 2010-07-07 09:04:49.000000000 -0400 -@@ -2481,7 +2481,11 @@ static void reload_tss(struct kvm_vcpu * +diff -urNp linux-2.6.35.4/arch/x86/kvm/svm.c linux-2.6.35.4/arch/x86/kvm/svm.c +--- linux-2.6.35.4/arch/x86/kvm/svm.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/kvm/svm.c 2010-09-17 20:12:09.000000000 -0400 +@@ -2796,7 +2796,11 @@ static void reload_tss(struct kvm_vcpu * int cpu = raw_smp_processor_id(); struct svm_cpu_data *sd = per_cpu(svm_data, cpu); @@ -14701,8 +15083,8 @@ diff -urNp linux-2.6.34.1/arch/x86/kvm/svm.c linux-2.6.34.1/arch/x86/kvm/svm.c load_TR_desc(); } -@@ -2995,7 +2999,7 @@ static void svm_fpu_deactivate(struct kv - svm->vmcb->control.intercept_exceptions |= 1 << NM_VECTOR; +@@ -3337,7 +3341,7 @@ static void svm_fpu_deactivate(struct kv + update_cr0_intercept(svm); } -static struct kvm_x86_ops svm_x86_ops = { @@ -14710,13 +15092,13 @@ diff -urNp linux-2.6.34.1/arch/x86/kvm/svm.c linux-2.6.34.1/arch/x86/kvm/svm.c .cpu_has_kvm_support = has_svm, .disabled_by_bios = is_disabled, .hardware_setup = svm_hardware_setup, -diff -urNp linux-2.6.34.1/arch/x86/kvm/vmx.c linux-2.6.34.1/arch/x86/kvm/vmx.c ---- linux-2.6.34.1/arch/x86/kvm/vmx.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/kvm/vmx.c 2010-07-07 09:04:49.000000000 -0400 -@@ -606,7 +606,11 @@ static void reload_tss(void) +diff -urNp linux-2.6.35.4/arch/x86/kvm/vmx.c linux-2.6.35.4/arch/x86/kvm/vmx.c +--- linux-2.6.35.4/arch/x86/kvm/vmx.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/kvm/vmx.c 2010-09-17 20:12:09.000000000 -0400 +@@ -653,7 +653,11 @@ static void reload_tss(void) - kvm_get_gdt(&gdt); - descs = (void *)gdt.base; + native_store_gdt(&gdt); + descs = (void *)gdt.address; + + pax_open_kernel(); descs[GDT_ENTRY_TSS].type = 9; /* available TSS */ @@ -14725,7 +15107,7 @@ diff -urNp linux-2.6.34.1/arch/x86/kvm/vmx.c linux-2.6.34.1/arch/x86/kvm/vmx.c load_TR_desc(); } -@@ -1454,8 +1458,11 @@ static __init int hardware_setup(void) +@@ -1550,8 +1554,11 @@ static __init int hardware_setup(void) if (!cpu_has_vmx_flexpriority()) flexpriority_enabled = 0; @@ -14739,16 +15121,16 @@ diff -urNp linux-2.6.34.1/arch/x86/kvm/vmx.c linux-2.6.34.1/arch/x86/kvm/vmx.c if (enable_ept && !cpu_has_vmx_ept_2m_page()) kvm_disable_largepages(); -@@ -2429,7 +2436,7 @@ static int vmx_vcpu_setup(struct vcpu_vm - vmcs_writel(HOST_IDTR_BASE, dt.base); /* 22.2.4 */ +@@ -2533,7 +2540,7 @@ static int vmx_vcpu_setup(struct vcpu_vm + vmcs_writel(HOST_IDTR_BASE, dt.address); /* 22.2.4 */ asm("mov $.Lkvm_vmx_return, %0" : "=r"(kvm_vmx_return)); - vmcs_writel(HOST_RIP, kvm_vmx_return); /* 22.2.5 */ + vmcs_writel(HOST_RIP, ktla_ktva(kvm_vmx_return)); /* 22.2.5 */ vmcs_write32(VM_EXIT_MSR_STORE_COUNT, 0); vmcs_write32(VM_EXIT_MSR_LOAD_COUNT, 0); - vmcs_write32(VM_ENTRY_MSR_LOAD_COUNT, 0); -@@ -3845,6 +3852,12 @@ static void vmx_vcpu_run(struct kvm_vcpu + vmcs_write64(VM_EXIT_MSR_LOAD_ADDR, __pa(vmx->msr_autoload.host)); +@@ -3909,6 +3916,12 @@ static void vmx_vcpu_run(struct kvm_vcpu "jmp .Lkvm_vmx_return \n\t" ".Llaunched: " __ex(ASM_VMX_VMRESUME) "\n\t" ".Lkvm_vmx_return: " @@ -14761,7 +15143,7 @@ diff -urNp linux-2.6.34.1/arch/x86/kvm/vmx.c linux-2.6.34.1/arch/x86/kvm/vmx.c /* Save guest registers, load host registers, keep flags */ "xchg %0, (%%"R"sp) \n\t" "mov %%"R"ax, %c[rax](%0) \n\t" -@@ -3891,8 +3904,13 @@ static void vmx_vcpu_run(struct kvm_vcpu +@@ -3955,8 +3968,13 @@ static void vmx_vcpu_run(struct kvm_vcpu [r15]"i"(offsetof(struct vcpu_vmx, vcpu.arch.regs[VCPU_REGS_R15])), #endif [cr2]"i"(offsetof(struct vcpu_vmx, vcpu.arch.cr2)) @@ -14776,7 +15158,7 @@ diff -urNp linux-2.6.34.1/arch/x86/kvm/vmx.c linux-2.6.34.1/arch/x86/kvm/vmx.c #ifdef CONFIG_X86_64 , "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15" #endif -@@ -3906,7 +3924,7 @@ static void vmx_vcpu_run(struct kvm_vcpu +@@ -3970,7 +3988,7 @@ static void vmx_vcpu_run(struct kvm_vcpu if (vmx->rmode.irq.pending) fixup_rmode_irq(vmx); @@ -14785,7 +15167,7 @@ diff -urNp linux-2.6.34.1/arch/x86/kvm/vmx.c linux-2.6.34.1/arch/x86/kvm/vmx.c vmx->launched = 1; vmx_complete_interrupts(vmx); -@@ -4129,7 +4147,7 @@ static void vmx_set_supported_cpuid(u32 +@@ -4191,7 +4209,7 @@ static void vmx_set_supported_cpuid(u32 { } @@ -14794,10 +15176,10 @@ diff -urNp linux-2.6.34.1/arch/x86/kvm/vmx.c linux-2.6.34.1/arch/x86/kvm/vmx.c .cpu_has_kvm_support = cpu_has_kvm_support, .disabled_by_bios = vmx_disabled_by_bios, .hardware_setup = hardware_setup, -diff -urNp linux-2.6.34.1/arch/x86/kvm/x86.c linux-2.6.34.1/arch/x86/kvm/x86.c ---- linux-2.6.34.1/arch/x86/kvm/x86.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/kvm/x86.c 2010-07-07 09:04:49.000000000 -0400 -@@ -85,7 +85,7 @@ static void update_cr8_intercept(struct +diff -urNp linux-2.6.35.4/arch/x86/kvm/x86.c linux-2.6.35.4/arch/x86/kvm/x86.c +--- linux-2.6.35.4/arch/x86/kvm/x86.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/kvm/x86.c 2010-09-17 20:12:09.000000000 -0400 +@@ -86,7 +86,7 @@ static void update_cr8_intercept(struct static int kvm_dev_ioctl_get_supported_cpuid(struct kvm_cpuid2 *cpuid, struct kvm_cpuid_entry2 __user *entries); @@ -14806,7 +15188,7 @@ diff -urNp linux-2.6.34.1/arch/x86/kvm/x86.c linux-2.6.34.1/arch/x86/kvm/x86.c EXPORT_SYMBOL_GPL(kvm_x86_ops); int ignore_msrs = 0; -@@ -111,38 +111,38 @@ static struct kvm_shared_msrs_global __r +@@ -112,38 +112,38 @@ static struct kvm_shared_msrs_global __r static DEFINE_PER_CPU(struct kvm_shared_msrs, shared_msrs); struct kvm_stats_debugfs_item debugfs_entries[] = { @@ -14877,7 +15259,7 @@ diff -urNp linux-2.6.34.1/arch/x86/kvm/x86.c linux-2.6.34.1/arch/x86/kvm/x86.c { NULL } }; -@@ -1604,6 +1604,8 @@ long kvm_arch_dev_ioctl(struct file *fil +@@ -1672,6 +1672,8 @@ long kvm_arch_dev_ioctl(struct file *fil if (n < msr_list.nmsrs) goto out; r = -EFAULT; @@ -14886,7 +15268,7 @@ diff -urNp linux-2.6.34.1/arch/x86/kvm/x86.c linux-2.6.34.1/arch/x86/kvm/x86.c if (copy_to_user(user_msr_list->indices, &msrs_to_save, num_msrs_to_save * sizeof(u32))) goto out; -@@ -2000,7 +2002,7 @@ static int kvm_vcpu_ioctl_set_lapic(stru +@@ -2103,7 +2105,7 @@ static int kvm_vcpu_ioctl_set_lapic(stru static int kvm_vcpu_ioctl_interrupt(struct kvm_vcpu *vcpu, struct kvm_interrupt *irq) { @@ -14895,9 +15277,9 @@ diff -urNp linux-2.6.34.1/arch/x86/kvm/x86.c linux-2.6.34.1/arch/x86/kvm/x86.c return -EINVAL; if (irqchip_in_kernel(vcpu->kvm)) return -ENXIO; -@@ -3757,10 +3759,10 @@ static void kvm_timer_init(void) - } +@@ -4070,10 +4072,10 @@ void kvm_after_handle_nmi(struct kvm_vcp } + EXPORT_SYMBOL_GPL(kvm_after_handle_nmi); -int kvm_arch_init(void *opaque) +int kvm_arch_init(const void *opaque) @@ -14908,9 +15290,9 @@ diff -urNp linux-2.6.34.1/arch/x86/kvm/x86.c linux-2.6.34.1/arch/x86/kvm/x86.c if (kvm_x86_ops) { printk(KERN_ERR "kvm: already loaded the other module\n"); -diff -urNp linux-2.6.34.1/arch/x86/lib/checksum_32.S linux-2.6.34.1/arch/x86/lib/checksum_32.S ---- linux-2.6.34.1/arch/x86/lib/checksum_32.S 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/lib/checksum_32.S 2010-07-07 09:04:49.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/lib/checksum_32.S linux-2.6.35.4/arch/x86/lib/checksum_32.S +--- linux-2.6.35.4/arch/x86/lib/checksum_32.S 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/lib/checksum_32.S 2010-09-17 20:12:09.000000000 -0400 @@ -28,7 +28,8 @@ #include #include @@ -15156,9 +15538,9 @@ diff -urNp linux-2.6.34.1/arch/x86/lib/checksum_32.S linux-2.6.34.1/arch/x86/lib #undef ROUND #undef ROUND1 -diff -urNp linux-2.6.34.1/arch/x86/lib/clear_page_64.S linux-2.6.34.1/arch/x86/lib/clear_page_64.S ---- linux-2.6.34.1/arch/x86/lib/clear_page_64.S 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/lib/clear_page_64.S 2010-07-07 09:04:49.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/lib/clear_page_64.S linux-2.6.35.4/arch/x86/lib/clear_page_64.S +--- linux-2.6.35.4/arch/x86/lib/clear_page_64.S 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/lib/clear_page_64.S 2010-09-17 20:12:09.000000000 -0400 @@ -43,7 +43,7 @@ ENDPROC(clear_page) #include @@ -15168,9 +15550,9 @@ diff -urNp linux-2.6.34.1/arch/x86/lib/clear_page_64.S linux-2.6.34.1/arch/x86/l 1: .byte 0xeb /* jmp */ .byte (clear_page_c - clear_page) - (2f - 1b) /* offset */ 2: -diff -urNp linux-2.6.34.1/arch/x86/lib/copy_page_64.S linux-2.6.34.1/arch/x86/lib/copy_page_64.S ---- linux-2.6.34.1/arch/x86/lib/copy_page_64.S 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/lib/copy_page_64.S 2010-07-07 09:04:49.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/lib/copy_page_64.S linux-2.6.35.4/arch/x86/lib/copy_page_64.S +--- linux-2.6.35.4/arch/x86/lib/copy_page_64.S 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/lib/copy_page_64.S 2010-09-17 20:12:09.000000000 -0400 @@ -104,7 +104,7 @@ ENDPROC(copy_page) #include @@ -15180,9 +15562,9 @@ diff -urNp linux-2.6.34.1/arch/x86/lib/copy_page_64.S linux-2.6.34.1/arch/x86/li 1: .byte 0xeb /* jmp */ .byte (copy_page_c - copy_page) - (2f - 1b) /* offset */ 2: -diff -urNp linux-2.6.34.1/arch/x86/lib/copy_user_64.S linux-2.6.34.1/arch/x86/lib/copy_user_64.S ---- linux-2.6.34.1/arch/x86/lib/copy_user_64.S 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/lib/copy_user_64.S 2010-07-07 09:04:49.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/lib/copy_user_64.S linux-2.6.35.4/arch/x86/lib/copy_user_64.S +--- linux-2.6.35.4/arch/x86/lib/copy_user_64.S 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/lib/copy_user_64.S 2010-09-17 20:12:09.000000000 -0400 @@ -15,13 +15,14 @@ #include #include @@ -15239,9 +15621,9 @@ diff -urNp linux-2.6.34.1/arch/x86/lib/copy_user_64.S linux-2.6.34.1/arch/x86/li movl %edx,%ecx xorl %eax,%eax rep -diff -urNp linux-2.6.34.1/arch/x86/lib/copy_user_nocache_64.S linux-2.6.34.1/arch/x86/lib/copy_user_nocache_64.S ---- linux-2.6.34.1/arch/x86/lib/copy_user_nocache_64.S 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/lib/copy_user_nocache_64.S 2010-07-07 09:04:49.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/lib/copy_user_nocache_64.S linux-2.6.35.4/arch/x86/lib/copy_user_nocache_64.S +--- linux-2.6.35.4/arch/x86/lib/copy_user_nocache_64.S 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/lib/copy_user_nocache_64.S 2010-09-17 20:12:09.000000000 -0400 @@ -14,6 +14,7 @@ #include #include @@ -15266,9 +15648,9 @@ diff -urNp linux-2.6.34.1/arch/x86/lib/copy_user_nocache_64.S linux-2.6.34.1/arc cmpl $8,%edx jb 20f /* less then 8 bytes, go to byte copy loop */ ALIGN_DESTINATION -diff -urNp linux-2.6.34.1/arch/x86/lib/csum-wrappers_64.c linux-2.6.34.1/arch/x86/lib/csum-wrappers_64.c ---- linux-2.6.34.1/arch/x86/lib/csum-wrappers_64.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/lib/csum-wrappers_64.c 2010-07-07 09:04:49.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/lib/csum-wrappers_64.c linux-2.6.35.4/arch/x86/lib/csum-wrappers_64.c +--- linux-2.6.35.4/arch/x86/lib/csum-wrappers_64.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/lib/csum-wrappers_64.c 2010-09-17 20:12:09.000000000 -0400 @@ -52,6 +52,8 @@ csum_partial_copy_from_user(const void _ len -= 2; } @@ -15287,9 +15669,9 @@ diff -urNp linux-2.6.34.1/arch/x86/lib/csum-wrappers_64.c linux-2.6.34.1/arch/x8 return csum_partial_copy_generic(src, (void __force *)dst, len, isum, NULL, errp); } -diff -urNp linux-2.6.34.1/arch/x86/lib/getuser.S linux-2.6.34.1/arch/x86/lib/getuser.S ---- linux-2.6.34.1/arch/x86/lib/getuser.S 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/lib/getuser.S 2010-07-07 09:04:49.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/lib/getuser.S linux-2.6.35.4/arch/x86/lib/getuser.S +--- linux-2.6.35.4/arch/x86/lib/getuser.S 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/lib/getuser.S 2010-09-17 20:12:09.000000000 -0400 @@ -33,14 +33,38 @@ #include #include @@ -15426,9 +15808,31 @@ diff -urNp linux-2.6.34.1/arch/x86/lib/getuser.S linux-2.6.34.1/arch/x86/lib/get xor %edx,%edx mov $(-EFAULT),%_ASM_AX ret -diff -urNp linux-2.6.34.1/arch/x86/lib/mmx_32.c linux-2.6.34.1/arch/x86/lib/mmx_32.c ---- linux-2.6.34.1/arch/x86/lib/mmx_32.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/lib/mmx_32.c 2010-07-07 09:04:49.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/lib/insn.c linux-2.6.35.4/arch/x86/lib/insn.c +--- linux-2.6.35.4/arch/x86/lib/insn.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/lib/insn.c 2010-09-17 20:12:09.000000000 -0400 +@@ -21,6 +21,7 @@ + #include + #include + #include ++#include + + #define get_next(t, insn) \ + ({t r; r = *(t*)insn->next_byte; insn->next_byte += sizeof(t); r; }) +@@ -40,8 +41,8 @@ + void insn_init(struct insn *insn, const void *kaddr, int x86_64) + { + memset(insn, 0, sizeof(*insn)); +- insn->kaddr = kaddr; +- insn->next_byte = kaddr; ++ insn->kaddr = ktla_ktva(kaddr); ++ insn->next_byte = ktla_ktva(kaddr); + insn->x86_64 = x86_64 ? 1 : 0; + insn->opnd_bytes = 4; + if (x86_64) +diff -urNp linux-2.6.35.4/arch/x86/lib/mmx_32.c linux-2.6.35.4/arch/x86/lib/mmx_32.c +--- linux-2.6.35.4/arch/x86/lib/mmx_32.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/lib/mmx_32.c 2010-09-17 20:12:09.000000000 -0400 @@ -29,6 +29,7 @@ void *_mmx_memcpy(void *to, const void * { void *p; @@ -15744,9 +16148,9 @@ diff -urNp linux-2.6.34.1/arch/x86/lib/mmx_32.c linux-2.6.34.1/arch/x86/lib/mmx_ from += 64; to += 64; -diff -urNp linux-2.6.34.1/arch/x86/lib/putuser.S linux-2.6.34.1/arch/x86/lib/putuser.S ---- linux-2.6.34.1/arch/x86/lib/putuser.S 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/lib/putuser.S 2010-07-07 09:04:49.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/lib/putuser.S linux-2.6.35.4/arch/x86/lib/putuser.S +--- linux-2.6.35.4/arch/x86/lib/putuser.S 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/lib/putuser.S 2010-09-17 20:12:09.000000000 -0400 @@ -15,7 +15,8 @@ #include #include @@ -15757,7 +16161,7 @@ diff -urNp linux-2.6.34.1/arch/x86/lib/putuser.S linux-2.6.34.1/arch/x86/lib/put /* * __put_user_X -@@ -29,59 +30,156 @@ +@@ -29,59 +30,162 @@ * as they get called from within inline assembly. */ @@ -15767,6 +16171,12 @@ diff -urNp linux-2.6.34.1/arch/x86/lib/putuser.S linux-2.6.34.1/arch/x86/lib/put #define EXIT ret ; \ CFI_ENDPROC ++#if defined(CONFIG_X86_64) && defined(CONFIG_PAX_MEMORY_UDEREF) ++#define _DEST %_ASM_CX,%_ASM_BX ++#else ++#define _DEST %_ASM_CX ++#endif ++ .text ENTRY(__put_user_1) ENTER @@ -15778,18 +16188,19 @@ diff -urNp linux-2.6.34.1/arch/x86/lib/putuser.S linux-2.6.34.1/arch/x86/lib/put + GET_THREAD_INFO(%_ASM_BX) cmp TI_addr_limit(%_ASM_BX),%_ASM_CX jae bad_put_user +-1: movb %al,(%_ASM_CX) + +#if defined(CONFIG_X86_64) && defined(CONFIG_PAX_MEMORY_UDEREF) + mov $PAX_USER_SHADOW_BASE,%_ASM_BX + cmp %_ASM_BX,%_ASM_CX -+ jae 1234f -+ add %_ASM_BX,%_ASM_CX ++ jb 1234f ++ xor %ebx,%ebx +1234: +#endif + +#endif + - 1: movb %al,(%_ASM_CX) ++1: movb %al,(_DEST) + +#if defined(CONFIG_X86_32) && defined(CONFIG_PAX_MEMORY_UDEREF) + pushl %ss @@ -15812,18 +16223,19 @@ diff -urNp linux-2.6.34.1/arch/x86/lib/putuser.S linux-2.6.34.1/arch/x86/lib/put sub $1,%_ASM_BX cmp %_ASM_BX,%_ASM_CX jae bad_put_user +-2: movw %ax,(%_ASM_CX) + +#if defined(CONFIG_X86_64) && defined(CONFIG_PAX_MEMORY_UDEREF) + mov $PAX_USER_SHADOW_BASE,%_ASM_BX + cmp %_ASM_BX,%_ASM_CX -+ jae 1234f -+ add %_ASM_BX,%_ASM_CX ++ jb 1234f ++ xor %ebx,%ebx +1234: +#endif + +#endif + - 2: movw %ax,(%_ASM_CX) ++2: movw %ax,(_DEST) + +#if defined(CONFIG_X86_32) && defined(CONFIG_PAX_MEMORY_UDEREF) + pushl %ss @@ -15846,18 +16258,19 @@ diff -urNp linux-2.6.34.1/arch/x86/lib/putuser.S linux-2.6.34.1/arch/x86/lib/put sub $3,%_ASM_BX cmp %_ASM_BX,%_ASM_CX jae bad_put_user +-3: movl %eax,(%_ASM_CX) + +#if defined(CONFIG_X86_64) && defined(CONFIG_PAX_MEMORY_UDEREF) + mov $PAX_USER_SHADOW_BASE,%_ASM_BX + cmp %_ASM_BX,%_ASM_CX -+ jae 1234f -+ add %_ASM_BX,%_ASM_CX ++ jb 1234f ++ xor %ebx,%ebx +1234: +#endif + +#endif + - 3: movl %eax,(%_ASM_CX) ++3: movl %eax,(_DEST) + +#if defined(CONFIG_X86_32) && defined(CONFIG_PAX_MEMORY_UDEREF) + pushl %ss @@ -15880,20 +16293,22 @@ diff -urNp linux-2.6.34.1/arch/x86/lib/putuser.S linux-2.6.34.1/arch/x86/lib/put sub $7,%_ASM_BX cmp %_ASM_BX,%_ASM_CX jae bad_put_user +-4: mov %_ASM_AX,(%_ASM_CX) + +#if defined(CONFIG_X86_64) && defined(CONFIG_PAX_MEMORY_UDEREF) + mov $PAX_USER_SHADOW_BASE,%_ASM_BX + cmp %_ASM_BX,%_ASM_CX -+ jae 1234f -+ add %_ASM_BX,%_ASM_CX ++ jb 1234f ++ xor %ebx,%ebx +1234: +#endif + +#endif + - 4: mov %_ASM_AX,(%_ASM_CX) ++4: mov %_ASM_AX,(_DEST) #ifdef CONFIG_X86_32 - 5: movl %edx,4(%_ASM_CX) +-5: movl %edx,4(%_ASM_CX) ++5: movl %edx,4(_DEST) #endif + +#if defined(CONFIG_X86_32) && defined(CONFIG_PAX_MEMORY_UDEREF) @@ -15916,9 +16331,9 @@ diff -urNp linux-2.6.34.1/arch/x86/lib/putuser.S linux-2.6.34.1/arch/x86/lib/put movl $-EFAULT,%eax EXIT END(bad_put_user) -diff -urNp linux-2.6.34.1/arch/x86/lib/usercopy_32.c linux-2.6.34.1/arch/x86/lib/usercopy_32.c ---- linux-2.6.34.1/arch/x86/lib/usercopy_32.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/lib/usercopy_32.c 2010-07-07 09:04:49.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/lib/usercopy_32.c linux-2.6.35.4/arch/x86/lib/usercopy_32.c +--- linux-2.6.35.4/arch/x86/lib/usercopy_32.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/lib/usercopy_32.c 2010-09-17 20:12:09.000000000 -0400 @@ -36,31 +36,38 @@ static inline int __movsl_is_ok(unsigned * Copy a null terminated string from userspace. */ @@ -16903,9 +17318,9 @@ diff -urNp linux-2.6.34.1/arch/x86/lib/usercopy_32.c linux-2.6.34.1/arch/x86/lib +#endif + +EXPORT_SYMBOL(set_fs); -diff -urNp linux-2.6.34.1/arch/x86/lib/usercopy_64.c linux-2.6.34.1/arch/x86/lib/usercopy_64.c ---- linux-2.6.34.1/arch/x86/lib/usercopy_64.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/lib/usercopy_64.c 2010-07-07 09:04:49.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/lib/usercopy_64.c linux-2.6.35.4/arch/x86/lib/usercopy_64.c +--- linux-2.6.35.4/arch/x86/lib/usercopy_64.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/lib/usercopy_64.c 2010-09-17 20:12:09.000000000 -0400 @@ -42,6 +42,8 @@ long __strncpy_from_user(char *dst, const char __user *src, long count) { @@ -16942,9 +17357,25 @@ diff -urNp linux-2.6.34.1/arch/x86/lib/usercopy_64.c linux-2.6.34.1/arch/x86/lib } EXPORT_SYMBOL(copy_in_user); -diff -urNp linux-2.6.34.1/arch/x86/mm/extable.c linux-2.6.34.1/arch/x86/mm/extable.c ---- linux-2.6.34.1/arch/x86/mm/extable.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/mm/extable.c 2010-07-07 09:04:49.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/Makefile linux-2.6.35.4/arch/x86/Makefile +--- linux-2.6.35.4/arch/x86/Makefile 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/Makefile 2010-09-17 20:12:09.000000000 -0400 +@@ -191,3 +191,12 @@ define archhelp + echo ' FDARGS="..." arguments for the booted kernel' + echo ' FDINITRD=file initrd for the booted kernel' + endef ++ ++define OLD_LD ++ ++*** ${VERSION}.${PATCHLEVEL} PaX kernels no longer build correctly with old versions of binutils. ++*** Please upgrade your binutils to 2.18 or newer ++endef ++ ++archprepare: ++ $(if $(LDFLAGS_BUILD_ID),,$(error $(OLD_LD))) +diff -urNp linux-2.6.35.4/arch/x86/mm/extable.c linux-2.6.35.4/arch/x86/mm/extable.c +--- linux-2.6.35.4/arch/x86/mm/extable.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/mm/extable.c 2010-09-17 20:12:09.000000000 -0400 @@ -1,14 +1,71 @@ #include #include @@ -17018,9 +17449,9 @@ diff -urNp linux-2.6.34.1/arch/x86/mm/extable.c linux-2.6.34.1/arch/x86/mm/extab extern u32 pnp_bios_fault_eip, pnp_bios_fault_esp; extern u32 pnp_bios_is_utter_crap; pnp_bios_is_utter_crap = 1; -diff -urNp linux-2.6.34.1/arch/x86/mm/fault.c linux-2.6.34.1/arch/x86/mm/fault.c ---- linux-2.6.34.1/arch/x86/mm/fault.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/mm/fault.c 2010-07-07 09:04:49.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/mm/fault.c linux-2.6.35.4/arch/x86/mm/fault.c +--- linux-2.6.35.4/arch/x86/mm/fault.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/mm/fault.c 2010-09-17 20:12:37.000000000 -0400 @@ -11,10 +11,19 @@ #include /* __kprobes, ... */ #include /* kmmio_handler, ... */ @@ -17278,7 +17709,7 @@ diff -urNp linux-2.6.34.1/arch/x86/mm/fault.c linux-2.6.34.1/arch/x86/mm/fault.c /* User mode accesses just cause a SIGSEGV */ if (error_code & PF_USER) { -@@ -849,6 +992,106 @@ static int spurious_fault_check(unsigned +@@ -851,6 +994,106 @@ static int spurious_fault_check(unsigned return 1; } @@ -17385,7 +17816,7 @@ diff -urNp linux-2.6.34.1/arch/x86/mm/fault.c linux-2.6.34.1/arch/x86/mm/fault.c /* * Handle a spurious fault caused by a stale TLB entry. * -@@ -915,6 +1158,9 @@ int show_unhandled_signals = 1; +@@ -917,6 +1160,9 @@ int show_unhandled_signals = 1; static inline int access_error(unsigned long error_code, int write, struct vm_area_struct *vma) { @@ -17395,7 +17826,7 @@ diff -urNp linux-2.6.34.1/arch/x86/mm/fault.c linux-2.6.34.1/arch/x86/mm/fault.c if (write) { /* write, present and write, not present: */ if (unlikely(!(vma->vm_flags & VM_WRITE))) -@@ -948,17 +1194,31 @@ do_page_fault(struct pt_regs *regs, unsi +@@ -950,17 +1196,31 @@ do_page_fault(struct pt_regs *regs, unsi { struct vm_area_struct *vma; struct task_struct *tsk; @@ -17431,7 +17862,7 @@ diff -urNp linux-2.6.34.1/arch/x86/mm/fault.c linux-2.6.34.1/arch/x86/mm/fault.c /* * Detect and handle instructions that would cause a page fault for * both a tracked kernel page and a userspace page. -@@ -1018,7 +1278,7 @@ do_page_fault(struct pt_regs *regs, unsi +@@ -1020,7 +1280,7 @@ do_page_fault(struct pt_regs *regs, unsi * User-mode registers count as a user access even for any * potential system fault or CPU buglet: */ @@ -17440,7 +17871,7 @@ diff -urNp linux-2.6.34.1/arch/x86/mm/fault.c linux-2.6.34.1/arch/x86/mm/fault.c local_irq_enable(); error_code |= PF_USER; } else { -@@ -1072,6 +1332,11 @@ do_page_fault(struct pt_regs *regs, unsi +@@ -1074,6 +1334,11 @@ do_page_fault(struct pt_regs *regs, unsi might_sleep(); } @@ -17452,7 +17883,7 @@ diff -urNp linux-2.6.34.1/arch/x86/mm/fault.c linux-2.6.34.1/arch/x86/mm/fault.c vma = find_vma(mm, address); if (unlikely(!vma)) { bad_area(regs, error_code, address); -@@ -1083,18 +1348,24 @@ do_page_fault(struct pt_regs *regs, unsi +@@ -1085,18 +1350,24 @@ do_page_fault(struct pt_regs *regs, unsi bad_area(regs, error_code, address); return; } @@ -17488,7 +17919,7 @@ diff -urNp linux-2.6.34.1/arch/x86/mm/fault.c linux-2.6.34.1/arch/x86/mm/fault.c if (unlikely(expand_stack(vma, address))) { bad_area(regs, error_code, address); return; -@@ -1138,3 +1409,199 @@ good_area: +@@ -1140,3 +1411,199 @@ good_area: up_read(&mm->mmap_sem); } @@ -17688,9 +18119,9 @@ diff -urNp linux-2.6.34.1/arch/x86/mm/fault.c linux-2.6.34.1/arch/x86/mm/fault.c + + return ret ? -EFAULT : 0; +} -diff -urNp linux-2.6.34.1/arch/x86/mm/gup.c linux-2.6.34.1/arch/x86/mm/gup.c ---- linux-2.6.34.1/arch/x86/mm/gup.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/mm/gup.c 2010-07-07 09:04:49.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/mm/gup.c linux-2.6.35.4/arch/x86/mm/gup.c +--- linux-2.6.35.4/arch/x86/mm/gup.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/mm/gup.c 2010-09-17 20:12:09.000000000 -0400 @@ -237,7 +237,7 @@ int __get_user_pages_fast(unsigned long addr = start; len = (unsigned long) nr_pages << PAGE_SHIFT; @@ -17700,9 +18131,9 @@ diff -urNp linux-2.6.34.1/arch/x86/mm/gup.c linux-2.6.34.1/arch/x86/mm/gup.c (void __user *)start, len))) return 0; -diff -urNp linux-2.6.34.1/arch/x86/mm/highmem_32.c linux-2.6.34.1/arch/x86/mm/highmem_32.c ---- linux-2.6.34.1/arch/x86/mm/highmem_32.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/mm/highmem_32.c 2010-07-07 09:04:49.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/mm/highmem_32.c linux-2.6.35.4/arch/x86/mm/highmem_32.c +--- linux-2.6.35.4/arch/x86/mm/highmem_32.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/mm/highmem_32.c 2010-09-17 20:12:09.000000000 -0400 @@ -43,7 +43,10 @@ void *kmap_atomic_prot(struct page *page idx = type + KM_TYPE_NR*smp_processor_id(); vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx); @@ -17714,9 +18145,9 @@ diff -urNp linux-2.6.34.1/arch/x86/mm/highmem_32.c linux-2.6.34.1/arch/x86/mm/hi return (void *)vaddr; } -diff -urNp linux-2.6.34.1/arch/x86/mm/hugetlbpage.c linux-2.6.34.1/arch/x86/mm/hugetlbpage.c ---- linux-2.6.34.1/arch/x86/mm/hugetlbpage.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/mm/hugetlbpage.c 2010-07-07 09:04:49.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/mm/hugetlbpage.c linux-2.6.35.4/arch/x86/mm/hugetlbpage.c +--- linux-2.6.35.4/arch/x86/mm/hugetlbpage.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/mm/hugetlbpage.c 2010-09-17 20:12:09.000000000 -0400 @@ -266,13 +266,18 @@ static unsigned long hugetlb_get_unmappe struct hstate *h = hstate_file(file); struct mm_struct *mm = current->mm; @@ -17740,7 +18171,7 @@ diff -urNp linux-2.6.34.1/arch/x86/mm/hugetlbpage.c linux-2.6.34.1/arch/x86/mm/h } full_search: -@@ -280,13 +285,13 @@ full_search: +@@ -280,26 +285,27 @@ full_search: for (vma = find_vma(mm, addr); ; vma = vma->vm_next) { /* At this point: (!vma || addr < vma->vm_end). */ @@ -17757,18 +18188,38 @@ diff -urNp linux-2.6.34.1/arch/x86/mm/hugetlbpage.c linux-2.6.34.1/arch/x86/mm/h mm->cached_hole_size = 0; goto full_search; } -@@ -309,9 +314,8 @@ static unsigned long hugetlb_get_unmappe + return -ENOMEM; + } +- if (!vma || addr + len <= vma->vm_start) { +- mm->free_area_cache = addr + len; +- return addr; +- } ++ if (check_heap_stack_gap(vma, addr, len)) ++ break; + if (addr + mm->cached_hole_size < vma->vm_start) + mm->cached_hole_size = vma->vm_start - addr; + addr = ALIGN(vma->vm_end, huge_page_size(h)); + } ++ ++ mm->free_area_cache = addr + len; ++ return addr; + } + + static unsigned long hugetlb_get_unmapped_area_topdown(struct file *file, +@@ -308,10 +314,9 @@ static unsigned long hugetlb_get_unmappe + { struct hstate *h = hstate_file(file); struct mm_struct *mm = current->mm; - struct vm_area_struct *vma, *prev_vma; +- struct vm_area_struct *vma, *prev_vma; - unsigned long base = mm->mmap_base, addr = addr0; ++ struct vm_area_struct *vma; + unsigned long base = mm->mmap_base, addr; unsigned long largest_hole = mm->cached_hole_size; - int first_time = 1; /* don't allow allocations above current base */ if (mm->free_area_cache > base) -@@ -321,7 +325,7 @@ static unsigned long hugetlb_get_unmappe +@@ -321,7 +326,7 @@ static unsigned long hugetlb_get_unmappe largest_hole = 0; mm->free_area_cache = base; } @@ -17777,7 +18228,51 @@ diff -urNp linux-2.6.34.1/arch/x86/mm/hugetlbpage.c linux-2.6.34.1/arch/x86/mm/h /* make sure it can fit in the remaining address space */ if (mm->free_area_cache < len) goto fail; -@@ -363,22 +367,26 @@ try_again: +@@ -329,33 +334,27 @@ try_again: + /* either no address requested or cant fit in requested address hole */ + addr = (mm->free_area_cache - len) & huge_page_mask(h); + do { ++ vma = find_vma(mm, addr); + /* + * Lookup failure means no vma is above this address, + * i.e. return with success: +- */ +- if (!(vma = find_vma_prev(mm, addr, &prev_vma))) +- return addr; +- +- /* + * new region fits between prev_vma->vm_end and + * vma->vm_start, use it: + */ +- if (addr + len <= vma->vm_start && +- (!prev_vma || (addr >= prev_vma->vm_end))) { ++ if (check_heap_stack_gap(vma, addr, len)) { + /* remember the address as a hint for next time */ +- mm->cached_hole_size = largest_hole; +- return (mm->free_area_cache = addr); +- } else { +- /* pull free_area_cache down to the first hole */ +- if (mm->free_area_cache == vma->vm_end) { +- mm->free_area_cache = vma->vm_start; +- mm->cached_hole_size = largest_hole; +- } ++ mm->cached_hole_size = largest_hole; ++ return (mm->free_area_cache = addr); ++ } ++ /* pull free_area_cache down to the first hole */ ++ if (mm->free_area_cache == vma->vm_end) { ++ mm->free_area_cache = vma->vm_start; ++ mm->cached_hole_size = largest_hole; + } + + /* remember the largest hole we saw so far */ + if (addr + largest_hole < vma->vm_start) +- largest_hole = vma->vm_start - addr; ++ largest_hole = vma->vm_start - addr; + + /* try just below the current vma->vm_start */ + addr = (vma->vm_start - len) & huge_page_mask(h); +@@ -363,22 +362,26 @@ try_again: fail: /* @@ -17815,7 +18310,7 @@ diff -urNp linux-2.6.34.1/arch/x86/mm/hugetlbpage.c linux-2.6.34.1/arch/x86/mm/h mm->cached_hole_size = ~0UL; addr = hugetlb_get_unmapped_area_bottomup(file, addr0, len, pgoff, flags); -@@ -386,6 +394,7 @@ fail: +@@ -386,6 +389,7 @@ fail: /* * Restore the topdown base: */ @@ -17823,7 +18318,7 @@ diff -urNp linux-2.6.34.1/arch/x86/mm/hugetlbpage.c linux-2.6.34.1/arch/x86/mm/h mm->free_area_cache = base; mm->cached_hole_size = ~0UL; -@@ -399,10 +408,17 @@ hugetlb_get_unmapped_area(struct file *f +@@ -399,10 +403,17 @@ hugetlb_get_unmapped_area(struct file *f struct hstate *h = hstate_file(file); struct mm_struct *mm = current->mm; struct vm_area_struct *vma; @@ -17842,138 +18337,19 @@ diff -urNp linux-2.6.34.1/arch/x86/mm/hugetlbpage.c linux-2.6.34.1/arch/x86/mm/h return -ENOMEM; if (flags & MAP_FIXED) { -@@ -414,7 +430,7 @@ hugetlb_get_unmapped_area(struct file *f +@@ -414,8 +425,7 @@ hugetlb_get_unmapped_area(struct file *f if (addr) { addr = ALIGN(addr, huge_page_size(h)); vma = find_vma(mm, addr); - if (TASK_SIZE - len >= addr && -+ if (pax_task_size - len >= addr && - (!vma || addr + len <= vma->vm_start)) +- (!vma || addr + len <= vma->vm_start)) ++ if (pax_task_size - len >= addr && check_heap_stack_gap(vma, addr, len)) return addr; } -diff -urNp linux-2.6.34.1/arch/x86/mm/init.c linux-2.6.34.1/arch/x86/mm/init.c ---- linux-2.6.34.1/arch/x86/mm/init.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/mm/init.c 2010-07-07 09:04:49.000000000 -0400 -@@ -70,11 +70,7 @@ static void __init find_early_table_spac - * cause a hotspot and fill up ZONE_DMA. The page tables - * need roughly 0.5KB per GB. - */ --#ifdef CONFIG_X86_32 -- start = 0x7000; --#else -- start = 0x8000; --#endif -+ start = 0x100000; - e820_table_start = find_e820_area(start, max_pfn_mapped<> PAGE_SHIFT)) -+ return 1; -+#endif -+ if ((ISA_START_ADDRESS >> PAGE_SHIFT) <= pagenr && pagenr < (ISA_END_ADDRESS >> PAGE_SHIFT)) - return 1; - if (iomem_is_exclusive(pagenr << PAGE_SHIFT)) - return 0; -@@ -380,6 +382,88 @@ void free_init_pages(char *what, unsigne - - void free_initmem(void) - { -+ -+#ifdef CONFIG_PAX_KERNEXEC -+#ifdef CONFIG_X86_32 -+ /* PaX: limit KERNEL_CS to actual size */ -+ unsigned long addr, limit; -+ struct desc_struct d; -+ int cpu; -+ -+ limit = paravirt_enabled() ? ktva_ktla(0xffffffff) : (unsigned long)&_etext; -+ limit = (limit - 1UL) >> PAGE_SHIFT; -+ -+ memset(__LOAD_PHYSICAL_ADDR + PAGE_OFFSET, POISON_FREE_INITMEM, PAGE_SIZE); -+ for (cpu = 0; cpu < NR_CPUS; cpu++) { -+ pack_descriptor(&d, get_desc_base(&get_cpu_gdt_table(cpu)[GDT_ENTRY_KERNEL_CS]), limit, 0x9B, 0xC); -+ write_gdt_entry(get_cpu_gdt_table(cpu), GDT_ENTRY_KERNEL_CS, &d, DESCTYPE_S); -+ } -+ -+ /* PaX: make KERNEL_CS read-only */ -+ addr = PFN_ALIGN(ktla_ktva((unsigned long)&_text)); -+ if (!paravirt_enabled()) -+ set_memory_ro(addr, (PFN_ALIGN(_sdata) - addr) >> PAGE_SHIFT); -+/* -+ for (addr = ktla_ktva((unsigned long)&_text); addr < (unsigned long)&_sdata; addr += PMD_SIZE) { -+ pgd = pgd_offset_k(addr); -+ pud = pud_offset(pgd, addr); -+ pmd = pmd_offset(pud, addr); -+ set_pmd(pmd, __pmd(pmd_val(*pmd) & ~_PAGE_RW)); -+ } -+*/ -+#ifdef CONFIG_X86_PAE -+ set_memory_nx(PFN_ALIGN(__init_begin), (PFN_ALIGN(__init_end) - PFN_ALIGN(__init_begin)) >> PAGE_SHIFT); -+/* -+ for (addr = (unsigned long)&__init_begin; addr < (unsigned long)&__init_end; addr += PMD_SIZE) { -+ pgd = pgd_offset_k(addr); -+ pud = pud_offset(pgd, addr); -+ pmd = pmd_offset(pud, addr); -+ set_pmd(pmd, __pmd(pmd_val(*pmd) | (_PAGE_NX & __supported_pte_mask))); -+ } -+*/ -+#endif -+ -+#ifdef CONFIG_MODULES -+ set_memory_4k((unsigned long)MODULES_EXEC_VADDR, (MODULES_EXEC_END - MODULES_EXEC_VADDR) >> PAGE_SHIFT); -+#endif -+ -+#else -+ pgd_t *pgd; -+ pud_t *pud; -+ pmd_t *pmd; -+ unsigned long addr, end; -+ -+ /* PaX: make kernel code/rodata read-only, rest non-executable */ -+ for (addr = __START_KERNEL_map; addr < __START_KERNEL_map + KERNEL_IMAGE_SIZE; addr += PMD_SIZE) { -+ pgd = pgd_offset_k(addr); -+ pud = pud_offset(pgd, addr); -+ pmd = pmd_offset(pud, addr); -+ if (!pmd_present(*pmd)) -+ continue; -+ if ((unsigned long)_text <= addr && addr < (unsigned long)_sdata) -+ set_pmd(pmd, __pmd(pmd_val(*pmd) & ~_PAGE_RW)); -+ else -+ set_pmd(pmd, __pmd(pmd_val(*pmd) | (_PAGE_NX & __supported_pte_mask))); -+ } -+ -+ addr = (unsigned long)__va(__pa(__START_KERNEL_map)); -+ end = addr + KERNEL_IMAGE_SIZE; -+ for (; addr < end; addr += PMD_SIZE) { -+ pgd = pgd_offset_k(addr); -+ pud = pud_offset(pgd, addr); -+ pmd = pmd_offset(pud, addr); -+ if (!pmd_present(*pmd)) -+ continue; -+ if ((unsigned long)__va(__pa(_text)) <= addr && addr < (unsigned long)__va(__pa(_sdata))) -+ set_pmd(pmd, __pmd(pmd_val(*pmd) & ~_PAGE_RW)); -+ else -+ set_pmd(pmd, __pmd(pmd_val(*pmd) | (_PAGE_NX & __supported_pte_mask))); -+ } -+#endif -+ -+ flush_tlb_all(); -+#endif -+ - free_init_pages("unused kernel memory", - (unsigned long)(&__init_begin), - (unsigned long)(&__init_end)); -diff -urNp linux-2.6.34.1/arch/x86/mm/init_32.c linux-2.6.34.1/arch/x86/mm/init_32.c ---- linux-2.6.34.1/arch/x86/mm/init_32.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/mm/init_32.c 2010-07-07 09:04:49.000000000 -0400 + if (mm->get_unmapped_area == arch_get_unmapped_area) +diff -urNp linux-2.6.35.4/arch/x86/mm/init_32.c linux-2.6.35.4/arch/x86/mm/init_32.c +--- linux-2.6.35.4/arch/x86/mm/init_32.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/mm/init_32.c 2010-09-17 20:12:09.000000000 -0400 @@ -72,36 +72,6 @@ static __init void *alloc_low_page(void) } @@ -18277,9 +18653,9 @@ diff -urNp linux-2.6.34.1/arch/x86/mm/init_32.c linux-2.6.34.1/arch/x86/mm/init_ set_pages_ro(virt_to_page(start), size >> PAGE_SHIFT); printk(KERN_INFO "Write protecting the kernel text: %luk\n", size >> 10); -diff -urNp linux-2.6.34.1/arch/x86/mm/init_64.c linux-2.6.34.1/arch/x86/mm/init_64.c ---- linux-2.6.34.1/arch/x86/mm/init_64.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/mm/init_64.c 2010-07-07 09:04:49.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/mm/init_64.c linux-2.6.35.4/arch/x86/mm/init_64.c +--- linux-2.6.35.4/arch/x86/mm/init_64.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/mm/init_64.c 2010-09-17 20:12:09.000000000 -0400 @@ -50,7 +50,6 @@ #include #include @@ -18357,9 +18733,129 @@ diff -urNp linux-2.6.34.1/arch/x86/mm/init_64.c linux-2.6.34.1/arch/x86/mm/init_ return "[vdso]"; if (vma == &gate_vma) return "[vsyscall]"; -diff -urNp linux-2.6.34.1/arch/x86/mm/iomap_32.c linux-2.6.34.1/arch/x86/mm/iomap_32.c ---- linux-2.6.34.1/arch/x86/mm/iomap_32.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/mm/iomap_32.c 2010-07-07 09:04:49.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/mm/init.c linux-2.6.35.4/arch/x86/mm/init.c +--- linux-2.6.35.4/arch/x86/mm/init.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/mm/init.c 2010-09-17 20:12:09.000000000 -0400 +@@ -70,11 +70,7 @@ static void __init find_early_table_spac + * cause a hotspot and fill up ZONE_DMA. The page tables + * need roughly 0.5KB per GB. + */ +-#ifdef CONFIG_X86_32 +- start = 0x7000; +-#else +- start = 0x8000; +-#endif ++ start = 0x100000; + e820_table_start = find_e820_area(start, max_pfn_mapped<> PAGE_SHIFT)) ++ return 1; ++#endif ++ if ((ISA_START_ADDRESS >> PAGE_SHIFT) <= pagenr && pagenr < (ISA_END_ADDRESS >> PAGE_SHIFT)) + return 1; + if (iomem_is_exclusive(pagenr << PAGE_SHIFT)) + return 0; +@@ -380,6 +382,88 @@ void free_init_pages(char *what, unsigne + + void free_initmem(void) + { ++ ++#ifdef CONFIG_PAX_KERNEXEC ++#ifdef CONFIG_X86_32 ++ /* PaX: limit KERNEL_CS to actual size */ ++ unsigned long addr, limit; ++ struct desc_struct d; ++ int cpu; ++ ++ limit = paravirt_enabled() ? ktva_ktla(0xffffffff) : (unsigned long)&_etext; ++ limit = (limit - 1UL) >> PAGE_SHIFT; ++ ++ memset(__LOAD_PHYSICAL_ADDR + PAGE_OFFSET, POISON_FREE_INITMEM, PAGE_SIZE); ++ for (cpu = 0; cpu < NR_CPUS; cpu++) { ++ pack_descriptor(&d, get_desc_base(&get_cpu_gdt_table(cpu)[GDT_ENTRY_KERNEL_CS]), limit, 0x9B, 0xC); ++ write_gdt_entry(get_cpu_gdt_table(cpu), GDT_ENTRY_KERNEL_CS, &d, DESCTYPE_S); ++ } ++ ++ /* PaX: make KERNEL_CS read-only */ ++ addr = PFN_ALIGN(ktla_ktva((unsigned long)&_text)); ++ if (!paravirt_enabled()) ++ set_memory_ro(addr, (PFN_ALIGN(_sdata) - addr) >> PAGE_SHIFT); ++/* ++ for (addr = ktla_ktva((unsigned long)&_text); addr < (unsigned long)&_sdata; addr += PMD_SIZE) { ++ pgd = pgd_offset_k(addr); ++ pud = pud_offset(pgd, addr); ++ pmd = pmd_offset(pud, addr); ++ set_pmd(pmd, __pmd(pmd_val(*pmd) & ~_PAGE_RW)); ++ } ++*/ ++#ifdef CONFIG_X86_PAE ++ set_memory_nx(PFN_ALIGN(__init_begin), (PFN_ALIGN(__init_end) - PFN_ALIGN(__init_begin)) >> PAGE_SHIFT); ++/* ++ for (addr = (unsigned long)&__init_begin; addr < (unsigned long)&__init_end; addr += PMD_SIZE) { ++ pgd = pgd_offset_k(addr); ++ pud = pud_offset(pgd, addr); ++ pmd = pmd_offset(pud, addr); ++ set_pmd(pmd, __pmd(pmd_val(*pmd) | (_PAGE_NX & __supported_pte_mask))); ++ } ++*/ ++#endif ++ ++#ifdef CONFIG_MODULES ++ set_memory_4k((unsigned long)MODULES_EXEC_VADDR, (MODULES_EXEC_END - MODULES_EXEC_VADDR) >> PAGE_SHIFT); ++#endif ++ ++#else ++ pgd_t *pgd; ++ pud_t *pud; ++ pmd_t *pmd; ++ unsigned long addr, end; ++ ++ /* PaX: make kernel code/rodata read-only, rest non-executable */ ++ for (addr = __START_KERNEL_map; addr < __START_KERNEL_map + KERNEL_IMAGE_SIZE; addr += PMD_SIZE) { ++ pgd = pgd_offset_k(addr); ++ pud = pud_offset(pgd, addr); ++ pmd = pmd_offset(pud, addr); ++ if (!pmd_present(*pmd)) ++ continue; ++ if ((unsigned long)_text <= addr && addr < (unsigned long)_sdata) ++ set_pmd(pmd, __pmd(pmd_val(*pmd) & ~_PAGE_RW)); ++ else ++ set_pmd(pmd, __pmd(pmd_val(*pmd) | (_PAGE_NX & __supported_pte_mask))); ++ } ++ ++ addr = (unsigned long)__va(__pa(__START_KERNEL_map)); ++ end = addr + KERNEL_IMAGE_SIZE; ++ for (; addr < end; addr += PMD_SIZE) { ++ pgd = pgd_offset_k(addr); ++ pud = pud_offset(pgd, addr); ++ pmd = pmd_offset(pud, addr); ++ if (!pmd_present(*pmd)) ++ continue; ++ if ((unsigned long)__va(__pa(_text)) <= addr && addr < (unsigned long)__va(__pa(_sdata))) ++ set_pmd(pmd, __pmd(pmd_val(*pmd) & ~_PAGE_RW)); ++ else ++ set_pmd(pmd, __pmd(pmd_val(*pmd) | (_PAGE_NX & __supported_pte_mask))); ++ } ++#endif ++ ++ flush_tlb_all(); ++#endif ++ + free_init_pages("unused kernel memory", + (unsigned long)(&__init_begin), + (unsigned long)(&__init_end)); +diff -urNp linux-2.6.35.4/arch/x86/mm/iomap_32.c linux-2.6.35.4/arch/x86/mm/iomap_32.c +--- linux-2.6.35.4/arch/x86/mm/iomap_32.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/mm/iomap_32.c 2010-09-17 20:12:09.000000000 -0400 @@ -65,7 +65,11 @@ void *kmap_atomic_prot_pfn(unsigned long debug_kmap_atomic(type); idx = type + KM_TYPE_NR * smp_processor_id(); @@ -18372,9 +18868,9 @@ diff -urNp linux-2.6.34.1/arch/x86/mm/iomap_32.c linux-2.6.34.1/arch/x86/mm/ioma arch_flush_lazy_mmu_mode(); return (void *)vaddr; -diff -urNp linux-2.6.34.1/arch/x86/mm/ioremap.c linux-2.6.34.1/arch/x86/mm/ioremap.c ---- linux-2.6.34.1/arch/x86/mm/ioremap.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/mm/ioremap.c 2010-07-07 09:04:49.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/mm/ioremap.c linux-2.6.35.4/arch/x86/mm/ioremap.c +--- linux-2.6.35.4/arch/x86/mm/ioremap.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/mm/ioremap.c 2010-09-17 20:12:09.000000000 -0400 @@ -100,13 +100,10 @@ static void __iomem *__ioremap_caller(re /* * Don't allow anybody to remap normal RAM that we're using.. @@ -18410,9 +18906,9 @@ diff -urNp linux-2.6.34.1/arch/x86/mm/ioremap.c linux-2.6.34.1/arch/x86/mm/iorem /* * The boot-ioremap range spans multiple pmds, for which -diff -urNp linux-2.6.34.1/arch/x86/mm/kmemcheck/kmemcheck.c linux-2.6.34.1/arch/x86/mm/kmemcheck/kmemcheck.c ---- linux-2.6.34.1/arch/x86/mm/kmemcheck/kmemcheck.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/mm/kmemcheck/kmemcheck.c 2010-07-07 09:04:49.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/mm/kmemcheck/kmemcheck.c linux-2.6.35.4/arch/x86/mm/kmemcheck/kmemcheck.c +--- linux-2.6.35.4/arch/x86/mm/kmemcheck/kmemcheck.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/mm/kmemcheck/kmemcheck.c 2010-09-17 20:12:09.000000000 -0400 @@ -622,9 +622,9 @@ bool kmemcheck_fault(struct pt_regs *reg * memory (e.g. tracked pages)? For now, we need this to avoid * invoking kmemcheck for PnP BIOS calls. @@ -18425,9 +18921,9 @@ diff -urNp linux-2.6.34.1/arch/x86/mm/kmemcheck/kmemcheck.c linux-2.6.34.1/arch/ return false; pte = kmemcheck_pte_lookup(address); -diff -urNp linux-2.6.34.1/arch/x86/mm/mmap.c linux-2.6.34.1/arch/x86/mm/mmap.c ---- linux-2.6.34.1/arch/x86/mm/mmap.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/mm/mmap.c 2010-07-07 09:04:49.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/mm/mmap.c linux-2.6.35.4/arch/x86/mm/mmap.c +--- linux-2.6.35.4/arch/x86/mm/mmap.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/mm/mmap.c 2010-09-17 20:12:09.000000000 -0400 @@ -49,7 +49,7 @@ static unsigned int stack_maxrandom_size * Leave an at least ~128 MB hole with possible stack randomization. */ @@ -18509,9 +19005,9 @@ diff -urNp linux-2.6.34.1/arch/x86/mm/mmap.c linux-2.6.34.1/arch/x86/mm/mmap.c mm->get_unmapped_area = arch_get_unmapped_area_topdown; mm->unmap_area = arch_unmap_area_topdown; } -diff -urNp linux-2.6.34.1/arch/x86/mm/numa_32.c linux-2.6.34.1/arch/x86/mm/numa_32.c ---- linux-2.6.34.1/arch/x86/mm/numa_32.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/mm/numa_32.c 2010-07-07 09:04:49.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/mm/numa_32.c linux-2.6.35.4/arch/x86/mm/numa_32.c +--- linux-2.6.35.4/arch/x86/mm/numa_32.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/mm/numa_32.c 2010-09-17 20:12:09.000000000 -0400 @@ -98,7 +98,6 @@ unsigned long node_memmap_size_bytes(int } #endif @@ -18520,21 +19016,9 @@ diff -urNp linux-2.6.34.1/arch/x86/mm/numa_32.c linux-2.6.34.1/arch/x86/mm/numa_ extern unsigned long highend_pfn, highstart_pfn; #define LARGE_PAGE_BYTES (PTRS_PER_PTE * PAGE_SIZE) -diff -urNp linux-2.6.34.1/arch/x86/mm/pageattr-test.c linux-2.6.34.1/arch/x86/mm/pageattr-test.c ---- linux-2.6.34.1/arch/x86/mm/pageattr-test.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/mm/pageattr-test.c 2010-07-07 09:04:49.000000000 -0400 -@@ -36,7 +36,7 @@ enum { - - static int pte_testbit(pte_t pte) - { -- return pte_flags(pte) & _PAGE_UNUSED1; -+ return pte_flags(pte) & _PAGE_CPA_TEST; - } - - struct split_state { -diff -urNp linux-2.6.34.1/arch/x86/mm/pageattr.c linux-2.6.34.1/arch/x86/mm/pageattr.c ---- linux-2.6.34.1/arch/x86/mm/pageattr.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/mm/pageattr.c 2010-07-07 09:04:49.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/mm/pageattr.c linux-2.6.35.4/arch/x86/mm/pageattr.c +--- linux-2.6.35.4/arch/x86/mm/pageattr.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/mm/pageattr.c 2010-09-17 20:12:09.000000000 -0400 @@ -261,16 +261,17 @@ static inline pgprot_t static_protection * PCI BIOS based config access (CONFIG_PCI_GOBIOS) support. */ @@ -18618,28 +19102,42 @@ diff -urNp linux-2.6.34.1/arch/x86/mm/pageattr.c linux-2.6.34.1/arch/x86/mm/page } static int -diff -urNp linux-2.6.34.1/arch/x86/mm/pat.c linux-2.6.34.1/arch/x86/mm/pat.c ---- linux-2.6.34.1/arch/x86/mm/pat.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/mm/pat.c 2010-07-07 09:04:49.000000000 -0400 -@@ -259,7 +259,7 @@ chk_conflict(struct memtype *new, struct +diff -urNp linux-2.6.35.4/arch/x86/mm/pageattr-test.c linux-2.6.35.4/arch/x86/mm/pageattr-test.c +--- linux-2.6.35.4/arch/x86/mm/pageattr-test.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/mm/pageattr-test.c 2010-09-17 20:12:09.000000000 -0400 +@@ -36,7 +36,7 @@ enum { - conflict: - printk(KERN_INFO "%s:%d conflicting memory types " -- "%Lx-%Lx %s<->%s\n", current->comm, current->pid, new->start, -+ "%Lx-%Lx %s<->%s\n", current->comm, task_pid_nr(current), new->start, - new->end, cattr_name(new->type), cattr_name(entry->type)); - return -EBUSY; + static int pte_testbit(pte_t pte) + { +- return pte_flags(pte) & _PAGE_UNUSED1; ++ return pte_flags(pte) & _PAGE_CPA_TEST; } -@@ -555,7 +555,7 @@ unlock_ret: - if (err) { + struct split_state { +diff -urNp linux-2.6.35.4/arch/x86/mm/pat.c linux-2.6.35.4/arch/x86/mm/pat.c +--- linux-2.6.35.4/arch/x86/mm/pat.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/mm/pat.c 2010-09-17 20:12:09.000000000 -0400 +@@ -361,7 +361,7 @@ int free_memtype(u64 start, u64 end) + + if (!entry) { printk(KERN_INFO "%s:%d freeing invalid memtype %Lx-%Lx\n", - current->comm, current->pid, start, end); + current->comm, task_pid_nr(current), start, end); + return -EINVAL; } - dprintk("free_memtype request 0x%Lx-0x%Lx\n", start, end); -@@ -750,7 +750,7 @@ int kernel_map_sync_memtype(u64 base, un +@@ -492,8 +492,8 @@ static inline int range_is_allowed(unsig + while (cursor < to) { + if (!devmem_is_allowed(pfn)) { + printk(KERN_INFO +- "Program %s tried to access /dev/mem between %Lx->%Lx.\n", +- current->comm, from, to); ++ "Program %s tried to access /dev/mem between %Lx->%Lx (%Lx).\n", ++ current->comm, from, to, cursor); + return 0; + } + cursor += PAGE_SIZE; +@@ -557,7 +557,7 @@ int kernel_map_sync_memtype(u64 base, un printk(KERN_INFO "%s:%d ioremap_change_attr failed %s " "for %Lx-%Lx\n", @@ -18648,7 +19146,16 @@ diff -urNp linux-2.6.34.1/arch/x86/mm/pat.c linux-2.6.34.1/arch/x86/mm/pat.c cattr_name(flags), base, (unsigned long long)(base + size)); return -EINVAL; -@@ -808,7 +808,7 @@ static int reserve_pfn_range(u64 paddr, +@@ -593,7 +593,7 @@ static int reserve_pfn_range(u64 paddr, + if (want_flags != flags) { + printk(KERN_WARNING + "%s:%d map pfn RAM range req %s for %Lx-%Lx, got %s\n", +- current->comm, current->pid, ++ current->comm, task_pid_nr(current), + cattr_name(want_flags), + (unsigned long long)paddr, + (unsigned long long)(paddr + size), +@@ -615,7 +615,7 @@ static int reserve_pfn_range(u64 paddr, free_memtype(paddr, paddr + size); printk(KERN_ERR "%s:%d map pfn expected mapping type %s" " for %Lx-%Lx, got %s\n", @@ -18657,9 +19164,26 @@ diff -urNp linux-2.6.34.1/arch/x86/mm/pat.c linux-2.6.34.1/arch/x86/mm/pat.c cattr_name(want_flags), (unsigned long long)paddr, (unsigned long long)(paddr + size), -diff -urNp linux-2.6.34.1/arch/x86/mm/pgtable.c linux-2.6.34.1/arch/x86/mm/pgtable.c ---- linux-2.6.34.1/arch/x86/mm/pgtable.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/mm/pgtable.c 2010-07-07 09:04:49.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/mm/pgtable_32.c linux-2.6.35.4/arch/x86/mm/pgtable_32.c +--- linux-2.6.35.4/arch/x86/mm/pgtable_32.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/mm/pgtable_32.c 2010-09-17 20:12:09.000000000 -0400 +@@ -48,10 +48,13 @@ void set_pte_vaddr(unsigned long vaddr, + return; + } + pte = pte_offset_kernel(pmd, vaddr); ++ ++ pax_open_kernel(); + if (pte_val(pteval)) + set_pte_at(&init_mm, vaddr, pte, pteval); + else + pte_clear(&init_mm, vaddr, pte); ++ pax_close_kernel(); + + /* + * It's enough to flush this one mapping. +diff -urNp linux-2.6.35.4/arch/x86/mm/pgtable.c linux-2.6.35.4/arch/x86/mm/pgtable.c +--- linux-2.6.35.4/arch/x86/mm/pgtable.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/mm/pgtable.c 2010-09-17 20:12:09.000000000 -0400 @@ -84,8 +84,59 @@ static inline void pgd_list_del(pgd_t *p list_del(&page->lru); } @@ -18913,26 +19437,9 @@ diff -urNp linux-2.6.34.1/arch/x86/mm/pgtable.c linux-2.6.34.1/arch/x86/mm/pgtab pgd_dtor(pgd); paravirt_pgd_free(mm, pgd); free_page((unsigned long)pgd); -diff -urNp linux-2.6.34.1/arch/x86/mm/pgtable_32.c linux-2.6.34.1/arch/x86/mm/pgtable_32.c ---- linux-2.6.34.1/arch/x86/mm/pgtable_32.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/mm/pgtable_32.c 2010-07-07 09:04:49.000000000 -0400 -@@ -49,10 +49,13 @@ void set_pte_vaddr(unsigned long vaddr, - return; - } - pte = pte_offset_kernel(pmd, vaddr); -+ -+ pax_open_kernel(); - if (pte_val(pteval)) - set_pte_at(&init_mm, vaddr, pte, pteval); - else - pte_clear(&init_mm, vaddr, pte); -+ pax_close_kernel(); - - /* - * It's enough to flush this one mapping. -diff -urNp linux-2.6.34.1/arch/x86/mm/setup_nx.c linux-2.6.34.1/arch/x86/mm/setup_nx.c ---- linux-2.6.34.1/arch/x86/mm/setup_nx.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/mm/setup_nx.c 2010-07-07 09:05:57.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/mm/setup_nx.c linux-2.6.35.4/arch/x86/mm/setup_nx.c +--- linux-2.6.35.4/arch/x86/mm/setup_nx.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/mm/setup_nx.c 2010-09-17 20:12:09.000000000 -0400 @@ -5,8 +5,10 @@ #include #include @@ -18962,9 +19469,9 @@ diff -urNp linux-2.6.34.1/arch/x86/mm/setup_nx.c linux-2.6.34.1/arch/x86/mm/setu __supported_pte_mask &= ~_PAGE_NX; } -diff -urNp linux-2.6.34.1/arch/x86/mm/tlb.c linux-2.6.34.1/arch/x86/mm/tlb.c ---- linux-2.6.34.1/arch/x86/mm/tlb.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/mm/tlb.c 2010-07-07 09:04:49.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/mm/tlb.c linux-2.6.35.4/arch/x86/mm/tlb.c +--- linux-2.6.35.4/arch/x86/mm/tlb.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/mm/tlb.c 2010-09-17 20:12:09.000000000 -0400 @@ -13,7 +13,7 @@ #include @@ -18986,9 +19493,9 @@ diff -urNp linux-2.6.34.1/arch/x86/mm/tlb.c linux-2.6.34.1/arch/x86/mm/tlb.c } EXPORT_SYMBOL_GPL(leave_mm); -diff -urNp linux-2.6.34.1/arch/x86/oprofile/backtrace.c linux-2.6.34.1/arch/x86/oprofile/backtrace.c ---- linux-2.6.34.1/arch/x86/oprofile/backtrace.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/oprofile/backtrace.c 2010-07-07 09:04:49.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/oprofile/backtrace.c linux-2.6.35.4/arch/x86/oprofile/backtrace.c +--- linux-2.6.35.4/arch/x86/oprofile/backtrace.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/oprofile/backtrace.c 2010-09-17 20:12:09.000000000 -0400 @@ -58,7 +58,7 @@ static struct frame_head *dump_user_back struct frame_head bufhead[2]; @@ -19007,9 +19514,9 @@ diff -urNp linux-2.6.34.1/arch/x86/oprofile/backtrace.c linux-2.6.34.1/arch/x86/ unsigned long stack = kernel_stack_pointer(regs); if (depth) dump_trace(NULL, regs, (unsigned long *)stack, 0, -diff -urNp linux-2.6.34.1/arch/x86/oprofile/op_model_p4.c linux-2.6.34.1/arch/x86/oprofile/op_model_p4.c ---- linux-2.6.34.1/arch/x86/oprofile/op_model_p4.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/oprofile/op_model_p4.c 2010-07-07 09:04:49.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/oprofile/op_model_p4.c linux-2.6.35.4/arch/x86/oprofile/op_model_p4.c +--- linux-2.6.35.4/arch/x86/oprofile/op_model_p4.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/oprofile/op_model_p4.c 2010-09-17 20:12:09.000000000 -0400 @@ -50,7 +50,7 @@ static inline void setup_num_counters(vo #endif } @@ -19019,9 +19526,9 @@ diff -urNp linux-2.6.34.1/arch/x86/oprofile/op_model_p4.c linux-2.6.34.1/arch/x8 { #ifdef CONFIG_SMP return smp_num_siblings == 2 ? 2 : 1; -diff -urNp linux-2.6.34.1/arch/x86/pci/common.c linux-2.6.34.1/arch/x86/pci/common.c ---- linux-2.6.34.1/arch/x86/pci/common.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/pci/common.c 2010-07-07 09:04:49.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/pci/common.c linux-2.6.35.4/arch/x86/pci/common.c +--- linux-2.6.35.4/arch/x86/pci/common.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/pci/common.c 2010-09-17 20:12:09.000000000 -0400 @@ -32,8 +32,8 @@ int noioapicreroute = 1; int pcibios_last_bus = -1; unsigned long pirq_table_addr; @@ -19042,9 +19549,9 @@ diff -urNp linux-2.6.34.1/arch/x86/pci/common.c linux-2.6.34.1/arch/x86/pci/comm }; void __init dmi_check_pciprobe(void) -diff -urNp linux-2.6.34.1/arch/x86/pci/direct.c linux-2.6.34.1/arch/x86/pci/direct.c ---- linux-2.6.34.1/arch/x86/pci/direct.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/pci/direct.c 2010-07-07 09:04:49.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/pci/direct.c linux-2.6.35.4/arch/x86/pci/direct.c +--- linux-2.6.35.4/arch/x86/pci/direct.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/pci/direct.c 2010-09-17 20:12:09.000000000 -0400 @@ -79,7 +79,7 @@ static int pci_conf1_write(unsigned int #undef PCI_CONF1_ADDRESS @@ -19072,9 +19579,9 @@ diff -urNp linux-2.6.34.1/arch/x86/pci/direct.c linux-2.6.34.1/arch/x86/pci/dire { u32 x = 0; int year, devfn; -diff -urNp linux-2.6.34.1/arch/x86/pci/fixup.c linux-2.6.34.1/arch/x86/pci/fixup.c ---- linux-2.6.34.1/arch/x86/pci/fixup.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/pci/fixup.c 2010-07-07 09:04:49.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/pci/fixup.c linux-2.6.35.4/arch/x86/pci/fixup.c +--- linux-2.6.35.4/arch/x86/pci/fixup.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/pci/fixup.c 2010-09-17 20:12:09.000000000 -0400 @@ -364,7 +364,7 @@ static const struct dmi_system_id __devi DMI_MATCH(DMI_PRODUCT_NAME, "MS-6702E"), }, @@ -19093,9 +19600,9 @@ diff -urNp linux-2.6.34.1/arch/x86/pci/fixup.c linux-2.6.34.1/arch/x86/pci/fixup }; static void __devinit pci_pre_fixup_toshiba_ohci1394(struct pci_dev *dev) -diff -urNp linux-2.6.34.1/arch/x86/pci/irq.c linux-2.6.34.1/arch/x86/pci/irq.c ---- linux-2.6.34.1/arch/x86/pci/irq.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/pci/irq.c 2010-07-07 09:04:49.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/pci/irq.c linux-2.6.35.4/arch/x86/pci/irq.c +--- linux-2.6.35.4/arch/x86/pci/irq.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/pci/irq.c 2010-09-17 20:12:09.000000000 -0400 @@ -542,7 +542,7 @@ static __init int intel_router_probe(str static struct pci_device_id __initdata pirq_440gx[] = { { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82443GX_0) }, @@ -19105,7 +19612,7 @@ diff -urNp linux-2.6.34.1/arch/x86/pci/irq.c linux-2.6.34.1/arch/x86/pci/irq.c }; /* 440GX has a proprietary PIRQ router -- don't use it */ -@@ -1108,7 +1108,7 @@ static struct dmi_system_id __initdata p +@@ -1113,7 +1113,7 @@ static struct dmi_system_id __initdata p DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 360"), }, }, @@ -19114,9 +19621,9 @@ diff -urNp linux-2.6.34.1/arch/x86/pci/irq.c linux-2.6.34.1/arch/x86/pci/irq.c }; void __init pcibios_irq_init(void) -diff -urNp linux-2.6.34.1/arch/x86/pci/mmconfig_32.c linux-2.6.34.1/arch/x86/pci/mmconfig_32.c ---- linux-2.6.34.1/arch/x86/pci/mmconfig_32.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/pci/mmconfig_32.c 2010-07-07 09:04:49.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/pci/mmconfig_32.c linux-2.6.35.4/arch/x86/pci/mmconfig_32.c +--- linux-2.6.35.4/arch/x86/pci/mmconfig_32.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/pci/mmconfig_32.c 2010-09-17 20:12:09.000000000 -0400 @@ -117,7 +117,7 @@ static int pci_mmcfg_write(unsigned int return 0; } @@ -19126,9 +19633,9 @@ diff -urNp linux-2.6.34.1/arch/x86/pci/mmconfig_32.c linux-2.6.34.1/arch/x86/pci .read = pci_mmcfg_read, .write = pci_mmcfg_write, }; -diff -urNp linux-2.6.34.1/arch/x86/pci/mmconfig_64.c linux-2.6.34.1/arch/x86/pci/mmconfig_64.c ---- linux-2.6.34.1/arch/x86/pci/mmconfig_64.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/pci/mmconfig_64.c 2010-07-07 09:04:49.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/pci/mmconfig_64.c linux-2.6.35.4/arch/x86/pci/mmconfig_64.c +--- linux-2.6.35.4/arch/x86/pci/mmconfig_64.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/pci/mmconfig_64.c 2010-09-17 20:12:09.000000000 -0400 @@ -81,7 +81,7 @@ static int pci_mmcfg_write(unsigned int return 0; } @@ -19138,9 +19645,9 @@ diff -urNp linux-2.6.34.1/arch/x86/pci/mmconfig_64.c linux-2.6.34.1/arch/x86/pci .read = pci_mmcfg_read, .write = pci_mmcfg_write, }; -diff -urNp linux-2.6.34.1/arch/x86/pci/numaq_32.c linux-2.6.34.1/arch/x86/pci/numaq_32.c ---- linux-2.6.34.1/arch/x86/pci/numaq_32.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/pci/numaq_32.c 2010-07-07 09:04:49.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/pci/numaq_32.c linux-2.6.35.4/arch/x86/pci/numaq_32.c +--- linux-2.6.35.4/arch/x86/pci/numaq_32.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/pci/numaq_32.c 2010-09-17 20:12:09.000000000 -0400 @@ -108,7 +108,7 @@ static int pci_conf1_mq_write(unsigned i #undef PCI_CONF1_MQ_ADDRESS @@ -19150,9 +19657,9 @@ diff -urNp linux-2.6.34.1/arch/x86/pci/numaq_32.c linux-2.6.34.1/arch/x86/pci/nu .read = pci_conf1_mq_read, .write = pci_conf1_mq_write }; -diff -urNp linux-2.6.34.1/arch/x86/pci/olpc.c linux-2.6.34.1/arch/x86/pci/olpc.c ---- linux-2.6.34.1/arch/x86/pci/olpc.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/pci/olpc.c 2010-07-07 09:04:49.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/pci/olpc.c linux-2.6.35.4/arch/x86/pci/olpc.c +--- linux-2.6.35.4/arch/x86/pci/olpc.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/pci/olpc.c 2010-09-17 20:12:09.000000000 -0400 @@ -297,7 +297,7 @@ static int pci_olpc_write(unsigned int s return 0; } @@ -19162,9 +19669,9 @@ diff -urNp linux-2.6.34.1/arch/x86/pci/olpc.c linux-2.6.34.1/arch/x86/pci/olpc.c .read = pci_olpc_read, .write = pci_olpc_write, }; -diff -urNp linux-2.6.34.1/arch/x86/pci/pcbios.c linux-2.6.34.1/arch/x86/pci/pcbios.c ---- linux-2.6.34.1/arch/x86/pci/pcbios.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/pci/pcbios.c 2010-07-07 09:04:49.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/pci/pcbios.c linux-2.6.35.4/arch/x86/pci/pcbios.c +--- linux-2.6.35.4/arch/x86/pci/pcbios.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/pci/pcbios.c 2010-09-17 20:12:09.000000000 -0400 @@ -57,50 +57,93 @@ union bios32 { static struct { unsigned long address; @@ -19487,10 +19994,10 @@ diff -urNp linux-2.6.34.1/arch/x86/pci/pcbios.c linux-2.6.34.1/arch/x86/pci/pcbi return !(ret & 0xff00); } EXPORT_SYMBOL(pcibios_set_irq_routing); -diff -urNp linux-2.6.34.1/arch/x86/power/cpu.c linux-2.6.34.1/arch/x86/power/cpu.c ---- linux-2.6.34.1/arch/x86/power/cpu.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/power/cpu.c 2010-07-07 09:04:49.000000000 -0400 -@@ -127,7 +127,7 @@ static void do_fpu_end(void) +diff -urNp linux-2.6.35.4/arch/x86/power/cpu.c linux-2.6.35.4/arch/x86/power/cpu.c +--- linux-2.6.35.4/arch/x86/power/cpu.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/power/cpu.c 2010-09-17 20:12:09.000000000 -0400 +@@ -129,7 +129,7 @@ static void do_fpu_end(void) static void fix_processor_context(void) { int cpu = smp_processor_id(); @@ -19499,7 +20006,7 @@ diff -urNp linux-2.6.34.1/arch/x86/power/cpu.c linux-2.6.34.1/arch/x86/power/cpu set_tss_desc(cpu, t); /* * This just modifies memory; should not be -@@ -137,7 +137,9 @@ static void fix_processor_context(void) +@@ -139,7 +139,9 @@ static void fix_processor_context(void) */ #ifdef CONFIG_X86_64 @@ -19509,9 +20016,9 @@ diff -urNp linux-2.6.34.1/arch/x86/power/cpu.c linux-2.6.34.1/arch/x86/power/cpu syscall_init(); /* This sets MSR_*STAR and related */ #endif -diff -urNp linux-2.6.34.1/arch/x86/vdso/Makefile linux-2.6.34.1/arch/x86/vdso/Makefile ---- linux-2.6.34.1/arch/x86/vdso/Makefile 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/vdso/Makefile 2010-07-07 09:04:49.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/vdso/Makefile linux-2.6.35.4/arch/x86/vdso/Makefile +--- linux-2.6.35.4/arch/x86/vdso/Makefile 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/vdso/Makefile 2010-09-17 20:12:09.000000000 -0400 @@ -122,7 +122,7 @@ quiet_cmd_vdso = VDSO $@ $(VDSO_LDFLAGS) $(VDSO_LDFLAGS_$(filter %.lds,$(^F))) \ -Wl,-T,$(filter %.lds,$^) $(filter %.o,$^) @@ -19521,9 +20028,9 @@ diff -urNp linux-2.6.34.1/arch/x86/vdso/Makefile linux-2.6.34.1/arch/x86/vdso/Ma GCOV_PROFILE := n # -diff -urNp linux-2.6.34.1/arch/x86/vdso/vclock_gettime.c linux-2.6.34.1/arch/x86/vdso/vclock_gettime.c ---- linux-2.6.34.1/arch/x86/vdso/vclock_gettime.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/vdso/vclock_gettime.c 2010-07-07 09:04:49.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/vdso/vclock_gettime.c linux-2.6.35.4/arch/x86/vdso/vclock_gettime.c +--- linux-2.6.35.4/arch/x86/vdso/vclock_gettime.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/vdso/vclock_gettime.c 2010-09-17 20:12:09.000000000 -0400 @@ -22,24 +22,48 @@ #include #include @@ -19622,22 +20129,9 @@ diff -urNp linux-2.6.34.1/arch/x86/vdso/vclock_gettime.c linux-2.6.34.1/arch/x86 } int gettimeofday(struct timeval *, struct timezone *) __attribute__((weak, alias("__vdso_gettimeofday"))); -diff -urNp linux-2.6.34.1/arch/x86/vdso/vdso.lds.S linux-2.6.34.1/arch/x86/vdso/vdso.lds.S ---- linux-2.6.34.1/arch/x86/vdso/vdso.lds.S 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/vdso/vdso.lds.S 2010-07-07 09:04:49.000000000 -0400 -@@ -35,3 +35,9 @@ VDSO64_PRELINK = VDSO_PRELINK; - #define VEXTERN(x) VDSO64_ ## x = vdso_ ## x; - #include "vextern.h" - #undef VEXTERN -+ -+#define VEXTERN(x) VDSO64_ ## x = __vdso_ ## x; -+VEXTERN(fallback_gettimeofday) -+VEXTERN(fallback_time) -+VEXTERN(getcpu) -+#undef VEXTERN -diff -urNp linux-2.6.34.1/arch/x86/vdso/vdso32-setup.c linux-2.6.34.1/arch/x86/vdso/vdso32-setup.c ---- linux-2.6.34.1/arch/x86/vdso/vdso32-setup.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/vdso/vdso32-setup.c 2010-07-07 09:04:49.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/vdso/vdso32-setup.c linux-2.6.35.4/arch/x86/vdso/vdso32-setup.c +--- linux-2.6.35.4/arch/x86/vdso/vdso32-setup.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/vdso/vdso32-setup.c 2010-09-17 20:12:09.000000000 -0400 @@ -25,6 +25,7 @@ #include #include @@ -19720,9 +20214,22 @@ diff -urNp linux-2.6.34.1/arch/x86/vdso/vdso32-setup.c linux-2.6.34.1/arch/x86/v return &gate_vma; return NULL; } -diff -urNp linux-2.6.34.1/arch/x86/vdso/vextern.h linux-2.6.34.1/arch/x86/vdso/vextern.h ---- linux-2.6.34.1/arch/x86/vdso/vextern.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/vdso/vextern.h 2010-07-07 09:04:49.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/vdso/vdso.lds.S linux-2.6.35.4/arch/x86/vdso/vdso.lds.S +--- linux-2.6.35.4/arch/x86/vdso/vdso.lds.S 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/vdso/vdso.lds.S 2010-09-17 20:12:09.000000000 -0400 +@@ -35,3 +35,9 @@ VDSO64_PRELINK = VDSO_PRELINK; + #define VEXTERN(x) VDSO64_ ## x = vdso_ ## x; + #include "vextern.h" + #undef VEXTERN ++ ++#define VEXTERN(x) VDSO64_ ## x = __vdso_ ## x; ++VEXTERN(fallback_gettimeofday) ++VEXTERN(fallback_time) ++VEXTERN(getcpu) ++#undef VEXTERN +diff -urNp linux-2.6.35.4/arch/x86/vdso/vextern.h linux-2.6.35.4/arch/x86/vdso/vextern.h +--- linux-2.6.35.4/arch/x86/vdso/vextern.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/vdso/vextern.h 2010-09-17 20:12:09.000000000 -0400 @@ -11,6 +11,5 @@ put into vextern.h and be referenced as a pointer with vdso prefix. The main kernel later fills in the values. */ @@ -19730,9 +20237,9 @@ diff -urNp linux-2.6.34.1/arch/x86/vdso/vextern.h linux-2.6.34.1/arch/x86/vdso/v -VEXTERN(jiffies) VEXTERN(vgetcpu_mode) VEXTERN(vsyscall_gtod_data) -diff -urNp linux-2.6.34.1/arch/x86/vdso/vma.c linux-2.6.34.1/arch/x86/vdso/vma.c ---- linux-2.6.34.1/arch/x86/vdso/vma.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/vdso/vma.c 2010-07-07 09:04:49.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/vdso/vma.c linux-2.6.35.4/arch/x86/vdso/vma.c +--- linux-2.6.35.4/arch/x86/vdso/vma.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/vdso/vma.c 2010-09-17 20:12:09.000000000 -0400 @@ -58,7 +58,7 @@ static int __init init_vdso_vars(void) if (!vbase) goto oom; @@ -19779,9 +20286,9 @@ diff -urNp linux-2.6.34.1/arch/x86/vdso/vma.c linux-2.6.34.1/arch/x86/vdso/vma.c - return 0; -} -__setup("vdso=", vdso_setup); -diff -urNp linux-2.6.34.1/arch/x86/xen/enlighten.c linux-2.6.34.1/arch/x86/xen/enlighten.c ---- linux-2.6.34.1/arch/x86/xen/enlighten.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/xen/enlighten.c 2010-07-07 09:04:49.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/xen/enlighten.c linux-2.6.35.4/arch/x86/xen/enlighten.c +--- linux-2.6.35.4/arch/x86/xen/enlighten.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/xen/enlighten.c 2010-09-17 20:12:09.000000000 -0400 @@ -74,8 +74,6 @@ EXPORT_SYMBOL_GPL(xen_start_info); struct shared_info xen_dummy_shared_info; @@ -19807,7 +20314,7 @@ diff -urNp linux-2.6.34.1/arch/x86/xen/enlighten.c linux-2.6.34.1/arch/x86/xen/e - x86_configure_nx(); +#if defined(CONFIG_X86_64) || defined(CONFIG_X86_PAE) + if ((cpuid_eax(0x80000000) & 0xffff0000) == 0x80000000 && -+ (cpuid_edx(0x80000001) & (1 << (X86_FEATURE_NX & 31)))) { ++ (cpuid_edx(0x80000001) & (1U << (X86_FEATURE_NX & 31)))) { + unsigned l, h; + + __supported_pte_mask |= _PAGE_NX; @@ -19833,9 +20340,9 @@ diff -urNp linux-2.6.34.1/arch/x86/xen/enlighten.c linux-2.6.34.1/arch/x86/xen/e xen_smp_init(); pgd = (pgd_t *)xen_start_info->pt_base; -diff -urNp linux-2.6.34.1/arch/x86/xen/mmu.c linux-2.6.34.1/arch/x86/xen/mmu.c ---- linux-2.6.34.1/arch/x86/xen/mmu.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/xen/mmu.c 2010-07-07 09:04:49.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/xen/mmu.c linux-2.6.35.4/arch/x86/xen/mmu.c +--- linux-2.6.35.4/arch/x86/xen/mmu.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/xen/mmu.c 2010-09-17 20:12:09.000000000 -0400 @@ -1694,6 +1694,8 @@ __init pgd_t *xen_setup_kernel_pagetable convert_pfn_mfn(init_level4_pgt); convert_pfn_mfn(level3_ident_pgt); @@ -19856,9 +20363,9 @@ diff -urNp linux-2.6.34.1/arch/x86/xen/mmu.c linux-2.6.34.1/arch/x86/xen/mmu.c set_page_prot(level2_kernel_pgt, PAGE_KERNEL_RO); set_page_prot(level2_fixmap_pgt, PAGE_KERNEL_RO); -diff -urNp linux-2.6.34.1/arch/x86/xen/smp.c linux-2.6.34.1/arch/x86/xen/smp.c ---- linux-2.6.34.1/arch/x86/xen/smp.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/xen/smp.c 2010-07-07 09:04:49.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/xen/smp.c linux-2.6.35.4/arch/x86/xen/smp.c +--- linux-2.6.35.4/arch/x86/xen/smp.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/xen/smp.c 2010-09-17 20:12:09.000000000 -0400 @@ -169,11 +169,6 @@ static void __init xen_smp_prepare_boot_ { BUG_ON(smp_processor_id() != 0); @@ -19882,9 +20389,9 @@ diff -urNp linux-2.6.34.1/arch/x86/xen/smp.c linux-2.6.34.1/arch/x86/xen/smp.c ctxt->user_regs.ss = __KERNEL_DS; #ifdef CONFIG_X86_32 ctxt->user_regs.fs = __KERNEL_PERCPU; -diff -urNp linux-2.6.34.1/arch/x86/xen/xen-head.S linux-2.6.34.1/arch/x86/xen/xen-head.S ---- linux-2.6.34.1/arch/x86/xen/xen-head.S 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/xen/xen-head.S 2010-07-07 09:04:49.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/xen/xen-head.S linux-2.6.35.4/arch/x86/xen/xen-head.S +--- linux-2.6.35.4/arch/x86/xen/xen-head.S 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/xen/xen-head.S 2010-09-17 20:12:09.000000000 -0400 @@ -19,6 +19,17 @@ ENTRY(startup_xen) #ifdef CONFIG_X86_32 mov %esi,xen_start_info @@ -19903,9 +20410,9 @@ diff -urNp linux-2.6.34.1/arch/x86/xen/xen-head.S linux-2.6.34.1/arch/x86/xen/xe #else mov %rsi,xen_start_info mov $init_thread_union+THREAD_SIZE,%rsp -diff -urNp linux-2.6.34.1/arch/x86/xen/xen-ops.h linux-2.6.34.1/arch/x86/xen/xen-ops.h ---- linux-2.6.34.1/arch/x86/xen/xen-ops.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/arch/x86/xen/xen-ops.h 2010-07-07 09:04:49.000000000 -0400 +diff -urNp linux-2.6.35.4/arch/x86/xen/xen-ops.h linux-2.6.35.4/arch/x86/xen/xen-ops.h +--- linux-2.6.35.4/arch/x86/xen/xen-ops.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/arch/x86/xen/xen-ops.h 2010-09-17 20:12:09.000000000 -0400 @@ -10,8 +10,6 @@ extern const char xen_hypervisor_callback[]; extern const char xen_failsafe_callback[]; @@ -19915,9 +20422,9 @@ diff -urNp linux-2.6.34.1/arch/x86/xen/xen-ops.h linux-2.6.34.1/arch/x86/xen/xen struct trap_info; void xen_copy_trap_info(struct trap_info *traps); -diff -urNp linux-2.6.34.1/block/blk-iopoll.c linux-2.6.34.1/block/blk-iopoll.c ---- linux-2.6.34.1/block/blk-iopoll.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/block/blk-iopoll.c 2010-07-07 09:04:49.000000000 -0400 +diff -urNp linux-2.6.35.4/block/blk-iopoll.c linux-2.6.35.4/block/blk-iopoll.c +--- linux-2.6.35.4/block/blk-iopoll.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/block/blk-iopoll.c 2010-09-17 20:12:09.000000000 -0400 @@ -77,7 +77,7 @@ void blk_iopoll_complete(struct blk_iopo } EXPORT_SYMBOL(blk_iopoll_complete); @@ -19927,9 +20434,9 @@ diff -urNp linux-2.6.34.1/block/blk-iopoll.c linux-2.6.34.1/block/blk-iopoll.c { struct list_head *list = &__get_cpu_var(blk_cpu_iopoll); int rearm = 0, budget = blk_iopoll_budget; -diff -urNp linux-2.6.34.1/block/blk-map.c linux-2.6.34.1/block/blk-map.c ---- linux-2.6.34.1/block/blk-map.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/block/blk-map.c 2010-07-07 09:04:49.000000000 -0400 +diff -urNp linux-2.6.35.4/block/blk-map.c linux-2.6.35.4/block/blk-map.c +--- linux-2.6.35.4/block/blk-map.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/block/blk-map.c 2010-09-17 20:12:09.000000000 -0400 @@ -54,7 +54,7 @@ static int __blk_rq_map_user(struct requ * direct dma. else, set up kernel bounce buffers */ @@ -19948,9 +20455,9 @@ diff -urNp linux-2.6.34.1/block/blk-map.c linux-2.6.34.1/block/blk-map.c if (do_copy) bio = bio_copy_kern(q, kbuf, len, gfp_mask, reading); else -diff -urNp linux-2.6.34.1/block/blk-softirq.c linux-2.6.34.1/block/blk-softirq.c ---- linux-2.6.34.1/block/blk-softirq.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/block/blk-softirq.c 2010-07-07 09:04:49.000000000 -0400 +diff -urNp linux-2.6.35.4/block/blk-softirq.c linux-2.6.35.4/block/blk-softirq.c +--- linux-2.6.35.4/block/blk-softirq.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/block/blk-softirq.c 2010-09-17 20:12:09.000000000 -0400 @@ -17,7 +17,7 @@ static DEFINE_PER_CPU(struct list_head, * Softirq action handler - move entries to local list and loop over them * while passing them to the queue registered handler. @@ -19960,9 +20467,9 @@ diff -urNp linux-2.6.34.1/block/blk-softirq.c linux-2.6.34.1/block/blk-softirq.c { struct list_head *cpu_list, local_list; -diff -urNp linux-2.6.34.1/crypto/lrw.c linux-2.6.34.1/crypto/lrw.c ---- linux-2.6.34.1/crypto/lrw.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/crypto/lrw.c 2010-07-07 09:04:49.000000000 -0400 +diff -urNp linux-2.6.35.4/crypto/lrw.c linux-2.6.35.4/crypto/lrw.c +--- linux-2.6.35.4/crypto/lrw.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/crypto/lrw.c 2010-09-17 20:12:09.000000000 -0400 @@ -60,7 +60,7 @@ static int setkey(struct crypto_tfm *par struct priv *ctx = crypto_tfm_ctx(parent); struct crypto_cipher *child = ctx->child; @@ -19972,9 +20479,173 @@ diff -urNp linux-2.6.34.1/crypto/lrw.c linux-2.6.34.1/crypto/lrw.c int bsize = crypto_cipher_blocksize(child); crypto_cipher_clear_flags(child, CRYPTO_TFM_REQ_MASK); -diff -urNp linux-2.6.34.1/drivers/acpi/battery.c linux-2.6.34.1/drivers/acpi/battery.c ---- linux-2.6.34.1/drivers/acpi/battery.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/acpi/battery.c 2010-07-07 09:04:50.000000000 -0400 +diff -urNp linux-2.6.35.4/Documentation/dontdiff linux-2.6.35.4/Documentation/dontdiff +--- linux-2.6.35.4/Documentation/dontdiff 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/Documentation/dontdiff 2010-09-17 20:12:09.000000000 -0400 +@@ -3,6 +3,7 @@ + *.bin + *.cpio + *.csp ++*.dbg + *.dsp + *.dvi + *.elf +@@ -38,8 +39,10 @@ + *.tab.h + *.tex + *.ver ++*.vim + *.xml + *_MODULES ++*_reg_safe.h + *_vga16.c + *~ + *.9 +@@ -49,11 +52,16 @@ + 53c700_d.h + CVS + ChangeSet ++GPATH ++GRTAGS ++GSYMS ++GTAGS + Image + Kerntypes + Module.markers + Module.symvers + PENDING ++PERF* + SCCS + System.map* + TAGS +@@ -76,7 +84,10 @@ btfixupprep + build + bvmlinux + bzImage* ++capflags.c + classlist.h* ++clut_vga16.c ++common-cmds.h + comp*.log + compile.h* + conf +@@ -100,19 +111,22 @@ fore200e_mkfirm + fore200e_pca_fw.c* + gconf + gen-devlist ++gen-kdb_cmds.c + gen_crc32table + gen_init_cpio + generated + genheaders + genksyms + *_gray256.c ++hash + ihex2fw + ikconfig.h* ++inat-tables.c + initramfs_data.cpio ++initramfs_data.cpio.bz2 + initramfs_data.cpio.gz + initramfs_list + kallsyms +-kconfig + keywords.c + ksym.c* + ksym.h* +@@ -136,10 +150,13 @@ mkboot + mkbugboot + mkcpustr + mkdep ++mkpiggy + mkprep ++mkregtable + mktables + mktree + modpost ++modules.builtin + modules.order + modversions.h* + ncscope.* +@@ -151,7 +168,9 @@ parse.h + patches* + pca200e.bin + pca200e_ecd.bin2 ++perf-archive + piggy.gz ++piggy.S + piggyback + pnmtologo + ppc_defs.h* +@@ -160,12 +179,14 @@ qconf + raid6altivec*.c + raid6int*.c + raid6tables.c ++regdb.c + relocs + series + setup + setup.bin + setup.elf + sImage ++slabinfo + sm_tbl* + split-include + syscalltab.h +@@ -189,14 +210,20 @@ version.h* + vmlinux + vmlinux-* + vmlinux.aout ++vmlinux.bin.all ++vmlinux.bin.bz2 + vmlinux.lds ++vmlinux.relocs ++voffset.h + vsyscall.lds + vsyscall_32.lds + wanxlfw.inc + uImage + unifdef ++utsrelease.h + wakeup.bin + wakeup.elf + wakeup.lds + zImage* + zconf.hash.c ++zoffset.h +diff -urNp linux-2.6.35.4/Documentation/filesystems/sysfs.txt linux-2.6.35.4/Documentation/filesystems/sysfs.txt +--- linux-2.6.35.4/Documentation/filesystems/sysfs.txt 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/Documentation/filesystems/sysfs.txt 2010-09-17 20:12:09.000000000 -0400 +@@ -123,8 +123,8 @@ set of sysfs operations for forwarding r + show and store methods of the attribute owners. + + struct sysfs_ops { +- ssize_t (*show)(struct kobject *, struct attribute *, char *); +- ssize_t (*store)(struct kobject *, struct attribute *, const char *); ++ ssize_t (* const show)(struct kobject *, struct attribute *, char *); ++ ssize_t (* const store)(struct kobject *, struct attribute *, const char *); + }; + + [ Subsystems should have already defined a struct kobj_type as a +diff -urNp linux-2.6.35.4/Documentation/kernel-parameters.txt linux-2.6.35.4/Documentation/kernel-parameters.txt +--- linux-2.6.35.4/Documentation/kernel-parameters.txt 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/Documentation/kernel-parameters.txt 2010-09-17 20:12:09.000000000 -0400 +@@ -1910,6 +1910,12 @@ and is between 256 and 4096 characters. + the specified number of seconds. This is to be used if + your oopses keep scrolling off the screen. + ++ pax_nouderef [X86-32] disables UDEREF. Most likely needed under certain ++ virtualization environments that don't cope well with the ++ expand down segment used by UDEREF on X86-32. ++ ++ pax_softmode= [X86-32] 0/1 to disable/enable PaX softmode on boot already. ++ + pcbit= [HW,ISDN] + + pcd. [PARIDE] +diff -urNp linux-2.6.35.4/drivers/acpi/battery.c linux-2.6.35.4/drivers/acpi/battery.c +--- linux-2.6.35.4/drivers/acpi/battery.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/acpi/battery.c 2010-09-17 20:12:09.000000000 -0400 @@ -810,7 +810,7 @@ DECLARE_FILE_FUNCTIONS(alarm); } @@ -19984,9 +20655,9 @@ diff -urNp linux-2.6.34.1/drivers/acpi/battery.c linux-2.6.34.1/drivers/acpi/bat mode_t mode; const char *name; } acpi_battery_file[] = { -diff -urNp linux-2.6.34.1/drivers/acpi/blacklist.c linux-2.6.34.1/drivers/acpi/blacklist.c ---- linux-2.6.34.1/drivers/acpi/blacklist.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/acpi/blacklist.c 2010-07-07 09:04:50.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/acpi/blacklist.c linux-2.6.35.4/drivers/acpi/blacklist.c +--- linux-2.6.35.4/drivers/acpi/blacklist.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/acpi/blacklist.c 2010-09-17 20:12:09.000000000 -0400 @@ -73,7 +73,7 @@ static struct acpi_blacklist_item acpi_b {"IBM ", "TP600E ", 0x00000105, ACPI_SIG_DSDT, less_than_or_equal, "Incorrect _ADR", 1}, @@ -19996,9 +20667,9 @@ diff -urNp linux-2.6.34.1/drivers/acpi/blacklist.c linux-2.6.34.1/drivers/acpi/b }; #if CONFIG_ACPI_BLACKLIST_YEAR -diff -urNp linux-2.6.34.1/drivers/acpi/dock.c linux-2.6.34.1/drivers/acpi/dock.c ---- linux-2.6.34.1/drivers/acpi/dock.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/acpi/dock.c 2010-07-07 09:04:50.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/acpi/dock.c linux-2.6.35.4/drivers/acpi/dock.c +--- linux-2.6.35.4/drivers/acpi/dock.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/acpi/dock.c 2010-09-17 20:12:09.000000000 -0400 @@ -77,7 +77,7 @@ struct dock_dependent_device { struct list_head list; struct list_head hotplug_list; @@ -20017,9 +20688,9 @@ diff -urNp linux-2.6.34.1/drivers/acpi/dock.c linux-2.6.34.1/drivers/acpi/dock.c void *context) { struct dock_dependent_device *dd; -diff -urNp linux-2.6.34.1/drivers/acpi/osl.c linux-2.6.34.1/drivers/acpi/osl.c ---- linux-2.6.34.1/drivers/acpi/osl.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/acpi/osl.c 2010-07-07 09:04:50.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/acpi/osl.c linux-2.6.35.4/drivers/acpi/osl.c +--- linux-2.6.35.4/drivers/acpi/osl.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/acpi/osl.c 2010-09-17 20:12:09.000000000 -0400 @@ -523,6 +523,8 @@ acpi_os_read_memory(acpi_physical_addres void __iomem *virt_addr; @@ -20038,9 +20709,9 @@ diff -urNp linux-2.6.34.1/drivers/acpi/osl.c linux-2.6.34.1/drivers/acpi/osl.c switch (width) { case 8: -diff -urNp linux-2.6.34.1/drivers/acpi/power_meter.c linux-2.6.34.1/drivers/acpi/power_meter.c ---- linux-2.6.34.1/drivers/acpi/power_meter.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/acpi/power_meter.c 2010-07-07 09:04:50.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/acpi/power_meter.c linux-2.6.35.4/drivers/acpi/power_meter.c +--- linux-2.6.35.4/drivers/acpi/power_meter.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/acpi/power_meter.c 2010-09-17 20:12:09.000000000 -0400 @@ -316,8 +316,6 @@ static ssize_t set_trip(struct device *d return res; @@ -20050,9 +20721,9 @@ diff -urNp linux-2.6.34.1/drivers/acpi/power_meter.c linux-2.6.34.1/drivers/acpi mutex_lock(&resource->lock); resource->trip[attr->index - 7] = temp; -diff -urNp linux-2.6.34.1/drivers/acpi/proc.c linux-2.6.34.1/drivers/acpi/proc.c ---- linux-2.6.34.1/drivers/acpi/proc.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/acpi/proc.c 2010-07-07 09:04:50.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/acpi/proc.c linux-2.6.35.4/drivers/acpi/proc.c +--- linux-2.6.35.4/drivers/acpi/proc.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/acpi/proc.c 2010-09-17 20:12:09.000000000 -0400 @@ -391,20 +391,15 @@ acpi_system_write_wakeup_device(struct f size_t count, loff_t * ppos) { @@ -20088,22 +20759,22 @@ diff -urNp linux-2.6.34.1/drivers/acpi/proc.c linux-2.6.34.1/drivers/acpi/proc.c dev->wakeup.state.enabled = dev->wakeup.state.enabled ? 0 : 1; found_dev = dev; -diff -urNp linux-2.6.34.1/drivers/acpi/processor_driver.c linux-2.6.34.1/drivers/acpi/processor_driver.c ---- linux-2.6.34.1/drivers/acpi/processor_driver.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/acpi/processor_driver.c 2010-07-07 09:04:50.000000000 -0400 -@@ -581,7 +581,7 @@ static int __cpuinit acpi_processor_add( +diff -urNp linux-2.6.35.4/drivers/acpi/processor_driver.c linux-2.6.35.4/drivers/acpi/processor_driver.c +--- linux-2.6.35.4/drivers/acpi/processor_driver.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/acpi/processor_driver.c 2010-09-17 20:12:09.000000000 -0400 +@@ -586,7 +586,7 @@ static int __cpuinit acpi_processor_add( return 0; - } + #endif - BUG_ON((pr->id >= nr_cpu_ids) || (pr->id < 0)); + BUG_ON(pr->id >= nr_cpu_ids); /* * Buggy BIOS check -diff -urNp linux-2.6.34.1/drivers/acpi/processor_idle.c linux-2.6.34.1/drivers/acpi/processor_idle.c ---- linux-2.6.34.1/drivers/acpi/processor_idle.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/acpi/processor_idle.c 2010-07-07 09:04:50.000000000 -0400 -@@ -119,7 +119,7 @@ static struct dmi_system_id __cpuinitdat +diff -urNp linux-2.6.35.4/drivers/acpi/processor_idle.c linux-2.6.35.4/drivers/acpi/processor_idle.c +--- linux-2.6.35.4/drivers/acpi/processor_idle.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/acpi/processor_idle.c 2010-09-17 20:12:09.000000000 -0400 +@@ -124,7 +124,7 @@ static struct dmi_system_id __cpuinitdat DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK Computer Inc."), DMI_MATCH(DMI_PRODUCT_NAME,"L8400B series Notebook PC")}, (void *)1}, @@ -20112,10 +20783,10 @@ diff -urNp linux-2.6.34.1/drivers/acpi/processor_idle.c linux-2.6.34.1/drivers/a }; -diff -urNp linux-2.6.34.1/drivers/acpi/sleep.c linux-2.6.34.1/drivers/acpi/sleep.c ---- linux-2.6.34.1/drivers/acpi/sleep.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/acpi/sleep.c 2010-07-07 09:04:50.000000000 -0400 -@@ -302,7 +302,7 @@ static int acpi_suspend_state_valid(susp +diff -urNp linux-2.6.35.4/drivers/acpi/sleep.c linux-2.6.35.4/drivers/acpi/sleep.c +--- linux-2.6.35.4/drivers/acpi/sleep.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/acpi/sleep.c 2010-09-17 20:12:09.000000000 -0400 +@@ -318,7 +318,7 @@ static int acpi_suspend_state_valid(susp } } @@ -20124,7 +20795,7 @@ diff -urNp linux-2.6.34.1/drivers/acpi/sleep.c linux-2.6.34.1/drivers/acpi/sleep .valid = acpi_suspend_state_valid, .begin = acpi_suspend_begin, .prepare_late = acpi_pm_prepare, -@@ -330,7 +330,7 @@ static int acpi_suspend_begin_old(suspen +@@ -346,7 +346,7 @@ static int acpi_suspend_begin_old(suspen * The following callbacks are used if the pre-ACPI 2.0 suspend ordering has * been requested. */ @@ -20132,8 +20803,8 @@ diff -urNp linux-2.6.34.1/drivers/acpi/sleep.c linux-2.6.34.1/drivers/acpi/sleep +static const struct platform_suspend_ops acpi_suspend_ops_old = { .valid = acpi_suspend_state_valid, .begin = acpi_suspend_begin_old, - .prepare_late = acpi_pm_disable_gpes, -@@ -622,7 +622,7 @@ static void acpi_pm_restore_cleanup(void + .prepare_late = acpi_pm_freeze, +@@ -478,7 +478,7 @@ static void acpi_pm_thaw(void) acpi_enable_all_runtime_gpes(); } @@ -20142,7 +20813,7 @@ diff -urNp linux-2.6.34.1/drivers/acpi/sleep.c linux-2.6.34.1/drivers/acpi/sleep .begin = acpi_hibernation_begin, .end = acpi_pm_end, .pre_snapshot = acpi_hibernation_pre_snapshot, -@@ -675,7 +675,7 @@ static int acpi_hibernation_pre_snapshot +@@ -528,7 +528,7 @@ static int acpi_hibernation_pre_snapshot * The following callbacks are used if the pre-ACPI 2.0 suspend ordering has * been requested. */ @@ -20151,10 +20822,10 @@ diff -urNp linux-2.6.34.1/drivers/acpi/sleep.c linux-2.6.34.1/drivers/acpi/sleep .begin = acpi_hibernation_begin_old, .end = acpi_pm_end, .pre_snapshot = acpi_hibernation_pre_snapshot_old, -diff -urNp linux-2.6.34.1/drivers/acpi/video.c linux-2.6.34.1/drivers/acpi/video.c ---- linux-2.6.34.1/drivers/acpi/video.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/acpi/video.c 2010-07-07 09:04:50.000000000 -0400 -@@ -367,7 +367,7 @@ static int acpi_video_set_brightness(str +diff -urNp linux-2.6.35.4/drivers/acpi/video.c linux-2.6.35.4/drivers/acpi/video.c +--- linux-2.6.35.4/drivers/acpi/video.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/acpi/video.c 2010-09-17 20:12:09.000000000 -0400 +@@ -363,7 +363,7 @@ static int acpi_video_set_brightness(str vd->brightness->levels[request_level]); } @@ -20163,21 +20834,12 @@ diff -urNp linux-2.6.34.1/drivers/acpi/video.c linux-2.6.34.1/drivers/acpi/video .get_brightness = acpi_video_get_brightness, .update_status = acpi_video_set_brightness, }; -diff -urNp linux-2.6.34.1/drivers/ata/ahci.c linux-2.6.34.1/drivers/ata/ahci.c ---- linux-2.6.34.1/drivers/ata/ahci.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ata/ahci.c 2010-07-07 09:04:50.000000000 -0400 -@@ -407,7 +407,7 @@ static struct scsi_host_template ahci_sh - .sdev_attrs = ahci_sdev_attrs, - }; - --static struct ata_port_operations ahci_ops = { -+static const struct ata_port_operations ahci_ops = { - .inherits = &sata_pmp_port_ops, - - .qc_defer = ahci_pmp_qc_defer, -@@ -444,17 +444,17 @@ static struct ata_port_operations ahci_o - .port_stop = ahci_port_stop, - }; +diff -urNp linux-2.6.35.4/drivers/ata/ahci.c linux-2.6.35.4/drivers/ata/ahci.c +--- linux-2.6.35.4/drivers/ata/ahci.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ata/ahci.c 2010-09-17 20:12:09.000000000 -0400 +@@ -89,17 +89,17 @@ static int ahci_pci_device_suspend(struc + static int ahci_pci_device_resume(struct pci_dev *pdev); + #endif -static struct ata_port_operations ahci_vt8251_ops = { +static const struct ata_port_operations ahci_vt8251_ops = { @@ -20196,7 +20858,7 @@ diff -urNp linux-2.6.34.1/drivers/ata/ahci.c linux-2.6.34.1/drivers/ata/ahci.c .inherits = &ahci_ops, .softreset = ahci_sb600_softreset, .pmp_softreset = ahci_sb600_softreset, -@@ -722,7 +722,7 @@ static const struct pci_device_id ahci_p +@@ -370,7 +370,7 @@ static const struct pci_device_id ahci_p { PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_STORAGE_SATA_AHCI, 0xffffff, board_ahci }, @@ -20205,10 +20867,22 @@ diff -urNp linux-2.6.34.1/drivers/ata/ahci.c linux-2.6.34.1/drivers/ata/ahci.c }; -diff -urNp linux-2.6.34.1/drivers/ata/ata_generic.c linux-2.6.34.1/drivers/ata/ata_generic.c ---- linux-2.6.34.1/drivers/ata/ata_generic.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ata/ata_generic.c 2010-07-07 09:04:50.000000000 -0400 -@@ -95,7 +95,7 @@ static struct scsi_host_template generic +diff -urNp linux-2.6.35.4/drivers/ata/ahci.h linux-2.6.35.4/drivers/ata/ahci.h +--- linux-2.6.35.4/drivers/ata/ahci.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ata/ahci.h 2010-09-17 20:12:09.000000000 -0400 +@@ -298,7 +298,7 @@ struct ahci_host_priv { + extern int ahci_ignore_sss; + + extern struct scsi_host_template ahci_sht; +-extern struct ata_port_operations ahci_ops; ++extern const struct ata_port_operations ahci_ops; + + void ahci_save_initial_config(struct device *dev, + struct ahci_host_priv *hpriv, +diff -urNp linux-2.6.35.4/drivers/ata/ata_generic.c linux-2.6.35.4/drivers/ata/ata_generic.c +--- linux-2.6.35.4/drivers/ata/ata_generic.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ata/ata_generic.c 2010-09-17 20:12:09.000000000 -0400 +@@ -104,7 +104,7 @@ static struct scsi_host_template generic ATA_BMDMA_SHT(DRV_NAME), }; @@ -20217,10 +20891,10 @@ diff -urNp linux-2.6.34.1/drivers/ata/ata_generic.c linux-2.6.34.1/drivers/ata/a .inherits = &ata_bmdma_port_ops, .cable_detect = ata_cable_unknown, .set_mode = generic_set_mode, -diff -urNp linux-2.6.34.1/drivers/ata/ata_piix.c linux-2.6.34.1/drivers/ata/ata_piix.c ---- linux-2.6.34.1/drivers/ata/ata_piix.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ata/ata_piix.c 2010-07-07 09:04:50.000000000 -0400 -@@ -301,7 +301,7 @@ static const struct pci_device_id piix_p +diff -urNp linux-2.6.35.4/drivers/ata/ata_piix.c linux-2.6.35.4/drivers/ata/ata_piix.c +--- linux-2.6.35.4/drivers/ata/ata_piix.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ata/ata_piix.c 2010-09-17 20:12:09.000000000 -0400 +@@ -302,7 +302,7 @@ static const struct pci_device_id piix_p { 0x8086, 0x1c08, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata }, /* SATA Controller IDE (CPT) */ { 0x8086, 0x1c09, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata }, @@ -20229,7 +20903,7 @@ diff -urNp linux-2.6.34.1/drivers/ata/ata_piix.c linux-2.6.34.1/drivers/ata/ata_ }; static struct pci_driver piix_pci_driver = { -@@ -319,12 +319,12 @@ static struct scsi_host_template piix_sh +@@ -320,12 +320,12 @@ static struct scsi_host_template piix_sh ATA_BMDMA_SHT(DRV_NAME), }; @@ -20244,7 +20918,7 @@ diff -urNp linux-2.6.34.1/drivers/ata/ata_piix.c linux-2.6.34.1/drivers/ata/ata_ .inherits = &piix_sata_ops, .cable_detect = ata_cable_40wire, .set_piomode = piix_set_piomode, -@@ -332,18 +332,18 @@ static struct ata_port_operations piix_p +@@ -333,18 +333,18 @@ static struct ata_port_operations piix_p .prereset = piix_pata_prereset, }; @@ -20266,7 +20940,7 @@ diff -urNp linux-2.6.34.1/drivers/ata/ata_piix.c linux-2.6.34.1/drivers/ata/ata_ .inherits = &piix_sata_ops, .hardreset = sata_std_hardreset, .scr_read = piix_sidpr_scr_read, -@@ -619,7 +619,7 @@ static const struct ich_laptop ich_lapto +@@ -620,7 +620,7 @@ static const struct ich_laptop ich_lapto { 0x2653, 0x1043, 0x82D8 }, /* ICH6M on Asus Eee 701 */ { 0x27df, 0x104d, 0x900e }, /* ICH7 on Sony TZ-90 */ /* end marker */ @@ -20275,7 +20949,7 @@ diff -urNp linux-2.6.34.1/drivers/ata/ata_piix.c linux-2.6.34.1/drivers/ata/ata_ }; /** -@@ -1105,7 +1105,7 @@ static int piix_broken_suspend(void) +@@ -1112,7 +1112,7 @@ static int piix_broken_suspend(void) }, }, @@ -20284,9 +20958,21 @@ diff -urNp linux-2.6.34.1/drivers/ata/ata_piix.c linux-2.6.34.1/drivers/ata/ata_ }; static const char *oemstrs[] = { "Tecra M3,", -diff -urNp linux-2.6.34.1/drivers/ata/libata-acpi.c linux-2.6.34.1/drivers/ata/libata-acpi.c ---- linux-2.6.34.1/drivers/ata/libata-acpi.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ata/libata-acpi.c 2010-07-07 09:04:50.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/ata/libahci.c linux-2.6.35.4/drivers/ata/libahci.c +--- linux-2.6.35.4/drivers/ata/libahci.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ata/libahci.c 2010-09-17 20:12:09.000000000 -0400 +@@ -149,7 +149,7 @@ struct scsi_host_template ahci_sht = { + }; + EXPORT_SYMBOL_GPL(ahci_sht); + +-struct ata_port_operations ahci_ops = { ++const struct ata_port_operations ahci_ops = { + .inherits = &sata_pmp_port_ops, + + .qc_defer = ahci_pmp_qc_defer, +diff -urNp linux-2.6.35.4/drivers/ata/libata-acpi.c linux-2.6.35.4/drivers/ata/libata-acpi.c +--- linux-2.6.35.4/drivers/ata/libata-acpi.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ata/libata-acpi.c 2010-09-17 20:12:09.000000000 -0400 @@ -224,12 +224,12 @@ static void ata_acpi_dev_uevent(acpi_han ata_acpi_uevent(dev->link->ap, dev, event); } @@ -20302,9 +20988,9 @@ diff -urNp linux-2.6.34.1/drivers/ata/libata-acpi.c linux-2.6.34.1/drivers/ata/l .handler = ata_acpi_ap_notify_dock, .uevent = ata_acpi_ap_uevent, }; -diff -urNp linux-2.6.34.1/drivers/ata/libata-core.c linux-2.6.34.1/drivers/ata/libata-core.c ---- linux-2.6.34.1/drivers/ata/libata-core.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ata/libata-core.c 2010-07-07 09:04:50.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/ata/libata-core.c linux-2.6.35.4/drivers/ata/libata-core.c +--- linux-2.6.35.4/drivers/ata/libata-core.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ata/libata-core.c 2010-09-17 20:12:09.000000000 -0400 @@ -901,7 +901,7 @@ static const struct ata_xfer_ent { { ATA_SHIFT_PIO, ATA_NR_PIO_MODES, XFER_PIO_0 }, { ATA_SHIFT_MWDMA, ATA_NR_MWDMA_MODES, XFER_MW_DMA_0 }, @@ -20314,7 +21000,7 @@ diff -urNp linux-2.6.34.1/drivers/ata/libata-core.c linux-2.6.34.1/drivers/ata/l }; /** -@@ -3170,7 +3170,7 @@ static const struct ata_timing ata_timin +@@ -3073,7 +3073,7 @@ static const struct ata_timing ata_timin { XFER_UDMA_5, 0, 0, 0, 0, 0, 0, 0, 0, 20 }, { XFER_UDMA_6, 0, 0, 0, 0, 0, 0, 0, 0, 15 }, @@ -20323,7 +21009,7 @@ diff -urNp linux-2.6.34.1/drivers/ata/libata-core.c linux-2.6.34.1/drivers/ata/l }; #define ENOUGH(v, unit) (((v)-1)/(unit)+1) -@@ -4415,7 +4415,7 @@ static const struct ata_blacklist_entry +@@ -4323,7 +4323,7 @@ static const struct ata_blacklist_entry { "PIONEER DVD-RW DVRTD08", "1.00", ATA_HORKAGE_NOSETXFER }, /* End Marker */ @@ -20332,7 +21018,7 @@ diff -urNp linux-2.6.34.1/drivers/ata/libata-core.c linux-2.6.34.1/drivers/ata/l }; static int strn_pattern_cmp(const char *patt, const char *name, int wildchar) -@@ -5991,7 +5991,7 @@ static void ata_host_stop(struct device +@@ -5869,7 +5869,7 @@ static void ata_host_stop(struct device * LOCKING: * None. */ @@ -20341,7 +21027,7 @@ diff -urNp linux-2.6.34.1/drivers/ata/libata-core.c linux-2.6.34.1/drivers/ata/l { static DEFINE_SPINLOCK(lock); const struct ata_port_operations *cur; -@@ -6003,6 +6003,7 @@ static void ata_finalize_port_ops(struct +@@ -5881,6 +5881,7 @@ static void ata_finalize_port_ops(struct return; spin_lock(&lock); @@ -20349,7 +21035,7 @@ diff -urNp linux-2.6.34.1/drivers/ata/libata-core.c linux-2.6.34.1/drivers/ata/l for (cur = ops->inherits; cur; cur = cur->inherits) { void **inherit = (void **)cur; -@@ -6016,8 +6017,9 @@ static void ata_finalize_port_ops(struct +@@ -5894,8 +5895,9 @@ static void ata_finalize_port_ops(struct if (IS_ERR(*pp)) *pp = NULL; @@ -20360,7 +21046,7 @@ diff -urNp linux-2.6.34.1/drivers/ata/libata-core.c linux-2.6.34.1/drivers/ata/l spin_unlock(&lock); } -@@ -6114,7 +6116,7 @@ int ata_host_start(struct ata_host *host +@@ -5992,7 +5994,7 @@ int ata_host_start(struct ata_host *host */ /* KILLME - the only user left is ipr */ void ata_host_init(struct ata_host *host, struct device *dev, @@ -20369,7 +21055,7 @@ diff -urNp linux-2.6.34.1/drivers/ata/libata-core.c linux-2.6.34.1/drivers/ata/l { spin_lock_init(&host->lock); host->dev = dev; -@@ -6784,7 +6786,7 @@ static void ata_dummy_error_handler(stru +@@ -6642,7 +6644,7 @@ static void ata_dummy_error_handler(stru /* truly dummy */ } @@ -20378,9 +21064,9 @@ diff -urNp linux-2.6.34.1/drivers/ata/libata-core.c linux-2.6.34.1/drivers/ata/l .qc_prep = ata_noop_qc_prep, .qc_issue = ata_dummy_qc_issue, .error_handler = ata_dummy_error_handler, -diff -urNp linux-2.6.34.1/drivers/ata/libata-eh.c linux-2.6.34.1/drivers/ata/libata-eh.c ---- linux-2.6.34.1/drivers/ata/libata-eh.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ata/libata-eh.c 2010-07-07 09:04:50.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/ata/libata-eh.c linux-2.6.35.4/drivers/ata/libata-eh.c +--- linux-2.6.35.4/drivers/ata/libata-eh.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ata/libata-eh.c 2010-09-17 20:12:09.000000000 -0400 @@ -3680,7 +3680,7 @@ void ata_do_eh(struct ata_port *ap, ata_ */ void ata_std_error_handler(struct ata_port *ap) @@ -20390,10 +21076,10 @@ diff -urNp linux-2.6.34.1/drivers/ata/libata-eh.c linux-2.6.34.1/drivers/ata/lib ata_reset_fn_t hardreset = ops->hardreset; /* ignore built-in hardreset if SCR access is not available */ -diff -urNp linux-2.6.34.1/drivers/ata/libata-pmp.c linux-2.6.34.1/drivers/ata/libata-pmp.c ---- linux-2.6.34.1/drivers/ata/libata-pmp.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ata/libata-pmp.c 2010-07-07 09:04:50.000000000 -0400 -@@ -842,7 +842,7 @@ static int sata_pmp_handle_link_fail(str +diff -urNp linux-2.6.35.4/drivers/ata/libata-pmp.c linux-2.6.35.4/drivers/ata/libata-pmp.c +--- linux-2.6.35.4/drivers/ata/libata-pmp.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ata/libata-pmp.c 2010-09-17 20:12:09.000000000 -0400 +@@ -868,7 +868,7 @@ static int sata_pmp_handle_link_fail(str */ static int sata_pmp_eh_recover(struct ata_port *ap) { @@ -20402,9 +21088,9 @@ diff -urNp linux-2.6.34.1/drivers/ata/libata-pmp.c linux-2.6.34.1/drivers/ata/li int pmp_tries, link_tries[SATA_PMP_MAX_PORTS]; struct ata_link *pmp_link = &ap->link; struct ata_device *pmp_dev = pmp_link->device; -diff -urNp linux-2.6.34.1/drivers/ata/pata_acpi.c linux-2.6.34.1/drivers/ata/pata_acpi.c ---- linux-2.6.34.1/drivers/ata/pata_acpi.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ata/pata_acpi.c 2010-07-07 09:04:50.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/ata/pata_acpi.c linux-2.6.35.4/drivers/ata/pata_acpi.c +--- linux-2.6.35.4/drivers/ata/pata_acpi.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ata/pata_acpi.c 2010-09-17 20:12:09.000000000 -0400 @@ -216,7 +216,7 @@ static struct scsi_host_template pacpi_s ATA_BMDMA_SHT(DRV_NAME), }; @@ -20414,9 +21100,9 @@ diff -urNp linux-2.6.34.1/drivers/ata/pata_acpi.c linux-2.6.34.1/drivers/ata/pat .inherits = &ata_bmdma_port_ops, .qc_issue = pacpi_qc_issue, .cable_detect = pacpi_cable_detect, -diff -urNp linux-2.6.34.1/drivers/ata/pata_ali.c linux-2.6.34.1/drivers/ata/pata_ali.c ---- linux-2.6.34.1/drivers/ata/pata_ali.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ata/pata_ali.c 2010-07-07 09:04:50.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/ata/pata_ali.c linux-2.6.35.4/drivers/ata/pata_ali.c +--- linux-2.6.35.4/drivers/ata/pata_ali.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ata/pata_ali.c 2010-09-17 20:12:09.000000000 -0400 @@ -363,7 +363,7 @@ static struct scsi_host_template ali_sht * Port operations for PIO only ALi */ @@ -20462,9 +21148,9 @@ diff -urNp linux-2.6.34.1/drivers/ata/pata_ali.c linux-2.6.34.1/drivers/ata/pata .inherits = &ali_dma_base_ops, .check_atapi_dma = ali_check_atapi_dma, .dev_config = ali_warn_atapi_dma, -diff -urNp linux-2.6.34.1/drivers/ata/pata_amd.c linux-2.6.34.1/drivers/ata/pata_amd.c ---- linux-2.6.34.1/drivers/ata/pata_amd.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ata/pata_amd.c 2010-07-07 09:04:50.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/ata/pata_amd.c linux-2.6.35.4/drivers/ata/pata_amd.c +--- linux-2.6.35.4/drivers/ata/pata_amd.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ata/pata_amd.c 2010-09-17 20:12:09.000000000 -0400 @@ -397,28 +397,28 @@ static const struct ata_port_operations .prereset = amd_pre_reset, }; @@ -20514,9 +21200,9 @@ diff -urNp linux-2.6.34.1/drivers/ata/pata_amd.c linux-2.6.34.1/drivers/ata/pata .inherits = &nv_base_port_ops, .set_piomode = nv133_set_piomode, .set_dmamode = nv133_set_dmamode, -diff -urNp linux-2.6.34.1/drivers/ata/pata_artop.c linux-2.6.34.1/drivers/ata/pata_artop.c ---- linux-2.6.34.1/drivers/ata/pata_artop.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ata/pata_artop.c 2010-07-07 09:04:50.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/ata/pata_artop.c linux-2.6.35.4/drivers/ata/pata_artop.c +--- linux-2.6.35.4/drivers/ata/pata_artop.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ata/pata_artop.c 2010-09-17 20:12:09.000000000 -0400 @@ -311,7 +311,7 @@ static struct scsi_host_template artop_s ATA_BMDMA_SHT(DRV_NAME), }; @@ -20535,9 +21221,9 @@ diff -urNp linux-2.6.34.1/drivers/ata/pata_artop.c linux-2.6.34.1/drivers/ata/pa .inherits = &ata_bmdma_port_ops, .cable_detect = artop6260_cable_detect, .set_piomode = artop6260_set_piomode, -diff -urNp linux-2.6.34.1/drivers/ata/pata_at32.c linux-2.6.34.1/drivers/ata/pata_at32.c ---- linux-2.6.34.1/drivers/ata/pata_at32.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ata/pata_at32.c 2010-07-07 09:04:50.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/ata/pata_at32.c linux-2.6.35.4/drivers/ata/pata_at32.c +--- linux-2.6.35.4/drivers/ata/pata_at32.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ata/pata_at32.c 2010-09-17 20:12:09.000000000 -0400 @@ -173,7 +173,7 @@ static struct scsi_host_template at32_sh ATA_PIO_SHT(DRV_NAME), }; @@ -20547,9 +21233,9 @@ diff -urNp linux-2.6.34.1/drivers/ata/pata_at32.c linux-2.6.34.1/drivers/ata/pat .inherits = &ata_sff_port_ops, .cable_detect = ata_cable_40wire, .set_piomode = pata_at32_set_piomode, -diff -urNp linux-2.6.34.1/drivers/ata/pata_at91.c linux-2.6.34.1/drivers/ata/pata_at91.c ---- linux-2.6.34.1/drivers/ata/pata_at91.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ata/pata_at91.c 2010-07-07 09:04:50.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/ata/pata_at91.c linux-2.6.35.4/drivers/ata/pata_at91.c +--- linux-2.6.35.4/drivers/ata/pata_at91.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ata/pata_at91.c 2010-09-17 20:12:09.000000000 -0400 @@ -196,7 +196,7 @@ static struct scsi_host_template pata_at ATA_PIO_SHT(DRV_NAME), }; @@ -20559,9 +21245,9 @@ diff -urNp linux-2.6.34.1/drivers/ata/pata_at91.c linux-2.6.34.1/drivers/ata/pat .inherits = &ata_sff_port_ops, .sff_data_xfer = pata_at91_data_xfer_noirq, -diff -urNp linux-2.6.34.1/drivers/ata/pata_atiixp.c linux-2.6.34.1/drivers/ata/pata_atiixp.c ---- linux-2.6.34.1/drivers/ata/pata_atiixp.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ata/pata_atiixp.c 2010-07-07 09:04:50.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/ata/pata_atiixp.c linux-2.6.35.4/drivers/ata/pata_atiixp.c +--- linux-2.6.35.4/drivers/ata/pata_atiixp.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ata/pata_atiixp.c 2010-09-17 20:12:09.000000000 -0400 @@ -214,7 +214,7 @@ static struct scsi_host_template atiixp_ .sg_tablesize = LIBATA_DUMB_MAX_PRD, }; @@ -20570,10 +21256,10 @@ diff -urNp linux-2.6.34.1/drivers/ata/pata_atiixp.c linux-2.6.34.1/drivers/ata/p +static const struct ata_port_operations atiixp_port_ops = { .inherits = &ata_bmdma_port_ops, - .qc_prep = ata_sff_dumb_qc_prep, -diff -urNp linux-2.6.34.1/drivers/ata/pata_atp867x.c linux-2.6.34.1/drivers/ata/pata_atp867x.c ---- linux-2.6.34.1/drivers/ata/pata_atp867x.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ata/pata_atp867x.c 2010-07-07 09:04:50.000000000 -0400 + .qc_prep = ata_bmdma_dumb_qc_prep, +diff -urNp linux-2.6.35.4/drivers/ata/pata_atp867x.c linux-2.6.35.4/drivers/ata/pata_atp867x.c +--- linux-2.6.35.4/drivers/ata/pata_atp867x.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ata/pata_atp867x.c 2010-09-17 20:12:09.000000000 -0400 @@ -275,7 +275,7 @@ static struct scsi_host_template atp867x ATA_BMDMA_SHT(DRV_NAME), }; @@ -20583,33 +21269,33 @@ diff -urNp linux-2.6.34.1/drivers/ata/pata_atp867x.c linux-2.6.34.1/drivers/ata/ .inherits = &ata_bmdma_port_ops, .cable_detect = atp867x_cable_detect, .set_piomode = atp867x_set_piomode, -diff -urNp linux-2.6.34.1/drivers/ata/pata_bf54x.c linux-2.6.34.1/drivers/ata/pata_bf54x.c ---- linux-2.6.34.1/drivers/ata/pata_bf54x.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ata/pata_bf54x.c 2010-07-07 09:04:50.000000000 -0400 -@@ -1464,7 +1464,7 @@ static struct scsi_host_template bfin_sh +diff -urNp linux-2.6.35.4/drivers/ata/pata_bf54x.c linux-2.6.35.4/drivers/ata/pata_bf54x.c +--- linux-2.6.35.4/drivers/ata/pata_bf54x.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ata/pata_bf54x.c 2010-09-17 20:12:09.000000000 -0400 +@@ -1420,7 +1420,7 @@ static struct scsi_host_template bfin_sh .dma_boundary = ATA_DMA_BOUNDARY, }; -static struct ata_port_operations bfin_pata_ops = { +static const struct ata_port_operations bfin_pata_ops = { - .inherits = &ata_sff_port_ops, + .inherits = &ata_bmdma_port_ops, .set_piomode = bfin_set_piomode, -diff -urNp linux-2.6.34.1/drivers/ata/pata_cmd640.c linux-2.6.34.1/drivers/ata/pata_cmd640.c ---- linux-2.6.34.1/drivers/ata/pata_cmd640.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ata/pata_cmd640.c 2010-07-07 09:04:50.000000000 -0400 -@@ -169,7 +169,7 @@ static struct scsi_host_template cmd640_ - ATA_BMDMA_SHT(DRV_NAME), +diff -urNp linux-2.6.35.4/drivers/ata/pata_cmd640.c linux-2.6.35.4/drivers/ata/pata_cmd640.c +--- linux-2.6.35.4/drivers/ata/pata_cmd640.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ata/pata_cmd640.c 2010-09-17 20:12:09.000000000 -0400 +@@ -165,7 +165,7 @@ static struct scsi_host_template cmd640_ + ATA_PIO_SHT(DRV_NAME), }; -static struct ata_port_operations cmd640_port_ops = { +static const struct ata_port_operations cmd640_port_ops = { - .inherits = &ata_bmdma_port_ops, + .inherits = &ata_sff_port_ops, /* In theory xfer_noirq is not needed once we kill the prefetcher */ .sff_data_xfer = ata_sff_data_xfer_noirq, -diff -urNp linux-2.6.34.1/drivers/ata/pata_cmd64x.c linux-2.6.34.1/drivers/ata/pata_cmd64x.c ---- linux-2.6.34.1/drivers/ata/pata_cmd64x.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ata/pata_cmd64x.c 2010-07-07 09:04:50.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/ata/pata_cmd64x.c linux-2.6.35.4/drivers/ata/pata_cmd64x.c +--- linux-2.6.35.4/drivers/ata/pata_cmd64x.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ata/pata_cmd64x.c 2010-09-17 20:12:09.000000000 -0400 @@ -274,18 +274,18 @@ static const struct ata_port_operations .set_dmamode = cmd64x_set_dmamode, }; @@ -20632,9 +21318,9 @@ diff -urNp linux-2.6.34.1/drivers/ata/pata_cmd64x.c linux-2.6.34.1/drivers/ata/p .inherits = &cmd64x_base_ops, .bmdma_stop = cmd648_bmdma_stop, .cable_detect = cmd648_cable_detect, -diff -urNp linux-2.6.34.1/drivers/ata/pata_cs5520.c linux-2.6.34.1/drivers/ata/pata_cs5520.c ---- linux-2.6.34.1/drivers/ata/pata_cs5520.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ata/pata_cs5520.c 2010-07-07 09:04:50.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/ata/pata_cs5520.c linux-2.6.35.4/drivers/ata/pata_cs5520.c +--- linux-2.6.35.4/drivers/ata/pata_cs5520.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ata/pata_cs5520.c 2010-09-17 20:12:09.000000000 -0400 @@ -108,7 +108,7 @@ static struct scsi_host_template cs5520_ .sg_tablesize = LIBATA_DUMB_MAX_PRD, }; @@ -20642,11 +21328,11 @@ diff -urNp linux-2.6.34.1/drivers/ata/pata_cs5520.c linux-2.6.34.1/drivers/ata/p -static struct ata_port_operations cs5520_port_ops = { +static const struct ata_port_operations cs5520_port_ops = { .inherits = &ata_bmdma_port_ops, - .qc_prep = ata_sff_dumb_qc_prep, + .qc_prep = ata_bmdma_dumb_qc_prep, .cable_detect = ata_cable_40wire, -diff -urNp linux-2.6.34.1/drivers/ata/pata_cs5530.c linux-2.6.34.1/drivers/ata/pata_cs5530.c ---- linux-2.6.34.1/drivers/ata/pata_cs5530.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ata/pata_cs5530.c 2010-07-07 09:04:50.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/ata/pata_cs5530.c linux-2.6.35.4/drivers/ata/pata_cs5530.c +--- linux-2.6.35.4/drivers/ata/pata_cs5530.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ata/pata_cs5530.c 2010-09-17 20:12:09.000000000 -0400 @@ -164,7 +164,7 @@ static struct scsi_host_template cs5530_ .sg_tablesize = LIBATA_DUMB_MAX_PRD, }; @@ -20655,10 +21341,10 @@ diff -urNp linux-2.6.34.1/drivers/ata/pata_cs5530.c linux-2.6.34.1/drivers/ata/p +static const struct ata_port_operations cs5530_port_ops = { .inherits = &ata_bmdma_port_ops, - .qc_prep = ata_sff_dumb_qc_prep, -diff -urNp linux-2.6.34.1/drivers/ata/pata_cs5535.c linux-2.6.34.1/drivers/ata/pata_cs5535.c ---- linux-2.6.34.1/drivers/ata/pata_cs5535.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ata/pata_cs5535.c 2010-07-07 09:04:50.000000000 -0400 + .qc_prep = ata_bmdma_dumb_qc_prep, +diff -urNp linux-2.6.35.4/drivers/ata/pata_cs5535.c linux-2.6.35.4/drivers/ata/pata_cs5535.c +--- linux-2.6.35.4/drivers/ata/pata_cs5535.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ata/pata_cs5535.c 2010-09-17 20:12:09.000000000 -0400 @@ -160,7 +160,7 @@ static struct scsi_host_template cs5535_ ATA_BMDMA_SHT(DRV_NAME), }; @@ -20668,9 +21354,9 @@ diff -urNp linux-2.6.34.1/drivers/ata/pata_cs5535.c linux-2.6.34.1/drivers/ata/p .inherits = &ata_bmdma_port_ops, .cable_detect = cs5535_cable_detect, .set_piomode = cs5535_set_piomode, -diff -urNp linux-2.6.34.1/drivers/ata/pata_cs5536.c linux-2.6.34.1/drivers/ata/pata_cs5536.c ---- linux-2.6.34.1/drivers/ata/pata_cs5536.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ata/pata_cs5536.c 2010-07-07 09:04:50.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/ata/pata_cs5536.c linux-2.6.35.4/drivers/ata/pata_cs5536.c +--- linux-2.6.35.4/drivers/ata/pata_cs5536.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ata/pata_cs5536.c 2010-09-17 20:12:09.000000000 -0400 @@ -223,7 +223,7 @@ static struct scsi_host_template cs5536_ ATA_BMDMA_SHT(DRV_NAME), }; @@ -20680,9 +21366,9 @@ diff -urNp linux-2.6.34.1/drivers/ata/pata_cs5536.c linux-2.6.34.1/drivers/ata/p .inherits = &ata_bmdma32_port_ops, .cable_detect = cs5536_cable_detect, .set_piomode = cs5536_set_piomode, -diff -urNp linux-2.6.34.1/drivers/ata/pata_cypress.c linux-2.6.34.1/drivers/ata/pata_cypress.c ---- linux-2.6.34.1/drivers/ata/pata_cypress.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ata/pata_cypress.c 2010-07-07 09:04:50.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/ata/pata_cypress.c linux-2.6.35.4/drivers/ata/pata_cypress.c +--- linux-2.6.35.4/drivers/ata/pata_cypress.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ata/pata_cypress.c 2010-09-17 20:12:09.000000000 -0400 @@ -115,7 +115,7 @@ static struct scsi_host_template cy82c69 ATA_BMDMA_SHT(DRV_NAME), }; @@ -20692,9 +21378,9 @@ diff -urNp linux-2.6.34.1/drivers/ata/pata_cypress.c linux-2.6.34.1/drivers/ata/ .inherits = &ata_bmdma_port_ops, .cable_detect = ata_cable_40wire, .set_piomode = cy82c693_set_piomode, -diff -urNp linux-2.6.34.1/drivers/ata/pata_efar.c linux-2.6.34.1/drivers/ata/pata_efar.c ---- linux-2.6.34.1/drivers/ata/pata_efar.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ata/pata_efar.c 2010-07-07 09:04:50.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/ata/pata_efar.c linux-2.6.35.4/drivers/ata/pata_efar.c +--- linux-2.6.35.4/drivers/ata/pata_efar.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ata/pata_efar.c 2010-09-17 20:12:09.000000000 -0400 @@ -238,7 +238,7 @@ static struct scsi_host_template efar_sh ATA_BMDMA_SHT(DRV_NAME), }; @@ -20704,9 +21390,9 @@ diff -urNp linux-2.6.34.1/drivers/ata/pata_efar.c linux-2.6.34.1/drivers/ata/pat .inherits = &ata_bmdma_port_ops, .cable_detect = efar_cable_detect, .set_piomode = efar_set_piomode, -diff -urNp linux-2.6.34.1/drivers/ata/pata_hpt366.c linux-2.6.34.1/drivers/ata/pata_hpt366.c ---- linux-2.6.34.1/drivers/ata/pata_hpt366.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ata/pata_hpt366.c 2010-07-07 09:04:50.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/ata/pata_hpt366.c linux-2.6.35.4/drivers/ata/pata_hpt366.c +--- linux-2.6.35.4/drivers/ata/pata_hpt366.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ata/pata_hpt366.c 2010-09-17 20:12:09.000000000 -0400 @@ -269,7 +269,7 @@ static struct scsi_host_template hpt36x_ * Configuration for HPT366/68 */ @@ -20716,9 +21402,9 @@ diff -urNp linux-2.6.34.1/drivers/ata/pata_hpt366.c linux-2.6.34.1/drivers/ata/p .inherits = &ata_bmdma_port_ops, .cable_detect = hpt36x_cable_detect, .mode_filter = hpt366_filter, -diff -urNp linux-2.6.34.1/drivers/ata/pata_hpt37x.c linux-2.6.34.1/drivers/ata/pata_hpt37x.c ---- linux-2.6.34.1/drivers/ata/pata_hpt37x.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ata/pata_hpt37x.c 2010-07-07 09:04:50.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/ata/pata_hpt37x.c linux-2.6.35.4/drivers/ata/pata_hpt37x.c +--- linux-2.6.35.4/drivers/ata/pata_hpt37x.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ata/pata_hpt37x.c 2010-09-17 20:12:09.000000000 -0400 @@ -564,7 +564,7 @@ static struct scsi_host_template hpt37x_ * Configuration for HPT370 */ @@ -20755,9 +21441,9 @@ diff -urNp linux-2.6.34.1/drivers/ata/pata_hpt37x.c linux-2.6.34.1/drivers/ata/p .inherits = &hpt372_port_ops, .cable_detect = hpt374_fn1_cable_detect, .prereset = hpt37x_pre_reset, -diff -urNp linux-2.6.34.1/drivers/ata/pata_hpt3x2n.c linux-2.6.34.1/drivers/ata/pata_hpt3x2n.c ---- linux-2.6.34.1/drivers/ata/pata_hpt3x2n.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ata/pata_hpt3x2n.c 2010-07-07 09:04:50.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/ata/pata_hpt3x2n.c linux-2.6.35.4/drivers/ata/pata_hpt3x2n.c +--- linux-2.6.35.4/drivers/ata/pata_hpt3x2n.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ata/pata_hpt3x2n.c 2010-09-17 20:12:09.000000000 -0400 @@ -331,7 +331,7 @@ static struct scsi_host_template hpt3x2n * Configuration for HPT3x2n. */ @@ -20767,9 +21453,9 @@ diff -urNp linux-2.6.34.1/drivers/ata/pata_hpt3x2n.c linux-2.6.34.1/drivers/ata/ .inherits = &ata_bmdma_port_ops, .bmdma_stop = hpt3x2n_bmdma_stop, -diff -urNp linux-2.6.34.1/drivers/ata/pata_hpt3x3.c linux-2.6.34.1/drivers/ata/pata_hpt3x3.c ---- linux-2.6.34.1/drivers/ata/pata_hpt3x3.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ata/pata_hpt3x3.c 2010-07-07 09:04:50.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/ata/pata_hpt3x3.c linux-2.6.35.4/drivers/ata/pata_hpt3x3.c +--- linux-2.6.35.4/drivers/ata/pata_hpt3x3.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ata/pata_hpt3x3.c 2010-09-17 20:12:09.000000000 -0400 @@ -141,7 +141,7 @@ static struct scsi_host_template hpt3x3_ ATA_BMDMA_SHT(DRV_NAME), }; @@ -20779,21 +21465,21 @@ diff -urNp linux-2.6.34.1/drivers/ata/pata_hpt3x3.c linux-2.6.34.1/drivers/ata/p .inherits = &ata_bmdma_port_ops, .cable_detect = ata_cable_40wire, .set_piomode = hpt3x3_set_piomode, -diff -urNp linux-2.6.34.1/drivers/ata/pata_icside.c linux-2.6.34.1/drivers/ata/pata_icside.c ---- linux-2.6.34.1/drivers/ata/pata_icside.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ata/pata_icside.c 2010-07-07 09:04:50.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/ata/pata_icside.c linux-2.6.35.4/drivers/ata/pata_icside.c +--- linux-2.6.35.4/drivers/ata/pata_icside.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ata/pata_icside.c 2010-09-17 20:12:09.000000000 -0400 @@ -320,7 +320,7 @@ static void pata_icside_postreset(struct } } -static struct ata_port_operations pata_icside_port_ops = { +static const struct ata_port_operations pata_icside_port_ops = { - .inherits = &ata_sff_port_ops, + .inherits = &ata_bmdma_port_ops, /* no need to build any PRD tables for DMA */ .qc_prep = ata_noop_qc_prep, -diff -urNp linux-2.6.34.1/drivers/ata/pata_isapnp.c linux-2.6.34.1/drivers/ata/pata_isapnp.c ---- linux-2.6.34.1/drivers/ata/pata_isapnp.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ata/pata_isapnp.c 2010-07-07 09:04:50.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/ata/pata_isapnp.c linux-2.6.35.4/drivers/ata/pata_isapnp.c +--- linux-2.6.35.4/drivers/ata/pata_isapnp.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ata/pata_isapnp.c 2010-09-17 20:12:09.000000000 -0400 @@ -23,12 +23,12 @@ static struct scsi_host_template isapnp_ ATA_PIO_SHT(DRV_NAME), }; @@ -20809,9 +21495,9 @@ diff -urNp linux-2.6.34.1/drivers/ata/pata_isapnp.c linux-2.6.34.1/drivers/ata/p .inherits = &ata_sff_port_ops, .cable_detect = ata_cable_40wire, /* No altstatus so we don't want to use the lost interrupt poll */ -diff -urNp linux-2.6.34.1/drivers/ata/pata_it8213.c linux-2.6.34.1/drivers/ata/pata_it8213.c ---- linux-2.6.34.1/drivers/ata/pata_it8213.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ata/pata_it8213.c 2010-07-07 09:04:50.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/ata/pata_it8213.c linux-2.6.35.4/drivers/ata/pata_it8213.c +--- linux-2.6.35.4/drivers/ata/pata_it8213.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ata/pata_it8213.c 2010-09-17 20:12:09.000000000 -0400 @@ -233,7 +233,7 @@ static struct scsi_host_template it8213_ }; @@ -20821,9 +21507,9 @@ diff -urNp linux-2.6.34.1/drivers/ata/pata_it8213.c linux-2.6.34.1/drivers/ata/p .inherits = &ata_bmdma_port_ops, .cable_detect = it8213_cable_detect, .set_piomode = it8213_set_piomode, -diff -urNp linux-2.6.34.1/drivers/ata/pata_it821x.c linux-2.6.34.1/drivers/ata/pata_it821x.c ---- linux-2.6.34.1/drivers/ata/pata_it821x.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ata/pata_it821x.c 2010-07-07 09:04:50.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/ata/pata_it821x.c linux-2.6.35.4/drivers/ata/pata_it821x.c +--- linux-2.6.35.4/drivers/ata/pata_it821x.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ata/pata_it821x.c 2010-09-17 20:12:09.000000000 -0400 @@ -801,7 +801,7 @@ static struct scsi_host_template it821x_ ATA_BMDMA_SHT(DRV_NAME), }; @@ -20851,9 +21537,9 @@ diff -urNp linux-2.6.34.1/drivers/ata/pata_it821x.c linux-2.6.34.1/drivers/ata/p .inherits = &ata_bmdma_port_ops, .check_atapi_dma= it821x_check_atapi_dma, -diff -urNp linux-2.6.34.1/drivers/ata/pata_ixp4xx_cf.c linux-2.6.34.1/drivers/ata/pata_ixp4xx_cf.c ---- linux-2.6.34.1/drivers/ata/pata_ixp4xx_cf.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ata/pata_ixp4xx_cf.c 2010-07-07 09:04:50.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/ata/pata_ixp4xx_cf.c linux-2.6.35.4/drivers/ata/pata_ixp4xx_cf.c +--- linux-2.6.35.4/drivers/ata/pata_ixp4xx_cf.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ata/pata_ixp4xx_cf.c 2010-09-17 20:12:09.000000000 -0400 @@ -89,7 +89,7 @@ static struct scsi_host_template ixp4xx_ ATA_PIO_SHT(DRV_NAME), }; @@ -20863,9 +21549,9 @@ diff -urNp linux-2.6.34.1/drivers/ata/pata_ixp4xx_cf.c linux-2.6.34.1/drivers/at .inherits = &ata_sff_port_ops, .sff_data_xfer = ixp4xx_mmio_data_xfer, .cable_detect = ata_cable_40wire, -diff -urNp linux-2.6.34.1/drivers/ata/pata_jmicron.c linux-2.6.34.1/drivers/ata/pata_jmicron.c ---- linux-2.6.34.1/drivers/ata/pata_jmicron.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ata/pata_jmicron.c 2010-07-07 09:04:50.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/ata/pata_jmicron.c linux-2.6.35.4/drivers/ata/pata_jmicron.c +--- linux-2.6.35.4/drivers/ata/pata_jmicron.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ata/pata_jmicron.c 2010-09-17 20:12:09.000000000 -0400 @@ -111,7 +111,7 @@ static struct scsi_host_template jmicron ATA_BMDMA_SHT(DRV_NAME), }; @@ -20875,9 +21561,9 @@ diff -urNp linux-2.6.34.1/drivers/ata/pata_jmicron.c linux-2.6.34.1/drivers/ata/ .inherits = &ata_bmdma_port_ops, .prereset = jmicron_pre_reset, }; -diff -urNp linux-2.6.34.1/drivers/ata/pata_legacy.c linux-2.6.34.1/drivers/ata/pata_legacy.c ---- linux-2.6.34.1/drivers/ata/pata_legacy.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ata/pata_legacy.c 2010-07-07 09:04:50.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/ata/pata_legacy.c linux-2.6.35.4/drivers/ata/pata_legacy.c +--- linux-2.6.35.4/drivers/ata/pata_legacy.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ata/pata_legacy.c 2010-09-17 20:12:09.000000000 -0400 @@ -113,7 +113,7 @@ struct legacy_probe { struct legacy_controller { @@ -20989,21 +21675,23 @@ diff -urNp linux-2.6.34.1/drivers/ata/pata_legacy.c linux-2.6.34.1/drivers/ata/p struct legacy_data *ld = &legacy_data[probe->slot]; struct ata_host *host = NULL; struct ata_port *ap; -diff -urNp linux-2.6.34.1/drivers/ata/pata_macio.c linux-2.6.34.1/drivers/ata/pata_macio.c ---- linux-2.6.34.1/drivers/ata/pata_macio.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ata/pata_macio.c 2010-07-07 09:04:50.000000000 -0400 -@@ -916,7 +916,7 @@ static struct scsi_host_template pata_ma +diff -urNp linux-2.6.35.4/drivers/ata/pata_macio.c linux-2.6.35.4/drivers/ata/pata_macio.c +--- linux-2.6.35.4/drivers/ata/pata_macio.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ata/pata_macio.c 2010-09-17 20:12:09.000000000 -0400 +@@ -918,9 +918,8 @@ static struct scsi_host_template pata_ma .slave_configure = pata_macio_slave_config, }; -static struct ata_port_operations pata_macio_ops = { +static const struct ata_port_operations pata_macio_ops = { - .inherits = &ata_sff_port_ops, - + .inherits = &ata_bmdma_port_ops, +- .freeze = pata_macio_freeze, -diff -urNp linux-2.6.34.1/drivers/ata/pata_marvell.c linux-2.6.34.1/drivers/ata/pata_marvell.c ---- linux-2.6.34.1/drivers/ata/pata_marvell.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ata/pata_marvell.c 2010-07-07 09:04:50.000000000 -0400 + .set_piomode = pata_macio_set_timings, + .set_dmamode = pata_macio_set_timings, +diff -urNp linux-2.6.35.4/drivers/ata/pata_marvell.c linux-2.6.35.4/drivers/ata/pata_marvell.c +--- linux-2.6.35.4/drivers/ata/pata_marvell.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ata/pata_marvell.c 2010-09-17 20:12:09.000000000 -0400 @@ -100,7 +100,7 @@ static struct scsi_host_template marvell ATA_BMDMA_SHT(DRV_NAME), }; @@ -21013,9 +21701,9 @@ diff -urNp linux-2.6.34.1/drivers/ata/pata_marvell.c linux-2.6.34.1/drivers/ata/ .inherits = &ata_bmdma_port_ops, .cable_detect = marvell_cable_detect, .prereset = marvell_pre_reset, -diff -urNp linux-2.6.34.1/drivers/ata/pata_mpc52xx.c linux-2.6.34.1/drivers/ata/pata_mpc52xx.c ---- linux-2.6.34.1/drivers/ata/pata_mpc52xx.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ata/pata_mpc52xx.c 2010-07-07 09:04:50.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/ata/pata_mpc52xx.c linux-2.6.35.4/drivers/ata/pata_mpc52xx.c +--- linux-2.6.35.4/drivers/ata/pata_mpc52xx.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ata/pata_mpc52xx.c 2010-09-17 20:12:09.000000000 -0400 @@ -609,7 +609,7 @@ static struct scsi_host_template mpc52xx ATA_PIO_SHT(DRV_NAME), }; @@ -21025,9 +21713,9 @@ diff -urNp linux-2.6.34.1/drivers/ata/pata_mpc52xx.c linux-2.6.34.1/drivers/ata/ .inherits = &ata_sff_port_ops, .sff_dev_select = mpc52xx_ata_dev_select, .set_piomode = mpc52xx_ata_set_piomode, -diff -urNp linux-2.6.34.1/drivers/ata/pata_mpiix.c linux-2.6.34.1/drivers/ata/pata_mpiix.c ---- linux-2.6.34.1/drivers/ata/pata_mpiix.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ata/pata_mpiix.c 2010-07-07 09:04:50.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/ata/pata_mpiix.c linux-2.6.35.4/drivers/ata/pata_mpiix.c +--- linux-2.6.35.4/drivers/ata/pata_mpiix.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ata/pata_mpiix.c 2010-09-17 20:12:09.000000000 -0400 @@ -140,7 +140,7 @@ static struct scsi_host_template mpiix_s ATA_PIO_SHT(DRV_NAME), }; @@ -21037,9 +21725,9 @@ diff -urNp linux-2.6.34.1/drivers/ata/pata_mpiix.c linux-2.6.34.1/drivers/ata/pa .inherits = &ata_sff_port_ops, .qc_issue = mpiix_qc_issue, .cable_detect = ata_cable_40wire, -diff -urNp linux-2.6.34.1/drivers/ata/pata_netcell.c linux-2.6.34.1/drivers/ata/pata_netcell.c ---- linux-2.6.34.1/drivers/ata/pata_netcell.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ata/pata_netcell.c 2010-07-07 09:04:50.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/ata/pata_netcell.c linux-2.6.35.4/drivers/ata/pata_netcell.c +--- linux-2.6.35.4/drivers/ata/pata_netcell.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ata/pata_netcell.c 2010-09-17 20:12:09.000000000 -0400 @@ -34,7 +34,7 @@ static struct scsi_host_template netcell ATA_BMDMA_SHT(DRV_NAME), }; @@ -21049,9 +21737,9 @@ diff -urNp linux-2.6.34.1/drivers/ata/pata_netcell.c linux-2.6.34.1/drivers/ata/ .inherits = &ata_bmdma_port_ops, .cable_detect = ata_cable_80wire, .read_id = netcell_read_id, -diff -urNp linux-2.6.34.1/drivers/ata/pata_ninja32.c linux-2.6.34.1/drivers/ata/pata_ninja32.c ---- linux-2.6.34.1/drivers/ata/pata_ninja32.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ata/pata_ninja32.c 2010-07-07 09:04:50.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/ata/pata_ninja32.c linux-2.6.35.4/drivers/ata/pata_ninja32.c +--- linux-2.6.35.4/drivers/ata/pata_ninja32.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ata/pata_ninja32.c 2010-09-17 20:12:09.000000000 -0400 @@ -81,7 +81,7 @@ static struct scsi_host_template ninja32 ATA_BMDMA_SHT(DRV_NAME), }; @@ -21061,9 +21749,9 @@ diff -urNp linux-2.6.34.1/drivers/ata/pata_ninja32.c linux-2.6.34.1/drivers/ata/ .inherits = &ata_bmdma_port_ops, .sff_dev_select = ninja32_dev_select, .cable_detect = ata_cable_40wire, -diff -urNp linux-2.6.34.1/drivers/ata/pata_ns87410.c linux-2.6.34.1/drivers/ata/pata_ns87410.c ---- linux-2.6.34.1/drivers/ata/pata_ns87410.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ata/pata_ns87410.c 2010-07-07 09:04:50.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/ata/pata_ns87410.c linux-2.6.35.4/drivers/ata/pata_ns87410.c +--- linux-2.6.35.4/drivers/ata/pata_ns87410.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ata/pata_ns87410.c 2010-09-17 20:12:09.000000000 -0400 @@ -132,7 +132,7 @@ static struct scsi_host_template ns87410 ATA_PIO_SHT(DRV_NAME), }; @@ -21073,9 +21761,9 @@ diff -urNp linux-2.6.34.1/drivers/ata/pata_ns87410.c linux-2.6.34.1/drivers/ata/ .inherits = &ata_sff_port_ops, .qc_issue = ns87410_qc_issue, .cable_detect = ata_cable_40wire, -diff -urNp linux-2.6.34.1/drivers/ata/pata_ns87415.c linux-2.6.34.1/drivers/ata/pata_ns87415.c ---- linux-2.6.34.1/drivers/ata/pata_ns87415.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ata/pata_ns87415.c 2010-07-07 09:04:50.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/ata/pata_ns87415.c linux-2.6.35.4/drivers/ata/pata_ns87415.c +--- linux-2.6.35.4/drivers/ata/pata_ns87415.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ata/pata_ns87415.c 2010-09-17 20:12:09.000000000 -0400 @@ -299,7 +299,7 @@ static u8 ns87560_bmdma_status(struct at } #endif /* 87560 SuperIO Support */ @@ -21094,10 +21782,10 @@ diff -urNp linux-2.6.34.1/drivers/ata/pata_ns87415.c linux-2.6.34.1/drivers/ata/ .inherits = &ns87415_pata_ops, .sff_tf_read = ns87560_tf_read, .sff_check_status = ns87560_check_status, -diff -urNp linux-2.6.34.1/drivers/ata/pata_octeon_cf.c linux-2.6.34.1/drivers/ata/pata_octeon_cf.c ---- linux-2.6.34.1/drivers/ata/pata_octeon_cf.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ata/pata_octeon_cf.c 2010-07-07 09:04:50.000000000 -0400 -@@ -802,6 +802,7 @@ static unsigned int octeon_cf_qc_issue(s +diff -urNp linux-2.6.35.4/drivers/ata/pata_octeon_cf.c linux-2.6.35.4/drivers/ata/pata_octeon_cf.c +--- linux-2.6.35.4/drivers/ata/pata_octeon_cf.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ata/pata_octeon_cf.c 2010-09-17 20:12:09.000000000 -0400 +@@ -782,6 +782,7 @@ static unsigned int octeon_cf_qc_issue(s return 0; } @@ -21105,9 +21793,9 @@ diff -urNp linux-2.6.34.1/drivers/ata/pata_octeon_cf.c linux-2.6.34.1/drivers/at static struct ata_port_operations octeon_cf_ops = { .inherits = &ata_sff_port_ops, .check_atapi_dma = octeon_cf_check_atapi_dma, -diff -urNp linux-2.6.34.1/drivers/ata/pata_oldpiix.c linux-2.6.34.1/drivers/ata/pata_oldpiix.c ---- linux-2.6.34.1/drivers/ata/pata_oldpiix.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ata/pata_oldpiix.c 2010-07-07 09:04:50.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/ata/pata_oldpiix.c linux-2.6.35.4/drivers/ata/pata_oldpiix.c +--- linux-2.6.35.4/drivers/ata/pata_oldpiix.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ata/pata_oldpiix.c 2010-09-17 20:12:09.000000000 -0400 @@ -208,7 +208,7 @@ static struct scsi_host_template oldpiix ATA_BMDMA_SHT(DRV_NAME), }; @@ -21117,9 +21805,9 @@ diff -urNp linux-2.6.34.1/drivers/ata/pata_oldpiix.c linux-2.6.34.1/drivers/ata/ .inherits = &ata_bmdma_port_ops, .qc_issue = oldpiix_qc_issue, .cable_detect = ata_cable_40wire, -diff -urNp linux-2.6.34.1/drivers/ata/pata_opti.c linux-2.6.34.1/drivers/ata/pata_opti.c ---- linux-2.6.34.1/drivers/ata/pata_opti.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ata/pata_opti.c 2010-07-07 09:04:50.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/ata/pata_opti.c linux-2.6.35.4/drivers/ata/pata_opti.c +--- linux-2.6.35.4/drivers/ata/pata_opti.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ata/pata_opti.c 2010-09-17 20:12:09.000000000 -0400 @@ -152,7 +152,7 @@ static struct scsi_host_template opti_sh ATA_PIO_SHT(DRV_NAME), }; @@ -21129,9 +21817,9 @@ diff -urNp linux-2.6.34.1/drivers/ata/pata_opti.c linux-2.6.34.1/drivers/ata/pat .inherits = &ata_sff_port_ops, .cable_detect = ata_cable_40wire, .set_piomode = opti_set_piomode, -diff -urNp linux-2.6.34.1/drivers/ata/pata_optidma.c linux-2.6.34.1/drivers/ata/pata_optidma.c ---- linux-2.6.34.1/drivers/ata/pata_optidma.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ata/pata_optidma.c 2010-07-07 09:04:50.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/ata/pata_optidma.c linux-2.6.35.4/drivers/ata/pata_optidma.c +--- linux-2.6.35.4/drivers/ata/pata_optidma.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ata/pata_optidma.c 2010-09-17 20:12:09.000000000 -0400 @@ -337,7 +337,7 @@ static struct scsi_host_template optidma ATA_BMDMA_SHT(DRV_NAME), }; @@ -21150,9 +21838,9 @@ diff -urNp linux-2.6.34.1/drivers/ata/pata_optidma.c linux-2.6.34.1/drivers/ata/ .inherits = &optidma_port_ops, .set_piomode = optiplus_set_pio_mode, .set_dmamode = optiplus_set_dma_mode, -diff -urNp linux-2.6.34.1/drivers/ata/pata_palmld.c linux-2.6.34.1/drivers/ata/pata_palmld.c ---- linux-2.6.34.1/drivers/ata/pata_palmld.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ata/pata_palmld.c 2010-07-07 09:04:50.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/ata/pata_palmld.c linux-2.6.35.4/drivers/ata/pata_palmld.c +--- linux-2.6.35.4/drivers/ata/pata_palmld.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ata/pata_palmld.c 2010-09-17 20:12:09.000000000 -0400 @@ -37,7 +37,7 @@ static struct scsi_host_template palmld_ ATA_PIO_SHT(DRV_NAME), }; @@ -21162,10 +21850,10 @@ diff -urNp linux-2.6.34.1/drivers/ata/pata_palmld.c linux-2.6.34.1/drivers/ata/p .inherits = &ata_sff_port_ops, .sff_data_xfer = ata_sff_data_xfer_noirq, .cable_detect = ata_cable_40wire, -diff -urNp linux-2.6.34.1/drivers/ata/pata_pcmcia.c linux-2.6.34.1/drivers/ata/pata_pcmcia.c ---- linux-2.6.34.1/drivers/ata/pata_pcmcia.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ata/pata_pcmcia.c 2010-07-07 09:04:50.000000000 -0400 -@@ -163,14 +163,14 @@ static struct scsi_host_template pcmcia_ +diff -urNp linux-2.6.35.4/drivers/ata/pata_pcmcia.c linux-2.6.35.4/drivers/ata/pata_pcmcia.c +--- linux-2.6.35.4/drivers/ata/pata_pcmcia.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ata/pata_pcmcia.c 2010-09-17 20:12:09.000000000 -0400 +@@ -153,14 +153,14 @@ static struct scsi_host_template pcmcia_ ATA_PIO_SHT(DRV_NAME), }; @@ -21182,18 +21870,18 @@ diff -urNp linux-2.6.34.1/drivers/ata/pata_pcmcia.c linux-2.6.34.1/drivers/ata/p .inherits = &ata_sff_port_ops, .sff_data_xfer = ata_data_xfer_8bit, .cable_detect = ata_cable_40wire, -@@ -254,7 +254,7 @@ static int pcmcia_init_one(struct pcmcia +@@ -243,7 +243,7 @@ static int pcmcia_init_one(struct pcmcia unsigned long io_base, ctl_base; void __iomem *io_addr, *ctl_addr; int n_ports = 1; - struct ata_port_operations *ops = &pcmcia_port_ops; + const struct ata_port_operations *ops = &pcmcia_port_ops; - info = kzalloc(sizeof(*info), GFP_KERNEL); - if (info == NULL) -diff -urNp linux-2.6.34.1/drivers/ata/pata_pdc2027x.c linux-2.6.34.1/drivers/ata/pata_pdc2027x.c ---- linux-2.6.34.1/drivers/ata/pata_pdc2027x.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ata/pata_pdc2027x.c 2010-07-07 09:04:50.000000000 -0400 + /* Set up attributes in order to probe card and get resources */ + pdev->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO; +diff -urNp linux-2.6.35.4/drivers/ata/pata_pdc2027x.c linux-2.6.35.4/drivers/ata/pata_pdc2027x.c +--- linux-2.6.35.4/drivers/ata/pata_pdc2027x.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ata/pata_pdc2027x.c 2010-09-17 20:12:09.000000000 -0400 @@ -132,14 +132,14 @@ static struct scsi_host_template pdc2027 ATA_BMDMA_SHT(DRV_NAME), }; @@ -21211,9 +21899,9 @@ diff -urNp linux-2.6.34.1/drivers/ata/pata_pdc2027x.c linux-2.6.34.1/drivers/ata .inherits = &pdc2027x_pata100_ops, .mode_filter = pdc2027x_mode_filter, .set_piomode = pdc2027x_set_piomode, -diff -urNp linux-2.6.34.1/drivers/ata/pata_pdc202xx_old.c linux-2.6.34.1/drivers/ata/pata_pdc202xx_old.c ---- linux-2.6.34.1/drivers/ata/pata_pdc202xx_old.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ata/pata_pdc202xx_old.c 2010-07-07 09:04:50.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/ata/pata_pdc202xx_old.c linux-2.6.35.4/drivers/ata/pata_pdc202xx_old.c +--- linux-2.6.35.4/drivers/ata/pata_pdc202xx_old.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ata/pata_pdc202xx_old.c 2010-09-17 20:12:09.000000000 -0400 @@ -274,7 +274,7 @@ static struct scsi_host_template pdc202x ATA_BMDMA_SHT(DRV_NAME), }; @@ -21232,9 +21920,9 @@ diff -urNp linux-2.6.34.1/drivers/ata/pata_pdc202xx_old.c linux-2.6.34.1/drivers .inherits = &pdc2024x_port_ops, .check_atapi_dma = pdc2026x_check_atapi_dma, -diff -urNp linux-2.6.34.1/drivers/ata/pata_piccolo.c linux-2.6.34.1/drivers/ata/pata_piccolo.c ---- linux-2.6.34.1/drivers/ata/pata_piccolo.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ata/pata_piccolo.c 2010-07-07 09:04:50.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/ata/pata_piccolo.c linux-2.6.35.4/drivers/ata/pata_piccolo.c +--- linux-2.6.35.4/drivers/ata/pata_piccolo.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ata/pata_piccolo.c 2010-09-17 20:12:09.000000000 -0400 @@ -67,7 +67,7 @@ static struct scsi_host_template tosh_sh ATA_BMDMA_SHT(DRV_NAME), }; @@ -21244,9 +21932,9 @@ diff -urNp linux-2.6.34.1/drivers/ata/pata_piccolo.c linux-2.6.34.1/drivers/ata/ .inherits = &ata_bmdma_port_ops, .cable_detect = ata_cable_unknown, .set_piomode = tosh_set_piomode, -diff -urNp linux-2.6.34.1/drivers/ata/pata_platform.c linux-2.6.34.1/drivers/ata/pata_platform.c ---- linux-2.6.34.1/drivers/ata/pata_platform.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ata/pata_platform.c 2010-07-07 09:04:50.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/ata/pata_platform.c linux-2.6.35.4/drivers/ata/pata_platform.c +--- linux-2.6.35.4/drivers/ata/pata_platform.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ata/pata_platform.c 2010-09-17 20:12:09.000000000 -0400 @@ -48,7 +48,7 @@ static struct scsi_host_template pata_pl ATA_PIO_SHT(DRV_NAME), }; @@ -21256,9 +21944,9 @@ diff -urNp linux-2.6.34.1/drivers/ata/pata_platform.c linux-2.6.34.1/drivers/ata .inherits = &ata_sff_port_ops, .sff_data_xfer = ata_sff_data_xfer_noirq, .cable_detect = ata_cable_unknown, -diff -urNp linux-2.6.34.1/drivers/ata/pata_qdi.c linux-2.6.34.1/drivers/ata/pata_qdi.c ---- linux-2.6.34.1/drivers/ata/pata_qdi.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ata/pata_qdi.c 2010-07-07 09:04:50.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/ata/pata_qdi.c linux-2.6.35.4/drivers/ata/pata_qdi.c +--- linux-2.6.35.4/drivers/ata/pata_qdi.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ata/pata_qdi.c 2010-09-17 20:12:09.000000000 -0400 @@ -157,7 +157,7 @@ static struct scsi_host_template qdi_sht ATA_PIO_SHT(DRV_NAME), }; @@ -21277,9 +21965,9 @@ diff -urNp linux-2.6.34.1/drivers/ata/pata_qdi.c linux-2.6.34.1/drivers/ata/pata .inherits = &qdi6500_port_ops, .set_piomode = qdi6580_set_piomode, }; -diff -urNp linux-2.6.34.1/drivers/ata/pata_radisys.c linux-2.6.34.1/drivers/ata/pata_radisys.c ---- linux-2.6.34.1/drivers/ata/pata_radisys.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ata/pata_radisys.c 2010-07-07 09:04:50.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/ata/pata_radisys.c linux-2.6.35.4/drivers/ata/pata_radisys.c +--- linux-2.6.35.4/drivers/ata/pata_radisys.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ata/pata_radisys.c 2010-09-17 20:12:09.000000000 -0400 @@ -187,7 +187,7 @@ static struct scsi_host_template radisys ATA_BMDMA_SHT(DRV_NAME), }; @@ -21289,9 +21977,9 @@ diff -urNp linux-2.6.34.1/drivers/ata/pata_radisys.c linux-2.6.34.1/drivers/ata/ .inherits = &ata_bmdma_port_ops, .qc_issue = radisys_qc_issue, .cable_detect = ata_cable_unknown, -diff -urNp linux-2.6.34.1/drivers/ata/pata_rb532_cf.c linux-2.6.34.1/drivers/ata/pata_rb532_cf.c ---- linux-2.6.34.1/drivers/ata/pata_rb532_cf.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ata/pata_rb532_cf.c 2010-07-07 09:04:50.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/ata/pata_rb532_cf.c linux-2.6.35.4/drivers/ata/pata_rb532_cf.c +--- linux-2.6.35.4/drivers/ata/pata_rb532_cf.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ata/pata_rb532_cf.c 2010-09-17 20:12:09.000000000 -0400 @@ -69,7 +69,7 @@ static irqreturn_t rb532_pata_irq_handle return IRQ_HANDLED; } @@ -21301,9 +21989,9 @@ diff -urNp linux-2.6.34.1/drivers/ata/pata_rb532_cf.c linux-2.6.34.1/drivers/ata .inherits = &ata_sff_port_ops, .sff_data_xfer = ata_sff_data_xfer32, }; -diff -urNp linux-2.6.34.1/drivers/ata/pata_rdc.c linux-2.6.34.1/drivers/ata/pata_rdc.c ---- linux-2.6.34.1/drivers/ata/pata_rdc.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ata/pata_rdc.c 2010-07-07 09:04:50.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/ata/pata_rdc.c linux-2.6.35.4/drivers/ata/pata_rdc.c +--- linux-2.6.35.4/drivers/ata/pata_rdc.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ata/pata_rdc.c 2010-09-17 20:12:09.000000000 -0400 @@ -273,7 +273,7 @@ static void rdc_set_dmamode(struct ata_p pci_write_config_byte(dev, 0x48, udma_enable); } @@ -21313,9 +22001,9 @@ diff -urNp linux-2.6.34.1/drivers/ata/pata_rdc.c linux-2.6.34.1/drivers/ata/pata .inherits = &ata_bmdma32_port_ops, .cable_detect = rdc_pata_cable_detect, .set_piomode = rdc_set_piomode, -diff -urNp linux-2.6.34.1/drivers/ata/pata_rz1000.c linux-2.6.34.1/drivers/ata/pata_rz1000.c ---- linux-2.6.34.1/drivers/ata/pata_rz1000.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ata/pata_rz1000.c 2010-07-07 09:04:50.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/ata/pata_rz1000.c linux-2.6.35.4/drivers/ata/pata_rz1000.c +--- linux-2.6.35.4/drivers/ata/pata_rz1000.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ata/pata_rz1000.c 2010-09-17 20:12:09.000000000 -0400 @@ -54,7 +54,7 @@ static struct scsi_host_template rz1000_ ATA_PIO_SHT(DRV_NAME), }; @@ -21325,9 +22013,9 @@ diff -urNp linux-2.6.34.1/drivers/ata/pata_rz1000.c linux-2.6.34.1/drivers/ata/p .inherits = &ata_sff_port_ops, .cable_detect = ata_cable_40wire, .set_mode = rz1000_set_mode, -diff -urNp linux-2.6.34.1/drivers/ata/pata_sc1200.c linux-2.6.34.1/drivers/ata/pata_sc1200.c ---- linux-2.6.34.1/drivers/ata/pata_sc1200.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ata/pata_sc1200.c 2010-07-07 09:04:50.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/ata/pata_sc1200.c linux-2.6.35.4/drivers/ata/pata_sc1200.c +--- linux-2.6.35.4/drivers/ata/pata_sc1200.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ata/pata_sc1200.c 2010-09-17 20:12:09.000000000 -0400 @@ -207,7 +207,7 @@ static struct scsi_host_template sc1200_ .sg_tablesize = LIBATA_DUMB_MAX_PRD, }; @@ -21335,12 +22023,12 @@ diff -urNp linux-2.6.34.1/drivers/ata/pata_sc1200.c linux-2.6.34.1/drivers/ata/p -static struct ata_port_operations sc1200_port_ops = { +static const struct ata_port_operations sc1200_port_ops = { .inherits = &ata_bmdma_port_ops, - .qc_prep = ata_sff_dumb_qc_prep, + .qc_prep = ata_bmdma_dumb_qc_prep, .qc_issue = sc1200_qc_issue, -diff -urNp linux-2.6.34.1/drivers/ata/pata_scc.c linux-2.6.34.1/drivers/ata/pata_scc.c ---- linux-2.6.34.1/drivers/ata/pata_scc.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ata/pata_scc.c 2010-07-07 09:04:50.000000000 -0400 -@@ -965,7 +965,7 @@ static struct scsi_host_template scc_sht +diff -urNp linux-2.6.35.4/drivers/ata/pata_scc.c linux-2.6.35.4/drivers/ata/pata_scc.c +--- linux-2.6.35.4/drivers/ata/pata_scc.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ata/pata_scc.c 2010-09-17 20:12:09.000000000 -0400 +@@ -927,7 +927,7 @@ static struct scsi_host_template scc_sht ATA_BMDMA_SHT(DRV_NAME), }; @@ -21349,9 +22037,9 @@ diff -urNp linux-2.6.34.1/drivers/ata/pata_scc.c linux-2.6.34.1/drivers/ata/pata .inherits = &ata_bmdma_port_ops, .set_piomode = scc_set_piomode, -diff -urNp linux-2.6.34.1/drivers/ata/pata_sch.c linux-2.6.34.1/drivers/ata/pata_sch.c ---- linux-2.6.34.1/drivers/ata/pata_sch.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ata/pata_sch.c 2010-07-07 09:04:50.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/ata/pata_sch.c linux-2.6.35.4/drivers/ata/pata_sch.c +--- linux-2.6.35.4/drivers/ata/pata_sch.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ata/pata_sch.c 2010-09-17 20:12:09.000000000 -0400 @@ -75,7 +75,7 @@ static struct scsi_host_template sch_sht ATA_BMDMA_SHT(DRV_NAME), }; @@ -21361,9 +22049,9 @@ diff -urNp linux-2.6.34.1/drivers/ata/pata_sch.c linux-2.6.34.1/drivers/ata/pata .inherits = &ata_bmdma_port_ops, .cable_detect = ata_cable_unknown, .set_piomode = sch_set_piomode, -diff -urNp linux-2.6.34.1/drivers/ata/pata_serverworks.c linux-2.6.34.1/drivers/ata/pata_serverworks.c ---- linux-2.6.34.1/drivers/ata/pata_serverworks.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ata/pata_serverworks.c 2010-07-07 09:04:50.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/ata/pata_serverworks.c linux-2.6.35.4/drivers/ata/pata_serverworks.c +--- linux-2.6.35.4/drivers/ata/pata_serverworks.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ata/pata_serverworks.c 2010-09-17 20:12:09.000000000 -0400 @@ -300,7 +300,7 @@ static struct scsi_host_template serverw ATA_BMDMA_SHT(DRV_NAME), }; @@ -21382,21 +22070,22 @@ diff -urNp linux-2.6.34.1/drivers/ata/pata_serverworks.c linux-2.6.34.1/drivers/ .inherits = &serverworks_osb4_port_ops, .mode_filter = serverworks_csb_filter, }; -diff -urNp linux-2.6.34.1/drivers/ata/pata_sil680.c linux-2.6.34.1/drivers/ata/pata_sil680.c ---- linux-2.6.34.1/drivers/ata/pata_sil680.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ata/pata_sil680.c 2010-07-07 09:04:50.000000000 -0400 -@@ -194,7 +194,7 @@ static struct scsi_host_template sil680_ +diff -urNp linux-2.6.35.4/drivers/ata/pata_sil680.c linux-2.6.35.4/drivers/ata/pata_sil680.c +--- linux-2.6.35.4/drivers/ata/pata_sil680.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ata/pata_sil680.c 2010-09-17 20:12:09.000000000 -0400 +@@ -214,8 +214,7 @@ static struct scsi_host_template sil680_ ATA_BMDMA_SHT(DRV_NAME), }; +- -static struct ata_port_operations sil680_port_ops = { +static const struct ata_port_operations sil680_port_ops = { - .inherits = &ata_bmdma32_port_ops, - .cable_detect = sil680_cable_detect, - .set_piomode = sil680_set_piomode, -diff -urNp linux-2.6.34.1/drivers/ata/pata_sis.c linux-2.6.34.1/drivers/ata/pata_sis.c ---- linux-2.6.34.1/drivers/ata/pata_sis.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ata/pata_sis.c 2010-07-07 09:04:50.000000000 -0400 + .inherits = &ata_bmdma32_port_ops, + .sff_exec_command = sil680_sff_exec_command, + .cable_detect = sil680_cable_detect, +diff -urNp linux-2.6.35.4/drivers/ata/pata_sis.c linux-2.6.35.4/drivers/ata/pata_sis.c +--- linux-2.6.35.4/drivers/ata/pata_sis.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ata/pata_sis.c 2010-09-17 20:12:09.000000000 -0400 @@ -503,47 +503,47 @@ static struct scsi_host_template sis_sht ATA_BMDMA_SHT(DRV_NAME), }; @@ -21452,9 +22141,9 @@ diff -urNp linux-2.6.34.1/drivers/ata/pata_sis.c linux-2.6.34.1/drivers/ata/pata .inherits = &sis_base_ops, .set_piomode = sis_old_set_piomode, .set_dmamode = sis_old_set_dmamode, -diff -urNp linux-2.6.34.1/drivers/ata/pata_sl82c105.c linux-2.6.34.1/drivers/ata/pata_sl82c105.c ---- linux-2.6.34.1/drivers/ata/pata_sl82c105.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ata/pata_sl82c105.c 2010-07-07 09:04:50.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/ata/pata_sl82c105.c linux-2.6.35.4/drivers/ata/pata_sl82c105.c +--- linux-2.6.35.4/drivers/ata/pata_sl82c105.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ata/pata_sl82c105.c 2010-09-17 20:12:09.000000000 -0400 @@ -231,7 +231,7 @@ static struct scsi_host_template sl82c10 ATA_BMDMA_SHT(DRV_NAME), }; @@ -21464,9 +22153,9 @@ diff -urNp linux-2.6.34.1/drivers/ata/pata_sl82c105.c linux-2.6.34.1/drivers/ata .inherits = &ata_bmdma_port_ops, .qc_defer = sl82c105_qc_defer, .bmdma_start = sl82c105_bmdma_start, -diff -urNp linux-2.6.34.1/drivers/ata/pata_triflex.c linux-2.6.34.1/drivers/ata/pata_triflex.c ---- linux-2.6.34.1/drivers/ata/pata_triflex.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ata/pata_triflex.c 2010-07-07 09:04:50.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/ata/pata_triflex.c linux-2.6.35.4/drivers/ata/pata_triflex.c +--- linux-2.6.35.4/drivers/ata/pata_triflex.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ata/pata_triflex.c 2010-09-17 20:12:09.000000000 -0400 @@ -178,7 +178,7 @@ static struct scsi_host_template triflex ATA_BMDMA_SHT(DRV_NAME), }; @@ -21476,10 +22165,10 @@ diff -urNp linux-2.6.34.1/drivers/ata/pata_triflex.c linux-2.6.34.1/drivers/ata/ .inherits = &ata_bmdma_port_ops, .bmdma_start = triflex_bmdma_start, .bmdma_stop = triflex_bmdma_stop, -diff -urNp linux-2.6.34.1/drivers/ata/pata_via.c linux-2.6.34.1/drivers/ata/pata_via.c ---- linux-2.6.34.1/drivers/ata/pata_via.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ata/pata_via.c 2010-07-07 09:04:50.000000000 -0400 -@@ -441,7 +441,7 @@ static struct scsi_host_template via_sht +diff -urNp linux-2.6.35.4/drivers/ata/pata_via.c linux-2.6.35.4/drivers/ata/pata_via.c +--- linux-2.6.35.4/drivers/ata/pata_via.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ata/pata_via.c 2010-09-17 20:12:09.000000000 -0400 +@@ -439,7 +439,7 @@ static struct scsi_host_template via_sht ATA_BMDMA_SHT(DRV_NAME), }; @@ -21488,7 +22177,7 @@ diff -urNp linux-2.6.34.1/drivers/ata/pata_via.c linux-2.6.34.1/drivers/ata/pata .inherits = &ata_bmdma_port_ops, .cable_detect = via_cable_detect, .set_piomode = via_set_piomode, -@@ -452,7 +452,7 @@ static struct ata_port_operations via_po +@@ -450,7 +450,7 @@ static struct ata_port_operations via_po .mode_filter = via_mode_filter, }; @@ -21497,9 +22186,9 @@ diff -urNp linux-2.6.34.1/drivers/ata/pata_via.c linux-2.6.34.1/drivers/ata/pata .inherits = &via_port_ops, .sff_data_xfer = ata_sff_data_xfer_noirq, }; -diff -urNp linux-2.6.34.1/drivers/ata/pata_winbond.c linux-2.6.34.1/drivers/ata/pata_winbond.c ---- linux-2.6.34.1/drivers/ata/pata_winbond.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ata/pata_winbond.c 2010-07-07 09:04:50.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/ata/pata_winbond.c linux-2.6.35.4/drivers/ata/pata_winbond.c +--- linux-2.6.35.4/drivers/ata/pata_winbond.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ata/pata_winbond.c 2010-09-17 20:12:09.000000000 -0400 @@ -125,7 +125,7 @@ static struct scsi_host_template winbond ATA_PIO_SHT(DRV_NAME), }; @@ -21509,9 +22198,9 @@ diff -urNp linux-2.6.34.1/drivers/ata/pata_winbond.c linux-2.6.34.1/drivers/ata/ .inherits = &ata_sff_port_ops, .sff_data_xfer = winbond_data_xfer, .cable_detect = ata_cable_40wire, -diff -urNp linux-2.6.34.1/drivers/ata/pdc_adma.c linux-2.6.34.1/drivers/ata/pdc_adma.c ---- linux-2.6.34.1/drivers/ata/pdc_adma.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ata/pdc_adma.c 2010-07-07 09:04:50.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/ata/pdc_adma.c linux-2.6.35.4/drivers/ata/pdc_adma.c +--- linux-2.6.35.4/drivers/ata/pdc_adma.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ata/pdc_adma.c 2010-09-17 20:12:09.000000000 -0400 @@ -146,7 +146,7 @@ static struct scsi_host_template adma_at .dma_boundary = ADMA_DMA_BOUNDARY, }; @@ -21521,9 +22210,9 @@ diff -urNp linux-2.6.34.1/drivers/ata/pdc_adma.c linux-2.6.34.1/drivers/ata/pdc_ .inherits = &ata_sff_port_ops, .lost_interrupt = ATA_OP_NULL, -diff -urNp linux-2.6.34.1/drivers/ata/sata_fsl.c linux-2.6.34.1/drivers/ata/sata_fsl.c ---- linux-2.6.34.1/drivers/ata/sata_fsl.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ata/sata_fsl.c 2010-07-07 09:04:50.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/ata/sata_fsl.c linux-2.6.35.4/drivers/ata/sata_fsl.c +--- linux-2.6.35.4/drivers/ata/sata_fsl.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ata/sata_fsl.c 2010-09-17 20:12:09.000000000 -0400 @@ -1261,7 +1261,7 @@ static struct scsi_host_template sata_fs .dma_boundary = ATA_DMA_BOUNDARY, }; @@ -21533,10 +22222,10 @@ diff -urNp linux-2.6.34.1/drivers/ata/sata_fsl.c linux-2.6.34.1/drivers/ata/sata .inherits = &sata_pmp_port_ops, .qc_defer = ata_std_qc_defer, -diff -urNp linux-2.6.34.1/drivers/ata/sata_inic162x.c linux-2.6.34.1/drivers/ata/sata_inic162x.c ---- linux-2.6.34.1/drivers/ata/sata_inic162x.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ata/sata_inic162x.c 2010-07-07 09:04:50.000000000 -0400 -@@ -722,7 +722,7 @@ static int inic_port_start(struct ata_po +diff -urNp linux-2.6.35.4/drivers/ata/sata_inic162x.c linux-2.6.35.4/drivers/ata/sata_inic162x.c +--- linux-2.6.35.4/drivers/ata/sata_inic162x.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ata/sata_inic162x.c 2010-09-17 20:12:09.000000000 -0400 +@@ -705,7 +705,7 @@ static int inic_port_start(struct ata_po return 0; } @@ -21545,9 +22234,9 @@ diff -urNp linux-2.6.34.1/drivers/ata/sata_inic162x.c linux-2.6.34.1/drivers/ata .inherits = &sata_port_ops, .check_atapi_dma = inic_check_atapi_dma, -diff -urNp linux-2.6.34.1/drivers/ata/sata_mv.c linux-2.6.34.1/drivers/ata/sata_mv.c ---- linux-2.6.34.1/drivers/ata/sata_mv.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ata/sata_mv.c 2010-07-07 09:04:50.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/ata/sata_mv.c linux-2.6.35.4/drivers/ata/sata_mv.c +--- linux-2.6.35.4/drivers/ata/sata_mv.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ata/sata_mv.c 2010-09-17 20:12:09.000000000 -0400 @@ -663,7 +663,7 @@ static struct scsi_host_template mv6_sht .dma_boundary = MV_DMA_BOUNDARY, }; @@ -21557,17 +22246,17 @@ diff -urNp linux-2.6.34.1/drivers/ata/sata_mv.c linux-2.6.34.1/drivers/ata/sata_ .inherits = &ata_sff_port_ops, .lost_interrupt = ATA_OP_NULL, -@@ -685,7 +685,7 @@ static struct ata_port_operations mv5_op +@@ -683,7 +683,7 @@ static struct ata_port_operations mv5_op .port_stop = mv_port_stop, }; -static struct ata_port_operations mv6_ops = { +static const struct ata_port_operations mv6_ops = { - .inherits = &mv5_ops, - .dev_config = mv6_dev_config, - .scr_read = mv_scr_read, -@@ -705,7 +705,7 @@ static struct ata_port_operations mv6_op - .bmdma_status = mv_bmdma_status, + .inherits = &ata_bmdma_port_ops, + + .lost_interrupt = ATA_OP_NULL, +@@ -717,7 +717,7 @@ static struct ata_port_operations mv6_op + .port_stop = mv_port_stop, }; -static struct ata_port_operations mv_iie_ops = { @@ -21575,9 +22264,9 @@ diff -urNp linux-2.6.34.1/drivers/ata/sata_mv.c linux-2.6.34.1/drivers/ata/sata_ .inherits = &mv6_ops, .dev_config = ATA_OP_NULL, .qc_prep = mv_qc_prep_iie, -diff -urNp linux-2.6.34.1/drivers/ata/sata_nv.c linux-2.6.34.1/drivers/ata/sata_nv.c ---- linux-2.6.34.1/drivers/ata/sata_nv.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ata/sata_nv.c 2010-07-07 09:04:50.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/ata/sata_nv.c linux-2.6.35.4/drivers/ata/sata_nv.c +--- linux-2.6.35.4/drivers/ata/sata_nv.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ata/sata_nv.c 2010-09-17 20:12:09.000000000 -0400 @@ -465,7 +465,7 @@ static struct scsi_host_template nv_swnc * cases. Define nv_hardreset() which only kicks in for post-boot * probing and use it for all variants. @@ -21620,9 +22309,9 @@ diff -urNp linux-2.6.34.1/drivers/ata/sata_nv.c linux-2.6.34.1/drivers/ata/sata_ .inherits = &nv_generic_ops, .qc_defer = ata_std_qc_defer, -diff -urNp linux-2.6.34.1/drivers/ata/sata_promise.c linux-2.6.34.1/drivers/ata/sata_promise.c ---- linux-2.6.34.1/drivers/ata/sata_promise.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ata/sata_promise.c 2010-07-07 09:04:50.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/ata/sata_promise.c linux-2.6.35.4/drivers/ata/sata_promise.c +--- linux-2.6.35.4/drivers/ata/sata_promise.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ata/sata_promise.c 2010-09-17 20:12:09.000000000 -0400 @@ -196,7 +196,7 @@ static const struct ata_port_operations .error_handler = pdc_error_handler, }; @@ -21649,10 +22338,10 @@ diff -urNp linux-2.6.34.1/drivers/ata/sata_promise.c linux-2.6.34.1/drivers/ata/ .inherits = &pdc_common_ops, .cable_detect = pdc_pata_cable_detect, .freeze = pdc_freeze, -diff -urNp linux-2.6.34.1/drivers/ata/sata_qstor.c linux-2.6.34.1/drivers/ata/sata_qstor.c ---- linux-2.6.34.1/drivers/ata/sata_qstor.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ata/sata_qstor.c 2010-07-07 09:04:50.000000000 -0400 -@@ -133,7 +133,7 @@ static struct scsi_host_template qs_ata_ +diff -urNp linux-2.6.35.4/drivers/ata/sata_qstor.c linux-2.6.35.4/drivers/ata/sata_qstor.c +--- linux-2.6.35.4/drivers/ata/sata_qstor.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ata/sata_qstor.c 2010-09-17 20:12:09.000000000 -0400 +@@ -131,7 +131,7 @@ static struct scsi_host_template qs_ata_ .dma_boundary = QS_DMA_BOUNDARY, }; @@ -21661,21 +22350,9 @@ diff -urNp linux-2.6.34.1/drivers/ata/sata_qstor.c linux-2.6.34.1/drivers/ata/sa .inherits = &ata_sff_port_ops, .check_atapi_dma = qs_check_atapi_dma, -diff -urNp linux-2.6.34.1/drivers/ata/sata_sil.c linux-2.6.34.1/drivers/ata/sata_sil.c ---- linux-2.6.34.1/drivers/ata/sata_sil.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ata/sata_sil.c 2010-07-07 09:04:50.000000000 -0400 -@@ -182,7 +182,7 @@ static struct scsi_host_template sil_sht - .sg_tablesize = ATA_MAX_PRD - }; - --static struct ata_port_operations sil_ops = { -+static const struct ata_port_operations sil_ops = { - .inherits = &ata_bmdma32_port_ops, - .dev_config = sil_dev_config, - .set_mode = sil_set_mode, -diff -urNp linux-2.6.34.1/drivers/ata/sata_sil24.c linux-2.6.34.1/drivers/ata/sata_sil24.c ---- linux-2.6.34.1/drivers/ata/sata_sil24.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ata/sata_sil24.c 2010-07-07 09:04:50.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/ata/sata_sil24.c linux-2.6.35.4/drivers/ata/sata_sil24.c +--- linux-2.6.35.4/drivers/ata/sata_sil24.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ata/sata_sil24.c 2010-09-17 20:12:09.000000000 -0400 @@ -389,7 +389,7 @@ static struct scsi_host_template sil24_s .dma_boundary = ATA_DMA_BOUNDARY, }; @@ -21685,9 +22362,21 @@ diff -urNp linux-2.6.34.1/drivers/ata/sata_sil24.c linux-2.6.34.1/drivers/ata/sa .inherits = &sata_pmp_port_ops, .qc_defer = sil24_qc_defer, -diff -urNp linux-2.6.34.1/drivers/ata/sata_sis.c linux-2.6.34.1/drivers/ata/sata_sis.c ---- linux-2.6.34.1/drivers/ata/sata_sis.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ata/sata_sis.c 2010-07-07 09:04:50.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/ata/sata_sil.c linux-2.6.35.4/drivers/ata/sata_sil.c +--- linux-2.6.35.4/drivers/ata/sata_sil.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ata/sata_sil.c 2010-09-17 20:12:09.000000000 -0400 +@@ -182,7 +182,7 @@ static struct scsi_host_template sil_sht + .sg_tablesize = ATA_MAX_PRD + }; + +-static struct ata_port_operations sil_ops = { ++static const struct ata_port_operations sil_ops = { + .inherits = &ata_bmdma32_port_ops, + .dev_config = sil_dev_config, + .set_mode = sil_set_mode, +diff -urNp linux-2.6.35.4/drivers/ata/sata_sis.c linux-2.6.35.4/drivers/ata/sata_sis.c +--- linux-2.6.35.4/drivers/ata/sata_sis.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ata/sata_sis.c 2010-09-17 20:12:09.000000000 -0400 @@ -89,7 +89,7 @@ static struct scsi_host_template sis_sht ATA_BMDMA_SHT(DRV_NAME), }; @@ -21697,9 +22386,9 @@ diff -urNp linux-2.6.34.1/drivers/ata/sata_sis.c linux-2.6.34.1/drivers/ata/sata .inherits = &ata_bmdma_port_ops, .scr_read = sis_scr_read, .scr_write = sis_scr_write, -diff -urNp linux-2.6.34.1/drivers/ata/sata_svw.c linux-2.6.34.1/drivers/ata/sata_svw.c ---- linux-2.6.34.1/drivers/ata/sata_svw.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ata/sata_svw.c 2010-07-07 09:04:50.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/ata/sata_svw.c linux-2.6.35.4/drivers/ata/sata_svw.c +--- linux-2.6.35.4/drivers/ata/sata_svw.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ata/sata_svw.c 2010-09-17 20:12:09.000000000 -0400 @@ -344,7 +344,7 @@ static struct scsi_host_template k2_sata }; @@ -21709,9 +22398,9 @@ diff -urNp linux-2.6.34.1/drivers/ata/sata_svw.c linux-2.6.34.1/drivers/ata/sata .inherits = &ata_bmdma_port_ops, .sff_tf_load = k2_sata_tf_load, .sff_tf_read = k2_sata_tf_read, -diff -urNp linux-2.6.34.1/drivers/ata/sata_sx4.c linux-2.6.34.1/drivers/ata/sata_sx4.c ---- linux-2.6.34.1/drivers/ata/sata_sx4.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ata/sata_sx4.c 2010-07-07 09:04:50.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/ata/sata_sx4.c linux-2.6.35.4/drivers/ata/sata_sx4.c +--- linux-2.6.35.4/drivers/ata/sata_sx4.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ata/sata_sx4.c 2010-09-17 20:12:09.000000000 -0400 @@ -249,7 +249,7 @@ static struct scsi_host_template pdc_sat }; @@ -21721,9 +22410,9 @@ diff -urNp linux-2.6.34.1/drivers/ata/sata_sx4.c linux-2.6.34.1/drivers/ata/sata .inherits = &ata_sff_port_ops, .check_atapi_dma = pdc_check_atapi_dma, -diff -urNp linux-2.6.34.1/drivers/ata/sata_uli.c linux-2.6.34.1/drivers/ata/sata_uli.c ---- linux-2.6.34.1/drivers/ata/sata_uli.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ata/sata_uli.c 2010-07-07 09:04:50.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/ata/sata_uli.c linux-2.6.35.4/drivers/ata/sata_uli.c +--- linux-2.6.35.4/drivers/ata/sata_uli.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ata/sata_uli.c 2010-09-17 20:12:09.000000000 -0400 @@ -80,7 +80,7 @@ static struct scsi_host_template uli_sht ATA_BMDMA_SHT(DRV_NAME), }; @@ -21733,9 +22422,9 @@ diff -urNp linux-2.6.34.1/drivers/ata/sata_uli.c linux-2.6.34.1/drivers/ata/sata .inherits = &ata_bmdma_port_ops, .scr_read = uli_scr_read, .scr_write = uli_scr_write, -diff -urNp linux-2.6.34.1/drivers/ata/sata_via.c linux-2.6.34.1/drivers/ata/sata_via.c ---- linux-2.6.34.1/drivers/ata/sata_via.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ata/sata_via.c 2010-07-07 09:04:50.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/ata/sata_via.c linux-2.6.35.4/drivers/ata/sata_via.c +--- linux-2.6.35.4/drivers/ata/sata_via.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ata/sata_via.c 2010-09-17 20:12:09.000000000 -0400 @@ -115,32 +115,32 @@ static struct scsi_host_template svia_sh ATA_BMDMA_SHT(DRV_NAME), }; @@ -21774,10 +22463,10 @@ diff -urNp linux-2.6.34.1/drivers/ata/sata_via.c linux-2.6.34.1/drivers/ata/sata .inherits = &svia_base_ops, .hardreset = sata_std_hardreset, .scr_read = vt8251_scr_read, -diff -urNp linux-2.6.34.1/drivers/ata/sata_vsc.c linux-2.6.34.1/drivers/ata/sata_vsc.c ---- linux-2.6.34.1/drivers/ata/sata_vsc.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ata/sata_vsc.c 2010-07-07 09:04:50.000000000 -0400 -@@ -306,7 +306,7 @@ static struct scsi_host_template vsc_sat +diff -urNp linux-2.6.35.4/drivers/ata/sata_vsc.c linux-2.6.35.4/drivers/ata/sata_vsc.c +--- linux-2.6.35.4/drivers/ata/sata_vsc.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ata/sata_vsc.c 2010-09-17 20:12:09.000000000 -0400 +@@ -300,7 +300,7 @@ static struct scsi_host_template vsc_sat }; @@ -21786,9 +22475,9 @@ diff -urNp linux-2.6.34.1/drivers/ata/sata_vsc.c linux-2.6.34.1/drivers/ata/sata .inherits = &ata_bmdma_port_ops, /* The IRQ handling is not quite standard SFF behaviour so we cannot use the default lost interrupt handler */ -diff -urNp linux-2.6.34.1/drivers/atm/adummy.c linux-2.6.34.1/drivers/atm/adummy.c ---- linux-2.6.34.1/drivers/atm/adummy.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/atm/adummy.c 2010-07-07 09:04:50.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/atm/adummy.c linux-2.6.35.4/drivers/atm/adummy.c +--- linux-2.6.35.4/drivers/atm/adummy.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/atm/adummy.c 2010-09-17 20:12:09.000000000 -0400 @@ -78,7 +78,7 @@ adummy_send(struct atm_vcc *vcc, struct vcc->pop(vcc, skb); else @@ -21798,9 +22487,9 @@ diff -urNp linux-2.6.34.1/drivers/atm/adummy.c linux-2.6.34.1/drivers/atm/adummy return 0; } -diff -urNp linux-2.6.34.1/drivers/atm/ambassador.c linux-2.6.34.1/drivers/atm/ambassador.c ---- linux-2.6.34.1/drivers/atm/ambassador.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/atm/ambassador.c 2010-07-07 09:04:50.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/atm/ambassador.c linux-2.6.35.4/drivers/atm/ambassador.c +--- linux-2.6.35.4/drivers/atm/ambassador.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/atm/ambassador.c 2010-09-17 20:12:09.000000000 -0400 @@ -454,7 +454,7 @@ static void tx_complete (amb_dev * dev, PRINTD (DBG_FLOW|DBG_TX, "tx_complete %p %p", dev, tx); @@ -21837,9 +22526,9 @@ diff -urNp linux-2.6.34.1/drivers/atm/ambassador.c linux-2.6.34.1/drivers/atm/am return -ENOMEM; // ? } -diff -urNp linux-2.6.34.1/drivers/atm/atmtcp.c linux-2.6.34.1/drivers/atm/atmtcp.c ---- linux-2.6.34.1/drivers/atm/atmtcp.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/atm/atmtcp.c 2010-07-07 09:04:50.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/atm/atmtcp.c linux-2.6.35.4/drivers/atm/atmtcp.c +--- linux-2.6.35.4/drivers/atm/atmtcp.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/atm/atmtcp.c 2010-09-17 20:12:09.000000000 -0400 @@ -207,7 +207,7 @@ static int atmtcp_v_send(struct atm_vcc if (vcc->pop) vcc->pop(vcc,skb); else dev_kfree_skb(skb); @@ -21889,9 +22578,9 @@ diff -urNp linux-2.6.34.1/drivers/atm/atmtcp.c linux-2.6.34.1/drivers/atm/atmtcp done: if (vcc->pop) vcc->pop(vcc,skb); else dev_kfree_skb(skb); -diff -urNp linux-2.6.34.1/drivers/atm/eni.c linux-2.6.34.1/drivers/atm/eni.c ---- linux-2.6.34.1/drivers/atm/eni.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/atm/eni.c 2010-07-07 09:04:50.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/atm/eni.c linux-2.6.35.4/drivers/atm/eni.c +--- linux-2.6.35.4/drivers/atm/eni.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/atm/eni.c 2010-09-17 20:12:09.000000000 -0400 @@ -526,7 +526,7 @@ static int rx_aal0(struct atm_vcc *vcc) DPRINTK(DEV_LABEL "(itf %d): trashing empty cell\n", vcc->dev->number); @@ -21937,9 +22626,9 @@ diff -urNp linux-2.6.34.1/drivers/atm/eni.c linux-2.6.34.1/drivers/atm/eni.c wake_up(&eni_dev->tx_wait); dma_complete++; } -diff -urNp linux-2.6.34.1/drivers/atm/firestream.c linux-2.6.34.1/drivers/atm/firestream.c ---- linux-2.6.34.1/drivers/atm/firestream.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/atm/firestream.c 2010-07-07 09:04:50.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/atm/firestream.c linux-2.6.35.4/drivers/atm/firestream.c +--- linux-2.6.35.4/drivers/atm/firestream.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/atm/firestream.c 2010-09-17 20:12:09.000000000 -0400 @@ -749,7 +749,7 @@ static void process_txdone_queue (struct } } @@ -21973,10 +22662,10 @@ diff -urNp linux-2.6.34.1/drivers/atm/firestream.c linux-2.6.34.1/drivers/atm/fi break; default: /* Hmm. Haven't written the code to handle the others yet... -- REW */ printk (KERN_WARNING "Don't know what to do with RX status %x: %s.\n", -diff -urNp linux-2.6.34.1/drivers/atm/fore200e.c linux-2.6.34.1/drivers/atm/fore200e.c ---- linux-2.6.34.1/drivers/atm/fore200e.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/atm/fore200e.c 2010-07-07 09:04:50.000000000 -0400 -@@ -931,9 +931,9 @@ fore200e_tx_irq(struct fore200e* fore200 +diff -urNp linux-2.6.35.4/drivers/atm/fore200e.c linux-2.6.35.4/drivers/atm/fore200e.c +--- linux-2.6.35.4/drivers/atm/fore200e.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/atm/fore200e.c 2010-09-17 20:12:09.000000000 -0400 +@@ -933,9 +933,9 @@ fore200e_tx_irq(struct fore200e* fore200 #endif /* check error condition */ if (*entry->status & STATUS_ERROR) @@ -21988,7 +22677,7 @@ diff -urNp linux-2.6.34.1/drivers/atm/fore200e.c linux-2.6.34.1/drivers/atm/fore } } -@@ -1082,7 +1082,7 @@ fore200e_push_rpd(struct fore200e* fore2 +@@ -1084,7 +1084,7 @@ fore200e_push_rpd(struct fore200e* fore2 if (skb == NULL) { DPRINTK(2, "unable to alloc new skb, rx PDU length = %d\n", pdu_len); @@ -21997,7 +22686,7 @@ diff -urNp linux-2.6.34.1/drivers/atm/fore200e.c linux-2.6.34.1/drivers/atm/fore return -ENOMEM; } -@@ -1125,14 +1125,14 @@ fore200e_push_rpd(struct fore200e* fore2 +@@ -1127,14 +1127,14 @@ fore200e_push_rpd(struct fore200e* fore2 dev_kfree_skb_any(skb); @@ -22014,7 +22703,7 @@ diff -urNp linux-2.6.34.1/drivers/atm/fore200e.c linux-2.6.34.1/drivers/atm/fore ASSERT(atomic_read(&sk_atm(vcc)->sk_wmem_alloc) >= 0); -@@ -1210,7 +1210,7 @@ fore200e_rx_irq(struct fore200e* fore200 +@@ -1212,7 +1212,7 @@ fore200e_rx_irq(struct fore200e* fore200 DPRINTK(2, "damaged PDU on %d.%d.%d\n", fore200e->atm_dev->number, entry->rpd->atm_header.vpi, entry->rpd->atm_header.vci); @@ -22023,7 +22712,7 @@ diff -urNp linux-2.6.34.1/drivers/atm/fore200e.c linux-2.6.34.1/drivers/atm/fore } } -@@ -1655,7 +1655,7 @@ fore200e_send(struct atm_vcc *vcc, struc +@@ -1657,7 +1657,7 @@ fore200e_send(struct atm_vcc *vcc, struc goto retry_here; } @@ -22032,9 +22721,9 @@ diff -urNp linux-2.6.34.1/drivers/atm/fore200e.c linux-2.6.34.1/drivers/atm/fore fore200e->tx_sat++; DPRINTK(2, "tx queue of device %s is saturated, PDU dropped - heartbeat is %08x\n", -diff -urNp linux-2.6.34.1/drivers/atm/he.c linux-2.6.34.1/drivers/atm/he.c ---- linux-2.6.34.1/drivers/atm/he.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/atm/he.c 2010-07-07 09:04:50.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/atm/he.c linux-2.6.35.4/drivers/atm/he.c +--- linux-2.6.35.4/drivers/atm/he.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/atm/he.c 2010-09-17 20:12:09.000000000 -0400 @@ -1770,7 +1770,7 @@ he_service_rbrq(struct he_dev *he_dev, i if (RBRQ_HBUF_ERR(he_dev->rbrq_head)) { @@ -22116,9 +22805,9 @@ diff -urNp linux-2.6.34.1/drivers/atm/he.c linux-2.6.34.1/drivers/atm/he.c return 0; } -diff -urNp linux-2.6.34.1/drivers/atm/horizon.c linux-2.6.34.1/drivers/atm/horizon.c ---- linux-2.6.34.1/drivers/atm/horizon.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/atm/horizon.c 2010-07-07 09:04:51.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/atm/horizon.c linux-2.6.35.4/drivers/atm/horizon.c +--- linux-2.6.35.4/drivers/atm/horizon.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/atm/horizon.c 2010-09-17 20:12:09.000000000 -0400 @@ -1034,7 +1034,7 @@ static void rx_schedule (hrz_dev * dev, { struct atm_vcc * vcc = ATM_SKB(skb)->vcc; @@ -22137,9 +22826,9 @@ diff -urNp linux-2.6.34.1/drivers/atm/horizon.c linux-2.6.34.1/drivers/atm/horiz // free the skb hrz_kfree_skb (skb); -diff -urNp linux-2.6.34.1/drivers/atm/idt77252.c linux-2.6.34.1/drivers/atm/idt77252.c ---- linux-2.6.34.1/drivers/atm/idt77252.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/atm/idt77252.c 2010-07-07 09:04:51.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/atm/idt77252.c linux-2.6.35.4/drivers/atm/idt77252.c +--- linux-2.6.35.4/drivers/atm/idt77252.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/atm/idt77252.c 2010-09-17 20:12:09.000000000 -0400 @@ -811,7 +811,7 @@ drain_scq(struct idt77252_dev *card, str else dev_kfree_skb(skb); @@ -22294,9 +22983,9 @@ diff -urNp linux-2.6.34.1/drivers/atm/idt77252.c linux-2.6.34.1/drivers/atm/idt7 return -ENOMEM; } atomic_add(skb->truesize, &sk_atm(vcc)->sk_wmem_alloc); -diff -urNp linux-2.6.34.1/drivers/atm/iphase.c linux-2.6.34.1/drivers/atm/iphase.c ---- linux-2.6.34.1/drivers/atm/iphase.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/atm/iphase.c 2010-07-07 09:04:51.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/atm/iphase.c linux-2.6.35.4/drivers/atm/iphase.c +--- linux-2.6.35.4/drivers/atm/iphase.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/atm/iphase.c 2010-09-17 20:12:09.000000000 -0400 @@ -1124,7 +1124,7 @@ static int rx_pkt(struct atm_dev *dev) status = (u_short) (buf_desc_ptr->desc_mode); if (status & (RX_CER | RX_PTE | RX_OFL)) @@ -22393,9 +23082,9 @@ diff -urNp linux-2.6.34.1/drivers/atm/iphase.c linux-2.6.34.1/drivers/atm/iphase if (iavcc->vc_desc_cnt > 10) { vcc->tx_quota = vcc->tx_quota * 3 / 4; printk("Tx1: vcc->tx_quota = %d \n", (u32)vcc->tx_quota ); -diff -urNp linux-2.6.34.1/drivers/atm/lanai.c linux-2.6.34.1/drivers/atm/lanai.c ---- linux-2.6.34.1/drivers/atm/lanai.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/atm/lanai.c 2010-07-07 09:04:51.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/atm/lanai.c linux-2.6.35.4/drivers/atm/lanai.c +--- linux-2.6.35.4/drivers/atm/lanai.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/atm/lanai.c 2010-09-17 20:12:09.000000000 -0400 @@ -1303,7 +1303,7 @@ static void lanai_send_one_aal5(struct l vcc_tx_add_aal5_trailer(lvcc, skb->len, 0, 0); lanai_endtx(lanai, lvcc); @@ -22450,9 +23139,9 @@ diff -urNp linux-2.6.34.1/drivers/atm/lanai.c linux-2.6.34.1/drivers/atm/lanai.c lvcc->stats.x.aal5.service_rxcrc++; lvcc->rx.buf.ptr = &lvcc->rx.buf.start[SERVICE_GET_END(s) * 4]; cardvcc_write(lvcc, SERVICE_GET_END(s), vcc_rxreadptr); -diff -urNp linux-2.6.34.1/drivers/atm/nicstar.c linux-2.6.34.1/drivers/atm/nicstar.c ---- linux-2.6.34.1/drivers/atm/nicstar.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/atm/nicstar.c 2010-07-07 09:04:51.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/atm/nicstar.c linux-2.6.35.4/drivers/atm/nicstar.c +--- linux-2.6.35.4/drivers/atm/nicstar.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/atm/nicstar.c 2010-09-17 20:12:09.000000000 -0400 @@ -1722,7 +1722,7 @@ static int ns_send(struct atm_vcc *vcc, if ((vc = (vc_map *) vcc->dev_data) == NULL) { @@ -22655,9 +23344,9 @@ diff -urNp linux-2.6.34.1/drivers/atm/nicstar.c linux-2.6.34.1/drivers/atm/nicst } } -diff -urNp linux-2.6.34.1/drivers/atm/solos-pci.c linux-2.6.34.1/drivers/atm/solos-pci.c ---- linux-2.6.34.1/drivers/atm/solos-pci.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/atm/solos-pci.c 2010-07-07 09:04:51.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/atm/solos-pci.c linux-2.6.35.4/drivers/atm/solos-pci.c +--- linux-2.6.35.4/drivers/atm/solos-pci.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/atm/solos-pci.c 2010-09-17 20:12:09.000000000 -0400 @@ -715,7 +715,7 @@ void solos_bh(unsigned long card_arg) } atm_charge(vcc, skb->truesize); @@ -22667,7 +23356,7 @@ diff -urNp linux-2.6.34.1/drivers/atm/solos-pci.c linux-2.6.34.1/drivers/atm/sol break; case PKT_STATUS: -@@ -1018,7 +1018,7 @@ static uint32_t fpga_tx(struct solos_car +@@ -1023,7 +1023,7 @@ static uint32_t fpga_tx(struct solos_car vcc = SKB_CB(oldskb)->vcc; if (vcc) { @@ -22676,9 +23365,9 @@ diff -urNp linux-2.6.34.1/drivers/atm/solos-pci.c linux-2.6.34.1/drivers/atm/sol solos_pop(vcc, oldskb); } else dev_kfree_skb_irq(oldskb); -diff -urNp linux-2.6.34.1/drivers/atm/suni.c linux-2.6.34.1/drivers/atm/suni.c ---- linux-2.6.34.1/drivers/atm/suni.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/atm/suni.c 2010-07-07 09:04:51.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/atm/suni.c linux-2.6.35.4/drivers/atm/suni.c +--- linux-2.6.35.4/drivers/atm/suni.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/atm/suni.c 2010-09-17 20:12:09.000000000 -0400 @@ -50,8 +50,8 @@ static DEFINE_SPINLOCK(sunis_lock); @@ -22690,9 +23379,9 @@ diff -urNp linux-2.6.34.1/drivers/atm/suni.c linux-2.6.34.1/drivers/atm/suni.c static void suni_hz(unsigned long from_timer) -diff -urNp linux-2.6.34.1/drivers/atm/uPD98402.c linux-2.6.34.1/drivers/atm/uPD98402.c ---- linux-2.6.34.1/drivers/atm/uPD98402.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/atm/uPD98402.c 2010-07-07 09:04:51.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/atm/uPD98402.c linux-2.6.35.4/drivers/atm/uPD98402.c +--- linux-2.6.35.4/drivers/atm/uPD98402.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/atm/uPD98402.c 2010-09-17 20:12:09.000000000 -0400 @@ -42,7 +42,7 @@ static int fetch_stats(struct atm_dev *d struct sonet_stats tmp; int error = 0; @@ -22737,9 +23426,9 @@ diff -urNp linux-2.6.34.1/drivers/atm/uPD98402.c linux-2.6.34.1/drivers/atm/uPD9 return 0; } -diff -urNp linux-2.6.34.1/drivers/atm/zatm.c linux-2.6.34.1/drivers/atm/zatm.c ---- linux-2.6.34.1/drivers/atm/zatm.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/atm/zatm.c 2010-07-07 09:04:51.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/atm/zatm.c linux-2.6.35.4/drivers/atm/zatm.c +--- linux-2.6.35.4/drivers/atm/zatm.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/atm/zatm.c 2010-09-17 20:12:09.000000000 -0400 @@ -459,7 +459,7 @@ printk("dummy: 0x%08lx, 0x%08lx\n",dummy } if (!size) { @@ -22767,9 +23456,9 @@ diff -urNp linux-2.6.34.1/drivers/atm/zatm.c linux-2.6.34.1/drivers/atm/zatm.c wake_up(&zatm_vcc->tx_wait); } -diff -urNp linux-2.6.34.1/drivers/char/agp/frontend.c linux-2.6.34.1/drivers/char/agp/frontend.c ---- linux-2.6.34.1/drivers/char/agp/frontend.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/char/agp/frontend.c 2010-07-07 09:04:51.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/char/agp/frontend.c linux-2.6.35.4/drivers/char/agp/frontend.c +--- linux-2.6.35.4/drivers/char/agp/frontend.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/char/agp/frontend.c 2010-09-17 20:12:09.000000000 -0400 @@ -818,7 +818,7 @@ static int agpioc_reserve_wrap(struct ag if (copy_from_user(&reserve, arg, sizeof(struct agp_region))) return -EFAULT; @@ -22779,10 +23468,10 @@ diff -urNp linux-2.6.34.1/drivers/char/agp/frontend.c linux-2.6.34.1/drivers/cha return -EFAULT; client = agp_find_client_by_pid(reserve.pid); -diff -urNp linux-2.6.34.1/drivers/char/agp/intel-agp.c linux-2.6.34.1/drivers/char/agp/intel-agp.c ---- linux-2.6.34.1/drivers/char/agp/intel-agp.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/char/agp/intel-agp.c 2010-07-07 09:04:51.000000000 -0400 -@@ -2697,7 +2697,7 @@ static struct pci_device_id agp_intel_pc +diff -urNp linux-2.6.35.4/drivers/char/agp/intel-agp.c linux-2.6.35.4/drivers/char/agp/intel-agp.c +--- linux-2.6.35.4/drivers/char/agp/intel-agp.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/char/agp/intel-agp.c 2010-09-17 20:12:09.000000000 -0400 +@@ -1036,7 +1036,7 @@ static struct pci_device_id agp_intel_pc ID(PCI_DEVICE_ID_INTEL_IRONLAKE_MC2_HB), ID(PCI_DEVICE_ID_INTEL_SANDYBRIDGE_HB), ID(PCI_DEVICE_ID_INTEL_SANDYBRIDGE_M_HB), @@ -22791,9 +23480,9 @@ diff -urNp linux-2.6.34.1/drivers/char/agp/intel-agp.c linux-2.6.34.1/drivers/ch }; MODULE_DEVICE_TABLE(pci, agp_intel_pci_table); -diff -urNp linux-2.6.34.1/drivers/char/hpet.c linux-2.6.34.1/drivers/char/hpet.c ---- linux-2.6.34.1/drivers/char/hpet.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/char/hpet.c 2010-07-07 09:04:51.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/char/hpet.c linux-2.6.35.4/drivers/char/hpet.c +--- linux-2.6.35.4/drivers/char/hpet.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/char/hpet.c 2010-09-17 20:12:09.000000000 -0400 @@ -429,7 +429,7 @@ static int hpet_release(struct inode *in return 0; } @@ -22801,9 +23490,9 @@ diff -urNp linux-2.6.34.1/drivers/char/hpet.c linux-2.6.34.1/drivers/char/hpet.c -static int hpet_ioctl_common(struct hpet_dev *, int, unsigned long, int); +static int hpet_ioctl_common(struct hpet_dev *, unsigned int, unsigned long, int); - static int - hpet_ioctl(struct inode *inode, struct file *file, unsigned int cmd, -@@ -549,7 +549,7 @@ static inline unsigned long hpet_time_di + static long hpet_ioctl(struct file *file, unsigned int cmd, + unsigned long arg) +@@ -553,7 +553,7 @@ static inline unsigned long hpet_time_di } static int @@ -22812,7 +23501,7 @@ diff -urNp linux-2.6.34.1/drivers/char/hpet.c linux-2.6.34.1/drivers/char/hpet.c { struct hpet_timer __iomem *timer; struct hpet __iomem *hpet; -@@ -994,7 +994,7 @@ static struct acpi_driver hpet_acpi_driv +@@ -998,7 +998,7 @@ static struct acpi_driver hpet_acpi_driv }, }; @@ -22821,9 +23510,9 @@ diff -urNp linux-2.6.34.1/drivers/char/hpet.c linux-2.6.34.1/drivers/char/hpet.c static int __init hpet_init(void) { -diff -urNp linux-2.6.34.1/drivers/char/hvc_console.h linux-2.6.34.1/drivers/char/hvc_console.h ---- linux-2.6.34.1/drivers/char/hvc_console.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/char/hvc_console.h 2010-07-07 09:04:51.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/char/hvc_console.h linux-2.6.35.4/drivers/char/hvc_console.h +--- linux-2.6.35.4/drivers/char/hvc_console.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/char/hvc_console.h 2010-09-17 20:12:09.000000000 -0400 @@ -82,6 +82,7 @@ extern int hvc_instantiate(uint32_t vter /* register a vterm for hvc tty operation (module_init or hotplug add) */ extern struct hvc_struct * hvc_alloc(uint32_t vtermno, int data, @@ -22832,9 +23521,9 @@ diff -urNp linux-2.6.34.1/drivers/char/hvc_console.h linux-2.6.34.1/drivers/char /* remove a vterm from hvc tty operation (module_exit or hotplug remove) */ extern int hvc_remove(struct hvc_struct *hp); -diff -urNp linux-2.6.34.1/drivers/char/hvcs.c linux-2.6.34.1/drivers/char/hvcs.c ---- linux-2.6.34.1/drivers/char/hvcs.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/char/hvcs.c 2010-07-07 09:04:51.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/char/hvcs.c linux-2.6.35.4/drivers/char/hvcs.c +--- linux-2.6.35.4/drivers/char/hvcs.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/char/hvcs.c 2010-09-17 20:12:09.000000000 -0400 @@ -270,7 +270,7 @@ struct hvcs_struct { unsigned int index; @@ -22929,9 +23618,9 @@ diff -urNp linux-2.6.34.1/drivers/char/hvcs.c linux-2.6.34.1/drivers/char/hvcs.c return 0; return HVCS_BUFF_LEN - hvcsd->chars_in_buffer; -diff -urNp linux-2.6.34.1/drivers/char/ipmi/ipmi_msghandler.c linux-2.6.34.1/drivers/char/ipmi/ipmi_msghandler.c ---- linux-2.6.34.1/drivers/char/ipmi/ipmi_msghandler.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/char/ipmi/ipmi_msghandler.c 2010-07-07 09:04:51.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/char/ipmi/ipmi_msghandler.c linux-2.6.35.4/drivers/char/ipmi/ipmi_msghandler.c +--- linux-2.6.35.4/drivers/char/ipmi/ipmi_msghandler.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/char/ipmi/ipmi_msghandler.c 2010-09-17 20:12:09.000000000 -0400 @@ -414,7 +414,7 @@ struct ipmi_smi { struct proc_dir_entry *proc_dir; char proc_dir_name[10]; @@ -22953,7 +23642,7 @@ diff -urNp linux-2.6.34.1/drivers/char/ipmi/ipmi_msghandler.c linux-2.6.34.1/dri static int is_lan_addr(struct ipmi_addr *addr) { -@@ -2818,7 +2818,7 @@ int ipmi_register_smi(struct ipmi_smi_ha +@@ -2817,7 +2817,7 @@ int ipmi_register_smi(struct ipmi_smi_ha INIT_LIST_HEAD(&intf->cmd_rcvrs); init_waitqueue_head(&intf->waitq); for (i = 0; i < IPMI_NUM_STATS; i++) @@ -22962,10 +23651,10 @@ diff -urNp linux-2.6.34.1/drivers/char/ipmi/ipmi_msghandler.c linux-2.6.34.1/dri intf->proc_dir = NULL; -diff -urNp linux-2.6.34.1/drivers/char/ipmi/ipmi_si_intf.c linux-2.6.34.1/drivers/char/ipmi/ipmi_si_intf.c ---- linux-2.6.34.1/drivers/char/ipmi/ipmi_si_intf.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/char/ipmi/ipmi_si_intf.c 2010-07-07 09:04:51.000000000 -0400 -@@ -278,7 +278,7 @@ struct smi_info { +diff -urNp linux-2.6.35.4/drivers/char/ipmi/ipmi_si_intf.c linux-2.6.35.4/drivers/char/ipmi/ipmi_si_intf.c +--- linux-2.6.35.4/drivers/char/ipmi/ipmi_si_intf.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/char/ipmi/ipmi_si_intf.c 2010-09-17 20:12:09.000000000 -0400 +@@ -286,7 +286,7 @@ struct smi_info { unsigned char slave_addr; /* Counters and things for the proc filesystem. */ @@ -22974,7 +23663,7 @@ diff -urNp linux-2.6.34.1/drivers/char/ipmi/ipmi_si_intf.c linux-2.6.34.1/driver struct task_struct *thread; -@@ -286,9 +286,9 @@ struct smi_info { +@@ -294,9 +294,9 @@ struct smi_info { }; #define smi_inc_stat(smi, stat) \ @@ -22986,19 +23675,19 @@ diff -urNp linux-2.6.34.1/drivers/char/ipmi/ipmi_si_intf.c linux-2.6.34.1/driver #define SI_MAX_PARMS 4 -@@ -3088,7 +3088,7 @@ static int try_smi_init(struct smi_info +@@ -3143,7 +3143,7 @@ static int try_smi_init(struct smi_info atomic_set(&new_smi->req_events, 0); new_smi->run_to_completion = 0; for (i = 0; i < SI_NUM_STATS; i++) - atomic_set(&new_smi->stats[i], 0); + atomic_set_unchecked(&new_smi->stats[i], 0); - new_smi->interrupt_disabled = 0; + new_smi->interrupt_disabled = 1; atomic_set(&new_smi->stop_operation, 0); -diff -urNp linux-2.6.34.1/drivers/char/keyboard.c linux-2.6.34.1/drivers/char/keyboard.c ---- linux-2.6.34.1/drivers/char/keyboard.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/char/keyboard.c 2010-07-07 09:04:51.000000000 -0400 -@@ -652,6 +652,16 @@ static void k_spec(struct vc_data *vc, u +diff -urNp linux-2.6.35.4/drivers/char/keyboard.c linux-2.6.35.4/drivers/char/keyboard.c +--- linux-2.6.35.4/drivers/char/keyboard.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/char/keyboard.c 2010-09-17 20:12:37.000000000 -0400 +@@ -640,6 +640,16 @@ static void k_spec(struct vc_data *vc, u kbd->kbdmode == VC_MEDIUMRAW) && value != KVAL(K_SAK)) return; /* SAK is allowed even in raw mode */ @@ -23015,7 +23704,7 @@ diff -urNp linux-2.6.34.1/drivers/char/keyboard.c linux-2.6.34.1/drivers/char/ke fn_handler[value](vc); } -@@ -1407,7 +1417,7 @@ static const struct input_device_id kbd_ +@@ -1392,7 +1402,7 @@ static const struct input_device_id kbd_ .evbit = { BIT_MASK(EV_SND) }, }, @@ -23024,9 +23713,9 @@ diff -urNp linux-2.6.34.1/drivers/char/keyboard.c linux-2.6.34.1/drivers/char/ke }; MODULE_DEVICE_TABLE(input, kbd_ids); -diff -urNp linux-2.6.34.1/drivers/char/mem.c linux-2.6.34.1/drivers/char/mem.c ---- linux-2.6.34.1/drivers/char/mem.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/char/mem.c 2010-07-07 09:04:51.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/char/mem.c linux-2.6.35.4/drivers/char/mem.c +--- linux-2.6.35.4/drivers/char/mem.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/char/mem.c 2010-09-17 20:12:37.000000000 -0400 @@ -18,6 +18,7 @@ #include #include @@ -23046,7 +23735,40 @@ diff -urNp linux-2.6.34.1/drivers/char/mem.c linux-2.6.34.1/drivers/char/mem.c static inline unsigned long size_inside_page(unsigned long start, unsigned long size) { -@@ -161,6 +166,11 @@ static ssize_t write_mem(struct file *fi +@@ -120,6 +125,7 @@ static ssize_t read_mem(struct file *fil + + while (count > 0) { + unsigned long remaining; ++ char *temp; + + sz = size_inside_page(p, count); + +@@ -135,7 +141,23 @@ static ssize_t read_mem(struct file *fil + if (!ptr) + return -EFAULT; + +- remaining = copy_to_user(buf, ptr, sz); ++#ifdef CONFIG_PAX_USERCOPY ++ temp = kmalloc(sz, GFP_KERNEL); ++ if (!temp) { ++ unxlate_dev_mem_ptr(p, ptr); ++ return -ENOMEM; ++ } ++ memcpy(temp, ptr, sz); ++#else ++ temp = ptr; ++#endif ++ ++ remaining = copy_to_user(buf, temp, sz); ++ ++#ifdef CONFIG_PAX_USERCOPY ++ kfree(temp); ++#endif ++ + unxlate_dev_mem_ptr(p, ptr); + if (remaining) + return -EFAULT; +@@ -161,6 +183,11 @@ static ssize_t write_mem(struct file *fi if (!valid_phys_addr_range(p, count)) return -EFAULT; @@ -23058,7 +23780,7 @@ diff -urNp linux-2.6.34.1/drivers/char/mem.c linux-2.6.34.1/drivers/char/mem.c written = 0; #ifdef __ARCH_HAS_NO_PAGE_ZERO_MAPPED -@@ -316,6 +326,11 @@ static int mmap_mem(struct file *file, s +@@ -316,6 +343,11 @@ static int mmap_mem(struct file *file, s &vma->vm_page_prot)) return -EINVAL; @@ -23070,7 +23792,51 @@ diff -urNp linux-2.6.34.1/drivers/char/mem.c linux-2.6.34.1/drivers/char/mem.c vma->vm_page_prot = phys_mem_access_prot(file, vma->vm_pgoff, size, vma->vm_page_prot); -@@ -530,6 +545,11 @@ static ssize_t write_kmem(struct file *f +@@ -398,9 +430,8 @@ static ssize_t read_kmem(struct file *fi + size_t count, loff_t *ppos) + { + unsigned long p = *ppos; +- ssize_t low_count, read, sz; ++ ssize_t low_count, read, sz, err = 0; + char * kbuf; /* k-addr because vread() takes vmlist_lock rwlock */ +- int err = 0; + + read = 0; + if (p < (unsigned long) high_memory) { +@@ -422,6 +453,8 @@ static ssize_t read_kmem(struct file *fi + } + #endif + while (low_count > 0) { ++ char *temp; ++ + sz = size_inside_page(p, low_count); + + /* +@@ -431,7 +464,22 @@ static ssize_t read_kmem(struct file *fi + */ + kbuf = xlate_dev_kmem_ptr((char *)p); + +- if (copy_to_user(buf, kbuf, sz)) ++#ifdef CONFIG_PAX_USERCOPY ++ temp = kmalloc(sz, GFP_KERNEL); ++ if (!temp) ++ return -ENOMEM; ++ memcpy(temp, kbuf, sz); ++#else ++ temp = kbuf; ++#endif ++ ++ err = copy_to_user(buf, temp, sz); ++ ++#ifdef CONFIG_PAX_USERCOPY ++ kfree(temp); ++#endif ++ ++ if (err) + return -EFAULT; + buf += sz; + p += sz; +@@ -530,6 +578,11 @@ static ssize_t write_kmem(struct file *f char * kbuf; /* k-addr because vwrite() takes vmlist_lock rwlock */ int err = 0; @@ -23082,7 +23848,7 @@ diff -urNp linux-2.6.34.1/drivers/char/mem.c linux-2.6.34.1/drivers/char/mem.c if (p < (unsigned long) high_memory) { unsigned long to_write = min_t(unsigned long, count, (unsigned long)high_memory - p); -@@ -731,6 +751,16 @@ static loff_t memory_lseek(struct file * +@@ -731,6 +784,16 @@ static loff_t memory_lseek(struct file * static int open_port(struct inode * inode, struct file * filp) { @@ -23099,7 +23865,7 @@ diff -urNp linux-2.6.34.1/drivers/char/mem.c linux-2.6.34.1/drivers/char/mem.c return capable(CAP_SYS_RAWIO) ? 0 : -EPERM; } -@@ -738,7 +768,6 @@ static int open_port(struct inode * inod +@@ -738,7 +801,6 @@ static int open_port(struct inode * inod #define full_lseek null_lseek #define write_zero write_null #define read_full read_zero @@ -23107,7 +23873,7 @@ diff -urNp linux-2.6.34.1/drivers/char/mem.c linux-2.6.34.1/drivers/char/mem.c #define open_kmem open_mem #define open_oldmem open_mem -@@ -854,6 +883,9 @@ static const struct memdev { +@@ -854,6 +916,9 @@ static const struct memdev { #ifdef CONFIG_CRASH_DUMP [12] = { "oldmem", 0, &oldmem_fops, NULL }, #endif @@ -23117,9 +23883,9 @@ diff -urNp linux-2.6.34.1/drivers/char/mem.c linux-2.6.34.1/drivers/char/mem.c }; static int memory_open(struct inode *inode, struct file *filp) -diff -urNp linux-2.6.34.1/drivers/char/n_tty.c linux-2.6.34.1/drivers/char/n_tty.c ---- linux-2.6.34.1/drivers/char/n_tty.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/char/n_tty.c 2010-07-07 09:04:51.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/char/n_tty.c linux-2.6.35.4/drivers/char/n_tty.c +--- linux-2.6.35.4/drivers/char/n_tty.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/char/n_tty.c 2010-09-17 20:12:09.000000000 -0400 @@ -2105,6 +2105,7 @@ void n_tty_inherit_ops(struct tty_ldisc_ { *ops = tty_ldisc_N_TTY; @@ -23129,9 +23895,9 @@ diff -urNp linux-2.6.34.1/drivers/char/n_tty.c linux-2.6.34.1/drivers/char/n_tty + ops->flags = 0; } EXPORT_SYMBOL_GPL(n_tty_inherit_ops); -diff -urNp linux-2.6.34.1/drivers/char/nvram.c linux-2.6.34.1/drivers/char/nvram.c ---- linux-2.6.34.1/drivers/char/nvram.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/char/nvram.c 2010-07-07 09:04:51.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/char/nvram.c linux-2.6.35.4/drivers/char/nvram.c +--- linux-2.6.35.4/drivers/char/nvram.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/char/nvram.c 2010-09-17 20:12:09.000000000 -0400 @@ -245,7 +245,7 @@ static ssize_t nvram_read(struct file *f spin_unlock_irq(&rtc_lock); @@ -23141,7 +23907,7 @@ diff -urNp linux-2.6.34.1/drivers/char/nvram.c linux-2.6.34.1/drivers/char/nvram return -EFAULT; *ppos = i; -@@ -430,7 +430,10 @@ static const struct file_operations nvra +@@ -434,7 +434,10 @@ static const struct file_operations nvra static struct miscdevice nvram_dev = { NVRAM_MINOR, "nvram", @@ -23153,9 +23919,9 @@ diff -urNp linux-2.6.34.1/drivers/char/nvram.c linux-2.6.34.1/drivers/char/nvram }; static int __init nvram_init(void) -diff -urNp linux-2.6.34.1/drivers/char/pcmcia/ipwireless/tty.c linux-2.6.34.1/drivers/char/pcmcia/ipwireless/tty.c ---- linux-2.6.34.1/drivers/char/pcmcia/ipwireless/tty.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/char/pcmcia/ipwireless/tty.c 2010-07-07 09:04:51.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/char/pcmcia/ipwireless/tty.c linux-2.6.35.4/drivers/char/pcmcia/ipwireless/tty.c +--- linux-2.6.35.4/drivers/char/pcmcia/ipwireless/tty.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/char/pcmcia/ipwireless/tty.c 2010-09-17 20:12:09.000000000 -0400 @@ -51,7 +51,7 @@ struct ipw_tty { int tty_type; struct ipw_network *network; @@ -23261,7 +24027,7 @@ diff -urNp linux-2.6.34.1/drivers/char/pcmcia/ipwireless/tty.c linux-2.6.34.1/dr return -EINVAL; /* FIXME: Exactly how is the tty object locked here .. */ -@@ -591,7 +589,7 @@ void ipwireless_tty_free(struct ipw_tty +@@ -582,7 +580,7 @@ void ipwireless_tty_free(struct ipw_tty against a parallel ioctl etc */ mutex_lock(&ttyj->ipw_tty_mutex); } @@ -23270,9 +24036,9 @@ diff -urNp linux-2.6.34.1/drivers/char/pcmcia/ipwireless/tty.c linux-2.6.34.1/dr do_ipw_close(ttyj); ipwireless_disassociate_network_ttys(network, ttyj->channel_idx); -diff -urNp linux-2.6.34.1/drivers/char/pty.c linux-2.6.34.1/drivers/char/pty.c ---- linux-2.6.34.1/drivers/char/pty.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/char/pty.c 2010-07-07 09:04:51.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/char/pty.c linux-2.6.35.4/drivers/char/pty.c +--- linux-2.6.35.4/drivers/char/pty.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/char/pty.c 2010-09-17 20:12:09.000000000 -0400 @@ -677,7 +677,18 @@ static int ptmx_open(struct inode *inode return ret; } @@ -23303,9 +24069,9 @@ diff -urNp linux-2.6.34.1/drivers/char/pty.c linux-2.6.34.1/drivers/char/pty.c cdev_init(&ptmx_cdev, &ptmx_fops); if (cdev_add(&ptmx_cdev, MKDEV(TTYAUX_MAJOR, 2), 1) || register_chrdev_region(MKDEV(TTYAUX_MAJOR, 2), 1, "/dev/ptmx") < 0) -diff -urNp linux-2.6.34.1/drivers/char/random.c linux-2.6.34.1/drivers/char/random.c ---- linux-2.6.34.1/drivers/char/random.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/char/random.c 2010-07-07 09:04:51.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/char/random.c linux-2.6.35.4/drivers/char/random.c +--- linux-2.6.35.4/drivers/char/random.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/char/random.c 2010-09-17 20:24:41.000000000 -0400 @@ -254,8 +254,13 @@ /* * Configuration information @@ -23318,9 +24084,9 @@ diff -urNp linux-2.6.34.1/drivers/char/random.c linux-2.6.34.1/drivers/char/rand #define OUTPUT_POOL_WORDS 32 +#endif #define SEC_XFER_SIZE 512 + #define EXTRACT_SIZE 10 - /* -@@ -292,10 +297,17 @@ static struct poolinfo { +@@ -293,10 +298,17 @@ static struct poolinfo { int poolwords; int tap1, tap2, tap3, tap4, tap5; } poolinfo_table[] = { @@ -23338,7 +24104,7 @@ diff -urNp linux-2.6.34.1/drivers/char/random.c linux-2.6.34.1/drivers/char/rand #if 0 /* x^2048 + x^1638 + x^1231 + x^819 + x^411 + x + 1 -- 115 */ { 2048, 1638, 1231, 819, 411, 1 }, -@@ -903,7 +915,7 @@ static ssize_t extract_entropy_user(stru +@@ -902,7 +914,7 @@ static ssize_t extract_entropy_user(stru extract_buf(r, tmp); i = min_t(int, nbytes, EXTRACT_SIZE); @@ -23347,7 +24113,7 @@ diff -urNp linux-2.6.34.1/drivers/char/random.c linux-2.6.34.1/drivers/char/rand ret = -EFAULT; break; } -@@ -1209,7 +1221,7 @@ EXPORT_SYMBOL(generate_random_uuid); +@@ -1205,7 +1217,7 @@ EXPORT_SYMBOL(generate_random_uuid); #include static int min_read_thresh = 8, min_write_thresh; @@ -23356,9 +24122,9 @@ diff -urNp linux-2.6.34.1/drivers/char/random.c linux-2.6.34.1/drivers/char/rand static int max_write_thresh = INPUT_POOL_WORDS * 32; static char sysctl_bootid[16]; -diff -urNp linux-2.6.34.1/drivers/char/sonypi.c linux-2.6.34.1/drivers/char/sonypi.c ---- linux-2.6.34.1/drivers/char/sonypi.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/char/sonypi.c 2010-07-07 09:04:51.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/char/sonypi.c linux-2.6.35.4/drivers/char/sonypi.c +--- linux-2.6.35.4/drivers/char/sonypi.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/char/sonypi.c 2010-09-17 20:12:09.000000000 -0400 @@ -491,7 +491,7 @@ static struct sonypi_device { spinlock_t fifo_lock; wait_queue_head_t fifo_proc_list; @@ -23389,9 +24155,9 @@ diff -urNp linux-2.6.34.1/drivers/char/sonypi.c linux-2.6.34.1/drivers/char/sony mutex_unlock(&sonypi_device.lock); return 0; -diff -urNp linux-2.6.34.1/drivers/char/tpm/tpm_bios.c linux-2.6.34.1/drivers/char/tpm/tpm_bios.c ---- linux-2.6.34.1/drivers/char/tpm/tpm_bios.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/char/tpm/tpm_bios.c 2010-07-07 09:04:51.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/char/tpm/tpm_bios.c linux-2.6.35.4/drivers/char/tpm/tpm_bios.c +--- linux-2.6.35.4/drivers/char/tpm/tpm_bios.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/char/tpm/tpm_bios.c 2010-09-17 20:12:09.000000000 -0400 @@ -173,7 +173,7 @@ static void *tpm_bios_measurements_start event = addr; @@ -23432,9 +24198,9 @@ diff -urNp linux-2.6.34.1/drivers/char/tpm/tpm_bios.c linux-2.6.34.1/drivers/cha memcpy(log->bios_event_log, virt, len); -diff -urNp linux-2.6.34.1/drivers/char/tty_io.c linux-2.6.34.1/drivers/char/tty_io.c ---- linux-2.6.34.1/drivers/char/tty_io.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/char/tty_io.c 2010-07-07 09:04:51.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/char/tty_io.c linux-2.6.35.4/drivers/char/tty_io.c +--- linux-2.6.35.4/drivers/char/tty_io.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/char/tty_io.c 2010-09-17 20:12:09.000000000 -0400 @@ -136,20 +136,10 @@ LIST_HEAD(tty_drivers); /* linked list DEFINE_MUTEX(tty_mutex); EXPORT_SYMBOL(tty_mutex); @@ -23564,9 +24330,9 @@ diff -urNp linux-2.6.34.1/drivers/char/tty_io.c linux-2.6.34.1/drivers/char/tty_ /* * Initialize the console device. This is called *early*, so * we can't necessarily depend on lots of kernel help here. -diff -urNp linux-2.6.34.1/drivers/char/tty_ldisc.c linux-2.6.34.1/drivers/char/tty_ldisc.c ---- linux-2.6.34.1/drivers/char/tty_ldisc.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/char/tty_ldisc.c 2010-07-07 09:04:51.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/char/tty_ldisc.c linux-2.6.35.4/drivers/char/tty_ldisc.c +--- linux-2.6.35.4/drivers/char/tty_ldisc.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/char/tty_ldisc.c 2010-09-17 20:12:09.000000000 -0400 @@ -75,7 +75,7 @@ static void put_ldisc(struct tty_ldisc * if (atomic_dec_and_lock(&ld->users, &tty_ldisc_lock)) { struct tty_ldisc_ops *ldo = ld->ops; @@ -23612,40 +24378,56 @@ diff -urNp linux-2.6.34.1/drivers/char/tty_ldisc.c linux-2.6.34.1/drivers/char/t module_put(ldops->owner); spin_unlock_irqrestore(&tty_ldisc_lock, flags); } -diff -urNp linux-2.6.34.1/drivers/char/vt_ioctl.c linux-2.6.34.1/drivers/char/vt_ioctl.c ---- linux-2.6.34.1/drivers/char/vt_ioctl.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/char/vt_ioctl.c 2010-07-07 09:04:51.000000000 -0400 -@@ -226,6 +226,12 @@ do_kdsk_ioctl(int cmd, struct kbentry __ +diff -urNp linux-2.6.35.4/drivers/char/vt_ioctl.c linux-2.6.35.4/drivers/char/vt_ioctl.c +--- linux-2.6.35.4/drivers/char/vt_ioctl.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/char/vt_ioctl.c 2010-09-17 20:12:37.000000000 -0400 +@@ -210,9 +210,6 @@ do_kdsk_ioctl(int cmd, struct kbentry __ + if (copy_from_user(&tmp, user_kbe, sizeof(struct kbentry))) + return -EFAULT; + +- if (!capable(CAP_SYS_TTY_CONFIG)) +- perm = 0; +- + switch (cmd) { + case KDGKBENT: + key_map = key_maps[s]; +@@ -224,8 +221,12 @@ do_kdsk_ioctl(int cmd, struct kbentry __ + val = (i ? K_HOLE : K_NOSUCHMAP); + return put_user(val, &user_kbe->kb_value); case KDSKBENT: ++ if (!capable(CAP_SYS_TTY_CONFIG)) ++ perm = 0; ++ if (!perm) return -EPERM; -+ -+#ifdef CONFIG_GRKERNSEC -+ if (!capable(CAP_SYS_TTY_CONFIG)) -+ return -EPERM; -+#endif + if (!i && v == K_NOSUCHMAP) { /* deallocate map */ key_map = key_maps[s]; -@@ -366,6 +372,13 @@ do_kdgkb_ioctl(int cmd, struct kbsentry - goto reterr; - } +@@ -325,9 +326,6 @@ do_kdgkb_ioctl(int cmd, struct kbsentry + int i, j, k; + int ret; -+#ifdef CONFIG_GRKERNSEC -+ if (!capable(CAP_SYS_TTY_CONFIG)) { -+ ret = -EPERM; -+ goto reterr; -+ } -+#endif +- if (!capable(CAP_SYS_TTY_CONFIG)) +- perm = 0; +- + kbs = kmalloc(sizeof(*kbs), GFP_KERNEL); + if (!kbs) { + ret = -ENOMEM; +@@ -361,6 +359,9 @@ do_kdgkb_ioctl(int cmd, struct kbsentry + kfree(kbs); + return ((p && *p) ? -EOVERFLOW : 0); + case KDSKBSENT: ++ if (!capable(CAP_SYS_TTY_CONFIG)) ++ perm = 0; + - q = func_table[i]; - first_free = funcbufptr + (funcbufsize - funcbufleft); - for (j = i+1; j < MAX_NR_FUNC && !func_table[j]; j++) -diff -urNp linux-2.6.34.1/drivers/cpuidle/sysfs.c linux-2.6.34.1/drivers/cpuidle/sysfs.c ---- linux-2.6.34.1/drivers/cpuidle/sysfs.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/cpuidle/sysfs.c 2010-07-07 09:04:51.000000000 -0400 -@@ -299,7 +299,7 @@ static struct kobj_type ktype_state_cpui + if (!perm) { + ret = -EPERM; + goto reterr; +diff -urNp linux-2.6.35.4/drivers/cpuidle/sysfs.c linux-2.6.35.4/drivers/cpuidle/sysfs.c +--- linux-2.6.35.4/drivers/cpuidle/sysfs.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/cpuidle/sysfs.c 2010-09-17 20:12:09.000000000 -0400 +@@ -300,7 +300,7 @@ static struct kobj_type ktype_state_cpui .release = cpuidle_state_sysfs_release, }; @@ -23654,9 +24436,9 @@ diff -urNp linux-2.6.34.1/drivers/cpuidle/sysfs.c linux-2.6.34.1/drivers/cpuidle { kobject_put(&device->kobjs[i]->kobj); wait_for_completion(&device->kobjs[i]->kobj_unregister); -diff -urNp linux-2.6.34.1/drivers/edac/edac_core.h linux-2.6.34.1/drivers/edac/edac_core.h ---- linux-2.6.34.1/drivers/edac/edac_core.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/edac/edac_core.h 2010-07-07 09:04:51.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/edac/edac_core.h linux-2.6.35.4/drivers/edac/edac_core.h +--- linux-2.6.35.4/drivers/edac/edac_core.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/edac/edac_core.h 2010-09-17 20:12:09.000000000 -0400 @@ -100,11 +100,11 @@ extern const char *edac_mem_types[]; #else /* !CONFIG_EDAC_DEBUG */ @@ -23674,9 +24456,21 @@ diff -urNp linux-2.6.34.1/drivers/edac/edac_core.h linux-2.6.34.1/drivers/edac/e #endif /* !CONFIG_EDAC_DEBUG */ -diff -urNp linux-2.6.34.1/drivers/firewire/core-cdev.c linux-2.6.34.1/drivers/firewire/core-cdev.c ---- linux-2.6.34.1/drivers/firewire/core-cdev.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/firewire/core-cdev.c 2010-07-07 09:04:51.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/edac/edac_mc_sysfs.c linux-2.6.35.4/drivers/edac/edac_mc_sysfs.c +--- linux-2.6.35.4/drivers/edac/edac_mc_sysfs.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/edac/edac_mc_sysfs.c 2010-09-17 20:12:09.000000000 -0400 +@@ -776,7 +776,7 @@ static void edac_inst_grp_release(struct + } + + /* Intermediate show/store table */ +-static struct sysfs_ops inst_grp_ops = { ++static const struct sysfs_ops inst_grp_ops = { + .show = inst_grp_show, + .store = inst_grp_store + }; +diff -urNp linux-2.6.35.4/drivers/firewire/core-cdev.c linux-2.6.35.4/drivers/firewire/core-cdev.c +--- linux-2.6.35.4/drivers/firewire/core-cdev.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/firewire/core-cdev.c 2010-09-17 20:12:09.000000000 -0400 @@ -1195,8 +1195,7 @@ static int init_iso_resource(struct clie int ret; @@ -23687,9 +24481,9 @@ diff -urNp linux-2.6.34.1/drivers/firewire/core-cdev.c linux-2.6.34.1/drivers/fi return -EINVAL; r = kmalloc(sizeof(*r), GFP_KERNEL); -diff -urNp linux-2.6.34.1/drivers/firmware/dmi_scan.c linux-2.6.34.1/drivers/firmware/dmi_scan.c ---- linux-2.6.34.1/drivers/firmware/dmi_scan.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/firmware/dmi_scan.c 2010-07-07 09:04:51.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/firmware/dmi_scan.c linux-2.6.35.4/drivers/firmware/dmi_scan.c +--- linux-2.6.35.4/drivers/firmware/dmi_scan.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/firmware/dmi_scan.c 2010-09-17 20:12:09.000000000 -0400 @@ -387,11 +387,6 @@ void __init dmi_scan_machine(void) } } @@ -23702,9 +24496,9 @@ diff -urNp linux-2.6.34.1/drivers/firmware/dmi_scan.c linux-2.6.34.1/drivers/fir p = dmi_ioremap(0xF0000, 0x10000); if (p == NULL) goto error; -diff -urNp linux-2.6.34.1/drivers/gpu/drm/drm_drv.c linux-2.6.34.1/drivers/gpu/drm/drm_drv.c ---- linux-2.6.34.1/drivers/gpu/drm/drm_drv.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/gpu/drm/drm_drv.c 2010-07-07 09:04:51.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/gpu/drm/drm_drv.c linux-2.6.35.4/drivers/gpu/drm/drm_drv.c +--- linux-2.6.35.4/drivers/gpu/drm/drm_drv.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/gpu/drm/drm_drv.c 2010-09-17 20:12:09.000000000 -0400 @@ -449,7 +449,7 @@ long drm_ioctl(struct file *filp, dev = file_priv->minor->dev; @@ -23714,9 +24508,9 @@ diff -urNp linux-2.6.34.1/drivers/gpu/drm/drm_drv.c linux-2.6.34.1/drivers/gpu/d ++file_priv->ioctl_count; DRM_DEBUG("pid=%d, cmd=0x%02x, nr=0x%02x, dev 0x%lx, auth=%d\n", -diff -urNp linux-2.6.34.1/drivers/gpu/drm/drm_fops.c linux-2.6.34.1/drivers/gpu/drm/drm_fops.c ---- linux-2.6.34.1/drivers/gpu/drm/drm_fops.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/gpu/drm/drm_fops.c 2010-07-07 09:04:51.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/gpu/drm/drm_fops.c linux-2.6.35.4/drivers/gpu/drm/drm_fops.c +--- linux-2.6.35.4/drivers/gpu/drm/drm_fops.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/gpu/drm/drm_fops.c 2010-09-17 20:12:09.000000000 -0400 @@ -67,7 +67,7 @@ static int drm_setup(struct drm_device * } @@ -23738,7 +24532,7 @@ diff -urNp linux-2.6.34.1/drivers/gpu/drm/drm_fops.c linux-2.6.34.1/drivers/gpu/ spin_unlock(&dev->count_lock); retcode = drm_setup(dev); goto out; -@@ -475,7 +475,7 @@ int drm_release(struct inode *inode, str +@@ -474,7 +474,7 @@ int drm_release(struct inode *inode, str lock_kernel(); @@ -23747,7 +24541,7 @@ diff -urNp linux-2.6.34.1/drivers/gpu/drm/drm_fops.c linux-2.6.34.1/drivers/gpu/ if (dev->driver->preclose) dev->driver->preclose(dev, file_priv); -@@ -487,7 +487,7 @@ int drm_release(struct inode *inode, str +@@ -486,7 +486,7 @@ int drm_release(struct inode *inode, str DRM_DEBUG("pid = %d, device = 0x%lx, open_count = %d\n", task_pid_nr(current), (long)old_encode_dev(file_priv->minor->device), @@ -23756,7 +24550,7 @@ diff -urNp linux-2.6.34.1/drivers/gpu/drm/drm_fops.c linux-2.6.34.1/drivers/gpu/ /* if the master has gone away we can't do anything with the lock */ if (file_priv->minor->master) -@@ -568,9 +568,9 @@ int drm_release(struct inode *inode, str +@@ -567,9 +567,9 @@ int drm_release(struct inode *inode, str * End inline drm_release */ @@ -23768,9 +24562,9 @@ diff -urNp linux-2.6.34.1/drivers/gpu/drm/drm_fops.c linux-2.6.34.1/drivers/gpu/ if (atomic_read(&dev->ioctl_count)) { DRM_ERROR("Device busy: %d\n", atomic_read(&dev->ioctl_count)); -diff -urNp linux-2.6.34.1/drivers/gpu/drm/drm_ioctl.c linux-2.6.34.1/drivers/gpu/drm/drm_ioctl.c ---- linux-2.6.34.1/drivers/gpu/drm/drm_ioctl.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/gpu/drm/drm_ioctl.c 2010-07-07 09:04:51.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/gpu/drm/drm_ioctl.c linux-2.6.35.4/drivers/gpu/drm/drm_ioctl.c +--- linux-2.6.35.4/drivers/gpu/drm/drm_ioctl.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/gpu/drm/drm_ioctl.c 2010-09-17 20:12:09.000000000 -0400 @@ -283,7 +283,7 @@ int drm_getstats(struct drm_device *dev, stats->data[i].value = (file_priv->master->lock.hw_lock ? file_priv->master->lock.hw_lock->lock : 0); @@ -23780,9 +24574,9 @@ diff -urNp linux-2.6.34.1/drivers/gpu/drm/drm_ioctl.c linux-2.6.34.1/drivers/gpu stats->data[i].type = dev->types[i]; } -diff -urNp linux-2.6.34.1/drivers/gpu/drm/drm_lock.c linux-2.6.34.1/drivers/gpu/drm/drm_lock.c ---- linux-2.6.34.1/drivers/gpu/drm/drm_lock.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/gpu/drm/drm_lock.c 2010-07-07 09:04:51.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/gpu/drm/drm_lock.c linux-2.6.35.4/drivers/gpu/drm/drm_lock.c +--- linux-2.6.35.4/drivers/gpu/drm/drm_lock.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/gpu/drm/drm_lock.c 2010-09-17 20:12:09.000000000 -0400 @@ -87,7 +87,7 @@ int drm_lock(struct drm_device *dev, voi if (drm_lock_take(&master->lock, lock->context)) { master->lock.file_priv = file_priv; @@ -23801,9 +24595,9 @@ diff -urNp linux-2.6.34.1/drivers/gpu/drm/drm_lock.c linux-2.6.34.1/drivers/gpu/ /* kernel_context_switch isn't used by any of the x86 drm * modules but is required by the Sparc driver. -diff -urNp linux-2.6.34.1/drivers/gpu/drm/i810/i810_dma.c linux-2.6.34.1/drivers/gpu/drm/i810/i810_dma.c ---- linux-2.6.34.1/drivers/gpu/drm/i810/i810_dma.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/gpu/drm/i810/i810_dma.c 2010-07-07 09:04:51.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/gpu/drm/i810/i810_dma.c linux-2.6.35.4/drivers/gpu/drm/i810/i810_dma.c +--- linux-2.6.35.4/drivers/gpu/drm/i810/i810_dma.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/gpu/drm/i810/i810_dma.c 2010-09-17 20:12:09.000000000 -0400 @@ -953,8 +953,8 @@ static int i810_dma_vertex(struct drm_de dma->buflist[vertex->idx], vertex->discard, vertex->used); @@ -23826,10 +24620,34 @@ diff -urNp linux-2.6.34.1/drivers/gpu/drm/i810/i810_dma.c linux-2.6.34.1/drivers sarea_priv->last_enqueue = dev_priv->counter - 1; sarea_priv->last_dispatch = (int)hw_status[5]; -diff -urNp linux-2.6.34.1/drivers/gpu/drm/i915/dvo.h linux-2.6.34.1/drivers/gpu/drm/i915/dvo.h ---- linux-2.6.34.1/drivers/gpu/drm/i915/dvo.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/gpu/drm/i915/dvo.h 2010-07-07 09:04:51.000000000 -0400 -@@ -135,23 +135,23 @@ struct intel_dvo_dev_ops { +diff -urNp linux-2.6.35.4/drivers/gpu/drm/i915/dvo_ch7017.c linux-2.6.35.4/drivers/gpu/drm/i915/dvo_ch7017.c +--- linux-2.6.35.4/drivers/gpu/drm/i915/dvo_ch7017.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/gpu/drm/i915/dvo_ch7017.c 2010-09-17 20:12:09.000000000 -0400 +@@ -402,7 +402,7 @@ static void ch7017_destroy(struct intel_ + } + } + +-struct intel_dvo_dev_ops ch7017_ops = { ++const struct intel_dvo_dev_ops ch7017_ops = { + .init = ch7017_init, + .detect = ch7017_detect, + .mode_valid = ch7017_mode_valid, +diff -urNp linux-2.6.35.4/drivers/gpu/drm/i915/dvo_ch7xxx.c linux-2.6.35.4/drivers/gpu/drm/i915/dvo_ch7xxx.c +--- linux-2.6.35.4/drivers/gpu/drm/i915/dvo_ch7xxx.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/gpu/drm/i915/dvo_ch7xxx.c 2010-09-17 20:12:09.000000000 -0400 +@@ -322,7 +322,7 @@ static void ch7xxx_destroy(struct intel_ + } + } + +-struct intel_dvo_dev_ops ch7xxx_ops = { ++const struct intel_dvo_dev_ops ch7xxx_ops = { + .init = ch7xxx_init, + .detect = ch7xxx_detect, + .mode_valid = ch7xxx_mode_valid, +diff -urNp linux-2.6.35.4/drivers/gpu/drm/i915/dvo.h linux-2.6.35.4/drivers/gpu/drm/i915/dvo.h +--- linux-2.6.35.4/drivers/gpu/drm/i915/dvo.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/gpu/drm/i915/dvo.h 2010-09-17 20:12:09.000000000 -0400 +@@ -125,23 +125,23 @@ struct intel_dvo_dev_ops { * * \return singly-linked list of modes or NULL if no modes found. */ @@ -23861,34 +24679,10 @@ diff -urNp linux-2.6.34.1/drivers/gpu/drm/i915/dvo.h linux-2.6.34.1/drivers/gpu/ +extern const struct intel_dvo_dev_ops ch7017_ops; #endif /* _INTEL_DVO_H */ -diff -urNp linux-2.6.34.1/drivers/gpu/drm/i915/dvo_ch7017.c linux-2.6.34.1/drivers/gpu/drm/i915/dvo_ch7017.c ---- linux-2.6.34.1/drivers/gpu/drm/i915/dvo_ch7017.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/gpu/drm/i915/dvo_ch7017.c 2010-07-07 09:04:51.000000000 -0400 -@@ -444,7 +444,7 @@ static void ch7017_destroy(struct intel_ - } - } - --struct intel_dvo_dev_ops ch7017_ops = { -+const struct intel_dvo_dev_ops ch7017_ops = { - .init = ch7017_init, - .detect = ch7017_detect, - .mode_valid = ch7017_mode_valid, -diff -urNp linux-2.6.34.1/drivers/gpu/drm/i915/dvo_ch7xxx.c linux-2.6.34.1/drivers/gpu/drm/i915/dvo_ch7xxx.c ---- linux-2.6.34.1/drivers/gpu/drm/i915/dvo_ch7xxx.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/gpu/drm/i915/dvo_ch7xxx.c 2010-07-07 09:04:51.000000000 -0400 -@@ -358,7 +358,7 @@ static void ch7xxx_destroy(struct intel_ - } - } - --struct intel_dvo_dev_ops ch7xxx_ops = { -+const struct intel_dvo_dev_ops ch7xxx_ops = { - .init = ch7xxx_init, - .detect = ch7xxx_detect, - .mode_valid = ch7xxx_mode_valid, -diff -urNp linux-2.6.34.1/drivers/gpu/drm/i915/dvo_ivch.c linux-2.6.34.1/drivers/gpu/drm/i915/dvo_ivch.c ---- linux-2.6.34.1/drivers/gpu/drm/i915/dvo_ivch.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/gpu/drm/i915/dvo_ivch.c 2010-07-07 09:04:51.000000000 -0400 -@@ -431,7 +431,7 @@ static void ivch_destroy(struct intel_dv +diff -urNp linux-2.6.35.4/drivers/gpu/drm/i915/dvo_ivch.c linux-2.6.35.4/drivers/gpu/drm/i915/dvo_ivch.c +--- linux-2.6.35.4/drivers/gpu/drm/i915/dvo_ivch.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/gpu/drm/i915/dvo_ivch.c 2010-09-17 20:12:09.000000000 -0400 +@@ -412,7 +412,7 @@ static void ivch_destroy(struct intel_dv } } @@ -23896,11 +24690,11 @@ diff -urNp linux-2.6.34.1/drivers/gpu/drm/i915/dvo_ivch.c linux-2.6.34.1/drivers +const struct intel_dvo_dev_ops ivch_ops= { .init = ivch_init, .dpms = ivch_dpms, - .save = ivch_save, -diff -urNp linux-2.6.34.1/drivers/gpu/drm/i915/dvo_sil164.c linux-2.6.34.1/drivers/gpu/drm/i915/dvo_sil164.c ---- linux-2.6.34.1/drivers/gpu/drm/i915/dvo_sil164.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/gpu/drm/i915/dvo_sil164.c 2010-07-07 09:04:51.000000000 -0400 -@@ -290,7 +290,7 @@ static void sil164_destroy(struct intel_ + .mode_valid = ivch_mode_valid, +diff -urNp linux-2.6.35.4/drivers/gpu/drm/i915/dvo_sil164.c linux-2.6.35.4/drivers/gpu/drm/i915/dvo_sil164.c +--- linux-2.6.35.4/drivers/gpu/drm/i915/dvo_sil164.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/gpu/drm/i915/dvo_sil164.c 2010-09-17 20:12:09.000000000 -0400 +@@ -254,7 +254,7 @@ static void sil164_destroy(struct intel_ } } @@ -23909,10 +24703,10 @@ diff -urNp linux-2.6.34.1/drivers/gpu/drm/i915/dvo_sil164.c linux-2.6.34.1/drive .init = sil164_init, .detect = sil164_detect, .mode_valid = sil164_mode_valid, -diff -urNp linux-2.6.34.1/drivers/gpu/drm/i915/dvo_tfp410.c linux-2.6.34.1/drivers/gpu/drm/i915/dvo_tfp410.c ---- linux-2.6.34.1/drivers/gpu/drm/i915/dvo_tfp410.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/gpu/drm/i915/dvo_tfp410.c 2010-07-07 09:04:51.000000000 -0400 -@@ -325,7 +325,7 @@ static void tfp410_destroy(struct intel_ +diff -urNp linux-2.6.35.4/drivers/gpu/drm/i915/dvo_tfp410.c linux-2.6.35.4/drivers/gpu/drm/i915/dvo_tfp410.c +--- linux-2.6.35.4/drivers/gpu/drm/i915/dvo_tfp410.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/gpu/drm/i915/dvo_tfp410.c 2010-09-17 20:12:09.000000000 -0400 +@@ -295,7 +295,7 @@ static void tfp410_destroy(struct intel_ } } @@ -23921,10 +24715,10 @@ diff -urNp linux-2.6.34.1/drivers/gpu/drm/i915/dvo_tfp410.c linux-2.6.34.1/drive .init = tfp410_init, .detect = tfp410_detect, .mode_valid = tfp410_mode_valid, -diff -urNp linux-2.6.34.1/drivers/gpu/drm/i915/i915_dma.c linux-2.6.34.1/drivers/gpu/drm/i915/i915_dma.c ---- linux-2.6.34.1/drivers/gpu/drm/i915/i915_dma.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/gpu/drm/i915/i915_dma.c 2010-07-07 09:04:51.000000000 -0400 -@@ -1416,7 +1416,7 @@ static bool i915_switcheroo_can_switch(s +diff -urNp linux-2.6.35.4/drivers/gpu/drm/i915/i915_dma.c linux-2.6.35.4/drivers/gpu/drm/i915/i915_dma.c +--- linux-2.6.35.4/drivers/gpu/drm/i915/i915_dma.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/gpu/drm/i915/i915_dma.c 2010-09-17 20:12:09.000000000 -0400 +@@ -1342,7 +1342,7 @@ static bool i915_switcheroo_can_switch(s bool can_switch; spin_lock(&dev->count_lock); @@ -23933,10 +24727,10 @@ diff -urNp linux-2.6.34.1/drivers/gpu/drm/i915/i915_dma.c linux-2.6.34.1/drivers spin_unlock(&dev->count_lock); return can_switch; } -diff -urNp linux-2.6.34.1/drivers/gpu/drm/i915/i915_drv.c linux-2.6.34.1/drivers/gpu/drm/i915/i915_drv.c ---- linux-2.6.34.1/drivers/gpu/drm/i915/i915_drv.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/gpu/drm/i915/i915_drv.c 2010-07-07 09:04:51.000000000 -0400 -@@ -484,7 +484,7 @@ const struct dev_pm_ops i915_pm_ops = { +diff -urNp linux-2.6.35.4/drivers/gpu/drm/i915/i915_drv.c linux-2.6.35.4/drivers/gpu/drm/i915/i915_drv.c +--- linux-2.6.35.4/drivers/gpu/drm/i915/i915_drv.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/gpu/drm/i915/i915_drv.c 2010-09-17 20:12:09.000000000 -0400 +@@ -491,7 +491,7 @@ const struct dev_pm_ops i915_pm_ops = { .restore = i915_pm_resume, }; @@ -23945,9 +24739,9 @@ diff -urNp linux-2.6.34.1/drivers/gpu/drm/i915/i915_drv.c linux-2.6.34.1/drivers .fault = i915_gem_fault, .open = drm_gem_vm_open, .close = drm_gem_vm_close, -diff -urNp linux-2.6.34.1/drivers/gpu/drm/nouveau/nouveau_backlight.c linux-2.6.34.1/drivers/gpu/drm/nouveau/nouveau_backlight.c ---- linux-2.6.34.1/drivers/gpu/drm/nouveau/nouveau_backlight.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/gpu/drm/nouveau/nouveau_backlight.c 2010-07-07 09:04:51.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/gpu/drm/nouveau/nouveau_backlight.c linux-2.6.35.4/drivers/gpu/drm/nouveau/nouveau_backlight.c +--- linux-2.6.35.4/drivers/gpu/drm/nouveau/nouveau_backlight.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/gpu/drm/nouveau/nouveau_backlight.c 2010-09-17 20:12:09.000000000 -0400 @@ -58,7 +58,7 @@ static int nv40_set_intensity(struct bac return 0; } @@ -23966,10 +24760,10 @@ diff -urNp linux-2.6.34.1/drivers/gpu/drm/nouveau/nouveau_backlight.c linux-2.6. .options = BL_CORE_SUSPENDRESUME, .get_brightness = nv50_get_intensity, .update_status = nv50_set_intensity, -diff -urNp linux-2.6.34.1/drivers/gpu/drm/nouveau/nouveau_state.c linux-2.6.34.1/drivers/gpu/drm/nouveau/nouveau_state.c ---- linux-2.6.34.1/drivers/gpu/drm/nouveau/nouveau_state.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/gpu/drm/nouveau/nouveau_state.c 2010-07-07 09:04:51.000000000 -0400 -@@ -391,7 +391,7 @@ static bool nouveau_switcheroo_can_switc +diff -urNp linux-2.6.35.4/drivers/gpu/drm/nouveau/nouveau_state.c linux-2.6.35.4/drivers/gpu/drm/nouveau/nouveau_state.c +--- linux-2.6.35.4/drivers/gpu/drm/nouveau/nouveau_state.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/gpu/drm/nouveau/nouveau_state.c 2010-09-17 20:12:09.000000000 -0400 +@@ -395,7 +395,7 @@ static bool nouveau_switcheroo_can_switc bool can_switch; spin_lock(&dev->count_lock); @@ -23978,9 +24772,9 @@ diff -urNp linux-2.6.34.1/drivers/gpu/drm/nouveau/nouveau_state.c linux-2.6.34.1 spin_unlock(&dev->count_lock); return can_switch; } -diff -urNp linux-2.6.34.1/drivers/gpu/drm/radeon/mkregtable.c linux-2.6.34.1/drivers/gpu/drm/radeon/mkregtable.c ---- linux-2.6.34.1/drivers/gpu/drm/radeon/mkregtable.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/gpu/drm/radeon/mkregtable.c 2010-07-07 09:04:51.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/gpu/drm/radeon/mkregtable.c linux-2.6.35.4/drivers/gpu/drm/radeon/mkregtable.c +--- linux-2.6.35.4/drivers/gpu/drm/radeon/mkregtable.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/gpu/drm/radeon/mkregtable.c 2010-09-17 20:12:09.000000000 -0400 @@ -637,14 +637,14 @@ static int parser_auth(struct table *t, regex_t mask_rex; regmatch_t match[4]; @@ -23998,38 +24792,10 @@ diff -urNp linux-2.6.34.1/drivers/gpu/drm/radeon/mkregtable.c linux-2.6.34.1/dri if (regcomp (&mask_rex, "(0x[0-9a-fA-F]*) *([_a-zA-Z0-9]*)", REG_EXTENDED)) { -diff -urNp linux-2.6.34.1/drivers/gpu/drm/radeon/radeon_atombios.c linux-2.6.34.1/drivers/gpu/drm/radeon/radeon_atombios.c ---- linux-2.6.34.1/drivers/gpu/drm/radeon/radeon_atombios.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/gpu/drm/radeon/radeon_atombios.c 2010-07-07 09:04:51.000000000 -0400 -@@ -658,14 +658,14 @@ static uint16_t atombios_get_connector_o - } - } - --struct bios_connector { -+static struct bios_connector { - bool valid; - uint16_t line_mux; - uint16_t devices; - int connector_type; - struct radeon_i2c_bus_rec ddc_bus; - struct radeon_hpd hpd; --}; -+} bios_connectors[ATOM_MAX_SUPPORTED_DEVICE]; - - bool radeon_get_atom_connector_info_from_supported_devices_table(struct - drm_device -@@ -681,7 +681,6 @@ bool radeon_get_atom_connector_info_from - uint8_t dac; - union atom_supported_devices *supported_devices; - int i, j, max_device; -- struct bios_connector bios_connectors[ATOM_MAX_SUPPORTED_DEVICE]; - - if (!atom_parse_data_header(ctx, index, &size, &frev, &crev, &data_offset)) - return false; -diff -urNp linux-2.6.34.1/drivers/gpu/drm/radeon/radeon_device.c linux-2.6.34.1/drivers/gpu/drm/radeon/radeon_device.c ---- linux-2.6.34.1/drivers/gpu/drm/radeon/radeon_device.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/gpu/drm/radeon/radeon_device.c 2010-07-07 09:04:51.000000000 -0400 -@@ -560,7 +560,7 @@ static bool radeon_switcheroo_can_switch +diff -urNp linux-2.6.35.4/drivers/gpu/drm/radeon/radeon_device.c linux-2.6.35.4/drivers/gpu/drm/radeon/radeon_device.c +--- linux-2.6.35.4/drivers/gpu/drm/radeon/radeon_device.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/gpu/drm/radeon/radeon_device.c 2010-09-17 20:12:09.000000000 -0400 +@@ -562,7 +562,7 @@ static bool radeon_switcheroo_can_switch bool can_switch; spin_lock(&dev->count_lock); @@ -24038,10 +24804,10 @@ diff -urNp linux-2.6.34.1/drivers/gpu/drm/radeon/radeon_device.c linux-2.6.34.1/ spin_unlock(&dev->count_lock); return can_switch; } -diff -urNp linux-2.6.34.1/drivers/gpu/drm/radeon/radeon_display.c linux-2.6.34.1/drivers/gpu/drm/radeon/radeon_display.c ---- linux-2.6.34.1/drivers/gpu/drm/radeon/radeon_display.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/gpu/drm/radeon/radeon_display.c 2010-07-07 09:04:51.000000000 -0400 -@@ -560,7 +560,7 @@ static void radeon_compute_pll_legacy(st +diff -urNp linux-2.6.35.4/drivers/gpu/drm/radeon/radeon_display.c linux-2.6.35.4/drivers/gpu/drm/radeon/radeon_display.c +--- linux-2.6.35.4/drivers/gpu/drm/radeon/radeon_display.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/gpu/drm/radeon/radeon_display.c 2010-09-17 20:12:09.000000000 -0400 +@@ -559,7 +559,7 @@ static void radeon_compute_pll_legacy(st if (pll->flags & RADEON_PLL_PREFER_CLOSEST_LOWER) { error = freq - current_freq; @@ -24050,9 +24816,9 @@ diff -urNp linux-2.6.34.1/drivers/gpu/drm/radeon/radeon_display.c linux-2.6.34.1 } else error = abs(current_freq - freq); vco_diff = abs(vco - best_vco); -diff -urNp linux-2.6.34.1/drivers/gpu/drm/radeon/radeon_state.c linux-2.6.34.1/drivers/gpu/drm/radeon/radeon_state.c ---- linux-2.6.34.1/drivers/gpu/drm/radeon/radeon_state.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/gpu/drm/radeon/radeon_state.c 2010-07-07 09:04:51.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/gpu/drm/radeon/radeon_state.c linux-2.6.35.4/drivers/gpu/drm/radeon/radeon_state.c +--- linux-2.6.35.4/drivers/gpu/drm/radeon/radeon_state.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/gpu/drm/radeon/radeon_state.c 2010-09-17 20:12:09.000000000 -0400 @@ -2168,7 +2168,7 @@ static int radeon_cp_clear(struct drm_de if (sarea_priv->nbox > RADEON_NR_SAREA_CLIPRECTS) sarea_priv->nbox = RADEON_NR_SAREA_CLIPRECTS; @@ -24071,38 +24837,49 @@ diff -urNp linux-2.6.34.1/drivers/gpu/drm/radeon/radeon_state.c linux-2.6.34.1/d DRM_DEBUG("pid=%d\n", DRM_CURRENTPID); -diff -urNp linux-2.6.34.1/drivers/gpu/drm/radeon/radeon_ttm.c linux-2.6.34.1/drivers/gpu/drm/radeon/radeon_ttm.c ---- linux-2.6.34.1/drivers/gpu/drm/radeon/radeon_ttm.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/gpu/drm/radeon/radeon_ttm.c 2010-07-07 09:04:51.000000000 -0400 -@@ -565,27 +565,10 @@ void radeon_ttm_fini(struct radeon_devic +diff -urNp linux-2.6.35.4/drivers/gpu/drm/radeon/radeon_ttm.c linux-2.6.35.4/drivers/gpu/drm/radeon/radeon_ttm.c +--- linux-2.6.35.4/drivers/gpu/drm/radeon/radeon_ttm.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/gpu/drm/radeon/radeon_ttm.c 2010-09-17 20:12:09.000000000 -0400 +@@ -601,8 +601,9 @@ void radeon_ttm_fini(struct radeon_devic DRM_INFO("radeon: ttm finalized\n"); } -static struct vm_operations_struct radeon_ttm_vm_ops; -static const struct vm_operations_struct *ttm_vm_ops = NULL; -- --static int radeon_ttm_fault(struct vm_area_struct *vma, struct vm_fault *vmf) --{ -- struct ttm_buffer_object *bo; -- int r; -- -- bo = (struct ttm_buffer_object *)vma->vm_private_data; ++extern int ttm_bo_vm_fault(struct vm_area_struct *vma, struct vm_fault *vmf); ++extern void ttm_bo_vm_open(struct vm_area_struct *vma); ++extern void ttm_bo_vm_close(struct vm_area_struct *vma); + + static int radeon_ttm_fault(struct vm_area_struct *vma, struct vm_fault *vmf) + { +@@ -610,17 +611,22 @@ static int radeon_ttm_fault(struct vm_ar + struct radeon_device *rdev; + int r; + +- bo = (struct ttm_buffer_object *)vma->vm_private_data; - if (bo == NULL) { -- return VM_FAULT_NOPAGE; ++ bo = (struct ttm_buffer_object *)vma->vm_private_data; ++ if (!bo) + return VM_FAULT_NOPAGE; - } + rdev = radeon_get_rdev(bo->bdev); + mutex_lock(&rdev->vram_mutex); - r = ttm_vm_ops->fault(vma, vmf); -- return r; --} -- ++ r = ttm_bo_vm_fault(vma, vmf); + mutex_unlock(&rdev->vram_mutex); + return r; + } + ++static const struct vm_operations_struct radeon_ttm_vm_ops = { ++ .fault = radeon_ttm_fault, ++ .open = ttm_bo_vm_open, ++ .close = ttm_bo_vm_close ++}; ++ int radeon_mmap(struct file *filp, struct vm_area_struct *vma) { struct drm_file *file_priv; - struct radeon_device *rdev; -- int r; - - if (unlikely(vma->vm_pgoff < DRM_FILE_PAGE_OFFSET)) { - return drm_mmap(filp, vma); -@@ -593,20 +576,9 @@ int radeon_mmap(struct file *filp, struc +@@ -633,18 +639,11 @@ int radeon_mmap(struct file *filp, struc file_priv = (struct drm_file *)filp->private_data; rdev = file_priv->minor->dev->dev_private; @@ -24110,24 +24887,22 @@ diff -urNp linux-2.6.34.1/drivers/gpu/drm/radeon/radeon_ttm.c linux-2.6.34.1/dri + if (!rdev) return -EINVAL; - } -- r = ttm_bo_mmap(filp, vma, &rdev->mman.bdev); + r = ttm_bo_mmap(filp, vma, &rdev->mman.bdev); - if (unlikely(r != 0)) { -- return r; ++ if (r) + return r; - } - if (unlikely(ttm_vm_ops == NULL)) { - ttm_vm_ops = vma->vm_ops; - radeon_ttm_vm_ops = *ttm_vm_ops; - radeon_ttm_vm_ops.fault = &radeon_ttm_fault; - } -- vma->vm_ops = &radeon_ttm_vm_ops; -- return 0; -+ return ttm_bo_mmap(filp, vma, &rdev->mman.bdev); + vma->vm_ops = &radeon_ttm_vm_ops; + return 0; } - - -diff -urNp linux-2.6.34.1/drivers/gpu/drm/ttm/ttm_bo.c linux-2.6.34.1/drivers/gpu/drm/ttm/ttm_bo.c ---- linux-2.6.34.1/drivers/gpu/drm/ttm/ttm_bo.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/gpu/drm/ttm/ttm_bo.c 2010-07-07 09:04:51.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/gpu/drm/ttm/ttm_bo.c linux-2.6.35.4/drivers/gpu/drm/ttm/ttm_bo.c +--- linux-2.6.35.4/drivers/gpu/drm/ttm/ttm_bo.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/gpu/drm/ttm/ttm_bo.c 2010-09-17 20:12:09.000000000 -0400 @@ -47,7 +47,7 @@ #include @@ -24137,19 +24912,24 @@ diff -urNp linux-2.6.34.1/drivers/gpu/drm/ttm/ttm_bo.c linux-2.6.34.1/drivers/gp #define TTM_BO_HASH_ORDER 13 static int ttm_bo_setup_vm(struct ttm_buffer_object *bo); -diff -urNp linux-2.6.34.1/drivers/gpu/drm/ttm/ttm_bo_vm.c linux-2.6.34.1/drivers/gpu/drm/ttm/ttm_bo_vm.c ---- linux-2.6.34.1/drivers/gpu/drm/ttm/ttm_bo_vm.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/gpu/drm/ttm/ttm_bo_vm.c 2010-07-07 09:04:51.000000000 -0400 -@@ -73,7 +73,7 @@ static int ttm_bo_vm_fault(struct vm_are +diff -urNp linux-2.6.35.4/drivers/gpu/drm/ttm/ttm_bo_vm.c linux-2.6.35.4/drivers/gpu/drm/ttm/ttm_bo_vm.c +--- linux-2.6.35.4/drivers/gpu/drm/ttm/ttm_bo_vm.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/gpu/drm/ttm/ttm_bo_vm.c 2010-09-17 20:12:09.000000000 -0400 +@@ -69,11 +69,11 @@ static struct ttm_buffer_object *ttm_bo_ + return best_bo; + } + +-static int ttm_bo_vm_fault(struct vm_area_struct *vma, struct vm_fault *vmf) ++int ttm_bo_vm_fault(struct vm_area_struct *vma, struct vm_fault *vmf) { struct ttm_buffer_object *bo = (struct ttm_buffer_object *) vma->vm_private_data; - struct ttm_bo_device *bdev = bo->bdev; + struct ttm_bo_device *bdev; - unsigned long bus_base; - unsigned long bus_offset; - unsigned long bus_size; -@@ -88,6 +88,10 @@ static int ttm_bo_vm_fault(struct vm_are + unsigned long page_offset; + unsigned long page_last; + unsigned long pfn; +@@ -84,6 +84,10 @@ static int ttm_bo_vm_fault(struct vm_are unsigned long address = (unsigned long)vmf->virtual_address; int retval = VM_FAULT_NOPAGE; @@ -24160,9 +24940,27 @@ diff -urNp linux-2.6.34.1/drivers/gpu/drm/ttm/ttm_bo_vm.c linux-2.6.34.1/drivers /* * Work around locking order reversal in fault / nopfn * between mmap_sem and bo_reserve: Perform a trylock operation -diff -urNp linux-2.6.34.1/drivers/gpu/drm/ttm/ttm_global.c linux-2.6.34.1/drivers/gpu/drm/ttm/ttm_global.c ---- linux-2.6.34.1/drivers/gpu/drm/ttm/ttm_global.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/gpu/drm/ttm/ttm_global.c 2010-07-07 09:04:51.000000000 -0400 +@@ -213,7 +217,7 @@ out_unlock: + return retval; + } + +-static void ttm_bo_vm_open(struct vm_area_struct *vma) ++void ttm_bo_vm_open(struct vm_area_struct *vma) + { + struct ttm_buffer_object *bo = + (struct ttm_buffer_object *)vma->vm_private_data; +@@ -221,7 +225,7 @@ static void ttm_bo_vm_open(struct vm_are + (void)ttm_bo_reference(bo); + } + +-static void ttm_bo_vm_close(struct vm_area_struct *vma) ++void ttm_bo_vm_close(struct vm_area_struct *vma) + { + struct ttm_buffer_object *bo = (struct ttm_buffer_object *)vma->vm_private_data; + +diff -urNp linux-2.6.35.4/drivers/gpu/drm/ttm/ttm_global.c linux-2.6.35.4/drivers/gpu/drm/ttm/ttm_global.c +--- linux-2.6.35.4/drivers/gpu/drm/ttm/ttm_global.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/gpu/drm/ttm/ttm_global.c 2010-09-17 20:12:09.000000000 -0400 @@ -36,7 +36,7 @@ struct ttm_global_item { struct mutex mutex; @@ -24220,10 +25018,10 @@ diff -urNp linux-2.6.34.1/drivers/gpu/drm/ttm/ttm_global.c linux-2.6.34.1/driver ref->release(ref); item->object = NULL; } -diff -urNp linux-2.6.34.1/drivers/hid/usbhid/hiddev.c linux-2.6.34.1/drivers/hid/usbhid/hiddev.c ---- linux-2.6.34.1/drivers/hid/usbhid/hiddev.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/hid/usbhid/hiddev.c 2010-07-07 09:04:51.000000000 -0400 -@@ -615,7 +615,7 @@ static long hiddev_ioctl(struct file *fi +diff -urNp linux-2.6.35.4/drivers/hid/usbhid/hiddev.c linux-2.6.35.4/drivers/hid/usbhid/hiddev.c +--- linux-2.6.35.4/drivers/hid/usbhid/hiddev.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/hid/usbhid/hiddev.c 2010-09-17 20:12:09.000000000 -0400 +@@ -616,7 +616,7 @@ static long hiddev_ioctl(struct file *fi return put_user(HID_VERSION, (int __user *)arg); case HIDIOCAPPLICATION: @@ -24232,9 +25030,9 @@ diff -urNp linux-2.6.34.1/drivers/hid/usbhid/hiddev.c linux-2.6.34.1/drivers/hid return -EINVAL; for (i = 0; i < hid->maxcollection; i++) -diff -urNp linux-2.6.34.1/drivers/hwmon/k8temp.c linux-2.6.34.1/drivers/hwmon/k8temp.c ---- linux-2.6.34.1/drivers/hwmon/k8temp.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/hwmon/k8temp.c 2010-07-07 09:04:51.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/hwmon/k8temp.c linux-2.6.35.4/drivers/hwmon/k8temp.c +--- linux-2.6.35.4/drivers/hwmon/k8temp.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/hwmon/k8temp.c 2010-09-17 20:12:09.000000000 -0400 @@ -138,7 +138,7 @@ static DEVICE_ATTR(name, S_IRUGO, show_n static const struct pci_device_id k8temp_ids[] = { @@ -24244,9 +25042,9 @@ diff -urNp linux-2.6.34.1/drivers/hwmon/k8temp.c linux-2.6.34.1/drivers/hwmon/k8 }; MODULE_DEVICE_TABLE(pci, k8temp_ids); -diff -urNp linux-2.6.34.1/drivers/hwmon/sis5595.c linux-2.6.34.1/drivers/hwmon/sis5595.c ---- linux-2.6.34.1/drivers/hwmon/sis5595.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/hwmon/sis5595.c 2010-07-07 09:04:51.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/hwmon/sis5595.c linux-2.6.35.4/drivers/hwmon/sis5595.c +--- linux-2.6.35.4/drivers/hwmon/sis5595.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/hwmon/sis5595.c 2010-09-17 20:12:09.000000000 -0400 @@ -699,7 +699,7 @@ static struct sis5595_data *sis5595_upda static const struct pci_device_id sis5595_pci_ids[] = { @@ -24256,9 +25054,9 @@ diff -urNp linux-2.6.34.1/drivers/hwmon/sis5595.c linux-2.6.34.1/drivers/hwmon/s }; MODULE_DEVICE_TABLE(pci, sis5595_pci_ids); -diff -urNp linux-2.6.34.1/drivers/hwmon/via686a.c linux-2.6.34.1/drivers/hwmon/via686a.c ---- linux-2.6.34.1/drivers/hwmon/via686a.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/hwmon/via686a.c 2010-07-07 09:04:51.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/hwmon/via686a.c linux-2.6.35.4/drivers/hwmon/via686a.c +--- linux-2.6.35.4/drivers/hwmon/via686a.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/hwmon/via686a.c 2010-09-17 20:12:09.000000000 -0400 @@ -769,7 +769,7 @@ static struct via686a_data *via686a_upda static const struct pci_device_id via686a_pci_ids[] = { @@ -24268,9 +25066,9 @@ diff -urNp linux-2.6.34.1/drivers/hwmon/via686a.c linux-2.6.34.1/drivers/hwmon/v }; MODULE_DEVICE_TABLE(pci, via686a_pci_ids); -diff -urNp linux-2.6.34.1/drivers/hwmon/vt8231.c linux-2.6.34.1/drivers/hwmon/vt8231.c ---- linux-2.6.34.1/drivers/hwmon/vt8231.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/hwmon/vt8231.c 2010-07-07 09:04:51.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/hwmon/vt8231.c linux-2.6.35.4/drivers/hwmon/vt8231.c +--- linux-2.6.35.4/drivers/hwmon/vt8231.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/hwmon/vt8231.c 2010-09-17 20:12:09.000000000 -0400 @@ -699,7 +699,7 @@ static struct platform_driver vt8231_dri static const struct pci_device_id vt8231_pci_ids[] = { @@ -24280,9 +25078,9 @@ diff -urNp linux-2.6.34.1/drivers/hwmon/vt8231.c linux-2.6.34.1/drivers/hwmon/vt }; MODULE_DEVICE_TABLE(pci, vt8231_pci_ids); -diff -urNp linux-2.6.34.1/drivers/hwmon/w83791d.c linux-2.6.34.1/drivers/hwmon/w83791d.c ---- linux-2.6.34.1/drivers/hwmon/w83791d.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/hwmon/w83791d.c 2010-07-07 09:04:51.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/hwmon/w83791d.c linux-2.6.35.4/drivers/hwmon/w83791d.c +--- linux-2.6.35.4/drivers/hwmon/w83791d.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/hwmon/w83791d.c 2010-09-17 20:12:09.000000000 -0400 @@ -329,8 +329,8 @@ static int w83791d_detect(struct i2c_cli struct i2c_board_info *info); static int w83791d_remove(struct i2c_client *client); @@ -24294,10 +25092,10 @@ diff -urNp linux-2.6.34.1/drivers/hwmon/w83791d.c linux-2.6.34.1/drivers/hwmon/w static struct w83791d_data *w83791d_update_device(struct device *dev); #ifdef DEBUG -diff -urNp linux-2.6.34.1/drivers/i2c/busses/i2c-i801.c linux-2.6.34.1/drivers/i2c/busses/i2c-i801.c ---- linux-2.6.34.1/drivers/i2c/busses/i2c-i801.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/i2c/busses/i2c-i801.c 2010-07-07 09:04:51.000000000 -0400 -@@ -582,7 +582,7 @@ static const struct pci_device_id i801_i +diff -urNp linux-2.6.35.4/drivers/i2c/busses/i2c-i801.c linux-2.6.35.4/drivers/i2c/busses/i2c-i801.c +--- linux-2.6.35.4/drivers/i2c/busses/i2c-i801.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/i2c/busses/i2c-i801.c 2010-09-17 20:12:09.000000000 -0400 +@@ -592,7 +592,7 @@ static const struct pci_device_id i801_i { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH10_5) }, { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PCH_SMBUS) }, { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_CPT_SMBUS) }, @@ -24305,10 +25103,10 @@ diff -urNp linux-2.6.34.1/drivers/i2c/busses/i2c-i801.c linux-2.6.34.1/drivers/i + { 0, 0, 0, 0, 0, 0, 0 } }; - MODULE_DEVICE_TABLE (pci, i801_ids); -diff -urNp linux-2.6.34.1/drivers/i2c/busses/i2c-piix4.c linux-2.6.34.1/drivers/i2c/busses/i2c-piix4.c ---- linux-2.6.34.1/drivers/i2c/busses/i2c-piix4.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/i2c/busses/i2c-piix4.c 2010-07-07 09:04:52.000000000 -0400 + MODULE_DEVICE_TABLE(pci, i801_ids); +diff -urNp linux-2.6.35.4/drivers/i2c/busses/i2c-piix4.c linux-2.6.35.4/drivers/i2c/busses/i2c-piix4.c +--- linux-2.6.35.4/drivers/i2c/busses/i2c-piix4.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/i2c/busses/i2c-piix4.c 2010-09-17 20:12:09.000000000 -0400 @@ -124,7 +124,7 @@ static struct dmi_system_id __devinitdat .ident = "IBM", .matches = { DMI_MATCH(DMI_SYS_VENDOR, "IBM"), }, @@ -24327,9 +25125,9 @@ diff -urNp linux-2.6.34.1/drivers/i2c/busses/i2c-piix4.c linux-2.6.34.1/drivers/ }; MODULE_DEVICE_TABLE (pci, piix4_ids); -diff -urNp linux-2.6.34.1/drivers/i2c/busses/i2c-sis630.c linux-2.6.34.1/drivers/i2c/busses/i2c-sis630.c ---- linux-2.6.34.1/drivers/i2c/busses/i2c-sis630.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/i2c/busses/i2c-sis630.c 2010-07-07 09:04:52.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/i2c/busses/i2c-sis630.c linux-2.6.35.4/drivers/i2c/busses/i2c-sis630.c +--- linux-2.6.35.4/drivers/i2c/busses/i2c-sis630.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/i2c/busses/i2c-sis630.c 2010-09-17 20:12:09.000000000 -0400 @@ -471,7 +471,7 @@ static struct i2c_adapter sis630_adapter static const struct pci_device_id sis630_ids[] __devinitconst = { { PCI_DEVICE(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_503) }, @@ -24339,9 +25137,9 @@ diff -urNp linux-2.6.34.1/drivers/i2c/busses/i2c-sis630.c linux-2.6.34.1/drivers }; MODULE_DEVICE_TABLE (pci, sis630_ids); -diff -urNp linux-2.6.34.1/drivers/i2c/busses/i2c-sis96x.c linux-2.6.34.1/drivers/i2c/busses/i2c-sis96x.c ---- linux-2.6.34.1/drivers/i2c/busses/i2c-sis96x.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/i2c/busses/i2c-sis96x.c 2010-07-07 09:04:52.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/i2c/busses/i2c-sis96x.c linux-2.6.35.4/drivers/i2c/busses/i2c-sis96x.c +--- linux-2.6.35.4/drivers/i2c/busses/i2c-sis96x.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/i2c/busses/i2c-sis96x.c 2010-09-17 20:12:09.000000000 -0400 @@ -247,7 +247,7 @@ static struct i2c_adapter sis96x_adapter static const struct pci_device_id sis96x_ids[] = { @@ -24351,10 +25149,10 @@ diff -urNp linux-2.6.34.1/drivers/i2c/busses/i2c-sis96x.c linux-2.6.34.1/drivers }; MODULE_DEVICE_TABLE (pci, sis96x_ids); -diff -urNp linux-2.6.34.1/drivers/ide/ide-cd.c linux-2.6.34.1/drivers/ide/ide-cd.c ---- linux-2.6.34.1/drivers/ide/ide-cd.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ide/ide-cd.c 2010-07-07 09:04:52.000000000 -0400 -@@ -766,7 +766,7 @@ static void cdrom_do_block_pc(ide_drive_ +diff -urNp linux-2.6.35.4/drivers/ide/ide-cd.c linux-2.6.35.4/drivers/ide/ide-cd.c +--- linux-2.6.35.4/drivers/ide/ide-cd.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ide/ide-cd.c 2010-09-17 20:12:09.000000000 -0400 +@@ -774,7 +774,7 @@ static void cdrom_do_block_pc(ide_drive_ alignment = queue_dma_alignment(q) | q->dma_pad_mask; if ((unsigned long)buf & alignment || blk_rq_bytes(rq) & q->dma_pad_mask @@ -24363,9 +25161,9 @@ diff -urNp linux-2.6.34.1/drivers/ide/ide-cd.c linux-2.6.34.1/drivers/ide/ide-cd drive->dma = 0; } } -diff -urNp linux-2.6.34.1/drivers/ieee1394/dv1394.c linux-2.6.34.1/drivers/ieee1394/dv1394.c ---- linux-2.6.34.1/drivers/ieee1394/dv1394.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ieee1394/dv1394.c 2010-07-07 09:04:52.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/ieee1394/dv1394.c linux-2.6.35.4/drivers/ieee1394/dv1394.c +--- linux-2.6.35.4/drivers/ieee1394/dv1394.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ieee1394/dv1394.c 2010-09-17 20:12:09.000000000 -0400 @@ -739,7 +739,7 @@ static void frame_prepare(struct video_c based upon DIF section and sequence */ @@ -24375,7 +25173,7 @@ diff -urNp linux-2.6.34.1/drivers/ieee1394/dv1394.c linux-2.6.34.1/drivers/ieee1 frame_put_packet (struct frame *f, struct packet *p) { int section_type = p->data[0] >> 5; /* section type is in bits 5 - 7 */ -@@ -2178,7 +2178,7 @@ static const struct ieee1394_device_id d +@@ -2179,7 +2179,7 @@ static const struct ieee1394_device_id d .specifier_id = AVC_UNIT_SPEC_ID_ENTRY & 0xffffff, .version = AVC_SW_VERSION_ENTRY & 0xffffff }, @@ -24384,9 +25182,9 @@ diff -urNp linux-2.6.34.1/drivers/ieee1394/dv1394.c linux-2.6.34.1/drivers/ieee1 }; MODULE_DEVICE_TABLE(ieee1394, dv1394_id_table); -diff -urNp linux-2.6.34.1/drivers/ieee1394/eth1394.c linux-2.6.34.1/drivers/ieee1394/eth1394.c ---- linux-2.6.34.1/drivers/ieee1394/eth1394.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ieee1394/eth1394.c 2010-07-07 09:04:52.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/ieee1394/eth1394.c linux-2.6.35.4/drivers/ieee1394/eth1394.c +--- linux-2.6.35.4/drivers/ieee1394/eth1394.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ieee1394/eth1394.c 2010-09-17 20:12:09.000000000 -0400 @@ -446,7 +446,7 @@ static const struct ieee1394_device_id e .specifier_id = ETHER1394_GASP_SPECIFIER_ID, .version = ETHER1394_GASP_VERSION, @@ -24396,9 +25194,9 @@ diff -urNp linux-2.6.34.1/drivers/ieee1394/eth1394.c linux-2.6.34.1/drivers/ieee }; MODULE_DEVICE_TABLE(ieee1394, eth1394_id_table); -diff -urNp linux-2.6.34.1/drivers/ieee1394/hosts.c linux-2.6.34.1/drivers/ieee1394/hosts.c ---- linux-2.6.34.1/drivers/ieee1394/hosts.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ieee1394/hosts.c 2010-07-07 09:04:52.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/ieee1394/hosts.c linux-2.6.35.4/drivers/ieee1394/hosts.c +--- linux-2.6.35.4/drivers/ieee1394/hosts.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ieee1394/hosts.c 2010-09-17 20:12:09.000000000 -0400 @@ -78,6 +78,7 @@ static int dummy_isoctl(struct hpsb_iso } @@ -24407,9 +25205,9 @@ diff -urNp linux-2.6.34.1/drivers/ieee1394/hosts.c linux-2.6.34.1/drivers/ieee13 .transmit_packet = dummy_transmit_packet, .devctl = dummy_devctl, .isoctl = dummy_isoctl -diff -urNp linux-2.6.34.1/drivers/ieee1394/ohci1394.c linux-2.6.34.1/drivers/ieee1394/ohci1394.c ---- linux-2.6.34.1/drivers/ieee1394/ohci1394.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ieee1394/ohci1394.c 2010-07-07 09:04:52.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/ieee1394/ohci1394.c linux-2.6.35.4/drivers/ieee1394/ohci1394.c +--- linux-2.6.35.4/drivers/ieee1394/ohci1394.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ieee1394/ohci1394.c 2010-09-17 20:12:09.000000000 -0400 @@ -148,9 +148,9 @@ printk(level "%s: " fmt "\n" , OHCI1394_ printk(level "%s: fw-host%d: " fmt "\n" , OHCI1394_DRIVER_NAME, ohci->host->id , ## args) @@ -24431,9 +25229,9 @@ diff -urNp linux-2.6.34.1/drivers/ieee1394/ohci1394.c linux-2.6.34.1/drivers/iee }; MODULE_DEVICE_TABLE(pci, ohci1394_pci_tbl); -diff -urNp linux-2.6.34.1/drivers/ieee1394/raw1394.c linux-2.6.34.1/drivers/ieee1394/raw1394.c ---- linux-2.6.34.1/drivers/ieee1394/raw1394.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ieee1394/raw1394.c 2010-07-07 09:04:52.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/ieee1394/raw1394.c linux-2.6.35.4/drivers/ieee1394/raw1394.c +--- linux-2.6.35.4/drivers/ieee1394/raw1394.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ieee1394/raw1394.c 2010-09-17 20:12:09.000000000 -0400 @@ -3002,7 +3002,7 @@ static const struct ieee1394_device_id r .match_flags = IEEE1394_MATCH_SPECIFIER_ID | IEEE1394_MATCH_VERSION, .specifier_id = CAMERA_UNIT_SPEC_ID_ENTRY & 0xffffff, @@ -24443,9 +25241,9 @@ diff -urNp linux-2.6.34.1/drivers/ieee1394/raw1394.c linux-2.6.34.1/drivers/ieee }; MODULE_DEVICE_TABLE(ieee1394, raw1394_id_table); -diff -urNp linux-2.6.34.1/drivers/ieee1394/sbp2.c linux-2.6.34.1/drivers/ieee1394/sbp2.c ---- linux-2.6.34.1/drivers/ieee1394/sbp2.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ieee1394/sbp2.c 2010-07-07 09:04:52.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/ieee1394/sbp2.c linux-2.6.35.4/drivers/ieee1394/sbp2.c +--- linux-2.6.35.4/drivers/ieee1394/sbp2.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ieee1394/sbp2.c 2010-09-17 20:12:09.000000000 -0400 @@ -289,7 +289,7 @@ static const struct ieee1394_device_id s .match_flags = IEEE1394_MATCH_SPECIFIER_ID | IEEE1394_MATCH_VERSION, .specifier_id = SBP2_UNIT_SPEC_ID_ENTRY & 0xffffff, @@ -24464,10 +25262,10 @@ diff -urNp linux-2.6.34.1/drivers/ieee1394/sbp2.c linux-2.6.34.1/drivers/ieee139 { int ret; -diff -urNp linux-2.6.34.1/drivers/ieee1394/video1394.c linux-2.6.34.1/drivers/ieee1394/video1394.c ---- linux-2.6.34.1/drivers/ieee1394/video1394.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/ieee1394/video1394.c 2010-07-07 09:04:52.000000000 -0400 -@@ -1311,7 +1311,7 @@ static const struct ieee1394_device_id v +diff -urNp linux-2.6.35.4/drivers/ieee1394/video1394.c linux-2.6.35.4/drivers/ieee1394/video1394.c +--- linux-2.6.35.4/drivers/ieee1394/video1394.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/ieee1394/video1394.c 2010-09-17 20:12:09.000000000 -0400 +@@ -1312,7 +1312,7 @@ static const struct ieee1394_device_id v .specifier_id = CAMERA_UNIT_SPEC_ID_ENTRY & 0xffffff, .version = (CAMERA_SW_VERSION_ENTRY + 2) & 0xffffff }, @@ -24476,9 +25274,9 @@ diff -urNp linux-2.6.34.1/drivers/ieee1394/video1394.c linux-2.6.34.1/drivers/ie }; MODULE_DEVICE_TABLE(ieee1394, video1394_id_table); -diff -urNp linux-2.6.34.1/drivers/infiniband/core/cm.c linux-2.6.34.1/drivers/infiniband/core/cm.c ---- linux-2.6.34.1/drivers/infiniband/core/cm.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/infiniband/core/cm.c 2010-07-07 09:04:52.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/infiniband/core/cm.c linux-2.6.35.4/drivers/infiniband/core/cm.c +--- linux-2.6.35.4/drivers/infiniband/core/cm.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/infiniband/core/cm.c 2010-09-17 20:12:09.000000000 -0400 @@ -113,7 +113,7 @@ static char const counter_group_names[CM struct cm_counter_group { @@ -24618,9 +25416,20 @@ diff -urNp linux-2.6.34.1/drivers/infiniband/core/cm.c linux-2.6.34.1/drivers/in } static const struct sysfs_ops cm_counter_ops = { -diff -urNp linux-2.6.34.1/drivers/input/keyboard/atkbd.c linux-2.6.34.1/drivers/input/keyboard/atkbd.c ---- linux-2.6.34.1/drivers/input/keyboard/atkbd.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/input/keyboard/atkbd.c 2010-07-07 09:04:52.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/infiniband/hw/qib/qib.h linux-2.6.35.4/drivers/infiniband/hw/qib/qib.h +--- linux-2.6.35.4/drivers/infiniband/hw/qib/qib.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/infiniband/hw/qib/qib.h 2010-09-17 20:12:09.000000000 -0400 +@@ -50,6 +50,7 @@ + #include + #include + #include ++#include + + #include "qib_common.h" + #include "qib_verbs.h" +diff -urNp linux-2.6.35.4/drivers/input/keyboard/atkbd.c linux-2.6.35.4/drivers/input/keyboard/atkbd.c +--- linux-2.6.35.4/drivers/input/keyboard/atkbd.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/input/keyboard/atkbd.c 2010-09-17 20:12:09.000000000 -0400 @@ -1240,7 +1240,7 @@ static struct serio_device_id atkbd_seri .id = SERIO_ANY, .extra = SERIO_ANY, @@ -24630,9 +25439,9 @@ diff -urNp linux-2.6.34.1/drivers/input/keyboard/atkbd.c linux-2.6.34.1/drivers/ }; MODULE_DEVICE_TABLE(serio, atkbd_serio_ids); -diff -urNp linux-2.6.34.1/drivers/input/mouse/lifebook.c linux-2.6.34.1/drivers/input/mouse/lifebook.c ---- linux-2.6.34.1/drivers/input/mouse/lifebook.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/input/mouse/lifebook.c 2010-07-07 09:04:52.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/input/mouse/lifebook.c linux-2.6.35.4/drivers/input/mouse/lifebook.c +--- linux-2.6.35.4/drivers/input/mouse/lifebook.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/input/mouse/lifebook.c 2010-09-17 20:12:09.000000000 -0400 @@ -123,7 +123,7 @@ static const struct dmi_system_id __init DMI_MATCH(DMI_PRODUCT_NAME, "LifeBook B142"), }, @@ -24642,9 +25451,9 @@ diff -urNp linux-2.6.34.1/drivers/input/mouse/lifebook.c linux-2.6.34.1/drivers/ }; void __init lifebook_module_init(void) -diff -urNp linux-2.6.34.1/drivers/input/mouse/psmouse-base.c linux-2.6.34.1/drivers/input/mouse/psmouse-base.c ---- linux-2.6.34.1/drivers/input/mouse/psmouse-base.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/input/mouse/psmouse-base.c 2010-07-07 09:04:52.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/input/mouse/psmouse-base.c linux-2.6.35.4/drivers/input/mouse/psmouse-base.c +--- linux-2.6.35.4/drivers/input/mouse/psmouse-base.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/input/mouse/psmouse-base.c 2010-09-17 20:12:09.000000000 -0400 @@ -1460,7 +1460,7 @@ static struct serio_device_id psmouse_se .id = SERIO_ANY, .extra = SERIO_ANY, @@ -24654,10 +25463,10 @@ diff -urNp linux-2.6.34.1/drivers/input/mouse/psmouse-base.c linux-2.6.34.1/driv }; MODULE_DEVICE_TABLE(serio, psmouse_serio_ids); -diff -urNp linux-2.6.34.1/drivers/input/mouse/synaptics.c linux-2.6.34.1/drivers/input/mouse/synaptics.c ---- linux-2.6.34.1/drivers/input/mouse/synaptics.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/input/mouse/synaptics.c 2010-07-07 09:04:52.000000000 -0400 -@@ -458,7 +458,7 @@ static void synaptics_process_packet(str +diff -urNp linux-2.6.35.4/drivers/input/mouse/synaptics.c linux-2.6.35.4/drivers/input/mouse/synaptics.c +--- linux-2.6.35.4/drivers/input/mouse/synaptics.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/input/mouse/synaptics.c 2010-09-17 20:12:09.000000000 -0400 +@@ -476,7 +476,7 @@ static void synaptics_process_packet(str break; case 2: if (SYN_MODEL_PEN(priv->model_id)) @@ -24666,7 +25475,7 @@ diff -urNp linux-2.6.34.1/drivers/input/mouse/synaptics.c linux-2.6.34.1/drivers break; case 4 ... 15: if (SYN_CAP_PALMDETECT(priv->capabilities)) -@@ -680,7 +680,6 @@ static const struct dmi_system_id __init +@@ -701,7 +701,6 @@ static const struct dmi_system_id __init DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), DMI_MATCH(DMI_PRODUCT_NAME, "PORTEGE M300"), }, @@ -24674,7 +25483,7 @@ diff -urNp linux-2.6.34.1/drivers/input/mouse/synaptics.c linux-2.6.34.1/drivers }, { /* Toshiba Portege M300 */ -@@ -689,9 +688,8 @@ static const struct dmi_system_id __init +@@ -710,9 +709,8 @@ static const struct dmi_system_id __init DMI_MATCH(DMI_PRODUCT_NAME, "Portable PC"), DMI_MATCH(DMI_PRODUCT_VERSION, "Version 1.0"), }, @@ -24685,9 +25494,9 @@ diff -urNp linux-2.6.34.1/drivers/input/mouse/synaptics.c linux-2.6.34.1/drivers #endif }; -diff -urNp linux-2.6.34.1/drivers/input/mousedev.c linux-2.6.34.1/drivers/input/mousedev.c ---- linux-2.6.34.1/drivers/input/mousedev.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/input/mousedev.c 2010-07-07 09:04:52.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/input/mousedev.c linux-2.6.35.4/drivers/input/mousedev.c +--- linux-2.6.35.4/drivers/input/mousedev.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/input/mousedev.c 2010-09-17 20:12:09.000000000 -0400 @@ -754,7 +754,7 @@ static ssize_t mousedev_read(struct file spin_unlock_irq(&client->packet_lock); @@ -24706,10 +25515,10 @@ diff -urNp linux-2.6.34.1/drivers/input/mousedev.c linux-2.6.34.1/drivers/input/ }; static int psaux_registered; #endif -diff -urNp linux-2.6.34.1/drivers/input/serio/i8042-x86ia64io.h linux-2.6.34.1/drivers/input/serio/i8042-x86ia64io.h ---- linux-2.6.34.1/drivers/input/serio/i8042-x86ia64io.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/input/serio/i8042-x86ia64io.h 2010-07-07 09:04:52.000000000 -0400 -@@ -172,7 +172,7 @@ static const struct dmi_system_id __init +diff -urNp linux-2.6.35.4/drivers/input/serio/i8042-x86ia64io.h linux-2.6.35.4/drivers/input/serio/i8042-x86ia64io.h +--- linux-2.6.35.4/drivers/input/serio/i8042-x86ia64io.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/input/serio/i8042-x86ia64io.h 2010-09-17 20:12:09.000000000 -0400 +@@ -183,7 +183,7 @@ static const struct dmi_system_id __init DMI_MATCH(DMI_PRODUCT_VERSION, "Rev 1"), }, }, @@ -24718,7 +25527,7 @@ diff -urNp linux-2.6.34.1/drivers/input/serio/i8042-x86ia64io.h linux-2.6.34.1/d }; /* -@@ -402,7 +402,7 @@ static const struct dmi_system_id __init +@@ -413,7 +413,7 @@ static const struct dmi_system_id __init DMI_MATCH(DMI_PRODUCT_VERSION, "0100"), }, }, @@ -24727,7 +25536,7 @@ diff -urNp linux-2.6.34.1/drivers/input/serio/i8042-x86ia64io.h linux-2.6.34.1/d }; static const struct dmi_system_id __initconst i8042_dmi_reset_table[] = { -@@ -476,7 +476,7 @@ static const struct dmi_system_id __init +@@ -487,7 +487,7 @@ static const struct dmi_system_id __init DMI_MATCH(DMI_PRODUCT_NAME, "Vostro 1720"), }, }, @@ -24736,7 +25545,7 @@ diff -urNp linux-2.6.34.1/drivers/input/serio/i8042-x86ia64io.h linux-2.6.34.1/d }; #ifdef CONFIG_PNP -@@ -495,7 +495,7 @@ static const struct dmi_system_id __init +@@ -506,7 +506,7 @@ static const struct dmi_system_id __init DMI_MATCH(DMI_BOARD_VENDOR, "MICRO-STAR INTERNATIONAL CO., LTD"), }, }, @@ -24745,7 +25554,7 @@ diff -urNp linux-2.6.34.1/drivers/input/serio/i8042-x86ia64io.h linux-2.6.34.1/d }; static const struct dmi_system_id __initconst i8042_dmi_laptop_table[] = { -@@ -519,7 +519,7 @@ static const struct dmi_system_id __init +@@ -530,7 +530,7 @@ static const struct dmi_system_id __init DMI_MATCH(DMI_CHASSIS_TYPE, "14"), /* Sub-Notebook */ }, }, @@ -24754,7 +25563,7 @@ diff -urNp linux-2.6.34.1/drivers/input/serio/i8042-x86ia64io.h linux-2.6.34.1/d }; #endif -@@ -593,7 +593,7 @@ static const struct dmi_system_id __init +@@ -604,7 +604,7 @@ static const struct dmi_system_id __init DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 4280"), }, }, @@ -24763,9 +25572,9 @@ diff -urNp linux-2.6.34.1/drivers/input/serio/i8042-x86ia64io.h linux-2.6.34.1/d }; #endif /* CONFIG_X86 */ -diff -urNp linux-2.6.34.1/drivers/input/serio/serio_raw.c linux-2.6.34.1/drivers/input/serio/serio_raw.c ---- linux-2.6.34.1/drivers/input/serio/serio_raw.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/input/serio/serio_raw.c 2010-07-07 09:04:52.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/input/serio/serio_raw.c linux-2.6.35.4/drivers/input/serio/serio_raw.c +--- linux-2.6.35.4/drivers/input/serio/serio_raw.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/input/serio/serio_raw.c 2010-09-17 20:12:09.000000000 -0400 @@ -376,7 +376,7 @@ static struct serio_device_id serio_raw_ .id = SERIO_ANY, .extra = SERIO_ANY, @@ -24775,10 +25584,10 @@ diff -urNp linux-2.6.34.1/drivers/input/serio/serio_raw.c linux-2.6.34.1/drivers }; MODULE_DEVICE_TABLE(serio, serio_raw_serio_ids); -diff -urNp linux-2.6.34.1/drivers/isdn/gigaset/common.c linux-2.6.34.1/drivers/isdn/gigaset/common.c ---- linux-2.6.34.1/drivers/isdn/gigaset/common.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/isdn/gigaset/common.c 2010-07-07 09:04:52.000000000 -0400 -@@ -733,7 +733,7 @@ struct cardstate *gigaset_initcs(struct +diff -urNp linux-2.6.35.4/drivers/isdn/gigaset/common.c linux-2.6.35.4/drivers/isdn/gigaset/common.c +--- linux-2.6.35.4/drivers/isdn/gigaset/common.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/isdn/gigaset/common.c 2010-09-17 20:12:09.000000000 -0400 +@@ -723,7 +723,7 @@ struct cardstate *gigaset_initcs(struct cs->commands_pending = 0; cs->cur_at_seq = 0; cs->gotfwver = -1; @@ -24787,10 +25596,10 @@ diff -urNp linux-2.6.34.1/drivers/isdn/gigaset/common.c linux-2.6.34.1/drivers/i cs->dev = NULL; cs->tty = NULL; cs->tty_dev = NULL; -diff -urNp linux-2.6.34.1/drivers/isdn/gigaset/gigaset.h linux-2.6.34.1/drivers/isdn/gigaset/gigaset.h ---- linux-2.6.34.1/drivers/isdn/gigaset/gigaset.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/isdn/gigaset/gigaset.h 2010-07-07 09:04:52.000000000 -0400 -@@ -443,7 +443,7 @@ struct cardstate { +diff -urNp linux-2.6.35.4/drivers/isdn/gigaset/gigaset.h linux-2.6.35.4/drivers/isdn/gigaset/gigaset.h +--- linux-2.6.35.4/drivers/isdn/gigaset/gigaset.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/isdn/gigaset/gigaset.h 2010-09-17 20:12:09.000000000 -0400 +@@ -442,7 +442,7 @@ struct cardstate { spinlock_t cmdlock; unsigned curlen, cmdbytes; @@ -24799,9 +25608,9 @@ diff -urNp linux-2.6.34.1/drivers/isdn/gigaset/gigaset.h linux-2.6.34.1/drivers/ struct tty_struct *tty; struct tasklet_struct if_wake_tasklet; unsigned control_state; -diff -urNp linux-2.6.34.1/drivers/isdn/gigaset/interface.c linux-2.6.34.1/drivers/isdn/gigaset/interface.c ---- linux-2.6.34.1/drivers/isdn/gigaset/interface.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/isdn/gigaset/interface.c 2010-07-07 09:04:52.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/isdn/gigaset/interface.c linux-2.6.35.4/drivers/isdn/gigaset/interface.c +--- linux-2.6.35.4/drivers/isdn/gigaset/interface.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/isdn/gigaset/interface.c 2010-09-17 20:12:09.000000000 -0400 @@ -160,9 +160,7 @@ static int if_open(struct tty_struct *tt return -ERESTARTSYS; tty->driver_data = cs; @@ -24889,9 +25698,9 @@ diff -urNp linux-2.6.34.1/drivers/isdn/gigaset/interface.c linux-2.6.34.1/driver dev_warn(cs->dev, "%s: device not opened\n", __func__); goto out; } -diff -urNp linux-2.6.34.1/drivers/isdn/hardware/avm/b1.c linux-2.6.34.1/drivers/isdn/hardware/avm/b1.c ---- linux-2.6.34.1/drivers/isdn/hardware/avm/b1.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/isdn/hardware/avm/b1.c 2010-07-07 09:04:52.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/isdn/hardware/avm/b1.c linux-2.6.35.4/drivers/isdn/hardware/avm/b1.c +--- linux-2.6.35.4/drivers/isdn/hardware/avm/b1.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/isdn/hardware/avm/b1.c 2010-09-17 20:12:37.000000000 -0400 @@ -176,7 +176,7 @@ int b1_load_t4file(avmcard *card, capilo } if (left) { @@ -24910,9 +25719,9 @@ diff -urNp linux-2.6.34.1/drivers/isdn/hardware/avm/b1.c linux-2.6.34.1/drivers/ return -EFAULT; } else { memcpy(buf, dp, left); -diff -urNp linux-2.6.34.1/drivers/isdn/icn/icn.c linux-2.6.34.1/drivers/isdn/icn/icn.c ---- linux-2.6.34.1/drivers/isdn/icn/icn.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/isdn/icn/icn.c 2010-07-07 09:04:52.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/isdn/icn/icn.c linux-2.6.35.4/drivers/isdn/icn/icn.c +--- linux-2.6.35.4/drivers/isdn/icn/icn.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/isdn/icn/icn.c 2010-09-17 20:12:37.000000000 -0400 @@ -1045,7 +1045,7 @@ icn_writecmd(const u_char * buf, int len if (count > len) count = len; @@ -24922,9 +25731,9 @@ diff -urNp linux-2.6.34.1/drivers/isdn/icn/icn.c linux-2.6.34.1/drivers/isdn/icn return -EFAULT; } else memcpy(msg, buf, count); -diff -urNp linux-2.6.34.1/drivers/lguest/core.c linux-2.6.34.1/drivers/lguest/core.c ---- linux-2.6.34.1/drivers/lguest/core.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/lguest/core.c 2010-07-07 09:04:52.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/lguest/core.c linux-2.6.35.4/drivers/lguest/core.c +--- linux-2.6.35.4/drivers/lguest/core.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/lguest/core.c 2010-09-17 20:12:09.000000000 -0400 @@ -92,9 +92,17 @@ static __init int map_switcher(void) * it's worked so far. The end address needs +1 because __get_vm_area * allocates an extra guard page, so we need space for that. @@ -24943,9 +25752,9 @@ diff -urNp linux-2.6.34.1/drivers/lguest/core.c linux-2.6.34.1/drivers/lguest/co if (!switcher_vma) { err = -ENOMEM; printk("lguest: could not map switcher pages high\n"); -diff -urNp linux-2.6.34.1/drivers/macintosh/via-pmu-backlight.c linux-2.6.34.1/drivers/macintosh/via-pmu-backlight.c ---- linux-2.6.34.1/drivers/macintosh/via-pmu-backlight.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/macintosh/via-pmu-backlight.c 2010-07-07 09:04:52.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/macintosh/via-pmu-backlight.c linux-2.6.35.4/drivers/macintosh/via-pmu-backlight.c +--- linux-2.6.35.4/drivers/macintosh/via-pmu-backlight.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/macintosh/via-pmu-backlight.c 2010-09-17 20:12:09.000000000 -0400 @@ -15,7 +15,7 @@ #define MAX_PMU_LEVEL 0xFF @@ -24964,9 +25773,9 @@ diff -urNp linux-2.6.34.1/drivers/macintosh/via-pmu-backlight.c linux-2.6.34.1/d .get_brightness = pmu_backlight_get_brightness, .update_status = pmu_backlight_update_status, -diff -urNp linux-2.6.34.1/drivers/macintosh/via-pmu.c linux-2.6.34.1/drivers/macintosh/via-pmu.c ---- linux-2.6.34.1/drivers/macintosh/via-pmu.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/macintosh/via-pmu.c 2010-07-07 09:04:52.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/macintosh/via-pmu.c linux-2.6.35.4/drivers/macintosh/via-pmu.c +--- linux-2.6.35.4/drivers/macintosh/via-pmu.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/macintosh/via-pmu.c 2010-09-17 20:12:09.000000000 -0400 @@ -2254,7 +2254,7 @@ static int pmu_sleep_valid(suspend_state && (pmac_call_feature(PMAC_FTR_SLEEP_STATE, NULL, 0, -1) >= 0); } @@ -24976,9 +25785,9 @@ diff -urNp linux-2.6.34.1/drivers/macintosh/via-pmu.c linux-2.6.34.1/drivers/mac .enter = powerbook_sleep, .valid = pmu_sleep_valid, }; -diff -urNp linux-2.6.34.1/drivers/md/bitmap.c linux-2.6.34.1/drivers/md/bitmap.c ---- linux-2.6.34.1/drivers/md/bitmap.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/md/bitmap.c 2010-07-07 09:04:52.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/md/bitmap.c linux-2.6.35.4/drivers/md/bitmap.c +--- linux-2.6.35.4/drivers/md/bitmap.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/md/bitmap.c 2010-09-17 20:12:09.000000000 -0400 @@ -58,7 +58,7 @@ # if DEBUG > 0 # define PRINTK(x...) printk(KERN_DEBUG x) @@ -24988,9 +25797,9 @@ diff -urNp linux-2.6.34.1/drivers/md/bitmap.c linux-2.6.34.1/drivers/md/bitmap.c # endif #endif -diff -urNp linux-2.6.34.1/drivers/md/dm-table.c linux-2.6.34.1/drivers/md/dm-table.c ---- linux-2.6.34.1/drivers/md/dm-table.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/md/dm-table.c 2010-07-07 09:04:52.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/md/dm-table.c linux-2.6.35.4/drivers/md/dm-table.c +--- linux-2.6.35.4/drivers/md/dm-table.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/md/dm-table.c 2010-09-17 20:12:09.000000000 -0400 @@ -363,7 +363,7 @@ static int device_area_is_invalid(struct if (!dev_size) return 0; @@ -25000,10 +25809,10 @@ diff -urNp linux-2.6.34.1/drivers/md/dm-table.c linux-2.6.34.1/drivers/md/dm-tab DMWARN("%s: %s too small for target: " "start=%llu, len=%llu, dev_size=%llu", dm_device_name(ti->table->md), bdevname(bdev, b), -diff -urNp linux-2.6.34.1/drivers/md/md.c linux-2.6.34.1/drivers/md/md.c ---- linux-2.6.34.1/drivers/md/md.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/md/md.c 2010-07-07 09:04:52.000000000 -0400 -@@ -6265,7 +6265,7 @@ static int md_seq_show(struct seq_file * +diff -urNp linux-2.6.35.4/drivers/md/md.c linux-2.6.35.4/drivers/md/md.c +--- linux-2.6.35.4/drivers/md/md.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/md/md.c 2010-09-17 20:12:09.000000000 -0400 +@@ -6352,7 +6352,7 @@ static int md_seq_show(struct seq_file * chunk_kb ? "KB" : "B"); if (bitmap->file) { seq_printf(seq, ", file: "); @@ -25012,7 +25821,7 @@ diff -urNp linux-2.6.34.1/drivers/md/md.c linux-2.6.34.1/drivers/md/md.c } seq_printf(seq, "\n"); -@@ -6359,7 +6359,7 @@ static int is_mddev_idle(mddev_t *mddev, +@@ -6446,7 +6446,7 @@ static int is_mddev_idle(mddev_t *mddev, struct gendisk *disk = rdev->bdev->bd_contains->bd_disk; curr_events = (int)part_stat_read(&disk->part0, sectors[0]) + (int)part_stat_read(&disk->part0, sectors[1]) - @@ -25021,10 +25830,10 @@ diff -urNp linux-2.6.34.1/drivers/md/md.c linux-2.6.34.1/drivers/md/md.c /* sync IO will cause sync_io to increase before the disk_stats * as sync_io is counted when a request starts, and * disk_stats is counted when it completes. -diff -urNp linux-2.6.34.1/drivers/md/md.h linux-2.6.34.1/drivers/md/md.h ---- linux-2.6.34.1/drivers/md/md.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/md/md.h 2010-07-07 09:04:52.000000000 -0400 -@@ -328,7 +328,7 @@ static inline void rdev_dec_pending(mdk_ +diff -urNp linux-2.6.35.4/drivers/md/md.h linux-2.6.35.4/drivers/md/md.h +--- linux-2.6.35.4/drivers/md/md.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/md/md.h 2010-09-17 20:12:09.000000000 -0400 +@@ -334,7 +334,7 @@ static inline void rdev_dec_pending(mdk_ static inline void md_sync_acct(struct block_device *bdev, unsigned long nr_sectors) { @@ -25033,10 +25842,10 @@ diff -urNp linux-2.6.34.1/drivers/md/md.h linux-2.6.34.1/drivers/md/md.h } struct mdk_personality -diff -urNp linux-2.6.34.1/drivers/media/dvb/dvb-core/dvbdev.c linux-2.6.34.1/drivers/media/dvb/dvb-core/dvbdev.c ---- linux-2.6.34.1/drivers/media/dvb/dvb-core/dvbdev.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/media/dvb/dvb-core/dvbdev.c 2010-07-07 09:04:52.000000000 -0400 -@@ -191,6 +191,7 @@ int dvb_register_device(struct dvb_adapt +diff -urNp linux-2.6.35.4/drivers/media/dvb/dvb-core/dvbdev.c linux-2.6.35.4/drivers/media/dvb/dvb-core/dvbdev.c +--- linux-2.6.35.4/drivers/media/dvb/dvb-core/dvbdev.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/media/dvb/dvb-core/dvbdev.c 2010-09-17 20:12:09.000000000 -0400 +@@ -196,6 +196,7 @@ int dvb_register_device(struct dvb_adapt const struct dvb_device *template, void *priv, int type) { struct dvb_device *dvbdev; @@ -25044,9 +25853,9 @@ diff -urNp linux-2.6.34.1/drivers/media/dvb/dvb-core/dvbdev.c linux-2.6.34.1/dri struct file_operations *dvbdevfops; struct device *clsdev; int minor; -diff -urNp linux-2.6.34.1/drivers/media/radio/radio-cadet.c linux-2.6.34.1/drivers/media/radio/radio-cadet.c ---- linux-2.6.34.1/drivers/media/radio/radio-cadet.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/media/radio/radio-cadet.c 2010-07-07 09:04:52.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/media/radio/radio-cadet.c linux-2.6.35.4/drivers/media/radio/radio-cadet.c +--- linux-2.6.35.4/drivers/media/radio/radio-cadet.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/media/radio/radio-cadet.c 2010-09-17 20:12:37.000000000 -0400 @@ -347,7 +347,7 @@ static ssize_t cadet_read(struct file *f while (i < count && dev->rdsin != dev->rdsout) readbuf[i++] = dev->rdsbuf[dev->rdsout++]; @@ -25056,9 +25865,27 @@ diff -urNp linux-2.6.34.1/drivers/media/radio/radio-cadet.c linux-2.6.34.1/drive return -EFAULT; return i; } -diff -urNp linux-2.6.34.1/drivers/message/fusion/mptdebug.h linux-2.6.34.1/drivers/message/fusion/mptdebug.h ---- linux-2.6.34.1/drivers/message/fusion/mptdebug.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/message/fusion/mptdebug.h 2010-07-07 09:04:52.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/message/fusion/mptbase.c linux-2.6.35.4/drivers/message/fusion/mptbase.c +--- linux-2.6.35.4/drivers/message/fusion/mptbase.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/message/fusion/mptbase.c 2010-09-17 20:12:37.000000000 -0400 +@@ -6715,8 +6715,14 @@ procmpt_iocinfo_read(char *buf, char **s + len += sprintf(buf+len, " MaxChainDepth = 0x%02x frames\n", ioc->facts.MaxChainDepth); + len += sprintf(buf+len, " MinBlockSize = 0x%02x bytes\n", 4*ioc->facts.BlockSize); + ++#ifdef CONFIG_GRKERNSEC_HIDESYM ++ len += sprintf(buf+len, " RequestFrames @ 0x%p (Dma @ 0x%p)\n", ++ NULL, NULL); ++#else + len += sprintf(buf+len, " RequestFrames @ 0x%p (Dma @ 0x%p)\n", + (void *)ioc->req_frames, (void *)(ulong)ioc->req_frames_dma); ++#endif ++ + /* + * Rounding UP to nearest 4-kB boundary here... + */ +diff -urNp linux-2.6.35.4/drivers/message/fusion/mptdebug.h linux-2.6.35.4/drivers/message/fusion/mptdebug.h +--- linux-2.6.35.4/drivers/message/fusion/mptdebug.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/message/fusion/mptdebug.h 2010-09-17 20:12:09.000000000 -0400 @@ -71,7 +71,7 @@ CMD; \ } @@ -25068,9 +25895,9 @@ diff -urNp linux-2.6.34.1/drivers/message/fusion/mptdebug.h linux-2.6.34.1/drive #endif -diff -urNp linux-2.6.34.1/drivers/message/fusion/mptsas.c linux-2.6.34.1/drivers/message/fusion/mptsas.c ---- linux-2.6.34.1/drivers/message/fusion/mptsas.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/message/fusion/mptsas.c 2010-07-07 09:04:52.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/message/fusion/mptsas.c linux-2.6.35.4/drivers/message/fusion/mptsas.c +--- linux-2.6.35.4/drivers/message/fusion/mptsas.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/message/fusion/mptsas.c 2010-09-17 20:12:09.000000000 -0400 @@ -437,6 +437,23 @@ mptsas_is_end_device(struct mptsas_devin return 0; } @@ -25119,9 +25946,9 @@ diff -urNp linux-2.6.34.1/drivers/message/fusion/mptsas.c linux-2.6.34.1/drivers static inline struct sas_port * mptsas_get_port(struct mptsas_phyinfo *phy_info) { -diff -urNp linux-2.6.34.1/drivers/message/i2o/i2o_proc.c linux-2.6.34.1/drivers/message/i2o/i2o_proc.c ---- linux-2.6.34.1/drivers/message/i2o/i2o_proc.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/message/i2o/i2o_proc.c 2010-07-07 09:04:52.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/message/i2o/i2o_proc.c linux-2.6.35.4/drivers/message/i2o/i2o_proc.c +--- linux-2.6.35.4/drivers/message/i2o/i2o_proc.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/message/i2o/i2o_proc.c 2010-09-17 20:12:09.000000000 -0400 @@ -255,13 +255,6 @@ static char *scsi_devices[] = { "Array Controller Device" }; @@ -25208,9 +26035,20 @@ diff -urNp linux-2.6.34.1/drivers/message/i2o/i2o_proc.c linux-2.6.34.1/drivers/ return 0; } -diff -urNp linux-2.6.34.1/drivers/misc/kgdbts.c linux-2.6.34.1/drivers/misc/kgdbts.c ---- linux-2.6.34.1/drivers/misc/kgdbts.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/misc/kgdbts.c 2010-07-07 09:04:52.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/mfd/janz-cmodio.c linux-2.6.35.4/drivers/mfd/janz-cmodio.c +--- linux-2.6.35.4/drivers/mfd/janz-cmodio.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/mfd/janz-cmodio.c 2010-09-17 20:12:09.000000000 -0400 +@@ -13,6 +13,7 @@ + + #include + #include ++#include + #include + #include + #include +diff -urNp linux-2.6.35.4/drivers/misc/kgdbts.c linux-2.6.35.4/drivers/misc/kgdbts.c +--- linux-2.6.35.4/drivers/misc/kgdbts.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/misc/kgdbts.c 2010-09-17 20:12:09.000000000 -0400 @@ -118,7 +118,7 @@ } while (0) #define MAX_CONFIG_LEN 40 @@ -25229,9 +26067,9 @@ diff -urNp linux-2.6.34.1/drivers/misc/kgdbts.c linux-2.6.34.1/drivers/misc/kgdb .name = "kgdbts", .read_char = kgdbts_get_char, .write_char = kgdbts_put_char, -diff -urNp linux-2.6.34.1/drivers/misc/sgi-gru/gruhandles.c linux-2.6.34.1/drivers/misc/sgi-gru/gruhandles.c ---- linux-2.6.34.1/drivers/misc/sgi-gru/gruhandles.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/misc/sgi-gru/gruhandles.c 2010-07-07 09:04:52.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/misc/sgi-gru/gruhandles.c linux-2.6.35.4/drivers/misc/sgi-gru/gruhandles.c +--- linux-2.6.35.4/drivers/misc/sgi-gru/gruhandles.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/misc/sgi-gru/gruhandles.c 2010-09-17 20:12:09.000000000 -0400 @@ -44,8 +44,8 @@ static void update_mcs_stats(enum mcs_op unsigned long nsec; @@ -25243,9 +26081,9 @@ diff -urNp linux-2.6.34.1/drivers/misc/sgi-gru/gruhandles.c linux-2.6.34.1/drive if (mcs_op_statistics[op].max < nsec) mcs_op_statistics[op].max = nsec; } -diff -urNp linux-2.6.34.1/drivers/misc/sgi-gru/gruprocfs.c linux-2.6.34.1/drivers/misc/sgi-gru/gruprocfs.c ---- linux-2.6.34.1/drivers/misc/sgi-gru/gruprocfs.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/misc/sgi-gru/gruprocfs.c 2010-07-07 09:04:52.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/misc/sgi-gru/gruprocfs.c linux-2.6.35.4/drivers/misc/sgi-gru/gruprocfs.c +--- linux-2.6.35.4/drivers/misc/sgi-gru/gruprocfs.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/misc/sgi-gru/gruprocfs.c 2010-09-17 20:12:09.000000000 -0400 @@ -32,9 +32,9 @@ #define printstat(s, f) printstat_val(s, &gru_stats.f, #f) @@ -25269,9 +26107,9 @@ diff -urNp linux-2.6.34.1/drivers/misc/sgi-gru/gruprocfs.c linux-2.6.34.1/driver max = mcs_op_statistics[op].max; seq_printf(s, "%-20s%12ld%12ld%12ld\n", id[op], count, count ? total / count : 0, max); -diff -urNp linux-2.6.34.1/drivers/misc/sgi-gru/grutables.h linux-2.6.34.1/drivers/misc/sgi-gru/grutables.h ---- linux-2.6.34.1/drivers/misc/sgi-gru/grutables.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/misc/sgi-gru/grutables.h 2010-07-07 09:04:52.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/misc/sgi-gru/grutables.h linux-2.6.35.4/drivers/misc/sgi-gru/grutables.h +--- linux-2.6.35.4/drivers/misc/sgi-gru/grutables.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/misc/sgi-gru/grutables.h 2010-09-17 20:12:09.000000000 -0400 @@ -167,82 +167,82 @@ extern unsigned int gru_max_gids; * GRU statistics. */ @@ -25451,9 +26289,9 @@ diff -urNp linux-2.6.34.1/drivers/misc/sgi-gru/grutables.h linux-2.6.34.1/driver } while (0) #ifdef CONFIG_SGI_GRU_DEBUG -diff -urNp linux-2.6.34.1/drivers/mtd/devices/doc2000.c linux-2.6.34.1/drivers/mtd/devices/doc2000.c ---- linux-2.6.34.1/drivers/mtd/devices/doc2000.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/mtd/devices/doc2000.c 2010-07-07 09:04:52.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/mtd/devices/doc2000.c linux-2.6.35.4/drivers/mtd/devices/doc2000.c +--- linux-2.6.35.4/drivers/mtd/devices/doc2000.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/mtd/devices/doc2000.c 2010-09-17 20:12:09.000000000 -0400 @@ -776,7 +776,7 @@ static int doc_write(struct mtd_info *mt /* The ECC will not be calculated correctly if less than 512 is written */ @@ -25463,9 +26301,9 @@ diff -urNp linux-2.6.34.1/drivers/mtd/devices/doc2000.c linux-2.6.34.1/drivers/m printk(KERN_WARNING "ECC needs a full sector write (adr: %lx size %lx)\n", (long) to, (long) len); -diff -urNp linux-2.6.34.1/drivers/mtd/devices/doc2001.c linux-2.6.34.1/drivers/mtd/devices/doc2001.c ---- linux-2.6.34.1/drivers/mtd/devices/doc2001.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/mtd/devices/doc2001.c 2010-07-07 09:04:52.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/mtd/devices/doc2001.c linux-2.6.35.4/drivers/mtd/devices/doc2001.c +--- linux-2.6.35.4/drivers/mtd/devices/doc2001.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/mtd/devices/doc2001.c 2010-09-17 20:12:09.000000000 -0400 @@ -393,7 +393,7 @@ static int doc_read (struct mtd_info *mt struct Nand *mychip = &this->chips[from >> (this->chipshift)]; @@ -25475,10 +26313,21 @@ diff -urNp linux-2.6.34.1/drivers/mtd/devices/doc2001.c linux-2.6.34.1/drivers/m return -EINVAL; /* Don't allow a single read to cross a 512-byte block boundary */ -diff -urNp linux-2.6.34.1/drivers/mtd/ubi/build.c linux-2.6.34.1/drivers/mtd/ubi/build.c ---- linux-2.6.34.1/drivers/mtd/ubi/build.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/mtd/ubi/build.c 2010-07-07 09:04:52.000000000 -0400 -@@ -1296,7 +1296,7 @@ module_exit(ubi_exit); +diff -urNp linux-2.6.35.4/drivers/mtd/nand/denali.c linux-2.6.35.4/drivers/mtd/nand/denali.c +--- linux-2.6.35.4/drivers/mtd/nand/denali.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/mtd/nand/denali.c 2010-09-17 20:12:09.000000000 -0400 +@@ -24,6 +24,7 @@ + #include + #include + #include ++#include + + #include "denali.h" + +diff -urNp linux-2.6.35.4/drivers/mtd/ubi/build.c linux-2.6.35.4/drivers/mtd/ubi/build.c +--- linux-2.6.35.4/drivers/mtd/ubi/build.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/mtd/ubi/build.c 2010-09-17 20:12:09.000000000 -0400 +@@ -1282,7 +1282,7 @@ module_exit(ubi_exit); static int __init bytes_str_to_int(const char *str) { char *endp; @@ -25487,7 +26336,7 @@ diff -urNp linux-2.6.34.1/drivers/mtd/ubi/build.c linux-2.6.34.1/drivers/mtd/ubi result = simple_strtoul(str, &endp, 0); if (str == endp || result >= INT_MAX) { -@@ -1307,11 +1307,11 @@ static int __init bytes_str_to_int(const +@@ -1293,11 +1293,11 @@ static int __init bytes_str_to_int(const switch (*endp) { case 'G': @@ -25502,7 +26351,7 @@ diff -urNp linux-2.6.34.1/drivers/mtd/ubi/build.c linux-2.6.34.1/drivers/mtd/ubi if (endp[1] == 'i' && endp[2] == 'B') endp += 2; case '\0': -@@ -1322,7 +1322,13 @@ static int __init bytes_str_to_int(const +@@ -1308,7 +1308,13 @@ static int __init bytes_str_to_int(const return -EINVAL; } @@ -25517,9 +26366,21 @@ diff -urNp linux-2.6.34.1/drivers/mtd/ubi/build.c linux-2.6.34.1/drivers/mtd/ubi } /** -diff -urNp linux-2.6.34.1/drivers/net/e1000e/82571.c linux-2.6.34.1/drivers/net/e1000e/82571.c ---- linux-2.6.34.1/drivers/net/e1000e/82571.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/net/e1000e/82571.c 2010-07-07 09:04:52.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/net/cxgb3/cxgb3_main.c linux-2.6.35.4/drivers/net/cxgb3/cxgb3_main.c +--- linux-2.6.35.4/drivers/net/cxgb3/cxgb3_main.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/net/cxgb3/cxgb3_main.c 2010-09-17 20:12:37.000000000 -0400 +@@ -2296,6 +2296,8 @@ static int cxgb_extension_ioctl(struct n + case CHELSIO_GET_QSET_NUM:{ + struct ch_reg edata; + ++ memset(&edata, 0, sizeof(edata)); ++ + edata.cmd = CHELSIO_GET_QSET_NUM; + edata.val = pi->nqsets; + if (copy_to_user(useraddr, &edata, sizeof(edata))) +diff -urNp linux-2.6.35.4/drivers/net/e1000e/82571.c linux-2.6.35.4/drivers/net/e1000e/82571.c +--- linux-2.6.35.4/drivers/net/e1000e/82571.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/net/e1000e/82571.c 2010-09-17 20:12:09.000000000 -0400 @@ -207,6 +207,7 @@ static s32 e1000_init_mac_params_82571(s { struct e1000_hw *hw = &adapter->hw; @@ -25528,7 +26389,7 @@ diff -urNp linux-2.6.34.1/drivers/net/e1000e/82571.c linux-2.6.34.1/drivers/net/ struct e1000_mac_operations *func = &mac->ops; u32 swsm = 0; u32 swsm2 = 0; -@@ -1692,7 +1693,7 @@ static void e1000_clear_hw_cntrs_82571(s +@@ -1703,7 +1704,7 @@ static void e1000_clear_hw_cntrs_82571(s er32(ICRXDMTC); } @@ -25537,7 +26398,7 @@ diff -urNp linux-2.6.34.1/drivers/net/e1000e/82571.c linux-2.6.34.1/drivers/net/ /* .check_mng_mode: mac type dependent */ /* .check_for_link: media type dependent */ .id_led_init = e1000e_id_led_init, -@@ -1714,7 +1715,7 @@ static struct e1000_mac_operations e8257 +@@ -1725,7 +1726,7 @@ static struct e1000_mac_operations e8257 .read_mac_addr = e1000_read_mac_addr_82571, }; @@ -25546,7 +26407,7 @@ diff -urNp linux-2.6.34.1/drivers/net/e1000e/82571.c linux-2.6.34.1/drivers/net/ .acquire = e1000_get_hw_semaphore_82571, .check_polarity = e1000_check_polarity_igp, .check_reset_block = e1000e_check_reset_block_generic, -@@ -1732,7 +1733,7 @@ static struct e1000_phy_operations e82_p +@@ -1743,7 +1744,7 @@ static struct e1000_phy_operations e82_p .cfg_on_link_up = NULL, }; @@ -25555,7 +26416,7 @@ diff -urNp linux-2.6.34.1/drivers/net/e1000e/82571.c linux-2.6.34.1/drivers/net/ .acquire = e1000_get_hw_semaphore_82571, .check_polarity = e1000_check_polarity_m88, .check_reset_block = e1000e_check_reset_block_generic, -@@ -1750,7 +1751,7 @@ static struct e1000_phy_operations e82_p +@@ -1761,7 +1762,7 @@ static struct e1000_phy_operations e82_p .cfg_on_link_up = NULL, }; @@ -25564,7 +26425,7 @@ diff -urNp linux-2.6.34.1/drivers/net/e1000e/82571.c linux-2.6.34.1/drivers/net/ .acquire = e1000_get_hw_semaphore_82571, .check_polarity = e1000_check_polarity_m88, .check_reset_block = e1000e_check_reset_block_generic, -@@ -1768,7 +1769,7 @@ static struct e1000_phy_operations e82_p +@@ -1779,7 +1780,7 @@ static struct e1000_phy_operations e82_p .cfg_on_link_up = NULL, }; @@ -25573,10 +26434,10 @@ diff -urNp linux-2.6.34.1/drivers/net/e1000e/82571.c linux-2.6.34.1/drivers/net/ .acquire = e1000_acquire_nvm_82571, .read = e1000e_read_nvm_eerd, .release = e1000_release_nvm_82571, -diff -urNp linux-2.6.34.1/drivers/net/e1000e/e1000.h linux-2.6.34.1/drivers/net/e1000e/e1000.h ---- linux-2.6.34.1/drivers/net/e1000e/e1000.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/net/e1000e/e1000.h 2010-07-07 09:04:52.000000000 -0400 -@@ -379,9 +379,9 @@ struct e1000_info { +diff -urNp linux-2.6.35.4/drivers/net/e1000e/e1000.h linux-2.6.35.4/drivers/net/e1000e/e1000.h +--- linux-2.6.35.4/drivers/net/e1000e/e1000.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/net/e1000e/e1000.h 2010-09-17 20:12:09.000000000 -0400 +@@ -377,9 +377,9 @@ struct e1000_info { u32 pba; u32 max_hw_frame_size; s32 (*get_variants)(struct e1000_adapter *); @@ -25589,9 +26450,9 @@ diff -urNp linux-2.6.34.1/drivers/net/e1000e/e1000.h linux-2.6.34.1/drivers/net/ }; /* hardware capability, feature, and workaround flags */ -diff -urNp linux-2.6.34.1/drivers/net/e1000e/es2lan.c linux-2.6.34.1/drivers/net/e1000e/es2lan.c ---- linux-2.6.34.1/drivers/net/e1000e/es2lan.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/net/e1000e/es2lan.c 2010-07-07 09:04:52.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/net/e1000e/es2lan.c linux-2.6.35.4/drivers/net/e1000e/es2lan.c +--- linux-2.6.35.4/drivers/net/e1000e/es2lan.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/net/e1000e/es2lan.c 2010-09-17 20:12:09.000000000 -0400 @@ -205,6 +205,7 @@ static s32 e1000_init_mac_params_80003es { struct e1000_hw *hw = &adapter->hw; @@ -25600,7 +26461,7 @@ diff -urNp linux-2.6.34.1/drivers/net/e1000e/es2lan.c linux-2.6.34.1/drivers/net struct e1000_mac_operations *func = &mac->ops; /* Set media type */ -@@ -1430,7 +1431,7 @@ static void e1000_clear_hw_cntrs_80003es +@@ -1431,7 +1432,7 @@ static void e1000_clear_hw_cntrs_80003es er32(ICRXDMTC); } @@ -25609,7 +26470,7 @@ diff -urNp linux-2.6.34.1/drivers/net/e1000e/es2lan.c linux-2.6.34.1/drivers/net .read_mac_addr = e1000_read_mac_addr_80003es2lan, .id_led_init = e1000e_id_led_init, .check_mng_mode = e1000e_check_mng_mode_generic, -@@ -1452,7 +1453,7 @@ static struct e1000_mac_operations es2_m +@@ -1453,7 +1454,7 @@ static struct e1000_mac_operations es2_m .setup_led = e1000e_setup_led_generic, }; @@ -25618,7 +26479,7 @@ diff -urNp linux-2.6.34.1/drivers/net/e1000e/es2lan.c linux-2.6.34.1/drivers/net .acquire = e1000_acquire_phy_80003es2lan, .check_polarity = e1000_check_polarity_m88, .check_reset_block = e1000e_check_reset_block_generic, -@@ -1470,7 +1471,7 @@ static struct e1000_phy_operations es2_p +@@ -1471,7 +1472,7 @@ static struct e1000_phy_operations es2_p .cfg_on_link_up = e1000_cfg_on_link_up_80003es2lan, }; @@ -25627,10 +26488,10 @@ diff -urNp linux-2.6.34.1/drivers/net/e1000e/es2lan.c linux-2.6.34.1/drivers/net .acquire = e1000_acquire_nvm_80003es2lan, .read = e1000e_read_nvm_eerd, .release = e1000_release_nvm_80003es2lan, -diff -urNp linux-2.6.34.1/drivers/net/e1000e/hw.h linux-2.6.34.1/drivers/net/e1000e/hw.h ---- linux-2.6.34.1/drivers/net/e1000e/hw.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/net/e1000e/hw.h 2010-07-07 09:04:52.000000000 -0400 -@@ -788,13 +788,13 @@ struct e1000_phy_operations { +diff -urNp linux-2.6.35.4/drivers/net/e1000e/hw.h linux-2.6.35.4/drivers/net/e1000e/hw.h +--- linux-2.6.35.4/drivers/net/e1000e/hw.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/net/e1000e/hw.h 2010-09-17 20:12:09.000000000 -0400 +@@ -791,13 +791,13 @@ struct e1000_phy_operations { /* Function pointers for the NVM. */ struct e1000_nvm_operations { @@ -25651,7 +26512,7 @@ diff -urNp linux-2.6.34.1/drivers/net/e1000e/hw.h linux-2.6.34.1/drivers/net/e10 }; struct e1000_mac_info { -@@ -873,6 +873,7 @@ struct e1000_phy_info { +@@ -877,6 +877,7 @@ struct e1000_phy_info { }; struct e1000_nvm_info { @@ -25659,10 +26520,10 @@ diff -urNp linux-2.6.34.1/drivers/net/e1000e/hw.h linux-2.6.34.1/drivers/net/e10 struct e1000_nvm_operations ops; enum e1000_nvm_type type; -diff -urNp linux-2.6.34.1/drivers/net/e1000e/ich8lan.c linux-2.6.34.1/drivers/net/e1000e/ich8lan.c ---- linux-2.6.34.1/drivers/net/e1000e/ich8lan.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/net/e1000e/ich8lan.c 2010-07-07 09:04:52.000000000 -0400 -@@ -3371,7 +3371,7 @@ static void e1000_clear_hw_cntrs_ich8lan +diff -urNp linux-2.6.35.4/drivers/net/e1000e/ich8lan.c linux-2.6.35.4/drivers/net/e1000e/ich8lan.c +--- linux-2.6.35.4/drivers/net/e1000e/ich8lan.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/net/e1000e/ich8lan.c 2010-09-17 20:12:09.000000000 -0400 +@@ -3388,7 +3388,7 @@ static void e1000_clear_hw_cntrs_ich8lan } } @@ -25671,7 +26532,7 @@ diff -urNp linux-2.6.34.1/drivers/net/e1000e/ich8lan.c linux-2.6.34.1/drivers/ne .id_led_init = e1000e_id_led_init, .check_mng_mode = e1000_check_mng_mode_ich8lan, .check_for_link = e1000_check_for_copper_link_ich8lan, -@@ -3390,7 +3390,7 @@ static struct e1000_mac_operations ich8_ +@@ -3407,7 +3407,7 @@ static struct e1000_mac_operations ich8_ /* id_led_init dependent on mac type */ }; @@ -25680,7 +26541,7 @@ diff -urNp linux-2.6.34.1/drivers/net/e1000e/ich8lan.c linux-2.6.34.1/drivers/ne .acquire = e1000_acquire_swflag_ich8lan, .check_reset_block = e1000_check_reset_block_ich8lan, .commit = NULL, -@@ -3404,7 +3404,7 @@ static struct e1000_phy_operations ich8_ +@@ -3421,7 +3421,7 @@ static struct e1000_phy_operations ich8_ .write_reg = e1000e_write_phy_reg_igp, }; @@ -25689,10 +26550,22 @@ diff -urNp linux-2.6.34.1/drivers/net/e1000e/ich8lan.c linux-2.6.34.1/drivers/ne .acquire = e1000_acquire_nvm_ich8lan, .read = e1000_read_nvm_ich8lan, .release = e1000_release_nvm_ich8lan, -diff -urNp linux-2.6.34.1/drivers/net/igb/e1000_82575.c linux-2.6.34.1/drivers/net/igb/e1000_82575.c ---- linux-2.6.34.1/drivers/net/igb/e1000_82575.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/net/igb/e1000_82575.c 2010-07-07 09:04:52.000000000 -0400 -@@ -1610,7 +1610,7 @@ u16 igb_rxpbs_adjust_82580(u32 data) +diff -urNp linux-2.6.35.4/drivers/net/eql.c linux-2.6.35.4/drivers/net/eql.c +--- linux-2.6.35.4/drivers/net/eql.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/net/eql.c 2010-09-17 20:12:37.000000000 -0400 +@@ -555,6 +555,8 @@ static int eql_g_master_cfg(struct net_d + equalizer_t *eql; + master_config_t mc; + ++ memset(&mc, 0, sizeof(mc)); ++ + if (eql_is_master(dev)) { + eql = netdev_priv(dev); + mc.max_slaves = eql->max_slaves; +diff -urNp linux-2.6.35.4/drivers/net/igb/e1000_82575.c linux-2.6.35.4/drivers/net/igb/e1000_82575.c +--- linux-2.6.35.4/drivers/net/igb/e1000_82575.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/net/igb/e1000_82575.c 2010-09-17 20:12:09.000000000 -0400 +@@ -1597,7 +1597,7 @@ u16 igb_rxpbs_adjust_82580(u32 data) return ret_val; } @@ -25701,7 +26574,7 @@ diff -urNp linux-2.6.34.1/drivers/net/igb/e1000_82575.c linux-2.6.34.1/drivers/n .init_hw = igb_init_hw_82575, .check_for_link = igb_check_for_link_82575, .rar_set = igb_rar_set, -@@ -1618,13 +1618,13 @@ static struct e1000_mac_operations e1000 +@@ -1605,13 +1605,13 @@ static struct e1000_mac_operations e1000 .get_speed_and_duplex = igb_get_speed_and_duplex_copper, }; @@ -25717,10 +26590,10 @@ diff -urNp linux-2.6.34.1/drivers/net/igb/e1000_82575.c linux-2.6.34.1/drivers/n .acquire = igb_acquire_nvm_82575, .read = igb_read_nvm_eerd, .release = igb_release_nvm_82575, -diff -urNp linux-2.6.34.1/drivers/net/igb/e1000_hw.h linux-2.6.34.1/drivers/net/igb/e1000_hw.h ---- linux-2.6.34.1/drivers/net/igb/e1000_hw.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/net/igb/e1000_hw.h 2010-07-07 09:04:52.000000000 -0400 -@@ -317,17 +317,17 @@ struct e1000_phy_operations { +diff -urNp linux-2.6.35.4/drivers/net/igb/e1000_hw.h linux-2.6.35.4/drivers/net/igb/e1000_hw.h +--- linux-2.6.35.4/drivers/net/igb/e1000_hw.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/net/igb/e1000_hw.h 2010-09-17 20:12:09.000000000 -0400 +@@ -323,17 +323,17 @@ struct e1000_phy_operations { }; struct e1000_nvm_operations { @@ -25745,7 +26618,7 @@ diff -urNp linux-2.6.34.1/drivers/net/igb/e1000_hw.h linux-2.6.34.1/drivers/net/ }; extern const struct e1000_info e1000_82575_info; -@@ -406,6 +406,7 @@ struct e1000_phy_info { +@@ -412,6 +412,7 @@ struct e1000_phy_info { }; struct e1000_nvm_info { @@ -25753,9 +26626,9 @@ diff -urNp linux-2.6.34.1/drivers/net/igb/e1000_hw.h linux-2.6.34.1/drivers/net/ struct e1000_nvm_operations ops; enum e1000_nvm_type type; -diff -urNp linux-2.6.34.1/drivers/net/irda/vlsi_ir.c linux-2.6.34.1/drivers/net/irda/vlsi_ir.c ---- linux-2.6.34.1/drivers/net/irda/vlsi_ir.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/net/irda/vlsi_ir.c 2010-07-07 09:04:52.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/net/irda/vlsi_ir.c linux-2.6.35.4/drivers/net/irda/vlsi_ir.c +--- linux-2.6.35.4/drivers/net/irda/vlsi_ir.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/net/irda/vlsi_ir.c 2010-09-17 20:12:09.000000000 -0400 @@ -907,13 +907,12 @@ static netdev_tx_t vlsi_hard_start_xmit( /* no race - tx-ring already empty */ vlsi_set_baud(idev, iobase); @@ -25772,9 +26645,9 @@ diff -urNp linux-2.6.34.1/drivers/net/irda/vlsi_ir.c linux-2.6.34.1/drivers/net/ spin_unlock_irqrestore(&idev->lock, flags); dev_kfree_skb_any(skb); return NETDEV_TX_OK; -diff -urNp linux-2.6.34.1/drivers/net/pcnet32.c linux-2.6.34.1/drivers/net/pcnet32.c ---- linux-2.6.34.1/drivers/net/pcnet32.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/net/pcnet32.c 2010-07-07 09:04:52.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/net/pcnet32.c linux-2.6.35.4/drivers/net/pcnet32.c +--- linux-2.6.35.4/drivers/net/pcnet32.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/net/pcnet32.c 2010-09-17 20:12:09.000000000 -0400 @@ -82,7 +82,7 @@ static int cards_found; /* * VLB I/O addresses @@ -25784,9 +26657,9 @@ diff -urNp linux-2.6.34.1/drivers/net/pcnet32.c linux-2.6.34.1/drivers/net/pcnet { 0x300, 0x320, 0x340, 0x360, 0 }; static int pcnet32_debug; -diff -urNp linux-2.6.34.1/drivers/net/ppp_generic.c linux-2.6.34.1/drivers/net/ppp_generic.c ---- linux-2.6.34.1/drivers/net/ppp_generic.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/net/ppp_generic.c 2010-07-07 09:04:53.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/net/ppp_generic.c linux-2.6.35.4/drivers/net/ppp_generic.c +--- linux-2.6.35.4/drivers/net/ppp_generic.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/net/ppp_generic.c 2010-09-17 20:12:09.000000000 -0400 @@ -992,7 +992,6 @@ ppp_net_ioctl(struct net_device *dev, st void __user *addr = (void __user *) ifr->ifr_ifru.ifru_data; struct ppp_stats stats; @@ -25805,10 +26678,22 @@ diff -urNp linux-2.6.34.1/drivers/net/ppp_generic.c linux-2.6.34.1/drivers/net/p break; err = 0; break; -diff -urNp linux-2.6.34.1/drivers/net/tg3.h linux-2.6.34.1/drivers/net/tg3.h ---- linux-2.6.34.1/drivers/net/tg3.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/net/tg3.h 2010-07-07 09:04:53.000000000 -0400 -@@ -133,6 +133,7 @@ +diff -urNp linux-2.6.35.4/drivers/net/tg3.c linux-2.6.35.4/drivers/net/tg3.c +--- linux-2.6.35.4/drivers/net/tg3.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/net/tg3.c 2010-09-17 20:12:09.000000000 -0400 +@@ -12410,7 +12410,7 @@ static void __devinit tg3_read_vpd(struc + cnt = pci_read_vpd(tp->pdev, pos, + TG3_NVM_VPD_LEN - pos, + &vpd_data[pos]); +- if (cnt == -ETIMEDOUT || -EINTR) ++ if (cnt == -ETIMEDOUT || cnt == -EINTR) + cnt = 0; + else if (cnt < 0) + goto out_not_found; +diff -urNp linux-2.6.35.4/drivers/net/tg3.h linux-2.6.35.4/drivers/net/tg3.h +--- linux-2.6.35.4/drivers/net/tg3.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/net/tg3.h 2010-09-17 20:12:09.000000000 -0400 +@@ -130,6 +130,7 @@ #define CHIPREV_ID_5750_A0 0x4000 #define CHIPREV_ID_5750_A1 0x4001 #define CHIPREV_ID_5750_A3 0x4003 @@ -25816,10 +26701,10 @@ diff -urNp linux-2.6.34.1/drivers/net/tg3.h linux-2.6.34.1/drivers/net/tg3.h #define CHIPREV_ID_5750_C2 0x4202 #define CHIPREV_ID_5752_A0_HW 0x5000 #define CHIPREV_ID_5752_A0 0x6000 -diff -urNp linux-2.6.34.1/drivers/net/tulip/de4x5.c linux-2.6.34.1/drivers/net/tulip/de4x5.c ---- linux-2.6.34.1/drivers/net/tulip/de4x5.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/net/tulip/de4x5.c 2010-07-07 09:04:53.000000000 -0400 -@@ -5470,7 +5470,7 @@ de4x5_ioctl(struct net_device *dev, stru +diff -urNp linux-2.6.35.4/drivers/net/tulip/de4x5.c linux-2.6.35.4/drivers/net/tulip/de4x5.c +--- linux-2.6.35.4/drivers/net/tulip/de4x5.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/net/tulip/de4x5.c 2010-09-17 20:12:37.000000000 -0400 +@@ -5401,7 +5401,7 @@ de4x5_ioctl(struct net_device *dev, stru for (i=0; idev_addr[i]; } @@ -25828,7 +26713,7 @@ diff -urNp linux-2.6.34.1/drivers/net/tulip/de4x5.c linux-2.6.34.1/drivers/net/t break; case DE4X5_SET_HWADDR: /* Set the hardware address */ -@@ -5510,7 +5510,7 @@ de4x5_ioctl(struct net_device *dev, stru +@@ -5441,7 +5441,7 @@ de4x5_ioctl(struct net_device *dev, stru spin_lock_irqsave(&lp->lock, flags); memcpy(&statbuf, &lp->pktStats, ioc->len); spin_unlock_irqrestore(&lp->lock, flags); @@ -25837,9 +26722,18 @@ diff -urNp linux-2.6.34.1/drivers/net/tulip/de4x5.c linux-2.6.34.1/drivers/net/t return -EFAULT; break; } -diff -urNp linux-2.6.34.1/drivers/net/usb/hso.c linux-2.6.34.1/drivers/net/usb/hso.c ---- linux-2.6.34.1/drivers/net/usb/hso.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/net/usb/hso.c 2010-07-07 09:04:53.000000000 -0400 +@@ -5474,7 +5474,7 @@ de4x5_ioctl(struct net_device *dev, stru + tmp.lval[6] = inl(DE4X5_STRR); j+=4; + tmp.lval[7] = inl(DE4X5_SIGR); j+=4; + ioc->len = j; +- if (copy_to_user(ioc->data, tmp.addr, ioc->len)) return -EFAULT; ++ if (copy_to_user(ioc->data, tmp.lval, ioc->len)) return -EFAULT; + break; + + #define DE4X5_DUMP 0x0f /* Dump the DE4X5 Status */ +diff -urNp linux-2.6.35.4/drivers/net/usb/hso.c linux-2.6.35.4/drivers/net/usb/hso.c +--- linux-2.6.35.4/drivers/net/usb/hso.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/net/usb/hso.c 2010-09-17 20:12:37.000000000 -0400 @@ -258,7 +258,7 @@ struct hso_serial { /* from usb_serial_port */ @@ -25849,7 +26743,7 @@ diff -urNp linux-2.6.34.1/drivers/net/usb/hso.c linux-2.6.34.1/drivers/net/usb/h spinlock_t serial_lock; int (*write_data) (struct hso_serial *serial); -@@ -1200,7 +1200,7 @@ static void put_rxbuf_data_and_resubmit_ +@@ -1201,7 +1201,7 @@ static void put_rxbuf_data_and_resubmit_ struct urb *urb; urb = serial->rx_urb[0]; @@ -25858,7 +26752,7 @@ diff -urNp linux-2.6.34.1/drivers/net/usb/hso.c linux-2.6.34.1/drivers/net/usb/h count = put_rxbuf_data(urb, serial); if (count == -1) return; -@@ -1236,7 +1236,7 @@ static void hso_std_serial_read_bulk_cal +@@ -1237,7 +1237,7 @@ static void hso_std_serial_read_bulk_cal DUMP1(urb->transfer_buffer, urb->actual_length); /* Anyone listening? */ @@ -25867,16 +26761,16 @@ diff -urNp linux-2.6.34.1/drivers/net/usb/hso.c linux-2.6.34.1/drivers/net/usb/h return; if (status == 0) { -@@ -1331,8 +1331,7 @@ static int hso_serial_open(struct tty_st +@@ -1332,8 +1332,7 @@ static int hso_serial_open(struct tty_st spin_unlock_irq(&serial->serial_lock); /* check for port already opened, if not set the termios */ - serial->open_count++; - if (serial->open_count == 1) { + if (atomic_inc_return(&serial->open_count) == 1) { - tty->low_latency = 1; serial->rx_state = RX_IDLE; /* Force default termio settings */ + _hso_serial_set_termios(tty, NULL); @@ -1345,7 +1344,7 @@ static int hso_serial_open(struct tty_st result = hso_start_serial_device(serial->parent, GFP_KERNEL); if (result) { @@ -25909,7 +26803,17 @@ diff -urNp linux-2.6.34.1/drivers/net/usb/hso.c linux-2.6.34.1/drivers/net/usb/h _hso_serial_set_termios(tty, old); else tty->termios = old; -@@ -1930,7 +1929,7 @@ static void intr_callback(struct urb *ur +@@ -1655,6 +1654,9 @@ static int hso_get_count(struct hso_seri + + if (!tiocmget) + return -ENOENT; ++ ++ memset(&icount, 0, sizeof(icount)); ++ + spin_lock_irq(&serial->serial_lock); + memcpy(&cnow, &tiocmget->icount, sizeof(struct uart_icount)); + spin_unlock_irq(&serial->serial_lock); +@@ -1929,7 +1931,7 @@ static void intr_callback(struct urb *ur D1("Pending read interrupt on port %d\n", i); spin_lock(&serial->serial_lock); if (serial->rx_state == RX_IDLE && @@ -25918,7 +26822,7 @@ diff -urNp linux-2.6.34.1/drivers/net/usb/hso.c linux-2.6.34.1/drivers/net/usb/h /* Setup and send a ctrl req read on * port i */ if (!serial->rx_urb_filled[0]) { -@@ -3121,7 +3120,7 @@ static int hso_resume(struct usb_interfa +@@ -3119,7 +3121,7 @@ static int hso_resume(struct usb_interfa /* Start all serial ports */ for (i = 0; i < HSO_SERIAL_TTY_MINORS; i++) { if (serial_table[i] && (serial_table[i]->interface == iface)) { @@ -25927,9 +26831,9 @@ diff -urNp linux-2.6.34.1/drivers/net/usb/hso.c linux-2.6.34.1/drivers/net/usb/h result = hso_start_serial_device(serial_table[i], GFP_NOIO); hso_kick_transmit(dev2ser(serial_table[i])); -diff -urNp linux-2.6.34.1/drivers/net/wireless/b43/debugfs.c linux-2.6.34.1/drivers/net/wireless/b43/debugfs.c ---- linux-2.6.34.1/drivers/net/wireless/b43/debugfs.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/net/wireless/b43/debugfs.c 2010-07-07 09:04:53.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/net/wireless/b43/debugfs.c linux-2.6.35.4/drivers/net/wireless/b43/debugfs.c +--- linux-2.6.35.4/drivers/net/wireless/b43/debugfs.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/net/wireless/b43/debugfs.c 2010-09-17 20:12:09.000000000 -0400 @@ -43,7 +43,7 @@ static struct dentry *rootdir; struct b43_debugfs_fops { ssize_t (*read)(struct b43_wldev *dev, char *buf, size_t bufsize); @@ -25939,9 +26843,9 @@ diff -urNp linux-2.6.34.1/drivers/net/wireless/b43/debugfs.c linux-2.6.34.1/driv /* Offset of struct b43_dfs_file in struct b43_dfsentry */ size_t file_struct_offset; }; -diff -urNp linux-2.6.34.1/drivers/net/wireless/b43legacy/debugfs.c linux-2.6.34.1/drivers/net/wireless/b43legacy/debugfs.c ---- linux-2.6.34.1/drivers/net/wireless/b43legacy/debugfs.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/net/wireless/b43legacy/debugfs.c 2010-07-07 09:04:53.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/net/wireless/b43legacy/debugfs.c linux-2.6.35.4/drivers/net/wireless/b43legacy/debugfs.c +--- linux-2.6.35.4/drivers/net/wireless/b43legacy/debugfs.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/net/wireless/b43legacy/debugfs.c 2010-09-17 20:12:09.000000000 -0400 @@ -44,7 +44,7 @@ static struct dentry *rootdir; struct b43legacy_debugfs_fops { ssize_t (*read)(struct b43legacy_wldev *dev, char *buf, size_t bufsize); @@ -25951,9 +26855,9 @@ diff -urNp linux-2.6.34.1/drivers/net/wireless/b43legacy/debugfs.c linux-2.6.34. /* Offset of struct b43legacy_dfs_file in struct b43legacy_dfsentry */ size_t file_struct_offset; /* Take wl->irq_lock before calling read/write? */ -diff -urNp linux-2.6.34.1/drivers/net/wireless/iwlwifi/iwl-debug.h linux-2.6.34.1/drivers/net/wireless/iwlwifi/iwl-debug.h ---- linux-2.6.34.1/drivers/net/wireless/iwlwifi/iwl-debug.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/net/wireless/iwlwifi/iwl-debug.h 2010-07-07 09:04:53.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/net/wireless/iwlwifi/iwl-debug.h linux-2.6.35.4/drivers/net/wireless/iwlwifi/iwl-debug.h +--- linux-2.6.35.4/drivers/net/wireless/iwlwifi/iwl-debug.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/net/wireless/iwlwifi/iwl-debug.h 2010-09-17 20:12:09.000000000 -0400 @@ -68,8 +68,8 @@ do { } while (0) @@ -25965,9 +26869,9 @@ diff -urNp linux-2.6.34.1/drivers/net/wireless/iwlwifi/iwl-debug.h linux-2.6.34. static inline void iwl_print_hex_dump(struct iwl_priv *priv, int level, void *p, u32 len) {} -diff -urNp linux-2.6.34.1/drivers/net/wireless/libertas/debugfs.c linux-2.6.34.1/drivers/net/wireless/libertas/debugfs.c ---- linux-2.6.34.1/drivers/net/wireless/libertas/debugfs.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/net/wireless/libertas/debugfs.c 2010-07-07 09:04:53.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/net/wireless/libertas/debugfs.c linux-2.6.35.4/drivers/net/wireless/libertas/debugfs.c +--- linux-2.6.35.4/drivers/net/wireless/libertas/debugfs.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/net/wireless/libertas/debugfs.c 2010-09-17 20:12:09.000000000 -0400 @@ -718,7 +718,7 @@ out_unlock: struct lbs_debugfs_files { const char *name; @@ -25977,10 +26881,10 @@ diff -urNp linux-2.6.34.1/drivers/net/wireless/libertas/debugfs.c linux-2.6.34.1 }; static const struct lbs_debugfs_files debugfs_files[] = { -diff -urNp linux-2.6.34.1/drivers/net/wireless/rndis_wlan.c linux-2.6.34.1/drivers/net/wireless/rndis_wlan.c ---- linux-2.6.34.1/drivers/net/wireless/rndis_wlan.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/net/wireless/rndis_wlan.c 2010-07-07 09:04:53.000000000 -0400 -@@ -1185,7 +1185,7 @@ static int set_rts_threshold(struct usbn +diff -urNp linux-2.6.35.4/drivers/net/wireless/rndis_wlan.c linux-2.6.35.4/drivers/net/wireless/rndis_wlan.c +--- linux-2.6.35.4/drivers/net/wireless/rndis_wlan.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/net/wireless/rndis_wlan.c 2010-09-17 20:12:09.000000000 -0400 +@@ -1235,7 +1235,7 @@ static int set_rts_threshold(struct usbn netdev_dbg(usbdev->net, "%s(): %i\n", __func__, rts_threshold); @@ -25989,9 +26893,9 @@ diff -urNp linux-2.6.34.1/drivers/net/wireless/rndis_wlan.c linux-2.6.34.1/drive rts_threshold = 2347; tmp = cpu_to_le32(rts_threshold); -diff -urNp linux-2.6.34.1/drivers/oprofile/buffer_sync.c linux-2.6.34.1/drivers/oprofile/buffer_sync.c ---- linux-2.6.34.1/drivers/oprofile/buffer_sync.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/oprofile/buffer_sync.c 2010-07-07 09:04:53.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/oprofile/buffer_sync.c linux-2.6.35.4/drivers/oprofile/buffer_sync.c +--- linux-2.6.35.4/drivers/oprofile/buffer_sync.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/oprofile/buffer_sync.c 2010-09-17 20:12:09.000000000 -0400 @@ -341,7 +341,7 @@ static void add_data(struct op_entry *en if (cookie == NO_COOKIE) offset = pc; @@ -26027,9 +26931,9 @@ diff -urNp linux-2.6.34.1/drivers/oprofile/buffer_sync.c linux-2.6.34.1/drivers/ } } release_mm(mm); -diff -urNp linux-2.6.34.1/drivers/oprofile/event_buffer.c linux-2.6.34.1/drivers/oprofile/event_buffer.c ---- linux-2.6.34.1/drivers/oprofile/event_buffer.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/oprofile/event_buffer.c 2010-07-07 09:04:53.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/oprofile/event_buffer.c linux-2.6.35.4/drivers/oprofile/event_buffer.c +--- linux-2.6.35.4/drivers/oprofile/event_buffer.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/oprofile/event_buffer.c 2010-09-17 20:12:09.000000000 -0400 @@ -53,7 +53,7 @@ void add_event_entry(unsigned long value } @@ -26039,9 +26943,9 @@ diff -urNp linux-2.6.34.1/drivers/oprofile/event_buffer.c linux-2.6.34.1/drivers return; } -diff -urNp linux-2.6.34.1/drivers/oprofile/oprof.c linux-2.6.34.1/drivers/oprofile/oprof.c ---- linux-2.6.34.1/drivers/oprofile/oprof.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/oprofile/oprof.c 2010-07-07 09:04:53.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/oprofile/oprof.c linux-2.6.35.4/drivers/oprofile/oprof.c +--- linux-2.6.35.4/drivers/oprofile/oprof.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/oprofile/oprof.c 2010-09-17 20:12:09.000000000 -0400 @@ -110,7 +110,7 @@ static void switch_worker(struct work_st if (oprofile_ops.switch_events()) return; @@ -26051,9 +26955,21 @@ diff -urNp linux-2.6.34.1/drivers/oprofile/oprof.c linux-2.6.34.1/drivers/oprofi start_switch_worker(); } -diff -urNp linux-2.6.34.1/drivers/oprofile/oprofile_stats.c linux-2.6.34.1/drivers/oprofile/oprofile_stats.c ---- linux-2.6.34.1/drivers/oprofile/oprofile_stats.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/oprofile/oprofile_stats.c 2010-07-07 09:04:53.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/oprofile/oprofilefs.c linux-2.6.35.4/drivers/oprofile/oprofilefs.c +--- linux-2.6.35.4/drivers/oprofile/oprofilefs.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/oprofile/oprofilefs.c 2010-09-17 20:12:09.000000000 -0400 +@@ -187,7 +187,7 @@ static const struct file_operations atom + + + int oprofilefs_create_ro_atomic(struct super_block *sb, struct dentry *root, +- char const *name, atomic_t *val) ++ char const *name, atomic_unchecked_t *val) + { + struct dentry *d = __oprofilefs_create_file(sb, root, name, + &atomic_ro_fops, 0444); +diff -urNp linux-2.6.35.4/drivers/oprofile/oprofile_stats.c linux-2.6.35.4/drivers/oprofile/oprofile_stats.c +--- linux-2.6.35.4/drivers/oprofile/oprofile_stats.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/oprofile/oprofile_stats.c 2010-09-17 20:12:09.000000000 -0400 @@ -30,11 +30,11 @@ void oprofile_reset_stats(void) cpu_buf->sample_invalid_eip = 0; } @@ -26071,9 +26987,9 @@ diff -urNp linux-2.6.34.1/drivers/oprofile/oprofile_stats.c linux-2.6.34.1/drive } -diff -urNp linux-2.6.34.1/drivers/oprofile/oprofile_stats.h linux-2.6.34.1/drivers/oprofile/oprofile_stats.h ---- linux-2.6.34.1/drivers/oprofile/oprofile_stats.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/oprofile/oprofile_stats.h 2010-07-07 09:04:53.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/oprofile/oprofile_stats.h linux-2.6.35.4/drivers/oprofile/oprofile_stats.h +--- linux-2.6.35.4/drivers/oprofile/oprofile_stats.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/oprofile/oprofile_stats.h 2010-09-17 20:12:09.000000000 -0400 @@ -13,11 +13,11 @@ #include @@ -26091,21 +27007,9 @@ diff -urNp linux-2.6.34.1/drivers/oprofile/oprofile_stats.h linux-2.6.34.1/drive }; extern struct oprofile_stat_struct oprofile_stats; -diff -urNp linux-2.6.34.1/drivers/oprofile/oprofilefs.c linux-2.6.34.1/drivers/oprofile/oprofilefs.c ---- linux-2.6.34.1/drivers/oprofile/oprofilefs.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/oprofile/oprofilefs.c 2010-07-07 09:04:53.000000000 -0400 -@@ -187,7 +187,7 @@ static const struct file_operations atom - - - int oprofilefs_create_ro_atomic(struct super_block *sb, struct dentry *root, -- char const *name, atomic_t *val) -+ char const *name, atomic_unchecked_t *val) - { - struct dentry *d = __oprofilefs_create_file(sb, root, name, - &atomic_ro_fops, 0444); -diff -urNp linux-2.6.34.1/drivers/parport/procfs.c linux-2.6.34.1/drivers/parport/procfs.c ---- linux-2.6.34.1/drivers/parport/procfs.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/parport/procfs.c 2010-07-07 09:04:53.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/parport/procfs.c linux-2.6.35.4/drivers/parport/procfs.c +--- linux-2.6.35.4/drivers/parport/procfs.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/parport/procfs.c 2010-09-17 20:12:37.000000000 -0400 @@ -64,7 +64,7 @@ static int do_active_device(ctl_table *t *ppos += len; @@ -26124,9 +27028,9 @@ diff -urNp linux-2.6.34.1/drivers/parport/procfs.c linux-2.6.34.1/drivers/parpor } #endif /* IEEE1284.3 support. */ -diff -urNp linux-2.6.34.1/drivers/pci/hotplug/acpiphp_glue.c linux-2.6.34.1/drivers/pci/hotplug/acpiphp_glue.c ---- linux-2.6.34.1/drivers/pci/hotplug/acpiphp_glue.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/pci/hotplug/acpiphp_glue.c 2010-07-07 09:04:53.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/pci/hotplug/acpiphp_glue.c linux-2.6.35.4/drivers/pci/hotplug/acpiphp_glue.c +--- linux-2.6.35.4/drivers/pci/hotplug/acpiphp_glue.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/pci/hotplug/acpiphp_glue.c 2010-09-17 20:12:09.000000000 -0400 @@ -110,7 +110,7 @@ static int post_dock_fixups(struct notif } @@ -26136,9 +27040,9 @@ diff -urNp linux-2.6.34.1/drivers/pci/hotplug/acpiphp_glue.c linux-2.6.34.1/driv .handler = handle_hotplug_event_func, }; -diff -urNp linux-2.6.34.1/drivers/pci/hotplug/cpqphp_nvram.c linux-2.6.34.1/drivers/pci/hotplug/cpqphp_nvram.c ---- linux-2.6.34.1/drivers/pci/hotplug/cpqphp_nvram.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/pci/hotplug/cpqphp_nvram.c 2010-07-07 09:04:53.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/pci/hotplug/cpqphp_nvram.c linux-2.6.35.4/drivers/pci/hotplug/cpqphp_nvram.c +--- linux-2.6.35.4/drivers/pci/hotplug/cpqphp_nvram.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/pci/hotplug/cpqphp_nvram.c 2010-09-17 20:12:09.000000000 -0400 @@ -428,9 +428,13 @@ static u32 store_HRT (void __iomem *rom_ void compaq_nvram_init (void __iomem *rom_start) @@ -26153,10 +27057,10 @@ diff -urNp linux-2.6.34.1/drivers/pci/hotplug/cpqphp_nvram.c linux-2.6.34.1/driv dbg("int15 entry = %p\n", compaq_int15_entry_point); /* initialize our int15 lock */ -diff -urNp linux-2.6.34.1/drivers/pci/intel-iommu.c linux-2.6.34.1/drivers/pci/intel-iommu.c ---- linux-2.6.34.1/drivers/pci/intel-iommu.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/pci/intel-iommu.c 2010-07-07 09:04:53.000000000 -0400 -@@ -2940,7 +2940,7 @@ static int intel_mapping_error(struct de +diff -urNp linux-2.6.35.4/drivers/pci/intel-iommu.c linux-2.6.35.4/drivers/pci/intel-iommu.c +--- linux-2.6.35.4/drivers/pci/intel-iommu.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/pci/intel-iommu.c 2010-09-17 20:12:09.000000000 -0400 +@@ -2938,7 +2938,7 @@ static int intel_mapping_error(struct de return !dma_addr; } @@ -26165,9 +27069,9 @@ diff -urNp linux-2.6.34.1/drivers/pci/intel-iommu.c linux-2.6.34.1/drivers/pci/i .alloc_coherent = intel_alloc_coherent, .free_coherent = intel_free_coherent, .map_sg = intel_map_sg, -diff -urNp linux-2.6.34.1/drivers/pci/pcie/portdrv_pci.c linux-2.6.34.1/drivers/pci/pcie/portdrv_pci.c ---- linux-2.6.34.1/drivers/pci/pcie/portdrv_pci.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/pci/pcie/portdrv_pci.c 2010-07-07 09:04:53.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/pci/pcie/portdrv_pci.c linux-2.6.35.4/drivers/pci/pcie/portdrv_pci.c +--- linux-2.6.35.4/drivers/pci/pcie/portdrv_pci.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/pci/pcie/portdrv_pci.c 2010-09-17 20:12:09.000000000 -0400 @@ -250,7 +250,7 @@ static void pcie_portdrv_err_resume(stru static const struct pci_device_id port_pci_ids[] = { { /* handle any PCI-Express port */ @@ -26177,10 +27081,10 @@ diff -urNp linux-2.6.34.1/drivers/pci/pcie/portdrv_pci.c linux-2.6.34.1/drivers/ }; MODULE_DEVICE_TABLE(pci, port_pci_ids); -diff -urNp linux-2.6.34.1/drivers/pci/probe.c linux-2.6.34.1/drivers/pci/probe.c ---- linux-2.6.34.1/drivers/pci/probe.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/pci/probe.c 2010-07-07 09:04:53.000000000 -0400 -@@ -63,14 +63,14 @@ static ssize_t pci_bus_show_cpuaffinity( +diff -urNp linux-2.6.35.4/drivers/pci/probe.c linux-2.6.35.4/drivers/pci/probe.c +--- linux-2.6.35.4/drivers/pci/probe.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/pci/probe.c 2010-09-17 20:12:09.000000000 -0400 +@@ -62,14 +62,14 @@ static ssize_t pci_bus_show_cpuaffinity( return ret; } @@ -26197,9 +27101,9 @@ diff -urNp linux-2.6.34.1/drivers/pci/probe.c linux-2.6.34.1/drivers/pci/probe.c struct device_attribute *attr, char *buf) { -diff -urNp linux-2.6.34.1/drivers/pci/proc.c linux-2.6.34.1/drivers/pci/proc.c ---- linux-2.6.34.1/drivers/pci/proc.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/pci/proc.c 2010-07-07 09:04:53.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/pci/proc.c linux-2.6.35.4/drivers/pci/proc.c +--- linux-2.6.35.4/drivers/pci/proc.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/pci/proc.c 2010-09-17 20:12:37.000000000 -0400 @@ -481,7 +481,16 @@ static const struct file_operations proc static int __init pci_proc_init(void) { @@ -26217,9 +27121,21 @@ diff -urNp linux-2.6.34.1/drivers/pci/proc.c linux-2.6.34.1/drivers/pci/proc.c proc_create("devices", 0, proc_bus_pci_dir, &proc_bus_pci_dev_operations); proc_initialized = 1; -diff -urNp linux-2.6.34.1/drivers/pcmcia/ti113x.h linux-2.6.34.1/drivers/pcmcia/ti113x.h ---- linux-2.6.34.1/drivers/pcmcia/ti113x.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/pcmcia/ti113x.h 2010-07-07 09:04:53.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/pcmcia/pcmcia_ioctl.c linux-2.6.35.4/drivers/pcmcia/pcmcia_ioctl.c +--- linux-2.6.35.4/drivers/pcmcia/pcmcia_ioctl.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/pcmcia/pcmcia_ioctl.c 2010-09-17 20:12:09.000000000 -0400 +@@ -850,7 +850,7 @@ static int ds_ioctl(struct file *file, u + return -EFAULT; + } + } +- buf = kmalloc(sizeof(ds_ioctl_arg_t), GFP_KERNEL); ++ buf = kzalloc(sizeof(ds_ioctl_arg_t), GFP_KERNEL); + if (!buf) + return -ENOMEM; + +diff -urNp linux-2.6.35.4/drivers/pcmcia/ti113x.h linux-2.6.35.4/drivers/pcmcia/ti113x.h +--- linux-2.6.35.4/drivers/pcmcia/ti113x.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/pcmcia/ti113x.h 2010-09-17 20:12:09.000000000 -0400 @@ -936,7 +936,7 @@ static struct pci_device_id ene_tune_tbl DEVID(PCI_VENDOR_ID_MOTOROLA, 0x3410, 0xECC0, PCI_ANY_ID, ENE_TEST_C9_TLTENABLE | ENE_TEST_C9_PFENABLE, ENE_TEST_C9_TLTENABLE), @@ -26229,10 +27145,10 @@ diff -urNp linux-2.6.34.1/drivers/pcmcia/ti113x.h linux-2.6.34.1/drivers/pcmcia/ }; static void ene_tune_bridge(struct pcmcia_socket *sock, struct pci_bus *bus) -diff -urNp linux-2.6.34.1/drivers/pcmcia/yenta_socket.c linux-2.6.34.1/drivers/pcmcia/yenta_socket.c ---- linux-2.6.34.1/drivers/pcmcia/yenta_socket.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/pcmcia/yenta_socket.c 2010-07-07 09:04:53.000000000 -0400 -@@ -1437,7 +1437,7 @@ static struct pci_device_id yenta_table[ +diff -urNp linux-2.6.35.4/drivers/pcmcia/yenta_socket.c linux-2.6.35.4/drivers/pcmcia/yenta_socket.c +--- linux-2.6.35.4/drivers/pcmcia/yenta_socket.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/pcmcia/yenta_socket.c 2010-09-17 20:12:09.000000000 -0400 +@@ -1428,7 +1428,7 @@ static struct pci_device_id yenta_table[ /* match any cardbus bridge */ CB_ID(PCI_ANY_ID, PCI_ANY_ID, DEFAULT), @@ -26241,9 +27157,9 @@ diff -urNp linux-2.6.34.1/drivers/pcmcia/yenta_socket.c linux-2.6.34.1/drivers/p }; MODULE_DEVICE_TABLE(pci, yenta_table); -diff -urNp linux-2.6.34.1/drivers/platform/x86/acer-wmi.c linux-2.6.34.1/drivers/platform/x86/acer-wmi.c ---- linux-2.6.34.1/drivers/platform/x86/acer-wmi.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/platform/x86/acer-wmi.c 2010-07-07 09:04:53.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/platform/x86/acer-wmi.c linux-2.6.35.4/drivers/platform/x86/acer-wmi.c +--- linux-2.6.35.4/drivers/platform/x86/acer-wmi.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/platform/x86/acer-wmi.c 2010-09-17 20:12:09.000000000 -0400 @@ -916,7 +916,7 @@ static int update_bl_status(struct backl return 0; } @@ -26253,21 +27169,9 @@ diff -urNp linux-2.6.34.1/drivers/platform/x86/acer-wmi.c linux-2.6.34.1/drivers .get_brightness = read_brightness, .update_status = update_bl_status, }; -diff -urNp linux-2.6.34.1/drivers/platform/x86/asus-laptop.c linux-2.6.34.1/drivers/platform/x86/asus-laptop.c ---- linux-2.6.34.1/drivers/platform/x86/asus-laptop.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/platform/x86/asus-laptop.c 2010-07-07 09:04:53.000000000 -0400 -@@ -621,7 +621,7 @@ static int update_bl_status(struct backl - return asus_lcd_set(asus, value); - } - --static struct backlight_ops asusbl_ops = { -+static const struct backlight_ops asusbl_ops = { - .get_brightness = asus_read_brightness, - .update_status = update_bl_status, - }; -diff -urNp linux-2.6.34.1/drivers/platform/x86/asus_acpi.c linux-2.6.34.1/drivers/platform/x86/asus_acpi.c ---- linux-2.6.34.1/drivers/platform/x86/asus_acpi.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/platform/x86/asus_acpi.c 2010-07-07 09:04:53.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/platform/x86/asus_acpi.c linux-2.6.35.4/drivers/platform/x86/asus_acpi.c +--- linux-2.6.35.4/drivers/platform/x86/asus_acpi.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/platform/x86/asus_acpi.c 2010-09-17 20:12:09.000000000 -0400 @@ -1464,7 +1464,7 @@ static int asus_hotk_remove(struct acpi_ return 0; } @@ -26277,9 +27181,29 @@ diff -urNp linux-2.6.34.1/drivers/platform/x86/asus_acpi.c linux-2.6.34.1/driver .get_brightness = read_brightness, .update_status = set_brightness_status, }; -diff -urNp linux-2.6.34.1/drivers/platform/x86/compal-laptop.c linux-2.6.34.1/drivers/platform/x86/compal-laptop.c ---- linux-2.6.34.1/drivers/platform/x86/compal-laptop.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/platform/x86/compal-laptop.c 2010-07-07 09:04:53.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/platform/x86/asus-laptop.c linux-2.6.35.4/drivers/platform/x86/asus-laptop.c +--- linux-2.6.35.4/drivers/platform/x86/asus-laptop.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/platform/x86/asus-laptop.c 2010-09-17 20:12:09.000000000 -0400 +@@ -224,7 +224,6 @@ struct asus_laptop { + struct asus_led gled; + struct asus_led kled; + struct workqueue_struct *led_workqueue; +- + int wireless_status; + bool have_rsts; + int lcd_state; +@@ -621,7 +620,7 @@ static int update_bl_status(struct backl + return asus_lcd_set(asus, value); + } + +-static struct backlight_ops asusbl_ops = { ++static const struct backlight_ops asusbl_ops = { + .get_brightness = asus_read_brightness, + .update_status = update_bl_status, + }; +diff -urNp linux-2.6.35.4/drivers/platform/x86/compal-laptop.c linux-2.6.35.4/drivers/platform/x86/compal-laptop.c +--- linux-2.6.35.4/drivers/platform/x86/compal-laptop.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/platform/x86/compal-laptop.c 2010-09-17 20:12:09.000000000 -0400 @@ -168,7 +168,7 @@ static int bl_update_status(struct backl return set_lcd_level(b->props.brightness); } @@ -26289,10 +27213,10 @@ diff -urNp linux-2.6.34.1/drivers/platform/x86/compal-laptop.c linux-2.6.34.1/dr .get_brightness = bl_get_brightness, .update_status = bl_update_status, }; -diff -urNp linux-2.6.34.1/drivers/platform/x86/dell-laptop.c linux-2.6.34.1/drivers/platform/x86/dell-laptop.c ---- linux-2.6.34.1/drivers/platform/x86/dell-laptop.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/platform/x86/dell-laptop.c 2010-07-07 09:04:53.000000000 -0400 -@@ -462,7 +462,7 @@ out: +diff -urNp linux-2.6.35.4/drivers/platform/x86/dell-laptop.c linux-2.6.35.4/drivers/platform/x86/dell-laptop.c +--- linux-2.6.35.4/drivers/platform/x86/dell-laptop.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/platform/x86/dell-laptop.c 2010-09-17 20:12:09.000000000 -0400 +@@ -469,7 +469,7 @@ out: return buffer->output[1]; } @@ -26301,9 +27225,9 @@ diff -urNp linux-2.6.34.1/drivers/platform/x86/dell-laptop.c linux-2.6.34.1/driv .get_brightness = dell_get_intensity, .update_status = dell_send_intensity, }; -diff -urNp linux-2.6.34.1/drivers/platform/x86/eeepc-laptop.c linux-2.6.34.1/drivers/platform/x86/eeepc-laptop.c ---- linux-2.6.34.1/drivers/platform/x86/eeepc-laptop.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/platform/x86/eeepc-laptop.c 2010-07-07 09:04:53.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/platform/x86/eeepc-laptop.c linux-2.6.35.4/drivers/platform/x86/eeepc-laptop.c +--- linux-2.6.35.4/drivers/platform/x86/eeepc-laptop.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/platform/x86/eeepc-laptop.c 2010-09-17 20:12:09.000000000 -0400 @@ -1114,7 +1114,7 @@ static int update_bl_status(struct backl return set_brightness(bd, bd->props.brightness); } @@ -26313,9 +27237,9 @@ diff -urNp linux-2.6.34.1/drivers/platform/x86/eeepc-laptop.c linux-2.6.34.1/dri .get_brightness = read_brightness, .update_status = update_bl_status, }; -diff -urNp linux-2.6.34.1/drivers/platform/x86/fujitsu-laptop.c linux-2.6.34.1/drivers/platform/x86/fujitsu-laptop.c ---- linux-2.6.34.1/drivers/platform/x86/fujitsu-laptop.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/platform/x86/fujitsu-laptop.c 2010-07-07 09:04:53.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/platform/x86/fujitsu-laptop.c linux-2.6.35.4/drivers/platform/x86/fujitsu-laptop.c +--- linux-2.6.35.4/drivers/platform/x86/fujitsu-laptop.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/platform/x86/fujitsu-laptop.c 2010-09-17 20:12:09.000000000 -0400 @@ -437,7 +437,7 @@ static int bl_update_status(struct backl return ret; } @@ -26325,21 +27249,9 @@ diff -urNp linux-2.6.34.1/drivers/platform/x86/fujitsu-laptop.c linux-2.6.34.1/d .get_brightness = bl_get_brightness, .update_status = bl_update_status, }; -diff -urNp linux-2.6.34.1/drivers/platform/x86/msi-laptop.c linux-2.6.34.1/drivers/platform/x86/msi-laptop.c ---- linux-2.6.34.1/drivers/platform/x86/msi-laptop.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/platform/x86/msi-laptop.c 2010-07-07 09:04:53.000000000 -0400 -@@ -254,7 +254,7 @@ static int bl_update_status(struct backl - return set_lcd_level(b->props.brightness); - } - --static struct backlight_ops msibl_ops = { -+static const struct backlight_ops msibl_ops = { - .get_brightness = bl_get_brightness, - .update_status = bl_update_status, - }; -diff -urNp linux-2.6.34.1/drivers/platform/x86/sony-laptop.c linux-2.6.34.1/drivers/platform/x86/sony-laptop.c ---- linux-2.6.34.1/drivers/platform/x86/sony-laptop.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/platform/x86/sony-laptop.c 2010-07-07 09:04:53.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/platform/x86/sony-laptop.c linux-2.6.35.4/drivers/platform/x86/sony-laptop.c +--- linux-2.6.35.4/drivers/platform/x86/sony-laptop.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/platform/x86/sony-laptop.c 2010-09-17 20:12:09.000000000 -0400 @@ -857,7 +857,7 @@ static int sony_backlight_get_brightness } @@ -26349,10 +27261,10 @@ diff -urNp linux-2.6.34.1/drivers/platform/x86/sony-laptop.c linux-2.6.34.1/driv .update_status = sony_backlight_update_status, .get_brightness = sony_backlight_get_brightness, }; -diff -urNp linux-2.6.34.1/drivers/platform/x86/thinkpad_acpi.c linux-2.6.34.1/drivers/platform/x86/thinkpad_acpi.c ---- linux-2.6.34.1/drivers/platform/x86/thinkpad_acpi.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/platform/x86/thinkpad_acpi.c 2010-07-07 09:04:53.000000000 -0400 -@@ -6132,7 +6132,7 @@ static void tpacpi_brightness_notify_cha +diff -urNp linux-2.6.35.4/drivers/platform/x86/thinkpad_acpi.c linux-2.6.35.4/drivers/platform/x86/thinkpad_acpi.c +--- linux-2.6.35.4/drivers/platform/x86/thinkpad_acpi.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/platform/x86/thinkpad_acpi.c 2010-09-17 20:12:09.000000000 -0400 +@@ -6142,7 +6142,7 @@ static void tpacpi_brightness_notify_cha BACKLIGHT_UPDATE_HOTKEY); } @@ -26361,9 +27273,9 @@ diff -urNp linux-2.6.34.1/drivers/platform/x86/thinkpad_acpi.c linux-2.6.34.1/dr .get_brightness = brightness_get, .update_status = brightness_update_status, }; -diff -urNp linux-2.6.34.1/drivers/platform/x86/toshiba_acpi.c linux-2.6.34.1/drivers/platform/x86/toshiba_acpi.c ---- linux-2.6.34.1/drivers/platform/x86/toshiba_acpi.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/platform/x86/toshiba_acpi.c 2010-07-07 09:04:53.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/platform/x86/toshiba_acpi.c linux-2.6.35.4/drivers/platform/x86/toshiba_acpi.c +--- linux-2.6.35.4/drivers/platform/x86/toshiba_acpi.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/platform/x86/toshiba_acpi.c 2010-09-17 20:12:09.000000000 -0400 @@ -741,7 +741,7 @@ static acpi_status remove_device(void) return AE_OK; } @@ -26373,9 +27285,9 @@ diff -urNp linux-2.6.34.1/drivers/platform/x86/toshiba_acpi.c linux-2.6.34.1/dri .get_brightness = get_lcd, .update_status = set_lcd_status, }; -diff -urNp linux-2.6.34.1/drivers/pnp/pnpbios/bioscalls.c linux-2.6.34.1/drivers/pnp/pnpbios/bioscalls.c ---- linux-2.6.34.1/drivers/pnp/pnpbios/bioscalls.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/pnp/pnpbios/bioscalls.c 2010-07-07 09:04:53.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/pnp/pnpbios/bioscalls.c linux-2.6.35.4/drivers/pnp/pnpbios/bioscalls.c +--- linux-2.6.35.4/drivers/pnp/pnpbios/bioscalls.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/pnp/pnpbios/bioscalls.c 2010-09-17 20:12:09.000000000 -0400 @@ -59,7 +59,7 @@ do { \ set_desc_limit(&gdt[(selname) >> 3], (size) - 1); \ } while(0) @@ -26432,9 +27344,9 @@ diff -urNp linux-2.6.34.1/drivers/pnp/pnpbios/bioscalls.c linux-2.6.34.1/drivers + + pax_close_kernel(); } -diff -urNp linux-2.6.34.1/drivers/pnp/quirks.c linux-2.6.34.1/drivers/pnp/quirks.c ---- linux-2.6.34.1/drivers/pnp/quirks.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/pnp/quirks.c 2010-07-07 09:04:53.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/pnp/quirks.c linux-2.6.35.4/drivers/pnp/quirks.c +--- linux-2.6.35.4/drivers/pnp/quirks.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/pnp/quirks.c 2010-09-17 20:12:09.000000000 -0400 @@ -322,7 +322,7 @@ static struct pnp_fixup pnp_fixups[] = { /* PnP resources that might overlap PCI BARs */ {"PNP0c01", quirk_system_pci_resources}, @@ -26444,9 +27356,9 @@ diff -urNp linux-2.6.34.1/drivers/pnp/quirks.c linux-2.6.34.1/drivers/pnp/quirks }; void pnp_fixup_device(struct pnp_dev *dev) -diff -urNp linux-2.6.34.1/drivers/pnp/resource.c linux-2.6.34.1/drivers/pnp/resource.c ---- linux-2.6.34.1/drivers/pnp/resource.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/pnp/resource.c 2010-07-07 09:04:53.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/pnp/resource.c linux-2.6.35.4/drivers/pnp/resource.c +--- linux-2.6.35.4/drivers/pnp/resource.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/pnp/resource.c 2010-09-17 20:12:09.000000000 -0400 @@ -360,7 +360,7 @@ int pnp_check_irq(struct pnp_dev *dev, s return 1; @@ -26465,9 +27377,9 @@ diff -urNp linux-2.6.34.1/drivers/pnp/resource.c linux-2.6.34.1/drivers/pnp/reso return 0; /* check if the resource is reserved */ -diff -urNp linux-2.6.34.1/drivers/s390/cio/qdio_debug.c linux-2.6.34.1/drivers/s390/cio/qdio_debug.c ---- linux-2.6.34.1/drivers/s390/cio/qdio_debug.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/s390/cio/qdio_debug.c 2010-07-07 09:04:53.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/s390/cio/qdio_debug.c linux-2.6.35.4/drivers/s390/cio/qdio_debug.c +--- linux-2.6.35.4/drivers/s390/cio/qdio_debug.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/s390/cio/qdio_debug.c 2010-09-17 20:12:09.000000000 -0400 @@ -233,7 +233,7 @@ static int qperf_seq_open(struct inode * filp->f_path.dentry->d_inode->i_private); } @@ -26477,10 +27389,10 @@ diff -urNp linux-2.6.34.1/drivers/s390/cio/qdio_debug.c linux-2.6.34.1/drivers/s .owner = THIS_MODULE, .open = qperf_seq_open, .read = seq_read, -diff -urNp linux-2.6.34.1/drivers/scsi/ipr.c linux-2.6.34.1/drivers/scsi/ipr.c ---- linux-2.6.34.1/drivers/scsi/ipr.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/scsi/ipr.c 2010-07-07 09:04:53.000000000 -0400 -@@ -6055,7 +6055,7 @@ static bool ipr_qc_fill_rtf(struct ata_q +diff -urNp linux-2.6.35.4/drivers/scsi/ipr.c linux-2.6.35.4/drivers/scsi/ipr.c +--- linux-2.6.35.4/drivers/scsi/ipr.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/scsi/ipr.c 2010-09-17 20:12:09.000000000 -0400 +@@ -6091,7 +6091,7 @@ static bool ipr_qc_fill_rtf(struct ata_q return true; } @@ -26489,9 +27401,9 @@ diff -urNp linux-2.6.34.1/drivers/scsi/ipr.c linux-2.6.34.1/drivers/scsi/ipr.c .phy_reset = ipr_ata_phy_reset, .hardreset = ipr_sata_reset, .post_internal_cmd = ipr_ata_post_internal, -diff -urNp linux-2.6.34.1/drivers/scsi/libfc/fc_exch.c linux-2.6.34.1/drivers/scsi/libfc/fc_exch.c ---- linux-2.6.34.1/drivers/scsi/libfc/fc_exch.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/scsi/libfc/fc_exch.c 2010-07-07 09:04:53.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/scsi/libfc/fc_exch.c linux-2.6.35.4/drivers/scsi/libfc/fc_exch.c +--- linux-2.6.35.4/drivers/scsi/libfc/fc_exch.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/scsi/libfc/fc_exch.c 2010-09-17 20:12:09.000000000 -0400 @@ -100,12 +100,12 @@ struct fc_exch_mgr { * all together if not used XXX */ @@ -26520,7 +27432,7 @@ diff -urNp linux-2.6.34.1/drivers/scsi/libfc/fc_exch.c linux-2.6.34.1/drivers/sc goto out; } memset(ep, 0, sizeof(*ep)); -@@ -718,7 +718,7 @@ out: +@@ -719,7 +719,7 @@ out: return ep; err: spin_unlock_bh(&pool->lock); @@ -26529,7 +27441,7 @@ diff -urNp linux-2.6.34.1/drivers/scsi/libfc/fc_exch.c linux-2.6.34.1/drivers/sc mempool_free(ep, mp->ep_pool); return NULL; } -@@ -868,7 +868,7 @@ static enum fc_pf_rjt_reason fc_seq_look +@@ -864,7 +864,7 @@ static enum fc_pf_rjt_reason fc_seq_look xid = ntohs(fh->fh_ox_id); /* we originated exch */ ep = fc_exch_find(mp, xid); if (!ep) { @@ -26538,7 +27450,7 @@ diff -urNp linux-2.6.34.1/drivers/scsi/libfc/fc_exch.c linux-2.6.34.1/drivers/sc reject = FC_RJT_OX_ID; goto out; } -@@ -898,7 +898,7 @@ static enum fc_pf_rjt_reason fc_seq_look +@@ -894,7 +894,7 @@ static enum fc_pf_rjt_reason fc_seq_look ep = fc_exch_find(mp, xid); if ((f_ctl & FC_FC_FIRST_SEQ) && fc_sof_is_init(fr_sof(fp))) { if (ep) { @@ -26547,7 +27459,7 @@ diff -urNp linux-2.6.34.1/drivers/scsi/libfc/fc_exch.c linux-2.6.34.1/drivers/sc reject = FC_RJT_RX_ID; goto rel; } -@@ -909,7 +909,7 @@ static enum fc_pf_rjt_reason fc_seq_look +@@ -905,7 +905,7 @@ static enum fc_pf_rjt_reason fc_seq_look } xid = ep->xid; /* get our XID */ } else if (!ep) { @@ -26556,7 +27468,7 @@ diff -urNp linux-2.6.34.1/drivers/scsi/libfc/fc_exch.c linux-2.6.34.1/drivers/sc reject = FC_RJT_RX_ID; /* XID not found */ goto out; } -@@ -930,7 +930,7 @@ static enum fc_pf_rjt_reason fc_seq_look +@@ -922,7 +922,7 @@ static enum fc_pf_rjt_reason fc_seq_look } else { sp = &ep->seq; if (sp->id != fh->fh_seq_id) { @@ -26565,7 +27477,7 @@ diff -urNp linux-2.6.34.1/drivers/scsi/libfc/fc_exch.c linux-2.6.34.1/drivers/sc reject = FC_RJT_SEQ_ID; /* sequence/exch should exist */ goto rel; } -@@ -1317,22 +1317,22 @@ static void fc_exch_recv_seq_resp(struct +@@ -1303,22 +1303,22 @@ static void fc_exch_recv_seq_resp(struct ep = fc_exch_find(mp, ntohs(fh->fh_ox_id)); if (!ep) { @@ -26592,16 +27504,16 @@ diff -urNp linux-2.6.34.1/drivers/scsi/libfc/fc_exch.c linux-2.6.34.1/drivers/sc goto rel; } sof = fr_sof(fp); -@@ -1343,7 +1343,7 @@ static void fc_exch_recv_seq_resp(struct - } else { - sp = &ep->seq; - if (sp->id != fh->fh_seq_id) { -- atomic_inc(&mp->stats.seq_not_found); -+ atomic_inc_unchecked(&mp->stats.seq_not_found); - goto rel; - } +@@ -1327,7 +1327,7 @@ static void fc_exch_recv_seq_resp(struct + sp->ssb_stat |= SSB_ST_RESP; + sp->id = fh->fh_seq_id; + } else if (sp->id != fh->fh_seq_id) { +- atomic_inc(&mp->stats.seq_not_found); ++ atomic_inc_unchecked(&mp->stats.seq_not_found); + goto rel; } -@@ -1406,9 +1406,9 @@ static void fc_exch_recv_resp(struct fc_ + +@@ -1390,9 +1390,9 @@ static void fc_exch_recv_resp(struct fc_ sp = fc_seq_lookup_orig(mp, fp); /* doesn't hold sequence */ if (!sp) @@ -26613,9 +27525,9 @@ diff -urNp linux-2.6.34.1/drivers/scsi/libfc/fc_exch.c linux-2.6.34.1/drivers/sc fc_frame_free(fp); } -diff -urNp linux-2.6.34.1/drivers/scsi/libsas/sas_ata.c linux-2.6.34.1/drivers/scsi/libsas/sas_ata.c ---- linux-2.6.34.1/drivers/scsi/libsas/sas_ata.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/scsi/libsas/sas_ata.c 2010-07-07 09:04:53.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/scsi/libsas/sas_ata.c linux-2.6.35.4/drivers/scsi/libsas/sas_ata.c +--- linux-2.6.35.4/drivers/scsi/libsas/sas_ata.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/scsi/libsas/sas_ata.c 2010-09-17 20:12:09.000000000 -0400 @@ -344,7 +344,7 @@ static int sas_ata_scr_read(struct ata_l } } @@ -26625,9 +27537,9 @@ diff -urNp linux-2.6.34.1/drivers/scsi/libsas/sas_ata.c linux-2.6.34.1/drivers/s .phy_reset = sas_ata_phy_reset, .post_internal_cmd = sas_ata_post_internal, .qc_prep = ata_noop_qc_prep, -diff -urNp linux-2.6.34.1/drivers/scsi/mpt2sas/mpt2sas_debug.h linux-2.6.34.1/drivers/scsi/mpt2sas/mpt2sas_debug.h ---- linux-2.6.34.1/drivers/scsi/mpt2sas/mpt2sas_debug.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/scsi/mpt2sas/mpt2sas_debug.h 2010-07-07 09:04:53.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/scsi/mpt2sas/mpt2sas_debug.h linux-2.6.35.4/drivers/scsi/mpt2sas/mpt2sas_debug.h +--- linux-2.6.35.4/drivers/scsi/mpt2sas/mpt2sas_debug.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/scsi/mpt2sas/mpt2sas_debug.h 2010-09-17 20:12:09.000000000 -0400 @@ -79,7 +79,7 @@ CMD; \ } @@ -26637,9 +27549,21 @@ diff -urNp linux-2.6.34.1/drivers/scsi/mpt2sas/mpt2sas_debug.h linux-2.6.34.1/dr #endif /* CONFIG_SCSI_MPT2SAS_LOGGING */ -diff -urNp linux-2.6.34.1/drivers/scsi/scsi_logging.h linux-2.6.34.1/drivers/scsi/scsi_logging.h ---- linux-2.6.34.1/drivers/scsi/scsi_logging.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/scsi/scsi_logging.h 2010-07-07 09:04:53.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/scsi/qla2xxx/qla_os.c linux-2.6.35.4/drivers/scsi/qla2xxx/qla_os.c +--- linux-2.6.35.4/drivers/scsi/qla2xxx/qla_os.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/scsi/qla2xxx/qla_os.c 2010-09-17 20:12:09.000000000 -0400 +@@ -3899,7 +3899,7 @@ static struct pci_driver qla2xxx_pci_dri + .err_handler = &qla2xxx_err_handler, + }; + +-static struct file_operations apidev_fops = { ++static const struct file_operations apidev_fops = { + .owner = THIS_MODULE, + }; + +diff -urNp linux-2.6.35.4/drivers/scsi/scsi_logging.h linux-2.6.35.4/drivers/scsi/scsi_logging.h +--- linux-2.6.35.4/drivers/scsi/scsi_logging.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/scsi/scsi_logging.h 2010-09-17 20:12:09.000000000 -0400 @@ -51,7 +51,7 @@ do { \ } while (0); \ } while (0) @@ -26649,10 +27573,10 @@ diff -urNp linux-2.6.34.1/drivers/scsi/scsi_logging.h linux-2.6.34.1/drivers/scs #endif /* CONFIG_SCSI_LOGGING */ /* -diff -urNp linux-2.6.34.1/drivers/scsi/sg.c linux-2.6.34.1/drivers/scsi/sg.c ---- linux-2.6.34.1/drivers/scsi/sg.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/scsi/sg.c 2010-07-07 09:04:53.000000000 -0400 -@@ -2291,7 +2291,7 @@ struct sg_proc_leaf { +diff -urNp linux-2.6.35.4/drivers/scsi/sg.c linux-2.6.35.4/drivers/scsi/sg.c +--- linux-2.6.35.4/drivers/scsi/sg.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/scsi/sg.c 2010-09-17 20:12:09.000000000 -0400 +@@ -2302,7 +2302,7 @@ struct sg_proc_leaf { const struct file_operations * fops; }; @@ -26661,7 +27585,7 @@ diff -urNp linux-2.6.34.1/drivers/scsi/sg.c linux-2.6.34.1/drivers/scsi/sg.c {"allow_dio", &adio_fops}, {"debug", &debug_fops}, {"def_reserved_size", &dressz_fops}, -@@ -2306,7 +2306,7 @@ sg_proc_init(void) +@@ -2317,7 +2317,7 @@ sg_proc_init(void) { int k, mask; int num_leaves = ARRAY_SIZE(sg_proc_leaf_arr); @@ -26670,10 +27594,10 @@ diff -urNp linux-2.6.34.1/drivers/scsi/sg.c linux-2.6.34.1/drivers/scsi/sg.c sg_proc_sgp = proc_mkdir(sg_proc_sg_dirname, NULL); if (!sg_proc_sgp) -diff -urNp linux-2.6.34.1/drivers/serial/8250_pci.c linux-2.6.34.1/drivers/serial/8250_pci.c ---- linux-2.6.34.1/drivers/serial/8250_pci.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/serial/8250_pci.c 2010-07-07 09:04:53.000000000 -0400 -@@ -3693,7 +3693,7 @@ static struct pci_device_id serial_pci_t +diff -urNp linux-2.6.35.4/drivers/serial/8250_pci.c linux-2.6.35.4/drivers/serial/8250_pci.c +--- linux-2.6.35.4/drivers/serial/8250_pci.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/serial/8250_pci.c 2010-09-17 20:12:09.000000000 -0400 +@@ -3777,7 +3777,7 @@ static struct pci_device_id serial_pci_t PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_COMMUNICATION_MULTISERIAL << 8, 0xffff00, pbn_default }, @@ -26682,31 +27606,22 @@ diff -urNp linux-2.6.34.1/drivers/serial/8250_pci.c linux-2.6.34.1/drivers/seria }; static struct pci_driver serial_pci_driver = { -diff -urNp linux-2.6.34.1/drivers/serial/kgdboc.c linux-2.6.34.1/drivers/serial/kgdboc.c ---- linux-2.6.34.1/drivers/serial/kgdboc.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/serial/kgdboc.c 2010-07-07 09:04:53.000000000 -0400 -@@ -18,7 +18,7 @@ +diff -urNp linux-2.6.35.4/drivers/serial/kgdboc.c linux-2.6.35.4/drivers/serial/kgdboc.c +--- linux-2.6.35.4/drivers/serial/kgdboc.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/serial/kgdboc.c 2010-09-17 20:12:09.000000000 -0400 +@@ -20,7 +20,7 @@ #define MAX_CONFIG_LEN 40 -static struct kgdb_io kgdboc_io_ops; -+static const struct kgdb_io kgdboc_io_ops; ++static struct kgdb_io kgdboc_io_ops; /* -1 = init not run yet, 0 = unconfigured, 1 = configured. */ static int configured = -1; -@@ -154,7 +154,7 @@ static void kgdboc_post_exp_handler(void - module_put(THIS_MODULE); - } - --static struct kgdb_io kgdboc_io_ops = { -+static const struct kgdb_io kgdboc_io_ops = { - .name = "kgdboc", - .read_char = kgdboc_get_char, - .write_char = kgdboc_put_char, -diff -urNp linux-2.6.34.1/drivers/staging/comedi/comedi_fops.c linux-2.6.34.1/drivers/staging/comedi/comedi_fops.c ---- linux-2.6.34.1/drivers/staging/comedi/comedi_fops.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/staging/comedi/comedi_fops.c 2010-07-07 09:04:53.000000000 -0400 -@@ -1384,7 +1384,7 @@ void comedi_unmap(struct vm_area_struct +diff -urNp linux-2.6.35.4/drivers/staging/comedi/comedi_fops.c linux-2.6.35.4/drivers/staging/comedi/comedi_fops.c +--- linux-2.6.35.4/drivers/staging/comedi/comedi_fops.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/staging/comedi/comedi_fops.c 2010-09-17 20:12:09.000000000 -0400 +@@ -1425,7 +1425,7 @@ static void comedi_unmap(struct vm_area_ mutex_unlock(&dev->mutex); } @@ -26715,9 +27630,9 @@ diff -urNp linux-2.6.34.1/drivers/staging/comedi/comedi_fops.c linux-2.6.34.1/dr .close = comedi_unmap, }; -diff -urNp linux-2.6.34.1/drivers/staging/dream/pmem.c linux-2.6.34.1/drivers/staging/dream/pmem.c ---- linux-2.6.34.1/drivers/staging/dream/pmem.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/staging/dream/pmem.c 2010-07-07 09:04:53.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/staging/dream/pmem.c linux-2.6.35.4/drivers/staging/dream/pmem.c +--- linux-2.6.35.4/drivers/staging/dream/pmem.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/staging/dream/pmem.c 2010-09-17 20:12:09.000000000 -0400 @@ -175,7 +175,7 @@ static int pmem_mmap(struct file *, stru static int pmem_open(struct inode *, struct file *); static long pmem_ioctl(struct file *, unsigned int, unsigned long); @@ -26736,9 +27651,9 @@ diff -urNp linux-2.6.34.1/drivers/staging/dream/pmem.c linux-2.6.34.1/drivers/st .read = debug_read, .open = debug_open, }; -diff -urNp linux-2.6.34.1/drivers/staging/dream/qdsp5/adsp_driver.c linux-2.6.34.1/drivers/staging/dream/qdsp5/adsp_driver.c ---- linux-2.6.34.1/drivers/staging/dream/qdsp5/adsp_driver.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/staging/dream/qdsp5/adsp_driver.c 2010-07-07 09:04:54.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/staging/dream/qdsp5/adsp_driver.c linux-2.6.35.4/drivers/staging/dream/qdsp5/adsp_driver.c +--- linux-2.6.35.4/drivers/staging/dream/qdsp5/adsp_driver.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/staging/dream/qdsp5/adsp_driver.c 2010-09-17 20:12:09.000000000 -0400 @@ -577,7 +577,7 @@ static struct adsp_device *inode_to_devi static dev_t adsp_devno; static struct class *adsp_class; @@ -26748,9 +27663,9 @@ diff -urNp linux-2.6.34.1/drivers/staging/dream/qdsp5/adsp_driver.c linux-2.6.34 .owner = THIS_MODULE, .open = adsp_open, .unlocked_ioctl = adsp_ioctl, -diff -urNp linux-2.6.34.1/drivers/staging/dream/qdsp5/audio_aac.c linux-2.6.34.1/drivers/staging/dream/qdsp5/audio_aac.c ---- linux-2.6.34.1/drivers/staging/dream/qdsp5/audio_aac.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/staging/dream/qdsp5/audio_aac.c 2010-07-07 09:04:54.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/staging/dream/qdsp5/audio_aac.c linux-2.6.35.4/drivers/staging/dream/qdsp5/audio_aac.c +--- linux-2.6.35.4/drivers/staging/dream/qdsp5/audio_aac.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/staging/dream/qdsp5/audio_aac.c 2010-09-17 20:12:09.000000000 -0400 @@ -1023,7 +1023,7 @@ done: return rc; } @@ -26760,9 +27675,9 @@ diff -urNp linux-2.6.34.1/drivers/staging/dream/qdsp5/audio_aac.c linux-2.6.34.1 .owner = THIS_MODULE, .open = audio_open, .release = audio_release, -diff -urNp linux-2.6.34.1/drivers/staging/dream/qdsp5/audio_amrnb.c linux-2.6.34.1/drivers/staging/dream/qdsp5/audio_amrnb.c ---- linux-2.6.34.1/drivers/staging/dream/qdsp5/audio_amrnb.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/staging/dream/qdsp5/audio_amrnb.c 2010-07-07 09:04:54.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/staging/dream/qdsp5/audio_amrnb.c linux-2.6.35.4/drivers/staging/dream/qdsp5/audio_amrnb.c +--- linux-2.6.35.4/drivers/staging/dream/qdsp5/audio_amrnb.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/staging/dream/qdsp5/audio_amrnb.c 2010-09-17 20:12:09.000000000 -0400 @@ -834,7 +834,7 @@ done: return rc; } @@ -26772,9 +27687,9 @@ diff -urNp linux-2.6.34.1/drivers/staging/dream/qdsp5/audio_amrnb.c linux-2.6.34 .owner = THIS_MODULE, .open = audamrnb_open, .release = audamrnb_release, -diff -urNp linux-2.6.34.1/drivers/staging/dream/qdsp5/audio_evrc.c linux-2.6.34.1/drivers/staging/dream/qdsp5/audio_evrc.c ---- linux-2.6.34.1/drivers/staging/dream/qdsp5/audio_evrc.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/staging/dream/qdsp5/audio_evrc.c 2010-07-07 09:04:54.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/staging/dream/qdsp5/audio_evrc.c linux-2.6.35.4/drivers/staging/dream/qdsp5/audio_evrc.c +--- linux-2.6.35.4/drivers/staging/dream/qdsp5/audio_evrc.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/staging/dream/qdsp5/audio_evrc.c 2010-09-17 20:12:09.000000000 -0400 @@ -806,7 +806,7 @@ dma_fail: return rc; } @@ -26784,9 +27699,9 @@ diff -urNp linux-2.6.34.1/drivers/staging/dream/qdsp5/audio_evrc.c linux-2.6.34. .owner = THIS_MODULE, .open = audevrc_open, .release = audevrc_release, -diff -urNp linux-2.6.34.1/drivers/staging/dream/qdsp5/audio_in.c linux-2.6.34.1/drivers/staging/dream/qdsp5/audio_in.c ---- linux-2.6.34.1/drivers/staging/dream/qdsp5/audio_in.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/staging/dream/qdsp5/audio_in.c 2010-07-07 09:04:54.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/staging/dream/qdsp5/audio_in.c linux-2.6.35.4/drivers/staging/dream/qdsp5/audio_in.c +--- linux-2.6.35.4/drivers/staging/dream/qdsp5/audio_in.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/staging/dream/qdsp5/audio_in.c 2010-09-17 20:12:09.000000000 -0400 @@ -914,7 +914,7 @@ static int audpre_open(struct inode *ino return 0; } @@ -26805,9 +27720,9 @@ diff -urNp linux-2.6.34.1/drivers/staging/dream/qdsp5/audio_in.c linux-2.6.34.1/ .owner = THIS_MODULE, .open = audpre_open, .unlocked_ioctl = audpre_ioctl, -diff -urNp linux-2.6.34.1/drivers/staging/dream/qdsp5/audio_mp3.c linux-2.6.34.1/drivers/staging/dream/qdsp5/audio_mp3.c ---- linux-2.6.34.1/drivers/staging/dream/qdsp5/audio_mp3.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/staging/dream/qdsp5/audio_mp3.c 2010-07-07 09:04:54.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/staging/dream/qdsp5/audio_mp3.c linux-2.6.35.4/drivers/staging/dream/qdsp5/audio_mp3.c +--- linux-2.6.35.4/drivers/staging/dream/qdsp5/audio_mp3.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/staging/dream/qdsp5/audio_mp3.c 2010-09-17 20:12:09.000000000 -0400 @@ -941,7 +941,7 @@ done: return rc; } @@ -26817,10 +27732,10 @@ diff -urNp linux-2.6.34.1/drivers/staging/dream/qdsp5/audio_mp3.c linux-2.6.34.1 .owner = THIS_MODULE, .open = audio_open, .release = audio_release, -diff -urNp linux-2.6.34.1/drivers/staging/dream/qdsp5/audio_out.c linux-2.6.34.1/drivers/staging/dream/qdsp5/audio_out.c ---- linux-2.6.34.1/drivers/staging/dream/qdsp5/audio_out.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/staging/dream/qdsp5/audio_out.c 2010-07-07 09:04:54.000000000 -0400 -@@ -807,7 +807,7 @@ static int audpp_open(struct inode *inod +diff -urNp linux-2.6.35.4/drivers/staging/dream/qdsp5/audio_out.c linux-2.6.35.4/drivers/staging/dream/qdsp5/audio_out.c +--- linux-2.6.35.4/drivers/staging/dream/qdsp5/audio_out.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/staging/dream/qdsp5/audio_out.c 2010-09-17 20:12:09.000000000 -0400 +@@ -800,7 +800,7 @@ static int audpp_open(struct inode *inod return 0; } @@ -26829,7 +27744,7 @@ diff -urNp linux-2.6.34.1/drivers/staging/dream/qdsp5/audio_out.c linux-2.6.34.1 .owner = THIS_MODULE, .open = audio_open, .release = audio_release, -@@ -816,7 +816,7 @@ static struct file_operations audio_fops +@@ -809,7 +809,7 @@ static struct file_operations audio_fops .unlocked_ioctl = audio_ioctl, }; @@ -26838,9 +27753,9 @@ diff -urNp linux-2.6.34.1/drivers/staging/dream/qdsp5/audio_out.c linux-2.6.34.1 .owner = THIS_MODULE, .open = audpp_open, .unlocked_ioctl = audpp_ioctl, -diff -urNp linux-2.6.34.1/drivers/staging/dream/qdsp5/audio_qcelp.c linux-2.6.34.1/drivers/staging/dream/qdsp5/audio_qcelp.c ---- linux-2.6.34.1/drivers/staging/dream/qdsp5/audio_qcelp.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/staging/dream/qdsp5/audio_qcelp.c 2010-07-07 09:04:54.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/staging/dream/qdsp5/audio_qcelp.c linux-2.6.35.4/drivers/staging/dream/qdsp5/audio_qcelp.c +--- linux-2.6.35.4/drivers/staging/dream/qdsp5/audio_qcelp.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/staging/dream/qdsp5/audio_qcelp.c 2010-09-17 20:12:09.000000000 -0400 @@ -817,7 +817,7 @@ err: return rc; } @@ -26850,9 +27765,9 @@ diff -urNp linux-2.6.34.1/drivers/staging/dream/qdsp5/audio_qcelp.c linux-2.6.34 .owner = THIS_MODULE, .open = audqcelp_open, .release = audqcelp_release, -diff -urNp linux-2.6.34.1/drivers/staging/dream/qdsp5/snd.c linux-2.6.34.1/drivers/staging/dream/qdsp5/snd.c ---- linux-2.6.34.1/drivers/staging/dream/qdsp5/snd.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/staging/dream/qdsp5/snd.c 2010-07-07 09:04:54.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/staging/dream/qdsp5/snd.c linux-2.6.35.4/drivers/staging/dream/qdsp5/snd.c +--- linux-2.6.35.4/drivers/staging/dream/qdsp5/snd.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/staging/dream/qdsp5/snd.c 2010-09-17 20:12:09.000000000 -0400 @@ -242,7 +242,7 @@ err: return rc; } @@ -26862,55 +27777,22 @@ diff -urNp linux-2.6.34.1/drivers/staging/dream/qdsp5/snd.c linux-2.6.34.1/drive .owner = THIS_MODULE, .open = snd_open, .release = snd_release, -diff -urNp linux-2.6.34.1/drivers/staging/dream/smd/smd_qmi.c linux-2.6.34.1/drivers/staging/dream/smd/smd_qmi.c ---- linux-2.6.34.1/drivers/staging/dream/smd/smd_qmi.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/staging/dream/smd/smd_qmi.c 2010-07-07 09:04:54.000000000 -0400 -@@ -788,7 +788,7 @@ static int qmi_release(struct inode *ip, - return 0; - } - --static struct file_operations qmi_fops = { -+static const struct file_operations qmi_fops = { - .owner = THIS_MODULE, - .read = qmi_read, - .write = qmi_write, -diff -urNp linux-2.6.34.1/drivers/staging/dream/smd/smd_rpcrouter_device.c linux-2.6.34.1/drivers/staging/dream/smd/smd_rpcrouter_device.c ---- linux-2.6.34.1/drivers/staging/dream/smd/smd_rpcrouter_device.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/staging/dream/smd/smd_rpcrouter_device.c 2010-07-07 09:04:54.000000000 -0400 -@@ -215,7 +215,7 @@ static long rpcrouter_ioctl(struct file - return rc; - } - --static struct file_operations rpcrouter_server_fops = { -+static const struct file_operations rpcrouter_server_fops = { - .owner = THIS_MODULE, - .open = rpcrouter_open, - .release = rpcrouter_release, -@@ -225,7 +225,7 @@ static struct file_operations rpcrouter_ - .unlocked_ioctl = rpcrouter_ioctl, - }; - --static struct file_operations rpcrouter_router_fops = { -+static const struct file_operations rpcrouter_router_fops = { - .owner = THIS_MODULE, - .open = rpcrouter_open, - .release = rpcrouter_release, -diff -urNp linux-2.6.34.1/drivers/staging/dt3155/dt3155_drv.c linux-2.6.34.1/drivers/staging/dt3155/dt3155_drv.c ---- linux-2.6.34.1/drivers/staging/dt3155/dt3155_drv.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/staging/dt3155/dt3155_drv.c 2010-07-07 09:04:54.000000000 -0400 -@@ -841,7 +841,7 @@ static unsigned int dt3155_poll (struct +diff -urNp linux-2.6.35.4/drivers/staging/dt3155/dt3155_drv.c linux-2.6.35.4/drivers/staging/dt3155/dt3155_drv.c +--- linux-2.6.35.4/drivers/staging/dt3155/dt3155_drv.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/staging/dt3155/dt3155_drv.c 2010-09-17 20:12:09.000000000 -0400 +@@ -853,7 +853,7 @@ dt3155_unlocked_ioctl(struct file *file, * needed by init_module * register_chrdev *****************************************************/ -static struct file_operations dt3155_fops = { +static const struct file_operations dt3155_fops = { - read: dt3155_read, - ioctl: dt3155_ioctl, - mmap: dt3155_mmap, -diff -urNp linux-2.6.34.1/drivers/staging/go7007/go7007-v4l2.c linux-2.6.34.1/drivers/staging/go7007/go7007-v4l2.c ---- linux-2.6.34.1/drivers/staging/go7007/go7007-v4l2.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/staging/go7007/go7007-v4l2.c 2010-07-07 09:04:54.000000000 -0400 -@@ -1675,7 +1675,7 @@ static int go7007_vm_fault(struct vm_are + .read = dt3155_read, + .unlocked_ioctl = dt3155_unlocked_ioctl, + .mmap = dt3155_mmap, +diff -urNp linux-2.6.35.4/drivers/staging/go7007/go7007-v4l2.c linux-2.6.35.4/drivers/staging/go7007/go7007-v4l2.c +--- linux-2.6.35.4/drivers/staging/go7007/go7007-v4l2.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/staging/go7007/go7007-v4l2.c 2010-09-17 20:12:09.000000000 -0400 +@@ -1673,7 +1673,7 @@ static int go7007_vm_fault(struct vm_are return 0; } @@ -26919,9 +27801,9 @@ diff -urNp linux-2.6.34.1/drivers/staging/go7007/go7007-v4l2.c linux-2.6.34.1/dr .open = go7007_vm_open, .close = go7007_vm_close, .fault = go7007_vm_fault, -diff -urNp linux-2.6.34.1/drivers/staging/hv/Hv.c linux-2.6.34.1/drivers/staging/hv/Hv.c ---- linux-2.6.34.1/drivers/staging/hv/Hv.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/staging/hv/Hv.c 2010-07-07 09:04:54.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/staging/hv/hv.c linux-2.6.35.4/drivers/staging/hv/hv.c +--- linux-2.6.35.4/drivers/staging/hv/hv.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/staging/hv/hv.c 2010-09-17 20:12:09.000000000 -0400 @@ -162,7 +162,7 @@ static u64 HvDoHypercall(u64 Control, vo u64 outputAddress = (Output) ? virt_to_phys(Output) : 0; u32 outputAddressHi = outputAddress >> 32; @@ -26931,21 +27813,21 @@ diff -urNp linux-2.6.34.1/drivers/staging/hv/Hv.c linux-2.6.34.1/drivers/staging DPRINT_DBG(VMBUS, "Hypercall ", Control, Input, Output); -diff -urNp linux-2.6.34.1/drivers/staging/hv/blkvsc_drv.c linux-2.6.34.1/drivers/staging/hv/blkvsc_drv.c ---- linux-2.6.34.1/drivers/staging/hv/blkvsc_drv.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/staging/hv/blkvsc_drv.c 2010-07-07 09:04:54.000000000 -0400 -@@ -155,7 +155,7 @@ static int blkvsc_ringbuffer_size = BLKV - /* The one and only one */ - static struct blkvsc_driver_context g_blkvsc_drv; - --static struct block_device_operations block_ops = { -+static const struct block_device_operations block_ops = { - .owner = THIS_MODULE, - .open = blkvsc_open, - .release = blkvsc_release, -diff -urNp linux-2.6.34.1/drivers/staging/panel/panel.c linux-2.6.34.1/drivers/staging/panel/panel.c ---- linux-2.6.34.1/drivers/staging/panel/panel.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/staging/panel/panel.c 2010-07-07 09:04:54.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/staging/msm/msm_fb_bl.c linux-2.6.35.4/drivers/staging/msm/msm_fb_bl.c +--- linux-2.6.35.4/drivers/staging/msm/msm_fb_bl.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/staging/msm/msm_fb_bl.c 2010-09-17 20:12:09.000000000 -0400 +@@ -42,7 +42,7 @@ static int msm_fb_bl_update_status(struc + return 0; + } + +-static struct backlight_ops msm_fb_bl_ops = { ++static const struct backlight_ops msm_fb_bl_ops = { + .get_brightness = msm_fb_bl_get_brightness, + .update_status = msm_fb_bl_update_status, + }; +diff -urNp linux-2.6.35.4/drivers/staging/panel/panel.c linux-2.6.35.4/drivers/staging/panel/panel.c +--- linux-2.6.35.4/drivers/staging/panel/panel.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/staging/panel/panel.c 2010-09-17 20:12:09.000000000 -0400 @@ -1304,7 +1304,7 @@ static int lcd_release(struct inode *ino return 0; } @@ -26964,9 +27846,9 @@ diff -urNp linux-2.6.34.1/drivers/staging/panel/panel.c linux-2.6.34.1/drivers/s .read = keypad_read, /* read */ .open = keypad_open, /* open */ .release = keypad_release, /* close */ -diff -urNp linux-2.6.34.1/drivers/staging/phison/phison.c linux-2.6.34.1/drivers/staging/phison/phison.c ---- linux-2.6.34.1/drivers/staging/phison/phison.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/staging/phison/phison.c 2010-07-07 09:04:54.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/staging/phison/phison.c linux-2.6.35.4/drivers/staging/phison/phison.c +--- linux-2.6.35.4/drivers/staging/phison/phison.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/staging/phison/phison.c 2010-09-17 20:12:09.000000000 -0400 @@ -43,7 +43,7 @@ static struct scsi_host_template phison_ ATA_BMDMA_SHT(DRV_NAME), }; @@ -26976,22 +27858,10 @@ diff -urNp linux-2.6.34.1/drivers/staging/phison/phison.c linux-2.6.34.1/drivers .inherits = &ata_bmdma_port_ops, .prereset = phison_pre_reset, }; -diff -urNp linux-2.6.34.1/drivers/staging/poch/poch.c linux-2.6.34.1/drivers/staging/poch/poch.c ---- linux-2.6.34.1/drivers/staging/poch/poch.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/staging/poch/poch.c 2010-07-07 09:04:54.000000000 -0400 -@@ -1033,7 +1033,7 @@ static int poch_ioctl(struct inode *inod - return 0; - } - --static struct file_operations poch_fops = { -+static const struct file_operations poch_fops = { - .owner = THIS_MODULE, - .open = poch_open, - .release = poch_release, -diff -urNp linux-2.6.34.1/drivers/staging/pohmelfs/inode.c linux-2.6.34.1/drivers/staging/pohmelfs/inode.c ---- linux-2.6.34.1/drivers/staging/pohmelfs/inode.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/staging/pohmelfs/inode.c 2010-07-07 09:04:54.000000000 -0400 -@@ -1854,7 +1854,7 @@ static int pohmelfs_fill_super(struct su +diff -urNp linux-2.6.35.4/drivers/staging/pohmelfs/inode.c linux-2.6.35.4/drivers/staging/pohmelfs/inode.c +--- linux-2.6.35.4/drivers/staging/pohmelfs/inode.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/staging/pohmelfs/inode.c 2010-09-17 20:12:09.000000000 -0400 +@@ -1846,7 +1846,7 @@ static int pohmelfs_fill_super(struct su mutex_init(&psb->mcache_lock); psb->mcache_root = RB_ROOT; psb->mcache_timeout = msecs_to_jiffies(5000); @@ -27000,9 +27870,9 @@ diff -urNp linux-2.6.34.1/drivers/staging/pohmelfs/inode.c linux-2.6.34.1/driver psb->trans_max_pages = 100; -diff -urNp linux-2.6.34.1/drivers/staging/pohmelfs/mcache.c linux-2.6.34.1/drivers/staging/pohmelfs/mcache.c ---- linux-2.6.34.1/drivers/staging/pohmelfs/mcache.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/staging/pohmelfs/mcache.c 2010-07-07 09:04:54.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/staging/pohmelfs/mcache.c linux-2.6.35.4/drivers/staging/pohmelfs/mcache.c +--- linux-2.6.35.4/drivers/staging/pohmelfs/mcache.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/staging/pohmelfs/mcache.c 2010-09-17 20:12:09.000000000 -0400 @@ -121,7 +121,7 @@ struct pohmelfs_mcache *pohmelfs_mcache_ m->data = data; m->start = start; @@ -27012,9 +27882,9 @@ diff -urNp linux-2.6.34.1/drivers/staging/pohmelfs/mcache.c linux-2.6.34.1/drive mutex_lock(&psb->mcache_lock); err = pohmelfs_mcache_insert(psb, m); -diff -urNp linux-2.6.34.1/drivers/staging/pohmelfs/netfs.h linux-2.6.34.1/drivers/staging/pohmelfs/netfs.h ---- linux-2.6.34.1/drivers/staging/pohmelfs/netfs.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/staging/pohmelfs/netfs.h 2010-07-07 09:04:54.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/staging/pohmelfs/netfs.h linux-2.6.35.4/drivers/staging/pohmelfs/netfs.h +--- linux-2.6.35.4/drivers/staging/pohmelfs/netfs.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/staging/pohmelfs/netfs.h 2010-09-17 20:12:09.000000000 -0400 @@ -571,7 +571,7 @@ struct pohmelfs_config; struct pohmelfs_sb { struct rb_root mcache_root; @@ -27024,21 +27894,21 @@ diff -urNp linux-2.6.34.1/drivers/staging/pohmelfs/netfs.h linux-2.6.34.1/driver unsigned long mcache_timeout; unsigned int idx; -diff -urNp linux-2.6.34.1/drivers/staging/ramzswap/ramzswap_drv.c linux-2.6.34.1/drivers/staging/ramzswap/ramzswap_drv.c ---- linux-2.6.34.1/drivers/staging/ramzswap/ramzswap_drv.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/staging/ramzswap/ramzswap_drv.c 2010-07-07 09:04:54.000000000 -0400 -@@ -1295,7 +1295,7 @@ out: - return ret; +diff -urNp linux-2.6.35.4/drivers/staging/ramzswap/ramzswap_drv.c linux-2.6.35.4/drivers/staging/ramzswap/ramzswap_drv.c +--- linux-2.6.35.4/drivers/staging/ramzswap/ramzswap_drv.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/staging/ramzswap/ramzswap_drv.c 2010-09-17 20:12:09.000000000 -0400 +@@ -693,7 +693,7 @@ void ramzswap_slot_free_notify(struct bl + return; } -static struct block_device_operations ramzswap_devops = { +static const struct block_device_operations ramzswap_devops = { .ioctl = ramzswap_ioctl, - .owner = THIS_MODULE, - }; -diff -urNp linux-2.6.34.1/drivers/staging/rtl8192u/ieee80211/proc.c linux-2.6.34.1/drivers/staging/rtl8192u/ieee80211/proc.c ---- linux-2.6.34.1/drivers/staging/rtl8192u/ieee80211/proc.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/staging/rtl8192u/ieee80211/proc.c 2010-07-07 09:04:54.000000000 -0400 + .swap_slot_free_notify = ramzswap_slot_free_notify, + .owner = THIS_MODULE +diff -urNp linux-2.6.35.4/drivers/staging/rtl8192u/ieee80211/proc.c linux-2.6.35.4/drivers/staging/rtl8192u/ieee80211/proc.c +--- linux-2.6.35.4/drivers/staging/rtl8192u/ieee80211/proc.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/staging/rtl8192u/ieee80211/proc.c 2010-09-17 20:12:09.000000000 -0400 @@ -99,7 +99,7 @@ static int crypto_info_open(struct inode return seq_open(file, &crypto_seq_ops); } @@ -27048,9 +27918,9 @@ diff -urNp linux-2.6.34.1/drivers/staging/rtl8192u/ieee80211/proc.c linux-2.6.34 .open = crypto_info_open, .read = seq_read, .llseek = seq_lseek, -diff -urNp linux-2.6.34.1/drivers/staging/samsung-laptop/samsung-laptop.c linux-2.6.34.1/drivers/staging/samsung-laptop/samsung-laptop.c ---- linux-2.6.34.1/drivers/staging/samsung-laptop/samsung-laptop.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/staging/samsung-laptop/samsung-laptop.c 2010-07-07 09:04:54.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/staging/samsung-laptop/samsung-laptop.c linux-2.6.35.4/drivers/staging/samsung-laptop/samsung-laptop.c +--- linux-2.6.35.4/drivers/staging/samsung-laptop/samsung-laptop.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/staging/samsung-laptop/samsung-laptop.c 2010-09-17 20:12:09.000000000 -0400 @@ -269,7 +269,7 @@ static int update_status(struct backligh return 0; } @@ -27060,10 +27930,10 @@ diff -urNp linux-2.6.34.1/drivers/staging/samsung-laptop/samsung-laptop.c linux- .get_brightness = get_brightness, .update_status = update_status, }; -diff -urNp linux-2.6.34.1/drivers/staging/sep/sep_driver.c linux-2.6.34.1/drivers/staging/sep/sep_driver.c ---- linux-2.6.34.1/drivers/staging/sep/sep_driver.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/staging/sep/sep_driver.c 2010-07-07 09:04:54.000000000 -0400 -@@ -2610,7 +2610,7 @@ static struct pci_driver sep_pci_driver +diff -urNp linux-2.6.35.4/drivers/staging/sep/sep_driver.c linux-2.6.35.4/drivers/staging/sep/sep_driver.c +--- linux-2.6.35.4/drivers/staging/sep/sep_driver.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/staging/sep/sep_driver.c 2010-09-17 20:12:09.000000000 -0400 +@@ -2637,7 +2637,7 @@ static struct pci_driver sep_pci_driver static dev_t sep_devno; /* the files operations structure of the driver */ @@ -27072,10 +27942,10 @@ diff -urNp linux-2.6.34.1/drivers/staging/sep/sep_driver.c linux-2.6.34.1/driver .owner = THIS_MODULE, .unlocked_ioctl = sep_ioctl, .poll = sep_poll, -diff -urNp linux-2.6.34.1/drivers/staging/vme/devices/vme_user.c linux-2.6.34.1/drivers/staging/vme/devices/vme_user.c ---- linux-2.6.34.1/drivers/staging/vme/devices/vme_user.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/staging/vme/devices/vme_user.c 2010-07-07 09:04:54.000000000 -0400 -@@ -136,7 +136,7 @@ static int vme_user_ioctl(struct inode * +diff -urNp linux-2.6.35.4/drivers/staging/vme/devices/vme_user.c linux-2.6.35.4/drivers/staging/vme/devices/vme_user.c +--- linux-2.6.35.4/drivers/staging/vme/devices/vme_user.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/staging/vme/devices/vme_user.c 2010-09-17 20:12:09.000000000 -0400 +@@ -136,7 +136,7 @@ static long vme_user_unlocked_ioctl(stru static int __init vme_user_probe(struct device *, int, int); static int __exit vme_user_remove(struct device *, int, int); @@ -27084,9 +27954,9 @@ diff -urNp linux-2.6.34.1/drivers/staging/vme/devices/vme_user.c linux-2.6.34.1/ .open = vme_user_open, .release = vme_user_release, .read = vme_user_read, -diff -urNp linux-2.6.34.1/drivers/usb/atm/usbatm.c linux-2.6.34.1/drivers/usb/atm/usbatm.c ---- linux-2.6.34.1/drivers/usb/atm/usbatm.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/usb/atm/usbatm.c 2010-07-07 09:04:54.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/usb/atm/usbatm.c linux-2.6.35.4/drivers/usb/atm/usbatm.c +--- linux-2.6.35.4/drivers/usb/atm/usbatm.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/usb/atm/usbatm.c 2010-09-17 20:12:09.000000000 -0400 @@ -333,7 +333,7 @@ static void usbatm_extract_one_cell(stru if (printk_ratelimit()) atm_warn(instance, "%s: OAM not supported (vpi %d, vci %d)!\n", @@ -27166,10 +28036,10 @@ diff -urNp linux-2.6.34.1/drivers/usb/atm/usbatm.c linux-2.6.34.1/drivers/usb/at if (!left--) { if (instance->disconnected) -diff -urNp linux-2.6.34.1/drivers/usb/class/cdc-acm.c linux-2.6.34.1/drivers/usb/class/cdc-acm.c ---- linux-2.6.34.1/drivers/usb/class/cdc-acm.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/usb/class/cdc-acm.c 2010-07-07 09:04:54.000000000 -0400 -@@ -1618,7 +1618,7 @@ static const struct usb_device_id acm_id +diff -urNp linux-2.6.35.4/drivers/usb/class/cdc-acm.c linux-2.6.35.4/drivers/usb/class/cdc-acm.c +--- linux-2.6.35.4/drivers/usb/class/cdc-acm.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/usb/class/cdc-acm.c 2010-09-17 20:12:09.000000000 -0400 +@@ -1619,7 +1619,7 @@ static const struct usb_device_id acm_id { USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ACM, USB_CDC_ACM_PROTO_AT_CDMA) }, @@ -27178,9 +28048,21 @@ diff -urNp linux-2.6.34.1/drivers/usb/class/cdc-acm.c linux-2.6.34.1/drivers/usb }; MODULE_DEVICE_TABLE(usb, acm_ids); -diff -urNp linux-2.6.34.1/drivers/usb/class/usblp.c linux-2.6.34.1/drivers/usb/class/usblp.c ---- linux-2.6.34.1/drivers/usb/class/usblp.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/usb/class/usblp.c 2010-07-07 09:04:54.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/usb/class/cdc-wdm.c linux-2.6.35.4/drivers/usb/class/cdc-wdm.c +--- linux-2.6.35.4/drivers/usb/class/cdc-wdm.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/usb/class/cdc-wdm.c 2010-09-17 20:12:09.000000000 -0400 +@@ -342,7 +342,7 @@ static ssize_t wdm_write + goto outnp; + } + +- if (!file->f_flags && O_NONBLOCK) ++ if (!(file->f_flags & O_NONBLOCK)) + r = wait_event_interruptible(desc->wait, !test_bit(WDM_IN_USE, + &desc->flags)); + else +diff -urNp linux-2.6.35.4/drivers/usb/class/usblp.c linux-2.6.35.4/drivers/usb/class/usblp.c +--- linux-2.6.35.4/drivers/usb/class/usblp.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/usb/class/usblp.c 2010-09-17 20:12:09.000000000 -0400 @@ -226,7 +226,7 @@ static const struct quirk_printer_struct { 0x0482, 0x0010, USBLP_QUIRK_BIDIR }, /* Kyocera Mita FS 820, by zut */ { 0x04f9, 0x000d, USBLP_QUIRK_BIDIR }, /* Brother Industries, Ltd HL-1440 Laser Printer */ @@ -27199,10 +28081,10 @@ diff -urNp linux-2.6.34.1/drivers/usb/class/usblp.c linux-2.6.34.1/drivers/usb/c }; MODULE_DEVICE_TABLE (usb, usblp_ids); -diff -urNp linux-2.6.34.1/drivers/usb/core/hcd.c linux-2.6.34.1/drivers/usb/core/hcd.c ---- linux-2.6.34.1/drivers/usb/core/hcd.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/usb/core/hcd.c 2010-07-07 09:04:54.000000000 -0400 -@@ -2316,7 +2316,7 @@ EXPORT_SYMBOL_GPL(usb_hcd_platform_shutd +diff -urNp linux-2.6.35.4/drivers/usb/core/hcd.c linux-2.6.35.4/drivers/usb/core/hcd.c +--- linux-2.6.35.4/drivers/usb/core/hcd.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/usb/core/hcd.c 2010-09-17 20:12:09.000000000 -0400 +@@ -2381,7 +2381,7 @@ EXPORT_SYMBOL_GPL(usb_hcd_platform_shutd #if defined(CONFIG_USB_MON) || defined(CONFIG_USB_MON_MODULE) @@ -27211,7 +28093,7 @@ diff -urNp linux-2.6.34.1/drivers/usb/core/hcd.c linux-2.6.34.1/drivers/usb/core /* * The registration is unlocked. -@@ -2326,7 +2326,7 @@ struct usb_mon_operations *mon_ops; +@@ -2391,7 +2391,7 @@ struct usb_mon_operations *mon_ops; * symbols from usbcore, usbcore gets referenced and cannot be unloaded first. */ @@ -27220,40 +28102,10 @@ diff -urNp linux-2.6.34.1/drivers/usb/core/hcd.c linux-2.6.34.1/drivers/usb/core { if (mon_ops) -diff -urNp linux-2.6.34.1/drivers/usb/core/hcd.h linux-2.6.34.1/drivers/usb/core/hcd.h ---- linux-2.6.34.1/drivers/usb/core/hcd.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/usb/core/hcd.h 2010-07-07 09:04:54.000000000 -0400 -@@ -506,13 +506,13 @@ static inline void usbfs_cleanup(void) { - #if defined(CONFIG_USB_MON) || defined(CONFIG_USB_MON_MODULE) - - struct usb_mon_operations { -- void (*urb_submit)(struct usb_bus *bus, struct urb *urb); -- void (*urb_submit_error)(struct usb_bus *bus, struct urb *urb, int err); -- void (*urb_complete)(struct usb_bus *bus, struct urb *urb, int status); -+ void (* const urb_submit)(struct usb_bus *bus, struct urb *urb); -+ void (* const urb_submit_error)(struct usb_bus *bus, struct urb *urb, int err); -+ void (* const urb_complete)(struct usb_bus *bus, struct urb *urb, int status); - /* void (*urb_unlink)(struct usb_bus *bus, struct urb *urb); */ - }; - --extern struct usb_mon_operations *mon_ops; -+extern const struct usb_mon_operations *mon_ops; - - static inline void usbmon_urb_submit(struct usb_bus *bus, struct urb *urb) - { -@@ -534,7 +534,7 @@ static inline void usbmon_urb_complete(s - (*mon_ops->urb_complete)(bus, urb, status); - } - --int usb_mon_register(struct usb_mon_operations *ops); -+int usb_mon_register(const struct usb_mon_operations *ops); - void usb_mon_deregister(void); - - #else -diff -urNp linux-2.6.34.1/drivers/usb/core/hub.c linux-2.6.34.1/drivers/usb/core/hub.c ---- linux-2.6.34.1/drivers/usb/core/hub.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/usb/core/hub.c 2010-07-07 09:04:54.000000000 -0400 -@@ -3437,7 +3437,7 @@ static const struct usb_device_id hub_id +diff -urNp linux-2.6.35.4/drivers/usb/core/hub.c linux-2.6.35.4/drivers/usb/core/hub.c +--- linux-2.6.35.4/drivers/usb/core/hub.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/usb/core/hub.c 2010-09-17 20:12:09.000000000 -0400 +@@ -3453,7 +3453,7 @@ static const struct usb_device_id hub_id .bDeviceClass = USB_CLASS_HUB}, { .match_flags = USB_DEVICE_ID_MATCH_INT_CLASS, .bInterfaceClass = USB_CLASS_HUB}, @@ -27262,10 +28114,10 @@ diff -urNp linux-2.6.34.1/drivers/usb/core/hub.c linux-2.6.34.1/drivers/usb/core }; MODULE_DEVICE_TABLE (usb, hub_id_table); -diff -urNp linux-2.6.34.1/drivers/usb/core/message.c linux-2.6.34.1/drivers/usb/core/message.c ---- linux-2.6.34.1/drivers/usb/core/message.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/usb/core/message.c 2010-07-07 09:04:54.000000000 -0400 -@@ -884,8 +884,8 @@ char *usb_cache_string(struct usb_device +diff -urNp linux-2.6.35.4/drivers/usb/core/message.c linux-2.6.35.4/drivers/usb/core/message.c +--- linux-2.6.35.4/drivers/usb/core/message.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/usb/core/message.c 2010-09-17 20:12:09.000000000 -0400 +@@ -869,8 +869,8 @@ char *usb_cache_string(struct usb_device buf = kmalloc(MAX_USB_STRING_SIZE, GFP_NOIO); if (buf) { len = usb_string(udev, index, buf, MAX_USB_STRING_SIZE); @@ -27276,10 +28128,21 @@ diff -urNp linux-2.6.34.1/drivers/usb/core/message.c linux-2.6.34.1/drivers/usb/ if (!smallbuf) return buf; memcpy(smallbuf, buf, len); -diff -urNp linux-2.6.34.1/drivers/usb/host/ehci-pci.c linux-2.6.34.1/drivers/usb/host/ehci-pci.c ---- linux-2.6.34.1/drivers/usb/host/ehci-pci.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/usb/host/ehci-pci.c 2010-07-07 09:04:54.000000000 -0400 -@@ -415,7 +415,7 @@ static const struct pci_device_id pci_id +diff -urNp linux-2.6.35.4/drivers/usb/early/ehci-dbgp.c linux-2.6.35.4/drivers/usb/early/ehci-dbgp.c +--- linux-2.6.35.4/drivers/usb/early/ehci-dbgp.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/usb/early/ehci-dbgp.c 2010-09-17 20:12:09.000000000 -0400 +@@ -1026,6 +1026,7 @@ static void kgdbdbgp_write_char(u8 chr) + early_dbgp_write(NULL, &chr, 1); + } + ++/* cannot be const, see kgdbdbgp_parse_config() */ + static struct kgdb_io kgdbdbgp_io_ops = { + .name = "kgdbdbgp", + .read_char = kgdbdbgp_read_char, +diff -urNp linux-2.6.35.4/drivers/usb/host/ehci-pci.c linux-2.6.35.4/drivers/usb/host/ehci-pci.c +--- linux-2.6.35.4/drivers/usb/host/ehci-pci.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/usb/host/ehci-pci.c 2010-09-17 20:12:09.000000000 -0400 +@@ -419,7 +419,7 @@ static const struct pci_device_id pci_id PCI_DEVICE_CLASS(PCI_CLASS_SERIAL_USB_EHCI, ~0), .driver_data = (unsigned long) &ehci_pci_hc_driver, }, @@ -27288,9 +28151,9 @@ diff -urNp linux-2.6.34.1/drivers/usb/host/ehci-pci.c linux-2.6.34.1/drivers/usb }; MODULE_DEVICE_TABLE(pci, pci_ids); -diff -urNp linux-2.6.34.1/drivers/usb/host/uhci-hcd.c linux-2.6.34.1/drivers/usb/host/uhci-hcd.c ---- linux-2.6.34.1/drivers/usb/host/uhci-hcd.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/usb/host/uhci-hcd.c 2010-07-07 09:04:54.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/usb/host/uhci-hcd.c linux-2.6.35.4/drivers/usb/host/uhci-hcd.c +--- linux-2.6.35.4/drivers/usb/host/uhci-hcd.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/usb/host/uhci-hcd.c 2010-09-17 20:12:09.000000000 -0400 @@ -941,7 +941,7 @@ static const struct pci_device_id uhci_p /* handle any USB UHCI controller */ PCI_DEVICE_CLASS(PCI_CLASS_SERIAL_USB_UHCI, ~0), @@ -27300,10 +28163,10 @@ diff -urNp linux-2.6.34.1/drivers/usb/host/uhci-hcd.c linux-2.6.34.1/drivers/usb }; MODULE_DEVICE_TABLE(pci, uhci_pci_ids); -diff -urNp linux-2.6.34.1/drivers/usb/mon/mon_main.c linux-2.6.34.1/drivers/usb/mon/mon_main.c ---- linux-2.6.34.1/drivers/usb/mon/mon_main.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/usb/mon/mon_main.c 2010-07-07 09:04:54.000000000 -0400 -@@ -239,7 +239,7 @@ static struct notifier_block mon_nb = { +diff -urNp linux-2.6.35.4/drivers/usb/mon/mon_main.c linux-2.6.35.4/drivers/usb/mon/mon_main.c +--- linux-2.6.35.4/drivers/usb/mon/mon_main.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/usb/mon/mon_main.c 2010-09-17 20:12:09.000000000 -0400 +@@ -240,7 +240,7 @@ static struct notifier_block mon_nb = { /* * Ops */ @@ -27312,9 +28175,9 @@ diff -urNp linux-2.6.34.1/drivers/usb/mon/mon_main.c linux-2.6.34.1/drivers/usb/ .urb_submit = mon_submit, .urb_submit_error = mon_submit_error, .urb_complete = mon_complete, -diff -urNp linux-2.6.34.1/drivers/usb/storage/debug.h linux-2.6.34.1/drivers/usb/storage/debug.h ---- linux-2.6.34.1/drivers/usb/storage/debug.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/usb/storage/debug.h 2010-07-07 09:04:54.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/usb/storage/debug.h linux-2.6.35.4/drivers/usb/storage/debug.h +--- linux-2.6.35.4/drivers/usb/storage/debug.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/usb/storage/debug.h 2010-09-17 20:12:09.000000000 -0400 @@ -54,9 +54,9 @@ void usb_stor_show_sense( unsigned char #define US_DEBUGPX(x...) printk( x ) #define US_DEBUG(x) x @@ -27328,9 +28191,9 @@ diff -urNp linux-2.6.34.1/drivers/usb/storage/debug.h linux-2.6.34.1/drivers/usb #endif #endif -diff -urNp linux-2.6.34.1/drivers/usb/storage/usb.c linux-2.6.34.1/drivers/usb/storage/usb.c ---- linux-2.6.34.1/drivers/usb/storage/usb.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/usb/storage/usb.c 2010-07-07 09:04:54.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/usb/storage/usb.c linux-2.6.35.4/drivers/usb/storage/usb.c +--- linux-2.6.35.4/drivers/usb/storage/usb.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/usb/storage/usb.c 2010-09-17 20:12:09.000000000 -0400 @@ -122,7 +122,7 @@ MODULE_PARM_DESC(quirks, "supplemental l static struct us_unusual_dev us_unusual_dev_list[] = { @@ -27340,9 +28203,9 @@ diff -urNp linux-2.6.34.1/drivers/usb/storage/usb.c linux-2.6.34.1/drivers/usb/s }; #undef UNUSUAL_DEV -diff -urNp linux-2.6.34.1/drivers/usb/storage/usual-tables.c linux-2.6.34.1/drivers/usb/storage/usual-tables.c ---- linux-2.6.34.1/drivers/usb/storage/usual-tables.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/usb/storage/usual-tables.c 2010-07-07 09:04:54.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/usb/storage/usual-tables.c linux-2.6.35.4/drivers/usb/storage/usual-tables.c +--- linux-2.6.35.4/drivers/usb/storage/usual-tables.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/usb/storage/usual-tables.c 2010-09-17 20:12:09.000000000 -0400 @@ -48,7 +48,7 @@ struct usb_device_id usb_storage_usb_ids[] = { @@ -27352,9 +28215,9 @@ diff -urNp linux-2.6.34.1/drivers/usb/storage/usual-tables.c linux-2.6.34.1/driv }; EXPORT_SYMBOL_GPL(usb_storage_usb_ids); -diff -urNp linux-2.6.34.1/drivers/uwb/wlp/messages.c linux-2.6.34.1/drivers/uwb/wlp/messages.c ---- linux-2.6.34.1/drivers/uwb/wlp/messages.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/uwb/wlp/messages.c 2010-07-07 09:04:54.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/uwb/wlp/messages.c linux-2.6.35.4/drivers/uwb/wlp/messages.c +--- linux-2.6.35.4/drivers/uwb/wlp/messages.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/uwb/wlp/messages.c 2010-09-17 20:12:09.000000000 -0400 @@ -920,7 +920,7 @@ int wlp_parse_f0(struct wlp *wlp, struct size_t len = skb->len; size_t used; @@ -27364,9 +28227,21 @@ diff -urNp linux-2.6.34.1/drivers/uwb/wlp/messages.c linux-2.6.34.1/drivers/uwb/ enum wlp_assc_error assc_err; char enonce_buf[WLP_WSS_NONCE_STRSIZE]; char rnonce_buf[WLP_WSS_NONCE_STRSIZE]; -diff -urNp linux-2.6.34.1/drivers/video/atmel_lcdfb.c linux-2.6.34.1/drivers/video/atmel_lcdfb.c ---- linux-2.6.34.1/drivers/video/atmel_lcdfb.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/video/atmel_lcdfb.c 2010-07-07 09:04:54.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/vhost/vhost.c linux-2.6.35.4/drivers/vhost/vhost.c +--- linux-2.6.35.4/drivers/vhost/vhost.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/vhost/vhost.c 2010-09-17 20:12:09.000000000 -0400 +@@ -357,7 +357,7 @@ static int init_used(struct vhost_virtqu + return get_user(vq->last_used_idx, &used->idx); + } + +-static long vhost_set_vring(struct vhost_dev *d, int ioctl, void __user *argp) ++static long vhost_set_vring(struct vhost_dev *d, unsigned int ioctl, void __user *argp) + { + struct file *eventfp, *filep = NULL, + *pollstart = NULL, *pollstop = NULL; +diff -urNp linux-2.6.35.4/drivers/video/atmel_lcdfb.c linux-2.6.35.4/drivers/video/atmel_lcdfb.c +--- linux-2.6.35.4/drivers/video/atmel_lcdfb.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/video/atmel_lcdfb.c 2010-09-17 20:12:09.000000000 -0400 @@ -111,7 +111,7 @@ static int atmel_bl_get_brightness(struc return lcdc_readl(sinfo, ATMEL_LCDC_CONTRAST_VAL); } @@ -27376,9 +28251,9 @@ diff -urNp linux-2.6.34.1/drivers/video/atmel_lcdfb.c linux-2.6.34.1/drivers/vid .update_status = atmel_bl_update_status, .get_brightness = atmel_bl_get_brightness, }; -diff -urNp linux-2.6.34.1/drivers/video/aty/aty128fb.c linux-2.6.34.1/drivers/video/aty/aty128fb.c ---- linux-2.6.34.1/drivers/video/aty/aty128fb.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/video/aty/aty128fb.c 2010-07-07 09:04:54.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/video/aty/aty128fb.c linux-2.6.35.4/drivers/video/aty/aty128fb.c +--- linux-2.6.35.4/drivers/video/aty/aty128fb.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/video/aty/aty128fb.c 2010-09-17 20:12:09.000000000 -0400 @@ -1786,7 +1786,7 @@ static int aty128_bl_get_brightness(stru return bd->props.brightness; } @@ -27388,10 +28263,10 @@ diff -urNp linux-2.6.34.1/drivers/video/aty/aty128fb.c linux-2.6.34.1/drivers/vi .get_brightness = aty128_bl_get_brightness, .update_status = aty128_bl_update_status, }; -diff -urNp linux-2.6.34.1/drivers/video/aty/atyfb_base.c linux-2.6.34.1/drivers/video/aty/atyfb_base.c ---- linux-2.6.34.1/drivers/video/aty/atyfb_base.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/video/aty/atyfb_base.c 2010-07-07 09:04:54.000000000 -0400 -@@ -2225,7 +2225,7 @@ static int aty_bl_get_brightness(struct +diff -urNp linux-2.6.35.4/drivers/video/aty/atyfb_base.c linux-2.6.35.4/drivers/video/aty/atyfb_base.c +--- linux-2.6.35.4/drivers/video/aty/atyfb_base.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/video/aty/atyfb_base.c 2010-09-17 20:12:09.000000000 -0400 +@@ -2221,7 +2221,7 @@ static int aty_bl_get_brightness(struct return bd->props.brightness; } @@ -27400,9 +28275,9 @@ diff -urNp linux-2.6.34.1/drivers/video/aty/atyfb_base.c linux-2.6.34.1/drivers/ .get_brightness = aty_bl_get_brightness, .update_status = aty_bl_update_status, }; -diff -urNp linux-2.6.34.1/drivers/video/aty/radeon_backlight.c linux-2.6.34.1/drivers/video/aty/radeon_backlight.c ---- linux-2.6.34.1/drivers/video/aty/radeon_backlight.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/video/aty/radeon_backlight.c 2010-07-07 09:04:54.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/video/aty/radeon_backlight.c linux-2.6.35.4/drivers/video/aty/radeon_backlight.c +--- linux-2.6.35.4/drivers/video/aty/radeon_backlight.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/video/aty/radeon_backlight.c 2010-09-17 20:12:09.000000000 -0400 @@ -128,7 +128,7 @@ static int radeon_bl_get_brightness(stru return bd->props.brightness; } @@ -27412,9 +28287,9 @@ diff -urNp linux-2.6.34.1/drivers/video/aty/radeon_backlight.c linux-2.6.34.1/dr .get_brightness = radeon_bl_get_brightness, .update_status = radeon_bl_update_status, }; -diff -urNp linux-2.6.34.1/drivers/video/backlight/88pm860x_bl.c linux-2.6.34.1/drivers/video/backlight/88pm860x_bl.c ---- linux-2.6.34.1/drivers/video/backlight/88pm860x_bl.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/video/backlight/88pm860x_bl.c 2010-07-07 09:04:54.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/video/backlight/88pm860x_bl.c linux-2.6.35.4/drivers/video/backlight/88pm860x_bl.c +--- linux-2.6.35.4/drivers/video/backlight/88pm860x_bl.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/video/backlight/88pm860x_bl.c 2010-09-17 20:12:09.000000000 -0400 @@ -155,7 +155,7 @@ out: return -EINVAL; } @@ -27424,9 +28299,9 @@ diff -urNp linux-2.6.34.1/drivers/video/backlight/88pm860x_bl.c linux-2.6.34.1/d .options = BL_CORE_SUSPENDRESUME, .update_status = pm860x_backlight_update_status, .get_brightness = pm860x_backlight_get_brightness, -diff -urNp linux-2.6.34.1/drivers/video/backlight/max8925_bl.c linux-2.6.34.1/drivers/video/backlight/max8925_bl.c ---- linux-2.6.34.1/drivers/video/backlight/max8925_bl.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/video/backlight/max8925_bl.c 2010-07-07 09:04:54.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/video/backlight/max8925_bl.c linux-2.6.35.4/drivers/video/backlight/max8925_bl.c +--- linux-2.6.35.4/drivers/video/backlight/max8925_bl.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/video/backlight/max8925_bl.c 2010-09-17 20:12:09.000000000 -0400 @@ -92,7 +92,7 @@ static int max8925_backlight_get_brightn return ret; } @@ -27436,9 +28311,9 @@ diff -urNp linux-2.6.34.1/drivers/video/backlight/max8925_bl.c linux-2.6.34.1/dr .options = BL_CORE_SUSPENDRESUME, .update_status = max8925_backlight_update_status, .get_brightness = max8925_backlight_get_brightness, -diff -urNp linux-2.6.34.1/drivers/video/fbcmap.c linux-2.6.34.1/drivers/video/fbcmap.c ---- linux-2.6.34.1/drivers/video/fbcmap.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/video/fbcmap.c 2010-07-07 09:04:54.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/video/fbcmap.c linux-2.6.35.4/drivers/video/fbcmap.c +--- linux-2.6.35.4/drivers/video/fbcmap.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/video/fbcmap.c 2010-09-17 20:12:09.000000000 -0400 @@ -266,8 +266,7 @@ int fb_set_user_cmap(struct fb_cmap_user rc = -ENODEV; goto out; @@ -27449,9 +28324,9 @@ diff -urNp linux-2.6.34.1/drivers/video/fbcmap.c linux-2.6.34.1/drivers/video/fb rc = -EINVAL; goto out1; } -diff -urNp linux-2.6.34.1/drivers/video/fbmem.c linux-2.6.34.1/drivers/video/fbmem.c ---- linux-2.6.34.1/drivers/video/fbmem.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/video/fbmem.c 2010-07-07 09:04:54.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/video/fbmem.c linux-2.6.35.4/drivers/video/fbmem.c +--- linux-2.6.35.4/drivers/video/fbmem.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/video/fbmem.c 2010-09-17 20:12:09.000000000 -0400 @@ -403,7 +403,7 @@ static void fb_do_show_logo(struct fb_in image->dx += image->width + 8; } @@ -27479,9 +28354,9 @@ diff -urNp linux-2.6.34.1/drivers/video/fbmem.c linux-2.6.34.1/drivers/video/fbm return -EINVAL; if (!registered_fb[con2fb.framebuffer]) request_module("fb%d", con2fb.framebuffer); -diff -urNp linux-2.6.34.1/drivers/video/fbmon.c linux-2.6.34.1/drivers/video/fbmon.c ---- linux-2.6.34.1/drivers/video/fbmon.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/video/fbmon.c 2010-07-07 09:04:54.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/video/fbmon.c linux-2.6.35.4/drivers/video/fbmon.c +--- linux-2.6.35.4/drivers/video/fbmon.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/video/fbmon.c 2010-09-17 20:12:09.000000000 -0400 @@ -46,7 +46,7 @@ #ifdef DEBUG #define DPRINTK(fmt, args...) printk(fmt,## args) @@ -27491,9 +28366,9 @@ diff -urNp linux-2.6.34.1/drivers/video/fbmon.c linux-2.6.34.1/drivers/video/fbm #endif #define FBMON_FIX_HEADER 1 -diff -urNp linux-2.6.34.1/drivers/video/i810/i810_accel.c linux-2.6.34.1/drivers/video/i810/i810_accel.c ---- linux-2.6.34.1/drivers/video/i810/i810_accel.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/video/i810/i810_accel.c 2010-07-07 09:04:54.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/video/i810/i810_accel.c linux-2.6.35.4/drivers/video/i810/i810_accel.c +--- linux-2.6.35.4/drivers/video/i810/i810_accel.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/video/i810/i810_accel.c 2010-09-17 20:12:09.000000000 -0400 @@ -73,6 +73,7 @@ static inline int wait_for_space(struct } } @@ -27502,9 +28377,9 @@ diff -urNp linux-2.6.34.1/drivers/video/i810/i810_accel.c linux-2.6.34.1/drivers i810_report_error(mmio); par->dev_flags |= LOCKUP; info->pixmap.scan_align = 1; -diff -urNp linux-2.6.34.1/drivers/video/i810/i810_main.c linux-2.6.34.1/drivers/video/i810/i810_main.c ---- linux-2.6.34.1/drivers/video/i810/i810_main.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/video/i810/i810_main.c 2010-07-07 09:04:54.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/video/i810/i810_main.c linux-2.6.35.4/drivers/video/i810/i810_main.c +--- linux-2.6.35.4/drivers/video/i810/i810_main.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/video/i810/i810_main.c 2010-09-17 20:12:09.000000000 -0400 @@ -120,7 +120,7 @@ static struct pci_device_id i810fb_pci_t PCI_ANY_ID, PCI_ANY_ID, 0, 0, 4 }, { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82815_CGC, @@ -27514,9 +28389,9 @@ diff -urNp linux-2.6.34.1/drivers/video/i810/i810_main.c linux-2.6.34.1/drivers/ }; static struct pci_driver i810fb_driver = { -diff -urNp linux-2.6.34.1/drivers/video/modedb.c linux-2.6.34.1/drivers/video/modedb.c ---- linux-2.6.34.1/drivers/video/modedb.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/video/modedb.c 2010-07-07 09:04:54.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/video/modedb.c linux-2.6.35.4/drivers/video/modedb.c +--- linux-2.6.35.4/drivers/video/modedb.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/video/modedb.c 2010-09-17 20:12:09.000000000 -0400 @@ -40,240 +40,240 @@ static const struct fb_videomode modedb[ { /* 640x400 @ 70 Hz, 31.5 kHz hsync */ @@ -27817,9 +28692,9 @@ diff -urNp linux-2.6.34.1/drivers/video/modedb.c linux-2.6.34.1/drivers/video/mo }, }; -diff -urNp linux-2.6.34.1/drivers/video/nvidia/nv_backlight.c linux-2.6.34.1/drivers/video/nvidia/nv_backlight.c ---- linux-2.6.34.1/drivers/video/nvidia/nv_backlight.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/video/nvidia/nv_backlight.c 2010-07-07 09:04:54.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/video/nvidia/nv_backlight.c linux-2.6.35.4/drivers/video/nvidia/nv_backlight.c +--- linux-2.6.35.4/drivers/video/nvidia/nv_backlight.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/video/nvidia/nv_backlight.c 2010-09-17 20:12:09.000000000 -0400 @@ -87,7 +87,7 @@ static int nvidia_bl_get_brightness(stru return bd->props.brightness; } @@ -27829,10 +28704,10 @@ diff -urNp linux-2.6.34.1/drivers/video/nvidia/nv_backlight.c linux-2.6.34.1/dri .get_brightness = nvidia_bl_get_brightness, .update_status = nvidia_bl_update_status, }; -diff -urNp linux-2.6.34.1/drivers/video/omap2/displays/panel-taal.c linux-2.6.34.1/drivers/video/omap2/displays/panel-taal.c ---- linux-2.6.34.1/drivers/video/omap2/displays/panel-taal.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/video/omap2/displays/panel-taal.c 2010-07-07 09:04:54.000000000 -0400 -@@ -316,7 +316,7 @@ static int taal_bl_get_intensity(struct +diff -urNp linux-2.6.35.4/drivers/video/omap2/displays/panel-taal.c linux-2.6.35.4/drivers/video/omap2/displays/panel-taal.c +--- linux-2.6.35.4/drivers/video/omap2/displays/panel-taal.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/video/omap2/displays/panel-taal.c 2010-09-17 20:12:09.000000000 -0400 +@@ -319,7 +319,7 @@ static int taal_bl_get_intensity(struct return 0; } @@ -27841,9 +28716,9 @@ diff -urNp linux-2.6.34.1/drivers/video/omap2/displays/panel-taal.c linux-2.6.34 .get_brightness = taal_bl_get_intensity, .update_status = taal_bl_update_status, }; -diff -urNp linux-2.6.34.1/drivers/video/riva/fbdev.c linux-2.6.34.1/drivers/video/riva/fbdev.c ---- linux-2.6.34.1/drivers/video/riva/fbdev.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/video/riva/fbdev.c 2010-07-07 09:04:54.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/video/riva/fbdev.c linux-2.6.35.4/drivers/video/riva/fbdev.c +--- linux-2.6.35.4/drivers/video/riva/fbdev.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/video/riva/fbdev.c 2010-09-17 20:12:09.000000000 -0400 @@ -331,7 +331,7 @@ static int riva_bl_get_brightness(struct return bd->props.brightness; } @@ -27853,9 +28728,9 @@ diff -urNp linux-2.6.34.1/drivers/video/riva/fbdev.c linux-2.6.34.1/drivers/vide .get_brightness = riva_bl_get_brightness, .update_status = riva_bl_update_status, }; -diff -urNp linux-2.6.34.1/drivers/video/uvesafb.c linux-2.6.34.1/drivers/video/uvesafb.c ---- linux-2.6.34.1/drivers/video/uvesafb.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/video/uvesafb.c 2010-07-07 09:04:54.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/video/uvesafb.c linux-2.6.35.4/drivers/video/uvesafb.c +--- linux-2.6.35.4/drivers/video/uvesafb.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/video/uvesafb.c 2010-09-17 20:12:09.000000000 -0400 @@ -19,6 +19,7 @@ #include #include @@ -27931,9 +28806,9 @@ diff -urNp linux-2.6.34.1/drivers/video/uvesafb.c linux-2.6.34.1/drivers/video/u } framebuffer_release(info); -diff -urNp linux-2.6.34.1/drivers/video/vesafb.c linux-2.6.34.1/drivers/video/vesafb.c ---- linux-2.6.34.1/drivers/video/vesafb.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/drivers/video/vesafb.c 2010-07-07 09:04:54.000000000 -0400 +diff -urNp linux-2.6.35.4/drivers/video/vesafb.c linux-2.6.35.4/drivers/video/vesafb.c +--- linux-2.6.35.4/drivers/video/vesafb.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/drivers/video/vesafb.c 2010-09-17 20:12:09.000000000 -0400 @@ -9,6 +9,7 @@ */ @@ -27972,7 +28847,7 @@ diff -urNp linux-2.6.34.1/drivers/video/vesafb.c linux-2.6.34.1/drivers/video/ve if (!request_mem_region(vesafb_fix.smem_start, size_total, "vesafb")) { printk(KERN_WARNING "vesafb: cannot reserve video memory at 0x%lx\n", -@@ -314,9 +312,21 @@ static int __init vesafb_probe(struct pl +@@ -319,9 +317,21 @@ static int __init vesafb_probe(struct pl printk(KERN_INFO "vesafb: mode is %dx%dx%d, linelength=%d, pages=%d\n", vesafb_defined.xres, vesafb_defined.yres, vesafb_defined.bits_per_pixel, vesafb_fix.line_length, screen_info.pages); @@ -27996,7 +28871,7 @@ diff -urNp linux-2.6.34.1/drivers/video/vesafb.c linux-2.6.34.1/drivers/video/ve } if (screen_info.vesapm_seg < 0xc000) -@@ -324,9 +334,25 @@ static int __init vesafb_probe(struct pl +@@ -329,9 +339,25 @@ static int __init vesafb_probe(struct pl if (ypan || pmi_setpal) { unsigned short *pmi_base; @@ -28025,7 +28900,7 @@ diff -urNp linux-2.6.34.1/drivers/video/vesafb.c linux-2.6.34.1/drivers/video/ve printk(KERN_INFO "vesafb: pmi: set display start = %p, set palette = %p\n",pmi_start,pmi_pal); if (pmi_base[3]) { printk(KERN_INFO "vesafb: pmi: ports = "); -@@ -468,6 +494,11 @@ static int __init vesafb_probe(struct pl +@@ -473,6 +499,11 @@ static int __init vesafb_probe(struct pl info->node, info->fix.id); return 0; err: @@ -28037,10 +28912,10 @@ diff -urNp linux-2.6.34.1/drivers/video/vesafb.c linux-2.6.34.1/drivers/video/ve if (info->screen_base) iounmap(info->screen_base); framebuffer_release(info); -diff -urNp linux-2.6.34.1/fs/9p/vfs_inode.c linux-2.6.34.1/fs/9p/vfs_inode.c ---- linux-2.6.34.1/fs/9p/vfs_inode.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/9p/vfs_inode.c 2010-07-07 09:04:54.000000000 -0400 -@@ -1067,7 +1067,7 @@ static void *v9fs_vfs_follow_link(struct +diff -urNp linux-2.6.35.4/fs/9p/vfs_inode.c linux-2.6.35.4/fs/9p/vfs_inode.c +--- linux-2.6.35.4/fs/9p/vfs_inode.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/9p/vfs_inode.c 2010-09-17 20:12:09.000000000 -0400 +@@ -1087,7 +1087,7 @@ static void *v9fs_vfs_follow_link(struct static void v9fs_vfs_put_link(struct dentry *dentry, struct nameidata *nd, void *p) { @@ -28049,9 +28924,9 @@ diff -urNp linux-2.6.34.1/fs/9p/vfs_inode.c linux-2.6.34.1/fs/9p/vfs_inode.c P9_DPRINTK(P9_DEBUG_VFS, " %s %s\n", dentry->d_name.name, IS_ERR(s) ? "" : s); -diff -urNp linux-2.6.34.1/fs/aio.c linux-2.6.34.1/fs/aio.c ---- linux-2.6.34.1/fs/aio.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/aio.c 2010-07-07 09:04:54.000000000 -0400 +diff -urNp linux-2.6.35.4/fs/aio.c linux-2.6.35.4/fs/aio.c +--- linux-2.6.35.4/fs/aio.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/aio.c 2010-09-17 20:12:09.000000000 -0400 @@ -130,7 +130,7 @@ static int aio_setup_ring(struct kioctx size += sizeof(struct io_event) * nr_events; nr_pages = (size + PAGE_SIZE-1) >> PAGE_SHIFT; @@ -28061,9 +28936,9 @@ diff -urNp linux-2.6.34.1/fs/aio.c linux-2.6.34.1/fs/aio.c return -EINVAL; nr_events = (PAGE_SIZE * nr_pages - sizeof(struct aio_ring)) / sizeof(struct io_event); -diff -urNp linux-2.6.34.1/fs/attr.c linux-2.6.34.1/fs/attr.c ---- linux-2.6.34.1/fs/attr.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/attr.c 2010-07-07 09:04:54.000000000 -0400 +diff -urNp linux-2.6.35.4/fs/attr.c linux-2.6.35.4/fs/attr.c +--- linux-2.6.35.4/fs/attr.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/attr.c 2010-09-17 20:12:37.000000000 -0400 @@ -82,6 +82,7 @@ int inode_newsize_ok(const struct inode unsigned long limit; @@ -28072,10 +28947,10 @@ diff -urNp linux-2.6.34.1/fs/attr.c linux-2.6.34.1/fs/attr.c if (limit != RLIM_INFINITY && offset > limit) goto out_sig; if (offset > inode->i_sb->s_maxbytes) -diff -urNp linux-2.6.34.1/fs/autofs/root.c linux-2.6.34.1/fs/autofs/root.c ---- linux-2.6.34.1/fs/autofs/root.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/autofs/root.c 2010-07-07 09:04:54.000000000 -0400 -@@ -300,7 +300,8 @@ static int autofs_root_symlink(struct in +diff -urNp linux-2.6.35.4/fs/autofs/root.c linux-2.6.35.4/fs/autofs/root.c +--- linux-2.6.35.4/fs/autofs/root.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/autofs/root.c 2010-09-17 20:12:09.000000000 -0400 +@@ -301,7 +301,8 @@ static int autofs_root_symlink(struct in set_bit(n,sbi->symlink_bitmap); sl = &sbi->symlink[n]; sl->len = strlen(symname); @@ -28085,9 +28960,9 @@ diff -urNp linux-2.6.34.1/fs/autofs/root.c linux-2.6.34.1/fs/autofs/root.c if (!sl->data) { clear_bit(n,sbi->symlink_bitmap); unlock_kernel(); -diff -urNp linux-2.6.34.1/fs/autofs4/symlink.c linux-2.6.34.1/fs/autofs4/symlink.c ---- linux-2.6.34.1/fs/autofs4/symlink.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/autofs4/symlink.c 2010-07-07 09:04:54.000000000 -0400 +diff -urNp linux-2.6.35.4/fs/autofs4/symlink.c linux-2.6.35.4/fs/autofs4/symlink.c +--- linux-2.6.35.4/fs/autofs4/symlink.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/autofs4/symlink.c 2010-09-17 20:12:09.000000000 -0400 @@ -15,7 +15,7 @@ static void *autofs4_follow_link(struct dentry *dentry, struct nameidata *nd) { @@ -28097,9 +28972,9 @@ diff -urNp linux-2.6.34.1/fs/autofs4/symlink.c linux-2.6.34.1/fs/autofs4/symlink return NULL; } -diff -urNp linux-2.6.34.1/fs/befs/linuxvfs.c linux-2.6.34.1/fs/befs/linuxvfs.c ---- linux-2.6.34.1/fs/befs/linuxvfs.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/befs/linuxvfs.c 2010-07-07 09:04:54.000000000 -0400 +diff -urNp linux-2.6.35.4/fs/befs/linuxvfs.c linux-2.6.35.4/fs/befs/linuxvfs.c +--- linux-2.6.35.4/fs/befs/linuxvfs.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/befs/linuxvfs.c 2010-09-17 20:12:09.000000000 -0400 @@ -493,7 +493,7 @@ static void befs_put_link(struct dentry { befs_inode_info *befs_ino = BEFS_I(dentry->d_inode); @@ -28109,9 +28984,9 @@ diff -urNp linux-2.6.34.1/fs/befs/linuxvfs.c linux-2.6.34.1/fs/befs/linuxvfs.c if (!IS_ERR(link)) kfree(link); } -diff -urNp linux-2.6.34.1/fs/binfmt_aout.c linux-2.6.34.1/fs/binfmt_aout.c ---- linux-2.6.34.1/fs/binfmt_aout.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/binfmt_aout.c 2010-07-07 09:04:54.000000000 -0400 +diff -urNp linux-2.6.35.4/fs/binfmt_aout.c linux-2.6.35.4/fs/binfmt_aout.c +--- linux-2.6.35.4/fs/binfmt_aout.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/binfmt_aout.c 2010-09-17 20:12:37.000000000 -0400 @@ -16,6 +16,7 @@ #include #include @@ -28179,9 +29054,9 @@ diff -urNp linux-2.6.34.1/fs/binfmt_aout.c linux-2.6.34.1/fs/binfmt_aout.c MAP_FIXED | MAP_PRIVATE | MAP_DENYWRITE | MAP_EXECUTABLE, fd_offset + ex.a_text); up_write(¤t->mm->mmap_sem); -diff -urNp linux-2.6.34.1/fs/binfmt_elf.c linux-2.6.34.1/fs/binfmt_elf.c ---- linux-2.6.34.1/fs/binfmt_elf.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/binfmt_elf.c 2010-07-07 09:04:54.000000000 -0400 +diff -urNp linux-2.6.35.4/fs/binfmt_elf.c linux-2.6.35.4/fs/binfmt_elf.c +--- linux-2.6.35.4/fs/binfmt_elf.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/binfmt_elf.c 2010-09-17 20:12:37.000000000 -0400 @@ -51,6 +51,10 @@ static int elf_core_dump(struct coredump #define elf_core_dump NULL #endif @@ -28775,13 +29650,13 @@ diff -urNp linux-2.6.34.1/fs/binfmt_elf.c linux-2.6.34.1/fs/binfmt_elf.c + oldflags = vma->vm_flags & (VM_MAYEXEC | VM_MAYWRITE | VM_MAYREAD | VM_EXEC | VM_WRITE | VM_READ); + newflags &= VM_MAYEXEC | VM_MAYWRITE | VM_MAYREAD | VM_EXEC | VM_WRITE | VM_READ; + -+#ifdef CONFIG_PAX_NOELFRELOCS -+ is_textrel_rw = false; -+ is_textrel_rx = false; -+#else ++#ifdef CONFIG_PAX_ELFRELOCS + /* possible TEXTREL */ + is_textrel_rw = vma->vm_file && !vma->anon_vma && oldflags == (VM_MAYEXEC | VM_MAYREAD | VM_EXEC | VM_READ) && newflags == (VM_WRITE | VM_READ); + is_textrel_rx = vma->vm_file && vma->anon_vma && oldflags == (VM_MAYEXEC | VM_MAYWRITE | VM_MAYREAD | VM_WRITE | VM_READ) && newflags == (VM_EXEC | VM_READ); ++#else ++ is_textrel_rw = false; ++ is_textrel_rx = false; +#endif + + /* possible RELRO */ @@ -28847,10 +29722,10 @@ diff -urNp linux-2.6.34.1/fs/binfmt_elf.c linux-2.6.34.1/fs/binfmt_elf.c static int __init init_elf_binfmt(void) { return register_binfmt(&elf_format); -diff -urNp linux-2.6.34.1/fs/binfmt_flat.c linux-2.6.34.1/fs/binfmt_flat.c ---- linux-2.6.34.1/fs/binfmt_flat.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/binfmt_flat.c 2010-07-07 09:04:54.000000000 -0400 -@@ -564,7 +564,9 @@ static int load_flat_file(struct linux_b +diff -urNp linux-2.6.35.4/fs/binfmt_flat.c linux-2.6.35.4/fs/binfmt_flat.c +--- linux-2.6.35.4/fs/binfmt_flat.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/binfmt_flat.c 2010-09-17 20:12:09.000000000 -0400 +@@ -567,7 +567,9 @@ static int load_flat_file(struct linux_b realdatastart = (unsigned long) -ENOMEM; printk("Unable to allocate RAM for process data, errno %d\n", (int)-realdatastart); @@ -28860,18 +29735,18 @@ diff -urNp linux-2.6.34.1/fs/binfmt_flat.c linux-2.6.34.1/fs/binfmt_flat.c ret = realdatastart; goto err; } -@@ -588,8 +590,10 @@ static int load_flat_file(struct linux_b +@@ -591,8 +593,10 @@ static int load_flat_file(struct linux_b } if (IS_ERR_VALUE(result)) { printk("Unable to read data+bss, errno %d\n", (int)-result); + down_write(¤t->mm->mmap_sem); do_munmap(current->mm, textpos, text_len); - do_munmap(current->mm, realdatastart, data_len + extra); + do_munmap(current->mm, realdatastart, len); + up_write(¤t->mm->mmap_sem); ret = result; goto err; } -@@ -658,8 +662,10 @@ static int load_flat_file(struct linux_b +@@ -661,8 +665,10 @@ static int load_flat_file(struct linux_b } if (IS_ERR_VALUE(result)) { printk("Unable to read code+data+bss, errno %d\n",(int)-result); @@ -28882,9 +29757,9 @@ diff -urNp linux-2.6.34.1/fs/binfmt_flat.c linux-2.6.34.1/fs/binfmt_flat.c ret = result; goto err; } -diff -urNp linux-2.6.34.1/fs/binfmt_misc.c linux-2.6.34.1/fs/binfmt_misc.c ---- linux-2.6.34.1/fs/binfmt_misc.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/binfmt_misc.c 2010-07-07 09:04:54.000000000 -0400 +diff -urNp linux-2.6.35.4/fs/binfmt_misc.c linux-2.6.35.4/fs/binfmt_misc.c +--- linux-2.6.35.4/fs/binfmt_misc.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/binfmt_misc.c 2010-09-17 20:12:09.000000000 -0400 @@ -693,7 +693,7 @@ static int bm_fill_super(struct super_bl static struct tree_descr bm_files[] = { [2] = {"status", &bm_status_operations, S_IWUSR|S_IRUGO}, @@ -28894,9 +29769,9 @@ diff -urNp linux-2.6.34.1/fs/binfmt_misc.c linux-2.6.34.1/fs/binfmt_misc.c }; int err = simple_fill_super(sb, 0x42494e4d, bm_files); if (!err) -diff -urNp linux-2.6.34.1/fs/bio.c linux-2.6.34.1/fs/bio.c ---- linux-2.6.34.1/fs/bio.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/bio.c 2010-07-07 09:04:54.000000000 -0400 +diff -urNp linux-2.6.35.4/fs/bio.c linux-2.6.35.4/fs/bio.c +--- linux-2.6.35.4/fs/bio.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/bio.c 2010-09-17 20:12:09.000000000 -0400 @@ -1213,7 +1213,7 @@ static void bio_copy_kern_endio(struct b const int read = bio_data_dir(bio) == READ; struct bio_map_data *bmd = bio->bi_private; @@ -28906,22 +29781,22 @@ diff -urNp linux-2.6.34.1/fs/bio.c linux-2.6.34.1/fs/bio.c __bio_for_each_segment(bvec, bio, i, 0) { char *addr = page_address(bvec->bv_page); -diff -urNp linux-2.6.34.1/fs/block_dev.c linux-2.6.34.1/fs/block_dev.c ---- linux-2.6.34.1/fs/block_dev.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/block_dev.c 2010-07-07 09:04:54.000000000 -0400 -@@ -681,7 +681,7 @@ int bd_claim(struct block_device *bdev, +diff -urNp linux-2.6.35.4/fs/block_dev.c linux-2.6.35.4/fs/block_dev.c +--- linux-2.6.35.4/fs/block_dev.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/block_dev.c 2010-09-17 20:12:09.000000000 -0400 +@@ -647,7 +647,7 @@ static bool bd_may_claim(struct block_de else if (bdev->bd_contains == bdev) - res = 0; /* is a whole device which isn't held */ - -- else if (bdev->bd_contains->bd_holder == bd_claim) -+ else if (bdev->bd_contains->bd_holder == (void *)bd_claim) - res = 0; /* is a partition of a device that is being partitioned */ - else if (bdev->bd_contains->bd_holder != NULL) - res = -EBUSY; /* is a partition of a held device */ -diff -urNp linux-2.6.34.1/fs/btrfs/ctree.c linux-2.6.34.1/fs/btrfs/ctree.c ---- linux-2.6.34.1/fs/btrfs/ctree.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/btrfs/ctree.c 2010-07-07 09:04:54.000000000 -0400 -@@ -3650,7 +3650,6 @@ setup_items_for_insert(struct btrfs_tran + return true; /* is a whole device which isn't held */ + +- else if (whole->bd_holder == bd_claim) ++ else if (whole->bd_holder == (void *)bd_claim) + return true; /* is a partition of a device that is being partitioned */ + else if (whole->bd_holder != NULL) + return false; /* is a partition of a held device */ +diff -urNp linux-2.6.35.4/fs/btrfs/ctree.c linux-2.6.35.4/fs/btrfs/ctree.c +--- linux-2.6.35.4/fs/btrfs/ctree.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/btrfs/ctree.c 2010-09-17 20:12:09.000000000 -0400 +@@ -3763,7 +3763,6 @@ setup_items_for_insert(struct btrfs_tran ret = 0; if (slot == 0) { @@ -28929,9 +29804,9 @@ diff -urNp linux-2.6.34.1/fs/btrfs/ctree.c linux-2.6.34.1/fs/btrfs/ctree.c btrfs_cpu_key_to_disk(&disk_key, cpu_key); ret = fixup_low_keys(trans, root, path, &disk_key, 1); } -diff -urNp linux-2.6.34.1/fs/btrfs/disk-io.c linux-2.6.34.1/fs/btrfs/disk-io.c ---- linux-2.6.34.1/fs/btrfs/disk-io.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/btrfs/disk-io.c 2010-07-07 09:04:54.000000000 -0400 +diff -urNp linux-2.6.35.4/fs/btrfs/disk-io.c linux-2.6.35.4/fs/btrfs/disk-io.c +--- linux-2.6.35.4/fs/btrfs/disk-io.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/btrfs/disk-io.c 2010-09-17 20:12:09.000000000 -0400 @@ -40,7 +40,7 @@ #include "tree-log.h" #include "free-space-cache.h" @@ -28941,7 +29816,7 @@ diff -urNp linux-2.6.34.1/fs/btrfs/disk-io.c linux-2.6.34.1/fs/btrfs/disk-io.c static void end_workqueue_fn(struct btrfs_work *work); static void free_fs_root(struct btrfs_root *root); -@@ -2603,7 +2603,7 @@ out: +@@ -2597,7 +2597,7 @@ out: return 0; } @@ -28950,12 +29825,12 @@ diff -urNp linux-2.6.34.1/fs/btrfs/disk-io.c linux-2.6.34.1/fs/btrfs/disk-io.c .write_cache_pages_lock_hook = btree_lock_page_hook, .readpage_end_io_hook = btree_readpage_end_io_hook, .submit_bio_hook = btree_submit_bio_hook, -diff -urNp linux-2.6.34.1/fs/btrfs/extent_io.h linux-2.6.34.1/fs/btrfs/extent_io.h ---- linux-2.6.34.1/fs/btrfs/extent_io.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/btrfs/extent_io.h 2010-07-07 09:04:55.000000000 -0400 -@@ -49,36 +49,36 @@ typedef int (extent_submit_bio_hook_t)(s +diff -urNp linux-2.6.35.4/fs/btrfs/extent_io.h linux-2.6.35.4/fs/btrfs/extent_io.h +--- linux-2.6.35.4/fs/btrfs/extent_io.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/btrfs/extent_io.h 2010-09-17 20:12:09.000000000 -0400 +@@ -51,36 +51,36 @@ typedef int (extent_submit_bio_hook_t)(s struct bio *bio, int mirror_num, - unsigned long bio_flags); + unsigned long bio_flags, u64 bio_offset); struct extent_io_ops { - int (*fill_delalloc)(struct inode *inode, struct page *locked_page, + int (* const fill_delalloc)(struct inode *inode, struct page *locked_page, @@ -28986,12 +29861,12 @@ diff -urNp linux-2.6.34.1/fs/btrfs/extent_io.h linux-2.6.34.1/fs/btrfs/extent_io - int (*writepage_end_io_hook)(struct page *page, u64 start, u64 end, + int (* const writepage_end_io_hook)(struct page *page, u64 start, u64 end, struct extent_state *state, int uptodate); -- int (*set_bit_hook)(struct inode *inode, u64 start, u64 end, -+ int (* const set_bit_hook)(struct inode *inode, u64 start, u64 end, - unsigned long old, unsigned long bits); +- int (*set_bit_hook)(struct inode *inode, struct extent_state *state, ++ int (* const set_bit_hook)(struct inode *inode, struct extent_state *state, + int *bits); - int (*clear_bit_hook)(struct inode *inode, struct extent_state *state, + int (* const clear_bit_hook)(struct inode *inode, struct extent_state *state, - unsigned long bits); + int *bits); - int (*merge_extent_hook)(struct inode *inode, + int (* const merge_extent_hook)(struct inode *inode, struct extent_state *new, @@ -29004,7 +29879,7 @@ diff -urNp linux-2.6.34.1/fs/btrfs/extent_io.h linux-2.6.34.1/fs/btrfs/extent_io }; struct extent_io_tree { -@@ -88,7 +88,7 @@ struct extent_io_tree { +@@ -90,7 +90,7 @@ struct extent_io_tree { u64 dirty_bytes; spinlock_t lock; spinlock_t buffer_lock; @@ -29013,9 +29888,9 @@ diff -urNp linux-2.6.34.1/fs/btrfs/extent_io.h linux-2.6.34.1/fs/btrfs/extent_io }; struct extent_state { -diff -urNp linux-2.6.34.1/fs/btrfs/free-space-cache.c linux-2.6.34.1/fs/btrfs/free-space-cache.c ---- linux-2.6.34.1/fs/btrfs/free-space-cache.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/btrfs/free-space-cache.c 2010-07-07 09:04:55.000000000 -0400 +diff -urNp linux-2.6.35.4/fs/btrfs/free-space-cache.c linux-2.6.35.4/fs/btrfs/free-space-cache.c +--- linux-2.6.35.4/fs/btrfs/free-space-cache.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/btrfs/free-space-cache.c 2010-09-17 20:12:09.000000000 -0400 @@ -1075,8 +1075,6 @@ u64 btrfs_alloc_from_cluster(struct btrf while(1) { @@ -29034,9 +29909,9 @@ diff -urNp linux-2.6.34.1/fs/btrfs/free-space-cache.c linux-2.6.34.1/fs/btrfs/fr if (entry->bitmap && entry->bytes > bytes + empty_size) { ret = btrfs_bitmap_cluster(block_group, entry, cluster, -diff -urNp linux-2.6.34.1/fs/btrfs/inode.c linux-2.6.34.1/fs/btrfs/inode.c ---- linux-2.6.34.1/fs/btrfs/inode.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/btrfs/inode.c 2010-07-07 09:04:55.000000000 -0400 +diff -urNp linux-2.6.35.4/fs/btrfs/inode.c linux-2.6.35.4/fs/btrfs/inode.c +--- linux-2.6.35.4/fs/btrfs/inode.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/btrfs/inode.c 2010-09-17 20:12:09.000000000 -0400 @@ -64,7 +64,7 @@ static const struct inode_operations btr static const struct address_space_operations btrfs_aops; static const struct address_space_operations btrfs_symlink_aops; @@ -29046,7 +29921,7 @@ diff -urNp linux-2.6.34.1/fs/btrfs/inode.c linux-2.6.34.1/fs/btrfs/inode.c static struct kmem_cache *btrfs_inode_cachep; struct kmem_cache *btrfs_trans_handle_cachep; -@@ -5956,7 +5956,7 @@ static const struct file_operations btrf +@@ -6958,7 +6958,7 @@ static const struct file_operations btrf .fsync = btrfs_sync_file, }; @@ -29055,9 +29930,9 @@ diff -urNp linux-2.6.34.1/fs/btrfs/inode.c linux-2.6.34.1/fs/btrfs/inode.c .fill_delalloc = run_delalloc_range, .submit_bio_hook = btrfs_submit_bio_hook, .merge_bio_hook = btrfs_merge_bio_hook, -diff -urNp linux-2.6.34.1/fs/buffer.c linux-2.6.34.1/fs/buffer.c ---- linux-2.6.34.1/fs/buffer.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/buffer.c 2010-07-07 09:04:55.000000000 -0400 +diff -urNp linux-2.6.35.4/fs/buffer.c linux-2.6.35.4/fs/buffer.c +--- linux-2.6.35.4/fs/buffer.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/buffer.c 2010-09-17 20:12:37.000000000 -0400 @@ -25,6 +25,7 @@ #include #include @@ -29066,9 +29941,9 @@ diff -urNp linux-2.6.34.1/fs/buffer.c linux-2.6.34.1/fs/buffer.c #include #include #include -diff -urNp linux-2.6.34.1/fs/cachefiles/bind.c linux-2.6.34.1/fs/cachefiles/bind.c ---- linux-2.6.34.1/fs/cachefiles/bind.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/cachefiles/bind.c 2010-07-07 09:04:55.000000000 -0400 +diff -urNp linux-2.6.35.4/fs/cachefiles/bind.c linux-2.6.35.4/fs/cachefiles/bind.c +--- linux-2.6.35.4/fs/cachefiles/bind.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/cachefiles/bind.c 2010-09-17 20:12:09.000000000 -0400 @@ -39,13 +39,11 @@ int cachefiles_daemon_bind(struct cachef args); @@ -29085,9 +29960,9 @@ diff -urNp linux-2.6.34.1/fs/cachefiles/bind.c linux-2.6.34.1/fs/cachefiles/bind cache->bcull_percent < cache->brun_percent && cache->brun_percent < 100); -diff -urNp linux-2.6.34.1/fs/cachefiles/daemon.c linux-2.6.34.1/fs/cachefiles/daemon.c ---- linux-2.6.34.1/fs/cachefiles/daemon.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/cachefiles/daemon.c 2010-07-07 09:04:55.000000000 -0400 +diff -urNp linux-2.6.35.4/fs/cachefiles/daemon.c linux-2.6.35.4/fs/cachefiles/daemon.c +--- linux-2.6.35.4/fs/cachefiles/daemon.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/cachefiles/daemon.c 2010-09-17 20:12:09.000000000 -0400 @@ -195,7 +195,7 @@ static ssize_t cachefiles_daemon_read(st if (n > buflen) return -EMSGSIZE; @@ -29124,9 +29999,9 @@ diff -urNp linux-2.6.34.1/fs/cachefiles/daemon.c linux-2.6.34.1/fs/cachefiles/da return cachefiles_daemon_range_error(cache, args); cache->bstop_percent = bstop; -diff -urNp linux-2.6.34.1/fs/cachefiles/rdwr.c linux-2.6.34.1/fs/cachefiles/rdwr.c ---- linux-2.6.34.1/fs/cachefiles/rdwr.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/cachefiles/rdwr.c 2010-07-07 09:04:55.000000000 -0400 +diff -urNp linux-2.6.35.4/fs/cachefiles/rdwr.c linux-2.6.35.4/fs/cachefiles/rdwr.c +--- linux-2.6.35.4/fs/cachefiles/rdwr.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/cachefiles/rdwr.c 2010-09-17 20:12:09.000000000 -0400 @@ -945,7 +945,7 @@ int cachefiles_write_page(struct fscache old_fs = get_fs(); set_fs(KERNEL_DS); @@ -29136,9 +30011,9 @@ diff -urNp linux-2.6.34.1/fs/cachefiles/rdwr.c linux-2.6.34.1/fs/cachefiles/rdwr set_fs(old_fs); kunmap(page); if (ret != len) -diff -urNp linux-2.6.34.1/fs/cifs/cifs_uniupr.h linux-2.6.34.1/fs/cifs/cifs_uniupr.h ---- linux-2.6.34.1/fs/cifs/cifs_uniupr.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/cifs/cifs_uniupr.h 2010-07-07 09:04:55.000000000 -0400 +diff -urNp linux-2.6.35.4/fs/cifs/cifs_uniupr.h linux-2.6.35.4/fs/cifs/cifs_uniupr.h +--- linux-2.6.35.4/fs/cifs/cifs_uniupr.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/cifs/cifs_uniupr.h 2010-09-17 20:12:09.000000000 -0400 @@ -132,7 +132,7 @@ const struct UniCaseRange CifsUniUpperRa {0x0490, 0x04cc, UniCaseRangeU0490}, {0x1e00, 0x1ffc, UniCaseRangeU1e00}, @@ -29148,9 +30023,9 @@ diff -urNp linux-2.6.34.1/fs/cifs/cifs_uniupr.h linux-2.6.34.1/fs/cifs/cifs_uniu }; #endif -diff -urNp linux-2.6.34.1/fs/cifs/link.c linux-2.6.34.1/fs/cifs/link.c ---- linux-2.6.34.1/fs/cifs/link.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/cifs/link.c 2010-07-07 09:04:55.000000000 -0400 +diff -urNp linux-2.6.35.4/fs/cifs/link.c linux-2.6.35.4/fs/cifs/link.c +--- linux-2.6.35.4/fs/cifs/link.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/cifs/link.c 2010-09-17 20:12:09.000000000 -0400 @@ -216,7 +216,7 @@ cifs_symlink(struct inode *inode, struct void cifs_put_link(struct dentry *direntry, struct nameidata *nd, void *cookie) @@ -29160,9 +30035,26 @@ diff -urNp linux-2.6.34.1/fs/cifs/link.c linux-2.6.34.1/fs/cifs/link.c if (!IS_ERR(p)) kfree(p); } -diff -urNp linux-2.6.34.1/fs/compat.c linux-2.6.34.1/fs/compat.c ---- linux-2.6.34.1/fs/compat.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/compat.c 2010-07-07 09:04:55.000000000 -0400 +diff -urNp linux-2.6.35.4/fs/compat_binfmt_elf.c linux-2.6.35.4/fs/compat_binfmt_elf.c +--- linux-2.6.35.4/fs/compat_binfmt_elf.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/compat_binfmt_elf.c 2010-09-17 20:12:09.000000000 -0400 +@@ -30,11 +30,13 @@ + #undef elf_phdr + #undef elf_shdr + #undef elf_note ++#undef elf_dyn + #undef elf_addr_t + #define elfhdr elf32_hdr + #define elf_phdr elf32_phdr + #define elf_shdr elf32_shdr + #define elf_note elf32_note ++#define elf_dyn Elf32_Dyn + #define elf_addr_t Elf32_Addr + + /* +diff -urNp linux-2.6.35.4/fs/compat.c linux-2.6.35.4/fs/compat.c +--- linux-2.6.35.4/fs/compat.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/compat.c 2010-09-17 20:12:37.000000000 -0400 @@ -1433,14 +1433,12 @@ static int compat_copy_strings(int argc, if (!kmapped_page || kpos != (pos & PAGE_MASK)) { struct page *page; @@ -29262,26 +30154,9 @@ diff -urNp linux-2.6.34.1/fs/compat.c linux-2.6.34.1/fs/compat.c out: if (bprm->mm) mmput(bprm->mm); -diff -urNp linux-2.6.34.1/fs/compat_binfmt_elf.c linux-2.6.34.1/fs/compat_binfmt_elf.c ---- linux-2.6.34.1/fs/compat_binfmt_elf.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/compat_binfmt_elf.c 2010-07-07 09:04:55.000000000 -0400 -@@ -30,11 +30,13 @@ - #undef elf_phdr - #undef elf_shdr - #undef elf_note -+#undef elf_dyn - #undef elf_addr_t - #define elfhdr elf32_hdr - #define elf_phdr elf32_phdr - #define elf_shdr elf32_shdr - #define elf_note elf32_note -+#define elf_dyn Elf32_Dyn - #define elf_addr_t Elf32_Addr - - /* -diff -urNp linux-2.6.34.1/fs/debugfs/inode.c linux-2.6.34.1/fs/debugfs/inode.c ---- linux-2.6.34.1/fs/debugfs/inode.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/debugfs/inode.c 2010-07-07 09:04:55.000000000 -0400 +diff -urNp linux-2.6.35.4/fs/debugfs/inode.c linux-2.6.35.4/fs/debugfs/inode.c +--- linux-2.6.35.4/fs/debugfs/inode.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/debugfs/inode.c 2010-09-17 20:12:09.000000000 -0400 @@ -129,7 +129,7 @@ static inline int debugfs_positive(struc static int debug_fill_super(struct super_block *sb, void *data, int silent) @@ -29291,9 +30166,9 @@ diff -urNp linux-2.6.34.1/fs/debugfs/inode.c linux-2.6.34.1/fs/debugfs/inode.c return simple_fill_super(sb, DEBUGFS_MAGIC, debug_files); } -diff -urNp linux-2.6.34.1/fs/dlm/lockspace.c linux-2.6.34.1/fs/dlm/lockspace.c ---- linux-2.6.34.1/fs/dlm/lockspace.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/dlm/lockspace.c 2010-07-07 09:04:55.000000000 -0400 +diff -urNp linux-2.6.35.4/fs/dlm/lockspace.c linux-2.6.35.4/fs/dlm/lockspace.c +--- linux-2.6.35.4/fs/dlm/lockspace.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/dlm/lockspace.c 2010-09-17 20:12:09.000000000 -0400 @@ -200,7 +200,7 @@ static int dlm_uevent(struct kset *kset, return 0; } @@ -29303,10 +30178,10 @@ diff -urNp linux-2.6.34.1/fs/dlm/lockspace.c linux-2.6.34.1/fs/dlm/lockspace.c .uevent = dlm_uevent, }; -diff -urNp linux-2.6.34.1/fs/ecryptfs/inode.c linux-2.6.34.1/fs/ecryptfs/inode.c ---- linux-2.6.34.1/fs/ecryptfs/inode.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/ecryptfs/inode.c 2010-07-07 09:04:55.000000000 -0400 -@@ -666,7 +666,7 @@ static int ecryptfs_readlink_lower(struc +diff -urNp linux-2.6.35.4/fs/ecryptfs/inode.c linux-2.6.35.4/fs/ecryptfs/inode.c +--- linux-2.6.35.4/fs/ecryptfs/inode.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/ecryptfs/inode.c 2010-09-17 20:12:09.000000000 -0400 +@@ -658,7 +658,7 @@ static int ecryptfs_readlink_lower(struc old_fs = get_fs(); set_fs(get_ds()); rc = lower_dentry->d_inode->i_op->readlink(lower_dentry, @@ -29315,7 +30190,7 @@ diff -urNp linux-2.6.34.1/fs/ecryptfs/inode.c linux-2.6.34.1/fs/ecryptfs/inode.c lower_bufsiz); set_fs(old_fs); if (rc < 0) -@@ -712,7 +712,7 @@ static void *ecryptfs_follow_link(struct +@@ -704,7 +704,7 @@ static void *ecryptfs_follow_link(struct } old_fs = get_fs(); set_fs(get_ds()); @@ -29324,7 +30199,7 @@ diff -urNp linux-2.6.34.1/fs/ecryptfs/inode.c linux-2.6.34.1/fs/ecryptfs/inode.c set_fs(old_fs); if (rc < 0) { kfree(buf); -@@ -727,7 +727,7 @@ out: +@@ -719,7 +719,7 @@ out: static void ecryptfs_put_link(struct dentry *dentry, struct nameidata *nd, void *ptr) { @@ -29333,9 +30208,9 @@ diff -urNp linux-2.6.34.1/fs/ecryptfs/inode.c linux-2.6.34.1/fs/ecryptfs/inode.c if (!IS_ERR(buf)) { /* Free the char* */ kfree(buf); -diff -urNp linux-2.6.34.1/fs/ecryptfs/miscdev.c linux-2.6.34.1/fs/ecryptfs/miscdev.c ---- linux-2.6.34.1/fs/ecryptfs/miscdev.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/ecryptfs/miscdev.c 2010-07-07 09:04:55.000000000 -0400 +diff -urNp linux-2.6.35.4/fs/ecryptfs/miscdev.c linux-2.6.35.4/fs/ecryptfs/miscdev.c +--- linux-2.6.35.4/fs/ecryptfs/miscdev.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/ecryptfs/miscdev.c 2010-09-17 20:12:09.000000000 -0400 @@ -328,7 +328,7 @@ check_list: goto out_unlock_msg_ctx; i = 5; @@ -29345,9 +30220,9 @@ diff -urNp linux-2.6.34.1/fs/ecryptfs/miscdev.c linux-2.6.34.1/fs/ecryptfs/miscd goto out_unlock_msg_ctx; i += packet_length_size; if (copy_to_user(&buf[i], msg_ctx->msg, msg_ctx->msg_size)) -diff -urNp linux-2.6.34.1/fs/exec.c linux-2.6.34.1/fs/exec.c ---- linux-2.6.34.1/fs/exec.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/exec.c 2010-07-07 09:04:55.000000000 -0400 +diff -urNp linux-2.6.35.4/fs/exec.c linux-2.6.35.4/fs/exec.c +--- linux-2.6.35.4/fs/exec.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/exec.c 2010-09-17 20:12:37.000000000 -0400 @@ -55,12 +55,24 @@ #include #include @@ -29404,10 +30279,10 @@ diff -urNp linux-2.6.34.1/fs/exec.c linux-2.6.34.1/fs/exec.c return NULL; if (write) { -@@ -245,6 +249,11 @@ static int __bprm_mm_init(struct linux_b +@@ -246,6 +250,11 @@ static int __bprm_mm_init(struct linux_b vma->vm_end = STACK_TOP_MAX; vma->vm_start = vma->vm_end - PAGE_SIZE; - vma->vm_flags = VM_STACK_FLAGS; + vma->vm_flags = VM_STACK_FLAGS | VM_STACK_INCOMPLETE_SETUP; + +#ifdef CONFIG_PAX_SEGMEXEC + vma->vm_flags &= ~(VM_EXEC | VM_MAYEXEC); @@ -29416,7 +30291,7 @@ diff -urNp linux-2.6.34.1/fs/exec.c linux-2.6.34.1/fs/exec.c vma->vm_page_prot = vm_get_page_prot(vma->vm_flags); INIT_LIST_HEAD(&vma->anon_vma_chain); err = insert_vm_struct(mm, vma); -@@ -254,6 +263,12 @@ static int __bprm_mm_init(struct linux_b +@@ -255,6 +264,12 @@ static int __bprm_mm_init(struct linux_b mm->stack_vm = mm->total_vm = 1; up_write(&mm->mmap_sem); bprm->p = vma->vm_end - sizeof(void *); @@ -29429,7 +30304,7 @@ diff -urNp linux-2.6.34.1/fs/exec.c linux-2.6.34.1/fs/exec.c return 0; err: up_write(&mm->mmap_sem); -@@ -475,7 +490,7 @@ int copy_strings_kernel(int argc,char ** +@@ -476,7 +491,7 @@ int copy_strings_kernel(int argc,char ** int r; mm_segment_t oldfs = get_fs(); set_fs(KERNEL_DS); @@ -29438,7 +30313,7 @@ diff -urNp linux-2.6.34.1/fs/exec.c linux-2.6.34.1/fs/exec.c set_fs(oldfs); return r; } -@@ -505,7 +520,8 @@ static int shift_arg_pages(struct vm_are +@@ -506,7 +521,8 @@ static int shift_arg_pages(struct vm_are unsigned long new_end = old_end - shift; struct mmu_gather *tlb; @@ -29448,7 +30323,7 @@ diff -urNp linux-2.6.34.1/fs/exec.c linux-2.6.34.1/fs/exec.c /* * ensure there are no vmas between where we want to go -@@ -514,6 +530,10 @@ static int shift_arg_pages(struct vm_are +@@ -515,6 +531,10 @@ static int shift_arg_pages(struct vm_are if (vma != find_vma(mm, new_start)) return -EFAULT; @@ -29459,7 +30334,7 @@ diff -urNp linux-2.6.34.1/fs/exec.c linux-2.6.34.1/fs/exec.c /* * cover the whole range: [new_start, old_end) */ -@@ -604,8 +624,28 @@ int setup_arg_pages(struct linux_binprm +@@ -605,8 +625,28 @@ int setup_arg_pages(struct linux_binprm bprm->exec -= stack_shift; down_write(&mm->mmap_sem); @@ -29488,7 +30363,7 @@ diff -urNp linux-2.6.34.1/fs/exec.c linux-2.6.34.1/fs/exec.c /* * Adjust stack execute permissions; explicitly enable for * EXSTACK_ENABLE_X, disable for EXSTACK_DISABLE_X and leave alone -@@ -623,13 +663,6 @@ int setup_arg_pages(struct linux_binprm +@@ -625,13 +665,6 @@ int setup_arg_pages(struct linux_binprm goto out_unlock; BUG_ON(prev != vma); @@ -29499,10 +30374,10 @@ diff -urNp linux-2.6.34.1/fs/exec.c linux-2.6.34.1/fs/exec.c - goto out_unlock; - } - - stack_expand = 131072UL; /* randomly 32*4k (or 2*64k) pages */ - stack_size = vma->vm_end - vma->vm_start; - /* -@@ -666,7 +699,7 @@ struct file *open_exec(const char *name) + /* mprotect_fixup is overkill to remove the temporary stack flags */ + vma->vm_flags &= ~VM_STACK_INCOMPLETE_SETUP; + +@@ -671,7 +704,7 @@ struct file *open_exec(const char *name) int err; file = do_filp_open(AT_FDCWD, name, @@ -29511,7 +30386,7 @@ diff -urNp linux-2.6.34.1/fs/exec.c linux-2.6.34.1/fs/exec.c MAY_EXEC | MAY_OPEN); if (IS_ERR(file)) goto out; -@@ -703,7 +736,7 @@ int kernel_read(struct file *file, loff_ +@@ -708,7 +741,7 @@ int kernel_read(struct file *file, loff_ old_fs = get_fs(); set_fs(get_ds()); /* The cast to a user pointer is valid due to the set_fs() */ @@ -29520,7 +30395,7 @@ diff -urNp linux-2.6.34.1/fs/exec.c linux-2.6.34.1/fs/exec.c set_fs(old_fs); return result; } -@@ -1121,7 +1154,7 @@ int check_unsafe_exec(struct linux_binpr +@@ -1125,7 +1158,7 @@ int check_unsafe_exec(struct linux_binpr } rcu_read_unlock(); @@ -29529,7 +30404,7 @@ diff -urNp linux-2.6.34.1/fs/exec.c linux-2.6.34.1/fs/exec.c bprm->unsafe |= LSM_UNSAFE_SHARE; } else { res = -EAGAIN; -@@ -1317,6 +1350,11 @@ int do_execve(char * filename, +@@ -1321,6 +1354,11 @@ int do_execve(char * filename, char __user *__user *envp, struct pt_regs * regs) { @@ -29541,7 +30416,7 @@ diff -urNp linux-2.6.34.1/fs/exec.c linux-2.6.34.1/fs/exec.c struct linux_binprm *bprm; struct file *file; struct files_struct *displaced; -@@ -1353,6 +1391,18 @@ int do_execve(char * filename, +@@ -1357,6 +1395,18 @@ int do_execve(char * filename, bprm->filename = filename; bprm->interp = filename; @@ -29560,7 +30435,7 @@ diff -urNp linux-2.6.34.1/fs/exec.c linux-2.6.34.1/fs/exec.c retval = bprm_mm_init(bprm); if (retval) goto out_file; -@@ -1382,10 +1432,41 @@ int do_execve(char * filename, +@@ -1386,10 +1436,41 @@ int do_execve(char * filename, if (retval < 0) goto out; @@ -29603,7 +30478,7 @@ diff -urNp linux-2.6.34.1/fs/exec.c linux-2.6.34.1/fs/exec.c /* execve succeeded */ current->fs->in_exec = 0; -@@ -1396,6 +1477,14 @@ int do_execve(char * filename, +@@ -1400,6 +1481,14 @@ int do_execve(char * filename, put_files_struct(displaced); return retval; @@ -29618,7 +30493,7 @@ diff -urNp linux-2.6.34.1/fs/exec.c linux-2.6.34.1/fs/exec.c out: if (bprm->mm) mmput (bprm->mm); -@@ -1559,6 +1648,169 @@ out: +@@ -1563,6 +1652,225 @@ out: return ispipe; } @@ -29762,6 +30637,62 @@ diff -urNp linux-2.6.34.1/fs/exec.c linux-2.6.34.1/fs/exec.c +#endif + +#ifdef CONFIG_PAX_USERCOPY ++#if defined(CONFIG_FRAME_POINTER) && defined(CONFIG_X86) ++struct stack_frame { ++ struct stack_frame *next_frame; ++ unsigned long return_address; ++}; ++#endif ++ ++/* 0: not at all, 1: fully, 2: fully inside frame, ++ -1: partially (implies an error) */ ++ ++int object_is_on_stack(const void *obj, unsigned long len) ++{ ++ const void *stack = task_stack_page(current); ++ const void *stackend = stack + THREAD_SIZE; ++ ++ if (obj + len < obj) ++ return -1; ++ ++ if (stack <= obj && obj + len <= stackend) { ++#if defined(CONFIG_FRAME_POINTER) && defined(CONFIG_X86) ++ void *frame = __builtin_frame_address(2); ++ void *oldframe = __builtin_frame_address(1); ++ /* ++ bottom ----------------------------------------------> top ++ [saved bp][saved ip][args][local vars][saved bp][saved ip] ++ ^----------------^ ++ allow copies only within here ++ */ ++ while (frame) { ++ /* if obj + len extends past the last frame, this ++ check won't pass and the next frame will be 0, ++ causing us to bail out and correctly report ++ the copy as invalid ++ */ ++ if (obj + len <= frame) { ++ if (obj >= (oldframe + (2 * sizeof(void *)))) ++ return 2; ++ else ++ return -1; ++ } ++ oldframe = frame; ++ frame = ((struct stack_frame *)frame)->next_frame; ++ } ++ return -1; ++#else ++ return 1; ++#endif ++ } ++ ++ if (obj + len <= stack || stackend <= obj) ++ return 0; ++ ++ return -1; ++} ++ ++ +void pax_report_leak_to_user(const void *ptr, unsigned long len) +{ + if (current->signal->curr_ip) @@ -29788,7 +30719,7 @@ diff -urNp linux-2.6.34.1/fs/exec.c linux-2.6.34.1/fs/exec.c static int zap_process(struct task_struct *start, int exit_code) { struct task_struct *t; -@@ -1766,17 +2018,17 @@ static void wait_for_dump_helpers(struct +@@ -1773,17 +2081,17 @@ static void wait_for_dump_helpers(struct pipe = file->f_path.dentry->d_inode->i_pipe; pipe_lock(pipe); @@ -29811,7 +30742,7 @@ diff -urNp linux-2.6.34.1/fs/exec.c linux-2.6.34.1/fs/exec.c pipe_unlock(pipe); } -@@ -1857,6 +2109,10 @@ void do_coredump(long signr, int exit_co +@@ -1891,6 +2199,10 @@ void do_coredump(long signr, int exit_co */ clear_thread_flag(TIF_SIGPENDING); @@ -29822,9 +30753,9 @@ diff -urNp linux-2.6.34.1/fs/exec.c linux-2.6.34.1/fs/exec.c /* * lock_kernel() because format_corename() is controlled by sysctl, which * uses lock_kernel() -diff -urNp linux-2.6.34.1/fs/ext2/balloc.c linux-2.6.34.1/fs/ext2/balloc.c ---- linux-2.6.34.1/fs/ext2/balloc.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/ext2/balloc.c 2010-07-07 09:04:55.000000000 -0400 +diff -urNp linux-2.6.35.4/fs/ext2/balloc.c linux-2.6.35.4/fs/ext2/balloc.c +--- linux-2.6.35.4/fs/ext2/balloc.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/ext2/balloc.c 2010-09-17 20:12:37.000000000 -0400 @@ -1193,7 +1193,7 @@ static int ext2_has_free_blocks(struct e free_blocks = percpu_counter_read_positive(&sbi->s_freeblocks_counter); @@ -29834,9 +30765,9 @@ diff -urNp linux-2.6.34.1/fs/ext2/balloc.c linux-2.6.34.1/fs/ext2/balloc.c sbi->s_resuid != current_fsuid() && (sbi->s_resgid == 0 || !in_group_p (sbi->s_resgid))) { return 0; -diff -urNp linux-2.6.34.1/fs/ext2/xattr.c linux-2.6.34.1/fs/ext2/xattr.c ---- linux-2.6.34.1/fs/ext2/xattr.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/ext2/xattr.c 2010-07-07 09:04:55.000000000 -0400 +diff -urNp linux-2.6.35.4/fs/ext2/xattr.c linux-2.6.35.4/fs/ext2/xattr.c +--- linux-2.6.35.4/fs/ext2/xattr.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/ext2/xattr.c 2010-09-17 20:12:09.000000000 -0400 @@ -86,8 +86,8 @@ printk("\n"); \ } while (0) @@ -29848,9 +30779,9 @@ diff -urNp linux-2.6.34.1/fs/ext2/xattr.c linux-2.6.34.1/fs/ext2/xattr.c #endif static int ext2_xattr_set2(struct inode *, struct buffer_head *, -diff -urNp linux-2.6.34.1/fs/ext3/balloc.c linux-2.6.34.1/fs/ext3/balloc.c ---- linux-2.6.34.1/fs/ext3/balloc.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/ext3/balloc.c 2010-07-07 09:04:55.000000000 -0400 +diff -urNp linux-2.6.35.4/fs/ext3/balloc.c linux-2.6.35.4/fs/ext3/balloc.c +--- linux-2.6.35.4/fs/ext3/balloc.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/ext3/balloc.c 2010-09-17 20:12:37.000000000 -0400 @@ -1422,7 +1422,7 @@ static int ext3_has_free_blocks(struct e free_blocks = percpu_counter_read_positive(&sbi->s_freeblocks_counter); @@ -29860,9 +30791,9 @@ diff -urNp linux-2.6.34.1/fs/ext3/balloc.c linux-2.6.34.1/fs/ext3/balloc.c sbi->s_resuid != current_fsuid() && (sbi->s_resgid == 0 || !in_group_p (sbi->s_resgid))) { return 0; -diff -urNp linux-2.6.34.1/fs/ext3/namei.c linux-2.6.34.1/fs/ext3/namei.c ---- linux-2.6.34.1/fs/ext3/namei.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/ext3/namei.c 2010-07-07 09:04:55.000000000 -0400 +diff -urNp linux-2.6.35.4/fs/ext3/namei.c linux-2.6.35.4/fs/ext3/namei.c +--- linux-2.6.35.4/fs/ext3/namei.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/ext3/namei.c 2010-09-17 20:12:09.000000000 -0400 @@ -1168,7 +1168,7 @@ static struct ext3_dir_entry_2 *do_split char *data1 = (*bh)->b_data, *data2; unsigned split, move, size; @@ -29872,9 +30803,9 @@ diff -urNp linux-2.6.34.1/fs/ext3/namei.c linux-2.6.34.1/fs/ext3/namei.c bh2 = ext3_append (handle, dir, &newblock, &err); if (!(bh2)) { -diff -urNp linux-2.6.34.1/fs/ext3/xattr.c linux-2.6.34.1/fs/ext3/xattr.c ---- linux-2.6.34.1/fs/ext3/xattr.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/ext3/xattr.c 2010-07-07 09:04:55.000000000 -0400 +diff -urNp linux-2.6.35.4/fs/ext3/xattr.c linux-2.6.35.4/fs/ext3/xattr.c +--- linux-2.6.35.4/fs/ext3/xattr.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/ext3/xattr.c 2010-09-17 20:12:09.000000000 -0400 @@ -89,8 +89,8 @@ printk("\n"); \ } while (0) @@ -29886,9 +30817,9 @@ diff -urNp linux-2.6.34.1/fs/ext3/xattr.c linux-2.6.34.1/fs/ext3/xattr.c #endif static void ext3_xattr_cache_insert(struct buffer_head *); -diff -urNp linux-2.6.34.1/fs/ext4/balloc.c linux-2.6.34.1/fs/ext4/balloc.c ---- linux-2.6.34.1/fs/ext4/balloc.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/ext4/balloc.c 2010-07-07 09:04:55.000000000 -0400 +diff -urNp linux-2.6.35.4/fs/ext4/balloc.c linux-2.6.35.4/fs/ext4/balloc.c +--- linux-2.6.35.4/fs/ext4/balloc.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/ext4/balloc.c 2010-09-17 20:12:37.000000000 -0400 @@ -522,7 +522,7 @@ int ext4_has_free_blocks(struct ext4_sb_ /* Hm, nope. Are (enough) root reserved blocks available? */ if (sbi->s_resuid == current_fsuid() || @@ -29898,22 +30829,9 @@ diff -urNp linux-2.6.34.1/fs/ext4/balloc.c linux-2.6.34.1/fs/ext4/balloc.c if (free_blocks >= (nblocks + dirty_blocks)) return 1; } -diff -urNp linux-2.6.34.1/fs/ext4/ioctl.c linux-2.6.34.1/fs/ext4/ioctl.c ---- linux-2.6.34.1/fs/ext4/ioctl.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/ext4/ioctl.c 2010-07-07 09:04:55.000000000 -0400 -@@ -230,6 +230,9 @@ setversion_out: - struct file *donor_filp; - int err; - -+ /* temporary workaround for bugs in here */ -+ return -EOPNOTSUPP; -+ - if (!(filp->f_mode & FMODE_READ) || - !(filp->f_mode & FMODE_WRITE)) - return -EBADF; -diff -urNp linux-2.6.34.1/fs/ext4/namei.c linux-2.6.34.1/fs/ext4/namei.c ---- linux-2.6.34.1/fs/ext4/namei.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/ext4/namei.c 2010-07-07 09:04:55.000000000 -0400 +diff -urNp linux-2.6.35.4/fs/ext4/namei.c linux-2.6.35.4/fs/ext4/namei.c +--- linux-2.6.35.4/fs/ext4/namei.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/ext4/namei.c 2010-09-17 20:12:09.000000000 -0400 @@ -1197,7 +1197,7 @@ static struct ext4_dir_entry_2 *do_split char *data1 = (*bh)->b_data, *data2; unsigned split, move, size; @@ -29923,9 +30841,9 @@ diff -urNp linux-2.6.34.1/fs/ext4/namei.c linux-2.6.34.1/fs/ext4/namei.c bh2 = ext4_append (handle, dir, &newblock, &err); if (!(bh2)) { -diff -urNp linux-2.6.34.1/fs/ext4/xattr.c linux-2.6.34.1/fs/ext4/xattr.c ---- linux-2.6.34.1/fs/ext4/xattr.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/ext4/xattr.c 2010-07-07 09:04:55.000000000 -0400 +diff -urNp linux-2.6.35.4/fs/ext4/xattr.c linux-2.6.35.4/fs/ext4/xattr.c +--- linux-2.6.35.4/fs/ext4/xattr.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/ext4/xattr.c 2010-09-17 20:12:09.000000000 -0400 @@ -82,8 +82,8 @@ printk("\n"); \ } while (0) @@ -29937,10 +30855,22 @@ diff -urNp linux-2.6.34.1/fs/ext4/xattr.c linux-2.6.34.1/fs/ext4/xattr.c #endif static void ext4_xattr_cache_insert(struct buffer_head *); -diff -urNp linux-2.6.34.1/fs/fcntl.c linux-2.6.34.1/fs/fcntl.c ---- linux-2.6.34.1/fs/fcntl.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/fcntl.c 2010-07-07 09:04:55.000000000 -0400 -@@ -344,6 +344,7 @@ static long do_fcntl(int fd, unsigned in +diff -urNp linux-2.6.35.4/fs/fcntl.c linux-2.6.35.4/fs/fcntl.c +--- linux-2.6.35.4/fs/fcntl.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/fcntl.c 2010-09-17 20:12:37.000000000 -0400 +@@ -224,6 +224,11 @@ int __f_setown(struct file *filp, struct + if (err) + return err; + ++ if (gr_handle_chroot_fowner(pid, type)) ++ return -ENOENT; ++ if (gr_check_protected_task_fowner(pid, type)) ++ return -EACCES; ++ + f_modown(filp, pid, type, force); + return 0; + } +@@ -348,6 +353,7 @@ static long do_fcntl(int fd, unsigned in switch (cmd) { case F_DUPFD: case F_DUPFD_CLOEXEC: @@ -29948,19 +30878,9 @@ diff -urNp linux-2.6.34.1/fs/fcntl.c linux-2.6.34.1/fs/fcntl.c if (arg >= rlimit(RLIMIT_NOFILE)) break; err = alloc_fd(arg, cmd == F_DUPFD_CLOEXEC ? O_CLOEXEC : 0); -@@ -500,7 +501,8 @@ static inline int sigio_perm(struct task - ret = ((fown->euid == 0 || - fown->euid == cred->suid || fown->euid == cred->uid || - fown->uid == cred->suid || fown->uid == cred->uid) && -- !security_file_send_sigiotask(p, fown, sig)); -+ !security_file_send_sigiotask(p, fown, sig) && -+ !gr_check_protected_task(p) && !gr_pid_is_chrooted(p)); - rcu_read_unlock(); - return ret; - } -diff -urNp linux-2.6.34.1/fs/fifo.c linux-2.6.34.1/fs/fifo.c ---- linux-2.6.34.1/fs/fifo.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/fifo.c 2010-07-07 09:04:55.000000000 -0400 +diff -urNp linux-2.6.35.4/fs/fifo.c linux-2.6.35.4/fs/fifo.c +--- linux-2.6.35.4/fs/fifo.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/fifo.c 2010-09-17 20:12:09.000000000 -0400 @@ -58,10 +58,10 @@ static int fifo_open(struct inode *inode */ filp->f_op = &read_pipefifo_fops; @@ -30031,9 +30951,9 @@ diff -urNp linux-2.6.34.1/fs/fifo.c linux-2.6.34.1/fs/fifo.c free_pipe_info(inode); err_nocleanup: -diff -urNp linux-2.6.34.1/fs/file.c linux-2.6.34.1/fs/file.c ---- linux-2.6.34.1/fs/file.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/file.c 2010-07-07 09:04:55.000000000 -0400 +diff -urNp linux-2.6.35.4/fs/file.c linux-2.6.35.4/fs/file.c +--- linux-2.6.35.4/fs/file.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/file.c 2010-09-17 20:12:37.000000000 -0400 @@ -14,6 +14,7 @@ #include #include @@ -30050,9 +30970,9 @@ diff -urNp linux-2.6.34.1/fs/file.c linux-2.6.34.1/fs/file.c if (nr >= rlimit(RLIMIT_NOFILE)) return -EMFILE; -diff -urNp linux-2.6.34.1/fs/fs_struct.c linux-2.6.34.1/fs/fs_struct.c ---- linux-2.6.34.1/fs/fs_struct.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/fs_struct.c 2010-07-07 09:04:55.000000000 -0400 +diff -urNp linux-2.6.35.4/fs/fs_struct.c linux-2.6.35.4/fs/fs_struct.c +--- linux-2.6.35.4/fs/fs_struct.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/fs_struct.c 2010-09-17 20:12:37.000000000 -0400 @@ -4,6 +4,7 @@ #include #include @@ -30132,9 +31052,9 @@ diff -urNp linux-2.6.34.1/fs/fs_struct.c linux-2.6.34.1/fs/fs_struct.c write_unlock(&fs->lock); task_unlock(current); -diff -urNp linux-2.6.34.1/fs/fuse/control.c linux-2.6.34.1/fs/fuse/control.c ---- linux-2.6.34.1/fs/fuse/control.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/fuse/control.c 2010-07-07 09:04:55.000000000 -0400 +diff -urNp linux-2.6.35.4/fs/fuse/control.c linux-2.6.35.4/fs/fuse/control.c +--- linux-2.6.35.4/fs/fuse/control.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/fuse/control.c 2010-09-17 20:12:09.000000000 -0400 @@ -293,7 +293,7 @@ void fuse_ctl_remove_conn(struct fuse_co static int fuse_ctl_fill_super(struct super_block *sb, void *data, int silent) @@ -30144,9 +31064,9 @@ diff -urNp linux-2.6.34.1/fs/fuse/control.c linux-2.6.34.1/fs/fuse/control.c struct fuse_conn *fc; int err; -diff -urNp linux-2.6.34.1/fs/fuse/cuse.c linux-2.6.34.1/fs/fuse/cuse.c ---- linux-2.6.34.1/fs/fuse/cuse.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/fuse/cuse.c 2010-07-07 09:04:55.000000000 -0400 +diff -urNp linux-2.6.35.4/fs/fuse/cuse.c linux-2.6.35.4/fs/fuse/cuse.c +--- linux-2.6.35.4/fs/fuse/cuse.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/fuse/cuse.c 2010-09-17 20:12:09.000000000 -0400 @@ -529,8 +529,18 @@ static int cuse_channel_release(struct i return rc; } @@ -30181,48 +31101,64 @@ diff -urNp linux-2.6.34.1/fs/fuse/cuse.c linux-2.6.34.1/fs/fuse/cuse.c cuse_class = class_create(THIS_MODULE, "cuse"); if (IS_ERR(cuse_class)) return PTR_ERR(cuse_class); -diff -urNp linux-2.6.34.1/fs/fuse/dev.c linux-2.6.34.1/fs/fuse/dev.c ---- linux-2.6.34.1/fs/fuse/dev.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/fuse/dev.c 2010-07-07 09:04:55.000000000 -0400 -@@ -745,7 +745,7 @@ __releases(&fc->lock) - * request_end(). Otherwise add it to the processing list, and set - * the 'sent' flag. - */ +diff -urNp linux-2.6.35.4/fs/fuse/dev.c linux-2.6.35.4/fs/fuse/dev.c +--- linux-2.6.35.4/fs/fuse/dev.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/fuse/dev.c 2010-09-17 20:12:09.000000000 -0400 +@@ -1031,7 +1031,7 @@ static ssize_t fuse_dev_do_read(struct f + return err; + } + -static ssize_t fuse_dev_read(struct kiocb *iocb, const struct iovec *iov, +ssize_t fuse_dev_read(struct kiocb *iocb, const struct iovec *iov, unsigned long nr_segs, loff_t pos) { - int err; -@@ -828,6 +828,8 @@ static ssize_t fuse_dev_read(struct kioc - return err; + struct fuse_copy_state cs; +@@ -1045,6 +1045,8 @@ static ssize_t fuse_dev_read(struct kioc + return fuse_dev_do_read(fc, file, &cs, iov_length(iov, nr_segs)); } +EXPORT_SYMBOL_GPL(fuse_dev_read); + - static int fuse_notify_poll(struct fuse_conn *fc, unsigned int size, - struct fuse_copy_state *cs) + static int fuse_dev_pipe_buf_steal(struct pipe_inode_info *pipe, + struct pipe_buffer *buf) { -@@ -987,7 +989,7 @@ static int copy_out_args(struct fuse_cop - * it from the list and copy the rest of the buffer to the request. - * The request is finished by calling request_end() - */ +@@ -1088,7 +1090,7 @@ static ssize_t fuse_dev_splice_read(stru + ret = 0; + pipe_lock(pipe); + +- if (!pipe->readers) { ++ if (!atomic_read(&pipe->readers)) { + send_sig(SIGPIPE, current, 0); + if (!ret) + ret = -EPIPE; +@@ -1387,7 +1389,7 @@ static ssize_t fuse_dev_do_write(struct + return err; + } + -static ssize_t fuse_dev_write(struct kiocb *iocb, const struct iovec *iov, +ssize_t fuse_dev_write(struct kiocb *iocb, const struct iovec *iov, - unsigned long nr_segs, loff_t pos) + unsigned long nr_segs, loff_t pos) { - int err; -@@ -1084,7 +1086,9 @@ static ssize_t fuse_dev_write(struct kio - return err; + struct fuse_copy_state cs; +@@ -1400,6 +1402,8 @@ static ssize_t fuse_dev_write(struct kio + return fuse_dev_do_write(fc, &cs, iov_length(iov, nr_segs)); } --static unsigned fuse_dev_poll(struct file *file, poll_table *wait) +EXPORT_SYMBOL_GPL(fuse_dev_write); + + static ssize_t fuse_dev_splice_write(struct pipe_inode_info *pipe, + struct file *out, loff_t *ppos, + size_t len, unsigned int flags) +@@ -1478,7 +1482,7 @@ out: + return ret; + } + +-static unsigned fuse_dev_poll(struct file *file, poll_table *wait) +unsigned fuse_dev_poll(struct file *file, poll_table *wait) { unsigned mask = POLLOUT | POLLWRNORM; struct fuse_conn *fc = fuse_get_conn(file); -@@ -1103,6 +1107,8 @@ static unsigned fuse_dev_poll(struct fil +@@ -1497,6 +1501,8 @@ static unsigned fuse_dev_poll(struct fil return mask; } @@ -30231,7 +31167,7 @@ diff -urNp linux-2.6.34.1/fs/fuse/dev.c linux-2.6.34.1/fs/fuse/dev.c /* * Abort all requests on the given list (pending or processing) * -@@ -1210,7 +1216,7 @@ int fuse_dev_release(struct inode *inode +@@ -1604,7 +1610,7 @@ int fuse_dev_release(struct inode *inode } EXPORT_SYMBOL_GPL(fuse_dev_release); @@ -30240,7 +31176,7 @@ diff -urNp linux-2.6.34.1/fs/fuse/dev.c linux-2.6.34.1/fs/fuse/dev.c { struct fuse_conn *fc = fuse_get_conn(file); if (!fc) -@@ -1220,6 +1226,8 @@ static int fuse_dev_fasync(int fd, struc +@@ -1614,6 +1620,8 @@ static int fuse_dev_fasync(int fd, struc return fasync_helper(fd, file, on, &fc->fasync); } @@ -30249,9 +31185,9 @@ diff -urNp linux-2.6.34.1/fs/fuse/dev.c linux-2.6.34.1/fs/fuse/dev.c const struct file_operations fuse_dev_operations = { .owner = THIS_MODULE, .llseek = no_llseek, -diff -urNp linux-2.6.34.1/fs/fuse/dir.c linux-2.6.34.1/fs/fuse/dir.c ---- linux-2.6.34.1/fs/fuse/dir.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/fuse/dir.c 2010-07-07 09:04:55.000000000 -0400 +diff -urNp linux-2.6.35.4/fs/fuse/dir.c linux-2.6.35.4/fs/fuse/dir.c +--- linux-2.6.35.4/fs/fuse/dir.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/fuse/dir.c 2010-09-17 20:12:09.000000000 -0400 @@ -1127,7 +1127,7 @@ static char *read_link(struct dentry *de return link; } @@ -30261,10 +31197,10 @@ diff -urNp linux-2.6.34.1/fs/fuse/dir.c linux-2.6.34.1/fs/fuse/dir.c { if (!IS_ERR(link)) free_page((unsigned long) link); -diff -urNp linux-2.6.34.1/fs/fuse/fuse_i.h linux-2.6.34.1/fs/fuse/fuse_i.h ---- linux-2.6.34.1/fs/fuse/fuse_i.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/fuse/fuse_i.h 2010-07-07 09:04:55.000000000 -0400 -@@ -521,6 +521,16 @@ extern const struct file_operations fuse +diff -urNp linux-2.6.35.4/fs/fuse/fuse_i.h linux-2.6.35.4/fs/fuse/fuse_i.h +--- linux-2.6.35.4/fs/fuse/fuse_i.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/fuse/fuse_i.h 2010-09-17 20:12:09.000000000 -0400 +@@ -524,6 +524,16 @@ extern const struct file_operations fuse extern const struct dentry_operations fuse_dentry_operations; @@ -30281,9 +31217,9 @@ diff -urNp linux-2.6.34.1/fs/fuse/fuse_i.h linux-2.6.34.1/fs/fuse/fuse_i.h /** * Inode to nodeid comparison. */ -diff -urNp linux-2.6.34.1/fs/hfs/inode.c linux-2.6.34.1/fs/hfs/inode.c ---- linux-2.6.34.1/fs/hfs/inode.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/hfs/inode.c 2010-07-07 09:04:55.000000000 -0400 +diff -urNp linux-2.6.35.4/fs/hfs/inode.c linux-2.6.35.4/fs/hfs/inode.c +--- linux-2.6.35.4/fs/hfs/inode.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/hfs/inode.c 2010-09-17 20:12:09.000000000 -0400 @@ -423,7 +423,7 @@ int hfs_write_inode(struct inode *inode, if (S_ISDIR(main_inode->i_mode)) { @@ -30302,9 +31238,9 @@ diff -urNp linux-2.6.34.1/fs/hfs/inode.c linux-2.6.34.1/fs/hfs/inode.c hfs_bnode_read(fd.bnode, &rec, fd.entryoffset, sizeof(struct hfs_cat_file)); if (rec.type != HFS_CDR_FIL || -diff -urNp linux-2.6.34.1/fs/hfsplus/inode.c linux-2.6.34.1/fs/hfsplus/inode.c ---- linux-2.6.34.1/fs/hfsplus/inode.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/hfsplus/inode.c 2010-07-07 09:04:55.000000000 -0400 +diff -urNp linux-2.6.35.4/fs/hfsplus/inode.c linux-2.6.35.4/fs/hfsplus/inode.c +--- linux-2.6.35.4/fs/hfsplus/inode.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/hfsplus/inode.c 2010-09-17 20:12:09.000000000 -0400 @@ -406,7 +406,7 @@ int hfsplus_cat_read_inode(struct inode struct hfsplus_cat_folder *folder = &entry.folder; @@ -30341,9 +31277,9 @@ diff -urNp linux-2.6.34.1/fs/hfsplus/inode.c linux-2.6.34.1/fs/hfsplus/inode.c hfs_bnode_read(fd.bnode, &entry, fd.entryoffset, sizeof(struct hfsplus_cat_file)); hfsplus_inode_write_fork(inode, &file->data_fork); -diff -urNp linux-2.6.34.1/fs/hugetlbfs/inode.c linux-2.6.34.1/fs/hugetlbfs/inode.c ---- linux-2.6.34.1/fs/hugetlbfs/inode.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/hugetlbfs/inode.c 2010-07-07 09:04:55.000000000 -0400 +diff -urNp linux-2.6.35.4/fs/hugetlbfs/inode.c linux-2.6.35.4/fs/hugetlbfs/inode.c +--- linux-2.6.35.4/fs/hugetlbfs/inode.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/hugetlbfs/inode.c 2010-09-17 20:12:37.000000000 -0400 @@ -908,7 +908,7 @@ static struct file_system_type hugetlbfs .kill_sb = kill_litter_super, }; @@ -30353,9 +31289,9 @@ diff -urNp linux-2.6.34.1/fs/hugetlbfs/inode.c linux-2.6.34.1/fs/hugetlbfs/inode static int can_do_hugetlb_shm(void) { -diff -urNp linux-2.6.34.1/fs/ioctl.c linux-2.6.34.1/fs/ioctl.c ---- linux-2.6.34.1/fs/ioctl.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/ioctl.c 2010-07-07 09:04:55.000000000 -0400 +diff -urNp linux-2.6.35.4/fs/ioctl.c linux-2.6.35.4/fs/ioctl.c +--- linux-2.6.35.4/fs/ioctl.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/ioctl.c 2010-09-17 20:12:09.000000000 -0400 @@ -97,7 +97,7 @@ int fiemap_fill_next_extent(struct fiema u64 phys, u64 len, u32 flags) { @@ -30383,9 +31319,9 @@ diff -urNp linux-2.6.34.1/fs/ioctl.c linux-2.6.34.1/fs/ioctl.c error = -EFAULT; return error; -diff -urNp linux-2.6.34.1/fs/jffs2/debug.h linux-2.6.34.1/fs/jffs2/debug.h ---- linux-2.6.34.1/fs/jffs2/debug.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/jffs2/debug.h 2010-07-07 09:04:55.000000000 -0400 +diff -urNp linux-2.6.35.4/fs/jffs2/debug.h linux-2.6.35.4/fs/jffs2/debug.h +--- linux-2.6.35.4/fs/jffs2/debug.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/jffs2/debug.h 2010-09-17 20:12:09.000000000 -0400 @@ -52,13 +52,13 @@ #if CONFIG_JFFS2_FS_DEBUG > 0 #define D1(x) x @@ -30487,10 +31423,10 @@ diff -urNp linux-2.6.34.1/fs/jffs2/debug.h linux-2.6.34.1/fs/jffs2/debug.h #endif /* "Sanity" checks */ -diff -urNp linux-2.6.34.1/fs/jffs2/erase.c linux-2.6.34.1/fs/jffs2/erase.c ---- linux-2.6.34.1/fs/jffs2/erase.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/jffs2/erase.c 2010-07-07 09:04:55.000000000 -0400 -@@ -434,7 +434,8 @@ static void jffs2_mark_erased_block(stru +diff -urNp linux-2.6.35.4/fs/jffs2/erase.c linux-2.6.35.4/fs/jffs2/erase.c +--- linux-2.6.35.4/fs/jffs2/erase.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/jffs2/erase.c 2010-09-17 20:12:09.000000000 -0400 +@@ -438,7 +438,8 @@ static void jffs2_mark_erased_block(stru struct jffs2_unknown_node marker = { .magic = cpu_to_je16(JFFS2_MAGIC_BITMASK), .nodetype = cpu_to_je16(JFFS2_NODETYPE_CLEANMARKER), @@ -30500,9 +31436,9 @@ diff -urNp linux-2.6.34.1/fs/jffs2/erase.c linux-2.6.34.1/fs/jffs2/erase.c }; jffs2_prealloc_raw_node_refs(c, jeb, 1); -diff -urNp linux-2.6.34.1/fs/jffs2/summary.h linux-2.6.34.1/fs/jffs2/summary.h ---- linux-2.6.34.1/fs/jffs2/summary.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/jffs2/summary.h 2010-07-07 09:04:55.000000000 -0400 +diff -urNp linux-2.6.35.4/fs/jffs2/summary.h linux-2.6.35.4/fs/jffs2/summary.h +--- linux-2.6.35.4/fs/jffs2/summary.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/jffs2/summary.h 2010-09-17 20:12:09.000000000 -0400 @@ -194,18 +194,18 @@ int jffs2_sum_scan_sumnode(struct jffs2_ #define jffs2_sum_active() (0) @@ -30531,9 +31467,9 @@ diff -urNp linux-2.6.34.1/fs/jffs2/summary.h linux-2.6.34.1/fs/jffs2/summary.h #define jffs2_sum_scan_sumnode(a,b,c,d,e) (0) #endif /* CONFIG_JFFS2_SUMMARY */ -diff -urNp linux-2.6.34.1/fs/jffs2/wbuf.c linux-2.6.34.1/fs/jffs2/wbuf.c ---- linux-2.6.34.1/fs/jffs2/wbuf.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/jffs2/wbuf.c 2010-07-07 09:04:55.000000000 -0400 +diff -urNp linux-2.6.35.4/fs/jffs2/wbuf.c linux-2.6.35.4/fs/jffs2/wbuf.c +--- linux-2.6.35.4/fs/jffs2/wbuf.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/jffs2/wbuf.c 2010-09-17 20:12:09.000000000 -0400 @@ -1012,7 +1012,8 @@ static const struct jffs2_unknown_node o { .magic = constant_cpu_to_je16(JFFS2_MAGIC_BITMASK), @@ -30544,9 +31480,9 @@ diff -urNp linux-2.6.34.1/fs/jffs2/wbuf.c linux-2.6.34.1/fs/jffs2/wbuf.c }; /* -diff -urNp linux-2.6.34.1/fs/lockd/svc.c linux-2.6.34.1/fs/lockd/svc.c ---- linux-2.6.34.1/fs/lockd/svc.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/lockd/svc.c 2010-07-07 09:04:55.000000000 -0400 +diff -urNp linux-2.6.35.4/fs/lockd/svc.c linux-2.6.35.4/fs/lockd/svc.c +--- linux-2.6.35.4/fs/lockd/svc.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/lockd/svc.c 2010-09-17 20:12:09.000000000 -0400 @@ -42,7 +42,7 @@ static struct svc_program nlmsvc_program; @@ -30556,9 +31492,9 @@ diff -urNp linux-2.6.34.1/fs/lockd/svc.c linux-2.6.34.1/fs/lockd/svc.c EXPORT_SYMBOL_GPL(nlmsvc_ops); static DEFINE_MUTEX(nlmsvc_mutex); -diff -urNp linux-2.6.34.1/fs/locks.c linux-2.6.34.1/fs/locks.c ---- linux-2.6.34.1/fs/locks.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/locks.c 2010-07-07 09:04:55.000000000 -0400 +diff -urNp linux-2.6.35.4/fs/locks.c linux-2.6.35.4/fs/locks.c +--- linux-2.6.35.4/fs/locks.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/locks.c 2010-09-17 20:12:09.000000000 -0400 @@ -2008,16 +2008,16 @@ void locks_remove_flock(struct file *fil return; @@ -30580,10 +31516,10 @@ diff -urNp linux-2.6.34.1/fs/locks.c linux-2.6.34.1/fs/locks.c } lock_kernel(); -diff -urNp linux-2.6.34.1/fs/namei.c linux-2.6.34.1/fs/namei.c ---- linux-2.6.34.1/fs/namei.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/namei.c 2010-07-07 09:04:55.000000000 -0400 -@@ -547,7 +547,7 @@ __do_follow_link(struct path *path, stru +diff -urNp linux-2.6.35.4/fs/namei.c linux-2.6.35.4/fs/namei.c +--- linux-2.6.35.4/fs/namei.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/namei.c 2010-09-17 20:12:37.000000000 -0400 +@@ -548,7 +548,7 @@ __do_follow_link(struct path *path, stru *p = dentry->d_inode->i_op->follow_link(dentry, nd); error = PTR_ERR(*p); if (!IS_ERR(*p)) { @@ -30592,7 +31528,7 @@ diff -urNp linux-2.6.34.1/fs/namei.c linux-2.6.34.1/fs/namei.c error = 0; if (s) error = __vfs_follow_link(nd, s); -@@ -580,6 +580,13 @@ static inline int do_follow_link(struct +@@ -581,6 +581,13 @@ static inline int do_follow_link(struct err = security_inode_follow_link(path->dentry, nd); if (err) goto loop; @@ -30606,7 +31542,7 @@ diff -urNp linux-2.6.34.1/fs/namei.c linux-2.6.34.1/fs/namei.c current->link_count++; current->total_link_count++; nd->depth++; -@@ -964,11 +971,18 @@ return_reval: +@@ -965,11 +972,18 @@ return_reval: break; } return_base: @@ -30625,7 +31561,7 @@ diff -urNp linux-2.6.34.1/fs/namei.c linux-2.6.34.1/fs/namei.c path_put(&nd->path); return_err: return err; -@@ -1505,12 +1519,19 @@ static int __open_namei_create(struct na +@@ -1506,12 +1520,19 @@ static int __open_namei_create(struct na int error; struct dentry *dir = nd->path.dentry; @@ -30645,7 +31581,7 @@ diff -urNp linux-2.6.34.1/fs/namei.c linux-2.6.34.1/fs/namei.c out_unlock: mutex_unlock(&dir->d_inode->i_mutex); dput(nd->path.dentry); -@@ -1613,6 +1634,7 @@ static struct file *do_last(struct namei +@@ -1614,6 +1635,7 @@ static struct file *do_last(struct namei int mode, const char *pathname) { struct dentry *dir = nd->path.dentry; @@ -30653,7 +31589,7 @@ diff -urNp linux-2.6.34.1/fs/namei.c linux-2.6.34.1/fs/namei.c struct file *filp; int error = -EISDIR; -@@ -1661,6 +1683,22 @@ static struct file *do_last(struct namei +@@ -1662,6 +1684,22 @@ static struct file *do_last(struct namei } path_to_nameidata(path, nd); audit_inode(pathname, nd->path.dentry); @@ -30676,7 +31612,7 @@ diff -urNp linux-2.6.34.1/fs/namei.c linux-2.6.34.1/fs/namei.c goto ok; } -@@ -1713,6 +1751,24 @@ static struct file *do_last(struct namei +@@ -1714,6 +1752,24 @@ static struct file *do_last(struct namei /* * It already exists. */ @@ -30701,7 +31637,7 @@ diff -urNp linux-2.6.34.1/fs/namei.c linux-2.6.34.1/fs/namei.c mutex_unlock(&dir->d_inode->i_mutex); audit_inode(pathname, path->dentry); -@@ -2033,6 +2089,17 @@ SYSCALL_DEFINE4(mknodat, int, dfd, const +@@ -2034,6 +2090,17 @@ SYSCALL_DEFINE4(mknodat, int, dfd, const error = may_mknod(mode); if (error) goto out_dput; @@ -30719,7 +31655,7 @@ diff -urNp linux-2.6.34.1/fs/namei.c linux-2.6.34.1/fs/namei.c error = mnt_want_write(nd.path.mnt); if (error) goto out_dput; -@@ -2053,6 +2120,9 @@ SYSCALL_DEFINE4(mknodat, int, dfd, const +@@ -2054,6 +2121,9 @@ SYSCALL_DEFINE4(mknodat, int, dfd, const } out_drop_write: mnt_drop_write(nd.path.mnt); @@ -30729,7 +31665,7 @@ diff -urNp linux-2.6.34.1/fs/namei.c linux-2.6.34.1/fs/namei.c out_dput: dput(dentry); out_unlock: -@@ -2105,6 +2175,11 @@ SYSCALL_DEFINE3(mkdirat, int, dfd, const +@@ -2106,6 +2176,11 @@ SYSCALL_DEFINE3(mkdirat, int, dfd, const if (IS_ERR(dentry)) goto out_unlock; @@ -30741,7 +31677,7 @@ diff -urNp linux-2.6.34.1/fs/namei.c linux-2.6.34.1/fs/namei.c if (!IS_POSIXACL(nd.path.dentry->d_inode)) mode &= ~current_umask(); error = mnt_want_write(nd.path.mnt); -@@ -2116,6 +2191,10 @@ SYSCALL_DEFINE3(mkdirat, int, dfd, const +@@ -2117,6 +2192,10 @@ SYSCALL_DEFINE3(mkdirat, int, dfd, const error = vfs_mkdir(nd.path.dentry->d_inode, dentry, mode); out_drop_write: mnt_drop_write(nd.path.mnt); @@ -30752,7 +31688,7 @@ diff -urNp linux-2.6.34.1/fs/namei.c linux-2.6.34.1/fs/namei.c out_dput: dput(dentry); out_unlock: -@@ -2197,6 +2276,8 @@ static long do_rmdir(int dfd, const char +@@ -2198,6 +2277,8 @@ static long do_rmdir(int dfd, const char char * name; struct dentry *dentry; struct nameidata nd; @@ -30761,7 +31697,7 @@ diff -urNp linux-2.6.34.1/fs/namei.c linux-2.6.34.1/fs/namei.c error = user_path_parent(dfd, pathname, &nd, &name); if (error) -@@ -2221,6 +2302,19 @@ static long do_rmdir(int dfd, const char +@@ -2222,6 +2303,19 @@ static long do_rmdir(int dfd, const char error = PTR_ERR(dentry); if (IS_ERR(dentry)) goto exit2; @@ -30781,7 +31717,7 @@ diff -urNp linux-2.6.34.1/fs/namei.c linux-2.6.34.1/fs/namei.c error = mnt_want_write(nd.path.mnt); if (error) goto exit3; -@@ -2228,6 +2322,8 @@ static long do_rmdir(int dfd, const char +@@ -2229,6 +2323,8 @@ static long do_rmdir(int dfd, const char if (error) goto exit4; error = vfs_rmdir(nd.path.dentry->d_inode, dentry); @@ -30790,7 +31726,7 @@ diff -urNp linux-2.6.34.1/fs/namei.c linux-2.6.34.1/fs/namei.c exit4: mnt_drop_write(nd.path.mnt); exit3: -@@ -2290,6 +2386,8 @@ static long do_unlinkat(int dfd, const c +@@ -2291,6 +2387,8 @@ static long do_unlinkat(int dfd, const c struct dentry *dentry; struct nameidata nd; struct inode *inode = NULL; @@ -30799,7 +31735,7 @@ diff -urNp linux-2.6.34.1/fs/namei.c linux-2.6.34.1/fs/namei.c error = user_path_parent(dfd, pathname, &nd, &name); if (error) -@@ -2309,8 +2407,19 @@ static long do_unlinkat(int dfd, const c +@@ -2310,8 +2408,19 @@ static long do_unlinkat(int dfd, const c if (nd.last.name[nd.last.len]) goto slashes; inode = dentry->d_inode; @@ -30820,7 +31756,7 @@ diff -urNp linux-2.6.34.1/fs/namei.c linux-2.6.34.1/fs/namei.c error = mnt_want_write(nd.path.mnt); if (error) goto exit2; -@@ -2318,6 +2427,8 @@ static long do_unlinkat(int dfd, const c +@@ -2319,6 +2428,8 @@ static long do_unlinkat(int dfd, const c if (error) goto exit3; error = vfs_unlink(nd.path.dentry->d_inode, dentry); @@ -30829,7 +31765,7 @@ diff -urNp linux-2.6.34.1/fs/namei.c linux-2.6.34.1/fs/namei.c exit3: mnt_drop_write(nd.path.mnt); exit2: -@@ -2395,6 +2506,11 @@ SYSCALL_DEFINE3(symlinkat, const char __ +@@ -2396,6 +2507,11 @@ SYSCALL_DEFINE3(symlinkat, const char __ if (IS_ERR(dentry)) goto out_unlock; @@ -30841,7 +31777,7 @@ diff -urNp linux-2.6.34.1/fs/namei.c linux-2.6.34.1/fs/namei.c error = mnt_want_write(nd.path.mnt); if (error) goto out_dput; -@@ -2402,6 +2518,8 @@ SYSCALL_DEFINE3(symlinkat, const char __ +@@ -2403,6 +2519,8 @@ SYSCALL_DEFINE3(symlinkat, const char __ if (error) goto out_drop_write; error = vfs_symlink(nd.path.dentry->d_inode, dentry, from); @@ -30850,7 +31786,7 @@ diff -urNp linux-2.6.34.1/fs/namei.c linux-2.6.34.1/fs/namei.c out_drop_write: mnt_drop_write(nd.path.mnt); out_dput: -@@ -2494,6 +2612,20 @@ SYSCALL_DEFINE5(linkat, int, olddfd, con +@@ -2495,6 +2613,20 @@ SYSCALL_DEFINE5(linkat, int, olddfd, con error = PTR_ERR(new_dentry); if (IS_ERR(new_dentry)) goto out_unlock; @@ -30871,7 +31807,7 @@ diff -urNp linux-2.6.34.1/fs/namei.c linux-2.6.34.1/fs/namei.c error = mnt_want_write(nd.path.mnt); if (error) goto out_dput; -@@ -2501,6 +2633,8 @@ SYSCALL_DEFINE5(linkat, int, olddfd, con +@@ -2502,6 +2634,8 @@ SYSCALL_DEFINE5(linkat, int, olddfd, con if (error) goto out_drop_write; error = vfs_link(old_path.dentry, nd.path.dentry->d_inode, new_dentry); @@ -30880,7 +31816,7 @@ diff -urNp linux-2.6.34.1/fs/namei.c linux-2.6.34.1/fs/namei.c out_drop_write: mnt_drop_write(nd.path.mnt); out_dput: -@@ -2734,6 +2868,12 @@ SYSCALL_DEFINE4(renameat, int, olddfd, c +@@ -2735,6 +2869,12 @@ SYSCALL_DEFINE4(renameat, int, olddfd, c if (new_dentry == trap) goto exit5; @@ -30893,7 +31829,7 @@ diff -urNp linux-2.6.34.1/fs/namei.c linux-2.6.34.1/fs/namei.c error = mnt_want_write(oldnd.path.mnt); if (error) goto exit5; -@@ -2743,6 +2883,9 @@ SYSCALL_DEFINE4(renameat, int, olddfd, c +@@ -2744,6 +2884,9 @@ SYSCALL_DEFINE4(renameat, int, olddfd, c goto exit6; error = vfs_rename(old_dir->d_inode, old_dentry, new_dir->d_inode, new_dentry); @@ -30903,10 +31839,10 @@ diff -urNp linux-2.6.34.1/fs/namei.c linux-2.6.34.1/fs/namei.c exit6: mnt_drop_write(oldnd.path.mnt); exit5: -diff -urNp linux-2.6.34.1/fs/namespace.c linux-2.6.34.1/fs/namespace.c ---- linux-2.6.34.1/fs/namespace.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/namespace.c 2010-07-07 09:04:55.000000000 -0400 -@@ -1100,6 +1100,9 @@ static int do_umount(struct vfsmount *mn +diff -urNp linux-2.6.35.4/fs/namespace.c linux-2.6.35.4/fs/namespace.c +--- linux-2.6.35.4/fs/namespace.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/namespace.c 2010-09-17 20:21:58.000000000 -0400 +@@ -1099,6 +1099,9 @@ static int do_umount(struct vfsmount *mn if (!(sb->s_flags & MS_RDONLY)) retval = do_remount_sb(sb, MS_RDONLY, NULL, 0); up_write(&sb->s_umount); @@ -30916,8 +31852,8 @@ diff -urNp linux-2.6.34.1/fs/namespace.c linux-2.6.34.1/fs/namespace.c return retval; } -@@ -1121,6 +1124,9 @@ static int do_umount(struct vfsmount *mn - security_sb_umount_busy(mnt); +@@ -1118,6 +1121,9 @@ static int do_umount(struct vfsmount *mn + spin_unlock(&vfsmount_lock); up_write(&namespace_sem); release_mounts(&umount_list); + @@ -30926,7 +31862,7 @@ diff -urNp linux-2.6.34.1/fs/namespace.c linux-2.6.34.1/fs/namespace.c return retval; } -@@ -2000,6 +2006,16 @@ long do_mount(char *dev_name, char *dir_ +@@ -1988,6 +1994,16 @@ long do_mount(char *dev_name, char *dir_ MS_NOATIME | MS_NODIRATIME | MS_RELATIME| MS_KERNMOUNT | MS_STRICTATIME); @@ -30943,7 +31879,7 @@ diff -urNp linux-2.6.34.1/fs/namespace.c linux-2.6.34.1/fs/namespace.c if (flags & MS_REMOUNT) retval = do_remount(&path, flags & ~MS_REMOUNT, mnt_flags, data_page); -@@ -2014,6 +2030,9 @@ long do_mount(char *dev_name, char *dir_ +@@ -2002,6 +2018,9 @@ long do_mount(char *dev_name, char *dir_ dev_name, data_page); dput_out: path_put(&path); @@ -30953,7 +31889,7 @@ diff -urNp linux-2.6.34.1/fs/namespace.c linux-2.6.34.1/fs/namespace.c return retval; } -@@ -2220,6 +2239,12 @@ SYSCALL_DEFINE2(pivot_root, const char _ +@@ -2208,6 +2227,12 @@ SYSCALL_DEFINE2(pivot_root, const char _ goto out1; } @@ -30966,10 +31902,10 @@ diff -urNp linux-2.6.34.1/fs/namespace.c linux-2.6.34.1/fs/namespace.c read_lock(¤t->fs->lock); root = current->fs->root; path_get(¤t->fs->root); -diff -urNp linux-2.6.34.1/fs/nfs/inode.c linux-2.6.34.1/fs/nfs/inode.c ---- linux-2.6.34.1/fs/nfs/inode.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/nfs/inode.c 2010-07-07 09:04:55.000000000 -0400 -@@ -897,16 +897,16 @@ static int nfs_size_need_update(const st +diff -urNp linux-2.6.35.4/fs/nfs/inode.c linux-2.6.35.4/fs/nfs/inode.c +--- linux-2.6.35.4/fs/nfs/inode.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/nfs/inode.c 2010-09-17 20:12:09.000000000 -0400 +@@ -915,16 +915,16 @@ static int nfs_size_need_update(const st return nfs_size_to_loff_t(fattr->size) > i_size_read(inode); } @@ -30989,10 +31925,10 @@ diff -urNp linux-2.6.34.1/fs/nfs/inode.c linux-2.6.34.1/fs/nfs/inode.c } void nfs_fattr_init(struct nfs_fattr *fattr) -diff -urNp linux-2.6.34.1/fs/nfs/nfs4proc.c linux-2.6.34.1/fs/nfs/nfs4proc.c ---- linux-2.6.34.1/fs/nfs/nfs4proc.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/nfs/nfs4proc.c 2010-07-07 09:04:55.000000000 -0400 -@@ -1162,7 +1162,7 @@ static int _nfs4_do_open_reclaim(struct +diff -urNp linux-2.6.35.4/fs/nfs/nfs4proc.c linux-2.6.35.4/fs/nfs/nfs4proc.c +--- linux-2.6.35.4/fs/nfs/nfs4proc.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/nfs/nfs4proc.c 2010-09-17 20:12:09.000000000 -0400 +@@ -1166,7 +1166,7 @@ static int _nfs4_do_open_reclaim(struct static int nfs4_do_open_reclaim(struct nfs_open_context *ctx, struct nfs4_state *state) { struct nfs_server *server = NFS_SERVER(state->inode); @@ -31001,7 +31937,7 @@ diff -urNp linux-2.6.34.1/fs/nfs/nfs4proc.c linux-2.6.34.1/fs/nfs/nfs4proc.c int err; do { err = _nfs4_do_open_reclaim(ctx, state); -@@ -1204,7 +1204,7 @@ static int _nfs4_open_delegation_recall( +@@ -1208,7 +1208,7 @@ static int _nfs4_open_delegation_recall( int nfs4_open_delegation_recall(struct nfs_open_context *ctx, struct nfs4_state *state, const nfs4_stateid *stateid) { @@ -31010,7 +31946,7 @@ diff -urNp linux-2.6.34.1/fs/nfs/nfs4proc.c linux-2.6.34.1/fs/nfs/nfs4proc.c struct nfs_server *server = NFS_SERVER(state->inode); int err; do { -@@ -1577,7 +1577,7 @@ static int _nfs4_open_expired(struct nfs +@@ -1581,7 +1581,7 @@ static int _nfs4_open_expired(struct nfs static int nfs4_do_open_expired(struct nfs_open_context *ctx, struct nfs4_state *state) { struct nfs_server *server = NFS_SERVER(state->inode); @@ -31019,7 +31955,7 @@ diff -urNp linux-2.6.34.1/fs/nfs/nfs4proc.c linux-2.6.34.1/fs/nfs/nfs4proc.c int err; do { -@@ -1684,7 +1684,7 @@ out_err: +@@ -1697,7 +1697,7 @@ out_err: static struct nfs4_state *nfs4_do_open(struct inode *dir, struct path *path, fmode_t fmode, int flags, struct iattr *sattr, struct rpc_cred *cred) { @@ -31028,7 +31964,7 @@ diff -urNp linux-2.6.34.1/fs/nfs/nfs4proc.c linux-2.6.34.1/fs/nfs/nfs4proc.c struct nfs4_state *res; int status; -@@ -1775,7 +1775,7 @@ static int nfs4_do_setattr(struct inode +@@ -1788,7 +1788,7 @@ static int nfs4_do_setattr(struct inode struct nfs4_state *state) { struct nfs_server *server = NFS_SERVER(inode); @@ -31037,7 +31973,7 @@ diff -urNp linux-2.6.34.1/fs/nfs/nfs4proc.c linux-2.6.34.1/fs/nfs/nfs4proc.c int err; do { err = nfs4_handle_exception(server, -@@ -2151,7 +2151,7 @@ static int _nfs4_server_capabilities(str +@@ -2166,7 +2166,7 @@ static int _nfs4_server_capabilities(str int nfs4_server_capabilities(struct nfs_server *server, struct nfs_fh *fhandle) { @@ -31046,7 +31982,7 @@ diff -urNp linux-2.6.34.1/fs/nfs/nfs4proc.c linux-2.6.34.1/fs/nfs/nfs4proc.c int err; do { err = nfs4_handle_exception(server, -@@ -2185,7 +2185,7 @@ static int _nfs4_lookup_root(struct nfs_ +@@ -2200,7 +2200,7 @@ static int _nfs4_lookup_root(struct nfs_ static int nfs4_lookup_root(struct nfs_server *server, struct nfs_fh *fhandle, struct nfs_fsinfo *info) { @@ -31055,7 +31991,7 @@ diff -urNp linux-2.6.34.1/fs/nfs/nfs4proc.c linux-2.6.34.1/fs/nfs/nfs4proc.c int err; do { err = nfs4_handle_exception(server, -@@ -2274,7 +2274,7 @@ static int _nfs4_proc_getattr(struct nfs +@@ -2289,7 +2289,7 @@ static int _nfs4_proc_getattr(struct nfs static int nfs4_proc_getattr(struct nfs_server *server, struct nfs_fh *fhandle, struct nfs_fattr *fattr) { @@ -31064,7 +32000,7 @@ diff -urNp linux-2.6.34.1/fs/nfs/nfs4proc.c linux-2.6.34.1/fs/nfs/nfs4proc.c int err; do { err = nfs4_handle_exception(server, -@@ -2362,7 +2362,7 @@ static int nfs4_proc_lookupfh(struct nfs +@@ -2377,7 +2377,7 @@ static int nfs4_proc_lookupfh(struct nfs struct qstr *name, struct nfs_fh *fhandle, struct nfs_fattr *fattr) { @@ -31073,7 +32009,7 @@ diff -urNp linux-2.6.34.1/fs/nfs/nfs4proc.c linux-2.6.34.1/fs/nfs/nfs4proc.c int err; do { err = _nfs4_proc_lookupfh(server, dirfh, name, fhandle, fattr); -@@ -2391,7 +2391,7 @@ static int _nfs4_proc_lookup(struct inod +@@ -2406,7 +2406,7 @@ static int _nfs4_proc_lookup(struct inod static int nfs4_proc_lookup(struct inode *dir, struct qstr *name, struct nfs_fh *fhandle, struct nfs_fattr *fattr) { @@ -31082,7 +32018,7 @@ diff -urNp linux-2.6.34.1/fs/nfs/nfs4proc.c linux-2.6.34.1/fs/nfs/nfs4proc.c int err; do { err = nfs4_handle_exception(NFS_SERVER(dir), -@@ -2455,7 +2455,7 @@ static int _nfs4_proc_access(struct inod +@@ -2473,7 +2473,7 @@ static int _nfs4_proc_access(struct inod static int nfs4_proc_access(struct inode *inode, struct nfs_access_entry *entry) { @@ -31091,7 +32027,7 @@ diff -urNp linux-2.6.34.1/fs/nfs/nfs4proc.c linux-2.6.34.1/fs/nfs/nfs4proc.c int err; do { err = nfs4_handle_exception(NFS_SERVER(inode), -@@ -2511,7 +2511,7 @@ static int _nfs4_proc_readlink(struct in +@@ -2529,7 +2529,7 @@ static int _nfs4_proc_readlink(struct in static int nfs4_proc_readlink(struct inode *inode, struct page *page, unsigned int pgbase, unsigned int pglen) { @@ -31100,7 +32036,7 @@ diff -urNp linux-2.6.34.1/fs/nfs/nfs4proc.c linux-2.6.34.1/fs/nfs/nfs4proc.c int err; do { err = nfs4_handle_exception(NFS_SERVER(inode), -@@ -2609,7 +2609,7 @@ static int _nfs4_proc_remove(struct inod +@@ -2625,7 +2625,7 @@ out: static int nfs4_proc_remove(struct inode *dir, struct qstr *name) { @@ -31109,7 +32045,7 @@ diff -urNp linux-2.6.34.1/fs/nfs/nfs4proc.c linux-2.6.34.1/fs/nfs/nfs4proc.c int err; do { err = nfs4_handle_exception(NFS_SERVER(dir), -@@ -2682,7 +2682,7 @@ static int _nfs4_proc_rename(struct inod +@@ -2700,7 +2700,7 @@ out: static int nfs4_proc_rename(struct inode *old_dir, struct qstr *old_name, struct inode *new_dir, struct qstr *new_name) { @@ -31118,7 +32054,7 @@ diff -urNp linux-2.6.34.1/fs/nfs/nfs4proc.c linux-2.6.34.1/fs/nfs/nfs4proc.c int err; do { err = nfs4_handle_exception(NFS_SERVER(old_dir), -@@ -2729,7 +2729,7 @@ static int _nfs4_proc_link(struct inode +@@ -2749,7 +2749,7 @@ out: static int nfs4_proc_link(struct inode *inode, struct inode *dir, struct qstr *name) { @@ -31127,7 +32063,7 @@ diff -urNp linux-2.6.34.1/fs/nfs/nfs4proc.c linux-2.6.34.1/fs/nfs/nfs4proc.c int err; do { err = nfs4_handle_exception(NFS_SERVER(inode), -@@ -2821,7 +2821,7 @@ out: +@@ -2841,7 +2841,7 @@ out: static int nfs4_proc_symlink(struct inode *dir, struct dentry *dentry, struct page *page, unsigned int len, struct iattr *sattr) { @@ -31136,7 +32072,7 @@ diff -urNp linux-2.6.34.1/fs/nfs/nfs4proc.c linux-2.6.34.1/fs/nfs/nfs4proc.c int err; do { err = nfs4_handle_exception(NFS_SERVER(dir), -@@ -2852,7 +2852,7 @@ out: +@@ -2872,7 +2872,7 @@ out: static int nfs4_proc_mkdir(struct inode *dir, struct dentry *dentry, struct iattr *sattr) { @@ -31145,7 +32081,7 @@ diff -urNp linux-2.6.34.1/fs/nfs/nfs4proc.c linux-2.6.34.1/fs/nfs/nfs4proc.c int err; do { err = nfs4_handle_exception(NFS_SERVER(dir), -@@ -2901,7 +2901,7 @@ static int _nfs4_proc_readdir(struct den +@@ -2921,7 +2921,7 @@ static int _nfs4_proc_readdir(struct den static int nfs4_proc_readdir(struct dentry *dentry, struct rpc_cred *cred, u64 cookie, struct page *page, unsigned int count, int plus) { @@ -31154,7 +32090,7 @@ diff -urNp linux-2.6.34.1/fs/nfs/nfs4proc.c linux-2.6.34.1/fs/nfs/nfs4proc.c int err; do { err = nfs4_handle_exception(NFS_SERVER(dentry->d_inode), -@@ -2949,7 +2949,7 @@ out: +@@ -2969,7 +2969,7 @@ out: static int nfs4_proc_mknod(struct inode *dir, struct dentry *dentry, struct iattr *sattr, dev_t rdev) { @@ -31163,7 +32099,7 @@ diff -urNp linux-2.6.34.1/fs/nfs/nfs4proc.c linux-2.6.34.1/fs/nfs/nfs4proc.c int err; do { err = nfs4_handle_exception(NFS_SERVER(dir), -@@ -2981,7 +2981,7 @@ static int _nfs4_proc_statfs(struct nfs_ +@@ -3001,7 +3001,7 @@ static int _nfs4_proc_statfs(struct nfs_ static int nfs4_proc_statfs(struct nfs_server *server, struct nfs_fh *fhandle, struct nfs_fsstat *fsstat) { @@ -31172,7 +32108,7 @@ diff -urNp linux-2.6.34.1/fs/nfs/nfs4proc.c linux-2.6.34.1/fs/nfs/nfs4proc.c int err; do { err = nfs4_handle_exception(server, -@@ -3012,7 +3012,7 @@ static int _nfs4_do_fsinfo(struct nfs_se +@@ -3032,7 +3032,7 @@ static int _nfs4_do_fsinfo(struct nfs_se static int nfs4_do_fsinfo(struct nfs_server *server, struct nfs_fh *fhandle, struct nfs_fsinfo *fsinfo) { @@ -31181,7 +32117,7 @@ diff -urNp linux-2.6.34.1/fs/nfs/nfs4proc.c linux-2.6.34.1/fs/nfs/nfs4proc.c int err; do { -@@ -3058,7 +3058,7 @@ static int _nfs4_proc_pathconf(struct nf +@@ -3078,7 +3078,7 @@ static int _nfs4_proc_pathconf(struct nf static int nfs4_proc_pathconf(struct nfs_server *server, struct nfs_fh *fhandle, struct nfs_pathconf *pathconf) { @@ -31190,7 +32126,7 @@ diff -urNp linux-2.6.34.1/fs/nfs/nfs4proc.c linux-2.6.34.1/fs/nfs/nfs4proc.c int err; do { -@@ -3365,7 +3365,7 @@ out_free: +@@ -3399,7 +3399,7 @@ out_free: static ssize_t nfs4_get_acl_uncached(struct inode *inode, void *buf, size_t buflen) { @@ -31199,7 +32135,7 @@ diff -urNp linux-2.6.34.1/fs/nfs/nfs4proc.c linux-2.6.34.1/fs/nfs/nfs4proc.c ssize_t ret; do { ret = __nfs4_get_acl_uncached(inode, buf, buflen); -@@ -3421,7 +3421,7 @@ static int __nfs4_proc_set_acl(struct in +@@ -3455,7 +3455,7 @@ static int __nfs4_proc_set_acl(struct in static int nfs4_proc_set_acl(struct inode *inode, const void *buf, size_t buflen) { @@ -31208,7 +32144,7 @@ diff -urNp linux-2.6.34.1/fs/nfs/nfs4proc.c linux-2.6.34.1/fs/nfs/nfs4proc.c int err; do { err = nfs4_handle_exception(NFS_SERVER(inode), -@@ -3705,7 +3705,7 @@ out: +@@ -3745,7 +3745,7 @@ out: int nfs4_proc_delegreturn(struct inode *inode, struct rpc_cred *cred, const nfs4_stateid *stateid, int issync) { struct nfs_server *server = NFS_SERVER(inode); @@ -31217,7 +32153,7 @@ diff -urNp linux-2.6.34.1/fs/nfs/nfs4proc.c linux-2.6.34.1/fs/nfs/nfs4proc.c int err; do { err = _nfs4_proc_delegreturn(inode, cred, stateid, issync); -@@ -3778,7 +3778,7 @@ out: +@@ -3818,7 +3818,7 @@ out: static int nfs4_proc_getlk(struct nfs4_state *state, int cmd, struct file_lock *request) { @@ -31226,7 +32162,7 @@ diff -urNp linux-2.6.34.1/fs/nfs/nfs4proc.c linux-2.6.34.1/fs/nfs/nfs4proc.c int err; do { -@@ -4190,7 +4190,7 @@ static int _nfs4_do_setlk(struct nfs4_st +@@ -4232,7 +4232,7 @@ static int _nfs4_do_setlk(struct nfs4_st static int nfs4_lock_reclaim(struct nfs4_state *state, struct file_lock *request) { struct nfs_server *server = NFS_SERVER(state->inode); @@ -31235,7 +32171,7 @@ diff -urNp linux-2.6.34.1/fs/nfs/nfs4proc.c linux-2.6.34.1/fs/nfs/nfs4proc.c int err; do { -@@ -4208,7 +4208,7 @@ static int nfs4_lock_reclaim(struct nfs4 +@@ -4250,7 +4250,7 @@ static int nfs4_lock_reclaim(struct nfs4 static int nfs4_lock_expired(struct nfs4_state *state, struct file_lock *request) { struct nfs_server *server = NFS_SERVER(state->inode); @@ -31244,7 +32180,7 @@ diff -urNp linux-2.6.34.1/fs/nfs/nfs4proc.c linux-2.6.34.1/fs/nfs/nfs4proc.c int err; err = nfs4_set_lock_state(state, request); -@@ -4273,7 +4273,7 @@ out: +@@ -4315,7 +4315,7 @@ out: static int nfs4_proc_setlk(struct nfs4_state *state, int cmd, struct file_lock *request) { @@ -31253,7 +32189,7 @@ diff -urNp linux-2.6.34.1/fs/nfs/nfs4proc.c linux-2.6.34.1/fs/nfs/nfs4proc.c int err; do { -@@ -4333,7 +4333,7 @@ nfs4_proc_lock(struct file *filp, int cm +@@ -4375,7 +4375,7 @@ nfs4_proc_lock(struct file *filp, int cm int nfs4_lock_delegation_recall(struct nfs4_state *state, struct file_lock *fl) { struct nfs_server *server = NFS_SERVER(state->inode); @@ -31262,9 +32198,9 @@ diff -urNp linux-2.6.34.1/fs/nfs/nfs4proc.c linux-2.6.34.1/fs/nfs/nfs4proc.c int err; err = nfs4_set_lock_state(state, fl); -diff -urNp linux-2.6.34.1/fs/nfsd/lockd.c linux-2.6.34.1/fs/nfsd/lockd.c ---- linux-2.6.34.1/fs/nfsd/lockd.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/nfsd/lockd.c 2010-07-07 09:04:55.000000000 -0400 +diff -urNp linux-2.6.35.4/fs/nfsd/lockd.c linux-2.6.35.4/fs/nfsd/lockd.c +--- linux-2.6.35.4/fs/nfsd/lockd.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/nfsd/lockd.c 2010-09-17 20:12:09.000000000 -0400 @@ -61,7 +61,7 @@ nlm_fclose(struct file *filp) fput(filp); } @@ -31274,10 +32210,10 @@ diff -urNp linux-2.6.34.1/fs/nfsd/lockd.c linux-2.6.34.1/fs/nfsd/lockd.c .fopen = nlm_fopen, /* open file for locking */ .fclose = nlm_fclose, /* close file */ }; -diff -urNp linux-2.6.34.1/fs/nfsd/nfsctl.c linux-2.6.34.1/fs/nfsd/nfsctl.c ---- linux-2.6.34.1/fs/nfsd/nfsctl.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/nfsd/nfsctl.c 2010-07-07 09:04:55.000000000 -0400 -@@ -160,7 +160,7 @@ static int export_features_open(struct i +diff -urNp linux-2.6.35.4/fs/nfsd/nfsctl.c linux-2.6.35.4/fs/nfsd/nfsctl.c +--- linux-2.6.35.4/fs/nfsd/nfsctl.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/nfsd/nfsctl.c 2010-09-17 20:12:09.000000000 -0400 +@@ -163,7 +163,7 @@ static int export_features_open(struct i return single_open(file, export_features_show, NULL); } @@ -31286,9 +32222,9 @@ diff -urNp linux-2.6.34.1/fs/nfsd/nfsctl.c linux-2.6.34.1/fs/nfsd/nfsctl.c .open = export_features_open, .read = seq_read, .llseek = seq_lseek, -diff -urNp linux-2.6.34.1/fs/nfsd/vfs.c linux-2.6.34.1/fs/nfsd/vfs.c ---- linux-2.6.34.1/fs/nfsd/vfs.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/nfsd/vfs.c 2010-07-07 09:04:55.000000000 -0400 +diff -urNp linux-2.6.35.4/fs/nfsd/vfs.c linux-2.6.35.4/fs/nfsd/vfs.c +--- linux-2.6.35.4/fs/nfsd/vfs.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/nfsd/vfs.c 2010-09-17 20:12:09.000000000 -0400 @@ -933,7 +933,7 @@ nfsd_vfs_read(struct svc_rqst *rqstp, st } else { oldfs = get_fs(); @@ -31307,7 +32243,7 @@ diff -urNp linux-2.6.34.1/fs/nfsd/vfs.c linux-2.6.34.1/fs/nfsd/vfs.c set_fs(oldfs); if (host_err < 0) goto out_nfserr; -@@ -1542,7 +1542,7 @@ nfsd_readlink(struct svc_rqst *rqstp, st +@@ -1541,7 +1541,7 @@ nfsd_readlink(struct svc_rqst *rqstp, st */ oldfs = get_fs(); set_fs(KERNEL_DS); @@ -31316,9 +32252,9 @@ diff -urNp linux-2.6.34.1/fs/nfsd/vfs.c linux-2.6.34.1/fs/nfsd/vfs.c set_fs(oldfs); if (host_err < 0) -diff -urNp linux-2.6.34.1/fs/nls/nls_base.c linux-2.6.34.1/fs/nls/nls_base.c ---- linux-2.6.34.1/fs/nls/nls_base.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/nls/nls_base.c 2010-07-07 09:04:55.000000000 -0400 +diff -urNp linux-2.6.35.4/fs/nls/nls_base.c linux-2.6.35.4/fs/nls/nls_base.c +--- linux-2.6.35.4/fs/nls/nls_base.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/nls/nls_base.c 2010-09-17 20:12:09.000000000 -0400 @@ -41,7 +41,7 @@ static const struct utf8_table utf8_tabl {0xF8, 0xF0, 3*6, 0x1FFFFF, 0x10000, /* 4 byte sequence */}, {0xFC, 0xF8, 4*6, 0x3FFFFFF, 0x200000, /* 5 byte sequence */}, @@ -31328,10 +32264,10 @@ diff -urNp linux-2.6.34.1/fs/nls/nls_base.c linux-2.6.34.1/fs/nls/nls_base.c }; #define UNICODE_MAX 0x0010ffff -diff -urNp linux-2.6.34.1/fs/ntfs/file.c linux-2.6.34.1/fs/ntfs/file.c ---- linux-2.6.34.1/fs/ntfs/file.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/ntfs/file.c 2010-07-07 09:04:55.000000000 -0400 -@@ -2244,6 +2244,6 @@ const struct inode_operations ntfs_file_ +diff -urNp linux-2.6.35.4/fs/ntfs/file.c linux-2.6.35.4/fs/ntfs/file.c +--- linux-2.6.35.4/fs/ntfs/file.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/ntfs/file.c 2010-09-17 20:12:09.000000000 -0400 +@@ -2223,6 +2223,6 @@ const struct inode_operations ntfs_file_ #endif /* NTFS_RW */ }; @@ -31340,22 +32276,22 @@ diff -urNp linux-2.6.34.1/fs/ntfs/file.c linux-2.6.34.1/fs/ntfs/file.c -const struct inode_operations ntfs_empty_inode_ops = {}; +const struct inode_operations ntfs_empty_inode_ops __read_only; -diff -urNp linux-2.6.34.1/fs/ocfs2/localalloc.c linux-2.6.34.1/fs/ocfs2/localalloc.c ---- linux-2.6.34.1/fs/ocfs2/localalloc.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/ocfs2/localalloc.c 2010-07-07 09:04:55.000000000 -0400 -@@ -1190,7 +1190,7 @@ static int ocfs2_local_alloc_slide_windo +diff -urNp linux-2.6.35.4/fs/ocfs2/localalloc.c linux-2.6.35.4/fs/ocfs2/localalloc.c +--- linux-2.6.35.4/fs/ocfs2/localalloc.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/ocfs2/localalloc.c 2010-09-17 20:12:09.000000000 -0400 +@@ -1307,7 +1307,7 @@ static int ocfs2_local_alloc_slide_windo goto bail; } - atomic_inc(&osb->alloc_stats.moves); + atomic_inc_unchecked(&osb->alloc_stats.moves); - status = 0; bail: -diff -urNp linux-2.6.34.1/fs/ocfs2/ocfs2.h linux-2.6.34.1/fs/ocfs2/ocfs2.h ---- linux-2.6.34.1/fs/ocfs2/ocfs2.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/ocfs2/ocfs2.h 2010-07-07 09:04:55.000000000 -0400 -@@ -222,11 +222,11 @@ enum ocfs2_vol_state + if (handle) +diff -urNp linux-2.6.35.4/fs/ocfs2/ocfs2.h linux-2.6.35.4/fs/ocfs2/ocfs2.h +--- linux-2.6.35.4/fs/ocfs2/ocfs2.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/ocfs2/ocfs2.h 2010-09-17 20:12:09.000000000 -0400 +@@ -223,11 +223,11 @@ enum ocfs2_vol_state struct ocfs2_alloc_stats { @@ -31372,10 +32308,10 @@ diff -urNp linux-2.6.34.1/fs/ocfs2/ocfs2.h linux-2.6.34.1/fs/ocfs2/ocfs2.h }; enum ocfs2_local_alloc_state -diff -urNp linux-2.6.34.1/fs/ocfs2/suballoc.c linux-2.6.34.1/fs/ocfs2/suballoc.c ---- linux-2.6.34.1/fs/ocfs2/suballoc.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/ocfs2/suballoc.c 2010-07-07 09:04:55.000000000 -0400 -@@ -616,7 +616,7 @@ static int ocfs2_reserve_suballoc_bits(s +diff -urNp linux-2.6.35.4/fs/ocfs2/suballoc.c linux-2.6.35.4/fs/ocfs2/suballoc.c +--- linux-2.6.35.4/fs/ocfs2/suballoc.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/ocfs2/suballoc.c 2010-09-17 20:12:09.000000000 -0400 +@@ -856,7 +856,7 @@ static int ocfs2_reserve_suballoc_bits(s mlog_errno(status); goto bail; } @@ -31384,25 +32320,25 @@ diff -urNp linux-2.6.34.1/fs/ocfs2/suballoc.c linux-2.6.34.1/fs/ocfs2/suballoc.c /* You should never ask for this much metadata */ BUG_ON(bits_wanted > -@@ -1738,7 +1738,7 @@ int ocfs2_claim_metadata(struct ocfs2_su +@@ -1968,7 +1968,7 @@ int ocfs2_claim_metadata(handle_t *handl mlog_errno(status); goto bail; } -- atomic_inc(&osb->alloc_stats.bg_allocs); -+ atomic_inc_unchecked(&osb->alloc_stats.bg_allocs); +- atomic_inc(&OCFS2_SB(ac->ac_inode->i_sb)->alloc_stats.bg_allocs); ++ atomic_inc_unchecked(&OCFS2_SB(ac->ac_inode->i_sb)->alloc_stats.bg_allocs); - *blkno_start = bg_blkno + (u64) *suballoc_bit_start; - ac->ac_bits_given += (*num_bits); -@@ -1812,7 +1812,7 @@ int ocfs2_claim_new_inode(struct ocfs2_s + *suballoc_loc = res.sr_bg_blkno; + *suballoc_bit_start = res.sr_bit_offset; +@@ -2045,7 +2045,7 @@ int ocfs2_claim_new_inode(handle_t *hand mlog_errno(status); goto bail; } -- atomic_inc(&osb->alloc_stats.bg_allocs); -+ atomic_inc_unchecked(&osb->alloc_stats.bg_allocs); +- atomic_inc(&OCFS2_SB(ac->ac_inode->i_sb)->alloc_stats.bg_allocs); ++ atomic_inc_unchecked(&OCFS2_SB(ac->ac_inode->i_sb)->alloc_stats.bg_allocs); - BUG_ON(num_bits != 1); + BUG_ON(res.sr_bits != 1); -@@ -1914,7 +1914,7 @@ int __ocfs2_claim_clusters(struct ocfs2_ +@@ -2150,7 +2150,7 @@ int __ocfs2_claim_clusters(handle_t *han cluster_start, num_clusters); if (!status) @@ -31411,19 +32347,19 @@ diff -urNp linux-2.6.34.1/fs/ocfs2/suballoc.c linux-2.6.34.1/fs/ocfs2/suballoc.c } else { if (min_clusters > (osb->bitmap_cpg - 1)) { /* The only paths asking for contiguousness -@@ -1942,7 +1942,7 @@ int __ocfs2_claim_clusters(struct ocfs2_ +@@ -2176,7 +2176,7 @@ int __ocfs2_claim_clusters(handle_t *han ocfs2_desc_bitmap_to_cluster_off(ac->ac_inode, - bg_blkno, - bg_bit_off); + res.sr_bg_blkno, + res.sr_bit_offset); - atomic_inc(&osb->alloc_stats.bitmap_data); + atomic_inc_unchecked(&osb->alloc_stats.bitmap_data); + *num_clusters = res.sr_bits; } } - if (status < 0) { -diff -urNp linux-2.6.34.1/fs/ocfs2/super.c linux-2.6.34.1/fs/ocfs2/super.c ---- linux-2.6.34.1/fs/ocfs2/super.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/ocfs2/super.c 2010-07-07 09:04:55.000000000 -0400 -@@ -287,11 +287,11 @@ static int ocfs2_osb_dump(struct ocfs2_s +diff -urNp linux-2.6.35.4/fs/ocfs2/super.c linux-2.6.35.4/fs/ocfs2/super.c +--- linux-2.6.35.4/fs/ocfs2/super.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/ocfs2/super.c 2010-09-17 20:12:09.000000000 -0400 +@@ -293,11 +293,11 @@ static int ocfs2_osb_dump(struct ocfs2_s "%10s => GlobalAllocs: %d LocalAllocs: %d " "SubAllocs: %d LAWinMoves: %d SAExtends: %d\n", "Stats", @@ -31440,7 +32376,7 @@ diff -urNp linux-2.6.34.1/fs/ocfs2/super.c linux-2.6.34.1/fs/ocfs2/super.c out += snprintf(buf + out, len - out, "%10s => State: %u Descriptor: %llu Size: %u bits " -@@ -2003,11 +2003,11 @@ static int ocfs2_initialize_super(struct +@@ -2047,11 +2047,11 @@ static int ocfs2_initialize_super(struct spin_lock_init(&osb->osb_xattr_lock); ocfs2_init_steal_slots(osb); @@ -31457,9 +32393,9 @@ diff -urNp linux-2.6.34.1/fs/ocfs2/super.c linux-2.6.34.1/fs/ocfs2/super.c /* Copy the blockcheck stats from the superblock probe */ osb->osb_ecc_stats = *stats; -diff -urNp linux-2.6.34.1/fs/ocfs2/symlink.c linux-2.6.34.1/fs/ocfs2/symlink.c ---- linux-2.6.34.1/fs/ocfs2/symlink.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/ocfs2/symlink.c 2010-07-07 09:04:55.000000000 -0400 +diff -urNp linux-2.6.35.4/fs/ocfs2/symlink.c linux-2.6.35.4/fs/ocfs2/symlink.c +--- linux-2.6.35.4/fs/ocfs2/symlink.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/ocfs2/symlink.c 2010-09-17 20:12:09.000000000 -0400 @@ -148,7 +148,7 @@ bail: static void ocfs2_fast_put_link(struct dentry *dentry, struct nameidata *nd, void *cookie) @@ -31469,10 +32405,10 @@ diff -urNp linux-2.6.34.1/fs/ocfs2/symlink.c linux-2.6.34.1/fs/ocfs2/symlink.c if (!IS_ERR(link)) kfree(link); } -diff -urNp linux-2.6.34.1/fs/open.c linux-2.6.34.1/fs/open.c ---- linux-2.6.34.1/fs/open.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/open.c 2010-07-07 09:04:55.000000000 -0400 -@@ -208,6 +208,9 @@ int do_truncate(struct dentry *dentry, l +diff -urNp linux-2.6.35.4/fs/open.c linux-2.6.35.4/fs/open.c +--- linux-2.6.35.4/fs/open.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/open.c 2010-09-17 20:12:37.000000000 -0400 +@@ -42,6 +42,9 @@ int do_truncate(struct dentry *dentry, l if (length < 0) return -EINVAL; @@ -31482,7 +32418,7 @@ diff -urNp linux-2.6.34.1/fs/open.c linux-2.6.34.1/fs/open.c newattrs.ia_size = length; newattrs.ia_valid = ATTR_SIZE | time_attrs; if (filp) { -@@ -511,6 +514,9 @@ SYSCALL_DEFINE3(faccessat, int, dfd, con +@@ -345,6 +348,9 @@ SYSCALL_DEFINE3(faccessat, int, dfd, con if (__mnt_is_readonly(path.mnt)) res = -EROFS; @@ -31492,7 +32428,7 @@ diff -urNp linux-2.6.34.1/fs/open.c linux-2.6.34.1/fs/open.c out_path_release: path_put(&path); out: -@@ -537,6 +543,8 @@ SYSCALL_DEFINE1(chdir, const char __user +@@ -371,6 +377,8 @@ SYSCALL_DEFINE1(chdir, const char __user if (error) goto dput_and_out; @@ -31501,7 +32437,7 @@ diff -urNp linux-2.6.34.1/fs/open.c linux-2.6.34.1/fs/open.c set_fs_pwd(current->fs, &path); dput_and_out: -@@ -563,6 +571,13 @@ SYSCALL_DEFINE1(fchdir, unsigned int, fd +@@ -397,6 +405,13 @@ SYSCALL_DEFINE1(fchdir, unsigned int, fd goto out_putf; error = inode_permission(inode, MAY_EXEC | MAY_ACCESS); @@ -31515,7 +32451,7 @@ diff -urNp linux-2.6.34.1/fs/open.c linux-2.6.34.1/fs/open.c if (!error) set_fs_pwd(current->fs, &file->f_path); out_putf: -@@ -591,7 +606,18 @@ SYSCALL_DEFINE1(chroot, const char __use +@@ -425,7 +440,18 @@ SYSCALL_DEFINE1(chroot, const char __use if (error) goto dput_and_out; @@ -31534,7 +32470,7 @@ diff -urNp linux-2.6.34.1/fs/open.c linux-2.6.34.1/fs/open.c error = 0; dput_and_out: path_put(&path); -@@ -619,6 +645,12 @@ SYSCALL_DEFINE2(fchmod, unsigned int, fd +@@ -453,6 +479,12 @@ SYSCALL_DEFINE2(fchmod, unsigned int, fd err = mnt_want_write_file(file); if (err) goto out_putf; @@ -31547,7 +32483,7 @@ diff -urNp linux-2.6.34.1/fs/open.c linux-2.6.34.1/fs/open.c mutex_lock(&inode->i_mutex); err = security_path_chmod(dentry, file->f_vfsmnt, mode); if (err) -@@ -630,6 +662,7 @@ SYSCALL_DEFINE2(fchmod, unsigned int, fd +@@ -464,6 +496,7 @@ SYSCALL_DEFINE2(fchmod, unsigned int, fd err = notify_change(dentry, &newattrs); out_unlock: mutex_unlock(&inode->i_mutex); @@ -31555,7 +32491,7 @@ diff -urNp linux-2.6.34.1/fs/open.c linux-2.6.34.1/fs/open.c mnt_drop_write(file->f_path.mnt); out_putf: fput(file); -@@ -652,17 +685,30 @@ SYSCALL_DEFINE3(fchmodat, int, dfd, cons +@@ -486,17 +519,30 @@ SYSCALL_DEFINE3(fchmodat, int, dfd, cons error = mnt_want_write(path.mnt); if (error) goto dput_and_out; @@ -31586,7 +32522,7 @@ diff -urNp linux-2.6.34.1/fs/open.c linux-2.6.34.1/fs/open.c mnt_drop_write(path.mnt); dput_and_out: path_put(&path); -@@ -681,6 +727,9 @@ static int chown_common(struct path *pat +@@ -515,6 +561,9 @@ static int chown_common(struct path *pat int error; struct iattr newattrs; @@ -31596,10 +32532,10 @@ diff -urNp linux-2.6.34.1/fs/open.c linux-2.6.34.1/fs/open.c newattrs.ia_valid = ATTR_CTIME; if (user != (uid_t) -1) { newattrs.ia_valid |= ATTR_UID; -diff -urNp linux-2.6.34.1/fs/pipe.c linux-2.6.34.1/fs/pipe.c ---- linux-2.6.34.1/fs/pipe.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/pipe.c 2010-07-07 09:04:56.000000000 -0400 -@@ -401,9 +401,9 @@ redo: +diff -urNp linux-2.6.35.4/fs/pipe.c linux-2.6.35.4/fs/pipe.c +--- linux-2.6.35.4/fs/pipe.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/pipe.c 2010-09-17 20:12:37.000000000 -0400 +@@ -420,9 +420,9 @@ redo: } if (bufs) /* More to do? */ continue; @@ -31611,7 +32547,7 @@ diff -urNp linux-2.6.34.1/fs/pipe.c linux-2.6.34.1/fs/pipe.c /* syscall merging: Usually we must not sleep * if O_NONBLOCK is set, or if we got some data. * But if a writer sleeps in kernel space, then -@@ -462,7 +462,7 @@ pipe_write(struct kiocb *iocb, const str +@@ -481,7 +481,7 @@ pipe_write(struct kiocb *iocb, const str mutex_lock(&inode->i_mutex); pipe = inode->i_pipe; @@ -31620,7 +32556,7 @@ diff -urNp linux-2.6.34.1/fs/pipe.c linux-2.6.34.1/fs/pipe.c send_sig(SIGPIPE, current, 0); ret = -EPIPE; goto out; -@@ -511,7 +511,7 @@ redo1: +@@ -530,7 +530,7 @@ redo1: for (;;) { int bufs; @@ -31629,7 +32565,7 @@ diff -urNp linux-2.6.34.1/fs/pipe.c linux-2.6.34.1/fs/pipe.c send_sig(SIGPIPE, current, 0); if (!ret) ret = -EPIPE; -@@ -597,9 +597,9 @@ redo2: +@@ -616,9 +616,9 @@ redo2: kill_fasync(&pipe->fasync_readers, SIGIO, POLL_IN); do_wakeup = 0; } @@ -31641,7 +32577,7 @@ diff -urNp linux-2.6.34.1/fs/pipe.c linux-2.6.34.1/fs/pipe.c } out: mutex_unlock(&inode->i_mutex); -@@ -666,7 +666,7 @@ pipe_poll(struct file *filp, poll_table +@@ -685,7 +685,7 @@ pipe_poll(struct file *filp, poll_table mask = 0; if (filp->f_mode & FMODE_READ) { mask = (nrbufs > 0) ? POLLIN | POLLRDNORM : 0; @@ -31650,7 +32586,7 @@ diff -urNp linux-2.6.34.1/fs/pipe.c linux-2.6.34.1/fs/pipe.c mask |= POLLHUP; } -@@ -676,7 +676,7 @@ pipe_poll(struct file *filp, poll_table +@@ -695,7 +695,7 @@ pipe_poll(struct file *filp, poll_table * Most Unices do not set POLLERR for FIFOs but on Linux they * behave exactly like pipes for poll(). */ @@ -31659,7 +32595,7 @@ diff -urNp linux-2.6.34.1/fs/pipe.c linux-2.6.34.1/fs/pipe.c mask |= POLLERR; } -@@ -690,10 +690,10 @@ pipe_release(struct inode *inode, int de +@@ -709,10 +709,10 @@ pipe_release(struct inode *inode, int de mutex_lock(&inode->i_mutex); pipe = inode->i_pipe; @@ -31673,7 +32609,7 @@ diff -urNp linux-2.6.34.1/fs/pipe.c linux-2.6.34.1/fs/pipe.c free_pipe_info(inode); } else { wake_up_interruptible_sync(&pipe->wait); -@@ -783,7 +783,7 @@ pipe_read_open(struct inode *inode, stru +@@ -802,7 +802,7 @@ pipe_read_open(struct inode *inode, stru if (inode->i_pipe) { ret = 0; @@ -31682,7 +32618,7 @@ diff -urNp linux-2.6.34.1/fs/pipe.c linux-2.6.34.1/fs/pipe.c } mutex_unlock(&inode->i_mutex); -@@ -800,7 +800,7 @@ pipe_write_open(struct inode *inode, str +@@ -819,7 +819,7 @@ pipe_write_open(struct inode *inode, str if (inode->i_pipe) { ret = 0; @@ -31691,7 +32627,7 @@ diff -urNp linux-2.6.34.1/fs/pipe.c linux-2.6.34.1/fs/pipe.c } mutex_unlock(&inode->i_mutex); -@@ -818,9 +818,9 @@ pipe_rdwr_open(struct inode *inode, stru +@@ -837,9 +837,9 @@ pipe_rdwr_open(struct inode *inode, stru if (inode->i_pipe) { ret = 0; if (filp->f_mode & FMODE_READ) @@ -31703,7 +32639,7 @@ diff -urNp linux-2.6.34.1/fs/pipe.c linux-2.6.34.1/fs/pipe.c } mutex_unlock(&inode->i_mutex); -@@ -905,7 +905,7 @@ void free_pipe_info(struct inode *inode) +@@ -931,7 +931,7 @@ void free_pipe_info(struct inode *inode) inode->i_pipe = NULL; } @@ -31712,7 +32648,7 @@ diff -urNp linux-2.6.34.1/fs/pipe.c linux-2.6.34.1/fs/pipe.c /* * pipefs_dname() is called from d_path(). -@@ -933,7 +933,8 @@ static struct inode * get_pipe_inode(voi +@@ -959,7 +959,8 @@ static struct inode * get_pipe_inode(voi goto fail_iput; inode->i_pipe = pipe; @@ -31722,9 +32658,518 @@ diff -urNp linux-2.6.34.1/fs/pipe.c linux-2.6.34.1/fs/pipe.c inode->i_fop = &rdwr_pipefifo_fops; /* -diff -urNp linux-2.6.34.1/fs/proc/Kconfig linux-2.6.34.1/fs/proc/Kconfig ---- linux-2.6.34.1/fs/proc/Kconfig 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/proc/Kconfig 2010-07-07 09:04:56.000000000 -0400 +diff -urNp linux-2.6.35.4/fs/proc/array.c linux-2.6.35.4/fs/proc/array.c +--- linux-2.6.35.4/fs/proc/array.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/proc/array.c 2010-09-17 20:12:37.000000000 -0400 +@@ -337,6 +337,21 @@ static void task_cpus_allowed(struct seq + seq_printf(m, "\n"); + } + ++#if defined(CONFIG_PAX_NOEXEC) || defined(CONFIG_PAX_ASLR) ++static inline void task_pax(struct seq_file *m, struct task_struct *p) ++{ ++ if (p->mm) ++ seq_printf(m, "PaX:\t%c%c%c%c%c\n", ++ p->mm->pax_flags & MF_PAX_PAGEEXEC ? 'P' : 'p', ++ p->mm->pax_flags & MF_PAX_EMUTRAMP ? 'E' : 'e', ++ p->mm->pax_flags & MF_PAX_MPROTECT ? 'M' : 'm', ++ p->mm->pax_flags & MF_PAX_RANDMMAP ? 'R' : 'r', ++ p->mm->pax_flags & MF_PAX_SEGMEXEC ? 'S' : 's'); ++ else ++ seq_printf(m, "PaX:\t-----\n"); ++} ++#endif ++ + int proc_pid_status(struct seq_file *m, struct pid_namespace *ns, + struct pid *pid, struct task_struct *task) + { +@@ -357,9 +372,20 @@ int proc_pid_status(struct seq_file *m, + task_show_regs(m, task); + #endif + task_context_switch_counts(m, task); ++ ++#if defined(CONFIG_PAX_NOEXEC) || defined(CONFIG_PAX_ASLR) ++ task_pax(m, task); ++#endif ++ + return 0; + } + ++#ifdef CONFIG_GRKERNSEC_PROC_MEMMAP ++#define PAX_RAND_FLAGS(_mm) (_mm != NULL && _mm != current->mm && \ ++ (_mm->pax_flags & MF_PAX_RANDMMAP || \ ++ _mm->pax_flags & MF_PAX_SEGMEXEC)) ++#endif ++ + static int do_task_stat(struct seq_file *m, struct pid_namespace *ns, + struct pid *pid, struct task_struct *task, int whole) + { +@@ -452,6 +478,19 @@ static int do_task_stat(struct seq_file + gtime = task->gtime; + } + ++#ifdef CONFIG_GRKERNSEC_PROC_MEMMAP ++ if (PAX_RAND_FLAGS(mm)) { ++ eip = 0; ++ esp = 0; ++ wchan = 0; ++ } ++#endif ++#ifdef CONFIG_GRKERNSEC_HIDESYM ++ wchan = 0; ++ eip =0; ++ esp =0; ++#endif ++ + /* scale priority and nice values from timeslices to -20..20 */ + /* to make it look like a "normal" Unix priority/nice value */ + priority = task_prio(task); +@@ -492,9 +531,15 @@ static int do_task_stat(struct seq_file + vsize, + mm ? get_mm_rss(mm) : 0, + rsslim, ++#ifdef CONFIG_GRKERNSEC_PROC_MEMMAP ++ PAX_RAND_FLAGS(mm) ? 1 : (mm ? mm->start_code : 0), ++ PAX_RAND_FLAGS(mm) ? 1 : (mm ? mm->end_code : 0), ++ PAX_RAND_FLAGS(mm) ? 0 : ((permitted && mm) ? mm->start_stack : 0), ++#else + mm ? mm->start_code : 0, + mm ? mm->end_code : 0, + (permitted && mm) ? mm->start_stack : 0, ++#endif + esp, + eip, + /* The signal information here is obsolete. +@@ -547,3 +592,10 @@ int proc_pid_statm(struct seq_file *m, s + + return 0; + } ++ ++#ifdef CONFIG_GRKERNSEC_PROC_IPADDR ++int proc_pid_ipaddr(struct task_struct *task, char *buffer) ++{ ++ return sprintf(buffer, "%pI4\n", &task->signal->curr_ip); ++} ++#endif +diff -urNp linux-2.6.35.4/fs/proc/base.c linux-2.6.35.4/fs/proc/base.c +--- linux-2.6.35.4/fs/proc/base.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/proc/base.c 2010-09-17 20:12:37.000000000 -0400 +@@ -103,6 +103,22 @@ struct pid_entry { + union proc_op op; + }; + ++struct getdents_callback { ++ struct linux_dirent __user * current_dir; ++ struct linux_dirent __user * previous; ++ struct file * file; ++ int count; ++ int error; ++}; ++ ++static int gr_fake_filldir(void * __buf, const char *name, int namlen, ++ loff_t offset, u64 ino, unsigned int d_type) ++{ ++ struct getdents_callback * buf = (struct getdents_callback *) __buf; ++ buf->error = -EINVAL; ++ return 0; ++} ++ + #define NOD(NAME, MODE, IOP, FOP, OP) { \ + .name = (NAME), \ + .len = sizeof(NAME) - 1, \ +@@ -202,6 +218,9 @@ static int check_mem_permission(struct t + if (task == current) + return 0; + ++ if (gr_handle_proc_ptrace(task) || gr_acl_handle_procpidmem(task)) ++ return -EPERM; ++ + /* + * If current is actively ptrace'ing, and would also be + * permitted to freshly attach with ptrace now, permit it. +@@ -249,6 +268,9 @@ static int proc_pid_cmdline(struct task_ + if (!mm->arg_end) + goto out_mm; /* Shh! No looking before we're done */ + ++ if (gr_acl_handle_procpidmem(task)) ++ goto out_mm; ++ + len = mm->arg_end - mm->arg_start; + + if (len > PAGE_SIZE) +@@ -276,12 +298,26 @@ out: + return res; + } + ++#ifdef CONFIG_GRKERNSEC_PROC_MEMMAP ++#define PAX_RAND_FLAGS(_mm) (_mm != NULL && _mm != current->mm && \ ++ (_mm->pax_flags & MF_PAX_RANDMMAP || \ ++ _mm->pax_flags & MF_PAX_SEGMEXEC)) ++#endif ++ + static int proc_pid_auxv(struct task_struct *task, char *buffer) + { + int res = 0; + struct mm_struct *mm = get_task_mm(task); + if (mm) { + unsigned int nwords = 0; ++ ++#ifdef CONFIG_GRKERNSEC_PROC_MEMMAP ++ if (PAX_RAND_FLAGS(mm)) { ++ mmput(mm); ++ return res; ++ } ++#endif ++ + do { + nwords += 2; + } while (mm->saved_auxv[nwords - 2] != 0); /* AT_NULL */ +@@ -317,7 +353,7 @@ static int proc_pid_wchan(struct task_st + } + #endif /* CONFIG_KALLSYMS */ + +-#ifdef CONFIG_STACKTRACE ++#if defined(CONFIG_STACKTRACE) && !defined(CONFIG_GRKERNSEC_HIDESYM) + + #define MAX_STACK_TRACE_DEPTH 64 + +@@ -511,7 +547,7 @@ static int proc_pid_limits(struct task_s + return count; + } + +-#ifdef CONFIG_HAVE_ARCH_TRACEHOOK ++#if defined(CONFIG_HAVE_ARCH_TRACEHOOK) && !defined(CONFIG_GRKERNSEC_PROC_MEMMAP) + static int proc_pid_syscall(struct task_struct *task, char *buffer) + { + long nr; +@@ -920,6 +956,9 @@ static ssize_t environ_read(struct file + if (!task) + goto out_no_task; + ++ if (gr_acl_handle_procpidmem(task)) ++ goto out; ++ + if (!ptrace_may_access(task, PTRACE_MODE_READ)) + goto out; + +@@ -1514,7 +1553,11 @@ static struct inode *proc_pid_make_inode + rcu_read_lock(); + cred = __task_cred(task); + inode->i_uid = cred->euid; ++#ifdef CONFIG_GRKERNSEC_PROC_USERGROUP ++ inode->i_gid = CONFIG_GRKERNSEC_PROC_GID; ++#else + inode->i_gid = cred->egid; ++#endif + rcu_read_unlock(); + } + security_task_to_inode(task, inode); +@@ -1532,6 +1575,9 @@ static int pid_getattr(struct vfsmount * + struct inode *inode = dentry->d_inode; + struct task_struct *task; + const struct cred *cred; ++#if defined(CONFIG_GRKERNSEC_PROC_USER) || defined(CONFIG_GRKERNSEC_PROC_USERGROUP) ++ const struct cred *tmpcred = current_cred(); ++#endif + + generic_fillattr(inode, stat); + +@@ -1539,12 +1585,34 @@ static int pid_getattr(struct vfsmount * + stat->uid = 0; + stat->gid = 0; + task = pid_task(proc_pid(inode), PIDTYPE_PID); ++ ++ if (task && (gr_pid_is_chrooted(task) || gr_check_hidden_task(task))) { ++ rcu_read_unlock(); ++ return -ENOENT; ++ } ++ + if (task) { ++ cred = __task_cred(task); ++#if defined(CONFIG_GRKERNSEC_PROC_USER) || defined(CONFIG_GRKERNSEC_PROC_USERGROUP) ++ if (!tmpcred->uid || (tmpcred->uid == cred->uid) ++#ifdef CONFIG_GRKERNSEC_PROC_USERGROUP ++ || in_group_p(CONFIG_GRKERNSEC_PROC_GID) ++#endif ++ ) ++#endif + if ((inode->i_mode == (S_IFDIR|S_IRUGO|S_IXUGO)) || ++#ifdef CONFIG_GRKERNSEC_PROC_USER ++ (inode->i_mode == (S_IFDIR|S_IRUSR|S_IXUSR)) || ++#elif defined(CONFIG_GRKERNSEC_PROC_USERGROUP) ++ (inode->i_mode == (S_IFDIR|S_IRUSR|S_IRGRP|S_IXUSR|S_IXGRP)) || ++#endif + task_dumpable(task)) { +- cred = __task_cred(task); + stat->uid = cred->euid; ++#ifdef CONFIG_GRKERNSEC_PROC_USERGROUP ++ stat->gid = CONFIG_GRKERNSEC_PROC_GID; ++#else + stat->gid = cred->egid; ++#endif + } + } + rcu_read_unlock(); +@@ -1576,11 +1644,20 @@ static int pid_revalidate(struct dentry + + if (task) { + if ((inode->i_mode == (S_IFDIR|S_IRUGO|S_IXUGO)) || ++#ifdef CONFIG_GRKERNSEC_PROC_USER ++ (inode->i_mode == (S_IFDIR|S_IRUSR|S_IXUSR)) || ++#elif defined(CONFIG_GRKERNSEC_PROC_USERGROUP) ++ (inode->i_mode == (S_IFDIR|S_IRUSR|S_IRGRP|S_IXUSR|S_IXGRP)) || ++#endif + task_dumpable(task)) { + rcu_read_lock(); + cred = __task_cred(task); + inode->i_uid = cred->euid; ++#ifdef CONFIG_GRKERNSEC_PROC_USERGROUP ++ inode->i_gid = CONFIG_GRKERNSEC_PROC_GID; ++#else + inode->i_gid = cred->egid; ++#endif + rcu_read_unlock(); + } else { + inode->i_uid = 0; +@@ -1701,7 +1778,8 @@ static int proc_fd_info(struct inode *in + int fd = proc_fd(inode); + + if (task) { +- files = get_files_struct(task); ++ if (!gr_acl_handle_procpidmem(task)) ++ files = get_files_struct(task); + put_task_struct(task); + } + if (files) { +@@ -1953,12 +2031,22 @@ static const struct file_operations proc + static int proc_fd_permission(struct inode *inode, int mask) + { + int rv; ++ struct task_struct *task; + + rv = generic_permission(inode, mask, NULL); +- if (rv == 0) +- return 0; ++ + if (task_pid(current) == proc_pid(inode)) + rv = 0; ++ ++ task = get_proc_task(inode); ++ if (task == NULL) ++ return rv; ++ ++ if (gr_acl_handle_procpidmem(task)) ++ rv = -EACCES; ++ ++ put_task_struct(task); ++ + return rv; + } + +@@ -2067,6 +2155,9 @@ static struct dentry *proc_pident_lookup + if (!task) + goto out_no_task; + ++ if (gr_pid_is_chrooted(task) || gr_check_hidden_task(task)) ++ goto out; ++ + /* + * Yes, it does not scale. And it should not. Don't add + * new entries into /proc// without very good reasons. +@@ -2111,6 +2202,9 @@ static int proc_pident_readdir(struct fi + if (!task) + goto out_no_task; + ++ if (gr_pid_is_chrooted(task) || gr_check_hidden_task(task)) ++ goto out; ++ + ret = 0; + i = filp->f_pos; + switch (i) { +@@ -2380,7 +2474,7 @@ static void *proc_self_follow_link(struc + static void proc_self_put_link(struct dentry *dentry, struct nameidata *nd, + void *cookie) + { +- char *s = nd_get_link(nd); ++ const char *s = nd_get_link(nd); + if (!IS_ERR(s)) + __putname(s); + } +@@ -2580,7 +2674,7 @@ static const struct pid_entry tgid_base_ + REG("sched", S_IRUGO|S_IWUSR, proc_pid_sched_operations), + #endif + REG("comm", S_IRUGO|S_IWUSR, proc_pid_set_comm_operations), +-#ifdef CONFIG_HAVE_ARCH_TRACEHOOK ++#if defined(CONFIG_HAVE_ARCH_TRACEHOOK) && !defined(CONFIG_GRKERNSEC_PROC_MEMMAP) + INF("syscall", S_IRUSR, proc_pid_syscall), + #endif + INF("cmdline", S_IRUGO, proc_pid_cmdline), +@@ -2608,7 +2702,7 @@ static const struct pid_entry tgid_base_ + #ifdef CONFIG_KALLSYMS + INF("wchan", S_IRUGO, proc_pid_wchan), + #endif +-#ifdef CONFIG_STACKTRACE ++#if defined(CONFIG_STACKTRACE) && !defined(CONFIG_GRKERNSEC_HIDESYM) + ONE("stack", S_IRUSR, proc_pid_stack), + #endif + #ifdef CONFIG_SCHEDSTATS +@@ -2638,6 +2732,9 @@ static const struct pid_entry tgid_base_ + #ifdef CONFIG_TASK_IO_ACCOUNTING + INF("io", S_IRUGO, proc_tgid_io_accounting), + #endif ++#ifdef CONFIG_GRKERNSEC_PROC_IPADDR ++ INF("ipaddr", S_IRUSR, proc_pid_ipaddr), ++#endif + }; + + static int proc_tgid_base_readdir(struct file * filp, +@@ -2762,7 +2859,14 @@ static struct dentry *proc_pid_instantia + if (!inode) + goto out; + ++#ifdef CONFIG_GRKERNSEC_PROC_USER ++ inode->i_mode = S_IFDIR|S_IRUSR|S_IXUSR; ++#elif defined(CONFIG_GRKERNSEC_PROC_USERGROUP) ++ inode->i_gid = CONFIG_GRKERNSEC_PROC_GID; ++ inode->i_mode = S_IFDIR|S_IRUSR|S_IRGRP|S_IXUSR|S_IXGRP; ++#else + inode->i_mode = S_IFDIR|S_IRUGO|S_IXUGO; ++#endif + inode->i_op = &proc_tgid_base_inode_operations; + inode->i_fop = &proc_tgid_base_operations; + inode->i_flags|=S_IMMUTABLE; +@@ -2804,7 +2908,11 @@ struct dentry *proc_pid_lookup(struct in + if (!task) + goto out; + ++ if (gr_pid_is_chrooted(task) || gr_check_hidden_task(task)) ++ goto out_put_task; ++ + result = proc_pid_instantiate(dir, dentry, task, NULL); ++out_put_task: + put_task_struct(task); + out: + return result; +@@ -2869,6 +2977,11 @@ int proc_pid_readdir(struct file * filp, + { + unsigned int nr = filp->f_pos - FIRST_PROCESS_ENTRY; + struct task_struct *reaper = get_proc_task(filp->f_path.dentry->d_inode); ++#if defined(CONFIG_GRKERNSEC_PROC_USER) || defined(CONFIG_GRKERNSEC_PROC_USERGROUP) ++ const struct cred *tmpcred = current_cred(); ++ const struct cred *itercred; ++#endif ++ filldir_t __filldir = filldir; + struct tgid_iter iter; + struct pid_namespace *ns; + +@@ -2887,8 +3000,27 @@ int proc_pid_readdir(struct file * filp, + for (iter = next_tgid(ns, iter); + iter.task; + iter.tgid += 1, iter = next_tgid(ns, iter)) { ++#if defined(CONFIG_GRKERNSEC_PROC_USER) || defined(CONFIG_GRKERNSEC_PROC_USERGROUP) ++ rcu_read_lock(); ++ itercred = __task_cred(iter.task); ++#endif ++ if (gr_pid_is_chrooted(iter.task) || gr_check_hidden_task(iter.task) ++#if defined(CONFIG_GRKERNSEC_PROC_USER) || defined(CONFIG_GRKERNSEC_PROC_USERGROUP) ++ || (tmpcred->uid && (itercred->uid != tmpcred->uid) ++#ifdef CONFIG_GRKERNSEC_PROC_USERGROUP ++ && !in_group_p(CONFIG_GRKERNSEC_PROC_GID) ++#endif ++ ) ++#endif ++ ) ++ __filldir = &gr_fake_filldir; ++ else ++ __filldir = filldir; ++#if defined(CONFIG_GRKERNSEC_PROC_USER) || defined(CONFIG_GRKERNSEC_PROC_USERGROUP) ++ rcu_read_unlock(); ++#endif + filp->f_pos = iter.tgid + TGID_OFFSET; +- if (proc_pid_fill_cache(filp, dirent, filldir, iter) < 0) { ++ if (proc_pid_fill_cache(filp, dirent, __filldir, iter) < 0) { + put_task_struct(iter.task); + goto out; + } +@@ -2915,7 +3047,7 @@ static const struct pid_entry tid_base_s + REG("sched", S_IRUGO|S_IWUSR, proc_pid_sched_operations), + #endif + REG("comm", S_IRUGO|S_IWUSR, proc_pid_set_comm_operations), +-#ifdef CONFIG_HAVE_ARCH_TRACEHOOK ++#if defined(CONFIG_HAVE_ARCH_TRACEHOOK) && !defined(CONFIG_GRKERNSEC_PROC_MEMMAP) + INF("syscall", S_IRUSR, proc_pid_syscall), + #endif + INF("cmdline", S_IRUGO, proc_pid_cmdline), +@@ -2942,7 +3074,7 @@ static const struct pid_entry tid_base_s + #ifdef CONFIG_KALLSYMS + INF("wchan", S_IRUGO, proc_pid_wchan), + #endif +-#ifdef CONFIG_STACKTRACE ++#if defined(CONFIG_STACKTRACE) && !defined(CONFIG_GRKERNSEC_HIDESYM) + ONE("stack", S_IRUSR, proc_pid_stack), + #endif + #ifdef CONFIG_SCHEDSTATS +diff -urNp linux-2.6.35.4/fs/proc/cmdline.c linux-2.6.35.4/fs/proc/cmdline.c +--- linux-2.6.35.4/fs/proc/cmdline.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/proc/cmdline.c 2010-09-17 20:12:37.000000000 -0400 +@@ -23,7 +23,11 @@ static const struct file_operations cmdl + + static int __init proc_cmdline_init(void) + { ++#ifdef CONFIG_GRKERNSEC_PROC_ADD ++ proc_create_grsec("cmdline", 0, NULL, &cmdline_proc_fops); ++#else + proc_create("cmdline", 0, NULL, &cmdline_proc_fops); ++#endif + return 0; + } + module_init(proc_cmdline_init); +diff -urNp linux-2.6.35.4/fs/proc/devices.c linux-2.6.35.4/fs/proc/devices.c +--- linux-2.6.35.4/fs/proc/devices.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/proc/devices.c 2010-09-17 20:12:37.000000000 -0400 +@@ -64,7 +64,11 @@ static const struct file_operations proc + + static int __init proc_devices_init(void) + { ++#ifdef CONFIG_GRKERNSEC_PROC_ADD ++ proc_create_grsec("devices", 0, NULL, &proc_devinfo_operations); ++#else + proc_create("devices", 0, NULL, &proc_devinfo_operations); ++#endif + return 0; + } + module_init(proc_devices_init); +diff -urNp linux-2.6.35.4/fs/proc/inode.c linux-2.6.35.4/fs/proc/inode.c +--- linux-2.6.35.4/fs/proc/inode.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/proc/inode.c 2010-09-17 20:12:37.000000000 -0400 +@@ -435,7 +435,11 @@ struct inode *proc_get_inode(struct supe + if (de->mode) { + inode->i_mode = de->mode; + inode->i_uid = de->uid; ++#ifdef CONFIG_GRKERNSEC_PROC_USERGROUP ++ inode->i_gid = CONFIG_GRKERNSEC_PROC_GID; ++#else + inode->i_gid = de->gid; ++#endif + } + if (de->size) + inode->i_size = de->size; +diff -urNp linux-2.6.35.4/fs/proc/internal.h linux-2.6.35.4/fs/proc/internal.h +--- linux-2.6.35.4/fs/proc/internal.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/proc/internal.h 2010-09-17 20:12:37.000000000 -0400 +@@ -51,6 +51,9 @@ extern int proc_pid_status(struct seq_fi + struct pid *pid, struct task_struct *task); + extern int proc_pid_statm(struct seq_file *m, struct pid_namespace *ns, + struct pid *pid, struct task_struct *task); ++#ifdef CONFIG_GRKERNSEC_PROC_IPADDR ++extern int proc_pid_ipaddr(struct task_struct *task, char *buffer); ++#endif + extern loff_t mem_lseek(struct file *file, loff_t offset, int orig); + + extern const struct file_operations proc_maps_operations; +diff -urNp linux-2.6.35.4/fs/proc/Kconfig linux-2.6.35.4/fs/proc/Kconfig +--- linux-2.6.35.4/fs/proc/Kconfig 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/proc/Kconfig 2010-09-17 20:12:37.000000000 -0400 @@ -30,12 +30,12 @@ config PROC_FS config PROC_KCORE @@ -31752,529 +33197,53 @@ diff -urNp linux-2.6.34.1/fs/proc/Kconfig linux-2.6.34.1/fs/proc/Kconfig bool "Enable /proc page monitoring" if EMBEDDED help Various /proc files exist to monitor process memory utilization: -diff -urNp linux-2.6.34.1/fs/proc/array.c linux-2.6.34.1/fs/proc/array.c ---- linux-2.6.34.1/fs/proc/array.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/proc/array.c 2010-07-07 09:04:56.000000000 -0400 -@@ -337,6 +337,21 @@ static void task_cpus_allowed(struct seq - seq_printf(m, "\n"); - } - -+#if defined(CONFIG_PAX_NOEXEC) || defined(CONFIG_PAX_ASLR) -+static inline void task_pax(struct seq_file *m, struct task_struct *p) -+{ -+ if (p->mm) -+ seq_printf(m, "PaX:\t%c%c%c%c%c\n", -+ p->mm->pax_flags & MF_PAX_PAGEEXEC ? 'P' : 'p', -+ p->mm->pax_flags & MF_PAX_EMUTRAMP ? 'E' : 'e', -+ p->mm->pax_flags & MF_PAX_MPROTECT ? 'M' : 'm', -+ p->mm->pax_flags & MF_PAX_RANDMMAP ? 'R' : 'r', -+ p->mm->pax_flags & MF_PAX_SEGMEXEC ? 'S' : 's'); -+ else -+ seq_printf(m, "PaX:\t-----\n"); -+} -+#endif -+ - int proc_pid_status(struct seq_file *m, struct pid_namespace *ns, - struct pid *pid, struct task_struct *task) - { -@@ -357,9 +372,20 @@ int proc_pid_status(struct seq_file *m, - task_show_regs(m, task); - #endif - task_context_switch_counts(m, task); -+ -+#if defined(CONFIG_PAX_NOEXEC) || defined(CONFIG_PAX_ASLR) -+ task_pax(m, task); -+#endif -+ - return 0; - } - -+#ifdef CONFIG_GRKERNSEC_PROC_MEMMAP -+#define PAX_RAND_FLAGS(_mm) (_mm != NULL && _mm != current->mm && \ -+ (_mm->pax_flags & MF_PAX_RANDMMAP || \ -+ _mm->pax_flags & MF_PAX_SEGMEXEC)) -+#endif -+ - static int do_task_stat(struct seq_file *m, struct pid_namespace *ns, - struct pid *pid, struct task_struct *task, int whole) - { -@@ -452,6 +478,19 @@ static int do_task_stat(struct seq_file - gtime = task->gtime; - } - -+#ifdef CONFIG_GRKERNSEC_PROC_MEMMAP -+ if (PAX_RAND_FLAGS(mm)) { -+ eip = 0; -+ esp = 0; -+ wchan = 0; -+ } -+#endif -+#ifdef CONFIG_GRKERNSEC_HIDESYM -+ wchan = 0; -+ eip =0; -+ esp =0; -+#endif -+ - /* scale priority and nice values from timeslices to -20..20 */ - /* to make it look like a "normal" Unix priority/nice value */ - priority = task_prio(task); -@@ -492,9 +531,15 @@ static int do_task_stat(struct seq_file - vsize, - mm ? get_mm_rss(mm) : 0, - rsslim, -+#ifdef CONFIG_GRKERNSEC_PROC_MEMMAP -+ PAX_RAND_FLAGS(mm) ? 1 : (mm ? mm->start_code : 0), -+ PAX_RAND_FLAGS(mm) ? 1 : (mm ? mm->end_code : 0), -+ PAX_RAND_FLAGS(mm) ? 0 : ((permitted && mm) ? mm->start_stack : 0), -+#else - mm ? mm->start_code : 0, - mm ? mm->end_code : 0, - (permitted && mm) ? mm->start_stack : 0, -+#endif - esp, - eip, - /* The signal information here is obsolete. -@@ -547,3 +592,10 @@ int proc_pid_statm(struct seq_file *m, s - - return 0; - } -+ -+#ifdef CONFIG_GRKERNSEC_PROC_IPADDR -+int proc_pid_ipaddr(struct task_struct *task, char *buffer) -+{ -+ return sprintf(buffer, "%pI4\n", &task->signal->curr_ip); -+} -+#endif -diff -urNp linux-2.6.34.1/fs/proc/base.c linux-2.6.34.1/fs/proc/base.c ---- linux-2.6.34.1/fs/proc/base.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/proc/base.c 2010-07-07 09:04:56.000000000 -0400 -@@ -103,6 +103,22 @@ struct pid_entry { - union proc_op op; - }; - -+struct getdents_callback { -+ struct linux_dirent __user * current_dir; -+ struct linux_dirent __user * previous; -+ struct file * file; -+ int count; -+ int error; -+}; -+ -+static int gr_fake_filldir(void * __buf, const char *name, int namlen, -+ loff_t offset, u64 ino, unsigned int d_type) -+{ -+ struct getdents_callback * buf = (struct getdents_callback *) __buf; -+ buf->error = -EINVAL; -+ return 0; -+} -+ - #define NOD(NAME, MODE, IOP, FOP, OP) { \ - .name = (NAME), \ - .len = sizeof(NAME) - 1, \ -@@ -214,6 +230,9 @@ static int check_mem_permission(struct t - if (task == current) - return 0; - -+ if (gr_handle_proc_ptrace(task) || gr_acl_handle_procpidmem(task)) -+ return -EPERM; -+ - /* - * If current is actively ptrace'ing, and would also be - * permitted to freshly attach with ptrace now, permit it. -@@ -261,6 +280,9 @@ static int proc_pid_cmdline(struct task_ - if (!mm->arg_end) - goto out_mm; /* Shh! No looking before we're done */ - -+ if (gr_acl_handle_procpidmem(task)) -+ goto out_mm; -+ - len = mm->arg_end - mm->arg_start; - - if (len > PAGE_SIZE) -@@ -288,12 +310,26 @@ out: - return res; - } - -+#ifdef CONFIG_GRKERNSEC_PROC_MEMMAP -+#define PAX_RAND_FLAGS(_mm) (_mm != NULL && _mm != current->mm && \ -+ (_mm->pax_flags & MF_PAX_RANDMMAP || \ -+ _mm->pax_flags & MF_PAX_SEGMEXEC)) -+#endif -+ - static int proc_pid_auxv(struct task_struct *task, char *buffer) - { - int res = 0; - struct mm_struct *mm = get_task_mm(task); - if (mm) { - unsigned int nwords = 0; -+ -+#ifdef CONFIG_GRKERNSEC_PROC_MEMMAP -+ if (PAX_RAND_FLAGS(mm)) { -+ mmput(mm); -+ return res; -+ } -+#endif -+ - do { - nwords += 2; - } while (mm->saved_auxv[nwords - 2] != 0); /* AT_NULL */ -@@ -329,7 +365,7 @@ static int proc_pid_wchan(struct task_st - } - #endif /* CONFIG_KALLSYMS */ - --#ifdef CONFIG_STACKTRACE -+#if defined(CONFIG_STACKTRACE) && !defined(CONFIG_GRKERNSEC_HIDESYM) - - #define MAX_STACK_TRACE_DEPTH 64 - -@@ -523,7 +559,7 @@ static int proc_pid_limits(struct task_s - return count; - } - --#ifdef CONFIG_HAVE_ARCH_TRACEHOOK -+#if defined(CONFIG_HAVE_ARCH_TRACEHOOK) && !defined(CONFIG_GRKERNSEC_PROC_MEMMAP) - static int proc_pid_syscall(struct task_struct *task, char *buffer) - { - long nr; -@@ -931,6 +967,9 @@ static ssize_t environ_read(struct file - if (!task) - goto out_no_task; - -+ if (gr_acl_handle_procpidmem(task)) -+ goto out; -+ - if (!ptrace_may_access(task, PTRACE_MODE_READ)) - goto out; - -@@ -1520,7 +1559,11 @@ static struct inode *proc_pid_make_inode - rcu_read_lock(); - cred = __task_cred(task); - inode->i_uid = cred->euid; -+#ifdef CONFIG_GRKERNSEC_PROC_USERGROUP -+ inode->i_gid = CONFIG_GRKERNSEC_PROC_GID; -+#else - inode->i_gid = cred->egid; -+#endif - rcu_read_unlock(); - } - security_task_to_inode(task, inode); -@@ -1538,6 +1581,9 @@ static int pid_getattr(struct vfsmount * - struct inode *inode = dentry->d_inode; - struct task_struct *task; - const struct cred *cred; -+#if defined(CONFIG_GRKERNSEC_PROC_USER) || defined(CONFIG_GRKERNSEC_PROC_USERGROUP) -+ const struct cred *tmpcred = current_cred(); -+#endif - - generic_fillattr(inode, stat); - -@@ -1545,12 +1591,34 @@ static int pid_getattr(struct vfsmount * - stat->uid = 0; - stat->gid = 0; - task = pid_task(proc_pid(inode), PIDTYPE_PID); -+ -+ if (task && (gr_pid_is_chrooted(task) || gr_check_hidden_task(task))) { -+ rcu_read_unlock(); -+ return -ENOENT; -+ } +diff -urNp linux-2.6.35.4/fs/proc/kcore.c linux-2.6.35.4/fs/proc/kcore.c +--- linux-2.6.35.4/fs/proc/kcore.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/proc/kcore.c 2010-09-17 20:12:37.000000000 -0400 +@@ -478,9 +478,10 @@ read_kcore(struct file *file, char __use + * the addresses in the elf_phdr on our list. + */ + start = kc_offset_to_vaddr(*fpos - elf_buflen); +- if ((tsz = (PAGE_SIZE - (start & ~PAGE_MASK))) > buflen) ++ tsz = PAGE_SIZE - (start & ~PAGE_MASK); ++ if (tsz > buflen) + tsz = buflen; +- + - if (task) { -+ cred = __task_cred(task); -+#if defined(CONFIG_GRKERNSEC_PROC_USER) || defined(CONFIG_GRKERNSEC_PROC_USERGROUP) -+ if (!tmpcred->uid || (tmpcred->uid == cred->uid) -+#ifdef CONFIG_GRKERNSEC_PROC_USERGROUP -+ || in_group_p(CONFIG_GRKERNSEC_PROC_GID) -+#endif -+ ) -+#endif - if ((inode->i_mode == (S_IFDIR|S_IRUGO|S_IXUGO)) || -+#ifdef CONFIG_GRKERNSEC_PROC_USER -+ (inode->i_mode == (S_IFDIR|S_IRUSR|S_IXUSR)) || -+#elif defined(CONFIG_GRKERNSEC_PROC_USERGROUP) -+ (inode->i_mode == (S_IFDIR|S_IRUSR|S_IRGRP|S_IXUSR|S_IXGRP)) || -+#endif - task_dumpable(task)) { -- cred = __task_cred(task); - stat->uid = cred->euid; -+#ifdef CONFIG_GRKERNSEC_PROC_USERGROUP -+ stat->gid = CONFIG_GRKERNSEC_PROC_GID; -+#else - stat->gid = cred->egid; -+#endif - } - } - rcu_read_unlock(); -@@ -1582,11 +1650,20 @@ static int pid_revalidate(struct dentry + while (buflen) { + struct kcore_list *m; - if (task) { - if ((inode->i_mode == (S_IFDIR|S_IRUGO|S_IXUGO)) || -+#ifdef CONFIG_GRKERNSEC_PROC_USER -+ (inode->i_mode == (S_IFDIR|S_IRUSR|S_IXUSR)) || -+#elif defined(CONFIG_GRKERNSEC_PROC_USERGROUP) -+ (inode->i_mode == (S_IFDIR|S_IRUSR|S_IRGRP|S_IXUSR|S_IXGRP)) || -+#endif - task_dumpable(task)) { - rcu_read_lock(); - cred = __task_cred(task); - inode->i_uid = cred->euid; -+#ifdef CONFIG_GRKERNSEC_PROC_USERGROUP -+ inode->i_gid = CONFIG_GRKERNSEC_PROC_GID; -+#else - inode->i_gid = cred->egid; -+#endif - rcu_read_unlock(); +@@ -509,20 +510,18 @@ read_kcore(struct file *file, char __use + kfree(elf_buf); } else { - inode->i_uid = 0; -@@ -1707,7 +1784,8 @@ static int proc_fd_info(struct inode *in - int fd = proc_fd(inode); - - if (task) { -- files = get_files_struct(task); -+ if (!gr_acl_handle_procpidmem(task)) -+ files = get_files_struct(task); - put_task_struct(task); - } - if (files) { -@@ -1959,12 +2037,22 @@ static const struct file_operations proc - static int proc_fd_permission(struct inode *inode, int mask) - { - int rv; -+ struct task_struct *task; - - rv = generic_permission(inode, mask, NULL); -- if (rv == 0) -- return 0; -+ - if (task_pid(current) == proc_pid(inode)) - rv = 0; -+ -+ task = get_proc_task(inode); -+ if (task == NULL) -+ return rv; -+ -+ if (gr_acl_handle_procpidmem(task)) -+ rv = -EACCES; -+ -+ put_task_struct(task); -+ - return rv; - } - -@@ -2073,6 +2161,9 @@ static struct dentry *proc_pident_lookup - if (!task) - goto out_no_task; - -+ if (gr_pid_is_chrooted(task) || gr_check_hidden_task(task)) -+ goto out; -+ - /* - * Yes, it does not scale. And it should not. Don't add - * new entries into /proc// without very good reasons. -@@ -2117,6 +2208,9 @@ static int proc_pident_readdir(struct fi - if (!task) - goto out_no_task; - -+ if (gr_pid_is_chrooted(task) || gr_check_hidden_task(task)) -+ goto out; -+ - ret = 0; - i = filp->f_pos; - switch (i) { -@@ -2384,7 +2478,7 @@ static void *proc_self_follow_link(struc - static void proc_self_put_link(struct dentry *dentry, struct nameidata *nd, - void *cookie) - { -- char *s = nd_get_link(nd); -+ const char *s = nd_get_link(nd); - if (!IS_ERR(s)) - __putname(s); - } -@@ -2497,6 +2591,9 @@ static struct dentry *proc_base_lookup(s - if (p > last) - goto out; - -+ if (gr_pid_is_chrooted(task) || gr_check_hidden_task(task)) -+ goto out; -+ - error = proc_base_instantiate(dir, dentry, task, p); - - out: -@@ -2584,7 +2681,7 @@ static const struct pid_entry tgid_base_ - REG("sched", S_IRUGO|S_IWUSR, proc_pid_sched_operations), - #endif - REG("comm", S_IRUGO|S_IWUSR, proc_pid_set_comm_operations), --#ifdef CONFIG_HAVE_ARCH_TRACEHOOK -+#if defined(CONFIG_HAVE_ARCH_TRACEHOOK) && !defined(CONFIG_GRKERNSEC_PROC_MEMMAP) - INF("syscall", S_IRUSR, proc_pid_syscall), - #endif - INF("cmdline", S_IRUGO, proc_pid_cmdline), -@@ -2612,7 +2709,7 @@ static const struct pid_entry tgid_base_ - #ifdef CONFIG_KALLSYMS - INF("wchan", S_IRUGO, proc_pid_wchan), - #endif --#ifdef CONFIG_STACKTRACE -+#if defined(CONFIG_STACKTRACE) && !defined(CONFIG_GRKERNSEC_HIDESYM) - ONE("stack", S_IRUSR, proc_pid_stack), - #endif - #ifdef CONFIG_SCHEDSTATS -@@ -2642,6 +2739,9 @@ static const struct pid_entry tgid_base_ - #ifdef CONFIG_TASK_IO_ACCOUNTING - INF("io", S_IRUGO, proc_tgid_io_accounting), - #endif -+#ifdef CONFIG_GRKERNSEC_PROC_IPADDR -+ INF("ipaddr", S_IRUSR, proc_pid_ipaddr), -+#endif - }; - - static int proc_tgid_base_readdir(struct file * filp, -@@ -2766,7 +2866,14 @@ static struct dentry *proc_pid_instantia - if (!inode) - goto out; - -+#ifdef CONFIG_GRKERNSEC_PROC_USER -+ inode->i_mode = S_IFDIR|S_IRUSR|S_IXUSR; -+#elif defined(CONFIG_GRKERNSEC_PROC_USERGROUP) -+ inode->i_gid = CONFIG_GRKERNSEC_PROC_GID; -+ inode->i_mode = S_IFDIR|S_IRUSR|S_IRGRP|S_IXUSR|S_IXGRP; -+#else - inode->i_mode = S_IFDIR|S_IRUGO|S_IXUGO; -+#endif - inode->i_op = &proc_tgid_base_inode_operations; - inode->i_fop = &proc_tgid_base_operations; - inode->i_flags|=S_IMMUTABLE; -@@ -2808,7 +2915,11 @@ struct dentry *proc_pid_lookup(struct in - if (!task) - goto out; - -+ if (gr_check_hidden_task(task)) -+ goto out_put_task; -+ - result = proc_pid_instantiate(dir, dentry, task, NULL); -+out_put_task: - put_task_struct(task); - out: - return result; -@@ -2873,6 +2984,11 @@ int proc_pid_readdir(struct file * filp, - { - unsigned int nr = filp->f_pos - FIRST_PROCESS_ENTRY; - struct task_struct *reaper = get_proc_task(filp->f_path.dentry->d_inode); -+#if defined(CONFIG_GRKERNSEC_PROC_USER) || defined(CONFIG_GRKERNSEC_PROC_USERGROUP) -+ const struct cred *tmpcred = current_cred(); -+ const struct cred *itercred; -+#endif -+ filldir_t __filldir = filldir; - struct tgid_iter iter; - struct pid_namespace *ns; - -@@ -2891,8 +3007,27 @@ int proc_pid_readdir(struct file * filp, - for (iter = next_tgid(ns, iter); - iter.task; - iter.tgid += 1, iter = next_tgid(ns, iter)) { -+#if defined(CONFIG_GRKERNSEC_PROC_USER) || defined(CONFIG_GRKERNSEC_PROC_USERGROUP) -+ rcu_read_lock(); -+ itercred = __task_cred(iter.task); -+#endif -+ if (gr_pid_is_chrooted(iter.task) || gr_check_hidden_task(iter.task) -+#if defined(CONFIG_GRKERNSEC_PROC_USER) || defined(CONFIG_GRKERNSEC_PROC_USERGROUP) -+ || (tmpcred->uid && (itercred->uid != tmpcred->uid) -+#ifdef CONFIG_GRKERNSEC_PROC_USERGROUP -+ && !in_group_p(CONFIG_GRKERNSEC_PROC_GID) -+#endif -+ ) -+#endif -+ ) -+ __filldir = &gr_fake_filldir; -+ else -+ __filldir = filldir; -+#if defined(CONFIG_GRKERNSEC_PROC_USER) || defined(CONFIG_GRKERNSEC_PROC_USERGROUP) -+ rcu_read_unlock(); -+#endif - filp->f_pos = iter.tgid + TGID_OFFSET; -- if (proc_pid_fill_cache(filp, dirent, filldir, iter) < 0) { -+ if (proc_pid_fill_cache(filp, dirent, __filldir, iter) < 0) { - put_task_struct(iter.task); - goto out; - } -@@ -2919,7 +3054,7 @@ static const struct pid_entry tid_base_s - REG("sched", S_IRUGO|S_IWUSR, proc_pid_sched_operations), - #endif - REG("comm", S_IRUGO|S_IWUSR, proc_pid_set_comm_operations), --#ifdef CONFIG_HAVE_ARCH_TRACEHOOK -+#if defined(CONFIG_HAVE_ARCH_TRACEHOOK) && !defined(CONFIG_GRKERNSEC_PROC_MEMMAP) - INF("syscall", S_IRUSR, proc_pid_syscall), - #endif - INF("cmdline", S_IRUGO, proc_pid_cmdline), -@@ -2946,7 +3081,7 @@ static const struct pid_entry tid_base_s - #ifdef CONFIG_KALLSYMS - INF("wchan", S_IRUGO, proc_pid_wchan), - #endif --#ifdef CONFIG_STACKTRACE -+#if defined(CONFIG_STACKTRACE) && !defined(CONFIG_GRKERNSEC_HIDESYM) - ONE("stack", S_IRUSR, proc_pid_stack), - #endif - #ifdef CONFIG_SCHEDSTATS -diff -urNp linux-2.6.34.1/fs/proc/cmdline.c linux-2.6.34.1/fs/proc/cmdline.c ---- linux-2.6.34.1/fs/proc/cmdline.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/proc/cmdline.c 2010-07-07 09:04:56.000000000 -0400 -@@ -23,7 +23,11 @@ static const struct file_operations cmdl - - static int __init proc_cmdline_init(void) - { -+#ifdef CONFIG_GRKERNSEC_PROC_ADD -+ proc_create_grsec("cmdline", 0, NULL, &cmdline_proc_fops); -+#else - proc_create("cmdline", 0, NULL, &cmdline_proc_fops); -+#endif - return 0; - } - module_init(proc_cmdline_init); -diff -urNp linux-2.6.34.1/fs/proc/devices.c linux-2.6.34.1/fs/proc/devices.c ---- linux-2.6.34.1/fs/proc/devices.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/proc/devices.c 2010-07-07 09:04:56.000000000 -0400 -@@ -64,7 +64,11 @@ static const struct file_operations proc - - static int __init proc_devices_init(void) - { -+#ifdef CONFIG_GRKERNSEC_PROC_ADD -+ proc_create_grsec("devices", 0, NULL, &proc_devinfo_operations); -+#else - proc_create("devices", 0, NULL, &proc_devinfo_operations); -+#endif - return 0; - } - module_init(proc_devices_init); -diff -urNp linux-2.6.34.1/fs/proc/inode.c linux-2.6.34.1/fs/proc/inode.c ---- linux-2.6.34.1/fs/proc/inode.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/proc/inode.c 2010-07-07 09:04:56.000000000 -0400 -@@ -435,7 +435,11 @@ struct inode *proc_get_inode(struct supe - if (de->mode) { - inode->i_mode = de->mode; - inode->i_uid = de->uid; -+#ifdef CONFIG_GRKERNSEC_PROC_USERGROUP -+ inode->i_gid = CONFIG_GRKERNSEC_PROC_GID; -+#else - inode->i_gid = de->gid; -+#endif - } - if (de->size) - inode->i_size = de->size; -diff -urNp linux-2.6.34.1/fs/proc/internal.h linux-2.6.34.1/fs/proc/internal.h ---- linux-2.6.34.1/fs/proc/internal.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/proc/internal.h 2010-07-07 09:04:56.000000000 -0400 -@@ -51,6 +51,9 @@ extern int proc_pid_status(struct seq_fi - struct pid *pid, struct task_struct *task); - extern int proc_pid_statm(struct seq_file *m, struct pid_namespace *ns, - struct pid *pid, struct task_struct *task); -+#ifdef CONFIG_GRKERNSEC_PROC_IPADDR -+extern int proc_pid_ipaddr(struct task_struct *task, char *buffer); -+#endif - extern loff_t mem_lseek(struct file *file, loff_t offset, int orig); - - extern const struct file_operations proc_maps_operations; -diff -urNp linux-2.6.34.1/fs/proc/kcore.c linux-2.6.34.1/fs/proc/kcore.c ---- linux-2.6.34.1/fs/proc/kcore.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/proc/kcore.c 2010-07-07 09:04:56.000000000 -0400 -@@ -542,6 +542,9 @@ read_kcore(struct file *file, char __use + if (kern_addr_valid(start)) { +- unsigned long n; ++ char *elf_buf; + +- n = copy_to_user(buffer, (char *)start, tsz); +- /* +- * We cannot distingush between fault on source +- * and fault on destination. When this happens +- * we clear too and hope it will trigger the +- * EFAULT again. +- */ +- if (n) { +- if (clear_user(buffer + tsz - n, +- n)) ++ elf_buf = kmalloc(tsz, GFP_KERNEL); ++ if (!elf_buf) ++ return -ENOMEM; ++ if (!__copy_from_user(elf_buf, (const void __user *)start, tsz)) { ++ if (copy_to_user(buffer, elf_buf, tsz)) { ++ kfree(elf_buf); + return -EFAULT; ++ } + } ++ kfree(elf_buf); + } else { + if (clear_user(buffer, tsz)) + return -EFAULT; +@@ -542,6 +541,9 @@ read_kcore(struct file *file, char __use static int open_kcore(struct inode *inode, struct file *filp) { @@ -32284,9 +33253,9 @@ diff -urNp linux-2.6.34.1/fs/proc/kcore.c linux-2.6.34.1/fs/proc/kcore.c if (!capable(CAP_SYS_RAWIO)) return -EPERM; if (kcore_need_update) -diff -urNp linux-2.6.34.1/fs/proc/meminfo.c linux-2.6.34.1/fs/proc/meminfo.c ---- linux-2.6.34.1/fs/proc/meminfo.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/proc/meminfo.c 2010-07-07 09:04:56.000000000 -0400 +diff -urNp linux-2.6.35.4/fs/proc/meminfo.c linux-2.6.35.4/fs/proc/meminfo.c +--- linux-2.6.35.4/fs/proc/meminfo.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/proc/meminfo.c 2010-09-17 20:12:09.000000000 -0400 @@ -149,7 +149,7 @@ static int meminfo_proc_show(struct seq_ vmi.used >> 10, vmi.largest_chunk >> 10 @@ -32296,9 +33265,9 @@ diff -urNp linux-2.6.34.1/fs/proc/meminfo.c linux-2.6.34.1/fs/proc/meminfo.c #endif ); -diff -urNp linux-2.6.34.1/fs/proc/nommu.c linux-2.6.34.1/fs/proc/nommu.c ---- linux-2.6.34.1/fs/proc/nommu.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/proc/nommu.c 2010-07-07 09:04:56.000000000 -0400 +diff -urNp linux-2.6.35.4/fs/proc/nommu.c linux-2.6.35.4/fs/proc/nommu.c +--- linux-2.6.35.4/fs/proc/nommu.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/proc/nommu.c 2010-09-17 20:12:09.000000000 -0400 @@ -66,7 +66,7 @@ static int nommu_region_show(struct seq_ if (len < 1) len = 1; @@ -32308,9 +33277,9 @@ diff -urNp linux-2.6.34.1/fs/proc/nommu.c linux-2.6.34.1/fs/proc/nommu.c } seq_putc(m, '\n'); -diff -urNp linux-2.6.34.1/fs/proc/proc_net.c linux-2.6.34.1/fs/proc/proc_net.c ---- linux-2.6.34.1/fs/proc/proc_net.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/proc/proc_net.c 2010-07-07 09:04:56.000000000 -0400 +diff -urNp linux-2.6.35.4/fs/proc/proc_net.c linux-2.6.35.4/fs/proc/proc_net.c +--- linux-2.6.35.4/fs/proc/proc_net.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/proc/proc_net.c 2010-09-17 20:12:37.000000000 -0400 @@ -105,6 +105,17 @@ static struct net *get_proc_task_net(str struct task_struct *task; struct nsproxy *ns; @@ -32329,9 +33298,9 @@ diff -urNp linux-2.6.34.1/fs/proc/proc_net.c linux-2.6.34.1/fs/proc/proc_net.c rcu_read_lock(); task = pid_task(proc_pid(dir), PIDTYPE_PID); -diff -urNp linux-2.6.34.1/fs/proc/proc_sysctl.c linux-2.6.34.1/fs/proc/proc_sysctl.c ---- linux-2.6.34.1/fs/proc/proc_sysctl.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/proc/proc_sysctl.c 2010-07-07 09:04:56.000000000 -0400 +diff -urNp linux-2.6.35.4/fs/proc/proc_sysctl.c linux-2.6.35.4/fs/proc/proc_sysctl.c +--- linux-2.6.35.4/fs/proc/proc_sysctl.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/proc/proc_sysctl.c 2010-09-17 20:12:37.000000000 -0400 @@ -7,6 +7,8 @@ #include #include "internal.h" @@ -32371,10 +33340,10 @@ diff -urNp linux-2.6.34.1/fs/proc/proc_sysctl.c linux-2.6.34.1/fs/proc/proc_sysc generic_fillattr(inode, stat); if (table) stat->mode = (stat->mode & S_IFMT) | table->mode; -diff -urNp linux-2.6.34.1/fs/proc/root.c linux-2.6.34.1/fs/proc/root.c ---- linux-2.6.34.1/fs/proc/root.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/proc/root.c 2010-07-07 09:04:56.000000000 -0400 -@@ -134,7 +134,15 @@ void __init proc_root_init(void) +diff -urNp linux-2.6.35.4/fs/proc/root.c linux-2.6.35.4/fs/proc/root.c +--- linux-2.6.35.4/fs/proc/root.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/proc/root.c 2010-09-17 20:12:37.000000000 -0400 +@@ -133,7 +133,15 @@ void __init proc_root_init(void) #ifdef CONFIG_PROC_DEVICETREE proc_device_tree_init(); #endif @@ -32390,9 +33359,9 @@ diff -urNp linux-2.6.34.1/fs/proc/root.c linux-2.6.34.1/fs/proc/root.c proc_sys_init(); } -diff -urNp linux-2.6.34.1/fs/proc/task_mmu.c linux-2.6.34.1/fs/proc/task_mmu.c ---- linux-2.6.34.1/fs/proc/task_mmu.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/proc/task_mmu.c 2010-07-07 09:04:56.000000000 -0400 +diff -urNp linux-2.6.35.4/fs/proc/task_mmu.c linux-2.6.35.4/fs/proc/task_mmu.c +--- linux-2.6.35.4/fs/proc/task_mmu.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/proc/task_mmu.c 2010-09-17 20:12:37.000000000 -0400 @@ -49,8 +49,13 @@ void task_mem(struct seq_file *m, struct "VmExe:\t%8lu kB\n" "VmLib:\t%8lu kB\n" @@ -32437,15 +33406,30 @@ diff -urNp linux-2.6.34.1/fs/proc/task_mmu.c linux-2.6.34.1/fs/proc/task_mmu.c static void show_map_vma(struct seq_file *m, struct vm_area_struct *vma) { struct mm_struct *mm = vma->vm_mm; -@@ -221,13 +238,22 @@ static void show_map_vma(struct seq_file +@@ -210,7 +227,6 @@ static void show_map_vma(struct seq_file + int flags = vma->vm_flags; + unsigned long ino = 0; + unsigned long long pgoff = 0; +- unsigned long start; + dev_t dev = 0; + int len; + +@@ -221,19 +237,24 @@ static void show_map_vma(struct seq_file + pgoff = ((loff_t)vma->vm_pgoff) << PAGE_SHIFT; } +- /* We don't show the stack guard page in /proc/maps */ +- start = vma->vm_start; +- if (vma->vm_flags & VM_GROWSDOWN) +- start += PAGE_SIZE; + seq_printf(m, "%08lx-%08lx %c%c%c%c %08llx %02x:%02x %lu %n", +- start, +#ifdef CONFIG_GRKERNSEC_PROC_MEMMAP + PAX_RAND_FLAGS(mm) ? 0UL : vma->vm_start, + PAX_RAND_FLAGS(mm) ? 0UL : vma->vm_end, +#else - vma->vm_start, ++ vma->vm_start, vma->vm_end, +#endif flags & VM_READ ? 'r' : '-', @@ -32460,7 +33444,7 @@ diff -urNp linux-2.6.34.1/fs/proc/task_mmu.c linux-2.6.34.1/fs/proc/task_mmu.c MAJOR(dev), MINOR(dev), ino, &len); /* -@@ -236,16 +262,16 @@ static void show_map_vma(struct seq_file +@@ -242,16 +263,16 @@ static void show_map_vma(struct seq_file */ if (file) { pad_len_spaces(m, len); @@ -32482,7 +33466,7 @@ diff -urNp linux-2.6.34.1/fs/proc/task_mmu.c linux-2.6.34.1/fs/proc/task_mmu.c name = "[stack]"; } } else { -@@ -387,11 +413,16 @@ static int show_smap(struct seq_file *m, +@@ -393,11 +414,16 @@ static int show_smap(struct seq_file *m, }; memset(&mss, 0, sizeof mss); @@ -32504,7 +33488,7 @@ diff -urNp linux-2.6.34.1/fs/proc/task_mmu.c linux-2.6.34.1/fs/proc/task_mmu.c show_map_vma(m, vma); seq_printf(m, -@@ -406,7 +437,11 @@ static int show_smap(struct seq_file *m, +@@ -412,7 +438,11 @@ static int show_smap(struct seq_file *m, "Swap: %8lu kB\n" "KernelPageSize: %8lu kB\n" "MMUPageSize: %8lu kB\n", @@ -32516,9 +33500,9 @@ diff -urNp linux-2.6.34.1/fs/proc/task_mmu.c linux-2.6.34.1/fs/proc/task_mmu.c mss.resident >> 10, (unsigned long)(mss.pss >> (10 + PSS_SHIFT)), mss.shared_clean >> 10, -diff -urNp linux-2.6.34.1/fs/proc/task_nommu.c linux-2.6.34.1/fs/proc/task_nommu.c ---- linux-2.6.34.1/fs/proc/task_nommu.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/proc/task_nommu.c 2010-07-07 09:04:56.000000000 -0400 +diff -urNp linux-2.6.35.4/fs/proc/task_nommu.c linux-2.6.35.4/fs/proc/task_nommu.c +--- linux-2.6.35.4/fs/proc/task_nommu.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/proc/task_nommu.c 2010-09-17 20:12:09.000000000 -0400 @@ -51,7 +51,7 @@ void task_mem(struct seq_file *m, struct else bytes += kobjsize(mm); @@ -32528,18 +33512,18 @@ diff -urNp linux-2.6.34.1/fs/proc/task_nommu.c linux-2.6.34.1/fs/proc/task_nommu sbytes += kobjsize(current->fs); else bytes += kobjsize(current->fs); -@@ -159,7 +159,7 @@ static int nommu_vma_show(struct seq_fil - if (len < 1) - len = 1; - seq_printf(m, "%*c", len, ' '); +@@ -165,7 +165,7 @@ static int nommu_vma_show(struct seq_fil + + if (file) { + pad_len_spaces(m, len); - seq_path(m, &file->f_path, ""); + seq_path(m, &file->f_path, "\n\\"); - } - - seq_putc(m, '\n'); -diff -urNp linux-2.6.34.1/fs/readdir.c linux-2.6.34.1/fs/readdir.c ---- linux-2.6.34.1/fs/readdir.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/readdir.c 2010-07-07 09:04:56.000000000 -0400 + } else if (mm) { + if (vma->vm_start <= mm->start_stack && + vma->vm_end >= mm->start_stack) { +diff -urNp linux-2.6.35.4/fs/readdir.c linux-2.6.35.4/fs/readdir.c +--- linux-2.6.35.4/fs/readdir.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/readdir.c 2010-09-17 20:12:37.000000000 -0400 @@ -16,6 +16,7 @@ #include #include @@ -32629,9 +33613,9 @@ diff -urNp linux-2.6.34.1/fs/readdir.c linux-2.6.34.1/fs/readdir.c buf.count = count; buf.error = 0; -diff -urNp linux-2.6.34.1/fs/reiserfs/do_balan.c linux-2.6.34.1/fs/reiserfs/do_balan.c ---- linux-2.6.34.1/fs/reiserfs/do_balan.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/reiserfs/do_balan.c 2010-07-07 09:04:56.000000000 -0400 +diff -urNp linux-2.6.35.4/fs/reiserfs/do_balan.c linux-2.6.35.4/fs/reiserfs/do_balan.c +--- linux-2.6.35.4/fs/reiserfs/do_balan.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/reiserfs/do_balan.c 2010-09-17 20:12:09.000000000 -0400 @@ -2051,7 +2051,7 @@ void do_balance(struct tree_balance *tb, return; } @@ -32641,9 +33625,9 @@ diff -urNp linux-2.6.34.1/fs/reiserfs/do_balan.c linux-2.6.34.1/fs/reiserfs/do_b do_balance_starts(tb); /* balance leaf returns 0 except if combining L R and S into -diff -urNp linux-2.6.34.1/fs/reiserfs/item_ops.c linux-2.6.34.1/fs/reiserfs/item_ops.c ---- linux-2.6.34.1/fs/reiserfs/item_ops.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/reiserfs/item_ops.c 2010-07-07 09:04:56.000000000 -0400 +diff -urNp linux-2.6.35.4/fs/reiserfs/item_ops.c linux-2.6.35.4/fs/reiserfs/item_ops.c +--- linux-2.6.35.4/fs/reiserfs/item_ops.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/reiserfs/item_ops.c 2010-09-17 20:12:09.000000000 -0400 @@ -102,7 +102,7 @@ static void sd_print_vi(struct virtual_i vi->vi_index, vi->vi_type, vi->vi_ih); } @@ -32698,9 +33682,9 @@ diff -urNp linux-2.6.34.1/fs/reiserfs/item_ops.c linux-2.6.34.1/fs/reiserfs/item &stat_data_ops, &indirect_ops, &direct_ops, -diff -urNp linux-2.6.34.1/fs/reiserfs/procfs.c linux-2.6.34.1/fs/reiserfs/procfs.c ---- linux-2.6.34.1/fs/reiserfs/procfs.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/reiserfs/procfs.c 2010-07-07 09:04:56.000000000 -0400 +diff -urNp linux-2.6.35.4/fs/reiserfs/procfs.c linux-2.6.35.4/fs/reiserfs/procfs.c +--- linux-2.6.35.4/fs/reiserfs/procfs.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/reiserfs/procfs.c 2010-09-17 20:12:09.000000000 -0400 @@ -113,7 +113,7 @@ static int show_super(struct seq_file *m "SMALL_TAILS " : "NO_TAILS ", replay_only(sb) ? "REPLAY_ONLY " : "", @@ -32710,9 +33694,9 @@ diff -urNp linux-2.6.34.1/fs/reiserfs/procfs.c linux-2.6.34.1/fs/reiserfs/procfs SF(s_disk_reads), SF(s_disk_writes), SF(s_fix_nodes), SF(s_do_balance), SF(s_unneeded_left_neighbor), SF(s_good_search_by_key_reada), SF(s_bmaps), -diff -urNp linux-2.6.34.1/fs/select.c linux-2.6.34.1/fs/select.c ---- linux-2.6.34.1/fs/select.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/select.c 2010-07-07 09:04:56.000000000 -0400 +diff -urNp linux-2.6.35.4/fs/select.c linux-2.6.35.4/fs/select.c +--- linux-2.6.35.4/fs/select.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/select.c 2010-09-17 20:12:37.000000000 -0400 @@ -20,6 +20,7 @@ #include #include @@ -32729,9 +33713,9 @@ diff -urNp linux-2.6.34.1/fs/select.c linux-2.6.34.1/fs/select.c if (nfds > rlimit(RLIMIT_NOFILE)) return -EINVAL; -diff -urNp linux-2.6.34.1/fs/seq_file.c linux-2.6.34.1/fs/seq_file.c ---- linux-2.6.34.1/fs/seq_file.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/seq_file.c 2010-07-07 09:04:56.000000000 -0400 +diff -urNp linux-2.6.35.4/fs/seq_file.c linux-2.6.35.4/fs/seq_file.c +--- linux-2.6.35.4/fs/seq_file.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/seq_file.c 2010-09-17 20:12:09.000000000 -0400 @@ -76,7 +76,8 @@ static int traverse(struct seq_file *m, return 0; } @@ -32772,10 +33756,10 @@ diff -urNp linux-2.6.34.1/fs/seq_file.c linux-2.6.34.1/fs/seq_file.c if (!m->buf) goto Enomem; m->count = 0; -diff -urNp linux-2.6.34.1/fs/smbfs/symlink.c linux-2.6.34.1/fs/smbfs/symlink.c ---- linux-2.6.34.1/fs/smbfs/symlink.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/smbfs/symlink.c 2010-07-07 09:04:56.000000000 -0400 -@@ -56,7 +56,7 @@ static void *smb_follow_link(struct dent +diff -urNp linux-2.6.35.4/fs/smbfs/symlink.c linux-2.6.35.4/fs/smbfs/symlink.c +--- linux-2.6.35.4/fs/smbfs/symlink.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/smbfs/symlink.c 2010-09-17 20:12:09.000000000 -0400 +@@ -55,7 +55,7 @@ static void *smb_follow_link(struct dent static void smb_put_link(struct dentry *dentry, struct nameidata *nd, void *p) { @@ -32784,9 +33768,9 @@ diff -urNp linux-2.6.34.1/fs/smbfs/symlink.c linux-2.6.34.1/fs/smbfs/symlink.c if (!IS_ERR(s)) __putname(s); } -diff -urNp linux-2.6.34.1/fs/splice.c linux-2.6.34.1/fs/splice.c ---- linux-2.6.34.1/fs/splice.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/splice.c 2010-07-07 09:04:56.000000000 -0400 +diff -urNp linux-2.6.35.4/fs/splice.c linux-2.6.35.4/fs/splice.c +--- linux-2.6.35.4/fs/splice.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/splice.c 2010-09-17 20:12:09.000000000 -0400 @@ -186,7 +186,7 @@ ssize_t splice_to_pipe(struct pipe_inode pipe_lock(pipe); @@ -32808,7 +33792,7 @@ diff -urNp linux-2.6.34.1/fs/splice.c linux-2.6.34.1/fs/splice.c } pipe_unlock(pipe); -@@ -532,7 +532,7 @@ static ssize_t kernel_readv(struct file +@@ -566,7 +566,7 @@ static ssize_t kernel_readv(struct file old_fs = get_fs(); set_fs(get_ds()); /* The cast to a user pointer is valid due to the set_fs() */ @@ -32817,7 +33801,7 @@ diff -urNp linux-2.6.34.1/fs/splice.c linux-2.6.34.1/fs/splice.c set_fs(old_fs); return res; -@@ -547,7 +547,7 @@ static ssize_t kernel_write(struct file +@@ -581,7 +581,7 @@ static ssize_t kernel_write(struct file old_fs = get_fs(); set_fs(get_ds()); /* The cast to a user pointer is valid due to the set_fs() */ @@ -32826,16 +33810,16 @@ diff -urNp linux-2.6.34.1/fs/splice.c linux-2.6.34.1/fs/splice.c set_fs(old_fs); return res; -@@ -589,7 +589,7 @@ ssize_t default_file_splice_read(struct +@@ -634,7 +634,7 @@ ssize_t default_file_splice_read(struct goto err; this_len = min_t(size_t, len, PAGE_CACHE_SIZE - offset); - vec[i].iov_base = (void __user *) page_address(page); + vec[i].iov_base = (__force void __user *) page_address(page); vec[i].iov_len = this_len; - pages[i] = page; + spd.pages[i] = page; spd.nr_pages++; -@@ -811,10 +811,10 @@ EXPORT_SYMBOL(splice_from_pipe_feed); +@@ -861,10 +861,10 @@ EXPORT_SYMBOL(splice_from_pipe_feed); int splice_from_pipe_next(struct pipe_inode_info *pipe, struct splice_desc *sd) { while (!pipe->nrbufs) { @@ -32848,7 +33832,7 @@ diff -urNp linux-2.6.34.1/fs/splice.c linux-2.6.34.1/fs/splice.c return 0; if (sd->flags & SPLICE_F_NONBLOCK) -@@ -1151,7 +1151,7 @@ ssize_t splice_direct_to_actor(struct fi +@@ -1201,7 +1201,7 @@ ssize_t splice_direct_to_actor(struct fi * out of the pipe right after the splice_to_pipe(). So set * PIPE_READERS appropriately. */ @@ -32857,7 +33841,7 @@ diff -urNp linux-2.6.34.1/fs/splice.c linux-2.6.34.1/fs/splice.c current->splice_pipe = pipe; } -@@ -1711,9 +1711,9 @@ static int ipipe_prep(struct pipe_inode_ +@@ -1769,9 +1769,9 @@ static int ipipe_prep(struct pipe_inode_ ret = -ERESTARTSYS; break; } @@ -32869,16 +33853,16 @@ diff -urNp linux-2.6.34.1/fs/splice.c linux-2.6.34.1/fs/splice.c if (flags & SPLICE_F_NONBLOCK) { ret = -EAGAIN; break; -@@ -1745,7 +1745,7 @@ static int opipe_prep(struct pipe_inode_ +@@ -1803,7 +1803,7 @@ static int opipe_prep(struct pipe_inode_ pipe_lock(pipe); - while (pipe->nrbufs >= PIPE_BUFFERS) { + while (pipe->nrbufs >= pipe->buffers) { - if (!pipe->readers) { + if (!atomic_read(&pipe->readers)) { send_sig(SIGPIPE, current, 0); ret = -EPIPE; break; -@@ -1758,9 +1758,9 @@ static int opipe_prep(struct pipe_inode_ +@@ -1816,9 +1816,9 @@ static int opipe_prep(struct pipe_inode_ ret = -ERESTARTSYS; break; } @@ -32890,7 +33874,7 @@ diff -urNp linux-2.6.34.1/fs/splice.c linux-2.6.34.1/fs/splice.c } pipe_unlock(pipe); -@@ -1796,14 +1796,14 @@ retry: +@@ -1854,14 +1854,14 @@ retry: pipe_double_lock(ipipe, opipe); do { @@ -32907,7 +33891,7 @@ diff -urNp linux-2.6.34.1/fs/splice.c linux-2.6.34.1/fs/splice.c break; /* -@@ -1903,7 +1903,7 @@ static int link_pipe(struct pipe_inode_i +@@ -1961,7 +1961,7 @@ static int link_pipe(struct pipe_inode_i pipe_double_lock(ipipe, opipe); do { @@ -32916,7 +33900,7 @@ diff -urNp linux-2.6.34.1/fs/splice.c linux-2.6.34.1/fs/splice.c send_sig(SIGPIPE, current, 0); if (!ret) ret = -EPIPE; -@@ -1948,7 +1948,7 @@ static int link_pipe(struct pipe_inode_i +@@ -2006,7 +2006,7 @@ static int link_pipe(struct pipe_inode_i * return EAGAIN if we have the potential of some data in the * future, otherwise just return 0 */ @@ -32925,10 +33909,10 @@ diff -urNp linux-2.6.34.1/fs/splice.c linux-2.6.34.1/fs/splice.c ret = -EAGAIN; pipe_unlock(ipipe); -diff -urNp linux-2.6.34.1/fs/sysfs/symlink.c linux-2.6.34.1/fs/sysfs/symlink.c ---- linux-2.6.34.1/fs/sysfs/symlink.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/sysfs/symlink.c 2010-07-07 09:04:56.000000000 -0400 -@@ -243,7 +243,7 @@ static void *sysfs_follow_link(struct de +diff -urNp linux-2.6.35.4/fs/sysfs/symlink.c linux-2.6.35.4/fs/sysfs/symlink.c +--- linux-2.6.35.4/fs/sysfs/symlink.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/sysfs/symlink.c 2010-09-17 20:12:09.000000000 -0400 +@@ -286,7 +286,7 @@ static void *sysfs_follow_link(struct de static void sysfs_put_link(struct dentry *dentry, struct nameidata *nd, void *cookie) { @@ -32937,9 +33921,9 @@ diff -urNp linux-2.6.34.1/fs/sysfs/symlink.c linux-2.6.34.1/fs/sysfs/symlink.c if (!IS_ERR(page)) free_page((unsigned long)page); } -diff -urNp linux-2.6.34.1/fs/udf/misc.c linux-2.6.34.1/fs/udf/misc.c ---- linux-2.6.34.1/fs/udf/misc.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/udf/misc.c 2010-07-07 09:04:56.000000000 -0400 +diff -urNp linux-2.6.35.4/fs/udf/misc.c linux-2.6.35.4/fs/udf/misc.c +--- linux-2.6.35.4/fs/udf/misc.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/udf/misc.c 2010-09-17 20:12:09.000000000 -0400 @@ -142,8 +142,8 @@ struct genericFormat *udf_add_extendedat iinfo->i_lenEAttr += size; return (struct genericFormat *)&ea[offset]; @@ -32951,9 +33935,9 @@ diff -urNp linux-2.6.34.1/fs/udf/misc.c linux-2.6.34.1/fs/udf/misc.c return NULL; } -diff -urNp linux-2.6.34.1/fs/udf/udfdecl.h linux-2.6.34.1/fs/udf/udfdecl.h ---- linux-2.6.34.1/fs/udf/udfdecl.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/udf/udfdecl.h 2010-07-07 09:04:56.000000000 -0400 +diff -urNp linux-2.6.35.4/fs/udf/udfdecl.h linux-2.6.35.4/fs/udf/udfdecl.h +--- linux-2.6.35.4/fs/udf/udfdecl.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/udf/udfdecl.h 2010-09-17 20:12:09.000000000 -0400 @@ -26,7 +26,7 @@ do { \ printk(f, ##a); \ } while (0) @@ -32963,9 +33947,9 @@ diff -urNp linux-2.6.34.1/fs/udf/udfdecl.h linux-2.6.34.1/fs/udf/udfdecl.h #endif #define udf_info(f, a...) \ -diff -urNp linux-2.6.34.1/fs/utimes.c linux-2.6.34.1/fs/utimes.c ---- linux-2.6.34.1/fs/utimes.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/utimes.c 2010-07-07 09:04:56.000000000 -0400 +diff -urNp linux-2.6.35.4/fs/utimes.c linux-2.6.35.4/fs/utimes.c +--- linux-2.6.35.4/fs/utimes.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/utimes.c 2010-09-17 20:12:37.000000000 -0400 @@ -1,6 +1,7 @@ #include #include @@ -32987,9 +33971,9 @@ diff -urNp linux-2.6.34.1/fs/utimes.c linux-2.6.34.1/fs/utimes.c mutex_lock(&inode->i_mutex); error = notify_change(path->dentry, &newattrs); mutex_unlock(&inode->i_mutex); -diff -urNp linux-2.6.34.1/fs/xfs/linux-2.6/xfs_ioctl.c linux-2.6.34.1/fs/xfs/linux-2.6/xfs_ioctl.c ---- linux-2.6.34.1/fs/xfs/linux-2.6/xfs_ioctl.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/xfs/linux-2.6/xfs_ioctl.c 2010-07-07 09:04:56.000000000 -0400 +diff -urNp linux-2.6.35.4/fs/xfs/linux-2.6/xfs_ioctl.c linux-2.6.35.4/fs/xfs/linux-2.6/xfs_ioctl.c +--- linux-2.6.35.4/fs/xfs/linux-2.6/xfs_ioctl.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/xfs/linux-2.6/xfs_ioctl.c 2010-09-17 20:12:37.000000000 -0400 @@ -136,7 +136,7 @@ xfs_find_handle( } @@ -32999,9 +33983,9 @@ diff -urNp linux-2.6.34.1/fs/xfs/linux-2.6/xfs_ioctl.c linux-2.6.34.1/fs/xfs/lin copy_to_user(hreq->ohandlen, &hsize, sizeof(__s32))) goto out_put; -diff -urNp linux-2.6.34.1/fs/xfs/linux-2.6/xfs_iops.c linux-2.6.34.1/fs/xfs/linux-2.6/xfs_iops.c ---- linux-2.6.34.1/fs/xfs/linux-2.6/xfs_iops.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/xfs/linux-2.6/xfs_iops.c 2010-07-07 09:04:56.000000000 -0400 +diff -urNp linux-2.6.35.4/fs/xfs/linux-2.6/xfs_iops.c linux-2.6.35.4/fs/xfs/linux-2.6/xfs_iops.c +--- linux-2.6.35.4/fs/xfs/linux-2.6/xfs_iops.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/xfs/linux-2.6/xfs_iops.c 2010-09-17 20:12:09.000000000 -0400 @@ -480,7 +480,7 @@ xfs_vn_put_link( struct nameidata *nd, void *p) @@ -33011,9 +33995,9 @@ diff -urNp linux-2.6.34.1/fs/xfs/linux-2.6/xfs_iops.c linux-2.6.34.1/fs/xfs/linu if (!IS_ERR(s)) kfree(s); -diff -urNp linux-2.6.34.1/fs/xfs/xfs_bmap.c linux-2.6.34.1/fs/xfs/xfs_bmap.c ---- linux-2.6.34.1/fs/xfs/xfs_bmap.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/fs/xfs/xfs_bmap.c 2010-07-07 09:04:56.000000000 -0400 +diff -urNp linux-2.6.35.4/fs/xfs/xfs_bmap.c linux-2.6.35.4/fs/xfs/xfs_bmap.c +--- linux-2.6.35.4/fs/xfs/xfs_bmap.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/fs/xfs/xfs_bmap.c 2010-09-17 20:12:09.000000000 -0400 @@ -296,7 +296,7 @@ xfs_bmap_validate_ret( int nmap, int ret_nmap); @@ -33023,1615 +34007,706 @@ diff -urNp linux-2.6.34.1/fs/xfs/xfs_bmap.c linux-2.6.34.1/fs/xfs/xfs_bmap.c #endif /* DEBUG */ STATIC int -diff -urNp linux-2.6.34.1/grsecurity/Kconfig linux-2.6.34.1/grsecurity/Kconfig ---- linux-2.6.34.1/grsecurity/Kconfig 1969-12-31 19:00:00.000000000 -0500 -+++ linux-2.6.34.1/grsecurity/Kconfig 2010-07-07 09:04:56.000000000 -0400 -@@ -0,0 +1,981 @@ -+# -+# grecurity configuration -+# -+ -+menu "Grsecurity" +diff -urNp linux-2.6.35.4/grsecurity/gracl_alloc.c linux-2.6.35.4/grsecurity/gracl_alloc.c +--- linux-2.6.35.4/grsecurity/gracl_alloc.c 1969-12-31 19:00:00.000000000 -0500 ++++ linux-2.6.35.4/grsecurity/gracl_alloc.c 2010-09-17 20:12:37.000000000 -0400 +@@ -0,0 +1,105 @@ ++#include ++#include ++#include ++#include ++#include ++#include + -+config GRKERNSEC -+ bool "Grsecurity" -+ select CRYPTO -+ select CRYPTO_SHA256 -+ help -+ If you say Y here, you will be able to configure many features -+ that will enhance the security of your system. It is highly -+ recommended that you say Y here and read through the help -+ for each option so that you fully understand the features and -+ can evaluate their usefulness for your machine. ++static unsigned long alloc_stack_next = 1; ++static unsigned long alloc_stack_size = 1; ++static void **alloc_stack; + -+choice -+ prompt "Security Level" -+ depends on GRKERNSEC -+ default GRKERNSEC_CUSTOM ++static __inline__ int ++alloc_pop(void) ++{ ++ if (alloc_stack_next == 1) ++ return 0; + -+config GRKERNSEC_LOW -+ bool "Low" -+ select GRKERNSEC_LINK -+ select GRKERNSEC_FIFO -+ select GRKERNSEC_EXECVE -+ select GRKERNSEC_RANDNET -+ select GRKERNSEC_DMESG -+ select GRKERNSEC_CHROOT -+ select GRKERNSEC_CHROOT_CHDIR ++ kfree(alloc_stack[alloc_stack_next - 2]); + -+ help -+ If you choose this option, several of the grsecurity options will -+ be enabled that will give you greater protection against a number -+ of attacks, while assuring that none of your software will have any -+ conflicts with the additional security measures. If you run a lot -+ of unusual software, or you are having problems with the higher -+ security levels, you should say Y here. With this option, the -+ following features are enabled: ++ alloc_stack_next--; + -+ - Linking restrictions -+ - FIFO restrictions -+ - Enforcing RLIMIT_NPROC on execve -+ - Restricted dmesg -+ - Enforced chdir("/") on chroot -+ - Runtime module disabling ++ return 1; ++} + -+config GRKERNSEC_MEDIUM -+ bool "Medium" -+ select PAX -+ select PAX_EI_PAX -+ select PAX_PT_PAX_FLAGS -+ select PAX_HAVE_ACL_FLAGS -+ select GRKERNSEC_PROC_MEMMAP if (PAX_NOEXEC || PAX_ASLR) -+ select GRKERNSEC_CHROOT -+ select GRKERNSEC_CHROOT_SYSCTL -+ select GRKERNSEC_LINK -+ select GRKERNSEC_FIFO -+ select GRKERNSEC_EXECVE -+ select GRKERNSEC_DMESG -+ select GRKERNSEC_RANDNET -+ select GRKERNSEC_FORKFAIL -+ select GRKERNSEC_TIME -+ select GRKERNSEC_SIGNAL -+ select GRKERNSEC_CHROOT -+ select GRKERNSEC_CHROOT_UNIX -+ select GRKERNSEC_CHROOT_MOUNT -+ select GRKERNSEC_CHROOT_PIVOT -+ select GRKERNSEC_CHROOT_DOUBLE -+ select GRKERNSEC_CHROOT_CHDIR -+ select GRKERNSEC_CHROOT_MKNOD -+ select GRKERNSEC_PROC -+ select GRKERNSEC_PROC_USERGROUP -+ select PAX_RANDUSTACK -+ select PAX_ASLR -+ select PAX_RANDMMAP -+ select PAX_REFCOUNT if (X86 || SPARC64) -+ select PAX_USERCOPY if ((X86 || SPARC32 || SPARC64 || PPC32 || PPC64) && (SLAB || SLUB || SLOB)) ++static __inline__ int ++alloc_push(void *buf) ++{ ++ if (alloc_stack_next >= alloc_stack_size) ++ return 1; + -+ help -+ If you say Y here, several features in addition to those included -+ in the low additional security level will be enabled. These -+ features provide even more security to your system, though in rare -+ cases they may be incompatible with very old or poorly written -+ software. If you enable this option, make sure that your auth -+ service (identd) is running as gid 1001. With this option, -+ the following features (in addition to those provided in the -+ low additional security level) will be enabled: ++ alloc_stack[alloc_stack_next - 1] = buf; + -+ - Failed fork logging -+ - Time change logging -+ - Signal logging -+ - Deny mounts in chroot -+ - Deny double chrooting -+ - Deny sysctl writes in chroot -+ - Deny mknod in chroot -+ - Deny access to abstract AF_UNIX sockets out of chroot -+ - Deny pivot_root in chroot -+ - Denied writes of /dev/kmem, /dev/mem, and /dev/port -+ - /proc restrictions with special GID set to 10 (usually wheel) -+ - Address Space Layout Randomization (ASLR) -+ - Prevent exploitation of most refcount overflows -+ - Bounds checking of copying between the kernel and userland ++ alloc_stack_next++; + -+config GRKERNSEC_HIGH -+ bool "High" -+ select GRKERNSEC_LINK -+ select GRKERNSEC_FIFO -+ select GRKERNSEC_EXECVE -+ select GRKERNSEC_DMESG -+ select GRKERNSEC_FORKFAIL -+ select GRKERNSEC_TIME -+ select GRKERNSEC_SIGNAL -+ select GRKERNSEC_CHROOT -+ select GRKERNSEC_CHROOT_SHMAT -+ select GRKERNSEC_CHROOT_UNIX -+ select GRKERNSEC_CHROOT_MOUNT -+ select GRKERNSEC_CHROOT_FCHDIR -+ select GRKERNSEC_CHROOT_PIVOT -+ select GRKERNSEC_CHROOT_DOUBLE -+ select GRKERNSEC_CHROOT_CHDIR -+ select GRKERNSEC_CHROOT_MKNOD -+ select GRKERNSEC_CHROOT_CAPS -+ select GRKERNSEC_CHROOT_SYSCTL -+ select GRKERNSEC_CHROOT_FINDTASK -+ select GRKERNSEC_PROC -+ select GRKERNSEC_PROC_MEMMAP if (PAX_NOEXEC || PAX_ASLR) -+ select GRKERNSEC_HIDESYM -+ select GRKERNSEC_BRUTE -+ select GRKERNSEC_PROC_USERGROUP -+ select GRKERNSEC_KMEM -+ select GRKERNSEC_RESLOG -+ select GRKERNSEC_RANDNET -+ select GRKERNSEC_PROC_ADD -+ select GRKERNSEC_CHROOT_CHMOD -+ select GRKERNSEC_CHROOT_NICE -+ select GRKERNSEC_AUDIT_MOUNT -+ select GRKERNSEC_MODHARDEN if (MODULES) -+ select GRKERNSEC_HARDEN_PTRACE -+ select GRKERNSEC_VM86 if (X86_32) -+ select PAX -+ select PAX_RANDUSTACK -+ select PAX_ASLR -+ select PAX_RANDMMAP -+ select PAX_NOEXEC -+ select PAX_MPROTECT -+ select PAX_EI_PAX -+ select PAX_PT_PAX_FLAGS -+ select PAX_HAVE_ACL_FLAGS -+ select PAX_KERNEXEC if ((PPC32 || PPC64 || X86) && (!X86_32 || X86_WP_WORKS_OK) && !XEN) -+ select PAX_MEMORY_UDEREF if (X86_32 && !XEN) -+ select PAX_RANDKSTACK if (X86_TSC && !X86_64) -+ select PAX_SEGMEXEC if (X86_32) -+ select PAX_PAGEEXEC -+ select PAX_EMUPLT if (ALPHA || PARISC || SPARC32 || SPARC64) -+ select PAX_EMUTRAMP if (PARISC) -+ select PAX_EMUSIGRT if (PARISC) -+ select PAX_ETEXECRELOCS if (ALPHA || IA64 || PARISC) -+ select PAX_REFCOUNT if (X86 || SPARC64) -+ select PAX_USERCOPY if ((X86 || PPC32 || PPC64 || SPARC32 || SPARC64) && (SLAB || SLUB || SLOB)) -+ help -+ If you say Y here, many of the features of grsecurity will be -+ enabled, which will protect you against many kinds of attacks -+ against your system. The heightened security comes at a cost -+ of an increased chance of incompatibilities with rare software -+ on your machine. Since this security level enables PaX, you should -+ view and read about the PaX -+ project. While you are there, download chpax and run it on -+ binaries that cause problems with PaX. Also remember that -+ since the /proc restrictions are enabled, you must run your -+ identd as gid 1001. This security level enables the following -+ features in addition to those listed in the low and medium -+ security levels: ++ return 0; ++} + -+ - Additional /proc restrictions -+ - Chmod restrictions in chroot -+ - No signals, ptrace, or viewing of processes outside of chroot -+ - Capability restrictions in chroot -+ - Deny fchdir out of chroot -+ - Priority restrictions in chroot -+ - Segmentation-based implementation of PaX -+ - Mprotect restrictions -+ - Removal of addresses from /proc//[smaps|maps|stat] -+ - Kernel stack randomization -+ - Mount/unmount/remount logging -+ - Kernel symbol hiding -+ - Prevention of memory exhaustion-based exploits -+ - Hardening of module auto-loading -+ - Ptrace restrictions -+ - Restricted vm86 mode ++void * ++acl_alloc(unsigned long len) ++{ ++ void *ret = NULL; + -+config GRKERNSEC_CUSTOM -+ bool "Custom" -+ help -+ If you say Y here, you will be able to configure every grsecurity -+ option, which allows you to enable many more features that aren't -+ covered in the basic security levels. These additional features -+ include TPE, socket restrictions, and the sysctl system for -+ grsecurity. It is advised that you read through the help for -+ each option to determine its usefulness in your situation. ++ if (!len || len > PAGE_SIZE) ++ goto out; + -+endchoice ++ ret = kmalloc(len, GFP_KERNEL); + -+menu "Address Space Protection" -+depends on GRKERNSEC ++ if (ret) { ++ if (alloc_push(ret)) { ++ kfree(ret); ++ ret = NULL; ++ } ++ } + -+config GRKERNSEC_KMEM -+ bool "Deny writing to /dev/kmem, /dev/mem, and /dev/port" -+ help -+ If you say Y here, /dev/kmem and /dev/mem won't be allowed to -+ be written to via mmap or otherwise to modify the running kernel. -+ /dev/port will also not be allowed to be opened. If you have module -+ support disabled, enabling this will close up four ways that are -+ currently used to insert malicious code into the running kernel. -+ Even with all these features enabled, we still highly recommend that -+ you use the RBAC system, as it is still possible for an attacker to -+ modify the running kernel through privileged I/O granted by ioperm/iopl. -+ If you are not using XFree86, you may be able to stop this additional -+ case by enabling the 'Disable privileged I/O' option. Though nothing -+ legitimately writes to /dev/kmem, XFree86 does need to write to /dev/mem, -+ but only to video memory, which is the only writing we allow in this -+ case. If /dev/kmem or /dev/mem are mmaped without PROT_WRITE, they will -+ not be allowed to mprotect it with PROT_WRITE later. -+ It is highly recommended that you say Y here if you meet all the -+ conditions above. ++out: ++ return ret; ++} + -+config GRKERNSEC_VM86 -+ bool "Restrict VM86 mode" -+ depends on X86_32 ++void * ++acl_alloc_num(unsigned long num, unsigned long len) ++{ ++ if (!len || (num > (PAGE_SIZE / len))) ++ return NULL; + -+ help -+ If you say Y here, only processes with CAP_SYS_RAWIO will be able to -+ make use of a special execution mode on 32bit x86 processors called -+ Virtual 8086 (VM86) mode. XFree86 may need vm86 mode for certain -+ video cards and will still work with this option enabled. The purpose -+ of the option is to prevent exploitation of emulation errors in -+ virtualization of vm86 mode like the one discovered in VMWare in 2009. -+ Nearly all users should be able to enable this option. ++ return acl_alloc(num * len); ++} + -+config GRKERNSEC_IO -+ bool "Disable privileged I/O" -+ depends on X86 -+ select RTC_CLASS -+ select RTC_INTF_DEV -+ select RTC_DRV_CMOS ++void ++acl_free_all(void) ++{ ++ if (gr_acl_is_enabled() || !alloc_stack) ++ return; + -+ help -+ If you say Y here, all ioperm and iopl calls will return an error. -+ Ioperm and iopl can be used to modify the running kernel. -+ Unfortunately, some programs need this access to operate properly, -+ the most notable of which are XFree86 and hwclock. hwclock can be -+ remedied by having RTC support in the kernel, so real-time -+ clock support is enabled if this option is enabled, to ensure -+ that hwclock operates correctly. XFree86 still will not -+ operate correctly with this option enabled, so DO NOT CHOOSE Y -+ IF YOU USE XFree86. If you use XFree86 and you still want to -+ protect your kernel against modification, use the RBAC system. ++ while (alloc_pop()) ; + -+config GRKERNSEC_PROC_MEMMAP -+ bool "Remove addresses from /proc//[smaps|maps|stat]" -+ default y if (PAX_NOEXEC || PAX_ASLR) -+ depends on PAX_NOEXEC || PAX_ASLR -+ help -+ If you say Y here, the /proc//maps and /proc//stat files will -+ give no information about the addresses of its mappings if -+ PaX features that rely on random addresses are enabled on the task. -+ If you use PaX it is greatly recommended that you say Y here as it -+ closes up a hole that makes the full ASLR useless for suid -+ binaries. ++ if (alloc_stack) { ++ if ((alloc_stack_size * sizeof (void *)) <= PAGE_SIZE) ++ kfree(alloc_stack); ++ else ++ vfree(alloc_stack); ++ } + -+config GRKERNSEC_BRUTE -+ bool "Deter exploit bruteforcing" -+ help -+ If you say Y here, attempts to bruteforce exploits against forking -+ daemons such as apache or sshd will be deterred. When a child of a -+ forking daemon is killed by PaX or crashes due to an illegal -+ instruction, the parent process will be delayed 30 seconds upon every -+ subsequent fork until the administrator is able to assess the -+ situation and restart the daemon. It is recommended that you also -+ enable signal logging in the auditing section so that logs are -+ generated when a process performs an illegal instruction. ++ alloc_stack = NULL; ++ alloc_stack_size = 1; ++ alloc_stack_next = 1; + -+config GRKERNSEC_MODHARDEN -+ bool "Harden module auto-loading" -+ depends on MODULES -+ help -+ If you say Y here, module auto-loading in response to use of some -+ feature implemented by an unloaded module will be restricted to -+ root users. Enabling this option helps defend against attacks -+ by unprivileged users who abuse the auto-loading behavior to -+ cause a vulnerable module to load that is then exploited. ++ return; ++} + -+ If this option prevents a legitimate use of auto-loading for a -+ non-root user, the administrator can execute modprobe manually -+ with the exact name of the module mentioned in the alert log. -+ Alternatively, the administrator can add the module to the list -+ of modules loaded at boot by modifying init scripts. ++int ++acl_alloc_stack_init(unsigned long size) ++{ ++ if ((size * sizeof (void *)) <= PAGE_SIZE) ++ alloc_stack = ++ (void **) kmalloc(size * sizeof (void *), GFP_KERNEL); ++ else ++ alloc_stack = (void **) vmalloc(size * sizeof (void *)); + -+ Modification of init scripts will most likely be needed on -+ Ubuntu servers with encrypted home directory support enabled, -+ as the first non-root user logging in will cause the ecb(aes), -+ ecb(aes)-all, cbc(aes), and cbc(aes)-all modules to be loaded. ++ alloc_stack_size = size; + -+config GRKERNSEC_HIDESYM -+ bool "Hide kernel symbols" -+ help -+ If you say Y here, getting information on loaded modules, and -+ displaying all kernel symbols through a syscall will be restricted -+ to users with CAP_SYS_MODULE. For software compatibility reasons, -+ /proc/kallsyms will be restricted to the root user. The RBAC -+ system can hide that entry even from root. Note that this option -+ is only effective provided the following conditions are met: -+ 1) The kernel using grsecurity is not precompiled by some distribution -+ 2) You are using the RBAC system and hiding other files such as your -+ kernel image and System.map. Alternatively, enabling this option -+ causes the permissions on /boot, /lib/modules, and the kernel -+ source directory to change at compile time to prevent -+ reading by non-root users. -+ If the above conditions are met, this option will aid in providing a -+ useful protection against local kernel exploitation of overflows -+ and arbitrary read/write vulnerabilities. ++ if (!alloc_stack) ++ return 0; ++ else ++ return 1; ++} +diff -urNp linux-2.6.35.4/grsecurity/gracl.c linux-2.6.35.4/grsecurity/gracl.c +--- linux-2.6.35.4/grsecurity/gracl.c 1969-12-31 19:00:00.000000000 -0500 ++++ linux-2.6.35.4/grsecurity/gracl.c 2010-09-17 20:18:36.000000000 -0400 +@@ -0,0 +1,3922 @@ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include + -+endmenu -+menu "Role Based Access Control Options" -+depends on GRKERNSEC ++#include ++#include ++#include + -+config GRKERNSEC_NO_RBAC -+ bool "Disable RBAC system" -+ help -+ If you say Y here, the /dev/grsec device will be removed from the kernel, -+ preventing the RBAC system from being enabled. You should only say Y -+ here if you have no intention of using the RBAC system, so as to prevent -+ an attacker with root access from misusing the RBAC system to hide files -+ and processes when loadable module support and /dev/[k]mem have been -+ locked down. ++static struct acl_role_db acl_role_set; ++static struct name_db name_set; ++static struct inodev_db inodev_set; + -+config GRKERNSEC_ACL_HIDEKERN -+ bool "Hide kernel processes" -+ help -+ If you say Y here, all kernel threads will be hidden to all -+ processes but those whose subject has the "view hidden processes" -+ flag. ++/* for keeping track of userspace pointers used for subjects, so we ++ can share references in the kernel as well ++*/ + -+config GRKERNSEC_ACL_MAXTRIES -+ int "Maximum tries before password lockout" -+ default 3 -+ help -+ This option enforces the maximum number of times a user can attempt -+ to authorize themselves with the grsecurity RBAC system before being -+ denied the ability to attempt authorization again for a specified time. -+ The lower the number, the harder it will be to brute-force a password. ++static struct dentry *real_root; ++static struct vfsmount *real_root_mnt; + -+config GRKERNSEC_ACL_TIMEOUT -+ int "Time to wait after max password tries, in seconds" -+ default 30 -+ help -+ This option specifies the time the user must wait after attempting to -+ authorize to the RBAC system with the maximum number of invalid -+ passwords. The higher the number, the harder it will be to brute-force -+ a password. ++static struct acl_subj_map_db subj_map_set; + -+endmenu -+menu "Filesystem Protections" -+depends on GRKERNSEC ++static struct acl_role_label *default_role; + -+config GRKERNSEC_PROC -+ bool "Proc restrictions" -+ help -+ If you say Y here, the permissions of the /proc filesystem -+ will be altered to enhance system security and privacy. You MUST -+ choose either a user only restriction or a user and group restriction. -+ Depending upon the option you choose, you can either restrict users to -+ see only the processes they themselves run, or choose a group that can -+ view all processes and files normally restricted to root if you choose -+ the "restrict to user only" option. NOTE: If you're running identd as -+ a non-root user, you will have to run it as the group you specify here. ++static struct acl_role_label *role_list; + -+config GRKERNSEC_PROC_USER -+ bool "Restrict /proc to user only" -+ depends on GRKERNSEC_PROC -+ help -+ If you say Y here, non-root users will only be able to view their own -+ processes, and restricts them from viewing network-related information, -+ and viewing kernel symbol and module information. ++static u16 acl_sp_role_value; + -+config GRKERNSEC_PROC_USERGROUP -+ bool "Allow special group" -+ depends on GRKERNSEC_PROC && !GRKERNSEC_PROC_USER -+ help -+ If you say Y here, you will be able to select a group that will be -+ able to view all processes, network-related information, and -+ kernel and symbol information. This option is useful if you want -+ to run identd as a non-root user. ++extern char *gr_shared_page[4]; ++static DECLARE_MUTEX(gr_dev_sem); ++DEFINE_RWLOCK(gr_inode_lock); + -+config GRKERNSEC_PROC_GID -+ int "GID for special group" -+ depends on GRKERNSEC_PROC_USERGROUP -+ default 1001 ++struct gr_arg *gr_usermode; + -+config GRKERNSEC_PROC_ADD -+ bool "Additional restrictions" -+ depends on GRKERNSEC_PROC_USER || GRKERNSEC_PROC_USERGROUP -+ help -+ If you say Y here, additional restrictions will be placed on -+ /proc that keep normal users from viewing device information and -+ slabinfo information that could be useful for exploits. ++static unsigned int gr_status __read_only = GR_STATUS_INIT; + -+config GRKERNSEC_LINK -+ bool "Linking restrictions" -+ help -+ If you say Y here, /tmp race exploits will be prevented, since users -+ will no longer be able to follow symlinks owned by other users in -+ world-writable +t directories (i.e. /tmp), unless the owner of the -+ symlink is the owner of the directory. users will also not be -+ able to hardlink to files they do not own. If the sysctl option is -+ enabled, a sysctl option with name "linking_restrictions" is created. ++extern int chkpw(struct gr_arg *entry, unsigned char *salt, unsigned char *sum); ++extern void gr_clear_learn_entries(void); + -+config GRKERNSEC_FIFO -+ bool "FIFO restrictions" -+ help -+ If you say Y here, users will not be able to write to FIFOs they don't -+ own in world-writable +t directories (i.e. /tmp), unless the owner of -+ the FIFO is the same owner of the directory it's held in. If the sysctl -+ option is enabled, a sysctl option with name "fifo_restrictions" is -+ created. ++#ifdef CONFIG_GRKERNSEC_RESLOG ++extern void gr_log_resource(const struct task_struct *task, ++ const int res, const unsigned long wanted, const int gt); ++#endif + -+config GRKERNSEC_ROFS -+ bool "Runtime read-only mount protection" -+ help -+ If you say Y here, a sysctl option with name "romount_protect" will -+ be created. By setting this option to 1 at runtime, filesystems -+ will be protected in the following ways: -+ * No new writable mounts will be allowed -+ * Existing read-only mounts won't be able to be remounted read/write -+ * Write operations will be denied on all block devices -+ This option acts independently of grsec_lock: once it is set to 1, -+ it cannot be turned off. Therefore, please be mindful of the resulting -+ behavior if this option is enabled in an init script on a read-only -+ filesystem. This feature is mainly intended for secure embedded systems. ++unsigned char *gr_system_salt; ++unsigned char *gr_system_sum; + -+config GRKERNSEC_CHROOT -+ bool "Chroot jail restrictions" -+ help -+ If you say Y here, you will be able to choose several options that will -+ make breaking out of a chrooted jail much more difficult. If you -+ encounter no software incompatibilities with the following options, it -+ is recommended that you enable each one. ++static struct sprole_pw **acl_special_roles = NULL; ++static __u16 num_sprole_pws = 0; + -+config GRKERNSEC_CHROOT_MOUNT -+ bool "Deny mounts" -+ depends on GRKERNSEC_CHROOT -+ help -+ If you say Y here, processes inside a chroot will not be able to -+ mount or remount filesystems. If the sysctl option is enabled, a -+ sysctl option with name "chroot_deny_mount" is created. ++static struct acl_role_label *kernel_role = NULL; + -+config GRKERNSEC_CHROOT_DOUBLE -+ bool "Deny double-chroots" -+ depends on GRKERNSEC_CHROOT -+ help -+ If you say Y here, processes inside a chroot will not be able to chroot -+ again outside the chroot. This is a widely used method of breaking -+ out of a chroot jail and should not be allowed. If the sysctl -+ option is enabled, a sysctl option with name -+ "chroot_deny_chroot" is created. ++static unsigned int gr_auth_attempts = 0; ++static unsigned long gr_auth_expires = 0UL; + -+config GRKERNSEC_CHROOT_PIVOT -+ bool "Deny pivot_root in chroot" -+ depends on GRKERNSEC_CHROOT -+ help -+ If you say Y here, processes inside a chroot will not be able to use -+ a function called pivot_root() that was introduced in Linux 2.3.41. It -+ works similar to chroot in that it changes the root filesystem. This -+ function could be misused in a chrooted process to attempt to break out -+ of the chroot, and therefore should not be allowed. If the sysctl -+ option is enabled, a sysctl option with name "chroot_deny_pivot" is -+ created. ++extern struct vfsmount *sock_mnt; ++extern struct vfsmount *pipe_mnt; ++extern struct vfsmount *shm_mnt; ++#ifdef CONFIG_HUGETLBFS ++extern struct vfsmount *hugetlbfs_vfsmount; ++#endif + -+config GRKERNSEC_CHROOT_CHDIR -+ bool "Enforce chdir(\"/\") on all chroots" -+ depends on GRKERNSEC_CHROOT -+ help -+ If you say Y here, the current working directory of all newly-chrooted -+ applications will be set to the the root directory of the chroot. -+ The man page on chroot(2) states: -+ Note that this call does not change the current working -+ directory, so that `.' can be outside the tree rooted at -+ `/'. In particular, the super-user can escape from a -+ `chroot jail' by doing `mkdir foo; chroot foo; cd ..'. ++static struct acl_object_label *fakefs_obj; + -+ It is recommended that you say Y here, since it's not known to break -+ any software. If the sysctl option is enabled, a sysctl option with -+ name "chroot_enforce_chdir" is created. ++extern int gr_init_uidset(void); ++extern void gr_free_uidset(void); ++extern void gr_remove_uid(uid_t uid); ++extern int gr_find_uid(uid_t uid); + -+config GRKERNSEC_CHROOT_CHMOD -+ bool "Deny (f)chmod +s" -+ depends on GRKERNSEC_CHROOT -+ help -+ If you say Y here, processes inside a chroot will not be able to chmod -+ or fchmod files to make them have suid or sgid bits. This protects -+ against another published method of breaking a chroot. If the sysctl -+ option is enabled, a sysctl option with name "chroot_deny_chmod" is -+ created. ++extern spinlock_t vfsmount_lock; + -+config GRKERNSEC_CHROOT_FCHDIR -+ bool "Deny fchdir out of chroot" -+ depends on GRKERNSEC_CHROOT -+ help -+ If you say Y here, a well-known method of breaking chroots by fchdir'ing -+ to a file descriptor of the chrooting process that points to a directory -+ outside the filesystem will be stopped. If the sysctl option -+ is enabled, a sysctl option with name "chroot_deny_fchdir" is created. ++__inline__ int ++gr_acl_is_enabled(void) ++{ ++ return (gr_status & GR_READY); ++} + -+config GRKERNSEC_CHROOT_MKNOD -+ bool "Deny mknod" -+ depends on GRKERNSEC_CHROOT -+ help -+ If you say Y here, processes inside a chroot will not be allowed to -+ mknod. The problem with using mknod inside a chroot is that it -+ would allow an attacker to create a device entry that is the same -+ as one on the physical root of your system, which could range from -+ anything from the console device to a device for your harddrive (which -+ they could then use to wipe the drive or steal data). It is recommended -+ that you say Y here, unless you run into software incompatibilities. -+ If the sysctl option is enabled, a sysctl option with name -+ "chroot_deny_mknod" is created. ++char gr_roletype_to_char(void) ++{ ++ switch (current->role->roletype & ++ (GR_ROLE_DEFAULT | GR_ROLE_USER | GR_ROLE_GROUP | ++ GR_ROLE_SPECIAL)) { ++ case GR_ROLE_DEFAULT: ++ return 'D'; ++ case GR_ROLE_USER: ++ return 'U'; ++ case GR_ROLE_GROUP: ++ return 'G'; ++ case GR_ROLE_SPECIAL: ++ return 'S'; ++ } + -+config GRKERNSEC_CHROOT_SHMAT -+ bool "Deny shmat() out of chroot" -+ depends on GRKERNSEC_CHROOT -+ help -+ If you say Y here, processes inside a chroot will not be able to attach -+ to shared memory segments that were created outside of the chroot jail. -+ It is recommended that you say Y here. If the sysctl option is enabled, -+ a sysctl option with name "chroot_deny_shmat" is created. ++ return 'X'; ++} + -+config GRKERNSEC_CHROOT_UNIX -+ bool "Deny access to abstract AF_UNIX sockets out of chroot" -+ depends on GRKERNSEC_CHROOT -+ help -+ If you say Y here, processes inside a chroot will not be able to -+ connect to abstract (meaning not belonging to a filesystem) Unix -+ domain sockets that were bound outside of a chroot. It is recommended -+ that you say Y here. If the sysctl option is enabled, a sysctl option -+ with name "chroot_deny_unix" is created. ++__inline__ int ++gr_acl_tpe_check(void) ++{ ++ if (unlikely(!(gr_status & GR_READY))) ++ return 0; ++ if (current->role->roletype & GR_ROLE_TPE) ++ return 1; ++ else ++ return 0; ++} + -+config GRKERNSEC_CHROOT_FINDTASK -+ bool "Protect outside processes" -+ depends on GRKERNSEC_CHROOT -+ help -+ If you say Y here, processes inside a chroot will not be able to -+ kill, send signals with fcntl, ptrace, capget, getpgid, setpgid, -+ getsid, or view any process outside of the chroot. If the sysctl -+ option is enabled, a sysctl option with name "chroot_findtask" is -+ created. ++int ++gr_handle_rawio(const struct inode *inode) ++{ ++#ifdef CONFIG_GRKERNSEC_CHROOT_CAPS ++ if (inode && S_ISBLK(inode->i_mode) && ++ grsec_enable_chroot_caps && proc_is_chrooted(current) && ++ !capable(CAP_SYS_RAWIO)) ++ return 1; ++#endif ++ return 0; ++} + -+config GRKERNSEC_CHROOT_NICE -+ bool "Restrict priority changes" -+ depends on GRKERNSEC_CHROOT -+ help -+ If you say Y here, processes inside a chroot will not be able to raise -+ the priority of processes in the chroot, or alter the priority of -+ processes outside the chroot. This provides more security than simply -+ removing CAP_SYS_NICE from the process' capability set. If the -+ sysctl option is enabled, a sysctl option with name "chroot_restrict_nice" -+ is created. ++static int ++gr_streq(const char *a, const char *b, const unsigned int lena, const unsigned int lenb) ++{ ++ if (likely(lena != lenb)) ++ return 0; + -+config GRKERNSEC_CHROOT_SYSCTL -+ bool "Deny sysctl writes" -+ depends on GRKERNSEC_CHROOT -+ help -+ If you say Y here, an attacker in a chroot will not be able to -+ write to sysctl entries, either by sysctl(2) or through a /proc -+ interface. It is strongly recommended that you say Y here. If the -+ sysctl option is enabled, a sysctl option with name -+ "chroot_deny_sysctl" is created. ++ return !memcmp(a, b, lena); ++} + -+config GRKERNSEC_CHROOT_CAPS -+ bool "Capability restrictions" -+ depends on GRKERNSEC_CHROOT -+ help -+ If you say Y here, the capabilities on all root processes within a -+ chroot jail will be lowered to stop module insertion, raw i/o, -+ system and net admin tasks, rebooting the system, modifying immutable -+ files, modifying IPC owned by another, and changing the system time. -+ This is left an option because it can break some apps. Disable this -+ if your chrooted apps are having problems performing those kinds of -+ tasks. If the sysctl option is enabled, a sysctl option with -+ name "chroot_caps" is created. ++static char * __our_d_path(struct dentry *dentry, struct vfsmount *vfsmnt, ++ struct dentry *root, struct vfsmount *rootmnt, ++ char *buffer, int buflen) ++{ ++ char * end = buffer+buflen; ++ char * retval; ++ int namelen; + -+endmenu -+menu "Kernel Auditing" -+depends on GRKERNSEC ++ spin_lock(&vfsmount_lock); ++ *--end = '\0'; ++ buflen--; + -+config GRKERNSEC_AUDIT_GROUP -+ bool "Single group for auditing" -+ help -+ If you say Y here, the exec, chdir, and (un)mount logging features -+ will only operate on a group you specify. This option is recommended -+ if you only want to watch certain users instead of having a large -+ amount of logs from the entire system. If the sysctl option is enabled, -+ a sysctl option with name "audit_group" is created. ++ if (buflen < 1) ++ goto Elong; ++ /* Get '/' right */ ++ retval = end-1; ++ *retval = '/'; + -+config GRKERNSEC_AUDIT_GID -+ int "GID for auditing" -+ depends on GRKERNSEC_AUDIT_GROUP -+ default 1007 ++ for (;;) { ++ struct dentry * parent; + -+config GRKERNSEC_EXECLOG -+ bool "Exec logging" -+ help -+ If you say Y here, all execve() calls will be logged (since the -+ other exec*() calls are frontends to execve(), all execution -+ will be logged). Useful for shell-servers that like to keep track -+ of their users. If the sysctl option is enabled, a sysctl option with -+ name "exec_logging" is created. -+ WARNING: This option when enabled will produce a LOT of logs, especially -+ on an active system. ++ if (dentry == root && vfsmnt == rootmnt) ++ break; ++ if (dentry == vfsmnt->mnt_root || IS_ROOT(dentry)) { ++ /* Global root? */ ++ if (vfsmnt->mnt_parent == vfsmnt) { ++ goto global_root; ++ } ++ dentry = vfsmnt->mnt_mountpoint; ++ vfsmnt = vfsmnt->mnt_parent; ++ continue; ++ } ++ parent = dentry->d_parent; ++ prefetch(parent); ++ namelen = dentry->d_name.len; ++ buflen -= namelen + 1; ++ if (buflen < 0) ++ goto Elong; ++ end -= namelen; ++ memcpy(end, dentry->d_name.name, namelen); ++ *--end = '/'; ++ retval = end; ++ dentry = parent; ++ } + -+config GRKERNSEC_RESLOG -+ bool "Resource logging" -+ help -+ If you say Y here, all attempts to overstep resource limits will -+ be logged with the resource name, the requested size, and the current -+ limit. It is highly recommended that you say Y here. If the sysctl -+ option is enabled, a sysctl option with name "resource_logging" is -+ created. If the RBAC system is enabled, the sysctl value is ignored. ++out: ++ spin_unlock(&vfsmount_lock); ++ return retval; + -+config GRKERNSEC_CHROOT_EXECLOG -+ bool "Log execs within chroot" -+ help -+ If you say Y here, all executions inside a chroot jail will be logged -+ to syslog. This can cause a large amount of logs if certain -+ applications (eg. djb's daemontools) are installed on the system, and -+ is therefore left as an option. If the sysctl option is enabled, a -+ sysctl option with name "chroot_execlog" is created. ++global_root: ++ namelen = dentry->d_name.len; ++ buflen -= namelen; ++ if (buflen < 0) ++ goto Elong; ++ retval -= namelen-1; /* hit the slash */ ++ memcpy(retval, dentry->d_name.name, namelen); ++ goto out; ++Elong: ++ retval = ERR_PTR(-ENAMETOOLONG); ++ goto out; ++} + -+config GRKERNSEC_AUDIT_PTRACE -+ bool "Ptrace logging" -+ help -+ If you say Y here, all attempts to attach to a process via ptrace -+ will be logged. If the sysctl option is enabled, a sysctl option -+ with name "audit_ptrace" is created. ++static char * ++gen_full_path(struct dentry *dentry, struct vfsmount *vfsmnt, ++ struct dentry *root, struct vfsmount *rootmnt, char *buf, int buflen) ++{ ++ char *retval; + -+config GRKERNSEC_AUDIT_CHDIR -+ bool "Chdir logging" -+ help -+ If you say Y here, all chdir() calls will be logged. If the sysctl -+ option is enabled, a sysctl option with name "audit_chdir" is created. ++ retval = __our_d_path(dentry, vfsmnt, root, rootmnt, buf, buflen); ++ if (unlikely(IS_ERR(retval))) ++ retval = strcpy(buf, ""); ++ else if (unlikely(retval[1] == '/' && retval[2] == '\0')) ++ retval[1] = '\0'; + -+config GRKERNSEC_AUDIT_MOUNT -+ bool "(Un)Mount logging" -+ help -+ If you say Y here, all mounts and unmounts will be logged. If the -+ sysctl option is enabled, a sysctl option with name "audit_mount" is -+ created. ++ return retval; ++} + -+config GRKERNSEC_SIGNAL -+ bool "Signal logging" -+ help -+ If you say Y here, certain important signals will be logged, such as -+ SIGSEGV, which will as a result inform you of when a error in a program -+ occurred, which in some cases could mean a possible exploit attempt. -+ If the sysctl option is enabled, a sysctl option with name -+ "signal_logging" is created. ++static char * ++__d_real_path(const struct dentry *dentry, const struct vfsmount *vfsmnt, ++ char *buf, int buflen) ++{ ++ char *res; + -+config GRKERNSEC_FORKFAIL -+ bool "Fork failure logging" -+ help -+ If you say Y here, all failed fork() attempts will be logged. -+ This could suggest a fork bomb, or someone attempting to overstep -+ their process limit. If the sysctl option is enabled, a sysctl option -+ with name "forkfail_logging" is created. ++ /* we can use real_root, real_root_mnt, because this is only called ++ by the RBAC system */ ++ res = gen_full_path((struct dentry *)dentry, (struct vfsmount *)vfsmnt, real_root, real_root_mnt, buf, buflen); + -+config GRKERNSEC_TIME -+ bool "Time change logging" -+ help -+ If you say Y here, any changes of the system clock will be logged. -+ If the sysctl option is enabled, a sysctl option with name -+ "timechange_logging" is created. ++ return res; ++} + -+config GRKERNSEC_PROC_IPADDR -+ bool "/proc//ipaddr support" -+ help -+ If you say Y here, a new entry will be added to each /proc/ -+ directory that contains the IP address of the person using the task. -+ The IP is carried across local TCP and AF_UNIX stream sockets. -+ This information can be useful for IDS/IPSes to perform remote response -+ to a local attack. The entry is readable by only the owner of the -+ process (and root if he has CAP_DAC_OVERRIDE, which can be removed via -+ the RBAC system), and thus does not create privacy concerns. ++static char * ++d_real_path(const struct dentry *dentry, const struct vfsmount *vfsmnt, ++ char *buf, int buflen) ++{ ++ char *res; ++ struct dentry *root; ++ struct vfsmount *rootmnt; ++ struct task_struct *reaper = &init_task; + -+config GRKERNSEC_AUDIT_TEXTREL -+ bool 'ELF text relocations logging (READ HELP)' -+ depends on PAX_MPROTECT -+ help -+ If you say Y here, text relocations will be logged with the filename -+ of the offending library or binary. The purpose of the feature is -+ to help Linux distribution developers get rid of libraries and -+ binaries that need text relocations which hinder the future progress -+ of PaX. Only Linux distribution developers should say Y here, and -+ never on a production machine, as this option creates an information -+ leak that could aid an attacker in defeating the randomization of -+ a single memory region. If the sysctl option is enabled, a sysctl -+ option with name "audit_textrel" is created. ++ /* we can't use real_root, real_root_mnt, because they belong only to the RBAC system */ ++ read_lock(&reaper->fs->lock); ++ root = dget(reaper->fs->root.dentry); ++ rootmnt = mntget(reaper->fs->root.mnt); ++ read_unlock(&reaper->fs->lock); + -+endmenu ++ spin_lock(&dcache_lock); ++ res = gen_full_path((struct dentry *)dentry, (struct vfsmount *)vfsmnt, root, rootmnt, buf, buflen); ++ spin_unlock(&dcache_lock); + -+menu "Executable Protections" -+depends on GRKERNSEC ++ dput(root); ++ mntput(rootmnt); ++ return res; ++} + -+config GRKERNSEC_EXECVE -+ bool "Enforce RLIMIT_NPROC on execs" -+ help -+ If you say Y here, users with a resource limit on processes will -+ have the value checked during execve() calls. The current system -+ only checks the system limit during fork() calls. If the sysctl option -+ is enabled, a sysctl option with name "execve_limiting" is created. ++static char * ++gr_to_filename_rbac(const struct dentry *dentry, const struct vfsmount *mnt) ++{ ++ char *ret; ++ spin_lock(&dcache_lock); ++ ret = __d_real_path(dentry, mnt, per_cpu_ptr(gr_shared_page[0],smp_processor_id()), ++ PAGE_SIZE); ++ spin_unlock(&dcache_lock); ++ return ret; ++} + -+config GRKERNSEC_DMESG -+ bool "Dmesg(8) restriction" -+ help -+ If you say Y here, non-root users will not be able to use dmesg(8) -+ to view up to the last 4kb of messages in the kernel's log buffer. -+ If the sysctl option is enabled, a sysctl option with name "dmesg" is -+ created. ++char * ++gr_to_filename_nolock(const struct dentry *dentry, const struct vfsmount *mnt) ++{ ++ return __d_real_path(dentry, mnt, per_cpu_ptr(gr_shared_page[0],smp_processor_id()), ++ PAGE_SIZE); ++} + -+config GRKERNSEC_HARDEN_PTRACE -+ bool "Deter ptrace-based process snooping" -+ help -+ If you say Y here, TTY sniffers and other malicious monitoring -+ programs implemented through ptrace will be defeated. If you -+ have been using the RBAC system, this option has already been -+ enabled for several years for all users, with the ability to make -+ fine-grained exceptions. ++char * ++gr_to_filename(const struct dentry *dentry, const struct vfsmount *mnt) ++{ ++ return d_real_path(dentry, mnt, per_cpu_ptr(gr_shared_page[0], smp_processor_id()), ++ PAGE_SIZE); ++} + -+ This option only affects the ability of non-root users to ptrace -+ processes that are not a descendent of the ptracing process. -+ This means that strace ./binary and gdb ./binary will still work, -+ but attaching to arbitrary processes will not. If the sysctl -+ option is enabled, a sysctl option with name "harden_ptrace" is -+ created. ++char * ++gr_to_filename1(const struct dentry *dentry, const struct vfsmount *mnt) ++{ ++ return d_real_path(dentry, mnt, per_cpu_ptr(gr_shared_page[1], smp_processor_id()), ++ PAGE_SIZE); ++} + -+config GRKERNSEC_TPE -+ bool "Trusted Path Execution (TPE)" -+ help -+ If you say Y here, you will be able to choose a gid to add to the -+ supplementary groups of users you want to mark as "untrusted." -+ These users will not be able to execute any files that are not in -+ root-owned directories writable only by root. If the sysctl option -+ is enabled, a sysctl option with name "tpe" is created. ++char * ++gr_to_filename2(const struct dentry *dentry, const struct vfsmount *mnt) ++{ ++ return d_real_path(dentry, mnt, per_cpu_ptr(gr_shared_page[2], smp_processor_id()), ++ PAGE_SIZE); ++} + -+config GRKERNSEC_TPE_ALL -+ bool "Partially restrict non-root users" -+ depends on GRKERNSEC_TPE -+ help -+ If you say Y here, All non-root users other than the ones in the -+ group specified in the main TPE option will only be allowed to -+ execute files in directories they own that are not group or -+ world-writable, or in directories owned by root and writable only by -+ root. If the sysctl option is enabled, a sysctl option with name -+ "tpe_restrict_all" is created. ++char * ++gr_to_filename3(const struct dentry *dentry, const struct vfsmount *mnt) ++{ ++ return d_real_path(dentry, mnt, per_cpu_ptr(gr_shared_page[3], smp_processor_id()), ++ PAGE_SIZE); ++} + -+config GRKERNSEC_TPE_INVERT -+ bool "Invert GID option" -+ depends on GRKERNSEC_TPE -+ help -+ If you say Y here, the group you specify in the TPE configuration will -+ decide what group TPE restrictions will be *disabled* for. This -+ option is useful if you want TPE restrictions to be applied to most -+ users on the system. ++__inline__ __u32 ++to_gr_audit(const __u32 reqmode) ++{ ++ /* masks off auditable permission flags, then shifts them to create ++ auditing flags, and adds the special case of append auditing if ++ we're requesting write */ ++ return (((reqmode & ~GR_AUDITS) << 10) | ((reqmode & GR_WRITE) ? GR_AUDIT_APPEND : 0)); ++} + -+config GRKERNSEC_TPE_GID -+ int "GID for untrusted users" -+ depends on GRKERNSEC_TPE && !GRKERNSEC_TPE_INVERT -+ default 1005 -+ help -+ If you have selected the "Invert GID option" above, setting this -+ GID determines what group TPE restrictions will be *disabled* for. -+ If you have not selected the "Invert GID option" above, setting this -+ GID determines what group TPE restrictions will be *enabled* for. -+ If the sysctl option is enabled, a sysctl option with name "tpe_gid" -+ is created. ++struct acl_subject_label * ++lookup_subject_map(const struct acl_subject_label *userp) ++{ ++ unsigned int index = shash(userp, subj_map_set.s_size); ++ struct subject_map *match; + -+config GRKERNSEC_TPE_GID -+ int "GID for trusted users" -+ depends on GRKERNSEC_TPE && GRKERNSEC_TPE_INVERT -+ default 1005 -+ help -+ If you have selected the "Invert GID option" above, setting this -+ GID determines what group TPE restrictions will be *disabled* for. -+ If you have not selected the "Invert GID option" above, setting this -+ GID determines what group TPE restrictions will be *enabled* for. -+ If the sysctl option is enabled, a sysctl option with name "tpe_gid" -+ is created. ++ match = subj_map_set.s_hash[index]; + -+endmenu -+menu "Network Protections" -+depends on GRKERNSEC -+ -+config GRKERNSEC_RANDNET -+ bool "Larger entropy pools" -+ help -+ If you say Y here, the entropy pools used for many features of Linux -+ and grsecurity will be doubled in size. Since several grsecurity -+ features use additional randomness, it is recommended that you say Y -+ here. Saying Y here has a similar effect as modifying -+ /proc/sys/kernel/random/poolsize. -+ -+config GRKERNSEC_BLACKHOLE -+ bool "TCP/UDP blackhole and LAST_ACK DoS prevention" -+ help -+ If you say Y here, neither TCP resets nor ICMP -+ destination-unreachable packets will be sent in response to packets -+ sent to ports for which no associated listening process exists. -+ This feature supports both IPV4 and IPV6 and exempts the -+ loopback interface from blackholing. Enabling this feature -+ makes a host more resilient to DoS attacks and reduces network -+ visibility against scanners. ++ while (match && match->user != userp) ++ match = match->next; + -+ The blackhole feature as-implemented is equivalent to the FreeBSD -+ blackhole feature, as it prevents RST responses to all packets, not -+ just SYNs. Under most application behavior this causes no -+ problems, but applications (like haproxy) may not close certain -+ connections in a way that cleanly terminates them on the remote -+ end, leaving the remote host in LAST_ACK state. Because of this -+ side-effect and to prevent intentional LAST_ACK DoSes, this -+ feature also adds automatic mitigation against such attacks. -+ The mitigation drastically reduces the amount of time a socket -+ can spend in LAST_ACK state. If you're using haproxy and not -+ all servers it connects to have this option enabled, consider -+ disabling this feature on the haproxy host. ++ if (match != NULL) ++ return match->kernel; ++ else ++ return NULL; ++} + -+ If the sysctl option is enabled, two sysctl options with names -+ "ip_blackhole" and "lastack_retries" will be created. -+ While "ip_blackhole" takes the standard zero/non-zero on/off -+ toggle, "lastack_retries" uses the same kinds of values as -+ "tcp_retries1" and "tcp_retries2". The default value of 4 -+ prevents a socket from lasting more than 45 seconds in LAST_ACK -+ state. ++static void ++insert_subj_map_entry(struct subject_map *subjmap) ++{ ++ unsigned int index = shash(subjmap->user, subj_map_set.s_size); ++ struct subject_map **curr; + -+config GRKERNSEC_SOCKET -+ bool "Socket restrictions" -+ help -+ If you say Y here, you will be able to choose from several options. -+ If you assign a GID on your system and add it to the supplementary -+ groups of users you want to restrict socket access to, this patch -+ will perform up to three things, based on the option(s) you choose. ++ subjmap->prev = NULL; + -+config GRKERNSEC_SOCKET_ALL -+ bool "Deny any sockets to group" -+ depends on GRKERNSEC_SOCKET -+ help -+ If you say Y here, you will be able to choose a GID of whose users will -+ be unable to connect to other hosts from your machine or run server -+ applications from your machine. If the sysctl option is enabled, a -+ sysctl option with name "socket_all" is created. ++ curr = &subj_map_set.s_hash[index]; ++ if (*curr != NULL) ++ (*curr)->prev = subjmap; + -+config GRKERNSEC_SOCKET_ALL_GID -+ int "GID to deny all sockets for" -+ depends on GRKERNSEC_SOCKET_ALL -+ default 1004 -+ help -+ Here you can choose the GID to disable socket access for. Remember to -+ add the users you want socket access disabled for to the GID -+ specified here. If the sysctl option is enabled, a sysctl option -+ with name "socket_all_gid" is created. ++ subjmap->next = *curr; ++ *curr = subjmap; + -+config GRKERNSEC_SOCKET_CLIENT -+ bool "Deny client sockets to group" -+ depends on GRKERNSEC_SOCKET -+ help -+ If you say Y here, you will be able to choose a GID of whose users will -+ be unable to connect to other hosts from your machine, but will be -+ able to run servers. If this option is enabled, all users in the group -+ you specify will have to use passive mode when initiating ftp transfers -+ from the shell on your machine. If the sysctl option is enabled, a -+ sysctl option with name "socket_client" is created. ++ return; ++} + -+config GRKERNSEC_SOCKET_CLIENT_GID -+ int "GID to deny client sockets for" -+ depends on GRKERNSEC_SOCKET_CLIENT -+ default 1003 -+ help -+ Here you can choose the GID to disable client socket access for. -+ Remember to add the users you want client socket access disabled for to -+ the GID specified here. If the sysctl option is enabled, a sysctl -+ option with name "socket_client_gid" is created. ++static struct acl_role_label * ++lookup_acl_role_label(const struct task_struct *task, const uid_t uid, ++ const gid_t gid) ++{ ++ unsigned int index = rhash(uid, GR_ROLE_USER, acl_role_set.r_size); ++ struct acl_role_label *match; ++ struct role_allowed_ip *ipp; ++ unsigned int x; + -+config GRKERNSEC_SOCKET_SERVER -+ bool "Deny server sockets to group" -+ depends on GRKERNSEC_SOCKET -+ help -+ If you say Y here, you will be able to choose a GID of whose users will -+ be unable to run server applications from your machine. If the sysctl -+ option is enabled, a sysctl option with name "socket_server" is created. ++ match = acl_role_set.r_hash[index]; + -+config GRKERNSEC_SOCKET_SERVER_GID -+ int "GID to deny server sockets for" -+ depends on GRKERNSEC_SOCKET_SERVER -+ default 1002 -+ help -+ Here you can choose the GID to disable server socket access for. -+ Remember to add the users you want server socket access disabled for to -+ the GID specified here. If the sysctl option is enabled, a sysctl -+ option with name "socket_server_gid" is created. ++ while (match) { ++ if ((match->roletype & (GR_ROLE_DOMAIN | GR_ROLE_USER)) == (GR_ROLE_DOMAIN | GR_ROLE_USER)) { ++ for (x = 0; x < match->domain_child_num; x++) { ++ if (match->domain_children[x] == uid) ++ goto found; ++ } ++ } else if (match->uidgid == uid && match->roletype & GR_ROLE_USER) ++ break; ++ match = match->next; ++ } ++found: ++ if (match == NULL) { ++ try_group: ++ index = rhash(gid, GR_ROLE_GROUP, acl_role_set.r_size); ++ match = acl_role_set.r_hash[index]; + -+endmenu -+menu "Sysctl support" -+depends on GRKERNSEC && SYSCTL ++ while (match) { ++ if ((match->roletype & (GR_ROLE_DOMAIN | GR_ROLE_GROUP)) == (GR_ROLE_DOMAIN | GR_ROLE_GROUP)) { ++ for (x = 0; x < match->domain_child_num; x++) { ++ if (match->domain_children[x] == gid) ++ goto found2; ++ } ++ } else if (match->uidgid == gid && match->roletype & GR_ROLE_GROUP) ++ break; ++ match = match->next; ++ } ++found2: ++ if (match == NULL) ++ match = default_role; ++ if (match->allowed_ips == NULL) ++ return match; ++ else { ++ for (ipp = match->allowed_ips; ipp; ipp = ipp->next) { ++ if (likely ++ ((ntohl(task->signal->curr_ip) & ipp->netmask) == ++ (ntohl(ipp->addr) & ipp->netmask))) ++ return match; ++ } ++ match = default_role; ++ } ++ } else if (match->allowed_ips == NULL) { ++ return match; ++ } else { ++ for (ipp = match->allowed_ips; ipp; ipp = ipp->next) { ++ if (likely ++ ((ntohl(task->signal->curr_ip) & ipp->netmask) == ++ (ntohl(ipp->addr) & ipp->netmask))) ++ return match; ++ } ++ goto try_group; ++ } + -+config GRKERNSEC_SYSCTL -+ bool "Sysctl support" -+ help -+ If you say Y here, you will be able to change the options that -+ grsecurity runs with at bootup, without having to recompile your -+ kernel. You can echo values to files in /proc/sys/kernel/grsecurity -+ to enable (1) or disable (0) various features. All the sysctl entries -+ are mutable until the "grsec_lock" entry is set to a non-zero value. -+ All features enabled in the kernel configuration are disabled at boot -+ if you do not say Y to the "Turn on features by default" option. -+ All options should be set at startup, and the grsec_lock entry should -+ be set to a non-zero value after all the options are set. -+ *THIS IS EXTREMELY IMPORTANT* ++ return match; ++} + -+config GRKERNSEC_SYSCTL_DISTRO -+ bool "Extra sysctl support for distro makers (READ HELP)" -+ depends on GRKERNSEC_SYSCTL && GRKERNSEC_IO -+ help -+ If you say Y here, additional sysctl options will be created -+ for features that affect processes running as root. Therefore, -+ it is critical when using this option that the grsec_lock entry be -+ enabled after boot. Only distros with prebuilt kernel packages -+ with this option enabled that can ensure grsec_lock is enabled -+ after boot should use this option. -+ *Failure to set grsec_lock after boot makes all grsec features -+ this option covers useless* ++struct acl_subject_label * ++lookup_acl_subj_label(const ino_t ino, const dev_t dev, ++ const struct acl_role_label *role) ++{ ++ unsigned int index = fhash(ino, dev, role->subj_hash_size); ++ struct acl_subject_label *match; + -+ Currently this option creates the following sysctl entries: -+ "Disable Privileged I/O": "disable_priv_io" ++ match = role->subj_hash[index]; + -+config GRKERNSEC_SYSCTL_ON -+ bool "Turn on features by default" -+ depends on GRKERNSEC_SYSCTL -+ help -+ If you say Y here, instead of having all features enabled in the -+ kernel configuration disabled at boot time, the features will be -+ enabled at boot time. It is recommended you say Y here unless -+ there is some reason you would want all sysctl-tunable features to -+ be disabled by default. As mentioned elsewhere, it is important -+ to enable the grsec_lock entry once you have finished modifying -+ the sysctl entries. ++ while (match && (match->inode != ino || match->device != dev || ++ (match->mode & GR_DELETED))) { ++ match = match->next; ++ } + -+endmenu -+menu "Logging Options" -+depends on GRKERNSEC ++ if (match && !(match->mode & GR_DELETED)) ++ return match; ++ else ++ return NULL; ++} + -+config GRKERNSEC_FLOODTIME -+ int "Seconds in between log messages (minimum)" -+ default 10 -+ help -+ This option allows you to enforce the number of seconds between -+ grsecurity log messages. The default should be suitable for most -+ people, however, if you choose to change it, choose a value small enough -+ to allow informative logs to be produced, but large enough to -+ prevent flooding. ++struct acl_subject_label * ++lookup_acl_subj_label_deleted(const ino_t ino, const dev_t dev, ++ const struct acl_role_label *role) ++{ ++ unsigned int index = fhash(ino, dev, role->subj_hash_size); ++ struct acl_subject_label *match; + -+config GRKERNSEC_FLOODBURST -+ int "Number of messages in a burst (maximum)" -+ default 4 -+ help -+ This option allows you to choose the maximum number of messages allowed -+ within the flood time interval you chose in a separate option. The -+ default should be suitable for most people, however if you find that -+ many of your logs are being interpreted as flooding, you may want to -+ raise this value. ++ match = role->subj_hash[index]; + -+endmenu ++ while (match && (match->inode != ino || match->device != dev || ++ !(match->mode & GR_DELETED))) { ++ match = match->next; ++ } + -+endmenu -diff -urNp linux-2.6.34.1/grsecurity/Makefile linux-2.6.34.1/grsecurity/Makefile ---- linux-2.6.34.1/grsecurity/Makefile 1969-12-31 19:00:00.000000000 -0500 -+++ linux-2.6.34.1/grsecurity/Makefile 2010-07-07 09:04:56.000000000 -0400 -@@ -0,0 +1,29 @@ -+# grsecurity's ACL system was originally written in 2001 by Michael Dalton -+# during 2001-2009 it has been completely redesigned by Brad Spengler -+# into an RBAC system -+# -+# All code in this directory and various hooks inserted throughout the kernel -+# are copyright Brad Spengler - Open Source Security, Inc., and released -+# under the GPL v2 or higher ++ if (match && (match->mode & GR_DELETED)) ++ return match; ++ else ++ return NULL; ++} + -+obj-y = grsec_chdir.o grsec_chroot.o grsec_exec.o grsec_fifo.o grsec_fork.o \ -+ grsec_mount.o grsec_sig.o grsec_sock.o grsec_sysctl.o \ -+ grsec_time.o grsec_tpe.o grsec_link.o grsec_textrel.o grsec_ptrace.o ++static struct acl_object_label * ++lookup_acl_obj_label(const ino_t ino, const dev_t dev, ++ const struct acl_subject_label *subj) ++{ ++ unsigned int index = fhash(ino, dev, subj->obj_hash_size); ++ struct acl_object_label *match; + -+obj-$(CONFIG_GRKERNSEC) += grsec_init.o grsum.o gracl.o gracl_ip.o gracl_segv.o \ -+ gracl_cap.o gracl_alloc.o gracl_shm.o grsec_mem.o gracl_fs.o \ -+ gracl_learn.o grsec_log.o -+obj-$(CONFIG_GRKERNSEC_RESLOG) += gracl_res.o ++ match = subj->obj_hash[index]; + -+ifndef CONFIG_GRKERNSEC -+obj-y += grsec_disabled.o -+endif ++ while (match && (match->inode != ino || match->device != dev || ++ (match->mode & GR_DELETED))) { ++ match = match->next; ++ } + -+ifdef CONFIG_GRKERNSEC_HIDESYM -+extra-y := grsec_hidesym.o -+$(obj)/grsec_hidesym.o: -+ @-chmod -f 500 /boot -+ @-chmod -f 500 /lib/modules -+ @-chmod -f 700 . -+ @echo ' grsec: protected kernel image paths' -+endif -diff -urNp linux-2.6.34.1/grsecurity/gracl.c linux-2.6.34.1/grsecurity/gracl.c ---- linux-2.6.34.1/grsecurity/gracl.c 1969-12-31 19:00:00.000000000 -0500 -+++ linux-2.6.34.1/grsecurity/gracl.c 2010-07-07 09:04:56.000000000 -0400 -@@ -0,0 +1,3899 @@ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include ++ if (match && !(match->mode & GR_DELETED)) ++ return match; ++ else ++ return NULL; ++} + -+#include -+#include -+#include ++static struct acl_object_label * ++lookup_acl_obj_label_create(const ino_t ino, const dev_t dev, ++ const struct acl_subject_label *subj) ++{ ++ unsigned int index = fhash(ino, dev, subj->obj_hash_size); ++ struct acl_object_label *match; + -+static struct acl_role_db acl_role_set; -+static struct name_db name_set; -+static struct inodev_db inodev_set; ++ match = subj->obj_hash[index]; + -+/* for keeping track of userspace pointers used for subjects, so we -+ can share references in the kernel as well -+*/ ++ while (match && (match->inode != ino || match->device != dev || ++ !(match->mode & GR_DELETED))) { ++ match = match->next; ++ } + -+static struct dentry *real_root; -+static struct vfsmount *real_root_mnt; ++ if (match && (match->mode & GR_DELETED)) ++ return match; + -+static struct acl_subj_map_db subj_map_set; ++ match = subj->obj_hash[index]; + -+static struct acl_role_label *default_role; ++ while (match && (match->inode != ino || match->device != dev || ++ (match->mode & GR_DELETED))) { ++ match = match->next; ++ } + -+static struct acl_role_label *role_list; ++ if (match && !(match->mode & GR_DELETED)) ++ return match; ++ else ++ return NULL; ++} + -+static u16 acl_sp_role_value; ++static struct name_entry * ++lookup_name_entry(const char *name) ++{ ++ unsigned int len = strlen(name); ++ unsigned int key = full_name_hash(name, len); ++ unsigned int index = key % name_set.n_size; ++ struct name_entry *match; + -+extern char *gr_shared_page[4]; -+static DECLARE_MUTEX(gr_dev_sem); -+DEFINE_RWLOCK(gr_inode_lock); ++ match = name_set.n_hash[index]; + -+struct gr_arg *gr_usermode; ++ while (match && (match->key != key || !gr_streq(match->name, name, match->len, len))) ++ match = match->next; + -+static unsigned int gr_status __read_only = GR_STATUS_INIT; ++ return match; ++} + -+extern int chkpw(struct gr_arg *entry, unsigned char *salt, unsigned char *sum); -+extern void gr_clear_learn_entries(void); ++static struct name_entry * ++lookup_name_entry_create(const char *name) ++{ ++ unsigned int len = strlen(name); ++ unsigned int key = full_name_hash(name, len); ++ unsigned int index = key % name_set.n_size; ++ struct name_entry *match; + -+#ifdef CONFIG_GRKERNSEC_RESLOG -+extern void gr_log_resource(const struct task_struct *task, -+ const int res, const unsigned long wanted, const int gt); -+#endif ++ match = name_set.n_hash[index]; + -+unsigned char *gr_system_salt; -+unsigned char *gr_system_sum; ++ while (match && (match->key != key || !gr_streq(match->name, name, match->len, len) || ++ !match->deleted)) ++ match = match->next; + -+static struct sprole_pw **acl_special_roles = NULL; -+static __u16 num_sprole_pws = 0; ++ if (match && match->deleted) ++ return match; + -+static struct acl_role_label *kernel_role = NULL; ++ match = name_set.n_hash[index]; + -+static unsigned int gr_auth_attempts = 0; -+static unsigned long gr_auth_expires = 0UL; ++ while (match && (match->key != key || !gr_streq(match->name, name, match->len, len) || ++ match->deleted)) ++ match = match->next; + -+extern struct vfsmount *sock_mnt; -+extern struct vfsmount *pipe_mnt; -+extern struct vfsmount *shm_mnt; -+#ifdef CONFIG_HUGETLBFS -+extern struct vfsmount *hugetlbfs_vfsmount; -+#endif ++ if (match && !match->deleted) ++ return match; ++ else ++ return NULL; ++} + -+static struct acl_object_label *fakefs_obj; ++static struct inodev_entry * ++lookup_inodev_entry(const ino_t ino, const dev_t dev) ++{ ++ unsigned int index = fhash(ino, dev, inodev_set.i_size); ++ struct inodev_entry *match; + -+extern int gr_init_uidset(void); -+extern void gr_free_uidset(void); -+extern void gr_remove_uid(uid_t uid); -+extern int gr_find_uid(uid_t uid); ++ match = inodev_set.i_hash[index]; + -+extern spinlock_t vfsmount_lock; ++ while (match && (match->nentry->inode != ino || match->nentry->device != dev)) ++ match = match->next; + -+__inline__ int -+gr_acl_is_enabled(void) -+{ -+ return (gr_status & GR_READY); ++ return match; +} + -+char gr_roletype_to_char(void) ++static void ++insert_inodev_entry(struct inodev_entry *entry) +{ -+ switch (current->role->roletype & -+ (GR_ROLE_DEFAULT | GR_ROLE_USER | GR_ROLE_GROUP | -+ GR_ROLE_SPECIAL)) { -+ case GR_ROLE_DEFAULT: -+ return 'D'; -+ case GR_ROLE_USER: -+ return 'U'; -+ case GR_ROLE_GROUP: -+ return 'G'; -+ case GR_ROLE_SPECIAL: -+ return 'S'; -+ } ++ unsigned int index = fhash(entry->nentry->inode, entry->nentry->device, ++ inodev_set.i_size); ++ struct inodev_entry **curr; + -+ return 'X'; -+} ++ entry->prev = NULL; + -+__inline__ int -+gr_acl_tpe_check(void) -+{ -+ if (unlikely(!(gr_status & GR_READY))) -+ return 0; -+ if (current->role->roletype & GR_ROLE_TPE) -+ return 1; -+ else -+ return 0; -+} ++ curr = &inodev_set.i_hash[index]; ++ if (*curr != NULL) ++ (*curr)->prev = entry; ++ ++ entry->next = *curr; ++ *curr = entry; + -+int -+gr_handle_rawio(const struct inode *inode) -+{ -+#ifdef CONFIG_GRKERNSEC_CHROOT_CAPS -+ if (inode && S_ISBLK(inode->i_mode) && -+ grsec_enable_chroot_caps && proc_is_chrooted(current) && -+ !capable(CAP_SYS_RAWIO)) -+ return 1; -+#endif -+ return 0; ++ return; +} + -+static int -+gr_streq(const char *a, const char *b, const unsigned int lena, const unsigned int lenb) -+{ -+ if (likely(lena != lenb)) -+ return 0; -+ -+ return !memcmp(a, b, lena); -+} -+ -+static char * __our_d_path(struct dentry *dentry, struct vfsmount *vfsmnt, -+ struct dentry *root, struct vfsmount *rootmnt, -+ char *buffer, int buflen) -+{ -+ char * end = buffer+buflen; -+ char * retval; -+ int namelen; -+ -+ spin_lock(&vfsmount_lock); -+ *--end = '\0'; -+ buflen--; -+ -+ if (buflen < 1) -+ goto Elong; -+ /* Get '/' right */ -+ retval = end-1; -+ *retval = '/'; -+ -+ for (;;) { -+ struct dentry * parent; -+ -+ if (dentry == root && vfsmnt == rootmnt) -+ break; -+ if (dentry == vfsmnt->mnt_root || IS_ROOT(dentry)) { -+ /* Global root? */ -+ if (vfsmnt->mnt_parent == vfsmnt) { -+ goto global_root; -+ } -+ dentry = vfsmnt->mnt_mountpoint; -+ vfsmnt = vfsmnt->mnt_parent; -+ continue; -+ } -+ parent = dentry->d_parent; -+ prefetch(parent); -+ namelen = dentry->d_name.len; -+ buflen -= namelen + 1; -+ if (buflen < 0) -+ goto Elong; -+ end -= namelen; -+ memcpy(end, dentry->d_name.name, namelen); -+ *--end = '/'; -+ retval = end; -+ dentry = parent; -+ } -+ -+out: -+ spin_unlock(&vfsmount_lock); -+ return retval; -+ -+global_root: -+ namelen = dentry->d_name.len; -+ buflen -= namelen; -+ if (buflen < 0) -+ goto Elong; -+ retval -= namelen-1; /* hit the slash */ -+ memcpy(retval, dentry->d_name.name, namelen); -+ goto out; -+Elong: -+ retval = ERR_PTR(-ENAMETOOLONG); -+ goto out; -+} -+ -+static char * -+gen_full_path(struct dentry *dentry, struct vfsmount *vfsmnt, -+ struct dentry *root, struct vfsmount *rootmnt, char *buf, int buflen) -+{ -+ char *retval; -+ -+ retval = __our_d_path(dentry, vfsmnt, root, rootmnt, buf, buflen); -+ if (unlikely(IS_ERR(retval))) -+ retval = strcpy(buf, ""); -+ else if (unlikely(retval[1] == '/' && retval[2] == '\0')) -+ retval[1] = '\0'; -+ -+ return retval; -+} -+ -+static char * -+__d_real_path(const struct dentry *dentry, const struct vfsmount *vfsmnt, -+ char *buf, int buflen) -+{ -+ char *res; -+ -+ /* we can use real_root, real_root_mnt, because this is only called -+ by the RBAC system */ -+ res = gen_full_path((struct dentry *)dentry, (struct vfsmount *)vfsmnt, real_root, real_root_mnt, buf, buflen); -+ -+ return res; -+} -+ -+static char * -+d_real_path(const struct dentry *dentry, const struct vfsmount *vfsmnt, -+ char *buf, int buflen) -+{ -+ char *res; -+ struct dentry *root; -+ struct vfsmount *rootmnt; -+ struct task_struct *reaper = &init_task; -+ -+ /* we can't use real_root, real_root_mnt, because they belong only to the RBAC system */ -+ read_lock(&reaper->fs->lock); -+ root = dget(reaper->fs->root.dentry); -+ rootmnt = mntget(reaper->fs->root.mnt); -+ read_unlock(&reaper->fs->lock); -+ -+ spin_lock(&dcache_lock); -+ res = gen_full_path((struct dentry *)dentry, (struct vfsmount *)vfsmnt, root, rootmnt, buf, buflen); -+ spin_unlock(&dcache_lock); -+ -+ dput(root); -+ mntput(rootmnt); -+ return res; -+} -+ -+static char * -+gr_to_filename_rbac(const struct dentry *dentry, const struct vfsmount *mnt) -+{ -+ char *ret; -+ spin_lock(&dcache_lock); -+ ret = __d_real_path(dentry, mnt, per_cpu_ptr(gr_shared_page[0],smp_processor_id()), -+ PAGE_SIZE); -+ spin_unlock(&dcache_lock); -+ return ret; -+} -+ -+char * -+gr_to_filename_nolock(const struct dentry *dentry, const struct vfsmount *mnt) -+{ -+ return __d_real_path(dentry, mnt, per_cpu_ptr(gr_shared_page[0],smp_processor_id()), -+ PAGE_SIZE); -+} -+ -+char * -+gr_to_filename(const struct dentry *dentry, const struct vfsmount *mnt) -+{ -+ return d_real_path(dentry, mnt, per_cpu_ptr(gr_shared_page[0], smp_processor_id()), -+ PAGE_SIZE); -+} -+ -+char * -+gr_to_filename1(const struct dentry *dentry, const struct vfsmount *mnt) -+{ -+ return d_real_path(dentry, mnt, per_cpu_ptr(gr_shared_page[1], smp_processor_id()), -+ PAGE_SIZE); -+} -+ -+char * -+gr_to_filename2(const struct dentry *dentry, const struct vfsmount *mnt) -+{ -+ return d_real_path(dentry, mnt, per_cpu_ptr(gr_shared_page[2], smp_processor_id()), -+ PAGE_SIZE); -+} -+ -+char * -+gr_to_filename3(const struct dentry *dentry, const struct vfsmount *mnt) -+{ -+ return d_real_path(dentry, mnt, per_cpu_ptr(gr_shared_page[3], smp_processor_id()), -+ PAGE_SIZE); -+} -+ -+__inline__ __u32 -+to_gr_audit(const __u32 reqmode) -+{ -+ /* masks off auditable permission flags, then shifts them to create -+ auditing flags, and adds the special case of append auditing if -+ we're requesting write */ -+ return (((reqmode & ~GR_AUDITS) << 10) | ((reqmode & GR_WRITE) ? GR_AUDIT_APPEND : 0)); -+} -+ -+struct acl_subject_label * -+lookup_subject_map(const struct acl_subject_label *userp) -+{ -+ unsigned int index = shash(userp, subj_map_set.s_size); -+ struct subject_map *match; -+ -+ match = subj_map_set.s_hash[index]; -+ -+ while (match && match->user != userp) -+ match = match->next; -+ -+ if (match != NULL) -+ return match->kernel; -+ else -+ return NULL; -+} -+ -+static void -+insert_subj_map_entry(struct subject_map *subjmap) -+{ -+ unsigned int index = shash(subjmap->user, subj_map_set.s_size); -+ struct subject_map **curr; -+ -+ subjmap->prev = NULL; -+ -+ curr = &subj_map_set.s_hash[index]; -+ if (*curr != NULL) -+ (*curr)->prev = subjmap; -+ -+ subjmap->next = *curr; -+ *curr = subjmap; -+ -+ return; -+} -+ -+static struct acl_role_label * -+lookup_acl_role_label(const struct task_struct *task, const uid_t uid, -+ const gid_t gid) -+{ -+ unsigned int index = rhash(uid, GR_ROLE_USER, acl_role_set.r_size); -+ struct acl_role_label *match; -+ struct role_allowed_ip *ipp; -+ unsigned int x; -+ -+ match = acl_role_set.r_hash[index]; -+ -+ while (match) { -+ if ((match->roletype & (GR_ROLE_DOMAIN | GR_ROLE_USER)) == (GR_ROLE_DOMAIN | GR_ROLE_USER)) { -+ for (x = 0; x < match->domain_child_num; x++) { -+ if (match->domain_children[x] == uid) -+ goto found; -+ } -+ } else if (match->uidgid == uid && match->roletype & GR_ROLE_USER) -+ break; -+ match = match->next; -+ } -+found: -+ if (match == NULL) { -+ try_group: -+ index = rhash(gid, GR_ROLE_GROUP, acl_role_set.r_size); -+ match = acl_role_set.r_hash[index]; -+ -+ while (match) { -+ if ((match->roletype & (GR_ROLE_DOMAIN | GR_ROLE_GROUP)) == (GR_ROLE_DOMAIN | GR_ROLE_GROUP)) { -+ for (x = 0; x < match->domain_child_num; x++) { -+ if (match->domain_children[x] == gid) -+ goto found2; -+ } -+ } else if (match->uidgid == gid && match->roletype & GR_ROLE_GROUP) -+ break; -+ match = match->next; -+ } -+found2: -+ if (match == NULL) -+ match = default_role; -+ if (match->allowed_ips == NULL) -+ return match; -+ else { -+ for (ipp = match->allowed_ips; ipp; ipp = ipp->next) { -+ if (likely -+ ((ntohl(task->signal->curr_ip) & ipp->netmask) == -+ (ntohl(ipp->addr) & ipp->netmask))) -+ return match; -+ } -+ match = default_role; -+ } -+ } else if (match->allowed_ips == NULL) { -+ return match; -+ } else { -+ for (ipp = match->allowed_ips; ipp; ipp = ipp->next) { -+ if (likely -+ ((ntohl(task->signal->curr_ip) & ipp->netmask) == -+ (ntohl(ipp->addr) & ipp->netmask))) -+ return match; -+ } -+ goto try_group; -+ } -+ -+ return match; -+} -+ -+struct acl_subject_label * -+lookup_acl_subj_label(const ino_t ino, const dev_t dev, -+ const struct acl_role_label *role) -+{ -+ unsigned int index = fhash(ino, dev, role->subj_hash_size); -+ struct acl_subject_label *match; -+ -+ match = role->subj_hash[index]; -+ -+ while (match && (match->inode != ino || match->device != dev || -+ (match->mode & GR_DELETED))) { -+ match = match->next; -+ } -+ -+ if (match && !(match->mode & GR_DELETED)) -+ return match; -+ else -+ return NULL; -+} -+ -+struct acl_subject_label * -+lookup_acl_subj_label_deleted(const ino_t ino, const dev_t dev, -+ const struct acl_role_label *role) -+{ -+ unsigned int index = fhash(ino, dev, role->subj_hash_size); -+ struct acl_subject_label *match; -+ -+ match = role->subj_hash[index]; -+ -+ while (match && (match->inode != ino || match->device != dev || -+ !(match->mode & GR_DELETED))) { -+ match = match->next; -+ } -+ -+ if (match && (match->mode & GR_DELETED)) -+ return match; -+ else -+ return NULL; -+} -+ -+static struct acl_object_label * -+lookup_acl_obj_label(const ino_t ino, const dev_t dev, -+ const struct acl_subject_label *subj) -+{ -+ unsigned int index = fhash(ino, dev, subj->obj_hash_size); -+ struct acl_object_label *match; -+ -+ match = subj->obj_hash[index]; -+ -+ while (match && (match->inode != ino || match->device != dev || -+ (match->mode & GR_DELETED))) { -+ match = match->next; -+ } -+ -+ if (match && !(match->mode & GR_DELETED)) -+ return match; -+ else -+ return NULL; -+} -+ -+static struct acl_object_label * -+lookup_acl_obj_label_create(const ino_t ino, const dev_t dev, -+ const struct acl_subject_label *subj) -+{ -+ unsigned int index = fhash(ino, dev, subj->obj_hash_size); -+ struct acl_object_label *match; -+ -+ match = subj->obj_hash[index]; -+ -+ while (match && (match->inode != ino || match->device != dev || -+ !(match->mode & GR_DELETED))) { -+ match = match->next; -+ } -+ -+ if (match && (match->mode & GR_DELETED)) -+ return match; -+ -+ match = subj->obj_hash[index]; -+ -+ while (match && (match->inode != ino || match->device != dev || -+ (match->mode & GR_DELETED))) { -+ match = match->next; -+ } -+ -+ if (match && !(match->mode & GR_DELETED)) -+ return match; -+ else -+ return NULL; -+} -+ -+static struct name_entry * -+lookup_name_entry(const char *name) -+{ -+ unsigned int len = strlen(name); -+ unsigned int key = full_name_hash(name, len); -+ unsigned int index = key % name_set.n_size; -+ struct name_entry *match; -+ -+ match = name_set.n_hash[index]; -+ -+ while (match && (match->key != key || !gr_streq(match->name, name, match->len, len))) -+ match = match->next; -+ -+ return match; -+} -+ -+static struct name_entry * -+lookup_name_entry_create(const char *name) -+{ -+ unsigned int len = strlen(name); -+ unsigned int key = full_name_hash(name, len); -+ unsigned int index = key % name_set.n_size; -+ struct name_entry *match; -+ -+ match = name_set.n_hash[index]; -+ -+ while (match && (match->key != key || !gr_streq(match->name, name, match->len, len) || -+ !match->deleted)) -+ match = match->next; -+ -+ if (match && match->deleted) -+ return match; -+ -+ match = name_set.n_hash[index]; -+ -+ while (match && (match->key != key || !gr_streq(match->name, name, match->len, len) || -+ match->deleted)) -+ match = match->next; -+ -+ if (match && !match->deleted) -+ return match; -+ else -+ return NULL; -+} -+ -+static struct inodev_entry * -+lookup_inodev_entry(const ino_t ino, const dev_t dev) -+{ -+ unsigned int index = fhash(ino, dev, inodev_set.i_size); -+ struct inodev_entry *match; -+ -+ match = inodev_set.i_hash[index]; -+ -+ while (match && (match->nentry->inode != ino || match->nentry->device != dev)) -+ match = match->next; -+ -+ return match; -+} -+ -+static void -+insert_inodev_entry(struct inodev_entry *entry) -+{ -+ unsigned int index = fhash(entry->nentry->inode, entry->nentry->device, -+ inodev_set.i_size); -+ struct inodev_entry **curr; -+ -+ entry->prev = NULL; -+ -+ curr = &inodev_set.i_hash[index]; -+ if (*curr != NULL) -+ (*curr)->prev = entry; -+ -+ entry->next = *curr; -+ *curr = entry; -+ -+ return; -+} -+ -+static void -+__insert_acl_role_label(struct acl_role_label *role, uid_t uidgid) ++static void ++__insert_acl_role_label(struct acl_role_label *role, uid_t uidgid) +{ + unsigned int index = + rhash(uidgid, role->roletype & (GR_ROLE_USER | GR_ROLE_GROUP), acl_role_set.r_size); @@ -36164,6 +36239,29 @@ diff -urNp linux-2.6.34.1/grsecurity/gracl.c linux-2.6.34.1/grsecurity/gracl.c + return 0; +} + ++int ++gr_check_protected_task_fowner(struct pid *pid, enum pid_type type) ++{ ++ struct task_struct *p; ++ int ret = 0; ++ ++ if (unlikely(!(gr_status & GR_READY) || !pid)) ++ return ret; ++ ++ read_lock(&tasklist_lock); ++ do_each_pid_task(pid, type, p) { ++ if ((p->acl->mode & GR_PROTECTED) && !(current->acl->mode & GR_KILL) && ++ p->acl != current->acl) { ++ ret = 1; ++ goto out; ++ } ++ } while_each_pid_task(pid, type, p); ++out: ++ read_unlock(&tasklist_lock); ++ ++ return ret; ++} ++ +void +gr_copy_label(struct task_struct *tsk) +{ @@ -37463,7 +37561,7 @@ diff -urNp linux-2.6.34.1/grsecurity/gracl.c linux-2.6.34.1/grsecurity/gracl.c +__u32 +gr_handle_sysctl(const struct ctl_table *table, const int op) +{ -+ ctl_table *tmp; ++ struct ctl_table *tmp; + const char *proc_sys = "/proc/sys"; + char *path; + struct acl_object_label *obj; @@ -37496,7 +37594,7 @@ diff -urNp linux-2.6.34.1/grsecurity/gracl.c linux-2.6.34.1/grsecurity/gracl.c + + /* convert the requested sysctl entry into a pathname */ + -+ for (tmp = (ctl_table *)table; tmp != NULL; tmp = tmp->parent) { ++ for (tmp = (struct ctl_table *)table; tmp != NULL; tmp = tmp->parent) { + len += strlen(tmp->procname); + len++; + depth++; @@ -37516,7 +37614,7 @@ diff -urNp linux-2.6.34.1/grsecurity/gracl.c linux-2.6.34.1/grsecurity/gracl.c + for (; depth > 0; depth--) { + path[pos] = '/'; + pos++; -+ for (i = 1, tmp = (ctl_table *)table; tmp != NULL; tmp = tmp->parent) { ++ for (i = 1, tmp = (struct ctl_table *)table; tmp != NULL; tmp = tmp->parent) { + if (depth == i) { + memcpy(path + pos, tmp->procname, + strlen(tmp->procname)); @@ -37698,7 +37796,7 @@ diff -urNp linux-2.6.34.1/grsecurity/gracl.c linux-2.6.34.1/grsecurity/gracl.c + struct acl_object_label *obj, *obj2; + + if (gr_status & GR_READY && !(task->acl->mode & GR_OVERRIDE) && -+ !task->is_writable && S_ISREG(filp->f_path.dentry->d_inode->i_mode)) { ++ !task->is_writable && S_ISREG(filp->f_path.dentry->d_inode->i_mode) && filp->f_path.mnt != shm_mnt) { + obj = chk_obj_label(filp->f_path.dentry, filp->f_path.mnt, default_role->root_label); + obj2 = chk_obj_label(filp->f_path.dentry, filp->f_path.mnt, + task->role->root_label); @@ -37944,118 +38042,9 @@ diff -urNp linux-2.6.34.1/grsecurity/gracl.c linux-2.6.34.1/grsecurity/gracl.c +EXPORT_SYMBOL(gr_check_group_change); +#endif + -diff -urNp linux-2.6.34.1/grsecurity/gracl_alloc.c linux-2.6.34.1/grsecurity/gracl_alloc.c ---- linux-2.6.34.1/grsecurity/gracl_alloc.c 1969-12-31 19:00:00.000000000 -0500 -+++ linux-2.6.34.1/grsecurity/gracl_alloc.c 2010-07-07 09:04:56.000000000 -0400 -@@ -0,0 +1,105 @@ -+#include -+#include -+#include -+#include -+#include -+#include -+ -+static unsigned long alloc_stack_next = 1; -+static unsigned long alloc_stack_size = 1; -+static void **alloc_stack; -+ -+static __inline__ int -+alloc_pop(void) -+{ -+ if (alloc_stack_next == 1) -+ return 0; -+ -+ kfree(alloc_stack[alloc_stack_next - 2]); -+ -+ alloc_stack_next--; -+ -+ return 1; -+} -+ -+static __inline__ int -+alloc_push(void *buf) -+{ -+ if (alloc_stack_next >= alloc_stack_size) -+ return 1; -+ -+ alloc_stack[alloc_stack_next - 1] = buf; -+ -+ alloc_stack_next++; -+ -+ return 0; -+} -+ -+void * -+acl_alloc(unsigned long len) -+{ -+ void *ret = NULL; -+ -+ if (!len || len > PAGE_SIZE) -+ goto out; -+ -+ ret = kmalloc(len, GFP_KERNEL); -+ -+ if (ret) { -+ if (alloc_push(ret)) { -+ kfree(ret); -+ ret = NULL; -+ } -+ } -+ -+out: -+ return ret; -+} -+ -+void * -+acl_alloc_num(unsigned long num, unsigned long len) -+{ -+ if (!len || (num > (PAGE_SIZE / len))) -+ return NULL; -+ -+ return acl_alloc(num * len); -+} -+ -+void -+acl_free_all(void) -+{ -+ if (gr_acl_is_enabled() || !alloc_stack) -+ return; -+ -+ while (alloc_pop()) ; -+ -+ if (alloc_stack) { -+ if ((alloc_stack_size * sizeof (void *)) <= PAGE_SIZE) -+ kfree(alloc_stack); -+ else -+ vfree(alloc_stack); -+ } -+ -+ alloc_stack = NULL; -+ alloc_stack_size = 1; -+ alloc_stack_next = 1; -+ -+ return; -+} -+ -+int -+acl_alloc_stack_init(unsigned long size) -+{ -+ if ((size * sizeof (void *)) <= PAGE_SIZE) -+ alloc_stack = -+ (void **) kmalloc(size * sizeof (void *), GFP_KERNEL); -+ else -+ alloc_stack = (void **) vmalloc(size * sizeof (void *)); -+ -+ alloc_stack_size = size; -+ -+ if (!alloc_stack) -+ return 0; -+ else -+ return 1; -+} -diff -urNp linux-2.6.34.1/grsecurity/gracl_cap.c linux-2.6.34.1/grsecurity/gracl_cap.c ---- linux-2.6.34.1/grsecurity/gracl_cap.c 1969-12-31 19:00:00.000000000 -0500 -+++ linux-2.6.34.1/grsecurity/gracl_cap.c 2010-07-07 09:04:56.000000000 -0400 +diff -urNp linux-2.6.35.4/grsecurity/gracl_cap.c linux-2.6.35.4/grsecurity/gracl_cap.c +--- linux-2.6.35.4/grsecurity/gracl_cap.c 1969-12-31 19:00:00.000000000 -0500 ++++ linux-2.6.35.4/grsecurity/gracl_cap.c 2010-09-17 20:12:37.000000000 -0400 @@ -0,0 +1,138 @@ +#include +#include @@ -38195,9 +38184,9 @@ diff -urNp linux-2.6.34.1/grsecurity/gracl_cap.c linux-2.6.34.1/grsecurity/gracl + return 0; +} + -diff -urNp linux-2.6.34.1/grsecurity/gracl_fs.c linux-2.6.34.1/grsecurity/gracl_fs.c ---- linux-2.6.34.1/grsecurity/gracl_fs.c 1969-12-31 19:00:00.000000000 -0500 -+++ linux-2.6.34.1/grsecurity/gracl_fs.c 2010-07-07 09:04:56.000000000 -0400 +diff -urNp linux-2.6.35.4/grsecurity/gracl_fs.c linux-2.6.35.4/grsecurity/gracl_fs.c +--- linux-2.6.35.4/grsecurity/gracl_fs.c 1969-12-31 19:00:00.000000000 -0500 ++++ linux-2.6.35.4/grsecurity/gracl_fs.c 2010-09-17 20:12:37.000000000 -0400 @@ -0,0 +1,424 @@ +#include +#include @@ -38623,9 +38612,9 @@ diff -urNp linux-2.6.34.1/grsecurity/gracl_fs.c linux-2.6.34.1/grsecurity/gracl_ + + return 0; +} -diff -urNp linux-2.6.34.1/grsecurity/gracl_ip.c linux-2.6.34.1/grsecurity/gracl_ip.c ---- linux-2.6.34.1/grsecurity/gracl_ip.c 1969-12-31 19:00:00.000000000 -0500 -+++ linux-2.6.34.1/grsecurity/gracl_ip.c 2010-07-07 09:04:56.000000000 -0400 +diff -urNp linux-2.6.35.4/grsecurity/gracl_ip.c linux-2.6.35.4/grsecurity/gracl_ip.c +--- linux-2.6.35.4/grsecurity/gracl_ip.c 1969-12-31 19:00:00.000000000 -0500 ++++ linux-2.6.35.4/grsecurity/gracl_ip.c 2010-09-17 20:12:37.000000000 -0400 @@ -0,0 +1,339 @@ +#include +#include @@ -38966,9 +38955,9 @@ diff -urNp linux-2.6.34.1/grsecurity/gracl_ip.c linux-2.6.34.1/grsecurity/gracl_ + + return gr_search_connectbind(GR_CONNECT | GR_CONNECTOVERRIDE, sk, &sin, SOCK_DGRAM); +} -diff -urNp linux-2.6.34.1/grsecurity/gracl_learn.c linux-2.6.34.1/grsecurity/gracl_learn.c ---- linux-2.6.34.1/grsecurity/gracl_learn.c 1969-12-31 19:00:00.000000000 -0500 -+++ linux-2.6.34.1/grsecurity/gracl_learn.c 2010-07-07 09:04:56.000000000 -0400 +diff -urNp linux-2.6.35.4/grsecurity/gracl_learn.c linux-2.6.35.4/grsecurity/gracl_learn.c +--- linux-2.6.35.4/grsecurity/gracl_learn.c 1969-12-31 19:00:00.000000000 -0500 ++++ linux-2.6.35.4/grsecurity/gracl_learn.c 2010-09-17 20:12:37.000000000 -0400 @@ -0,0 +1,211 @@ +#include +#include @@ -39181,9 +39170,9 @@ diff -urNp linux-2.6.34.1/grsecurity/gracl_learn.c linux-2.6.34.1/grsecurity/gra + .release = close_learn, + .poll = poll_learn, +}; -diff -urNp linux-2.6.34.1/grsecurity/gracl_res.c linux-2.6.34.1/grsecurity/gracl_res.c ---- linux-2.6.34.1/grsecurity/gracl_res.c 1969-12-31 19:00:00.000000000 -0500 -+++ linux-2.6.34.1/grsecurity/gracl_res.c 2010-07-07 09:04:56.000000000 -0400 +diff -urNp linux-2.6.35.4/grsecurity/gracl_res.c linux-2.6.35.4/grsecurity/gracl_res.c +--- linux-2.6.35.4/grsecurity/gracl_res.c 1969-12-31 19:00:00.000000000 -0500 ++++ linux-2.6.35.4/grsecurity/gracl_res.c 2010-09-17 20:12:37.000000000 -0400 @@ -0,0 +1,68 @@ +#include +#include @@ -39253,9 +39242,9 @@ diff -urNp linux-2.6.34.1/grsecurity/gracl_res.c linux-2.6.34.1/grsecurity/gracl + rcu_read_unlock(); + return; +} -diff -urNp linux-2.6.34.1/grsecurity/gracl_segv.c linux-2.6.34.1/grsecurity/gracl_segv.c ---- linux-2.6.34.1/grsecurity/gracl_segv.c 1969-12-31 19:00:00.000000000 -0500 -+++ linux-2.6.34.1/grsecurity/gracl_segv.c 2010-07-07 09:04:56.000000000 -0400 +diff -urNp linux-2.6.35.4/grsecurity/gracl_segv.c linux-2.6.35.4/grsecurity/gracl_segv.c +--- linux-2.6.35.4/grsecurity/gracl_segv.c 1969-12-31 19:00:00.000000000 -0500 ++++ linux-2.6.35.4/grsecurity/gracl_segv.c 2010-09-17 20:12:37.000000000 -0400 @@ -0,0 +1,310 @@ +#include +#include @@ -39567,9 +39556,9 @@ diff -urNp linux-2.6.34.1/grsecurity/gracl_segv.c linux-2.6.34.1/grsecurity/grac + + return; +} -diff -urNp linux-2.6.34.1/grsecurity/gracl_shm.c linux-2.6.34.1/grsecurity/gracl_shm.c ---- linux-2.6.34.1/grsecurity/gracl_shm.c 1969-12-31 19:00:00.000000000 -0500 -+++ linux-2.6.34.1/grsecurity/gracl_shm.c 2010-07-07 09:04:56.000000000 -0400 +diff -urNp linux-2.6.35.4/grsecurity/gracl_shm.c linux-2.6.35.4/grsecurity/gracl_shm.c +--- linux-2.6.35.4/grsecurity/gracl_shm.c 1969-12-31 19:00:00.000000000 -0500 ++++ linux-2.6.35.4/grsecurity/gracl_shm.c 2010-09-17 20:12:37.000000000 -0400 @@ -0,0 +1,40 @@ +#include +#include @@ -39611,9 +39600,9 @@ diff -urNp linux-2.6.34.1/grsecurity/gracl_shm.c linux-2.6.34.1/grsecurity/gracl + + return 1; +} -diff -urNp linux-2.6.34.1/grsecurity/grsec_chdir.c linux-2.6.34.1/grsecurity/grsec_chdir.c ---- linux-2.6.34.1/grsecurity/grsec_chdir.c 1969-12-31 19:00:00.000000000 -0500 -+++ linux-2.6.34.1/grsecurity/grsec_chdir.c 2010-07-07 09:04:56.000000000 -0400 +diff -urNp linux-2.6.35.4/grsecurity/grsec_chdir.c linux-2.6.35.4/grsecurity/grsec_chdir.c +--- linux-2.6.35.4/grsecurity/grsec_chdir.c 1969-12-31 19:00:00.000000000 -0500 ++++ linux-2.6.35.4/grsecurity/grsec_chdir.c 2010-09-17 20:12:37.000000000 -0400 @@ -0,0 +1,19 @@ +#include +#include @@ -39634,10 +39623,10 @@ diff -urNp linux-2.6.34.1/grsecurity/grsec_chdir.c linux-2.6.34.1/grsecurity/grs +#endif + return; +} -diff -urNp linux-2.6.34.1/grsecurity/grsec_chroot.c linux-2.6.34.1/grsecurity/grsec_chroot.c ---- linux-2.6.34.1/grsecurity/grsec_chroot.c 1969-12-31 19:00:00.000000000 -0500 -+++ linux-2.6.34.1/grsecurity/grsec_chroot.c 2010-07-07 09:04:56.000000000 -0400 -@@ -0,0 +1,366 @@ +diff -urNp linux-2.6.35.4/grsecurity/grsec_chroot.c linux-2.6.35.4/grsecurity/grsec_chroot.c +--- linux-2.6.35.4/grsecurity/grsec_chroot.c 1969-12-31 19:00:00.000000000 -0500 ++++ linux-2.6.35.4/grsecurity/grsec_chroot.c 2010-09-17 20:12:37.000000000 -0400 +@@ -0,0 +1,389 @@ +#include +#include +#include @@ -39741,6 +39730,29 @@ diff -urNp linux-2.6.34.1/grsecurity/grsec_chroot.c linux-2.6.34.1/grsecurity/gr +} + +int ++gr_handle_chroot_fowner(struct pid *pid, enum pid_type type) ++{ ++#ifdef CONFIG_GRKERNSEC_CHROOT_FINDTASK ++ struct task_struct *p; ++ int ret = 0; ++ if (!grsec_enable_chroot_findtask || !proc_is_chrooted(current) || !pid) ++ return ret; ++ ++ read_lock(&tasklist_lock); ++ do_each_pid_task(pid, type, p) { ++ if (!have_same_root(current, p)) { ++ ret = 1; ++ goto out; ++ } ++ } while_each_pid_task(pid, type, p); ++out: ++ read_unlock(&tasklist_lock); ++ return ret; ++#endif ++ return 0; ++} ++ ++int +gr_pid_is_chrooted(struct task_struct *p) +{ +#ifdef CONFIG_GRKERNSEC_CHROOT_FINDTASK @@ -40004,10 +40016,10 @@ diff -urNp linux-2.6.34.1/grsecurity/grsec_chroot.c linux-2.6.34.1/grsecurity/gr +#ifdef CONFIG_SECURITY +EXPORT_SYMBOL(gr_handle_chroot_caps); +#endif -diff -urNp linux-2.6.34.1/grsecurity/grsec_disabled.c linux-2.6.34.1/grsecurity/grsec_disabled.c ---- linux-2.6.34.1/grsecurity/grsec_disabled.c 1969-12-31 19:00:00.000000000 -0500 -+++ linux-2.6.34.1/grsecurity/grsec_disabled.c 2010-07-07 09:04:56.000000000 -0400 -@@ -0,0 +1,425 @@ +diff -urNp linux-2.6.35.4/grsecurity/grsec_disabled.c linux-2.6.35.4/grsecurity/grsec_disabled.c +--- linux-2.6.35.4/grsecurity/grsec_disabled.c 1969-12-31 19:00:00.000000000 -0500 ++++ linux-2.6.35.4/grsecurity/grsec_disabled.c 2010-09-17 20:12:37.000000000 -0400 +@@ -0,0 +1,431 @@ +#include +#include +#include @@ -40098,6 +40110,12 @@ diff -urNp linux-2.6.34.1/grsecurity/grsec_disabled.c linux-2.6.34.1/grsecurity/ + return 0; +} + ++int ++gr_check_protected_task_fowner(struct pid *pid, enum pid_type type) ++{ ++ return 0; ++} ++ +void +gr_copy_label(struct task_struct *tsk) +{ @@ -40433,9 +40451,9 @@ diff -urNp linux-2.6.34.1/grsecurity/grsec_disabled.c linux-2.6.34.1/grsecurity/ +EXPORT_SYMBOL(gr_check_user_change); +EXPORT_SYMBOL(gr_check_group_change); +#endif -diff -urNp linux-2.6.34.1/grsecurity/grsec_exec.c linux-2.6.34.1/grsecurity/grsec_exec.c ---- linux-2.6.34.1/grsecurity/grsec_exec.c 1969-12-31 19:00:00.000000000 -0500 -+++ linux-2.6.34.1/grsecurity/grsec_exec.c 2010-07-07 09:04:56.000000000 -0400 +diff -urNp linux-2.6.35.4/grsecurity/grsec_exec.c linux-2.6.35.4/grsecurity/grsec_exec.c +--- linux-2.6.35.4/grsecurity/grsec_exec.c 1969-12-31 19:00:00.000000000 -0500 ++++ linux-2.6.35.4/grsecurity/grsec_exec.c 2010-09-17 20:12:37.000000000 -0400 @@ -0,0 +1,88 @@ +#include +#include @@ -40525,9 +40543,9 @@ diff -urNp linux-2.6.34.1/grsecurity/grsec_exec.c linux-2.6.34.1/grsecurity/grse +#endif + return; +} -diff -urNp linux-2.6.34.1/grsecurity/grsec_fifo.c linux-2.6.34.1/grsecurity/grsec_fifo.c ---- linux-2.6.34.1/grsecurity/grsec_fifo.c 1969-12-31 19:00:00.000000000 -0500 -+++ linux-2.6.34.1/grsecurity/grsec_fifo.c 2010-07-07 09:04:56.000000000 -0400 +diff -urNp linux-2.6.35.4/grsecurity/grsec_fifo.c linux-2.6.35.4/grsecurity/grsec_fifo.c +--- linux-2.6.35.4/grsecurity/grsec_fifo.c 1969-12-31 19:00:00.000000000 -0500 ++++ linux-2.6.35.4/grsecurity/grsec_fifo.c 2010-09-17 20:12:37.000000000 -0400 @@ -0,0 +1,24 @@ +#include +#include @@ -40553,9 +40571,9 @@ diff -urNp linux-2.6.34.1/grsecurity/grsec_fifo.c linux-2.6.34.1/grsecurity/grse +#endif + return 0; +} -diff -urNp linux-2.6.34.1/grsecurity/grsec_fork.c linux-2.6.34.1/grsecurity/grsec_fork.c ---- linux-2.6.34.1/grsecurity/grsec_fork.c 1969-12-31 19:00:00.000000000 -0500 -+++ linux-2.6.34.1/grsecurity/grsec_fork.c 2010-07-07 09:04:56.000000000 -0400 +diff -urNp linux-2.6.35.4/grsecurity/grsec_fork.c linux-2.6.35.4/grsecurity/grsec_fork.c +--- linux-2.6.35.4/grsecurity/grsec_fork.c 1969-12-31 19:00:00.000000000 -0500 ++++ linux-2.6.35.4/grsecurity/grsec_fork.c 2010-09-17 20:12:37.000000000 -0400 @@ -0,0 +1,15 @@ +#include +#include @@ -40572,10 +40590,10 @@ diff -urNp linux-2.6.34.1/grsecurity/grsec_fork.c linux-2.6.34.1/grsecurity/grse +#endif + return; +} -diff -urNp linux-2.6.34.1/grsecurity/grsec_init.c linux-2.6.34.1/grsecurity/grsec_init.c ---- linux-2.6.34.1/grsecurity/grsec_init.c 1969-12-31 19:00:00.000000000 -0500 -+++ linux-2.6.34.1/grsecurity/grsec_init.c 2010-07-07 09:04:56.000000000 -0400 -@@ -0,0 +1,258 @@ +diff -urNp linux-2.6.35.4/grsecurity/grsec_init.c linux-2.6.35.4/grsecurity/grsec_init.c +--- linux-2.6.35.4/grsecurity/grsec_init.c 1969-12-31 19:00:00.000000000 -0500 ++++ linux-2.6.35.4/grsecurity/grsec_init.c 2010-09-17 20:12:37.000000000 -0400 +@@ -0,0 +1,266 @@ +#include +#include +#include @@ -40624,6 +40642,7 @@ diff -urNp linux-2.6.34.1/grsecurity/grsec_init.c linux-2.6.34.1/grsecurity/grse +#endif +int grsec_lastack_retries; +int grsec_enable_tpe_all; ++int grsec_enable_tpe_invert; +int grsec_enable_socket_all; +int grsec_socket_all_gid; +int grsec_enable_socket_client; @@ -40714,6 +40733,13 @@ diff -urNp linux-2.6.34.1/grsecurity/grsec_init.c linux-2.6.34.1/grsecurity/grse +#endif +#endif + ++#ifdef CONFIG_GRKERNSEC_TPE_INVERT ++ /* for backward compatibility, tpe_invert always defaults to on if ++ enabled in the kernel ++ */ ++ grsec_enable_tpe_invert = 1; ++#endif ++ +#if !defined(CONFIG_GRKERNSEC_SYSCTL) || defined(CONFIG_GRKERNSEC_SYSCTL_ON) +#ifndef CONFIG_GRKERNSEC_SYSCTL + grsec_lock = 1; @@ -40834,9 +40860,9 @@ diff -urNp linux-2.6.34.1/grsecurity/grsec_init.c linux-2.6.34.1/grsecurity/grse + + return; +} -diff -urNp linux-2.6.34.1/grsecurity/grsec_link.c linux-2.6.34.1/grsecurity/grsec_link.c ---- linux-2.6.34.1/grsecurity/grsec_link.c 1969-12-31 19:00:00.000000000 -0500 -+++ linux-2.6.34.1/grsecurity/grsec_link.c 2010-07-07 09:04:56.000000000 -0400 +diff -urNp linux-2.6.35.4/grsecurity/grsec_link.c linux-2.6.35.4/grsecurity/grsec_link.c +--- linux-2.6.35.4/grsecurity/grsec_link.c 1969-12-31 19:00:00.000000000 -0500 ++++ linux-2.6.35.4/grsecurity/grsec_link.c 2010-09-17 20:12:37.000000000 -0400 @@ -0,0 +1,43 @@ +#include +#include @@ -40881,9 +40907,9 @@ diff -urNp linux-2.6.34.1/grsecurity/grsec_link.c linux-2.6.34.1/grsecurity/grse +#endif + return 0; +} -diff -urNp linux-2.6.34.1/grsecurity/grsec_log.c linux-2.6.34.1/grsecurity/grsec_log.c ---- linux-2.6.34.1/grsecurity/grsec_log.c 1969-12-31 19:00:00.000000000 -0500 -+++ linux-2.6.34.1/grsecurity/grsec_log.c 2010-07-07 09:04:56.000000000 -0400 +diff -urNp linux-2.6.35.4/grsecurity/grsec_log.c linux-2.6.35.4/grsecurity/grsec_log.c +--- linux-2.6.35.4/grsecurity/grsec_log.c 1969-12-31 19:00:00.000000000 -0500 ++++ linux-2.6.35.4/grsecurity/grsec_log.c 2010-09-17 20:12:37.000000000 -0400 @@ -0,0 +1,306 @@ +#include +#include @@ -41191,9 +41217,9 @@ diff -urNp linux-2.6.34.1/grsecurity/grsec_log.c linux-2.6.34.1/grsecurity/grsec + gr_log_end(audit); + END_LOCKS(audit); +} -diff -urNp linux-2.6.34.1/grsecurity/grsec_mem.c linux-2.6.34.1/grsecurity/grsec_mem.c ---- linux-2.6.34.1/grsecurity/grsec_mem.c 1969-12-31 19:00:00.000000000 -0500 -+++ linux-2.6.34.1/grsecurity/grsec_mem.c 2010-07-07 09:04:56.000000000 -0400 +diff -urNp linux-2.6.35.4/grsecurity/grsec_mem.c linux-2.6.35.4/grsecurity/grsec_mem.c +--- linux-2.6.35.4/grsecurity/grsec_mem.c 1969-12-31 19:00:00.000000000 -0500 ++++ linux-2.6.35.4/grsecurity/grsec_mem.c 2010-09-17 20:12:37.000000000 -0400 @@ -0,0 +1,85 @@ +#include +#include @@ -41280,9 +41306,9 @@ diff -urNp linux-2.6.34.1/grsecurity/grsec_mem.c linux-2.6.34.1/grsecurity/grsec + gr_log_noargs(GR_DONT_AUDIT, GR_VM86_MSG); + return; +} -diff -urNp linux-2.6.34.1/grsecurity/grsec_mount.c linux-2.6.34.1/grsecurity/grsec_mount.c ---- linux-2.6.34.1/grsecurity/grsec_mount.c 1969-12-31 19:00:00.000000000 -0500 -+++ linux-2.6.34.1/grsecurity/grsec_mount.c 2010-07-07 09:04:56.000000000 -0400 +diff -urNp linux-2.6.35.4/grsecurity/grsec_mount.c linux-2.6.35.4/grsecurity/grsec_mount.c +--- linux-2.6.35.4/grsecurity/grsec_mount.c 1969-12-31 19:00:00.000000000 -0500 ++++ linux-2.6.35.4/grsecurity/grsec_mount.c 2010-09-17 20:12:37.000000000 -0400 @@ -0,0 +1,62 @@ +#include +#include @@ -41346,9 +41372,9 @@ diff -urNp linux-2.6.34.1/grsecurity/grsec_mount.c linux-2.6.34.1/grsecurity/grs +#endif + return 0; +} -diff -urNp linux-2.6.34.1/grsecurity/grsec_ptrace.c linux-2.6.34.1/grsecurity/grsec_ptrace.c ---- linux-2.6.34.1/grsecurity/grsec_ptrace.c 1969-12-31 19:00:00.000000000 -0500 -+++ linux-2.6.34.1/grsecurity/grsec_ptrace.c 2010-07-07 09:04:56.000000000 -0400 +diff -urNp linux-2.6.35.4/grsecurity/grsec_ptrace.c linux-2.6.35.4/grsecurity/grsec_ptrace.c +--- linux-2.6.35.4/grsecurity/grsec_ptrace.c 1969-12-31 19:00:00.000000000 -0500 ++++ linux-2.6.35.4/grsecurity/grsec_ptrace.c 2010-09-17 20:12:37.000000000 -0400 @@ -0,0 +1,14 @@ +#include +#include @@ -41364,9 +41390,9 @@ diff -urNp linux-2.6.34.1/grsecurity/grsec_ptrace.c linux-2.6.34.1/grsecurity/gr +#endif + return; +} -diff -urNp linux-2.6.34.1/grsecurity/grsec_sig.c linux-2.6.34.1/grsecurity/grsec_sig.c ---- linux-2.6.34.1/grsecurity/grsec_sig.c 1969-12-31 19:00:00.000000000 -0500 -+++ linux-2.6.34.1/grsecurity/grsec_sig.c 2010-07-07 09:04:56.000000000 -0400 +diff -urNp linux-2.6.35.4/grsecurity/grsec_sig.c linux-2.6.35.4/grsecurity/grsec_sig.c +--- linux-2.6.35.4/grsecurity/grsec_sig.c 1969-12-31 19:00:00.000000000 -0500 ++++ linux-2.6.35.4/grsecurity/grsec_sig.c 2010-09-17 20:12:37.000000000 -0400 @@ -0,0 +1,65 @@ +#include +#include @@ -41433,9 +41459,9 @@ diff -urNp linux-2.6.34.1/grsecurity/grsec_sig.c linux-2.6.34.1/grsecurity/grsec + return; +} + -diff -urNp linux-2.6.34.1/grsecurity/grsec_sock.c linux-2.6.34.1/grsecurity/grsec_sock.c ---- linux-2.6.34.1/grsecurity/grsec_sock.c 1969-12-31 19:00:00.000000000 -0500 -+++ linux-2.6.34.1/grsecurity/grsec_sock.c 2010-07-07 09:04:56.000000000 -0400 +diff -urNp linux-2.6.35.4/grsecurity/grsec_sock.c linux-2.6.35.4/grsecurity/grsec_sock.c +--- linux-2.6.35.4/grsecurity/grsec_sock.c 1969-12-31 19:00:00.000000000 -0500 ++++ linux-2.6.35.4/grsecurity/grsec_sock.c 2010-09-17 20:12:37.000000000 -0400 @@ -0,0 +1,271 @@ +#include +#include @@ -41708,10 +41734,10 @@ diff -urNp linux-2.6.34.1/grsecurity/grsec_sock.c linux-2.6.34.1/grsecurity/grse + return current_cap(); +#endif +} -diff -urNp linux-2.6.34.1/grsecurity/grsec_sysctl.c linux-2.6.34.1/grsecurity/grsec_sysctl.c ---- linux-2.6.34.1/grsecurity/grsec_sysctl.c 1969-12-31 19:00:00.000000000 -0500 -+++ linux-2.6.34.1/grsecurity/grsec_sysctl.c 2010-07-07 09:04:56.000000000 -0400 -@@ -0,0 +1,415 @@ +diff -urNp linux-2.6.35.4/grsecurity/grsec_sysctl.c linux-2.6.35.4/grsecurity/grsec_sysctl.c +--- linux-2.6.35.4/grsecurity/grsec_sysctl.c 1969-12-31 19:00:00.000000000 -0500 ++++ linux-2.6.35.4/grsecurity/grsec_sysctl.c 2010-09-17 20:18:57.000000000 -0400 +@@ -0,0 +1,424 @@ +#include +#include +#include @@ -41735,7 +41761,7 @@ diff -urNp linux-2.6.34.1/grsecurity/grsec_sysctl.c linux-2.6.34.1/grsecurity/gr +#endif + +#if defined(CONFIG_GRKERNSEC_SYSCTL) || defined(CONFIG_GRKERNSEC_ROFS) -+ctl_table grsecurity_table[] = { ++struct ctl_table grsecurity_table[] = { +#ifdef CONFIG_GRKERNSEC_SYSCTL +#ifdef CONFIG_GRKERNSEC_SYSCTL_DISTRO +#ifdef CONFIG_GRKERNSEC_IO @@ -41960,6 +41986,15 @@ diff -urNp linux-2.6.34.1/grsecurity/grsec_sysctl.c linux-2.6.34.1/grsecurity/gr + .proc_handler = &proc_dointvec, + }, +#endif ++#ifdef CONFIG_GRKERNSEC_TPE_INVERT ++ { ++ .procname = "tpe_invert", ++ .data = &grsec_enable_tpe_invert, ++ .maxlen = sizeof(int), ++ .mode = 0600, ++ .proc_handler = &proc_dointvec, ++ }, ++#endif +#ifdef CONFIG_GRKERNSEC_TPE_ALL + { + .procname = "tpe_restrict_all", @@ -42127,9 +42162,9 @@ diff -urNp linux-2.6.34.1/grsecurity/grsec_sysctl.c linux-2.6.34.1/grsecurity/gr + { } +}; +#endif -diff -urNp linux-2.6.34.1/grsecurity/grsec_textrel.c linux-2.6.34.1/grsecurity/grsec_textrel.c ---- linux-2.6.34.1/grsecurity/grsec_textrel.c 1969-12-31 19:00:00.000000000 -0500 -+++ linux-2.6.34.1/grsecurity/grsec_textrel.c 2010-07-07 09:04:56.000000000 -0400 +diff -urNp linux-2.6.35.4/grsecurity/grsec_textrel.c linux-2.6.35.4/grsecurity/grsec_textrel.c +--- linux-2.6.35.4/grsecurity/grsec_textrel.c 1969-12-31 19:00:00.000000000 -0500 ++++ linux-2.6.35.4/grsecurity/grsec_textrel.c 2010-09-17 20:12:37.000000000 -0400 @@ -0,0 +1,16 @@ +#include +#include @@ -42138,143 +42173,1167 @@ diff -urNp linux-2.6.34.1/grsecurity/grsec_textrel.c linux-2.6.34.1/grsecurity/g +#include +#include + -+void -+gr_log_textrel(struct vm_area_struct * vma) -+{ -+#ifdef CONFIG_GRKERNSEC_AUDIT_TEXTREL -+ if (grsec_enable_audit_textrel) -+ gr_log_textrel_ulong_ulong(GR_DO_AUDIT, GR_TEXTREL_AUDIT_MSG, vma->vm_file, vma->vm_start, vma->vm_pgoff); -+#endif -+ return; -+} -diff -urNp linux-2.6.34.1/grsecurity/grsec_time.c linux-2.6.34.1/grsecurity/grsec_time.c ---- linux-2.6.34.1/grsecurity/grsec_time.c 1969-12-31 19:00:00.000000000 -0500 -+++ linux-2.6.34.1/grsecurity/grsec_time.c 2010-07-07 09:04:56.000000000 -0400 -@@ -0,0 +1,13 @@ -+#include -+#include -+#include ++void ++gr_log_textrel(struct vm_area_struct * vma) ++{ ++#ifdef CONFIG_GRKERNSEC_AUDIT_TEXTREL ++ if (grsec_enable_audit_textrel) ++ gr_log_textrel_ulong_ulong(GR_DO_AUDIT, GR_TEXTREL_AUDIT_MSG, vma->vm_file, vma->vm_start, vma->vm_pgoff); ++#endif ++ return; ++} +diff -urNp linux-2.6.35.4/grsecurity/grsec_time.c linux-2.6.35.4/grsecurity/grsec_time.c +--- linux-2.6.35.4/grsecurity/grsec_time.c 1969-12-31 19:00:00.000000000 -0500 ++++ linux-2.6.35.4/grsecurity/grsec_time.c 2010-09-17 20:12:37.000000000 -0400 +@@ -0,0 +1,13 @@ ++#include ++#include ++#include ++ ++void ++gr_log_timechange(void) ++{ ++#ifdef CONFIG_GRKERNSEC_TIME ++ if (grsec_enable_time) ++ gr_log_noargs(GR_DONT_AUDIT_GOOD, GR_TIME_MSG); ++#endif ++ return; ++} +diff -urNp linux-2.6.35.4/grsecurity/grsec_tpe.c linux-2.6.35.4/grsecurity/grsec_tpe.c +--- linux-2.6.35.4/grsecurity/grsec_tpe.c 1969-12-31 19:00:00.000000000 -0500 ++++ linux-2.6.35.4/grsecurity/grsec_tpe.c 2010-09-17 20:12:37.000000000 -0400 +@@ -0,0 +1,39 @@ ++#include ++#include ++#include ++#include ++#include ++ ++extern int gr_acl_tpe_check(void); ++ ++int ++gr_tpe_allow(const struct file *file) ++{ ++#ifdef CONFIG_GRKERNSEC ++ struct inode *inode = file->f_path.dentry->d_parent->d_inode; ++ const struct cred *cred = current_cred(); ++ ++ if (cred->uid && ((grsec_enable_tpe && ++#ifdef CONFIG_GRKERNSEC_TPE_INVERT ++ ((grsec_enable_tpe_invert && !in_group_p(grsec_tpe_gid)) || ++ (!grsec_enable_tpe_invert && in_group_p(grsec_tpe_gid))) ++#else ++ in_group_p(grsec_tpe_gid) ++#endif ++ ) || gr_acl_tpe_check()) && ++ (inode->i_uid || (!inode->i_uid && ((inode->i_mode & S_IWGRP) || ++ (inode->i_mode & S_IWOTH))))) { ++ gr_log_fs_generic(GR_DONT_AUDIT, GR_EXEC_TPE_MSG, file->f_path.dentry, file->f_path.mnt); ++ return 0; ++ } ++#ifdef CONFIG_GRKERNSEC_TPE_ALL ++ if (cred->uid && grsec_enable_tpe && grsec_enable_tpe_all && ++ ((inode->i_uid && (inode->i_uid != cred->uid)) || ++ (inode->i_mode & S_IWGRP) || (inode->i_mode & S_IWOTH))) { ++ gr_log_fs_generic(GR_DONT_AUDIT, GR_EXEC_TPE_MSG, file->f_path.dentry, file->f_path.mnt); ++ return 0; ++ } ++#endif ++#endif ++ return 1; ++} +diff -urNp linux-2.6.35.4/grsecurity/grsum.c linux-2.6.35.4/grsecurity/grsum.c +--- linux-2.6.35.4/grsecurity/grsum.c 1969-12-31 19:00:00.000000000 -0500 ++++ linux-2.6.35.4/grsecurity/grsum.c 2010-09-17 20:12:37.000000000 -0400 +@@ -0,0 +1,61 @@ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++ ++#if !defined(CONFIG_CRYPTO) || defined(CONFIG_CRYPTO_MODULE) || !defined(CONFIG_CRYPTO_SHA256) || defined(CONFIG_CRYPTO_SHA256_MODULE) ++#error "crypto and sha256 must be built into the kernel" ++#endif ++ ++int ++chkpw(struct gr_arg *entry, unsigned char *salt, unsigned char *sum) ++{ ++ char *p; ++ struct crypto_hash *tfm; ++ struct hash_desc desc; ++ struct scatterlist sg; ++ unsigned char temp_sum[GR_SHA_LEN]; ++ volatile int retval = 0; ++ volatile int dummy = 0; ++ unsigned int i; ++ ++ sg_init_table(&sg, 1); ++ ++ tfm = crypto_alloc_hash("sha256", 0, CRYPTO_ALG_ASYNC); ++ if (IS_ERR(tfm)) { ++ /* should never happen, since sha256 should be built in */ ++ return 1; ++ } ++ ++ desc.tfm = tfm; ++ desc.flags = 0; ++ ++ crypto_hash_init(&desc); ++ ++ p = salt; ++ sg_set_buf(&sg, p, GR_SALT_LEN); ++ crypto_hash_update(&desc, &sg, sg.length); ++ ++ p = entry->pw; ++ sg_set_buf(&sg, p, strlen(p)); ++ ++ crypto_hash_update(&desc, &sg, sg.length); ++ ++ crypto_hash_final(&desc, temp_sum); ++ ++ memset(entry->pw, 0, GR_PW_LEN); ++ ++ for (i = 0; i < GR_SHA_LEN; i++) ++ if (sum[i] != temp_sum[i]) ++ retval = 1; ++ else ++ dummy = 1; // waste a cycle ++ ++ crypto_free_hash(tfm); ++ ++ return retval; ++} +diff -urNp linux-2.6.35.4/grsecurity/Kconfig linux-2.6.35.4/grsecurity/Kconfig +--- linux-2.6.35.4/grsecurity/Kconfig 1969-12-31 19:00:00.000000000 -0500 ++++ linux-2.6.35.4/grsecurity/Kconfig 2010-09-17 20:12:37.000000000 -0400 +@@ -0,0 +1,986 @@ ++# ++# grecurity configuration ++# ++ ++menu "Grsecurity" ++ ++config GRKERNSEC ++ bool "Grsecurity" ++ select CRYPTO ++ select CRYPTO_SHA256 ++ help ++ If you say Y here, you will be able to configure many features ++ that will enhance the security of your system. It is highly ++ recommended that you say Y here and read through the help ++ for each option so that you fully understand the features and ++ can evaluate their usefulness for your machine. ++ ++choice ++ prompt "Security Level" ++ depends on GRKERNSEC ++ default GRKERNSEC_CUSTOM ++ ++config GRKERNSEC_LOW ++ bool "Low" ++ select GRKERNSEC_LINK ++ select GRKERNSEC_FIFO ++ select GRKERNSEC_EXECVE ++ select GRKERNSEC_RANDNET ++ select GRKERNSEC_DMESG ++ select GRKERNSEC_CHROOT ++ select GRKERNSEC_CHROOT_CHDIR ++ ++ help ++ If you choose this option, several of the grsecurity options will ++ be enabled that will give you greater protection against a number ++ of attacks, while assuring that none of your software will have any ++ conflicts with the additional security measures. If you run a lot ++ of unusual software, or you are having problems with the higher ++ security levels, you should say Y here. With this option, the ++ following features are enabled: ++ ++ - Linking restrictions ++ - FIFO restrictions ++ - Enforcing RLIMIT_NPROC on execve ++ - Restricted dmesg ++ - Enforced chdir("/") on chroot ++ - Runtime module disabling ++ ++config GRKERNSEC_MEDIUM ++ bool "Medium" ++ select PAX ++ select PAX_EI_PAX ++ select PAX_PT_PAX_FLAGS ++ select PAX_HAVE_ACL_FLAGS ++ select GRKERNSEC_PROC_MEMMAP if (PAX_NOEXEC || PAX_ASLR) ++ select GRKERNSEC_CHROOT ++ select GRKERNSEC_CHROOT_SYSCTL ++ select GRKERNSEC_LINK ++ select GRKERNSEC_FIFO ++ select GRKERNSEC_EXECVE ++ select GRKERNSEC_DMESG ++ select GRKERNSEC_RANDNET ++ select GRKERNSEC_FORKFAIL ++ select GRKERNSEC_TIME ++ select GRKERNSEC_SIGNAL ++ select GRKERNSEC_CHROOT ++ select GRKERNSEC_CHROOT_UNIX ++ select GRKERNSEC_CHROOT_MOUNT ++ select GRKERNSEC_CHROOT_PIVOT ++ select GRKERNSEC_CHROOT_DOUBLE ++ select GRKERNSEC_CHROOT_CHDIR ++ select GRKERNSEC_CHROOT_MKNOD ++ select GRKERNSEC_PROC ++ select GRKERNSEC_PROC_USERGROUP ++ select PAX_RANDUSTACK ++ select PAX_ASLR ++ select PAX_RANDMMAP ++ select PAX_REFCOUNT if (X86 || SPARC64) ++ select PAX_USERCOPY if ((X86 || SPARC32 || SPARC64 || PPC) && (SLAB || SLUB || SLOB)) ++ ++ help ++ If you say Y here, several features in addition to those included ++ in the low additional security level will be enabled. These ++ features provide even more security to your system, though in rare ++ cases they may be incompatible with very old or poorly written ++ software. If you enable this option, make sure that your auth ++ service (identd) is running as gid 1001. With this option, ++ the following features (in addition to those provided in the ++ low additional security level) will be enabled: ++ ++ - Failed fork logging ++ - Time change logging ++ - Signal logging ++ - Deny mounts in chroot ++ - Deny double chrooting ++ - Deny sysctl writes in chroot ++ - Deny mknod in chroot ++ - Deny access to abstract AF_UNIX sockets out of chroot ++ - Deny pivot_root in chroot ++ - Denied writes of /dev/kmem, /dev/mem, and /dev/port ++ - /proc restrictions with special GID set to 10 (usually wheel) ++ - Address Space Layout Randomization (ASLR) ++ - Prevent exploitation of most refcount overflows ++ - Bounds checking of copying between the kernel and userland ++ ++config GRKERNSEC_HIGH ++ bool "High" ++ select GRKERNSEC_LINK ++ select GRKERNSEC_FIFO ++ select GRKERNSEC_EXECVE ++ select GRKERNSEC_DMESG ++ select GRKERNSEC_FORKFAIL ++ select GRKERNSEC_TIME ++ select GRKERNSEC_SIGNAL ++ select GRKERNSEC_CHROOT ++ select GRKERNSEC_CHROOT_SHMAT ++ select GRKERNSEC_CHROOT_UNIX ++ select GRKERNSEC_CHROOT_MOUNT ++ select GRKERNSEC_CHROOT_FCHDIR ++ select GRKERNSEC_CHROOT_PIVOT ++ select GRKERNSEC_CHROOT_DOUBLE ++ select GRKERNSEC_CHROOT_CHDIR ++ select GRKERNSEC_CHROOT_MKNOD ++ select GRKERNSEC_CHROOT_CAPS ++ select GRKERNSEC_CHROOT_SYSCTL ++ select GRKERNSEC_CHROOT_FINDTASK ++ select GRKERNSEC_PROC ++ select GRKERNSEC_PROC_MEMMAP if (PAX_NOEXEC || PAX_ASLR) ++ select GRKERNSEC_HIDESYM ++ select GRKERNSEC_BRUTE ++ select GRKERNSEC_PROC_USERGROUP ++ select GRKERNSEC_KMEM ++ select GRKERNSEC_RESLOG ++ select GRKERNSEC_RANDNET ++ select GRKERNSEC_PROC_ADD ++ select GRKERNSEC_CHROOT_CHMOD ++ select GRKERNSEC_CHROOT_NICE ++ select GRKERNSEC_AUDIT_MOUNT ++ select GRKERNSEC_MODHARDEN if (MODULES) ++ select GRKERNSEC_HARDEN_PTRACE ++ select GRKERNSEC_VM86 if (X86_32) ++ select PAX ++ select PAX_RANDUSTACK ++ select PAX_ASLR ++ select PAX_RANDMMAP ++ select PAX_NOEXEC ++ select PAX_MPROTECT ++ select PAX_EI_PAX ++ select PAX_PT_PAX_FLAGS ++ select PAX_HAVE_ACL_FLAGS ++ select PAX_KERNEXEC if ((PPC || X86) && (!X86_32 || X86_WP_WORKS_OK) && !XEN) ++ select PAX_MEMORY_UDEREF if (X86 && !XEN) ++ select PAX_RANDKSTACK if (X86_TSC && !X86_64) ++ select PAX_SEGMEXEC if (X86_32) ++ select PAX_PAGEEXEC ++ select PAX_EMUPLT if (ALPHA || PARISC || SPARC32 || SPARC64) ++ select PAX_EMUTRAMP if (PARISC) ++ select PAX_EMUSIGRT if (PARISC) ++ select PAX_ETEXECRELOCS if (ALPHA || IA64 || PARISC) ++ select PAX_ELFRELOCS if (PAX_ETEXECRELOCS || (IA64 || PPC || X86)) ++ select PAX_REFCOUNT if (X86 || SPARC64) ++ select PAX_USERCOPY if ((X86 || PPC || SPARC32 || SPARC64) && (SLAB || SLUB || SLOB)) ++ help ++ If you say Y here, many of the features of grsecurity will be ++ enabled, which will protect you against many kinds of attacks ++ against your system. The heightened security comes at a cost ++ of an increased chance of incompatibilities with rare software ++ on your machine. Since this security level enables PaX, you should ++ view and read about the PaX ++ project. While you are there, download chpax and run it on ++ binaries that cause problems with PaX. Also remember that ++ since the /proc restrictions are enabled, you must run your ++ identd as gid 1001. This security level enables the following ++ features in addition to those listed in the low and medium ++ security levels: ++ ++ - Additional /proc restrictions ++ - Chmod restrictions in chroot ++ - No signals, ptrace, or viewing of processes outside of chroot ++ - Capability restrictions in chroot ++ - Deny fchdir out of chroot ++ - Priority restrictions in chroot ++ - Segmentation-based implementation of PaX ++ - Mprotect restrictions ++ - Removal of addresses from /proc//[smaps|maps|stat] ++ - Kernel stack randomization ++ - Mount/unmount/remount logging ++ - Kernel symbol hiding ++ - Prevention of memory exhaustion-based exploits ++ - Hardening of module auto-loading ++ - Ptrace restrictions ++ - Restricted vm86 mode ++ ++config GRKERNSEC_CUSTOM ++ bool "Custom" ++ help ++ If you say Y here, you will be able to configure every grsecurity ++ option, which allows you to enable many more features that aren't ++ covered in the basic security levels. These additional features ++ include TPE, socket restrictions, and the sysctl system for ++ grsecurity. It is advised that you read through the help for ++ each option to determine its usefulness in your situation. ++ ++endchoice ++ ++menu "Address Space Protection" ++depends on GRKERNSEC ++ ++config GRKERNSEC_KMEM ++ bool "Deny writing to /dev/kmem, /dev/mem, and /dev/port" ++ help ++ If you say Y here, /dev/kmem and /dev/mem won't be allowed to ++ be written to via mmap or otherwise to modify the running kernel. ++ /dev/port will also not be allowed to be opened. If you have module ++ support disabled, enabling this will close up four ways that are ++ currently used to insert malicious code into the running kernel. ++ Even with all these features enabled, we still highly recommend that ++ you use the RBAC system, as it is still possible for an attacker to ++ modify the running kernel through privileged I/O granted by ioperm/iopl. ++ If you are not using XFree86, you may be able to stop this additional ++ case by enabling the 'Disable privileged I/O' option. Though nothing ++ legitimately writes to /dev/kmem, XFree86 does need to write to /dev/mem, ++ but only to video memory, which is the only writing we allow in this ++ case. If /dev/kmem or /dev/mem are mmaped without PROT_WRITE, they will ++ not be allowed to mprotect it with PROT_WRITE later. ++ It is highly recommended that you say Y here if you meet all the ++ conditions above. ++ ++config GRKERNSEC_VM86 ++ bool "Restrict VM86 mode" ++ depends on X86_32 ++ ++ help ++ If you say Y here, only processes with CAP_SYS_RAWIO will be able to ++ make use of a special execution mode on 32bit x86 processors called ++ Virtual 8086 (VM86) mode. XFree86 may need vm86 mode for certain ++ video cards and will still work with this option enabled. The purpose ++ of the option is to prevent exploitation of emulation errors in ++ virtualization of vm86 mode like the one discovered in VMWare in 2009. ++ Nearly all users should be able to enable this option. ++ ++config GRKERNSEC_IO ++ bool "Disable privileged I/O" ++ depends on X86 ++ select RTC_CLASS ++ select RTC_INTF_DEV ++ select RTC_DRV_CMOS ++ ++ help ++ If you say Y here, all ioperm and iopl calls will return an error. ++ Ioperm and iopl can be used to modify the running kernel. ++ Unfortunately, some programs need this access to operate properly, ++ the most notable of which are XFree86 and hwclock. hwclock can be ++ remedied by having RTC support in the kernel, so real-time ++ clock support is enabled if this option is enabled, to ensure ++ that hwclock operates correctly. XFree86 still will not ++ operate correctly with this option enabled, so DO NOT CHOOSE Y ++ IF YOU USE XFree86. If you use XFree86 and you still want to ++ protect your kernel against modification, use the RBAC system. ++ ++config GRKERNSEC_PROC_MEMMAP ++ bool "Remove addresses from /proc//[smaps|maps|stat]" ++ default y if (PAX_NOEXEC || PAX_ASLR) ++ depends on PAX_NOEXEC || PAX_ASLR ++ help ++ If you say Y here, the /proc//maps and /proc//stat files will ++ give no information about the addresses of its mappings if ++ PaX features that rely on random addresses are enabled on the task. ++ If you use PaX it is greatly recommended that you say Y here as it ++ closes up a hole that makes the full ASLR useless for suid ++ binaries. ++ ++config GRKERNSEC_BRUTE ++ bool "Deter exploit bruteforcing" ++ help ++ If you say Y here, attempts to bruteforce exploits against forking ++ daemons such as apache or sshd will be deterred. When a child of a ++ forking daemon is killed by PaX or crashes due to an illegal ++ instruction, the parent process will be delayed 30 seconds upon every ++ subsequent fork until the administrator is able to assess the ++ situation and restart the daemon. It is recommended that you also ++ enable signal logging in the auditing section so that logs are ++ generated when a process performs an illegal instruction. ++ ++config GRKERNSEC_MODHARDEN ++ bool "Harden module auto-loading" ++ depends on MODULES ++ help ++ If you say Y here, module auto-loading in response to use of some ++ feature implemented by an unloaded module will be restricted to ++ root users. Enabling this option helps defend against attacks ++ by unprivileged users who abuse the auto-loading behavior to ++ cause a vulnerable module to load that is then exploited. ++ ++ If this option prevents a legitimate use of auto-loading for a ++ non-root user, the administrator can execute modprobe manually ++ with the exact name of the module mentioned in the alert log. ++ Alternatively, the administrator can add the module to the list ++ of modules loaded at boot by modifying init scripts. ++ ++ Modification of init scripts will most likely be needed on ++ Ubuntu servers with encrypted home directory support enabled, ++ as the first non-root user logging in will cause the ecb(aes), ++ ecb(aes)-all, cbc(aes), and cbc(aes)-all modules to be loaded. ++ ++config GRKERNSEC_HIDESYM ++ bool "Hide kernel symbols" ++ help ++ If you say Y here, getting information on loaded modules, and ++ displaying all kernel symbols through a syscall will be restricted ++ to users with CAP_SYS_MODULE. For software compatibility reasons, ++ /proc/kallsyms will be restricted to the root user. The RBAC ++ system can hide that entry even from root. ++ ++ This option also prevents leaking of kernel addresses through ++ several /proc entries. ++ ++ Note that this option is only effective provided the following ++ conditions are met: ++ 1) The kernel using grsecurity is not precompiled by some distribution ++ 2) You are using the RBAC system and hiding other files such as your ++ kernel image and System.map. Alternatively, enabling this option ++ causes the permissions on /boot, /lib/modules, and the kernel ++ source directory to change at compile time to prevent ++ reading by non-root users. ++ If the above conditions are met, this option will aid in providing a ++ useful protection against local kernel exploitation of overflows ++ and arbitrary read/write vulnerabilities. ++ ++endmenu ++menu "Role Based Access Control Options" ++depends on GRKERNSEC ++ ++config GRKERNSEC_NO_RBAC ++ bool "Disable RBAC system" ++ help ++ If you say Y here, the /dev/grsec device will be removed from the kernel, ++ preventing the RBAC system from being enabled. You should only say Y ++ here if you have no intention of using the RBAC system, so as to prevent ++ an attacker with root access from misusing the RBAC system to hide files ++ and processes when loadable module support and /dev/[k]mem have been ++ locked down. ++ ++config GRKERNSEC_ACL_HIDEKERN ++ bool "Hide kernel processes" ++ help ++ If you say Y here, all kernel threads will be hidden to all ++ processes but those whose subject has the "view hidden processes" ++ flag. ++ ++config GRKERNSEC_ACL_MAXTRIES ++ int "Maximum tries before password lockout" ++ default 3 ++ help ++ This option enforces the maximum number of times a user can attempt ++ to authorize themselves with the grsecurity RBAC system before being ++ denied the ability to attempt authorization again for a specified time. ++ The lower the number, the harder it will be to brute-force a password. ++ ++config GRKERNSEC_ACL_TIMEOUT ++ int "Time to wait after max password tries, in seconds" ++ default 30 ++ help ++ This option specifies the time the user must wait after attempting to ++ authorize to the RBAC system with the maximum number of invalid ++ passwords. The higher the number, the harder it will be to brute-force ++ a password. ++ ++endmenu ++menu "Filesystem Protections" ++depends on GRKERNSEC ++ ++config GRKERNSEC_PROC ++ bool "Proc restrictions" ++ help ++ If you say Y here, the permissions of the /proc filesystem ++ will be altered to enhance system security and privacy. You MUST ++ choose either a user only restriction or a user and group restriction. ++ Depending upon the option you choose, you can either restrict users to ++ see only the processes they themselves run, or choose a group that can ++ view all processes and files normally restricted to root if you choose ++ the "restrict to user only" option. NOTE: If you're running identd as ++ a non-root user, you will have to run it as the group you specify here. ++ ++config GRKERNSEC_PROC_USER ++ bool "Restrict /proc to user only" ++ depends on GRKERNSEC_PROC ++ help ++ If you say Y here, non-root users will only be able to view their own ++ processes, and restricts them from viewing network-related information, ++ and viewing kernel symbol and module information. ++ ++config GRKERNSEC_PROC_USERGROUP ++ bool "Allow special group" ++ depends on GRKERNSEC_PROC && !GRKERNSEC_PROC_USER ++ help ++ If you say Y here, you will be able to select a group that will be ++ able to view all processes, network-related information, and ++ kernel and symbol information. This option is useful if you want ++ to run identd as a non-root user. ++ ++config GRKERNSEC_PROC_GID ++ int "GID for special group" ++ depends on GRKERNSEC_PROC_USERGROUP ++ default 1001 ++ ++config GRKERNSEC_PROC_ADD ++ bool "Additional restrictions" ++ depends on GRKERNSEC_PROC_USER || GRKERNSEC_PROC_USERGROUP ++ help ++ If you say Y here, additional restrictions will be placed on ++ /proc that keep normal users from viewing device information and ++ slabinfo information that could be useful for exploits. ++ ++config GRKERNSEC_LINK ++ bool "Linking restrictions" ++ help ++ If you say Y here, /tmp race exploits will be prevented, since users ++ will no longer be able to follow symlinks owned by other users in ++ world-writable +t directories (i.e. /tmp), unless the owner of the ++ symlink is the owner of the directory. users will also not be ++ able to hardlink to files they do not own. If the sysctl option is ++ enabled, a sysctl option with name "linking_restrictions" is created. ++ ++config GRKERNSEC_FIFO ++ bool "FIFO restrictions" ++ help ++ If you say Y here, users will not be able to write to FIFOs they don't ++ own in world-writable +t directories (i.e. /tmp), unless the owner of ++ the FIFO is the same owner of the directory it's held in. If the sysctl ++ option is enabled, a sysctl option with name "fifo_restrictions" is ++ created. ++ ++config GRKERNSEC_ROFS ++ bool "Runtime read-only mount protection" ++ help ++ If you say Y here, a sysctl option with name "romount_protect" will ++ be created. By setting this option to 1 at runtime, filesystems ++ will be protected in the following ways: ++ * No new writable mounts will be allowed ++ * Existing read-only mounts won't be able to be remounted read/write ++ * Write operations will be denied on all block devices ++ This option acts independently of grsec_lock: once it is set to 1, ++ it cannot be turned off. Therefore, please be mindful of the resulting ++ behavior if this option is enabled in an init script on a read-only ++ filesystem. This feature is mainly intended for secure embedded systems. ++ ++config GRKERNSEC_CHROOT ++ bool "Chroot jail restrictions" ++ help ++ If you say Y here, you will be able to choose several options that will ++ make breaking out of a chrooted jail much more difficult. If you ++ encounter no software incompatibilities with the following options, it ++ is recommended that you enable each one. ++ ++config GRKERNSEC_CHROOT_MOUNT ++ bool "Deny mounts" ++ depends on GRKERNSEC_CHROOT ++ help ++ If you say Y here, processes inside a chroot will not be able to ++ mount or remount filesystems. If the sysctl option is enabled, a ++ sysctl option with name "chroot_deny_mount" is created. ++ ++config GRKERNSEC_CHROOT_DOUBLE ++ bool "Deny double-chroots" ++ depends on GRKERNSEC_CHROOT ++ help ++ If you say Y here, processes inside a chroot will not be able to chroot ++ again outside the chroot. This is a widely used method of breaking ++ out of a chroot jail and should not be allowed. If the sysctl ++ option is enabled, a sysctl option with name ++ "chroot_deny_chroot" is created. ++ ++config GRKERNSEC_CHROOT_PIVOT ++ bool "Deny pivot_root in chroot" ++ depends on GRKERNSEC_CHROOT ++ help ++ If you say Y here, processes inside a chroot will not be able to use ++ a function called pivot_root() that was introduced in Linux 2.3.41. It ++ works similar to chroot in that it changes the root filesystem. This ++ function could be misused in a chrooted process to attempt to break out ++ of the chroot, and therefore should not be allowed. If the sysctl ++ option is enabled, a sysctl option with name "chroot_deny_pivot" is ++ created. ++ ++config GRKERNSEC_CHROOT_CHDIR ++ bool "Enforce chdir(\"/\") on all chroots" ++ depends on GRKERNSEC_CHROOT ++ help ++ If you say Y here, the current working directory of all newly-chrooted ++ applications will be set to the the root directory of the chroot. ++ The man page on chroot(2) states: ++ Note that this call does not change the current working ++ directory, so that `.' can be outside the tree rooted at ++ `/'. In particular, the super-user can escape from a ++ `chroot jail' by doing `mkdir foo; chroot foo; cd ..'. ++ ++ It is recommended that you say Y here, since it's not known to break ++ any software. If the sysctl option is enabled, a sysctl option with ++ name "chroot_enforce_chdir" is created. ++ ++config GRKERNSEC_CHROOT_CHMOD ++ bool "Deny (f)chmod +s" ++ depends on GRKERNSEC_CHROOT ++ help ++ If you say Y here, processes inside a chroot will not be able to chmod ++ or fchmod files to make them have suid or sgid bits. This protects ++ against another published method of breaking a chroot. If the sysctl ++ option is enabled, a sysctl option with name "chroot_deny_chmod" is ++ created. ++ ++config GRKERNSEC_CHROOT_FCHDIR ++ bool "Deny fchdir out of chroot" ++ depends on GRKERNSEC_CHROOT ++ help ++ If you say Y here, a well-known method of breaking chroots by fchdir'ing ++ to a file descriptor of the chrooting process that points to a directory ++ outside the filesystem will be stopped. If the sysctl option ++ is enabled, a sysctl option with name "chroot_deny_fchdir" is created. ++ ++config GRKERNSEC_CHROOT_MKNOD ++ bool "Deny mknod" ++ depends on GRKERNSEC_CHROOT ++ help ++ If you say Y here, processes inside a chroot will not be allowed to ++ mknod. The problem with using mknod inside a chroot is that it ++ would allow an attacker to create a device entry that is the same ++ as one on the physical root of your system, which could range from ++ anything from the console device to a device for your harddrive (which ++ they could then use to wipe the drive or steal data). It is recommended ++ that you say Y here, unless you run into software incompatibilities. ++ If the sysctl option is enabled, a sysctl option with name ++ "chroot_deny_mknod" is created. ++ ++config GRKERNSEC_CHROOT_SHMAT ++ bool "Deny shmat() out of chroot" ++ depends on GRKERNSEC_CHROOT ++ help ++ If you say Y here, processes inside a chroot will not be able to attach ++ to shared memory segments that were created outside of the chroot jail. ++ It is recommended that you say Y here. If the sysctl option is enabled, ++ a sysctl option with name "chroot_deny_shmat" is created. ++ ++config GRKERNSEC_CHROOT_UNIX ++ bool "Deny access to abstract AF_UNIX sockets out of chroot" ++ depends on GRKERNSEC_CHROOT ++ help ++ If you say Y here, processes inside a chroot will not be able to ++ connect to abstract (meaning not belonging to a filesystem) Unix ++ domain sockets that were bound outside of a chroot. It is recommended ++ that you say Y here. If the sysctl option is enabled, a sysctl option ++ with name "chroot_deny_unix" is created. ++ ++config GRKERNSEC_CHROOT_FINDTASK ++ bool "Protect outside processes" ++ depends on GRKERNSEC_CHROOT ++ help ++ If you say Y here, processes inside a chroot will not be able to ++ kill, send signals with fcntl, ptrace, capget, getpgid, setpgid, ++ getsid, or view any process outside of the chroot. If the sysctl ++ option is enabled, a sysctl option with name "chroot_findtask" is ++ created. ++ ++config GRKERNSEC_CHROOT_NICE ++ bool "Restrict priority changes" ++ depends on GRKERNSEC_CHROOT ++ help ++ If you say Y here, processes inside a chroot will not be able to raise ++ the priority of processes in the chroot, or alter the priority of ++ processes outside the chroot. This provides more security than simply ++ removing CAP_SYS_NICE from the process' capability set. If the ++ sysctl option is enabled, a sysctl option with name "chroot_restrict_nice" ++ is created. ++ ++config GRKERNSEC_CHROOT_SYSCTL ++ bool "Deny sysctl writes" ++ depends on GRKERNSEC_CHROOT ++ help ++ If you say Y here, an attacker in a chroot will not be able to ++ write to sysctl entries, either by sysctl(2) or through a /proc ++ interface. It is strongly recommended that you say Y here. If the ++ sysctl option is enabled, a sysctl option with name ++ "chroot_deny_sysctl" is created. ++ ++config GRKERNSEC_CHROOT_CAPS ++ bool "Capability restrictions" ++ depends on GRKERNSEC_CHROOT ++ help ++ If you say Y here, the capabilities on all root processes within a ++ chroot jail will be lowered to stop module insertion, raw i/o, ++ system and net admin tasks, rebooting the system, modifying immutable ++ files, modifying IPC owned by another, and changing the system time. ++ This is left an option because it can break some apps. Disable this ++ if your chrooted apps are having problems performing those kinds of ++ tasks. If the sysctl option is enabled, a sysctl option with ++ name "chroot_caps" is created. ++ ++endmenu ++menu "Kernel Auditing" ++depends on GRKERNSEC ++ ++config GRKERNSEC_AUDIT_GROUP ++ bool "Single group for auditing" ++ help ++ If you say Y here, the exec, chdir, and (un)mount logging features ++ will only operate on a group you specify. This option is recommended ++ if you only want to watch certain users instead of having a large ++ amount of logs from the entire system. If the sysctl option is enabled, ++ a sysctl option with name "audit_group" is created. ++ ++config GRKERNSEC_AUDIT_GID ++ int "GID for auditing" ++ depends on GRKERNSEC_AUDIT_GROUP ++ default 1007 ++ ++config GRKERNSEC_EXECLOG ++ bool "Exec logging" ++ help ++ If you say Y here, all execve() calls will be logged (since the ++ other exec*() calls are frontends to execve(), all execution ++ will be logged). Useful for shell-servers that like to keep track ++ of their users. If the sysctl option is enabled, a sysctl option with ++ name "exec_logging" is created. ++ WARNING: This option when enabled will produce a LOT of logs, especially ++ on an active system. ++ ++config GRKERNSEC_RESLOG ++ bool "Resource logging" ++ help ++ If you say Y here, all attempts to overstep resource limits will ++ be logged with the resource name, the requested size, and the current ++ limit. It is highly recommended that you say Y here. If the sysctl ++ option is enabled, a sysctl option with name "resource_logging" is ++ created. If the RBAC system is enabled, the sysctl value is ignored. ++ ++config GRKERNSEC_CHROOT_EXECLOG ++ bool "Log execs within chroot" ++ help ++ If you say Y here, all executions inside a chroot jail will be logged ++ to syslog. This can cause a large amount of logs if certain ++ applications (eg. djb's daemontools) are installed on the system, and ++ is therefore left as an option. If the sysctl option is enabled, a ++ sysctl option with name "chroot_execlog" is created. ++ ++config GRKERNSEC_AUDIT_PTRACE ++ bool "Ptrace logging" ++ help ++ If you say Y here, all attempts to attach to a process via ptrace ++ will be logged. If the sysctl option is enabled, a sysctl option ++ with name "audit_ptrace" is created. ++ ++config GRKERNSEC_AUDIT_CHDIR ++ bool "Chdir logging" ++ help ++ If you say Y here, all chdir() calls will be logged. If the sysctl ++ option is enabled, a sysctl option with name "audit_chdir" is created. ++ ++config GRKERNSEC_AUDIT_MOUNT ++ bool "(Un)Mount logging" ++ help ++ If you say Y here, all mounts and unmounts will be logged. If the ++ sysctl option is enabled, a sysctl option with name "audit_mount" is ++ created. ++ ++config GRKERNSEC_SIGNAL ++ bool "Signal logging" ++ help ++ If you say Y here, certain important signals will be logged, such as ++ SIGSEGV, which will as a result inform you of when a error in a program ++ occurred, which in some cases could mean a possible exploit attempt. ++ If the sysctl option is enabled, a sysctl option with name ++ "signal_logging" is created. ++ ++config GRKERNSEC_FORKFAIL ++ bool "Fork failure logging" ++ help ++ If you say Y here, all failed fork() attempts will be logged. ++ This could suggest a fork bomb, or someone attempting to overstep ++ their process limit. If the sysctl option is enabled, a sysctl option ++ with name "forkfail_logging" is created. ++ ++config GRKERNSEC_TIME ++ bool "Time change logging" ++ help ++ If you say Y here, any changes of the system clock will be logged. ++ If the sysctl option is enabled, a sysctl option with name ++ "timechange_logging" is created. ++ ++config GRKERNSEC_PROC_IPADDR ++ bool "/proc//ipaddr support" ++ help ++ If you say Y here, a new entry will be added to each /proc/ ++ directory that contains the IP address of the person using the task. ++ The IP is carried across local TCP and AF_UNIX stream sockets. ++ This information can be useful for IDS/IPSes to perform remote response ++ to a local attack. The entry is readable by only the owner of the ++ process (and root if he has CAP_DAC_OVERRIDE, which can be removed via ++ the RBAC system), and thus does not create privacy concerns. ++ ++config GRKERNSEC_AUDIT_TEXTREL ++ bool 'ELF text relocations logging (READ HELP)' ++ depends on PAX_MPROTECT ++ help ++ If you say Y here, text relocations will be logged with the filename ++ of the offending library or binary. The purpose of the feature is ++ to help Linux distribution developers get rid of libraries and ++ binaries that need text relocations which hinder the future progress ++ of PaX. Only Linux distribution developers should say Y here, and ++ never on a production machine, as this option creates an information ++ leak that could aid an attacker in defeating the randomization of ++ a single memory region. If the sysctl option is enabled, a sysctl ++ option with name "audit_textrel" is created. ++ ++endmenu ++ ++menu "Executable Protections" ++depends on GRKERNSEC ++ ++config GRKERNSEC_EXECVE ++ bool "Enforce RLIMIT_NPROC on execs" ++ help ++ If you say Y here, users with a resource limit on processes will ++ have the value checked during execve() calls. The current system ++ only checks the system limit during fork() calls. If the sysctl option ++ is enabled, a sysctl option with name "execve_limiting" is created. ++ ++config GRKERNSEC_DMESG ++ bool "Dmesg(8) restriction" ++ help ++ If you say Y here, non-root users will not be able to use dmesg(8) ++ to view up to the last 4kb of messages in the kernel's log buffer. ++ If the sysctl option is enabled, a sysctl option with name "dmesg" is ++ created. ++ ++config GRKERNSEC_HARDEN_PTRACE ++ bool "Deter ptrace-based process snooping" ++ help ++ If you say Y here, TTY sniffers and other malicious monitoring ++ programs implemented through ptrace will be defeated. If you ++ have been using the RBAC system, this option has already been ++ enabled for several years for all users, with the ability to make ++ fine-grained exceptions. ++ ++ This option only affects the ability of non-root users to ptrace ++ processes that are not a descendent of the ptracing process. ++ This means that strace ./binary and gdb ./binary will still work, ++ but attaching to arbitrary processes will not. If the sysctl ++ option is enabled, a sysctl option with name "harden_ptrace" is ++ created. ++ ++config GRKERNSEC_TPE ++ bool "Trusted Path Execution (TPE)" ++ help ++ If you say Y here, you will be able to choose a gid to add to the ++ supplementary groups of users you want to mark as "untrusted." ++ These users will not be able to execute any files that are not in ++ root-owned directories writable only by root. If the sysctl option ++ is enabled, a sysctl option with name "tpe" is created. ++ ++config GRKERNSEC_TPE_ALL ++ bool "Partially restrict all non-root users" ++ depends on GRKERNSEC_TPE ++ help ++ If you say Y here, all non-root users will be covered under ++ a weaker TPE restriction. This is separate from, and in addition to, ++ the main TPE options that you have selected elsewhere. Thus, if a ++ "trusted" GID is chosen, this restriction applies to even that GID. ++ Under this restriction, all non-root users will only be allowed to ++ execute files in directories they own that are not group or ++ world-writable, or in directories owned by root and writable only by ++ root. If the sysctl option is enabled, a sysctl option with name ++ "tpe_restrict_all" is created. ++ ++config GRKERNSEC_TPE_INVERT ++ bool "Invert GID option" ++ depends on GRKERNSEC_TPE ++ help ++ If you say Y here, the group you specify in the TPE configuration will ++ decide what group TPE restrictions will be *disabled* for. This ++ option is useful if you want TPE restrictions to be applied to most ++ users on the system. If the sysctl option is enabled, a sysctl option ++ with name "tpe_invert" is created. Unlike other sysctl options, this ++ entry will default to on for backward-compatibility. + -+void -+gr_log_timechange(void) -+{ -+#ifdef CONFIG_GRKERNSEC_TIME -+ if (grsec_enable_time) -+ gr_log_noargs(GR_DONT_AUDIT_GOOD, GR_TIME_MSG); -+#endif -+ return; -+} -diff -urNp linux-2.6.34.1/grsecurity/grsec_tpe.c linux-2.6.34.1/grsecurity/grsec_tpe.c ---- linux-2.6.34.1/grsecurity/grsec_tpe.c 1969-12-31 19:00:00.000000000 -0500 -+++ linux-2.6.34.1/grsecurity/grsec_tpe.c 2010-07-07 09:04:56.000000000 -0400 -@@ -0,0 +1,38 @@ -+#include -+#include -+#include -+#include -+#include ++config GRKERNSEC_TPE_GID ++ int "GID for untrusted users" ++ depends on GRKERNSEC_TPE && !GRKERNSEC_TPE_INVERT ++ default 1005 ++ help ++ Setting this GID determines what group TPE restrictions will be ++ *enabled* for. If the sysctl option is enabled, a sysctl option ++ with name "tpe_gid" is created. + -+extern int gr_acl_tpe_check(void); ++config GRKERNSEC_TPE_GID ++ int "GID for trusted users" ++ depends on GRKERNSEC_TPE && GRKERNSEC_TPE_INVERT ++ default 1005 ++ help ++ Setting this GID determines what group TPE restrictions will be ++ *disabled* for. If the sysctl option is enabled, a sysctl option ++ with name "tpe_gid" is created. + -+int -+gr_tpe_allow(const struct file *file) -+{ -+#ifdef CONFIG_GRKERNSEC -+ struct inode *inode = file->f_path.dentry->d_parent->d_inode; -+ const struct cred *cred = current_cred(); ++endmenu ++menu "Network Protections" ++depends on GRKERNSEC + -+ if (cred->uid && ((grsec_enable_tpe && -+#ifdef CONFIG_GRKERNSEC_TPE_INVERT -+ !in_group_p(grsec_tpe_gid) -+#else -+ in_group_p(grsec_tpe_gid) -+#endif -+ ) || gr_acl_tpe_check()) && -+ (inode->i_uid || (!inode->i_uid && ((inode->i_mode & S_IWGRP) || -+ (inode->i_mode & S_IWOTH))))) { -+ gr_log_fs_generic(GR_DONT_AUDIT, GR_EXEC_TPE_MSG, file->f_path.dentry, file->f_path.mnt); -+ return 0; -+ } -+#ifdef CONFIG_GRKERNSEC_TPE_ALL -+ if (cred->uid && grsec_enable_tpe && grsec_enable_tpe_all && -+ ((inode->i_uid && (inode->i_uid != cred->uid)) || -+ (inode->i_mode & S_IWGRP) || (inode->i_mode & S_IWOTH))) { -+ gr_log_fs_generic(GR_DONT_AUDIT, GR_EXEC_TPE_MSG, file->f_path.dentry, file->f_path.mnt); -+ return 0; -+ } -+#endif -+#endif -+ return 1; -+} -diff -urNp linux-2.6.34.1/grsecurity/grsum.c linux-2.6.34.1/grsecurity/grsum.c ---- linux-2.6.34.1/grsecurity/grsum.c 1969-12-31 19:00:00.000000000 -0500 -+++ linux-2.6.34.1/grsecurity/grsum.c 2010-07-07 09:04:56.000000000 -0400 -@@ -0,0 +1,61 @@ -+#include -+#include -+#include -+#include -+#include -+#include -+#include ++config GRKERNSEC_RANDNET ++ bool "Larger entropy pools" ++ help ++ If you say Y here, the entropy pools used for many features of Linux ++ and grsecurity will be doubled in size. Since several grsecurity ++ features use additional randomness, it is recommended that you say Y ++ here. Saying Y here has a similar effect as modifying ++ /proc/sys/kernel/random/poolsize. + ++config GRKERNSEC_BLACKHOLE ++ bool "TCP/UDP blackhole and LAST_ACK DoS prevention" ++ help ++ If you say Y here, neither TCP resets nor ICMP ++ destination-unreachable packets will be sent in response to packets ++ sent to ports for which no associated listening process exists. ++ This feature supports both IPV4 and IPV6 and exempts the ++ loopback interface from blackholing. Enabling this feature ++ makes a host more resilient to DoS attacks and reduces network ++ visibility against scanners. + -+#if !defined(CONFIG_CRYPTO) || defined(CONFIG_CRYPTO_MODULE) || !defined(CONFIG_CRYPTO_SHA256) || defined(CONFIG_CRYPTO_SHA256_MODULE) -+#error "crypto and sha256 must be built into the kernel" -+#endif ++ The blackhole feature as-implemented is equivalent to the FreeBSD ++ blackhole feature, as it prevents RST responses to all packets, not ++ just SYNs. Under most application behavior this causes no ++ problems, but applications (like haproxy) may not close certain ++ connections in a way that cleanly terminates them on the remote ++ end, leaving the remote host in LAST_ACK state. Because of this ++ side-effect and to prevent intentional LAST_ACK DoSes, this ++ feature also adds automatic mitigation against such attacks. ++ The mitigation drastically reduces the amount of time a socket ++ can spend in LAST_ACK state. If you're using haproxy and not ++ all servers it connects to have this option enabled, consider ++ disabling this feature on the haproxy host. + -+int -+chkpw(struct gr_arg *entry, unsigned char *salt, unsigned char *sum) -+{ -+ char *p; -+ struct crypto_hash *tfm; -+ struct hash_desc desc; -+ struct scatterlist sg; -+ unsigned char temp_sum[GR_SHA_LEN]; -+ volatile int retval = 0; -+ volatile int dummy = 0; -+ unsigned int i; ++ If the sysctl option is enabled, two sysctl options with names ++ "ip_blackhole" and "lastack_retries" will be created. ++ While "ip_blackhole" takes the standard zero/non-zero on/off ++ toggle, "lastack_retries" uses the same kinds of values as ++ "tcp_retries1" and "tcp_retries2". The default value of 4 ++ prevents a socket from lasting more than 45 seconds in LAST_ACK ++ state. + -+ sg_init_table(&sg, 1); ++config GRKERNSEC_SOCKET ++ bool "Socket restrictions" ++ help ++ If you say Y here, you will be able to choose from several options. ++ If you assign a GID on your system and add it to the supplementary ++ groups of users you want to restrict socket access to, this patch ++ will perform up to three things, based on the option(s) you choose. + -+ tfm = crypto_alloc_hash("sha256", 0, CRYPTO_ALG_ASYNC); -+ if (IS_ERR(tfm)) { -+ /* should never happen, since sha256 should be built in */ -+ return 1; -+ } ++config GRKERNSEC_SOCKET_ALL ++ bool "Deny any sockets to group" ++ depends on GRKERNSEC_SOCKET ++ help ++ If you say Y here, you will be able to choose a GID of whose users will ++ be unable to connect to other hosts from your machine or run server ++ applications from your machine. If the sysctl option is enabled, a ++ sysctl option with name "socket_all" is created. + -+ desc.tfm = tfm; -+ desc.flags = 0; ++config GRKERNSEC_SOCKET_ALL_GID ++ int "GID to deny all sockets for" ++ depends on GRKERNSEC_SOCKET_ALL ++ default 1004 ++ help ++ Here you can choose the GID to disable socket access for. Remember to ++ add the users you want socket access disabled for to the GID ++ specified here. If the sysctl option is enabled, a sysctl option ++ with name "socket_all_gid" is created. + -+ crypto_hash_init(&desc); ++config GRKERNSEC_SOCKET_CLIENT ++ bool "Deny client sockets to group" ++ depends on GRKERNSEC_SOCKET ++ help ++ If you say Y here, you will be able to choose a GID of whose users will ++ be unable to connect to other hosts from your machine, but will be ++ able to run servers. If this option is enabled, all users in the group ++ you specify will have to use passive mode when initiating ftp transfers ++ from the shell on your machine. If the sysctl option is enabled, a ++ sysctl option with name "socket_client" is created. + -+ p = salt; -+ sg_set_buf(&sg, p, GR_SALT_LEN); -+ crypto_hash_update(&desc, &sg, sg.length); ++config GRKERNSEC_SOCKET_CLIENT_GID ++ int "GID to deny client sockets for" ++ depends on GRKERNSEC_SOCKET_CLIENT ++ default 1003 ++ help ++ Here you can choose the GID to disable client socket access for. ++ Remember to add the users you want client socket access disabled for to ++ the GID specified here. If the sysctl option is enabled, a sysctl ++ option with name "socket_client_gid" is created. + -+ p = entry->pw; -+ sg_set_buf(&sg, p, strlen(p)); -+ -+ crypto_hash_update(&desc, &sg, sg.length); ++config GRKERNSEC_SOCKET_SERVER ++ bool "Deny server sockets to group" ++ depends on GRKERNSEC_SOCKET ++ help ++ If you say Y here, you will be able to choose a GID of whose users will ++ be unable to run server applications from your machine. If the sysctl ++ option is enabled, a sysctl option with name "socket_server" is created. + -+ crypto_hash_final(&desc, temp_sum); ++config GRKERNSEC_SOCKET_SERVER_GID ++ int "GID to deny server sockets for" ++ depends on GRKERNSEC_SOCKET_SERVER ++ default 1002 ++ help ++ Here you can choose the GID to disable server socket access for. ++ Remember to add the users you want server socket access disabled for to ++ the GID specified here. If the sysctl option is enabled, a sysctl ++ option with name "socket_server_gid" is created. + -+ memset(entry->pw, 0, GR_PW_LEN); ++endmenu ++menu "Sysctl support" ++depends on GRKERNSEC && SYSCTL + -+ for (i = 0; i < GR_SHA_LEN; i++) -+ if (sum[i] != temp_sum[i]) -+ retval = 1; -+ else -+ dummy = 1; // waste a cycle ++config GRKERNSEC_SYSCTL ++ bool "Sysctl support" ++ help ++ If you say Y here, you will be able to change the options that ++ grsecurity runs with at bootup, without having to recompile your ++ kernel. You can echo values to files in /proc/sys/kernel/grsecurity ++ to enable (1) or disable (0) various features. All the sysctl entries ++ are mutable until the "grsec_lock" entry is set to a non-zero value. ++ All features enabled in the kernel configuration are disabled at boot ++ if you do not say Y to the "Turn on features by default" option. ++ All options should be set at startup, and the grsec_lock entry should ++ be set to a non-zero value after all the options are set. ++ *THIS IS EXTREMELY IMPORTANT* + -+ crypto_free_hash(tfm); ++config GRKERNSEC_SYSCTL_DISTRO ++ bool "Extra sysctl support for distro makers (READ HELP)" ++ depends on GRKERNSEC_SYSCTL && GRKERNSEC_IO ++ help ++ If you say Y here, additional sysctl options will be created ++ for features that affect processes running as root. Therefore, ++ it is critical when using this option that the grsec_lock entry be ++ enabled after boot. Only distros with prebuilt kernel packages ++ with this option enabled that can ensure grsec_lock is enabled ++ after boot should use this option. ++ *Failure to set grsec_lock after boot makes all grsec features ++ this option covers useless* + -+ return retval; -+} -diff -urNp linux-2.6.34.1/include/acpi/acoutput.h linux-2.6.34.1/include/acpi/acoutput.h ---- linux-2.6.34.1/include/acpi/acoutput.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/include/acpi/acoutput.h 2010-07-07 09:04:56.000000000 -0400 -@@ -266,8 +266,8 @@ ++ Currently this option creates the following sysctl entries: ++ "Disable Privileged I/O": "disable_priv_io" ++ ++config GRKERNSEC_SYSCTL_ON ++ bool "Turn on features by default" ++ depends on GRKERNSEC_SYSCTL ++ help ++ If you say Y here, instead of having all features enabled in the ++ kernel configuration disabled at boot time, the features will be ++ enabled at boot time. It is recommended you say Y here unless ++ there is some reason you would want all sysctl-tunable features to ++ be disabled by default. As mentioned elsewhere, it is important ++ to enable the grsec_lock entry once you have finished modifying ++ the sysctl entries. ++ ++endmenu ++menu "Logging Options" ++depends on GRKERNSEC ++ ++config GRKERNSEC_FLOODTIME ++ int "Seconds in between log messages (minimum)" ++ default 10 ++ help ++ This option allows you to enforce the number of seconds between ++ grsecurity log messages. The default should be suitable for most ++ people, however, if you choose to change it, choose a value small enough ++ to allow informative logs to be produced, but large enough to ++ prevent flooding. ++ ++config GRKERNSEC_FLOODBURST ++ int "Number of messages in a burst (maximum)" ++ default 4 ++ help ++ This option allows you to choose the maximum number of messages allowed ++ within the flood time interval you chose in a separate option. The ++ default should be suitable for most people, however if you find that ++ many of your logs are being interpreted as flooding, you may want to ++ raise this value. ++ ++endmenu ++ ++endmenu +diff -urNp linux-2.6.35.4/grsecurity/Makefile linux-2.6.35.4/grsecurity/Makefile +--- linux-2.6.35.4/grsecurity/Makefile 1969-12-31 19:00:00.000000000 -0500 ++++ linux-2.6.35.4/grsecurity/Makefile 2010-09-17 20:12:37.000000000 -0400 +@@ -0,0 +1,29 @@ ++# grsecurity's ACL system was originally written in 2001 by Michael Dalton ++# during 2001-2009 it has been completely redesigned by Brad Spengler ++# into an RBAC system ++# ++# All code in this directory and various hooks inserted throughout the kernel ++# are copyright Brad Spengler - Open Source Security, Inc., and released ++# under the GPL v2 or higher ++ ++obj-y = grsec_chdir.o grsec_chroot.o grsec_exec.o grsec_fifo.o grsec_fork.o \ ++ grsec_mount.o grsec_sig.o grsec_sock.o grsec_sysctl.o \ ++ grsec_time.o grsec_tpe.o grsec_link.o grsec_textrel.o grsec_ptrace.o ++ ++obj-$(CONFIG_GRKERNSEC) += grsec_init.o grsum.o gracl.o gracl_ip.o gracl_segv.o \ ++ gracl_cap.o gracl_alloc.o gracl_shm.o grsec_mem.o gracl_fs.o \ ++ gracl_learn.o grsec_log.o ++obj-$(CONFIG_GRKERNSEC_RESLOG) += gracl_res.o ++ ++ifndef CONFIG_GRKERNSEC ++obj-y += grsec_disabled.o ++endif ++ ++ifdef CONFIG_GRKERNSEC_HIDESYM ++extra-y := grsec_hidesym.o ++$(obj)/grsec_hidesym.o: ++ @-chmod -f 500 /boot ++ @-chmod -f 500 /lib/modules ++ @-chmod -f 700 . ++ @echo ' grsec: protected kernel image paths' ++endif +diff -urNp linux-2.6.35.4/include/acpi/acoutput.h linux-2.6.35.4/include/acpi/acoutput.h +--- linux-2.6.35.4/include/acpi/acoutput.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/include/acpi/acoutput.h 2010-09-17 20:12:09.000000000 -0400 +@@ -268,8 +268,8 @@ * leaving no executable debug code! */ #define ACPI_FUNCTION_NAME(a) @@ -42285,10 +43344,10 @@ diff -urNp linux-2.6.34.1/include/acpi/acoutput.h linux-2.6.34.1/include/acpi/ac #endif /* ACPI_DEBUG_OUTPUT */ -diff -urNp linux-2.6.34.1/include/acpi/acpi_drivers.h linux-2.6.34.1/include/acpi/acpi_drivers.h ---- linux-2.6.34.1/include/acpi/acpi_drivers.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/include/acpi/acpi_drivers.h 2010-07-07 09:04:56.000000000 -0400 -@@ -122,8 +122,8 @@ int acpi_processor_set_thermal_limit(acp +diff -urNp linux-2.6.35.4/include/acpi/acpi_drivers.h linux-2.6.35.4/include/acpi/acpi_drivers.h +--- linux-2.6.35.4/include/acpi/acpi_drivers.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/include/acpi/acpi_drivers.h 2010-09-17 20:12:09.000000000 -0400 +@@ -121,8 +121,8 @@ int acpi_processor_set_thermal_limit(acp Dock Station -------------------------------------------------------------------------- */ struct acpi_dock_ops { @@ -42299,7 +43358,7 @@ diff -urNp linux-2.6.34.1/include/acpi/acpi_drivers.h linux-2.6.34.1/include/acp }; #if defined(CONFIG_ACPI_DOCK) || defined(CONFIG_ACPI_DOCK_MODULE) -@@ -131,7 +131,7 @@ extern int is_dock_device(acpi_handle ha +@@ -130,7 +130,7 @@ extern int is_dock_device(acpi_handle ha extern int register_dock_notifier(struct notifier_block *nb); extern void unregister_dock_notifier(struct notifier_block *nb); extern int register_hotplug_dock_device(acpi_handle handle, @@ -42308,7 +43367,7 @@ diff -urNp linux-2.6.34.1/include/acpi/acpi_drivers.h linux-2.6.34.1/include/acp void *context); extern void unregister_hotplug_dock_device(acpi_handle handle); #else -@@ -147,7 +147,7 @@ static inline void unregister_dock_notif +@@ -146,7 +146,7 @@ static inline void unregister_dock_notif { } static inline int register_hotplug_dock_device(acpi_handle handle, @@ -42317,9 +43376,9 @@ diff -urNp linux-2.6.34.1/include/acpi/acpi_drivers.h linux-2.6.34.1/include/acp void *context) { return -ENODEV; -diff -urNp linux-2.6.34.1/include/asm-generic/atomic-long.h linux-2.6.34.1/include/asm-generic/atomic-long.h ---- linux-2.6.34.1/include/asm-generic/atomic-long.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/include/asm-generic/atomic-long.h 2010-07-07 09:04:56.000000000 -0400 +diff -urNp linux-2.6.35.4/include/asm-generic/atomic-long.h linux-2.6.35.4/include/asm-generic/atomic-long.h +--- linux-2.6.35.4/include/asm-generic/atomic-long.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/include/asm-generic/atomic-long.h 2010-09-17 20:12:09.000000000 -0400 @@ -22,6 +22,12 @@ typedef atomic64_t atomic_long_t; @@ -42538,7 +43597,7 @@ diff -urNp linux-2.6.34.1/include/asm-generic/atomic-long.h linux-2.6.34.1/inclu static inline long atomic_long_dec_return(atomic_long_t *l) { atomic_t *v = (atomic_t *)l; -@@ -255,4 +375,35 @@ static inline long atomic_long_add_unles +@@ -255,4 +375,37 @@ static inline long atomic_long_add_unles #endif /* BITS_PER_LONG == 64 */ @@ -42550,6 +43609,7 @@ diff -urNp linux-2.6.34.1/include/asm-generic/atomic-long.h linux-2.6.34.1/inclu + atomic_add_unchecked(0, (atomic_unchecked_t *)NULL); + atomic_sub_unchecked(0, (atomic_unchecked_t *)NULL); + atomic_inc_unchecked((atomic_unchecked_t *)NULL); ++ atomic_inc_return_unchecked((atomic_unchecked_t *)NULL); + + atomic_long_read_unchecked((atomic_long_unchecked_t *)NULL); + atomic_long_set_unchecked((atomic_long_unchecked_t *)NULL, 0); @@ -42564,6 +43624,7 @@ diff -urNp linux-2.6.34.1/include/asm-generic/atomic-long.h linux-2.6.34.1/inclu +#define atomic_add_unchecked(i, v) atomic_add((i), (v)) +#define atomic_sub_unchecked(i, v) atomic_sub((i), (v)) +#define atomic_inc_unchecked(v) atomic_inc(v) ++#define atomic_inc_return_unchecked(v) atomic_inc_return(v) + +#define atomic_long_read_unchecked(v) atomic_long_read(v) +#define atomic_long_set_unchecked(v, i) atomic_long_set((v), (i)) @@ -42574,9 +43635,9 @@ diff -urNp linux-2.6.34.1/include/asm-generic/atomic-long.h linux-2.6.34.1/inclu +#endif + #endif /* _ASM_GENERIC_ATOMIC_LONG_H */ -diff -urNp linux-2.6.34.1/include/asm-generic/dma-mapping-common.h linux-2.6.34.1/include/asm-generic/dma-mapping-common.h ---- linux-2.6.34.1/include/asm-generic/dma-mapping-common.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/include/asm-generic/dma-mapping-common.h 2010-07-07 09:04:56.000000000 -0400 +diff -urNp linux-2.6.35.4/include/asm-generic/dma-mapping-common.h linux-2.6.35.4/include/asm-generic/dma-mapping-common.h +--- linux-2.6.35.4/include/asm-generic/dma-mapping-common.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/include/asm-generic/dma-mapping-common.h 2010-09-17 20:12:09.000000000 -0400 @@ -11,7 +11,7 @@ static inline dma_addr_t dma_map_single_ enum dma_data_direction dir, struct dma_attrs *attrs) @@ -42649,25 +43710,7 @@ diff -urNp linux-2.6.34.1/include/asm-generic/dma-mapping-common.h linux-2.6.34. BUG_ON(!valid_dma_direction(dir)); if (ops->sync_single_for_device) -@@ -123,7 +123,7 @@ static inline void dma_sync_single_range - size_t size, - enum dma_data_direction dir) - { -- struct dma_map_ops *ops = get_dma_ops(dev); -+ const struct dma_map_ops *ops = get_dma_ops(dev); - - BUG_ON(!valid_dma_direction(dir)); - if (ops->sync_single_range_for_cpu) { -@@ -140,7 +140,7 @@ static inline void dma_sync_single_range - size_t size, - enum dma_data_direction dir) - { -- struct dma_map_ops *ops = get_dma_ops(dev); -+ const struct dma_map_ops *ops = get_dma_ops(dev); - - BUG_ON(!valid_dma_direction(dir)); - if (ops->sync_single_range_for_device) { -@@ -155,7 +155,7 @@ static inline void +@@ -139,7 +139,7 @@ static inline void dma_sync_sg_for_cpu(struct device *dev, struct scatterlist *sg, int nelems, enum dma_data_direction dir) { @@ -42676,7 +43719,7 @@ diff -urNp linux-2.6.34.1/include/asm-generic/dma-mapping-common.h linux-2.6.34. BUG_ON(!valid_dma_direction(dir)); if (ops->sync_sg_for_cpu) -@@ -167,7 +167,7 @@ static inline void +@@ -151,7 +151,7 @@ static inline void dma_sync_sg_for_device(struct device *dev, struct scatterlist *sg, int nelems, enum dma_data_direction dir) { @@ -42685,9 +43728,9 @@ diff -urNp linux-2.6.34.1/include/asm-generic/dma-mapping-common.h linux-2.6.34. BUG_ON(!valid_dma_direction(dir)); if (ops->sync_sg_for_device) -diff -urNp linux-2.6.34.1/include/asm-generic/futex.h linux-2.6.34.1/include/asm-generic/futex.h ---- linux-2.6.34.1/include/asm-generic/futex.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/include/asm-generic/futex.h 2010-07-07 09:04:56.000000000 -0400 +diff -urNp linux-2.6.35.4/include/asm-generic/futex.h linux-2.6.35.4/include/asm-generic/futex.h +--- linux-2.6.35.4/include/asm-generic/futex.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/include/asm-generic/futex.h 2010-09-17 20:12:09.000000000 -0400 @@ -6,7 +6,7 @@ #include @@ -42706,9 +43749,9 @@ diff -urNp linux-2.6.34.1/include/asm-generic/futex.h linux-2.6.34.1/include/asm { return -ENOSYS; } -diff -urNp linux-2.6.34.1/include/asm-generic/int-l64.h linux-2.6.34.1/include/asm-generic/int-l64.h ---- linux-2.6.34.1/include/asm-generic/int-l64.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/include/asm-generic/int-l64.h 2010-07-07 09:04:56.000000000 -0400 +diff -urNp linux-2.6.35.4/include/asm-generic/int-l64.h linux-2.6.35.4/include/asm-generic/int-l64.h +--- linux-2.6.35.4/include/asm-generic/int-l64.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/include/asm-generic/int-l64.h 2010-09-17 20:12:09.000000000 -0400 @@ -46,6 +46,8 @@ typedef unsigned int u32; typedef signed long s64; typedef unsigned long u64; @@ -42718,9 +43761,9 @@ diff -urNp linux-2.6.34.1/include/asm-generic/int-l64.h linux-2.6.34.1/include/a #define S8_C(x) x #define U8_C(x) x ## U #define S16_C(x) x -diff -urNp linux-2.6.34.1/include/asm-generic/int-ll64.h linux-2.6.34.1/include/asm-generic/int-ll64.h ---- linux-2.6.34.1/include/asm-generic/int-ll64.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/include/asm-generic/int-ll64.h 2010-07-07 09:04:56.000000000 -0400 +diff -urNp linux-2.6.35.4/include/asm-generic/int-ll64.h linux-2.6.35.4/include/asm-generic/int-ll64.h +--- linux-2.6.35.4/include/asm-generic/int-ll64.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/include/asm-generic/int-ll64.h 2010-09-17 20:12:09.000000000 -0400 @@ -51,6 +51,8 @@ typedef unsigned int u32; typedef signed long long s64; typedef unsigned long long u64; @@ -42730,22 +43773,25 @@ diff -urNp linux-2.6.34.1/include/asm-generic/int-ll64.h linux-2.6.34.1/include/ #define S8_C(x) x #define U8_C(x) x ## U #define S16_C(x) x -diff -urNp linux-2.6.34.1/include/asm-generic/kmap_types.h linux-2.6.34.1/include/asm-generic/kmap_types.h ---- linux-2.6.34.1/include/asm-generic/kmap_types.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/include/asm-generic/kmap_types.h 2010-07-07 09:04:56.000000000 -0400 -@@ -28,7 +28,8 @@ KMAP_D(15) KM_UML_USERCOPY, - KMAP_D(16) KM_IRQ_PTE, +diff -urNp linux-2.6.35.4/include/asm-generic/kmap_types.h linux-2.6.35.4/include/asm-generic/kmap_types.h +--- linux-2.6.35.4/include/asm-generic/kmap_types.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/include/asm-generic/kmap_types.h 2010-09-17 20:12:09.000000000 -0400 +@@ -29,10 +29,11 @@ KMAP_D(16) KM_IRQ_PTE, KMAP_D(17) KM_NMI, KMAP_D(18) KM_NMI_PTE, --KMAP_D(19) KM_TYPE_NR -+KMAP_D(19) KM_CLEARPAGE, -+KMAP_D(20) KM_TYPE_NR + KMAP_D(19) KM_KDB, ++KMAP_D(20) KM_CLEARPAGE, + /* + * Remember to update debug_kmap_atomic() when adding new kmap types! + */ +-KMAP_D(20) KM_TYPE_NR ++KMAP_D(21) KM_TYPE_NR }; #undef KMAP_D -diff -urNp linux-2.6.34.1/include/asm-generic/pgtable.h linux-2.6.34.1/include/asm-generic/pgtable.h ---- linux-2.6.34.1/include/asm-generic/pgtable.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/include/asm-generic/pgtable.h 2010-07-07 09:04:56.000000000 -0400 +diff -urNp linux-2.6.35.4/include/asm-generic/pgtable.h linux-2.6.35.4/include/asm-generic/pgtable.h +--- linux-2.6.35.4/include/asm-generic/pgtable.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/include/asm-generic/pgtable.h 2010-09-17 20:12:09.000000000 -0400 @@ -344,6 +344,14 @@ extern void untrack_pfn_vma(struct vm_ar unsigned long size); #endif @@ -42761,18 +43807,90 @@ diff -urNp linux-2.6.34.1/include/asm-generic/pgtable.h linux-2.6.34.1/include/a #endif /* !__ASSEMBLY__ */ #endif /* _ASM_GENERIC_PGTABLE_H */ -diff -urNp linux-2.6.34.1/include/asm-generic/vmlinux.lds.h linux-2.6.34.1/include/asm-generic/vmlinux.lds.h ---- linux-2.6.34.1/include/asm-generic/vmlinux.lds.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/include/asm-generic/vmlinux.lds.h 2010-07-07 09:04:56.000000000 -0400 -@@ -203,6 +203,7 @@ +diff -urNp linux-2.6.35.4/include/asm-generic/pgtable-nopmd.h linux-2.6.35.4/include/asm-generic/pgtable-nopmd.h +--- linux-2.6.35.4/include/asm-generic/pgtable-nopmd.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/include/asm-generic/pgtable-nopmd.h 2010-09-17 20:12:09.000000000 -0400 +@@ -1,14 +1,19 @@ + #ifndef _PGTABLE_NOPMD_H + #define _PGTABLE_NOPMD_H + +-#ifndef __ASSEMBLY__ +- + #include + +-struct mm_struct; +- + #define __PAGETABLE_PMD_FOLDED + ++#define PMD_SHIFT PUD_SHIFT ++#define PTRS_PER_PMD 1 ++#define PMD_SIZE (_AC(1,UL) << PMD_SHIFT) ++#define PMD_MASK (~(PMD_SIZE-1)) ++ ++#ifndef __ASSEMBLY__ ++ ++struct mm_struct; ++ + /* + * Having the pmd type consist of a pud gets the size right, and allows + * us to conceptually access the pud entry that this pmd is folded into +@@ -16,11 +21,6 @@ struct mm_struct; + */ + typedef struct { pud_t pud; } pmd_t; + +-#define PMD_SHIFT PUD_SHIFT +-#define PTRS_PER_PMD 1 +-#define PMD_SIZE (1UL << PMD_SHIFT) +-#define PMD_MASK (~(PMD_SIZE-1)) +- + /* + * The "pud_xxx()" functions here are trivial for a folded two-level + * setup: the pmd is never bad, and a pmd always exists (as it's folded +diff -urNp linux-2.6.35.4/include/asm-generic/pgtable-nopud.h linux-2.6.35.4/include/asm-generic/pgtable-nopud.h +--- linux-2.6.35.4/include/asm-generic/pgtable-nopud.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/include/asm-generic/pgtable-nopud.h 2010-09-17 20:12:09.000000000 -0400 +@@ -1,10 +1,15 @@ + #ifndef _PGTABLE_NOPUD_H + #define _PGTABLE_NOPUD_H + +-#ifndef __ASSEMBLY__ +- + #define __PAGETABLE_PUD_FOLDED + ++#define PUD_SHIFT PGDIR_SHIFT ++#define PTRS_PER_PUD 1 ++#define PUD_SIZE (_AC(1,UL) << PUD_SHIFT) ++#define PUD_MASK (~(PUD_SIZE-1)) ++ ++#ifndef __ASSEMBLY__ ++ + /* + * Having the pud type consist of a pgd gets the size right, and allows + * us to conceptually access the pgd entry that this pud is folded into +@@ -12,11 +17,6 @@ + */ + typedef struct { pgd_t pgd; } pud_t; + +-#define PUD_SHIFT PGDIR_SHIFT +-#define PTRS_PER_PUD 1 +-#define PUD_SIZE (1UL << PUD_SHIFT) +-#define PUD_MASK (~(PUD_SIZE-1)) +- + /* + * The "pgd_xxx()" functions here are trivial for a folded two-level + * setup: the pud is never bad, and a pud always exists (as it's folded +diff -urNp linux-2.6.35.4/include/asm-generic/vmlinux.lds.h linux-2.6.35.4/include/asm-generic/vmlinux.lds.h +--- linux-2.6.35.4/include/asm-generic/vmlinux.lds.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/include/asm-generic/vmlinux.lds.h 2010-09-17 20:12:09.000000000 -0400 +@@ -213,6 +213,7 @@ .rodata : AT(ADDR(.rodata) - LOAD_OFFSET) { \ VMLINUX_SYMBOL(__start_rodata) = .; \ *(.rodata) *(.rodata.*) \ -+ *(.data.read_only) \ ++ *(.data..read_only) \ *(__vermagic) /* Kernel version magic */ \ *(__markers_strings) /* Markers: strings */ \ *(__tracepoints_strings)/* Tracepoints: strings */ \ -@@ -660,22 +661,24 @@ +@@ -670,22 +671,24 @@ * section in the linker script will go there too. @phdr should have * a leading colon. * @@ -42783,59 +43901,29 @@ diff -urNp linux-2.6.34.1/include/asm-generic/vmlinux.lds.h linux-2.6.34.1/inclu */ #define PERCPU_VADDR(vaddr, phdr) \ - VMLINUX_SYMBOL(__per_cpu_load) = .; \ -- .data.percpu vaddr : AT(VMLINUX_SYMBOL(__per_cpu_load) \ +- .data..percpu vaddr : AT(VMLINUX_SYMBOL(__per_cpu_load) \ + per_cpu_load = .; \ -+ .data.percpu vaddr : AT(VMLINUX_SYMBOL(per_cpu_load) \ ++ .data..percpu vaddr : AT(VMLINUX_SYMBOL(per_cpu_load) \ - LOAD_OFFSET) { \ + VMLINUX_SYMBOL(__per_cpu_load) = . + per_cpu_load; \ VMLINUX_SYMBOL(__per_cpu_start) = .; \ - *(.data.percpu.first) \ -- *(.data.percpu.page_aligned) \ - *(.data.percpu) \ + *(.data..percpu..first) \ +- *(.data..percpu..page_aligned) \ + *(.data..percpu) \ + . = ALIGN(PAGE_SIZE); \ -+ *(.data.percpu.page_aligned) \ - *(.data.percpu.shared_aligned) \ ++ *(.data..percpu..page_aligned) \ + *(.data..percpu..shared_aligned) \ VMLINUX_SYMBOL(__per_cpu_end) = .; \ } phdr \ -- . = VMLINUX_SYMBOL(__per_cpu_load) + SIZEOF(.data.percpu); -+ . = VMLINUX_SYMBOL(per_cpu_load) + SIZEOF(.data.percpu); +- . = VMLINUX_SYMBOL(__per_cpu_load) + SIZEOF(.data..percpu); ++ . = VMLINUX_SYMBOL(per_cpu_load) + SIZEOF(.data..percpu); /** * PERCPU - define output section for percpu area, simple version -diff -urNp linux-2.6.34.1/include/drm/drmP.h linux-2.6.34.1/include/drm/drmP.h ---- linux-2.6.34.1/include/drm/drmP.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/include/drm/drmP.h 2010-07-07 09:04:56.000000000 -0400 -@@ -808,7 +808,7 @@ struct drm_driver { - void (*vgaarb_irq)(struct drm_device *dev, bool state); - - /* Driver private ops for this object */ -- struct vm_operations_struct *gem_vm_ops; -+ const struct vm_operations_struct *gem_vm_ops; - - int major; - int minor; -@@ -917,7 +917,7 @@ struct drm_device { - - /** \name Usage Counters */ - /*@{ */ -- int open_count; /**< Outstanding files open */ -+ atomic_t open_count; /**< Outstanding files open */ - atomic_t ioctl_count; /**< Outstanding IOCTLs pending */ - atomic_t vma_count; /**< Outstanding vma areas open */ - int buf_use; /**< Buffers in use -- cannot alloc */ -@@ -928,7 +928,7 @@ struct drm_device { - /*@{ */ - unsigned long counters; - enum drm_stat_type types[15]; -- atomic_t counts[15]; -+ atomic_unchecked_t counts[15]; - /*@} */ - - struct list_head filelist; -diff -urNp linux-2.6.34.1/include/drm/drm_pciids.h linux-2.6.34.1/include/drm/drm_pciids.h ---- linux-2.6.34.1/include/drm/drm_pciids.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/include/drm/drm_pciids.h 2010-07-07 09:04:56.000000000 -0400 -@@ -412,7 +412,7 @@ +diff -urNp linux-2.6.35.4/include/drm/drm_pciids.h linux-2.6.35.4/include/drm/drm_pciids.h +--- linux-2.6.35.4/include/drm/drm_pciids.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/include/drm/drm_pciids.h 2010-09-17 20:12:09.000000000 -0400 +@@ -419,7 +419,7 @@ {0x1002, 0x9713, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS880|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ {0x1002, 0x9714, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS880|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ {0x1002, 0x9715, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS880|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ @@ -42844,7 +43932,7 @@ diff -urNp linux-2.6.34.1/include/drm/drm_pciids.h linux-2.6.34.1/include/drm/dr #define r128_PCI_IDS \ {0x1002, 0x4c45, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \ -@@ -452,14 +452,14 @@ +@@ -459,14 +459,14 @@ {0x1002, 0x5446, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \ {0x1002, 0x544C, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \ {0x1002, 0x5452, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \ @@ -42861,7 +43949,7 @@ diff -urNp linux-2.6.34.1/include/drm/drm_pciids.h linux-2.6.34.1/include/drm/dr #define mach64_PCI_IDS \ {0x1002, 0x4749, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \ -@@ -482,7 +482,7 @@ +@@ -489,7 +489,7 @@ {0x1002, 0x4c53, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \ {0x1002, 0x4c4d, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \ {0x1002, 0x4c4e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \ @@ -42870,7 +43958,7 @@ diff -urNp linux-2.6.34.1/include/drm/drm_pciids.h linux-2.6.34.1/include/drm/dr #define sisdrv_PCI_IDS \ {0x1039, 0x0300, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \ -@@ -493,7 +493,7 @@ +@@ -500,7 +500,7 @@ {0x1039, 0x7300, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \ {0x18CA, 0x0040, PCI_ANY_ID, PCI_ANY_ID, 0, 0, SIS_CHIP_315}, \ {0x18CA, 0x0042, PCI_ANY_ID, PCI_ANY_ID, 0, 0, SIS_CHIP_315}, \ @@ -42879,7 +43967,7 @@ diff -urNp linux-2.6.34.1/include/drm/drm_pciids.h linux-2.6.34.1/include/drm/dr #define tdfx_PCI_IDS \ {0x121a, 0x0003, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \ -@@ -502,7 +502,7 @@ +@@ -509,7 +509,7 @@ {0x121a, 0x0007, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \ {0x121a, 0x0009, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \ {0x121a, 0x000b, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \ @@ -42888,7 +43976,7 @@ diff -urNp linux-2.6.34.1/include/drm/drm_pciids.h linux-2.6.34.1/include/drm/dr #define viadrv_PCI_IDS \ {0x1106, 0x3022, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \ -@@ -514,14 +514,14 @@ +@@ -521,14 +521,14 @@ {0x1106, 0x3343, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \ {0x1106, 0x3230, PCI_ANY_ID, PCI_ANY_ID, 0, 0, VIA_DX9_0}, \ {0x1106, 0x3157, PCI_ANY_ID, PCI_ANY_ID, 0, 0, VIA_PRO_GROUP_A}, \ @@ -42905,7 +43993,7 @@ diff -urNp linux-2.6.34.1/include/drm/drm_pciids.h linux-2.6.34.1/include/drm/dr #define i830_PCI_IDS \ {0x8086, 0x3577, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \ -@@ -529,11 +529,11 @@ +@@ -536,11 +536,11 @@ {0x8086, 0x3582, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \ {0x8086, 0x2572, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \ {0x8086, 0x358e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \ @@ -42919,7 +44007,7 @@ diff -urNp linux-2.6.34.1/include/drm/drm_pciids.h linux-2.6.34.1/include/drm/dr #define savage_PCI_IDS \ {0x5333, 0x8a20, PCI_ANY_ID, PCI_ANY_ID, 0, 0, S3_SAVAGE3D}, \ -@@ -559,10 +559,10 @@ +@@ -566,10 +566,10 @@ {0x5333, 0x8d02, PCI_ANY_ID, PCI_ANY_ID, 0, 0, S3_TWISTER}, \ {0x5333, 0x8d03, PCI_ANY_ID, PCI_ANY_ID, 0, 0, S3_PROSAVAGEDDR}, \ {0x5333, 0x8d04, PCI_ANY_ID, PCI_ANY_ID, 0, 0, S3_PROSAVAGEDDR}, \ @@ -42932,15 +44020,45 @@ diff -urNp linux-2.6.34.1/include/drm/drm_pciids.h linux-2.6.34.1/include/drm/dr #define i915_PCI_IDS \ {0x8086, 0x3577, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA << 8, 0xffff00, 0}, \ -@@ -596,4 +596,4 @@ +@@ -603,4 +603,4 @@ {0x8086, 0x0042, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA << 8, 0xffff00, 0}, \ {0x8086, 0x0046, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA << 8, 0xffff00, 0}, \ {0x8086, 0x0102, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA << 8, 0xffff00, 0}, \ - {0, 0, 0} + {0, 0, 0, 0, 0, 0} -diff -urNp linux-2.6.34.1/include/linux/a.out.h linux-2.6.34.1/include/linux/a.out.h ---- linux-2.6.34.1/include/linux/a.out.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/include/linux/a.out.h 2010-07-07 09:04:56.000000000 -0400 +diff -urNp linux-2.6.35.4/include/drm/drmP.h linux-2.6.35.4/include/drm/drmP.h +--- linux-2.6.35.4/include/drm/drmP.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/include/drm/drmP.h 2010-09-17 20:12:09.000000000 -0400 +@@ -808,7 +808,7 @@ struct drm_driver { + void (*vgaarb_irq)(struct drm_device *dev, bool state); + + /* Driver private ops for this object */ +- struct vm_operations_struct *gem_vm_ops; ++ const struct vm_operations_struct *gem_vm_ops; + + int major; + int minor; +@@ -917,7 +917,7 @@ struct drm_device { + + /** \name Usage Counters */ + /*@{ */ +- int open_count; /**< Outstanding files open */ ++ atomic_t open_count; /**< Outstanding files open */ + atomic_t ioctl_count; /**< Outstanding IOCTLs pending */ + atomic_t vma_count; /**< Outstanding vma areas open */ + int buf_use; /**< Buffers in use -- cannot alloc */ +@@ -928,7 +928,7 @@ struct drm_device { + /*@{ */ + unsigned long counters; + enum drm_stat_type types[15]; +- atomic_t counts[15]; ++ atomic_unchecked_t counts[15]; + /*@} */ + + struct list_head filelist; +diff -urNp linux-2.6.35.4/include/linux/a.out.h linux-2.6.35.4/include/linux/a.out.h +--- linux-2.6.35.4/include/linux/a.out.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/include/linux/a.out.h 2010-09-17 20:12:09.000000000 -0400 @@ -39,6 +39,14 @@ enum machine_type { M_MIPS2 = 152 /* MIPS R6000/R4000 binary */ }; @@ -42956,9 +44074,9 @@ diff -urNp linux-2.6.34.1/include/linux/a.out.h linux-2.6.34.1/include/linux/a.o #if !defined (N_MAGIC) #define N_MAGIC(exec) ((exec).a_info & 0xffff) #endif -diff -urNp linux-2.6.34.1/include/linux/atmdev.h linux-2.6.34.1/include/linux/atmdev.h ---- linux-2.6.34.1/include/linux/atmdev.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/include/linux/atmdev.h 2010-07-07 09:04:56.000000000 -0400 +diff -urNp linux-2.6.35.4/include/linux/atmdev.h linux-2.6.35.4/include/linux/atmdev.h +--- linux-2.6.35.4/include/linux/atmdev.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/include/linux/atmdev.h 2010-09-17 20:12:09.000000000 -0400 @@ -237,7 +237,7 @@ struct compat_atm_iobuf { #endif @@ -42968,9 +44086,9 @@ diff -urNp linux-2.6.34.1/include/linux/atmdev.h linux-2.6.34.1/include/linux/at __AAL_STAT_ITEMS #undef __HANDLE_ITEM }; -diff -urNp linux-2.6.34.1/include/linux/binfmts.h linux-2.6.34.1/include/linux/binfmts.h ---- linux-2.6.34.1/include/linux/binfmts.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/include/linux/binfmts.h 2010-07-07 09:04:56.000000000 -0400 +diff -urNp linux-2.6.35.4/include/linux/binfmts.h linux-2.6.35.4/include/linux/binfmts.h +--- linux-2.6.35.4/include/linux/binfmts.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/include/linux/binfmts.h 2010-09-17 20:12:09.000000000 -0400 @@ -87,6 +87,7 @@ struct linux_binfmt { int (*load_binary)(struct linux_binprm *, struct pt_regs * regs); int (*load_shlib)(struct file *); @@ -42979,10 +44097,10 @@ diff -urNp linux-2.6.34.1/include/linux/binfmts.h linux-2.6.34.1/include/linux/b unsigned long min_coredump; /* minimal dump size */ int hasvdso; }; -diff -urNp linux-2.6.34.1/include/linux/blkdev.h linux-2.6.34.1/include/linux/blkdev.h ---- linux-2.6.34.1/include/linux/blkdev.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/include/linux/blkdev.h 2010-07-07 09:04:56.000000000 -0400 -@@ -1275,19 +1275,19 @@ static inline int blk_integrity_rq(struc +diff -urNp linux-2.6.35.4/include/linux/blkdev.h linux-2.6.35.4/include/linux/blkdev.h +--- linux-2.6.35.4/include/linux/blkdev.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/include/linux/blkdev.h 2010-09-17 20:12:09.000000000 -0400 +@@ -1331,20 +1331,20 @@ static inline int blk_integrity_rq(struc #endif /* CONFIG_BLK_DEV_INTEGRITY */ struct block_device_operations { @@ -43000,22 +44118,24 @@ diff -urNp linux-2.6.34.1/include/linux/blkdev.h linux-2.6.34.1/include/linux/bl + int (* const direct_access) (struct block_device *, sector_t, void **, unsigned long *); - int (*media_changed) (struct gendisk *); -- unsigned long long (*set_capacity) (struct gendisk *, -+ int (* const media_changed) (struct gendisk *); -+ unsigned long long (* const set_capacity) (struct gendisk *, - unsigned long long); +- void (*unlock_native_capacity) (struct gendisk *); - int (*revalidate_disk) (struct gendisk *); - int (*getgeo)(struct block_device *, struct hd_geometry *); -- struct module *owner; ++ int (* const media_changed) (struct gendisk *); ++ void (* const unlock_native_capacity) (struct gendisk *); + int (* const revalidate_disk) (struct gendisk *); -+ int (* const getgeo)(struct block_device *, struct hd_geometry *); ++ int (*const getgeo)(struct block_device *, struct hd_geometry *); + /* this callback is with swap_lock and sometimes page table lock held */ +- void (*swap_slot_free_notify) (struct block_device *, unsigned long); +- struct module *owner; ++ void (* const swap_slot_free_notify) (struct block_device *, unsigned long); + struct module * const owner; }; extern int __blkdev_driver_ioctl(struct block_device *, fmode_t, unsigned int, -diff -urNp linux-2.6.34.1/include/linux/cache.h linux-2.6.34.1/include/linux/cache.h ---- linux-2.6.34.1/include/linux/cache.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/include/linux/cache.h 2010-07-07 09:04:56.000000000 -0400 +diff -urNp linux-2.6.35.4/include/linux/cache.h linux-2.6.35.4/include/linux/cache.h +--- linux-2.6.35.4/include/linux/cache.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/include/linux/cache.h 2010-09-17 20:12:09.000000000 -0400 @@ -16,6 +16,10 @@ #define __read_mostly #endif @@ -43027,9 +44147,9 @@ diff -urNp linux-2.6.34.1/include/linux/cache.h linux-2.6.34.1/include/linux/cac #ifndef ____cacheline_aligned #define ____cacheline_aligned __attribute__((__aligned__(SMP_CACHE_BYTES))) #endif -diff -urNp linux-2.6.34.1/include/linux/capability.h linux-2.6.34.1/include/linux/capability.h ---- linux-2.6.34.1/include/linux/capability.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/include/linux/capability.h 2010-07-07 09:04:56.000000000 -0400 +diff -urNp linux-2.6.35.4/include/linux/capability.h linux-2.6.35.4/include/linux/capability.h +--- linux-2.6.35.4/include/linux/capability.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/include/linux/capability.h 2010-09-17 20:12:37.000000000 -0400 @@ -561,6 +561,7 @@ extern const kernel_cap_t __cap_init_eff (security_real_capable_noaudit((t), (cap)) == 0) @@ -43038,11 +44158,23 @@ diff -urNp linux-2.6.34.1/include/linux/capability.h linux-2.6.34.1/include/linu /* audit system wants to get cap info from files as well */ struct dentry; -diff -urNp linux-2.6.34.1/include/linux/compiler-gcc4.h linux-2.6.34.1/include/linux/compiler-gcc4.h ---- linux-2.6.34.1/include/linux/compiler-gcc4.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/include/linux/compiler-gcc4.h 2010-07-07 09:04:56.000000000 -0400 -@@ -50,6 +50,10 @@ - #define unreachable() __builtin_unreachable() +diff -urNp linux-2.6.35.4/include/linux/compat.h linux-2.6.35.4/include/linux/compat.h +--- linux-2.6.35.4/include/linux/compat.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/include/linux/compat.h 2010-09-17 20:12:37.000000000 -0400 +@@ -360,5 +360,8 @@ extern ssize_t compat_rw_copy_check_uvec + const struct compat_iovec __user *uvector, unsigned long nr_segs, + unsigned long fast_segs, struct iovec *fast_pointer, + struct iovec **ret_pointer); ++ ++extern void __user *compat_alloc_user_space(unsigned long len); ++ + #endif /* CONFIG_COMPAT */ + #endif /* _LINUX_COMPAT_H */ +diff -urNp linux-2.6.35.4/include/linux/compiler-gcc4.h linux-2.6.35.4/include/linux/compiler-gcc4.h +--- linux-2.6.35.4/include/linux/compiler-gcc4.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/include/linux/compiler-gcc4.h 2010-09-17 20:12:09.000000000 -0400 +@@ -54,6 +54,10 @@ + #endif +#define __alloc_size(...) __attribute((alloc_size(__VA_ARGS__))) @@ -43052,9 +44184,9 @@ diff -urNp linux-2.6.34.1/include/linux/compiler-gcc4.h linux-2.6.34.1/include/l #endif #if __GNUC_MINOR__ > 0 -diff -urNp linux-2.6.34.1/include/linux/compiler.h linux-2.6.34.1/include/linux/compiler.h ---- linux-2.6.34.1/include/linux/compiler.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/include/linux/compiler.h 2010-07-07 09:04:56.000000000 -0400 +diff -urNp linux-2.6.35.4/include/linux/compiler.h linux-2.6.35.4/include/linux/compiler.h +--- linux-2.6.35.4/include/linux/compiler.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/include/linux/compiler.h 2010-09-17 20:12:09.000000000 -0400 @@ -267,6 +267,22 @@ void ftrace_likely_update(struct ftrace_ #define __cold #endif @@ -43078,9 +44210,9 @@ diff -urNp linux-2.6.34.1/include/linux/compiler.h linux-2.6.34.1/include/linux/ /* Simple shorthand for a section definition */ #ifndef __section # define __section(S) __attribute__ ((__section__(#S))) -diff -urNp linux-2.6.34.1/include/linux/decompress/mm.h linux-2.6.34.1/include/linux/decompress/mm.h ---- linux-2.6.34.1/include/linux/decompress/mm.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/include/linux/decompress/mm.h 2010-07-07 09:04:56.000000000 -0400 +diff -urNp linux-2.6.35.4/include/linux/decompress/mm.h linux-2.6.35.4/include/linux/decompress/mm.h +--- linux-2.6.35.4/include/linux/decompress/mm.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/include/linux/decompress/mm.h 2010-09-17 20:12:09.000000000 -0400 @@ -78,7 +78,7 @@ static void free(void *where) * warnings when not needed (indeed large_malloc / large_free are not * needed by inflate */ @@ -43090,10 +44222,10 @@ diff -urNp linux-2.6.34.1/include/linux/decompress/mm.h linux-2.6.34.1/include/l #define free(a) kfree(a) #define large_malloc(a) vmalloc(a) -diff -urNp linux-2.6.34.1/include/linux/dma-mapping.h linux-2.6.34.1/include/linux/dma-mapping.h ---- linux-2.6.34.1/include/linux/dma-mapping.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/include/linux/dma-mapping.h 2010-07-07 09:04:56.000000000 -0400 -@@ -16,50 +16,50 @@ enum dma_data_direction { +diff -urNp linux-2.6.35.4/include/linux/dma-mapping.h linux-2.6.35.4/include/linux/dma-mapping.h +--- linux-2.6.35.4/include/linux/dma-mapping.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/include/linux/dma-mapping.h 2010-09-17 20:12:09.000000000 -0400 +@@ -16,40 +16,40 @@ enum dma_data_direction { }; struct dma_map_ops { @@ -43129,18 +44261,6 @@ diff -urNp linux-2.6.34.1/include/linux/dma-mapping.h linux-2.6.34.1/include/lin + void (* const sync_single_for_device)(struct device *dev, dma_addr_t dma_handle, size_t size, enum dma_data_direction dir); -- void (*sync_single_range_for_cpu)(struct device *dev, -+ void (* const sync_single_range_for_cpu)(struct device *dev, - dma_addr_t dma_handle, - unsigned long offset, - size_t size, - enum dma_data_direction dir); -- void (*sync_single_range_for_device)(struct device *dev, -+ void (* const sync_single_range_for_device)(struct device *dev, - dma_addr_t dma_handle, - unsigned long offset, - size_t size, - enum dma_data_direction dir); - void (*sync_sg_for_cpu)(struct device *dev, + void (* const sync_sg_for_cpu)(struct device *dev, struct scatterlist *sg, int nents, @@ -43160,9 +44280,9 @@ diff -urNp linux-2.6.34.1/include/linux/dma-mapping.h linux-2.6.34.1/include/lin }; #define DMA_BIT_MASK(n) (((n) == 64) ? ~0ULL : ((1ULL<<(n))-1)) -diff -urNp linux-2.6.34.1/include/linux/elf.h linux-2.6.34.1/include/linux/elf.h ---- linux-2.6.34.1/include/linux/elf.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/include/linux/elf.h 2010-07-07 09:04:56.000000000 -0400 +diff -urNp linux-2.6.35.4/include/linux/elf.h linux-2.6.35.4/include/linux/elf.h +--- linux-2.6.35.4/include/linux/elf.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/include/linux/elf.h 2010-09-17 20:12:09.000000000 -0400 @@ -49,6 +49,17 @@ typedef __s64 Elf64_Sxword; #define PT_GNU_EH_FRAME 0x6474e550 @@ -43219,7 +44339,7 @@ diff -urNp linux-2.6.34.1/include/linux/elf.h linux-2.6.34.1/include/linux/elf.h #define ELFMAG0 0x7f /* EI_MAG */ #define ELFMAG1 'E' #define ELFMAG2 'L' -@@ -420,6 +448,7 @@ extern Elf32_Dyn _DYNAMIC []; +@@ -421,6 +449,7 @@ extern Elf32_Dyn _DYNAMIC []; #define elf_note elf32_note #define elf_addr_t Elf32_Off #define Elf_Half Elf32_Half @@ -43227,7 +44347,7 @@ diff -urNp linux-2.6.34.1/include/linux/elf.h linux-2.6.34.1/include/linux/elf.h #else -@@ -430,6 +459,7 @@ extern Elf64_Dyn _DYNAMIC []; +@@ -431,6 +460,7 @@ extern Elf64_Dyn _DYNAMIC []; #define elf_note elf64_note #define elf_addr_t Elf64_Off #define Elf_Half Elf64_Half @@ -43235,9 +44355,9 @@ diff -urNp linux-2.6.34.1/include/linux/elf.h linux-2.6.34.1/include/linux/elf.h #endif -diff -urNp linux-2.6.34.1/include/linux/fs.h linux-2.6.34.1/include/linux/fs.h ---- linux-2.6.34.1/include/linux/fs.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/include/linux/fs.h 2010-07-07 09:04:56.000000000 -0400 +diff -urNp linux-2.6.35.4/include/linux/fs.h linux-2.6.35.4/include/linux/fs.h +--- linux-2.6.35.4/include/linux/fs.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/include/linux/fs.h 2010-09-17 20:12:37.000000000 -0400 @@ -90,6 +90,11 @@ struct inodes_stat_t { /* Expect random access pattern */ #define FMODE_RANDOM ((__force fmode_t)0x1000) @@ -43250,7 +44370,7 @@ diff -urNp linux-2.6.34.1/include/linux/fs.h linux-2.6.34.1/include/linux/fs.h /* * The below are the various read and write types that we support. Some of * them include behavioral modifiers that send information down to the -@@ -570,41 +575,41 @@ typedef int (*read_actor_t)(read_descrip +@@ -571,41 +576,41 @@ typedef int (*read_actor_t)(read_descrip unsigned long, unsigned long); struct address_space_operations { @@ -43309,7 +44429,7 @@ diff -urNp linux-2.6.34.1/include/linux/fs.h linux-2.6.34.1/include/linux/fs.h }; /* -@@ -1032,19 +1037,19 @@ static inline int file_check_writeable(s +@@ -1035,19 +1040,19 @@ static inline int file_check_writeable(s typedef struct files_struct *fl_owner_t; struct file_lock_operations { @@ -43339,7 +44459,7 @@ diff -urNp linux-2.6.34.1/include/linux/fs.h linux-2.6.34.1/include/linux/fs.h }; struct lock_manager { -@@ -1439,7 +1444,7 @@ struct fiemap_extent_info { +@@ -1440,7 +1445,7 @@ struct fiemap_extent_info { unsigned int fi_flags; /* Flags as passed from user */ unsigned int fi_extents_mapped; /* Number of mapped extents */ unsigned int fi_extents_max; /* Size of fiemap_extent array */ @@ -43348,7 +44468,7 @@ diff -urNp linux-2.6.34.1/include/linux/fs.h linux-2.6.34.1/include/linux/fs.h * array */ }; int fiemap_fill_next_extent(struct fiemap_extent_info *info, u64 logical, -@@ -1556,30 +1561,30 @@ extern ssize_t vfs_writev(struct file *, +@@ -1557,30 +1562,30 @@ extern ssize_t vfs_writev(struct file *, unsigned long, loff_t *); struct super_operations { @@ -43399,9 +44519,9 @@ diff -urNp linux-2.6.34.1/include/linux/fs.h linux-2.6.34.1/include/linux/fs.h }; /* -diff -urNp linux-2.6.34.1/include/linux/fs_struct.h linux-2.6.34.1/include/linux/fs_struct.h ---- linux-2.6.34.1/include/linux/fs_struct.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/include/linux/fs_struct.h 2010-07-07 09:04:56.000000000 -0400 +diff -urNp linux-2.6.35.4/include/linux/fs_struct.h linux-2.6.35.4/include/linux/fs_struct.h +--- linux-2.6.35.4/include/linux/fs_struct.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/include/linux/fs_struct.h 2010-09-17 20:12:09.000000000 -0400 @@ -4,7 +4,7 @@ #include @@ -43411,9 +44531,9 @@ diff -urNp linux-2.6.34.1/include/linux/fs_struct.h linux-2.6.34.1/include/linux rwlock_t lock; int umask; int in_exec; -diff -urNp linux-2.6.34.1/include/linux/genhd.h linux-2.6.34.1/include/linux/genhd.h ---- linux-2.6.34.1/include/linux/genhd.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/include/linux/genhd.h 2010-07-07 09:04:56.000000000 -0400 +diff -urNp linux-2.6.35.4/include/linux/genhd.h linux-2.6.35.4/include/linux/genhd.h +--- linux-2.6.35.4/include/linux/genhd.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/include/linux/genhd.h 2010-09-17 20:12:09.000000000 -0400 @@ -162,7 +162,7 @@ struct gendisk { struct timer_rand_state *random; @@ -43423,9 +44543,9 @@ diff -urNp linux-2.6.34.1/include/linux/genhd.h linux-2.6.34.1/include/linux/gen struct work_struct async_notify; #ifdef CONFIG_BLK_DEV_INTEGRITY struct blk_integrity *integrity; -diff -urNp linux-2.6.34.1/include/linux/gracl.h linux-2.6.34.1/include/linux/gracl.h ---- linux-2.6.34.1/include/linux/gracl.h 1969-12-31 19:00:00.000000000 -0500 -+++ linux-2.6.34.1/include/linux/gracl.h 2010-07-07 09:04:56.000000000 -0400 +diff -urNp linux-2.6.35.4/include/linux/gracl.h linux-2.6.35.4/include/linux/gracl.h +--- linux-2.6.35.4/include/linux/gracl.h 1969-12-31 19:00:00.000000000 -0500 ++++ linux-2.6.35.4/include/linux/gracl.h 2010-09-17 20:12:37.000000000 -0400 @@ -0,0 +1,310 @@ +#ifndef GR_ACL_H +#define GR_ACL_H @@ -43737,9 +44857,9 @@ diff -urNp linux-2.6.34.1/include/linux/gracl.h linux-2.6.34.1/include/linux/gra + +#endif + -diff -urNp linux-2.6.34.1/include/linux/gralloc.h linux-2.6.34.1/include/linux/gralloc.h ---- linux-2.6.34.1/include/linux/gralloc.h 1969-12-31 19:00:00.000000000 -0500 -+++ linux-2.6.34.1/include/linux/gralloc.h 2010-07-07 09:04:56.000000000 -0400 +diff -urNp linux-2.6.35.4/include/linux/gralloc.h linux-2.6.35.4/include/linux/gralloc.h +--- linux-2.6.35.4/include/linux/gralloc.h 1969-12-31 19:00:00.000000000 -0500 ++++ linux-2.6.35.4/include/linux/gralloc.h 2010-09-17 20:12:37.000000000 -0400 @@ -0,0 +1,9 @@ +#ifndef __GRALLOC_H +#define __GRALLOC_H @@ -43750,9 +44870,9 @@ diff -urNp linux-2.6.34.1/include/linux/gralloc.h linux-2.6.34.1/include/linux/g +void *acl_alloc_num(unsigned long num, unsigned long len); + +#endif -diff -urNp linux-2.6.34.1/include/linux/grdefs.h linux-2.6.34.1/include/linux/grdefs.h ---- linux-2.6.34.1/include/linux/grdefs.h 1969-12-31 19:00:00.000000000 -0500 -+++ linux-2.6.34.1/include/linux/grdefs.h 2010-07-07 09:04:56.000000000 -0400 +diff -urNp linux-2.6.35.4/include/linux/grdefs.h linux-2.6.35.4/include/linux/grdefs.h +--- linux-2.6.35.4/include/linux/grdefs.h 1969-12-31 19:00:00.000000000 -0500 ++++ linux-2.6.35.4/include/linux/grdefs.h 2010-09-17 20:12:37.000000000 -0400 @@ -0,0 +1,136 @@ +#ifndef GRDEFS_H +#define GRDEFS_H @@ -43890,9 +45010,9 @@ diff -urNp linux-2.6.34.1/include/linux/grdefs.h linux-2.6.34.1/include/linux/gr +}; + +#endif -diff -urNp linux-2.6.34.1/include/linux/grinternal.h linux-2.6.34.1/include/linux/grinternal.h ---- linux-2.6.34.1/include/linux/grinternal.h 1969-12-31 19:00:00.000000000 -0500 -+++ linux-2.6.34.1/include/linux/grinternal.h 2010-07-07 09:04:56.000000000 -0400 +diff -urNp linux-2.6.35.4/include/linux/grinternal.h linux-2.6.35.4/include/linux/grinternal.h +--- linux-2.6.35.4/include/linux/grinternal.h 1969-12-31 19:00:00.000000000 -0500 ++++ linux-2.6.35.4/include/linux/grinternal.h 2010-09-17 20:12:37.000000000 -0400 @@ -0,0 +1,211 @@ +#ifndef __GRINTERNAL_H +#define __GRINTERNAL_H @@ -43958,7 +45078,7 @@ diff -urNp linux-2.6.34.1/include/linux/grinternal.h linux-2.6.34.1/include/linu +extern int grsec_enable_tpe; +extern int grsec_tpe_gid; +extern int grsec_enable_tpe_all; -+extern int grsec_enable_sidcaps; ++extern int grsec_enable_tpe_invert; +extern int grsec_enable_socket_all; +extern int grsec_socket_all_gid; +extern int grsec_enable_socket_client; @@ -44105,9 +45225,9 @@ diff -urNp linux-2.6.34.1/include/linux/grinternal.h linux-2.6.34.1/include/linu +#endif + +#endif -diff -urNp linux-2.6.34.1/include/linux/grmsg.h linux-2.6.34.1/include/linux/grmsg.h ---- linux-2.6.34.1/include/linux/grmsg.h 1969-12-31 19:00:00.000000000 -0500 -+++ linux-2.6.34.1/include/linux/grmsg.h 2010-07-07 09:04:56.000000000 -0400 +diff -urNp linux-2.6.35.4/include/linux/grmsg.h linux-2.6.35.4/include/linux/grmsg.h +--- linux-2.6.35.4/include/linux/grmsg.h 1969-12-31 19:00:00.000000000 -0500 ++++ linux-2.6.35.4/include/linux/grmsg.h 2010-09-17 20:12:37.000000000 -0400 @@ -0,0 +1,108 @@ +#define DEFAULTSECMSG "%.256s[%.16s:%d] uid/euid:%u/%u gid/egid:%u/%u, parent %.256s[%.16s:%d] uid/euid:%u/%u gid/egid:%u/%u" +#define GR_ACL_PROCACCT_MSG "%.256s[%.16s:%d] IP:%pI4 TTY:%.64s uid/euid:%u/%u gid/egid:%u/%u run time:[%ud %uh %um %us] cpu time:[%ud %uh %um %us] %s with exit code %ld, parent %.256s[%.16s:%d] IP:%pI4 TTY:%.64s uid/euid:%u/%u gid/egid:%u/%u" @@ -44217,10 +45337,10 @@ diff -urNp linux-2.6.34.1/include/linux/grmsg.h linux-2.6.34.1/include/linux/grm +#define GR_NONROOT_MODLOAD_MSG "denied kernel module auto-load of %.64s by " +#define GR_VM86_MSG "denied use of vm86 by " +#define GR_PTRACE_AUDIT_MSG "process %.950s(%.16s:%d) attached to via ptrace by " -diff -urNp linux-2.6.34.1/include/linux/grsecurity.h linux-2.6.34.1/include/linux/grsecurity.h ---- linux-2.6.34.1/include/linux/grsecurity.h 1969-12-31 19:00:00.000000000 -0500 -+++ linux-2.6.34.1/include/linux/grsecurity.h 2010-07-07 09:04:56.000000000 -0400 -@@ -0,0 +1,201 @@ +diff -urNp linux-2.6.35.4/include/linux/grsecurity.h linux-2.6.35.4/include/linux/grsecurity.h +--- linux-2.6.35.4/include/linux/grsecurity.h 1969-12-31 19:00:00.000000000 -0500 ++++ linux-2.6.35.4/include/linux/grsecurity.h 2010-09-17 20:12:37.000000000 -0400 +@@ -0,0 +1,203 @@ +#ifndef GR_SECURITY_H +#define GR_SECURITY_H +#include @@ -44256,6 +45376,7 @@ diff -urNp linux-2.6.34.1/include/linux/grsecurity.h linux-2.6.34.1/include/linu +void gr_del_task_from_ip_table(struct task_struct *p); + +int gr_pid_is_chrooted(struct task_struct *p); ++int gr_handle_chroot_fowner(struct pid *pid, enum pid_type type); +int gr_handle_chroot_nice(void); +int gr_handle_chroot_sysctl(const int op); +int gr_handle_chroot_setpriority(struct task_struct *p, @@ -44321,6 +45442,7 @@ diff -urNp linux-2.6.34.1/include/linux/grsecurity.h linux-2.6.34.1/include/linu +int gr_handle_signal(const struct task_struct *p, const int sig); +int gr_check_crash_uid(const uid_t uid); +int gr_check_protected_task(const struct task_struct *task); ++int gr_check_protected_task_fowner(struct pid *pid, enum pid_type type); +int gr_acl_handle_mmap(const struct file *file, + const unsigned long prot); +int gr_acl_handle_mprotect(const struct file *file, @@ -44422,9 +45544,9 @@ diff -urNp linux-2.6.34.1/include/linux/grsecurity.h linux-2.6.34.1/include/linu +#endif + +#endif -diff -urNp linux-2.6.34.1/include/linux/grsock.h linux-2.6.34.1/include/linux/grsock.h ---- linux-2.6.34.1/include/linux/grsock.h 1969-12-31 19:00:00.000000000 -0500 -+++ linux-2.6.34.1/include/linux/grsock.h 2010-07-07 09:04:56.000000000 -0400 +diff -urNp linux-2.6.35.4/include/linux/grsock.h linux-2.6.35.4/include/linux/grsock.h +--- linux-2.6.35.4/include/linux/grsock.h 1969-12-31 19:00:00.000000000 -0500 ++++ linux-2.6.35.4/include/linux/grsock.h 2010-09-17 20:12:37.000000000 -0400 @@ -0,0 +1,19 @@ +#ifndef __GRSOCK_H +#define __GRSOCK_H @@ -44445,21 +45567,9 @@ diff -urNp linux-2.6.34.1/include/linux/grsock.h linux-2.6.34.1/include/linux/gr + const int protocol); + +#endif -diff -urNp linux-2.6.34.1/include/linux/hdpu_features.h linux-2.6.34.1/include/linux/hdpu_features.h ---- linux-2.6.34.1/include/linux/hdpu_features.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/include/linux/hdpu_features.h 2010-07-07 09:04:56.000000000 -0400 -@@ -3,7 +3,7 @@ - struct cpustate_t { - spinlock_t lock; - int excl; -- int open_count; -+ atomic_t open_count; - unsigned char cached_val; - int inited; - unsigned long *set_addr; -diff -urNp linux-2.6.34.1/include/linux/highmem.h linux-2.6.34.1/include/linux/highmem.h ---- linux-2.6.34.1/include/linux/highmem.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/include/linux/highmem.h 2010-07-07 09:04:56.000000000 -0400 +diff -urNp linux-2.6.35.4/include/linux/highmem.h linux-2.6.35.4/include/linux/highmem.h +--- linux-2.6.35.4/include/linux/highmem.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/include/linux/highmem.h 2010-09-17 20:12:09.000000000 -0400 @@ -143,6 +143,18 @@ static inline void clear_highpage(struct kunmap_atomic(kaddr, KM_USER0); } @@ -44479,10 +45589,10 @@ diff -urNp linux-2.6.34.1/include/linux/highmem.h linux-2.6.34.1/include/linux/h static inline void zero_user_segments(struct page *page, unsigned start1, unsigned end1, unsigned start2, unsigned end2) -diff -urNp linux-2.6.34.1/include/linux/interrupt.h linux-2.6.34.1/include/linux/interrupt.h ---- linux-2.6.34.1/include/linux/interrupt.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/include/linux/interrupt.h 2010-07-07 09:04:56.000000000 -0400 -@@ -357,7 +357,7 @@ enum +diff -urNp linux-2.6.35.4/include/linux/interrupt.h linux-2.6.35.4/include/linux/interrupt.h +--- linux-2.6.35.4/include/linux/interrupt.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/include/linux/interrupt.h 2010-09-17 20:12:09.000000000 -0400 +@@ -392,7 +392,7 @@ enum /* map softirq index to softirq name. update 'softirq_to_name' in * kernel/softirq.c when adding a new softirq. */ @@ -44491,7 +45601,7 @@ diff -urNp linux-2.6.34.1/include/linux/interrupt.h linux-2.6.34.1/include/linux /* softirq mask and active fields moved to irq_cpustat_t in * asm/hardirq.h to get better cache usage. KAO -@@ -365,12 +365,12 @@ extern char *softirq_to_name[NR_SOFTIRQS +@@ -400,12 +400,12 @@ extern char *softirq_to_name[NR_SOFTIRQS struct softirq_action { @@ -44506,10 +45616,10 @@ diff -urNp linux-2.6.34.1/include/linux/interrupt.h linux-2.6.34.1/include/linux extern void softirq_init(void); #define __raise_softirq_irqoff(nr) do { or_softirq_pending(1UL << (nr)); } while (0) extern void raise_softirq_irqoff(unsigned int nr); -diff -urNp linux-2.6.34.1/include/linux/jbd.h linux-2.6.34.1/include/linux/jbd.h ---- linux-2.6.34.1/include/linux/jbd.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/include/linux/jbd.h 2010-07-07 09:04:56.000000000 -0400 -@@ -67,7 +67,7 @@ extern u8 journal_enable_debug; +diff -urNp linux-2.6.35.4/include/linux/jbd2.h linux-2.6.35.4/include/linux/jbd2.h +--- linux-2.6.35.4/include/linux/jbd2.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/include/linux/jbd2.h 2010-09-17 20:12:09.000000000 -0400 +@@ -67,7 +67,7 @@ extern u8 jbd2_journal_enable_debug; } \ } while (0) #else @@ -44517,11 +45627,11 @@ diff -urNp linux-2.6.34.1/include/linux/jbd.h linux-2.6.34.1/include/linux/jbd.h +#define jbd_debug(f, a...) do {} while (0) #endif - static inline void *jbd_alloc(size_t size, gfp_t flags) -diff -urNp linux-2.6.34.1/include/linux/jbd2.h linux-2.6.34.1/include/linux/jbd2.h ---- linux-2.6.34.1/include/linux/jbd2.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/include/linux/jbd2.h 2010-07-07 09:04:56.000000000 -0400 -@@ -67,7 +67,7 @@ extern u8 jbd2_journal_enable_debug; + extern void *jbd2_alloc(size_t size, gfp_t flags); +diff -urNp linux-2.6.35.4/include/linux/jbd.h linux-2.6.35.4/include/linux/jbd.h +--- linux-2.6.35.4/include/linux/jbd.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/include/linux/jbd.h 2010-09-17 20:12:09.000000000 -0400 +@@ -67,7 +67,7 @@ extern u8 journal_enable_debug; } \ } while (0) #else @@ -44529,10 +45639,10 @@ diff -urNp linux-2.6.34.1/include/linux/jbd2.h linux-2.6.34.1/include/linux/jbd2 +#define jbd_debug(f, a...) do {} while (0) #endif - extern void *jbd2_alloc(size_t size, gfp_t flags); -diff -urNp linux-2.6.34.1/include/linux/kallsyms.h linux-2.6.34.1/include/linux/kallsyms.h ---- linux-2.6.34.1/include/linux/kallsyms.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/include/linux/kallsyms.h 2010-07-07 09:04:56.000000000 -0400 + static inline void *jbd_alloc(size_t size, gfp_t flags) +diff -urNp linux-2.6.35.4/include/linux/kallsyms.h linux-2.6.35.4/include/linux/kallsyms.h +--- linux-2.6.35.4/include/linux/kallsyms.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/include/linux/kallsyms.h 2010-09-17 20:12:37.000000000 -0400 @@ -15,7 +15,8 @@ struct module; @@ -44553,10 +45663,10 @@ diff -urNp linux-2.6.34.1/include/linux/kallsyms.h linux-2.6.34.1/include/linux/ /* This macro allows us to keep printk typechecking */ static void __check_printsym_format(const char *fmt, ...) -diff -urNp linux-2.6.34.1/include/linux/kgdb.h linux-2.6.34.1/include/linux/kgdb.h ---- linux-2.6.34.1/include/linux/kgdb.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/include/linux/kgdb.h 2010-07-07 09:04:56.000000000 -0400 -@@ -250,20 +250,20 @@ struct kgdb_arch { +diff -urNp linux-2.6.35.4/include/linux/kgdb.h linux-2.6.35.4/include/linux/kgdb.h +--- linux-2.6.35.4/include/linux/kgdb.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/include/linux/kgdb.h 2010-09-17 20:12:09.000000000 -0400 +@@ -263,22 +263,22 @@ struct kgdb_arch { */ struct kgdb_io { const char *name; @@ -44572,6 +45682,7 @@ diff -urNp linux-2.6.34.1/include/linux/kgdb.h linux-2.6.34.1/include/linux/kgdb + int (* const init) (void); + void (* const pre_exception) (void); + void (* const post_exception) (void); + int is_console; }; -extern struct kgdb_arch arch_kgdb_ops; @@ -44581,24 +45692,26 @@ diff -urNp linux-2.6.34.1/include/linux/kgdb.h linux-2.6.34.1/include/linux/kgdb -extern int kgdb_register_io_module(struct kgdb_io *local_kgdb_io_ops); -extern void kgdb_unregister_io_module(struct kgdb_io *local_kgdb_io_ops); +-extern struct kgdb_io *dbg_io_ops; +extern int kgdb_register_io_module(const struct kgdb_io *local_kgdb_io_ops); +extern void kgdb_unregister_io_module(const struct kgdb_io *local_kgdb_io_ops); ++extern const struct kgdb_io *dbg_io_ops; extern int kgdb_hex2long(char **ptr, unsigned long *long_val); extern int kgdb_mem2hex(char *mem, char *buf, int count); -diff -urNp linux-2.6.34.1/include/linux/kvm_host.h linux-2.6.34.1/include/linux/kvm_host.h ---- linux-2.6.34.1/include/linux/kvm_host.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/include/linux/kvm_host.h 2010-07-07 09:04:56.000000000 -0400 -@@ -237,7 +237,7 @@ void kvm_vcpu_uninit(struct kvm_vcpu *vc +diff -urNp linux-2.6.35.4/include/linux/kvm_host.h linux-2.6.35.4/include/linux/kvm_host.h +--- linux-2.6.35.4/include/linux/kvm_host.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/include/linux/kvm_host.h 2010-09-17 20:12:09.000000000 -0400 +@@ -243,7 +243,7 @@ void kvm_vcpu_uninit(struct kvm_vcpu *vc void vcpu_load(struct kvm_vcpu *vcpu); void vcpu_put(struct kvm_vcpu *vcpu); --int kvm_init(void *opaque, unsigned int vcpu_size, -+int kvm_init(const void *opaque, unsigned int vcpu_size, +-int kvm_init(void *opaque, unsigned vcpu_size, unsigned vcpu_align, ++int kvm_init(const void *opaque, unsigned vcpu_size, unsigned vcpu_align, struct module *module); void kvm_exit(void); -@@ -355,7 +355,7 @@ int kvm_arch_vcpu_ioctl_set_guest_debug( +@@ -367,7 +367,7 @@ int kvm_arch_vcpu_ioctl_set_guest_debug( struct kvm_guest_debug *dbg); int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run); @@ -44607,9 +45720,9 @@ diff -urNp linux-2.6.34.1/include/linux/kvm_host.h linux-2.6.34.1/include/linux/ void kvm_arch_exit(void); int kvm_arch_vcpu_init(struct kvm_vcpu *vcpu); -diff -urNp linux-2.6.34.1/include/linux/libata.h linux-2.6.34.1/include/linux/libata.h ---- linux-2.6.34.1/include/linux/libata.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/include/linux/libata.h 2010-07-07 09:04:56.000000000 -0400 +diff -urNp linux-2.6.35.4/include/linux/libata.h linux-2.6.35.4/include/linux/libata.h +--- linux-2.6.35.4/include/linux/libata.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/include/linux/libata.h 2010-09-17 20:12:09.000000000 -0400 @@ -64,11 +64,11 @@ #ifdef ATA_VERBOSE_DEBUG #define VPRINTK(fmt, args...) printk(KERN_ERR "%s: " fmt, __func__, ## args) @@ -44625,7 +45738,7 @@ diff -urNp linux-2.6.34.1/include/linux/libata.h linux-2.6.34.1/include/linux/li #endif /* ATA_DEBUG */ #define BPRINTK(fmt, args...) if (ap->flags & ATA_FLAG_DEBUGMSG) printk(KERN_ERR "%s: " fmt, __func__, ## args) -@@ -525,11 +525,11 @@ struct ata_ioports { +@@ -523,11 +523,11 @@ struct ata_ioports { struct ata_host { spinlock_t lock; @@ -44639,7 +45752,7 @@ diff -urNp linux-2.6.34.1/include/linux/libata.h linux-2.6.34.1/include/linux/li unsigned long flags; #ifdef CONFIG_ATA_ACPI acpi_handle acpi_handle; -@@ -711,7 +711,7 @@ struct ata_link { +@@ -709,7 +709,7 @@ struct ata_link { struct ata_port { struct Scsi_Host *scsi_host; /* our co-allocated scsi host */ @@ -44666,7 +45779,7 @@ diff -urNp linux-2.6.34.1/include/linux/libata.h linux-2.6.34.1/include/linux/li extern const struct ata_port_info ata_dummy_port_info; static inline const unsigned long * -@@ -964,7 +964,7 @@ extern int ata_host_activate(struct ata_ +@@ -962,7 +962,7 @@ extern int ata_host_activate(struct ata_ struct scsi_host_template *sht); extern void ata_host_detach(struct ata_host *host); extern void ata_host_init(struct ata_host *, struct device *, @@ -44675,9 +45788,9 @@ diff -urNp linux-2.6.34.1/include/linux/libata.h linux-2.6.34.1/include/linux/li extern int ata_scsi_detect(struct scsi_host_template *sht); extern int ata_scsi_ioctl(struct scsi_device *dev, int cmd, void __user *arg); extern int ata_scsi_queuecmd(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *)); -diff -urNp linux-2.6.34.1/include/linux/lockd/bind.h linux-2.6.34.1/include/linux/lockd/bind.h ---- linux-2.6.34.1/include/linux/lockd/bind.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/include/linux/lockd/bind.h 2010-07-07 09:04:56.000000000 -0400 +diff -urNp linux-2.6.35.4/include/linux/lockd/bind.h linux-2.6.35.4/include/linux/lockd/bind.h +--- linux-2.6.35.4/include/linux/lockd/bind.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/include/linux/lockd/bind.h 2010-09-17 20:12:09.000000000 -0400 @@ -23,13 +23,13 @@ struct svc_rqst; * This is the set of functions for lockd->nfsd communication */ @@ -44695,9 +45808,9 @@ diff -urNp linux-2.6.34.1/include/linux/lockd/bind.h linux-2.6.34.1/include/linu /* * Similar to nfs_client_initdata, but without the NFS-specific -diff -urNp linux-2.6.34.1/include/linux/mm.h linux-2.6.34.1/include/linux/mm.h ---- linux-2.6.34.1/include/linux/mm.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/include/linux/mm.h 2010-07-07 09:04:56.000000000 -0400 +diff -urNp linux-2.6.35.4/include/linux/mm.h linux-2.6.35.4/include/linux/mm.h +--- linux-2.6.35.4/include/linux/mm.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/include/linux/mm.h 2010-09-17 20:12:09.000000000 -0400 @@ -103,7 +103,14 @@ extern unsigned int kobjsize(const void #define VM_CAN_NONLINEAR 0x08000000 /* Has ->fault & does nonlinear pages */ @@ -44713,7 +45826,7 @@ diff -urNp linux-2.6.34.1/include/linux/mm.h linux-2.6.34.1/include/linux/mm.h #define VM_PFN_AT_MMAP 0x40000000 /* PFNMAP vma that is fully mapped at mmap time */ #define VM_MERGEABLE 0x80000000 /* KSM may merge identical pages */ -@@ -1006,6 +1013,8 @@ struct shrinker { +@@ -1010,6 +1017,8 @@ struct shrinker { extern void register_shrinker(struct shrinker *); extern void unregister_shrinker(struct shrinker *); @@ -44722,7 +45835,7 @@ diff -urNp linux-2.6.34.1/include/linux/mm.h linux-2.6.34.1/include/linux/mm.h int vma_wants_writenotify(struct vm_area_struct *vma); extern pte_t *get_locked_pte(struct mm_struct *mm, unsigned long addr, spinlock_t **ptl); -@@ -1282,6 +1291,7 @@ out: +@@ -1286,6 +1295,7 @@ out: } extern int do_munmap(struct mm_struct *, unsigned long, size_t); @@ -44730,7 +45843,7 @@ diff -urNp linux-2.6.34.1/include/linux/mm.h linux-2.6.34.1/include/linux/mm.h extern unsigned long do_brk(unsigned long, unsigned long); -@@ -1336,6 +1346,10 @@ extern struct vm_area_struct * find_vma( +@@ -1340,6 +1350,10 @@ extern struct vm_area_struct * find_vma( extern struct vm_area_struct * find_vma_prev(struct mm_struct * mm, unsigned long addr, struct vm_area_struct **pprev); @@ -44741,7 +45854,7 @@ diff -urNp linux-2.6.34.1/include/linux/mm.h linux-2.6.34.1/include/linux/mm.h /* Look up the first VMA which intersects the interval start_addr..end_addr-1, NULL if none. Assume start_addr < end_addr. */ static inline struct vm_area_struct * find_vma_intersection(struct mm_struct * mm, unsigned long start_addr, unsigned long end_addr) -@@ -1352,7 +1366,6 @@ static inline unsigned long vma_pages(st +@@ -1356,7 +1370,6 @@ static inline unsigned long vma_pages(st return (vma->vm_end - vma->vm_start) >> PAGE_SHIFT; } @@ -44749,7 +45862,7 @@ diff -urNp linux-2.6.34.1/include/linux/mm.h linux-2.6.34.1/include/linux/mm.h struct vm_area_struct *find_extend_vma(struct mm_struct *, unsigned long addr); int remap_pfn_range(struct vm_area_struct *, unsigned long addr, unsigned long pfn, unsigned long size, pgprot_t); -@@ -1462,10 +1475,16 @@ extern int unpoison_memory(unsigned long +@@ -1463,10 +1476,16 @@ extern int unpoison_memory(unsigned long extern int sysctl_memory_failure_early_kill; extern int sysctl_memory_failure_recovery; extern void shake_page(struct page *p, int access); @@ -44767,9 +45880,9 @@ diff -urNp linux-2.6.34.1/include/linux/mm.h linux-2.6.34.1/include/linux/mm.h + #endif /* __KERNEL__ */ #endif /* _LINUX_MM_H */ -diff -urNp linux-2.6.34.1/include/linux/mm_types.h linux-2.6.34.1/include/linux/mm_types.h ---- linux-2.6.34.1/include/linux/mm_types.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/include/linux/mm_types.h 2010-07-07 09:04:56.000000000 -0400 +diff -urNp linux-2.6.35.4/include/linux/mm_types.h linux-2.6.35.4/include/linux/mm_types.h +--- linux-2.6.35.4/include/linux/mm_types.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/include/linux/mm_types.h 2010-09-17 20:12:09.000000000 -0400 @@ -183,6 +183,8 @@ struct vm_area_struct { #ifdef CONFIG_NUMA struct mempolicy *vm_policy; /* NUMA policy for the VMA */ @@ -44804,9 +45917,9 @@ diff -urNp linux-2.6.34.1/include/linux/mm_types.h linux-2.6.34.1/include/linux/ }; /* Future-safe accessor for struct mm_struct's cpu_vm_mask. */ -diff -urNp linux-2.6.34.1/include/linux/mmu_notifier.h linux-2.6.34.1/include/linux/mmu_notifier.h ---- linux-2.6.34.1/include/linux/mmu_notifier.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/include/linux/mmu_notifier.h 2010-07-07 09:04:56.000000000 -0400 +diff -urNp linux-2.6.35.4/include/linux/mmu_notifier.h linux-2.6.35.4/include/linux/mmu_notifier.h +--- linux-2.6.35.4/include/linux/mmu_notifier.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/include/linux/mmu_notifier.h 2010-09-17 20:12:09.000000000 -0400 @@ -235,12 +235,12 @@ static inline void mmu_notifier_mm_destr */ #define ptep_clear_flush_notify(__vma, __address, __ptep) \ @@ -44823,9 +45936,21 @@ diff -urNp linux-2.6.34.1/include/linux/mmu_notifier.h linux-2.6.34.1/include/li }) #define ptep_clear_flush_young_notify(__vma, __address, __ptep) \ -diff -urNp linux-2.6.34.1/include/linux/mod_devicetable.h linux-2.6.34.1/include/linux/mod_devicetable.h ---- linux-2.6.34.1/include/linux/mod_devicetable.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/include/linux/mod_devicetable.h 2010-07-07 09:04:56.000000000 -0400 +diff -urNp linux-2.6.35.4/include/linux/mmzone.h linux-2.6.35.4/include/linux/mmzone.h +--- linux-2.6.35.4/include/linux/mmzone.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/include/linux/mmzone.h 2010-09-17 20:12:09.000000000 -0400 +@@ -345,7 +345,7 @@ struct zone { + unsigned long flags; /* zone flags, see below */ + + /* Zone statistics */ +- atomic_long_t vm_stat[NR_VM_ZONE_STAT_ITEMS]; ++ atomic_long_unchecked_t vm_stat[NR_VM_ZONE_STAT_ITEMS]; + + /* + * prev_priority holds the scanning priority for this zone. It is +diff -urNp linux-2.6.35.4/include/linux/mod_devicetable.h linux-2.6.35.4/include/linux/mod_devicetable.h +--- linux-2.6.35.4/include/linux/mod_devicetable.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/include/linux/mod_devicetable.h 2010-09-17 20:12:09.000000000 -0400 @@ -12,7 +12,7 @@ typedef unsigned long kernel_ulong_t; #endif @@ -44844,10 +45969,10 @@ diff -urNp linux-2.6.34.1/include/linux/mod_devicetable.h linux-2.6.34.1/include struct hid_device_id { __u16 bus; -diff -urNp linux-2.6.34.1/include/linux/module.h linux-2.6.34.1/include/linux/module.h ---- linux-2.6.34.1/include/linux/module.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/include/linux/module.h 2010-07-07 09:04:56.000000000 -0400 -@@ -290,16 +290,16 @@ struct module +diff -urNp linux-2.6.35.4/include/linux/module.h linux-2.6.35.4/include/linux/module.h +--- linux-2.6.35.4/include/linux/module.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/include/linux/module.h 2010-09-17 20:12:09.000000000 -0400 +@@ -297,16 +297,16 @@ struct module int (*init)(void); /* If this is non-NULL, vfree after init() returns */ @@ -44868,7 +45993,7 @@ diff -urNp linux-2.6.34.1/include/linux/module.h linux-2.6.34.1/include/linux/mo /* Arch-specific module values */ struct mod_arch_specific arch; -@@ -399,16 +399,46 @@ bool is_module_address(unsigned long add +@@ -408,16 +408,46 @@ bool is_module_address(unsigned long add bool is_module_percpu_address(unsigned long addr); bool is_module_text_address(unsigned long addr); @@ -44919,9 +46044,9 @@ diff -urNp linux-2.6.34.1/include/linux/module.h linux-2.6.34.1/include/linux/mo } /* Search for module by name: must hold module_mutex. */ -diff -urNp linux-2.6.34.1/include/linux/moduleloader.h linux-2.6.34.1/include/linux/moduleloader.h ---- linux-2.6.34.1/include/linux/moduleloader.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/include/linux/moduleloader.h 2010-07-07 09:04:56.000000000 -0400 +diff -urNp linux-2.6.35.4/include/linux/moduleloader.h linux-2.6.35.4/include/linux/moduleloader.h +--- linux-2.6.35.4/include/linux/moduleloader.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/include/linux/moduleloader.h 2010-09-17 20:12:09.000000000 -0400 @@ -20,9 +20,21 @@ unsigned int arch_mod_section_prepend(st sections. Returns NULL on failure. */ void *module_alloc(unsigned long size); @@ -44944,9 +46069,9 @@ diff -urNp linux-2.6.34.1/include/linux/moduleloader.h linux-2.6.34.1/include/li /* Apply the given relocation to the (simplified) ELF. Return -error or 0. */ int apply_relocate(Elf_Shdr *sechdrs, -diff -urNp linux-2.6.34.1/include/linux/namei.h linux-2.6.34.1/include/linux/namei.h ---- linux-2.6.34.1/include/linux/namei.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/include/linux/namei.h 2010-07-07 09:04:56.000000000 -0400 +diff -urNp linux-2.6.35.4/include/linux/namei.h linux-2.6.35.4/include/linux/namei.h +--- linux-2.6.35.4/include/linux/namei.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/include/linux/namei.h 2010-09-17 20:12:09.000000000 -0400 @@ -22,7 +22,7 @@ struct nameidata { unsigned int flags; int last_type; @@ -44971,9 +46096,9 @@ diff -urNp linux-2.6.34.1/include/linux/namei.h linux-2.6.34.1/include/linux/nam { return nd->saved_names[nd->depth]; } -diff -urNp linux-2.6.34.1/include/linux/oprofile.h linux-2.6.34.1/include/linux/oprofile.h ---- linux-2.6.34.1/include/linux/oprofile.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/include/linux/oprofile.h 2010-07-07 09:04:56.000000000 -0400 +diff -urNp linux-2.6.35.4/include/linux/oprofile.h linux-2.6.35.4/include/linux/oprofile.h +--- linux-2.6.35.4/include/linux/oprofile.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/include/linux/oprofile.h 2010-09-17 20:12:09.000000000 -0400 @@ -129,9 +129,9 @@ int oprofilefs_create_ulong(struct super int oprofilefs_create_ro_ulong(struct super_block * sb, struct dentry * root, char const * name, ulong * val); @@ -44986,13 +46111,13 @@ diff -urNp linux-2.6.34.1/include/linux/oprofile.h linux-2.6.34.1/include/linux/ /** create a directory */ struct dentry * oprofilefs_mkdir(struct super_block * sb, struct dentry * root, -diff -urNp linux-2.6.34.1/include/linux/pipe_fs_i.h linux-2.6.34.1/include/linux/pipe_fs_i.h ---- linux-2.6.34.1/include/linux/pipe_fs_i.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/include/linux/pipe_fs_i.h 2010-07-07 09:04:56.000000000 -0400 -@@ -46,9 +46,9 @@ struct pipe_inode_info { +diff -urNp linux-2.6.35.4/include/linux/pipe_fs_i.h linux-2.6.35.4/include/linux/pipe_fs_i.h +--- linux-2.6.35.4/include/linux/pipe_fs_i.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/include/linux/pipe_fs_i.h 2010-09-17 20:12:09.000000000 -0400 +@@ -45,9 +45,9 @@ struct pipe_buffer { + struct pipe_inode_info { wait_queue_head_t wait; - unsigned int nrbufs, curbuf; - struct page *tmp_page; + unsigned int nrbufs, curbuf, buffers; - unsigned int readers; - unsigned int writers; - unsigned int waiting_writers; @@ -45001,10 +46126,10 @@ diff -urNp linux-2.6.34.1/include/linux/pipe_fs_i.h linux-2.6.34.1/include/linux + atomic_t waiting_writers; unsigned int r_counter; unsigned int w_counter; - struct fasync_struct *fasync_readers; -diff -urNp linux-2.6.34.1/include/linux/poison.h linux-2.6.34.1/include/linux/poison.h ---- linux-2.6.34.1/include/linux/poison.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/include/linux/poison.h 2010-07-07 09:04:56.000000000 -0400 + struct page *tmp_page; +diff -urNp linux-2.6.35.4/include/linux/poison.h linux-2.6.35.4/include/linux/poison.h +--- linux-2.6.35.4/include/linux/poison.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/include/linux/poison.h 2010-09-17 20:12:09.000000000 -0400 @@ -19,8 +19,8 @@ * under normal circumstances, used to verify that nobody uses * non-initialized list entries. @@ -45016,9 +46141,9 @@ diff -urNp linux-2.6.34.1/include/linux/poison.h linux-2.6.34.1/include/linux/po /********** include/linux/timer.h **********/ /* -diff -urNp linux-2.6.34.1/include/linux/proc_fs.h linux-2.6.34.1/include/linux/proc_fs.h ---- linux-2.6.34.1/include/linux/proc_fs.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/include/linux/proc_fs.h 2010-07-07 09:04:56.000000000 -0400 +diff -urNp linux-2.6.35.4/include/linux/proc_fs.h linux-2.6.35.4/include/linux/proc_fs.h +--- linux-2.6.35.4/include/linux/proc_fs.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/include/linux/proc_fs.h 2010-09-17 20:12:37.000000000 -0400 @@ -155,6 +155,19 @@ static inline struct proc_dir_entry *pro return proc_create_data(name, mode, parent, proc_fops, NULL); } @@ -45039,24 +46164,31 @@ diff -urNp linux-2.6.34.1/include/linux/proc_fs.h linux-2.6.34.1/include/linux/p static inline struct proc_dir_entry *create_proc_read_entry(const char *name, mode_t mode, struct proc_dir_entry *base, read_proc_t *read_proc, void * data) -diff -urNp linux-2.6.34.1/include/linux/random.h linux-2.6.34.1/include/linux/random.h ---- linux-2.6.34.1/include/linux/random.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/include/linux/random.h 2010-07-07 09:04:56.000000000 -0400 -@@ -74,6 +74,11 @@ unsigned long randomize_range(unsigned l - u32 random32(void); - void srandom32(u32 seed); +diff -urNp linux-2.6.35.4/include/linux/random.h linux-2.6.35.4/include/linux/random.h +--- linux-2.6.35.4/include/linux/random.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/include/linux/random.h 2010-09-17 20:12:09.000000000 -0400 +@@ -80,12 +80,17 @@ void srandom32(u32 seed); + + u32 prandom32(struct rnd_state *); +static inline unsigned long pax_get_random_long(void) +{ + return random32() + (sizeof(long) > 4 ? (unsigned long)random32() << 32 : 0); +} + - #endif /* __KERNEL___ */ + /* + * Handle minimum values for seeds + */ + static inline u32 __seed(u32 x, u32 m) + { +- return (x < m) ? x + m : x; ++ return (x <= m) ? x + m + 1 : x; + } - #endif /* _LINUX_RANDOM_H */ -diff -urNp linux-2.6.34.1/include/linux/reiserfs_fs.h linux-2.6.34.1/include/linux/reiserfs_fs.h ---- linux-2.6.34.1/include/linux/reiserfs_fs.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/include/linux/reiserfs_fs.h 2010-07-07 09:04:56.000000000 -0400 + /** +diff -urNp linux-2.6.35.4/include/linux/reiserfs_fs.h linux-2.6.35.4/include/linux/reiserfs_fs.h +--- linux-2.6.35.4/include/linux/reiserfs_fs.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/include/linux/reiserfs_fs.h 2010-09-17 20:12:09.000000000 -0400 @@ -1404,7 +1404,7 @@ static inline loff_t max_reiserfs_offset #define REISERFS_USER_MEM 1 /* reiserfs user memory mode */ @@ -45103,9 +46235,9 @@ diff -urNp linux-2.6.34.1/include/linux/reiserfs_fs.h linux-2.6.34.1/include/lin #define op_bytes_number(ih,bsize) item_ops[le_ih_k_type (ih)]->bytes_number (ih, bsize) #define op_is_left_mergeable(key,bsize) item_ops[le_key_k_type (le_key_version (key), key)]->is_left_mergeable (key, bsize) -diff -urNp linux-2.6.34.1/include/linux/reiserfs_fs_sb.h linux-2.6.34.1/include/linux/reiserfs_fs_sb.h ---- linux-2.6.34.1/include/linux/reiserfs_fs_sb.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/include/linux/reiserfs_fs_sb.h 2010-07-07 09:04:56.000000000 -0400 +diff -urNp linux-2.6.35.4/include/linux/reiserfs_fs_sb.h linux-2.6.35.4/include/linux/reiserfs_fs_sb.h +--- linux-2.6.35.4/include/linux/reiserfs_fs_sb.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/include/linux/reiserfs_fs_sb.h 2010-09-17 20:12:09.000000000 -0400 @@ -386,7 +386,7 @@ struct reiserfs_sb_info { /* Comment? -Hans */ wait_queue_head_t s_wait; @@ -45115,18 +46247,45 @@ diff -urNp linux-2.6.34.1/include/linux/reiserfs_fs_sb.h linux-2.6.34.1/include/ // tree gets re-balanced unsigned long s_properties; /* File system properties. Currently holds on-disk FS format */ -diff -urNp linux-2.6.34.1/include/linux/sched.h linux-2.6.34.1/include/linux/sched.h ---- linux-2.6.34.1/include/linux/sched.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/include/linux/sched.h 2010-07-07 09:04:56.000000000 -0400 -@@ -101,6 +101,7 @@ struct bio_list; +diff -urNp linux-2.6.35.4/include/linux/rmap.h linux-2.6.35.4/include/linux/rmap.h +--- linux-2.6.35.4/include/linux/rmap.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/include/linux/rmap.h 2010-09-17 20:12:09.000000000 -0400 +@@ -119,8 +119,8 @@ static inline void anon_vma_unlock(struc + void anon_vma_init(void); /* create anon_vma_cachep */ + int anon_vma_prepare(struct vm_area_struct *); + void unlink_anon_vmas(struct vm_area_struct *); +-int anon_vma_clone(struct vm_area_struct *, struct vm_area_struct *); +-int anon_vma_fork(struct vm_area_struct *, struct vm_area_struct *); ++int anon_vma_clone(struct vm_area_struct *, const struct vm_area_struct *); ++int anon_vma_fork(struct vm_area_struct *, const struct vm_area_struct *); + void __anon_vma_link(struct vm_area_struct *); + void anon_vma_free(struct anon_vma *); + +diff -urNp linux-2.6.35.4/include/linux/sched.h linux-2.6.35.4/include/linux/sched.h +--- linux-2.6.35.4/include/linux/sched.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/include/linux/sched.h 2010-09-17 20:12:37.000000000 -0400 +@@ -100,6 +100,7 @@ struct robust_list_head; + struct bio_list; struct fs_struct; - struct bts_context; struct perf_event_context; +struct linux_binprm; /* * List of flags we want to share for kernel threads, -@@ -628,6 +629,15 @@ struct signal_struct { +@@ -381,10 +382,12 @@ struct user_namespace; + #define DEFAULT_MAX_MAP_COUNT (USHRT_MAX - MAPCOUNT_ELF_CORE_MARGIN) + + extern int sysctl_max_map_count; ++extern unsigned long sysctl_heap_stack_gap; + + #include + + #ifdef CONFIG_MMU ++extern bool check_heap_stack_gap(struct vm_area_struct *vma, unsigned long addr, unsigned long len); + extern void arch_pick_mmap_layout(struct mm_struct *mm); + extern unsigned long + arch_get_unmapped_area(struct file *, unsigned long, unsigned long, +@@ -628,6 +631,15 @@ struct signal_struct { struct tty_audit_buf *tty_audit_buf; #endif @@ -45142,7 +46301,7 @@ diff -urNp linux-2.6.34.1/include/linux/sched.h linux-2.6.34.1/include/linux/sch int oom_adj; /* OOM kill score adjustment (bit shift) */ }; -@@ -1169,7 +1179,7 @@ struct rcu_node; +@@ -1166,7 +1178,7 @@ struct rcu_node; struct task_struct { volatile long state; /* -1 unrunnable, 0 runnable, >0 stopped */ @@ -45151,7 +46310,7 @@ diff -urNp linux-2.6.34.1/include/linux/sched.h linux-2.6.34.1/include/linux/sch atomic_t usage; unsigned int flags; /* per process flags, defined below */ unsigned int ptrace; -@@ -1283,8 +1293,8 @@ struct task_struct { +@@ -1274,8 +1286,8 @@ struct task_struct { struct list_head thread_group; struct completion *vfork_done; /* for vfork() */ @@ -45162,7 +46321,7 @@ diff -urNp linux-2.6.34.1/include/linux/sched.h linux-2.6.34.1/include/linux/sch cputime_t utime, stime, utimescaled, stimescaled; cputime_t gtime; -@@ -1300,16 +1310,6 @@ struct task_struct { +@@ -1291,16 +1303,6 @@ struct task_struct { struct task_cputime cputime_expires; struct list_head cpu_timers[3]; @@ -45179,7 +46338,7 @@ diff -urNp linux-2.6.34.1/include/linux/sched.h linux-2.6.34.1/include/linux/sch char comm[TASK_COMM_LEN]; /* executable name excluding path - access with [gs]et_task_comm (which lock it with task_lock()) -@@ -1393,6 +1393,15 @@ struct task_struct { +@@ -1384,6 +1386,15 @@ struct task_struct { int softirqs_enabled; int softirq_context; #endif @@ -45195,7 +46354,7 @@ diff -urNp linux-2.6.34.1/include/linux/sched.h linux-2.6.34.1/include/linux/sch #ifdef CONFIG_LOCKDEP # define MAX_LOCK_DEPTH 48UL u64 curr_chain_key; -@@ -1413,6 +1422,9 @@ struct task_struct { +@@ -1404,6 +1415,9 @@ struct task_struct { struct backing_dev_info *backing_dev_info; @@ -45205,7 +46364,7 @@ diff -urNp linux-2.6.34.1/include/linux/sched.h linux-2.6.34.1/include/linux/sch struct io_context *io_context; unsigned long ptrace_message; -@@ -1476,6 +1488,20 @@ struct task_struct { +@@ -1469,6 +1483,20 @@ struct task_struct { unsigned long default_timer_slack_ns; struct list_head *scm_work_list; @@ -45226,7 +46385,7 @@ diff -urNp linux-2.6.34.1/include/linux/sched.h linux-2.6.34.1/include/linux/sch #ifdef CONFIG_FUNCTION_GRAPH_TRACER /* Index of current stored address in ret_stack */ int curr_ret_stack; -@@ -1507,6 +1533,52 @@ struct task_struct { +@@ -1500,6 +1528,52 @@ struct task_struct { #endif }; @@ -45279,7 +46438,7 @@ diff -urNp linux-2.6.34.1/include/linux/sched.h linux-2.6.34.1/include/linux/sch /* Future-safe accessor for struct task_struct's cpus_allowed. */ #define tsk_cpus_allowed(tsk) (&(tsk)->cpus_allowed) -@@ -2108,7 +2180,7 @@ extern void __cleanup_sighand(struct sig +@@ -2101,7 +2175,7 @@ extern void __cleanup_sighand(struct sig extern void exit_itimers(struct signal_struct *); extern void flush_itimer_signals(void); @@ -45288,7 +46447,7 @@ diff -urNp linux-2.6.34.1/include/linux/sched.h linux-2.6.34.1/include/linux/sch extern void daemonize(const char *, ...); extern int allow_signal(int); -@@ -2221,8 +2293,8 @@ static inline void unlock_task_sighand(s +@@ -2217,8 +2291,8 @@ static inline void unlock_task_sighand(s #ifndef __HAVE_THREAD_FUNCTIONS @@ -45299,7 +46458,7 @@ diff -urNp linux-2.6.34.1/include/linux/sched.h linux-2.6.34.1/include/linux/sch static inline void setup_thread_stack(struct task_struct *p, struct task_struct *org) { -@@ -2237,13 +2309,31 @@ static inline unsigned long *end_of_stac +@@ -2233,13 +2307,17 @@ static inline unsigned long *end_of_stac #endif @@ -45312,30 +46471,16 @@ diff -urNp linux-2.6.34.1/include/linux/sched.h linux-2.6.34.1/include/linux/sch return (obj >= stack) && (obj < (stack + THREAD_SIZE)); } -+/* 0: not at all, 1: fully, -1: partially (implies an error) */ -+static inline int object_is_on_stack(const void *obj, unsigned long len) -+{ -+ const void *stack = task_stack_page(current); -+ const void *stackend = stack + THREAD_SIZE; -+ -+ if (obj + len < obj) -+ return -1; -+ -+ if (stack <= obj && obj + len <= stackend) -+ return 1; -+ -+ if (obj + len <= stack || stackend <= obj) -+ return 0; -+ -+ return -1; -+} ++#ifdef CONFIG_PAX_USERCOPY ++extern int object_is_on_stack(const void *obj, unsigned long len); ++#endif + extern void thread_info_cache_init(void); #ifdef CONFIG_DEBUG_STACK_USAGE -diff -urNp linux-2.6.34.1/include/linux/screen_info.h linux-2.6.34.1/include/linux/screen_info.h ---- linux-2.6.34.1/include/linux/screen_info.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/include/linux/screen_info.h 2010-07-07 09:04:56.000000000 -0400 +diff -urNp linux-2.6.35.4/include/linux/screen_info.h linux-2.6.35.4/include/linux/screen_info.h +--- linux-2.6.35.4/include/linux/screen_info.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/include/linux/screen_info.h 2010-09-17 20:12:09.000000000 -0400 @@ -43,7 +43,8 @@ struct screen_info { __u16 pages; /* 0x32 */ __u16 vesa_attributes; /* 0x34 */ @@ -45346,9 +46491,9 @@ diff -urNp linux-2.6.34.1/include/linux/screen_info.h linux-2.6.34.1/include/lin } __attribute__((packed)); #define VIDEO_TYPE_MDA 0x10 /* Monochrome Text Display */ -diff -urNp linux-2.6.34.1/include/linux/security.h linux-2.6.34.1/include/linux/security.h ---- linux-2.6.34.1/include/linux/security.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/include/linux/security.h 2010-07-07 09:04:57.000000000 -0400 +diff -urNp linux-2.6.35.4/include/linux/security.h linux-2.6.35.4/include/linux/security.h +--- linux-2.6.35.4/include/linux/security.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/include/linux/security.h 2010-09-17 20:12:37.000000000 -0400 @@ -34,6 +34,7 @@ #include #include @@ -45357,9 +46502,9 @@ diff -urNp linux-2.6.34.1/include/linux/security.h linux-2.6.34.1/include/linux/ #include /* Maximum number of letters for an LSM name string */ -diff -urNp linux-2.6.34.1/include/linux/shm.h linux-2.6.34.1/include/linux/shm.h ---- linux-2.6.34.1/include/linux/shm.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/include/linux/shm.h 2010-07-07 09:04:57.000000000 -0400 +diff -urNp linux-2.6.35.4/include/linux/shm.h linux-2.6.35.4/include/linux/shm.h +--- linux-2.6.35.4/include/linux/shm.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/include/linux/shm.h 2010-09-17 20:12:37.000000000 -0400 @@ -95,6 +95,10 @@ struct shmid_kernel /* private to the ke pid_t shm_cprid; pid_t shm_lprid; @@ -45371,9 +46516,9 @@ diff -urNp linux-2.6.34.1/include/linux/shm.h linux-2.6.34.1/include/linux/shm.h }; /* shm_mode upper byte flags */ -diff -urNp linux-2.6.34.1/include/linux/slab.h linux-2.6.34.1/include/linux/slab.h ---- linux-2.6.34.1/include/linux/slab.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/include/linux/slab.h 2010-07-07 09:04:57.000000000 -0400 +diff -urNp linux-2.6.35.4/include/linux/slab.h linux-2.6.35.4/include/linux/slab.h +--- linux-2.6.35.4/include/linux/slab.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/include/linux/slab.h 2010-09-17 20:12:09.000000000 -0400 @@ -11,6 +11,7 @@ #include @@ -45445,9 +46590,9 @@ diff -urNp linux-2.6.34.1/include/linux/slab.h linux-2.6.34.1/include/linux/slab +}) + #endif /* _LINUX_SLAB_H */ -diff -urNp linux-2.6.34.1/include/linux/slub_def.h linux-2.6.34.1/include/linux/slub_def.h ---- linux-2.6.34.1/include/linux/slub_def.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/include/linux/slub_def.h 2010-07-07 09:04:57.000000000 -0400 +diff -urNp linux-2.6.35.4/include/linux/slub_def.h linux-2.6.35.4/include/linux/slub_def.h +--- linux-2.6.35.4/include/linux/slub_def.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/include/linux/slub_def.h 2010-09-17 20:12:09.000000000 -0400 @@ -79,7 +79,7 @@ struct kmem_cache { struct kmem_cache_order_objects max; struct kmem_cache_order_objects min; @@ -45457,9 +46602,9 @@ diff -urNp linux-2.6.34.1/include/linux/slub_def.h linux-2.6.34.1/include/linux/ void (*ctor)(void *); int inuse; /* Offset to metadata */ int align; /* Alignment */ -diff -urNp linux-2.6.34.1/include/linux/sonet.h linux-2.6.34.1/include/linux/sonet.h ---- linux-2.6.34.1/include/linux/sonet.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/include/linux/sonet.h 2010-07-07 09:04:57.000000000 -0400 +diff -urNp linux-2.6.35.4/include/linux/sonet.h linux-2.6.35.4/include/linux/sonet.h +--- linux-2.6.35.4/include/linux/sonet.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/include/linux/sonet.h 2010-09-17 20:12:09.000000000 -0400 @@ -61,7 +61,7 @@ struct sonet_stats { #include @@ -45469,9 +46614,9 @@ diff -urNp linux-2.6.34.1/include/linux/sonet.h linux-2.6.34.1/include/linux/son __SONET_ITEMS #undef __HANDLE_ITEM }; -diff -urNp linux-2.6.34.1/include/linux/suspend.h linux-2.6.34.1/include/linux/suspend.h ---- linux-2.6.34.1/include/linux/suspend.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/include/linux/suspend.h 2010-07-07 09:04:57.000000000 -0400 +diff -urNp linux-2.6.35.4/include/linux/suspend.h linux-2.6.35.4/include/linux/suspend.h +--- linux-2.6.35.4/include/linux/suspend.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/include/linux/suspend.h 2010-09-17 20:12:09.000000000 -0400 @@ -104,15 +104,15 @@ typedef int __bitwise suspend_state_t; * which require special recovery actions in that situation. */ @@ -45560,9 +46705,9 @@ diff -urNp linux-2.6.34.1/include/linux/suspend.h linux-2.6.34.1/include/linux/s static inline int hibernate(void) { return -ENOSYS; } static inline bool system_entering_hibernation(void) { return false; } #endif /* CONFIG_HIBERNATION */ -diff -urNp linux-2.6.34.1/include/linux/sysctl.h linux-2.6.34.1/include/linux/sysctl.h ---- linux-2.6.34.1/include/linux/sysctl.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/include/linux/sysctl.h 2010-07-07 09:04:57.000000000 -0400 +diff -urNp linux-2.6.35.4/include/linux/sysctl.h linux-2.6.35.4/include/linux/sysctl.h +--- linux-2.6.35.4/include/linux/sysctl.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/include/linux/sysctl.h 2010-09-17 20:12:09.000000000 -0400 @@ -155,7 +155,11 @@ enum KERN_PANIC_ON_NMI=76, /* int: whether we will panic on an unrecovered */ }; @@ -45576,10 +46721,10 @@ diff -urNp linux-2.6.34.1/include/linux/sysctl.h linux-2.6.34.1/include/linux/sy /* CTL_VM names: */ enum -diff -urNp linux-2.6.34.1/include/linux/sysfs.h linux-2.6.34.1/include/linux/sysfs.h ---- linux-2.6.34.1/include/linux/sysfs.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/include/linux/sysfs.h 2010-07-07 09:04:57.000000000 -0400 -@@ -113,8 +113,8 @@ struct bin_attribute { +diff -urNp linux-2.6.35.4/include/linux/sysfs.h linux-2.6.35.4/include/linux/sysfs.h +--- linux-2.6.35.4/include/linux/sysfs.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/include/linux/sysfs.h 2010-09-17 20:12:09.000000000 -0400 +@@ -115,8 +115,8 @@ struct bin_attribute { #define sysfs_bin_attr_init(bin_attr) sysfs_attr_init(&(bin_attr)->attr) struct sysfs_ops { @@ -45590,9 +46735,9 @@ diff -urNp linux-2.6.34.1/include/linux/sysfs.h linux-2.6.34.1/include/linux/sys }; struct sysfs_dirent; -diff -urNp linux-2.6.34.1/include/linux/thread_info.h linux-2.6.34.1/include/linux/thread_info.h ---- linux-2.6.34.1/include/linux/thread_info.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/include/linux/thread_info.h 2010-07-07 09:04:57.000000000 -0400 +diff -urNp linux-2.6.35.4/include/linux/thread_info.h linux-2.6.35.4/include/linux/thread_info.h +--- linux-2.6.35.4/include/linux/thread_info.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/include/linux/thread_info.h 2010-09-17 20:12:09.000000000 -0400 @@ -23,7 +23,7 @@ struct restart_block { }; /* For futex_wait and futex_wait_requeue_pi */ @@ -45602,9 +46747,9 @@ diff -urNp linux-2.6.34.1/include/linux/thread_info.h linux-2.6.34.1/include/lin u32 val; u32 flags; u32 bitset; -diff -urNp linux-2.6.34.1/include/linux/tty.h linux-2.6.34.1/include/linux/tty.h ---- linux-2.6.34.1/include/linux/tty.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/include/linux/tty.h 2010-07-07 09:04:57.000000000 -0400 +diff -urNp linux-2.6.35.4/include/linux/tty.h linux-2.6.35.4/include/linux/tty.h +--- linux-2.6.35.4/include/linux/tty.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/include/linux/tty.h 2010-09-17 20:12:09.000000000 -0400 @@ -13,6 +13,7 @@ #include #include @@ -45613,7 +46758,7 @@ diff -urNp linux-2.6.34.1/include/linux/tty.h linux-2.6.34.1/include/linux/tty.h #include -@@ -452,7 +453,6 @@ extern int tty_perform_flush(struct tty_ +@@ -453,7 +454,6 @@ extern int tty_perform_flush(struct tty_ extern dev_t tty_devnum(struct tty_struct *tty); extern void proc_clear_tty(struct task_struct *p); extern struct tty_struct *get_current_tty(void); @@ -45621,7 +46766,7 @@ diff -urNp linux-2.6.34.1/include/linux/tty.h linux-2.6.34.1/include/linux/tty.h extern struct tty_struct *alloc_tty_struct(void); extern void free_tty_struct(struct tty_struct *tty); extern void initialize_tty_struct(struct tty_struct *tty, -@@ -513,6 +513,18 @@ extern void tty_ldisc_begin(void); +@@ -514,6 +514,18 @@ extern void tty_ldisc_begin(void); /* This last one is just for the tty layer internals and shouldn't be used elsewhere */ extern void tty_ldisc_enable(struct tty_struct *tty); @@ -45640,9 +46785,9 @@ diff -urNp linux-2.6.34.1/include/linux/tty.h linux-2.6.34.1/include/linux/tty.h /* n_tty.c */ extern struct tty_ldisc_ops tty_ldisc_N_TTY; -diff -urNp linux-2.6.34.1/include/linux/tty_ldisc.h linux-2.6.34.1/include/linux/tty_ldisc.h ---- linux-2.6.34.1/include/linux/tty_ldisc.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/include/linux/tty_ldisc.h 2010-07-07 09:04:57.000000000 -0400 +diff -urNp linux-2.6.35.4/include/linux/tty_ldisc.h linux-2.6.35.4/include/linux/tty_ldisc.h +--- linux-2.6.35.4/include/linux/tty_ldisc.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/include/linux/tty_ldisc.h 2010-09-17 20:12:09.000000000 -0400 @@ -147,7 +147,7 @@ struct tty_ldisc_ops { struct module *owner; @@ -45652,16 +46797,16 @@ diff -urNp linux-2.6.34.1/include/linux/tty_ldisc.h linux-2.6.34.1/include/linux }; struct tty_ldisc { -diff -urNp linux-2.6.34.1/include/linux/types.h linux-2.6.34.1/include/linux/types.h ---- linux-2.6.34.1/include/linux/types.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/include/linux/types.h 2010-07-07 09:04:57.000000000 -0400 +diff -urNp linux-2.6.35.4/include/linux/types.h linux-2.6.35.4/include/linux/types.h +--- linux-2.6.35.4/include/linux/types.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/include/linux/types.h 2010-09-17 20:12:09.000000000 -0400 @@ -191,10 +191,26 @@ typedef struct { - volatile int counter; + int counter; } atomic_t; +#ifdef CONFIG_PAX_REFCOUNT +typedef struct { -+ volatile int counter; ++ int counter; +} atomic_unchecked_t; +#else +typedef atomic_t atomic_unchecked_t; @@ -45669,12 +46814,12 @@ diff -urNp linux-2.6.34.1/include/linux/types.h linux-2.6.34.1/include/linux/typ + #ifdef CONFIG_64BIT typedef struct { - volatile long counter; + long counter; } atomic64_t; + +#ifdef CONFIG_PAX_REFCOUNT +typedef struct { -+ volatile long counter; ++ long counter; +} atomic64_unchecked_t; +#else +typedef atomic64_t atomic64_unchecked_t; @@ -45682,9 +46827,9 @@ diff -urNp linux-2.6.34.1/include/linux/types.h linux-2.6.34.1/include/linux/typ #endif struct ustat { -diff -urNp linux-2.6.34.1/include/linux/uaccess.h linux-2.6.34.1/include/linux/uaccess.h ---- linux-2.6.34.1/include/linux/uaccess.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/include/linux/uaccess.h 2010-07-07 09:04:57.000000000 -0400 +diff -urNp linux-2.6.35.4/include/linux/uaccess.h linux-2.6.35.4/include/linux/uaccess.h +--- linux-2.6.35.4/include/linux/uaccess.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/include/linux/uaccess.h 2010-09-17 20:12:09.000000000 -0400 @@ -76,11 +76,11 @@ static inline unsigned long __copy_from_ long ret; \ mm_segment_t old_fs = get_fs(); \ @@ -45720,9 +46865,30 @@ diff -urNp linux-2.6.34.1/include/linux/uaccess.h linux-2.6.34.1/include/linux/u +extern long notrace __probe_kernel_write(void *dst, const void *src, size_t size); #endif /* __LINUX_UACCESS_H__ */ -diff -urNp linux-2.6.34.1/include/linux/vmalloc.h linux-2.6.34.1/include/linux/vmalloc.h ---- linux-2.6.34.1/include/linux/vmalloc.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/include/linux/vmalloc.h 2010-07-07 09:04:57.000000000 -0400 +diff -urNp linux-2.6.35.4/include/linux/usb/hcd.h linux-2.6.35.4/include/linux/usb/hcd.h +--- linux-2.6.35.4/include/linux/usb/hcd.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/include/linux/usb/hcd.h 2010-09-17 20:12:09.000000000 -0400 +@@ -559,7 +559,7 @@ struct usb_mon_operations { + /* void (*urb_unlink)(struct usb_bus *bus, struct urb *urb); */ + }; + +-extern struct usb_mon_operations *mon_ops; ++extern const struct usb_mon_operations *mon_ops; + + static inline void usbmon_urb_submit(struct usb_bus *bus, struct urb *urb) + { +@@ -581,7 +581,7 @@ static inline void usbmon_urb_complete(s + (*mon_ops->urb_complete)(bus, urb, status); + } + +-int usb_mon_register(struct usb_mon_operations *ops); ++int usb_mon_register(const struct usb_mon_operations *ops); + void usb_mon_deregister(void); + + #else +diff -urNp linux-2.6.35.4/include/linux/vmalloc.h linux-2.6.35.4/include/linux/vmalloc.h +--- linux-2.6.35.4/include/linux/vmalloc.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/include/linux/vmalloc.h 2010-09-17 20:12:09.000000000 -0400 @@ -13,6 +13,11 @@ struct vm_area_struct; /* vma defining #define VM_MAP 0x00000004 /* vmap()ed pages */ #define VM_USERMAP 0x00000008 /* suitable for remap_vmalloc_range */ @@ -45817,9 +46983,66 @@ diff -urNp linux-2.6.34.1/include/linux/vmalloc.h linux-2.6.34.1/include/linux/v +}) + #endif /* _LINUX_VMALLOC_H */ -diff -urNp linux-2.6.34.1/include/net/irda/ircomm_tty.h linux-2.6.34.1/include/net/irda/ircomm_tty.h ---- linux-2.6.34.1/include/net/irda/ircomm_tty.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/include/net/irda/ircomm_tty.h 2010-07-07 09:04:57.000000000 -0400 +diff -urNp linux-2.6.35.4/include/linux/vmstat.h linux-2.6.35.4/include/linux/vmstat.h +--- linux-2.6.35.4/include/linux/vmstat.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/include/linux/vmstat.h 2010-09-17 20:12:09.000000000 -0400 +@@ -140,18 +140,18 @@ static inline void vm_events_fold_cpu(in + /* + * Zone based page accounting with per cpu differentials. + */ +-extern atomic_long_t vm_stat[NR_VM_ZONE_STAT_ITEMS]; ++extern atomic_long_unchecked_t vm_stat[NR_VM_ZONE_STAT_ITEMS]; + + static inline void zone_page_state_add(long x, struct zone *zone, + enum zone_stat_item item) + { +- atomic_long_add(x, &zone->vm_stat[item]); +- atomic_long_add(x, &vm_stat[item]); ++ atomic_long_add_unchecked(x, &zone->vm_stat[item]); ++ atomic_long_add_unchecked(x, &vm_stat[item]); + } + + static inline unsigned long global_page_state(enum zone_stat_item item) + { +- long x = atomic_long_read(&vm_stat[item]); ++ long x = atomic_long_read_unchecked(&vm_stat[item]); + #ifdef CONFIG_SMP + if (x < 0) + x = 0; +@@ -162,7 +162,7 @@ static inline unsigned long global_page_ + static inline unsigned long zone_page_state(struct zone *zone, + enum zone_stat_item item) + { +- long x = atomic_long_read(&zone->vm_stat[item]); ++ long x = atomic_long_read_unchecked(&zone->vm_stat[item]); + #ifdef CONFIG_SMP + if (x < 0) + x = 0; +@@ -246,8 +246,8 @@ static inline void __mod_zone_page_state + + static inline void __inc_zone_state(struct zone *zone, enum zone_stat_item item) + { +- atomic_long_inc(&zone->vm_stat[item]); +- atomic_long_inc(&vm_stat[item]); ++ atomic_long_inc_unchecked(&zone->vm_stat[item]); ++ atomic_long_inc_unchecked(&vm_stat[item]); + } + + static inline void __inc_zone_page_state(struct page *page, +@@ -258,8 +258,8 @@ static inline void __inc_zone_page_state + + static inline void __dec_zone_state(struct zone *zone, enum zone_stat_item item) + { +- atomic_long_dec(&zone->vm_stat[item]); +- atomic_long_dec(&vm_stat[item]); ++ atomic_long_dec_unchecked(&zone->vm_stat[item]); ++ atomic_long_dec_unchecked(&vm_stat[item]); + } + + static inline void __dec_zone_page_state(struct page *page, +diff -urNp linux-2.6.35.4/include/net/irda/ircomm_tty.h linux-2.6.35.4/include/net/irda/ircomm_tty.h +--- linux-2.6.35.4/include/net/irda/ircomm_tty.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/include/net/irda/ircomm_tty.h 2010-09-17 20:12:09.000000000 -0400 @@ -105,8 +105,8 @@ struct ircomm_tty_cb { unsigned short close_delay; unsigned short closing_wait; /* time to wait before closing */ @@ -45831,9 +47054,9 @@ diff -urNp linux-2.6.34.1/include/net/irda/ircomm_tty.h linux-2.6.34.1/include/n /* Protect concurent access to : * o self->open_count -diff -urNp linux-2.6.34.1/include/net/neighbour.h linux-2.6.34.1/include/net/neighbour.h ---- linux-2.6.34.1/include/net/neighbour.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/include/net/neighbour.h 2010-07-07 09:04:57.000000000 -0400 +diff -urNp linux-2.6.35.4/include/net/neighbour.h linux-2.6.35.4/include/net/neighbour.h +--- linux-2.6.35.4/include/net/neighbour.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/include/net/neighbour.h 2010-09-17 20:12:09.000000000 -0400 @@ -116,12 +116,12 @@ struct neighbour { struct neigh_ops { @@ -45853,9 +47076,9 @@ diff -urNp linux-2.6.34.1/include/net/neighbour.h linux-2.6.34.1/include/net/nei }; struct pneigh_entry { -diff -urNp linux-2.6.34.1/include/net/sctp/sctp.h linux-2.6.34.1/include/net/sctp/sctp.h ---- linux-2.6.34.1/include/net/sctp/sctp.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/include/net/sctp/sctp.h 2010-07-07 09:04:57.000000000 -0400 +diff -urNp linux-2.6.35.4/include/net/sctp/sctp.h linux-2.6.35.4/include/net/sctp/sctp.h +--- linux-2.6.35.4/include/net/sctp/sctp.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/include/net/sctp/sctp.h 2010-09-17 20:12:09.000000000 -0400 @@ -305,8 +305,8 @@ extern int sctp_debug_flag; #else /* SCTP_DEBUG */ @@ -45867,10 +47090,10 @@ diff -urNp linux-2.6.34.1/include/net/sctp/sctp.h linux-2.6.34.1/include/net/sct #define SCTP_ENABLE_DEBUG #define SCTP_DISABLE_DEBUG #define SCTP_ASSERT(expr, str, func) -diff -urNp linux-2.6.34.1/include/net/tcp.h linux-2.6.34.1/include/net/tcp.h ---- linux-2.6.34.1/include/net/tcp.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/include/net/tcp.h 2010-07-07 09:04:57.000000000 -0400 -@@ -1395,6 +1395,7 @@ enum tcp_seq_states { +diff -urNp linux-2.6.35.4/include/net/tcp.h linux-2.6.35.4/include/net/tcp.h +--- linux-2.6.35.4/include/net/tcp.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/include/net/tcp.h 2010-09-17 20:12:09.000000000 -0400 +@@ -1404,6 +1404,7 @@ enum tcp_seq_states { struct tcp_seq_afinfo { char *name; sa_family_t family; @@ -45878,9 +47101,9 @@ diff -urNp linux-2.6.34.1/include/net/tcp.h linux-2.6.34.1/include/net/tcp.h struct file_operations seq_fops; struct seq_operations seq_ops; }; -diff -urNp linux-2.6.34.1/include/net/udp.h linux-2.6.34.1/include/net/udp.h ---- linux-2.6.34.1/include/net/udp.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/include/net/udp.h 2010-07-07 09:04:57.000000000 -0400 +diff -urNp linux-2.6.35.4/include/net/udp.h linux-2.6.35.4/include/net/udp.h +--- linux-2.6.35.4/include/net/udp.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/include/net/udp.h 2010-09-17 20:12:09.000000000 -0400 @@ -221,6 +221,7 @@ struct udp_seq_afinfo { char *name; sa_family_t family; @@ -45889,9 +47112,9 @@ diff -urNp linux-2.6.34.1/include/net/udp.h linux-2.6.34.1/include/net/udp.h struct file_operations seq_fops; struct seq_operations seq_ops; }; -diff -urNp linux-2.6.34.1/include/sound/ac97_codec.h linux-2.6.34.1/include/sound/ac97_codec.h ---- linux-2.6.34.1/include/sound/ac97_codec.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/include/sound/ac97_codec.h 2010-07-07 09:04:57.000000000 -0400 +diff -urNp linux-2.6.35.4/include/sound/ac97_codec.h linux-2.6.35.4/include/sound/ac97_codec.h +--- linux-2.6.35.4/include/sound/ac97_codec.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/include/sound/ac97_codec.h 2010-09-17 20:12:09.000000000 -0400 @@ -419,15 +419,15 @@ struct snd_ac97; @@ -45924,9 +47147,9 @@ diff -urNp linux-2.6.34.1/include/sound/ac97_codec.h linux-2.6.34.1/include/soun void *private_data; void (*private_free) (struct snd_ac97 *ac97); /* --- */ -diff -urNp linux-2.6.34.1/include/trace/events/irq.h linux-2.6.34.1/include/trace/events/irq.h ---- linux-2.6.34.1/include/trace/events/irq.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/include/trace/events/irq.h 2010-07-07 09:04:57.000000000 -0400 +diff -urNp linux-2.6.35.4/include/trace/events/irq.h linux-2.6.35.4/include/trace/events/irq.h +--- linux-2.6.35.4/include/trace/events/irq.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/include/trace/events/irq.h 2010-09-17 20:12:09.000000000 -0400 @@ -34,7 +34,7 @@ */ TRACE_EVENT(irq_handler_entry, @@ -45972,9 +47195,9 @@ diff -urNp linux-2.6.34.1/include/trace/events/irq.h linux-2.6.34.1/include/trac TP_ARGS(h, vec) ); -diff -urNp linux-2.6.34.1/include/video/uvesafb.h linux-2.6.34.1/include/video/uvesafb.h ---- linux-2.6.34.1/include/video/uvesafb.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/include/video/uvesafb.h 2010-07-07 09:04:57.000000000 -0400 +diff -urNp linux-2.6.35.4/include/video/uvesafb.h linux-2.6.35.4/include/video/uvesafb.h +--- linux-2.6.35.4/include/video/uvesafb.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/include/video/uvesafb.h 2010-09-17 20:12:09.000000000 -0400 @@ -177,6 +177,7 @@ struct uvesafb_par { u8 ypan; /* 0 - nothing, 1 - ypan, 2 - ywrap */ u8 pmi_setpal; /* PMI for palette changes */ @@ -45983,21 +47206,9 @@ diff -urNp linux-2.6.34.1/include/video/uvesafb.h linux-2.6.34.1/include/video/u void *pmi_start; void *pmi_pal; u8 *vbe_state_orig; /* -diff -urNp linux-2.6.34.1/init/Kconfig linux-2.6.34.1/init/Kconfig ---- linux-2.6.34.1/init/Kconfig 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/init/Kconfig 2010-07-07 09:04:57.000000000 -0400 -@@ -1029,7 +1029,7 @@ config SLUB_DEBUG - - config COMPAT_BRK - bool "Disable heap randomization" -- default y -+ default n - help - Randomizing heap placement makes heap exploits harder, but it - also breaks ancient binaries (including anything libc5 based). -diff -urNp linux-2.6.34.1/init/do_mounts.c linux-2.6.34.1/init/do_mounts.c ---- linux-2.6.34.1/init/do_mounts.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/init/do_mounts.c 2010-07-07 09:04:57.000000000 -0400 +diff -urNp linux-2.6.35.4/init/do_mounts.c linux-2.6.35.4/init/do_mounts.c +--- linux-2.6.35.4/init/do_mounts.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/init/do_mounts.c 2010-09-17 20:12:09.000000000 -0400 @@ -217,11 +217,11 @@ static void __init get_fs_names(char *pa static int __init do_mount_root(char *name, char *fs, int flags, void *data) @@ -46043,9 +47254,9 @@ diff -urNp linux-2.6.34.1/init/do_mounts.c linux-2.6.34.1/init/do_mounts.c + sys_mount((__force char __user *)".", (__force char __user *)"/", NULL, MS_MOVE, NULL); + sys_chroot((__force char __user *)"."); } -diff -urNp linux-2.6.34.1/init/do_mounts.h linux-2.6.34.1/init/do_mounts.h ---- linux-2.6.34.1/init/do_mounts.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/init/do_mounts.h 2010-07-07 09:04:57.000000000 -0400 +diff -urNp linux-2.6.35.4/init/do_mounts.h linux-2.6.35.4/init/do_mounts.h +--- linux-2.6.35.4/init/do_mounts.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/init/do_mounts.h 2010-09-17 20:12:09.000000000 -0400 @@ -15,15 +15,15 @@ extern int root_mountflags; static inline int create_dev(char *name, dev_t dev) @@ -46065,9 +47276,9 @@ diff -urNp linux-2.6.34.1/init/do_mounts.h linux-2.6.34.1/init/do_mounts.h return 0; if (!S_ISBLK(stat.st_mode)) return 0; -diff -urNp linux-2.6.34.1/init/do_mounts_initrd.c linux-2.6.34.1/init/do_mounts_initrd.c ---- linux-2.6.34.1/init/do_mounts_initrd.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/init/do_mounts_initrd.c 2010-07-07 09:04:57.000000000 -0400 +diff -urNp linux-2.6.35.4/init/do_mounts_initrd.c linux-2.6.35.4/init/do_mounts_initrd.c +--- linux-2.6.35.4/init/do_mounts_initrd.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/init/do_mounts_initrd.c 2010-09-17 20:12:09.000000000 -0400 @@ -43,13 +43,13 @@ static void __init handle_initrd(void) create_dev("/dev/root.old", Root_RAM0); /* mount initrd on rootfs' /root */ @@ -46142,9 +47353,9 @@ diff -urNp linux-2.6.34.1/init/do_mounts_initrd.c linux-2.6.34.1/init/do_mounts_ + sys_unlink((__force const char __user *)"/initrd.image"); return 0; } -diff -urNp linux-2.6.34.1/init/do_mounts_md.c linux-2.6.34.1/init/do_mounts_md.c ---- linux-2.6.34.1/init/do_mounts_md.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/init/do_mounts_md.c 2010-07-07 09:04:57.000000000 -0400 +diff -urNp linux-2.6.35.4/init/do_mounts_md.c linux-2.6.35.4/init/do_mounts_md.c +--- linux-2.6.35.4/init/do_mounts_md.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/init/do_mounts_md.c 2010-09-17 20:12:09.000000000 -0400 @@ -170,7 +170,7 @@ static void __init md_setup_drive(void) partitioned ? "_d" : "", minor, md_setup_args[ent].device_names); @@ -46172,9 +47383,9 @@ diff -urNp linux-2.6.34.1/init/do_mounts_md.c linux-2.6.34.1/init/do_mounts_md.c if (fd >= 0) { sys_ioctl(fd, RAID_AUTORUN, raid_autopart); sys_close(fd); -diff -urNp linux-2.6.34.1/init/initramfs.c linux-2.6.34.1/init/initramfs.c ---- linux-2.6.34.1/init/initramfs.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/init/initramfs.c 2010-07-07 09:04:57.000000000 -0400 +diff -urNp linux-2.6.35.4/init/initramfs.c linux-2.6.35.4/init/initramfs.c +--- linux-2.6.35.4/init/initramfs.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/init/initramfs.c 2010-09-17 20:12:09.000000000 -0400 @@ -74,7 +74,7 @@ static void __init free_hash(void) } } @@ -46283,10 +47494,22 @@ diff -urNp linux-2.6.34.1/init/initramfs.c linux-2.6.34.1/init/initramfs.c state = SkipIt; next_state = Reset; return 0; -diff -urNp linux-2.6.34.1/init/main.c linux-2.6.34.1/init/main.c ---- linux-2.6.34.1/init/main.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/init/main.c 2010-07-07 09:04:57.000000000 -0400 -@@ -97,6 +97,7 @@ static inline void mark_rodata_ro(void) +diff -urNp linux-2.6.35.4/init/Kconfig linux-2.6.35.4/init/Kconfig +--- linux-2.6.35.4/init/Kconfig 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/init/Kconfig 2010-09-17 20:12:09.000000000 -0400 +@@ -1063,7 +1063,7 @@ config SLUB_DEBUG + + config COMPAT_BRK + bool "Disable heap randomization" +- default y ++ default n + help + Randomizing heap placement makes heap exploits harder, but it + also breaks ancient binaries (including anything libc5 based). +diff -urNp linux-2.6.35.4/init/main.c linux-2.6.35.4/init/main.c +--- linux-2.6.35.4/init/main.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/init/main.c 2010-09-17 20:12:37.000000000 -0400 +@@ -98,6 +98,7 @@ static inline void mark_rodata_ro(void) #ifdef CONFIG_TC extern void tc_init(void); #endif @@ -46294,7 +47517,7 @@ diff -urNp linux-2.6.34.1/init/main.c linux-2.6.34.1/init/main.c enum system_states system_state __read_mostly; EXPORT_SYMBOL(system_state); -@@ -197,6 +198,50 @@ static int __init set_reset_devices(char +@@ -200,6 +201,50 @@ static int __init set_reset_devices(char __setup("reset_devices", set_reset_devices); @@ -46345,7 +47568,7 @@ diff -urNp linux-2.6.34.1/init/main.c linux-2.6.34.1/init/main.c static char * argv_init[MAX_INIT_ARGS+2] = { "init", NULL, }; char * envp_init[MAX_INIT_ENVS+2] = { "HOME=/", "TERM=linux", NULL, }; static const char *panic_later, *panic_param; -@@ -713,52 +758,53 @@ int initcall_debug; +@@ -725,52 +770,53 @@ int initcall_debug; core_param(initcall_debug, initcall_debug, bool, 0644); static char msgbuf[64]; @@ -46415,7 +47638,7 @@ diff -urNp linux-2.6.34.1/init/main.c linux-2.6.34.1/init/main.c } -@@ -886,7 +932,7 @@ static int __init kernel_init(void * unu +@@ -902,7 +948,7 @@ static int __init kernel_init(void * unu do_basic_setup(); /* Open the /dev/console on the rootfs, this should never fail */ @@ -46424,7 +47647,7 @@ diff -urNp linux-2.6.34.1/init/main.c linux-2.6.34.1/init/main.c printk(KERN_WARNING "Warning: unable to open an initial console.\n"); (void) sys_dup(0); -@@ -899,11 +945,13 @@ static int __init kernel_init(void * unu +@@ -915,11 +961,13 @@ static int __init kernel_init(void * unu if (!ramdisk_execute_command) ramdisk_execute_command = "/init"; @@ -46439,9 +47662,9 @@ diff -urNp linux-2.6.34.1/init/main.c linux-2.6.34.1/init/main.c /* * Ok, we have completed the initial bootup, and * we're essentially up and running. Get rid of the -diff -urNp linux-2.6.34.1/init/noinitramfs.c linux-2.6.34.1/init/noinitramfs.c ---- linux-2.6.34.1/init/noinitramfs.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/init/noinitramfs.c 2010-07-07 09:04:57.000000000 -0400 +diff -urNp linux-2.6.35.4/init/noinitramfs.c linux-2.6.35.4/init/noinitramfs.c +--- linux-2.6.35.4/init/noinitramfs.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/init/noinitramfs.c 2010-09-17 20:12:09.000000000 -0400 @@ -29,17 +29,17 @@ static int __init default_rootfs(void) { int err; @@ -46463,9 +47686,9 @@ diff -urNp linux-2.6.34.1/init/noinitramfs.c linux-2.6.34.1/init/noinitramfs.c if (err < 0) goto out; -diff -urNp linux-2.6.34.1/ipc/mqueue.c linux-2.6.34.1/ipc/mqueue.c ---- linux-2.6.34.1/ipc/mqueue.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/ipc/mqueue.c 2010-07-07 09:04:57.000000000 -0400 +diff -urNp linux-2.6.35.4/ipc/mqueue.c linux-2.6.35.4/ipc/mqueue.c +--- linux-2.6.35.4/ipc/mqueue.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/ipc/mqueue.c 2010-09-17 20:12:37.000000000 -0400 @@ -153,6 +153,7 @@ static struct inode *mqueue_get_inode(st mq_bytes = (mq_msg_tblsz + (info->attr.mq_maxmsg * info->attr.mq_msgsize)); @@ -46474,9 +47697,9 @@ diff -urNp linux-2.6.34.1/ipc/mqueue.c linux-2.6.34.1/ipc/mqueue.c spin_lock(&mq_lock); if (u->mq_bytes + mq_bytes < u->mq_bytes || u->mq_bytes + mq_bytes > -diff -urNp linux-2.6.34.1/ipc/shm.c linux-2.6.34.1/ipc/shm.c ---- linux-2.6.34.1/ipc/shm.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/ipc/shm.c 2010-07-07 09:04:57.000000000 -0400 +diff -urNp linux-2.6.35.4/ipc/shm.c linux-2.6.35.4/ipc/shm.c +--- linux-2.6.35.4/ipc/shm.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/ipc/shm.c 2010-09-17 20:12:37.000000000 -0400 @@ -69,6 +69,14 @@ static void shm_destroy (struct ipc_name static int sysvipc_shm_proc_show(struct seq_file *s, void *it); #endif @@ -46492,7 +47715,7 @@ diff -urNp linux-2.6.34.1/ipc/shm.c linux-2.6.34.1/ipc/shm.c void shm_init_ns(struct ipc_namespace *ns) { ns->shm_ctlmax = SHMMAX; -@@ -398,6 +406,14 @@ static int newseg(struct ipc_namespace * +@@ -395,6 +403,14 @@ static int newseg(struct ipc_namespace * shp->shm_lprid = 0; shp->shm_atim = shp->shm_dtim = 0; shp->shm_ctim = get_seconds(); @@ -46507,7 +47730,7 @@ diff -urNp linux-2.6.34.1/ipc/shm.c linux-2.6.34.1/ipc/shm.c shp->shm_segsz = size; shp->shm_nattch = 0; shp->shm_file = file; -@@ -880,9 +896,21 @@ long do_shmat(int shmid, char __user *sh +@@ -877,9 +893,21 @@ long do_shmat(int shmid, char __user *sh if (err) goto out_unlock; @@ -46529,10 +47752,10 @@ diff -urNp linux-2.6.34.1/ipc/shm.c linux-2.6.34.1/ipc/shm.c size = i_size_read(path.dentry->d_inode); shm_unlock(shp); -diff -urNp linux-2.6.34.1/kernel/acct.c linux-2.6.34.1/kernel/acct.c ---- linux-2.6.34.1/kernel/acct.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/kernel/acct.c 2010-07-07 09:04:57.000000000 -0400 -@@ -580,7 +580,7 @@ static void do_acct_process(struct bsd_a +diff -urNp linux-2.6.35.4/kernel/acct.c linux-2.6.35.4/kernel/acct.c +--- linux-2.6.35.4/kernel/acct.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/kernel/acct.c 2010-09-17 20:12:09.000000000 -0400 +@@ -570,7 +570,7 @@ static void do_acct_process(struct bsd_a */ flim = current->signal->rlim[RLIMIT_FSIZE].rlim_cur; current->signal->rlim[RLIMIT_FSIZE].rlim_cur = RLIM_INFINITY; @@ -46541,10 +47764,10 @@ diff -urNp linux-2.6.34.1/kernel/acct.c linux-2.6.34.1/kernel/acct.c sizeof(acct_t), &file->f_pos); current->signal->rlim[RLIMIT_FSIZE].rlim_cur = flim; set_fs(fs); -diff -urNp linux-2.6.34.1/kernel/capability.c linux-2.6.34.1/kernel/capability.c ---- linux-2.6.34.1/kernel/capability.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/kernel/capability.c 2010-07-07 09:04:57.000000000 -0400 -@@ -206,6 +206,9 @@ SYSCALL_DEFINE2(capget, cap_user_header_ +diff -urNp linux-2.6.35.4/kernel/capability.c linux-2.6.35.4/kernel/capability.c +--- linux-2.6.35.4/kernel/capability.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/kernel/capability.c 2010-09-17 20:12:37.000000000 -0400 +@@ -205,6 +205,9 @@ SYSCALL_DEFINE2(capget, cap_user_header_ * before modification is attempted and the application * fails. */ @@ -46554,7 +47777,7 @@ diff -urNp linux-2.6.34.1/kernel/capability.c linux-2.6.34.1/kernel/capability.c if (copy_to_user(dataptr, kdata, tocopy * sizeof(struct __user_cap_data_struct))) { return -EFAULT; -@@ -307,10 +310,21 @@ int capable(int cap) +@@ -306,10 +309,21 @@ int capable(int cap) BUG(); } @@ -46577,9 +47800,45 @@ diff -urNp linux-2.6.34.1/kernel/capability.c linux-2.6.34.1/kernel/capability.c + EXPORT_SYMBOL(capable); +EXPORT_SYMBOL(capable_nolog); -diff -urNp linux-2.6.34.1/kernel/configs.c linux-2.6.34.1/kernel/configs.c ---- linux-2.6.34.1/kernel/configs.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/kernel/configs.c 2010-07-07 09:04:57.000000000 -0400 +diff -urNp linux-2.6.35.4/kernel/compat.c linux-2.6.35.4/kernel/compat.c +--- linux-2.6.35.4/kernel/compat.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/kernel/compat.c 2010-09-17 20:12:37.000000000 -0400 +@@ -13,6 +13,7 @@ + + #include + #include ++#include + #include + #include + #include +@@ -1137,3 +1138,24 @@ compat_sys_sysinfo(struct compat_sysinfo + + return 0; + } ++ ++/* ++ * Allocate user-space memory for the duration of a single system call, ++ * in order to marshall parameters inside a compat thunk. ++ */ ++void __user *compat_alloc_user_space(unsigned long len) ++{ ++ void __user *ptr; ++ ++ /* If len would occupy more than half of the entire compat space... */ ++ if (unlikely(len > (((compat_uptr_t)~0) >> 1))) ++ return NULL; ++ ++ ptr = arch_compat_alloc_user_space(len); ++ ++ if (unlikely(!access_ok(VERIFY_WRITE, ptr, len))) ++ return NULL; ++ ++ return ptr; ++} ++EXPORT_SYMBOL_GPL(compat_alloc_user_space); +diff -urNp linux-2.6.35.4/kernel/configs.c linux-2.6.35.4/kernel/configs.c +--- linux-2.6.35.4/kernel/configs.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/kernel/configs.c 2010-09-17 20:12:37.000000000 -0400 @@ -73,8 +73,19 @@ static int __init ikconfig_init(void) struct proc_dir_entry *entry; @@ -46600,22 +47859,10 @@ diff -urNp linux-2.6.34.1/kernel/configs.c linux-2.6.34.1/kernel/configs.c if (!entry) return -ENOMEM; -diff -urNp linux-2.6.34.1/kernel/cpu.c linux-2.6.34.1/kernel/cpu.c ---- linux-2.6.34.1/kernel/cpu.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/kernel/cpu.c 2010-07-07 09:04:57.000000000 -0400 -@@ -20,7 +20,7 @@ - /* Serializes the updates to cpu_online_mask, cpu_present_mask */ - static DEFINE_MUTEX(cpu_add_remove_lock); - --static __cpuinitdata RAW_NOTIFIER_HEAD(cpu_chain); -+static RAW_NOTIFIER_HEAD(cpu_chain); - - /* If set, cpu_up and cpu_down will return -EBUSY and do nothing. - * Should always be manipulated under cpu_add_remove_lock -diff -urNp linux-2.6.34.1/kernel/cred.c linux-2.6.34.1/kernel/cred.c ---- linux-2.6.34.1/kernel/cred.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/kernel/cred.c 2010-07-07 09:04:57.000000000 -0400 -@@ -527,6 +527,8 @@ int commit_creds(struct cred *new) +diff -urNp linux-2.6.35.4/kernel/cred.c linux-2.6.35.4/kernel/cred.c +--- linux-2.6.35.4/kernel/cred.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/kernel/cred.c 2010-09-17 20:12:37.000000000 -0400 +@@ -489,6 +489,8 @@ int commit_creds(struct cred *new) get_cred(new); /* we will require a ref for the subj creds too */ @@ -46624,12 +47871,63 @@ diff -urNp linux-2.6.34.1/kernel/cred.c linux-2.6.34.1/kernel/cred.c /* dumpability changes */ if (old->euid != new->euid || old->egid != new->egid || -diff -urNp linux-2.6.34.1/kernel/exit.c linux-2.6.34.1/kernel/exit.c ---- linux-2.6.34.1/kernel/exit.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/kernel/exit.c 2010-07-07 09:04:57.000000000 -0400 -@@ -57,6 +57,10 @@ +diff -urNp linux-2.6.35.4/kernel/debug/debug_core.c linux-2.6.35.4/kernel/debug/debug_core.c +--- linux-2.6.35.4/kernel/debug/debug_core.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/kernel/debug/debug_core.c 2010-09-17 20:12:09.000000000 -0400 +@@ -71,7 +71,7 @@ int kgdb_io_module_registered; + /* Guard for recursive entry */ + static int exception_level; + +-struct kgdb_io *dbg_io_ops; ++const struct kgdb_io *dbg_io_ops; + static DEFINE_SPINLOCK(kgdb_registration_lock); + + /* kgdb console driver is loaded */ +@@ -871,7 +871,7 @@ static void kgdb_initial_breakpoint(void + * + * Register it with the KGDB core. + */ +-int kgdb_register_io_module(struct kgdb_io *new_dbg_io_ops) ++int kgdb_register_io_module(const struct kgdb_io *new_dbg_io_ops) + { + int err; + +@@ -916,7 +916,7 @@ EXPORT_SYMBOL_GPL(kgdb_register_io_modul + * + * Unregister it with the KGDB core. + */ +-void kgdb_unregister_io_module(struct kgdb_io *old_dbg_io_ops) ++void kgdb_unregister_io_module(const struct kgdb_io *old_dbg_io_ops) + { + BUG_ON(kgdb_connected); + +diff -urNp linux-2.6.35.4/kernel/debug/kdb/kdb_main.c linux-2.6.35.4/kernel/debug/kdb/kdb_main.c +--- linux-2.6.35.4/kernel/debug/kdb/kdb_main.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/kernel/debug/kdb/kdb_main.c 2010-09-17 20:12:09.000000000 -0400 +@@ -1872,7 +1872,7 @@ static int kdb_lsmod(int argc, const cha + list_for_each_entry(mod, kdb_modules, list) { + + kdb_printf("%-20s%8u 0x%p ", mod->name, +- mod->core_size, (void *)mod); ++ mod->core_size_rx + mod->core_size_rw, (void *)mod); + #ifdef CONFIG_MODULE_UNLOAD + kdb_printf("%4d ", module_refcount(mod)); + #endif +@@ -1882,7 +1882,7 @@ static int kdb_lsmod(int argc, const cha + kdb_printf(" (Loading)"); + else + kdb_printf(" (Live)"); +- kdb_printf(" 0x%p", mod->module_core); ++ kdb_printf(" 0x%p 0x%p", mod->module_core_rx, mod->module_core_rw); + + #ifdef CONFIG_MODULE_UNLOAD + { +diff -urNp linux-2.6.35.4/kernel/exit.c linux-2.6.35.4/kernel/exit.c +--- linux-2.6.35.4/kernel/exit.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/kernel/exit.c 2010-09-17 20:13:49.000000000 -0400 +@@ -56,6 +56,10 @@ + #include #include - #include "cred-internals.h" +#ifdef CONFIG_GRKERNSEC +extern rwlock_t grsec_exec_file_lock; @@ -46637,8 +47935,8 @@ diff -urNp linux-2.6.34.1/kernel/exit.c linux-2.6.34.1/kernel/exit.c + static void exit_mm(struct task_struct * tsk); - static void __unhash_process(struct task_struct *p) -@@ -170,6 +174,8 @@ void release_task(struct task_struct * p + static void __unhash_process(struct task_struct *p, bool group_dead) +@@ -162,6 +166,8 @@ void release_task(struct task_struct * p struct task_struct *leader; int zap_leader; repeat: @@ -46647,7 +47945,7 @@ diff -urNp linux-2.6.34.1/kernel/exit.c linux-2.6.34.1/kernel/exit.c tracehook_prepare_release_task(p); /* don't need to get the RCU readlock here - the process is dead and * can't be modifying its own credentials. But shut RCU-lockdep up */ -@@ -339,11 +345,22 @@ static void reparent_to_kthreadd(void) +@@ -331,11 +337,22 @@ static void reparent_to_kthreadd(void) { write_lock_irq(&tasklist_lock); @@ -46670,7 +47968,7 @@ diff -urNp linux-2.6.34.1/kernel/exit.c linux-2.6.34.1/kernel/exit.c /* Set the exit signal to SIGCHLD so we signal init on exit */ current->exit_signal = SIGCHLD; -@@ -395,7 +412,7 @@ int allow_signal(int sig) +@@ -387,7 +404,7 @@ int allow_signal(int sig) * know it'll be handled, so that they don't get converted to * SIGKILL or just silently dropped. */ @@ -46679,7 +47977,7 @@ diff -urNp linux-2.6.34.1/kernel/exit.c linux-2.6.34.1/kernel/exit.c recalc_sigpending(); spin_unlock_irq(¤t->sighand->siglock); return 0; -@@ -431,6 +448,17 @@ void daemonize(const char *name, ...) +@@ -423,6 +440,17 @@ void daemonize(const char *name, ...) vsnprintf(current->comm, sizeof(current->comm), name, args); va_end(args); @@ -46697,7 +47995,7 @@ diff -urNp linux-2.6.34.1/kernel/exit.c linux-2.6.34.1/kernel/exit.c /* * If we were started as result of loading a module, close all of the * user space pages. We don't need them, and if we didn't close them -@@ -971,6 +999,9 @@ NORET_TYPE void do_exit(long code) +@@ -960,6 +988,9 @@ NORET_TYPE void do_exit(long code) tsk->exit_code = code; taskstats_exit(tsk, group_dead); @@ -46707,10 +48005,10 @@ diff -urNp linux-2.6.34.1/kernel/exit.c linux-2.6.34.1/kernel/exit.c exit_mm(tsk); if (group_dead) -diff -urNp linux-2.6.34.1/kernel/fork.c linux-2.6.34.1/kernel/fork.c ---- linux-2.6.34.1/kernel/fork.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/kernel/fork.c 2010-07-07 09:04:57.000000000 -0400 -@@ -263,7 +263,7 @@ static struct task_struct *dup_task_stru +diff -urNp linux-2.6.35.4/kernel/fork.c linux-2.6.35.4/kernel/fork.c +--- linux-2.6.35.4/kernel/fork.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/kernel/fork.c 2010-09-17 20:12:37.000000000 -0400 +@@ -276,7 +276,7 @@ static struct task_struct *dup_task_stru *stackend = STACK_END_MAGIC; /* for overflow detection */ #ifdef CONFIG_CC_STACKPROTECTOR @@ -46719,7 +48017,88 @@ diff -urNp linux-2.6.34.1/kernel/fork.c linux-2.6.34.1/kernel/fork.c #endif /* One for us, one for whoever does the "release_task()" (usually parent) */ -@@ -303,8 +303,8 @@ static int dup_mmap(struct mm_struct *mm +@@ -298,13 +298,78 @@ out: + } + + #ifdef CONFIG_MMU ++static struct vm_area_struct *dup_vma(struct mm_struct *mm, struct vm_area_struct *mpnt) ++{ ++ struct vm_area_struct *tmp; ++ unsigned long charge; ++ struct mempolicy *pol; ++ struct file *file; ++ ++ charge = 0; ++ if (mpnt->vm_flags & VM_ACCOUNT) { ++ unsigned int len = (mpnt->vm_end - mpnt->vm_start) >> PAGE_SHIFT; ++ if (security_vm_enough_memory(len)) ++ goto fail_nomem; ++ charge = len; ++ } ++ tmp = kmem_cache_alloc(vm_area_cachep, GFP_KERNEL); ++ if (!tmp) ++ goto fail_nomem; ++ *tmp = *mpnt; ++ tmp->vm_mm = mm; ++ INIT_LIST_HEAD(&tmp->anon_vma_chain); ++ pol = mpol_dup(vma_policy(mpnt)); ++ if (IS_ERR(pol)) ++ goto fail_nomem_policy; ++ vma_set_policy(tmp, pol); ++ if (anon_vma_fork(tmp, mpnt)) ++ goto fail_nomem_anon_vma_fork; ++ tmp->vm_flags &= ~VM_LOCKED; ++ tmp->vm_next = NULL; ++ tmp->vm_mirror = NULL; ++ file = tmp->vm_file; ++ if (file) { ++ struct inode *inode = file->f_path.dentry->d_inode; ++ struct address_space *mapping = file->f_mapping; ++ ++ get_file(file); ++ if (tmp->vm_flags & VM_DENYWRITE) ++ atomic_dec(&inode->i_writecount); ++ spin_lock(&mapping->i_mmap_lock); ++ if (tmp->vm_flags & VM_SHARED) ++ mapping->i_mmap_writable++; ++ tmp->vm_truncate_count = mpnt->vm_truncate_count; ++ flush_dcache_mmap_lock(mapping); ++ /* insert tmp into the share list, just after mpnt */ ++ vma_prio_tree_add(tmp, mpnt); ++ flush_dcache_mmap_unlock(mapping); ++ spin_unlock(&mapping->i_mmap_lock); ++ } ++ ++ /* ++ * Clear hugetlb-related page reserves for children. This only ++ * affects MAP_PRIVATE mappings. Faults generated by the child ++ * are not guaranteed to succeed, even if read-only ++ */ ++ if (is_vm_hugetlb_page(tmp)) ++ reset_vma_resv_huge_pages(tmp); ++ ++ return tmp; ++ ++fail_nomem_anon_vma_fork: ++ mpol_put(pol); ++fail_nomem_policy: ++ kmem_cache_free(vm_area_cachep, tmp); ++fail_nomem: ++ vm_unacct_memory(charge); ++ return NULL; ++} ++ + static int dup_mmap(struct mm_struct *mm, struct mm_struct *oldmm) + { + struct vm_area_struct *mpnt, *tmp, *prev, **pprev; + struct rb_node **rb_link, *rb_parent; + int retval; +- unsigned long charge; +- struct mempolicy *pol; + + down_write(&oldmm->mmap_sem); + flush_cache_dup_mm(oldmm); +@@ -316,8 +381,8 @@ static int dup_mmap(struct mm_struct *mm mm->locked_vm = 0; mm->mmap = NULL; mm->mmap_cache = NULL; @@ -46730,15 +48109,77 @@ diff -urNp linux-2.6.34.1/kernel/fork.c linux-2.6.34.1/kernel/fork.c mm->map_count = 0; cpumask_clear(mm_cpumask(mm)); mm->mm_rb = RB_ROOT; -@@ -347,6 +347,7 @@ static int dup_mmap(struct mm_struct *mm - tmp->vm_flags &= ~VM_LOCKED; - tmp->vm_mm = mm; - tmp->vm_next = NULL; -+ tmp->vm_mirror = NULL; - file = tmp->vm_file; - if (file) { - struct inode *inode = file->f_path.dentry->d_inode; -@@ -393,6 +394,31 @@ static int dup_mmap(struct mm_struct *mm +@@ -330,8 +395,6 @@ static int dup_mmap(struct mm_struct *mm + + prev = NULL; + for (mpnt = oldmm->mmap; mpnt; mpnt = mpnt->vm_next) { +- struct file *file; +- + if (mpnt->vm_flags & VM_DONTCOPY) { + long pages = vma_pages(mpnt); + mm->total_vm -= pages; +@@ -339,56 +402,13 @@ static int dup_mmap(struct mm_struct *mm + -pages); + continue; + } +- charge = 0; +- if (mpnt->vm_flags & VM_ACCOUNT) { +- unsigned int len = (mpnt->vm_end - mpnt->vm_start) >> PAGE_SHIFT; +- if (security_vm_enough_memory(len)) +- goto fail_nomem; +- charge = len; +- } +- tmp = kmem_cache_alloc(vm_area_cachep, GFP_KERNEL); +- if (!tmp) +- goto fail_nomem; +- *tmp = *mpnt; +- INIT_LIST_HEAD(&tmp->anon_vma_chain); +- pol = mpol_dup(vma_policy(mpnt)); +- retval = PTR_ERR(pol); +- if (IS_ERR(pol)) +- goto fail_nomem_policy; +- vma_set_policy(tmp, pol); +- if (anon_vma_fork(tmp, mpnt)) +- goto fail_nomem_anon_vma_fork; +- tmp->vm_flags &= ~VM_LOCKED; +- tmp->vm_mm = mm; +- tmp->vm_next = tmp->vm_prev = NULL; +- file = tmp->vm_file; +- if (file) { +- struct inode *inode = file->f_path.dentry->d_inode; +- struct address_space *mapping = file->f_mapping; +- +- get_file(file); +- if (tmp->vm_flags & VM_DENYWRITE) +- atomic_dec(&inode->i_writecount); +- spin_lock(&mapping->i_mmap_lock); +- if (tmp->vm_flags & VM_SHARED) +- mapping->i_mmap_writable++; +- tmp->vm_truncate_count = mpnt->vm_truncate_count; +- flush_dcache_mmap_lock(mapping); +- /* insert tmp into the share list, just after mpnt */ +- vma_prio_tree_add(tmp, mpnt); +- flush_dcache_mmap_unlock(mapping); +- spin_unlock(&mapping->i_mmap_lock); ++ tmp = dup_vma(mm, mpnt); ++ if (!tmp) { ++ retval = -ENOMEM; ++ goto out; + } + + /* +- * Clear hugetlb-related page reserves for children. This only +- * affects MAP_PRIVATE mappings. Faults generated by the child +- * are not guaranteed to succeed, even if read-only +- */ +- if (is_vm_hugetlb_page(tmp)) +- reset_vma_resv_huge_pages(tmp); +- +- /* + * Link in the new vma and copy the page table entries. + */ + *pprev = tmp; +@@ -409,6 +429,31 @@ static int dup_mmap(struct mm_struct *mm if (retval) goto out; } @@ -46770,7 +48211,22 @@ diff -urNp linux-2.6.34.1/kernel/fork.c linux-2.6.34.1/kernel/fork.c /* a new mm has just been created */ arch_dup_mmap(oldmm, mm); retval = 0; -@@ -744,13 +770,14 @@ static int copy_fs(unsigned long clone_f +@@ -417,14 +462,6 @@ out: + flush_tlb_mm(oldmm); + up_write(&oldmm->mmap_sem); + return retval; +-fail_nomem_anon_vma_fork: +- mpol_put(pol); +-fail_nomem_policy: +- kmem_cache_free(vm_area_cachep, tmp); +-fail_nomem: +- retval = -ENOMEM; +- vm_unacct_memory(charge); +- goto out; + } + + static inline int mm_alloc_pgd(struct mm_struct * mm) +@@ -760,13 +797,14 @@ static int copy_fs(unsigned long clone_f write_unlock(&fs->lock); return -EAGAIN; } @@ -46786,7 +48242,7 @@ diff -urNp linux-2.6.34.1/kernel/fork.c linux-2.6.34.1/kernel/fork.c return 0; } -@@ -1009,10 +1036,13 @@ static struct task_struct *copy_process( +@@ -1019,10 +1057,13 @@ static struct task_struct *copy_process( DEBUG_LOCKS_WARN_ON(!p->softirqs_enabled); #endif retval = -EAGAIN; @@ -46802,7 +48258,7 @@ diff -urNp linux-2.6.34.1/kernel/fork.c linux-2.6.34.1/kernel/fork.c goto bad_fork_free; } -@@ -1168,6 +1198,8 @@ static struct task_struct *copy_process( +@@ -1176,6 +1217,8 @@ static struct task_struct *copy_process( goto bad_fork_free_pid; } @@ -46811,7 +48267,7 @@ diff -urNp linux-2.6.34.1/kernel/fork.c linux-2.6.34.1/kernel/fork.c p->set_child_tid = (clone_flags & CLONE_CHILD_SETTID) ? child_tidptr : NULL; /* * Clear TID on mm_release()? -@@ -1320,6 +1352,8 @@ bad_fork_cleanup_count: +@@ -1328,6 +1371,8 @@ bad_fork_cleanup_count: bad_fork_free: free_task(p); fork_out: @@ -46820,7 +48276,7 @@ diff -urNp linux-2.6.34.1/kernel/fork.c linux-2.6.34.1/kernel/fork.c return ERR_PTR(retval); } -@@ -1413,6 +1447,8 @@ long do_fork(unsigned long clone_flags, +@@ -1433,6 +1478,8 @@ long do_fork(unsigned long clone_flags, if (clone_flags & CLONE_PARENT_SETTID) put_user(nr, parent_tidptr); @@ -46829,7 +48285,7 @@ diff -urNp linux-2.6.34.1/kernel/fork.c linux-2.6.34.1/kernel/fork.c if (clone_flags & CLONE_VFORK) { p->vfork_done = &vfork; init_completion(&vfork); -@@ -1545,7 +1581,7 @@ static int unshare_fs(unsigned long unsh +@@ -1557,7 +1604,7 @@ static int unshare_fs(unsigned long unsh return 0; /* don't need lock here; in the worst case we'll do useless copy */ @@ -46838,7 +48294,7 @@ diff -urNp linux-2.6.34.1/kernel/fork.c linux-2.6.34.1/kernel/fork.c return 0; *new_fsp = copy_fs_struct(fs); -@@ -1668,7 +1704,8 @@ SYSCALL_DEFINE1(unshare, unsigned long, +@@ -1680,7 +1727,8 @@ SYSCALL_DEFINE1(unshare, unsigned long, fs = current->fs; write_lock(&fs->lock); current->fs = new_fs; @@ -46848,9 +48304,9 @@ diff -urNp linux-2.6.34.1/kernel/fork.c linux-2.6.34.1/kernel/fork.c new_fs = NULL; else new_fs = fs; -diff -urNp linux-2.6.34.1/kernel/futex.c linux-2.6.34.1/kernel/futex.c ---- linux-2.6.34.1/kernel/futex.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/kernel/futex.c 2010-07-07 09:04:57.000000000 -0400 +diff -urNp linux-2.6.35.4/kernel/futex.c linux-2.6.35.4/kernel/futex.c +--- linux-2.6.35.4/kernel/futex.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/kernel/futex.c 2010-09-17 20:12:37.000000000 -0400 @@ -54,6 +54,7 @@ #include #include @@ -46871,7 +48327,7 @@ diff -urNp linux-2.6.34.1/kernel/futex.c linux-2.6.34.1/kernel/futex.c /* * The futex address must be "naturally" aligned. */ -@@ -1852,7 +1858,7 @@ retry: +@@ -1843,7 +1849,7 @@ retry: restart = ¤t_thread_info()->restart_block; restart->fn = futex_wait_restart; @@ -46880,19 +48336,17 @@ diff -urNp linux-2.6.34.1/kernel/futex.c linux-2.6.34.1/kernel/futex.c restart->futex.val = val; restart->futex.time = abs_time->tv64; restart->futex.bitset = bitset; -@@ -2385,7 +2391,10 @@ SYSCALL_DEFINE3(get_robust_list, int, pi +@@ -2376,7 +2382,9 @@ SYSCALL_DEFINE3(get_robust_list, int, pi { struct robust_list_head __user *head; unsigned long ret; -- const struct cred *cred = current_cred(), *pcred; +#ifndef CONFIG_GRKERNSEC_PROC_MEMMAP -+ const struct cred *cred = current_cred(); -+ const struct cred *pcred; + const struct cred *cred = current_cred(), *pcred; +#endif if (!futex_cmpxchg_enabled) return -ENOSYS; -@@ -2401,11 +2410,16 @@ SYSCALL_DEFINE3(get_robust_list, int, pi +@@ -2392,11 +2400,16 @@ SYSCALL_DEFINE3(get_robust_list, int, pi if (!p) goto err_unlock; ret = -EPERM; @@ -46909,7 +48363,7 @@ diff -urNp linux-2.6.34.1/kernel/futex.c linux-2.6.34.1/kernel/futex.c head = p->robust_list; rcu_read_unlock(); } -@@ -2467,7 +2481,7 @@ retry: +@@ -2458,7 +2471,7 @@ retry: */ static inline int fetch_robust_entry(struct robust_list __user **entry, struct robust_list __user * __user *head, @@ -46918,9 +48372,9 @@ diff -urNp linux-2.6.34.1/kernel/futex.c linux-2.6.34.1/kernel/futex.c { unsigned long uentry; -diff -urNp linux-2.6.34.1/kernel/futex_compat.c linux-2.6.34.1/kernel/futex_compat.c ---- linux-2.6.34.1/kernel/futex_compat.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/kernel/futex_compat.c 2010-07-07 09:04:57.000000000 -0400 +diff -urNp linux-2.6.35.4/kernel/futex_compat.c linux-2.6.35.4/kernel/futex_compat.c +--- linux-2.6.35.4/kernel/futex_compat.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/kernel/futex_compat.c 2010-09-17 20:12:37.000000000 -0400 @@ -10,6 +10,7 @@ #include #include @@ -46934,8 +48388,8 @@ diff -urNp linux-2.6.34.1/kernel/futex_compat.c linux-2.6.34.1/kernel/futex_comp struct compat_robust_list_head __user *head; unsigned long ret; - const struct cred *cred = current_cred(), *pcred; -+ const struct cred *cred = current_cred(); +#ifndef CONFIG_GRKERNSEC_PROC_MEMMAP ++ const struct cred *cred = current_cred(); + const struct cred *pcred; +#endif @@ -46958,9 +48412,9 @@ diff -urNp linux-2.6.34.1/kernel/futex_compat.c linux-2.6.34.1/kernel/futex_comp head = p->compat_robust_list; rcu_read_unlock(); } -diff -urNp linux-2.6.34.1/kernel/gcov/base.c linux-2.6.34.1/kernel/gcov/base.c ---- linux-2.6.34.1/kernel/gcov/base.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/kernel/gcov/base.c 2010-07-07 09:04:57.000000000 -0400 +diff -urNp linux-2.6.35.4/kernel/gcov/base.c linux-2.6.35.4/kernel/gcov/base.c +--- linux-2.6.35.4/kernel/gcov/base.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/kernel/gcov/base.c 2010-09-17 20:12:09.000000000 -0400 @@ -102,11 +102,6 @@ void gcov_enable_events(void) } @@ -46982,9 +48436,9 @@ diff -urNp linux-2.6.34.1/kernel/gcov/base.c linux-2.6.34.1/kernel/gcov/base.c if (prev) prev->next = info->next; else -diff -urNp linux-2.6.34.1/kernel/hrtimer.c linux-2.6.34.1/kernel/hrtimer.c ---- linux-2.6.34.1/kernel/hrtimer.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/kernel/hrtimer.c 2010-07-07 09:04:57.000000000 -0400 +diff -urNp linux-2.6.35.4/kernel/hrtimer.c linux-2.6.35.4/kernel/hrtimer.c +--- linux-2.6.35.4/kernel/hrtimer.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/kernel/hrtimer.c 2010-09-17 20:12:09.000000000 -0400 @@ -1398,7 +1398,7 @@ void hrtimer_peek_ahead_timers(void) local_irq_restore(flags); } @@ -46994,9 +48448,9 @@ diff -urNp linux-2.6.34.1/kernel/hrtimer.c linux-2.6.34.1/kernel/hrtimer.c { hrtimer_peek_ahead_timers(); } -diff -urNp linux-2.6.34.1/kernel/kallsyms.c linux-2.6.34.1/kernel/kallsyms.c ---- linux-2.6.34.1/kernel/kallsyms.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/kernel/kallsyms.c 2010-07-07 09:04:57.000000000 -0400 +diff -urNp linux-2.6.35.4/kernel/kallsyms.c linux-2.6.35.4/kernel/kallsyms.c +--- linux-2.6.35.4/kernel/kallsyms.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/kernel/kallsyms.c 2010-09-17 20:12:37.000000000 -0400 @@ -11,6 +11,9 @@ * Changed the compression method from stem compression to "table lookup" * compression (see scripts/kallsyms.c for a more complete description) @@ -47007,7 +48461,7 @@ diff -urNp linux-2.6.34.1/kernel/kallsyms.c linux-2.6.34.1/kernel/kallsyms.c #include #include #include -@@ -52,6 +55,9 @@ extern const unsigned long kallsyms_mark +@@ -53,12 +56,33 @@ extern const unsigned long kallsyms_mark static inline int is_kernel_inittext(unsigned long addr) { @@ -47017,34 +48471,60 @@ diff -urNp linux-2.6.34.1/kernel/kallsyms.c linux-2.6.34.1/kernel/kallsyms.c if (addr >= (unsigned long)_sinittext && addr <= (unsigned long)_einittext) return 1; -@@ -68,6 +74,26 @@ static inline int is_kernel_text(unsigne + return 0; + } - static inline int is_kernel(unsigned long addr) - { -+ if (is_kernel_inittext(addr)) -+ return 1; -+ +#if defined(CONFIG_X86_32) && defined(CONFIG_PAX_KERNEXEC) +#ifdef CONFIG_MODULES -+ if ((unsigned long)MODULES_EXEC_VADDR <= ktla_ktva(addr) && ktla_ktva(addr) <= (unsigned long)MODULES_EXEC_END) -+ return 0; ++static inline int is_module_text(unsigned long addr) ++{ ++ if ((unsigned long)MODULES_EXEC_VADDR <= addr && addr <= (unsigned long)MODULES_EXEC_END) ++ return 1; ++ ++ addr = ktla_ktva(addr); ++ return (unsigned long)MODULES_EXEC_VADDR <= addr && addr <= (unsigned long)MODULES_EXEC_END; ++} ++#else ++static inline int is_module_text(unsigned long addr) ++{ ++ return 0; ++} ++#endif +#endif + -+ if (is_kernel_text(addr)) -+ return 1; + static inline int is_kernel_text(unsigned long addr) + { + if ((addr >= (unsigned long)_stext && addr <= (unsigned long)_etext) || +@@ -69,13 +93,28 @@ static inline int is_kernel_text(unsigne + + static inline int is_kernel(unsigned long addr) + { + -+ if (ktla_ktva((unsigned long)_stext) <= addr && addr < ktla_ktva((unsigned long)_etext)) ++#if defined(CONFIG_X86_32) && defined(CONFIG_PAX_KERNEXEC) ++ if (is_kernel_text(addr) || is_kernel_inittext(addr)) + return 1; + -+ if ((addr >= (unsigned long)_sdata && addr <= (unsigned long)_end)) -+ return 1; -+ return in_gate_area_no_task(addr); ++ if (ktla_ktva((unsigned long)_text) <= addr && addr < (unsigned long)_end) ++#else + if (addr >= (unsigned long)_stext && addr <= (unsigned long)_end) +#endif + - if (addr >= (unsigned long)_stext && addr <= (unsigned long)_end) return 1; return in_gate_area_no_task(addr); -@@ -415,7 +441,6 @@ static unsigned long get_ksymbol_core(st + } + + static int is_ksym_addr(unsigned long addr) + { ++ ++#if defined(CONFIG_X86_32) && defined(CONFIG_PAX_KERNEXEC) ++ if (is_module_text(addr)) ++ return 0; ++#endif ++ + if (all_var) + return is_kernel(addr); + +@@ -416,7 +455,6 @@ static unsigned long get_ksymbol_core(st static void reset_iter(struct kallsym_iter *iter, loff_t new_pos) { @@ -47052,7 +48532,7 @@ diff -urNp linux-2.6.34.1/kernel/kallsyms.c linux-2.6.34.1/kernel/kallsyms.c iter->nameoff = get_symbol_offset(new_pos); iter->pos = new_pos; } -@@ -463,6 +488,11 @@ static int s_show(struct seq_file *m, vo +@@ -464,6 +502,11 @@ static int s_show(struct seq_file *m, vo { struct kallsym_iter *iter = m->private; @@ -47064,7 +48544,7 @@ diff -urNp linux-2.6.34.1/kernel/kallsyms.c linux-2.6.34.1/kernel/kallsyms.c /* Some debugging symbols have no name. Ignore them. */ if (!iter->name[0]) return 0; -@@ -503,7 +533,7 @@ static int kallsyms_open(struct inode *i +@@ -504,7 +547,7 @@ static int kallsyms_open(struct inode *i struct kallsym_iter *iter; int ret; @@ -47073,39 +48553,9 @@ diff -urNp linux-2.6.34.1/kernel/kallsyms.c linux-2.6.34.1/kernel/kallsyms.c if (!iter) return -ENOMEM; reset_iter(iter, 0); -diff -urNp linux-2.6.34.1/kernel/kgdb.c linux-2.6.34.1/kernel/kgdb.c ---- linux-2.6.34.1/kernel/kgdb.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/kernel/kgdb.c 2010-07-07 09:04:57.000000000 -0400 -@@ -93,7 +93,7 @@ static int kgdb_io_module_registered; - /* Guard for recursive entry */ - static int exception_level; - --static struct kgdb_io *kgdb_io_ops; -+static const struct kgdb_io *kgdb_io_ops; - static DEFINE_SPINLOCK(kgdb_registration_lock); - - /* kgdb console driver is loaded */ -@@ -1665,7 +1665,7 @@ static void kgdb_initial_breakpoint(void - * - * Register it with the KGDB core. - */ --int kgdb_register_io_module(struct kgdb_io *new_kgdb_io_ops) -+int kgdb_register_io_module(const struct kgdb_io *new_kgdb_io_ops) - { - int err; - -@@ -1710,7 +1710,7 @@ EXPORT_SYMBOL_GPL(kgdb_register_io_modul - * - * Unregister it with the KGDB core. - */ --void kgdb_unregister_io_module(struct kgdb_io *old_kgdb_io_ops) -+void kgdb_unregister_io_module(const struct kgdb_io *old_kgdb_io_ops) - { - BUG_ON(kgdb_connected); - -diff -urNp linux-2.6.34.1/kernel/kmod.c linux-2.6.34.1/kernel/kmod.c ---- linux-2.6.34.1/kernel/kmod.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/kernel/kmod.c 2010-07-07 09:04:57.000000000 -0400 +diff -urNp linux-2.6.35.4/kernel/kmod.c linux-2.6.35.4/kernel/kmod.c +--- linux-2.6.35.4/kernel/kmod.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/kernel/kmod.c 2010-09-17 20:12:37.000000000 -0400 @@ -90,6 +90,18 @@ int __request_module(bool wait, const ch if (ret) return ret; @@ -47125,9 +48575,9 @@ diff -urNp linux-2.6.34.1/kernel/kmod.c linux-2.6.34.1/kernel/kmod.c /* If modprobe needs a service that is in a module, we get a recursive * loop. Limit the number of running kmod threads to max_threads/2 or * MAX_KMOD_CONCURRENT, whichever is the smaller. A cleaner method -diff -urNp linux-2.6.34.1/kernel/kprobes.c linux-2.6.34.1/kernel/kprobes.c ---- linux-2.6.34.1/kernel/kprobes.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/kernel/kprobes.c 2010-07-07 09:04:57.000000000 -0400 +diff -urNp linux-2.6.35.4/kernel/kprobes.c linux-2.6.35.4/kernel/kprobes.c +--- linux-2.6.35.4/kernel/kprobes.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/kernel/kprobes.c 2010-09-17 20:12:09.000000000 -0400 @@ -183,7 +183,7 @@ static kprobe_opcode_t __kprobes *__get_ * kernel image and loaded module images reside. This is required * so x86_64 can correctly handle the %rip-relative fixups. @@ -47146,7 +48596,7 @@ diff -urNp linux-2.6.34.1/kernel/kprobes.c linux-2.6.34.1/kernel/kprobes.c kfree(kip); } return 1; -@@ -1643,7 +1643,7 @@ static int __init init_kprobes(void) +@@ -1709,7 +1709,7 @@ static int __init init_kprobes(void) { int i, err = 0; unsigned long offset = 0, size = 0; @@ -47155,7 +48605,7 @@ diff -urNp linux-2.6.34.1/kernel/kprobes.c linux-2.6.34.1/kernel/kprobes.c const char *symbol_name; void *addr; struct kprobe_blackpoint *kb; -@@ -1769,7 +1769,7 @@ static int __kprobes show_kprobe_addr(st +@@ -1835,7 +1835,7 @@ static int __kprobes show_kprobe_addr(st const char *sym = NULL; unsigned int i = *(loff_t *) v; unsigned long offset = 0; @@ -47164,10 +48614,10 @@ diff -urNp linux-2.6.34.1/kernel/kprobes.c linux-2.6.34.1/kernel/kprobes.c head = &kprobe_table[i]; preempt_disable(); -diff -urNp linux-2.6.34.1/kernel/lockdep.c linux-2.6.34.1/kernel/lockdep.c ---- linux-2.6.34.1/kernel/lockdep.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/kernel/lockdep.c 2010-07-07 09:04:57.000000000 -0400 -@@ -584,6 +584,10 @@ static int static_obj(void *obj) +diff -urNp linux-2.6.35.4/kernel/lockdep.c linux-2.6.35.4/kernel/lockdep.c +--- linux-2.6.35.4/kernel/lockdep.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/kernel/lockdep.c 2010-09-17 20:12:09.000000000 -0400 +@@ -571,6 +571,10 @@ static int static_obj(void *obj) end = (unsigned long) &_end, addr = (unsigned long) obj; @@ -47178,7 +48628,7 @@ diff -urNp linux-2.6.34.1/kernel/lockdep.c linux-2.6.34.1/kernel/lockdep.c /* * static variable? */ -@@ -709,6 +713,7 @@ register_lock_class(struct lockdep_map * +@@ -696,6 +700,7 @@ register_lock_class(struct lockdep_map * if (!static_obj(lock->key)) { debug_locks_off(); printk("INFO: trying to register non-static key.\n"); @@ -47186,9 +48636,9 @@ diff -urNp linux-2.6.34.1/kernel/lockdep.c linux-2.6.34.1/kernel/lockdep.c printk("the code is fine but needs lockdep annotation.\n"); printk("turning off the locking correctness validator.\n"); dump_stack(); -diff -urNp linux-2.6.34.1/kernel/lockdep_proc.c linux-2.6.34.1/kernel/lockdep_proc.c ---- linux-2.6.34.1/kernel/lockdep_proc.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/kernel/lockdep_proc.c 2010-07-07 09:04:57.000000000 -0400 +diff -urNp linux-2.6.35.4/kernel/lockdep_proc.c linux-2.6.35.4/kernel/lockdep_proc.c +--- linux-2.6.35.4/kernel/lockdep_proc.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/kernel/lockdep_proc.c 2010-09-17 20:12:09.000000000 -0400 @@ -39,7 +39,7 @@ static void l_stop(struct seq_file *m, v static void print_name(struct seq_file *m, struct lock_class *class) @@ -47198,20 +48648,20 @@ diff -urNp linux-2.6.34.1/kernel/lockdep_proc.c linux-2.6.34.1/kernel/lockdep_pr const char *name = class->name; if (!name) { -diff -urNp linux-2.6.34.1/kernel/module.c linux-2.6.34.1/kernel/module.c ---- linux-2.6.34.1/kernel/module.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/kernel/module.c 2010-07-07 09:04:57.000000000 -0400 -@@ -89,7 +89,8 @@ static DECLARE_WAIT_QUEUE_HEAD(module_wq - static BLOCKING_NOTIFIER_HEAD(module_notify_list); +diff -urNp linux-2.6.35.4/kernel/module.c linux-2.6.35.4/kernel/module.c +--- linux-2.6.35.4/kernel/module.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/kernel/module.c 2010-09-17 20:12:37.000000000 -0400 +@@ -96,7 +96,8 @@ static BLOCKING_NOTIFIER_HEAD(module_not - /* Bounds of module allocation, for speeding __module_address */ + /* Bounds of module allocation, for speeding __module_address. + * Protected by module_mutex. */ -static unsigned long module_addr_min = -1UL, module_addr_max = 0; +static unsigned long module_addr_min_rw = -1UL, module_addr_max_rw = 0; +static unsigned long module_addr_min_rx = -1UL, module_addr_max_rx = 0; int register_module_notifier(struct notifier_block * nb) { -@@ -245,7 +246,7 @@ bool each_symbol(bool (*fn)(const struct +@@ -250,7 +251,7 @@ bool each_symbol(bool (*fn)(const struct return true; list_for_each_entry_rcu(mod, &modules, list) { @@ -47220,7 +48670,7 @@ diff -urNp linux-2.6.34.1/kernel/module.c linux-2.6.34.1/kernel/module.c { mod->syms, mod->syms + mod->num_syms, mod->crcs, NOT_GPL_ONLY, false }, { mod->gpl_syms, mod->gpl_syms + mod->num_gpl_syms, -@@ -267,7 +268,7 @@ bool each_symbol(bool (*fn)(const struct +@@ -272,7 +273,7 @@ bool each_symbol(bool (*fn)(const struct #endif }; @@ -47229,7 +48679,7 @@ diff -urNp linux-2.6.34.1/kernel/module.c linux-2.6.34.1/kernel/module.c return true; } return false; -@@ -378,7 +379,7 @@ static inline void __percpu *mod_percpu( +@@ -383,7 +384,7 @@ static inline void __percpu *mod_percpu( static int percpu_modalloc(struct module *mod, unsigned long size, unsigned long align) { @@ -47238,7 +48688,7 @@ diff -urNp linux-2.6.34.1/kernel/module.c linux-2.6.34.1/kernel/module.c printk(KERN_WARNING "%s: per-cpu alignment %li > %li\n", mod->name, align, PAGE_SIZE); align = PAGE_SIZE; -@@ -1465,7 +1466,8 @@ static void free_module(struct module *m +@@ -1562,7 +1563,8 @@ static void free_module(struct module *m destroy_params(mod->kp, mod->num_kp); /* This may be NULL, but that's OK */ @@ -47248,7 +48698,7 @@ diff -urNp linux-2.6.34.1/kernel/module.c linux-2.6.34.1/kernel/module.c kfree(mod->args); percpu_modfree(mod); #if defined(CONFIG_MODULE_UNLOAD) -@@ -1473,10 +1475,12 @@ static void free_module(struct module *m +@@ -1570,10 +1572,12 @@ static void free_module(struct module *m free_percpu(mod->refptr); #endif /* Free lock-classes: */ @@ -47263,17 +48713,17 @@ diff -urNp linux-2.6.34.1/kernel/module.c linux-2.6.34.1/kernel/module.c #ifdef CONFIG_MPU update_protections(current->mm); -@@ -1570,7 +1574,9 @@ static int simplify_symbols(Elf_Shdr *se - strtab + sym[i].st_name, mod); +@@ -1670,7 +1674,9 @@ static int simplify_symbols(Elf_Shdr *se + mod); /* Ok if resolved. */ - if (ksym) { + if (ksym && !IS_ERR(ksym)) { + pax_open_kernel(); sym[i].st_value = ksym->value; + pax_close_kernel(); break; } -@@ -1589,7 +1595,9 @@ static int simplify_symbols(Elf_Shdr *se +@@ -1690,7 +1696,9 @@ static int simplify_symbols(Elf_Shdr *se secbase = (unsigned long)mod_percpu(mod); else secbase = sechdrs[sym[i].st_shndx].sh_addr; @@ -47283,7 +48733,7 @@ diff -urNp linux-2.6.34.1/kernel/module.c linux-2.6.34.1/kernel/module.c break; } } -@@ -1650,11 +1658,12 @@ static void layout_sections(struct modul +@@ -1751,11 +1759,12 @@ static void layout_sections(struct modul || s->sh_entsize != ~0UL || strstarts(secstrings + s->sh_name, ".init")) continue; @@ -47299,7 +48749,7 @@ diff -urNp linux-2.6.34.1/kernel/module.c linux-2.6.34.1/kernel/module.c } DEBUGP("Init section allocation order:\n"); -@@ -1667,12 +1676,13 @@ static void layout_sections(struct modul +@@ -1768,12 +1777,13 @@ static void layout_sections(struct modul || s->sh_entsize != ~0UL || !strstarts(secstrings + s->sh_name, ".init")) continue; @@ -47317,7 +48767,7 @@ diff -urNp linux-2.6.34.1/kernel/module.c linux-2.6.34.1/kernel/module.c } } -@@ -1776,9 +1786,8 @@ static int is_exported(const char *name, +@@ -1877,9 +1887,8 @@ static int is_exported(const char *name, /* As per nm */ static char elf_type(const Elf_Sym *sym, @@ -47329,7 +48779,7 @@ diff -urNp linux-2.6.34.1/kernel/module.c linux-2.6.34.1/kernel/module.c { if (ELF_ST_BIND(sym->st_info) == STB_WEAK) { if (ELF_ST_TYPE(sym->st_info) == STT_OBJECT) -@@ -1853,7 +1862,7 @@ static unsigned long layout_symtab(struc +@@ -1954,7 +1963,7 @@ static unsigned long layout_symtab(struc /* Put symbol section at end of init part of module. */ symsect->sh_flags |= SHF_ALLOC; @@ -47338,7 +48788,7 @@ diff -urNp linux-2.6.34.1/kernel/module.c linux-2.6.34.1/kernel/module.c symindex) | INIT_OFFSET_MASK; DEBUGP("\t%s\n", secstrings + symsect->sh_name); -@@ -1870,19 +1879,19 @@ static unsigned long layout_symtab(struc +@@ -1971,19 +1980,19 @@ static unsigned long layout_symtab(struc } /* Append room for core symbols at end of core part. */ @@ -47363,7 +48813,7 @@ diff -urNp linux-2.6.34.1/kernel/module.c linux-2.6.34.1/kernel/module.c return symoffs; } -@@ -1906,12 +1915,14 @@ static void add_kallsyms(struct module * +@@ -2007,12 +2016,14 @@ static void add_kallsyms(struct module * mod->num_symtab = sechdrs[symindex].sh_size / sizeof(Elf_Sym); mod->strtab = (void *)sechdrs[strindex].sh_addr; @@ -47380,7 +48830,7 @@ diff -urNp linux-2.6.34.1/kernel/module.c linux-2.6.34.1/kernel/module.c src = mod->symtab; *dst = *src; for (ndst = i = 1; i < mod->num_symtab; ++i, ++src) { -@@ -1923,10 +1934,12 @@ static void add_kallsyms(struct module * +@@ -2024,10 +2035,12 @@ static void add_kallsyms(struct module * } mod->core_num_syms = ndst; @@ -47394,8 +48844,8 @@ diff -urNp linux-2.6.34.1/kernel/module.c linux-2.6.34.1/kernel/module.c } #else static inline unsigned long layout_symtab(struct module *mod, -@@ -1963,16 +1976,30 @@ static void dynamic_debug_setup(struct _ - #endif +@@ -2070,17 +2083,33 @@ static void dynamic_debug_remove(struct + ddebug_remove_module(debug->modname); } -static void *module_alloc_update_bounds(unsigned long size) @@ -47404,6 +48854,7 @@ diff -urNp linux-2.6.34.1/kernel/module.c linux-2.6.34.1/kernel/module.c void *ret = module_alloc(size); if (ret) { + mutex_lock(&module_mutex); /* Update module bounds. */ - if ((unsigned long)ret < module_addr_min) - module_addr_min = (unsigned long)ret; @@ -47413,6 +48864,7 @@ diff -urNp linux-2.6.34.1/kernel/module.c linux-2.6.34.1/kernel/module.c + module_addr_min_rw = (unsigned long)ret; + if ((unsigned long)ret + size > module_addr_max_rw) + module_addr_max_rw = (unsigned long)ret + size; ++ mutex_unlock(&module_mutex); + } + return ret; +} @@ -47422,15 +48874,16 @@ diff -urNp linux-2.6.34.1/kernel/module.c linux-2.6.34.1/kernel/module.c + void *ret = module_alloc_exec(size); + + if (ret) { ++ mutex_lock(&module_mutex); + /* Update module bounds. */ + if ((unsigned long)ret < module_addr_min_rx) + module_addr_min_rx = (unsigned long)ret; + if ((unsigned long)ret + size > module_addr_max_rx) + module_addr_max_rx = (unsigned long)ret + size; + mutex_unlock(&module_mutex); } return ret; - } -@@ -2175,7 +2202,7 @@ static noinline struct module *load_modu +@@ -2284,7 +2313,7 @@ static noinline struct module *load_modu secstrings, &stroffs, strmap); /* Do the allocs. */ @@ -47439,7 +48892,7 @@ diff -urNp linux-2.6.34.1/kernel/module.c linux-2.6.34.1/kernel/module.c /* * The pointer to this block is stored in the module structure * which is inside the block. Just mark it as not being a -@@ -2186,23 +2213,47 @@ static noinline struct module *load_modu +@@ -2295,23 +2324,47 @@ static noinline struct module *load_modu err = -ENOMEM; goto free_percpu; } @@ -47469,12 +48922,9 @@ diff -urNp linux-2.6.34.1/kernel/module.c linux-2.6.34.1/kernel/module.c + ptr = module_alloc_update_bounds_rx(mod->core_size_rx); + kmemleak_not_leak(ptr); + if (!ptr) { - err = -ENOMEM; -- goto free_core; ++ err = -ENOMEM; + goto free_init_rw; - } -- memset(ptr, 0, mod->init_size); -- mod->module_init = ptr; ++ } + + pax_open_kernel(); + memset(ptr, 0, mod->core_size_rx); @@ -47484,9 +48934,12 @@ diff -urNp linux-2.6.34.1/kernel/module.c linux-2.6.34.1/kernel/module.c + ptr = module_alloc_update_bounds_rx(mod->init_size_rx); + kmemleak_not_leak(ptr); + if (!ptr && mod->init_size_rx) { -+ err = -ENOMEM; + err = -ENOMEM; +- goto free_core; + goto free_core_rx; -+ } + } +- memset(ptr, 0, mod->init_size); +- mod->module_init = ptr; + + pax_open_kernel(); + memset(ptr, 0, mod->init_size_rx); @@ -47495,7 +48948,7 @@ diff -urNp linux-2.6.34.1/kernel/module.c linux-2.6.34.1/kernel/module.c /* Transfer each section which specifies SHF_ALLOC */ DEBUGP("final section addresses:\n"); -@@ -2212,17 +2263,41 @@ static noinline struct module *load_modu +@@ -2321,17 +2374,41 @@ static noinline struct module *load_modu if (!(sechdrs[i].sh_flags & SHF_ALLOC)) continue; @@ -47519,7 +48972,10 @@ diff -urNp linux-2.6.34.1/kernel/module.c linux-2.6.34.1/kernel/module.c + } + + if (sechdrs[i].sh_type != SHT_NOBITS) { -+ + +- if (sechdrs[i].sh_type != SHT_NOBITS) +- memcpy(dest, (void *)sechdrs[i].sh_addr, +- sechdrs[i].sh_size); +#ifdef CONFIG_PAX_KERNEXEC + if (!(sechdrs[i].sh_flags & SHF_WRITE) && (sechdrs[i].sh_flags & SHF_ALLOC)) { + pax_open_kernel(); @@ -47527,10 +48983,7 @@ diff -urNp linux-2.6.34.1/kernel/module.c linux-2.6.34.1/kernel/module.c + pax_close_kernel(); + } else +#endif - -- if (sechdrs[i].sh_type != SHT_NOBITS) -- memcpy(dest, (void *)sechdrs[i].sh_addr, -- sechdrs[i].sh_size); ++ + memcpy(dest, (void *)sechdrs[i].sh_addr, sechdrs[i].sh_size); + } /* Update sh_addr to point to copy in image. */ @@ -47546,7 +48999,7 @@ diff -urNp linux-2.6.34.1/kernel/module.c linux-2.6.34.1/kernel/module.c DEBUGP("\t0x%lx %s\n", sechdrs[i].sh_addr, secstrings + sechdrs[i].sh_name); } /* Module has been moved. */ -@@ -2233,7 +2308,7 @@ static noinline struct module *load_modu +@@ -2342,7 +2419,7 @@ static noinline struct module *load_modu mod->refptr = alloc_percpu(struct module_ref); if (!mod->refptr) { err = -ENOMEM; @@ -47555,7 +49008,7 @@ diff -urNp linux-2.6.34.1/kernel/module.c linux-2.6.34.1/kernel/module.c } #endif /* Now we've moved module, initialize linked lists, etc. */ -@@ -2348,8 +2423,8 @@ static noinline struct module *load_modu +@@ -2452,8 +2529,8 @@ static noinline struct module *load_modu /* Now do relocations. */ for (i = 1; i < hdr->e_shnum; i++) { @@ -47565,7 +49018,7 @@ diff -urNp linux-2.6.34.1/kernel/module.c linux-2.6.34.1/kernel/module.c /* Not a valid relocation section? */ if (info >= hdr->e_shnum) -@@ -2410,12 +2485,12 @@ static noinline struct module *load_modu +@@ -2503,12 +2580,12 @@ static noinline struct module *load_modu * Do it before processing of module parameters, so the module * can provide parameter accessor functions of its own. */ @@ -47584,8 +49037,8 @@ diff -urNp linux-2.6.34.1/kernel/module.c linux-2.6.34.1/kernel/module.c set_fs(old_fs); -@@ -2463,12 +2538,16 @@ static noinline struct module *load_modu - free_unload: +@@ -2574,12 +2651,16 @@ static noinline struct module *load_modu + free_modinfo(mod); module_unload_free(mod); #if defined(CONFIG_MODULE_UNLOAD) + free_init_rx: @@ -47604,8 +49057,8 @@ diff -urNp linux-2.6.34.1/kernel/module.c linux-2.6.34.1/kernel/module.c + module_free(mod, mod->module_core_rw); /* mod will be freed with core. Don't access it beyond this line! */ free_percpu: - percpu_modfree(mod); -@@ -2569,10 +2648,12 @@ SYSCALL_DEFINE3(init_module, void __user + free_percpu(percpu); +@@ -2669,10 +2750,12 @@ SYSCALL_DEFINE3(init_module, void __user mod->symtab = mod->core_symtab; mod->strtab = mod->core_strtab; #endif @@ -47622,7 +49075,7 @@ diff -urNp linux-2.6.34.1/kernel/module.c linux-2.6.34.1/kernel/module.c mutex_unlock(&module_mutex); return 0; -@@ -2603,10 +2684,16 @@ static const char *get_ksymbol(struct mo +@@ -2703,10 +2786,16 @@ static const char *get_ksymbol(struct mo unsigned long nextval; /* At worse, next value is at end of module */ @@ -47642,7 +49095,7 @@ diff -urNp linux-2.6.34.1/kernel/module.c linux-2.6.34.1/kernel/module.c /* Scan for closest preceeding symbol, and next symbol. (ELF starts real symbols at 1). */ -@@ -2852,7 +2939,7 @@ static int m_show(struct seq_file *m, vo +@@ -2952,7 +3041,7 @@ static int m_show(struct seq_file *m, vo char buf[8]; seq_printf(m, "%s %u", @@ -47651,7 +49104,7 @@ diff -urNp linux-2.6.34.1/kernel/module.c linux-2.6.34.1/kernel/module.c print_unload_info(m, mod); /* Informative for users. */ -@@ -2861,7 +2948,7 @@ static int m_show(struct seq_file *m, vo +@@ -2961,7 +3050,7 @@ static int m_show(struct seq_file *m, vo mod->state == MODULE_STATE_COMING ? "Loading": "Live"); /* Used by oprofile and other similar tools. */ @@ -47660,7 +49113,7 @@ diff -urNp linux-2.6.34.1/kernel/module.c linux-2.6.34.1/kernel/module.c /* Taints info */ if (mod->taints) -@@ -2897,7 +2984,17 @@ static const struct file_operations proc +@@ -2997,7 +3086,17 @@ static const struct file_operations proc static int __init proc_modules_init(void) { @@ -47678,7 +49131,7 @@ diff -urNp linux-2.6.34.1/kernel/module.c linux-2.6.34.1/kernel/module.c return 0; } module_init(proc_modules_init); -@@ -2956,12 +3053,12 @@ struct module *__module_address(unsigned +@@ -3056,12 +3155,12 @@ struct module *__module_address(unsigned { struct module *mod; @@ -47694,7 +49147,7 @@ diff -urNp linux-2.6.34.1/kernel/module.c linux-2.6.34.1/kernel/module.c return mod; return NULL; } -@@ -2995,11 +3092,20 @@ bool is_module_text_address(unsigned lon +@@ -3095,11 +3194,20 @@ bool is_module_text_address(unsigned lon */ struct module *__module_text_address(unsigned long addr) { @@ -47718,10 +49171,10 @@ diff -urNp linux-2.6.34.1/kernel/module.c linux-2.6.34.1/kernel/module.c mod = NULL; } return mod; -diff -urNp linux-2.6.34.1/kernel/panic.c linux-2.6.34.1/kernel/panic.c ---- linux-2.6.34.1/kernel/panic.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/kernel/panic.c 2010-07-07 09:04:57.000000000 -0400 -@@ -410,7 +410,8 @@ EXPORT_SYMBOL(warn_slowpath_null); +diff -urNp linux-2.6.35.4/kernel/panic.c linux-2.6.35.4/kernel/panic.c +--- linux-2.6.35.4/kernel/panic.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/kernel/panic.c 2010-09-17 20:12:09.000000000 -0400 +@@ -429,7 +429,8 @@ EXPORT_SYMBOL(warn_slowpath_null); */ void __stack_chk_fail(void) { @@ -47731,9 +49184,9 @@ diff -urNp linux-2.6.34.1/kernel/panic.c linux-2.6.34.1/kernel/panic.c __builtin_return_address(0)); } EXPORT_SYMBOL(__stack_chk_fail); -diff -urNp linux-2.6.34.1/kernel/pid.c linux-2.6.34.1/kernel/pid.c ---- linux-2.6.34.1/kernel/pid.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/kernel/pid.c 2010-07-07 09:04:57.000000000 -0400 +diff -urNp linux-2.6.35.4/kernel/pid.c linux-2.6.35.4/kernel/pid.c +--- linux-2.6.35.4/kernel/pid.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/kernel/pid.c 2010-09-17 20:12:37.000000000 -0400 @@ -33,6 +33,7 @@ #include #include @@ -47767,9 +49220,9 @@ diff -urNp linux-2.6.34.1/kernel/pid.c linux-2.6.34.1/kernel/pid.c } struct task_struct *find_task_by_vpid(pid_t vnr) -diff -urNp linux-2.6.34.1/kernel/posix-cpu-timers.c linux-2.6.34.1/kernel/posix-cpu-timers.c ---- linux-2.6.34.1/kernel/posix-cpu-timers.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/kernel/posix-cpu-timers.c 2010-07-07 09:04:57.000000000 -0400 +diff -urNp linux-2.6.35.4/kernel/posix-cpu-timers.c linux-2.6.35.4/kernel/posix-cpu-timers.c +--- linux-2.6.35.4/kernel/posix-cpu-timers.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/kernel/posix-cpu-timers.c 2010-09-17 20:12:37.000000000 -0400 @@ -6,6 +6,7 @@ #include #include @@ -47778,7 +49231,7 @@ diff -urNp linux-2.6.34.1/kernel/posix-cpu-timers.c linux-2.6.34.1/kernel/posix- #include #include #include -@@ -1036,6 +1037,7 @@ static void check_thread_timers(struct t +@@ -972,6 +973,7 @@ static void check_thread_timers(struct t unsigned long hard = ACCESS_ONCE(sig->rlim[RLIMIT_RTTIME].rlim_max); @@ -47786,7 +49239,7 @@ diff -urNp linux-2.6.34.1/kernel/posix-cpu-timers.c linux-2.6.34.1/kernel/posix- if (hard != RLIM_INFINITY && tsk->rt.timeout > DIV_ROUND_UP(hard, USEC_PER_SEC/HZ)) { /* -@@ -1205,6 +1207,7 @@ static void check_process_timers(struct +@@ -1138,6 +1140,7 @@ static void check_process_timers(struct unsigned long hard = ACCESS_ONCE(sig->rlim[RLIMIT_CPU].rlim_max); cputime_t x; @@ -47794,9 +49247,9 @@ diff -urNp linux-2.6.34.1/kernel/posix-cpu-timers.c linux-2.6.34.1/kernel/posix- if (psecs >= hard) { /* * At the hard limit, we just die. -diff -urNp linux-2.6.34.1/kernel/power/hibernate.c linux-2.6.34.1/kernel/power/hibernate.c ---- linux-2.6.34.1/kernel/power/hibernate.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/kernel/power/hibernate.c 2010-07-07 09:04:57.000000000 -0400 +diff -urNp linux-2.6.35.4/kernel/power/hibernate.c linux-2.6.35.4/kernel/power/hibernate.c +--- linux-2.6.35.4/kernel/power/hibernate.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/kernel/power/hibernate.c 2010-09-17 20:12:09.000000000 -0400 @@ -50,14 +50,14 @@ enum { static int hibernation_mode = HIBERNATION_SHUTDOWN; @@ -47814,9 +49267,9 @@ diff -urNp linux-2.6.34.1/kernel/power/hibernate.c linux-2.6.34.1/kernel/power/h { if (ops && !(ops->begin && ops->end && ops->pre_snapshot && ops->prepare && ops->finish && ops->enter && ops->pre_restore -diff -urNp linux-2.6.34.1/kernel/power/poweroff.c linux-2.6.34.1/kernel/power/poweroff.c ---- linux-2.6.34.1/kernel/power/poweroff.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/kernel/power/poweroff.c 2010-07-07 09:04:57.000000000 -0400 +diff -urNp linux-2.6.35.4/kernel/power/poweroff.c linux-2.6.35.4/kernel/power/poweroff.c +--- linux-2.6.35.4/kernel/power/poweroff.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/kernel/power/poweroff.c 2010-09-17 20:12:09.000000000 -0400 @@ -37,7 +37,7 @@ static struct sysrq_key_op sysrq_powerof .enable_mask = SYSRQ_ENABLE_BOOT, }; @@ -47826,9 +49279,9 @@ diff -urNp linux-2.6.34.1/kernel/power/poweroff.c linux-2.6.34.1/kernel/power/po { register_sysrq_key('o', &sysrq_poweroff_op); return 0; -diff -urNp linux-2.6.34.1/kernel/power/process.c linux-2.6.34.1/kernel/power/process.c ---- linux-2.6.34.1/kernel/power/process.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/kernel/power/process.c 2010-07-07 09:04:57.000000000 -0400 +diff -urNp linux-2.6.35.4/kernel/power/process.c linux-2.6.35.4/kernel/power/process.c +--- linux-2.6.35.4/kernel/power/process.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/kernel/power/process.c 2010-09-17 20:12:09.000000000 -0400 @@ -38,12 +38,15 @@ static int try_to_freeze_tasks(bool sig_ struct timeval start, end; u64 elapsed_csecs64; @@ -47865,10 +49318,10 @@ diff -urNp linux-2.6.34.1/kernel/power/process.c linux-2.6.34.1/kernel/power/pro break; /* -diff -urNp linux-2.6.34.1/kernel/power/suspend.c linux-2.6.34.1/kernel/power/suspend.c ---- linux-2.6.34.1/kernel/power/suspend.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/kernel/power/suspend.c 2010-07-07 09:04:57.000000000 -0400 -@@ -24,13 +24,13 @@ const char *const pm_states[PM_SUSPEND_M +diff -urNp linux-2.6.35.4/kernel/power/suspend.c linux-2.6.35.4/kernel/power/suspend.c +--- linux-2.6.35.4/kernel/power/suspend.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/kernel/power/suspend.c 2010-09-17 20:12:09.000000000 -0400 +@@ -30,13 +30,13 @@ const char *const pm_states[PM_SUSPEND_M [PM_SUSPEND_MEM] = "mem", }; @@ -47884,10 +49337,10 @@ diff -urNp linux-2.6.34.1/kernel/power/suspend.c linux-2.6.34.1/kernel/power/sus { mutex_lock(&pm_mutex); suspend_ops = ops; -diff -urNp linux-2.6.34.1/kernel/printk.c linux-2.6.34.1/kernel/printk.c ---- linux-2.6.34.1/kernel/printk.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/kernel/printk.c 2010-07-07 09:04:57.000000000 -0400 -@@ -265,6 +265,11 @@ int do_syslog(int type, char __user *buf +diff -urNp linux-2.6.35.4/kernel/printk.c linux-2.6.35.4/kernel/printk.c +--- linux-2.6.35.4/kernel/printk.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/kernel/printk.c 2010-09-17 20:12:37.000000000 -0400 +@@ -266,6 +266,11 @@ int do_syslog(int type, char __user *buf char c; int error = 0; @@ -47899,10 +49352,10 @@ diff -urNp linux-2.6.34.1/kernel/printk.c linux-2.6.34.1/kernel/printk.c error = security_syslog(type, from_file); if (error) return error; -diff -urNp linux-2.6.34.1/kernel/ptrace.c linux-2.6.34.1/kernel/ptrace.c ---- linux-2.6.34.1/kernel/ptrace.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/kernel/ptrace.c 2010-07-07 09:04:57.000000000 -0400 -@@ -142,7 +142,7 @@ int __ptrace_may_access(struct task_stru +diff -urNp linux-2.6.35.4/kernel/ptrace.c linux-2.6.35.4/kernel/ptrace.c +--- linux-2.6.35.4/kernel/ptrace.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/kernel/ptrace.c 2010-09-17 20:12:37.000000000 -0400 +@@ -140,7 +140,7 @@ int __ptrace_may_access(struct task_stru cred->gid != tcred->egid || cred->gid != tcred->sgid || cred->gid != tcred->gid) && @@ -47911,7 +49364,7 @@ diff -urNp linux-2.6.34.1/kernel/ptrace.c linux-2.6.34.1/kernel/ptrace.c rcu_read_unlock(); return -EPERM; } -@@ -150,7 +150,7 @@ int __ptrace_may_access(struct task_stru +@@ -148,7 +148,7 @@ int __ptrace_may_access(struct task_stru smp_rmb(); if (task->mm) dumpable = get_dumpable(task->mm); @@ -47920,7 +49373,7 @@ diff -urNp linux-2.6.34.1/kernel/ptrace.c linux-2.6.34.1/kernel/ptrace.c return -EPERM; return security_ptrace_access_check(task, mode); -@@ -200,7 +200,7 @@ int ptrace_attach(struct task_struct *ta +@@ -198,7 +198,7 @@ int ptrace_attach(struct task_struct *ta goto unlock_tasklist; task->ptrace = PT_PTRACED; @@ -47929,7 +49382,7 @@ diff -urNp linux-2.6.34.1/kernel/ptrace.c linux-2.6.34.1/kernel/ptrace.c task->ptrace |= PT_PTRACE_CAP; __ptrace_link(task, current); -@@ -363,7 +363,7 @@ int ptrace_readdata(struct task_struct * +@@ -361,7 +361,7 @@ int ptrace_readdata(struct task_struct * break; return -EIO; } @@ -47938,7 +49391,7 @@ diff -urNp linux-2.6.34.1/kernel/ptrace.c linux-2.6.34.1/kernel/ptrace.c return -EFAULT; copied += retval; src += retval; -@@ -574,18 +574,18 @@ int ptrace_request(struct task_struct *c +@@ -572,18 +572,18 @@ int ptrace_request(struct task_struct *c ret = ptrace_setoptions(child, data); break; case PTRACE_GETEVENTMSG: @@ -47960,7 +49413,7 @@ diff -urNp linux-2.6.34.1/kernel/ptrace.c linux-2.6.34.1/kernel/ptrace.c sizeof siginfo)) ret = -EFAULT; else -@@ -683,14 +683,21 @@ SYSCALL_DEFINE4(ptrace, long, request, l +@@ -703,14 +703,21 @@ SYSCALL_DEFINE4(ptrace, long, request, l goto out; } @@ -47983,7 +49436,7 @@ diff -urNp linux-2.6.34.1/kernel/ptrace.c linux-2.6.34.1/kernel/ptrace.c goto out_put_task_struct; } -@@ -715,7 +722,7 @@ int generic_ptrace_peekdata(struct task_ +@@ -734,7 +741,7 @@ int generic_ptrace_peekdata(struct task_ copied = access_process_vm(tsk, addr, &tmp, sizeof(tmp), 0); if (copied != sizeof(tmp)) return -EIO; @@ -47992,10 +49445,10 @@ diff -urNp linux-2.6.34.1/kernel/ptrace.c linux-2.6.34.1/kernel/ptrace.c } int generic_ptrace_pokedata(struct task_struct *tsk, long addr, long data) -diff -urNp linux-2.6.34.1/kernel/rcutree.c linux-2.6.34.1/kernel/rcutree.c ---- linux-2.6.34.1/kernel/rcutree.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/kernel/rcutree.c 2010-07-07 09:04:57.000000000 -0400 -@@ -1321,7 +1321,7 @@ __rcu_process_callbacks(struct rcu_state +diff -urNp linux-2.6.35.4/kernel/rcutree.c linux-2.6.35.4/kernel/rcutree.c +--- linux-2.6.35.4/kernel/rcutree.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/kernel/rcutree.c 2010-09-17 20:12:09.000000000 -0400 +@@ -1356,7 +1356,7 @@ __rcu_process_callbacks(struct rcu_state /* * Do softirq processing for the current CPU. */ @@ -48004,22 +49457,10 @@ diff -urNp linux-2.6.34.1/kernel/rcutree.c linux-2.6.34.1/kernel/rcutree.c { /* * Memory references from any prior RCU read-side critical sections -diff -urNp linux-2.6.34.1/kernel/relay.c linux-2.6.34.1/kernel/relay.c ---- linux-2.6.34.1/kernel/relay.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/kernel/relay.c 2010-07-07 09:04:57.000000000 -0400 -@@ -1293,7 +1293,7 @@ static ssize_t subbuf_splice_actor(struc - return 0; - - ret = *nonpad_ret = splice_to_pipe(pipe, &spd); -- if (ret < 0 || ret < total_len) -+ if ((int)ret < 0 || ret < total_len) - return ret; - - if (read_start + ret == nonpad_end) -diff -urNp linux-2.6.34.1/kernel/resource.c linux-2.6.34.1/kernel/resource.c ---- linux-2.6.34.1/kernel/resource.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/kernel/resource.c 2010-07-07 09:04:57.000000000 -0400 -@@ -132,8 +132,18 @@ static const struct file_operations proc +diff -urNp linux-2.6.35.4/kernel/resource.c linux-2.6.35.4/kernel/resource.c +--- linux-2.6.35.4/kernel/resource.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/kernel/resource.c 2010-09-17 20:12:37.000000000 -0400 +@@ -133,8 +133,18 @@ static const struct file_operations proc static int __init ioresources_init(void) { @@ -48038,10 +49479,10 @@ diff -urNp linux-2.6.34.1/kernel/resource.c linux-2.6.34.1/kernel/resource.c return 0; } __initcall(ioresources_init); -diff -urNp linux-2.6.34.1/kernel/sched.c linux-2.6.34.1/kernel/sched.c ---- linux-2.6.34.1/kernel/sched.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/kernel/sched.c 2010-07-07 09:04:57.000000000 -0400 -@@ -4364,6 +4364,8 @@ int can_nice(const struct task_struct *p +diff -urNp linux-2.6.35.4/kernel/sched.c linux-2.6.35.4/kernel/sched.c +--- linux-2.6.35.4/kernel/sched.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/kernel/sched.c 2010-09-17 20:12:37.000000000 -0400 +@@ -4266,6 +4266,8 @@ int can_nice(const struct task_struct *p /* convert nice value [19,-20] to rlimit style value [1,40] */ int nice_rlim = 20 - nice; @@ -48050,7 +49491,7 @@ diff -urNp linux-2.6.34.1/kernel/sched.c linux-2.6.34.1/kernel/sched.c return (nice_rlim <= task_rlimit(p, RLIMIT_NICE) || capable(CAP_SYS_NICE)); } -@@ -4397,7 +4399,8 @@ SYSCALL_DEFINE1(nice, int, increment) +@@ -4299,7 +4301,8 @@ SYSCALL_DEFINE1(nice, int, increment) if (nice > 19) nice = 19; @@ -48060,7 +49501,7 @@ diff -urNp linux-2.6.34.1/kernel/sched.c linux-2.6.34.1/kernel/sched.c return -EPERM; retval = security_task_setnice(current, nice); -@@ -4544,6 +4547,7 @@ recheck: +@@ -4446,6 +4449,7 @@ recheck: rlim_rtprio = task_rlimit(p, RLIMIT_RTPRIO); unlock_task_sighand(p, &flags); @@ -48068,10 +49509,10 @@ diff -urNp linux-2.6.34.1/kernel/sched.c linux-2.6.34.1/kernel/sched.c /* can't set/change the rt policy */ if (policy != p->policy && !rlim_rtprio) return -EPERM; -diff -urNp linux-2.6.34.1/kernel/sched_fair.c linux-2.6.34.1/kernel/sched_fair.c ---- linux-2.6.34.1/kernel/sched_fair.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/kernel/sched_fair.c 2010-07-07 09:04:57.000000000 -0400 -@@ -3432,7 +3432,7 @@ out: +diff -urNp linux-2.6.35.4/kernel/sched_fair.c linux-2.6.35.4/kernel/sched_fair.c +--- linux-2.6.35.4/kernel/sched_fair.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/kernel/sched_fair.c 2010-09-17 20:12:09.000000000 -0400 +@@ -3390,7 +3390,7 @@ out: * In CONFIG_NO_HZ case, the idle load balance owner will do the * rebalancing for all the cpus for whom scheduler ticks are stopped. */ @@ -48080,9 +49521,9 @@ diff -urNp linux-2.6.34.1/kernel/sched_fair.c linux-2.6.34.1/kernel/sched_fair.c { int this_cpu = smp_processor_id(); struct rq *this_rq = cpu_rq(this_cpu); -diff -urNp linux-2.6.34.1/kernel/signal.c linux-2.6.34.1/kernel/signal.c ---- linux-2.6.34.1/kernel/signal.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/kernel/signal.c 2010-07-07 09:04:57.000000000 -0400 +diff -urNp linux-2.6.35.4/kernel/signal.c linux-2.6.35.4/kernel/signal.c +--- linux-2.6.35.4/kernel/signal.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/kernel/signal.c 2010-09-17 20:20:18.000000000 -0400 @@ -45,12 +45,12 @@ static struct kmem_cache *sigqueue_cache int print_fatal_signals __read_mostly; @@ -48155,9 +49596,9 @@ diff -urNp linux-2.6.34.1/kernel/signal.c linux-2.6.34.1/kernel/signal.c return ret; } -@@ -1132,8 +1141,11 @@ int group_send_sig_info(int sig, struct - { - int ret = check_kill_permission(sig, info, p); +@@ -1136,8 +1145,11 @@ int group_send_sig_info(int sig, struct + ret = check_kill_permission(sig, info, p); + rcu_read_unlock(); - if (!ret && sig) + if (!ret && sig) { @@ -48168,9 +49609,9 @@ diff -urNp linux-2.6.34.1/kernel/signal.c linux-2.6.34.1/kernel/signal.c return ret; } -diff -urNp linux-2.6.34.1/kernel/smp.c linux-2.6.34.1/kernel/smp.c ---- linux-2.6.34.1/kernel/smp.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/kernel/smp.c 2010-07-07 09:04:57.000000000 -0400 +diff -urNp linux-2.6.35.4/kernel/smp.c linux-2.6.35.4/kernel/smp.c +--- linux-2.6.35.4/kernel/smp.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/kernel/smp.c 2010-09-17 20:12:09.000000000 -0400 @@ -499,22 +499,22 @@ int smp_call_function(void (*func)(void } EXPORT_SYMBOL(smp_call_function); @@ -48198,9 +49639,9 @@ diff -urNp linux-2.6.34.1/kernel/smp.c linux-2.6.34.1/kernel/smp.c { raw_spin_unlock_irq(&call_function.lock); } -diff -urNp linux-2.6.34.1/kernel/softirq.c linux-2.6.34.1/kernel/softirq.c ---- linux-2.6.34.1/kernel/softirq.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/kernel/softirq.c 2010-07-07 09:04:57.000000000 -0400 +diff -urNp linux-2.6.35.4/kernel/softirq.c linux-2.6.35.4/kernel/softirq.c +--- linux-2.6.35.4/kernel/softirq.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/kernel/softirq.c 2010-09-17 20:12:09.000000000 -0400 @@ -56,7 +56,7 @@ static struct softirq_action softirq_vec static DEFINE_PER_CPU(struct task_struct *, ksoftirqd); @@ -48255,9 +49696,9 @@ diff -urNp linux-2.6.34.1/kernel/softirq.c linux-2.6.34.1/kernel/softirq.c { struct tasklet_struct *list; -diff -urNp linux-2.6.34.1/kernel/sys.c linux-2.6.34.1/kernel/sys.c ---- linux-2.6.34.1/kernel/sys.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/kernel/sys.c 2010-07-07 09:04:57.000000000 -0400 +diff -urNp linux-2.6.35.4/kernel/sys.c linux-2.6.35.4/kernel/sys.c +--- linux-2.6.35.4/kernel/sys.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/kernel/sys.c 2010-09-17 20:28:33.000000000 -0400 @@ -134,6 +134,12 @@ static int set_one_prio(struct task_stru error = -EACCES; goto out; @@ -48271,7 +49712,7 @@ diff -urNp linux-2.6.34.1/kernel/sys.c linux-2.6.34.1/kernel/sys.c no_nice = security_task_setnice(p, niceval); if (no_nice) { error = no_nice; -@@ -515,6 +521,9 @@ SYSCALL_DEFINE2(setregid, gid_t, rgid, g +@@ -511,6 +517,9 @@ SYSCALL_DEFINE2(setregid, gid_t, rgid, g goto error; } @@ -48281,8 +49722,8 @@ diff -urNp linux-2.6.34.1/kernel/sys.c linux-2.6.34.1/kernel/sys.c if (rgid != (gid_t) -1 || (egid != (gid_t) -1 && egid != old->gid)) new->sgid = new->egid; -@@ -548,6 +557,10 @@ SYSCALL_DEFINE1(setgid, gid_t, gid) - goto error; +@@ -540,6 +549,10 @@ SYSCALL_DEFINE1(setgid, gid_t, gid) + old = current_cred(); retval = -EPERM; + @@ -48292,7 +49733,7 @@ diff -urNp linux-2.6.34.1/kernel/sys.c linux-2.6.34.1/kernel/sys.c if (capable(CAP_SETGID)) new->gid = new->egid = new->sgid = new->fsgid = gid; else if (gid == old->gid || gid == old->sgid) -@@ -632,6 +645,9 @@ SYSCALL_DEFINE2(setreuid, uid_t, ruid, u +@@ -620,6 +633,9 @@ SYSCALL_DEFINE2(setreuid, uid_t, ruid, u goto error; } @@ -48302,8 +49743,8 @@ diff -urNp linux-2.6.34.1/kernel/sys.c linux-2.6.34.1/kernel/sys.c if (new->uid != old->uid) { retval = set_user(new); if (retval < 0) -@@ -680,6 +696,12 @@ SYSCALL_DEFINE1(setuid, uid_t, uid) - goto error; +@@ -664,6 +680,12 @@ SYSCALL_DEFINE1(setuid, uid_t, uid) + old = current_cred(); retval = -EPERM; + @@ -48315,7 +49756,7 @@ diff -urNp linux-2.6.34.1/kernel/sys.c linux-2.6.34.1/kernel/sys.c if (capable(CAP_SETUID)) { new->suid = new->uid = uid; if (uid != old->uid) { -@@ -737,6 +759,9 @@ SYSCALL_DEFINE3(setresuid, uid_t, ruid, +@@ -718,6 +740,9 @@ SYSCALL_DEFINE3(setresuid, uid_t, ruid, goto error; } @@ -48325,7 +49766,7 @@ diff -urNp linux-2.6.34.1/kernel/sys.c linux-2.6.34.1/kernel/sys.c if (ruid != (uid_t) -1) { new->uid = ruid; if (ruid != old->uid) { -@@ -805,6 +830,9 @@ SYSCALL_DEFINE3(setresgid, gid_t, rgid, +@@ -782,6 +807,9 @@ SYSCALL_DEFINE3(setresgid, gid_t, rgid, goto error; } @@ -48335,9 +49776,9 @@ diff -urNp linux-2.6.34.1/kernel/sys.c linux-2.6.34.1/kernel/sys.c if (rgid != (gid_t) -1) new->gid = rgid; if (egid != (gid_t) -1) -@@ -854,6 +882,9 @@ SYSCALL_DEFINE1(setfsuid, uid_t, uid) - if (security_task_setuid(uid, (uid_t)-1, (uid_t)-1, LSM_SETID_FS) < 0) - goto error; +@@ -828,6 +856,9 @@ SYSCALL_DEFINE1(setfsuid, uid_t, uid) + old = current_cred(); + old_fsuid = old->fsuid; + if (gr_check_user_change(-1, -1, uid)) + goto error; @@ -48345,7 +49786,15 @@ diff -urNp linux-2.6.34.1/kernel/sys.c linux-2.6.34.1/kernel/sys.c if (uid == old->uid || uid == old->euid || uid == old->suid || uid == old->fsuid || capable(CAP_SETUID)) { -@@ -894,6 +925,9 @@ SYSCALL_DEFINE1(setfsgid, gid_t, gid) +@@ -838,6 +869,7 @@ SYSCALL_DEFINE1(setfsuid, uid_t, uid) + } + } + ++error: + abort_creds(new); + return old_fsuid; + +@@ -864,12 +896,16 @@ SYSCALL_DEFINE1(setfsgid, gid_t, gid) if (gid == old->gid || gid == old->egid || gid == old->sgid || gid == old->fsgid || capable(CAP_SETGID)) { @@ -48355,7 +49804,14 @@ diff -urNp linux-2.6.34.1/kernel/sys.c linux-2.6.34.1/kernel/sys.c if (gid != old_fsgid) { new->fsgid = gid; goto change_okay; -@@ -1522,7 +1556,7 @@ SYSCALL_DEFINE5(prctl, int, option, unsi + } + } + ++error: + abort_creds(new); + return old_fsgid; + +@@ -1491,7 +1527,7 @@ SYSCALL_DEFINE5(prctl, int, option, unsi error = get_dumpable(me->mm); break; case PR_SET_DUMPABLE: @@ -48364,10 +49820,10 @@ diff -urNp linux-2.6.34.1/kernel/sys.c linux-2.6.34.1/kernel/sys.c error = -EINVAL; break; } -diff -urNp linux-2.6.34.1/kernel/sysctl.c linux-2.6.34.1/kernel/sysctl.c ---- linux-2.6.34.1/kernel/sysctl.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/kernel/sysctl.c 2010-07-07 09:04:57.000000000 -0400 -@@ -76,6 +76,13 @@ +diff -urNp linux-2.6.35.4/kernel/sysctl.c linux-2.6.35.4/kernel/sysctl.c +--- linux-2.6.35.4/kernel/sysctl.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/kernel/sysctl.c 2010-09-17 20:18:09.000000000 -0400 +@@ -78,6 +78,13 @@ #if defined(CONFIG_SYSCTL) @@ -48381,15 +49837,15 @@ diff -urNp linux-2.6.34.1/kernel/sysctl.c linux-2.6.34.1/kernel/sysctl.c /* External variables not in a header file. */ extern int sysctl_overcommit_memory; -@@ -162,6 +169,7 @@ static int proc_do_cad_pid(struct ctl_ta - static int proc_taint(struct ctl_table *table, int write, - void __user *buffer, size_t *lenp, loff_t *ppos); +@@ -185,6 +192,7 @@ static int sysrq_sysctl_handler(ctl_tabl + } + #endif -+extern ctl_table grsecurity_table[]; ++extern struct ctl_table grsecurity_table[]; static struct ctl_table root_table[]; static struct ctl_table_root sysctl_table_root; -@@ -194,6 +202,20 @@ extern struct ctl_table epoll_table[]; +@@ -217,6 +225,20 @@ extern struct ctl_table epoll_table[]; int sysctl_legacy_va_layout; #endif @@ -48410,7 +49866,7 @@ diff -urNp linux-2.6.34.1/kernel/sysctl.c linux-2.6.34.1/kernel/sysctl.c /* The default sysctl tables: */ static struct ctl_table root_table[] = { -@@ -241,6 +263,22 @@ static int max_sched_shares_ratelimit = +@@ -269,6 +291,22 @@ static int max_extfrag_threshold = 1000; #endif static struct ctl_table kern_table[] = { @@ -48433,7 +49889,21 @@ diff -urNp linux-2.6.34.1/kernel/sysctl.c linux-2.6.34.1/kernel/sysctl.c { .procname = "sched_child_runs_first", .data = &sysctl_sched_child_runs_first, -@@ -1630,6 +1668,16 @@ int sysctl_perm(struct ctl_table_root *r +@@ -1171,6 +1209,13 @@ static struct ctl_table vm_table[] = { + .proc_handler = proc_dointvec_minmax, + .extra1 = &zero, + }, ++ { ++ .procname = "heap_stack_gap", ++ .data = &sysctl_heap_stack_gap, ++ .maxlen = sizeof(sysctl_heap_stack_gap), ++ .mode = 0644, ++ .proc_handler = proc_doulongvec_minmax, ++ }, + #else + { + .procname = "nr_trim_pages", +@@ -1686,6 +1731,16 @@ int sysctl_perm(struct ctl_table_root *r int error; int mode; @@ -48450,27 +49920,18 @@ diff -urNp linux-2.6.34.1/kernel/sysctl.c linux-2.6.34.1/kernel/sysctl.c error = security_sysctl(table, op & (MAY_READ | MAY_WRITE | MAY_EXEC)); if (error) return error; -@@ -2138,6 +2186,8 @@ static int __do_proc_dointvec(void *tbl_ - len = strlen(buf); - if (len > left) - len = left; -+ if (len > sizeof(buf)) -+ len = sizeof(buf); - if(copy_to_user(s, buf, len)) - return -EFAULT; - left -= len; -@@ -2363,6 +2413,8 @@ static int __do_proc_doulongvec_minmax(v - len = strlen(buf); - if (len > left) - len = left; -+ if (len > sizeof(buf)) -+ len = sizeof(buf); - if(copy_to_user(s, buf, len)) - return -EFAULT; - left -= len; -diff -urNp linux-2.6.34.1/kernel/taskstats.c linux-2.6.34.1/kernel/taskstats.c ---- linux-2.6.34.1/kernel/taskstats.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/kernel/taskstats.c 2010-07-07 09:04:57.000000000 -0400 +@@ -2201,6 +2256,8 @@ static int proc_put_long(void __user **b + len = strlen(tmp); + if (len > *size) + len = *size; ++ if (len > sizeof(tmp)) ++ len = sizeof(tmp); + if (copy_to_user(*buf, tmp, len)) + return -EFAULT; + *size -= len; +diff -urNp linux-2.6.35.4/kernel/taskstats.c linux-2.6.35.4/kernel/taskstats.c +--- linux-2.6.35.4/kernel/taskstats.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/kernel/taskstats.c 2010-09-17 20:12:37.000000000 -0400 @@ -27,9 +27,12 @@ #include #include @@ -48494,9 +49955,9 @@ diff -urNp linux-2.6.34.1/kernel/taskstats.c linux-2.6.34.1/kernel/taskstats.c if (!alloc_cpumask_var(&mask, GFP_KERNEL)) return -ENOMEM; -diff -urNp linux-2.6.34.1/kernel/time/tick-broadcast.c linux-2.6.34.1/kernel/time/tick-broadcast.c ---- linux-2.6.34.1/kernel/time/tick-broadcast.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/kernel/time/tick-broadcast.c 2010-07-07 09:04:57.000000000 -0400 +diff -urNp linux-2.6.35.4/kernel/time/tick-broadcast.c linux-2.6.35.4/kernel/time/tick-broadcast.c +--- linux-2.6.35.4/kernel/time/tick-broadcast.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/kernel/time/tick-broadcast.c 2010-09-17 20:12:09.000000000 -0400 @@ -116,7 +116,7 @@ int tick_device_uses_broadcast(struct cl * then clear the broadcast bit. */ @@ -48506,9 +49967,85 @@ diff -urNp linux-2.6.34.1/kernel/time/tick-broadcast.c linux-2.6.34.1/kernel/tim cpumask_clear_cpu(cpu, tick_get_broadcast_mask()); tick_broadcast_clear_oneshot(cpu); -diff -urNp linux-2.6.34.1/kernel/time.c linux-2.6.34.1/kernel/time.c ---- linux-2.6.34.1/kernel/time.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/kernel/time.c 2010-07-07 09:04:57.000000000 -0400 +diff -urNp linux-2.6.35.4/kernel/time/timer_list.c linux-2.6.35.4/kernel/time/timer_list.c +--- linux-2.6.35.4/kernel/time/timer_list.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/kernel/time/timer_list.c 2010-09-17 20:12:37.000000000 -0400 +@@ -38,12 +38,16 @@ DECLARE_PER_CPU(struct hrtimer_cpu_base, + + static void print_name_offset(struct seq_file *m, void *sym) + { ++#ifdef CONFIG_GRKERNSEC_HIDESYM ++ SEQ_printf(m, "<%p>", NULL); ++#else + char symname[KSYM_NAME_LEN]; + + if (lookup_symbol_name((unsigned long)sym, symname) < 0) + SEQ_printf(m, "<%p>", sym); + else + SEQ_printf(m, "%s", symname); ++#endif + } + + static void +@@ -112,7 +116,11 @@ next_one: + static void + print_base(struct seq_file *m, struct hrtimer_clock_base *base, u64 now) + { ++#ifdef CONFIG_GRKERNSEC_HIDESYM ++ SEQ_printf(m, " .base: %p\n", NULL); ++#else + SEQ_printf(m, " .base: %p\n", base); ++#endif + SEQ_printf(m, " .index: %d\n", + base->index); + SEQ_printf(m, " .resolution: %Lu nsecs\n", +@@ -293,7 +301,11 @@ static int __init init_timer_list_procfs + { + struct proc_dir_entry *pe; + ++#ifdef CONFIG_GRKERNSEC_PROC_ADD ++ pe = proc_create("timer_list", 0400, NULL, &timer_list_fops); ++#else + pe = proc_create("timer_list", 0444, NULL, &timer_list_fops); ++#endif + if (!pe) + return -ENOMEM; + return 0; +diff -urNp linux-2.6.35.4/kernel/time/timer_stats.c linux-2.6.35.4/kernel/time/timer_stats.c +--- linux-2.6.35.4/kernel/time/timer_stats.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/kernel/time/timer_stats.c 2010-09-17 20:12:37.000000000 -0400 +@@ -269,12 +269,16 @@ void timer_stats_update_stats(void *time + + static void print_name_offset(struct seq_file *m, unsigned long addr) + { ++#ifdef CONFIG_GRKERNSEC_HIDESYM ++ seq_printf(m, "<%p>", NULL); ++#else + char symname[KSYM_NAME_LEN]; + + if (lookup_symbol_name(addr, symname) < 0) + seq_printf(m, "<%p>", (void *)addr); + else + seq_printf(m, "%s", symname); ++#endif + } + + static int tstats_show(struct seq_file *m, void *v) +@@ -417,7 +421,11 @@ static int __init init_tstats_procfs(voi + { + struct proc_dir_entry *pe; + ++#ifdef CONFIG_GRKERNSEC_PROC_ADD ++ pe = proc_create("timer_stats", 0600, NULL, &tstats_fops); ++#else + pe = proc_create("timer_stats", 0644, NULL, &tstats_fops); ++#endif + if (!pe) + return -ENOMEM; + return 0; +diff -urNp linux-2.6.35.4/kernel/time.c linux-2.6.35.4/kernel/time.c +--- linux-2.6.35.4/kernel/time.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/kernel/time.c 2010-09-17 20:12:37.000000000 -0400 @@ -93,6 +93,9 @@ SYSCALL_DEFINE1(stime, time_t __user *, return err; @@ -48519,7 +50056,7 @@ diff -urNp linux-2.6.34.1/kernel/time.c linux-2.6.34.1/kernel/time.c return 0; } -@@ -201,6 +204,8 @@ SYSCALL_DEFINE2(settimeofday, struct tim +@@ -200,6 +203,8 @@ SYSCALL_DEFINE2(settimeofday, struct tim return -EFAULT; } @@ -48528,7 +50065,7 @@ diff -urNp linux-2.6.34.1/kernel/time.c linux-2.6.34.1/kernel/time.c return do_sys_settimeofday(tv ? &new_ts : NULL, tz ? &new_tz : NULL); } -@@ -239,7 +244,7 @@ EXPORT_SYMBOL(current_fs_time); +@@ -238,7 +243,7 @@ EXPORT_SYMBOL(current_fs_time); * Avoid unnecessary multiplications/divisions in the * two most common HZ cases: */ @@ -48537,7 +50074,7 @@ diff -urNp linux-2.6.34.1/kernel/time.c linux-2.6.34.1/kernel/time.c { #if HZ <= MSEC_PER_SEC && !(MSEC_PER_SEC % HZ) return (MSEC_PER_SEC / HZ) * j; -@@ -255,7 +260,7 @@ unsigned int inline jiffies_to_msecs(con +@@ -254,7 +259,7 @@ unsigned int inline jiffies_to_msecs(con } EXPORT_SYMBOL(jiffies_to_msecs); @@ -48546,10 +50083,10 @@ diff -urNp linux-2.6.34.1/kernel/time.c linux-2.6.34.1/kernel/time.c { #if HZ <= USEC_PER_SEC && !(USEC_PER_SEC % HZ) return (USEC_PER_SEC / HZ) * j; -diff -urNp linux-2.6.34.1/kernel/timer.c linux-2.6.34.1/kernel/timer.c ---- linux-2.6.34.1/kernel/timer.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/kernel/timer.c 2010-07-07 09:04:57.000000000 -0400 -@@ -1208,7 +1208,7 @@ void update_process_times(int user_tick) +diff -urNp linux-2.6.35.4/kernel/timer.c linux-2.6.35.4/kernel/timer.c +--- linux-2.6.35.4/kernel/timer.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/kernel/timer.c 2010-09-17 20:12:09.000000000 -0400 +@@ -1272,7 +1272,7 @@ void update_process_times(int user_tick) /* * This function runs timers and the timer-tq in bottom half context. */ @@ -48558,29 +50095,10 @@ diff -urNp linux-2.6.34.1/kernel/timer.c linux-2.6.34.1/kernel/timer.c { struct tvec_base *base = __get_cpu_var(tvec_bases); -diff -urNp linux-2.6.34.1/kernel/trace/Kconfig linux-2.6.34.1/kernel/trace/Kconfig ---- linux-2.6.34.1/kernel/trace/Kconfig 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/kernel/trace/Kconfig 2010-07-07 09:04:57.000000000 -0400 -@@ -124,6 +124,7 @@ if FTRACE - config FUNCTION_TRACER - bool "Kernel Function Tracer" - depends on HAVE_FUNCTION_TRACER -+ depends on !PAX_KERNEXEC - select FRAME_POINTER - select KALLSYMS - select GENERIC_TRACER -@@ -353,6 +354,7 @@ config PROFILE_KSYM_TRACER - config STACK_TRACER - bool "Trace max stack" - depends on HAVE_FUNCTION_TRACER -+ depends on !PAX_KERNEXEC - select FUNCTION_TRACER - select STACKTRACE - select KALLSYMS -diff -urNp linux-2.6.34.1/kernel/trace/ftrace.c linux-2.6.34.1/kernel/trace/ftrace.c ---- linux-2.6.34.1/kernel/trace/ftrace.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/kernel/trace/ftrace.c 2010-07-07 09:04:57.000000000 -0400 -@@ -1079,13 +1079,18 @@ ftrace_code_disable(struct module *mod, +diff -urNp linux-2.6.35.4/kernel/trace/ftrace.c linux-2.6.35.4/kernel/trace/ftrace.c +--- linux-2.6.35.4/kernel/trace/ftrace.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/kernel/trace/ftrace.c 2010-09-17 20:12:09.000000000 -0400 +@@ -1101,13 +1101,18 @@ ftrace_code_disable(struct module *mod, ip = rec->ip; @@ -48601,10 +50119,10 @@ diff -urNp linux-2.6.34.1/kernel/trace/ftrace.c linux-2.6.34.1/kernel/trace/ftra } /* -diff -urNp linux-2.6.34.1/kernel/trace/ring_buffer.c linux-2.6.34.1/kernel/trace/ring_buffer.c ---- linux-2.6.34.1/kernel/trace/ring_buffer.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/kernel/trace/ring_buffer.c 2010-07-07 09:04:57.000000000 -0400 -@@ -621,7 +621,7 @@ static struct list_head *rb_list_head(st +diff -urNp linux-2.6.35.4/kernel/trace/ring_buffer.c linux-2.6.35.4/kernel/trace/ring_buffer.c +--- linux-2.6.35.4/kernel/trace/ring_buffer.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/kernel/trace/ring_buffer.c 2010-09-17 20:12:09.000000000 -0400 +@@ -635,7 +635,7 @@ static struct list_head *rb_list_head(st * the reader page). But if the next page is a header page, * its flags will be non zero. */ @@ -48613,10 +50131,10 @@ diff -urNp linux-2.6.34.1/kernel/trace/ring_buffer.c linux-2.6.34.1/kernel/trace rb_is_head_page(struct ring_buffer_per_cpu *cpu_buffer, struct buffer_page *page, struct list_head *list) { -diff -urNp linux-2.6.34.1/kernel/trace/trace.c linux-2.6.34.1/kernel/trace/trace.c ---- linux-2.6.34.1/kernel/trace/trace.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/kernel/trace/trace.c 2010-07-07 09:04:57.000000000 -0400 -@@ -3918,10 +3918,9 @@ static const struct file_operations trac +diff -urNp linux-2.6.35.4/kernel/trace/trace.c linux-2.6.35.4/kernel/trace/trace.c +--- linux-2.6.35.4/kernel/trace/trace.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/kernel/trace/trace.c 2010-09-17 20:12:09.000000000 -0400 +@@ -3965,10 +3965,9 @@ static const struct file_operations trac }; #endif @@ -48628,7 +50146,7 @@ diff -urNp linux-2.6.34.1/kernel/trace/trace.c linux-2.6.34.1/kernel/trace/trace static int once; if (d_tracer) -@@ -3941,10 +3940,9 @@ struct dentry *tracing_init_dentry(void) +@@ -3988,10 +3987,9 @@ struct dentry *tracing_init_dentry(void) return d_tracer; } @@ -48640,10 +50158,10 @@ diff -urNp linux-2.6.34.1/kernel/trace/trace.c linux-2.6.34.1/kernel/trace/trace static int once; struct dentry *d_tracer; -diff -urNp linux-2.6.34.1/kernel/trace/trace_output.c linux-2.6.34.1/kernel/trace/trace_output.c ---- linux-2.6.34.1/kernel/trace/trace_output.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/kernel/trace/trace_output.c 2010-07-07 09:04:57.000000000 -0400 -@@ -280,7 +280,7 @@ int trace_seq_path(struct trace_seq *s, +diff -urNp linux-2.6.35.4/kernel/trace/trace_output.c linux-2.6.35.4/kernel/trace/trace_output.c +--- linux-2.6.35.4/kernel/trace/trace_output.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/kernel/trace/trace_output.c 2010-09-17 20:12:09.000000000 -0400 +@@ -281,7 +281,7 @@ int trace_seq_path(struct trace_seq *s, p = d_path(path, s->buffer + s->len, PAGE_SIZE - s->len); if (!IS_ERR(p)) { @@ -48652,9 +50170,9 @@ diff -urNp linux-2.6.34.1/kernel/trace/trace_output.c linux-2.6.34.1/kernel/trac if (p) { s->len = p - s->buffer; return 1; -diff -urNp linux-2.6.34.1/kernel/trace/trace_stack.c linux-2.6.34.1/kernel/trace/trace_stack.c ---- linux-2.6.34.1/kernel/trace/trace_stack.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/kernel/trace/trace_stack.c 2010-07-07 09:04:57.000000000 -0400 +diff -urNp linux-2.6.35.4/kernel/trace/trace_stack.c linux-2.6.35.4/kernel/trace/trace_stack.c +--- linux-2.6.35.4/kernel/trace/trace_stack.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/kernel/trace/trace_stack.c 2010-09-17 20:12:09.000000000 -0400 @@ -50,7 +50,7 @@ static inline void check_stack(void) return; @@ -48664,21 +50182,9 @@ diff -urNp linux-2.6.34.1/kernel/trace/trace_stack.c linux-2.6.34.1/kernel/trace return; local_irq_save(flags); -diff -urNp linux-2.6.34.1/lib/Kconfig.debug linux-2.6.34.1/lib/Kconfig.debug ---- linux-2.6.34.1/lib/Kconfig.debug 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/lib/Kconfig.debug 2010-07-07 09:04:57.000000000 -0400 -@@ -946,7 +946,7 @@ config LATENCYTOP - select STACKTRACE - select SCHEDSTATS - select SCHED_DEBUG -- depends on HAVE_LATENCYTOP_SUPPORT -+ depends on HAVE_LATENCYTOP_SUPPORT && !GRKERNSEC_HIDESYM - help - Enable this option if you want to use the LatencyTOP tool - to find out which userspace is blocking on what kernel operations. -diff -urNp linux-2.6.34.1/lib/bug.c linux-2.6.34.1/lib/bug.c ---- linux-2.6.34.1/lib/bug.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/lib/bug.c 2010-07-07 09:04:57.000000000 -0400 +diff -urNp linux-2.6.35.4/lib/bug.c linux-2.6.35.4/lib/bug.c +--- linux-2.6.35.4/lib/bug.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/lib/bug.c 2010-09-17 20:12:09.000000000 -0400 @@ -135,6 +135,8 @@ enum bug_trap_type report_bug(unsigned l return BUG_TRAP_TYPE_NONE; @@ -48688,10 +50194,10 @@ diff -urNp linux-2.6.34.1/lib/bug.c linux-2.6.34.1/lib/bug.c printk(KERN_EMERG "------------[ cut here ]------------\n"); -diff -urNp linux-2.6.34.1/lib/debugobjects.c linux-2.6.34.1/lib/debugobjects.c ---- linux-2.6.34.1/lib/debugobjects.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/lib/debugobjects.c 2010-07-07 09:04:57.000000000 -0400 -@@ -278,7 +278,7 @@ static void debug_object_is_on_stack(voi +diff -urNp linux-2.6.35.4/lib/debugobjects.c linux-2.6.35.4/lib/debugobjects.c +--- linux-2.6.35.4/lib/debugobjects.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/lib/debugobjects.c 2010-09-17 20:12:09.000000000 -0400 +@@ -281,7 +281,7 @@ static void debug_object_is_on_stack(voi if (limit > 4) return; @@ -48700,9 +50206,9 @@ diff -urNp linux-2.6.34.1/lib/debugobjects.c linux-2.6.34.1/lib/debugobjects.c if (is_on_stack == onstack) return; -diff -urNp linux-2.6.34.1/lib/dma-debug.c linux-2.6.34.1/lib/dma-debug.c ---- linux-2.6.34.1/lib/dma-debug.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/lib/dma-debug.c 2010-07-07 09:04:57.000000000 -0400 +diff -urNp linux-2.6.35.4/lib/dma-debug.c linux-2.6.35.4/lib/dma-debug.c +--- linux-2.6.35.4/lib/dma-debug.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/lib/dma-debug.c 2010-09-17 20:12:09.000000000 -0400 @@ -861,7 +861,7 @@ out: static void check_for_stack(struct device *dev, void *addr) @@ -48712,9 +50218,9 @@ diff -urNp linux-2.6.34.1/lib/dma-debug.c linux-2.6.34.1/lib/dma-debug.c err_printk(dev, NULL, "DMA-API: device driver maps memory from" "stack [addr=%p]\n", addr); } -diff -urNp linux-2.6.34.1/lib/inflate.c linux-2.6.34.1/lib/inflate.c ---- linux-2.6.34.1/lib/inflate.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/lib/inflate.c 2010-07-07 09:04:57.000000000 -0400 +diff -urNp linux-2.6.35.4/lib/inflate.c linux-2.6.35.4/lib/inflate.c +--- linux-2.6.35.4/lib/inflate.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/lib/inflate.c 2010-09-17 20:12:09.000000000 -0400 @@ -267,7 +267,7 @@ static void free(void *where) malloc_ptr = free_mem_ptr; } @@ -48724,9 +50230,21 @@ diff -urNp linux-2.6.34.1/lib/inflate.c linux-2.6.34.1/lib/inflate.c #define free(a) kfree(a) #endif -diff -urNp linux-2.6.34.1/lib/parser.c linux-2.6.34.1/lib/parser.c ---- linux-2.6.34.1/lib/parser.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/lib/parser.c 2010-07-07 09:04:57.000000000 -0400 +diff -urNp linux-2.6.35.4/lib/Kconfig.debug linux-2.6.35.4/lib/Kconfig.debug +--- linux-2.6.35.4/lib/Kconfig.debug 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/lib/Kconfig.debug 2010-09-17 20:12:37.000000000 -0400 +@@ -970,7 +970,7 @@ config LATENCYTOP + select STACKTRACE + select SCHEDSTATS + select SCHED_DEBUG +- depends on HAVE_LATENCYTOP_SUPPORT ++ depends on HAVE_LATENCYTOP_SUPPORT && !GRKERNSEC_HIDESYM + help + Enable this option if you want to use the LatencyTOP tool + to find out which userspace is blocking on what kernel operations. +diff -urNp linux-2.6.35.4/lib/parser.c linux-2.6.35.4/lib/parser.c +--- linux-2.6.35.4/lib/parser.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/lib/parser.c 2010-09-17 20:12:09.000000000 -0400 @@ -129,7 +129,7 @@ static int match_number(substring_t *s, char *buf; int ret; @@ -48736,9 +50254,9 @@ diff -urNp linux-2.6.34.1/lib/parser.c linux-2.6.34.1/lib/parser.c if (!buf) return -ENOMEM; memcpy(buf, s->from, s->to - s->from); -diff -urNp linux-2.6.34.1/lib/radix-tree.c linux-2.6.34.1/lib/radix-tree.c ---- linux-2.6.34.1/lib/radix-tree.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/lib/radix-tree.c 2010-07-07 09:04:57.000000000 -0400 +diff -urNp linux-2.6.35.4/lib/radix-tree.c linux-2.6.35.4/lib/radix-tree.c +--- linux-2.6.35.4/lib/radix-tree.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/lib/radix-tree.c 2010-09-17 20:12:09.000000000 -0400 @@ -80,7 +80,7 @@ struct radix_tree_preload { int nr; struct radix_tree_node *nodes[RADIX_TREE_MAX_PATH]; @@ -48748,39 +50266,74 @@ diff -urNp linux-2.6.34.1/lib/radix-tree.c linux-2.6.34.1/lib/radix-tree.c static inline gfp_t root_gfp_mask(struct radix_tree_root *root) { -diff -urNp linux-2.6.34.1/lib/random32.c linux-2.6.34.1/lib/random32.c ---- linux-2.6.34.1/lib/random32.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/lib/random32.c 2010-07-07 09:04:57.000000000 -0400 -@@ -61,7 +61,7 @@ static u32 __random32(struct rnd_state * - */ - static inline u32 __seed(u32 x, u32 m) - { -- return (x < m) ? x + m : x; -+ return (x <= m) ? x + m + 1 : x; - } - - /** -diff -urNp linux-2.6.34.1/localversion-grsec linux-2.6.34.1/localversion-grsec ---- linux-2.6.34.1/localversion-grsec 1969-12-31 19:00:00.000000000 -0500 -+++ linux-2.6.34.1/localversion-grsec 2010-07-07 09:04:57.000000000 -0400 +diff -urNp linux-2.6.35.4/localversion-grsec linux-2.6.35.4/localversion-grsec +--- linux-2.6.35.4/localversion-grsec 1969-12-31 19:00:00.000000000 -0500 ++++ linux-2.6.35.4/localversion-grsec 2010-09-17 20:12:37.000000000 -0400 @@ -0,0 +1 @@ +-grsec -diff -urNp linux-2.6.34.1/mm/Kconfig linux-2.6.34.1/mm/Kconfig ---- linux-2.6.34.1/mm/Kconfig 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/mm/Kconfig 2010-07-07 09:04:57.000000000 -0400 -@@ -226,7 +226,7 @@ config KSM - config DEFAULT_MMAP_MIN_ADDR - int "Low address space to protect from user allocation" - depends on MMU -- default 4096 -+ default 65536 - help - This is the portion of low virtual memory which should be protected - from userspace allocation. Keeping a user from writing to low pages -diff -urNp linux-2.6.34.1/mm/filemap.c linux-2.6.34.1/mm/filemap.c ---- linux-2.6.34.1/mm/filemap.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/mm/filemap.c 2010-07-07 09:04:57.000000000 -0400 -@@ -1607,7 +1607,7 @@ int generic_file_mmap(struct file * file +diff -urNp linux-2.6.35.4/Makefile linux-2.6.35.4/Makefile +--- linux-2.6.35.4/Makefile 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/Makefile 2010-09-17 20:12:37.000000000 -0400 +@@ -230,8 +230,8 @@ CONFIG_SHELL := $(shell if [ -x "$$BASH" + + HOSTCC = gcc + HOSTCXX = g++ +-HOSTCFLAGS = -Wall -Wmissing-prototypes -Wstrict-prototypes -O2 -fomit-frame-pointer +-HOSTCXXFLAGS = -O2 ++HOSTCFLAGS = -Wall -W -Wmissing-prototypes -Wstrict-prototypes -O2 -fomit-frame-pointer -fno-delete-null-pointer-checks ++HOSTCXXFLAGS = -O2 -fno-delete-null-pointer-checks + + # Decide whether to build built-in, modular, or both. + # Normally, just do built-in. +@@ -650,7 +650,7 @@ export mod_strip_cmd + + + ifeq ($(KBUILD_EXTMOD),) +-core-y += kernel/ mm/ fs/ ipc/ security/ crypto/ block/ ++core-y += kernel/ mm/ fs/ ipc/ security/ crypto/ block/ grsecurity/ + + vmlinux-dirs := $(patsubst %/,%,$(filter %/, $(init-y) $(init-m) \ + $(core-y) $(core-m) $(drivers-y) $(drivers-m) \ +diff -urNp linux-2.6.35.4/mm/bootmem.c linux-2.6.35.4/mm/bootmem.c +--- linux-2.6.35.4/mm/bootmem.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/mm/bootmem.c 2010-09-17 20:12:09.000000000 -0400 +@@ -200,19 +200,30 @@ static void __init __free_pages_memory(u + unsigned long __init free_all_memory_core_early(int nodeid) + { + int i; +- u64 start, end; ++ u64 start, end, startrange, endrange; + unsigned long count = 0; +- struct range *range = NULL; ++ struct range *range = NULL, rangerange = { 0, 0 }; + int nr_range; + + nr_range = get_free_all_memory_range(&range, nodeid); ++ startrange = __pa(range) >> PAGE_SHIFT; ++ endrange = (__pa(range + nr_range) - 1) >> PAGE_SHIFT; + + for (i = 0; i < nr_range; i++) { + start = range[i].start; + end = range[i].end; ++ if (start <= endrange && startrange < end) { ++ BUG_ON(rangerange.start | rangerange.end); ++ rangerange = range[i]; ++ continue; ++ } + count += end - start; + __free_pages_memory(start, end); + } ++ start = rangerange.start; ++ end = rangerange.end; ++ count += end - start; ++ __free_pages_memory(start, end); + + return count; + } +diff -urNp linux-2.6.35.4/mm/filemap.c linux-2.6.35.4/mm/filemap.c +--- linux-2.6.35.4/mm/filemap.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/mm/filemap.c 2010-09-17 20:12:37.000000000 -0400 +@@ -1640,7 +1640,7 @@ int generic_file_mmap(struct file * file struct address_space *mapping = file->f_mapping; if (!mapping->a_ops->readpage) @@ -48789,7 +50342,7 @@ diff -urNp linux-2.6.34.1/mm/filemap.c linux-2.6.34.1/mm/filemap.c file_accessed(file); vma->vm_ops = &generic_file_vm_ops; vma->vm_flags |= VM_CAN_NONLINEAR; -@@ -2003,6 +2003,7 @@ inline int generic_write_checks(struct f +@@ -2036,6 +2036,7 @@ inline int generic_write_checks(struct f *pos = i_size_read(inode); if (limit != RLIM_INFINITY) { @@ -48797,9 +50350,9 @@ diff -urNp linux-2.6.34.1/mm/filemap.c linux-2.6.34.1/mm/filemap.c if (*pos >= limit) { send_sig(SIGXFSZ, current, 0); return -EFBIG; -diff -urNp linux-2.6.34.1/mm/fremap.c linux-2.6.34.1/mm/fremap.c ---- linux-2.6.34.1/mm/fremap.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/mm/fremap.c 2010-07-07 09:04:57.000000000 -0400 +diff -urNp linux-2.6.35.4/mm/fremap.c linux-2.6.35.4/mm/fremap.c +--- linux-2.6.35.4/mm/fremap.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/mm/fremap.c 2010-09-17 20:12:09.000000000 -0400 @@ -153,6 +153,11 @@ SYSCALL_DEFINE5(remap_file_pages, unsign retry: vma = find_vma(mm, start); @@ -48812,9 +50365,18 @@ diff -urNp linux-2.6.34.1/mm/fremap.c linux-2.6.34.1/mm/fremap.c /* * Make sure the vma is shared, that it supports prefaulting, * and that the remapped range is valid and fully within -diff -urNp linux-2.6.34.1/mm/highmem.c linux-2.6.34.1/mm/highmem.c ---- linux-2.6.34.1/mm/highmem.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/mm/highmem.c 2010-07-07 09:04:57.000000000 -0400 +@@ -221,7 +226,7 @@ SYSCALL_DEFINE5(remap_file_pages, unsign + /* + * drop PG_Mlocked flag for over-mapped range + */ +- unsigned int saved_flags = vma->vm_flags; ++ unsigned long saved_flags = vma->vm_flags; + munlock_vma_pages_range(vma, start, start + size); + vma->vm_flags = saved_flags; + } +diff -urNp linux-2.6.35.4/mm/highmem.c linux-2.6.35.4/mm/highmem.c +--- linux-2.6.35.4/mm/highmem.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/mm/highmem.c 2010-09-17 20:12:09.000000000 -0400 @@ -116,9 +116,10 @@ static void flush_all_zero_pkmaps(void) * So no dangers, even with speculative execution. */ @@ -48840,10 +50402,10 @@ diff -urNp linux-2.6.34.1/mm/highmem.c linux-2.6.34.1/mm/highmem.c pkmap_count[last_pkmap_nr] = 1; set_page_address(page, (void *)vaddr); -diff -urNp linux-2.6.34.1/mm/hugetlb.c linux-2.6.34.1/mm/hugetlb.c ---- linux-2.6.34.1/mm/hugetlb.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/mm/hugetlb.c 2010-07-07 09:04:57.000000000 -0400 -@@ -2268,6 +2268,26 @@ static int unmap_ref_private(struct mm_s +diff -urNp linux-2.6.35.4/mm/hugetlb.c linux-2.6.35.4/mm/hugetlb.c +--- linux-2.6.35.4/mm/hugetlb.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/mm/hugetlb.c 2010-09-17 20:12:09.000000000 -0400 +@@ -2272,6 +2272,26 @@ static int unmap_ref_private(struct mm_s return 1; } @@ -48870,7 +50432,7 @@ diff -urNp linux-2.6.34.1/mm/hugetlb.c linux-2.6.34.1/mm/hugetlb.c static int hugetlb_cow(struct mm_struct *mm, struct vm_area_struct *vma, unsigned long address, pte_t *ptep, pte_t pte, struct page *pagecache_page) -@@ -2348,6 +2368,11 @@ retry_avoidcopy: +@@ -2352,6 +2372,11 @@ retry_avoidcopy: huge_ptep_clear_flush(vma, address, ptep); set_huge_pte_at(mm, address, ptep, make_huge_pte(vma, new_page, 1)); @@ -48882,7 +50444,7 @@ diff -urNp linux-2.6.34.1/mm/hugetlb.c linux-2.6.34.1/mm/hugetlb.c /* Make the old page be freed below */ new_page = old_page; } -@@ -2479,6 +2504,10 @@ retry: +@@ -2483,6 +2508,10 @@ retry: && (vma->vm_flags & VM_SHARED))); set_huge_pte_at(mm, address, ptep, new_pte); @@ -48893,7 +50455,7 @@ diff -urNp linux-2.6.34.1/mm/hugetlb.c linux-2.6.34.1/mm/hugetlb.c if ((flags & FAULT_FLAG_WRITE) && !(vma->vm_flags & VM_SHARED)) { /* Optimization, do the COW without a second fault */ ret = hugetlb_cow(mm, vma, address, ptep, new_pte, page); -@@ -2507,6 +2536,28 @@ int hugetlb_fault(struct mm_struct *mm, +@@ -2511,6 +2540,28 @@ int hugetlb_fault(struct mm_struct *mm, static DEFINE_MUTEX(hugetlb_instantiation_mutex); struct hstate *h = hstate_vma(vma); @@ -48922,9 +50484,21 @@ diff -urNp linux-2.6.34.1/mm/hugetlb.c linux-2.6.34.1/mm/hugetlb.c ptep = huge_pte_alloc(mm, address, huge_page_size(h)); if (!ptep) return VM_FAULT_OOM; -diff -urNp linux-2.6.34.1/mm/maccess.c linux-2.6.34.1/mm/maccess.c ---- linux-2.6.34.1/mm/maccess.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/mm/maccess.c 2010-07-07 09:04:57.000000000 -0400 +diff -urNp linux-2.6.35.4/mm/Kconfig linux-2.6.35.4/mm/Kconfig +--- linux-2.6.35.4/mm/Kconfig 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/mm/Kconfig 2010-09-17 20:12:37.000000000 -0400 +@@ -240,7 +240,7 @@ config KSM + config DEFAULT_MMAP_MIN_ADDR + int "Low address space to protect from user allocation" + depends on MMU +- default 4096 ++ default 65536 + help + This is the portion of low virtual memory which should be protected + from userspace allocation. Keeping a user from writing to low pages +diff -urNp linux-2.6.35.4/mm/maccess.c linux-2.6.35.4/mm/maccess.c +--- linux-2.6.35.4/mm/maccess.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/mm/maccess.c 2010-09-17 20:12:09.000000000 -0400 @@ -15,10 +15,10 @@ * happens, handle that and return -EFAULT. */ @@ -48951,9 +50525,9 @@ diff -urNp linux-2.6.34.1/mm/maccess.c linux-2.6.34.1/mm/maccess.c { long ret; mm_segment_t old_fs = get_fs(); -diff -urNp linux-2.6.34.1/mm/madvise.c linux-2.6.34.1/mm/madvise.c ---- linux-2.6.34.1/mm/madvise.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/mm/madvise.c 2010-07-07 09:04:57.000000000 -0400 +diff -urNp linux-2.6.35.4/mm/madvise.c linux-2.6.35.4/mm/madvise.c +--- linux-2.6.35.4/mm/madvise.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/mm/madvise.c 2010-09-17 20:12:09.000000000 -0400 @@ -45,6 +45,10 @@ static long madvise_behavior(struct vm_a pgoff_t pgoff; unsigned long new_flags = vma->vm_flags; @@ -49030,75 +50604,10 @@ diff -urNp linux-2.6.34.1/mm/madvise.c linux-2.6.34.1/mm/madvise.c error = 0; if (end == start) goto out; -diff -urNp linux-2.6.34.1/mm/memory-failure.c linux-2.6.34.1/mm/memory-failure.c ---- linux-2.6.34.1/mm/memory-failure.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/mm/memory-failure.c 2010-07-07 09:04:58.000000000 -0400 -@@ -51,7 +51,7 @@ int sysctl_memory_failure_early_kill __r - - int sysctl_memory_failure_recovery __read_mostly = 1; - --atomic_long_t mce_bad_pages __read_mostly = ATOMIC_LONG_INIT(0); -+atomic_long_unchecked_t mce_bad_pages __read_mostly = ATOMIC_LONG_INIT(0); - - #if defined(CONFIG_HWPOISON_INJECT) || defined(CONFIG_HWPOISON_INJECT_MODULE) - -@@ -939,7 +939,7 @@ int __memory_failure(unsigned long pfn, - return 0; - } - -- atomic_long_add(1, &mce_bad_pages); -+ atomic_long_add_unchecked(1, &mce_bad_pages); - - /* - * We need/can do nothing about count=0 pages. -@@ -1003,7 +1003,7 @@ int __memory_failure(unsigned long pfn, - } - if (hwpoison_filter(p)) { - if (TestClearPageHWPoison(p)) -- atomic_long_dec(&mce_bad_pages); -+ atomic_long_dec_unchecked(&mce_bad_pages); - unlock_page(p); - put_page(p); - return 0; -@@ -1096,7 +1096,7 @@ int unpoison_memory(unsigned long pfn) - - if (!get_page_unless_zero(page)) { - if (TestClearPageHWPoison(p)) -- atomic_long_dec(&mce_bad_pages); -+ atomic_long_dec_unchecked(&mce_bad_pages); - pr_debug("MCE: Software-unpoisoned free page %#lx\n", pfn); - return 0; - } -@@ -1110,7 +1110,7 @@ int unpoison_memory(unsigned long pfn) - */ - if (TestClearPageHWPoison(p)) { - pr_debug("MCE: Software-unpoisoned page %#lx\n", pfn); -- atomic_long_dec(&mce_bad_pages); -+ atomic_long_dec_unchecked(&mce_bad_pages); - freeit = 1; - } - unlock_page(page); -@@ -1291,7 +1291,7 @@ int soft_offline_page(struct page *page, - return ret; - - done: -- atomic_long_add(1, &mce_bad_pages); -+ atomic_long_add_unchecked(1, &mce_bad_pages); - SetPageHWPoison(page); - /* keep elevated page count for bad page */ - return ret; -diff -urNp linux-2.6.34.1/mm/memory.c linux-2.6.34.1/mm/memory.c ---- linux-2.6.34.1/mm/memory.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/mm/memory.c 2010-07-07 09:04:58.000000000 -0400 -@@ -48,6 +48,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -259,8 +260,12 @@ static inline void free_pmd_range(struct +diff -urNp linux-2.6.35.4/mm/memory.c linux-2.6.35.4/mm/memory.c +--- linux-2.6.35.4/mm/memory.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/mm/memory.c 2010-09-17 20:12:09.000000000 -0400 +@@ -259,8 +259,12 @@ static inline void free_pmd_range(struct return; pmd = pmd_offset(pud, start); @@ -49111,7 +50620,7 @@ diff -urNp linux-2.6.34.1/mm/memory.c linux-2.6.34.1/mm/memory.c } static inline void free_pud_range(struct mmu_gather *tlb, pgd_t *pgd, -@@ -292,8 +297,12 @@ static inline void free_pud_range(struct +@@ -292,8 +296,12 @@ static inline void free_pud_range(struct return; pud = pud_offset(pgd, start); @@ -49124,7 +50633,7 @@ diff -urNp linux-2.6.34.1/mm/memory.c linux-2.6.34.1/mm/memory.c } /* -@@ -1354,10 +1363,10 @@ int __get_user_pages(struct task_struct +@@ -1363,10 +1371,10 @@ int __get_user_pages(struct task_struct (VM_MAYREAD | VM_MAYWRITE) : (VM_READ | VM_WRITE); i = 0; @@ -49137,7 +50646,7 @@ diff -urNp linux-2.6.34.1/mm/memory.c linux-2.6.34.1/mm/memory.c if (!vma && in_gate_area(tsk, start)) { unsigned long pg = start & PAGE_MASK; struct vm_area_struct *gate_vma = get_gate_vma(tsk); -@@ -1399,7 +1408,7 @@ int __get_user_pages(struct task_struct +@@ -1418,7 +1426,7 @@ int __get_user_pages(struct task_struct continue; } @@ -49146,7 +50655,7 @@ diff -urNp linux-2.6.34.1/mm/memory.c linux-2.6.34.1/mm/memory.c (vma->vm_flags & (VM_IO | VM_PFNMAP)) || !(vm_flags & vma->vm_flags)) return i ? : -EFAULT; -@@ -1474,7 +1483,7 @@ int __get_user_pages(struct task_struct +@@ -1493,7 +1501,7 @@ int __get_user_pages(struct task_struct start += PAGE_SIZE; nr_pages--; } while (nr_pages && start < vma->vm_end); @@ -49155,7 +50664,7 @@ diff -urNp linux-2.6.34.1/mm/memory.c linux-2.6.34.1/mm/memory.c return i; } -@@ -2070,6 +2079,186 @@ static inline void cow_user_page(struct +@@ -2089,6 +2097,186 @@ static inline void cow_user_page(struct copy_user_highpage(dst, src, va, vma); } @@ -49342,7 +50851,7 @@ diff -urNp linux-2.6.34.1/mm/memory.c linux-2.6.34.1/mm/memory.c /* * This routine handles present pages, when users try to write * to a shared page. It is done by copying the page to a new address -@@ -2256,6 +2445,12 @@ gotten: +@@ -2275,6 +2463,12 @@ gotten: */ page_table = pte_offset_map_lock(mm, pmd, address, &ptl); if (likely(pte_same(*page_table, orig_pte))) { @@ -49355,7 +50864,7 @@ diff -urNp linux-2.6.34.1/mm/memory.c linux-2.6.34.1/mm/memory.c if (old_page) { if (!PageAnon(old_page)) { dec_mm_counter_fast(mm, MM_FILEPAGES); -@@ -2307,6 +2502,10 @@ gotten: +@@ -2326,6 +2520,10 @@ gotten: page_remove_rmap(old_page); } @@ -49366,7 +50875,7 @@ diff -urNp linux-2.6.34.1/mm/memory.c linux-2.6.34.1/mm/memory.c /* Free the old page.. */ new_page = old_page; ret |= VM_FAULT_WRITE; -@@ -2715,6 +2914,11 @@ static int do_swap_page(struct mm_struct +@@ -2734,6 +2932,11 @@ static int do_swap_page(struct mm_struct swap_free(entry); if (vm_swap_full() || (vma->vm_flags & VM_LOCKED) || PageMlocked(page)) try_to_free_swap(page); @@ -49378,7 +50887,7 @@ diff -urNp linux-2.6.34.1/mm/memory.c linux-2.6.34.1/mm/memory.c unlock_page(page); if (flags & FAULT_FLAG_WRITE) { -@@ -2726,6 +2930,11 @@ static int do_swap_page(struct mm_struct +@@ -2745,6 +2948,11 @@ static int do_swap_page(struct mm_struct /* No need to invalidate - it was non-present before */ update_mmu_cache(vma, address, page_table); @@ -49390,7 +50899,41 @@ diff -urNp linux-2.6.34.1/mm/memory.c linux-2.6.34.1/mm/memory.c unlock: pte_unmap_unlock(page_table, ptl); out: -@@ -2749,7 +2958,7 @@ static int do_anonymous_page(struct mm_s +@@ -2760,33 +2968,6 @@ out_release: + } + + /* +- * This is like a special single-page "expand_downwards()", +- * except we must first make sure that 'address-PAGE_SIZE' +- * doesn't hit another vma. +- * +- * The "find_vma()" will do the right thing even if we wrap +- */ +-static inline int check_stack_guard_page(struct vm_area_struct *vma, unsigned long address) +-{ +- address &= PAGE_MASK; +- if ((vma->vm_flags & VM_GROWSDOWN) && address == vma->vm_start) { +- struct vm_area_struct *prev = vma->vm_prev; +- +- /* +- * Is there a mapping abutting this one below? +- * +- * That's only ok if it's the same stack mapping +- * that has gotten split.. +- */ +- if (prev && prev->vm_end == address) +- return prev->vm_flags & VM_GROWSDOWN ? 0 : -ENOMEM; +- +- expand_stack(vma, address - PAGE_SIZE); +- } +- return 0; +-} +- +-/* + * We enter with non-exclusive mmap_sem (to exclude vma changes, + * but allow concurrent faults), and pte mapped but not yet locked. + * We return with mmap_sem still held, but pte unmapped and unlocked. +@@ -2795,27 +2976,23 @@ static int do_anonymous_page(struct mm_s unsigned long address, pte_t *page_table, pmd_t *pmd, unsigned int flags) { @@ -49399,7 +50942,31 @@ diff -urNp linux-2.6.34.1/mm/memory.c linux-2.6.34.1/mm/memory.c spinlock_t *ptl; pte_t entry; -@@ -2784,6 +2993,11 @@ static int do_anonymous_page(struct mm_s +- pte_unmap(page_table); +- +- /* Check if we need to add a guard page to the stack */ +- if (check_stack_guard_page(vma, address) < 0) +- return VM_FAULT_SIGBUS; +- +- /* Use the zero-page for reads */ + if (!(flags & FAULT_FLAG_WRITE)) { + entry = pte_mkspecial(pfn_pte(my_zero_pfn(address), + vma->vm_page_prot)); +- page_table = pte_offset_map_lock(mm, pmd, address, &ptl); ++ ptl = pte_lockptr(mm, pmd); ++ spin_lock(ptl); + if (!pte_none(*page_table)) + goto unlock; + goto setpte; + } + + /* Allocate our own private page. */ ++ pte_unmap(page_table); ++ + if (unlikely(anon_vma_prepare(vma))) + goto oom; + page = alloc_zeroed_user_highpage_movable(vma, address); +@@ -2834,6 +3011,11 @@ static int do_anonymous_page(struct mm_s if (!pte_none(*page_table)) goto release; @@ -49411,7 +50978,7 @@ diff -urNp linux-2.6.34.1/mm/memory.c linux-2.6.34.1/mm/memory.c inc_mm_counter_fast(mm, MM_ANONPAGES); page_add_new_anon_rmap(page, vma, address); setpte: -@@ -2791,6 +3005,12 @@ setpte: +@@ -2841,6 +3023,12 @@ setpte: /* No need to invalidate - it was non-present before */ update_mmu_cache(vma, address, page_table); @@ -49424,7 +50991,7 @@ diff -urNp linux-2.6.34.1/mm/memory.c linux-2.6.34.1/mm/memory.c unlock: pte_unmap_unlock(page_table, ptl); return 0; -@@ -2933,6 +3153,12 @@ static int __do_fault(struct mm_struct * +@@ -2983,6 +3171,12 @@ static int __do_fault(struct mm_struct * */ /* Only go through if we didn't race with anybody else... */ if (likely(pte_same(*page_table, orig_pte))) { @@ -49437,7 +51004,7 @@ diff -urNp linux-2.6.34.1/mm/memory.c linux-2.6.34.1/mm/memory.c flush_icache_page(vma, page); entry = mk_pte(page, vma->vm_page_prot); if (flags & FAULT_FLAG_WRITE) -@@ -2952,6 +3178,14 @@ static int __do_fault(struct mm_struct * +@@ -3002,6 +3196,14 @@ static int __do_fault(struct mm_struct * /* no need to invalidate: a not-present page won't be cached */ update_mmu_cache(vma, address, page_table); @@ -49452,7 +51019,7 @@ diff -urNp linux-2.6.34.1/mm/memory.c linux-2.6.34.1/mm/memory.c } else { if (charged) mem_cgroup_uncharge_page(page); -@@ -3099,6 +3333,12 @@ static inline int handle_pte_fault(struc +@@ -3149,6 +3351,12 @@ static inline int handle_pte_fault(struc if (flags & FAULT_FLAG_WRITE) flush_tlb_page(vma, address); } @@ -49465,7 +51032,7 @@ diff -urNp linux-2.6.34.1/mm/memory.c linux-2.6.34.1/mm/memory.c unlock: pte_unmap_unlock(pte, ptl); return 0; -@@ -3115,6 +3355,10 @@ int handle_mm_fault(struct mm_struct *mm +@@ -3165,6 +3373,10 @@ int handle_mm_fault(struct mm_struct *mm pmd_t *pmd; pte_t *pte; @@ -49476,7 +51043,7 @@ diff -urNp linux-2.6.34.1/mm/memory.c linux-2.6.34.1/mm/memory.c __set_current_state(TASK_RUNNING); count_vm_event(PGFAULT); -@@ -3125,6 +3369,34 @@ int handle_mm_fault(struct mm_struct *mm +@@ -3175,6 +3387,34 @@ int handle_mm_fault(struct mm_struct *mm if (unlikely(is_vm_hugetlb_page(vma))) return hugetlb_fault(mm, vma, address, flags); @@ -49511,7 +51078,7 @@ diff -urNp linux-2.6.34.1/mm/memory.c linux-2.6.34.1/mm/memory.c pgd = pgd_offset(mm, address); pud = pud_alloc(mm, pgd, address); if (!pud) -@@ -3222,7 +3494,7 @@ static int __init gate_vma_init(void) +@@ -3272,7 +3512,7 @@ static int __init gate_vma_init(void) gate_vma.vm_start = FIXADDR_USER_START; gate_vma.vm_end = FIXADDR_USER_END; gate_vma.vm_flags = VM_READ | VM_MAYREAD | VM_EXEC | VM_MAYEXEC; @@ -49520,10 +51087,67 @@ diff -urNp linux-2.6.34.1/mm/memory.c linux-2.6.34.1/mm/memory.c /* * Make sure the vDSO gets into every core dump. * Dumping its contents makes post-mortem fully interpretable later -diff -urNp linux-2.6.34.1/mm/mempolicy.c linux-2.6.34.1/mm/mempolicy.c ---- linux-2.6.34.1/mm/mempolicy.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/mm/mempolicy.c 2010-07-07 09:04:58.000000000 -0400 -@@ -573,6 +573,10 @@ static int mbind_range(struct mm_struct +diff -urNp linux-2.6.35.4/mm/memory-failure.c linux-2.6.35.4/mm/memory-failure.c +--- linux-2.6.35.4/mm/memory-failure.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/mm/memory-failure.c 2010-09-17 20:12:09.000000000 -0400 +@@ -51,7 +51,7 @@ int sysctl_memory_failure_early_kill __r + + int sysctl_memory_failure_recovery __read_mostly = 1; + +-atomic_long_t mce_bad_pages __read_mostly = ATOMIC_LONG_INIT(0); ++atomic_long_unchecked_t mce_bad_pages __read_mostly = ATOMIC_LONG_INIT(0); + + #if defined(CONFIG_HWPOISON_INJECT) || defined(CONFIG_HWPOISON_INJECT_MODULE) + +@@ -939,7 +939,7 @@ int __memory_failure(unsigned long pfn, + return 0; + } + +- atomic_long_add(1, &mce_bad_pages); ++ atomic_long_add_unchecked(1, &mce_bad_pages); + + /* + * We need/can do nothing about count=0 pages. +@@ -1003,7 +1003,7 @@ int __memory_failure(unsigned long pfn, + } + if (hwpoison_filter(p)) { + if (TestClearPageHWPoison(p)) +- atomic_long_dec(&mce_bad_pages); ++ atomic_long_dec_unchecked(&mce_bad_pages); + unlock_page(p); + put_page(p); + return 0; +@@ -1096,7 +1096,7 @@ int unpoison_memory(unsigned long pfn) + + if (!get_page_unless_zero(page)) { + if (TestClearPageHWPoison(p)) +- atomic_long_dec(&mce_bad_pages); ++ atomic_long_dec_unchecked(&mce_bad_pages); + pr_debug("MCE: Software-unpoisoned free page %#lx\n", pfn); + return 0; + } +@@ -1110,7 +1110,7 @@ int unpoison_memory(unsigned long pfn) + */ + if (TestClearPageHWPoison(p)) { + pr_debug("MCE: Software-unpoisoned page %#lx\n", pfn); +- atomic_long_dec(&mce_bad_pages); ++ atomic_long_dec_unchecked(&mce_bad_pages); + freeit = 1; + } + unlock_page(page); +@@ -1291,7 +1291,7 @@ int soft_offline_page(struct page *page, + return ret; + + done: +- atomic_long_add(1, &mce_bad_pages); ++ atomic_long_add_unchecked(1, &mce_bad_pages); + SetPageHWPoison(page); + /* keep elevated page count for bad page */ + return ret; +diff -urNp linux-2.6.35.4/mm/mempolicy.c linux-2.6.35.4/mm/mempolicy.c +--- linux-2.6.35.4/mm/mempolicy.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/mm/mempolicy.c 2010-09-17 20:12:37.000000000 -0400 +@@ -642,6 +642,10 @@ static int mbind_range(struct mm_struct unsigned long vmstart; unsigned long vmend; @@ -49534,7 +51158,7 @@ diff -urNp linux-2.6.34.1/mm/mempolicy.c linux-2.6.34.1/mm/mempolicy.c vma = find_vma_prev(mm, start, &prev); if (!vma || vma->vm_start > start) return -EFAULT; -@@ -603,6 +607,16 @@ static int mbind_range(struct mm_struct +@@ -672,6 +676,16 @@ static int mbind_range(struct mm_struct err = policy_vma(vma, new_pol); if (err) goto out; @@ -49551,7 +51175,7 @@ diff -urNp linux-2.6.34.1/mm/mempolicy.c linux-2.6.34.1/mm/mempolicy.c } out: -@@ -1029,6 +1043,17 @@ static long do_mbind(unsigned long start +@@ -1098,6 +1112,17 @@ static long do_mbind(unsigned long start if (end < start) return -EINVAL; @@ -49569,7 +51193,7 @@ diff -urNp linux-2.6.34.1/mm/mempolicy.c linux-2.6.34.1/mm/mempolicy.c if (end == start) return 0; -@@ -1234,6 +1259,14 @@ SYSCALL_DEFINE4(migrate_pages, pid_t, pi +@@ -1303,6 +1328,14 @@ SYSCALL_DEFINE4(migrate_pages, pid_t, pi if (!mm) return -EINVAL; @@ -49584,7 +51208,7 @@ diff -urNp linux-2.6.34.1/mm/mempolicy.c linux-2.6.34.1/mm/mempolicy.c /* * Check if this process has the right to modify the specified * process. The right exists if the process has administrative -@@ -1243,8 +1276,7 @@ SYSCALL_DEFINE4(migrate_pages, pid_t, pi +@@ -1312,8 +1345,7 @@ SYSCALL_DEFINE4(migrate_pages, pid_t, pi rcu_read_lock(); tcred = __task_cred(task); if (cred->euid != tcred->suid && cred->euid != tcred->uid && @@ -49594,7 +51218,7 @@ diff -urNp linux-2.6.34.1/mm/mempolicy.c linux-2.6.34.1/mm/mempolicy.c rcu_read_unlock(); err = -EPERM; goto out; -@@ -2472,7 +2504,7 @@ int show_numa_map(struct seq_file *m, vo +@@ -2564,7 +2596,7 @@ int show_numa_map(struct seq_file *m, vo if (file) { seq_printf(m, " file="); @@ -49603,10 +51227,10 @@ diff -urNp linux-2.6.34.1/mm/mempolicy.c linux-2.6.34.1/mm/mempolicy.c } else if (vma->vm_start <= mm->brk && vma->vm_end >= mm->start_brk) { seq_printf(m, " heap"); } else if (vma->vm_start <= mm->start_stack && -diff -urNp linux-2.6.34.1/mm/migrate.c linux-2.6.34.1/mm/migrate.c ---- linux-2.6.34.1/mm/migrate.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/mm/migrate.c 2010-07-07 09:04:58.000000000 -0400 -@@ -1056,6 +1056,14 @@ SYSCALL_DEFINE6(move_pages, pid_t, pid, +diff -urNp linux-2.6.35.4/mm/migrate.c linux-2.6.35.4/mm/migrate.c +--- linux-2.6.35.4/mm/migrate.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/mm/migrate.c 2010-09-17 20:12:37.000000000 -0400 +@@ -1102,6 +1102,14 @@ SYSCALL_DEFINE6(move_pages, pid_t, pid, if (!mm) return -EINVAL; @@ -49621,7 +51245,7 @@ diff -urNp linux-2.6.34.1/mm/migrate.c linux-2.6.34.1/mm/migrate.c /* * Check if this process has the right to modify the specified * process. The right exists if the process has administrative -@@ -1065,8 +1073,7 @@ SYSCALL_DEFINE6(move_pages, pid_t, pid, +@@ -1111,8 +1119,7 @@ SYSCALL_DEFINE6(move_pages, pid_t, pid, rcu_read_lock(); tcred = __task_cred(task); if (cred->euid != tcred->suid && cred->euid != tcred->uid && @@ -49631,9 +51255,9 @@ diff -urNp linux-2.6.34.1/mm/migrate.c linux-2.6.34.1/mm/migrate.c rcu_read_unlock(); err = -EPERM; goto out; -diff -urNp linux-2.6.34.1/mm/mlock.c linux-2.6.34.1/mm/mlock.c ---- linux-2.6.34.1/mm/mlock.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/mm/mlock.c 2010-07-07 09:04:58.000000000 -0400 +diff -urNp linux-2.6.35.4/mm/mlock.c linux-2.6.35.4/mm/mlock.c +--- linux-2.6.35.4/mm/mlock.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/mm/mlock.c 2010-09-17 20:12:37.000000000 -0400 @@ -13,6 +13,7 @@ #include #include @@ -49642,25 +51266,62 @@ diff -urNp linux-2.6.34.1/mm/mlock.c linux-2.6.34.1/mm/mlock.c #include #include #include -@@ -432,6 +433,17 @@ static int do_mlock(unsigned long start, +@@ -135,19 +136,6 @@ void munlock_vma_page(struct page *page) + } + } + +-/* Is the vma a continuation of the stack vma above it? */ +-static inline int vma_stack_continue(struct vm_area_struct *vma, unsigned long addr) +-{ +- return vma && (vma->vm_end == addr) && (vma->vm_flags & VM_GROWSDOWN); +-} +- +-static inline int stack_guard_page(struct vm_area_struct *vma, unsigned long addr) +-{ +- return (vma->vm_flags & VM_GROWSDOWN) && +- (vma->vm_start == addr) && +- !vma_stack_continue(vma->vm_prev, addr); +-} +- + /** + * __mlock_vma_pages_range() - mlock a range of pages in the vma. + * @vma: target vma +@@ -180,12 +168,6 @@ static long __mlock_vma_pages_range(stru + if (vma->vm_flags & VM_WRITE) + gup_flags |= FOLL_WRITE; + +- /* We don't try to access the guard page of a stack vma */ +- if (stack_guard_page(vma, start)) { +- addr += PAGE_SIZE; +- nr_pages--; +- } +- + while (nr_pages > 0) { + int i; + +@@ -451,6 +433,9 @@ static int do_mlock(unsigned long start, return -EINVAL; if (end == start) return 0; -+ -+#ifdef CONFIG_PAX_SEGMEXEC -+ if (current->mm->pax_flags & MF_PAX_SEGMEXEC) { -+ if (end > SEGMEXEC_TASK_SIZE) -+ return -EINVAL; -+ } else -+#endif -+ + if (end > TASK_SIZE) + return -EINVAL; + vma = find_vma_prev(current->mm, start, &prev); if (!vma || vma->vm_start > start) return -ENOMEM; -@@ -491,6 +503,7 @@ SYSCALL_DEFINE2(mlock, unsigned long, st +@@ -461,6 +446,11 @@ static int do_mlock(unsigned long start, + for (nstart = start ; ; ) { + unsigned int newflags; + ++#ifdef CONFIG_PAX_SEGMEXEC ++ if ((current->mm->pax_flags & MF_PAX_SEGMEXEC) && (vma->vm_start >= SEGMEXEC_TASK_SIZE)) ++ break; ++#endif ++ + /* Here we know that vma->vm_start <= nstart < vma->vm_end. */ + + newflags = vma->vm_flags | VM_LOCKED; +@@ -510,6 +500,7 @@ SYSCALL_DEFINE2(mlock, unsigned long, st lock_limit >>= PAGE_SHIFT; /* check against resource limits */ @@ -49668,43 +51329,45 @@ diff -urNp linux-2.6.34.1/mm/mlock.c linux-2.6.34.1/mm/mlock.c if ((locked <= lock_limit) || capable(CAP_IPC_LOCK)) error = do_mlock(start, len, 1); up_write(¤t->mm->mmap_sem); -@@ -512,10 +525,10 @@ SYSCALL_DEFINE2(munlock, unsigned long, +@@ -531,17 +522,23 @@ SYSCALL_DEFINE2(munlock, unsigned long, static int do_mlockall(int flags) { struct vm_area_struct * vma, * prev = NULL; - unsigned int def_flags = 0; -+ unsigned int def_flags = current->mm->def_flags & ~VM_LOCKED; if (flags & MCL_FUTURE) - def_flags = VM_LOCKED; -+ def_flags |= VM_LOCKED; - current->mm->def_flags = def_flags; +- current->mm->def_flags = def_flags; ++ current->mm->def_flags |= VM_LOCKED; ++ else ++ current->mm->def_flags &= ~VM_LOCKED; if (flags == MCL_FUTURE) goto out; -@@ -523,6 +536,12 @@ static int do_mlockall(int flags) - for (vma = current->mm->mmap; vma ; vma = prev->vm_next) { - unsigned int newflags; + for (vma = current->mm->mmap; vma ; vma = prev->vm_next) { +- unsigned int newflags; ++ unsigned long newflags; ++ +#ifdef CONFIG_PAX_SEGMEXEC + if ((current->mm->pax_flags & MF_PAX_SEGMEXEC) && (vma->vm_start >= SEGMEXEC_TASK_SIZE)) + break; +#endif -+ + + BUG_ON(vma->vm_end > TASK_SIZE); newflags = vma->vm_flags | VM_LOCKED; if (!(flags & MCL_CURRENT)) newflags &= ~VM_LOCKED; -@@ -554,6 +573,7 @@ SYSCALL_DEFINE1(mlockall, int, flags) +@@ -573,6 +570,7 @@ SYSCALL_DEFINE1(mlockall, int, flags) lock_limit >>= PAGE_SHIFT; ret = -ENOMEM; -+ gr_learn_resource(current, RLIMIT_MEMLOCK, current->mm->total_vm, 1); ++ gr_learn_resource(current, RLIMIT_MEMLOCK, current->mm->total_vm << PAGE_SHIFT, 1); if (!(flags & MCL_CURRENT) || (current->mm->total_vm <= lock_limit) || capable(CAP_IPC_LOCK)) ret = do_mlockall(flags); -diff -urNp linux-2.6.34.1/mm/mmap.c linux-2.6.34.1/mm/mmap.c ---- linux-2.6.34.1/mm/mmap.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/mm/mmap.c 2010-07-07 09:04:58.000000000 -0400 +diff -urNp linux-2.6.35.4/mm/mmap.c linux-2.6.35.4/mm/mmap.c +--- linux-2.6.35.4/mm/mmap.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/mm/mmap.c 2010-09-17 20:12:37.000000000 -0400 @@ -44,6 +44,16 @@ #define arch_rebalance_pgtables(addr, len) (addr) #endif @@ -49722,7 +51385,7 @@ diff -urNp linux-2.6.34.1/mm/mmap.c linux-2.6.34.1/mm/mmap.c static void unmap_region(struct mm_struct *mm, struct vm_area_struct *vma, struct vm_area_struct *prev, unsigned long start, unsigned long end); -@@ -69,16 +79,25 @@ static void unmap_region(struct mm_struc +@@ -69,22 +79,32 @@ static void unmap_region(struct mm_struc * x: (no) no x: (no) yes x: (no) yes x: (yes) yes * */ @@ -49750,7 +51413,14 @@ diff -urNp linux-2.6.34.1/mm/mmap.c linux-2.6.34.1/mm/mmap.c } EXPORT_SYMBOL(vm_get_page_prot); -@@ -230,6 +249,7 @@ static struct vm_area_struct *remove_vma + int sysctl_overcommit_memory = OVERCOMMIT_GUESS; /* heuristic overcommit */ + int sysctl_overcommit_ratio = 50; /* default is 50% */ + int sysctl_max_map_count __read_mostly = DEFAULT_MAX_MAP_COUNT; ++unsigned long sysctl_heap_stack_gap __read_mostly = 64*1024; + struct percpu_counter vm_committed_as; + + /* +@@ -230,6 +250,7 @@ static struct vm_area_struct *remove_vma struct vm_area_struct *next = vma->vm_next; might_sleep(); @@ -49758,7 +51428,7 @@ diff -urNp linux-2.6.34.1/mm/mmap.c linux-2.6.34.1/mm/mmap.c if (vma->vm_ops && vma->vm_ops->close) vma->vm_ops->close(vma); if (vma->vm_file) { -@@ -266,6 +286,7 @@ SYSCALL_DEFINE1(brk, unsigned long, brk) +@@ -266,6 +287,7 @@ SYSCALL_DEFINE1(brk, unsigned long, brk) * not page aligned -Ram Gupta */ rlim = rlimit(RLIMIT_DATA); @@ -49766,7 +51436,7 @@ diff -urNp linux-2.6.34.1/mm/mmap.c linux-2.6.34.1/mm/mmap.c if (rlim < RLIM_INFINITY && (brk - mm->start_brk) + (mm->end_data - mm->start_data) > rlim) goto out; -@@ -685,6 +706,12 @@ static int +@@ -695,6 +717,12 @@ static int can_vma_merge_before(struct vm_area_struct *vma, unsigned long vm_flags, struct anon_vma *anon_vma, struct file *file, pgoff_t vm_pgoff) { @@ -49779,7 +51449,7 @@ diff -urNp linux-2.6.34.1/mm/mmap.c linux-2.6.34.1/mm/mmap.c if (is_mergeable_vma(vma, file, vm_flags) && is_mergeable_anon_vma(anon_vma, vma->anon_vma)) { if (vma->vm_pgoff == vm_pgoff) -@@ -704,6 +731,12 @@ static int +@@ -714,6 +742,12 @@ static int can_vma_merge_after(struct vm_area_struct *vma, unsigned long vm_flags, struct anon_vma *anon_vma, struct file *file, pgoff_t vm_pgoff) { @@ -49792,7 +51462,7 @@ diff -urNp linux-2.6.34.1/mm/mmap.c linux-2.6.34.1/mm/mmap.c if (is_mergeable_vma(vma, file, vm_flags) && is_mergeable_anon_vma(anon_vma, vma->anon_vma)) { pgoff_t vm_pglen; -@@ -746,13 +779,20 @@ can_vma_merge_after(struct vm_area_struc +@@ -756,13 +790,20 @@ can_vma_merge_after(struct vm_area_struc struct vm_area_struct *vma_merge(struct mm_struct *mm, struct vm_area_struct *prev, unsigned long addr, unsigned long end, unsigned long vm_flags, @@ -49814,7 +51484,7 @@ diff -urNp linux-2.6.34.1/mm/mmap.c linux-2.6.34.1/mm/mmap.c /* * We later require that vma->vm_flags == vm_flags, * so this tests vma->vm_flags & VM_SPECIAL, too. -@@ -768,6 +808,15 @@ struct vm_area_struct *vma_merge(struct +@@ -778,6 +819,15 @@ struct vm_area_struct *vma_merge(struct if (next && next->vm_end == end) /* cases 6, 7, 8 */ next = next->vm_next; @@ -49830,7 +51500,7 @@ diff -urNp linux-2.6.34.1/mm/mmap.c linux-2.6.34.1/mm/mmap.c /* * Can it merge with the predecessor? */ -@@ -787,9 +836,24 @@ struct vm_area_struct *vma_merge(struct +@@ -797,9 +847,24 @@ struct vm_area_struct *vma_merge(struct /* cases 1, 6 */ err = vma_adjust(prev, prev->vm_start, next->vm_end, prev->vm_pgoff, NULL); @@ -49856,7 +51526,7 @@ diff -urNp linux-2.6.34.1/mm/mmap.c linux-2.6.34.1/mm/mmap.c if (err) return NULL; return prev; -@@ -802,12 +866,27 @@ struct vm_area_struct *vma_merge(struct +@@ -812,12 +877,27 @@ struct vm_area_struct *vma_merge(struct mpol_equal(policy, vma_policy(next)) && can_vma_merge_before(next, vm_flags, anon_vma, file, pgoff+pglen)) { @@ -49886,7 +51556,7 @@ diff -urNp linux-2.6.34.1/mm/mmap.c linux-2.6.34.1/mm/mmap.c if (err) return NULL; return area; -@@ -922,14 +1001,11 @@ none: +@@ -932,14 +1012,11 @@ none: void vm_stat_account(struct mm_struct *mm, unsigned long flags, struct file *file, long pages) { @@ -49902,7 +51572,7 @@ diff -urNp linux-2.6.34.1/mm/mmap.c linux-2.6.34.1/mm/mmap.c mm->stack_vm += pages; if (flags & (VM_RESERVED|VM_IO)) mm->reserved_vm += pages; -@@ -956,7 +1032,7 @@ unsigned long do_mmap_pgoff(struct file +@@ -966,7 +1043,7 @@ unsigned long do_mmap_pgoff(struct file * (the exception is when the underlying filesystem is noexec * mounted, in which case we dont add PROT_EXEC.) */ @@ -49911,7 +51581,7 @@ diff -urNp linux-2.6.34.1/mm/mmap.c linux-2.6.34.1/mm/mmap.c if (!(file && (file->f_path.mnt->mnt_flags & MNT_NOEXEC))) prot |= PROT_EXEC; -@@ -982,7 +1058,7 @@ unsigned long do_mmap_pgoff(struct file +@@ -992,7 +1069,7 @@ unsigned long do_mmap_pgoff(struct file /* Obtain the address to map to. we verify (or select) it and ensure * that it represents a valid section of the address space. */ @@ -49920,22 +51590,24 @@ diff -urNp linux-2.6.34.1/mm/mmap.c linux-2.6.34.1/mm/mmap.c if (addr & ~PAGE_MASK) return addr; -@@ -993,6 +1069,26 @@ unsigned long do_mmap_pgoff(struct file +@@ -1003,6 +1080,28 @@ unsigned long do_mmap_pgoff(struct file vm_flags = calc_vm_prot_bits(prot) | calc_vm_flag_bits(flags) | mm->def_flags | VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC; -+#if defined(CONFIG_PAX_PAGEEXEC) || defined(CONFIG_PAX_SEGMEXEC) -+ if (mm->pax_flags & (MF_PAX_PAGEEXEC | MF_PAX_SEGMEXEC)) { -+ +#ifdef CONFIG_PAX_MPROTECT -+ if (mm->pax_flags & MF_PAX_MPROTECT) { -+ if ((prot & (PROT_WRITE | PROT_EXEC)) != PROT_EXEC) -+ vm_flags &= ~(VM_EXEC | VM_MAYEXEC); -+ else -+ vm_flags &= ~(VM_WRITE | VM_MAYWRITE); -+ } ++ if (mm->pax_flags & MF_PAX_MPROTECT) { ++ if ((vm_flags & (VM_WRITE | VM_EXEC)) == (VM_WRITE | VM_EXEC)) ++ ++#ifdef CONFIG_PAX_EMUPLT ++ vm_flags &= ~VM_EXEC; ++#else ++ return -EPERM; +#endif + ++ if (!(vm_flags & VM_EXEC)) ++ vm_flags &= ~VM_MAYEXEC; ++ else ++ vm_flags &= ~VM_MAYWRITE; + } +#endif + @@ -49947,7 +51619,7 @@ diff -urNp linux-2.6.34.1/mm/mmap.c linux-2.6.34.1/mm/mmap.c if (flags & MAP_LOCKED) if (!can_do_mlock()) return -EPERM; -@@ -1004,6 +1100,7 @@ unsigned long do_mmap_pgoff(struct file +@@ -1014,6 +1113,7 @@ unsigned long do_mmap_pgoff(struct file locked += mm->locked_vm; lock_limit = rlimit(RLIMIT_MEMLOCK); lock_limit >>= PAGE_SHIFT; @@ -49955,7 +51627,7 @@ diff -urNp linux-2.6.34.1/mm/mmap.c linux-2.6.34.1/mm/mmap.c if (locked > lock_limit && !capable(CAP_IPC_LOCK)) return -EAGAIN; } -@@ -1074,6 +1171,9 @@ unsigned long do_mmap_pgoff(struct file +@@ -1084,6 +1184,9 @@ unsigned long do_mmap_pgoff(struct file if (error) return error; @@ -49965,7 +51637,7 @@ diff -urNp linux-2.6.34.1/mm/mmap.c linux-2.6.34.1/mm/mmap.c return mmap_region(file, addr, len, flags, vm_flags, pgoff); } EXPORT_SYMBOL(do_mmap_pgoff); -@@ -1150,10 +1250,10 @@ SYSCALL_DEFINE1(old_mmap, struct mmap_ar +@@ -1160,10 +1263,10 @@ SYSCALL_DEFINE1(old_mmap, struct mmap_ar */ int vma_wants_writenotify(struct vm_area_struct *vma) { @@ -49978,7 +51650,7 @@ diff -urNp linux-2.6.34.1/mm/mmap.c linux-2.6.34.1/mm/mmap.c return 0; /* The backer wishes to know when pages are first written to? */ -@@ -1202,14 +1302,24 @@ unsigned long mmap_region(struct file *f +@@ -1212,14 +1315,24 @@ unsigned long mmap_region(struct file *f unsigned long charged = 0; struct inode *inode = file ? file->f_path.dentry->d_inode : NULL; @@ -50005,7 +51677,7 @@ diff -urNp linux-2.6.34.1/mm/mmap.c linux-2.6.34.1/mm/mmap.c } /* Check against address space limit. */ -@@ -1258,6 +1368,16 @@ munmap_back: +@@ -1268,6 +1381,16 @@ munmap_back: goto unacct_error; } @@ -50022,7 +51694,7 @@ diff -urNp linux-2.6.34.1/mm/mmap.c linux-2.6.34.1/mm/mmap.c vma->vm_mm = mm; vma->vm_start = addr; vma->vm_end = addr + len; -@@ -1281,6 +1401,19 @@ munmap_back: +@@ -1291,6 +1414,19 @@ munmap_back: error = file->f_op->mmap(file, vma); if (error) goto unmap_and_free_vma; @@ -50042,7 +51714,7 @@ diff -urNp linux-2.6.34.1/mm/mmap.c linux-2.6.34.1/mm/mmap.c if (vm_flags & VM_EXECUTABLE) added_exe_file_vma(mm); -@@ -1316,6 +1449,11 @@ munmap_back: +@@ -1326,6 +1462,11 @@ munmap_back: vma_link(mm, vma, prev, rb_link, rb_parent); file = vma->vm_file; @@ -50054,7 +51726,7 @@ diff -urNp linux-2.6.34.1/mm/mmap.c linux-2.6.34.1/mm/mmap.c /* Once vma denies write, undo our temporary denial count */ if (correct_wcount) atomic_inc(&inode->i_writecount); -@@ -1324,6 +1462,7 @@ out: +@@ -1334,6 +1475,7 @@ out: mm->total_vm += len >> PAGE_SHIFT; vm_stat_account(mm, vm_flags, file, len >> PAGE_SHIFT); @@ -50062,7 +51734,7 @@ diff -urNp linux-2.6.34.1/mm/mmap.c linux-2.6.34.1/mm/mmap.c if (vm_flags & VM_LOCKED) { if (!mlock_vma_pages_range(vma, addr, addr + len)) mm->locked_vm += (len >> PAGE_SHIFT); -@@ -1341,6 +1480,12 @@ unmap_and_free_vma: +@@ -1351,6 +1493,12 @@ unmap_and_free_vma: unmap_region(mm, vma, prev, vma->vm_start, vma->vm_end); charged = 0; free_vma: @@ -50075,7 +51747,41 @@ diff -urNp linux-2.6.34.1/mm/mmap.c linux-2.6.34.1/mm/mmap.c kmem_cache_free(vm_area_cachep, vma); unacct_error: if (charged) -@@ -1374,6 +1519,10 @@ arch_get_unmapped_area(struct file *filp +@@ -1358,6 +1506,33 @@ unacct_error: + return error; + } + ++bool check_heap_stack_gap(struct vm_area_struct *vma, unsigned long addr, unsigned long len) ++{ ++ if (!vma) { ++#ifdef CONFIG_STACK_GROWSUP ++ if (addr > sysctl_heap_stack_gap) ++ vma = find_vma(current->mm, addr - sysctl_heap_stack_gap); ++ else ++ vma = find_vma(current->mm, 0); ++ if (vma && (vma->vm_flags & VM_GROWSUP)) ++ return false; ++#endif ++ return true; ++ } ++ ++ if (addr + len > vma->vm_start) ++ return false; ++ ++ if (vma->vm_flags & VM_GROWSDOWN) ++ return sysctl_heap_stack_gap <= vma->vm_start - addr - len; ++#ifdef CONFIG_STACK_GROWSUP ++ else if (vma->vm_prev && (vma->vm_prev->vm_flags & VM_GROWSUP)) ++ return addr - vma->vm_prev->vm_end <= sysctl_heap_stack_gap; ++#endif ++ ++ return true; ++} ++ + /* Get an address range which is currently unmapped. + * For shmat() with addr=0. + * +@@ -1384,18 +1559,23 @@ arch_get_unmapped_area(struct file *filp if (flags & MAP_FIXED) return addr; @@ -50085,9 +51791,15 @@ diff -urNp linux-2.6.34.1/mm/mmap.c linux-2.6.34.1/mm/mmap.c + if (addr) { addr = PAGE_ALIGN(addr); - vma = find_vma(mm, addr); -@@ -1382,10 +1531,10 @@ arch_get_unmapped_area(struct file *filp - return addr; +- vma = find_vma(mm, addr); +- if (TASK_SIZE - len >= addr && +- (!vma || addr + len <= vma->vm_start)) +- return addr; ++ if (TASK_SIZE - len >= addr) { ++ vma = find_vma(mm, addr); ++ if (check_heap_stack_gap(vma, addr, len)) ++ return addr; ++ } } if (len > mm->cached_hole_size) { - start_addr = addr = mm->free_area_cache; @@ -50100,7 +51812,7 @@ diff -urNp linux-2.6.34.1/mm/mmap.c linux-2.6.34.1/mm/mmap.c } full_search: -@@ -1396,9 +1545,8 @@ full_search: +@@ -1406,34 +1586,40 @@ full_search: * Start a new search - just in case we missed * some holes. */ @@ -50112,7 +51824,29 @@ diff -urNp linux-2.6.34.1/mm/mmap.c linux-2.6.34.1/mm/mmap.c mm->cached_hole_size = 0; goto full_search; } -@@ -1420,10 +1568,16 @@ full_search: + return -ENOMEM; + } +- if (!vma || addr + len <= vma->vm_start) { +- /* +- * Remember the place where we stopped the search: +- */ +- mm->free_area_cache = addr + len; +- return addr; +- } ++ if (check_heap_stack_gap(vma, addr, len)) ++ break; + if (addr + mm->cached_hole_size < vma->vm_start) + mm->cached_hole_size = vma->vm_start - addr; + addr = vma->vm_end; + } ++ ++ /* ++ * Remember the place where we stopped the search: ++ */ ++ mm->free_area_cache = addr + len; ++ return addr; + } + #endif void arch_unmap_area(struct mm_struct *mm, unsigned long addr) { @@ -50130,7 +51864,7 @@ diff -urNp linux-2.6.34.1/mm/mmap.c linux-2.6.34.1/mm/mmap.c mm->free_area_cache = addr; mm->cached_hole_size = ~0UL; } -@@ -1441,7 +1595,7 @@ arch_get_unmapped_area_topdown(struct fi +@@ -1451,7 +1637,7 @@ arch_get_unmapped_area_topdown(struct fi { struct vm_area_struct *vma; struct mm_struct *mm = current->mm; @@ -50139,7 +51873,7 @@ diff -urNp linux-2.6.34.1/mm/mmap.c linux-2.6.34.1/mm/mmap.c /* requested length too big for entire address space */ if (len > TASK_SIZE) -@@ -1450,6 +1604,10 @@ arch_get_unmapped_area_topdown(struct fi +@@ -1460,13 +1646,18 @@ arch_get_unmapped_area_topdown(struct fi if (flags & MAP_FIXED) return addr; @@ -50150,7 +51884,37 @@ diff -urNp linux-2.6.34.1/mm/mmap.c linux-2.6.34.1/mm/mmap.c /* requesting a specific address */ if (addr) { addr = PAGE_ALIGN(addr); -@@ -1507,13 +1665,21 @@ bottomup: +- vma = find_vma(mm, addr); +- if (TASK_SIZE - len >= addr && +- (!vma || addr + len <= vma->vm_start)) +- return addr; ++ if (TASK_SIZE - len >= addr) { ++ vma = find_vma(mm, addr); ++ if (check_heap_stack_gap(vma, addr, len)) ++ return addr; ++ } + } + + /* check if free_area_cache is useful for us */ +@@ -1481,7 +1672,7 @@ arch_get_unmapped_area_topdown(struct fi + /* make sure it can fit in the remaining address space */ + if (addr > len) { + vma = find_vma(mm, addr-len); +- if (!vma || addr <= vma->vm_start) ++ if (check_heap_stack_gap(vma, addr - len, len)) + /* remember the address as a hint for next time */ + return (mm->free_area_cache = addr-len); + } +@@ -1498,7 +1689,7 @@ arch_get_unmapped_area_topdown(struct fi + * return with success: + */ + vma = find_vma(mm, addr); +- if (!vma || addr+len <= vma->vm_start) ++ if (check_heap_stack_gap(vma, addr, len)) + /* remember the address as a hint for next time */ + return (mm->free_area_cache = addr); + +@@ -1517,13 +1708,21 @@ bottomup: * can happen with large stack limits and large mmap() * allocations. */ @@ -50174,7 +51938,7 @@ diff -urNp linux-2.6.34.1/mm/mmap.c linux-2.6.34.1/mm/mmap.c mm->cached_hole_size = ~0UL; return addr; -@@ -1522,6 +1688,12 @@ bottomup: +@@ -1532,6 +1731,12 @@ bottomup: void arch_unmap_area_topdown(struct mm_struct *mm, unsigned long addr) { @@ -50187,7 +51951,7 @@ diff -urNp linux-2.6.34.1/mm/mmap.c linux-2.6.34.1/mm/mmap.c /* * Is this a new hole at the highest possible address? */ -@@ -1529,8 +1701,10 @@ void arch_unmap_area_topdown(struct mm_s +@@ -1539,8 +1744,10 @@ void arch_unmap_area_topdown(struct mm_s mm->free_area_cache = addr; /* dont allow allocations above current base */ @@ -50199,7 +51963,7 @@ diff -urNp linux-2.6.34.1/mm/mmap.c linux-2.6.34.1/mm/mmap.c } unsigned long -@@ -1638,6 +1812,27 @@ out: +@@ -1648,6 +1855,34 @@ out: return prev ? prev->vm_next : vma; } @@ -50218,7 +51982,14 @@ diff -urNp linux-2.6.34.1/mm/mmap.c linux-2.6.34.1/mm/mmap.c + BUG_ON(!vma_m || vma_m->vm_mirror != vma); + BUG_ON(vma->vm_file != vma_m->vm_file); + BUG_ON(vma->vm_end - vma->vm_start != vma_m->vm_end - vma_m->vm_start); -+ BUG_ON(vma->vm_pgoff != vma_m->vm_pgoff || vma->anon_vma != vma_m->anon_vma); ++ BUG_ON(vma->vm_pgoff != vma_m->vm_pgoff); ++ if (vma->anon_vma != vma_m->anon_vma) { ++ struct anon_vma_chain *avc, *avc_m; ++ ++ avc = list_entry(vma->anon_vma_chain.prev, struct anon_vma_chain, same_vma); ++ avc_m = list_entry(vma_m->anon_vma_chain.prev, struct anon_vma_chain, same_vma); ++ BUG_ON(avc->anon_vma != avc_m->anon_vma); ++ } + BUG_ON((vma->vm_flags ^ vma_m->vm_flags) & ~(VM_WRITE | VM_MAYWRITE | VM_ACCOUNT | VM_LOCKED)); + return vma_m; +} @@ -50227,7 +51998,7 @@ diff -urNp linux-2.6.34.1/mm/mmap.c linux-2.6.34.1/mm/mmap.c /* * Verify that the stack growth is acceptable and * update accounting. This is shared with both the -@@ -1654,6 +1849,7 @@ static int acct_stack_growth(struct vm_a +@@ -1664,6 +1899,7 @@ static int acct_stack_growth(struct vm_a return -ENOMEM; /* Stack limit test */ @@ -50235,7 +52006,7 @@ diff -urNp linux-2.6.34.1/mm/mmap.c linux-2.6.34.1/mm/mmap.c if (size > ACCESS_ONCE(rlim[RLIMIT_STACK].rlim_cur)) return -ENOMEM; -@@ -1664,6 +1860,7 @@ static int acct_stack_growth(struct vm_a +@@ -1674,6 +1910,7 @@ static int acct_stack_growth(struct vm_a locked = mm->locked_vm + grow; limit = ACCESS_ONCE(rlim[RLIMIT_MEMLOCK].rlim_cur); limit >>= PAGE_SHIFT; @@ -50243,7 +52014,7 @@ diff -urNp linux-2.6.34.1/mm/mmap.c linux-2.6.34.1/mm/mmap.c if (locked > limit && !capable(CAP_IPC_LOCK)) return -ENOMEM; } -@@ -1699,35 +1896,40 @@ static +@@ -1709,35 +1946,42 @@ static #endif int expand_upwards(struct vm_area_struct *vma, unsigned long address) { @@ -50266,7 +52037,7 @@ diff -urNp linux-2.6.34.1/mm/mmap.c linux-2.6.34.1/mm/mmap.c if (unlikely(anon_vma_prepare(vma))) return -ENOMEM; + locknext = vma->vm_next && (vma->vm_next->vm_flags & VM_GROWSDOWN); -+ if (locknext && unlikely(anon_vma_prepare(vma->vm_next))) ++ if (locknext && anon_vma_prepare(vma->vm_next)) + return -ENOMEM; anon_vma_lock(vma); + if (locknext) @@ -50290,11 +52061,13 @@ diff -urNp linux-2.6.34.1/mm/mmap.c linux-2.6.34.1/mm/mmap.c /* Somebody else might have raced and expanded it already */ - if (address > vma->vm_end) { -+ if (address > vma->vm_end && (!locknext || vma->vm_next->vm_start >= address)) { ++ if (vma->vm_next && (vma->vm_next->vm_flags & (VM_READ | VM_WRITE | VM_EXEC)) && vma->vm_next->vm_start - address < sysctl_heap_stack_gap) ++ error = -ENOMEM; ++ else if (address > vma->vm_end && (!locknext || vma->vm_next->vm_start >= address)) { unsigned long size, grow; size = address - vma->vm_start; -@@ -1737,6 +1939,8 @@ int expand_upwards(struct vm_area_struct +@@ -1747,6 +1991,8 @@ int expand_upwards(struct vm_area_struct if (!error) vma->vm_end = address; } @@ -50303,25 +52076,25 @@ diff -urNp linux-2.6.34.1/mm/mmap.c linux-2.6.34.1/mm/mmap.c anon_vma_unlock(vma); return error; } -@@ -1748,7 +1952,8 @@ int expand_upwards(struct vm_area_struct +@@ -1758,7 +2004,8 @@ int expand_upwards(struct vm_area_struct static int expand_downwards(struct vm_area_struct *vma, unsigned long address) { - int error; + int error, lockprev = 0; -+ struct vm_area_struct *prev = NULL; ++ struct vm_area_struct *prev; /* * We must make sure the anon_vma is allocated -@@ -1762,6 +1967,15 @@ static int expand_downwards(struct vm_ar +@@ -1772,6 +2019,15 @@ static int expand_downwards(struct vm_ar if (error) return error; ++ prev = vma->vm_prev; +#if defined(CONFIG_STACK_GROWSUP) || defined(CONFIG_IA64) -+ find_vma_prev(vma->vm_mm, address, &prev); + lockprev = prev && (prev->vm_flags & VM_GROWSUP); +#endif -+ if (lockprev && unlikely(anon_vma_prepare(prev))) ++ if (lockprev && anon_vma_prepare(prev)) + return -ENOMEM; + if (lockprev) + anon_vma_lock(prev); @@ -50329,12 +52102,14 @@ diff -urNp linux-2.6.34.1/mm/mmap.c linux-2.6.34.1/mm/mmap.c anon_vma_lock(vma); /* -@@ -1771,9 +1985,15 @@ static int expand_downwards(struct vm_ar +@@ -1781,9 +2037,17 @@ static int expand_downwards(struct vm_ar */ /* Somebody else might have raced and expanded it already */ - if (address < vma->vm_start) { -+ if (address < vma->vm_start && (!lockprev || prev->vm_end <= address)) { ++ if (prev && (prev->vm_flags & (VM_READ | VM_WRITE | VM_EXEC)) && address - prev->vm_end < sysctl_heap_stack_gap) ++ error = -ENOMEM; ++ else if (address < vma->vm_start && (!lockprev || prev->vm_end <= address)) { unsigned long size, grow; +#ifdef CONFIG_PAX_SEGMEXEC @@ -50346,7 +52121,7 @@ diff -urNp linux-2.6.34.1/mm/mmap.c linux-2.6.34.1/mm/mmap.c size = vma->vm_end - address; grow = (vma->vm_start - address) >> PAGE_SHIFT; -@@ -1781,9 +2001,20 @@ static int expand_downwards(struct vm_ar +@@ -1791,9 +2055,20 @@ static int expand_downwards(struct vm_ar if (!error) { vma->vm_start = address; vma->vm_pgoff -= grow; @@ -50367,7 +52142,7 @@ diff -urNp linux-2.6.34.1/mm/mmap.c linux-2.6.34.1/mm/mmap.c return error; } -@@ -1857,6 +2088,13 @@ static void remove_vma_list(struct mm_st +@@ -1867,6 +2142,13 @@ static void remove_vma_list(struct mm_st do { long nrpages = vma_pages(vma); @@ -50381,9 +52156,9 @@ diff -urNp linux-2.6.34.1/mm/mmap.c linux-2.6.34.1/mm/mmap.c mm->total_vm -= nrpages; vm_stat_account(mm, vma->vm_flags, vma->vm_file, -nrpages); vma = remove_vma(vma); -@@ -1901,6 +2139,16 @@ detach_vmas_to_be_unmapped(struct mm_str - +@@ -1912,6 +2194,16 @@ detach_vmas_to_be_unmapped(struct mm_str insertion_point = (prev ? &prev->vm_next : &mm->mmap); + vma->vm_prev = NULL; do { + +#ifdef CONFIG_PAX_SEGMEXEC @@ -50398,7 +52173,7 @@ diff -urNp linux-2.6.34.1/mm/mmap.c linux-2.6.34.1/mm/mmap.c rb_erase(&vma->vm_rb, &mm->mm_rb); mm->map_count--; tail_vma = vma; -@@ -1927,14 +2175,33 @@ static int __split_vma(struct mm_struct +@@ -1940,14 +2232,33 @@ static int __split_vma(struct mm_struct struct vm_area_struct *new; int err = -ENOMEM; @@ -50432,7 +52207,7 @@ diff -urNp linux-2.6.34.1/mm/mmap.c linux-2.6.34.1/mm/mmap.c /* most fields are the same, copy all, and then fixup */ *new = *vma; -@@ -1947,6 +2214,22 @@ static int __split_vma(struct mm_struct +@@ -1960,6 +2271,22 @@ static int __split_vma(struct mm_struct new->vm_pgoff += ((addr - vma->vm_start) >> PAGE_SHIFT); } @@ -50455,7 +52230,7 @@ diff -urNp linux-2.6.34.1/mm/mmap.c linux-2.6.34.1/mm/mmap.c pol = mpol_dup(vma_policy(vma)); if (IS_ERR(pol)) { err = PTR_ERR(pol); -@@ -1972,6 +2255,42 @@ static int __split_vma(struct mm_struct +@@ -1985,6 +2312,42 @@ static int __split_vma(struct mm_struct else err = vma_adjust(vma, vma->vm_start, addr, vma->vm_pgoff, new); @@ -50498,7 +52273,7 @@ diff -urNp linux-2.6.34.1/mm/mmap.c linux-2.6.34.1/mm/mmap.c /* Success. */ if (!err) return 0; -@@ -1987,6 +2306,15 @@ static int __split_vma(struct mm_struct +@@ -2000,6 +2363,15 @@ static int __split_vma(struct mm_struct out_free_mpol: mpol_put(pol); out_free_vma: @@ -50514,7 +52289,7 @@ diff -urNp linux-2.6.34.1/mm/mmap.c linux-2.6.34.1/mm/mmap.c kmem_cache_free(vm_area_cachep, new); out_err: return err; -@@ -1999,6 +2327,15 @@ static int __split_vma(struct mm_struct +@@ -2012,6 +2384,15 @@ static int __split_vma(struct mm_struct int split_vma(struct mm_struct *mm, struct vm_area_struct *vma, unsigned long addr, int new_below) { @@ -50530,13 +52305,13 @@ diff -urNp linux-2.6.34.1/mm/mmap.c linux-2.6.34.1/mm/mmap.c if (mm->map_count >= sysctl_max_map_count) return -ENOMEM; -@@ -2010,11 +2347,30 @@ int split_vma(struct mm_struct *mm, stru +@@ -2023,11 +2404,30 @@ int split_vma(struct mm_struct *mm, stru * work. This now handles partial unmappings. * Jeremy Fitzhardinge */ +#ifdef CONFIG_PAX_SEGMEXEC - int do_munmap(struct mm_struct *mm, unsigned long start, size_t len) - { ++int do_munmap(struct mm_struct *mm, unsigned long start, size_t len) ++{ + int ret = __do_munmap(mm, start, len); + if (ret || !(mm->pax_flags & MF_PAX_SEGMEXEC)) + return ret; @@ -50546,9 +52321,9 @@ diff -urNp linux-2.6.34.1/mm/mmap.c linux-2.6.34.1/mm/mmap.c + +int __do_munmap(struct mm_struct *mm, unsigned long start, size_t len) +#else -+int do_munmap(struct mm_struct *mm, unsigned long start, size_t len) + int do_munmap(struct mm_struct *mm, unsigned long start, size_t len) +#endif -+{ + { unsigned long end; struct vm_area_struct *vma, *prev, *last; @@ -50561,7 +52336,7 @@ diff -urNp linux-2.6.34.1/mm/mmap.c linux-2.6.34.1/mm/mmap.c if ((start & ~PAGE_MASK) || start > TASK_SIZE || len > TASK_SIZE-start) return -EINVAL; -@@ -2088,6 +2444,8 @@ int do_munmap(struct mm_struct *mm, unsi +@@ -2101,6 +2501,8 @@ int do_munmap(struct mm_struct *mm, unsi /* Fix up all other VM information */ remove_vma_list(mm, vma); @@ -50570,7 +52345,7 @@ diff -urNp linux-2.6.34.1/mm/mmap.c linux-2.6.34.1/mm/mmap.c return 0; } -@@ -2100,22 +2458,18 @@ SYSCALL_DEFINE2(munmap, unsigned long, a +@@ -2113,22 +2515,18 @@ SYSCALL_DEFINE2(munmap, unsigned long, a profile_munmap(addr); @@ -50599,7 +52374,7 @@ diff -urNp linux-2.6.34.1/mm/mmap.c linux-2.6.34.1/mm/mmap.c /* * this is really a simplified "do_mmap". it only handles * anonymous maps. eventually we may be able to do some -@@ -2129,6 +2483,7 @@ unsigned long do_brk(unsigned long addr, +@@ -2142,6 +2540,7 @@ unsigned long do_brk(unsigned long addr, struct rb_node ** rb_link, * rb_parent; pgoff_t pgoff = addr >> PAGE_SHIFT; int error; @@ -50607,7 +52382,7 @@ diff -urNp linux-2.6.34.1/mm/mmap.c linux-2.6.34.1/mm/mmap.c len = PAGE_ALIGN(len); if (!len) -@@ -2140,16 +2495,30 @@ unsigned long do_brk(unsigned long addr, +@@ -2153,16 +2552,30 @@ unsigned long do_brk(unsigned long addr, flags = VM_DATA_DEFAULT_FLAGS | VM_ACCOUNT | mm->def_flags; @@ -50639,7 +52414,7 @@ diff -urNp linux-2.6.34.1/mm/mmap.c linux-2.6.34.1/mm/mmap.c locked += mm->locked_vm; lock_limit = rlimit(RLIMIT_MEMLOCK); lock_limit >>= PAGE_SHIFT; -@@ -2166,22 +2535,22 @@ unsigned long do_brk(unsigned long addr, +@@ -2179,22 +2592,22 @@ unsigned long do_brk(unsigned long addr, /* * Clear old maps. this also does some error checking for us */ @@ -50666,7 +52441,7 @@ diff -urNp linux-2.6.34.1/mm/mmap.c linux-2.6.34.1/mm/mmap.c return -ENOMEM; /* Can we just expand an old private anonymous mapping? */ -@@ -2195,7 +2564,7 @@ unsigned long do_brk(unsigned long addr, +@@ -2208,7 +2621,7 @@ unsigned long do_brk(unsigned long addr, */ vma = kmem_cache_zalloc(vm_area_cachep, GFP_KERNEL); if (!vma) { @@ -50675,7 +52450,7 @@ diff -urNp linux-2.6.34.1/mm/mmap.c linux-2.6.34.1/mm/mmap.c return -ENOMEM; } -@@ -2208,11 +2577,12 @@ unsigned long do_brk(unsigned long addr, +@@ -2221,11 +2634,12 @@ unsigned long do_brk(unsigned long addr, vma->vm_page_prot = vm_get_page_prot(flags); vma_link(mm, vma, prev, rb_link, rb_parent); out: @@ -50690,7 +52465,7 @@ diff -urNp linux-2.6.34.1/mm/mmap.c linux-2.6.34.1/mm/mmap.c return addr; } -@@ -2259,8 +2629,10 @@ void exit_mmap(struct mm_struct *mm) +@@ -2272,8 +2686,10 @@ void exit_mmap(struct mm_struct *mm) * Walk the list again, actually closing and freeing it, * with preemption enabled, without holding any MM locks. */ @@ -50702,7 +52477,7 @@ diff -urNp linux-2.6.34.1/mm/mmap.c linux-2.6.34.1/mm/mmap.c BUG_ON(mm->nr_ptes > (FIRST_USER_ADDRESS+PMD_SIZE-1)>>PMD_SHIFT); } -@@ -2274,6 +2646,10 @@ int insert_vm_struct(struct mm_struct * +@@ -2287,6 +2703,10 @@ int insert_vm_struct(struct mm_struct * struct vm_area_struct * __vma, * prev; struct rb_node ** rb_link, * rb_parent; @@ -50713,7 +52488,7 @@ diff -urNp linux-2.6.34.1/mm/mmap.c linux-2.6.34.1/mm/mmap.c /* * The vm_pgoff of a purely anonymous vma should be irrelevant * until its first write fault, when page's anon_vma and index -@@ -2296,7 +2672,22 @@ int insert_vm_struct(struct mm_struct * +@@ -2309,7 +2729,22 @@ int insert_vm_struct(struct mm_struct * if ((vma->vm_flags & VM_ACCOUNT) && security_vm_enough_memory_mm(mm, vma_pages(vma))) return -ENOMEM; @@ -50736,7 +52511,7 @@ diff -urNp linux-2.6.34.1/mm/mmap.c linux-2.6.34.1/mm/mmap.c return 0; } -@@ -2314,6 +2705,8 @@ struct vm_area_struct *copy_vma(struct v +@@ -2327,6 +2762,8 @@ struct vm_area_struct *copy_vma(struct v struct rb_node **rb_link, *rb_parent; struct mempolicy *pol; @@ -50745,7 +52520,7 @@ diff -urNp linux-2.6.34.1/mm/mmap.c linux-2.6.34.1/mm/mmap.c /* * If anonymous vma has not yet been faulted, update new pgoff * to match new location, to increase its chance of merging. -@@ -2363,6 +2756,39 @@ struct vm_area_struct *copy_vma(struct v +@@ -2376,6 +2813,39 @@ struct vm_area_struct *copy_vma(struct v kmem_cache_free(vm_area_cachep, new_vma); return NULL; } @@ -50785,7 +52560,7 @@ diff -urNp linux-2.6.34.1/mm/mmap.c linux-2.6.34.1/mm/mmap.c /* * Return true if the calling process may expand its vm space by the passed -@@ -2374,7 +2800,7 @@ int may_expand_vm(struct mm_struct *mm, +@@ -2387,7 +2857,7 @@ int may_expand_vm(struct mm_struct *mm, unsigned long lim; lim = rlimit(RLIMIT_AS) >> PAGE_SHIFT; @@ -50794,25 +52569,27 @@ diff -urNp linux-2.6.34.1/mm/mmap.c linux-2.6.34.1/mm/mmap.c if (cur + npages > lim) return 0; return 1; -@@ -2444,6 +2870,15 @@ int install_special_mapping(struct mm_st +@@ -2457,6 +2927,17 @@ int install_special_mapping(struct mm_st vma->vm_start = addr; vma->vm_end = addr + len; +#ifdef CONFIG_PAX_MPROTECT + if (mm->pax_flags & MF_PAX_MPROTECT) { -+ if ((vm_flags & (VM_WRITE | VM_EXEC)) != VM_EXEC) -+ vm_flags &= ~(VM_EXEC | VM_MAYEXEC); ++ if ((vm_flags & (VM_WRITE | VM_EXEC)) == (VM_WRITE | VM_EXEC)) ++ return -EPERM; ++ if (!(vm_flags & VM_EXEC)) ++ vm_flags &= ~VM_MAYEXEC; + else -+ vm_flags &= ~(VM_WRITE | VM_MAYWRITE); ++ vm_flags &= ~VM_MAYWRITE; + } +#endif + vma->vm_flags = vm_flags | mm->def_flags | VM_DONTEXPAND; vma->vm_page_prot = vm_get_page_prot(vma->vm_flags); -diff -urNp linux-2.6.34.1/mm/mprotect.c linux-2.6.34.1/mm/mprotect.c ---- linux-2.6.34.1/mm/mprotect.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/mm/mprotect.c 2010-07-07 09:04:58.000000000 -0400 +diff -urNp linux-2.6.35.4/mm/mprotect.c linux-2.6.35.4/mm/mprotect.c +--- linux-2.6.35.4/mm/mprotect.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/mm/mprotect.c 2010-09-17 20:12:37.000000000 -0400 @@ -23,10 +23,16 @@ #include #include @@ -50879,7 +52656,7 @@ diff -urNp linux-2.6.34.1/mm/mprotect.c linux-2.6.34.1/mm/mprotect.c int mprotect_fixup(struct vm_area_struct *vma, struct vm_area_struct **pprev, unsigned long start, unsigned long end, unsigned long newflags) -@@ -143,6 +191,14 @@ mprotect_fixup(struct vm_area_struct *vm +@@ -143,11 +191,29 @@ mprotect_fixup(struct vm_area_struct *vm int error; int dirty_accountable = 0; @@ -50894,7 +52671,22 @@ diff -urNp linux-2.6.34.1/mm/mprotect.c linux-2.6.34.1/mm/mprotect.c if (newflags == oldflags) { *pprev = vma; return 0; -@@ -164,6 +220,42 @@ mprotect_fixup(struct vm_area_struct *vm + } + ++ if (newflags & (VM_READ | VM_WRITE | VM_EXEC)) { ++ struct vm_area_struct *prev = vma->vm_prev, *next = vma->vm_next; ++ ++ if (next && (next->vm_flags & VM_GROWSDOWN) && sysctl_heap_stack_gap > next->vm_start - end) ++ return -ENOMEM; ++ ++ if (prev && (prev->vm_flags & VM_GROWSUP) && sysctl_heap_stack_gap > start - prev->vm_end) ++ return -ENOMEM; ++ } ++ + /* + * If we make a private mapping writable we increase our commit; + * but (without finer accounting) cannot reduce our commit if we +@@ -164,6 +230,42 @@ mprotect_fixup(struct vm_area_struct *vm } } @@ -50937,7 +52729,7 @@ diff -urNp linux-2.6.34.1/mm/mprotect.c linux-2.6.34.1/mm/mprotect.c /* * First try to merge with previous and/or next vma. */ -@@ -194,9 +286,21 @@ success: +@@ -194,9 +296,21 @@ success: * vm_flags and vm_page_prot are protected by the mmap_sem * held in write mode. */ @@ -50960,7 +52752,7 @@ diff -urNp linux-2.6.34.1/mm/mprotect.c linux-2.6.34.1/mm/mprotect.c if (vma_wants_writenotify(vma)) { vma->vm_page_prot = vm_get_page_prot(newflags & ~VM_SHARED); -@@ -237,6 +341,17 @@ SYSCALL_DEFINE3(mprotect, unsigned long, +@@ -237,6 +351,17 @@ SYSCALL_DEFINE3(mprotect, unsigned long, end = start + len; if (end <= start) return -ENOMEM; @@ -50978,7 +52770,7 @@ diff -urNp linux-2.6.34.1/mm/mprotect.c linux-2.6.34.1/mm/mprotect.c if (!arch_validate_prot(prot)) return -EINVAL; -@@ -244,7 +359,7 @@ SYSCALL_DEFINE3(mprotect, unsigned long, +@@ -244,7 +369,7 @@ SYSCALL_DEFINE3(mprotect, unsigned long, /* * Does the application expect PROT_READ to imply PROT_EXEC: */ @@ -50987,7 +52779,7 @@ diff -urNp linux-2.6.34.1/mm/mprotect.c linux-2.6.34.1/mm/mprotect.c prot |= PROT_EXEC; vm_flags = calc_vm_prot_bits(prot); -@@ -276,6 +391,16 @@ SYSCALL_DEFINE3(mprotect, unsigned long, +@@ -276,6 +401,16 @@ SYSCALL_DEFINE3(mprotect, unsigned long, if (start > vma->vm_start) prev = vma; @@ -51004,7 +52796,7 @@ diff -urNp linux-2.6.34.1/mm/mprotect.c linux-2.6.34.1/mm/mprotect.c for (nstart = start ; ; ) { unsigned long newflags; -@@ -300,6 +425,9 @@ SYSCALL_DEFINE3(mprotect, unsigned long, +@@ -300,6 +435,9 @@ SYSCALL_DEFINE3(mprotect, unsigned long, if (error) goto out; perf_event_mmap(vma); @@ -51014,9 +52806,9 @@ diff -urNp linux-2.6.34.1/mm/mprotect.c linux-2.6.34.1/mm/mprotect.c nstart = tmp; if (nstart < prev->vm_end) -diff -urNp linux-2.6.34.1/mm/mremap.c linux-2.6.34.1/mm/mremap.c ---- linux-2.6.34.1/mm/mremap.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/mm/mremap.c 2010-07-07 09:04:58.000000000 -0400 +diff -urNp linux-2.6.35.4/mm/mremap.c linux-2.6.35.4/mm/mremap.c +--- linux-2.6.35.4/mm/mremap.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/mm/mremap.c 2010-09-17 20:12:09.000000000 -0400 @@ -113,6 +113,12 @@ static void move_ptes(struct vm_area_str continue; pte = ptep_clear_flush(vma, old_addr, old_pte); @@ -51117,10 +52909,18 @@ diff -urNp linux-2.6.34.1/mm/mremap.c linux-2.6.34.1/mm/mremap.c } out: if (ret & ~PAGE_MASK) -diff -urNp linux-2.6.34.1/mm/nommu.c linux-2.6.34.1/mm/nommu.c ---- linux-2.6.34.1/mm/nommu.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/mm/nommu.c 2010-07-07 09:04:58.000000000 -0400 -@@ -759,15 +759,6 @@ struct vm_area_struct *find_vma(struct m +diff -urNp linux-2.6.35.4/mm/nommu.c linux-2.6.35.4/mm/nommu.c +--- linux-2.6.35.4/mm/nommu.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/mm/nommu.c 2010-09-17 20:12:09.000000000 -0400 +@@ -67,7 +67,6 @@ int sysctl_overcommit_memory = OVERCOMMI + int sysctl_overcommit_ratio = 50; /* default is 50% */ + int sysctl_max_map_count = DEFAULT_MAX_MAP_COUNT; + int sysctl_nr_trim_pages = CONFIG_NOMMU_INITIAL_TRIM_EXCESS; +-int heap_stack_gap = 0; + + atomic_long_t mmap_pages_allocated; + +@@ -762,15 +761,6 @@ struct vm_area_struct *find_vma(struct m EXPORT_SYMBOL(find_vma); /* @@ -51136,7 +52936,7 @@ diff -urNp linux-2.6.34.1/mm/nommu.c linux-2.6.34.1/mm/nommu.c * expand a stack to a given address * - not supported under NOMMU conditions */ -@@ -1484,6 +1475,7 @@ int split_vma(struct mm_struct *mm, stru +@@ -1491,6 +1481,7 @@ int split_vma(struct mm_struct *mm, stru /* most fields are the same, copy all, and then fixup */ *new = *vma; @@ -51144,12 +52944,12 @@ diff -urNp linux-2.6.34.1/mm/nommu.c linux-2.6.34.1/mm/nommu.c *region = *vma->vm_region; new->vm_region = region; -diff -urNp linux-2.6.34.1/mm/page_alloc.c linux-2.6.34.1/mm/page_alloc.c ---- linux-2.6.34.1/mm/page_alloc.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/mm/page_alloc.c 2010-07-07 09:04:58.000000000 -0400 -@@ -606,6 +606,10 @@ static void __free_pages_ok(struct page +diff -urNp linux-2.6.35.4/mm/page_alloc.c linux-2.6.35.4/mm/page_alloc.c +--- linux-2.6.35.4/mm/page_alloc.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/mm/page_alloc.c 2010-09-17 20:12:09.000000000 -0400 +@@ -641,6 +641,10 @@ static bool free_pages_prepare(struct pa + int i; int bad = 0; - int wasMlocked = __TestClearPageMlocked(page); +#ifdef CONFIG_PAX_MEMORY_SANITIZE + unsigned long index = 1UL << order; @@ -51158,7 +52958,7 @@ diff -urNp linux-2.6.34.1/mm/page_alloc.c linux-2.6.34.1/mm/page_alloc.c trace_mm_page_free_direct(page, order); kmemcheck_free_shadow(page, order); -@@ -619,6 +623,12 @@ static void __free_pages_ok(struct page +@@ -659,6 +663,12 @@ static bool free_pages_prepare(struct pa debug_check_no_obj_freed(page_address(page), PAGE_SIZE << order); } @@ -51171,7 +52971,7 @@ diff -urNp linux-2.6.34.1/mm/page_alloc.c linux-2.6.34.1/mm/page_alloc.c arch_free_page(page, order); kernel_map_pages(page, 1 << order, 0); -@@ -722,8 +732,10 @@ static int prep_new_page(struct page *pa +@@ -773,8 +783,10 @@ static int prep_new_page(struct page *pa arch_alloc_page(page, order); kernel_map_pages(page, 1 << order, 1); @@ -51182,19 +52982,7 @@ diff -urNp linux-2.6.34.1/mm/page_alloc.c linux-2.6.34.1/mm/page_alloc.c if (order && (gfp_flags & __GFP_COMP)) prep_compound_page(page, order); -@@ -1119,6 +1131,11 @@ void free_hot_cold_page(struct page *pag - debug_check_no_locks_freed(page_address(page), PAGE_SIZE); - debug_check_no_obj_freed(page_address(page), PAGE_SIZE); - } -+ -+#ifdef CONFIG_PAX_MEMORY_SANITIZE -+ sanitize_highpage(page); -+#endif -+ - arch_free_page(page, 0); - kernel_map_pages(page, 1, 0); - -@@ -3746,7 +3763,7 @@ static void __init setup_usemap(struct p +@@ -3973,7 +3985,7 @@ static void __init setup_usemap(struct p zone->pageblock_flags = alloc_bootmem_node(pgdat, usemapsize); } #else @@ -51203,10 +52991,10 @@ diff -urNp linux-2.6.34.1/mm/page_alloc.c linux-2.6.34.1/mm/page_alloc.c struct zone *zone, unsigned long zonesize) {} #endif /* CONFIG_SPARSEMEM */ -diff -urNp linux-2.6.34.1/mm/percpu.c linux-2.6.34.1/mm/percpu.c ---- linux-2.6.34.1/mm/percpu.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/mm/percpu.c 2010-07-07 09:04:58.000000000 -0400 -@@ -116,7 +116,7 @@ static unsigned int pcpu_first_unit_cpu +diff -urNp linux-2.6.35.4/mm/percpu.c linux-2.6.35.4/mm/percpu.c +--- linux-2.6.35.4/mm/percpu.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/mm/percpu.c 2010-09-17 20:12:09.000000000 -0400 +@@ -115,7 +115,7 @@ static unsigned int pcpu_first_unit_cpu static unsigned int pcpu_last_unit_cpu __read_mostly; /* the address of the first chunk which starts with the kernel static area */ @@ -51215,10 +53003,10 @@ diff -urNp linux-2.6.34.1/mm/percpu.c linux-2.6.34.1/mm/percpu.c EXPORT_SYMBOL_GPL(pcpu_base_addr); static const int *pcpu_unit_map __read_mostly; /* cpu -> unit */ -diff -urNp linux-2.6.34.1/mm/rmap.c linux-2.6.34.1/mm/rmap.c ---- linux-2.6.34.1/mm/rmap.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/mm/rmap.c 2010-07-07 09:04:58.000000000 -0400 -@@ -116,15 +116,29 @@ int anon_vma_prepare(struct vm_area_stru +diff -urNp linux-2.6.35.4/mm/rmap.c linux-2.6.35.4/mm/rmap.c +--- linux-2.6.35.4/mm/rmap.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/mm/rmap.c 2010-09-17 20:12:09.000000000 -0400 +@@ -116,6 +116,10 @@ int anon_vma_prepare(struct vm_area_stru struct anon_vma *anon_vma = vma->anon_vma; struct anon_vma_chain *avc; @@ -51229,13 +53017,7 @@ diff -urNp linux-2.6.34.1/mm/rmap.c linux-2.6.34.1/mm/rmap.c might_sleep(); if (unlikely(!anon_vma)) { struct mm_struct *mm = vma->vm_mm; - struct anon_vma *allocated; - -+#ifdef CONFIG_PAX_SEGMEXEC -+ struct vm_area_struct *vma_m; -+#endif -+ - avc = anon_vma_chain_alloc(); +@@ -125,6 +129,12 @@ int anon_vma_prepare(struct vm_area_stru if (!avc) goto out_enomem; @@ -51248,13 +53030,14 @@ diff -urNp linux-2.6.34.1/mm/rmap.c linux-2.6.34.1/mm/rmap.c anon_vma = find_mergeable_anon_vma(vma); allocated = NULL; if (!anon_vma) { -@@ -143,6 +157,20 @@ int anon_vma_prepare(struct vm_area_stru - avc->vma = vma; - list_add(&avc->same_vma, &vma->anon_vma_chain); - list_add(&avc->same_anon_vma, &anon_vma->head); +@@ -138,6 +148,21 @@ int anon_vma_prepare(struct vm_area_stru + /* page_table_lock to protect against threads */ + spin_lock(&mm->page_table_lock); + if (likely(!vma->anon_vma)) { + +#ifdef CONFIG_PAX_SEGMEXEC -+ vma_m = pax_find_mirror_vma(vma); ++ struct vm_area_struct *vma_m = pax_find_mirror_vma(vma); ++ + if (vma_m) { + BUG_ON(vma_m->anon_vma); + vma_m->anon_vma = anon_vma; @@ -51266,10 +53049,10 @@ diff -urNp linux-2.6.34.1/mm/rmap.c linux-2.6.34.1/mm/rmap.c + } +#endif + - allocated = NULL; - avc = NULL; - } -@@ -151,12 +179,24 @@ int anon_vma_prepare(struct vm_area_stru + vma->anon_vma = anon_vma; + avc->anon_vma = anon_vma; + avc->vma = vma; +@@ -151,12 +176,24 @@ int anon_vma_prepare(struct vm_area_stru if (unlikely(allocated)) anon_vma_free(allocated); @@ -51294,9 +53077,27 @@ diff -urNp linux-2.6.34.1/mm/rmap.c linux-2.6.34.1/mm/rmap.c anon_vma_chain_free(avc); out_enomem: return -ENOMEM; -diff -urNp linux-2.6.34.1/mm/shmem.c linux-2.6.34.1/mm/shmem.c ---- linux-2.6.34.1/mm/shmem.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/mm/shmem.c 2010-07-07 09:04:58.000000000 -0400 +@@ -179,7 +216,7 @@ static void anon_vma_chain_link(struct v + * Attach the anon_vmas from src to dst. + * Returns 0 on success, -ENOMEM on failure. + */ +-int anon_vma_clone(struct vm_area_struct *dst, struct vm_area_struct *src) ++int anon_vma_clone(struct vm_area_struct *dst, const struct vm_area_struct *src) + { + struct anon_vma_chain *avc, *pavc; + +@@ -201,7 +238,7 @@ int anon_vma_clone(struct vm_area_struct + * the corresponding VMA in the parent process is attached to. + * Returns 0 on success, non-zero on failure. + */ +-int anon_vma_fork(struct vm_area_struct *vma, struct vm_area_struct *pvma) ++int anon_vma_fork(struct vm_area_struct *vma, const struct vm_area_struct *pvma) + { + struct anon_vma_chain *avc; + struct anon_vma *anon_vma; +diff -urNp linux-2.6.35.4/mm/shmem.c linux-2.6.35.4/mm/shmem.c +--- linux-2.6.35.4/mm/shmem.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/mm/shmem.c 2010-09-17 20:12:37.000000000 -0400 @@ -30,7 +30,7 @@ #include #include @@ -51306,10 +53107,10 @@ diff -urNp linux-2.6.34.1/mm/shmem.c linux-2.6.34.1/mm/shmem.c #ifdef CONFIG_SHMEM /* -diff -urNp linux-2.6.34.1/mm/slab.c linux-2.6.34.1/mm/slab.c ---- linux-2.6.34.1/mm/slab.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/mm/slab.c 2010-07-07 09:04:58.000000000 -0400 -@@ -308,7 +308,7 @@ struct kmem_list3 { +diff -urNp linux-2.6.35.4/mm/slab.c linux-2.6.35.4/mm/slab.c +--- linux-2.6.35.4/mm/slab.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/mm/slab.c 2010-09-17 20:12:37.000000000 -0400 +@@ -285,7 +285,7 @@ struct kmem_list3 { * Need this for bootstrapping a per node allocator. */ #define NUM_INIT_LISTS (3 * MAX_NUMNODES) @@ -51318,7 +53119,7 @@ diff -urNp linux-2.6.34.1/mm/slab.c linux-2.6.34.1/mm/slab.c #define CACHE_CACHE 0 #define SIZE_AC MAX_NUMNODES #define SIZE_L3 (2 * MAX_NUMNODES) -@@ -558,7 +558,7 @@ static inline void *index_to_obj(struct +@@ -535,7 +535,7 @@ static inline void *index_to_obj(struct * reciprocal_divide(offset, cache->reciprocal_buffer_size) */ static inline unsigned int obj_to_index(const struct kmem_cache *cache, @@ -51327,7 +53128,7 @@ diff -urNp linux-2.6.34.1/mm/slab.c linux-2.6.34.1/mm/slab.c { u32 offset = (obj - slab->s_mem); return reciprocal_divide(offset, cache->reciprocal_buffer_size); -@@ -584,14 +584,14 @@ struct cache_names { +@@ -561,14 +561,14 @@ struct cache_names { static struct cache_names __initdata cache_names[] = { #define CACHE(x) { .name = "size-" #x, .name_dma = "size-" #x "(DMA)" }, #include @@ -51345,7 +53146,7 @@ diff -urNp linux-2.6.34.1/mm/slab.c linux-2.6.34.1/mm/slab.c /* internal cache of cache description objs */ static struct kmem_cache cache_cache = { -@@ -4483,15 +4483,66 @@ static const struct file_operations proc +@@ -4558,15 +4558,66 @@ static const struct file_operations proc static int __init slab_proc_init(void) { @@ -51414,9 +53215,9 @@ diff -urNp linux-2.6.34.1/mm/slab.c linux-2.6.34.1/mm/slab.c /** * ksize - get the actual amount of memory allocated for a given object * @objp: Pointer to the object -diff -urNp linux-2.6.34.1/mm/slob.c linux-2.6.34.1/mm/slob.c ---- linux-2.6.34.1/mm/slob.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/mm/slob.c 2010-07-07 09:04:58.000000000 -0400 +diff -urNp linux-2.6.35.4/mm/slob.c linux-2.6.35.4/mm/slob.c +--- linux-2.6.35.4/mm/slob.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/mm/slob.c 2010-09-17 20:12:09.000000000 -0400 @@ -29,7 +29,7 @@ * If kmalloc is asked for objects of PAGE_SIZE or larger, it calls * alloc_pages() directly, allocating compound pages so the page order @@ -51510,9 +53311,9 @@ diff -urNp linux-2.6.34.1/mm/slob.c linux-2.6.34.1/mm/slob.c INIT_LIST_HEAD(&sp->list); set_slob(b, SLOB_UNITS(PAGE_SIZE), b + SLOB_UNITS(PAGE_SIZE)); set_slob_page_free(sp, slob_list); -@@ -475,10 +478,9 @@ out: - #define ARCH_SLAB_MINALIGN __alignof__(unsigned long) - #endif +@@ -467,10 +470,9 @@ out: + * End of slob allocator proper. Begin kmem_cache_alloc and kmalloc frontend. + */ -void *__kmalloc_node(size_t size, gfp_t gfp, int node) +static void *__kmalloc_node_align(size_t size, gfp_t gfp, int node, int align) @@ -51523,7 +53324,7 @@ diff -urNp linux-2.6.34.1/mm/slob.c linux-2.6.34.1/mm/slob.c void *ret; lockdep_trace_alloc(gfp); -@@ -491,7 +493,10 @@ void *__kmalloc_node(size_t size, gfp_t +@@ -483,7 +485,10 @@ void *__kmalloc_node(size_t size, gfp_t if (!m) return NULL; @@ -51535,7 +53336,7 @@ diff -urNp linux-2.6.34.1/mm/slob.c linux-2.6.34.1/mm/slob.c ret = (void *)m + align; trace_kmalloc_node(_RET_IP_, ret, -@@ -501,9 +506,9 @@ void *__kmalloc_node(size_t size, gfp_t +@@ -493,9 +498,9 @@ void *__kmalloc_node(size_t size, gfp_t ret = slob_new_pages(gfp | __GFP_COMP, get_order(size), node); if (ret) { @@ -51548,7 +53349,7 @@ diff -urNp linux-2.6.34.1/mm/slob.c linux-2.6.34.1/mm/slob.c } trace_kmalloc_node(_RET_IP_, ret, -@@ -513,6 +518,13 @@ void *__kmalloc_node(size_t size, gfp_t +@@ -505,6 +510,13 @@ void *__kmalloc_node(size_t size, gfp_t kmemleak_alloc(ret, size, 1, gfp); return ret; } @@ -51562,7 +53363,7 @@ diff -urNp linux-2.6.34.1/mm/slob.c linux-2.6.34.1/mm/slob.c EXPORT_SYMBOL(__kmalloc_node); void kfree(const void *block) -@@ -528,13 +540,84 @@ void kfree(const void *block) +@@ -520,13 +532,84 @@ void kfree(const void *block) sp = slob_page(block); if (is_slob_page(sp)) { int align = max(ARCH_KMALLOC_MINALIGN, ARCH_SLAB_MINALIGN); @@ -51650,7 +53451,7 @@ diff -urNp linux-2.6.34.1/mm/slob.c linux-2.6.34.1/mm/slob.c /* can't use ksize for kmem_cache_alloc memory, only kmalloc */ size_t ksize(const void *block) { -@@ -547,10 +630,10 @@ size_t ksize(const void *block) +@@ -539,10 +622,10 @@ size_t ksize(const void *block) sp = slob_page(block); if (is_slob_page(sp)) { int align = max(ARCH_KMALLOC_MINALIGN, ARCH_SLAB_MINALIGN); @@ -51664,7 +53465,7 @@ diff -urNp linux-2.6.34.1/mm/slob.c linux-2.6.34.1/mm/slob.c } EXPORT_SYMBOL(ksize); -@@ -605,17 +688,25 @@ void *kmem_cache_alloc_node(struct kmem_ +@@ -597,17 +680,25 @@ void *kmem_cache_alloc_node(struct kmem_ { void *b; @@ -51690,7 +53491,7 @@ diff -urNp linux-2.6.34.1/mm/slob.c linux-2.6.34.1/mm/slob.c if (c->ctor) c->ctor(b); -@@ -627,10 +718,16 @@ EXPORT_SYMBOL(kmem_cache_alloc_node); +@@ -619,10 +710,16 @@ EXPORT_SYMBOL(kmem_cache_alloc_node); static void __kmem_cache_free(void *b, int size) { @@ -51709,7 +53510,7 @@ diff -urNp linux-2.6.34.1/mm/slob.c linux-2.6.34.1/mm/slob.c } static void kmem_rcu_free(struct rcu_head *head) -@@ -643,15 +740,24 @@ static void kmem_rcu_free(struct rcu_hea +@@ -635,15 +732,24 @@ static void kmem_rcu_free(struct rcu_hea void kmem_cache_free(struct kmem_cache *c, void *b) { @@ -51737,10 +53538,10 @@ diff -urNp linux-2.6.34.1/mm/slob.c linux-2.6.34.1/mm/slob.c } trace_kmem_cache_free(_RET_IP_, b); -diff -urNp linux-2.6.34.1/mm/slub.c linux-2.6.34.1/mm/slub.c ---- linux-2.6.34.1/mm/slub.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/mm/slub.c 2010-07-07 09:04:58.000000000 -0400 -@@ -1877,6 +1877,8 @@ void kmem_cache_free(struct kmem_cache * +diff -urNp linux-2.6.35.4/mm/slub.c linux-2.6.35.4/mm/slub.c +--- linux-2.6.35.4/mm/slub.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/mm/slub.c 2010-09-17 20:12:37.000000000 -0400 +@@ -1873,6 +1873,8 @@ void kmem_cache_free(struct kmem_cache * page = virt_to_head_page(x); @@ -51749,7 +53550,7 @@ diff -urNp linux-2.6.34.1/mm/slub.c linux-2.6.34.1/mm/slub.c slab_free(s, page, x, _RET_IP_); trace_kmem_cache_free(_RET_IP_, x); -@@ -1921,7 +1923,7 @@ static int slub_min_objects; +@@ -1917,7 +1919,7 @@ static int slub_min_objects; * Merge control. If this is set then no merging of slab caches will occur. * (Could be removed. This was introduced to pacify the merge skeptics.) */ @@ -51758,7 +53559,7 @@ diff -urNp linux-2.6.34.1/mm/slub.c linux-2.6.34.1/mm/slub.c /* * Calculate the order of allocation given an slab object size. -@@ -2348,7 +2350,7 @@ static int kmem_cache_open(struct kmem_c +@@ -2344,7 +2346,7 @@ static int kmem_cache_open(struct kmem_c * list to avoid pounding the page allocator excessively. */ set_min_partial(s, ilog2(s->size)); @@ -51767,7 +53568,7 @@ diff -urNp linux-2.6.34.1/mm/slub.c linux-2.6.34.1/mm/slub.c #ifdef CONFIG_NUMA s->remote_node_defrag_ratio = 1000; #endif -@@ -2488,8 +2490,7 @@ static inline int kmem_cache_close(struc +@@ -2487,8 +2489,7 @@ static inline int kmem_cache_close(struc void kmem_cache_destroy(struct kmem_cache *s) { down_write(&slub_lock); @@ -51777,7 +53578,7 @@ diff -urNp linux-2.6.34.1/mm/slub.c linux-2.6.34.1/mm/slub.c list_del(&s->list); up_write(&slub_lock); if (kmem_cache_close(s)) { -@@ -2781,6 +2782,46 @@ void *__kmalloc_node(size_t size, gfp_t +@@ -2780,6 +2781,46 @@ void *__kmalloc_node(size_t size, gfp_t EXPORT_SYMBOL(__kmalloc_node); #endif @@ -51824,7 +53625,7 @@ diff -urNp linux-2.6.34.1/mm/slub.c linux-2.6.34.1/mm/slub.c size_t ksize(const void *object) { struct page *page; -@@ -3050,7 +3091,7 @@ void __init kmem_cache_init(void) +@@ -3049,7 +3090,7 @@ void __init kmem_cache_init(void) */ create_kmalloc_cache(&kmalloc_caches[0], "kmem_cache_node", sizeof(struct kmem_cache_node), GFP_NOWAIT); @@ -51833,7 +53634,7 @@ diff -urNp linux-2.6.34.1/mm/slub.c linux-2.6.34.1/mm/slub.c caches++; hotplug_memory_notifier(slab_memory_callback, SLAB_CALLBACK_PRI); -@@ -3159,7 +3200,7 @@ static int slab_unmergeable(struct kmem_ +@@ -3158,7 +3199,7 @@ static int slab_unmergeable(struct kmem_ /* * We may have set a slab to be unmergeable during bootstrap. */ @@ -51842,7 +53643,7 @@ diff -urNp linux-2.6.34.1/mm/slub.c linux-2.6.34.1/mm/slub.c return 1; return 0; -@@ -3217,7 +3258,7 @@ struct kmem_cache *kmem_cache_create(con +@@ -3216,7 +3257,7 @@ struct kmem_cache *kmem_cache_create(con down_write(&slub_lock); s = find_mergeable(size, align, flags, name, ctor); if (s) { @@ -51851,7 +53652,7 @@ diff -urNp linux-2.6.34.1/mm/slub.c linux-2.6.34.1/mm/slub.c /* * Adjust the object sizes so that we clear * the complete object on kzalloc. -@@ -3228,7 +3269,7 @@ struct kmem_cache *kmem_cache_create(con +@@ -3227,7 +3268,7 @@ struct kmem_cache *kmem_cache_create(con if (sysfs_slab_alias(s, name)) { down_write(&slub_lock); @@ -51860,7 +53661,7 @@ diff -urNp linux-2.6.34.1/mm/slub.c linux-2.6.34.1/mm/slub.c up_write(&slub_lock); goto err; } -@@ -3943,7 +3984,7 @@ SLAB_ATTR_RO(ctor); +@@ -3953,7 +3994,7 @@ SLAB_ATTR_RO(ctor); static ssize_t aliases_show(struct kmem_cache *s, char *buf) { @@ -51869,7 +53670,7 @@ diff -urNp linux-2.6.34.1/mm/slub.c linux-2.6.34.1/mm/slub.c } SLAB_ATTR_RO(aliases); -@@ -4664,7 +4705,13 @@ static const struct file_operations proc +@@ -4674,7 +4715,13 @@ static const struct file_operations proc static int __init slab_proc_init(void) { @@ -51884,9 +53685,9 @@ diff -urNp linux-2.6.34.1/mm/slub.c linux-2.6.34.1/mm/slub.c return 0; } module_init(slab_proc_init); -diff -urNp linux-2.6.34.1/mm/util.c linux-2.6.34.1/mm/util.c ---- linux-2.6.34.1/mm/util.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/mm/util.c 2010-07-07 09:04:58.000000000 -0400 +diff -urNp linux-2.6.35.4/mm/util.c linux-2.6.35.4/mm/util.c +--- linux-2.6.35.4/mm/util.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/mm/util.c 2010-09-17 20:12:09.000000000 -0400 @@ -245,6 +245,12 @@ EXPORT_SYMBOL(strndup_user); void arch_pick_mmap_layout(struct mm_struct *mm) { @@ -51900,9 +53701,9 @@ diff -urNp linux-2.6.34.1/mm/util.c linux-2.6.34.1/mm/util.c mm->get_unmapped_area = arch_get_unmapped_area; mm->unmap_area = arch_unmap_area; } -diff -urNp linux-2.6.34.1/mm/vmalloc.c linux-2.6.34.1/mm/vmalloc.c ---- linux-2.6.34.1/mm/vmalloc.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/mm/vmalloc.c 2010-07-07 09:04:58.000000000 -0400 +diff -urNp linux-2.6.35.4/mm/vmalloc.c linux-2.6.35.4/mm/vmalloc.c +--- linux-2.6.35.4/mm/vmalloc.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/mm/vmalloc.c 2010-09-17 20:12:09.000000000 -0400 @@ -40,8 +40,19 @@ static void vunmap_pte_range(pmd_t *pmd, pte = pte_offset_kernel(pmd, addr); @@ -51933,7 +53734,7 @@ diff -urNp linux-2.6.34.1/mm/vmalloc.c linux-2.6.34.1/mm/vmalloc.c /* * nr is a running index into the array which helps higher level -@@ -101,17 +113,32 @@ static int vmap_pte_range(pmd_t *pmd, un +@@ -101,17 +113,30 @@ static int vmap_pte_range(pmd_t *pmd, un pte = pte_alloc_kernel(pmd, addr); if (!pte) return -ENOMEM; @@ -51947,9 +53748,7 @@ diff -urNp linux-2.6.34.1/mm/vmalloc.c linux-2.6.34.1/mm/vmalloc.c - if (WARN_ON(!page)) - return -ENOMEM; +#if defined(CONFIG_MODULES) && defined(CONFIG_X86_32) && defined(CONFIG_PAX_KERNEXEC) -+ if (!(pgprot_val(prot) & _PAGE_NX)) -+ BUG_ON(!pte_exec(*pte) || pte_pfn(*pte) != __pa(addr) >> PAGE_SHIFT); -+ else ++ if (pgprot_val(prot) & _PAGE_NX) +#endif + + if (WARN_ON(!pte_none(*pte))) { @@ -51971,7 +53770,7 @@ diff -urNp linux-2.6.34.1/mm/vmalloc.c linux-2.6.34.1/mm/vmalloc.c } static int vmap_pmd_range(pud_t *pud, unsigned long addr, -@@ -192,11 +219,20 @@ int is_vmalloc_or_module_addr(const void +@@ -192,11 +217,20 @@ int is_vmalloc_or_module_addr(const void * and fall back on vmalloc() if that fails. Others * just put it in the vmalloc space. */ @@ -51993,7 +53792,22 @@ diff -urNp linux-2.6.34.1/mm/vmalloc.c linux-2.6.34.1/mm/vmalloc.c return is_vmalloc_addr(x); } -@@ -292,13 +328,13 @@ static void __insert_vmap_area(struct vm +@@ -217,8 +251,14 @@ struct page *vmalloc_to_page(const void + + if (!pgd_none(*pgd)) { + pud_t *pud = pud_offset(pgd, addr); ++#ifdef CONFIG_X86 ++ if (!pud_large(*pud)) ++#endif + if (!pud_none(*pud)) { + pmd_t *pmd = pmd_offset(pud, addr); ++#ifdef CONFIG_X86 ++ if (!pmd_large(*pmd)) ++#endif + if (!pmd_none(*pmd)) { + pte_t *ptep, pte; + +@@ -292,13 +332,13 @@ static void __insert_vmap_area(struct vm struct rb_node *tmp; while (*p) { @@ -52011,7 +53825,7 @@ diff -urNp linux-2.6.34.1/mm/vmalloc.c linux-2.6.34.1/mm/vmalloc.c p = &(*p)->rb_right; else BUG(); -@@ -1224,6 +1260,16 @@ static struct vm_struct *__get_vm_area_n +@@ -1224,6 +1264,16 @@ static struct vm_struct *__get_vm_area_n struct vm_struct *area; BUG_ON(in_interrupt()); @@ -52028,7 +53842,7 @@ diff -urNp linux-2.6.34.1/mm/vmalloc.c linux-2.6.34.1/mm/vmalloc.c if (flags & VM_IOREMAP) { int bit = fls(size); -@@ -1449,6 +1495,11 @@ void *vmap(struct page **pages, unsigned +@@ -1449,6 +1499,11 @@ void *vmap(struct page **pages, unsigned if (count > totalram_pages) return NULL; @@ -52040,7 +53854,7 @@ diff -urNp linux-2.6.34.1/mm/vmalloc.c linux-2.6.34.1/mm/vmalloc.c area = get_vm_area_caller((count << PAGE_SHIFT), flags, __builtin_return_address(0)); if (!area) -@@ -1558,6 +1609,13 @@ static void *__vmalloc_node(unsigned lon +@@ -1558,6 +1613,13 @@ static void *__vmalloc_node(unsigned lon if (!size || (size >> PAGE_SHIFT) > totalram_pages) return NULL; @@ -52054,7 +53868,7 @@ diff -urNp linux-2.6.34.1/mm/vmalloc.c linux-2.6.34.1/mm/vmalloc.c area = __get_vm_area_node(size, align, VM_ALLOC, VMALLOC_START, VMALLOC_END, node, gfp_mask, caller); -@@ -1576,6 +1634,7 @@ static void *__vmalloc_node(unsigned lon +@@ -1576,6 +1638,7 @@ static void *__vmalloc_node(unsigned lon return addr; } @@ -52062,7 +53876,7 @@ diff -urNp linux-2.6.34.1/mm/vmalloc.c linux-2.6.34.1/mm/vmalloc.c void *__vmalloc(unsigned long size, gfp_t gfp_mask, pgprot_t prot) { return __vmalloc_node(size, 1, gfp_mask, prot, -1, -@@ -1592,6 +1651,7 @@ EXPORT_SYMBOL(__vmalloc); +@@ -1592,6 +1655,7 @@ EXPORT_SYMBOL(__vmalloc); * For tight control over page level allocator and protection flags * use __vmalloc() instead. */ @@ -52070,7 +53884,7 @@ diff -urNp linux-2.6.34.1/mm/vmalloc.c linux-2.6.34.1/mm/vmalloc.c void *vmalloc(unsigned long size) { return __vmalloc_node(size, 1, GFP_KERNEL | __GFP_HIGHMEM, PAGE_KERNEL, -@@ -1606,6 +1666,7 @@ EXPORT_SYMBOL(vmalloc); +@@ -1606,6 +1670,7 @@ EXPORT_SYMBOL(vmalloc); * The resulting memory area is zeroed so it can be mapped to userspace * without leaking data. */ @@ -52078,7 +53892,7 @@ diff -urNp linux-2.6.34.1/mm/vmalloc.c linux-2.6.34.1/mm/vmalloc.c void *vmalloc_user(unsigned long size) { struct vm_struct *area; -@@ -1633,6 +1694,7 @@ EXPORT_SYMBOL(vmalloc_user); +@@ -1633,6 +1698,7 @@ EXPORT_SYMBOL(vmalloc_user); * For tight control over page level allocator and protection flags * use __vmalloc() instead. */ @@ -52086,7 +53900,7 @@ diff -urNp linux-2.6.34.1/mm/vmalloc.c linux-2.6.34.1/mm/vmalloc.c void *vmalloc_node(unsigned long size, int node) { return __vmalloc_node(size, 1, GFP_KERNEL | __GFP_HIGHMEM, PAGE_KERNEL, -@@ -1655,10 +1717,10 @@ EXPORT_SYMBOL(vmalloc_node); +@@ -1655,10 +1721,10 @@ EXPORT_SYMBOL(vmalloc_node); * For tight control over page level allocator and protection flags * use __vmalloc() instead. */ @@ -52099,7 +53913,7 @@ diff -urNp linux-2.6.34.1/mm/vmalloc.c linux-2.6.34.1/mm/vmalloc.c -1, __builtin_return_address(0)); } -@@ -1677,6 +1739,7 @@ void *vmalloc_exec(unsigned long size) +@@ -1677,6 +1743,7 @@ void *vmalloc_exec(unsigned long size) * Allocate enough 32bit PA addressable pages to cover @size from the * page level allocator and map them into contiguous kernel virtual space. */ @@ -52107,7 +53921,7 @@ diff -urNp linux-2.6.34.1/mm/vmalloc.c linux-2.6.34.1/mm/vmalloc.c void *vmalloc_32(unsigned long size) { return __vmalloc_node(size, 1, GFP_VMALLOC32, PAGE_KERNEL, -@@ -1691,6 +1754,7 @@ EXPORT_SYMBOL(vmalloc_32); +@@ -1691,6 +1758,7 @@ EXPORT_SYMBOL(vmalloc_32); * The resulting memory area is 32bit addressable and zeroed so it can be * mapped to userspace without leaking data. */ @@ -52115,10 +53929,61 @@ diff -urNp linux-2.6.34.1/mm/vmalloc.c linux-2.6.34.1/mm/vmalloc.c void *vmalloc_32_user(unsigned long size) { struct vm_struct *area; -diff -urNp linux-2.6.34.1/net/8021q/vlan.c linux-2.6.34.1/net/8021q/vlan.c ---- linux-2.6.34.1/net/8021q/vlan.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/net/8021q/vlan.c 2010-07-07 09:04:58.000000000 -0400 -@@ -614,8 +614,7 @@ static int vlan_ioctl_handler(struct net +diff -urNp linux-2.6.35.4/mm/vmstat.c linux-2.6.35.4/mm/vmstat.c +--- linux-2.6.35.4/mm/vmstat.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/mm/vmstat.c 2010-09-17 20:12:37.000000000 -0400 +@@ -76,7 +76,7 @@ void vm_events_fold_cpu(int cpu) + * + * vm_stat contains the global counters + */ +-atomic_long_t vm_stat[NR_VM_ZONE_STAT_ITEMS]; ++atomic_long_unchecked_t vm_stat[NR_VM_ZONE_STAT_ITEMS]; + EXPORT_SYMBOL(vm_stat); + + #ifdef CONFIG_SMP +@@ -315,7 +315,7 @@ void refresh_cpu_vm_stats(int cpu) + v = p->vm_stat_diff[i]; + p->vm_stat_diff[i] = 0; + local_irq_restore(flags); +- atomic_long_add(v, &zone->vm_stat[i]); ++ atomic_long_add_unchecked(v, &zone->vm_stat[i]); + global_diff[i] += v; + #ifdef CONFIG_NUMA + /* 3 seconds idle till flush */ +@@ -353,7 +353,7 @@ void refresh_cpu_vm_stats(int cpu) + + for (i = 0; i < NR_VM_ZONE_STAT_ITEMS; i++) + if (global_diff[i]) +- atomic_long_add(global_diff[i], &vm_stat[i]); ++ atomic_long_add_unchecked(global_diff[i], &vm_stat[i]); + } + + #endif +@@ -1038,10 +1038,16 @@ static int __init setup_vmstat(void) + start_cpu_timer(cpu); + #endif + #ifdef CONFIG_PROC_FS +- proc_create("buddyinfo", S_IRUGO, NULL, &fragmentation_file_operations); +- proc_create("pagetypeinfo", S_IRUGO, NULL, &pagetypeinfo_file_ops); +- proc_create("vmstat", S_IRUGO, NULL, &proc_vmstat_file_operations); +- proc_create("zoneinfo", S_IRUGO, NULL, &proc_zoneinfo_file_operations); ++ { ++ mode_t gr_mode = S_IRUGO; ++#ifdef CONFIG_GRKERNSEC_PROC_ADD ++ gr_mode = S_IRUSR; ++#endif ++ proc_create("buddyinfo", gr_mode, NULL, &fragmentation_file_operations); ++ proc_create("pagetypeinfo", gr_mode, NULL, &pagetypeinfo_file_ops); ++ proc_create("vmstat", gr_mode, NULL, &proc_vmstat_file_operations); ++ proc_create("zoneinfo", gr_mode, NULL, &proc_zoneinfo_file_operations); ++ } + #endif + return 0; + } +diff -urNp linux-2.6.35.4/net/8021q/vlan.c linux-2.6.35.4/net/8021q/vlan.c +--- linux-2.6.35.4/net/8021q/vlan.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/net/8021q/vlan.c 2010-09-17 20:12:09.000000000 -0400 +@@ -618,8 +618,7 @@ static int vlan_ioctl_handler(struct net err = -EPERM; if (!capable(CAP_NET_ADMIN)) break; @@ -52128,9 +53993,9 @@ diff -urNp linux-2.6.34.1/net/8021q/vlan.c linux-2.6.34.1/net/8021q/vlan.c struct vlan_net *vn; vn = net_generic(net, vlan_net_id); -diff -urNp linux-2.6.34.1/net/atm/atm_misc.c linux-2.6.34.1/net/atm/atm_misc.c ---- linux-2.6.34.1/net/atm/atm_misc.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/net/atm/atm_misc.c 2010-07-07 09:04:58.000000000 -0400 +diff -urNp linux-2.6.35.4/net/atm/atm_misc.c linux-2.6.35.4/net/atm/atm_misc.c +--- linux-2.6.35.4/net/atm/atm_misc.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/net/atm/atm_misc.c 2010-09-17 20:12:09.000000000 -0400 @@ -17,7 +17,7 @@ int atm_charge(struct atm_vcc *vcc, int if (atomic_read(&sk_atm(vcc)->sk_rmem_alloc) <= sk_atm(vcc)->sk_rcvbuf) return 1; @@ -52167,9 +54032,9 @@ diff -urNp linux-2.6.34.1/net/atm/atm_misc.c linux-2.6.34.1/net/atm/atm_misc.c __SONET_ITEMS #undef __HANDLE_ITEM } -diff -urNp linux-2.6.34.1/net/atm/proc.c linux-2.6.34.1/net/atm/proc.c ---- linux-2.6.34.1/net/atm/proc.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/net/atm/proc.c 2010-07-07 09:04:58.000000000 -0400 +diff -urNp linux-2.6.35.4/net/atm/proc.c linux-2.6.35.4/net/atm/proc.c +--- linux-2.6.35.4/net/atm/proc.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/net/atm/proc.c 2010-09-17 20:12:37.000000000 -0400 @@ -44,9 +44,9 @@ static void add_stats(struct seq_file *s const struct k_atm_aal_stats *stats) { @@ -52183,9 +54048,22 @@ diff -urNp linux-2.6.34.1/net/atm/proc.c linux-2.6.34.1/net/atm/proc.c } static void atm_dev_info(struct seq_file *seq, const struct atm_dev *dev) -diff -urNp linux-2.6.34.1/net/atm/resources.c linux-2.6.34.1/net/atm/resources.c ---- linux-2.6.34.1/net/atm/resources.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/net/atm/resources.c 2010-07-07 09:04:58.000000000 -0400 +@@ -190,7 +190,12 @@ static void vcc_info(struct seq_file *se + { + struct sock *sk = sk_atm(vcc); + ++#ifdef CONFIG_GRKERNSEC_HIDESYM ++ seq_printf(seq, "%p ", NULL); ++#else + seq_printf(seq, "%p ", vcc); ++#endif ++ + if (!vcc->dev) + seq_printf(seq, "Unassigned "); + else +diff -urNp linux-2.6.35.4/net/atm/resources.c linux-2.6.35.4/net/atm/resources.c +--- linux-2.6.35.4/net/atm/resources.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/net/atm/resources.c 2010-09-17 20:12:09.000000000 -0400 @@ -159,7 +159,7 @@ EXPORT_SYMBOL(atm_dev_deregister); static void copy_aal_stats(struct k_atm_aal_stats *from, struct atm_aal_stats *to) @@ -52204,22 +54082,22 @@ diff -urNp linux-2.6.34.1/net/atm/resources.c linux-2.6.34.1/net/atm/resources.c __AAL_STAT_ITEMS #undef __HANDLE_ITEM } -diff -urNp linux-2.6.34.1/net/bridge/br_stp_if.c linux-2.6.34.1/net/bridge/br_stp_if.c ---- linux-2.6.34.1/net/bridge/br_stp_if.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/net/bridge/br_stp_if.c 2010-07-07 09:04:58.000000000 -0400 -@@ -147,7 +147,7 @@ static void br_stp_stop(struct net_bridg +diff -urNp linux-2.6.35.4/net/bridge/br_stp_if.c linux-2.6.35.4/net/bridge/br_stp_if.c +--- linux-2.6.35.4/net/bridge/br_stp_if.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/net/bridge/br_stp_if.c 2010-09-17 20:12:09.000000000 -0400 +@@ -145,7 +145,7 @@ static void br_stp_stop(struct net_bridg char *envp[] = { NULL }; if (br->stp_enabled == BR_USER_STP) { - r = call_usermodehelper(BR_STP_PROG, argv, envp, 1); + r = call_usermodehelper(BR_STP_PROG, argv, envp, UMH_WAIT_PROC); - printk(KERN_INFO "%s: userspace STP stopped, return code %d\n", - br->dev->name, r); + br_info(br, "userspace STP stopped, return code %d\n", r); -diff -urNp linux-2.6.34.1/net/bridge/netfilter/ebtables.c linux-2.6.34.1/net/bridge/netfilter/ebtables.c ---- linux-2.6.34.1/net/bridge/netfilter/ebtables.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/net/bridge/netfilter/ebtables.c 2010-07-07 09:04:58.000000000 -0400 -@@ -1515,7 +1515,7 @@ static int do_ebt_get_ctl(struct sock *s + /* To start timers on any ports left in blocking */ +diff -urNp linux-2.6.35.4/net/bridge/netfilter/ebtables.c linux-2.6.35.4/net/bridge/netfilter/ebtables.c +--- linux-2.6.35.4/net/bridge/netfilter/ebtables.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/net/bridge/netfilter/ebtables.c 2010-09-17 20:12:09.000000000 -0400 +@@ -1501,7 +1501,7 @@ static int do_ebt_get_ctl(struct sock *s tmp.valid_hooks = t->table->valid_hooks; } mutex_unlock(&ebt_mutex); @@ -52228,10 +54106,10 @@ diff -urNp linux-2.6.34.1/net/bridge/netfilter/ebtables.c linux-2.6.34.1/net/bri BUGPRINT("c2u Didn't work\n"); ret = -EFAULT; break; -diff -urNp linux-2.6.34.1/net/core/dev.c linux-2.6.34.1/net/core/dev.c ---- linux-2.6.34.1/net/core/dev.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/net/core/dev.c 2010-07-07 09:04:58.000000000 -0400 -@@ -2249,7 +2249,7 @@ int netif_rx_ni(struct sk_buff *skb) +diff -urNp linux-2.6.35.4/net/core/dev.c linux-2.6.35.4/net/core/dev.c +--- linux-2.6.35.4/net/core/dev.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/net/core/dev.c 2010-09-17 20:12:09.000000000 -0400 +@@ -2541,7 +2541,7 @@ int netif_rx_ni(struct sk_buff *skb) } EXPORT_SYMBOL(netif_rx_ni); @@ -52240,49 +54118,31 @@ diff -urNp linux-2.6.34.1/net/core/dev.c linux-2.6.34.1/net/core/dev.c { struct softnet_data *sd = &__get_cpu_var(softnet_data); -@@ -3019,7 +3019,7 @@ void netif_napi_del(struct napi_struct * +@@ -3474,7 +3474,7 @@ void netif_napi_del(struct napi_struct * + } EXPORT_SYMBOL(netif_napi_del); - -static void net_rx_action(struct softirq_action *h) +static void net_rx_action(void) { - struct list_head *list = &__get_cpu_var(softnet_data).poll_list; + struct softnet_data *sd = &__get_cpu_var(softnet_data); unsigned long time_limit = jiffies + 2; -diff -urNp linux-2.6.34.1/net/core/flow.c linux-2.6.34.1/net/core/flow.c ---- linux-2.6.34.1/net/core/flow.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/net/core/flow.c 2010-07-07 09:04:58.000000000 -0400 -@@ -39,7 +39,7 @@ atomic_t flow_cache_genid = ATOMIC_INIT( - - static u32 flow_hash_shift; - #define flow_hash_size (1 << flow_hash_shift) --static DEFINE_PER_CPU(struct flow_cache_entry **, flow_tables) = { NULL }; -+static DEFINE_PER_CPU(struct flow_cache_entry **, flow_tables); - - #define flow_table(cpu) (per_cpu(flow_tables, cpu)) - -@@ -52,7 +52,7 @@ struct flow_percpu_info { - u32 hash_rnd; - int count; - }; --static DEFINE_PER_CPU(struct flow_percpu_info, flow_hash_info) = { 0 }; -+static DEFINE_PER_CPU(struct flow_percpu_info, flow_hash_info); - - #define flow_hash_rnd_recalc(cpu) \ - (per_cpu(flow_hash_info, cpu).hash_rnd_recalc) -@@ -69,7 +69,7 @@ struct flow_flush_info { - atomic_t cpuleft; - struct completion completion; - }; --static DEFINE_PER_CPU(struct tasklet_struct, flow_flush_tasklets) = { NULL }; -+static DEFINE_PER_CPU(struct tasklet_struct, flow_flush_tasklets); - - #define flow_flush_tasklet(cpu) (&per_cpu(flow_flush_tasklets, cpu)) - -diff -urNp linux-2.6.34.1/net/core/sock.c linux-2.6.34.1/net/core/sock.c ---- linux-2.6.34.1/net/core/sock.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/net/core/sock.c 2010-07-07 09:04:58.000000000 -0400 -@@ -900,7 +900,7 @@ int sock_getsockopt(struct socket *sock, +diff -urNp linux-2.6.35.4/net/core/net-sysfs.c linux-2.6.35.4/net/core/net-sysfs.c +--- linux-2.6.35.4/net/core/net-sysfs.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/net/core/net-sysfs.c 2010-09-17 20:12:09.000000000 -0400 +@@ -511,7 +511,7 @@ static ssize_t rx_queue_attr_store(struc + return attribute->store(queue, attribute, buf, count); + } + +-static struct sysfs_ops rx_queue_sysfs_ops = { ++static const struct sysfs_ops rx_queue_sysfs_ops = { + .show = rx_queue_attr_show, + .store = rx_queue_attr_store, + }; +diff -urNp linux-2.6.35.4/net/core/sock.c linux-2.6.35.4/net/core/sock.c +--- linux-2.6.35.4/net/core/sock.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/net/core/sock.c 2010-09-17 20:12:09.000000000 -0400 +@@ -915,7 +915,7 @@ int sock_getsockopt(struct socket *sock, return -ENOTCONN; if (lv < len) return -EINVAL; @@ -52291,7 +54151,7 @@ diff -urNp linux-2.6.34.1/net/core/sock.c linux-2.6.34.1/net/core/sock.c return -EFAULT; goto lenout; } -@@ -933,7 +933,7 @@ int sock_getsockopt(struct socket *sock, +@@ -948,7 +948,7 @@ int sock_getsockopt(struct socket *sock, if (len > lv) len = lv; @@ -52300,9 +54160,9 @@ diff -urNp linux-2.6.34.1/net/core/sock.c linux-2.6.34.1/net/core/sock.c return -EFAULT; lenout: if (put_user(len, optlen)) -diff -urNp linux-2.6.34.1/net/dccp/ccids/ccid3.c linux-2.6.34.1/net/dccp/ccids/ccid3.c ---- linux-2.6.34.1/net/dccp/ccids/ccid3.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/net/dccp/ccids/ccid3.c 2010-07-07 09:04:58.000000000 -0400 +diff -urNp linux-2.6.35.4/net/dccp/ccids/ccid3.c linux-2.6.35.4/net/dccp/ccids/ccid3.c +--- linux-2.6.35.4/net/dccp/ccids/ccid3.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/net/dccp/ccids/ccid3.c 2010-09-17 20:12:09.000000000 -0400 @@ -41,7 +41,7 @@ static int ccid3_debug; #define ccid3_pr_debug(format, a...) DCCP_PR_DEBUG(ccid3_debug, format, ##a) @@ -52312,9 +54172,9 @@ diff -urNp linux-2.6.34.1/net/dccp/ccids/ccid3.c linux-2.6.34.1/net/dccp/ccids/c #endif /* -diff -urNp linux-2.6.34.1/net/dccp/dccp.h linux-2.6.34.1/net/dccp/dccp.h ---- linux-2.6.34.1/net/dccp/dccp.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/net/dccp/dccp.h 2010-07-07 09:04:58.000000000 -0400 +diff -urNp linux-2.6.35.4/net/dccp/dccp.h linux-2.6.35.4/net/dccp/dccp.h +--- linux-2.6.35.4/net/dccp/dccp.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/net/dccp/dccp.h 2010-09-17 20:12:09.000000000 -0400 @@ -44,9 +44,9 @@ extern int dccp_debug; #define dccp_pr_debug_cat(format, a...) DCCP_PRINTK(dccp_debug, format, ##a) #define dccp_debug(fmt, a...) dccp_pr_debug_cat(KERN_DEBUG fmt, ##a) @@ -52328,9 +54188,9 @@ diff -urNp linux-2.6.34.1/net/dccp/dccp.h linux-2.6.34.1/net/dccp/dccp.h #endif extern struct inet_hashinfo dccp_hashinfo; -diff -urNp linux-2.6.34.1/net/decnet/sysctl_net_decnet.c linux-2.6.34.1/net/decnet/sysctl_net_decnet.c ---- linux-2.6.34.1/net/decnet/sysctl_net_decnet.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/net/decnet/sysctl_net_decnet.c 2010-07-07 09:04:58.000000000 -0400 +diff -urNp linux-2.6.35.4/net/decnet/sysctl_net_decnet.c linux-2.6.35.4/net/decnet/sysctl_net_decnet.c +--- linux-2.6.35.4/net/decnet/sysctl_net_decnet.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/net/decnet/sysctl_net_decnet.c 2010-09-17 20:12:37.000000000 -0400 @@ -173,7 +173,7 @@ static int dn_node_address_handler(ctl_t if (len > *lenp) len = *lenp; @@ -52349,9 +54209,9 @@ diff -urNp linux-2.6.34.1/net/decnet/sysctl_net_decnet.c linux-2.6.34.1/net/decn return -EFAULT; *lenp = len; -diff -urNp linux-2.6.34.1/net/ipv4/inet_hashtables.c linux-2.6.34.1/net/ipv4/inet_hashtables.c ---- linux-2.6.34.1/net/ipv4/inet_hashtables.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/net/ipv4/inet_hashtables.c 2010-07-07 09:04:58.000000000 -0400 +diff -urNp linux-2.6.35.4/net/ipv4/inet_hashtables.c linux-2.6.35.4/net/ipv4/inet_hashtables.c +--- linux-2.6.35.4/net/ipv4/inet_hashtables.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/net/ipv4/inet_hashtables.c 2010-09-17 20:12:37.000000000 -0400 @@ -18,11 +18,14 @@ #include #include @@ -52367,7 +54227,7 @@ diff -urNp linux-2.6.34.1/net/ipv4/inet_hashtables.c linux-2.6.34.1/net/ipv4/ine /* * Allocate and initialize a new local port bind bucket. * The bindhash mutex for snum's hash chain must be held here. -@@ -506,6 +509,8 @@ ok: +@@ -508,6 +511,8 @@ ok: twrefcnt += inet_twsk_bind_unhash(tw, hinfo); spin_unlock(&head->lock); @@ -52376,9 +54236,9 @@ diff -urNp linux-2.6.34.1/net/ipv4/inet_hashtables.c linux-2.6.34.1/net/ipv4/ine if (tw) { inet_twsk_deschedule(tw, death_row); while (twrefcnt) { -diff -urNp linux-2.6.34.1/net/ipv4/netfilter/nf_nat_snmp_basic.c linux-2.6.34.1/net/ipv4/netfilter/nf_nat_snmp_basic.c ---- linux-2.6.34.1/net/ipv4/netfilter/nf_nat_snmp_basic.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/net/ipv4/netfilter/nf_nat_snmp_basic.c 2010-07-07 09:04:58.000000000 -0400 +diff -urNp linux-2.6.35.4/net/ipv4/netfilter/nf_nat_snmp_basic.c linux-2.6.35.4/net/ipv4/netfilter/nf_nat_snmp_basic.c +--- linux-2.6.35.4/net/ipv4/netfilter/nf_nat_snmp_basic.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/net/ipv4/netfilter/nf_nat_snmp_basic.c 2010-09-17 20:12:09.000000000 -0400 @@ -398,7 +398,7 @@ static unsigned char asn1_octets_decode( *len = 0; @@ -52387,10 +54247,10 @@ diff -urNp linux-2.6.34.1/net/ipv4/netfilter/nf_nat_snmp_basic.c linux-2.6.34.1/ + *octets = kmalloc((eoc - ctx->pointer), GFP_ATOMIC); if (*octets == NULL) { if (net_ratelimit()) - printk("OOM in bsalg (%d)\n", __LINE__); -diff -urNp linux-2.6.34.1/net/ipv4/tcp_ipv4.c linux-2.6.34.1/net/ipv4/tcp_ipv4.c ---- linux-2.6.34.1/net/ipv4/tcp_ipv4.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/net/ipv4/tcp_ipv4.c 2010-07-07 09:04:58.000000000 -0400 + pr_notice("OOM in bsalg (%d)\n", __LINE__); +diff -urNp linux-2.6.35.4/net/ipv4/tcp_ipv4.c linux-2.6.35.4/net/ipv4/tcp_ipv4.c +--- linux-2.6.35.4/net/ipv4/tcp_ipv4.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/net/ipv4/tcp_ipv4.c 2010-09-17 20:12:37.000000000 -0400 @@ -85,6 +85,9 @@ int sysctl_tcp_tw_reuse __read_mostly; int sysctl_tcp_low_latency __read_mostly; @@ -52401,7 +54261,17 @@ diff -urNp linux-2.6.34.1/net/ipv4/tcp_ipv4.c linux-2.6.34.1/net/ipv4/tcp_ipv4.c #ifdef CONFIG_TCP_MD5SIG static struct tcp_md5sig_key *tcp_v4_md5_do_lookup(struct sock *sk, -@@ -1654,12 +1657,19 @@ int tcp_v4_rcv(struct sk_buff *skb) +@@ -1593,6 +1596,9 @@ int tcp_v4_do_rcv(struct sock *sk, struc + return 0; + + reset: ++#ifdef CONFIG_GRKERNSEC_BLACKHOLE ++ if (!grsec_enable_blackhole) ++#endif + tcp_v4_send_reset(rsk, skb); + discard: + kfree_skb(skb); +@@ -1654,12 +1660,19 @@ int tcp_v4_rcv(struct sk_buff *skb) TCP_SKB_CB(skb)->sacked = 0; sk = __inet_lookup_skb(&tcp_hashinfo, skb, th->source, th->dest); @@ -52424,7 +54294,7 @@ diff -urNp linux-2.6.34.1/net/ipv4/tcp_ipv4.c linux-2.6.34.1/net/ipv4/tcp_ipv4.c if (unlikely(iph->ttl < inet_sk(sk)->min_ttl)) { NET_INC_STATS_BH(net, LINUX_MIB_TCPMINTTLDROP); -@@ -1709,6 +1719,10 @@ no_tcp_socket: +@@ -1709,6 +1722,10 @@ no_tcp_socket: bad_packet: TCP_INC_STATS_BH(net, TCP_MIB_INERRS); } else { @@ -52435,9 +54305,50 @@ diff -urNp linux-2.6.34.1/net/ipv4/tcp_ipv4.c linux-2.6.34.1/net/ipv4/tcp_ipv4.c tcp_v4_send_reset(NULL, skb); } -diff -urNp linux-2.6.34.1/net/ipv4/tcp_minisocks.c linux-2.6.34.1/net/ipv4/tcp_minisocks.c ---- linux-2.6.34.1/net/ipv4/tcp_minisocks.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/net/ipv4/tcp_minisocks.c 2010-07-07 09:04:58.000000000 -0400 +@@ -2316,7 +2333,11 @@ static void get_openreq4(struct sock *sk + 0, /* non standard timer */ + 0, /* open_requests have no inode */ + atomic_read(&sk->sk_refcnt), ++#ifdef CONFIG_GRKERNSEC_HIDESYM ++ NULL, ++#else + req, ++#endif + len); + } + +@@ -2366,7 +2387,12 @@ static void get_tcp4_sock(struct sock *s + sock_i_uid(sk), + icsk->icsk_probes_out, + sock_i_ino(sk), +- atomic_read(&sk->sk_refcnt), sk, ++ atomic_read(&sk->sk_refcnt), ++#ifdef CONFIG_GRKERNSEC_HIDESYM ++ NULL, ++#else ++ sk, ++#endif + jiffies_to_clock_t(icsk->icsk_rto), + jiffies_to_clock_t(icsk->icsk_ack.ato), + (icsk->icsk_ack.quick << 1) | icsk->icsk_ack.pingpong, +@@ -2394,7 +2420,13 @@ static void get_timewait4_sock(struct in + " %02X %08X:%08X %02X:%08lX %08X %5d %8d %d %d %p%n", + i, src, srcp, dest, destp, tw->tw_substate, 0, 0, + 3, jiffies_to_clock_t(ttd), 0, 0, 0, 0, +- atomic_read(&tw->tw_refcnt), tw, len); ++ atomic_read(&tw->tw_refcnt), ++#ifdef CONFIG_GRKERNSEC_HIDESYM ++ NULL, ++#else ++ tw, ++#endif ++ len); + } + + #define TMPSZ 150 +diff -urNp linux-2.6.35.4/net/ipv4/tcp_minisocks.c linux-2.6.35.4/net/ipv4/tcp_minisocks.c +--- linux-2.6.35.4/net/ipv4/tcp_minisocks.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/net/ipv4/tcp_minisocks.c 2010-09-17 20:12:37.000000000 -0400 @@ -27,6 +27,10 @@ #include #include @@ -52449,7 +54360,7 @@ diff -urNp linux-2.6.34.1/net/ipv4/tcp_minisocks.c linux-2.6.34.1/net/ipv4/tcp_m int sysctl_tcp_syncookies __read_mostly = 1; EXPORT_SYMBOL(sysctl_tcp_syncookies); -@@ -699,6 +703,10 @@ listen_overflow: +@@ -700,6 +704,10 @@ listen_overflow: embryonic_reset: NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_EMBRYONICRSTS); @@ -52460,9 +54371,9 @@ diff -urNp linux-2.6.34.1/net/ipv4/tcp_minisocks.c linux-2.6.34.1/net/ipv4/tcp_m if (!(flg & TCP_FLAG_RST)) req->rsk_ops->send_reset(sk, skb); -diff -urNp linux-2.6.34.1/net/ipv4/tcp_probe.c linux-2.6.34.1/net/ipv4/tcp_probe.c ---- linux-2.6.34.1/net/ipv4/tcp_probe.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/net/ipv4/tcp_probe.c 2010-07-07 09:04:58.000000000 -0400 +diff -urNp linux-2.6.35.4/net/ipv4/tcp_probe.c linux-2.6.35.4/net/ipv4/tcp_probe.c +--- linux-2.6.35.4/net/ipv4/tcp_probe.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/net/ipv4/tcp_probe.c 2010-09-17 20:12:37.000000000 -0400 @@ -202,7 +202,7 @@ static ssize_t tcpprobe_read(struct file if (cnt + width >= len) break; @@ -52472,9 +54383,9 @@ diff -urNp linux-2.6.34.1/net/ipv4/tcp_probe.c linux-2.6.34.1/net/ipv4/tcp_probe return -EFAULT; cnt += width; } -diff -urNp linux-2.6.34.1/net/ipv4/tcp_timer.c linux-2.6.34.1/net/ipv4/tcp_timer.c ---- linux-2.6.34.1/net/ipv4/tcp_timer.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/net/ipv4/tcp_timer.c 2010-07-07 09:04:58.000000000 -0400 +diff -urNp linux-2.6.35.4/net/ipv4/tcp_timer.c linux-2.6.35.4/net/ipv4/tcp_timer.c +--- linux-2.6.35.4/net/ipv4/tcp_timer.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/net/ipv4/tcp_timer.c 2010-09-17 20:12:37.000000000 -0400 @@ -22,6 +22,10 @@ #include #include @@ -52500,9 +54411,9 @@ diff -urNp linux-2.6.34.1/net/ipv4/tcp_timer.c linux-2.6.34.1/net/ipv4/tcp_timer if (retransmits_timed_out(sk, retry_until)) { /* Has it gone just too far? */ tcp_write_err(sk); -diff -urNp linux-2.6.34.1/net/ipv4/udp.c linux-2.6.34.1/net/ipv4/udp.c ---- linux-2.6.34.1/net/ipv4/udp.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/net/ipv4/udp.c 2010-07-07 09:04:58.000000000 -0400 +diff -urNp linux-2.6.35.4/net/ipv4/udp.c linux-2.6.35.4/net/ipv4/udp.c +--- linux-2.6.35.4/net/ipv4/udp.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/net/ipv4/udp.c 2010-09-17 20:12:37.000000000 -0400 @@ -86,6 +86,7 @@ #include #include @@ -52522,7 +54433,7 @@ diff -urNp linux-2.6.34.1/net/ipv4/udp.c linux-2.6.34.1/net/ipv4/udp.c struct udp_table udp_table __read_mostly; EXPORT_SYMBOL(udp_table); -@@ -563,6 +568,9 @@ found: +@@ -564,6 +569,9 @@ found: return s; } @@ -52532,7 +54443,7 @@ diff -urNp linux-2.6.34.1/net/ipv4/udp.c linux-2.6.34.1/net/ipv4/udp.c /* * This routine is called by the ICMP module when it gets some * sort of error condition. If err < 0 then the socket should -@@ -831,9 +839,18 @@ int udp_sendmsg(struct kiocb *iocb, stru +@@ -832,9 +840,18 @@ int udp_sendmsg(struct kiocb *iocb, stru dport = usin->sin_port; if (dport == 0) return -EINVAL; @@ -52551,7 +54462,7 @@ diff -urNp linux-2.6.34.1/net/ipv4/udp.c linux-2.6.34.1/net/ipv4/udp.c daddr = inet->inet_daddr; dport = inet->inet_dport; /* Open fast path for connected socket. -@@ -1138,6 +1155,10 @@ try_again: +@@ -1141,6 +1158,10 @@ try_again: if (!skb) goto out; @@ -52562,7 +54473,7 @@ diff -urNp linux-2.6.34.1/net/ipv4/udp.c linux-2.6.34.1/net/ipv4/udp.c ulen = skb->len - sizeof(struct udphdr); if (len > ulen) len = ulen; -@@ -1570,6 +1591,9 @@ int __udp4_lib_rcv(struct sk_buff *skb, +@@ -1582,6 +1603,9 @@ int __udp4_lib_rcv(struct sk_buff *skb, goto csum_error; UDP_INC_STATS_BH(net, UDP_MIB_NOPORTS, proto == IPPROTO_UDPLITE); @@ -52572,9 +54483,23 @@ diff -urNp linux-2.6.34.1/net/ipv4/udp.c linux-2.6.34.1/net/ipv4/udp.c icmp_send(skb, ICMP_DEST_UNREACH, ICMP_PORT_UNREACH, 0); /* -diff -urNp linux-2.6.34.1/net/ipv6/exthdrs.c linux-2.6.34.1/net/ipv6/exthdrs.c ---- linux-2.6.34.1/net/ipv6/exthdrs.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/net/ipv6/exthdrs.c 2010-07-07 09:04:58.000000000 -0400 +@@ -2007,7 +2031,12 @@ static void udp4_format_sock(struct sock + sk_wmem_alloc_get(sp), + sk_rmem_alloc_get(sp), + 0, 0L, 0, sock_i_uid(sp), 0, sock_i_ino(sp), +- atomic_read(&sp->sk_refcnt), sp, ++ atomic_read(&sp->sk_refcnt), ++#ifdef CONFIG_GRKERNSEC_HIDESYM ++ NULL, ++#else ++ sp, ++#endif + atomic_read(&sp->sk_drops), len); + } + +diff -urNp linux-2.6.35.4/net/ipv6/exthdrs.c linux-2.6.35.4/net/ipv6/exthdrs.c +--- linux-2.6.35.4/net/ipv6/exthdrs.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/net/ipv6/exthdrs.c 2010-09-17 20:12:09.000000000 -0400 @@ -636,7 +636,7 @@ static struct tlvtype_proc tlvprochopopt .type = IPV6_TLV_JUMBO, .func = ipv6_hop_jumbo, @@ -52584,10 +54509,10 @@ diff -urNp linux-2.6.34.1/net/ipv6/exthdrs.c linux-2.6.34.1/net/ipv6/exthdrs.c }; int ipv6_parse_hopopts(struct sk_buff *skb) -diff -urNp linux-2.6.34.1/net/ipv6/raw.c linux-2.6.34.1/net/ipv6/raw.c ---- linux-2.6.34.1/net/ipv6/raw.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/net/ipv6/raw.c 2010-07-07 09:04:58.000000000 -0400 -@@ -598,7 +598,7 @@ out: +diff -urNp linux-2.6.35.4/net/ipv6/raw.c linux-2.6.35.4/net/ipv6/raw.c +--- linux-2.6.35.4/net/ipv6/raw.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/net/ipv6/raw.c 2010-09-17 20:12:09.000000000 -0400 +@@ -601,7 +601,7 @@ out: return err; } @@ -52596,10 +54521,10 @@ diff -urNp linux-2.6.34.1/net/ipv6/raw.c linux-2.6.34.1/net/ipv6/raw.c struct flowi *fl, struct rt6_info *rt, unsigned int flags) { -diff -urNp linux-2.6.34.1/net/ipv6/tcp_ipv6.c linux-2.6.34.1/net/ipv6/tcp_ipv6.c ---- linux-2.6.34.1/net/ipv6/tcp_ipv6.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/net/ipv6/tcp_ipv6.c 2010-07-07 09:04:58.000000000 -0400 -@@ -89,6 +89,10 @@ static struct tcp_md5sig_key *tcp_v6_md5 +diff -urNp linux-2.6.35.4/net/ipv6/tcp_ipv6.c linux-2.6.35.4/net/ipv6/tcp_ipv6.c +--- linux-2.6.35.4/net/ipv6/tcp_ipv6.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/net/ipv6/tcp_ipv6.c 2010-09-17 20:23:25.000000000 -0400 +@@ -92,6 +92,10 @@ static struct tcp_md5sig_key *tcp_v6_md5 } #endif @@ -52610,7 +54535,17 @@ diff -urNp linux-2.6.34.1/net/ipv6/tcp_ipv6.c linux-2.6.34.1/net/ipv6/tcp_ipv6.c static void tcp_v6_hash(struct sock *sk) { if (sk->sk_state != TCP_CLOSE) { -@@ -1711,12 +1715,20 @@ static int tcp_v6_rcv(struct sk_buff *sk +@@ -1641,6 +1645,9 @@ static int tcp_v6_do_rcv(struct sock *sk + return 0; + + reset: ++#ifdef CONFIG_GRKERNSEC_BLACKHOLE ++ if (!grsec_enable_blackhole) ++#endif + tcp_v6_send_reset(sk, skb); + discard: + if (opt_skb) +@@ -1720,12 +1727,20 @@ static int tcp_v6_rcv(struct sk_buff *sk TCP_SKB_CB(skb)->sacked = 0; sk = __inet6_lookup_skb(&tcp_hashinfo, skb, th->source, th->dest); @@ -52631,9 +54566,9 @@ diff -urNp linux-2.6.34.1/net/ipv6/tcp_ipv6.c linux-2.6.34.1/net/ipv6/tcp_ipv6.c goto do_time_wait; + } - if (!xfrm6_policy_check(sk, XFRM_POLICY_IN, skb)) - goto discard_and_relse; -@@ -1759,6 +1771,10 @@ no_tcp_socket: + if (hdr->hop_limit < inet6_sk(sk)->min_hopcount) { + NET_INC_STATS_BH(net, LINUX_MIB_TCPMINTTLDROP); +@@ -1773,6 +1788,10 @@ no_tcp_socket: bad_packet: TCP_INC_STATS_BH(net, TCP_MIB_INERRS); } else { @@ -52644,9 +54579,9 @@ diff -urNp linux-2.6.34.1/net/ipv6/tcp_ipv6.c linux-2.6.34.1/net/ipv6/tcp_ipv6.c tcp_v6_send_reset(NULL, skb); } -diff -urNp linux-2.6.34.1/net/ipv6/udp.c linux-2.6.34.1/net/ipv6/udp.c ---- linux-2.6.34.1/net/ipv6/udp.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/net/ipv6/udp.c 2010-07-07 09:04:58.000000000 -0400 +diff -urNp linux-2.6.35.4/net/ipv6/udp.c linux-2.6.35.4/net/ipv6/udp.c +--- linux-2.6.35.4/net/ipv6/udp.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/net/ipv6/udp.c 2010-09-17 20:12:37.000000000 -0400 @@ -50,6 +50,10 @@ #include #include "udp_impl.h" @@ -52658,7 +54593,7 @@ diff -urNp linux-2.6.34.1/net/ipv6/udp.c linux-2.6.34.1/net/ipv6/udp.c int ipv6_rcv_saddr_equal(const struct sock *sk, const struct sock *sk2) { const struct in6_addr *sk_rcv_saddr6 = &inet6_sk(sk)->rcv_saddr; -@@ -748,6 +752,9 @@ int __udp6_lib_rcv(struct sk_buff *skb, +@@ -756,6 +760,9 @@ int __udp6_lib_rcv(struct sk_buff *skb, UDP6_INC_STATS_BH(net, UDP_MIB_NOPORTS, proto == IPPROTO_UDPLITE); @@ -52668,9 +54603,9 @@ diff -urNp linux-2.6.34.1/net/ipv6/udp.c linux-2.6.34.1/net/ipv6/udp.c icmpv6_send(skb, ICMPV6_DEST_UNREACH, ICMPV6_PORT_UNREACH, 0); kfree_skb(skb); -diff -urNp linux-2.6.34.1/net/irda/ircomm/ircomm_tty.c linux-2.6.34.1/net/irda/ircomm/ircomm_tty.c ---- linux-2.6.34.1/net/irda/ircomm/ircomm_tty.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/net/irda/ircomm/ircomm_tty.c 2010-07-07 09:04:58.000000000 -0400 +diff -urNp linux-2.6.35.4/net/irda/ircomm/ircomm_tty.c linux-2.6.35.4/net/irda/ircomm/ircomm_tty.c +--- linux-2.6.35.4/net/irda/ircomm/ircomm_tty.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/net/irda/ircomm/ircomm_tty.c 2010-09-17 20:12:09.000000000 -0400 @@ -281,16 +281,16 @@ static int ircomm_tty_block_til_ready(st add_wait_queue(&self->open_wait, &wait); @@ -52793,10 +54728,25 @@ diff -urNp linux-2.6.34.1/net/irda/ircomm/ircomm_tty.c linux-2.6.34.1/net/irda/i seq_printf(m, "Max data size: %d\n", self->max_data_size); seq_printf(m, "Max header size: %d\n", self->max_header_size); -diff -urNp linux-2.6.34.1/net/mac80211/ieee80211_i.h linux-2.6.34.1/net/mac80211/ieee80211_i.h ---- linux-2.6.34.1/net/mac80211/ieee80211_i.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/net/mac80211/ieee80211_i.h 2010-07-07 09:04:58.000000000 -0400 -@@ -630,7 +630,7 @@ struct ieee80211_local { +diff -urNp linux-2.6.35.4/net/key/af_key.c linux-2.6.35.4/net/key/af_key.c +--- linux-2.6.35.4/net/key/af_key.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/net/key/af_key.c 2010-09-17 20:12:37.000000000 -0400 +@@ -3644,7 +3644,11 @@ static int pfkey_seq_show(struct seq_fil + seq_printf(f ,"sk RefCnt Rmem Wmem User Inode\n"); + else + seq_printf(f ,"%p %-6d %-6u %-6u %-6u %-6lu\n", ++#ifdef CONFIG_GRKERNSEC_HIDESYM ++ NULL, ++#else + s, ++#endif + atomic_read(&s->sk_refcnt), + sk_rmem_alloc_get(s), + sk_wmem_alloc_get(s), +diff -urNp linux-2.6.35.4/net/mac80211/ieee80211_i.h linux-2.6.35.4/net/mac80211/ieee80211_i.h +--- linux-2.6.35.4/net/mac80211/ieee80211_i.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/net/mac80211/ieee80211_i.h 2010-09-17 20:12:09.000000000 -0400 +@@ -649,7 +649,7 @@ struct ieee80211_local { /* also used to protect ampdu_ac_queue and amdpu_ac_stop_refcnt */ spinlock_t queue_stop_reason_lock; @@ -52805,9 +54755,9 @@ diff -urNp linux-2.6.34.1/net/mac80211/ieee80211_i.h linux-2.6.34.1/net/mac80211 int monitors, cooked_mntrs; /* number of interfaces with corresponding FIF_ flags */ int fif_fcsfail, fif_plcpfail, fif_control, fif_other_bss, fif_pspoll; -diff -urNp linux-2.6.34.1/net/mac80211/iface.c linux-2.6.34.1/net/mac80211/iface.c ---- linux-2.6.34.1/net/mac80211/iface.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/net/mac80211/iface.c 2010-07-07 09:04:58.000000000 -0400 +diff -urNp linux-2.6.35.4/net/mac80211/iface.c linux-2.6.35.4/net/mac80211/iface.c +--- linux-2.6.35.4/net/mac80211/iface.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/net/mac80211/iface.c 2010-09-17 20:12:09.000000000 -0400 @@ -183,7 +183,7 @@ static int ieee80211_open(struct net_dev break; } @@ -52844,7 +54794,7 @@ diff -urNp linux-2.6.34.1/net/mac80211/iface.c linux-2.6.34.1/net/mac80211/iface drv_stop(local); err_del_bss: sdata->bss = NULL; -@@ -440,7 +440,7 @@ static int ieee80211_stop(struct net_dev +@@ -439,7 +439,7 @@ static int ieee80211_stop(struct net_dev WARN_ON(!list_empty(&sdata->u.ap.vlans)); } @@ -52853,7 +54803,7 @@ diff -urNp linux-2.6.34.1/net/mac80211/iface.c linux-2.6.34.1/net/mac80211/iface switch (sdata->vif.type) { case NL80211_IFTYPE_AP_VLAN: -@@ -543,7 +543,7 @@ static int ieee80211_stop(struct net_dev +@@ -542,7 +542,7 @@ static int ieee80211_stop(struct net_dev ieee80211_recalc_ps(local, -1); @@ -52862,9 +54812,9 @@ diff -urNp linux-2.6.34.1/net/mac80211/iface.c linux-2.6.34.1/net/mac80211/iface ieee80211_clear_tx_pending(local); ieee80211_stop_device(local); -diff -urNp linux-2.6.34.1/net/mac80211/main.c linux-2.6.34.1/net/mac80211/main.c ---- linux-2.6.34.1/net/mac80211/main.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/net/mac80211/main.c 2010-07-07 09:04:58.000000000 -0400 +diff -urNp linux-2.6.35.4/net/mac80211/main.c linux-2.6.35.4/net/mac80211/main.c +--- linux-2.6.35.4/net/mac80211/main.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/net/mac80211/main.c 2010-09-17 20:12:09.000000000 -0400 @@ -148,7 +148,7 @@ int ieee80211_hw_config(struct ieee80211 local->hw.conf.power_level = power; } @@ -52874,9 +54824,9 @@ diff -urNp linux-2.6.34.1/net/mac80211/main.c linux-2.6.34.1/net/mac80211/main.c ret = drv_config(local, changed); /* * Goal: -diff -urNp linux-2.6.34.1/net/mac80211/pm.c linux-2.6.34.1/net/mac80211/pm.c ---- linux-2.6.34.1/net/mac80211/pm.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/net/mac80211/pm.c 2010-07-07 09:04:58.000000000 -0400 +diff -urNp linux-2.6.35.4/net/mac80211/pm.c linux-2.6.35.4/net/mac80211/pm.c +--- linux-2.6.35.4/net/mac80211/pm.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/net/mac80211/pm.c 2010-09-17 20:12:09.000000000 -0400 @@ -101,7 +101,7 @@ int __ieee80211_suspend(struct ieee80211 } @@ -52886,9 +54836,9 @@ diff -urNp linux-2.6.34.1/net/mac80211/pm.c linux-2.6.34.1/net/mac80211/pm.c ieee80211_stop_device(local); local->suspended = true; -diff -urNp linux-2.6.34.1/net/mac80211/rate.c linux-2.6.34.1/net/mac80211/rate.c ---- linux-2.6.34.1/net/mac80211/rate.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/net/mac80211/rate.c 2010-07-07 09:04:58.000000000 -0400 +diff -urNp linux-2.6.35.4/net/mac80211/rate.c linux-2.6.35.4/net/mac80211/rate.c +--- linux-2.6.35.4/net/mac80211/rate.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/net/mac80211/rate.c 2010-09-17 20:12:09.000000000 -0400 @@ -355,7 +355,7 @@ int ieee80211_init_rate_ctrl_alg(struct ASSERT_RTNL(); @@ -52898,9 +54848,9 @@ diff -urNp linux-2.6.34.1/net/mac80211/rate.c linux-2.6.34.1/net/mac80211/rate.c return -EBUSY; if (local->hw.flags & IEEE80211_HW_HAS_RATE_CONTROL) { -diff -urNp linux-2.6.34.1/net/mac80211/rc80211_pid_debugfs.c linux-2.6.34.1/net/mac80211/rc80211_pid_debugfs.c ---- linux-2.6.34.1/net/mac80211/rc80211_pid_debugfs.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/net/mac80211/rc80211_pid_debugfs.c 2010-07-07 09:04:58.000000000 -0400 +diff -urNp linux-2.6.35.4/net/mac80211/rc80211_pid_debugfs.c linux-2.6.35.4/net/mac80211/rc80211_pid_debugfs.c +--- linux-2.6.35.4/net/mac80211/rc80211_pid_debugfs.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/net/mac80211/rc80211_pid_debugfs.c 2010-09-17 20:12:09.000000000 -0400 @@ -192,7 +192,7 @@ static ssize_t rate_control_pid_events_r spin_unlock_irqrestore(&events->lock, status); @@ -52910,9 +54860,9 @@ diff -urNp linux-2.6.34.1/net/mac80211/rc80211_pid_debugfs.c linux-2.6.34.1/net/ return -EFAULT; return p; -diff -urNp linux-2.6.34.1/net/mac80211/tx.c linux-2.6.34.1/net/mac80211/tx.c ---- linux-2.6.34.1/net/mac80211/tx.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/net/mac80211/tx.c 2010-07-07 09:04:58.000000000 -0400 +diff -urNp linux-2.6.35.4/net/mac80211/tx.c linux-2.6.35.4/net/mac80211/tx.c +--- linux-2.6.35.4/net/mac80211/tx.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/net/mac80211/tx.c 2010-09-17 20:12:09.000000000 -0400 @@ -173,7 +173,7 @@ static __le16 ieee80211_duration(struct return cpu_to_le16(dur); } @@ -52922,10 +54872,10 @@ diff -urNp linux-2.6.34.1/net/mac80211/tx.c linux-2.6.34.1/net/mac80211/tx.c struct net_device *dev) { return local == wdev_priv(dev->ieee80211_ptr); -diff -urNp linux-2.6.34.1/net/mac80211/util.c linux-2.6.34.1/net/mac80211/util.c ---- linux-2.6.34.1/net/mac80211/util.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/net/mac80211/util.c 2010-07-07 09:04:58.000000000 -0400 -@@ -1088,7 +1088,7 @@ int ieee80211_reconfig(struct ieee80211_ +diff -urNp linux-2.6.35.4/net/mac80211/util.c linux-2.6.35.4/net/mac80211/util.c +--- linux-2.6.35.4/net/mac80211/util.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/net/mac80211/util.c 2010-09-17 20:12:09.000000000 -0400 +@@ -1097,7 +1097,7 @@ int ieee80211_reconfig(struct ieee80211_ local->resuming = true; /* restart hardware */ @@ -52934,10 +54884,35 @@ diff -urNp linux-2.6.34.1/net/mac80211/util.c linux-2.6.34.1/net/mac80211/util.c /* * Upon resume hardware can sometimes be goofy due to * various platform / driver / bus issues, so restarting -diff -urNp linux-2.6.34.1/net/packet/af_packet.c linux-2.6.34.1/net/packet/af_packet.c ---- linux-2.6.34.1/net/packet/af_packet.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/net/packet/af_packet.c 2010-07-07 09:04:58.000000000 -0400 -@@ -2034,7 +2034,7 @@ static int packet_getsockopt(struct sock +diff -urNp linux-2.6.35.4/net/netlink/af_netlink.c linux-2.6.35.4/net/netlink/af_netlink.c +--- linux-2.6.35.4/net/netlink/af_netlink.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/net/netlink/af_netlink.c 2010-09-17 20:12:37.000000000 -0400 +@@ -2001,13 +2001,21 @@ static int netlink_seq_show(struct seq_f + struct netlink_sock *nlk = nlk_sk(s); + + seq_printf(seq, "%p %-3d %-6d %08x %-8d %-8d %p %-8d %-8d %-8lu\n", ++#ifdef CONFIG_GRKERNSEC_HIDESYM ++ NULL, ++#else + s, ++#endif + s->sk_protocol, + nlk->pid, + nlk->groups ? (u32)nlk->groups[0] : 0, + sk_rmem_alloc_get(s), + sk_wmem_alloc_get(s), ++#ifdef CONFIG_GRKERNSEC_HIDESYM ++ NULL, ++#else + nlk->cb, ++#endif + atomic_read(&s->sk_refcnt), + atomic_read(&s->sk_drops), + sock_i_ino(s) +diff -urNp linux-2.6.35.4/net/packet/af_packet.c linux-2.6.35.4/net/packet/af_packet.c +--- linux-2.6.35.4/net/packet/af_packet.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/net/packet/af_packet.c 2010-09-17 20:12:37.000000000 -0400 +@@ -2093,7 +2093,7 @@ static int packet_getsockopt(struct sock case PACKET_HDRLEN: if (len > sizeof(int)) len = sizeof(int); @@ -52946,7 +54921,7 @@ diff -urNp linux-2.6.34.1/net/packet/af_packet.c linux-2.6.34.1/net/packet/af_pa return -EFAULT; switch (val) { case TPACKET_V1: -@@ -2066,7 +2066,7 @@ static int packet_getsockopt(struct sock +@@ -2125,7 +2125,7 @@ static int packet_getsockopt(struct sock if (put_user(len, optlen)) return -EFAULT; @@ -52955,9 +54930,21 @@ diff -urNp linux-2.6.34.1/net/packet/af_packet.c linux-2.6.34.1/net/packet/af_pa return -EFAULT; return 0; } -diff -urNp linux-2.6.34.1/net/sctp/socket.c linux-2.6.34.1/net/sctp/socket.c ---- linux-2.6.34.1/net/sctp/socket.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/net/sctp/socket.c 2010-07-07 09:04:58.000000000 -0400 +@@ -2604,7 +2604,11 @@ static int packet_seq_show(struct seq_fi + + seq_printf(seq, + "%p %-6d %-4d %04x %-5d %1d %-6u %-6u %-6lu\n", ++#ifdef CONFIG_GRKERNSEC_HIDESYM ++ NULL, ++#else + s, ++#endif + atomic_read(&s->sk_refcnt), + s->sk_type, + ntohs(po->num), +diff -urNp linux-2.6.35.4/net/sctp/socket.c linux-2.6.35.4/net/sctp/socket.c +--- linux-2.6.35.4/net/sctp/socket.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/net/sctp/socket.c 2010-09-17 20:12:09.000000000 -0400 @@ -1483,7 +1483,7 @@ SCTP_STATIC int sctp_sendmsg(struct kioc struct sctp_sndrcvinfo *sinfo; struct sctp_initmsg *sinit; @@ -52967,8 +54954,8 @@ diff -urNp linux-2.6.34.1/net/sctp/socket.c linux-2.6.34.1/net/sctp/socket.c int err; sctp_scope_t scope; long timeo; -@@ -4390,7 +4390,7 @@ static int sctp_getsockopt_peer_addrs(st - addrlen = sctp_get_af_specific(sk->sk_family)->sockaddr_len; +@@ -4387,7 +4387,7 @@ static int sctp_getsockopt_peer_addrs(st + addrlen = sctp_get_af_specific(temp.sa.sa_family)->sockaddr_len; if (space_left < addrlen) return -ENOMEM; - if (copy_to_user(to, &temp, addrlen)) @@ -52976,17 +54963,9 @@ diff -urNp linux-2.6.34.1/net/sctp/socket.c linux-2.6.34.1/net/sctp/socket.c return -EFAULT; to += addrlen; cnt++; -@@ -5482,7 +5482,6 @@ pp_found: - */ - int reuse = sk->sk_reuse; - struct sock *sk2; -- struct hlist_node *node; - - SCTP_DEBUG_PRINTK("sctp_get_port() found a possible match\n"); - if (pp->fastreuse && sk->sk_reuse && -diff -urNp linux-2.6.34.1/net/socket.c linux-2.6.34.1/net/socket.c ---- linux-2.6.34.1/net/socket.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/net/socket.c 2010-07-07 09:04:58.000000000 -0400 +diff -urNp linux-2.6.35.4/net/socket.c linux-2.6.35.4/net/socket.c +--- linux-2.6.35.4/net/socket.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/net/socket.c 2010-09-17 20:12:37.000000000 -0400 @@ -88,6 +88,7 @@ #include #include @@ -52995,7 +54974,7 @@ diff -urNp linux-2.6.34.1/net/socket.c linux-2.6.34.1/net/socket.c #include #include -@@ -104,6 +105,8 @@ +@@ -105,6 +106,8 @@ #include #include @@ -53004,7 +54983,7 @@ diff -urNp linux-2.6.34.1/net/socket.c linux-2.6.34.1/net/socket.c static int sock_no_open(struct inode *irrelevant, struct file *dontcare); static ssize_t sock_aio_read(struct kiocb *iocb, const struct iovec *iov, unsigned long nr_segs, loff_t pos); -@@ -305,7 +308,7 @@ static int sockfs_get_sb(struct file_sys +@@ -322,7 +325,7 @@ static int sockfs_get_sb(struct file_sys mnt); } @@ -53013,7 +54992,7 @@ diff -urNp linux-2.6.34.1/net/socket.c linux-2.6.34.1/net/socket.c static struct file_system_type sock_fs_type = { .name = "sockfs", -@@ -1311,6 +1314,16 @@ SYSCALL_DEFINE3(socket, int, family, int +@@ -1291,6 +1294,16 @@ SYSCALL_DEFINE3(socket, int, family, int if (SOCK_NONBLOCK != O_NONBLOCK && (flags & SOCK_NONBLOCK)) flags = (flags & ~SOCK_NONBLOCK) | O_NONBLOCK; @@ -53030,7 +55009,7 @@ diff -urNp linux-2.6.34.1/net/socket.c linux-2.6.34.1/net/socket.c retval = sock_create(family, type, protocol, &sock); if (retval < 0) goto out; -@@ -1423,6 +1436,14 @@ SYSCALL_DEFINE3(bind, int, fd, struct so +@@ -1403,6 +1416,14 @@ SYSCALL_DEFINE3(bind, int, fd, struct so if (sock) { err = move_addr_to_kernel(umyaddr, addrlen, (struct sockaddr *)&address); if (err >= 0) { @@ -53045,7 +55024,7 @@ diff -urNp linux-2.6.34.1/net/socket.c linux-2.6.34.1/net/socket.c err = security_socket_bind(sock, (struct sockaddr *)&address, addrlen); -@@ -1431,6 +1452,7 @@ SYSCALL_DEFINE3(bind, int, fd, struct so +@@ -1411,6 +1432,7 @@ SYSCALL_DEFINE3(bind, int, fd, struct so (struct sockaddr *) &address, addrlen); } @@ -53053,7 +55032,7 @@ diff -urNp linux-2.6.34.1/net/socket.c linux-2.6.34.1/net/socket.c fput_light(sock->file, fput_needed); } return err; -@@ -1454,10 +1476,20 @@ SYSCALL_DEFINE2(listen, int, fd, int, ba +@@ -1434,10 +1456,20 @@ SYSCALL_DEFINE2(listen, int, fd, int, ba if ((unsigned)backlog > somaxconn) backlog = somaxconn; @@ -53074,7 +55053,7 @@ diff -urNp linux-2.6.34.1/net/socket.c linux-2.6.34.1/net/socket.c fput_light(sock->file, fput_needed); } return err; -@@ -1500,6 +1532,18 @@ SYSCALL_DEFINE4(accept4, int, fd, struct +@@ -1480,6 +1512,18 @@ SYSCALL_DEFINE4(accept4, int, fd, struct newsock->type = sock->type; newsock->ops = sock->ops; @@ -53093,7 +55072,7 @@ diff -urNp linux-2.6.34.1/net/socket.c linux-2.6.34.1/net/socket.c /* * We don't need try_module_get here, as the listening socket (sock) * has the protocol module (sock->ops->owner) held. -@@ -1538,6 +1582,8 @@ SYSCALL_DEFINE4(accept4, int, fd, struct +@@ -1518,6 +1562,8 @@ SYSCALL_DEFINE4(accept4, int, fd, struct fd_install(newfd, newfile); err = newfd; @@ -53102,7 +55081,7 @@ diff -urNp linux-2.6.34.1/net/socket.c linux-2.6.34.1/net/socket.c out_put: fput_light(sock->file, fput_needed); out: -@@ -1570,6 +1616,7 @@ SYSCALL_DEFINE3(connect, int, fd, struct +@@ -1550,6 +1596,7 @@ SYSCALL_DEFINE3(connect, int, fd, struct int, addrlen) { struct socket *sock; @@ -53110,7 +55089,7 @@ diff -urNp linux-2.6.34.1/net/socket.c linux-2.6.34.1/net/socket.c struct sockaddr_storage address; int err, fput_needed; -@@ -1580,6 +1627,17 @@ SYSCALL_DEFINE3(connect, int, fd, struct +@@ -1560,6 +1607,17 @@ SYSCALL_DEFINE3(connect, int, fd, struct if (err < 0) goto out_put; @@ -53128,9 +55107,24 @@ diff -urNp linux-2.6.34.1/net/socket.c linux-2.6.34.1/net/socket.c err = security_socket_connect(sock, (struct sockaddr *)&address, addrlen); if (err) -diff -urNp linux-2.6.34.1/net/sunrpc/xprtrdma/svc_rdma.c linux-2.6.34.1/net/sunrpc/xprtrdma/svc_rdma.c ---- linux-2.6.34.1/net/sunrpc/xprtrdma/svc_rdma.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/net/sunrpc/xprtrdma/svc_rdma.c 2010-07-07 09:04:58.000000000 -0400 +diff -urNp linux-2.6.35.4/net/sunrpc/sched.c linux-2.6.35.4/net/sunrpc/sched.c +--- linux-2.6.35.4/net/sunrpc/sched.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/net/sunrpc/sched.c 2010-09-17 20:12:09.000000000 -0400 +@@ -234,9 +234,9 @@ static int rpc_wait_bit_killable(void *w + #ifdef RPC_DEBUG + static void rpc_task_set_debuginfo(struct rpc_task *task) + { +- static atomic_t rpc_pid; ++ static atomic_unchecked_t rpc_pid; + +- task->tk_pid = atomic_inc_return(&rpc_pid); ++ task->tk_pid = atomic_inc_return_unchecked(&rpc_pid); + } + #else + static inline void rpc_task_set_debuginfo(struct rpc_task *task) +diff -urNp linux-2.6.35.4/net/sunrpc/xprtrdma/svc_rdma.c linux-2.6.35.4/net/sunrpc/xprtrdma/svc_rdma.c +--- linux-2.6.35.4/net/sunrpc/xprtrdma/svc_rdma.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/net/sunrpc/xprtrdma/svc_rdma.c 2010-09-17 20:12:37.000000000 -0400 @@ -106,7 +106,7 @@ static int read_reset_stat(ctl_table *ta len -= *ppos; if (len > *lenp) @@ -53140,9 +55134,9 @@ diff -urNp linux-2.6.34.1/net/sunrpc/xprtrdma/svc_rdma.c linux-2.6.34.1/net/sunr return -EFAULT; *lenp = len; *ppos += len; -diff -urNp linux-2.6.34.1/net/sysctl_net.c linux-2.6.34.1/net/sysctl_net.c ---- linux-2.6.34.1/net/sysctl_net.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/net/sysctl_net.c 2010-07-07 09:04:58.000000000 -0400 +diff -urNp linux-2.6.35.4/net/sysctl_net.c linux-2.6.35.4/net/sysctl_net.c +--- linux-2.6.35.4/net/sysctl_net.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/net/sysctl_net.c 2010-09-17 20:12:37.000000000 -0400 @@ -46,7 +46,7 @@ static int net_ctl_permissions(struct ct struct ctl_table *table) { @@ -53152,9 +55146,9 @@ diff -urNp linux-2.6.34.1/net/sysctl_net.c linux-2.6.34.1/net/sysctl_net.c int mode = (table->mode >> 6) & 7; return (mode << 6) | (mode << 3) | mode; } -diff -urNp linux-2.6.34.1/net/tipc/socket.c linux-2.6.34.1/net/tipc/socket.c ---- linux-2.6.34.1/net/tipc/socket.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/net/tipc/socket.c 2010-07-07 09:04:58.000000000 -0400 +diff -urNp linux-2.6.35.4/net/tipc/socket.c linux-2.6.35.4/net/tipc/socket.c +--- linux-2.6.35.4/net/tipc/socket.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/net/tipc/socket.c 2010-09-17 20:12:09.000000000 -0400 @@ -1451,8 +1451,9 @@ static int connect(struct socket *sock, } else { if (res == 0) @@ -53167,10 +55161,10 @@ diff -urNp linux-2.6.34.1/net/tipc/socket.c linux-2.6.34.1/net/tipc/socket.c sock->state = SS_DISCONNECTING; } -diff -urNp linux-2.6.34.1/net/unix/af_unix.c linux-2.6.34.1/net/unix/af_unix.c ---- linux-2.6.34.1/net/unix/af_unix.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/net/unix/af_unix.c 2010-07-07 09:04:59.000000000 -0400 -@@ -735,6 +735,12 @@ static struct sock *unix_find_other(stru +diff -urNp linux-2.6.35.4/net/unix/af_unix.c linux-2.6.35.4/net/unix/af_unix.c +--- linux-2.6.35.4/net/unix/af_unix.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/net/unix/af_unix.c 2010-09-17 20:12:37.000000000 -0400 +@@ -736,6 +736,12 @@ static struct sock *unix_find_other(stru err = -ECONNREFUSED; if (!S_ISSOCK(inode->i_mode)) goto put_fail; @@ -53183,7 +55177,7 @@ diff -urNp linux-2.6.34.1/net/unix/af_unix.c linux-2.6.34.1/net/unix/af_unix.c u = unix_find_socket_byinode(net, inode); if (!u) goto put_fail; -@@ -755,6 +761,13 @@ static struct sock *unix_find_other(stru +@@ -756,6 +762,13 @@ static struct sock *unix_find_other(stru if (u) { struct dentry *dentry; dentry = unix_sk(u)->dentry; @@ -53197,7 +55191,7 @@ diff -urNp linux-2.6.34.1/net/unix/af_unix.c linux-2.6.34.1/net/unix/af_unix.c if (dentry) touch_atime(unix_sk(u)->mnt, dentry); } else -@@ -840,11 +853,18 @@ static int unix_bind(struct socket *sock +@@ -841,11 +854,18 @@ static int unix_bind(struct socket *sock err = security_path_mknod(&nd.path, dentry, mode, 0); if (err) goto out_mknod_drop_write; @@ -53216,7 +55210,7 @@ diff -urNp linux-2.6.34.1/net/unix/af_unix.c linux-2.6.34.1/net/unix/af_unix.c mutex_unlock(&nd.path.dentry->d_inode->i_mutex); dput(nd.path.dentry); nd.path.dentry = dentry; -@@ -862,6 +882,10 @@ out_mknod_drop_write: +@@ -863,6 +883,10 @@ out_mknod_drop_write: goto out_unlock; } @@ -53227,9 +55221,33 @@ diff -urNp linux-2.6.34.1/net/unix/af_unix.c linux-2.6.34.1/net/unix/af_unix.c list = &unix_socket_table[addr->hash]; } else { list = &unix_socket_table[dentry->d_inode->i_ino & (UNIX_HASH_SIZE-1)]; -diff -urNp linux-2.6.34.1/net/wireless/wext-core.c linux-2.6.34.1/net/wireless/wext-core.c ---- linux-2.6.34.1/net/wireless/wext-core.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/net/wireless/wext-core.c 2010-07-07 09:04:59.000000000 -0400 +@@ -2161,7 +2185,11 @@ static int unix_seq_show(struct seq_file + unix_state_lock(s); + + seq_printf(seq, "%p: %08X %08X %08X %04X %02X %5lu", ++#ifdef CONFIG_GRKERNSEC_HIDESYM ++ NULL, ++#else + s, ++#endif + atomic_read(&s->sk_refcnt), + 0, + s->sk_state == TCP_LISTEN ? __SO_ACCEPTCON : 0, +diff -urNp linux-2.6.35.4/net/wireless/reg.c linux-2.6.35.4/net/wireless/reg.c +--- linux-2.6.35.4/net/wireless/reg.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/net/wireless/reg.c 2010-09-17 20:12:09.000000000 -0400 +@@ -50,7 +50,7 @@ + printk(KERN_DEBUG format , ## args); \ + } while (0) + #else +-#define REG_DBG_PRINT(args...) ++#define REG_DBG_PRINT(args...) do {} while (0) + #endif + + /* Receipt of information from last regulatory request */ +diff -urNp linux-2.6.35.4/net/wireless/wext-core.c linux-2.6.35.4/net/wireless/wext-core.c +--- linux-2.6.35.4/net/wireless/wext-core.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/net/wireless/wext-core.c 2010-09-17 20:12:09.000000000 -0400 @@ -744,8 +744,7 @@ static int ioctl_standard_iw_point(struc */ @@ -53240,10 +55258,10 @@ diff -urNp linux-2.6.34.1/net/wireless/wext-core.c linux-2.6.34.1/net/wireless/w /* Allow userspace to GET more than max so * we can support any size GET requests. * There is still a limit : -ENOMEM. -diff -urNp linux-2.6.34.1/net/xfrm/xfrm_policy.c linux-2.6.34.1/net/xfrm/xfrm_policy.c ---- linux-2.6.34.1/net/xfrm/xfrm_policy.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/net/xfrm/xfrm_policy.c 2010-07-07 09:04:59.000000000 -0400 -@@ -1510,7 +1510,7 @@ free_dst: +diff -urNp linux-2.6.35.4/net/xfrm/xfrm_policy.c linux-2.6.35.4/net/xfrm/xfrm_policy.c +--- linux-2.6.35.4/net/xfrm/xfrm_policy.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/net/xfrm/xfrm_policy.c 2010-09-17 20:12:09.000000000 -0400 +@@ -1502,7 +1502,7 @@ free_dst: goto out; } @@ -53252,7 +55270,7 @@ diff -urNp linux-2.6.34.1/net/xfrm/xfrm_policy.c linux-2.6.34.1/net/xfrm/xfrm_po xfrm_dst_alloc_copy(void **target, void *src, int size) { if (!*target) { -@@ -1522,7 +1522,7 @@ xfrm_dst_alloc_copy(void **target, void +@@ -1514,7 +1514,7 @@ xfrm_dst_alloc_copy(void **target, void return 0; } @@ -53261,7 +55279,7 @@ diff -urNp linux-2.6.34.1/net/xfrm/xfrm_policy.c linux-2.6.34.1/net/xfrm/xfrm_po xfrm_dst_update_parent(struct dst_entry *dst, struct xfrm_selector *sel) { #ifdef CONFIG_XFRM_SUB_POLICY -@@ -1534,7 +1534,7 @@ xfrm_dst_update_parent(struct dst_entry +@@ -1526,7 +1526,7 @@ xfrm_dst_update_parent(struct dst_entry #endif } @@ -53270,9 +55288,9 @@ diff -urNp linux-2.6.34.1/net/xfrm/xfrm_policy.c linux-2.6.34.1/net/xfrm/xfrm_po xfrm_dst_update_origin(struct dst_entry *dst, struct flowi *fl) { #ifdef CONFIG_XFRM_SUB_POLICY -diff -urNp linux-2.6.34.1/scripts/basic/fixdep.c linux-2.6.34.1/scripts/basic/fixdep.c ---- linux-2.6.34.1/scripts/basic/fixdep.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/scripts/basic/fixdep.c 2010-07-07 09:04:59.000000000 -0400 +diff -urNp linux-2.6.35.4/scripts/basic/fixdep.c linux-2.6.35.4/scripts/basic/fixdep.c +--- linux-2.6.35.4/scripts/basic/fixdep.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/scripts/basic/fixdep.c 2010-09-17 20:12:09.000000000 -0400 @@ -222,9 +222,9 @@ static void use_config(char *m, int slen static void parse_config_file(char *map, size_t len) @@ -53294,9 +55312,9 @@ diff -urNp linux-2.6.34.1/scripts/basic/fixdep.c linux-2.6.34.1/scripts/basic/fi if (*p != INT_CONF) { fprintf(stderr, "fixdep: sizeof(int) != 4 or wrong endianess? %#x\n", -diff -urNp linux-2.6.34.1/scripts/kallsyms.c linux-2.6.34.1/scripts/kallsyms.c ---- linux-2.6.34.1/scripts/kallsyms.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/scripts/kallsyms.c 2010-07-07 09:04:59.000000000 -0400 +diff -urNp linux-2.6.35.4/scripts/kallsyms.c linux-2.6.35.4/scripts/kallsyms.c +--- linux-2.6.35.4/scripts/kallsyms.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/scripts/kallsyms.c 2010-09-17 20:12:09.000000000 -0400 @@ -43,10 +43,10 @@ struct text_range { static unsigned long long _text; @@ -53312,9 +55330,9 @@ diff -urNp linux-2.6.34.1/scripts/kallsyms.c linux-2.6.34.1/scripts/kallsyms.c }; #define text_range_text (&text_ranges[0]) #define text_range_inittext (&text_ranges[1]) -diff -urNp linux-2.6.34.1/scripts/mod/file2alias.c linux-2.6.34.1/scripts/mod/file2alias.c ---- linux-2.6.34.1/scripts/mod/file2alias.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/scripts/mod/file2alias.c 2010-07-07 09:04:59.000000000 -0400 +diff -urNp linux-2.6.35.4/scripts/mod/file2alias.c linux-2.6.35.4/scripts/mod/file2alias.c +--- linux-2.6.35.4/scripts/mod/file2alias.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/scripts/mod/file2alias.c 2010-09-17 20:12:09.000000000 -0400 @@ -72,7 +72,7 @@ static void device_id_check(const char * unsigned long size, unsigned long id_size, void *symval) @@ -53369,21 +55387,21 @@ diff -urNp linux-2.6.34.1/scripts/mod/file2alias.c linux-2.6.34.1/scripts/mod/fi sprintf(alias, "dmi*"); -diff -urNp linux-2.6.34.1/scripts/mod/modpost.c linux-2.6.34.1/scripts/mod/modpost.c ---- linux-2.6.34.1/scripts/mod/modpost.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/scripts/mod/modpost.c 2010-07-07 09:04:59.000000000 -0400 -@@ -842,6 +842,7 @@ enum mismatch { - INIT_TO_EXIT, - EXIT_TO_INIT, +diff -urNp linux-2.6.35.4/scripts/mod/modpost.c linux-2.6.35.4/scripts/mod/modpost.c +--- linux-2.6.35.4/scripts/mod/modpost.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/scripts/mod/modpost.c 2010-09-17 20:12:09.000000000 -0400 +@@ -846,6 +846,7 @@ enum mismatch { + ANY_INIT_TO_ANY_EXIT, + ANY_EXIT_TO_ANY_INIT, EXPORT_TO_INIT_EXIT, + DATA_TO_TEXT }; struct sectioncheck { -@@ -927,6 +928,12 @@ const struct sectioncheck sectioncheck[] - .fromsec = { "__ksymtab*", NULL }, +@@ -954,6 +955,12 @@ const struct sectioncheck sectioncheck[] .tosec = { INIT_SECTIONS, EXIT_SECTIONS, NULL }, - .mismatch = EXPORT_TO_INIT_EXIT + .mismatch = EXPORT_TO_INIT_EXIT, + .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, +}, +/* Do not reference code from writable data */ +{ @@ -53393,7 +55411,7 @@ diff -urNp linux-2.6.34.1/scripts/mod/modpost.c linux-2.6.34.1/scripts/mod/modpo } }; -@@ -1031,10 +1038,10 @@ static Elf_Sym *find_elf_symbol(struct e +@@ -1060,10 +1067,10 @@ static Elf_Sym *find_elf_symbol(struct e continue; if (ELF_ST_TYPE(sym->st_info) == STT_SECTION) continue; @@ -53406,10 +55424,10 @@ diff -urNp linux-2.6.34.1/scripts/mod/modpost.c linux-2.6.34.1/scripts/mod/modpo if (d < 0) d = addr - sym->st_value; if (d < distance) { -@@ -1275,6 +1282,14 @@ static void report_sec_mismatch(const ch - "Fix this by removing the %sannotation of %s " +@@ -1306,6 +1313,14 @@ static void report_sec_mismatch(const ch "or drop the export.\n", tosym, sec2annotation(tosec), sec2annotation(tosec), tosym); + break; + case DATA_TO_TEXT: +/* + fprintf(stderr, @@ -53418,10 +55436,10 @@ diff -urNp linux-2.6.34.1/scripts/mod/modpost.c linux-2.6.34.1/scripts/mod/modpo + fromsym, to, sec2annotation(tosec), tosym, to_p); +*/ + break; - case NO_MISMATCH: - /* To get warnings on missing members */ - break; -@@ -1600,7 +1615,7 @@ void __attribute__((format(printf, 2, 3) + } + fprintf(stderr, "\n"); + } +@@ -1629,7 +1644,7 @@ void __attribute__((format(printf, 2, 3) va_end(ap); } @@ -53430,7 +55448,7 @@ diff -urNp linux-2.6.34.1/scripts/mod/modpost.c linux-2.6.34.1/scripts/mod/modpo { if (buf->size - buf->pos < len) { buf->size += len + SZ; -@@ -1812,7 +1827,7 @@ static void write_if_changed(struct buff +@@ -1841,7 +1856,7 @@ static void write_if_changed(struct buff if (fstat(fileno(file), &st) < 0) goto close_write; @@ -53439,9 +55457,9 @@ diff -urNp linux-2.6.34.1/scripts/mod/modpost.c linux-2.6.34.1/scripts/mod/modpo goto close_write; tmp = NOFAIL(malloc(b->pos)); -diff -urNp linux-2.6.34.1/scripts/mod/modpost.h linux-2.6.34.1/scripts/mod/modpost.h ---- linux-2.6.34.1/scripts/mod/modpost.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/scripts/mod/modpost.h 2010-07-07 09:04:59.000000000 -0400 +diff -urNp linux-2.6.35.4/scripts/mod/modpost.h linux-2.6.35.4/scripts/mod/modpost.h +--- linux-2.6.35.4/scripts/mod/modpost.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/scripts/mod/modpost.h 2010-09-17 20:12:09.000000000 -0400 @@ -92,15 +92,15 @@ void *do_nofail(void *ptr, const char *e struct buffer { @@ -53461,9 +55479,9 @@ diff -urNp linux-2.6.34.1/scripts/mod/modpost.h linux-2.6.34.1/scripts/mod/modpo struct module { struct module *next; -diff -urNp linux-2.6.34.1/scripts/mod/sumversion.c linux-2.6.34.1/scripts/mod/sumversion.c ---- linux-2.6.34.1/scripts/mod/sumversion.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/scripts/mod/sumversion.c 2010-07-07 09:04:59.000000000 -0400 +diff -urNp linux-2.6.35.4/scripts/mod/sumversion.c linux-2.6.35.4/scripts/mod/sumversion.c +--- linux-2.6.35.4/scripts/mod/sumversion.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/scripts/mod/sumversion.c 2010-09-17 20:12:09.000000000 -0400 @@ -455,7 +455,7 @@ static void write_version(const char *fi goto out; } @@ -53473,9 +55491,9 @@ diff -urNp linux-2.6.34.1/scripts/mod/sumversion.c linux-2.6.34.1/scripts/mod/su warn("writing sum in %s failed: %s\n", filename, strerror(errno)); goto out; -diff -urNp linux-2.6.34.1/scripts/pnmtologo.c linux-2.6.34.1/scripts/pnmtologo.c ---- linux-2.6.34.1/scripts/pnmtologo.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/scripts/pnmtologo.c 2010-07-07 09:04:59.000000000 -0400 +diff -urNp linux-2.6.35.4/scripts/pnmtologo.c linux-2.6.35.4/scripts/pnmtologo.c +--- linux-2.6.35.4/scripts/pnmtologo.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/scripts/pnmtologo.c 2010-09-17 20:12:09.000000000 -0400 @@ -237,14 +237,14 @@ static void write_header(void) fprintf(out, " * Linux logo %s\n", logoname); fputs(" */\n\n", out); @@ -53502,10 +55520,90 @@ diff -urNp linux-2.6.34.1/scripts/pnmtologo.c linux-2.6.34.1/scripts/pnmtologo.c logoname); write_hex_cnt = 0; for (i = 0; i < logo_clutsize; i++) { -diff -urNp linux-2.6.34.1/security/Kconfig linux-2.6.34.1/security/Kconfig ---- linux-2.6.34.1/security/Kconfig 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/security/Kconfig 2010-07-07 09:04:59.000000000 -0400 -@@ -4,6 +4,499 @@ +diff -urNp linux-2.6.35.4/security/commoncap.c linux-2.6.35.4/security/commoncap.c +--- linux-2.6.35.4/security/commoncap.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/security/commoncap.c 2010-09-17 20:12:37.000000000 -0400 +@@ -28,6 +28,7 @@ + #include + #include + #include ++#include + + /* + * If a non-root user executes a setuid-root binary in +@@ -51,9 +52,11 @@ static void warn_setuid_and_fcaps_mixed( + } + } + ++extern kernel_cap_t gr_cap_rtnetlink(struct sock *sk); ++ + int cap_netlink_send(struct sock *sk, struct sk_buff *skb) + { +- NETLINK_CB(skb).eff_cap = current_cap(); ++ NETLINK_CB(skb).eff_cap = gr_cap_rtnetlink(sk); + return 0; + } + +diff -urNp linux-2.6.35.4/security/integrity/ima/ima_api.c linux-2.6.35.4/security/integrity/ima/ima_api.c +--- linux-2.6.35.4/security/integrity/ima/ima_api.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/security/integrity/ima/ima_api.c 2010-09-17 20:12:09.000000000 -0400 +@@ -75,7 +75,7 @@ void ima_add_violation(struct inode *ino + int result; + + /* can overflow, only indicator */ +- atomic_long_inc(&ima_htable.violations); ++ atomic_long_inc_unchecked(&ima_htable.violations); + + entry = kmalloc(sizeof(*entry), GFP_KERNEL); + if (!entry) { +diff -urNp linux-2.6.35.4/security/integrity/ima/ima_fs.c linux-2.6.35.4/security/integrity/ima/ima_fs.c +--- linux-2.6.35.4/security/integrity/ima/ima_fs.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/security/integrity/ima/ima_fs.c 2010-09-17 20:12:09.000000000 -0400 +@@ -28,12 +28,12 @@ + static int valid_policy = 1; + #define TMPBUFLEN 12 + static ssize_t ima_show_htable_value(char __user *buf, size_t count, +- loff_t *ppos, atomic_long_t *val) ++ loff_t *ppos, atomic_long_unchecked_t *val) + { + char tmpbuf[TMPBUFLEN]; + ssize_t len; + +- len = scnprintf(tmpbuf, TMPBUFLEN, "%li\n", atomic_long_read(val)); ++ len = scnprintf(tmpbuf, TMPBUFLEN, "%li\n", atomic_long_read_unchecked(val)); + return simple_read_from_buffer(buf, count, ppos, tmpbuf, len); + } + +diff -urNp linux-2.6.35.4/security/integrity/ima/ima.h linux-2.6.35.4/security/integrity/ima/ima.h +--- linux-2.6.35.4/security/integrity/ima/ima.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/security/integrity/ima/ima.h 2010-09-17 20:12:09.000000000 -0400 +@@ -83,8 +83,8 @@ void ima_add_violation(struct inode *ino + extern spinlock_t ima_queue_lock; + + struct ima_h_table { +- atomic_long_t len; /* number of stored measurements in the list */ +- atomic_long_t violations; ++ atomic_long_unchecked_t len; /* number of stored measurements in the list */ ++ atomic_long_unchecked_t violations; + struct hlist_head queue[IMA_MEASURE_HTABLE_SIZE]; + }; + extern struct ima_h_table ima_htable; +diff -urNp linux-2.6.35.4/security/integrity/ima/ima_queue.c linux-2.6.35.4/security/integrity/ima/ima_queue.c +--- linux-2.6.35.4/security/integrity/ima/ima_queue.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/security/integrity/ima/ima_queue.c 2010-09-17 20:12:09.000000000 -0400 +@@ -79,7 +79,7 @@ static int ima_add_digest_entry(struct i + INIT_LIST_HEAD(&qe->later); + list_add_tail_rcu(&qe->later, &ima_measurements); + +- atomic_long_inc(&ima_htable.len); ++ atomic_long_inc_unchecked(&ima_htable.len); + key = ima_hash_key(entry->digest); + hlist_add_head_rcu(&qe->hnext, &ima_htable.queue[key]); + return 0; +diff -urNp linux-2.6.35.4/security/Kconfig linux-2.6.35.4/security/Kconfig +--- linux-2.6.35.4/security/Kconfig 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/security/Kconfig 2010-09-17 20:12:37.000000000 -0400 +@@ -4,6 +4,505 @@ menu "Security options" @@ -53522,9 +55620,13 @@ diff -urNp linux-2.6.34.1/security/Kconfig linux-2.6.34.1/security/Kconfig + default 47 if !PAX_PER_CPU_PGD + default 42 if PAX_PER_CPU_PGD + ++ config PAX_ENABLE_PAE ++ bool ++ default y if (X86_32 && (MPENTIUM4 || MK8 || MPSC || MCORE2 || MATOM)) ++ +config PAX + bool "Enable various PaX features" -+ depends on GRKERNSEC && (ALPHA || ARM || AVR32 || IA64 || MIPS32 || MIPS64 || PARISC || PPC || SPARC || X86) ++ depends on GRKERNSEC && (ALPHA || ARM || AVR32 || IA64 || MIPS || PARISC || PPC || SPARC || X86) + help + This allows you to enable various PaX features. PaX adds + intrusion prevention mechanisms to the kernel that reduce @@ -53641,7 +55743,7 @@ diff -urNp linux-2.6.34.1/security/Kconfig linux-2.6.34.1/security/Kconfig + +config PAX_PAGEEXEC + bool "Paging based non-executable pages" -+ depends on PAX_NOEXEC && (!X86_32 || M586 || M586TSC || M586MMX || M686 || MPENTIUMII || MPENTIUMIII || MPENTIUMM || MCORE2 || MPENTIUM4 || MPSC || MK7 || MK8 || MWINCHIPC6 || MWINCHIP2 || MWINCHIP3D || MVIAC3_2 || MVIAC7) ++ depends on PAX_NOEXEC && (!X86_32 || M586 || M586TSC || M586MMX || M686 || MPENTIUMII || MPENTIUMIII || MPENTIUMM || MCORE2 || MATOM || MPENTIUM4 || MPSC || MK7 || MK8 || MWINCHIPC6 || MWINCHIP2 || MWINCHIP3D || MVIAC3_2 || MVIAC7) + select S390_SWITCH_AMODE if S390 + select S390_EXEC_PROTECT if S390 + help @@ -53734,7 +55836,8 @@ diff -urNp linux-2.6.34.1/security/Kconfig linux-2.6.34.1/security/Kconfig + - changing the executable status of memory pages that were + not originally created as executable, + - making read-only executable pages writable again, -+ - creating executable pages from anonymous memory. ++ - creating executable pages from anonymous memory, ++ - making read-only-after-relocations (RELRO) data pages writable again. + + You should say Y here to complete the protection provided by + the enforcement of non-executable pages. @@ -53742,9 +55845,10 @@ diff -urNp linux-2.6.34.1/security/Kconfig linux-2.6.34.1/security/Kconfig + NOTE: you can use the 'chpax' or 'paxctl' utilities to control + this feature on a per file basis. + -+config PAX_NOELFRELOCS -+ bool "Disallow ELF text relocations" -+ depends on PAX_MPROTECT && !PAX_ETEXECRELOCS && (IA64 || PPC || X86) ++config PAX_ELFRELOCS ++ bool "Allow ELF text relocations (read help)" ++ depends on PAX_MPROTECT ++ default n + help + Non-executable pages and mprotect() restrictions are effective + in preventing the introduction of new executable code into an @@ -53758,18 +55862,13 @@ diff -urNp linux-2.6.34.1/security/Kconfig linux-2.6.34.1/security/Kconfig + the former approach is beyond PaX, the latter can be prevented + by having only PIC ELF libraries on one's system (which do not + need to relocate their code). If you are sure this is your case, -+ then enable this option otherwise be careful as you may not even -+ be able to boot or log on your system (for example, some PAM -+ modules are erroneously compiled as non-PIC by default). -+ -+ NOTE: if you are using dynamic ELF executables (as suggested -+ when using ASLR) then you must have made sure that you linked -+ your files using the PIC version of crt1 (the et_dyn.tar.gz package -+ referenced there has already been updated to support this). ++ as is the case with all modern Linux distributions, then leave ++ this option disabled. You should say 'n' here. + +config PAX_ETEXECRELOCS + bool "Allow ELF ET_EXEC text relocations" + depends on PAX_MPROTECT && (ALPHA || IA64 || PARISC) ++ select PAX_ELFRELOCS + default y + help + On some architectures there are incorrectly created applications @@ -53996,8 +56095,13 @@ diff -urNp linux-2.6.34.1/security/Kconfig linux-2.6.34.1/security/Kconfig + Note that the current implementation provides the strictest checks + for the SLUB allocator. + ++ If frame pointers are enabled on x86, this option will also ++ restrict copies into and out of the kernel stack to local variables ++ within a single frame. ++ + Since this has a negligible performance impact, you should enable + this feature. ++ +endmenu + +endmenu @@ -54005,7 +56109,7 @@ diff -urNp linux-2.6.34.1/security/Kconfig linux-2.6.34.1/security/Kconfig config KEYS bool "Enable access key retention support" help -@@ -124,7 +617,7 @@ config INTEL_TXT +@@ -124,7 +623,7 @@ config INTEL_TXT config LSM_MMAP_MIN_ADDR int "Low address space for LSM to protect from user allocation" depends on SECURITY && SECURITY_SELINUX @@ -54014,89 +56118,9 @@ diff -urNp linux-2.6.34.1/security/Kconfig linux-2.6.34.1/security/Kconfig help This is the portion of low virtual memory which should be protected from userspace allocation. Keeping a user from writing to low pages -diff -urNp linux-2.6.34.1/security/commoncap.c linux-2.6.34.1/security/commoncap.c ---- linux-2.6.34.1/security/commoncap.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/security/commoncap.c 2010-07-07 09:04:59.000000000 -0400 -@@ -28,6 +28,7 @@ - #include - #include - #include -+#include - - /* - * If a non-root user executes a setuid-root binary in -@@ -51,9 +52,11 @@ static void warn_setuid_and_fcaps_mixed( - } - } - -+extern kernel_cap_t gr_cap_rtnetlink(struct sock *sk); -+ - int cap_netlink_send(struct sock *sk, struct sk_buff *skb) - { -- NETLINK_CB(skb).eff_cap = current_cap(); -+ NETLINK_CB(skb).eff_cap = gr_cap_rtnetlink(sk); - return 0; - } - -diff -urNp linux-2.6.34.1/security/integrity/ima/ima.h linux-2.6.34.1/security/integrity/ima/ima.h ---- linux-2.6.34.1/security/integrity/ima/ima.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/security/integrity/ima/ima.h 2010-07-07 09:04:59.000000000 -0400 -@@ -83,8 +83,8 @@ void ima_add_violation(struct inode *ino - extern spinlock_t ima_queue_lock; - - struct ima_h_table { -- atomic_long_t len; /* number of stored measurements in the list */ -- atomic_long_t violations; -+ atomic_long_unchecked_t len; /* number of stored measurements in the list */ -+ atomic_long_unchecked_t violations; - struct hlist_head queue[IMA_MEASURE_HTABLE_SIZE]; - }; - extern struct ima_h_table ima_htable; -diff -urNp linux-2.6.34.1/security/integrity/ima/ima_api.c linux-2.6.34.1/security/integrity/ima/ima_api.c ---- linux-2.6.34.1/security/integrity/ima/ima_api.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/security/integrity/ima/ima_api.c 2010-07-07 09:04:59.000000000 -0400 -@@ -75,7 +75,7 @@ void ima_add_violation(struct inode *ino - int result; - - /* can overflow, only indicator */ -- atomic_long_inc(&ima_htable.violations); -+ atomic_long_inc_unchecked(&ima_htable.violations); - - entry = kmalloc(sizeof(*entry), GFP_KERNEL); - if (!entry) { -diff -urNp linux-2.6.34.1/security/integrity/ima/ima_fs.c linux-2.6.34.1/security/integrity/ima/ima_fs.c ---- linux-2.6.34.1/security/integrity/ima/ima_fs.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/security/integrity/ima/ima_fs.c 2010-07-07 09:04:59.000000000 -0400 -@@ -28,12 +28,12 @@ - static int valid_policy = 1; - #define TMPBUFLEN 12 - static ssize_t ima_show_htable_value(char __user *buf, size_t count, -- loff_t *ppos, atomic_long_t *val) -+ loff_t *ppos, atomic_long_unchecked_t *val) - { - char tmpbuf[TMPBUFLEN]; - ssize_t len; - -- len = scnprintf(tmpbuf, TMPBUFLEN, "%li\n", atomic_long_read(val)); -+ len = scnprintf(tmpbuf, TMPBUFLEN, "%li\n", atomic_long_read_unchecked(val)); - return simple_read_from_buffer(buf, count, ppos, tmpbuf, len); - } - -diff -urNp linux-2.6.34.1/security/integrity/ima/ima_queue.c linux-2.6.34.1/security/integrity/ima/ima_queue.c ---- linux-2.6.34.1/security/integrity/ima/ima_queue.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/security/integrity/ima/ima_queue.c 2010-07-07 09:04:59.000000000 -0400 -@@ -79,7 +79,7 @@ static int ima_add_digest_entry(struct i - INIT_LIST_HEAD(&qe->later); - list_add_tail_rcu(&qe->later, &ima_measurements); - -- atomic_long_inc(&ima_htable.len); -+ atomic_long_inc_unchecked(&ima_htable.len); - key = ima_hash_key(entry->digest); - hlist_add_head_rcu(&qe->hnext, &ima_htable.queue[key]); - return 0; -diff -urNp linux-2.6.34.1/security/min_addr.c linux-2.6.34.1/security/min_addr.c ---- linux-2.6.34.1/security/min_addr.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/security/min_addr.c 2010-07-07 09:04:59.000000000 -0400 +diff -urNp linux-2.6.35.4/security/min_addr.c linux-2.6.35.4/security/min_addr.c +--- linux-2.6.35.4/security/min_addr.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/security/min_addr.c 2010-09-17 20:12:37.000000000 -0400 @@ -14,6 +14,7 @@ unsigned long dac_mmap_min_addr = CONFIG */ static void update_mmap_min_addr(void) @@ -54113,9 +56137,77 @@ diff -urNp linux-2.6.34.1/security/min_addr.c linux-2.6.34.1/security/min_addr.c } /* -diff -urNp linux-2.6.34.1/sound/aoa/codecs/onyx.c linux-2.6.34.1/sound/aoa/codecs/onyx.c ---- linux-2.6.34.1/sound/aoa/codecs/onyx.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/sound/aoa/codecs/onyx.c 2010-07-07 09:04:59.000000000 -0400 +diff -urNp linux-2.6.35.4/security/security.c linux-2.6.35.4/security/security.c +--- linux-2.6.35.4/security/security.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/security/security.c 2010-09-17 20:12:37.000000000 -0400 +@@ -25,8 +25,8 @@ static __initdata char chosen_lsm[SECURI + /* things that live in capability.c */ + extern void __init security_fixup_ops(struct security_operations *ops); + +-static struct security_operations *security_ops; +-static struct security_operations default_security_ops = { ++static struct security_operations *security_ops __read_only; ++static struct security_operations default_security_ops __read_only = { + .name = "default", + }; + +@@ -67,7 +67,9 @@ int __init security_init(void) + + void reset_security_ops(void) + { ++ pax_open_kernel(); + security_ops = &default_security_ops; ++ pax_close_kernel(); + } + + /* Save user chosen LSM */ +diff -urNp linux-2.6.35.4/security/selinux/hooks.c linux-2.6.35.4/security/selinux/hooks.c +--- linux-2.6.35.4/security/selinux/hooks.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/security/selinux/hooks.c 2010-09-17 20:12:37.000000000 -0400 +@@ -93,7 +93,6 @@ + #define NUM_SEL_MNT_OPTS 5 + + extern int selinux_nlmsg_lookup(u16 sclass, u16 nlmsg_type, u32 *perm); +-extern struct security_operations *security_ops; + + /* SECMARK reference count */ + atomic_t selinux_secmark_refcount = ATOMIC_INIT(0); +@@ -5428,7 +5427,7 @@ static int selinux_key_getsecurity(struc + + #endif + +-static struct security_operations selinux_ops = { ++static struct security_operations selinux_ops __read_only = { + .name = "selinux", + + .ptrace_access_check = selinux_ptrace_access_check, +diff -urNp linux-2.6.35.4/security/smack/smack_lsm.c linux-2.6.35.4/security/smack/smack_lsm.c +--- linux-2.6.35.4/security/smack/smack_lsm.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/security/smack/smack_lsm.c 2010-09-17 20:12:09.000000000 -0400 +@@ -3064,7 +3064,7 @@ static int smack_inode_getsecctx(struct + return 0; + } + +-struct security_operations smack_ops = { ++struct security_operations smack_ops __read_only = { + .name = "smack", + + .ptrace_access_check = smack_ptrace_access_check, +diff -urNp linux-2.6.35.4/security/tomoyo/tomoyo.c linux-2.6.35.4/security/tomoyo/tomoyo.c +--- linux-2.6.35.4/security/tomoyo/tomoyo.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/security/tomoyo/tomoyo.c 2010-09-17 20:12:09.000000000 -0400 +@@ -235,7 +235,7 @@ static int tomoyo_sb_pivotroot(struct pa + * tomoyo_security_ops is a "struct security_operations" which is used for + * registering TOMOYO. + */ +-static struct security_operations tomoyo_security_ops = { ++static struct security_operations tomoyo_security_ops __read_only = { + .name = "tomoyo", + .cred_alloc_blank = tomoyo_cred_alloc_blank, + .cred_prepare = tomoyo_cred_prepare, +diff -urNp linux-2.6.35.4/sound/aoa/codecs/onyx.c linux-2.6.35.4/sound/aoa/codecs/onyx.c +--- linux-2.6.35.4/sound/aoa/codecs/onyx.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/sound/aoa/codecs/onyx.c 2010-09-17 20:12:09.000000000 -0400 @@ -54,7 +54,7 @@ struct onyx { spdif_locked:1, analog_locked:1, @@ -54144,10 +56236,10 @@ diff -urNp linux-2.6.34.1/sound/aoa/codecs/onyx.c linux-2.6.34.1/sound/aoa/codec onyx->spdif_locked = onyx->analog_locked = 0; mutex_unlock(&onyx->mutex); -diff -urNp linux-2.6.34.1/sound/core/oss/pcm_oss.c linux-2.6.34.1/sound/core/oss/pcm_oss.c ---- linux-2.6.34.1/sound/core/oss/pcm_oss.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/sound/core/oss/pcm_oss.c 2010-07-07 09:04:59.000000000 -0400 -@@ -2962,8 +2962,8 @@ static void snd_pcm_oss_proc_done(struct +diff -urNp linux-2.6.35.4/sound/core/oss/pcm_oss.c linux-2.6.35.4/sound/core/oss/pcm_oss.c +--- linux-2.6.35.4/sound/core/oss/pcm_oss.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/sound/core/oss/pcm_oss.c 2010-09-17 20:12:09.000000000 -0400 +@@ -2966,8 +2966,8 @@ static void snd_pcm_oss_proc_done(struct } } #else /* !CONFIG_SND_VERBOSE_PROCFS */ @@ -54158,9 +56250,9 @@ diff -urNp linux-2.6.34.1/sound/core/oss/pcm_oss.c linux-2.6.34.1/sound/core/oss #endif /* CONFIG_SND_VERBOSE_PROCFS */ /* -diff -urNp linux-2.6.34.1/sound/core/seq/seq_lock.h linux-2.6.34.1/sound/core/seq/seq_lock.h ---- linux-2.6.34.1/sound/core/seq/seq_lock.h 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/sound/core/seq/seq_lock.h 2010-07-07 09:04:59.000000000 -0400 +diff -urNp linux-2.6.35.4/sound/core/seq/seq_lock.h linux-2.6.35.4/sound/core/seq/seq_lock.h +--- linux-2.6.35.4/sound/core/seq/seq_lock.h 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/sound/core/seq/seq_lock.h 2010-09-17 20:12:09.000000000 -0400 @@ -23,10 +23,10 @@ void snd_use_lock_sync_helper(snd_use_lo #else /* SMP || CONFIG_SND_DEBUG */ @@ -54176,9 +56268,9 @@ diff -urNp linux-2.6.34.1/sound/core/seq/seq_lock.h linux-2.6.34.1/sound/core/se #endif /* SMP || CONFIG_SND_DEBUG */ -diff -urNp linux-2.6.34.1/sound/drivers/mts64.c linux-2.6.34.1/sound/drivers/mts64.c ---- linux-2.6.34.1/sound/drivers/mts64.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/sound/drivers/mts64.c 2010-07-07 09:04:59.000000000 -0400 +diff -urNp linux-2.6.35.4/sound/drivers/mts64.c linux-2.6.35.4/sound/drivers/mts64.c +--- linux-2.6.35.4/sound/drivers/mts64.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/sound/drivers/mts64.c 2010-09-17 20:12:09.000000000 -0400 @@ -66,7 +66,7 @@ struct mts64 { struct pardevice *pardev; int pardev_claimed; @@ -54227,9 +56319,9 @@ diff -urNp linux-2.6.34.1/sound/drivers/mts64.c linux-2.6.34.1/sound/drivers/mts return 0; } -diff -urNp linux-2.6.34.1/sound/drivers/portman2x4.c linux-2.6.34.1/sound/drivers/portman2x4.c ---- linux-2.6.34.1/sound/drivers/portman2x4.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/sound/drivers/portman2x4.c 2010-07-07 09:04:59.000000000 -0400 +diff -urNp linux-2.6.35.4/sound/drivers/portman2x4.c linux-2.6.35.4/sound/drivers/portman2x4.c +--- linux-2.6.35.4/sound/drivers/portman2x4.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/sound/drivers/portman2x4.c 2010-09-17 20:12:09.000000000 -0400 @@ -84,7 +84,7 @@ struct portman { struct pardevice *pardev; int pardev_claimed; @@ -54239,9 +56331,9 @@ diff -urNp linux-2.6.34.1/sound/drivers/portman2x4.c linux-2.6.34.1/sound/driver int mode[PORTMAN_NUM_INPUT_PORTS]; struct snd_rawmidi_substream *midi_input[PORTMAN_NUM_INPUT_PORTS]; }; -diff -urNp linux-2.6.34.1/sound/oss/sb_audio.c linux-2.6.34.1/sound/oss/sb_audio.c ---- linux-2.6.34.1/sound/oss/sb_audio.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/sound/oss/sb_audio.c 2010-07-07 09:04:59.000000000 -0400 +diff -urNp linux-2.6.35.4/sound/oss/sb_audio.c linux-2.6.35.4/sound/oss/sb_audio.c +--- linux-2.6.35.4/sound/oss/sb_audio.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/sound/oss/sb_audio.c 2010-09-17 20:12:09.000000000 -0400 @@ -901,7 +901,7 @@ sb16_copy_from_user(int dev, buf16 = (signed short *)(localbuf + localoffs); while (c) @@ -54251,9 +56343,9 @@ diff -urNp linux-2.6.34.1/sound/oss/sb_audio.c linux-2.6.34.1/sound/oss/sb_audio if (copy_from_user(lbuf8, userbuf+useroffs + p, locallen)) -diff -urNp linux-2.6.34.1/sound/pci/ac97/ac97_codec.c linux-2.6.34.1/sound/pci/ac97/ac97_codec.c ---- linux-2.6.34.1/sound/pci/ac97/ac97_codec.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/sound/pci/ac97/ac97_codec.c 2010-07-07 09:04:59.000000000 -0400 +diff -urNp linux-2.6.35.4/sound/pci/ac97/ac97_codec.c linux-2.6.35.4/sound/pci/ac97/ac97_codec.c +--- linux-2.6.35.4/sound/pci/ac97/ac97_codec.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/sound/pci/ac97/ac97_codec.c 2010-09-17 20:12:09.000000000 -0400 @@ -1962,7 +1962,7 @@ static int snd_ac97_dev_disconnect(struc } @@ -54263,9 +56355,9 @@ diff -urNp linux-2.6.34.1/sound/pci/ac97/ac97_codec.c linux-2.6.34.1/sound/pci/a #ifdef CONFIG_SND_AC97_POWER_SAVE static void do_update_power(struct work_struct *work) -diff -urNp linux-2.6.34.1/sound/pci/ac97/ac97_patch.c linux-2.6.34.1/sound/pci/ac97/ac97_patch.c ---- linux-2.6.34.1/sound/pci/ac97/ac97_patch.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/sound/pci/ac97/ac97_patch.c 2010-07-07 09:04:59.000000000 -0400 +diff -urNp linux-2.6.35.4/sound/pci/ac97/ac97_patch.c linux-2.6.35.4/sound/pci/ac97/ac97_patch.c +--- linux-2.6.35.4/sound/pci/ac97/ac97_patch.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/sound/pci/ac97/ac97_patch.c 2010-09-17 20:12:09.000000000 -0400 @@ -371,7 +371,7 @@ static int patch_yamaha_ymf743_build_spd return 0; } @@ -54563,9 +56655,9 @@ diff -urNp linux-2.6.34.1/sound/pci/ac97/ac97_patch.c linux-2.6.34.1/sound/pci/a .build_specific = patch_ucb1400_specific, }; -diff -urNp linux-2.6.34.1/sound/pci/ens1370.c linux-2.6.34.1/sound/pci/ens1370.c ---- linux-2.6.34.1/sound/pci/ens1370.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/sound/pci/ens1370.c 2010-07-07 09:04:59.000000000 -0400 +diff -urNp linux-2.6.35.4/sound/pci/ens1370.c linux-2.6.35.4/sound/pci/ens1370.c +--- linux-2.6.35.4/sound/pci/ens1370.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/sound/pci/ens1370.c 2010-09-17 20:12:09.000000000 -0400 @@ -452,7 +452,7 @@ static DEFINE_PCI_DEVICE_TABLE(snd_audio { PCI_VDEVICE(ENSONIQ, 0x5880), 0, }, /* ES1373 - CT5880 */ { PCI_VDEVICE(ECTIVA, 0x8938), 0, }, /* Ectiva EV1938 */ @@ -54575,10 +56667,10 @@ diff -urNp linux-2.6.34.1/sound/pci/ens1370.c linux-2.6.34.1/sound/pci/ens1370.c }; MODULE_DEVICE_TABLE(pci, snd_audiopci_ids); -diff -urNp linux-2.6.34.1/sound/pci/hda/patch_hdmi.c linux-2.6.34.1/sound/pci/hda/patch_hdmi.c ---- linux-2.6.34.1/sound/pci/hda/patch_hdmi.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/sound/pci/hda/patch_hdmi.c 2010-07-07 09:04:59.000000000 -0400 -@@ -657,10 +657,10 @@ static void hdmi_non_intrinsic_event(str +diff -urNp linux-2.6.35.4/sound/pci/hda/patch_hdmi.c linux-2.6.35.4/sound/pci/hda/patch_hdmi.c +--- linux-2.6.35.4/sound/pci/hda/patch_hdmi.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/sound/pci/hda/patch_hdmi.c 2010-09-17 20:12:09.000000000 -0400 +@@ -670,10 +670,10 @@ static void hdmi_non_intrinsic_event(str cp_ready); /* TODO */ @@ -54593,9 +56685,9 @@ diff -urNp linux-2.6.34.1/sound/pci/hda/patch_hdmi.c linux-2.6.34.1/sound/pci/hd } -diff -urNp linux-2.6.34.1/sound/pci/intel8x0.c linux-2.6.34.1/sound/pci/intel8x0.c ---- linux-2.6.34.1/sound/pci/intel8x0.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/sound/pci/intel8x0.c 2010-07-07 09:04:59.000000000 -0400 +diff -urNp linux-2.6.35.4/sound/pci/intel8x0.c linux-2.6.35.4/sound/pci/intel8x0.c +--- linux-2.6.35.4/sound/pci/intel8x0.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/sound/pci/intel8x0.c 2010-09-17 20:12:09.000000000 -0400 @@ -444,7 +444,7 @@ static DEFINE_PCI_DEVICE_TABLE(snd_intel { PCI_VDEVICE(AMD, 0x746d), DEVICE_INTEL }, /* AMD8111 */ { PCI_VDEVICE(AMD, 0x7445), DEVICE_INTEL }, /* AMD768 */ @@ -54605,7 +56697,7 @@ diff -urNp linux-2.6.34.1/sound/pci/intel8x0.c linux-2.6.34.1/sound/pci/intel8x0 }; MODULE_DEVICE_TABLE(pci, snd_intel8x0_ids); -@@ -2129,7 +2129,7 @@ static struct ac97_quirk ac97_quirks[] _ +@@ -2135,7 +2135,7 @@ static struct ac97_quirk ac97_quirks[] _ .type = AC97_TUNE_HP_ONLY }, #endif @@ -54614,9 +56706,9 @@ diff -urNp linux-2.6.34.1/sound/pci/intel8x0.c linux-2.6.34.1/sound/pci/intel8x0 }; static int __devinit snd_intel8x0_mixer(struct intel8x0 *chip, int ac97_clock, -diff -urNp linux-2.6.34.1/sound/pci/intel8x0m.c linux-2.6.34.1/sound/pci/intel8x0m.c ---- linux-2.6.34.1/sound/pci/intel8x0m.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/sound/pci/intel8x0m.c 2010-07-07 09:04:59.000000000 -0400 +diff -urNp linux-2.6.35.4/sound/pci/intel8x0m.c linux-2.6.35.4/sound/pci/intel8x0m.c +--- linux-2.6.35.4/sound/pci/intel8x0m.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/sound/pci/intel8x0m.c 2010-09-17 20:12:09.000000000 -0400 @@ -239,7 +239,7 @@ static DEFINE_PCI_DEVICE_TABLE(snd_intel { PCI_VDEVICE(AMD, 0x746d), DEVICE_INTEL }, /* AMD8111 */ { PCI_VDEVICE(AL, 0x5455), DEVICE_ALI }, /* Ali5455 */ @@ -54635,9 +56727,9 @@ diff -urNp linux-2.6.34.1/sound/pci/intel8x0m.c linux-2.6.34.1/sound/pci/intel8x }; static int __devinit snd_intel8x0m_probe(struct pci_dev *pci, -diff -urNp linux-2.6.34.1/usr/gen_init_cpio.c linux-2.6.34.1/usr/gen_init_cpio.c ---- linux-2.6.34.1/usr/gen_init_cpio.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/usr/gen_init_cpio.c 2010-07-07 09:04:59.000000000 -0400 +diff -urNp linux-2.6.35.4/usr/gen_init_cpio.c linux-2.6.35.4/usr/gen_init_cpio.c +--- linux-2.6.35.4/usr/gen_init_cpio.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/usr/gen_init_cpio.c 2010-09-17 20:12:09.000000000 -0400 @@ -299,7 +299,7 @@ static int cpio_mkfile(const char *name, int retval; int rc = -1; @@ -54660,10 +56752,10 @@ diff -urNp linux-2.6.34.1/usr/gen_init_cpio.c linux-2.6.34.1/usr/gen_init_cpio.c } else break; } -diff -urNp linux-2.6.34.1/virt/kvm/kvm_main.c linux-2.6.34.1/virt/kvm/kvm_main.c ---- linux-2.6.34.1/virt/kvm/kvm_main.c 2010-07-05 14:24:10.000000000 -0400 -+++ linux-2.6.34.1/virt/kvm/kvm_main.c 2010-07-07 09:04:59.000000000 -0400 -@@ -1288,6 +1288,7 @@ static int kvm_vcpu_release(struct inode +diff -urNp linux-2.6.35.4/virt/kvm/kvm_main.c linux-2.6.35.4/virt/kvm/kvm_main.c +--- linux-2.6.35.4/virt/kvm/kvm_main.c 2010-08-26 19:47:12.000000000 -0400 ++++ linux-2.6.35.4/virt/kvm/kvm_main.c 2010-09-17 20:12:09.000000000 -0400 +@@ -1284,6 +1284,7 @@ static int kvm_vcpu_release(struct inode return 0; } @@ -54671,7 +56763,7 @@ diff -urNp linux-2.6.34.1/virt/kvm/kvm_main.c linux-2.6.34.1/virt/kvm/kvm_main.c static struct file_operations kvm_vcpu_fops = { .release = kvm_vcpu_release, .unlocked_ioctl = kvm_vcpu_ioctl, -@@ -1744,6 +1745,7 @@ static int kvm_vm_mmap(struct file *file +@@ -1738,6 +1739,7 @@ static int kvm_vm_mmap(struct file *file return 0; } @@ -54679,7 +56771,7 @@ diff -urNp linux-2.6.34.1/virt/kvm/kvm_main.c linux-2.6.34.1/virt/kvm/kvm_main.c static struct file_operations kvm_vm_fops = { .release = kvm_vm_release, .unlocked_ioctl = kvm_vm_ioctl, -@@ -1834,6 +1836,7 @@ out: +@@ -1835,6 +1837,7 @@ out: return r; } @@ -54687,7 +56779,7 @@ diff -urNp linux-2.6.34.1/virt/kvm/kvm_main.c linux-2.6.34.1/virt/kvm/kvm_main.c static struct file_operations kvm_chardev_ops = { .unlocked_ioctl = kvm_dev_ioctl, .compat_ioctl = kvm_dev_ioctl, -@@ -1843,6 +1846,9 @@ static struct miscdevice kvm_dev = { +@@ -1844,6 +1847,9 @@ static struct miscdevice kvm_dev = { KVM_MINOR, "kvm", &kvm_chardev_ops, @@ -54697,12 +56789,12 @@ diff -urNp linux-2.6.34.1/virt/kvm/kvm_main.c linux-2.6.34.1/virt/kvm/kvm_main.c }; static void hardware_enable(void *junk) -@@ -2179,7 +2185,7 @@ static void kvm_sched_out(struct preempt +@@ -2178,7 +2184,7 @@ static void kvm_sched_out(struct preempt kvm_arch_vcpu_put(vcpu); } --int kvm_init(void *opaque, unsigned int vcpu_size, -+int kvm_init(const void *opaque, unsigned int vcpu_size, +-int kvm_init(void *opaque, unsigned vcpu_size, unsigned vcpu_align, ++int kvm_init(const void *opaque, unsigned vcpu_size, unsigned vcpu_align, struct module *module) { int r; diff --git a/pkgs/core/kernel/patches/routes-2.6.34-16.diff b/pkgs/core/kernel/patches/routes-2.6.35-16.diff similarity index 83% rename from pkgs/core/kernel/patches/routes-2.6.34-16.diff rename to pkgs/core/kernel/patches/routes-2.6.35-16.diff index 532866f26..8678e0356 100644 --- a/pkgs/core/kernel/patches/routes-2.6.34-16.diff +++ b/pkgs/core/kernel/patches/routes-2.6.35-16.diff @@ -1,7 +1,7 @@ -diff -urp v2.6.34/linux/include/linux/rtnetlink.h linux/include/linux/rtnetlink.h ---- v2.6.34/linux/include/linux/rtnetlink.h 2010-05-17 10:49:00.000000000 +0300 -+++ linux/include/linux/rtnetlink.h 2010-05-18 09:58:49.000000000 +0300 -@@ -304,6 +304,8 @@ struct rtnexthop { +diff -urp v2.6.35/linux/include/linux/rtnetlink.h linux/include/linux/rtnetlink.h +--- v2.6.35/linux/include/linux/rtnetlink.h 2010-08-02 09:37:48.000000000 +0300 ++++ linux/include/linux/rtnetlink.h 2010-08-03 00:24:10.000000000 +0300 +@@ -311,6 +311,8 @@ struct rtnexthop { #define RTNH_F_DEAD 1 /* Nexthop is dead (used by multipath) */ #define RTNH_F_PERVASIVE 2 /* Do recursive gateway lookup */ #define RTNH_F_ONLINK 4 /* Gateway is forced on link */ @@ -10,9 +10,9 @@ diff -urp v2.6.34/linux/include/linux/rtnetlink.h linux/include/linux/rtnetlink. /* Macros to handle hexthops */ -diff -urp v2.6.34/linux/include/net/flow.h linux/include/net/flow.h ---- v2.6.34/linux/include/net/flow.h 2009-03-25 09:48:32.000000000 +0200 -+++ linux/include/net/flow.h 2010-05-18 09:58:49.000000000 +0300 +diff -urp v2.6.35/linux/include/net/flow.h linux/include/net/flow.h +--- v2.6.35/linux/include/net/flow.h 2010-08-02 09:37:48.000000000 +0300 ++++ linux/include/net/flow.h 2010-08-03 00:24:45.000000000 +0300 @@ -19,6 +19,8 @@ struct flowi { struct { __be32 daddr; @@ -31,9 +31,9 @@ diff -urp v2.6.34/linux/include/net/flow.h linux/include/net/flow.h #define fl4_tos nl_u.ip4_u.tos #define fl4_scope nl_u.ip4_u.scope -diff -urp v2.6.34/linux/include/net/ip_fib.h linux/include/net/ip_fib.h ---- v2.6.34/linux/include/net/ip_fib.h 2010-02-25 09:01:36.000000000 +0200 -+++ linux/include/net/ip_fib.h 2010-05-18 09:58:49.000000000 +0300 +diff -urp v2.6.35/linux/include/net/ip_fib.h linux/include/net/ip_fib.h +--- v2.6.35/linux/include/net/ip_fib.h 2010-02-25 09:01:36.000000000 +0200 ++++ linux/include/net/ip_fib.h 2010-08-03 00:24:10.000000000 +0300 @@ -207,6 +207,8 @@ extern int fib_lookup(struct net *n, str extern struct fib_table *fib_new_table(struct net *net, u32 id); extern struct fib_table *fib_get_table(struct net *net, u32 id); @@ -50,9 +50,9 @@ diff -urp v2.6.34/linux/include/net/ip_fib.h linux/include/net/ip_fib.h +extern rwlock_t fib_nhflags_lock; + #endif /* _NET_FIB_H */ -diff -urp v2.6.34/linux/include/net/netfilter/nf_nat.h linux/include/net/netfilter/nf_nat.h ---- v2.6.34/linux/include/net/netfilter/nf_nat.h 2010-02-25 09:01:36.000000000 +0200 -+++ linux/include/net/netfilter/nf_nat.h 2010-05-18 09:58:49.000000000 +0300 +diff -urp v2.6.35/linux/include/net/netfilter/nf_nat.h linux/include/net/netfilter/nf_nat.h +--- v2.6.35/linux/include/net/netfilter/nf_nat.h 2010-02-25 09:01:36.000000000 +0200 ++++ linux/include/net/netfilter/nf_nat.h 2010-08-03 00:24:45.000000000 +0300 @@ -73,6 +73,13 @@ struct nf_conn_nat { #endif }; @@ -67,21 +67,21 @@ diff -urp v2.6.34/linux/include/net/netfilter/nf_nat.h linux/include/net/netfilt /* Set up the info structure to map into this range. */ extern unsigned int nf_nat_setup_info(struct nf_conn *ct, const struct nf_nat_range *range, -diff -urp v2.6.34/linux/include/net/route.h linux/include/net/route.h ---- v2.6.34/linux/include/net/route.h 2010-05-17 10:49:00.000000000 +0300 -+++ linux/include/net/route.h 2010-05-18 09:58:49.000000000 +0300 -@@ -113,6 +113,7 @@ extern int __ip_route_output_key(struct - extern int ip_route_output_key(struct net *, struct rtable **, struct flowi *flp); - extern int ip_route_output_flow(struct net *, struct rtable **rp, struct flowi *flp, struct sock *sk, int flags); - extern int ip_route_input(struct sk_buff*, __be32 dst, __be32 src, u8 tos, struct net_device *devin); +diff -urp v2.6.35/linux/include/net/route.h linux/include/net/route.h +--- v2.6.35/linux/include/net/route.h 2010-08-02 09:37:48.000000000 +0300 ++++ linux/include/net/route.h 2010-08-03 00:26:00.000000000 +0300 +@@ -128,6 +128,7 @@ static inline int ip_route_input_noref(s + return ip_route_input_common(skb, dst, src, tos, devin, true); + } + +extern int ip_route_input_lookup(struct sk_buff*, __be32 dst, __be32 src, u8 tos, struct net_device *devin, __be32 lsrc); extern unsigned short ip_rt_frag_needed(struct net *net, struct iphdr *iph, unsigned short new_mtu, struct net_device *dev); extern void ip_rt_send_redirect(struct sk_buff *skb); -diff -urp v2.6.34/linux/net/bridge/br_netfilter.c linux/net/bridge/br_netfilter.c ---- v2.6.34/linux/net/bridge/br_netfilter.c 2010-05-17 10:49:01.000000000 +0300 -+++ linux/net/bridge/br_netfilter.c 2010-05-18 09:58:49.000000000 +0300 -@@ -344,6 +344,9 @@ static int br_nf_pre_routing_finish(stru +diff -urp v2.6.35/linux/net/bridge/br_netfilter.c linux/net/bridge/br_netfilter.c +--- v2.6.35/linux/net/bridge/br_netfilter.c 2010-08-02 09:37:49.000000000 +0300 ++++ linux/net/bridge/br_netfilter.c 2010-08-03 00:24:45.000000000 +0300 +@@ -334,6 +334,9 @@ static int br_nf_pre_routing_finish(stru struct rtable *rt; int err; @@ -91,9 +91,9 @@ diff -urp v2.6.34/linux/net/bridge/br_netfilter.c linux/net/bridge/br_netfilter. if (nf_bridge->mask & BRNF_PKT_TYPE) { skb->pkt_type = PACKET_OTHERHOST; nf_bridge->mask ^= BRNF_PKT_TYPE; -diff -urp v2.6.34/linux/net/ipv4/fib_frontend.c linux/net/ipv4/fib_frontend.c ---- v2.6.34/linux/net/ipv4/fib_frontend.c 2010-05-17 10:49:01.000000000 +0300 -+++ linux/net/ipv4/fib_frontend.c 2010-05-18 09:58:49.000000000 +0300 +diff -urp v2.6.35/linux/net/ipv4/fib_frontend.c linux/net/ipv4/fib_frontend.c +--- v2.6.35/linux/net/ipv4/fib_frontend.c 2010-05-17 10:49:01.000000000 +0300 ++++ linux/net/ipv4/fib_frontend.c 2010-08-03 00:24:10.000000000 +0300 @@ -47,6 +47,8 @@ #ifndef CONFIG_IP_MULTIPLE_TABLES @@ -195,9 +195,9 @@ diff -urp v2.6.34/linux/net/ipv4/fib_frontend.c linux/net/ipv4/fib_frontend.c rt_cache_flush(dev_net(dev), -1); break; case NETDEV_DOWN: -diff -urp v2.6.34/linux/net/ipv4/fib_hash.c linux/net/ipv4/fib_hash.c ---- v2.6.34/linux/net/ipv4/fib_hash.c 2010-05-17 10:49:01.000000000 +0300 -+++ linux/net/ipv4/fib_hash.c 2010-05-18 09:58:49.000000000 +0300 +diff -urp v2.6.35/linux/net/ipv4/fib_hash.c linux/net/ipv4/fib_hash.c +--- v2.6.35/linux/net/ipv4/fib_hash.c 2010-05-17 10:49:01.000000000 +0300 ++++ linux/net/ipv4/fib_hash.c 2010-08-03 00:24:10.000000000 +0300 @@ -278,25 +278,35 @@ out: void fib_table_select_default(struct fib_table *tb, const struct flowi *flp, struct fib_result *res) @@ -324,9 +324,9 @@ diff -urp v2.6.34/linux/net/ipv4/fib_hash.c linux/net/ipv4/fib_hash.c /* * Insert new entry to the list. -diff -urp v2.6.34/linux/net/ipv4/fib_lookup.h linux/net/ipv4/fib_lookup.h ---- v2.6.34/linux/net/ipv4/fib_lookup.h 2009-09-11 10:27:17.000000000 +0300 -+++ linux/net/ipv4/fib_lookup.h 2010-05-18 09:58:49.000000000 +0300 +diff -urp v2.6.35/linux/net/ipv4/fib_lookup.h linux/net/ipv4/fib_lookup.h +--- v2.6.35/linux/net/ipv4/fib_lookup.h 2009-09-11 10:27:17.000000000 +0300 ++++ linux/net/ipv4/fib_lookup.h 2010-08-03 00:24:10.000000000 +0300 @@ -8,6 +8,7 @@ struct fib_alias { struct list_head fa_list; @@ -345,9 +345,9 @@ diff -urp v2.6.34/linux/net/ipv4/fib_lookup.h linux/net/ipv4/fib_lookup.h static inline void fib_result_assign(struct fib_result *res, struct fib_info *fi) -diff -urp v2.6.34/linux/net/ipv4/fib_rules.c linux/net/ipv4/fib_rules.c ---- v2.6.34/linux/net/ipv4/fib_rules.c 2010-02-25 09:01:36.000000000 +0200 -+++ linux/net/ipv4/fib_rules.c 2010-05-18 09:58:49.000000000 +0300 +diff -urp v2.6.35/linux/net/ipv4/fib_rules.c linux/net/ipv4/fib_rules.c +--- v2.6.35/linux/net/ipv4/fib_rules.c 2010-08-02 09:37:49.000000000 +0300 ++++ linux/net/ipv4/fib_rules.c 2010-08-03 00:24:10.000000000 +0300 @@ -54,6 +54,11 @@ u32 fib_rules_tclass(struct fib_result * } #endif @@ -360,9 +360,9 @@ diff -urp v2.6.34/linux/net/ipv4/fib_rules.c linux/net/ipv4/fib_rules.c int fib_lookup(struct net *net, struct flowi *flp, struct fib_result *res) { struct fib_lookup_arg arg = { -diff -urp v2.6.34/linux/net/ipv4/fib_semantics.c linux/net/ipv4/fib_semantics.c ---- v2.6.34/linux/net/ipv4/fib_semantics.c 2010-05-17 10:49:01.000000000 +0300 -+++ linux/net/ipv4/fib_semantics.c 2010-05-18 09:58:49.000000000 +0300 +diff -urp v2.6.35/linux/net/ipv4/fib_semantics.c linux/net/ipv4/fib_semantics.c +--- v2.6.35/linux/net/ipv4/fib_semantics.c 2010-05-17 10:49:01.000000000 +0300 ++++ linux/net/ipv4/fib_semantics.c 2010-08-03 00:24:45.000000000 +0300 @@ -51,6 +51,7 @@ static struct hlist_head *fib_info_hash; static struct hlist_head *fib_info_laddrhash; static unsigned int fib_hash_size; @@ -814,10 +814,10 @@ diff -urp v2.6.34/linux/net/ipv4/fib_semantics.c linux/net/ipv4/fib_semantics.c spin_unlock_bh(&fib_multipath_lock); } #endif -diff -urp v2.6.34/linux/net/ipv4/fib_trie.c linux/net/ipv4/fib_trie.c ---- v2.6.34/linux/net/ipv4/fib_trie.c 2010-05-17 10:49:01.000000000 +0300 -+++ linux/net/ipv4/fib_trie.c 2010-05-18 09:58:49.000000000 +0300 -@@ -1277,6 +1277,7 @@ int fib_table_insert(struct fib_table *t +diff -urp v2.6.35/linux/net/ipv4/fib_trie.c linux/net/ipv4/fib_trie.c +--- v2.6.35/linux/net/ipv4/fib_trie.c 2010-08-02 09:37:49.000000000 +0300 ++++ linux/net/ipv4/fib_trie.c 2010-08-03 00:24:10.000000000 +0300 +@@ -1275,6 +1275,7 @@ int fib_table_insert(struct fib_table *t fi_drop = fa->fa_info; new_fa->fa_tos = fa->fa_tos; new_fa->fa_info = fi; @@ -825,7 +825,7 @@ diff -urp v2.6.34/linux/net/ipv4/fib_trie.c linux/net/ipv4/fib_trie.c new_fa->fa_type = cfg->fc_type; new_fa->fa_scope = cfg->fc_scope; state = fa->fa_state; -@@ -1317,6 +1318,7 @@ int fib_table_insert(struct fib_table *t +@@ -1315,6 +1316,7 @@ int fib_table_insert(struct fib_table *t new_fa->fa_type = cfg->fc_type; new_fa->fa_scope = cfg->fc_scope; new_fa->fa_state = 0; @@ -833,7 +833,7 @@ diff -urp v2.6.34/linux/net/ipv4/fib_trie.c linux/net/ipv4/fib_trie.c /* * Insert new entry to the list. */ -@@ -1817,24 +1819,31 @@ void fib_table_select_default(struct fib +@@ -1815,24 +1817,31 @@ void fib_table_select_default(struct fib struct fib_result *res) { struct trie *t = (struct trie *) tb->tb_data; @@ -868,7 +868,7 @@ diff -urp v2.6.34/linux/net/ipv4/fib_trie.c linux/net/ipv4/fib_trie.c if (!fa_head) goto out; -@@ -1848,39 +1857,52 @@ void fib_table_select_default(struct fib +@@ -1846,39 +1855,52 @@ void fib_table_select_default(struct fib fa->fa_type != RTN_UNICAST) continue; @@ -935,9 +935,9 @@ diff -urp v2.6.34/linux/net/ipv4/fib_trie.c linux/net/ipv4/fib_trie.c out: rcu_read_unlock(); } -diff -urp v2.6.34/linux/net/ipv4/netfilter/ipt_MASQUERADE.c linux/net/ipv4/netfilter/ipt_MASQUERADE.c ---- v2.6.34/linux/net/ipv4/netfilter/ipt_MASQUERADE.c 2010-02-25 09:01:36.000000000 +0200 -+++ linux/net/ipv4/netfilter/ipt_MASQUERADE.c 2010-05-18 09:58:49.000000000 +0300 +diff -urp v2.6.35/linux/net/ipv4/netfilter/ipt_MASQUERADE.c linux/net/ipv4/netfilter/ipt_MASQUERADE.c +--- v2.6.35/linux/net/ipv4/netfilter/ipt_MASQUERADE.c 2010-08-02 09:37:49.000000000 +0300 ++++ linux/net/ipv4/netfilter/ipt_MASQUERADE.c 2010-08-03 00:26:47.000000000 +0300 @@ -51,7 +51,7 @@ masquerade_tg(struct sk_buff *skb, const enum ip_conntrack_info ctinfo; struct nf_nat_range newrange; @@ -947,14 +947,14 @@ diff -urp v2.6.34/linux/net/ipv4/netfilter/ipt_MASQUERADE.c linux/net/ipv4/netfi __be32 newsrc; NF_CT_ASSERT(par->hooknum == NF_INET_POST_ROUTING); -@@ -69,13 +69,28 @@ masquerade_tg(struct sk_buff *skb, const +@@ -69,13 +69,29 @@ masquerade_tg(struct sk_buff *skb, const return NF_ACCEPT; mr = par->targinfo; - rt = skb_rtable(skb); - newsrc = inet_select_addr(par->out, rt->rt_gateway, RT_SCOPE_UNIVERSE); - if (!newsrc) { -- printk("MASQUERADE: %s ate my IP address\n", par->out->name); +- pr_info("%s ate my IP address\n", par->out->name); - return NF_DROP; + + { @@ -969,8 +969,9 @@ diff -urp v2.6.34/linux/net/ipv4/netfilter/ipt_MASQUERADE.c linux/net/ipv4/netfi + if (ip_route_output_key(dev_net(par->out), &rt, &fl) != 0) { + /* Funky routing can do this. */ + if (net_ratelimit()) -+ printk("MASQUERADE:" -+ " No route: Rusty's brain broke!\n"); ++ pr_info("%s:" ++ " No route: Rusty's brain broke!\n", ++ par->out->name); + return NF_DROP; + } } @@ -981,9 +982,9 @@ diff -urp v2.6.34/linux/net/ipv4/netfilter/ipt_MASQUERADE.c linux/net/ipv4/netfi nat->masq_index = par->out->ifindex; /* Transfer from original range. */ -diff -urp v2.6.34/linux/net/ipv4/netfilter/nf_nat_core.c linux/net/ipv4/netfilter/nf_nat_core.c ---- v2.6.34/linux/net/ipv4/netfilter/nf_nat_core.c 2010-05-17 10:49:01.000000000 +0300 -+++ linux/net/ipv4/netfilter/nf_nat_core.c 2010-05-18 09:58:49.000000000 +0300 +diff -urp v2.6.35/linux/net/ipv4/netfilter/nf_nat_core.c linux/net/ipv4/netfilter/nf_nat_core.c +--- v2.6.35/linux/net/ipv4/netfilter/nf_nat_core.c 2010-05-17 10:49:01.000000000 +0300 ++++ linux/net/ipv4/netfilter/nf_nat_core.c 2010-08-03 00:24:45.000000000 +0300 @@ -715,6 +715,52 @@ static struct pernet_operations nf_nat_n .exit = nf_nat_net_exit, }; @@ -1037,10 +1038,10 @@ diff -urp v2.6.34/linux/net/ipv4/netfilter/nf_nat_core.c linux/net/ipv4/netfilte static int __init nf_nat_init(void) { size_t i; -diff -urp v2.6.34/linux/net/ipv4/netfilter/nf_nat_standalone.c linux/net/ipv4/netfilter/nf_nat_standalone.c ---- v2.6.34/linux/net/ipv4/netfilter/nf_nat_standalone.c 2010-05-17 10:49:01.000000000 +0300 -+++ linux/net/ipv4/netfilter/nf_nat_standalone.c 2010-05-18 09:58:49.000000000 +0300 -@@ -256,6 +256,14 @@ static struct nf_hook_ops nf_nat_ops[] _ +diff -urp v2.6.35/linux/net/ipv4/netfilter/nf_nat_standalone.c linux/net/ipv4/netfilter/nf_nat_standalone.c +--- v2.6.35/linux/net/ipv4/netfilter/nf_nat_standalone.c 2010-08-02 09:37:49.000000000 +0300 ++++ linux/net/ipv4/netfilter/nf_nat_standalone.c 2010-08-03 00:24:45.000000000 +0300 +@@ -255,6 +255,14 @@ static struct nf_hook_ops nf_nat_ops[] _ .hooknum = NF_INET_PRE_ROUTING, .priority = NF_IP_PRI_NAT_DST, }, @@ -1055,19 +1056,19 @@ diff -urp v2.6.34/linux/net/ipv4/netfilter/nf_nat_standalone.c linux/net/ipv4/ne /* After packet filtering, change source */ { .hook = nf_nat_out, -diff -urp v2.6.34/linux/net/ipv4/route.c linux/net/ipv4/route.c ---- v2.6.34/linux/net/ipv4/route.c 2010-05-17 10:49:01.000000000 +0300 -+++ linux/net/ipv4/route.c 2010-05-18 09:58:49.000000000 +0300 -@@ -695,6 +695,8 @@ static inline int compare_keys(struct fl - return ((__force u32)((fl1->nl_u.ip4_u.daddr ^ fl2->nl_u.ip4_u.daddr) | - (fl1->nl_u.ip4_u.saddr ^ fl2->nl_u.ip4_u.saddr)) | +diff -urp v2.6.35/linux/net/ipv4/route.c linux/net/ipv4/route.c +--- v2.6.35/linux/net/ipv4/route.c 2010-08-02 09:37:49.000000000 +0300 ++++ linux/net/ipv4/route.c 2010-08-03 00:32:04.000000000 +0300 +@@ -694,6 +694,8 @@ static inline int compare_keys(struct fl + return (((__force u32)fl1->nl_u.ip4_u.daddr ^ (__force u32)fl2->nl_u.ip4_u.daddr) | + ((__force u32)fl1->nl_u.ip4_u.saddr ^ (__force u32)fl2->nl_u.ip4_u.saddr) | (fl1->mark ^ fl2->mark) | -+ ((__force u32)(fl1->nl_u.ip4_u.lsrc ^ fl2->nl_u.ip4_u.lsrc)) | -+ ((__force u32)(fl1->nl_u.ip4_u.gw ^ fl2->nl_u.ip4_u.gw)) | - (*(u16 *)&fl1->nl_u.ip4_u.tos ^ - *(u16 *)&fl2->nl_u.ip4_u.tos) | ++ ((__force u32)fl1->nl_u.ip4_u.lsrc ^ (__force u32)fl2->nl_u.ip4_u.lsrc) | ++ ((__force u32)fl1->nl_u.ip4_u.gw ^ (__force u32)fl2->nl_u.ip4_u.gw) | + (*(u16 *)&fl1->nl_u.ip4_u.tos ^ *(u16 *)&fl2->nl_u.ip4_u.tos) | (fl1->oif ^ fl2->oif) | -@@ -1460,6 +1462,7 @@ void ip_rt_redirect(__be32 old_gw, __be3 + (fl1->iif ^ fl2->iif)) == 0; +@@ -1437,6 +1439,7 @@ void ip_rt_redirect(__be32 old_gw, __be3 /* Gateway is different ... */ rt->rt_gateway = new_gw; @@ -1075,7 +1076,7 @@ diff -urp v2.6.34/linux/net/ipv4/route.c linux/net/ipv4/route.c /* Redirect received -> path was valid */ dst_confirm(&rth->u.dst); -@@ -1909,6 +1912,7 @@ static int ip_route_input_mc(struct sk_b +@@ -1886,6 +1889,7 @@ static int ip_route_input_mc(struct sk_b rth->fl.fl4_tos = tos; rth->fl.mark = skb->mark; rth->fl.fl4_src = saddr; @@ -1083,7 +1084,7 @@ diff -urp v2.6.34/linux/net/ipv4/route.c linux/net/ipv4/route.c rth->rt_src = saddr; #ifdef CONFIG_NET_CLS_ROUTE rth->u.dst.tclassid = itag; -@@ -1919,6 +1923,7 @@ static int ip_route_input_mc(struct sk_b +@@ -1896,6 +1900,7 @@ static int ip_route_input_mc(struct sk_b dev_hold(rth->u.dst.dev); rth->idev = in_dev_get(rth->u.dst.dev); rth->fl.oif = 0; @@ -1091,7 +1092,7 @@ diff -urp v2.6.34/linux/net/ipv4/route.c linux/net/ipv4/route.c rth->rt_gateway = daddr; rth->rt_spec_dst= spec_dst; rth->rt_genid = rt_genid(dev_net(dev)); -@@ -1983,7 +1988,7 @@ static int __mkroute_input(struct sk_buf +@@ -1960,7 +1965,7 @@ static int __mkroute_input(struct sk_buf struct fib_result *res, struct in_device *in_dev, __be32 daddr, __be32 saddr, u32 tos, @@ -1100,7 +1101,7 @@ diff -urp v2.6.34/linux/net/ipv4/route.c linux/net/ipv4/route.c { struct rtable *rth; -@@ -2017,6 +2022,7 @@ static int __mkroute_input(struct sk_buf +@@ -1994,6 +1999,7 @@ static int __mkroute_input(struct sk_buf flags |= RTCF_DIRECTSRC; if (out_dev == in_dev && err && @@ -1108,7 +1109,7 @@ diff -urp v2.6.34/linux/net/ipv4/route.c linux/net/ipv4/route.c (IN_DEV_SHARED_MEDIA(out_dev) || inet_addr_onlink(out_dev, saddr, FIB_RES_GW(*res)))) flags |= RTCF_DOREDIRECT; -@@ -2055,6 +2061,7 @@ static int __mkroute_input(struct sk_buf +@@ -2032,6 +2038,7 @@ static int __mkroute_input(struct sk_buf rth->fl.mark = skb->mark; rth->fl.fl4_src = saddr; rth->rt_src = saddr; @@ -1116,7 +1117,7 @@ diff -urp v2.6.34/linux/net/ipv4/route.c linux/net/ipv4/route.c rth->rt_gateway = daddr; rth->rt_iif = rth->fl.iif = in_dev->dev->ifindex; -@@ -2062,6 +2069,7 @@ static int __mkroute_input(struct sk_buf +@@ -2039,6 +2046,7 @@ static int __mkroute_input(struct sk_buf dev_hold(rth->u.dst.dev); rth->idev = in_dev_get(rth->u.dst.dev); rth->fl.oif = 0; @@ -1124,7 +1125,7 @@ diff -urp v2.6.34/linux/net/ipv4/route.c linux/net/ipv4/route.c rth->rt_spec_dst= spec_dst; rth->u.dst.obsolete = -1; -@@ -2083,21 +2091,23 @@ static int __mkroute_input(struct sk_buf +@@ -2060,21 +2068,23 @@ static int __mkroute_input(struct sk_buf static int ip_mkroute_input(struct sk_buff *skb, struct fib_result *res, @@ -1151,7 +1152,7 @@ diff -urp v2.6.34/linux/net/ipv4/route.c linux/net/ipv4/route.c if (err) return err; -@@ -2118,18 +2128,19 @@ static int ip_mkroute_input(struct sk_bu +@@ -2095,18 +2105,19 @@ static int ip_mkroute_input(struct sk_bu */ static int ip_route_input_slow(struct sk_buff *skb, __be32 daddr, __be32 saddr, @@ -1174,7 +1175,7 @@ diff -urp v2.6.34/linux/net/ipv4/route.c linux/net/ipv4/route.c unsigned flags = 0; u32 itag = 0; struct rtable * rth; -@@ -2165,6 +2176,12 @@ static int ip_route_input_slow(struct sk +@@ -2142,6 +2153,12 @@ static int ip_route_input_slow(struct sk ipv4_is_loopback(daddr)) goto martian_destination; @@ -1187,7 +1188,7 @@ diff -urp v2.6.34/linux/net/ipv4/route.c linux/net/ipv4/route.c /* * Now we are ready to route packet. */ -@@ -2174,6 +2191,8 @@ static int ip_route_input_slow(struct sk +@@ -2151,6 +2168,8 @@ static int ip_route_input_slow(struct sk goto no_route; } free_res = 1; @@ -1196,7 +1197,7 @@ diff -urp v2.6.34/linux/net/ipv4/route.c linux/net/ipv4/route.c RT_CACHE_STAT_INC(in_slow_tot); -@@ -2198,7 +2217,7 @@ static int ip_route_input_slow(struct sk +@@ -2175,7 +2194,7 @@ static int ip_route_input_slow(struct sk if (res.type != RTN_UNICAST) goto martian_destination; @@ -1205,7 +1206,7 @@ diff -urp v2.6.34/linux/net/ipv4/route.c linux/net/ipv4/route.c done: in_dev_put(in_dev); if (free_res) -@@ -2208,6 +2227,8 @@ out: return err; +@@ -2185,6 +2204,8 @@ out: return err; brd_input: if (skb->protocol != htons(ETH_P_IP)) goto e_inval; @@ -1214,7 +1215,7 @@ diff -urp v2.6.34/linux/net/ipv4/route.c linux/net/ipv4/route.c if (ipv4_is_zeronet(saddr)) spec_dst = inet_select_addr(dev, 0, RT_SCOPE_LINK); -@@ -2250,6 +2271,7 @@ local_input: +@@ -2227,6 +2248,7 @@ local_input: rth->u.dst.dev = net->loopback_dev; dev_hold(rth->u.dst.dev); rth->idev = in_dev_get(rth->u.dst.dev); @@ -1222,27 +1223,27 @@ diff -urp v2.6.34/linux/net/ipv4/route.c linux/net/ipv4/route.c rth->rt_gateway = daddr; rth->rt_spec_dst= spec_dst; rth->u.dst.input= ip_local_deliver; -@@ -2300,8 +2322,9 @@ martian_source: +@@ -2277,8 +2299,9 @@ martian_source: goto e_inval; } --int ip_route_input(struct sk_buff *skb, __be32 daddr, __be32 saddr, -- u8 tos, struct net_device *dev) -+static inline int -+ip_route_input_cached(struct sk_buff *skb, __be32 daddr, __be32 saddr, -+ u8 tos, struct net_device *dev, __be32 lsrc) +-int ip_route_input_common(struct sk_buff *skb, __be32 daddr, __be32 saddr, +- u8 tos, struct net_device *dev, bool noref) ++int ip_route_input_cached(struct sk_buff *skb, __be32 daddr, __be32 saddr, ++ u8 tos, struct net_device *dev, bool noref, ++ __be32 lsrc) { struct rtable * rth; unsigned hash; -@@ -2322,6 +2345,7 @@ int ip_route_input(struct sk_buff *skb, - if (((rth->fl.fl4_dst ^ daddr) | - (rth->fl.fl4_src ^ saddr) | +@@ -2299,6 +2322,7 @@ int ip_route_input_common(struct sk_buff + if ((((__force u32)rth->fl.fl4_dst ^ (__force u32)daddr) | + ((__force u32)rth->fl.fl4_src ^ (__force u32)saddr) | (rth->fl.iif ^ iif) | + (rth->fl.fl4_lsrc ^ lsrc) | rth->fl.oif | (rth->fl.fl4_tos ^ tos)) == 0 && rth->fl.mark == skb->mark && -@@ -2371,7 +2395,19 @@ skip_cache: +@@ -2353,10 +2377,22 @@ skip_cache: rcu_read_unlock(); return -EINVAL; } @@ -1250,20 +1251,23 @@ diff -urp v2.6.34/linux/net/ipv4/route.c linux/net/ipv4/route.c + return ip_route_input_slow(skb, daddr, saddr, tos, dev, lsrc); +} + -+int ip_route_input(struct sk_buff *skb, __be32 daddr, __be32 saddr, -+ u8 tos, struct net_device *dev) ++int ip_route_input_common(struct sk_buff *skb, __be32 daddr, __be32 saddr, ++ u8 tos, struct net_device *dev, bool noref) +{ -+ return ip_route_input_cached(skb, daddr, saddr, tos, dev, 0); -+} -+ ++ return ip_route_input_cached(skb, daddr, saddr, tos, dev, noref, 0); + } + EXPORT_SYMBOL(ip_route_input_common); + +int ip_route_input_lookup(struct sk_buff *skb, __be32 daddr, __be32 saddr, + u8 tos, struct net_device *dev, __be32 lsrc) +{ -+ return ip_route_input_cached(skb, daddr, saddr, tos, dev, lsrc); - } - ++ return ip_route_input_cached(skb, daddr, saddr, tos, dev, true, lsrc); ++} ++ static int __mkroute_output(struct rtable **result, -@@ -2443,6 +2479,7 @@ static int __mkroute_output(struct rtabl + struct fib_result *res, + const struct flowi *fl, +@@ -2426,6 +2462,7 @@ static int __mkroute_output(struct rtabl rth->fl.fl4_tos = tos; rth->fl.fl4_src = oldflp->fl4_src; rth->fl.oif = oldflp->oif; @@ -1271,7 +1275,7 @@ diff -urp v2.6.34/linux/net/ipv4/route.c linux/net/ipv4/route.c rth->fl.mark = oldflp->mark; rth->rt_dst = fl->fl4_dst; rth->rt_src = fl->fl4_src; -@@ -2525,6 +2562,7 @@ static int ip_route_output_slow(struct n +@@ -2508,6 +2545,7 @@ static int ip_route_output_slow(struct n struct flowi fl = { .nl_u = { .ip4_u = { .daddr = oldflp->fl4_dst, .saddr = oldflp->fl4_src, @@ -1279,7 +1283,7 @@ diff -urp v2.6.34/linux/net/ipv4/route.c linux/net/ipv4/route.c .tos = tos & IPTOS_RT_MASK, .scope = ((tos & RTO_ONLINK) ? RT_SCOPE_LINK : -@@ -2636,6 +2674,7 @@ static int ip_route_output_slow(struct n +@@ -2619,6 +2657,7 @@ static int ip_route_output_slow(struct n dev_out = net->loopback_dev; dev_hold(dev_out); fl.oif = net->loopback_dev->ifindex; @@ -1287,7 +1291,7 @@ diff -urp v2.6.34/linux/net/ipv4/route.c linux/net/ipv4/route.c res.type = RTN_LOCAL; flags |= RTCF_LOCAL; goto make_route; -@@ -2643,7 +2682,7 @@ static int ip_route_output_slow(struct n +@@ -2626,7 +2665,7 @@ static int ip_route_output_slow(struct n if (fib_lookup(net, &fl, &res)) { res.fi = NULL; @@ -1296,7 +1300,7 @@ diff -urp v2.6.34/linux/net/ipv4/route.c linux/net/ipv4/route.c /* Apparently, routing tables are wrong. Assume, that the destination is on link. -@@ -2683,6 +2722,7 @@ static int ip_route_output_slow(struct n +@@ -2666,6 +2705,7 @@ static int ip_route_output_slow(struct n dev_out = net->loopback_dev; dev_hold(dev_out); fl.oif = dev_out->ifindex; @@ -1304,7 +1308,7 @@ diff -urp v2.6.34/linux/net/ipv4/route.c linux/net/ipv4/route.c if (res.fi) fib_info_put(res.fi); res.fi = NULL; -@@ -2690,13 +2730,12 @@ static int ip_route_output_slow(struct n +@@ -2673,13 +2713,12 @@ static int ip_route_output_slow(struct n goto make_route; } @@ -1321,7 +1325,7 @@ diff -urp v2.6.34/linux/net/ipv4/route.c linux/net/ipv4/route.c if (!fl.fl4_src) fl.fl4_src = FIB_RES_PREFSRC(res); -@@ -2737,6 +2776,7 @@ int __ip_route_output_key(struct net *ne +@@ -2720,6 +2759,7 @@ int __ip_route_output_key(struct net *ne rth->fl.fl4_src == flp->fl4_src && rth->fl.iif == 0 && rth->fl.oif == flp->oif && @@ -1329,8 +1333,8 @@ diff -urp v2.6.34/linux/net/ipv4/route.c linux/net/ipv4/route.c rth->fl.mark == flp->mark && !((rth->fl.fl4_tos ^ flp->fl4_tos) & (IPTOS_RT_MASK | RTO_ONLINK)) && -@@ -3456,3 +3496,4 @@ void __init ip_static_sysctl_init(void) +@@ -3368,3 +3408,4 @@ void __init ip_static_sysctl_init(void) + EXPORT_SYMBOL(__ip_select_ident); - EXPORT_SYMBOL(ip_route_input); EXPORT_SYMBOL(ip_route_output_key); +EXPORT_SYMBOL(ip_route_input_lookup);