From f1926ca1770d930c229ca503e5f3b9842cc46d24 Mon Sep 17 00:00:00 2001 From: phil Date: Tue, 27 Jan 2004 19:28:44 +0000 Subject: [PATCH] update b_size from HEAD --- .../kernel-2.4.20-rh-2.4-i386.config | 1981 --------------- .../kernel-2.4.20-rh-2.4-i686-smp.config | 1861 -------------- .../patches/dev_read_only_2.6.0.patch | 96 +- .../patches/ext3-delete_thread-suse.patch | 51 +- .../patches/ext3-ea-in-inode-2.4.18-chaos.patch | 9 +- .../patches/ext3-ea-in-inode-2.4.20.patch | 9 +- .../patches/ext3-ea-in-inode-2.4.22-rh.patch | 9 +- .../patches/ext3-extents-2.4.18-chaos.patch | 108 +- .../patches/ext3-extents-2.4.20.patch | 2526 +++++++++++++------- .../patches/ext3-map_inode_page-2.6.0.patch | 21 +- .../kernel_patches/patches/iopen-2.6.0-test6.patch | 107 +- .../patches/linux-2.4.19-pre1-xattr-0.8.54.patch | 2370 +++++++++--------- .../patches/vfs_nointent_2.6.0-test6.patch | 76 +- lustre/llite/Makefile.mk | 2 +- lustre/llite/rw26.c | 90 +- lustre/osc/Makefile.mk | 2 +- lustre/tests/conf-sanity.sh | 80 + lustre/tests/iopentest1.c | 3 +- lustre/tests/iopentest2.c | 6 + lustre/tests/multiop.c | 53 +- lustre/tests/run-llog.sh | 25 +- lustre/utils/Makefile.mk | 4 +- lustre/utils/llmount.c | 48 +- 23 files changed, 3406 insertions(+), 6131 deletions(-) delete mode 100644 lustre/kernel_patches/kernel_configs/kernel-2.4.20-rh-2.4-i386.config delete mode 100644 lustre/kernel_patches/kernel_configs/kernel-2.4.20-rh-2.4-i686-smp.config diff --git a/lustre/kernel_patches/kernel_configs/kernel-2.4.20-rh-2.4-i386.config b/lustre/kernel_patches/kernel_configs/kernel-2.4.20-rh-2.4-i386.config deleted file mode 100644 index d7fba87..0000000 --- a/lustre/kernel_patches/kernel_configs/kernel-2.4.20-rh-2.4-i386.config +++ /dev/null @@ -1,1981 +0,0 @@ -# -# Automatically generated make config: don't edit -# -CONFIG_X86=y -# CONFIG_SBUS is not set -CONFIG_UID16=y - -# -# Code maturity level options -# -CONFIG_EXPERIMENTAL=y - -# -# Loadable module support -# -CONFIG_MODULES=y -CONFIG_MODVERSIONS=y -CONFIG_KMOD=y - -# -# Processor type and features -# -CONFIG_LOLAT=y -CONFIG_M386=y -# CONFIG_M486 is not set -# CONFIG_M586 is not set -# CONFIG_M586TSC is not set -# CONFIG_M586MMX is not set -# CONFIG_M686 is not set -# CONFIG_MPENTIUMIII is not set -# CONFIG_MPENTIUM4 is not set -# CONFIG_MK6 is not set -# CONFIG_MK7 is not set -# CONFIG_MELAN is not set -# CONFIG_MCRUSOE is not set -# CONFIG_MWINCHIPC6 is not set -# CONFIG_MWINCHIP2 is not set -# CONFIG_MWINCHIP3D is not set -# CONFIG_MCYRIXIII is not set -# CONFIG_X86_CMPXCHG is not set -# CONFIG_X86_XADD is not set -CONFIG_X86_L1_CACHE_SHIFT=4 -CONFIG_RWSEM_GENERIC_SPINLOCK=y -# CONFIG_RWSEM_XCHGADD_ALGORITHM is not set -CONFIG_X86_PPRO_FENCE=y -# CONFIG_X86_F00F_WORKS_OK is not set -CONFIG_X86_MCE=y - -# -# CPU Frequency scaling -# -# CONFIG_CPU_FREQ is not set -CONFIG_TOSHIBA=m -CONFIG_I8K=m -# CONFIG_MICROCODE is not set -CONFIG_X86_MSR=m -CONFIG_X86_CPUID=m -# CONFIG_E820_PROC is not set -CONFIG_EDD=m -CONFIG_NOHIGHMEM=y -# CONFIG_HIGHMEM4G is not set -# CONFIG_HIGHMEM64G is not set -# CONFIG_HIGHMEM is not set -CONFIG_MATH_EMULATION=y -CONFIG_MTRR=y -# CONFIG_SMP is not set -# CONFIG_X86_UP_APIC is not set -# CONFIG_X86_UP_IOAPIC is not set -# CONFIG_X86_TSC_DISABLE is not set - -# -# General setup -# -CONFIG_NET=y -CONFIG_PCI=y -# CONFIG_PCI_GOBIOS is not set -# CONFIG_PCI_GODIRECT is not set -CONFIG_PCI_GOANY=y -CONFIG_PCI_BIOS=y -CONFIG_PCI_DIRECT=y -CONFIG_ISA=y -CONFIG_PCI_NAMES=y -CONFIG_EISA=y -# CONFIG_MCA is not set -CONFIG_HOTPLUG=y - -# -# PCMCIA/CardBus support -# -CONFIG_PCMCIA=m -CONFIG_CARDBUS=y -CONFIG_TCIC=y -CONFIG_I82092=y -CONFIG_I82365=y - -# -# PCI Hotplug Support -# -# CONFIG_HOTPLUG_PCI is not set -# CONFIG_HOTPLUG_PCI_ACPI is not set -# CONFIG_HOTPLUG_PCI_COMPAQ is not set -# CONFIG_HOTPLUG_PCI_COMPAQ_NVRAM is not set -# CONFIG_HOTPLUG_PCI_IBM is not set -# CONFIG_HOTPLUG_PCI_H2999 is not set -CONFIG_SYSVIPC=y -CONFIG_BSD_PROCESS_ACCT=y -CONFIG_SYSCTL=y -CONFIG_KCORE_ELF=y -# CONFIG_KCORE_AOUT is not set -CONFIG_BINFMT_AOUT=m -CONFIG_BINFMT_ELF=y -CONFIG_BINFMT_MISC=m -CONFIG_PM=y -# CONFIG_ACPI is not set -CONFIG_APM=y -# CONFIG_APM_IGNORE_USER_SUSPEND is not set -# CONFIG_APM_DO_ENABLE is not set -CONFIG_APM_CPU_IDLE=y -# CONFIG_APM_DISPLAY_BLANK is not set -CONFIG_APM_RTC_IS_GMT=y -# CONFIG_APM_ALLOW_INTS is not set -# CONFIG_APM_REAL_MODE_POWER_OFF is not set - -# -# Memory Technology Devices (MTD) -# -# CONFIG_MTD is not set - -# -# Parallel port support -# -CONFIG_PARPORT=m -CONFIG_PARPORT_PC=m -CONFIG_PARPORT_PC_CML1=m -CONFIG_PARPORT_SERIAL=m -# CONFIG_PARPORT_PC_FIFO is not set -# CONFIG_PARPORT_PC_SUPERIO is not set -CONFIG_PARPORT_PC_PCMCIA=m -# CONFIG_PARPORT_AMIGA is not set -# CONFIG_PARPORT_MFC3 is not set -# CONFIG_PARPORT_ATARI is not set -# CONFIG_PARPORT_GSC is not set -# CONFIG_PARPORT_SUNBPP is not set -# CONFIG_PARPORT_OTHER is not set -CONFIG_PARPORT_1284=y - -# -# Plug and Play configuration -# -CONFIG_PNP=y -CONFIG_ISAPNP=y - -# -# Block devices -# -CONFIG_BLK_DEV_FD=y -CONFIG_BLK_DEV_XD=m -CONFIG_PARIDE=m -CONFIG_PARIDE_PARPORT=m - -# -# Parallel IDE high-level drivers -# -CONFIG_PARIDE_PD=m -CONFIG_PARIDE_PCD=m -CONFIG_PARIDE_PF=m -CONFIG_PARIDE_PT=m -CONFIG_PARIDE_PG=m - -# -# Parallel IDE protocol modules -# -CONFIG_PARIDE_ATEN=m -CONFIG_PARIDE_BPCK=m -CONFIG_PARIDE_BPCK6=m -CONFIG_PARIDE_COMM=m -CONFIG_PARIDE_DSTR=m -CONFIG_PARIDE_FIT2=m -CONFIG_PARIDE_FIT3=m -CONFIG_PARIDE_EPAT=m -CONFIG_PARIDE_EPATC8=y -CONFIG_PARIDE_EPIA=m -CONFIG_PARIDE_FRIQ=m -CONFIG_PARIDE_FRPW=m -CONFIG_PARIDE_KBIC=m -CONFIG_PARIDE_KTTI=m -CONFIG_PARIDE_ON20=m -CONFIG_PARIDE_ON26=m -CONFIG_BLK_CPQ_DA=m -CONFIG_BLK_CPQ_CISS_DA=m -CONFIG_CISS_SCSI_TAPE=y -CONFIG_BLK_DEV_DAC960=m -CONFIG_BLK_DEV_UMEM=m -CONFIG_BLK_DEV_LOOP=m -CONFIG_BLK_DEV_NBD=m -CONFIG_BLK_DEV_RAM=y -CONFIG_BLK_DEV_RAM_SIZE=4096 -CONFIG_BLK_DEV_INITRD=y -CONFIG_BLK_STATS=y - -# -# Multi-device support (RAID and LVM) -# -CONFIG_MD=y -CONFIG_BLK_DEV_MD=y -CONFIG_MD_LINEAR=m -CONFIG_MD_RAID0=m -CONFIG_MD_RAID1=m -CONFIG_MD_RAID5=m -CONFIG_MD_MULTIPATH=m -CONFIG_BLK_DEV_LVM=m - -# -# Cryptography support (CryptoAPI) -# -CONFIG_CRYPTO=m -CONFIG_CIPHERS=m - -# -# 128 bit blocksize -# -CONFIG_CIPHER_AES=m -CONFIG_CIPHER_IDENTITY=m -CONFIG_CRYPTODEV=m -CONFIG_CRYPTOLOOP=m - -# -# Networking options -# -CONFIG_PACKET=y -CONFIG_PACKET_MMAP=y -CONFIG_NETLINK_DEV=y -CONFIG_NETFILTER=y -# CONFIG_NETFILTER_DEBUG is not set -CONFIG_FILTER=y -CONFIG_UNIX=y -CONFIG_INET=y -CONFIG_TUX=m -CONFIG_TUX_EXTCGI=y -# CONFIG_TUX_EXTENDED_LOG is not set -# CONFIG_TUX_DEBUG is not set -CONFIG_IP_MULTICAST=y -CONFIG_IP_ADVANCED_ROUTER=y -CONFIG_IP_MULTIPLE_TABLES=y -CONFIG_IP_ROUTE_FWMARK=y -CONFIG_IP_ROUTE_NAT=y -CONFIG_IP_ROUTE_MULTIPATH=y -CONFIG_IP_ROUTE_TOS=y -CONFIG_IP_ROUTE_VERBOSE=y -CONFIG_IP_ROUTE_LARGE_TABLES=y -# CONFIG_IP_PNP is not set -CONFIG_NET_IPIP=m -CONFIG_NET_IPGRE=m -CONFIG_NET_IPGRE_BROADCAST=y -CONFIG_IP_MROUTE=y -CONFIG_IP_PIMSM_V1=y -CONFIG_IP_PIMSM_V2=y -# CONFIG_ARPD is not set -# CONFIG_INET_ECN is not set -CONFIG_SYN_COOKIES=y - -# -# IP: Netfilter Configuration -# -CONFIG_IP_NF_CONNTRACK=m -CONFIG_IP_NF_FTP=m -CONFIG_IP_NF_AMANDA=m -CONFIG_IP_NF_TFTP=m -CONFIG_IP_NF_IRC=m -CONFIG_IP_NF_QUEUE=m -CONFIG_IP_NF_IPTABLES=m -CONFIG_IP_NF_MATCH_LIMIT=m -CONFIG_IP_NF_MATCH_MAC=m -CONFIG_IP_NF_MATCH_PKTTYPE=m -CONFIG_IP_NF_MATCH_MARK=m -CONFIG_IP_NF_MATCH_MULTIPORT=m -CONFIG_IP_NF_MATCH_TOS=m -CONFIG_IP_NF_MATCH_ECN=m -CONFIG_IP_NF_MATCH_DSCP=m -CONFIG_IP_NF_MATCH_AH_ESP=m -CONFIG_IP_NF_MATCH_LENGTH=m -CONFIG_IP_NF_MATCH_TTL=m -CONFIG_IP_NF_MATCH_TCPMSS=m -CONFIG_IP_NF_MATCH_HELPER=m -CONFIG_IP_NF_MATCH_STATE=m -CONFIG_IP_NF_MATCH_CONNTRACK=m -CONFIG_IP_NF_MATCH_UNCLEAN=m -CONFIG_IP_NF_MATCH_OWNER=m -CONFIG_IP_NF_FILTER=m -CONFIG_IP_NF_TARGET_REJECT=m -CONFIG_IP_NF_TARGET_MIRROR=m -CONFIG_IP_NF_NAT=m -CONFIG_IP_NF_NAT_NEEDED=y -CONFIG_IP_NF_TARGET_MASQUERADE=m -CONFIG_IP_NF_TARGET_REDIRECT=m -CONFIG_IP_NF_NAT_AMANDA=m -CONFIG_IP_NF_NAT_LOCAL=y -CONFIG_IP_NF_NAT_SNMP_BASIC=m -CONFIG_IP_NF_NAT_IRC=m -CONFIG_IP_NF_NAT_FTP=m -CONFIG_IP_NF_NAT_TFTP=m -CONFIG_IP_NF_MANGLE=m -CONFIG_IP_NF_TARGET_TOS=m -CONFIG_IP_NF_TARGET_ECN=m -CONFIG_IP_NF_TARGET_DSCP=m -CONFIG_IP_NF_TARGET_MARK=m -CONFIG_IP_NF_TARGET_LOG=m -CONFIG_IP_NF_TARGET_ULOG=m -CONFIG_IP_NF_TARGET_TCPMSS=m -CONFIG_IP_NF_ARPTABLES=m -CONFIG_IP_NF_ARPFILTER=m -CONFIG_IP_NF_COMPAT_IPCHAINS=m -CONFIG_IP_NF_NAT_NEEDED=y -CONFIG_IP_NF_COMPAT_IPFWADM=m -CONFIG_IP_NF_NAT_NEEDED=y -CONFIG_IPV6=m - -# -# IPv6: Netfilter Configuration -# -# CONFIG_IP6_NF_QUEUE is not set -CONFIG_IP6_NF_IPTABLES=m -CONFIG_IP6_NF_MATCH_LIMIT=m -CONFIG_IP6_NF_MATCH_MAC=m -CONFIG_IP6_NF_MATCH_RT=m -CONFIG_IP6_NF_MATCH_OPTS=m -CONFIG_IP6_NF_MATCH_FRAG=m -CONFIG_IP6_NF_MATCH_HL=m -CONFIG_IP6_NF_MATCH_MULTIPORT=m -CONFIG_IP6_NF_MATCH_OWNER=m -CONFIG_IP6_NF_MATCH_MARK=m -CONFIG_IP6_NF_MATCH_IPV6HEADER=m -CONFIG_IP6_NF_MATCH_AHESP=m -CONFIG_IP6_NF_MATCH_LENGTH=m -CONFIG_IP6_NF_MATCH_EUI64=m -CONFIG_IP6_NF_FILTER=m -CONFIG_IP6_NF_TARGET_LOG=m -CONFIG_IP6_NF_MANGLE=m -CONFIG_IP6_NF_TARGET_MARK=m -# CONFIG_KHTTPD is not set -CONFIG_ATM=y -CONFIG_ATM_CLIP=y -# CONFIG_ATM_CLIP_NO_ICMP is not set -CONFIG_ATM_LANE=m -CONFIG_ATM_MPOA=m -CONFIG_ATM_BR2684=m -CONFIG_ATM_BR2684_IPFILTER=y -CONFIG_VLAN_8021Q=m - -# -# -# -CONFIG_IPX=m -# CONFIG_IPX_INTERN is not set -CONFIG_ATALK=m - -# -# Appletalk devices -# -CONFIG_DEV_APPLETALK=y -CONFIG_LTPC=m -CONFIG_COPS=m -CONFIG_COPS_DAYNA=y -CONFIG_COPS_TANGENT=y -CONFIG_IPDDP=m -CONFIG_IPDDP_ENCAP=y -CONFIG_IPDDP_DECAP=y -CONFIG_DECNET=m -CONFIG_DECNET_SIOCGIFCONF=y -CONFIG_DECNET_ROUTER=y -CONFIG_DECNET_ROUTE_FWMARK=y -CONFIG_BRIDGE=m -# CONFIG_X25 is not set -# CONFIG_LAPB is not set -# CONFIG_LLC is not set -CONFIG_NET_DIVERT=y -# CONFIG_ECONET is not set -CONFIG_WAN_ROUTER=m -# CONFIG_NET_FASTROUTE is not set -# CONFIG_NET_HW_FLOWCONTROL is not set - -# -# QoS and/or fair queueing -# -CONFIG_NET_SCHED=y -CONFIG_NET_SCH_CBQ=m -CONFIG_NET_SCH_HTB=m -CONFIG_NET_SCH_CSZ=m -# CONFIG_NET_SCH_ATM is not set -CONFIG_NET_SCH_PRIO=m -CONFIG_NET_SCH_RED=m -CONFIG_NET_SCH_SFQ=m -CONFIG_NET_SCH_TEQL=m -CONFIG_NET_SCH_TBF=m -CONFIG_NET_SCH_GRED=m -CONFIG_NET_SCH_DSMARK=m -CONFIG_NET_SCH_INGRESS=m -CONFIG_NET_QOS=y -CONFIG_NET_ESTIMATOR=y -CONFIG_NET_CLS=y -CONFIG_NET_CLS_TCINDEX=m -CONFIG_NET_CLS_ROUTE4=m -CONFIG_NET_CLS_ROUTE=y -CONFIG_NET_CLS_FW=m -CONFIG_NET_CLS_U32=m -CONFIG_NET_CLS_RSVP=m -CONFIG_NET_CLS_RSVP6=m -CONFIG_NET_CLS_POLICE=y - -# -# Network testing -# -# CONFIG_NET_PKTGEN is not set - -# -# Telephony Support -# -CONFIG_PHONE=m -CONFIG_PHONE_IXJ=m -CONFIG_PHONE_IXJ_PCMCIA=m - -# -# ATA/IDE/MFM/RLL support -# -CONFIG_IDE=y - -# -# IDE, ATA and ATAPI Block devices -# -CONFIG_BLK_DEV_IDE=y - -# -# Please see Documentation/ide.txt for help/info on IDE drives -# -# CONFIG_BLK_DEV_HD_IDE is not set -# CONFIG_BLK_DEV_HD is not set -CONFIG_BLK_DEV_IDEDISK=y -CONFIG_IDEDISK_MULTI_MODE=y -# CONFIG_IDEDISK_STROKE is not set -CONFIG_BLK_DEV_IDECS=m -CONFIG_BLK_DEV_IDECD=m -CONFIG_BLK_DEV_IDETAPE=m -CONFIG_BLK_DEV_IDEFLOPPY=y -CONFIG_BLK_DEV_IDESCSI=m -# CONFIG_IDE_TASK_IOCTL is not set - -# -# IDE chipset support/bugfixes -# -CONFIG_BLK_DEV_CMD640=y -# CONFIG_BLK_DEV_CMD640_ENHANCED is not set -CONFIG_BLK_DEV_ISAPNP=y -CONFIG_BLK_DEV_IDEPCI=y -CONFIG_BLK_DEV_GENERIC=y -CONFIG_IDEPCI_SHARE_IRQ=y -CONFIG_BLK_DEV_IDEDMA_PCI=y -# CONFIG_BLK_DEV_OFFBOARD is not set -# CONFIG_BLK_DEV_IDEDMA_FORCED is not set -CONFIG_IDEDMA_PCI_AUTO=y -# CONFIG_IDEDMA_ONLYDISK is not set -CONFIG_BLK_DEV_IDEDMA=y -# CONFIG_IDEDMA_PCI_WIP is not set -CONFIG_BLK_DEV_ADMA100=y -CONFIG_BLK_DEV_AEC62XX=y -CONFIG_BLK_DEV_ALI15X3=y -# CONFIG_WDC_ALI15X3 is not set -CONFIG_BLK_DEV_AMD74XX=y -# CONFIG_AMD74XX_OVERRIDE is not set -CONFIG_BLK_DEV_CMD64X=y -CONFIG_BLK_DEV_TRIFLEX=y -CONFIG_BLK_DEV_CY82C693=y -CONFIG_BLK_DEV_CS5530=y -CONFIG_BLK_DEV_HPT34X=y -# CONFIG_HPT34X_AUTODMA is not set -CONFIG_BLK_DEV_HPT366=y -CONFIG_BLK_DEV_PIIX=y -# CONFIG_BLK_DEV_NS87415 is not set -# CONFIG_BLK_DEV_OPTI621 is not set -CONFIG_BLK_DEV_PDC202XX_OLD=y -# CONFIG_PDC202XX_BURST is not set -CONFIG_BLK_DEV_PDC202XX_NEW=y -CONFIG_PDC202XX_FORCE=y -CONFIG_BLK_DEV_RZ1000=y -# CONFIG_BLK_DEV_SC1200 is not set -CONFIG_BLK_DEV_SVWKS=y -CONFIG_BLK_DEV_SIIMAGE=y -CONFIG_BLK_DEV_SIS5513=y -CONFIG_BLK_DEV_SLC90E66=y -# CONFIG_BLK_DEV_TRM290 is not set -CONFIG_BLK_DEV_VIA82CXXX=y -# CONFIG_IDE_CHIPSETS is not set -CONFIG_IDEDMA_AUTO=y -# CONFIG_IDEDMA_IVB is not set -# CONFIG_DMA_NONPCI is not set -CONFIG_BLK_DEV_PDC202XX=y -CONFIG_BLK_DEV_IDE_MODES=y -CONFIG_BLK_DEV_ATARAID=m -CONFIG_BLK_DEV_ATARAID_PDC=m -CONFIG_BLK_DEV_ATARAID_HPT=m -CONFIG_BLK_DEV_ATARAID_SII=m - -# -# SCSI support -# -CONFIG_SCSI=m - -# -# SCSI support type (disk, tape, CD-ROM) -# -CONFIG_BLK_DEV_SD=m -CONFIG_SD_EXTRA_DEVS=40 -CONFIG_CHR_DEV_ST=m -CONFIG_CHR_DEV_OSST=m -CONFIG_BLK_DEV_SR=m -CONFIG_BLK_DEV_SR_VENDOR=y -CONFIG_SR_EXTRA_DEVS=4 -CONFIG_CHR_DEV_SG=m - -# -# Some SCSI devices (e.g. CD jukebox) support multiple LUNs -# -# CONFIG_SCSI_DEBUG_QUEUES is not set -# CONFIG_SCSI_MULTI_LUN is not set -CONFIG_SCSI_CONSTANTS=y -CONFIG_SCSI_LOGGING=y - -# -# SCSI low-level drivers -# -CONFIG_BLK_DEV_3W_XXXX_RAID=m -CONFIG_SCSI_7000FASST=m -CONFIG_SCSI_ACARD=m -CONFIG_SCSI_AHA152X=m -CONFIG_SCSI_AHA1542=m -CONFIG_SCSI_AHA1740=m -CONFIG_SCSI_AACRAID=m -CONFIG_SCSI_AIC7XXX=m -CONFIG_AIC7XXX_CMDS_PER_DEVICE=253 -CONFIG_AIC7XXX_RESET_DELAY_MS=15000 -# CONFIG_AIC7XXX_PROBE_EISA_VL is not set -# CONFIG_AIC7XXX_BUILD_FIRMWARE is not set -CONFIG_SCSI_AIC79XX=m -CONFIG_AIC79XX_CMDS_PER_DEVICE=253 -CONFIG_AIC79XX_RESET_DELAY_MS=15000 -# CONFIG_AIC79XX_BUILD_FIRMWARE is not set -CONFIG_AIC79XX_ENABLE_RD_STRM=y -# CONFIG_AIC79XX_DEBUG_ENABLE is not set -CONFIG_AIC79XX_DEBUG_MASK=0 -CONFIG_SCSI_AIC7XXX_OLD=m -CONFIG_AIC7XXX_OLD_TCQ_ON_BY_DEFAULT=y -CONFIG_AIC7XXX_OLD_CMDS_PER_DEVICE=32 -CONFIG_AIC7XXX_OLD_PROC_STATS=y -CONFIG_SCSI_DPT_I2O=m -CONFIG_SCSI_ADVANSYS=m -CONFIG_SCSI_IN2000=m -CONFIG_SCSI_AM53C974=m -CONFIG_SCSI_MEGARAID=m -CONFIG_SCSI_BUSLOGIC=m -# CONFIG_SCSI_OMIT_FLASHPOINT is not set -CONFIG_SCSI_CPQFCTS=m -CONFIG_SCSI_DMX3191D=m -CONFIG_SCSI_DTC3280=m -CONFIG_SCSI_EATA=m -CONFIG_SCSI_EATA_TAGGED_QUEUE=y -# CONFIG_SCSI_EATA_LINKED_COMMANDS is not set -CONFIG_SCSI_EATA_MAX_TAGS=16 -CONFIG_SCSI_EATA_DMA=m -CONFIG_SCSI_EATA_PIO=m -CONFIG_SCSI_FUTURE_DOMAIN=m -CONFIG_SCSI_GDTH=m -CONFIG_SCSI_GENERIC_NCR5380=m -# CONFIG_SCSI_GENERIC_NCR53C400 is not set -CONFIG_SCSI_G_NCR5380_PORT=y -# CONFIG_SCSI_G_NCR5380_MEM is not set -CONFIG_SCSI_IPS=m -CONFIG_SCSI_INITIO=m -CONFIG_SCSI_INIA100=m -CONFIG_SCSI_PPA=m -CONFIG_SCSI_IMM=m -# CONFIG_SCSI_IZIP_EPP16 is not set -# CONFIG_SCSI_IZIP_SLOW_CTR is not set -CONFIG_SCSI_NCR53C406A=m -CONFIG_SCSI_NCR53C7xx=m -# CONFIG_SCSI_NCR53C7xx_sync is not set -CONFIG_SCSI_NCR53C7xx_FAST=y -CONFIG_SCSI_NCR53C7xx_DISCONNECT=y -CONFIG_SCSI_SYM53C8XX_2=m -CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=1 -CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16 -CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64 -# CONFIG_SCSI_SYM53C8XX_IOMAPPED is not set -CONFIG_SCSI_NCR53C8XX=m -CONFIG_SCSI_SYM53C8XX=m -CONFIG_SCSI_NCR53C8XX_DEFAULT_TAGS=8 -CONFIG_SCSI_NCR53C8XX_MAX_TAGS=32 -CONFIG_SCSI_NCR53C8XX_SYNC=40 -# CONFIG_SCSI_NCR53C8XX_PROFILE is not set -# CONFIG_SCSI_NCR53C8XX_IOMAPPED is not set -# CONFIG_SCSI_NCR53C8XX_PQS_PDS is not set -# CONFIG_SCSI_NCR53C8XX_SYMBIOS_COMPAT is not set -CONFIG_SCSI_PAS16=m -CONFIG_SCSI_PCI2000=m -CONFIG_SCSI_PCI2220I=m -CONFIG_SCSI_PSI240I=m -CONFIG_SCSI_QLOGIC_FAS=m -CONFIG_SCSI_QLOGIC_ISP=m -CONFIG_SCSI_QLOGIC_FC=m -# CONFIG_SCSI_QLOGIC_FC_FIRMWARE is not set -CONFIG_SCSI_QLOGIC_1280=m -CONFIG_SCSI_NEWISP=m -CONFIG_SCSI_SEAGATE=m -CONFIG_SCSI_SIM710=m -CONFIG_SCSI_SYM53C416=m -CONFIG_SCSI_DC390T=m -# CONFIG_SCSI_DC390T_NOGENSUPP is not set -CONFIG_SCSI_T128=m -CONFIG_SCSI_U14_34F=m -# CONFIG_SCSI_U14_34F_LINKED_COMMANDS is not set -CONFIG_SCSI_U14_34F_MAX_TAGS=8 -CONFIG_SCSI_ULTRASTOR=m -CONFIG_SCSI_NSP32=m -CONFIG_SCSI_DEBUG=m - -# -# PCMCIA SCSI adapter support -# -CONFIG_SCSI_PCMCIA=y -CONFIG_PCMCIA_AHA152X=m -CONFIG_PCMCIA_FDOMAIN=m -CONFIG_PCMCIA_NINJA_SCSI=m -CONFIG_PCMCIA_QLOGIC=m - -# -# Fusion MPT device support -# -CONFIG_FUSION=m -# CONFIG_FUSION_BOOT is not set -CONFIG_FUSION_MAX_SGE=40 -# CONFIG_FUSION_ISENSE is not set -CONFIG_FUSION_CTL=m -CONFIG_FUSION_LAN=m -CONFIG_NET_FC=y - -# -# IEEE 1394 (FireWire) support (EXPERIMENTAL) -# -CONFIG_IEEE1394=m - -# -# Device Drivers -# -# CONFIG_IEEE1394_PCILYNX is not set -CONFIG_IEEE1394_OHCI1394=m - -# -# Protocol Drivers -# -CONFIG_IEEE1394_VIDEO1394=m -CONFIG_IEEE1394_SBP2=m -CONFIG_IEEE1394_SBP2_PHYS_DMA=y -CONFIG_IEEE1394_ETH1394=m -CONFIG_IEEE1394_DV1394=m -CONFIG_IEEE1394_RAWIO=m -CONFIG_IEEE1394_CMP=m -CONFIG_IEEE1394_AMDTP=m -# CONFIG_IEEE1394_VERBOSEDEBUG is not set - -# -# I2O device support -# -CONFIG_I2O=m -CONFIG_I2O_PCI=m -CONFIG_I2O_BLOCK=m -CONFIG_I2O_LAN=m -CONFIG_I2O_SCSI=m -CONFIG_I2O_PROC=m - -# -# Network device support -# -CONFIG_NETDEVICES=y - -# -# ARCnet devices -# -# CONFIG_ARCNET is not set -CONFIG_DUMMY=m -CONFIG_BONDING=m -CONFIG_EQUALIZER=m -CONFIG_TUN=m -CONFIG_ETHERTAP=m -CONFIG_NET_SB1000=m - -# -# Ethernet (10 or 100Mbit) -# -CONFIG_NET_ETHERNET=y -# CONFIG_SUNLANCE is not set -CONFIG_HAPPYMEAL=m -# CONFIG_SUNBMAC is not set -# CONFIG_SUNQE is not set -CONFIG_SUNGEM=m -CONFIG_NET_VENDOR_3COM=y -CONFIG_EL1=m -CONFIG_EL2=m -CONFIG_ELPLUS=m -CONFIG_EL16=m -CONFIG_EL3=m -CONFIG_3C515=m -# CONFIG_ELMC is not set -# CONFIG_ELMC_II is not set -CONFIG_VORTEX=m -CONFIG_TYPHOON=m -CONFIG_LANCE=m -CONFIG_NET_VENDOR_SMC=y -CONFIG_WD80x3=m -# CONFIG_ULTRAMCA is not set -CONFIG_ULTRA=m -CONFIG_ULTRA32=m -CONFIG_SMC9194=m -CONFIG_NET_VENDOR_RACAL=y -CONFIG_NI5010=m -CONFIG_NI52=m -CONFIG_NI65=m -CONFIG_AT1700=m -CONFIG_DEPCA=m -CONFIG_HP100=m -CONFIG_NET_ISA=y -CONFIG_E2100=m -CONFIG_EWRK3=m -CONFIG_EEXPRESS=m -CONFIG_EEXPRESS_PRO=m -CONFIG_HPLAN_PLUS=m -CONFIG_HPLAN=m -CONFIG_LP486E=m -CONFIG_ETH16I=m -CONFIG_NE2000=m -CONFIG_NET_PCI=y -CONFIG_PCNET32=m -CONFIG_AMD8111_ETH=m -CONFIG_ADAPTEC_STARFIRE=m -CONFIG_AC3200=m -CONFIG_APRICOT=m -CONFIG_CS89x0=m -CONFIG_TULIP=m -# CONFIG_TULIP_MWI is not set -CONFIG_TULIP_MMIO=y -CONFIG_DE4X5=m -CONFIG_DGRS=m -CONFIG_DM9102=m -CONFIG_EEPRO100=m -# CONFIG_EEPRO100_PIO is not set -CONFIG_E100=m -CONFIG_LNE390=m -CONFIG_FEALNX=m -CONFIG_NATSEMI=m -CONFIG_NE2K_PCI=m -CONFIG_NE3210=m -CONFIG_ES3210=m -CONFIG_8139CP=m -CONFIG_8139TOO=m -# CONFIG_8139TOO_PIO is not set -# CONFIG_8139TOO_TUNE_TWISTER is not set -CONFIG_8139TOO_8129=y -# CONFIG_8139_OLD_RX_RESET is not set -CONFIG_SIS900=m -CONFIG_EPIC100=m -CONFIG_SUNDANCE=m -# CONFIG_SUNDANCE_MMIO is not set -CONFIG_TLAN=m -CONFIG_TC35815=m -CONFIG_VIA_RHINE=m -# CONFIG_VIA_RHINE_MMIO is not set -CONFIG_WINBOND_840=m -CONFIG_NET_POCKET=y -CONFIG_ATP=m -CONFIG_DE600=m -CONFIG_DE620=m - -# -# Ethernet (1000 Mbit) -# -CONFIG_ACENIC=m -# CONFIG_ACENIC_OMIT_TIGON_I is not set -CONFIG_DL2K=m -CONFIG_E1000=m -# CONFIG_MYRI_SBUS is not set -CONFIG_NS83820=m -CONFIG_HAMACHI=m -CONFIG_YELLOWFIN=m -CONFIG_R8169=m -CONFIG_SK98LIN=m -CONFIG_TIGON3=m -CONFIG_FDDI=y -CONFIG_DEFXX=m -CONFIG_SKFP=m -CONFIG_NETCONSOLE=m -# CONFIG_HIPPI is not set -CONFIG_PLIP=m -CONFIG_PPP=m -CONFIG_PPP_MULTILINK=y -CONFIG_PPP_FILTER=y -CONFIG_PPP_ASYNC=m -CONFIG_PPP_SYNC_TTY=m -CONFIG_PPP_DEFLATE=m -# CONFIG_PPP_BSDCOMP is not set -CONFIG_PPPOE=m -CONFIG_PPPOATM=m -CONFIG_SLIP=m -CONFIG_SLIP_COMPRESSED=y -CONFIG_SLIP_SMART=y -CONFIG_SLIP_MODE_SLIP6=y - -# -# Wireless LAN (non-hamradio) -# -CONFIG_NET_RADIO=y -CONFIG_STRIP=m -CONFIG_WAVELAN=m -CONFIG_ARLAN=m -CONFIG_AIRONET4500=m -CONFIG_AIRONET4500_NONCS=m -CONFIG_AIRONET4500_PNP=y -CONFIG_AIRONET4500_PCI=y -CONFIG_AIRONET4500_ISA=y -CONFIG_AIRONET4500_I365=y -CONFIG_AIRONET4500_PROC=m -CONFIG_AIRO=m -CONFIG_HERMES=m -CONFIG_PLX_HERMES=m -CONFIG_PCI_HERMES=m - -# -# Wireless Pcmcia cards support -# -CONFIG_PCMCIA_HERMES=m -CONFIG_AIRO_CS=m -CONFIG_NET_WIRELESS=y - -# -# Wireless Pcmcia cards support -# -CONFIG_PCMCIA_HERMES_OLD=m - -# -# Token Ring devices -# -CONFIG_TR=y -CONFIG_IBMTR=m -CONFIG_IBMOL=m -CONFIG_IBMLS=m -CONFIG_3C359=m -CONFIG_TMS380TR=m -CONFIG_TMSPCI=m -CONFIG_TMSISA=m -CONFIG_ABYSS=m -# CONFIG_MADGEMC is not set -CONFIG_SMCTR=m -CONFIG_NET_FC=y -CONFIG_IPHASE5526=m -CONFIG_RCPCI=m -CONFIG_SHAPER=m - -# -# Wan interfaces -# -CONFIG_WAN=y -CONFIG_HOSTESS_SV11=m -CONFIG_COSA=m -# CONFIG_COMX is not set -# CONFIG_DSCC4 is not set -# CONFIG_LANMEDIA is not set -CONFIG_ATI_XX20=m -CONFIG_SEALEVEL_4021=m -# CONFIG_SYNCLINK_SYNCPPP is not set -# CONFIG_HDLC is not set -CONFIG_DLCI=m -CONFIG_DLCI_COUNT=24 -CONFIG_DLCI_MAX=8 -CONFIG_SDLA=m -CONFIG_WAN_ROUTER_DRIVERS=y -CONFIG_VENDOR_SANGOMA=m -CONFIG_WANPIPE_CHDLC=y -CONFIG_WANPIPE_FR=y -CONFIG_WANPIPE_X25=y -CONFIG_WANPIPE_PPP=y -CONFIG_WANPIPE_MULTPPP=y -CONFIG_CYCLADES_SYNC=m -CONFIG_CYCLOMX_X25=y -# CONFIG_LAPBETHER is not set -# CONFIG_X25_ASY is not set -CONFIG_SBNI=m -CONFIG_SBNI_MULTILINE=y - -# -# PCMCIA network device support -# -CONFIG_NET_PCMCIA=y -CONFIG_PCMCIA_3C589=m -CONFIG_PCMCIA_3C574=m -CONFIG_PCMCIA_FMVJ18X=m -CONFIG_PCMCIA_PCNET=m -CONFIG_PCMCIA_AXNET=m -CONFIG_PCMCIA_NMCLAN=m -CONFIG_PCMCIA_SMC91C92=m -CONFIG_PCMCIA_XIRC2PS=m -# CONFIG_ARCNET_COM20020_CS is not set -CONFIG_PCMCIA_IBMTR=m -CONFIG_PCMCIA_XIRCOM=m -CONFIG_PCMCIA_XIRTULIP=m -CONFIG_NET_PCMCIA_RADIO=y -CONFIG_PCMCIA_RAYCS=m -CONFIG_PCMCIA_NETWAVE=m -CONFIG_PCMCIA_WAVELAN=m -CONFIG_PCMCIA_WVLAN=m -CONFIG_AIRONET4500_CS=m - -# -# ATM drivers -# -CONFIG_ATM_TCP=m -CONFIG_ATM_LANAI=m -CONFIG_ATM_ENI=m -# CONFIG_ATM_ENI_DEBUG is not set -# CONFIG_ATM_ENI_TUNE_BURST is not set -CONFIG_ATM_FIRESTREAM=m -CONFIG_ATM_ZATM=m -# CONFIG_ATM_ZATM_DEBUG is not set -CONFIG_ATM_ZATM_EXACT_TS=y -CONFIG_ATM_NICSTAR=m -CONFIG_ATM_NICSTAR_USE_SUNI=y -CONFIG_ATM_NICSTAR_USE_IDT77105=y -CONFIG_ATM_IDT77252=m -# CONFIG_ATM_IDT77252_DEBUG is not set -# CONFIG_ATM_IDT77252_RCV_ALL is not set -CONFIG_ATM_IDT77252_USE_SUNI=y -CONFIG_ATM_AMBASSADOR=m -# CONFIG_ATM_AMBASSADOR_DEBUG is not set -CONFIG_ATM_HORIZON=m -# CONFIG_ATM_HORIZON_DEBUG is not set -CONFIG_ATM_IA=m -# CONFIG_ATM_IA_DEBUG is not set -CONFIG_ATM_FORE200E_MAYBE=m -CONFIG_ATM_FORE200E_PCA=y -CONFIG_ATM_FORE200E_PCA_DEFAULT_FW=y -CONFIG_ATM_FORE200E_TX_RETRY=16 -CONFIG_ATM_FORE200E_DEBUG=0 -CONFIG_ATM_FORE200E=m - -# -# Amateur Radio support -# -CONFIG_HAMRADIO=y - -# -# Packet Radio protocols -# -CONFIG_AX25=m -# CONFIG_AX25_DAMA_SLAVE is not set -CONFIG_NETROM=m -CONFIG_ROSE=m - -# -# AX.25 network device drivers -# - -# -# AX.25 network device drivers -# -# CONFIG_MKISS is not set -# CONFIG_6PACK is not set -# CONFIG_BPQETHER is not set -# CONFIG_DMASCC is not set -# CONFIG_SCC is not set -# CONFIG_BAYCOM_SER_FDX is not set -# CONFIG_BAYCOM_SER_HDX is not set -# CONFIG_BAYCOM_PAR is not set -# CONFIG_BAYCOM_EPP is not set -CONFIG_SOUNDMODEM=m -CONFIG_SOUNDMODEM_SBC=y -CONFIG_SOUNDMODEM_WSS=y -CONFIG_SOUNDMODEM_AFSK1200=y -CONFIG_SOUNDMODEM_AFSK2400_7=y -CONFIG_SOUNDMODEM_AFSK2400_8=y -CONFIG_SOUNDMODEM_AFSK2666=y -CONFIG_SOUNDMODEM_HAPN4800=y -CONFIG_SOUNDMODEM_PSK4800=y -CONFIG_SOUNDMODEM_FSK9600=y -# CONFIG_YAM is not set - -# -# IrDA (infrared) support -# -CONFIG_IRDA=m - -# -# IrDA protocols -# -CONFIG_IRLAN=m -CONFIG_IRNET=m -CONFIG_IRCOMM=m -CONFIG_IRDA_ULTRA=y - -# -# IrDA options -# -CONFIG_IRDA_CACHE_LAST_LSAP=y -CONFIG_IRDA_FAST_RR=y -# CONFIG_IRDA_DEBUG is not set - -# -# Infrared-port device drivers -# - -# -# SIR device drivers -# -CONFIG_IRTTY_SIR=m -CONFIG_IRPORT_SIR=m - -# -# Dongle support -# -CONFIG_DONGLE=y -CONFIG_ESI_DONGLE=m -CONFIG_ACTISYS_DONGLE=m -CONFIG_TEKRAM_DONGLE=m -CONFIG_GIRBIL_DONGLE=m -CONFIG_LITELINK_DONGLE=m -CONFIG_MCP2120_DONGLE=m -CONFIG_OLD_BELKIN_DONGLE=m -CONFIG_ACT200L_DONGLE=m -CONFIG_MA600_DONGLE=m - -# -# FIR device drivers -# -CONFIG_USB_IRDA=m -CONFIG_NSC_FIR=m -CONFIG_WINBOND_FIR=m -CONFIG_TOSHIBA_OLD=m -CONFIG_TOSHIBA_FIR=m -CONFIG_SMC_IRCC_FIR=m -CONFIG_ALI_FIR=m -CONFIG_VLSI_FIR=m - -# -# ISDN subsystem -# -CONFIG_ISDN=m -CONFIG_ISDN_BOOL=y -CONFIG_ISDN_PPP=y -CONFIG_ISDN_PPP_VJ=y -CONFIG_ISDN_MPP=y -CONFIG_ISDN_PPP_BSDCOMP=m -CONFIG_ISDN_AUDIO=y -CONFIG_ISDN_TTY_FAX=y - -# -# ISDN feature submodules -# -CONFIG_ISDN_DRV_LOOP=m -# CONFIG_ISDN_DIVERSION is not set - -# -# low-level hardware drivers -# - -# -# Passive ISDN cards -# -CONFIG_ISDN_DRV_HISAX=m -CONFIG_ISDN_HISAX=y - -# -# D-channel protocol features -# -CONFIG_HISAX_EURO=y -CONFIG_DE_AOC=y -# CONFIG_HISAX_NO_SENDCOMPLETE is not set -# CONFIG_HISAX_NO_LLC is not set -# CONFIG_HISAX_NO_KEYPAD is not set -CONFIG_HISAX_1TR6=y -CONFIG_HISAX_NI1=y -CONFIG_HISAX_MAX_CARDS=8 - -# -# HiSax supported cards -# -CONFIG_HISAX_16_0=y -CONFIG_HISAX_16_3=y -CONFIG_HISAX_AVM_A1=y -CONFIG_HISAX_IX1MICROR2=y -CONFIG_HISAX_ASUSCOM=y -CONFIG_HISAX_TELEINT=y -CONFIG_HISAX_HFCS=y -CONFIG_HISAX_SPORTSTER=y -CONFIG_HISAX_MIC=y -CONFIG_HISAX_ISURF=y -CONFIG_HISAX_HSTSAPHIR=y -CONFIG_HISAX_TELESPCI=y -CONFIG_HISAX_S0BOX=y -CONFIG_HISAX_FRITZPCI=y -CONFIG_HISAX_AVM_A1_PCMCIA=y -CONFIG_HISAX_ELSA=y -CONFIG_HISAX_DIEHLDIVA=y -CONFIG_HISAX_SEDLBAUER=y -CONFIG_HISAX_NETJET=y -CONFIG_HISAX_NETJET_U=y -CONFIG_HISAX_NICCY=y -CONFIG_HISAX_BKM_A4T=y -CONFIG_HISAX_SCT_QUADRO=y -CONFIG_HISAX_GAZEL=y -CONFIG_HISAX_HFC_PCI=y -CONFIG_HISAX_W6692=y -CONFIG_HISAX_HFC_SX=y -CONFIG_HISAX_ENTERNOW_PCI=y -CONFIG_HISAX_DEBUG=y -CONFIG_HISAX_SEDLBAUER_CS=m -CONFIG_HISAX_ELSA_CS=m -CONFIG_HISAX_AVM_A1_CS=m -CONFIG_HISAX_ST5481=m -CONFIG_HISAX_FRITZ_PCIPNP=m -CONFIG_USB_AUERISDN=m - -# -# Active ISDN cards -# -CONFIG_ISDN_DRV_ICN=m -CONFIG_ISDN_DRV_PCBIT=m -# CONFIG_ISDN_DRV_SC is not set -# CONFIG_ISDN_DRV_ACT2000 is not set -CONFIG_ISDN_DRV_EICON=y -CONFIG_ISDN_DRV_EICON_DIVAS=m -# CONFIG_ISDN_DRV_EICON_OLD is not set -CONFIG_ISDN_DRV_TPAM=m -CONFIG_ISDN_CAPI=m -CONFIG_ISDN_DRV_AVMB1_VERBOSE_REASON=y -CONFIG_ISDN_CAPI_MIDDLEWARE=y -CONFIG_ISDN_CAPI_CAPI20=m -CONFIG_ISDN_CAPI_CAPIFS_BOOL=y -CONFIG_ISDN_CAPI_CAPIFS=m -CONFIG_ISDN_CAPI_CAPIDRV=m -CONFIG_ISDN_DRV_AVMB1_B1ISA=m -CONFIG_ISDN_DRV_AVMB1_B1PCI=m -CONFIG_ISDN_DRV_AVMB1_B1PCIV4=y -CONFIG_ISDN_DRV_AVMB1_T1ISA=m -CONFIG_ISDN_DRV_AVMB1_B1PCMCIA=m -CONFIG_ISDN_DRV_AVMB1_AVM_CS=m -CONFIG_ISDN_DRV_AVMB1_T1PCI=m -CONFIG_ISDN_DRV_AVMB1_C4=m -CONFIG_HYSDN=m -CONFIG_HYSDN_CAPI=y -CONFIG_KALLSYMS=y - -# -# Old CD-ROM drivers (not SCSI, not IDE) -# -# CONFIG_CD_NO_IDESCSI is not set - -# -# Input core support -# -CONFIG_INPUT=m -CONFIG_INPUT_KEYBDEV=m -CONFIG_INPUT_MOUSEDEV=m -CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 -CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 -CONFIG_INPUT_JOYDEV=m -CONFIG_INPUT_EVDEV=m - -# -# Character devices -# -CONFIG_VT=y -CONFIG_ECC=m -CONFIG_VT_CONSOLE=y -CONFIG_SERIAL=y -CONFIG_SERIAL_CONSOLE=y -CONFIG_SERIAL_EXTENDED=y -CONFIG_SERIAL_MANY_PORTS=y -CONFIG_SERIAL_SHARE_IRQ=y -# CONFIG_SERIAL_DETECT_IRQ is not set -CONFIG_SERIAL_MULTIPORT=y -# CONFIG_HUB6 is not set -CONFIG_SERIAL_NONSTANDARD=y -CONFIG_COMPUTONE=m -CONFIG_ROCKETPORT=m -CONFIG_CYCLADES=m -# CONFIG_CYZ_INTR is not set -CONFIG_DIGIEPCA=m -CONFIG_ESPSERIAL=m -CONFIG_MOXA_INTELLIO=m -CONFIG_MOXA_SMARTIO=m -CONFIG_ISI=m -CONFIG_SYNCLINK=m -# CONFIG_SYNCLINKMP is not set -CONFIG_N_HDLC=m -CONFIG_RISCOM8=m -CONFIG_SPECIALIX=m -CONFIG_SPECIALIX_RTSCTS=y -CONFIG_SX=m -# CONFIG_RIO is not set -CONFIG_STALDRV=y -CONFIG_STALLION=m -CONFIG_ISTALLION=m -CONFIG_UNIX98_PTYS=y -CONFIG_UNIX98_PTY_COUNT=512 -CONFIG_PRINTER=m -CONFIG_LP_CONSOLE=y -CONFIG_PPDEV=m -CONFIG_TIPAR=m - -# -# I2C support -# -CONFIG_I2C=m -CONFIG_I2C_ALGOBIT=m -CONFIG_I2C_PHILIPSPAR=m -CONFIG_I2C_ELV=m -CONFIG_I2C_VELLEMAN=m -# CONFIG_SCx200_I2C is not set -# CONFIG_SCx200_ACB is not set -CONFIG_I2C_ALGOPCF=m -CONFIG_I2C_ELEKTOR=m -CONFIG_I2C_MAINBOARD=y -CONFIG_I2C_ALI1535=m -CONFIG_I2C_ALI15X3=m -CONFIG_I2C_HYDRA=m -CONFIG_I2C_AMD756=m -# CONFIG_I2C_TSUNAMI is not set -CONFIG_I2C_I801=m -# CONFIG_I2C_I810 is not set -CONFIG_I2C_PIIX4=m -CONFIG_I2C_SIS5595=m -CONFIG_I2C_VIA=m -CONFIG_I2C_VIAPRO=m -CONFIG_I2C_VOODOO3=m -CONFIG_I2C_ISA=m -CONFIG_I2C_CHARDEV=m -CONFIG_I2C_PROC=m - -# -# Hardware sensors support -# -CONFIG_SENSORS=y -CONFIG_SENSORS_ADM1021=m -CONFIG_SENSORS_ADM1024=m -CONFIG_SENSORS_ADM1025=m -CONFIG_SENSORS_ADM9240=m -CONFIG_SENSORS_DS1621=m -CONFIG_SENSORS_FSCPOS=m -CONFIG_SENSORS_FSCSCY=m -CONFIG_SENSORS_GL518SM=m -CONFIG_SENSORS_GL520SM=m -CONFIG_SENSORS_MAXILIFE=m -CONFIG_SENSORS_IT87=m -CONFIG_SENSORS_MTP008=m -CONFIG_SENSORS_LM75=m -CONFIG_SENSORS_LM78=m -CONFIG_SENSORS_LM80=m -CONFIG_SENSORS_LM87=m -CONFIG_SENSORS_LM92=m -CONFIG_SENSORS_SIS5595=m -CONFIG_SENSORS_SMSC47M1=m -CONFIG_SENSORS_THMC50=m -CONFIG_SENSORS_VIA686A=m -CONFIG_SENSORS_VT1211=m -CONFIG_SENSORS_VT8231=m -CONFIG_SENSORS_W83781D=m -CONFIG_SENSORS_OTHER=y -CONFIG_SENSORS_BT869=m -CONFIG_SENSORS_DDCMON=m -CONFIG_SENSORS_EEPROM=m -CONFIG_SENSORS_MATORB=m -CONFIG_SENSORS_PCF8574=m -CONFIG_SENSORS_PCF8591=m - -# -# Mice -# -CONFIG_BUSMOUSE=m -CONFIG_ATIXL_BUSMOUSE=m -CONFIG_LOGIBUSMOUSE=m -CONFIG_MS_BUSMOUSE=m -CONFIG_MOUSE=y -CONFIG_PSMOUSE=y -CONFIG_82C710_MOUSE=m -CONFIG_PC110_PAD=m -CONFIG_MK712_MOUSE=m - -# -# Joysticks -# -CONFIG_INPUT_GAMEPORT=m -CONFIG_INPUT_NS558=m -CONFIG_INPUT_LIGHTNING=m -CONFIG_INPUT_PCIGAME=m -CONFIG_INPUT_CS461X=m -CONFIG_INPUT_EMU10K1=m -CONFIG_INPUT_SERIO=m -CONFIG_INPUT_SERPORT=m - -# -# Joysticks -# -CONFIG_INPUT_ANALOG=m -CONFIG_INPUT_A3D=m -CONFIG_INPUT_ADI=m -CONFIG_INPUT_COBRA=m -CONFIG_INPUT_GF2K=m -CONFIG_INPUT_GRIP=m -CONFIG_INPUT_INTERACT=m -CONFIG_INPUT_TMDC=m -CONFIG_INPUT_SIDEWINDER=m -CONFIG_INPUT_IFORCE_USB=m -CONFIG_INPUT_IFORCE_232=m -CONFIG_INPUT_WARRIOR=m -CONFIG_INPUT_MAGELLAN=m -CONFIG_INPUT_SPACEORB=m -CONFIG_INPUT_SPACEBALL=m -CONFIG_INPUT_STINGER=m -CONFIG_INPUT_DB9=m -CONFIG_INPUT_GAMECON=m -CONFIG_INPUT_TURBOGRAFX=m -# CONFIG_QIC02_TAPE is not set -# CONFIG_IPMI_HANDLER is not set -# CONFIG_IPMI_PANIC_EVENT is not set -# CONFIG_IPMI_DEVICE_INTERFACE is not set -# CONFIG_IPMI_KCS is not set -# CONFIG_IPMI_WATCHDOG is not set - -# -# Watchdog Cards -# -CONFIG_WATCHDOG=y -# CONFIG_WATCHDOG_NOWAYOUT is not set -CONFIG_ACQUIRE_WDT=m -CONFIG_ADVANTECH_WDT=m -CONFIG_ALIM7101_WDT=m -CONFIG_SC520_WDT=m -CONFIG_PCWATCHDOG=m -CONFIG_EUROTECH_WDT=m -CONFIG_IB700_WDT=m -CONFIG_WAFER_WDT=m -CONFIG_I810_TCO=m -# CONFIG_MIXCOMWD is not set -# CONFIG_60XX_WDT is not set -CONFIG_SC1200_WDT=m -# CONFIG_SCx200_WDT is not set -CONFIG_SOFT_WATCHDOG=m -CONFIG_W83877F_WDT=m -CONFIG_WDT=m -CONFIG_WDTPCI=m -# CONFIG_WDT_501 is not set -CONFIG_MACHZ_WDT=m -CONFIG_AMD7XX_TCO=m -# CONFIG_SCx200_GPIO is not set -CONFIG_AMD_RNG=m -CONFIG_INTEL_RNG=m -CONFIG_AMD_PM768=m -CONFIG_NVRAM=m -CONFIG_RTC=y -CONFIG_DTLK=m -CONFIG_R3964=m -# CONFIG_APPLICOM is not set -CONFIG_SONYPI=m - -# -# Ftape, the floppy tape device driver -# -CONFIG_FTAPE=m -CONFIG_ZFTAPE=m -CONFIG_ZFT_DFLT_BLK_SZ=10240 - -# -# The compressor will be built as a module only! -# -CONFIG_ZFT_COMPRESSOR=m -CONFIG_FT_NR_BUFFERS=3 -# CONFIG_FT_PROC_FS is not set -CONFIG_FT_NORMAL_DEBUG=y -# CONFIG_FT_FULL_DEBUG is not set -# CONFIG_FT_NO_TRACE is not set -# CONFIG_FT_NO_TRACE_AT_ALL is not set - -# -# Hardware configuration -# -CONFIG_FT_STD_FDC=y -# CONFIG_FT_MACH2 is not set -# CONFIG_FT_PROBE_FC10 is not set -# CONFIG_FT_ALT_FDC is not set -CONFIG_FT_FDC_THR=8 -CONFIG_FT_FDC_MAX_RATE=2000 -CONFIG_FT_ALPHA_CLOCK=0 -CONFIG_AGP=m -CONFIG_AGP_INTEL=y -CONFIG_AGP_I810=y -CONFIG_AGP_VIA=y -CONFIG_AGP_AMD=y -CONFIG_AGP_AMD_8151=y -CONFIG_AGP_SIS=y -CONFIG_AGP_ALI=y -CONFIG_AGP_SWORKS=y -# CONFIG_DRM is not set - -# -# PCMCIA character devices -# -CONFIG_PCMCIA_SERIAL_CS=m -CONFIG_SYNCLINK_CS=m -CONFIG_MWAVE=m -CONFIG_BATTERY_GERICOM=m - -# -# Multimedia devices -# -CONFIG_VIDEO_DEV=m - -# -# Video For Linux -# -CONFIG_VIDEO_PROC_FS=y -CONFIG_I2C_PARPORT=m - -# -# Video Adapters -# -CONFIG_VIDEO_BT848=m -CONFIG_VIDEO_PMS=m -CONFIG_VIDEO_BWQCAM=m -CONFIG_VIDEO_CQCAM=m -CONFIG_VIDEO_W9966=m -CONFIG_VIDEO_CPIA=m -CONFIG_VIDEO_CPIA_PP=m -CONFIG_VIDEO_CPIA_USB=m -CONFIG_VIDEO_SAA5249=m -CONFIG_TUNER_3036=m -CONFIG_VIDEO_STRADIS=m -CONFIG_VIDEO_ZORAN=m -CONFIG_VIDEO_ZORAN_BUZ=m -CONFIG_VIDEO_ZORAN_DC10=m -CONFIG_VIDEO_ZORAN_LML33=m -CONFIG_VIDEO_ZR36120=m -CONFIG_VIDEO_MEYE=m - -# -# Radio Adapters -# -CONFIG_RADIO_CADET=m -CONFIG_RADIO_RTRACK=m -CONFIG_RADIO_RTRACK2=m -CONFIG_RADIO_AZTECH=m -CONFIG_RADIO_GEMTEK=m -CONFIG_RADIO_GEMTEK_PCI=m -CONFIG_RADIO_MAXIRADIO=m -CONFIG_RADIO_MAESTRO=m -CONFIG_RADIO_MIROPCM20=m -CONFIG_RADIO_MIROPCM20_RDS=m -CONFIG_RADIO_SF16FMI=m -CONFIG_RADIO_SF16FMR2=m -CONFIG_RADIO_TERRATEC=m -CONFIG_RADIO_TRUST=m -CONFIG_RADIO_TYPHOON=m -CONFIG_RADIO_TYPHOON_PROC_FS=y -CONFIG_RADIO_ZOLTRIX=m - -# -# Crypto Hardware support -# -CONFIG_CRYPTO=m -CONFIG_CRYPTO_BROADCOM=m - -# -# File systems -# -CONFIG_QUOTA=y -# CONFIG_QFMT_V1 is not set -CONFIG_QFMT_V2=y -# CONFIG_QIFACE_COMPAT is not set -CONFIG_AUTOFS_FS=m -CONFIG_AUTOFS4_FS=m -CONFIG_REISERFS_FS=m -# CONFIG_REISERFS_CHECK is not set -CONFIG_REISERFS_PROC_INFO=y -# CONFIG_ADFS_FS is not set -# CONFIG_AFS_FS is not set -# CONFIG_ADFS_FS_RW is not set -# CONFIG_AFFS_FS is not set -CONFIG_HFS_FS=m -CONFIG_BEFS_FS=m -# CONFIG_BEFS_DEBUG is not set -CONFIG_BFS_FS=m -CONFIG_EXT3_FS=m -CONFIG_EXT3_FS_XATTR=y -CONFIG_EXT3_FS_XATTR_SHARING=y -CONFIG_EXT3_FS_XATTR_USER=y -CONFIG_JBD=m -# CONFIG_JBD_DEBUG is not set -CONFIG_FAT_FS=m -CONFIG_MSDOS_FS=m -CONFIG_UMSDOS_FS=m -CONFIG_VFAT_FS=m -# CONFIG_EFS_FS is not set -# CONFIG_JFFS_FS is not set -# CONFIG_JFFS2_FS is not set -CONFIG_CRAMFS=m -CONFIG_TMPFS=y -CONFIG_RAMFS=y -CONFIG_ISO9660_FS=y -CONFIG_JOLIET=y -CONFIG_ZISOFS=y -CONFIG_JFS_FS=m -# CONFIG_JFS_DEBUG is not set -# CONFIG_JFS_STATISTICS is not set -CONFIG_MINIX_FS=m -CONFIG_VXFS_FS=m -# CONFIG_NTFS_FS is not set -# CONFIG_NTFS_RW is not set -# CONFIG_HPFS_FS is not set -CONFIG_PROC_FS=y -# CONFIG_DEVFS_FS is not set -# CONFIG_DEVFS_MOUNT is not set -# CONFIG_DEVFS_DEBUG is not set -CONFIG_DEVPTS_FS=y -# CONFIG_QNX4FS_FS is not set -# CONFIG_QNX4FS_RW is not set -CONFIG_ROMFS_FS=m -CONFIG_EXT2_FS=y -CONFIG_EXT2_FS_XATTR=y -# CONFIG_EXT2_FS_XATTR_SHARING is not set -# CONFIG_EXT2_FS_XATTR_USER is not set -CONFIG_SYSV_FS=m -CONFIG_UDF_FS=m -CONFIG_UDF_RW=y -CONFIG_UFS_FS=m -# CONFIG_UFS_FS_WRITE is not set - -# -# Network File Systems -# -CONFIG_CODA_FS=m -CONFIG_INTERMEZZO_FS=m -CONFIG_NFS_FS=m -CONFIG_NFS_V3=y -# CONFIG_ROOT_NFS is not set -CONFIG_NFSD=m -CONFIG_NFSD_V3=y -# CONFIG_NFSD_TCP is not set -CONFIG_SUNRPC=m -CONFIG_LOCKD=m -CONFIG_LOCKD_V4=y -CONFIG_SMB_FS=m -# CONFIG_SMB_NLS_DEFAULT is not set -CONFIG_NCP_FS=m -CONFIG_NCPFS_PACKET_SIGNING=y -CONFIG_NCPFS_IOCTL_LOCKING=y -CONFIG_NCPFS_STRONG=y -CONFIG_NCPFS_NFS_NS=y -CONFIG_NCPFS_OS2_NS=y -CONFIG_NCPFS_SMALLDOS=y -CONFIG_NCPFS_NLS=y -CONFIG_NCPFS_EXTRAS=y -CONFIG_ZISOFS_FS=y -CONFIG_FS_MBCACHE=y - -# -# Partition Types -# -CONFIG_PARTITION_ADVANCED=y -# CONFIG_ACORN_PARTITION is not set -CONFIG_OSF_PARTITION=y -# CONFIG_AMIGA_PARTITION is not set -# CONFIG_ATARI_PARTITION is not set -CONFIG_MAC_PARTITION=y -CONFIG_MSDOS_PARTITION=y -CONFIG_BSD_DISKLABEL=y -CONFIG_MINIX_SUBPARTITION=y -CONFIG_SOLARIS_X86_PARTITION=y -CONFIG_UNIXWARE_DISKLABEL=y -# CONFIG_LDM_PARTITION is not set -CONFIG_SGI_PARTITION=y -# CONFIG_ULTRIX_PARTITION is not set -CONFIG_SUN_PARTITION=y -# CONFIG_EFI_PARTITION is not set -CONFIG_SMB_NLS=y -CONFIG_NLS=y - -# -# Native Language Support -# -CONFIG_NLS_DEFAULT="iso8859-1" -CONFIG_NLS_CODEPAGE_437=m -CONFIG_NLS_CODEPAGE_737=m -CONFIG_NLS_CODEPAGE_775=m -CONFIG_NLS_CODEPAGE_850=m -CONFIG_NLS_CODEPAGE_852=m -CONFIG_NLS_CODEPAGE_855=m -CONFIG_NLS_CODEPAGE_857=m -CONFIG_NLS_CODEPAGE_860=m -CONFIG_NLS_CODEPAGE_861=m -CONFIG_NLS_CODEPAGE_862=m -CONFIG_NLS_CODEPAGE_863=m -CONFIG_NLS_CODEPAGE_864=m -CONFIG_NLS_CODEPAGE_865=m -CONFIG_NLS_CODEPAGE_866=m -CONFIG_NLS_CODEPAGE_869=m -CONFIG_NLS_CODEPAGE_936=m -CONFIG_NLS_CODEPAGE_950=m -CONFIG_NLS_CODEPAGE_932=m -CONFIG_NLS_CODEPAGE_949=m -CONFIG_NLS_CODEPAGE_874=m -CONFIG_NLS_ISO8859_8=m -CONFIG_NLS_CODEPAGE_1250=m -CONFIG_NLS_CODEPAGE_1251=m -CONFIG_NLS_ISO8859_1=m -CONFIG_NLS_ISO8859_2=m -CONFIG_NLS_ISO8859_3=m -CONFIG_NLS_ISO8859_4=m -CONFIG_NLS_ISO8859_5=m -CONFIG_NLS_ISO8859_6=m -CONFIG_NLS_ISO8859_7=m -CONFIG_NLS_ISO8859_9=m -CONFIG_NLS_ISO8859_13=m -CONFIG_NLS_ISO8859_14=m -CONFIG_NLS_ISO8859_15=m -CONFIG_NLS_KOI8_R=m -CONFIG_NLS_KOI8_U=m -CONFIG_NLS_UTF8=m - -# -# Console drivers -# -CONFIG_VGA_CONSOLE=y -CONFIG_VIDEO_SELECT=y -# CONFIG_VIDEO_IGNORE_BAD_MODE is not set -CONFIG_MDA_CONSOLE=m - -# -# Frame-buffer support -# -CONFIG_FB=y -CONFIG_DUMMY_CONSOLE=y -CONFIG_FB_RIVA=m -CONFIG_FB_CLGEN=m -CONFIG_FB_PM2=m -# CONFIG_FB_PM2_FIFO_DISCONNECT is not set -CONFIG_FB_PM2_PCI=y -CONFIG_FB_PM3=m -# CONFIG_FB_CYBER2000 is not set -CONFIG_FB_VESA=y -CONFIG_FB_VGA16=m -CONFIG_FB_HGA=m -CONFIG_VIDEO_SELECT=y -CONFIG_FB_MATROX=m -CONFIG_FB_MATROX_MILLENIUM=y -CONFIG_FB_MATROX_MYSTIQUE=y -# CONFIG_FB_MATROX_G450 is not set -CONFIG_FB_MATROX_G100A=y -CONFIG_FB_MATROX_G100=y -CONFIG_FB_MATROX_I2C=m -CONFIG_FB_MATROX_MAVEN=m -# CONFIG_FB_MATROX_PROC is not set -CONFIG_FB_MATROX_MULTIHEAD=y -CONFIG_FB_ATY=m -CONFIG_FB_ATY_GX=y -CONFIG_FB_ATY_CT=y -CONFIG_FB_ATY_CT_VAIO_LCD=y -CONFIG_FB_RADEON=m -CONFIG_FB_ATY128=m -CONFIG_FB_SIS=m -CONFIG_FB_SIS_300=y -CONFIG_FB_SIS_315=y -CONFIG_FB_NEOMAGIC=m -CONFIG_FB_3DFX=m -CONFIG_FB_VOODOO1=m -# CONFIG_FB_TRIDENT is not set -# CONFIG_FB_VIRTUAL is not set -# CONFIG_FBCON_ADVANCED is not set -CONFIG_FBCON_MFB=m -CONFIG_FBCON_CFB8=y -CONFIG_FBCON_CFB16=y -CONFIG_FBCON_CFB24=y -CONFIG_FBCON_CFB32=y -CONFIG_FBCON_VGA_PLANES=m -CONFIG_FBCON_HGA=m -# CONFIG_FBCON_FONTWIDTH8_ONLY is not set -# CONFIG_FBCON_FONTS is not set -CONFIG_FONT_8x8=y -CONFIG_FONT_8x16=y - -# -# Sound -# -CONFIG_SOUND=m -CONFIG_SOUND_ALI5455=m -CONFIG_SOUND_BT878=m -CONFIG_SOUND_CMPCI=m -CONFIG_SOUND_CMPCI_FM=y -CONFIG_SOUND_CMPCI_FMIO=388 -CONFIG_SOUND_CMPCI_FMIO=388 -CONFIG_SOUND_CMPCI_MIDI=y -CONFIG_SOUND_CMPCI_MPUIO=330 -CONFIG_SOUND_CMPCI_JOYSTICK=y -CONFIG_SOUND_CMPCI_CM8738=y -# CONFIG_SOUND_CMPCI_SPDIFINVERSE is not set -CONFIG_SOUND_CMPCI_SPDIFLOOP=y -CONFIG_SOUND_CMPCI_SPEAKERS=2 -CONFIG_SOUND_EMU10K1=m -CONFIG_MIDI_EMU10K1=y -CONFIG_SOUND_AUDIGY=m -CONFIG_SOUND_FUSION=m -CONFIG_SOUND_CS4281=m -CONFIG_SOUND_ES1370=m -CONFIG_SOUND_ES1371=m -CONFIG_SOUND_ESSSOLO1=m -CONFIG_SOUND_MAESTRO=m -CONFIG_SOUND_MAESTRO3=m -CONFIG_SOUND_FORTE=m -CONFIG_SOUND_ICH=m -CONFIG_SOUND_RME96XX=m -CONFIG_SOUND_SONICVIBES=m -CONFIG_SOUND_TRIDENT=m -CONFIG_SOUND_MSNDCLAS=m -# CONFIG_MSNDCLAS_HAVE_BOOT is not set -CONFIG_MSNDCLAS_INIT_FILE="/etc/sound/msndinit.bin" -CONFIG_MSNDCLAS_PERM_FILE="/etc/sound/msndperm.bin" -CONFIG_SOUND_MSNDPIN=m -# CONFIG_MSNDPIN_HAVE_BOOT is not set -CONFIG_MSNDPIN_INIT_FILE="/etc/sound/pndspini.bin" -CONFIG_MSNDPIN_PERM_FILE="/etc/sound/pndsperm.bin" -CONFIG_SOUND_VIA82CXXX=m -CONFIG_MIDI_VIA82CXXX=y -CONFIG_SOUND_OSS=m -# CONFIG_SOUND_TRACEINIT is not set -CONFIG_SOUND_DMAP=y -CONFIG_SOUND_AD1816=m -CONFIG_SOUND_AD1889=m -CONFIG_SOUND_SGALAXY=m -CONFIG_SOUND_ADLIB=m -CONFIG_SOUND_ACI_MIXER=m -CONFIG_SOUND_CS4232=m -CONFIG_SOUND_SSCAPE=m -CONFIG_SOUND_GUS=m -CONFIG_SOUND_GUS16=y -CONFIG_SOUND_GUSMAX=y -CONFIG_SOUND_VMIDI=m -CONFIG_SOUND_TRIX=m -CONFIG_SOUND_MSS=m -CONFIG_SOUND_MPU401=m -CONFIG_SOUND_NM256=m -CONFIG_SOUND_MAD16=m -CONFIG_MAD16_OLDCARD=y -CONFIG_SOUND_PAS=m -# CONFIG_PAS_JOYSTICK is not set -CONFIG_SOUND_PSS=m -# CONFIG_PSS_MIXER is not set -# CONFIG_PSS_HAVE_BOOT is not set -CONFIG_SOUND_SB=m -CONFIG_SOUND_AWE32_SYNTH=m -CONFIG_SOUND_KAHLUA=m -CONFIG_SOUND_WAVEFRONT=m -CONFIG_SOUND_MAUI=m -CONFIG_SOUND_YM3812=m -CONFIG_SOUND_OPL3SA1=m -CONFIG_SOUND_OPL3SA2=m -CONFIG_SOUND_YMFPCI=m -CONFIG_SOUND_YMFPCI_LEGACY=y -CONFIG_SOUND_UART6850=m -CONFIG_SOUND_AEDSP16=m -CONFIG_SC6600=y -CONFIG_SC6600_JOY=y -CONFIG_SC6600_CDROM=4 -CONFIG_SC6600_CDROMBASE=0 -CONFIG_AEDSP16_SBPRO=y -CONFIG_AEDSP16_MPU401=y -CONFIG_SOUND_TVMIXER=m - -# -# USB support -# -CONFIG_USB=m -# CONFIG_USB_DEBUG is not set - -# -# Miscellaneous USB options -# -CONFIG_USB_DEVICEFS=y -# CONFIG_USB_BANDWIDTH is not set - -# -# USB Host Controller Drivers -# -CONFIG_USB_EHCI_HCD=m -CONFIG_USB_UHCI=m -CONFIG_USB_UHCI_ALT=m -CONFIG_USB_OHCI=m - -# -# USB Device Class drivers -# -CONFIG_USB_AUDIO=m -# CONFIG_USB_EMI26 is not set - -# -# USB Bluetooth can only be used with disabled Bluetooth subsystem -# -CONFIG_USB_MIDI=m -CONFIG_USB_STORAGE=m -# CONFIG_USB_STORAGE_DEBUG is not set -CONFIG_USB_STORAGE_DATAFAB=y -CONFIG_USB_STORAGE_FREECOM=y -CONFIG_USB_STORAGE_ISD200=y -CONFIG_USB_STORAGE_DPCM=y -CONFIG_USB_STORAGE_HP8200e=y -CONFIG_USB_STORAGE_SDDR09=y -CONFIG_USB_STORAGE_SDDR55=y -CONFIG_USB_STORAGE_JUMPSHOT=y -CONFIG_USB_ACM=m -CONFIG_USB_PRINTER=m - -# -# USB Human Interface Devices (HID) -# -CONFIG_USB_HID=m -CONFIG_USB_HIDINPUT=y -CONFIG_USB_HIDDEV=y -# CONFIG_USB_KBD is not set -# CONFIG_USB_MOUSE is not set -CONFIG_USB_AIPTEK=m -CONFIG_USB_WACOM=m -CONFIG_USB_KBTAB=m -CONFIG_USB_POWERMATE=m - -# -# USB Imaging devices -# -# CONFIG_USB_DC2XX is not set -CONFIG_USB_MDC800=m -CONFIG_USB_SCANNER=m -CONFIG_USB_MICROTEK=m -CONFIG_USB_HPUSBSCSI=m - -# -# USB Multimedia devices -# -CONFIG_USB_IBMCAM=m -CONFIG_USB_KONICAWC=m -CONFIG_USB_OV511=m -CONFIG_USB_PWC=m -CONFIG_USB_SE401=m -CONFIG_USB_STV680=m -CONFIG_USB_VICAM=m -CONFIG_USB_DSBR=m -CONFIG_USB_DABUSB=m - -# -# USB Network adaptors -# -CONFIG_USB_PEGASUS=m -CONFIG_USB_RTL8150=m -CONFIG_USB_KAWETH=m -CONFIG_USB_CATC=m -CONFIG_USB_CDCETHER=m -CONFIG_USB_USBNET=m - -# -# USB port drivers -# -CONFIG_USB_USS720=m - -# -# USB Serial Converter support -# -CONFIG_USB_SERIAL=m -# CONFIG_USB_SERIAL_DEBUG is not set -CONFIG_USB_SERIAL_GENERIC=y -CONFIG_USB_SERIAL_BELKIN=m -CONFIG_USB_SERIAL_WHITEHEAT=m -CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m -CONFIG_USB_SERIAL_EMPEG=m -CONFIG_USB_SERIAL_FTDI_SIO=m -CONFIG_USB_SERIAL_VISOR=m -CONFIG_USB_SERIAL_IPAQ=m -CONFIG_USB_SERIAL_IR=m -CONFIG_USB_SERIAL_EDGEPORT=m -CONFIG_USB_SERIAL_EDGEPORT_TI=m -CONFIG_USB_SERIAL_KEYSPAN_PDA=m -CONFIG_USB_SERIAL_KEYSPAN=m -# CONFIG_USB_SERIAL_KEYSPAN_USA28 is not set -# CONFIG_USB_SERIAL_KEYSPAN_USA28X is not set -CONFIG_USB_SERIAL_KEYSPAN_USA28XA=y -CONFIG_USB_SERIAL_KEYSPAN_USA28XB=y -# CONFIG_USB_SERIAL_KEYSPAN_USA19 is not set -# CONFIG_USB_SERIAL_KEYSPAN_USA18X is not set -CONFIG_USB_SERIAL_KEYSPAN_USA19W=y -CONFIG_USB_SERIAL_KEYSPAN_USA19QW=y -CONFIG_USB_SERIAL_KEYSPAN_USA19QI=y -CONFIG_USB_SERIAL_KEYSPAN_MPR=y -CONFIG_USB_SERIAL_KEYSPAN_USA49W=y -CONFIG_USB_SERIAL_KEYSPAN_USA49WLC=y -CONFIG_USB_SERIAL_MCT_U232=m -CONFIG_USB_SERIAL_KLSI=m -CONFIG_USB_SERIAL_KOBIL_SCT=m -CONFIG_USB_SERIAL_PL2303=m -CONFIG_USB_SERIAL_CYBERJACK=m -CONFIG_USB_SERIAL_XIRCOM=m -CONFIG_USB_SERIAL_OMNINET=m - -# -# USB Miscellaneous drivers -# -CONFIG_USB_RIO500=m -CONFIG_USB_AUERSWALD=m -CONFIG_USB_TIGL=m -CONFIG_USB_BRLVGER=m -CONFIG_USB_LCD=m - -# -# Additional device driver support -# -CONFIG_NET_BROADCOM=m -CONFIG_CIPE=m -CONFIG_CRYPTO_AEP=m -CONFIG_MEGARAC=m -CONFIG_FC_QLA2200=m -CONFIG_FC_QLA2300=m -CONFIG_SCSI_ISCSI=m - -# -# Bluetooth support -# -CONFIG_BLUEZ=m -CONFIG_BLUEZ_L2CAP=m -CONFIG_BLUEZ_SCO=m -CONFIG_BLUEZ_RFCOMM=m -CONFIG_BLUEZ_RFCOMM_TTY=y -CONFIG_BLUEZ_BNEP=m -CONFIG_BLUEZ_BNEP_MC_FILTER=y -CONFIG_BLUEZ_BNEP_PROTO_FILTER=y - -# -# Bluetooth device drivers -# -CONFIG_BLUEZ_HCIUSB=m -CONFIG_BLUEZ_USB_SCO=y -CONFIG_BLUEZ_USB_ZERO_PACKET=y -CONFIG_BLUEZ_HCIUART=m -CONFIG_BLUEZ_HCIUART_H4=y -CONFIG_BLUEZ_HCIUART_BCSP=y -CONFIG_BLUEZ_HCIUART_BCSP_TXCRC=y -CONFIG_BLUEZ_HCIDTL1=m -CONFIG_BLUEZ_HCIBT3C=m -CONFIG_BLUEZ_HCIBLUECARD=m -CONFIG_BLUEZ_HCIBTUART=m -CONFIG_BLUEZ_HCIVHCI=m - -# -# Profiling support -# -# CONFIG_PROFILING is not set - -# -# Kernel hacking -# -CONFIG_DEBUG_KERNEL=y -CONFIG_DEBUG_STACKOVERFLOW=y -# CONFIG_DEBUG_HIGHMEM is not set -# CONFIG_DEBUG_SLAB is not set -# CONFIG_DEBUG_IOVIRT is not set -CONFIG_MAGIC_SYSRQ=y -# CONFIG_DEBUG_SPINLOCK is not set -# CONFIG_FRAME_POINTER is not set -# CONFIG_MCL_COREDUMP is not set - -# -# Library routines -# -CONFIG_ZLIB_INFLATE=y -CONFIG_ZLIB_DEFLATE=m diff --git a/lustre/kernel_patches/kernel_configs/kernel-2.4.20-rh-2.4-i686-smp.config b/lustre/kernel_patches/kernel_configs/kernel-2.4.20-rh-2.4-i686-smp.config deleted file mode 100644 index 0a077c5..0000000 --- a/lustre/kernel_patches/kernel_configs/kernel-2.4.20-rh-2.4-i686-smp.config +++ /dev/null @@ -1,1861 +0,0 @@ -# -# Automatically generated by make menuconfig: don't edit -# -CONFIG_X86=y -# CONFIG_SBUS is not set -CONFIG_UID16=y - -# -# Code maturity level options -# -CONFIG_EXPERIMENTAL=y - -# -# Loadable module support -# -CONFIG_MODULES=y -CONFIG_MODVERSIONS=y -CONFIG_KMOD=y - -# -# Processor type and features -# -CONFIG_LOLAT=y -# CONFIG_M386 is not set -# CONFIG_M486 is not set -# CONFIG_M586 is not set -# CONFIG_M586TSC is not set -# CONFIG_M586MMX is not set -CONFIG_M686=y -# CONFIG_MPENTIUMIII is not set -# CONFIG_MPENTIUM4 is not set -# CONFIG_MK6 is not set -# CONFIG_MK7 is not set -# CONFIG_MELAN is not set -# CONFIG_MCRUSOE is not set -# CONFIG_MWINCHIPC6 is not set -# CONFIG_MWINCHIP2 is not set -# CONFIG_MWINCHIP3D is not set -# CONFIG_MCYRIXIII is not set -CONFIG_X86_WP_WORKS_OK=y -CONFIG_X86_INVLPG=y -CONFIG_X86_CMPXCHG=y -CONFIG_X86_XADD=y -CONFIG_X86_BSWAP=y -CONFIG_X86_POPAD_OK=y -# CONFIG_RWSEM_GENERIC_SPINLOCK is not set -CONFIG_RWSEM_XCHGADD_ALGORITHM=y -CONFIG_X86_L1_CACHE_SHIFT=7 -CONFIG_X86_HAS_TSC=y -CONFIG_X86_GOOD_APIC=y -CONFIG_X86_PGE=y -CONFIG_X86_USE_PPRO_CHECKSUM=y -CONFIG_X86_PPRO_FENCE=y -CONFIG_X86_F00F_WORKS_OK=y -CONFIG_X86_MCE=y - -# -# CPU Frequency scaling -# -# CONFIG_CPU_FREQ is not set -CONFIG_TOSHIBA=m -CONFIG_I8K=m -CONFIG_MICROCODE=m -CONFIG_X86_MSR=m -CONFIG_X86_CPUID=m -# CONFIG_E820_PROC is not set -CONFIG_EDD=m -# CONFIG_NOHIGHMEM is not set -CONFIG_HIGHMEM4G=y -# CONFIG_HIGHMEM64G is not set -CONFIG_HIGHMEM=y -CONFIG_HIGHPTE=y -CONFIG_HIGHIO=y -# CONFIG_MATH_EMULATION is not set -CONFIG_MTRR=y -CONFIG_SMP=y -# CONFIG_X86_NUMA is not set -# CONFIG_X86_TSC_DISABLE is not set -CONFIG_X86_TSC=y -CONFIG_HAVE_DEC_LOCK=y - -# -# General setup -# -CONFIG_NET=y -CONFIG_X86_IO_APIC=y -CONFIG_X86_LOCAL_APIC=y -CONFIG_PCI=y -# CONFIG_PCI_GOBIOS is not set -# CONFIG_PCI_GODIRECT is not set -CONFIG_PCI_GOANY=y -CONFIG_PCI_BIOS=y -CONFIG_PCI_DIRECT=y -CONFIG_ISA=y -CONFIG_PCI_NAMES=y -CONFIG_EISA=y -# CONFIG_MCA is not set -CONFIG_HOTPLUG=y - -# -# PCMCIA/CardBus support -# -CONFIG_PCMCIA=m -CONFIG_CARDBUS=y -CONFIG_TCIC=y -CONFIG_I82092=y -CONFIG_I82365=y - -# -# PCI Hotplug Support -# -CONFIG_HOTPLUG_PCI=y -# CONFIG_HOTPLUG_PCI_ACPI is not set -CONFIG_HOTPLUG_PCI_COMPAQ=m -# CONFIG_HOTPLUG_PCI_COMPAQ_NVRAM is not set -CONFIG_HOTPLUG_PCI_IBM=m -# CONFIG_HOTPLUG_PCI_H2999 is not set -CONFIG_SYSVIPC=y -CONFIG_BSD_PROCESS_ACCT=y -CONFIG_SYSCTL=y -CONFIG_KCORE_ELF=y -# CONFIG_KCORE_AOUT is not set -CONFIG_BINFMT_AOUT=m -CONFIG_BINFMT_ELF=y -CONFIG_BINFMT_MISC=m -CONFIG_PM=y -# CONFIG_ACPI is not set -CONFIG_APM=y -# CONFIG_APM_IGNORE_USER_SUSPEND is not set -# CONFIG_APM_DO_ENABLE is not set -CONFIG_APM_CPU_IDLE=y -# CONFIG_APM_DISPLAY_BLANK is not set -CONFIG_APM_RTC_IS_GMT=y -# CONFIG_APM_ALLOW_INTS is not set -# CONFIG_APM_REAL_MODE_POWER_OFF is not set - -# -# Memory Technology Devices (MTD) -# -# CONFIG_MTD is not set - -# -# Parallel port support -# -CONFIG_PARPORT=m -CONFIG_PARPORT_PC=m -CONFIG_PARPORT_PC_CML1=m -CONFIG_PARPORT_SERIAL=m -# CONFIG_PARPORT_PC_FIFO is not set -# CONFIG_PARPORT_PC_SUPERIO is not set -CONFIG_PARPORT_PC_PCMCIA=m -# CONFIG_PARPORT_AMIGA is not set -# CONFIG_PARPORT_MFC3 is not set -# CONFIG_PARPORT_ATARI is not set -# CONFIG_PARPORT_GSC is not set -# CONFIG_PARPORT_SUNBPP is not set -# CONFIG_PARPORT_OTHER is not set -CONFIG_PARPORT_1284=y - -# -# Plug and Play configuration -# -CONFIG_PNP=y -CONFIG_ISAPNP=y - -# -# Block devices -# -CONFIG_BLK_DEV_FD=y -CONFIG_BLK_DEV_XD=m -CONFIG_PARIDE=m -CONFIG_PARIDE_PARPORT=m -CONFIG_PARIDE_PD=m -CONFIG_PARIDE_PCD=m -CONFIG_PARIDE_PF=m -CONFIG_PARIDE_PT=m -CONFIG_PARIDE_PG=m -CONFIG_PARIDE_ATEN=m -CONFIG_PARIDE_BPCK=m -CONFIG_PARIDE_BPCK6=m -CONFIG_PARIDE_COMM=m -CONFIG_PARIDE_DSTR=m -CONFIG_PARIDE_FIT2=m -CONFIG_PARIDE_FIT3=m -CONFIG_PARIDE_EPAT=m -CONFIG_PARIDE_EPATC8=y -CONFIG_PARIDE_EPIA=m -CONFIG_PARIDE_FRIQ=m -CONFIG_PARIDE_FRPW=m -CONFIG_PARIDE_KBIC=m -CONFIG_PARIDE_KTTI=m -CONFIG_PARIDE_ON20=m -CONFIG_PARIDE_ON26=m -CONFIG_BLK_CPQ_DA=m -CONFIG_BLK_CPQ_CISS_DA=m -CONFIG_CISS_SCSI_TAPE=y -CONFIG_BLK_DEV_DAC960=m -CONFIG_BLK_DEV_UMEM=m -CONFIG_BLK_DEV_LOOP=m -CONFIG_BLK_DEV_NBD=m -CONFIG_BLK_DEV_RAM=y -CONFIG_BLK_DEV_RAM_SIZE=4096 -CONFIG_BLK_DEV_INITRD=y -CONFIG_BLK_STATS=y - -# -# Multi-device support (RAID and LVM) -# -CONFIG_MD=y -CONFIG_BLK_DEV_MD=y -CONFIG_MD_LINEAR=m -CONFIG_MD_RAID0=m -CONFIG_MD_RAID1=m -CONFIG_MD_RAID5=m -CONFIG_MD_MULTIPATH=m -CONFIG_BLK_DEV_LVM=m - -# -# Cryptography support (CryptoAPI) -# -CONFIG_CRYPTO=m -CONFIG_CIPHERS=m -CONFIG_CIPHER_AES=m -CONFIG_CIPHER_IDENTITY=m -CONFIG_CRYPTODEV=m -CONFIG_CRYPTOLOOP=m - -# -# Networking options -# -CONFIG_PACKET=y -CONFIG_PACKET_MMAP=y -CONFIG_NETLINK_DEV=y -CONFIG_NETFILTER=y -# CONFIG_NETFILTER_DEBUG is not set -CONFIG_FILTER=y -CONFIG_UNIX=y -CONFIG_INET=y -CONFIG_TUX=m -CONFIG_TUX_EXTCGI=y -# CONFIG_TUX_EXTENDED_LOG is not set -# CONFIG_TUX_DEBUG is not set -CONFIG_IP_MULTICAST=y -CONFIG_IP_ADVANCED_ROUTER=y -CONFIG_IP_MULTIPLE_TABLES=y -CONFIG_IP_ROUTE_FWMARK=y -CONFIG_IP_ROUTE_NAT=y -CONFIG_IP_ROUTE_MULTIPATH=y -CONFIG_IP_ROUTE_TOS=y -CONFIG_IP_ROUTE_VERBOSE=y -CONFIG_IP_ROUTE_LARGE_TABLES=y -# CONFIG_IP_PNP is not set -CONFIG_NET_IPIP=m -CONFIG_NET_IPGRE=m -CONFIG_NET_IPGRE_BROADCAST=y -CONFIG_IP_MROUTE=y -CONFIG_IP_PIMSM_V1=y -CONFIG_IP_PIMSM_V2=y -# CONFIG_ARPD is not set -# CONFIG_INET_ECN is not set -CONFIG_SYN_COOKIES=y - -# -# IP: Netfilter Configuration -# -CONFIG_IP_NF_CONNTRACK=m -CONFIG_IP_NF_FTP=m -CONFIG_IP_NF_AMANDA=m -CONFIG_IP_NF_TFTP=m -CONFIG_IP_NF_IRC=m -CONFIG_IP_NF_QUEUE=m -CONFIG_IP_NF_IPTABLES=m -CONFIG_IP_NF_MATCH_LIMIT=m -CONFIG_IP_NF_MATCH_MAC=m -CONFIG_IP_NF_MATCH_PKTTYPE=m -CONFIG_IP_NF_MATCH_MARK=m -CONFIG_IP_NF_MATCH_MULTIPORT=m -CONFIG_IP_NF_MATCH_TOS=m -CONFIG_IP_NF_MATCH_ECN=m -CONFIG_IP_NF_MATCH_DSCP=m -CONFIG_IP_NF_MATCH_AH_ESP=m -CONFIG_IP_NF_MATCH_LENGTH=m -CONFIG_IP_NF_MATCH_TTL=m -CONFIG_IP_NF_MATCH_TCPMSS=m -CONFIG_IP_NF_MATCH_HELPER=m -CONFIG_IP_NF_MATCH_STATE=m -CONFIG_IP_NF_MATCH_CONNTRACK=m -CONFIG_IP_NF_MATCH_UNCLEAN=m -CONFIG_IP_NF_MATCH_OWNER=m -CONFIG_IP_NF_FILTER=m -CONFIG_IP_NF_TARGET_REJECT=m -CONFIG_IP_NF_TARGET_MIRROR=m -CONFIG_IP_NF_NAT=m -CONFIG_IP_NF_NAT_NEEDED=y -CONFIG_IP_NF_TARGET_MASQUERADE=m -CONFIG_IP_NF_TARGET_REDIRECT=m -CONFIG_IP_NF_NAT_AMANDA=m -CONFIG_IP_NF_NAT_LOCAL=y -CONFIG_IP_NF_NAT_SNMP_BASIC=m -CONFIG_IP_NF_NAT_IRC=m -CONFIG_IP_NF_NAT_FTP=m -CONFIG_IP_NF_NAT_TFTP=m -CONFIG_IP_NF_MANGLE=m -CONFIG_IP_NF_TARGET_TOS=m -CONFIG_IP_NF_TARGET_ECN=m -CONFIG_IP_NF_TARGET_DSCP=m -CONFIG_IP_NF_TARGET_MARK=m -CONFIG_IP_NF_TARGET_LOG=m -CONFIG_IP_NF_TARGET_ULOG=m -CONFIG_IP_NF_TARGET_TCPMSS=m -CONFIG_IP_NF_ARPTABLES=m -CONFIG_IP_NF_ARPFILTER=m -CONFIG_IP_NF_COMPAT_IPCHAINS=m -CONFIG_IP_NF_NAT_NEEDED=y -CONFIG_IP_NF_COMPAT_IPFWADM=m -CONFIG_IP_NF_NAT_NEEDED=y -CONFIG_IPV6=m - -# -# IPv6: Netfilter Configuration -# -# CONFIG_IP6_NF_QUEUE is not set -CONFIG_IP6_NF_IPTABLES=m -CONFIG_IP6_NF_MATCH_LIMIT=m -CONFIG_IP6_NF_MATCH_MAC=m -CONFIG_IP6_NF_MATCH_RT=m -CONFIG_IP6_NF_MATCH_OPTS=m -CONFIG_IP6_NF_MATCH_FRAG=m -CONFIG_IP6_NF_MATCH_HL=m -CONFIG_IP6_NF_MATCH_MULTIPORT=m -CONFIG_IP6_NF_MATCH_OWNER=m -CONFIG_IP6_NF_MATCH_MARK=m -CONFIG_IP6_NF_MATCH_IPV6HEADER=m -CONFIG_IP6_NF_MATCH_AHESP=m -CONFIG_IP6_NF_MATCH_LENGTH=m -CONFIG_IP6_NF_MATCH_EUI64=m -CONFIG_IP6_NF_FILTER=m -CONFIG_IP6_NF_TARGET_LOG=m -CONFIG_IP6_NF_MANGLE=m -CONFIG_IP6_NF_TARGET_MARK=m -# CONFIG_KHTTPD is not set -CONFIG_ATM=y -CONFIG_ATM_CLIP=y -# CONFIG_ATM_CLIP_NO_ICMP is not set -CONFIG_ATM_LANE=m -CONFIG_ATM_MPOA=m -CONFIG_ATM_BR2684=m -CONFIG_ATM_BR2684_IPFILTER=y -CONFIG_VLAN_8021Q=m -CONFIG_IPX=m -# CONFIG_IPX_INTERN is not set -CONFIG_ATALK=m - -# -# Appletalk devices -# -CONFIG_DEV_APPLETALK=y -CONFIG_LTPC=m -CONFIG_COPS=m -CONFIG_COPS_DAYNA=y -CONFIG_COPS_TANGENT=y -CONFIG_IPDDP=m -CONFIG_IPDDP_ENCAP=y -CONFIG_IPDDP_DECAP=y -CONFIG_DECNET=m -CONFIG_DECNET_SIOCGIFCONF=y -CONFIG_DECNET_ROUTER=y -CONFIG_DECNET_ROUTE_FWMARK=y -CONFIG_BRIDGE=m -# CONFIG_X25 is not set -# CONFIG_LAPB is not set -# CONFIG_LLC is not set -CONFIG_NET_DIVERT=y -# CONFIG_ECONET is not set -CONFIG_WAN_ROUTER=m -# CONFIG_NET_FASTROUTE is not set -# CONFIG_NET_HW_FLOWCONTROL is not set - -# -# QoS and/or fair queueing -# -CONFIG_NET_SCHED=y -CONFIG_NET_SCH_CBQ=m -CONFIG_NET_SCH_HTB=m -CONFIG_NET_SCH_CSZ=m -# CONFIG_NET_SCH_ATM is not set -CONFIG_NET_SCH_PRIO=m -CONFIG_NET_SCH_RED=m -CONFIG_NET_SCH_SFQ=m -CONFIG_NET_SCH_TEQL=m -CONFIG_NET_SCH_TBF=m -CONFIG_NET_SCH_GRED=m -CONFIG_NET_SCH_DSMARK=m -CONFIG_NET_SCH_INGRESS=m -CONFIG_NET_QOS=y -CONFIG_NET_ESTIMATOR=y -CONFIG_NET_CLS=y -CONFIG_NET_CLS_TCINDEX=m -CONFIG_NET_CLS_ROUTE4=m -CONFIG_NET_CLS_ROUTE=y -CONFIG_NET_CLS_FW=m -CONFIG_NET_CLS_U32=m -CONFIG_NET_CLS_RSVP=m -CONFIG_NET_CLS_RSVP6=m -CONFIG_NET_CLS_POLICE=y - -# -# Network testing -# -# CONFIG_NET_PKTGEN is not set - -# -# Telephony Support -# -CONFIG_PHONE=m -CONFIG_PHONE_IXJ=m -CONFIG_PHONE_IXJ_PCMCIA=m - -# -# ATA/IDE/MFM/RLL support -# -CONFIG_IDE=y - -# -# IDE, ATA and ATAPI Block devices -# -CONFIG_BLK_DEV_IDE=y -# CONFIG_BLK_DEV_HD_IDE is not set -# CONFIG_BLK_DEV_HD is not set -CONFIG_BLK_DEV_IDEDISK=y -CONFIG_IDEDISK_MULTI_MODE=y -# CONFIG_IDEDISK_STROKE is not set -CONFIG_BLK_DEV_IDECS=m -CONFIG_BLK_DEV_IDECD=m -CONFIG_BLK_DEV_IDETAPE=m -CONFIG_BLK_DEV_IDEFLOPPY=y -CONFIG_BLK_DEV_IDESCSI=m -# CONFIG_IDE_TASK_IOCTL is not set -CONFIG_BLK_DEV_CMD640=y -# CONFIG_BLK_DEV_CMD640_ENHANCED is not set -CONFIG_BLK_DEV_ISAPNP=y -CONFIG_BLK_DEV_IDEPCI=y -CONFIG_BLK_DEV_GENERIC=y -CONFIG_IDEPCI_SHARE_IRQ=y -CONFIG_BLK_DEV_IDEDMA_PCI=y -# CONFIG_BLK_DEV_OFFBOARD is not set -# CONFIG_BLK_DEV_IDEDMA_FORCED is not set -CONFIG_IDEDMA_PCI_AUTO=y -# CONFIG_IDEDMA_ONLYDISK is not set -CONFIG_BLK_DEV_IDEDMA=y -# CONFIG_IDEDMA_PCI_WIP is not set -CONFIG_BLK_DEV_ADMA100=y -CONFIG_BLK_DEV_AEC62XX=y -CONFIG_BLK_DEV_ALI15X3=y -# CONFIG_WDC_ALI15X3 is not set -CONFIG_BLK_DEV_AMD74XX=y -# CONFIG_AMD74XX_OVERRIDE is not set -CONFIG_BLK_DEV_CMD64X=y -CONFIG_BLK_DEV_TRIFLEX=y -CONFIG_BLK_DEV_CY82C693=y -CONFIG_BLK_DEV_CS5530=y -CONFIG_BLK_DEV_HPT34X=y -# CONFIG_HPT34X_AUTODMA is not set -CONFIG_BLK_DEV_HPT366=y -CONFIG_BLK_DEV_PIIX=y -# CONFIG_BLK_DEV_NS87415 is not set -# CONFIG_BLK_DEV_OPTI621 is not set -CONFIG_BLK_DEV_PDC202XX_OLD=y -# CONFIG_PDC202XX_BURST is not set -CONFIG_BLK_DEV_PDC202XX_NEW=y -CONFIG_PDC202XX_FORCE=y -CONFIG_BLK_DEV_RZ1000=y -# CONFIG_BLK_DEV_SC1200 is not set -CONFIG_BLK_DEV_SVWKS=y -CONFIG_BLK_DEV_SIIMAGE=y -CONFIG_BLK_DEV_SIS5513=y -CONFIG_BLK_DEV_SLC90E66=y -# CONFIG_BLK_DEV_TRM290 is not set -CONFIG_BLK_DEV_VIA82CXXX=y -# CONFIG_IDE_CHIPSETS is not set -CONFIG_IDEDMA_AUTO=y -# CONFIG_IDEDMA_IVB is not set -# CONFIG_DMA_NONPCI is not set -CONFIG_BLK_DEV_PDC202XX=y -CONFIG_BLK_DEV_IDE_MODES=y -CONFIG_BLK_DEV_ATARAID=m -CONFIG_BLK_DEV_ATARAID_PDC=m -CONFIG_BLK_DEV_ATARAID_HPT=m -CONFIG_BLK_DEV_ATARAID_SII=m - -# -# SCSI support -# -CONFIG_SCSI=m -CONFIG_BLK_DEV_SD=m -CONFIG_SD_EXTRA_DEVS=40 -CONFIG_CHR_DEV_ST=m -CONFIG_CHR_DEV_OSST=m -CONFIG_BLK_DEV_SR=m -CONFIG_BLK_DEV_SR_VENDOR=y -CONFIG_SR_EXTRA_DEVS=4 -CONFIG_CHR_DEV_SG=m -# CONFIG_SCSI_DEBUG_QUEUES is not set -# CONFIG_SCSI_MULTI_LUN is not set -CONFIG_SCSI_CONSTANTS=y -CONFIG_SCSI_LOGGING=y - -# -# SCSI low-level drivers -# -CONFIG_BLK_DEV_3W_XXXX_RAID=m -CONFIG_SCSI_7000FASST=m -CONFIG_SCSI_ACARD=m -CONFIG_SCSI_AHA152X=m -CONFIG_SCSI_AHA1542=m -CONFIG_SCSI_AHA1740=m -CONFIG_SCSI_AACRAID=m -CONFIG_SCSI_AIC7XXX=m -CONFIG_AIC7XXX_CMDS_PER_DEVICE=253 -CONFIG_AIC7XXX_RESET_DELAY_MS=15000 -# CONFIG_AIC7XXX_PROBE_EISA_VL is not set -# CONFIG_AIC7XXX_BUILD_FIRMWARE is not set -CONFIG_SCSI_AIC79XX=m -CONFIG_AIC79XX_CMDS_PER_DEVICE=253 -CONFIG_AIC79XX_RESET_DELAY_MS=15000 -# CONFIG_AIC79XX_BUILD_FIRMWARE is not set -CONFIG_AIC79XX_ENABLE_RD_STRM=y -# CONFIG_AIC79XX_DEBUG_ENABLE is not set -CONFIG_AIC79XX_DEBUG_MASK=0 -CONFIG_SCSI_AIC7XXX_OLD=m -CONFIG_AIC7XXX_OLD_TCQ_ON_BY_DEFAULT=y -CONFIG_AIC7XXX_OLD_CMDS_PER_DEVICE=32 -CONFIG_AIC7XXX_OLD_PROC_STATS=y -CONFIG_SCSI_DPT_I2O=m -CONFIG_SCSI_ADVANSYS=m -CONFIG_SCSI_IN2000=m -CONFIG_SCSI_AM53C974=m -CONFIG_SCSI_MEGARAID=m -CONFIG_SCSI_BUSLOGIC=m -# CONFIG_SCSI_OMIT_FLASHPOINT is not set -CONFIG_SCSI_CPQFCTS=m -CONFIG_SCSI_DMX3191D=m -CONFIG_SCSI_DTC3280=m -CONFIG_SCSI_EATA=m -CONFIG_SCSI_EATA_TAGGED_QUEUE=y -# CONFIG_SCSI_EATA_LINKED_COMMANDS is not set -CONFIG_SCSI_EATA_MAX_TAGS=16 -CONFIG_SCSI_EATA_DMA=m -CONFIG_SCSI_EATA_PIO=m -CONFIG_SCSI_FUTURE_DOMAIN=m -CONFIG_SCSI_GDTH=m -CONFIG_SCSI_GENERIC_NCR5380=m -# CONFIG_SCSI_GENERIC_NCR53C400 is not set -CONFIG_SCSI_G_NCR5380_PORT=y -# CONFIG_SCSI_G_NCR5380_MEM is not set -CONFIG_SCSI_IPS=m -CONFIG_SCSI_INITIO=m -CONFIG_SCSI_INIA100=m -CONFIG_SCSI_PPA=m -CONFIG_SCSI_IMM=m -# CONFIG_SCSI_IZIP_EPP16 is not set -# CONFIG_SCSI_IZIP_SLOW_CTR is not set -CONFIG_SCSI_NCR53C406A=m -CONFIG_SCSI_NCR53C7xx=m -# CONFIG_SCSI_NCR53C7xx_sync is not set -CONFIG_SCSI_NCR53C7xx_FAST=y -CONFIG_SCSI_NCR53C7xx_DISCONNECT=y -CONFIG_SCSI_SYM53C8XX_2=m -CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=1 -CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16 -CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64 -# CONFIG_SCSI_SYM53C8XX_IOMAPPED is not set -CONFIG_SCSI_NCR53C8XX=m -CONFIG_SCSI_SYM53C8XX=m -CONFIG_SCSI_NCR53C8XX_DEFAULT_TAGS=8 -CONFIG_SCSI_NCR53C8XX_MAX_TAGS=32 -CONFIG_SCSI_NCR53C8XX_SYNC=40 -# CONFIG_SCSI_NCR53C8XX_PROFILE is not set -# CONFIG_SCSI_NCR53C8XX_IOMAPPED is not set -# CONFIG_SCSI_NCR53C8XX_PQS_PDS is not set -# CONFIG_SCSI_NCR53C8XX_SYMBIOS_COMPAT is not set -CONFIG_SCSI_PAS16=m -CONFIG_SCSI_PCI2000=m -CONFIG_SCSI_PCI2220I=m -CONFIG_SCSI_PSI240I=m -CONFIG_SCSI_QLOGIC_FAS=m -CONFIG_SCSI_QLOGIC_ISP=m -CONFIG_SCSI_QLOGIC_FC=m -# CONFIG_SCSI_QLOGIC_FC_FIRMWARE is not set -CONFIG_SCSI_QLOGIC_1280=m -CONFIG_SCSI_NEWISP=m -CONFIG_SCSI_SEAGATE=m -CONFIG_SCSI_SIM710=m -CONFIG_SCSI_SYM53C416=m -CONFIG_SCSI_DC390T=m -# CONFIG_SCSI_DC390T_NOGENSUPP is not set -CONFIG_SCSI_T128=m -CONFIG_SCSI_U14_34F=m -# CONFIG_SCSI_U14_34F_LINKED_COMMANDS is not set -CONFIG_SCSI_U14_34F_MAX_TAGS=8 -CONFIG_SCSI_ULTRASTOR=m -CONFIG_SCSI_NSP32=m -CONFIG_SCSI_DEBUG=m - -# -# PCMCIA SCSI adapter support -# -CONFIG_SCSI_PCMCIA=y -CONFIG_PCMCIA_AHA152X=m -CONFIG_PCMCIA_FDOMAIN=m -CONFIG_PCMCIA_NINJA_SCSI=m -CONFIG_PCMCIA_QLOGIC=m - -# -# Fusion MPT device support -# -CONFIG_FUSION=m -# CONFIG_FUSION_BOOT is not set -CONFIG_FUSION_MAX_SGE=40 -# CONFIG_FUSION_ISENSE is not set -CONFIG_FUSION_CTL=m -CONFIG_FUSION_LAN=m -CONFIG_NET_FC=y - -# -# IEEE 1394 (FireWire) support (EXPERIMENTAL) -# -CONFIG_IEEE1394=m -# CONFIG_IEEE1394_PCILYNX is not set -CONFIG_IEEE1394_OHCI1394=m -CONFIG_IEEE1394_VIDEO1394=m -CONFIG_IEEE1394_SBP2=m -CONFIG_IEEE1394_SBP2_PHYS_DMA=y -CONFIG_IEEE1394_ETH1394=m -CONFIG_IEEE1394_DV1394=m -CONFIG_IEEE1394_RAWIO=m -CONFIG_IEEE1394_CMP=m -CONFIG_IEEE1394_AMDTP=m -# CONFIG_IEEE1394_VERBOSEDEBUG is not set - -# -# I2O device support -# -CONFIG_I2O=m -CONFIG_I2O_PCI=m -CONFIG_I2O_BLOCK=m -CONFIG_I2O_LAN=m -CONFIG_I2O_SCSI=m -CONFIG_I2O_PROC=m - -# -# Network device support -# -CONFIG_NETDEVICES=y - -# -# ARCnet devices -# -# CONFIG_ARCNET is not set -CONFIG_DUMMY=m -CONFIG_BONDING=m -CONFIG_EQUALIZER=m -CONFIG_TUN=m -CONFIG_ETHERTAP=m -CONFIG_NET_SB1000=m - -# -# Ethernet (10 or 100Mbit) -# -CONFIG_NET_ETHERNET=y -# CONFIG_SUNLANCE is not set -CONFIG_HAPPYMEAL=m -# CONFIG_SUNBMAC is not set -# CONFIG_SUNQE is not set -CONFIG_SUNGEM=m -CONFIG_NET_VENDOR_3COM=y -CONFIG_EL1=m -CONFIG_EL2=m -CONFIG_ELPLUS=m -CONFIG_EL16=m -CONFIG_EL3=m -CONFIG_3C515=m -# CONFIG_ELMC is not set -# CONFIG_ELMC_II is not set -CONFIG_VORTEX=m -CONFIG_TYPHOON=m -CONFIG_LANCE=m -CONFIG_NET_VENDOR_SMC=y -CONFIG_WD80x3=m -# CONFIG_ULTRAMCA is not set -CONFIG_ULTRA=m -CONFIG_ULTRA32=m -CONFIG_SMC9194=m -CONFIG_NET_VENDOR_RACAL=y -CONFIG_NI5010=m -CONFIG_NI52=m -CONFIG_NI65=m -CONFIG_AT1700=m -CONFIG_DEPCA=m -CONFIG_HP100=m -CONFIG_NET_ISA=y -CONFIG_E2100=m -# CONFIG_EWRK3 is not set -CONFIG_EEXPRESS=m -CONFIG_EEXPRESS_PRO=m -CONFIG_HPLAN_PLUS=m -CONFIG_HPLAN=m -CONFIG_LP486E=m -CONFIG_ETH16I=m -CONFIG_NE2000=m -CONFIG_NET_PCI=y -CONFIG_PCNET32=m -CONFIG_AMD8111_ETH=m -CONFIG_ADAPTEC_STARFIRE=m -CONFIG_AC3200=m -CONFIG_APRICOT=m -CONFIG_CS89x0=m -CONFIG_TULIP=m -# CONFIG_TULIP_MWI is not set -CONFIG_TULIP_MMIO=y -CONFIG_DE4X5=m -CONFIG_DGRS=m -CONFIG_DM9102=m -CONFIG_EEPRO100=m -# CONFIG_EEPRO100_PIO is not set -CONFIG_E100=m -CONFIG_LNE390=m -CONFIG_FEALNX=m -CONFIG_NATSEMI=m -CONFIG_NE2K_PCI=m -CONFIG_NE3210=m -CONFIG_ES3210=m -CONFIG_8139CP=m -CONFIG_8139TOO=m -# CONFIG_8139TOO_PIO is not set -# CONFIG_8139TOO_TUNE_TWISTER is not set -CONFIG_8139TOO_8129=y -# CONFIG_8139_OLD_RX_RESET is not set -CONFIG_SIS900=m -CONFIG_EPIC100=m -CONFIG_SUNDANCE=m -# CONFIG_SUNDANCE_MMIO is not set -CONFIG_TLAN=m -CONFIG_TC35815=m -CONFIG_VIA_RHINE=m -# CONFIG_VIA_RHINE_MMIO is not set -CONFIG_WINBOND_840=m -CONFIG_NET_POCKET=y -CONFIG_ATP=m -CONFIG_DE600=m -CONFIG_DE620=m - -# -# Ethernet (1000 Mbit) -# -CONFIG_ACENIC=m -# CONFIG_ACENIC_OMIT_TIGON_I is not set -CONFIG_DL2K=m -CONFIG_E1000=m -# CONFIG_MYRI_SBUS is not set -CONFIG_NS83820=m -CONFIG_HAMACHI=m -CONFIG_YELLOWFIN=m -CONFIG_R8169=m -CONFIG_SK98LIN=m -CONFIG_TIGON3=m -CONFIG_FDDI=y -CONFIG_DEFXX=m -CONFIG_SKFP=m -CONFIG_NETCONSOLE=m -# CONFIG_HIPPI is not set -CONFIG_PLIP=m -CONFIG_PPP=m -CONFIG_PPP_MULTILINK=y -CONFIG_PPP_FILTER=y -CONFIG_PPP_ASYNC=m -CONFIG_PPP_SYNC_TTY=m -CONFIG_PPP_DEFLATE=m -# CONFIG_PPP_BSDCOMP is not set -CONFIG_PPPOE=m -CONFIG_PPPOATM=m -CONFIG_SLIP=m -CONFIG_SLIP_COMPRESSED=y -CONFIG_SLIP_SMART=y -CONFIG_SLIP_MODE_SLIP6=y - -# -# Wireless LAN (non-hamradio) -# -CONFIG_NET_RADIO=y -CONFIG_STRIP=m -CONFIG_WAVELAN=m -CONFIG_ARLAN=m -CONFIG_AIRONET4500=m -CONFIG_AIRONET4500_NONCS=m -CONFIG_AIRONET4500_PNP=y -CONFIG_AIRONET4500_PCI=y -CONFIG_AIRONET4500_ISA=y -CONFIG_AIRONET4500_I365=y -CONFIG_AIRONET4500_PROC=m -CONFIG_AIRO=m -CONFIG_HERMES=m -CONFIG_PLX_HERMES=m -CONFIG_PCI_HERMES=m -CONFIG_PCMCIA_HERMES=m -CONFIG_AIRO_CS=m -CONFIG_NET_WIRELESS=y -CONFIG_PCMCIA_HERMES_OLD=m - -# -# Token Ring devices -# -CONFIG_TR=y -CONFIG_IBMTR=m -CONFIG_IBMOL=m -CONFIG_IBMLS=m -CONFIG_3C359=m -CONFIG_TMS380TR=m -CONFIG_TMSPCI=m -CONFIG_TMSISA=m -CONFIG_ABYSS=m -# CONFIG_MADGEMC is not set -CONFIG_SMCTR=m -CONFIG_NET_FC=y -CONFIG_IPHASE5526=m -CONFIG_RCPCI=m -CONFIG_SHAPER=m - -# -# Wan interfaces -# -CONFIG_WAN=y -CONFIG_HOSTESS_SV11=m -CONFIG_COSA=m -# CONFIG_COMX is not set -# CONFIG_DSCC4 is not set -# CONFIG_LANMEDIA is not set -CONFIG_ATI_XX20=m -CONFIG_SEALEVEL_4021=m -# CONFIG_SYNCLINK_SYNCPPP is not set -# CONFIG_HDLC is not set -CONFIG_DLCI=m -CONFIG_DLCI_COUNT=24 -CONFIG_DLCI_MAX=8 -CONFIG_SDLA=m -CONFIG_WAN_ROUTER_DRIVERS=y -CONFIG_VENDOR_SANGOMA=m -CONFIG_WANPIPE_CHDLC=y -CONFIG_WANPIPE_FR=y -CONFIG_WANPIPE_X25=y -CONFIG_WANPIPE_PPP=y -CONFIG_WANPIPE_MULTPPP=y -CONFIG_CYCLADES_SYNC=m -CONFIG_CYCLOMX_X25=y -# CONFIG_LAPBETHER is not set -# CONFIG_X25_ASY is not set -CONFIG_SBNI=m -CONFIG_SBNI_MULTILINE=y - -# -# PCMCIA network device support -# -CONFIG_NET_PCMCIA=y -CONFIG_PCMCIA_3C589=m -CONFIG_PCMCIA_3C574=m -CONFIG_PCMCIA_FMVJ18X=m -CONFIG_PCMCIA_PCNET=m -CONFIG_PCMCIA_AXNET=m -CONFIG_PCMCIA_NMCLAN=m -CONFIG_PCMCIA_SMC91C92=m -CONFIG_PCMCIA_XIRC2PS=m -# CONFIG_ARCNET_COM20020_CS is not set -CONFIG_PCMCIA_IBMTR=m -CONFIG_PCMCIA_XIRCOM=m -CONFIG_PCMCIA_XIRTULIP=m -CONFIG_NET_PCMCIA_RADIO=y -CONFIG_PCMCIA_RAYCS=m -CONFIG_PCMCIA_NETWAVE=m -CONFIG_PCMCIA_WAVELAN=m -CONFIG_PCMCIA_WVLAN=m -CONFIG_AIRONET4500_CS=m - -# -# ATM drivers -# -CONFIG_ATM_TCP=m -CONFIG_ATM_LANAI=m -CONFIG_ATM_ENI=m -# CONFIG_ATM_ENI_DEBUG is not set -# CONFIG_ATM_ENI_TUNE_BURST is not set -CONFIG_ATM_FIRESTREAM=m -CONFIG_ATM_ZATM=m -# CONFIG_ATM_ZATM_DEBUG is not set -CONFIG_ATM_ZATM_EXACT_TS=y -CONFIG_ATM_NICSTAR=m -CONFIG_ATM_NICSTAR_USE_SUNI=y -CONFIG_ATM_NICSTAR_USE_IDT77105=y -CONFIG_ATM_IDT77252=m -# CONFIG_ATM_IDT77252_DEBUG is not set -# CONFIG_ATM_IDT77252_RCV_ALL is not set -CONFIG_ATM_IDT77252_USE_SUNI=y -CONFIG_ATM_AMBASSADOR=m -# CONFIG_ATM_AMBASSADOR_DEBUG is not set -CONFIG_ATM_HORIZON=m -# CONFIG_ATM_HORIZON_DEBUG is not set -CONFIG_ATM_IA=m -# CONFIG_ATM_IA_DEBUG is not set -CONFIG_ATM_FORE200E_MAYBE=m -CONFIG_ATM_FORE200E_PCA=y -CONFIG_ATM_FORE200E_PCA_DEFAULT_FW=y -CONFIG_ATM_FORE200E_TX_RETRY=16 -CONFIG_ATM_FORE200E_DEBUG=0 -CONFIG_ATM_FORE200E=m - -# -# Amateur Radio support -# -CONFIG_HAMRADIO=y -CONFIG_AX25=m -# CONFIG_AX25_DAMA_SLAVE is not set -CONFIG_NETROM=m -CONFIG_ROSE=m - -# -# AX.25 network device drivers -# -# CONFIG_MKISS is not set -# CONFIG_6PACK is not set -# CONFIG_BPQETHER is not set -# CONFIG_DMASCC is not set -# CONFIG_SCC is not set -# CONFIG_BAYCOM_SER_FDX is not set -# CONFIG_BAYCOM_SER_HDX is not set -# CONFIG_BAYCOM_PAR is not set -# CONFIG_BAYCOM_EPP is not set -CONFIG_SOUNDMODEM=m -CONFIG_SOUNDMODEM_SBC=y -CONFIG_SOUNDMODEM_WSS=y -CONFIG_SOUNDMODEM_AFSK1200=y -CONFIG_SOUNDMODEM_AFSK2400_7=y -CONFIG_SOUNDMODEM_AFSK2400_8=y -CONFIG_SOUNDMODEM_AFSK2666=y -CONFIG_SOUNDMODEM_HAPN4800=y -CONFIG_SOUNDMODEM_PSK4800=y -CONFIG_SOUNDMODEM_FSK9600=y -# CONFIG_YAM is not set - -# -# IrDA (infrared) support -# -CONFIG_IRDA=m -CONFIG_IRLAN=m -CONFIG_IRNET=m -CONFIG_IRCOMM=m -CONFIG_IRDA_ULTRA=y -CONFIG_IRDA_CACHE_LAST_LSAP=y -CONFIG_IRDA_FAST_RR=y -# CONFIG_IRDA_DEBUG is not set - -# -# Infrared-port device drivers -# -CONFIG_IRTTY_SIR=m -CONFIG_IRPORT_SIR=m -CONFIG_DONGLE=y -CONFIG_ESI_DONGLE=m -CONFIG_ACTISYS_DONGLE=m -CONFIG_TEKRAM_DONGLE=m -CONFIG_GIRBIL_DONGLE=m -CONFIG_LITELINK_DONGLE=m -CONFIG_MCP2120_DONGLE=m -CONFIG_OLD_BELKIN_DONGLE=m -CONFIG_ACT200L_DONGLE=m -CONFIG_MA600_DONGLE=m -CONFIG_USB_IRDA=m -CONFIG_NSC_FIR=m -CONFIG_WINBOND_FIR=m -CONFIG_TOSHIBA_OLD=m -CONFIG_TOSHIBA_FIR=m -CONFIG_SMC_IRCC_FIR=m -CONFIG_ALI_FIR=m -CONFIG_VLSI_FIR=m - -# -# ISDN subsystem -# -CONFIG_ISDN=m -CONFIG_ISDN_BOOL=y -CONFIG_ISDN_PPP=y -CONFIG_ISDN_PPP_VJ=y -CONFIG_ISDN_MPP=y -CONFIG_ISDN_PPP_BSDCOMP=m -CONFIG_ISDN_AUDIO=y -CONFIG_ISDN_TTY_FAX=y - -# -# ISDN feature submodules -# -CONFIG_ISDN_DRV_LOOP=m -# CONFIG_ISDN_DIVERSION is not set - -# -# Passive ISDN cards -# -CONFIG_ISDN_DRV_HISAX=m -CONFIG_ISDN_HISAX=y -CONFIG_HISAX_EURO=y -CONFIG_DE_AOC=y -# CONFIG_HISAX_NO_SENDCOMPLETE is not set -# CONFIG_HISAX_NO_LLC is not set -# CONFIG_HISAX_NO_KEYPAD is not set -CONFIG_HISAX_1TR6=y -CONFIG_HISAX_NI1=y -CONFIG_HISAX_MAX_CARDS=8 -CONFIG_HISAX_16_0=y -CONFIG_HISAX_16_3=y -CONFIG_HISAX_AVM_A1=y -CONFIG_HISAX_IX1MICROR2=y -CONFIG_HISAX_ASUSCOM=y -CONFIG_HISAX_TELEINT=y -CONFIG_HISAX_HFCS=y -CONFIG_HISAX_SPORTSTER=y -CONFIG_HISAX_MIC=y -CONFIG_HISAX_ISURF=y -CONFIG_HISAX_HSTSAPHIR=y -CONFIG_HISAX_TELESPCI=y -CONFIG_HISAX_S0BOX=y -CONFIG_HISAX_FRITZPCI=y -CONFIG_HISAX_AVM_A1_PCMCIA=y -CONFIG_HISAX_ELSA=y -CONFIG_HISAX_DIEHLDIVA=y -CONFIG_HISAX_SEDLBAUER=y -CONFIG_HISAX_NETJET=y -CONFIG_HISAX_NETJET_U=y -CONFIG_HISAX_NICCY=y -CONFIG_HISAX_BKM_A4T=y -CONFIG_HISAX_SCT_QUADRO=y -CONFIG_HISAX_GAZEL=y -CONFIG_HISAX_HFC_PCI=y -CONFIG_HISAX_W6692=y -CONFIG_HISAX_HFC_SX=y -CONFIG_HISAX_ENTERNOW_PCI=y -CONFIG_HISAX_DEBUG=y -CONFIG_HISAX_SEDLBAUER_CS=m -CONFIG_HISAX_ELSA_CS=m -CONFIG_HISAX_AVM_A1_CS=m -CONFIG_HISAX_ST5481=m -CONFIG_HISAX_FRITZ_PCIPNP=m -CONFIG_USB_AUERISDN=m - -# -# Active ISDN cards -# -CONFIG_ISDN_DRV_ICN=m -CONFIG_ISDN_DRV_PCBIT=m -# CONFIG_ISDN_DRV_SC is not set -# CONFIG_ISDN_DRV_ACT2000 is not set -CONFIG_ISDN_DRV_EICON=y -CONFIG_ISDN_DRV_EICON_DIVAS=m -# CONFIG_ISDN_DRV_EICON_OLD is not set -CONFIG_ISDN_DRV_TPAM=m -CONFIG_ISDN_CAPI=m -CONFIG_ISDN_DRV_AVMB1_VERBOSE_REASON=y -CONFIG_ISDN_CAPI_MIDDLEWARE=y -CONFIG_ISDN_CAPI_CAPI20=m -CONFIG_ISDN_CAPI_CAPIFS_BOOL=y -CONFIG_ISDN_CAPI_CAPIFS=m -CONFIG_ISDN_CAPI_CAPIDRV=m -CONFIG_ISDN_DRV_AVMB1_B1ISA=m -CONFIG_ISDN_DRV_AVMB1_B1PCI=m -CONFIG_ISDN_DRV_AVMB1_B1PCIV4=y -CONFIG_ISDN_DRV_AVMB1_T1ISA=m -CONFIG_ISDN_DRV_AVMB1_B1PCMCIA=m -CONFIG_ISDN_DRV_AVMB1_AVM_CS=m -CONFIG_ISDN_DRV_AVMB1_T1PCI=m -CONFIG_ISDN_DRV_AVMB1_C4=m -CONFIG_HYSDN=m -CONFIG_HYSDN_CAPI=y -CONFIG_KALLSYMS=y - -# -# Old CD-ROM drivers (not SCSI, not IDE) -# -# CONFIG_CD_NO_IDESCSI is not set - -# -# Input core support -# -CONFIG_INPUT=m -CONFIG_INPUT_KEYBDEV=m -CONFIG_INPUT_MOUSEDEV=m -CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 -CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 -CONFIG_INPUT_JOYDEV=m -CONFIG_INPUT_EVDEV=m - -# -# Character devices -# -CONFIG_VT=y -CONFIG_ECC=m -CONFIG_VT_CONSOLE=y -CONFIG_SERIAL=y -CONFIG_SERIAL_CONSOLE=y -CONFIG_SERIAL_EXTENDED=y -CONFIG_SERIAL_MANY_PORTS=y -CONFIG_SERIAL_SHARE_IRQ=y -# CONFIG_SERIAL_DETECT_IRQ is not set -CONFIG_SERIAL_MULTIPORT=y -# CONFIG_HUB6 is not set -CONFIG_SERIAL_NONSTANDARD=y -CONFIG_COMPUTONE=m -CONFIG_ROCKETPORT=m -CONFIG_CYCLADES=m -# CONFIG_CYZ_INTR is not set -CONFIG_DIGIEPCA=m -CONFIG_ESPSERIAL=m -CONFIG_MOXA_INTELLIO=m -CONFIG_MOXA_SMARTIO=m -CONFIG_ISI=m -CONFIG_SYNCLINK=m -# CONFIG_SYNCLINKMP is not set -CONFIG_N_HDLC=m -CONFIG_RISCOM8=m -CONFIG_SPECIALIX=m -CONFIG_SPECIALIX_RTSCTS=y -CONFIG_SX=m -# CONFIG_RIO is not set -CONFIG_STALDRV=y -CONFIG_STALLION=m -CONFIG_ISTALLION=m -CONFIG_UNIX98_PTYS=y -CONFIG_UNIX98_PTY_COUNT=2048 -CONFIG_PRINTER=m -CONFIG_LP_CONSOLE=y -CONFIG_PPDEV=m -CONFIG_TIPAR=m - -# -# I2C support -# -CONFIG_I2C=m -CONFIG_I2C_ALGOBIT=m -CONFIG_I2C_PHILIPSPAR=m -CONFIG_I2C_ELV=m -CONFIG_I2C_VELLEMAN=m -# CONFIG_SCx200_I2C is not set -# CONFIG_SCx200_ACB is not set -CONFIG_I2C_ALGOPCF=m -CONFIG_I2C_ELEKTOR=m -CONFIG_I2C_MAINBOARD=y -CONFIG_I2C_ALI1535=m -CONFIG_I2C_ALI15X3=m -CONFIG_I2C_HYDRA=m -CONFIG_I2C_AMD756=m -# CONFIG_I2C_TSUNAMI is not set -CONFIG_I2C_I801=m -# CONFIG_I2C_I810 is not set -CONFIG_I2C_PIIX4=m -CONFIG_I2C_SIS5595=m -CONFIG_I2C_VIA=m -CONFIG_I2C_VIAPRO=m -CONFIG_I2C_VOODOO3=m -CONFIG_I2C_ISA=m -CONFIG_I2C_CHARDEV=m -CONFIG_I2C_PROC=m - -# -# Hardware sensors support -# -CONFIG_SENSORS=y -CONFIG_SENSORS_ADM1021=m -CONFIG_SENSORS_ADM1024=m -CONFIG_SENSORS_ADM1025=m -CONFIG_SENSORS_ADM9240=m -CONFIG_SENSORS_DS1621=m -CONFIG_SENSORS_FSCPOS=m -CONFIG_SENSORS_FSCSCY=m -CONFIG_SENSORS_GL518SM=m -CONFIG_SENSORS_GL520SM=m -CONFIG_SENSORS_MAXILIFE=m -CONFIG_SENSORS_IT87=m -CONFIG_SENSORS_MTP008=m -CONFIG_SENSORS_LM75=m -CONFIG_SENSORS_LM78=m -CONFIG_SENSORS_LM80=m -CONFIG_SENSORS_LM87=m -CONFIG_SENSORS_LM92=m -CONFIG_SENSORS_SIS5595=m -CONFIG_SENSORS_SMSC47M1=m -CONFIG_SENSORS_THMC50=m -CONFIG_SENSORS_VIA686A=m -CONFIG_SENSORS_VT1211=m -CONFIG_SENSORS_VT8231=m -CONFIG_SENSORS_W83781D=m -CONFIG_SENSORS_OTHER=y -CONFIG_SENSORS_BT869=m -CONFIG_SENSORS_DDCMON=m -CONFIG_SENSORS_EEPROM=m -CONFIG_SENSORS_MATORB=m -CONFIG_SENSORS_PCF8574=m -CONFIG_SENSORS_PCF8591=m - -# -# Mice -# -CONFIG_BUSMOUSE=m -CONFIG_ATIXL_BUSMOUSE=m -CONFIG_LOGIBUSMOUSE=m -CONFIG_MS_BUSMOUSE=m -CONFIG_MOUSE=y -CONFIG_PSMOUSE=y -CONFIG_82C710_MOUSE=m -CONFIG_PC110_PAD=m -CONFIG_MK712_MOUSE=m - -# -# Joysticks -# -CONFIG_INPUT_GAMEPORT=m -CONFIG_INPUT_NS558=m -CONFIG_INPUT_LIGHTNING=m -CONFIG_INPUT_PCIGAME=m -CONFIG_INPUT_CS461X=m -CONFIG_INPUT_EMU10K1=m -CONFIG_INPUT_SERIO=m -CONFIG_INPUT_SERPORT=m -CONFIG_INPUT_ANALOG=m -CONFIG_INPUT_A3D=m -CONFIG_INPUT_ADI=m -CONFIG_INPUT_COBRA=m -CONFIG_INPUT_GF2K=m -CONFIG_INPUT_GRIP=m -CONFIG_INPUT_INTERACT=m -CONFIG_INPUT_TMDC=m -CONFIG_INPUT_SIDEWINDER=m -CONFIG_INPUT_IFORCE_USB=m -CONFIG_INPUT_IFORCE_232=m -CONFIG_INPUT_WARRIOR=m -CONFIG_INPUT_MAGELLAN=m -CONFIG_INPUT_SPACEORB=m -CONFIG_INPUT_SPACEBALL=m -CONFIG_INPUT_STINGER=m -CONFIG_INPUT_DB9=m -CONFIG_INPUT_GAMECON=m -CONFIG_INPUT_TURBOGRAFX=m -# CONFIG_QIC02_TAPE is not set -CONFIG_IPMI_HANDLER=m -# CONFIG_IPMI_PANIC_EVENT is not set -CONFIG_IPMI_DEVICE_INTERFACE=m -CONFIG_IPMI_KCS=m -CONFIG_IPMI_WATCHDOG=m - -# -# Watchdog Cards -# -CONFIG_WATCHDOG=y -# CONFIG_WATCHDOG_NOWAYOUT is not set -CONFIG_ACQUIRE_WDT=m -CONFIG_ADVANTECH_WDT=m -CONFIG_ALIM7101_WDT=m -CONFIG_SC520_WDT=m -CONFIG_PCWATCHDOG=m -CONFIG_EUROTECH_WDT=m -CONFIG_IB700_WDT=m -CONFIG_WAFER_WDT=m -CONFIG_I810_TCO=m -# CONFIG_MIXCOMWD is not set -# CONFIG_60XX_WDT is not set -CONFIG_SC1200_WDT=m -# CONFIG_SCx200_WDT is not set -CONFIG_SOFT_WATCHDOG=m -CONFIG_W83877F_WDT=m -CONFIG_WDT=m -CONFIG_WDTPCI=m -# CONFIG_WDT_501 is not set -CONFIG_MACHZ_WDT=m -CONFIG_AMD7XX_TCO=m -# CONFIG_SCx200_GPIO is not set -CONFIG_AMD_RNG=m -CONFIG_INTEL_RNG=m -CONFIG_AMD_PM768=m -CONFIG_NVRAM=m -CONFIG_RTC=y -CONFIG_DTLK=m -CONFIG_R3964=m -# CONFIG_APPLICOM is not set -CONFIG_SONYPI=m - -# -# Ftape, the floppy tape device driver -# -CONFIG_FTAPE=m -CONFIG_ZFTAPE=m -CONFIG_ZFT_DFLT_BLK_SZ=10240 -CONFIG_ZFT_COMPRESSOR=m -CONFIG_FT_NR_BUFFERS=3 -# CONFIG_FT_PROC_FS is not set -CONFIG_FT_NORMAL_DEBUG=y -# CONFIG_FT_FULL_DEBUG is not set -# CONFIG_FT_NO_TRACE is not set -# CONFIG_FT_NO_TRACE_AT_ALL is not set -CONFIG_FT_STD_FDC=y -# CONFIG_FT_MACH2 is not set -# CONFIG_FT_PROBE_FC10 is not set -# CONFIG_FT_ALT_FDC is not set -CONFIG_FT_FDC_THR=8 -CONFIG_FT_FDC_MAX_RATE=2000 -CONFIG_FT_ALPHA_CLOCK=0 -CONFIG_AGP=m -CONFIG_AGP_INTEL=y -CONFIG_AGP_I810=y -CONFIG_AGP_VIA=y -CONFIG_AGP_AMD=y -CONFIG_AGP_AMD_8151=y -CONFIG_AGP_SIS=y -CONFIG_AGP_ALI=y -CONFIG_AGP_SWORKS=y -CONFIG_DRM=y -# CONFIG_DRM_OLD is not set -CONFIG_DRM_NEW=y -CONFIG_DRM_TDFX=m -CONFIG_DRM_R128=m -CONFIG_DRM_RADEON=m -CONFIG_DRM_I810=m -# CONFIG_DRM_I810_XFREE_41 is not set -CONFIG_DRM_I830=m -CONFIG_DRM_MGA=m -# CONFIG_DRM_SIS is not set - -# -# PCMCIA character devices -# -CONFIG_PCMCIA_SERIAL_CS=m -CONFIG_SYNCLINK_CS=m -CONFIG_MWAVE=m -CONFIG_BATTERY_GERICOM=m - -# -# Multimedia devices -# -CONFIG_VIDEO_DEV=m - -# -# Video For Linux -# -CONFIG_VIDEO_PROC_FS=y -CONFIG_I2C_PARPORT=m -CONFIG_VIDEO_BT848=m -CONFIG_VIDEO_PMS=m -CONFIG_VIDEO_BWQCAM=m -CONFIG_VIDEO_CQCAM=m -CONFIG_VIDEO_W9966=m -CONFIG_VIDEO_CPIA=m -CONFIG_VIDEO_CPIA_PP=m -CONFIG_VIDEO_CPIA_USB=m -CONFIG_VIDEO_SAA5249=m -CONFIG_TUNER_3036=m -CONFIG_VIDEO_STRADIS=m -CONFIG_VIDEO_ZORAN=m -CONFIG_VIDEO_ZORAN_BUZ=m -CONFIG_VIDEO_ZORAN_DC10=m -CONFIG_VIDEO_ZORAN_LML33=m -CONFIG_VIDEO_ZR36120=m -CONFIG_VIDEO_MEYE=m - -# -# Radio Adapters -# -CONFIG_RADIO_CADET=m -CONFIG_RADIO_RTRACK=m -CONFIG_RADIO_RTRACK2=m -CONFIG_RADIO_AZTECH=m -CONFIG_RADIO_GEMTEK=m -CONFIG_RADIO_GEMTEK_PCI=m -CONFIG_RADIO_MAXIRADIO=m -CONFIG_RADIO_MAESTRO=m -CONFIG_RADIO_MIROPCM20=m -CONFIG_RADIO_MIROPCM20_RDS=m -CONFIG_RADIO_SF16FMI=m -CONFIG_RADIO_SF16FMR2=m -CONFIG_RADIO_TERRATEC=m -CONFIG_RADIO_TRUST=m -CONFIG_RADIO_TYPHOON=m -CONFIG_RADIO_TYPHOON_PROC_FS=y -CONFIG_RADIO_ZOLTRIX=m - -# -# Crypto Hardware support -# -CONFIG_CRYPTO=m -CONFIG_CRYPTO_BROADCOM=m - -# -# File systems -# -CONFIG_QUOTA=y -# CONFIG_QFMT_V1 is not set -CONFIG_QFMT_V2=y -# CONFIG_QIFACE_COMPAT is not set -CONFIG_AUTOFS_FS=m -CONFIG_AUTOFS4_FS=m -CONFIG_REISERFS_FS=m -# CONFIG_REISERFS_CHECK is not set -CONFIG_REISERFS_PROC_INFO=y -# CONFIG_ADFS_FS is not set -CONFIG_AFS_FS=m -# CONFIG_ADFS_FS_RW is not set -# CONFIG_AFFS_FS is not set -CONFIG_HFS_FS=m -CONFIG_BEFS_FS=m -# CONFIG_BEFS_DEBUG is not set -CONFIG_BFS_FS=m -CONFIG_EXT3_FS=m -CONFIG_EXT3_FS_XATTR=y -CONFIG_EXT3_FS_XATTR_SHARING=y -CONFIG_EXT3_FS_XATTR_USER=y -CONFIG_JBD=m -# CONFIG_JBD_DEBUG is not set -CONFIG_FAT_FS=m -CONFIG_MSDOS_FS=m -CONFIG_UMSDOS_FS=m -CONFIG_VFAT_FS=m -# CONFIG_EFS_FS is not set -# CONFIG_JFFS_FS is not set -# CONFIG_JFFS2_FS is not set -CONFIG_CRAMFS=m -CONFIG_TMPFS=y -CONFIG_RAMFS=y -CONFIG_ISO9660_FS=y -CONFIG_JOLIET=y -CONFIG_ZISOFS=y -CONFIG_JFS_FS=m -# CONFIG_JFS_DEBUG is not set -# CONFIG_JFS_STATISTICS is not set -CONFIG_MINIX_FS=m -CONFIG_VXFS_FS=m -# CONFIG_NTFS_FS is not set -# CONFIG_NTFS_RW is not set -# CONFIG_HPFS_FS is not set -CONFIG_PROC_FS=y -# CONFIG_DEVFS_FS is not set -# CONFIG_DEVFS_MOUNT is not set -# CONFIG_DEVFS_DEBUG is not set -CONFIG_DEVPTS_FS=y -# CONFIG_QNX4FS_FS is not set -# CONFIG_QNX4FS_RW is not set -CONFIG_ROMFS_FS=m -CONFIG_EXT2_FS=y -CONFIG_EXT2_FS_XATTR=y -CONFIG_EXT2_FS_XATTR_SHARING=y -CONFIG_EXT2_FS_XATTR_USER=y -CONFIG_SYSV_FS=m -CONFIG_UDF_FS=m -CONFIG_UDF_RW=y -CONFIG_UFS_FS=m -# CONFIG_UFS_FS_WRITE is not set - -# -# Network File Systems -# -CONFIG_CODA_FS=m -CONFIG_INTERMEZZO_FS=m -CONFIG_NFS_FS=m -CONFIG_NFS_V3=y -# CONFIG_ROOT_NFS is not set -CONFIG_NFSD=m -CONFIG_NFSD_V3=y -# CONFIG_NFSD_TCP is not set -CONFIG_SUNRPC=m -CONFIG_LOCKD=m -CONFIG_LOCKD_V4=y -CONFIG_SMB_FS=m -# CONFIG_SMB_NLS_DEFAULT is not set -CONFIG_NCP_FS=m -CONFIG_NCPFS_PACKET_SIGNING=y -CONFIG_NCPFS_IOCTL_LOCKING=y -CONFIG_NCPFS_STRONG=y -CONFIG_NCPFS_NFS_NS=y -CONFIG_NCPFS_OS2_NS=y -CONFIG_NCPFS_SMALLDOS=y -CONFIG_NCPFS_NLS=y -CONFIG_NCPFS_EXTRAS=y -CONFIG_ZISOFS_FS=y -CONFIG_FS_MBCACHE=y - -# -# Partition Types -# -CONFIG_PARTITION_ADVANCED=y -# CONFIG_ACORN_PARTITION is not set -CONFIG_OSF_PARTITION=y -# CONFIG_AMIGA_PARTITION is not set -# CONFIG_ATARI_PARTITION is not set -CONFIG_MAC_PARTITION=y -CONFIG_MSDOS_PARTITION=y -CONFIG_BSD_DISKLABEL=y -CONFIG_MINIX_SUBPARTITION=y -CONFIG_SOLARIS_X86_PARTITION=y -CONFIG_UNIXWARE_DISKLABEL=y -# CONFIG_LDM_PARTITION is not set -CONFIG_SGI_PARTITION=y -# CONFIG_ULTRIX_PARTITION is not set -CONFIG_SUN_PARTITION=y -# CONFIG_EFI_PARTITION is not set -CONFIG_SMB_NLS=y -CONFIG_NLS=y - -# -# Native Language Support -# -CONFIG_NLS_DEFAULT="iso8859-1" -CONFIG_NLS_CODEPAGE_437=m -CONFIG_NLS_CODEPAGE_737=m -CONFIG_NLS_CODEPAGE_775=m -CONFIG_NLS_CODEPAGE_850=m -CONFIG_NLS_CODEPAGE_852=m -CONFIG_NLS_CODEPAGE_855=m -CONFIG_NLS_CODEPAGE_857=m -CONFIG_NLS_CODEPAGE_860=m -CONFIG_NLS_CODEPAGE_861=m -CONFIG_NLS_CODEPAGE_862=m -CONFIG_NLS_CODEPAGE_863=m -CONFIG_NLS_CODEPAGE_864=m -CONFIG_NLS_CODEPAGE_865=m -CONFIG_NLS_CODEPAGE_866=m -CONFIG_NLS_CODEPAGE_869=m -CONFIG_NLS_CODEPAGE_936=m -CONFIG_NLS_CODEPAGE_950=m -CONFIG_NLS_CODEPAGE_932=m -CONFIG_NLS_CODEPAGE_949=m -CONFIG_NLS_CODEPAGE_874=m -CONFIG_NLS_ISO8859_8=m -CONFIG_NLS_CODEPAGE_1250=m -CONFIG_NLS_CODEPAGE_1251=m -CONFIG_NLS_ISO8859_1=m -CONFIG_NLS_ISO8859_2=m -CONFIG_NLS_ISO8859_3=m -CONFIG_NLS_ISO8859_4=m -CONFIG_NLS_ISO8859_5=m -CONFIG_NLS_ISO8859_6=m -CONFIG_NLS_ISO8859_7=m -CONFIG_NLS_ISO8859_9=m -CONFIG_NLS_ISO8859_13=m -CONFIG_NLS_ISO8859_14=m -CONFIG_NLS_ISO8859_15=m -CONFIG_NLS_KOI8_R=m -CONFIG_NLS_KOI8_U=m -CONFIG_NLS_UTF8=m - -# -# Console drivers -# -CONFIG_VGA_CONSOLE=y -CONFIG_VIDEO_SELECT=y -# CONFIG_VIDEO_IGNORE_BAD_MODE is not set -CONFIG_MDA_CONSOLE=m - -# -# Frame-buffer support -# -CONFIG_FB=y -CONFIG_DUMMY_CONSOLE=y -CONFIG_FB_RIVA=m -CONFIG_FB_CLGEN=m -CONFIG_FB_PM2=m -# CONFIG_FB_PM2_FIFO_DISCONNECT is not set -CONFIG_FB_PM2_PCI=y -CONFIG_FB_PM3=m -# CONFIG_FB_CYBER2000 is not set -CONFIG_FB_VESA=y -CONFIG_FB_VGA16=m -CONFIG_FB_HGA=m -CONFIG_VIDEO_SELECT=y -CONFIG_FB_MATROX=m -CONFIG_FB_MATROX_MILLENIUM=y -CONFIG_FB_MATROX_MYSTIQUE=y -# CONFIG_FB_MATROX_G450 is not set -CONFIG_FB_MATROX_G100A=y -CONFIG_FB_MATROX_G100=y -CONFIG_FB_MATROX_I2C=m -CONFIG_FB_MATROX_MAVEN=m -# CONFIG_FB_MATROX_PROC is not set -CONFIG_FB_MATROX_MULTIHEAD=y -CONFIG_FB_ATY=m -CONFIG_FB_ATY_GX=y -CONFIG_FB_ATY_CT=y -CONFIG_FB_ATY_CT_VAIO_LCD=y -CONFIG_FB_RADEON=m -CONFIG_FB_ATY128=m -CONFIG_FB_SIS=m -CONFIG_FB_SIS_300=y -CONFIG_FB_SIS_315=y -CONFIG_FB_NEOMAGIC=m -CONFIG_FB_3DFX=m -CONFIG_FB_VOODOO1=m -# CONFIG_FB_TRIDENT is not set -# CONFIG_FB_VIRTUAL is not set -# CONFIG_FBCON_ADVANCED is not set -CONFIG_FBCON_MFB=m -CONFIG_FBCON_CFB8=y -CONFIG_FBCON_CFB16=y -CONFIG_FBCON_CFB24=y -CONFIG_FBCON_CFB32=y -CONFIG_FBCON_VGA_PLANES=m -CONFIG_FBCON_HGA=m -# CONFIG_FBCON_FONTWIDTH8_ONLY is not set -# CONFIG_FBCON_FONTS is not set -CONFIG_FONT_8x8=y -CONFIG_FONT_8x16=y - -# -# Sound -# -CONFIG_SOUND=m -CONFIG_SOUND_ALI5455=m -CONFIG_SOUND_BT878=m -CONFIG_SOUND_CMPCI=m -CONFIG_SOUND_CMPCI_FM=y -CONFIG_SOUND_CMPCI_FMIO=388 -CONFIG_SOUND_CMPCI_FMIO=388 -CONFIG_SOUND_CMPCI_MIDI=y -CONFIG_SOUND_CMPCI_MPUIO=330 -CONFIG_SOUND_CMPCI_JOYSTICK=y -CONFIG_SOUND_CMPCI_CM8738=y -# CONFIG_SOUND_CMPCI_SPDIFINVERSE is not set -CONFIG_SOUND_CMPCI_SPDIFLOOP=y -CONFIG_SOUND_CMPCI_SPEAKERS=2 -CONFIG_SOUND_EMU10K1=m -CONFIG_MIDI_EMU10K1=y -CONFIG_SOUND_AUDIGY=m -CONFIG_SOUND_FUSION=m -CONFIG_SOUND_CS4281=m -CONFIG_SOUND_ES1370=m -CONFIG_SOUND_ES1371=m -CONFIG_SOUND_ESSSOLO1=m -CONFIG_SOUND_MAESTRO=m -CONFIG_SOUND_MAESTRO3=m -CONFIG_SOUND_FORTE=m -CONFIG_SOUND_ICH=m -CONFIG_SOUND_RME96XX=m -CONFIG_SOUND_SONICVIBES=m -CONFIG_SOUND_TRIDENT=m -CONFIG_SOUND_MSNDCLAS=m -# CONFIG_MSNDCLAS_HAVE_BOOT is not set -CONFIG_MSNDCLAS_INIT_FILE="/etc/sound/msndinit.bin" -CONFIG_MSNDCLAS_PERM_FILE="/etc/sound/msndperm.bin" -CONFIG_SOUND_MSNDPIN=m -# CONFIG_MSNDPIN_HAVE_BOOT is not set -CONFIG_MSNDPIN_INIT_FILE="/etc/sound/pndspini.bin" -CONFIG_MSNDPIN_PERM_FILE="/etc/sound/pndsperm.bin" -CONFIG_SOUND_VIA82CXXX=m -CONFIG_MIDI_VIA82CXXX=y -CONFIG_SOUND_OSS=m -# CONFIG_SOUND_TRACEINIT is not set -CONFIG_SOUND_DMAP=y -CONFIG_SOUND_AD1816=m -CONFIG_SOUND_AD1889=m -CONFIG_SOUND_SGALAXY=m -CONFIG_SOUND_ADLIB=m -CONFIG_SOUND_ACI_MIXER=m -CONFIG_SOUND_CS4232=m -CONFIG_SOUND_SSCAPE=m -CONFIG_SOUND_GUS=m -CONFIG_SOUND_GUS16=y -CONFIG_SOUND_GUSMAX=y -CONFIG_SOUND_VMIDI=m -CONFIG_SOUND_TRIX=m -CONFIG_SOUND_MSS=m -CONFIG_SOUND_MPU401=m -CONFIG_SOUND_NM256=m -CONFIG_SOUND_MAD16=m -CONFIG_MAD16_OLDCARD=y -CONFIG_SOUND_PAS=m -# CONFIG_PAS_JOYSTICK is not set -CONFIG_SOUND_PSS=m -# CONFIG_PSS_MIXER is not set -# CONFIG_PSS_HAVE_BOOT is not set -CONFIG_SOUND_SB=m -CONFIG_SOUND_AWE32_SYNTH=m -CONFIG_SOUND_KAHLUA=m -CONFIG_SOUND_WAVEFRONT=m -CONFIG_SOUND_MAUI=m -CONFIG_SOUND_YM3812=m -CONFIG_SOUND_OPL3SA1=m -CONFIG_SOUND_OPL3SA2=m -CONFIG_SOUND_YMFPCI=m -CONFIG_SOUND_YMFPCI_LEGACY=y -CONFIG_SOUND_UART6850=m -CONFIG_SOUND_AEDSP16=m -CONFIG_SC6600=y -CONFIG_SC6600_JOY=y -CONFIG_SC6600_CDROM=4 -CONFIG_SC6600_CDROMBASE=0 -CONFIG_AEDSP16_SBPRO=y -CONFIG_AEDSP16_MPU401=y -CONFIG_SOUND_TVMIXER=m - -# -# USB support -# -CONFIG_USB=m -# CONFIG_USB_DEBUG is not set -CONFIG_USB_DEVICEFS=y -# CONFIG_USB_BANDWIDTH is not set -CONFIG_USB_EHCI_HCD=m -CONFIG_USB_UHCI=m -CONFIG_USB_UHCI_ALT=m -CONFIG_USB_OHCI=m -CONFIG_USB_AUDIO=m -# CONFIG_USB_EMI26 is not set -CONFIG_USB_MIDI=m -CONFIG_USB_STORAGE=m -# CONFIG_USB_STORAGE_DEBUG is not set -CONFIG_USB_STORAGE_DATAFAB=y -CONFIG_USB_STORAGE_FREECOM=y -CONFIG_USB_STORAGE_ISD200=y -CONFIG_USB_STORAGE_DPCM=y -CONFIG_USB_STORAGE_HP8200e=y -CONFIG_USB_STORAGE_SDDR09=y -CONFIG_USB_STORAGE_SDDR55=y -CONFIG_USB_STORAGE_JUMPSHOT=y -CONFIG_USB_ACM=m -CONFIG_USB_PRINTER=m -CONFIG_USB_HID=m -CONFIG_USB_HIDINPUT=y -CONFIG_USB_HIDDEV=y -# CONFIG_USB_KBD is not set -# CONFIG_USB_MOUSE is not set -CONFIG_USB_AIPTEK=m -CONFIG_USB_WACOM=m -CONFIG_USB_KBTAB=m -CONFIG_USB_POWERMATE=m -# CONFIG_USB_DC2XX is not set -CONFIG_USB_MDC800=m -CONFIG_USB_SCANNER=m -CONFIG_USB_MICROTEK=m -CONFIG_USB_HPUSBSCSI=m -CONFIG_USB_IBMCAM=m -CONFIG_USB_KONICAWC=m -CONFIG_USB_OV511=m -CONFIG_USB_PWC=m -CONFIG_USB_SE401=m -CONFIG_USB_STV680=m -CONFIG_USB_VICAM=m -CONFIG_USB_DSBR=m -CONFIG_USB_DABUSB=m -CONFIG_USB_PEGASUS=m -CONFIG_USB_RTL8150=m -CONFIG_USB_KAWETH=m -CONFIG_USB_CATC=m -CONFIG_USB_CDCETHER=m -CONFIG_USB_USBNET=m -CONFIG_USB_USS720=m - -# -# USB Serial Converter support -# -CONFIG_USB_SERIAL=m -# CONFIG_USB_SERIAL_DEBUG is not set -CONFIG_USB_SERIAL_GENERIC=y -CONFIG_USB_SERIAL_BELKIN=m -CONFIG_USB_SERIAL_WHITEHEAT=m -CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m -CONFIG_USB_SERIAL_EMPEG=m -CONFIG_USB_SERIAL_FTDI_SIO=m -CONFIG_USB_SERIAL_VISOR=m -CONFIG_USB_SERIAL_IPAQ=m -CONFIG_USB_SERIAL_IR=m -CONFIG_USB_SERIAL_EDGEPORT=m -CONFIG_USB_SERIAL_EDGEPORT_TI=m -CONFIG_USB_SERIAL_KEYSPAN_PDA=m -CONFIG_USB_SERIAL_KEYSPAN=m -# CONFIG_USB_SERIAL_KEYSPAN_USA28 is not set -# CONFIG_USB_SERIAL_KEYSPAN_USA28X is not set -CONFIG_USB_SERIAL_KEYSPAN_USA28XA=y -CONFIG_USB_SERIAL_KEYSPAN_USA28XB=y -# CONFIG_USB_SERIAL_KEYSPAN_USA19 is not set -# CONFIG_USB_SERIAL_KEYSPAN_USA18X is not set -CONFIG_USB_SERIAL_KEYSPAN_USA19W=y -CONFIG_USB_SERIAL_KEYSPAN_USA19QW=y -CONFIG_USB_SERIAL_KEYSPAN_USA19QI=y -CONFIG_USB_SERIAL_KEYSPAN_MPR=y -CONFIG_USB_SERIAL_KEYSPAN_USA49W=y -CONFIG_USB_SERIAL_KEYSPAN_USA49WLC=y -CONFIG_USB_SERIAL_MCT_U232=m -CONFIG_USB_SERIAL_KLSI=m -CONFIG_USB_SERIAL_KOBIL_SCT=m -CONFIG_USB_SERIAL_PL2303=m -CONFIG_USB_SERIAL_CYBERJACK=m -CONFIG_USB_SERIAL_XIRCOM=m -CONFIG_USB_SERIAL_OMNINET=m -CONFIG_USB_RIO500=m -CONFIG_USB_AUERSWALD=m -CONFIG_USB_TIGL=m -CONFIG_USB_BRLVGER=m -CONFIG_USB_LCD=m - -# -# Additional device driver support -# -CONFIG_NET_BROADCOM=m -CONFIG_CIPE=m -CONFIG_CRYPTO_AEP=m -CONFIG_MEGARAC=m -CONFIG_FC_QLA2200=m -CONFIG_FC_QLA2300=m -CONFIG_SCSI_ISCSI=m - -# -# Bluetooth support -# -CONFIG_BLUEZ=m -CONFIG_BLUEZ_L2CAP=m -CONFIG_BLUEZ_SCO=m -CONFIG_BLUEZ_RFCOMM=m -CONFIG_BLUEZ_RFCOMM_TTY=y -CONFIG_BLUEZ_BNEP=m -CONFIG_BLUEZ_BNEP_MC_FILTER=y -CONFIG_BLUEZ_BNEP_PROTO_FILTER=y - -# -# Bluetooth device drivers -# -CONFIG_BLUEZ_HCIUSB=m -CONFIG_BLUEZ_USB_SCO=y -CONFIG_BLUEZ_USB_ZERO_PACKET=y -CONFIG_BLUEZ_HCIUART=m -CONFIG_BLUEZ_HCIUART_H4=y -CONFIG_BLUEZ_HCIUART_BCSP=y -CONFIG_BLUEZ_HCIUART_BCSP_TXCRC=y -CONFIG_BLUEZ_HCIDTL1=m -CONFIG_BLUEZ_HCIBT3C=m -CONFIG_BLUEZ_HCIBLUECARD=m -CONFIG_BLUEZ_HCIBTUART=m -CONFIG_BLUEZ_HCIVHCI=m - -# -# Profiling support -# -CONFIG_PROFILING=y -CONFIG_OPROFILE=m - -# -# Kernel hacking -# -CONFIG_DEBUG_KERNEL=y -CONFIG_DEBUG_STACKOVERFLOW=y -# CONFIG_DEBUG_HIGHMEM is not set -# CONFIG_DEBUG_SLAB is not set -# CONFIG_DEBUG_IOVIRT is not set -CONFIG_MAGIC_SYSRQ=y -# CONFIG_DEBUG_SPINLOCK is not set -# CONFIG_FRAME_POINTER is not set -# CONFIG_MCL_COREDUMP is not set - -# -# Library routines -# -CONFIG_ZLIB_INFLATE=y -CONFIG_ZLIB_DEFLATE=m diff --git a/lustre/kernel_patches/patches/dev_read_only_2.6.0.patch b/lustre/kernel_patches/patches/dev_read_only_2.6.0.patch index f0f79df..9639f28 100644 --- a/lustre/kernel_patches/patches/dev_read_only_2.6.0.patch +++ b/lustre/kernel_patches/patches/dev_read_only_2.6.0.patch @@ -2,25 +2,31 @@ include/linux/blkdev.h | 1 2 files changed, 50 insertions(+) ---- linux-2.6.0-test6/drivers/block/ll_rw_blk.c~dev_read_only_2.6.0 2003-10-14 19:56:55.000000000 +0400 -+++ linux-2.6.0-test6-alexey/drivers/block/ll_rw_blk.c 2003-10-22 01:35:56.000000000 +0400 -@@ -2213,6 +2213,9 @@ end_io: - +Index: linux-2.6.0/drivers/block/ll_rw_blk.c +=================================================================== +--- linux-2.6.0.orig/drivers/block/ll_rw_blk.c 2004-01-04 15:27:35.000000000 +0300 ++++ linux-2.6.0/drivers/block/ll_rw_blk.c 2004-01-07 17:35:57.000000000 +0300 +@@ -2298,6 +2298,13 @@ if (test_bit(QUEUE_FLAG_DEAD, &q->queue_flags)) goto end_io; -+ if (test_bit(QUEUE_FLAG_RDONLY, &q->queue_flags) -+ && bio->bi_rw == WRITE) -+ goto end_io; ++ /* this is cfs's dev_rdonly check */ ++ if (bio->bi_rw == WRITE && ++ dev_check_rdonly(bio->bi_bdev->bd_dev)) { ++ bio_endio(bio, bio->bi_size, 0); ++ break; ++ } ++ /* * If this device has partitions, remap block n -@@ -2867,6 +2870,52 @@ void blk_unregister_queue(struct gendisk - } + * of partition p to block n+start(p) of the disk. +@@ -2805,6 +2812,58 @@ + *ioc2 = temp; } +#define MAX_RDONLY_DEVS 16 + -+static struct block_device *rdonly_devs[MAX_RDONLY_DEVS] = {0, }; ++static dev_t rdonly_devs[MAX_RDONLY_DEVS] = {0, }; + +/* + * Debug code for turning block devices "read-only" (will discard writes @@ -28,54 +34,48 @@ + */ +void dev_set_rdonly(struct block_device *bdev, int no_write) +{ -+ if (bdev) { -+ request_queue_t *q; ++ if (no_write >= MAX_RDONLY_DEVS) { ++ printk(KERN_ALERT "%s:%d illegal arg %d (max %d)\n", ++ __FILE__, __LINE__, no_write, MAX_RDONLY_DEVS); ++ return; ++ } + -+ q = bdev_get_queue(bdev); -+ if (!q) { -+ printk(KERN_ERR -+ "dev_set_rdonly() for non-existing device\n"); -+ return; -+ } -+ printk(KERN_WARNING "Turning device %s read-only\n", -+ bdev->bd_disk ? bdev->bd_disk->disk_name : "?"); -+ set_bit(QUEUE_FLAG_RDONLY, &q->queue_flags); -+ rdonly_devs[no_write] = bdev; ++ if (bdev) { ++ printk(KERN_WARNING "Turning device %s read-only at %d\n", ++ bdev->bd_disk ? bdev->bd_disk->disk_name : "?", ++ no_write); ++ rdonly_devs[no_write] = bdev->bd_dev; + } +} + +void dev_clear_rdonly(int no_write) +{ -+ request_queue_t *q; -+ -+ if (rdonly_devs[no_write] == NULL) -+ return; -+ -+ q = bdev_get_queue(rdonly_devs[no_write]); -+ if (!q) { -+ printk(KERN_ERR -+ "dev_clear_rdonly: no queue for device at slot %d\n", -+ no_write); ++ if (no_write >= MAX_RDONLY_DEVS) { ++ printk(KERN_ALERT "%s:%d illegal arg %d (max %d)\n", ++ __FILE__, __LINE__, no_write, MAX_RDONLY_DEVS); + return; + } -+ clear_bit(QUEUE_FLAG_RDONLY, &q->queue_flags); -+ rdonly_devs[no_write] = NULL; ++ ++ if (rdonly_devs[no_write] == 0) ++ return; ++ ++ printk(KERN_WARNING "Clearing read-only at %d\n", no_write); ++ rdonly_devs[no_write] = 0; ++} ++ ++int dev_check_rdonly(dev_t dev) ++{ ++ int i; ++ ++ for (i = 0; i < MAX_RDONLY_DEVS; i++) ++ if (rdonly_devs[i] == dev) ++ return 1; ++ return 0; +} + +EXPORT_SYMBOL(dev_set_rdonly); +EXPORT_SYMBOL(dev_clear_rdonly); ++EXPORT_SYMBOL(dev_check_rdonly); - EXPORT_SYMBOL(process_that_request_first); - EXPORT_SYMBOL(end_that_request_first); ---- linux-2.6.0-test6/include/linux/blkdev.h~dev_read_only_2.6.0 2003-10-14 19:57:05.000000000 +0400 -+++ linux-2.6.0-test6-alexey/include/linux/blkdev.h 2003-10-21 23:31:18.000000000 +0400 -@@ -367,6 +367,7 @@ struct request_queue - #define QUEUE_FLAG_READFULL 3 /* write queue has been filled */ - #define QUEUE_FLAG_WRITEFULL 4 /* read queue has been filled */ - #define QUEUE_FLAG_DEAD 5 /* queue being torn down */ -+#define QUEUE_FLAG_RDONLY 6 /* queue accepts reads only */ - - #define blk_queue_plugged(q) !list_empty(&(q)->plug_list) - #define blk_queue_tagged(q) test_bit(QUEUE_FLAG_QUEUED, &(q)->queue_flags) - -_ + /* + * sysfs parts below diff --git a/lustre/kernel_patches/patches/ext3-delete_thread-suse.patch b/lustre/kernel_patches/patches/ext3-delete_thread-suse.patch index 083e028..f3d7f3c 100644 --- a/lustre/kernel_patches/patches/ext3-delete_thread-suse.patch +++ b/lustre/kernel_patches/patches/ext3-delete_thread-suse.patch @@ -7,9 +7,9 @@ Index: linux-2.4.21-suse/fs/ext3/super.c =================================================================== ---- linux-2.4.21-suse.orig/fs/ext3/super.c 2003-10-30 02:03:04.000000000 +0300 -+++ linux-2.4.21-suse/fs/ext3/super.c 2003-10-30 02:05:38.000000000 +0300 -@@ -400,6 +400,220 @@ +--- linux-2.4.21-suse.orig/fs/ext3/super.c 2004-01-12 19:49:25.000000000 +0300 ++++ linux-2.4.21-suse/fs/ext3/super.c 2004-01-13 17:39:59.000000000 +0300 +@@ -400,6 +400,221 @@ } } @@ -123,7 +123,8 @@ Index: linux-2.4.21-suse/fs/ext3/super.c + + clear_opt(sbi->s_mount_opt, ASYNCDEL); + wake_up(&sbi->s_delete_thread_queue); -+ wait_event(sbi->s_delete_waiter_queue, list_empty(&sbi->s_delete_list)); ++ wait_event(sbi->s_delete_waiter_queue, ++ sbi->s_delete_list.next == 0 && sbi->s_delete_inodes == 0); +} + +/* Instead of playing games with the inode flags, destruction, etc we just @@ -230,15 +231,15 @@ Index: linux-2.4.21-suse/fs/ext3/super.c void ext3_put_super (struct super_block * sb) { struct ext3_sb_info *sbi = EXT3_SB(sb); -@@ -407,6 +621,7 @@ +@@ -407,6 +622,7 @@ kdev_t j_dev = sbi->s_journal->j_dev; int i; -+ ext3_stop_delete_thread(sbi); ++ J_ASSERT(sbi->s_delete_inodes == 0); ext3_xattr_put_super(sb); journal_destroy(sbi->s_journal); if (!(sb->s_flags & MS_RDONLY)) { -@@ -455,7 +670,11 @@ +@@ -455,7 +671,11 @@ write_inode: ext3_write_inode, /* BKL not held. Don't need */ dirty_inode: ext3_dirty_inode, /* BKL not held. We take it */ put_inode: ext3_put_inode, /* BKL not held. Don't need */ @@ -250,7 +251,7 @@ Index: linux-2.4.21-suse/fs/ext3/super.c put_super: ext3_put_super, /* BKL held */ write_super: ext3_write_super, /* BKL held */ sync_fs: ext3_sync_fs, -@@ -524,6 +743,13 @@ +@@ -524,6 +744,13 @@ clear_opt (*mount_options, XATTR_USER); else #endif @@ -264,7 +265,7 @@ Index: linux-2.4.21-suse/fs/ext3/super.c if (!strcmp (this_char, "bsddf")) clear_opt (*mount_options, MINIX_DF); else if (!strcmp (this_char, "nouid32")) { -@@ -1223,6 +1449,7 @@ +@@ -1223,6 +1450,7 @@ } ext3_setup_super (sb, es, sb->s_flags & MS_RDONLY); @@ -272,7 +273,21 @@ Index: linux-2.4.21-suse/fs/ext3/super.c /* * akpm: core read_super() calls in here with the superblock locked. * That deadlocks, because orphan cleanup needs to lock the superblock -@@ -1678,6 +1905,9 @@ +@@ -1614,7 +1842,12 @@ + static int ext3_sync_fs(struct super_block *sb) + { + tid_t target; +- ++ ++ if (atomic_read(&sb->s_active) == 0) { ++ /* fs is being umounted: time to stop delete thread */ ++ ext3_stop_delete_thread(EXT3_SB(sb)); ++ } ++ + sb->s_dirt = 0; + target = log_start_commit(EXT3_SB(sb)->s_journal, NULL); + log_wait_commit(EXT3_SB(sb)->s_journal, target); +@@ -1678,6 +1911,9 @@ if (!parse_options(data, &tmp, sbi, &tmp, 1)) return -EINVAL; @@ -284,8 +299,8 @@ Index: linux-2.4.21-suse/fs/ext3/super.c Index: linux-2.4.21-suse/fs/ext3/inode.c =================================================================== ---- linux-2.4.21-suse.orig/fs/ext3/inode.c 2003-10-30 02:03:57.000000000 +0300 -+++ linux-2.4.21-suse/fs/ext3/inode.c 2003-10-30 02:05:38.000000000 +0300 +--- linux-2.4.21-suse.orig/fs/ext3/inode.c 2004-01-13 17:38:09.000000000 +0300 ++++ linux-2.4.21-suse/fs/ext3/inode.c 2004-01-13 17:38:10.000000000 +0300 @@ -2552,6 +2552,118 @@ return err; } @@ -407,8 +422,8 @@ Index: linux-2.4.21-suse/fs/ext3/inode.c * iloc->bh. This _must_ be cleaned up later. Index: linux-2.4.21-suse/fs/ext3/file.c =================================================================== ---- linux-2.4.21-suse.orig/fs/ext3/file.c 2003-10-30 01:40:33.000000000 +0300 -+++ linux-2.4.21-suse/fs/ext3/file.c 2003-10-30 02:05:38.000000000 +0300 +--- linux-2.4.21-suse.orig/fs/ext3/file.c 2004-01-12 19:49:25.000000000 +0300 ++++ linux-2.4.21-suse/fs/ext3/file.c 2004-01-13 17:38:10.000000000 +0300 @@ -125,7 +125,11 @@ }; @@ -423,8 +438,8 @@ Index: linux-2.4.21-suse/fs/ext3/file.c getxattr: ext3_getxattr, /* BKL held */ Index: linux-2.4.21-suse/include/linux/ext3_fs.h =================================================================== ---- linux-2.4.21-suse.orig/include/linux/ext3_fs.h 2003-10-30 02:03:57.000000000 +0300 -+++ linux-2.4.21-suse/include/linux/ext3_fs.h 2003-10-30 02:06:05.000000000 +0300 +--- linux-2.4.21-suse.orig/include/linux/ext3_fs.h 2004-01-13 17:38:09.000000000 +0300 ++++ linux-2.4.21-suse/include/linux/ext3_fs.h 2004-01-13 17:38:10.000000000 +0300 @@ -193,6 +193,7 @@ */ #define EXT3_STATE_JDATA 0x00000001 /* journaled data exists */ @@ -453,8 +468,8 @@ Index: linux-2.4.21-suse/include/linux/ext3_fs.h /* ioctl.c */ Index: linux-2.4.21-suse/include/linux/ext3_fs_sb.h =================================================================== ---- linux-2.4.21-suse.orig/include/linux/ext3_fs_sb.h 2003-10-30 02:03:04.000000000 +0300 -+++ linux-2.4.21-suse/include/linux/ext3_fs_sb.h 2003-10-30 02:05:38.000000000 +0300 +--- linux-2.4.21-suse.orig/include/linux/ext3_fs_sb.h 2004-01-12 19:49:25.000000000 +0300 ++++ linux-2.4.21-suse/include/linux/ext3_fs_sb.h 2004-01-13 17:38:10.000000000 +0300 @@ -29,6 +29,8 @@ #define EXT3_MAX_GROUP_LOADED 8 diff --git a/lustre/kernel_patches/patches/ext3-ea-in-inode-2.4.18-chaos.patch b/lustre/kernel_patches/patches/ext3-ea-in-inode-2.4.18-chaos.patch index bc6ee77..108cc43 100644 --- a/lustre/kernel_patches/patches/ext3-ea-in-inode-2.4.18-chaos.patch +++ b/lustre/kernel_patches/patches/ext3-ea-in-inode-2.4.18-chaos.patch @@ -603,7 +603,7 @@ * ext3_xattr_set() * * Create, replace or remove an extended attribute for this inode. Buffer -@@ -583,6 +1067,100 @@ static void ext3_xattr_update_super_bloc +@@ -583,6 +1067,101 @@ static void ext3_xattr_update_super_bloc */ int ext3_xattr_set(handle_t *handle, struct inode *inode, int name_index, @@ -643,10 +643,11 @@ + if (err != 0 && err != -ENOENT) { + /* not found EA in block */ + goto finish; ++ } else if (err == 0) { ++ /* found EA in block */ ++ where = 1; ++ found = 1; + } -+ /* found EA in block */ -+ where = 1; -+ found = 1; + } else + goto finish; + diff --git a/lustre/kernel_patches/patches/ext3-ea-in-inode-2.4.20.patch b/lustre/kernel_patches/patches/ext3-ea-in-inode-2.4.20.patch index cd569f4..55fa141 100644 --- a/lustre/kernel_patches/patches/ext3-ea-in-inode-2.4.20.patch +++ b/lustre/kernel_patches/patches/ext3-ea-in-inode-2.4.20.patch @@ -605,7 +605,7 @@ * ext3_xattr_set() * * Create, replace or remove an extended attribute for this inode. Buffer -@@ -566,6 +1050,100 @@ static void ext3_xattr_update_super_bloc +@@ -566,6 +1050,101 @@ static void ext3_xattr_update_super_bloc */ int ext3_xattr_set(handle_t *handle, struct inode *inode, int name_index, @@ -645,10 +645,11 @@ + if (err != 0 && err != -ENOENT) { + /* not found EA in block */ + goto finish; ++ } else if (err == 0) { ++ /* found EA in block */ ++ where = 1; ++ found = 1; + } -+ /* found EA in block */ -+ where = 1; -+ found = 1; + } else + goto finish; + diff --git a/lustre/kernel_patches/patches/ext3-ea-in-inode-2.4.22-rh.patch b/lustre/kernel_patches/patches/ext3-ea-in-inode-2.4.22-rh.patch index 5800fe0..736a930 100644 --- a/lustre/kernel_patches/patches/ext3-ea-in-inode-2.4.22-rh.patch +++ b/lustre/kernel_patches/patches/ext3-ea-in-inode-2.4.22-rh.patch @@ -620,7 +620,7 @@ * ext3_xattr_set() * * Create, replace or remove an extended attribute for this inode. Buffer -@@ -566,6 +1050,100 @@ static void ext3_xattr_update_super_bloc +@@ -566,6 +1050,101 @@ static void ext3_xattr_update_super_bloc */ int ext3_xattr_set(handle_t *handle, struct inode *inode, int name_index, @@ -660,10 +660,11 @@ + if (err != 0 && err != -ENOENT) { + /* not found EA in block */ + goto finish; ++ } else if (err == 0) { ++ /* found EA in block */ ++ where = 1; ++ found = 1; + } -+ /* found EA in block */ -+ where = 1; -+ found = 1; + } else + goto finish; + diff --git a/lustre/kernel_patches/patches/ext3-extents-2.4.18-chaos.patch b/lustre/kernel_patches/patches/ext3-extents-2.4.18-chaos.patch index a0ff220..a88b30d 100644 --- a/lustre/kernel_patches/patches/ext3-extents-2.4.18-chaos.patch +++ b/lustre/kernel_patches/patches/ext3-extents-2.4.18-chaos.patch @@ -8,9 +8,14 @@ include/linux/ext3_fs_sb.h | 10 8 files changed, 1684 insertions(+), 8 deletions(-) ---- /dev/null 2003-01-30 13:24:37.000000000 +0300 -+++ linux-2.4.18-chaos-alexey/fs/ext3/extents.c 2003-09-23 18:08:59.000000000 +0400 -1inux/fs/ext3/extents.c +Index: linux-2.4.18-chaos/fs/ext3/extents.c +=================================================================== +--- linux-2.4.18-chaos.orig/fs/ext3/extents.c 2003-01-30 13:24:37.000000000 +0300 ++++ linux-2.4.18-chaos/fs/ext3/extents.c 2004-01-13 16:11:00.000000000 +0300 +@@ -0,0 +1,1614 @@ ++/* ++ * ++ * linux/fs/ext3/extents.c + * + * Extents support for EXT3 + * @@ -1622,10 +1627,11 @@ + sbi->s_ext_sum / sbi->s_ext_count, + sbi->s_ext_blocks / sbi->s_ext_extents); +} -+ ---- linux-2.4.18-chaos/fs/ext3/ialloc.c~ext3-extents-2.4.18-chaos 2003-09-19 22:07:14.000000000 +0400 -+++ linux-2.4.18-chaos-alexey/fs/ext3/ialloc.c 2003-09-20 00:18:43.000000000 +0400 -@@ -573,6 +573,10 @@ repeat: +Index: linux-2.4.18-chaos/fs/ext3/ialloc.c +=================================================================== +--- linux-2.4.18-chaos.orig/fs/ext3/ialloc.c 2004-01-13 16:10:23.000000000 +0300 ++++ linux-2.4.18-chaos/fs/ext3/ialloc.c 2004-01-13 16:11:00.000000000 +0300 +@@ -573,6 +573,10 @@ ei->i_prealloc_count = 0; #endif ei->i_block_group = i; @@ -1636,9 +1642,11 @@ if (ei->i_flags & EXT3_SYNC_FL) inode->i_flags |= S_SYNC; ---- linux-2.4.18-chaos/fs/ext3/inode.c~ext3-extents-2.4.18-chaos 2003-09-19 22:07:14.000000000 +0400 -+++ linux-2.4.18-chaos-alexey/fs/ext3/inode.c 2003-09-22 15:40:30.000000000 +0400 -@@ -842,6 +842,15 @@ changed: +Index: linux-2.4.18-chaos/fs/ext3/inode.c +=================================================================== +--- linux-2.4.18-chaos.orig/fs/ext3/inode.c 2004-01-13 16:10:23.000000000 +0300 ++++ linux-2.4.18-chaos/fs/ext3/inode.c 2004-01-13 16:11:00.000000000 +0300 +@@ -842,6 +842,15 @@ goto reread; } @@ -1654,7 +1662,7 @@ /* * The BKL is not held on entry here. */ -@@ -855,7 +864,7 @@ static int ext3_get_block(struct inode * +@@ -855,7 +864,7 @@ handle = ext3_journal_current_handle(); J_ASSERT(handle != 0); } @@ -1663,7 +1671,7 @@ bh_result, create, 1); return ret; } -@@ -882,7 +891,7 @@ ext3_direct_io_get_block(struct inode *i +@@ -882,7 +891,7 @@ } } if (ret == 0) @@ -1672,7 +1680,7 @@ bh_result, create, 0); if (ret == 0) bh_result->b_size = (1 << inode->i_blkbits); -@@ -904,7 +913,7 @@ struct buffer_head *ext3_getblk(handle_t +@@ -904,7 +913,7 @@ dummy.b_state = 0; dummy.b_blocknr = -1000; buffer_trace_init(&dummy.b_history); @@ -1681,7 +1689,7 @@ if (!*errp && buffer_mapped(&dummy)) { struct buffer_head *bh; bh = sb_getblk(inode->i_sb, dummy.b_blocknr); -@@ -1520,7 +1529,7 @@ ext3_block_truncate_page_prepare(struct +@@ -1520,7 +1529,7 @@ * This required during truncate. We need to physically zero the tail end * of that block so it doesn't yield old data if the file is later grown. */ @@ -1690,7 +1698,7 @@ struct address_space *mapping, loff_t from, struct page *page, unsigned blocksize) { -@@ -1998,6 +2007,9 @@ void ext3_truncate(struct inode * inode) +@@ -1998,6 +2007,9 @@ ext3_discard_prealloc(inode); @@ -1700,7 +1708,7 @@ blocksize = inode->i_sb->s_blocksize; last_block = (inode->i_size + blocksize-1) >> EXT3_BLOCK_SIZE_BITS(inode->i_sb); -@@ -2436,6 +2448,8 @@ void ext3_read_inode(struct inode * inod +@@ -2436,6 +2448,8 @@ ei->i_prealloc_count = 0; #endif ei->i_block_group = iloc.block_group; @@ -1709,7 +1717,7 @@ /* * NOTE! The in-memory inode i_data array is in little-endian order -@@ -2556,6 +2570,7 @@ static int ext3_do_update_inode(handle_t +@@ -2556,6 +2570,7 @@ raw_inode->i_fsize = 0; } #endif @@ -1717,7 +1725,7 @@ raw_inode->i_file_acl = cpu_to_le32(ei->i_file_acl); if (!S_ISREG(inode->i_mode)) { raw_inode->i_dir_acl = cpu_to_le32(ei->i_dir_acl); -@@ -2759,6 +2774,9 @@ int ext3_writepage_trans_blocks(struct i +@@ -2759,6 +2774,9 @@ int indirects = (EXT3_NDIR_BLOCKS % bpp) ? 5 : 3; int ret; @@ -1727,7 +1735,7 @@ if (ext3_should_journal_data(inode)) ret = 3 * (bpp + indirects) + 2; else -@@ -3082,7 +3100,7 @@ int ext3_prep_san_write(struct inode *in +@@ -3082,7 +3100,7 @@ /* alloc blocks one by one */ for (i = 0; i < nblocks; i++) { @@ -1736,7 +1744,7 @@ &bh_tmp, 1, 1); if (ret) break; -@@ -3143,7 +3161,7 @@ int ext3_map_inode_page(struct inode *in +@@ -3158,7 +3176,7 @@ if (blocks[i] != 0) continue; @@ -1745,9 +1753,11 @@ if (rc) { printk(KERN_INFO "ext3_map_inode_page: error %d " "allocating block %ld\n", rc, iblock); ---- linux-2.4.18-chaos/fs/ext3/Makefile~ext3-extents-2.4.18-chaos 2003-09-19 22:07:14.000000000 +0400 -+++ linux-2.4.18-chaos-alexey/fs/ext3/Makefile 2003-09-20 00:18:43.000000000 +0400 -@@ -12,7 +12,8 @@ O_TARGET := ext3.o +Index: linux-2.4.18-chaos/fs/ext3/Makefile +=================================================================== +--- linux-2.4.18-chaos.orig/fs/ext3/Makefile 2004-01-13 16:10:23.000000000 +0300 ++++ linux-2.4.18-chaos/fs/ext3/Makefile 2004-01-13 16:11:00.000000000 +0300 +@@ -12,7 +12,8 @@ export-objs := ext3-exports.o obj-y := balloc.o iopen.o bitmap.o dir.o file.o fsync.o ialloc.o inode.o \ @@ -1757,17 +1767,19 @@ obj-m := $(O_TARGET) include $(TOPDIR)/Rules.make ---- linux-2.4.18-chaos/fs/ext3/super.c~ext3-extents-2.4.18-chaos 2003-09-19 22:07:15.000000000 +0400 -+++ linux-2.4.18-chaos-alexey/fs/ext3/super.c 2003-09-20 00:18:43.000000000 +0400 -@@ -619,6 +619,7 @@ void ext3_put_super (struct super_block - kdev_t j_dev = sbi->s_journal->j_dev; - int i; +Index: linux-2.4.18-chaos/fs/ext3/super.c +=================================================================== +--- linux-2.4.18-chaos.orig/fs/ext3/super.c 2004-01-13 16:10:23.000000000 +0300 ++++ linux-2.4.18-chaos/fs/ext3/super.c 2004-01-13 16:11:23.000000000 +0300 +@@ -622,6 +622,7 @@ + + J_ASSERT(sbi->s_delete_inodes == 0); + ext3_ext_release(sb); - ext3_stop_delete_thread(sbi); ext3_xattr_put_super(sb); journal_destroy(sbi->s_journal); -@@ -741,6 +742,12 @@ static int parse_options (char * options + if (!(sb->s_flags & MS_RDONLY)) { +@@ -743,6 +744,12 @@ else #endif @@ -1780,7 +1792,7 @@ if (!strcmp (this_char, "bsddf")) clear_opt (*mount_options, MINIX_DF); else if (!strcmp (this_char, "nouid32")) { -@@ -1468,6 +1475,7 @@ struct super_block * ext3_read_super (st +@@ -1470,6 +1477,7 @@ test_opt(sb,DATA_FLAGS) == EXT3_MOUNT_JOURNAL_DATA ? "journal": test_opt(sb,DATA_FLAGS) == EXT3_MOUNT_ORDERED_DATA ? "ordered": "writeback"); @@ -1788,9 +1800,11 @@ return sb; ---- linux-2.4.18-chaos/include/linux/ext3_fs.h~ext3-extents-2.4.18-chaos 2003-09-19 22:07:14.000000000 +0400 -+++ linux-2.4.18-chaos-alexey/include/linux/ext3_fs.h 2003-09-20 00:18:43.000000000 +0400 -@@ -183,6 +183,7 @@ struct ext3_group_desc +Index: linux-2.4.18-chaos/include/linux/ext3_fs.h +=================================================================== +--- linux-2.4.18-chaos.orig/include/linux/ext3_fs.h 2004-01-13 16:10:23.000000000 +0300 ++++ linux-2.4.18-chaos/include/linux/ext3_fs.h 2004-01-13 16:11:00.000000000 +0300 +@@ -183,6 +183,7 @@ #define EXT3_IMAGIC_FL 0x00002000 /* AFS directory */ #define EXT3_JOURNAL_DATA_FL 0x00004000 /* file data should be journaled */ #define EXT3_RESERVED_FL 0x80000000 /* reserved for ext3 lib */ @@ -1798,7 +1812,7 @@ #define EXT3_FL_USER_VISIBLE 0x00005FFF /* User visible flags */ #define EXT3_FL_USER_MODIFIABLE 0x000000FF /* User modifiable flags */ -@@ -243,7 +244,7 @@ struct ext3_inode { +@@ -243,7 +244,7 @@ struct { __u8 l_i_frag; /* Fragment number */ __u8 l_i_fsize; /* Fragment size */ @@ -1807,7 +1821,7 @@ __u16 l_i_uid_high; /* these 2 fields */ __u16 l_i_gid_high; /* were reserved2[0] */ __u32 l_i_reserved2; -@@ -324,6 +325,8 @@ struct ext3_inode { +@@ -324,6 +325,8 @@ #define EXT3_MOUNT_IOPEN 0x8000 /* Allow access via iopen */ #define EXT3_MOUNT_IOPEN_NOPRIV 0x10000 /* Make iopen world-readable */ #define EXT3_MOUNT_ASYNCDEL 0x20000 /* Delayed deletion */ @@ -1816,7 +1830,7 @@ /* Compatibility, for having both ext2_fs.h and ext3_fs.h included at once */ #ifndef _LINUX_EXT2_FS_H -@@ -663,6 +666,12 @@ extern void ext3_discard_prealloc (struc +@@ -663,6 +666,12 @@ extern void ext3_dirty_inode(struct inode *); extern int ext3_change_inode_journal_flag(struct inode *, int); extern void ext3_truncate (struct inode *); @@ -1829,7 +1843,7 @@ #ifdef EXT3_DELETE_THREAD extern void ext3_truncate_thread(struct inode *inode); #endif -@@ -722,6 +731,13 @@ extern struct inode_operations ext3_dir_ +@@ -722,6 +731,13 @@ /* symlink.c */ extern struct inode_operations ext3_fast_symlink_inode_operations; @@ -1843,9 +1857,11 @@ #endif /* __KERNEL__ */ ---- linux-2.4.18-chaos/include/linux/ext3_fs_i.h~ext3-extents-2.4.18-chaos 2001-11-22 22:46:19.000000000 +0300 -+++ linux-2.4.18-chaos-alexey/include/linux/ext3_fs_i.h 2003-09-20 00:18:43.000000000 +0400 -@@ -73,6 +73,10 @@ struct ext3_inode_info { +Index: linux-2.4.18-chaos/include/linux/ext3_fs_i.h +=================================================================== +--- linux-2.4.18-chaos.orig/include/linux/ext3_fs_i.h 2001-11-22 22:46:19.000000000 +0300 ++++ linux-2.4.18-chaos/include/linux/ext3_fs_i.h 2004-01-13 16:11:00.000000000 +0300 +@@ -73,6 +73,10 @@ * by other means, so we have truncate_sem. */ struct rw_semaphore truncate_sem; @@ -1856,9 +1872,11 @@ }; #endif /* _LINUX_EXT3_FS_I */ ---- linux-2.4.18-chaos/include/linux/ext3_fs_sb.h~ext3-extents-2.4.18-chaos 2003-09-19 22:07:13.000000000 +0400 -+++ linux-2.4.18-chaos-alexey/include/linux/ext3_fs_sb.h 2003-09-20 00:18:43.000000000 +0400 -@@ -84,6 +84,16 @@ struct ext3_sb_info { +Index: linux-2.4.18-chaos/include/linux/ext3_fs_sb.h +=================================================================== +--- linux-2.4.18-chaos.orig/include/linux/ext3_fs_sb.h 2004-01-13 16:10:21.000000000 +0300 ++++ linux-2.4.18-chaos/include/linux/ext3_fs_sb.h 2004-01-13 16:11:00.000000000 +0300 +@@ -84,6 +84,16 @@ wait_queue_head_t s_delete_thread_queue; wait_queue_head_t s_delete_waiter_queue; #endif @@ -1875,5 +1893,3 @@ }; #endif /* _LINUX_EXT3_FS_SB */ - -_ diff --git a/lustre/kernel_patches/patches/ext3-extents-2.4.20.patch b/lustre/kernel_patches/patches/ext3-extents-2.4.20.patch index 7c63464..1da5f7c 100644 --- a/lustre/kernel_patches/patches/ext3-extents-2.4.20.patch +++ b/lustre/kernel_patches/patches/ext3-extents-2.4.20.patch @@ -1,33 +1,36 @@ - fs/ext3/Makefile | 3 - fs/ext3/extents.c | 1570 +++++++++++++++++++++++++++++++++++++++++++++ - fs/ext3/ialloc.c | 4 - fs/ext3/inode.c | 28 - fs/ext3/super.c | 6 - include/linux/ext3_fs.h | 16 - include/linux/ext3_fs_i.h | 4 - include/linux/ext3_fs_sb.h | 10 - 8 files changed, 1634 insertions(+), 7 deletions(-) - ---- /dev/null 2003-01-30 13:24:37.000000000 +0300 -+++ linux-2.4.20-vanilla-alexey/fs/ext3/extents.c 2003-09-15 19:57:29.000000000 +0400 -@@ -0,0 +1,1570 @@ +Index: linux-2.4.20/fs/ext3/extents.c +=================================================================== +--- linux-2.4.20.orig/fs/ext3/extents.c 2003-01-30 13:24:37.000000000 +0300 ++++ linux-2.4.20/fs/ext3/extents.c 2004-01-24 14:19:29.000000000 +0300 +@@ -0,0 +1,2224 @@ +/* ++ * Copyright (C) 2003 Alex Tomas + * -+ * linux/fs/ext3/extents.c ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. + * ++ * 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 Licens ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111- ++ */ ++ ++/* + * Extents support for EXT3 + * -+ * 07/08/2003 Alex Tomas -+ * + * TODO: ++ * - ext3_ext_walk_space() sould not use ext3_ext_find_extent() ++ * - ext3_ext_calc_credits() could take 'mergable' into account + * - ext3*_error() should be used in some situations + * - find_goal() [to be tested and improved] -+ * - error handling -+ * - we could leak allocated block in some error cases -+ * - quick search for index/leaf in ext3_ext_find_extent() -+ * - tree reduction -+ * - cache last found extent -+ * - arch-independent ++ * - smart tree reduction ++ * - arch-independence ++ * common on-disk format for big/little-endian arch + */ + +#include @@ -42,107 +45,47 @@ +#include +#include +#include ++#include ++#include + -+/* -+ * with AGRESSIVE_TEST defined capacity of index/leaf blocks -+ * become very little, so index split, in-depth growing and -+ * other hard changes happens much more often -+ * this is for debug purposes only -+ */ -+#define AGRESSIVE_TEST_ -+ -+/* -+ * if EXT_DEBUG defined you can use 'extdebug' mount option -+ * to get lots of info what's going on -+ */ -+#define EXT_DEBUG -+#ifdef EXT_DEBUG -+#define ext_debug(inode,fmt,a...) \ -+do { \ -+ if (test_opt((inode)->i_sb, EXTDEBUG)) \ -+ printk(fmt, ##a); \ -+} while (0); -+#else -+#define ext_debug(inode,fmt,a...) -+#endif -+ -+#define EXT3_ALLOC_NEEDED 2 /* block bitmap + group descriptor */ -+ -+/* -+ * ext3_inode has i_block array (total 60 bytes) -+ * first 4 bytes are used to store: -+ * - tree depth (0 mean there is no tree yet. all extents in the inode) -+ * - number of alive extents in the inode -+ */ -+ -+/* -+ * this is extent on-disk structure -+ * it's used at the bottom of the tree -+ */ -+struct ext3_extent { -+ __u32 e_block; /* first logical block extent covers */ -+ __u32 e_start; /* first physical block extents lives */ -+ __u32 e_num; /* number of blocks covered by extent */ -+}; -+ -+/* -+ * this is index on-disk structure -+ * it's used at all the levels, but the bottom -+ */ -+struct ext3_extent_idx { -+ __u32 e_block; /* index covers logical blocks from 'block' */ -+ __u32 e_leaf; /* pointer to the physical block of the next * -+ * level. leaf or next index could bet here */ -+}; -+ -+/* -+ * each block (leaves and indexes), even inode-stored has header -+ */ -+struct ext3_extent_header { -+ __u16 e_num; /* number of valid entries */ -+ __u16 e_max; /* capacity of store in entries */ -+}; -+ -+/* -+ * array of ext3_ext_path contains path to some extent -+ * creation/lookup routines use it for traversal/splitting/etc -+ * truncate uses it to simulate recursive walking -+ */ -+struct ext3_ext_path { -+ __u32 p_block; -+ __u16 p_depth; -+ struct ext3_extent *p_ext; -+ struct ext3_extent_idx *p_idx; -+ struct ext3_extent_header *p_hdr; -+ struct buffer_head *p_bh; -+}; ++static handle_t *ext3_ext_journal_restart(handle_t *handle, int needed) ++{ ++ int err; + -+#define EXT_FIRST_EXTENT(__hdr__) \ -+ ((struct ext3_extent *) (((char *) (__hdr__)) + \ -+ sizeof(struct ext3_extent_header))) -+#define EXT_FIRST_INDEX(__hdr__) \ -+ ((struct ext3_extent_idx *) (((char *) (__hdr__)) + \ -+ sizeof(struct ext3_extent_header))) -+#define EXT_HAS_FREE_INDEX(__path__) \ -+ ((__path__)->p_hdr->e_num < (__path__)->p_hdr->e_max) -+#define EXT_LAST_EXTENT(__hdr__) \ -+ (EXT_FIRST_EXTENT((__hdr__)) + (__hdr__)->e_num - 1) -+#define EXT_LAST_INDEX(__hdr__) \ -+ (EXT_FIRST_INDEX((__hdr__)) + (__hdr__)->e_num - 1) -+#define EXT_MAX_EXTENT(__hdr__) \ -+ (EXT_FIRST_EXTENT((__hdr__)) + (__hdr__)->e_max - 1) -+#define EXT_MAX_INDEX(__hdr__) \ -+ (EXT_FIRST_INDEX((__hdr__)) + (__hdr__)->e_max - 1) ++ if (handle->h_buffer_credits > needed) ++ return handle; ++ if (!ext3_journal_extend(handle, needed)) ++ return handle; ++ err = ext3_journal_restart(handle, needed); ++ ++ return handle; ++} + ++static int inline ++ext3_ext_get_access_for_root(handle_t *h, struct ext3_extents_tree *tree) ++{ ++ if (tree->get_write_access) ++ return tree->get_write_access(h,tree->buffer); ++ else ++ return 0; ++} + -+#define EXT_ASSERT(__x__) if (!(__x__)) BUG(); ++static int inline ++ext3_ext_mark_root_dirty(handle_t *h, struct ext3_extents_tree *tree) ++{ ++ if (tree->mark_buffer_dirty) ++ return tree->mark_buffer_dirty(h,tree->buffer); ++ else ++ return 0; ++} + +/* + * could return: + * - EROFS + * - ENOMEM + */ -+static int ext3_ext_get_access(handle_t *handle, struct inode *inode, ++static int ext3_ext_get_access(handle_t *handle, ++ struct ext3_extents_tree *tree, + struct ext3_ext_path *path) +{ + if (path->p_bh) { @@ -151,7 +94,7 @@ + } + + /* path points to leaf/index in inode body */ -+ return 0; ++ return ext3_ext_get_access_for_root(handle, tree); +} + +/* @@ -160,7 +103,7 @@ + * - ENOMEM + * - EIO + */ -+static int ext3_ext_dirty(handle_t *handle, struct inode *inode, ++static int ext3_ext_dirty(handle_t *handle, struct ext3_extents_tree *tree, + struct ext3_ext_path *path) +{ + if (path->p_bh) { @@ -169,82 +112,140 @@ + } + + /* path points to leaf/index in inode body */ -+ return ext3_mark_inode_dirty(handle, inode); ++ return ext3_ext_mark_root_dirty(handle, tree); ++} ++ ++static int inline ++ext3_ext_new_block(handle_t *handle, struct ext3_extents_tree *tree, ++ struct ext3_ext_path *path, struct ext3_extent *ex, ++ int *err) ++{ ++ int goal, depth, newblock; ++ struct inode *inode; ++ ++ EXT_ASSERT(tree); ++ if (tree->new_block) ++ return tree->new_block(handle, tree, path, ex, err); ++ ++ inode = tree->inode; ++ depth = EXT_DEPTH(tree); ++ if (path && depth > 0) { ++ goal = path[depth-1].p_block; ++ } else { ++ struct ext3_inode_info *ei = EXT3_I(inode); ++ unsigned long bg_start; ++ unsigned long colour; ++ ++ bg_start = (ei->i_block_group * ++ EXT3_BLOCKS_PER_GROUP(inode->i_sb)) + ++ le32_to_cpu(EXT3_SB(inode->i_sb)->s_es->s_first_data_block); ++ colour = (current->pid % 16) * ++ (EXT3_BLOCKS_PER_GROUP(inode->i_sb) / 16); ++ goal = bg_start + colour; ++ } ++ ++ newblock = ext3_new_block(handle, inode, goal, 0, 0, err); ++ return newblock; +} + -+static inline int ext3_ext_space_block(struct inode *inode) ++static inline int ext3_ext_space_block(struct ext3_extents_tree *tree) +{ + int size; + -+ size = (inode->i_sb->s_blocksize - sizeof(struct ext3_extent_header)) -+ / sizeof(struct ext3_extent); ++ size = (tree->inode->i_sb->s_blocksize - ++ sizeof(struct ext3_extent_header)) ++ / sizeof(struct ext3_extent); +#ifdef AGRESSIVE_TEST -+ size = 6; /* FIXME: for debug, remove this line */ ++ size = 6; +#endif + return size; +} + -+static inline int ext3_ext_space_inode(struct inode *inode) ++static inline int ext3_ext_space_block_idx(struct ext3_extents_tree *tree) +{ + int size; + -+ size = (sizeof(EXT3_I(inode)->i_data) - ++ size = (tree->inode->i_sb->s_blocksize - + sizeof(struct ext3_extent_header)) ++ / sizeof(struct ext3_extent_idx); ++#ifdef AGRESSIVE_TEST ++ size = 5; ++#endif ++ return size; ++} ++ ++static inline int ext3_ext_space_root(struct ext3_extents_tree *tree) ++{ ++ int size; ++ ++ size = (tree->buffer_len - sizeof(struct ext3_extent_header)) + / sizeof(struct ext3_extent); +#ifdef AGRESSIVE_TEST -+ size = 3; /* FIXME: for debug, remove this line */ ++ size = 3; +#endif + return size; +} + -+static inline int ext3_ext_space_inode_idx(struct inode *inode) ++static inline int ext3_ext_space_root_idx(struct ext3_extents_tree *tree) +{ + int size; + -+ size = (sizeof(EXT3_I(inode)->i_data) - ++ size = (tree->buffer_len - + sizeof(struct ext3_extent_header)) + / sizeof(struct ext3_extent_idx); +#ifdef AGRESSIVE_TEST -+ size = 4; /* FIXME: for debug, remove this line */ ++ size = 4; +#endif + return size; +} + -+static void ext3_ext_show_path(struct inode *inode, struct ext3_ext_path *path) ++static void ext3_ext_show_path(struct ext3_extents_tree *tree, ++ struct ext3_ext_path *path) +{ ++#ifdef EXT_DEBUG + int k, l = path->p_depth; + -+ ext_debug(inode, "path:"); ++ ext_debug(tree, "path:"); + for (k = 0; k <= l; k++, path++) { + if (path->p_idx) { -+ ext_debug(inode, " %d->%d", path->p_idx->e_block, ++ ext_debug(tree, " %d->%d", path->p_idx->e_block, + path->p_idx->e_leaf); + } else if (path->p_ext) { -+ ext_debug(inode, " %d:%d:%d", ++ ext_debug(tree, " %d:%d:%d", + path->p_ext->e_block, -+ path->p_ext->e_start, -+ path->p_ext->e_num); ++ path->p_ext->e_num, ++ path->p_ext->e_start); + } else -+ ext_debug(inode, " []"); ++ ext_debug(tree, " []"); + } -+ ext_debug(inode, "\n"); ++ ext_debug(tree, "\n"); ++#endif +} + -+static void ext3_ext_show_leaf(struct inode *inode, struct ext3_ext_path *path) ++static void ext3_ext_show_leaf(struct ext3_extents_tree *tree, ++ struct ext3_ext_path *path) +{ -+ int depth = EXT3_I(inode)->i_depth; -+ struct ext3_extent_header *eh = path[depth].p_hdr; -+ struct ext3_extent *ex = EXT_FIRST_EXTENT(eh); ++#ifdef EXT_DEBUG ++ int depth = EXT_DEPTH(tree); ++ struct ext3_extent_header *eh; ++ struct ext3_extent *ex; + int i; + ++ if (!path) ++ return; ++ ++ eh = path[depth].p_hdr; ++ ex = EXT_FIRST_EXTENT(eh); ++ + for (i = 0; i < eh->e_num; i++, ex++) { -+ ext_debug(inode, "%d:%d:%d ", -+ ex->e_block, ex->e_start, ex->e_num); ++ ext_debug(tree, "%d:%d:%d ", ++ ex->e_block, ex->e_num, ex->e_start); + } -+ ext_debug(inode, "\n"); ++ ext_debug(tree, "\n"); ++#endif +} + -+static void ext3_ext_drop_refs(struct inode *inode, struct ext3_ext_path *path) ++static void ext3_ext_drop_refs(struct ext3_ext_path *path) +{ + int depth = path->p_depth; + int i; @@ -256,50 +257,157 @@ + } +} + -+static int ext3_ext_find_goal(struct inode *inode, struct ext3_ext_path *path) ++/* ++ * binary search for closest index by given block ++ */ ++static inline void ++ext3_ext_binsearch_idx(struct ext3_extents_tree *tree, ++ struct ext3_ext_path *path, int block) +{ -+ struct ext3_inode_info *ei = EXT3_I(inode); -+ unsigned long bg_start; -+ unsigned long colour; -+ int depth; -+ -+ if (path) { -+ depth = path->p_depth; -+ /* try to find previous block */ -+ if (path[depth].p_ext) -+ return path[depth].p_ext->e_start + -+ path[depth].p_ext->e_num - 1; -+ -+ /* it looks index is empty -+ * try to find starting from index itself */ -+ if (path[depth].p_bh) -+ return path[depth].p_bh->b_blocknr; ++ struct ext3_extent_header *eh = path->p_hdr; ++ struct ext3_extent_idx *ix; ++ int l = 0, k, r; ++ ++ EXT_ASSERT(eh->e_num <= eh->e_max); ++ EXT_ASSERT(eh->e_num > 0); ++ ++ ext_debug(tree, "binsearch for %d(idx): ", block); ++ ++ path->p_idx = ix = EXT_FIRST_INDEX(eh); ++ ++ r = k = eh->e_num; ++ while (k > 1) { ++ k = (r - l) / 2; ++ if (block < ix[l + k].e_block) ++ r -= k; ++ else ++ l += k; ++ ext_debug(tree, "%d:%d:%d ", k, l, r); + } + -+ /* OK. use inode's group */ -+ bg_start = (ei->i_block_group * EXT3_BLOCKS_PER_GROUP(inode->i_sb)) + -+ le32_to_cpu(EXT3_SB(inode->i_sb)->s_es->s_first_data_block); -+ colour = (current->pid % 16) * -+ (EXT3_BLOCKS_PER_GROUP(inode->i_sb) / 16); -+ return bg_start + colour; ++ ix += l; ++ path->p_idx = ix; ++ ext_debug(tree, " -> %d->%d ", path->p_idx->e_block, path->p_idx->e_leaf); ++ ++ while (l++ < r) { ++ if (block < ix->e_block) ++ break; ++ path->p_idx = ix++; ++ } ++ ext_debug(tree, " -> %d->%d\n", path->p_idx->e_block, ++ path->p_idx->e_leaf); ++ ++#ifdef CHECK_BINSEARCH ++ { ++ struct ext3_extent_idx *chix; ++ ++ chix = ix = EXT_FIRST_INDEX(eh); ++ for (k = 0; k < eh->e_num; k++, ix++) { ++ EXT_ASSERT(k == 0 || ix->e_block > ix[-1].e_block); ++ if (block < ix->e_block) ++ break; ++ chix = ix; ++ } ++ EXT_ASSERT(chix == path->p_idx); ++ } ++#endif ++ +} + -+static struct ext3_ext_path * -+ext3_ext_find_extent(struct inode *inode, int block, struct ext3_ext_path *path) ++/* ++ * binary search for closest extent by given block ++ */ ++static inline void ++ext3_ext_binsearch(struct ext3_extents_tree *tree, ++ struct ext3_ext_path *path, int block) +{ -+ struct ext3_inode_info *ei = EXT3_I(inode); -+ struct ext3_extent_header *eh = (void *) ei->i_data; -+ struct ext3_extent_idx *ix; -+ struct buffer_head *bh; ++ struct ext3_extent_header *eh = path->p_hdr; + struct ext3_extent *ex; -+ int depth, i, k, ppos = 0; ++ int l = 0, k, r; ++ ++ EXT_ASSERT(eh->e_num <= eh->e_max); ++ ++ if (eh->e_num == 0) { ++ /* ++ * this leaf is empty yet: ++ * we get such a leaf in split/add case ++ */ ++ return; ++ } + -+ eh = (struct ext3_extent_header *) ei->i_data; ++ ext_debug(tree, "binsearch for %d: ", block); ++ ++ path->p_ext = ex = EXT_FIRST_EXTENT(eh); ++ ++ r = k = eh->e_num; ++ while (k > 1) { ++ k = (r - l) / 2; ++ if (block < ex[l + k].e_block) ++ r -= k; ++ else ++ l += k; ++ ext_debug(tree, "%d:%d:%d ", k, l, r); ++ } ++ ++ ex += l; ++ path->p_ext = ex; ++ ext_debug(tree, " -> %d:%d:%d ", path->p_ext->e_block, ++ path->p_ext->e_start, path->p_ext->e_num); ++ ++ while (l++ < r) { ++ if (block < ex->e_block) ++ break; ++ path->p_ext = ex++; ++ } ++ ext_debug(tree, " -> %d:%d:%d\n", path->p_ext->e_block, ++ path->p_ext->e_start, path->p_ext->e_num); ++ ++#ifdef CHECK_BINSEARCH ++ { ++ struct ext3_extent *chex; ++ ++ chex = ex = EXT_FIRST_EXTENT(eh); ++ for (k = 0; k < eh->e_num; k++, ex++) { ++ EXT_ASSERT(k == 0 || ex->e_block > ex[-1].e_block); ++ if (block < ex->e_block) ++ break; ++ chex = ex; ++ } ++ EXT_ASSERT(chex == path->p_ext); ++ } ++#endif ++ ++} ++ ++int ext3_extent_tree_init(handle_t *handle, struct ext3_extents_tree *tree) ++{ ++ struct ext3_extent_header *eh; ++ ++ BUG_ON(tree->buffer_len == 0); ++ ext3_ext_get_access_for_root(handle, tree); ++ eh = EXT_ROOT_HDR(tree); ++ eh->e_depth = 0; ++ eh->e_num = 0; ++ eh->e_max = ext3_ext_space_root(tree); ++ ext3_ext_mark_root_dirty(handle, tree); ++ return 0; ++} ++ ++struct ext3_ext_path * ++ext3_ext_find_extent(struct ext3_extents_tree *tree, int block, ++ struct ext3_ext_path *path) ++{ ++ struct ext3_extent_header *eh; ++ struct buffer_head *bh; ++ int depth, i, ppos = 0; + -+ /* initialize capacity of leaf in inode for first time */ -+ if (eh->e_max == 0) -+ eh->e_max = ext3_ext_space_inode(inode); -+ i = depth = ei->i_depth; ++ EXT_ASSERT(tree); ++ EXT_ASSERT(tree->inode); ++ EXT_ASSERT(tree->root); ++ ++ eh = EXT_ROOT_HDR(tree); ++ i = depth = EXT_DEPTH(tree); ++ EXT_ASSERT(eh->e_max); + EXT_ASSERT(i == 0 || eh->e_num > 0); + + /* account possible depth increase */ @@ -310,120 +418,80 @@ + return ERR_PTR(-ENOMEM); + } + memset(path, 0, sizeof(struct ext3_ext_path) * (depth + 1)); ++ path[0].p_hdr = eh; + + /* walk through the tree */ + while (i) { -+ ext_debug(inode, "depth %d: num %d, max %d\n", ++ ext_debug(tree, "depth %d: num %d, max %d\n", + ppos, eh->e_num, eh->e_max); -+ ix = EXT_FIRST_INDEX(eh); -+ if (eh->e_num) -+ path[ppos].p_idx = ix; -+ EXT_ASSERT(eh->e_num <= eh->e_max); -+ for (k = 0; k < eh->e_num; k++, ix++) { -+ ext_debug(inode, "index: %d -> %d\n", -+ ix->e_block, ix->e_leaf); -+ if (block < ix->e_block) -+ break; -+ path[ppos].p_idx = ix; -+ } ++ ext3_ext_binsearch_idx(tree, path + ppos, block); + path[ppos].p_block = path[ppos].p_idx->e_leaf; + path[ppos].p_depth = i; -+ path[ppos].p_hdr = eh; + path[ppos].p_ext = NULL; + -+ bh = sb_bread(inode->i_sb, path[ppos].p_block); ++ bh = sb_bread(tree->inode->i_sb, path[ppos].p_block); + if (!bh) { -+ ext3_ext_drop_refs(inode, path); ++ ext3_ext_drop_refs(path); + kfree(path); + return ERR_PTR(-EIO); + } -+ eh = (struct ext3_extent_header *) bh->b_data; ++ eh = EXT_BLOCK_HDR(bh); + ppos++; + EXT_ASSERT(ppos <= depth); + path[ppos].p_bh = bh; ++ path[ppos].p_hdr = eh; + i--; + } + + path[ppos].p_depth = i; + path[ppos].p_hdr = eh; + path[ppos].p_ext = NULL; -+ ++ + /* find extent */ -+ ex = EXT_FIRST_EXTENT(eh); -+ if (eh->e_num) -+ path[ppos].p_ext = ex; -+ EXT_ASSERT(eh->e_num <= eh->e_max); -+ for (k = 0; k < eh->e_num; k++, ex++) { -+ if (block < ex->e_block) -+ break; -+ path[ppos].p_ext = ex; -+ } ++ ext3_ext_binsearch(tree, path + ppos, block); + -+ ext3_ext_show_path(inode, path); ++ ext3_ext_show_path(tree, path); + + return path; +} + -+static void ext3_ext_check_boundary(struct inode *inode, -+ struct ext3_ext_path *curp, -+ void *addr, int len) -+{ -+ void *end; -+ -+ if (!len) -+ return; -+ if (curp->p_bh) -+ end = (void *) curp->p_hdr + inode->i_sb->s_blocksize; -+ else -+ end = (void *) curp->p_hdr + sizeof(EXT3_I(inode)->i_data); -+ if (((unsigned long) addr) + len > (unsigned long) end) { -+ printk("overflow! 0x%p > 0x%p\n", addr + len, end); -+ BUG(); -+ } -+ if ((unsigned long) addr < (unsigned long) curp->p_hdr) { -+ printk("underflow! 0x%p < 0x%p\n", addr, curp->p_hdr); -+ BUG(); -+ } -+} -+ +/* + * insert new index [logical;ptr] into the block at cupr + * it check where to insert: before curp or after curp + */ -+static int ext3_ext_insert_index(handle_t *handle, struct inode *inode, -+ struct ext3_ext_path *curp, int logical, -+ int ptr) ++static int ext3_ext_insert_index(handle_t *handle, ++ struct ext3_extents_tree *tree, ++ struct ext3_ext_path *curp, ++ int logical, int ptr) +{ + struct ext3_extent_idx *ix; + int len, err; + -+ if ((err = ext3_ext_get_access(handle, inode, curp))) ++ if ((err = ext3_ext_get_access(handle, tree, curp))) + return err; + + EXT_ASSERT(logical != curp->p_idx->e_block); + len = EXT_MAX_INDEX(curp->p_hdr) - curp->p_idx; + if (logical > curp->p_idx->e_block) { + /* insert after */ -+ len = (len - 1) * sizeof(struct ext3_extent_idx); -+ len = len < 0 ? 0 : len; -+ ext_debug(inode, "insert new index %d after: %d. " -+ "move %d from 0x%p to 0x%p\n", -+ logical, ptr, len, -+ (curp->p_idx + 1), (curp->p_idx + 2)); -+ -+ ext3_ext_check_boundary(inode, curp, curp->p_idx + 2, len); -+ memmove(curp->p_idx + 2, curp->p_idx + 1, len); ++ if (curp->p_idx != EXT_LAST_INDEX(curp->p_hdr)) { ++ len = (len - 1) * sizeof(struct ext3_extent_idx); ++ len = len < 0 ? 0 : len; ++ ext_debug(tree, "insert new index %d after: %d. " ++ "move %d from 0x%p to 0x%p\n", ++ logical, ptr, len, ++ (curp->p_idx + 1), (curp->p_idx + 2)); ++ memmove(curp->p_idx + 2, curp->p_idx + 1, len); ++ } + ix = curp->p_idx + 1; + } else { + /* insert before */ + len = len * sizeof(struct ext3_extent_idx); + len = len < 0 ? 0 : len; -+ ext_debug(inode, "insert new index %d before: %d. " ++ ext_debug(tree, "insert new index %d before: %d. " + "move %d from 0x%p to 0x%p\n", + logical, ptr, len, + curp->p_idx, (curp->p_idx + 1)); -+ -+ ext3_ext_check_boundary(inode, curp, curp->p_idx + 1, len); + memmove(curp->p_idx + 1, curp->p_idx, len); + ix = curp->p_idx; + } @@ -432,8 +500,8 @@ + ix->e_leaf = ptr; + curp->p_hdr->e_num++; + -+ err = ext3_ext_dirty(handle, inode, curp); -+ ext3_std_error(inode->i_sb, err); ++ err = ext3_ext_dirty(handle, tree, curp); ++ ext3_std_error(tree->inode->i_sb, err); + + return err; +} @@ -447,17 +515,17 @@ + * into the newly allocated blocks + * - initialize subtree + */ -+static int ext3_ext_split(handle_t *handle, struct inode *inode, ++static int ext3_ext_split(handle_t *handle, struct ext3_extents_tree *tree, + struct ext3_ext_path *path, + struct ext3_extent *newext, int at) +{ + struct buffer_head *bh = NULL; -+ int depth = EXT3_I(inode)->i_depth; ++ int depth = EXT_DEPTH(tree); + struct ext3_extent_header *neh; + struct ext3_extent_idx *fidx; + struct ext3_extent *ex; + int i = at, k, m, a; -+ long newblock, oldblock, border; ++ unsigned long newblock, oldblock, border; + int *ablocks = NULL; /* array of allocated blocks */ + int err = 0; + @@ -466,14 +534,15 @@ + + /* if current leaf will be splitted, then we should use + * border from split point */ ++ + if (path[depth].p_ext != EXT_MAX_EXTENT(path[depth].p_hdr)) { + border = path[depth].p_ext[1].e_block; -+ ext_debug(inode, "leaf will be splitted." ++ ext_debug(tree, "leaf will be splitted." + " next leaf starts at %d\n", + (int)border); + } else { + border = newext->e_block; -+ ext_debug(inode, "leaf will be added." ++ ext_debug(tree, "leaf will be added." + " next leaf starts at %d\n", + (int)border); + } @@ -490,19 +559,15 @@ + * we need this to handle errors and free blocks + * upon them + */ -+ ablocks = kmalloc(sizeof(long) * depth, GFP_NOFS); ++ ablocks = kmalloc(sizeof(unsigned long) * depth, GFP_NOFS); + if (!ablocks) + return -ENOMEM; -+ memset(ablocks, 0, sizeof(long) * depth); ++ memset(ablocks, 0, sizeof(unsigned long) * depth); + + /* allocate all needed blocks */ -+ ext_debug(inode, "allocate %d blocks for indexes and leaf\n", -+ depth - at); -+ ablocks[0] = newext->e_start++; -+ newext->e_num--; -+ for (a = 1; a < depth - at; a++) { -+ newblock = ext3_new_block(handle, inode, newext->e_start, -+ 0, 0, &err); ++ ext_debug(tree, "allocate %d blocks for indexes/leaf\n", depth - at); ++ for (a = 0; a < depth - at; a++) { ++ newblock = ext3_ext_new_block(handle, tree, path, newext, &err); + if (newblock == 0) + goto cleanup; + ablocks[a] = newblock; @@ -511,7 +576,7 @@ + /* initialize new leaf */ + newblock = ablocks[--a]; + EXT_ASSERT(newblock); -+ bh = sb_getblk(inode->i_sb, newblock); ++ bh = sb_getblk(tree->inode->i_sb, newblock); + if (!bh) { + err = -EIO; + goto cleanup; @@ -521,21 +586,20 @@ + if ((err = ext3_journal_get_create_access(handle, bh))) + goto cleanup; + -+ neh = (struct ext3_extent_header *) bh->b_data; ++ neh = EXT_BLOCK_HDR(bh); + neh->e_num = 0; -+ neh->e_max = ext3_ext_space_block(inode); ++ neh->e_max = ext3_ext_space_block(tree); + ex = EXT_FIRST_EXTENT(neh); + + /* move remain of path[depth] to the new leaf */ -+ EXT_ASSERT(path[depth].p_hdr->e_num == -+ path[depth].p_hdr->e_max); ++ EXT_ASSERT(path[depth].p_hdr->e_num == path[depth].p_hdr->e_max); + /* start copy from next extent */ + /* TODO: we could do it by single memmove */ + m = 0; + path[depth].p_ext++; + while (path[depth].p_ext <= + EXT_MAX_EXTENT(path[depth].p_hdr)) { -+ ext_debug(inode, "move %d:%d:%d in new leaf\n", ++ ext_debug(tree, "move %d:%d:%d in new leaf\n", + path[depth].p_ext->e_block, + path[depth].p_ext->e_start, + path[depth].p_ext->e_num); @@ -554,10 +618,10 @@ + + /* correct old leaf */ + if (m) { -+ if ((err = ext3_ext_get_access(handle, inode, path))) ++ if ((err = ext3_ext_get_access(handle, tree, path))) + goto cleanup; + path[depth].p_hdr->e_num -= m; -+ if ((err = ext3_ext_dirty(handle, inode, path))) ++ if ((err = ext3_ext_dirty(handle, tree, path))) + goto cleanup; + + } @@ -566,15 +630,14 @@ + k = depth - at - 1; + EXT_ASSERT(k >= 0); + if (k) -+ ext_debug(inode, -+ "create %d intermediate indices\n", k); ++ ext_debug(tree, "create %d intermediate indices\n", k); + /* insert new index into current index block */ + /* current depth stored in i var */ + i = depth - 1; + while (k--) { + oldblock = newblock; + newblock = ablocks[--a]; -+ bh = sb_getblk(inode->i_sb, newblock); ++ bh = sb_getblk(tree->inode->i_sb, newblock); + if (!bh) { + err = -EIO; + goto cleanup; @@ -584,28 +647,27 @@ + if ((err = ext3_journal_get_create_access(handle, bh))) + goto cleanup; + -+ neh = (struct ext3_extent_header *) bh->b_data; ++ neh = EXT_BLOCK_HDR(bh); + neh->e_num = 1; -+ neh->e_max = ext3_ext_space_block(inode); ++ neh->e_max = ext3_ext_space_block_idx(tree); + fidx = EXT_FIRST_INDEX(neh); + fidx->e_block = border; + fidx->e_leaf = oldblock; + -+ ext_debug(inode, -+ "int.index at %d (block %u): %d -> %d\n", ++ ext_debug(tree, "int.index at %d (block %u): %d -> %d\n", + i, (unsigned) newblock, + (int) border, + (int) oldblock); + /* copy indexes */ + m = 0; + path[i].p_idx++; ++ ext_debug(tree, "cur 0x%p, last 0x%p\n", path[i].p_idx, ++ EXT_MAX_INDEX(path[i].p_hdr)); + EXT_ASSERT(EXT_MAX_INDEX(path[i].p_hdr) == + EXT_LAST_INDEX(path[i].p_hdr)); -+ ext_debug(inode, "cur 0x%p, last 0x%p\n", path[i].p_idx, -+ EXT_MAX_INDEX(path[i].p_hdr)); + while (path[i].p_idx <= + EXT_MAX_INDEX(path[i].p_hdr)) { -+ ext_debug(inode, "%d: move %d:%d in new index\n", ++ ext_debug(tree, "%d: move %d:%d in new index\n", + i, path[i].p_idx->e_block, + path[i].p_idx->e_leaf); + memmove(++fidx, path[i].p_idx++, @@ -624,11 +686,11 @@ + + /* correct old index */ + if (m) { -+ err = ext3_ext_get_access(handle,inode,path+i); ++ err = ext3_ext_get_access(handle, tree, path + i); + if (err) + goto cleanup; + path[i].p_hdr->e_num -= m; -+ err = ext3_ext_dirty(handle, inode, path + i); ++ err = ext3_ext_dirty(handle, tree, path + i); + if (err) + goto cleanup; + } @@ -637,8 +699,8 @@ + } + + /* insert new index */ -+ if (!err) -+ err = ext3_ext_insert_index(handle, inode, path + at, ++ if (!err) ++ err = ext3_ext_insert_index(handle, tree, path + at, + border, newblock); + +cleanup: @@ -653,7 +715,7 @@ + for (i = 0; i < depth; i++) + if (!ablocks[i]) + continue; -+ ext3_free_blocks(handle, inode, ablocks[i], 1); ++ ext3_free_blocks(handle, tree->inode, ablocks[i], 1); + } + kfree(ablocks); + @@ -667,7 +729,8 @@ + * - initialize new top-level, creating index that points to the + * just created block + */ -+static int ext3_ext_grow_indepth(handle_t *handle, struct inode *inode, ++static int ext3_ext_grow_indepth(handle_t *handle, ++ struct ext3_extents_tree *tree, + struct ext3_ext_path *path, + struct ext3_extent *newext) +{ @@ -676,18 +739,16 @@ + struct ext3_extent_header *neh; + struct ext3_extent_idx *fidx; + int len, err = 0; -+ long newblock; ++ unsigned long newblock; + -+ /* -+ * use already allocated by the called block for new root block -+ */ -+ newblock = newext->e_start++; -+ newext->e_num--; -+ -+ bh = sb_getblk(inode->i_sb, newblock); ++ newblock = ext3_ext_new_block(handle, tree, path, newext, &err); ++ if (newblock == 0) ++ return err; ++ ++ bh = sb_getblk(tree->inode->i_sb, newblock); + if (!bh) { + err = -EIO; -+ ext3_std_error(inode->i_sb, err); ++ ext3_std_error(tree->inode->i_sb, err); + return err; + } + lock_buffer(bh); @@ -704,8 +765,8 @@ + memmove(bh->b_data, curp->p_hdr, len); + + /* set size of new block */ -+ neh = (struct ext3_extent_header *) bh->b_data; -+ neh->e_max = ext3_ext_space_block(inode); ++ neh = EXT_BLOCK_HDR(bh); ++ neh->e_max = ext3_ext_space_block(tree); + mark_buffer_uptodate(bh, 1); + unlock_buffer(bh); + @@ -713,22 +774,22 @@ + goto out; + + /* create index in new top-level index: num,max,pointer */ -+ if ((err = ext3_ext_get_access(handle, inode, curp))) ++ if ((err = ext3_ext_get_access(handle, tree, curp))) + goto out; + -+ curp->p_hdr->e_max = ext3_ext_space_inode_idx(inode); ++ curp->p_hdr->e_max = ext3_ext_space_root_idx(tree); + curp->p_hdr->e_num = 1; + curp->p_idx = EXT_FIRST_INDEX(curp->p_hdr); + curp->p_idx->e_block = EXT_FIRST_EXTENT(path[0].p_hdr)->e_block; + curp->p_idx->e_leaf = newblock; + -+ neh = (struct ext3_extent_header *) EXT3_I(inode)->i_data; ++ neh = EXT_ROOT_HDR(tree); + fidx = EXT_FIRST_INDEX(neh); -+ ext_debug(inode, "new root: num %d(%d), lblock %d, ptr %d\n", ++ ext_debug(tree, "new root: num %d(%d), lblock %d, ptr %d\n", + neh->e_num, neh->e_max, fidx->e_block, fidx->e_leaf); + -+ EXT3_I(inode)->i_depth++; -+ err = ext3_ext_dirty(handle, inode, curp); ++ neh->e_depth = path->p_depth + 1; ++ err = ext3_ext_dirty(handle, tree, curp); +out: + brelse(bh); + @@ -739,15 +800,17 @@ + * routine finds empty index and adds new leaf. if no free index found + * then it requests in-depth growing + */ -+static int ext3_ext_create_new_leaf(handle_t *handle, struct inode *inode, ++static int ext3_ext_create_new_leaf(handle_t *handle, ++ struct ext3_extents_tree *tree, + struct ext3_ext_path *path, + struct ext3_extent *newext) +{ -+ int depth = EXT3_I(inode)->i_depth; + struct ext3_ext_path *curp; -+ int i = depth, err = 0; -+ long newblock = newext->e_start; ++ int depth, i, err = 0; + ++repeat: ++ i = depth = EXT_DEPTH(tree); ++ + /* walk up to the tree and look for free index entry */ + curp = path + depth; + while (i > 0 && !EXT_HAS_FREE_INDEX(curp)) { @@ -760,42 +823,48 @@ + if (EXT_HAS_FREE_INDEX(curp)) { + /* if we found index with free entry, then use that + * entry: create all needed subtree and add new leaf */ -+ err = ext3_ext_split(handle, inode, path, newext, i); -+ } else { -+ /* tree is full, time to grow in depth */ -+ err = ext3_ext_grow_indepth(handle, inode, path, newext); -+ } ++ err = ext3_ext_split(handle, tree, path, newext, i); + -+ if (!err) { + /* refill path */ -+ ext3_ext_drop_refs(inode, path); -+ path = ext3_ext_find_extent(inode, newext->e_block, path); ++ ext3_ext_drop_refs(path); ++ path = ext3_ext_find_extent(tree, newext->e_block, path); + if (IS_ERR(path)) + err = PTR_ERR(path); ++ } else { ++ /* tree is full, time to grow in depth */ ++ err = ext3_ext_grow_indepth(handle, tree, path, newext); + ++ /* refill path */ ++ ext3_ext_drop_refs(path); ++ path = ext3_ext_find_extent(tree, newext->e_block, path); ++ if (IS_ERR(path)) ++ err = PTR_ERR(path); ++ + /* -+ * probably we've used some blocks from extent -+ * let's allocate new block for it ++ * only first (depth 0 -> 1) produces free space ++ * in all other cases we have to split growed tree + */ -+ if (newext->e_num == 0 && !err) { -+ newext->e_start = -+ ext3_new_block(handle, inode, newblock, -+ 0, 0, &err); -+ newext->e_num = 1; ++ depth = EXT_DEPTH(tree); ++ if (path[depth].p_hdr->e_num == path[depth].p_hdr->e_max) { ++ /* now we need split */ ++ goto repeat; + } + } + -+ return err; ++ if (err) ++ return err; ++ ++ return 0; +} + +/* -+ * returns next allocated block or 0xffffffff ++ * returns allocated block in subsequent extent or 0xffffffff + * NOTE: it consider block number from index entry as + * allocated block. thus, index entries have to be consistent + * with leafs + */ -+static inline unsigned ext3_ext_next_allocated_block(struct inode *inode, -+ struct ext3_ext_path *path) ++static unsigned long ++ext3_ext_next_allocated_block(struct ext3_ext_path *path) +{ + int depth; + @@ -827,7 +896,7 @@ +/* + * returns first allocated block from next leaf or 0xffffffff + */ -+static unsigned ext3_ext_next_leaf_block(struct inode *inode, ++static unsigned ext3_ext_next_leaf_block(struct ext3_extents_tree *tree, + struct ext3_ext_path *path) +{ + int depth; @@ -857,18 +926,17 @@ + * then we have to correct all indexes above + * TODO: do we need to correct tree in all cases? + */ -+int ext3_ext_correct_indexes(handle_t *handle, struct inode *inode, ++int ext3_ext_correct_indexes(handle_t *handle, struct ext3_extents_tree *tree, + struct ext3_ext_path *path) +{ -+ int depth = EXT3_I(inode)->i_depth; + struct ext3_extent_header *eh; ++ int depth = EXT_DEPTH(tree); + struct ext3_extent *ex; -+ long border; ++ unsigned long border; + int k, err = 0; + + eh = path[depth].p_hdr; + ex = path[depth].p_ext; -+ + EXT_ASSERT(ex); + EXT_ASSERT(eh); + @@ -882,35 +950,56 @@ + return 0; + } + ++ /* ++ * TODO: we need correction if border is smaller then current one ++ */ + k = depth - 1; + border = path[depth].p_ext->e_block; -+ if ((err = ext3_ext_get_access(handle, inode, path + k))) ++ if ((err = ext3_ext_get_access(handle, tree, path + k))) + return err; + path[k].p_idx->e_block = border; -+ if ((err = ext3_ext_dirty(handle, inode, path + k))) ++ if ((err = ext3_ext_dirty(handle, tree, path + k))) + return err; + + while (k--) { + /* change all left-side indexes */ -+ if (path[k].p_idx != EXT_FIRST_INDEX(path[k].p_hdr) -+ && k != 0) ++ if (path[k+1].p_idx != EXT_FIRST_INDEX(path[k+1].p_hdr)) + break; -+ if ((err = ext3_ext_get_access(handle, inode, path + k))) ++ if ((err = ext3_ext_get_access(handle, tree, path + k))) + break; + path[k].p_idx->e_block = border; -+ if ((err = ext3_ext_dirty(handle, inode, path + k))) ++ if ((err = ext3_ext_dirty(handle, tree, path + k))) + break; + } + + return err; +} + ++static int inline ++ext3_can_extents_be_merged(struct ext3_extents_tree *tree, ++ struct ext3_extent *ex1, ++ struct ext3_extent *ex2) ++{ ++ if (ex1->e_block + ex1->e_num != ex2->e_block) ++ return 0; ++ ++#ifdef AGRESSIVE_TEST ++ if (ex1->e_num >= 4) ++ return 0; ++#endif ++ ++ if (!tree->mergable) ++ return 1; ++ ++ return tree->mergable(ex1, ex2); ++} ++ +/* + * this routine tries to merge requsted extent into the existing + * extent or inserts requested extent as new one into the tree, + * creating new leaf in no-space case + */ -+int ext3_ext_insert_extent(handle_t *handle, struct inode *inode, ++int ext3_ext_insert_extent(handle_t *handle, struct ext3_extents_tree *tree, + struct ext3_ext_path *path, + struct ext3_extent *newext) +{ @@ -921,56 +1010,49 @@ + struct ext3_ext_path *npath = NULL; + int err; + -+ depth = EXT3_I(inode)->i_depth; -+ if ((ex = path[depth].p_ext)) { -+ /* try to insert block into found extent and return */ -+ if (ex->e_block + ex->e_num == newext->e_block && -+ ex->e_start + ex->e_num == newext->e_start) { -+#ifdef AGRESSIVE_TEST -+ if (ex->e_num >= 2) -+ goto repeat; -+#endif -+ if ((err = ext3_ext_get_access(handle, inode, -+ path + depth))) -+ return err; -+ ext_debug(inode, "append %d block to %d:%d (from %d)\n", -+ newext->e_num, ex->e_block, ex->e_num, -+ ex->e_start); -+ ex->e_num += newext->e_num; -+ err = ext3_ext_dirty(handle, inode, path + depth); ++ depth = EXT_DEPTH(tree); ++ ex = path[depth].p_ext; ++ ++ /* try to insert block into found extent and return */ ++ if (ex && ext3_can_extents_be_merged(tree, ex, newext)) { ++ ext_debug(tree, "append %d block to %d:%d (from %d)\n", ++ newext->e_num, ex->e_block, ex->e_num, ++ ex->e_start); ++ if ((err = ext3_ext_get_access(handle, tree, path + depth))) + return err; -+ } ++ ex->e_num += newext->e_num; ++ err = ext3_ext_dirty(handle, tree, path + depth); ++ return err; + } + +repeat: -+ depth = EXT3_I(inode)->i_depth; ++ depth = EXT_DEPTH(tree); + eh = path[depth].p_hdr; + if (eh->e_num == eh->e_max) { + /* probably next leaf has space for us? */ -+ int next = ext3_ext_next_leaf_block(inode, path); ++ int next = ext3_ext_next_leaf_block(tree, path); + if (next != 0xffffffff) { -+ ext_debug(inode, "next leaf block - %d\n", next); ++ ext_debug(tree, "next leaf block - %d\n", next); + EXT_ASSERT(!npath); -+ npath = ext3_ext_find_extent(inode, next, NULL); ++ npath = ext3_ext_find_extent(tree, next, NULL); + if (IS_ERR(npath)) + return PTR_ERR(npath); + EXT_ASSERT(npath->p_depth == path->p_depth); + eh = npath[depth].p_hdr; + if (eh->e_num < eh->e_max) { -+ ext_debug(inode, -+ "next leaf has free ext(%d)\n", ++ ext_debug(tree, "next leaf isnt full(%d)\n", + eh->e_num); + path = npath; + goto repeat; + } -+ ext_debug(inode, "next leaf hasno free space(%d,%d)\n", ++ ext_debug(tree, "next leaf hasno free space(%d,%d)\n", + eh->e_num, eh->e_max); + } + /* + * there is no free space in found leaf + * we're gonna add new leaf in the tree + */ -+ err = ext3_ext_create_new_leaf(handle, inode, path, newext); ++ err = ext3_ext_create_new_leaf(handle, tree, path, newext); + if (err) + goto cleanup; + goto repeat; @@ -978,161 +1060,247 @@ + + nearex = path[depth].p_ext; + -+ if ((err = ext3_ext_get_access(handle, inode, path + depth))) ++ if ((err = ext3_ext_get_access(handle, tree, path + depth))) + goto cleanup; + + if (!nearex) { + /* there is no extent in this leaf, create first one */ -+ ext_debug(inode, "first extent in the leaf: %d:%d:%d\n", ++ ext_debug(tree, "first extent in the leaf: %d:%d:%d\n", + newext->e_block, newext->e_start, + newext->e_num); -+ eh->e_num++; + path[depth].p_ext = EXT_FIRST_EXTENT(eh); -+ + } else if (newext->e_block > nearex->e_block) { + EXT_ASSERT(newext->e_block != nearex->e_block); -+ len = EXT_MAX_EXTENT(eh) - nearex; -+ len = (len - 1) * sizeof(struct ext3_extent); -+ len = len < 0 ? 0 : len; -+ ext_debug(inode, "insert %d:%d:%d after: nearest 0x%p, " -+ "move %d from 0x%p to 0x%p\n", -+ newext->e_block, newext->e_start, newext->e_num, -+ nearex, len, nearex + 1, nearex + 2); -+ ext3_ext_check_boundary(inode, path + depth, nearex + 2, len); -+ memmove(nearex + 2, nearex + 1, len); ++ if (nearex != EXT_LAST_EXTENT(eh)) { ++ len = EXT_MAX_EXTENT(eh) - nearex; ++ len = (len - 1) * sizeof(struct ext3_extent); ++ len = len < 0 ? 0 : len; ++ ext_debug(tree, "insert %d:%d:%d after: nearest 0x%p, " ++ "move %d from 0x%p to 0x%p\n", ++ newext->e_block, newext->e_start, ++ newext->e_num, ++ nearex, len, nearex + 1, nearex + 2); ++ memmove(nearex + 2, nearex + 1, len); ++ } + path[depth].p_ext = nearex + 1; -+ eh->e_num++; + } else { + EXT_ASSERT(newext->e_block != nearex->e_block); + len = (EXT_MAX_EXTENT(eh) - nearex) * sizeof(struct ext3_extent); + len = len < 0 ? 0 : len; -+ ext_debug(inode, "insert %d:%d:%d before: nearest 0x%p, " ++ ext_debug(tree, "insert %d:%d:%d before: nearest 0x%p, " + "move %d from 0x%p to 0x%p\n", + newext->e_block, newext->e_start, newext->e_num, + nearex, len, nearex + 1, nearex + 2); ++ + memmove(nearex + 1, nearex, len); + path[depth].p_ext = nearex; -+ eh->e_num++; -+ -+ /* time to correct all indexes above */ -+ err = ext3_ext_correct_indexes(handle, inode, path); + } + + if (!err) { ++ eh->e_num++; + nearex = path[depth].p_ext; + nearex->e_block = newext->e_block; + nearex->e_start = newext->e_start; + nearex->e_num = newext->e_num; ++ ++ /* time to correct all indexes above */ ++ err = ext3_ext_correct_indexes(handle, tree, path); + } + -+ err = ext3_ext_dirty(handle, inode, path + depth); ++ err = ext3_ext_dirty(handle, tree, path + depth); + +cleanup: + if (npath) { -+ ext3_ext_drop_refs(inode, npath); ++ ext3_ext_drop_refs(npath); + kfree(npath); + } + + return err; +} + -+int ext3_ext_get_block(handle_t *handle, struct inode *inode, long iblock, -+ struct buffer_head *bh_result, int create) ++int ext3_ext_walk_space(struct ext3_extents_tree *tree, unsigned long block, ++ unsigned long num, ext_prepare_callback func) +{ -+ struct ext3_ext_path *path; -+ int depth = EXT3_I(inode)->i_depth; -+ struct ext3_extent newex; -+ struct ext3_extent *ex; -+ int goal, newblock, err = 0; ++ struct ext3_ext_path *path = NULL; ++ struct ext3_extent *ex, cbex; ++ unsigned long next, start = 0, end = 0; ++ int depth, exists, err = 0; ++ ++ EXT_ASSERT(tree); ++ EXT_ASSERT(func); ++ EXT_ASSERT(tree->inode); ++ EXT_ASSERT(tree->root); ++ ++ while (num > 0 && block != 0xfffffffff) { ++ /* find extent for this block */ ++ path = ext3_ext_find_extent(tree, block, path); ++ if (IS_ERR(path)) { ++ err = PTR_ERR(path); ++ break; ++ } + -+ ext_debug(inode, "block %d requested for inode %u, bh_result 0x%p\n", -+ (int) iblock, (unsigned) inode->i_ino, bh_result); -+ bh_result->b_state &= ~(1UL << BH_New); ++ depth = EXT_DEPTH(tree); ++ ex = path[depth].p_ext; ++ next = ext3_ext_next_allocated_block(path); ++ ++ exists = 0; ++ if (!ex) { ++ /* there is no extent yet, so try to allocate ++ * all requested space */ ++ start = block; ++ end = block + num - 1; ++ } else if (ex->e_block > block) { ++ /* need to allocate space before found extent */ ++ start = block; ++ end = ex->e_block - 1; ++ if (block + num - 1 < end) ++ end = block + num - 1; ++ } else if (block >= ex->e_block + ex->e_num) { ++ /* need to allocate space after found extent */ ++ start = block; ++ end = block + num - 1; ++ if (end >= next) ++ end = next - 1; ++ } else if (block >= ex->e_block) { ++ /* ++ * some part of requested space is covered ++ * by found extent ++ */ ++ start = block; ++ end = ex->e_block + ex->e_num - 1; ++ if (block + num - 1 < end) ++ end = block + num - 1; ++ exists = 1; ++ } else { ++ BUG(); ++ } + -+ down(&EXT3_I(inode)->i_ext_sem); ++ if (!exists) { ++ cbex.e_block = start; ++ cbex.e_num = end - start + 1; ++ cbex.e_start = 0; ++ } else ++ cbex = *ex; + -+ /* find extent for this block */ -+ path = ext3_ext_find_extent(inode, iblock, NULL); -+ if (IS_ERR(path)) { -+ err = PTR_ERR(path); -+ goto out2; -+ } ++ err = func(tree, path, &cbex, exists); ++ if (err < 0) ++ break; + -+ if ((ex = path[depth].p_ext)) { -+ /* if found exent covers block, simple return it */ -+ if (iblock >= ex->e_block && iblock < ex->e_block + ex->e_num) { -+ newblock = iblock - ex->e_block + ex->e_start; -+ ext_debug(inode, "%d fit into %d:%d -> %d\n", -+ (int) iblock, ex->e_block, ex->e_num, -+ newblock); -+ goto out; ++ if (err == EXT_BREAK) { ++ err = 0; ++ break; + } -+ } + -+ /* -+ * we couldn't try to create block if create flag is zero -+ */ -+ if (!create) -+ goto out2; ++ if (EXT_DEPTH(tree) != depth) { ++ /* depth was changed. we have to realloc path */ ++ ext3_ext_drop_refs(path); ++ kfree(path); ++ path = NULL; ++ } + -+ /* allocate new block */ -+ goal = ext3_ext_find_goal(inode, path); -+ newblock = ext3_new_block(handle, inode, goal, 0, 0, &err); -+ if (!newblock) -+ goto out2; -+ ext_debug(inode, "allocate new block: goal %d, found %d\n", -+ goal, newblock); ++ block += cbex.e_num; ++ num -= cbex.e_num; ++ } + -+ /* try to insert new extent into found leaf and return */ -+ newex.e_block = iblock; -+ newex.e_start = newblock; -+ newex.e_num = 1; -+ err = ext3_ext_insert_extent(handle, inode, path, &newex); -+ if (err) -+ goto out2; -+ -+ /* previous routine could use block we allocated */ -+ newblock = newex.e_start; -+ bh_result->b_state |= (1UL << BH_New); ++ if (path) { ++ ext3_ext_drop_refs(path); ++ kfree(path); ++ } + -+out: -+ ext3_ext_show_leaf(inode, path); -+ bh_result->b_dev = inode->i_dev; -+ bh_result->b_blocknr = newblock; -+ bh_result->b_state |= (1UL << BH_Mapped); -+out2: -+ ext3_ext_drop_refs(inode, path); -+ kfree(path); -+ up(&EXT3_I(inode)->i_ext_sem); ++ return err; ++} + -+ return err; ++static inline void ++ext3_ext_invalidate_cache(struct ext3_extents_tree *tree) ++{ ++ if (tree->cex) ++ tree->cex->e_num = 0; ++} ++ ++static inline void ++ext3_ext_put_in_cache(struct ext3_extents_tree *tree, struct ext3_extent *ex) ++{ ++ if (tree->cex) { ++ EXT_ASSERT(ex); ++ EXT_ASSERT(ex->e_num); ++ tree->cex->e_block = ex->e_block; ++ tree->cex->e_start = ex->e_start; ++ tree->cex->e_num = ex->e_num; ++ } +} + +/* -+ * returns 1 if current index have to be freed (even partial) ++ * this routine calculate boundaries of the gap requested block fits into ++ * and cache this gap + */ -+static int ext3_ext_more_to_truncate(struct inode *inode, -+ struct ext3_ext_path *path) ++static inline void ++ext3_ext_put_gap_in_cache(struct ext3_extents_tree *tree, ++ struct ext3_ext_path *path, ++ unsigned long block) +{ -+ EXT_ASSERT(path->p_idx); ++ int depth = EXT_DEPTH(tree); ++ struct ext3_extent *ex, gex; + -+ if (path->p_idx < EXT_FIRST_INDEX(path->p_hdr)) ++ ex = path[depth].p_ext; ++ if (ex == NULL) { ++ /* there is no extent yet, so gap is [0;-] */ ++ gex.e_block = 0; ++ gex.e_num = 0xffffffff; ++ ext_debug(tree, "cache gap(whole file):"); ++ } else if (block < ex->e_block) { ++ gex.e_block = block; ++ gex.e_num = ex->e_block - block; ++ ext_debug(tree, "cache gap(before): %lu [%lu:%lu]", ++ (unsigned long) block, ++ (unsigned long) ex->e_block, ++ (unsigned long) ex->e_num); ++ } else if (block >= ex->e_block + ex->e_num) { ++ gex.e_block = ex->e_block + ex->e_num; ++ gex.e_num = ext3_ext_next_allocated_block(path); ++ ext_debug(tree, "cache gap(after): [%lu:%lu] %lu", ++ (unsigned long) ex->e_block, ++ (unsigned long) ex->e_num, ++ (unsigned long) block); ++ EXT_ASSERT(gex.e_num > gex.e_block); ++ gex.e_num = gex.e_num - gex.e_block; ++ } else { ++ BUG(); ++ } ++ ++ ext_debug(tree, " -> %lu:%lu\n", (unsigned long) gex.e_block, ++ (unsigned long) gex.e_num); ++ gex.e_start = 0xffffffff; ++ ext3_ext_put_in_cache(tree, &gex); ++} ++ ++static inline int ++ext3_ext_in_cache(struct ext3_extents_tree *tree, unsigned long block, ++ struct ext3_extent *ex) ++{ ++ struct ext3_extent *cex = tree->cex; ++ ++ /* is there cache storage at all? */ ++ if (!cex) + return 0; + -+ /* -+ * if truncate on deeper level happened it it wasn't partial -+ * so we have to consider current index for truncation -+ */ -+ if (path->p_hdr->e_num == path->p_block) ++ /* has cache valid data? */ ++ if (cex->e_num == 0) + return 0; + -+ /* -+ * put actual number of indexes to know is this number got -+ * changed at the next iteration -+ */ -+ path->p_block = path->p_hdr->e_num; -+ -+ return 1; ++ if (block >= cex->e_block && block < cex->e_block + cex->e_num) { ++ ex->e_block = cex->e_block; ++ ex->e_start = cex->e_start; ++ ex->e_num = cex->e_num; ++ ext_debug(tree, "%lu cached by %lu:%lu:%lu(gap)\n", ++ (unsigned long) block, ++ (unsigned long) ex->e_block, ++ (unsigned long) ex->e_num, ++ (unsigned long) ex->e_start); ++ return 1; ++ } ++ ++ /* not in cache */ ++ return 0; +} + +/* @@ -1140,8 +1308,8 @@ + * it's used in truncate case only. thus all requests are for + * last index in the block only + */ -+int ext3_ext_remove_index(handle_t *handle, struct inode *inode, -+ struct ext3_ext_path *path) ++int ext3_ext_rm_idx(handle_t *handle, struct ext3_extents_tree *tree, ++ struct ext3_ext_path *path) +{ + struct buffer_head *bh; + int err; @@ -1149,271 +1317,314 @@ + /* free index block */ + path--; + EXT_ASSERT(path->p_hdr->e_num); -+ if ((err = ext3_ext_get_access(handle, inode, path))) ++ if ((err = ext3_ext_get_access(handle, tree, path))) + return err; + path->p_hdr->e_num--; -+ if ((err = ext3_ext_dirty(handle, inode, path))) ++ if ((err = ext3_ext_dirty(handle, tree, path))) + return err; -+ bh = sb_get_hash_table(inode->i_sb, path->p_idx->e_leaf); -+ ext3_forget(handle, 0, inode, bh, path->p_idx->e_leaf); -+ ext3_free_blocks(handle, inode, path->p_idx->e_leaf, 1); -+ -+ ext_debug(inode, "index is empty, remove it, free block %d\n", ++ ext_debug(tree, "index is empty, remove it, free block %d\n", + path->p_idx->e_leaf); ++ bh = sb_get_hash_table(tree->inode->i_sb, path->p_idx->e_leaf); ++ ext3_forget(handle, 0, tree->inode, bh, path->p_idx->e_leaf); ++ ext3_free_blocks(handle, tree->inode, path->p_idx->e_leaf, 1); + return err; +} + -+/* -+ * returns 1 if current extent needs to be freed (even partial) -+ * instead, returns 0 -+ */ -+int ext3_ext_more_leaves_to_truncate(struct inode *inode, ++int ext3_ext_calc_credits_for_insert(struct ext3_extents_tree *tree, + struct ext3_ext_path *path) +{ -+ unsigned blocksize = inode->i_sb->s_blocksize; -+ struct ext3_extent *ex = path->p_ext; -+ int last_block; -+ -+ EXT_ASSERT(ex); ++ int depth = EXT_DEPTH(tree); ++ int needed; + -+ /* is there leave in the current leaf? */ -+ if (ex < EXT_FIRST_EXTENT(path->p_hdr)) -+ return 0; ++ if (path) { ++ /* probably there is space in leaf? */ ++ if (path[depth].p_hdr->e_num < path[depth].p_hdr->e_max) ++ return 1; ++ } + -+ last_block = (inode->i_size + blocksize-1) -+ >> EXT3_BLOCK_SIZE_BITS(inode->i_sb); ++ /* ++ * the worste case we're expecting is creation of the ++ * new root (growing in depth) with index splitting ++ * for splitting we have to consider depth + 1 because ++ * previous growing could increase it ++ */ ++ depth = depth + 1; + -+ if (last_block >= ex->e_block + ex->e_num) -+ return 0; ++ /* ++ * growing in depth: ++ * block allocation + new root + old root ++ */ ++ needed = EXT3_ALLOC_NEEDED + 2; + -+ /* seems it extent have to be freed */ -+ return 1; ++ /* index split. we may need: ++ * allocate intermediate indexes and new leaf ++ * change two blocks at each level, but root ++ * modify root block (inode) ++ */ ++ needed += (depth * EXT3_ALLOC_NEEDED) + (2 * depth) + 1; ++ ++ return needed; +} + -+handle_t *ext3_ext_journal_restart(handle_t *handle, int needed) ++static int ++ext3_ext_split_for_rm(handle_t *handle, struct ext3_extents_tree *tree, ++ struct ext3_ext_path *path, unsigned long start, ++ unsigned long end) +{ -+ int err; ++ struct ext3_extent *ex, tex; ++ struct ext3_ext_path *npath; ++ int depth, creds, err; + -+ if (handle->h_buffer_credits > needed) -+ return handle; -+ if (!ext3_journal_extend(handle, needed)) -+ return handle; -+ err = ext3_journal_restart(handle, needed); ++ depth = EXT_DEPTH(tree); ++ ex = path[depth].p_ext; ++ EXT_ASSERT(ex); ++ EXT_ASSERT(end < ex->e_block + ex->e_num - 1); ++ EXT_ASSERT(ex->e_block < start); ++ ++ /* calculate tail extent */ ++ tex.e_block = end + 1; ++ EXT_ASSERT(tex.e_block < ex->e_block + ex->e_num); ++ tex.e_num = ex->e_block + ex->e_num - tex.e_block; ++ ++ creds = ext3_ext_calc_credits_for_insert(tree, path); ++ handle = ext3_ext_journal_restart(handle, creds); ++ if (IS_ERR(handle)) ++ return PTR_ERR(handle); + -+ return handle; -+} ++ /* calculate head extent. use primary extent */ ++ err = ext3_ext_get_access(handle, tree, path + depth); ++ if (err) ++ return err; ++ ex->e_num = start - ex->e_block; ++ err = ext3_ext_dirty(handle, tree, path + depth); ++ if (err) ++ return err; + -+/* -+ * this routine calculate max number of blocks to be modified -+ * while freeing extent and is intended to be used in truncate path -+ */ -+static int ext3_ext_calc_credits(struct inode *inode, -+ struct ext3_ext_path *path, -+ int num) -+{ -+ int depth = EXT3_I(inode)->i_depth; -+ int needed; -+ -+ /* -+ * extent couldn't cross group, so we will modify -+ * single bitmap block and single group descriptor -+ */ -+ needed = 2; ++ /* FIXME: some callback to free underlying resource ++ * and correct e_start? */ ++ ext_debug(tree, "split extent: head %u:%u, tail %u:%u\n", ++ ex->e_block, ex->e_num, tex.e_block, tex.e_num); + -+ /* -+ * if this is last extent in a leaf, then we have to -+ * free leaf block and remove pointer from index above. -+ * that pointer could be last in index block, so we'll -+ * have to remove it too. this way we could modify/free -+ * the whole path + root index (inode stored) will be -+ * modified -+ */ -+ if (!path || (num == path->p_ext->e_num && -+ path->p_ext == EXT_FIRST_EXTENT(path->p_hdr))) -+ needed += (depth * EXT3_ALLOC_NEEDED) + 1; ++ npath = ext3_ext_find_extent(tree, ex->e_block, NULL); ++ if (IS_ERR(npath)) ++ return PTR_ERR(npath); ++ depth = EXT_DEPTH(tree); ++ EXT_ASSERT(npath[depth].p_ext->e_block == ex->e_block); ++ EXT_ASSERT(npath[depth].p_ext->e_num == ex->e_num); + -+ return needed; ++ err = ext3_ext_insert_extent(handle, tree, npath, &tex); ++ ext3_ext_drop_refs(npath); ++ kfree(npath); ++ ++ return err; ++ +} + -+/* -+ * core of the truncate procedure: -+ * - calculated what part of each extent in the requested leaf -+ * need to be freed -+ * - frees and forgets these blocks -+ * -+ * TODO: we could optimize and free several extents during -+ * single journal_restart()-journal_restart() cycle -+ */ -+static int ext3_ext_truncate_leaf(handle_t *handle, -+ struct inode *inode, -+ struct ext3_ext_path *path, -+ int depth) ++static int ++ext3_ext_rm_leaf(handle_t *handle, struct ext3_extents_tree *tree, ++ struct ext3_ext_path *path, unsigned long start, ++ unsigned long end) +{ -+ unsigned blocksize = inode->i_sb->s_blocksize; -+ int last_block; -+ int i, err = 0, sf, num; ++ struct ext3_extent *ex, *fu = NULL, *lu, *le; ++ int err = 0, correct_index = 0; ++ int depth = EXT_DEPTH(tree), credits; ++ struct ext3_extent_header *eh; ++ unsigned a, b, block, num; + -+ ext_debug(inode, "level %d - leaf\n", depth); -+ if (!path->p_hdr) -+ path->p_hdr = -+ (struct ext3_extent_header *) path->p_bh->b_data; ++ ext_debug(tree, "remove [%lu:%lu] in leaf\n", start, end); ++ if (!path[depth].p_hdr) ++ path[depth].p_hdr = EXT_BLOCK_HDR(path[depth].p_bh); ++ eh = path[depth].p_hdr; ++ EXT_ASSERT(eh); ++ EXT_ASSERT(eh->e_num <= eh->e_max); ++ ++ /* find where to start removing */ ++ le = ex = EXT_LAST_EXTENT(eh); ++ while (ex != EXT_FIRST_EXTENT(eh)) { ++ if (ex->e_block <= end) ++ break; ++ ex--; ++ } + -+ EXT_ASSERT(path->p_hdr->e_num <= path->p_hdr->e_max); ++ if (start > ex->e_block && end < ex->e_block + ex->e_num - 1) { ++ /* removal of internal part of the extent requested ++ * tail and head must be placed in different extent ++ * so, we have to insert one more extent */ ++ path[depth].p_ext = ex; ++ return ext3_ext_split_for_rm(handle, tree, path, start, end); ++ } + -+ last_block = (inode->i_size + blocksize-1) -+ >> EXT3_BLOCK_SIZE_BITS(inode->i_sb); -+ path->p_ext = EXT_LAST_EXTENT(path->p_hdr); -+ while (ext3_ext_more_leaves_to_truncate(inode, path)) { ++ lu = ex; ++ while (ex >= EXT_FIRST_EXTENT(eh) && ++ ex->e_block + ex->e_num > start) { ++ ext_debug(tree, "remove ext %u:%u\n", ex->e_block, ex->e_num); ++ path[depth].p_ext = ex; ++ ++ a = ex->e_block > start ? ex->e_block : start; ++ b = ex->e_block + ex->e_num - 1 < end ? ++ ex->e_block + ex->e_num - 1 : end; ++ ++ ext_debug(tree, " border %u:%u\n", a, b); ++ ++ if (a != ex->e_block && b != ex->e_block + ex->e_num - 1) { ++ block = 0; ++ num = 0; ++ BUG(); ++ } else if (a != ex->e_block) { ++ /* remove tail of the extent */ ++ block = ex->e_block; ++ num = a - block; ++ } else if (b != ex->e_block + ex->e_num - 1) { ++ /* remove head of the extent */ ++ block = a; ++ num = b - a; ++ } else { ++ /* remove whole extent: excelent! */ ++ block = ex->e_block; ++ num = 0; ++ EXT_ASSERT(a == ex->e_block && ++ b == ex->e_block + ex->e_num - 1); ++ } + -+ /* what part of extent have to be freed? */ -+ sf = last_block > path->p_ext->e_block ? -+ last_block : path->p_ext->e_block; ++ if (ex == EXT_FIRST_EXTENT(eh)) ++ correct_index = 1; ++ ++ credits = 1; ++ if (correct_index) ++ credits += (EXT_DEPTH(tree) * EXT3_ALLOC_NEEDED) + 1; ++ if (tree->remove_extent_credits) ++ credits += tree->remove_extent_credits(tree, ex, a, b); ++ ++ handle = ext3_ext_journal_restart(handle, credits); ++ if (IS_ERR(handle)) { ++ err = PTR_ERR(handle); ++ goto out; ++ } + -+ /* number of blocks from extent to be freed */ -+ num = path->p_ext->e_block + path->p_ext->e_num - sf; ++ err = ext3_ext_get_access(handle, tree, path + depth); ++ if (err) ++ goto out; + -+ /* calc physical first physical block to be freed */ -+ sf = path->p_ext->e_start + (sf - path->p_ext->e_block); ++ if (tree->remove_extent) ++ err = tree->remove_extent(tree, ex, a, b); ++ if (err) ++ goto out; + -+ i = ext3_ext_calc_credits(inode, path, num); -+ handle = ext3_ext_journal_restart(handle, i); -+ if (IS_ERR(handle)) -+ return PTR_ERR(handle); -+ -+ ext_debug(inode, "free extent %d:%d:%d -> free %d:%d\n", -+ path->p_ext->e_block, path->p_ext->e_start, -+ path->p_ext->e_num, sf, num); -+ for (i = 0; i < num; i++) { -+ struct buffer_head *bh = -+ sb_get_hash_table(inode->i_sb, sf + i); -+ ext3_forget(handle, 0, inode, bh, sf + i); ++ if (num == 0) { ++ /* this extent is removed entirely mark slot unused */ ++ ex->e_start = 0; ++ eh->e_num--; ++ fu = ex; + } -+ ext3_free_blocks(handle, inode, sf, num); + -+ /* collect extents usage stats */ -+ spin_lock(&EXT3_SB(inode->i_sb)->s_ext_lock); -+ EXT3_SB(inode->i_sb)->s_ext_extents++; -+ EXT3_SB(inode->i_sb)->s_ext_blocks += num; -+ spin_unlock(&EXT3_SB(inode->i_sb)->s_ext_lock); ++ ex->e_block = block; ++ ex->e_num = num; + -+ /* reduce extent */ -+ if ((err = ext3_ext_get_access(handle, inode, path))) -+ return err; -+ path->p_ext->e_num -= num; -+ if (path->p_ext->e_num == 0) -+ path->p_hdr->e_num--; -+ if ((err = ext3_ext_dirty(handle, inode, path))) -+ return err; ++ err = ext3_ext_dirty(handle, tree, path + depth); ++ if (err) ++ goto out; + -+ path->p_ext--; ++ ext_debug(tree, "new extent: %u:%u:%u\n", ++ ex->e_block, ex->e_num, ex->e_start); ++ ex--; + } -+ ++ ++ if (fu) { ++ /* reuse unused slots */ ++ while (lu < le) { ++ if (lu->e_start) { ++ *fu = *lu; ++ lu->e_start = 0; ++ fu++; ++ } ++ lu++; ++ } ++ } ++ ++ if (correct_index && eh->e_num) ++ err = ext3_ext_correct_indexes(handle, tree, path); ++ + /* if this leaf is free, then we should + * remove it from index block above */ -+ if (path->p_hdr->e_num == 0 && depth > 0) -+ err = ext3_ext_remove_index(handle, inode, path); ++ if (err == 0 && eh->e_num == 0 && path[depth].p_bh != NULL) ++ err = ext3_ext_rm_idx(handle, tree, path + depth); + ++out: + return err; +} + -+static void ext3_ext_collect_stats(struct inode *inode) -+{ -+ int depth; -+ -+ /* skip inodes with old good bitmap */ -+ if (!(EXT3_I(inode)->i_flags & EXT3_EXTENTS_FL)) -+ return; -+ -+ /* collect on full truncate only */ -+ if (inode->i_size) -+ return; + -+ depth = EXT3_I(inode)->i_depth; -+ if (depth < EXT3_SB(inode->i_sb)->s_ext_mindepth) -+ EXT3_SB(inode->i_sb)->s_ext_mindepth = depth; -+ if (depth > EXT3_SB(inode->i_sb)->s_ext_maxdepth) -+ EXT3_SB(inode->i_sb)->s_ext_maxdepth = depth; -+ EXT3_SB(inode->i_sb)->s_ext_sum += depth; -+ EXT3_SB(inode->i_sb)->s_ext_count++; ++static struct ext3_extent_idx * ++ext3_ext_last_covered(struct ext3_extent_header *hdr, unsigned long block) ++{ ++ struct ext3_extent_idx *ix; + ++ ix = EXT_LAST_INDEX(hdr); ++ while (ix != EXT_FIRST_INDEX(hdr)) { ++ if (ix->e_block <= block) ++ break; ++ ix--; ++ } ++ return ix; +} + -+void ext3_ext_truncate(struct inode * inode) ++/* ++ * returns 1 if current index have to be freed (even partial) ++ */ ++static int inline ++ext3_ext_more_to_rm(struct ext3_ext_path *path) +{ -+ struct address_space *mapping = inode->i_mapping; -+ struct ext3_ext_path *path; -+ struct page * page; -+ handle_t *handle; -+ int i, depth, err = 0; ++ EXT_ASSERT(path->p_idx); + -+ ext3_ext_collect_stats(inode); ++ if (path->p_idx < EXT_FIRST_INDEX(path->p_hdr)) ++ return 0; + + /* -+ * We have to lock the EOF page here, because lock_page() nests -+ * outside journal_start(). ++ * if truncate on deeper level happened it it wasn't partial ++ * so we have to consider current index for truncation + */ -+ if ((inode->i_size & (inode->i_sb->s_blocksize - 1)) == 0) { -+ /* Block boundary? Nothing to do */ -+ page = NULL; -+ } else { -+ page = grab_cache_page(mapping, -+ inode->i_size >> PAGE_CACHE_SHIFT); -+ if (!page) -+ return; -+ } -+ -+ /* -+ * probably first extent we're gonna free will be last in block -+ */ -+ i = ext3_ext_calc_credits(inode, NULL, 0); -+ handle = ext3_journal_start(inode, i); -+ if (IS_ERR(handle)) { -+ if (page) { -+ clear_highpage(page); -+ flush_dcache_page(page); -+ unlock_page(page); -+ page_cache_release(page); -+ } -+ return; -+ } ++ if (path->p_hdr->e_num == path->p_block) ++ return 0; ++ return 1; ++} + -+ if (page) -+ ext3_block_truncate_page(handle, mapping, inode->i_size); ++int ext3_ext_remove_space(struct ext3_extents_tree *tree, ++ unsigned long start, unsigned long end) ++{ ++ struct inode *inode = tree->inode; ++ struct super_block *sb = inode->i_sb; ++ int depth = EXT_DEPTH(tree); ++ struct ext3_ext_path *path; ++ handle_t *handle; ++ int i = 0, err = 0; + -+ down(&EXT3_I(inode)->i_ext_sem); ++ ext_debug(tree, "space to be removed: %lu:%lu\n", start, end); + -+ /* -+ * TODO: optimization is possible here -+ * probably we need not scaning at all, -+ * because page truncation is enough -+ */ -+ if (ext3_orphan_add(handle, inode)) -+ goto out_stop; ++ /* probably first extent we're gonna free will be last in block */ ++ handle = ext3_journal_start(inode, depth + 1); ++ if (IS_ERR(handle)) ++ return PTR_ERR(handle); + -+ /* we have to know where to truncate from in crash case */ -+ EXT3_I(inode)->i_disksize = inode->i_size; -+ ext3_mark_inode_dirty(handle, inode); ++ ext3_ext_invalidate_cache(tree); + + /* + * we start scanning from right side freeing all the blocks + * after i_size and walking into the deep + */ -+ i = 0; -+ depth = EXT3_I(inode)->i_depth; + path = kmalloc(sizeof(struct ext3_ext_path) * (depth + 1), GFP_KERNEL); + if (IS_ERR(path)) { -+ ext3_error(inode->i_sb, "ext3_ext_truncate", ++ ext3_error(sb, "ext3_ext_remove_space", + "Can't allocate path array"); -+ goto out_stop; ++ ext3_journal_stop(handle, inode); ++ return -ENOMEM; + } + memset(path, 0, sizeof(struct ext3_ext_path) * (depth + 1)); -+ -+ path[i].p_hdr = (struct ext3_extent_header *) EXT3_I(inode)->i_data; ++ path[i].p_hdr = EXT_ROOT_HDR(tree); ++ + while (i >= 0 && err == 0) { + if (i == depth) { + /* this is leaf block */ -+ err = ext3_ext_truncate_leaf(handle, inode, -+ path + i, i); ++ err = ext3_ext_rm_leaf(handle, tree, path, start, end); + /* root level have p_bh == NULL, brelse() eats this */ + brelse(path[i].p_bh); + i--; @@ -1422,54 +1633,54 @@ + + /* this is index block */ + if (!path[i].p_hdr) { -+ path[i].p_hdr = -+ (struct ext3_extent_header *) path[i].p_bh->b_data; -+ ext_debug(inode, "initialize header\n"); ++ ext_debug(tree, "initialize header\n"); ++ path[i].p_hdr = EXT_BLOCK_HDR(path[i].p_bh); + } + + EXT_ASSERT(path[i].p_hdr->e_num <= path[i].p_hdr->e_max); + + if (!path[i].p_idx) { + /* this level hasn't touched yet */ -+ path[i].p_idx = EXT_LAST_INDEX(path[i].p_hdr); ++ path[i].p_idx = ++ ext3_ext_last_covered(path[i].p_hdr, end); + path[i].p_block = path[i].p_hdr->e_num + 1; -+ ext_debug(inode, "init index ptr: hdr 0x%p, num %d\n", ++ ext_debug(tree, "init index ptr: hdr 0x%p, num %d\n", + path[i].p_hdr, path[i].p_hdr->e_num); + } else { + /* we've already was here, see at next index */ + path[i].p_idx--; + } + -+ ext_debug(inode, "level %d - index, first 0x%p, cur 0x%p\n", ++ ext_debug(tree, "level %d - index, first 0x%p, cur 0x%p\n", + i, EXT_FIRST_INDEX(path[i].p_hdr), + path[i].p_idx); -+ if (ext3_ext_more_to_truncate(inode, path + i)) { ++ if (ext3_ext_more_to_rm(path + i)) { + /* go to the next level */ -+ ext_debug(inode, "move to level %d (block %d)\n", i+1, -+ path[i].p_idx->e_leaf); ++ ext_debug(tree, "move to level %d (block %d)\n", ++ i + 1, path[i].p_idx->e_leaf); + memset(path + i + 1, 0, sizeof(*path)); -+ path[i+1].p_bh = sb_bread(inode->i_sb, -+ path[i].p_idx->e_leaf); ++ path[i+1].p_bh = sb_bread(sb, path[i].p_idx->e_leaf); + if (!path[i+1].p_bh) { + /* should we reset i_size? */ + err = -EIO; + break; + } ++ /* put actual number of indexes to know is this ++ * number got changed at the next iteration */ ++ path[i].p_block = path[i].p_hdr->e_num; + i++; + } else { + /* we finish processing this index, go up */ + if (path[i].p_hdr->e_num == 0 && i > 0) { + /* index is empty, remove it + * handle must be already prepared by the -+ * truncate_leaf() -+ */ -+ err = ext3_ext_remove_index(handle, inode, -+ path + i); ++ * truncate_leaf() */ ++ err = ext3_ext_rm_idx(handle, tree, path + i); + } + /* root level have p_bh == NULL, brelse() eats this */ + brelse(path[i].p_bh); + i--; -+ ext_debug(inode, "return to level %d\n", i); ++ ext_debug(tree, "return to level %d\n", i); + } + } + @@ -1477,15 +1688,405 @@ + if (path->p_hdr->e_num == 0) { + /* + * truncate to zero freed all the tree -+ * so, we need to correct i_depth ++ * so, we need to correct e_depth + */ -+ EXT3_I(inode)->i_depth = 0; -+ path->p_hdr->e_max = 0; -+ ext3_mark_inode_dirty(handle, inode); ++ err = ext3_ext_get_access(handle, tree, path); ++ if (err == 0) { ++ EXT_ROOT_HDR(tree)->e_depth = 0; ++ err = ext3_ext_dirty(handle, tree, path); ++ } + } + + kfree(path); ++ ext3_journal_stop(handle, inode); ++ ++ return err; ++} ++ ++/* ++ * called at mount time ++ */ ++void ext3_ext_init(struct super_block *sb) ++{ ++ /* ++ * possible initialization would be here ++ */ ++ ++ if (test_opt(sb, EXTENTS)) ++ printk("EXT3-fs: file extents enabled\n"); ++} ++ ++/* ++ * called at umount time ++ */ ++void ext3_ext_release(struct super_block *sb) ++{ ++} ++ ++/************************************************************************ ++ * VFS related routines ++ ************************************************************************/ ++ ++static int ext3_get_inode_write_access(handle_t *handle, void *buffer) ++{ ++ /* we use in-core data, not bh */ ++ return 0; ++} ++ ++static int ext3_mark_buffer_dirty(handle_t *handle, void *buffer) ++{ ++ struct inode *inode = buffer; ++ ext3_mark_inode_dirty(handle, inode); ++ return 0; ++} ++ ++static int ext3_ext_mergable(struct ext3_extent *ex1, ++ struct ext3_extent *ex2) ++{ ++ if (ex1->e_start + ex1->e_num == ex2->e_start) ++ return 1; ++ return 0; ++} ++ ++static int ++ext3_remove_blocks_credits(struct ext3_extents_tree *tree, ++ struct ext3_extent *ex, ++ unsigned long from, unsigned long to) ++{ ++ int needed; ++ ++ /* at present, extent can't cross block group */; ++ needed = 3; /* bitmap + group desc + sb */ ++ ++#ifdef CONFIG_QUOTA ++ needed += 2 * EXT3_SINGLEDATA_TRANS_BLOCKS; ++#endif ++ return needed; ++} ++ ++static int ++ext3_remove_blocks(struct ext3_extents_tree *tree, ++ struct ext3_extent *ex, ++ unsigned long from, unsigned long to) ++{ ++ int needed = ext3_remove_blocks_credits(tree, ex, from, to); ++ handle_t *handle = ext3_journal_start(tree->inode, needed); ++ ++ if (IS_ERR(handle)) ++ return PTR_ERR(handle); ++ if (from >= ex->e_block && to == ex->e_block + ex->e_num - 1) { ++ /* tail removal */ ++ unsigned long num, start; ++ num = ex->e_block + ex->e_num - from; ++ start = ex->e_start + ex->e_num - num; ++ ext_debug(tree, "free last %lu blocks starting %lu\n", ++ num, start); ++ ext3_free_blocks(handle, tree->inode, start, num); ++ } else if (from == ex->e_block && to <= ex->e_block + ex->e_num - 1) { ++ printk("strange request: removal %lu-%lu from %u:%u\n", ++ from, to, ex->e_block, ex->e_num); ++ } else { ++ printk("strange request: removal(2) %lu-%lu from %u:%u\n", ++ from, to, ex->e_block, ex->e_num); ++ } ++ ext3_journal_stop(handle, tree->inode); ++ return 0; ++} ++ ++static int ext3_ext_find_goal(struct inode *inode, ++ struct ext3_ext_path *path) ++{ ++ struct ext3_inode_info *ei = EXT3_I(inode); ++ unsigned long bg_start; ++ unsigned long colour; ++ int depth; ++ ++ if (path) { ++ depth = path->p_depth; ++ /* try to find previous block */ ++ if (path[depth].p_ext) ++ return path[depth].p_ext->e_start + ++ path[depth].p_ext->e_num - 1; ++ ++ /* it looks index is empty ++ * try to find starting from index itself */ ++ if (path[depth].p_bh) ++ return path[depth].p_bh->b_blocknr; ++ } ++ ++ /* OK. use inode's group */ ++ bg_start = (ei->i_block_group * EXT3_BLOCKS_PER_GROUP(inode->i_sb)) + ++ le32_to_cpu(EXT3_SB(inode->i_sb)->s_es->s_first_data_block); ++ colour = (current->pid % 16) * ++ (EXT3_BLOCKS_PER_GROUP(inode->i_sb) / 16); ++ return bg_start + colour; ++} ++ ++static int ext3_new_block_cb(handle_t *handle, struct ext3_extents_tree *tree, ++ struct ext3_ext_path *path, ++ struct ext3_extent *ex, int *err) ++{ ++ struct inode *inode = tree->inode; ++ int newblock, goal; ++ ++ EXT_ASSERT(path); ++ EXT_ASSERT(ex); ++ EXT_ASSERT(ex->e_start); ++ EXT_ASSERT(ex->e_num); ++ ++ /* reuse block from the extent to order data/metadata */ ++ newblock = ex->e_start++; ++ ex->e_num--; ++ if (ex->e_num == 0) { ++ ex->e_num = 1; ++ /* allocate new block for the extent */ ++ goal = ext3_ext_find_goal(inode, path); ++ ex->e_start = ext3_new_block(handle, inode, goal, 0, 0, err); ++ if (ex->e_start == 0) { ++ /* error occured: restore old extent */ ++ ex->e_start = newblock; ++ return 0; ++ } ++ } ++ return newblock; ++} ++ ++static void ext3_init_tree_desc(struct ext3_extents_tree *tree, ++ struct inode *inode) ++{ ++ tree->inode = inode; ++ tree->root = (void *) EXT3_I(inode)->i_data; ++ tree->get_write_access = ext3_get_inode_write_access; ++ tree->mark_buffer_dirty = ext3_mark_buffer_dirty; ++ tree->mergable = ext3_ext_mergable; ++ tree->new_block = ext3_new_block_cb; ++ tree->remove_extent = ext3_remove_blocks; ++ tree->remove_extent_credits = ext3_remove_blocks_credits; ++ tree->buffer = (void *) inode; ++ tree->buffer_len = sizeof(EXT3_I(inode)->i_data); ++ tree->cex = NULL; /* FIXME: add cache store later */ ++} ++ ++#if 0 ++static int ++ext3_ext_new_extent_cb(struct ext3_extents_tree *tree, ++ struct ext3_ext_path *path, ++ struct ext3_extent *newex, int exist) ++{ ++ struct inode *inode = tree->inode; ++ int count, err, goal; ++ loff_t new_i_size; ++ handle_t *handle; ++ unsigned long pblock; ++ ++ if (exist) ++ return EXT_CONTINUE; ++ ++ count = ext3_ext_calc_credits_for_insert(tree, path); ++ handle = ext3_journal_start(inode, count + EXT3_ALLOC_NEEDED + 1); ++ if (IS_ERR(handle)) ++ return PTR_ERR(handle); ++ ++ goal = ext3_ext_find_goal(inode, path); ++ count = newex->e_num; ++#ifdef EXT3_MULTIBLOCK_ALLOCATOR ++ pblock = ext3_new_block(handle, inode, goal, &count, NULL, &err); ++ EXT_ASSERT(count <= num); ++ /* FIXME: error handling here */ ++ EXT_ASSERT(err == 0); ++#else ++ pblock = 0; ++#endif ++ ++ /* insert new extent */ ++ newex->e_start = pblock; ++ newex->e_num = count; ++ err = ext3_ext_insert_extent(handle, tree, path, newex); ++ if (err) ++ goto out; ++ ++ /* correct on-disk inode size */ ++ if (newex->e_num > 0) { ++ new_i_size = (loff_t) newex->e_block + newex->e_num; ++ new_i_size = new_i_size << inode->i_blkbits; ++ if (new_i_size > i_size_read(inode)) ++ new_i_size = i_size_read(inode); ++ if (new_i_size > EXT3_I(inode)->i_disksize) { ++ EXT3_I(inode)->i_disksize = new_i_size; ++ err = ext3_mark_inode_dirty(handle, inode); ++ } ++ } ++ ++out: ++ ext3_journal_stop(handle, inode); ++ return err; ++} ++ ++ ++int ext3_ext_allocate_nblocks(struct inode *inode, unsigned long block, ++ unsigned long num) ++{ ++ struct ext3_extents_tree tree; ++ int err; ++ ++ ext_debug(&tree, "blocks %lu-%lu requested for inode %u\n", ++ block, block + num,(unsigned) inode->i_ino); ++ ++ ext3_init_tree_desc(&tree, inode); ++ down(&EXT3_I(inode)->truncate_sem); ++ err = ext3_ext_walk_space(&tree, block, num, ext3_ext_new_extent_cb); ++ ext3_ext_invalidate_cache(&tree); ++ up(&EXT3_I(inode)->truncate_sem); ++ ++ return err; ++} ++#endif ++ ++int ext3_ext_get_block(handle_t *handle, struct inode *inode, ++ long iblock, struct buffer_head *bh_result, int create) ++{ ++ struct ext3_ext_path *path = NULL; ++ struct ext3_extent newex; ++ struct ext3_extent *ex; ++ int goal, newblock, err = 0, depth; ++ struct ext3_extents_tree tree; ++ ++ clear_bit(BH_New, &bh_result->b_state); ++ ext3_init_tree_desc(&tree, inode); ++ ext_debug(&tree, "block %d requested for inode %u\n", ++ (int) iblock, (unsigned) inode->i_ino); ++ down_write(&EXT3_I(inode)->truncate_sem); ++ ++ /* check in cache */ ++ if (ext3_ext_in_cache(&tree, iblock, &newex)) { ++ if (newex.e_start == 0xffffffff && !create) { ++ /* block isn't allocated yet and ++ * user don't want to allocate it */ ++ goto out2; ++ } else if (newex.e_start) { ++ /* block is already allocated */ ++ newblock = iblock - newex.e_block + newex.e_start; ++ goto out; ++ } ++ } ++ ++ /* find extent for this block */ ++ path = ext3_ext_find_extent(&tree, iblock, NULL); ++ if (IS_ERR(path)) { ++ err = PTR_ERR(path); ++ goto out2; ++ } ++ ++ depth = EXT_DEPTH(&tree); ++ ++ /* ++ * consistent leaf must not be empty ++ * this situations is possible, though, _during_ tree modification ++ * this is why assert can't be put in ext3_ext_find_extent() ++ */ ++ EXT_ASSERT(path[depth].p_ext != NULL || depth == 0); ++ ++ if ((ex = path[depth].p_ext)) { ++ /* if found exent covers block, simple return it */ ++ if (iblock >= ex->e_block && iblock < ex->e_block + ex->e_num) { ++ newblock = iblock - ex->e_block + ex->e_start; ++ ext_debug(&tree, "%d fit into %d:%d -> %d\n", ++ (int) iblock, ex->e_block, ex->e_num, ++ newblock); ++ ext3_ext_put_in_cache(&tree, ex); ++ goto out; ++ } ++ } ++ ++ /* ++ * requested block isn't allocated yet ++ * we couldn't try to create block if create flag is zero ++ */ ++ if (!create) { ++ /* put just found gap into cache to speedup subsequest reqs */ ++ ext3_ext_put_gap_in_cache(&tree, path, iblock); ++ goto out2; ++ } ++ ++ /* allocate new block */ ++ goal = ext3_ext_find_goal(inode, path); ++ newblock = ext3_new_block(handle, inode, goal, 0, 0, &err); ++ if (!newblock) ++ goto out2; ++ ext_debug(&tree, "allocate new block: goal %d, found %d\n", ++ goal, newblock); ++ ++ /* try to insert new extent into found leaf and return */ ++ newex.e_block = iblock; ++ newex.e_start = newblock; ++ newex.e_num = 1; ++ err = ext3_ext_insert_extent(handle, &tree, path, &newex); ++ if (err) ++ goto out2; ++ ++ if (inode->i_size > EXT3_I(inode)->i_disksize) ++ EXT3_I(inode)->i_disksize = inode->i_size; ++ ++ /* previous routine could use block we allocated */ ++ newblock = newex.e_start; ++ set_bit(BH_New, &bh_result->b_state); ++ ++ ext3_ext_put_in_cache(&tree, &newex); ++out: ++ ext3_ext_show_leaf(&tree, path); ++ set_bit(BH_Mapped, &bh_result->b_state); ++ bh_result->b_dev = inode->i_sb->s_dev; ++ bh_result->b_blocknr = newblock; ++out2: ++ if (path) { ++ ext3_ext_drop_refs(path); ++ kfree(path); ++ } ++ up_write(&EXT3_I(inode)->truncate_sem); ++ ++ return err; ++} ++ ++void ext3_ext_truncate(struct inode * inode) ++{ ++ struct address_space *mapping = inode->i_mapping; ++ struct super_block *sb = inode->i_sb; ++ struct ext3_extents_tree tree; ++ unsigned long last_block; ++ handle_t *handle; ++ int err = 0; + ++ ext3_init_tree_desc(&tree, inode); ++ ++ /* ++ * probably first extent we're gonna free will be last in block ++ */ ++ err = ext3_writepage_trans_blocks(inode) + 3; ++ handle = ext3_journal_start(inode, err); ++ if (IS_ERR(handle)) ++ return; ++ ++ ext3_block_truncate_page(handle, mapping, inode->i_size); ++ ++ down_write(&EXT3_I(inode)->truncate_sem); ++ ext3_ext_invalidate_cache(&tree); ++ ++ /* ++ * TODO: optimization is possible here ++ * probably we need not scaning at all, ++ * because page truncation is enough ++ */ ++ if (ext3_orphan_add(handle, inode)) ++ goto out_stop; ++ ++ /* we have to know where to truncate from in crash case */ ++ EXT3_I(inode)->i_disksize = inode->i_size; ++ ext3_mark_inode_dirty(handle, inode); ++ ++ last_block = (inode->i_size + sb->s_blocksize - 1) ++ >> EXT3_BLOCK_SIZE_BITS(sb); ++ err = ext3_ext_remove_space(&tree, last_block, 0xffffffff); ++ + /* In a multi-transaction truncate, we only make the final + * transaction synchronous */ + if (IS_SYNC(inode)) @@ -1502,7 +2103,7 @@ + if (inode->i_nlink) + ext3_orphan_del(handle, inode); + -+ up(&EXT3_I(inode)->i_ext_sem); ++ up_write(&EXT3_I(inode)->truncate_sem); + ext3_journal_stop(handle, inode); +} + @@ -1512,29 +2113,12 @@ + */ +int ext3_ext_writepage_trans_blocks(struct inode *inode, int num) +{ -+ struct ext3_inode_info *ei = EXT3_I(inode); -+ int depth = ei->i_depth + 1; ++ struct ext3_extents_tree tree; + int needed; + -+ /* -+ * the worste case we're expecting is creation of the -+ * new root (growing in depth) with index splitting -+ * for splitting we have to consider depth + 1 because -+ * previous growing could increase it -+ */ -+ -+ /* -+ * growing in depth: -+ * block allocation + new root + old root -+ */ -+ needed = EXT3_ALLOC_NEEDED + 2; -+ -+ /* index split. we may need: -+ * allocate intermediate indexes and new leaf -+ * change two blocks at each level, but root -+ * modify root block (inode) -+ */ -+ needed += (depth * EXT3_ALLOC_NEEDED) + (2 * depth) + 1; ++ ext3_init_tree_desc(&tree, inode); ++ ++ needed = ext3_ext_calc_credits_for_insert(&tree, NULL); + + /* caller want to allocate num blocks */ + needed *= num; @@ -1550,53 +2134,124 @@ + return needed; +} + -+/* -+ * called at mount time -+ */ -+void ext3_ext_init(struct super_block *sb) ++void ext3_extents_initialize_blockmap(handle_t *handle, struct inode *inode) +{ -+ /* -+ * possible initialization would be here -+ */ ++ struct ext3_extents_tree tree; + -+ if (test_opt(sb, EXTENTS)) -+ printk("EXT3-fs: file extents enabled\n"); -+ spin_lock_init(&EXT3_SB(sb)->s_ext_lock); ++ ext3_init_tree_desc(&tree, inode); ++ ext3_extent_tree_init(handle, &tree); +} + -+/* -+ * called at umount time -+ */ -+void ext3_ext_release(struct super_block *sb) ++static int ++ext3_ext_store_extent_cb(struct ext3_extents_tree *tree, ++ struct ext3_ext_path *path, ++ struct ext3_extent *newex, int exist) +{ -+ struct ext3_sb_info *sbi = EXT3_SB(sb); -+ -+ /* show collected stats */ -+ if (sbi->s_ext_count && sbi->s_ext_extents) -+ printk("EXT3-fs: min depth - %d, max depth - %d, " -+ "ave. depth - %d, ave. blocks/extent - %d\n", -+ sbi->s_ext_mindepth, -+ sbi->s_ext_maxdepth, -+ sbi->s_ext_sum / sbi->s_ext_count, -+ sbi->s_ext_blocks / sbi->s_ext_extents); ++ struct ext3_extent_buf *buf = (struct ext3_extent_buf *) tree->private; ++ ++ if (!exist) ++ return EXT_CONTINUE; ++ if (buf->err < 0) ++ return EXT_BREAK; ++ if (buf->cur - buf->buffer + sizeof(*newex) > buf->buflen) ++ return EXT_BREAK; ++ ++ if (!copy_to_user(buf->cur, newex, sizeof(*newex))) { ++ buf->err++; ++ buf->cur += sizeof(*newex); ++ } else { ++ buf->err = -EFAULT; ++ return EXT_BREAK; ++ } ++ return EXT_CONTINUE; +} + ---- linux-2.4.20-vanilla/fs/ext3/ialloc.c~ext3-extents-2.4.20 2003-09-15 18:54:58.000000000 +0400 -+++ linux-2.4.20-vanilla-alexey/fs/ext3/ialloc.c 2003-09-15 19:31:40.000000000 +0400 -@@ -569,6 +569,10 @@ repeat: - inode->u.ext3_i.i_prealloc_count = 0; - #endif - inode->u.ext3_i.i_block_group = i; -+ if (test_opt(sb, EXTENTS)) -+ inode->u.ext3_i.i_flags |= EXT3_EXTENTS_FL; -+ inode->u.ext3_i.i_depth = 0; -+ sema_init(&inode->u.ext3_i.i_ext_sem, 1); - - if (inode->u.ext3_i.i_flags & EXT3_SYNC_FL) - inode->i_flags |= S_SYNC; ---- linux-2.4.20-vanilla/fs/ext3/inode.c~ext3-extents-2.4.20 2003-09-15 18:54:58.000000000 +0400 -+++ linux-2.4.20-vanilla-alexey/fs/ext3/inode.c 2003-09-15 19:53:10.000000000 +0400 -@@ -848,6 +848,15 @@ changed: ++static int ++ext3_ext_collect_stats_cb(struct ext3_extents_tree *tree, ++ struct ext3_ext_path *path, ++ struct ext3_extent *ex, int exist) ++{ ++ struct ext3_extent_tree_stats *buf = ++ (struct ext3_extent_tree_stats *) tree->private; ++ int depth; ++ ++ if (!exist) ++ return EXT_CONTINUE; ++ ++ depth = EXT_DEPTH(tree); ++ buf->extents_num++; ++ if (path[depth].p_ext == EXT_FIRST_EXTENT(path[depth].p_hdr)) ++ buf->leaf_num++; ++ return EXT_CONTINUE; ++} ++ ++int ext3_ext_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, ++ unsigned long arg) ++{ ++ int err = 0; ++ ++ if (cmd == EXT3_IOC_GET_EXTENTS) { ++ struct ext3_extent_buf buf; ++ struct ext3_extents_tree tree; ++ ++ if (copy_from_user(&buf, (void *) arg, sizeof(buf))) ++ return -EFAULT; ++ ++ ext3_init_tree_desc(&tree, inode); ++ buf.cur = buf.buffer; ++ buf.err = 0; ++ tree.private = &buf; ++ err = ext3_ext_walk_space(&tree, buf.start, 0xffffffff, ++ ext3_ext_store_extent_cb); ++ if (err == 0) ++ err = buf.err; ++ } else if (cmd == EXT3_IOC_GET_TREE_STATS) { ++ struct ext3_extent_tree_stats buf; ++ struct ext3_extents_tree tree; ++ ++ ext3_init_tree_desc(&tree, inode); ++ buf.depth = EXT_DEPTH(&tree); ++ buf.extents_num = 0; ++ buf.leaf_num = 0; ++ tree.private = &buf; ++ err = ext3_ext_walk_space(&tree, 0, 0xffffffff, ++ ext3_ext_collect_stats_cb); ++ if (!err) ++ err = copy_to_user((void *) arg, &buf, sizeof(buf)); ++ } else if (cmd == EXT3_IOC_GET_TREE_DEPTH) { ++ struct ext3_extents_tree tree; ++ ext3_init_tree_desc(&tree, inode); ++ err = EXT_DEPTH(&tree); ++ } ++ ++ return err; ++} ++ +Index: linux-2.4.20/fs/ext3/ialloc.c +=================================================================== +--- linux-2.4.20.orig/fs/ext3/ialloc.c 2004-01-23 19:00:25.000000000 +0300 ++++ linux-2.4.20/fs/ext3/ialloc.c 2004-01-24 00:45:20.000000000 +0300 +@@ -593,11 +593,13 @@ + iloc.bh = NULL; + goto fail; + } ++ if (test_opt(sb, EXTENTS)) { ++ EXT3_I(inode)->i_flags |= EXT3_EXTENTS_FL; ++ ext3_extents_initialize_blockmap(handle, inode); ++ } + err = ext3_mark_iloc_dirty(handle, inode, &iloc); + if (err) goto fail; + +- +- + unlock_super (sb); + if(DQUOT_ALLOC_INODE(inode)) { + DQUOT_DROP(inode); +Index: linux-2.4.20/fs/ext3/inode.c +=================================================================== +--- linux-2.4.20.orig/fs/ext3/inode.c 2004-01-23 19:00:25.000000000 +0300 ++++ linux-2.4.20/fs/ext3/inode.c 2004-01-24 04:34:04.000000000 +0300 +@@ -848,6 +848,15 @@ goto reread; } @@ -1612,7 +2267,7 @@ /* * The BKL is not held on entry here. */ -@@ -861,7 +870,7 @@ static int ext3_get_block(struct inode * +@@ -861,7 +870,7 @@ handle = ext3_journal_current_handle(); J_ASSERT(handle != 0); } @@ -1621,7 +2276,7 @@ return ret; } -@@ -879,7 +888,7 @@ struct buffer_head *ext3_getblk(handle_t +@@ -879,7 +888,7 @@ dummy.b_state = 0; dummy.b_blocknr = -1000; buffer_trace_init(&dummy.b_history); @@ -1630,7 +2285,7 @@ if (!*errp && buffer_mapped(&dummy)) { struct buffer_head *bh; bh = sb_getblk(inode->i_sb, dummy.b_blocknr); -@@ -1403,7 +1412,7 @@ struct address_space_operations ext3_aop +@@ -1403,7 +1412,7 @@ * This required during truncate. We need to physically zero the tail end * of that block so it doesn't yield old data if the file is later grown. */ @@ -1639,7 +2294,7 @@ struct address_space *mapping, loff_t from) { unsigned long index = from >> PAGE_CACHE_SHIFT; -@@ -1888,6 +1897,9 @@ void ext3_truncate(struct inode * inode) +@@ -1888,6 +1897,9 @@ ext3_discard_prealloc(inode); @@ -1649,24 +2304,7 @@ handle = start_transaction(inode); if (IS_ERR(handle)) return; /* AKPM: return what? */ -@@ -2200,6 +2212,8 @@ void ext3_read_inode(struct inode * inod - inode->u.ext3_i.i_prealloc_count = 0; - #endif - inode->u.ext3_i.i_block_group = iloc.block_group; -+ inode->u.ext3_i.i_depth = raw_inode->osd2.linux2.l_i_depth; -+ sema_init(&inode->u.ext3_i.i_ext_sem, 1); - - /* - * NOTE! The in-memory inode i_data array is in little-endian order -@@ -2321,6 +2335,7 @@ static int ext3_do_update_inode(handle_t - raw_inode->i_fsize = 0; - } - #endif -+ raw_inode->osd2.linux2.l_i_depth = inode->u.ext3_i.i_depth; - raw_inode->i_file_acl = cpu_to_le32(inode->u.ext3_i.i_file_acl); - if (!S_ISREG(inode->i_mode)) { - raw_inode->i_dir_acl = cpu_to_le32(inode->u.ext3_i.i_dir_acl); -@@ -2525,6 +2540,9 @@ int ext3_writepage_trans_blocks(struct i +@@ -2537,6 +2549,9 @@ int indirects = (EXT3_NDIR_BLOCKS % bpp) ? 5 : 3; int ret; @@ -1676,7 +2314,7 @@ if (ext3_should_journal_data(inode)) ret = 3 * (bpp + indirects) + 2; else -@@ -2961,7 +2979,7 @@ int ext3_prep_san_write(struct inode *in +@@ -2973,7 +2988,7 @@ /* alloc blocks one by one */ for (i = 0; i < nblocks; i++) { @@ -1685,7 +2323,7 @@ &bh_tmp, 1); if (ret) break; -@@ -3022,7 +3040,7 @@ int ext3_map_inode_page(struct inode *in +@@ -3049,7 +3064,7 @@ if (blocks[i] != 0) continue; @@ -1694,50 +2332,71 @@ if (rc) { printk(KERN_INFO "ext3_map_inode_page: error %d " "allocating block %ld\n", rc, iblock); ---- linux-2.4.20-vanilla/fs/ext3/Makefile~ext3-extents-2.4.20 2003-09-15 18:54:58.000000000 +0400 -+++ linux-2.4.20-vanilla-alexey/fs/ext3/Makefile 2003-09-15 19:41:08.000000000 +0400 -@@ -12,7 +12,8 @@ O_TARGET := ext3.o - export-objs := ext3-exports.o +Index: linux-2.4.20/fs/ext3/Makefile +=================================================================== +--- linux-2.4.20.orig/fs/ext3/Makefile 2004-01-23 19:00:42.000000000 +0300 ++++ linux-2.4.20/fs/ext3/Makefile 2004-01-24 00:45:20.000000000 +0300 +@@ -13,7 +13,7 @@ obj-y := balloc.o bitmap.o dir.o file.o fsync.o ialloc.o inode.o iopen.o \ -- ioctl.o namei.o super.o symlink.o hash.o ext3-exports.o -+ ioctl.o namei.o super.o symlink.o hash.o ext3-exports.o \ -+ extents.o + ioctl.o namei.o super.o symlink.o hash.o ext3-exports.o \ +- xattr_trusted.o ++ xattr_trusted.o extents.o obj-m := $(O_TARGET) export-objs += xattr.o ---- linux-2.4.20-vanilla/fs/ext3/super.c~ext3-extents-2.4.20 2003-09-15 18:54:59.000000000 +0400 -+++ linux-2.4.20-vanilla-alexey/fs/ext3/super.c 2003-09-15 19:42:57.000000000 +0400 -@@ -619,6 +619,7 @@ void ext3_put_super (struct super_block - kdev_t j_dev = sbi->s_journal->j_dev; +Index: linux-2.4.20/fs/ext3/super.c +=================================================================== +--- linux-2.4.20.orig/fs/ext3/super.c 2004-01-23 19:00:25.000000000 +0300 ++++ linux-2.4.20/fs/ext3/super.c 2004-01-24 04:30:14.000000000 +0300 +@@ -623,6 +623,7 @@ int i; + J_ASSERT(sbi->s_delete_inodes == 0); + ext3_ext_release(sb); - ext3_stop_delete_thread(sbi); ext3_xattr_put_super(sb); journal_destroy(sbi->s_journal); -@@ -765,6 +766,10 @@ static int parse_options (char * options - "EXT3 Check option not supported\n"); - #endif + if (!(sb->s_flags & MS_RDONLY)) { +@@ -796,6 +797,10 @@ + return 0; + } } + else if (!strcmp (this_char, "extents")) -+ set_opt (sbi->s_mount_opt, EXTENTS); -+ else if (!strcmp (this_char, "extdebug")) -+ set_opt (sbi->s_mount_opt, EXTDEBUG); - else if (!strcmp (this_char, "debug")) - set_opt (*mount_options, DEBUG); - else if (!strcmp (this_char, "errors")) { -@@ -1478,6 +1483,7 @@ struct super_block * ext3_read_super (st - test_opt(sb,DATA_FLAGS) == EXT3_MOUNT_JOURNAL_DATA ? "journal": ++ set_opt (*mount_options, EXTENTS); ++ else if (!strcmp (this_char, "extdebug")) ++ set_opt (*mount_options, EXTDEBUG); + else if (!strcmp (this_char, "grpid") || + !strcmp (this_char, "bsdgroups")) + set_opt (*mount_options, GRPID); +@@ -1485,6 +1490,8 @@ test_opt(sb,DATA_FLAGS) == EXT3_MOUNT_ORDERED_DATA ? "ordered": "writeback"); -+ ext3_ext_init(sb); ++ ext3_ext_init(sb); ++ return sb; ---- linux-2.4.20-vanilla/include/linux/ext3_fs.h~ext3-extents-2.4.20 2003-09-15 18:54:58.000000000 +0400 -+++ linux-2.4.20-vanilla-alexey/include/linux/ext3_fs.h 2003-09-15 20:15:52.000000000 +0400 -@@ -184,6 +184,7 @@ struct ext3_group_desc + failed_mount3: +Index: linux-2.4.20/fs/ext3/ioctl.c +=================================================================== +--- linux-2.4.20.orig/fs/ext3/ioctl.c 2004-01-13 17:00:09.000000000 +0300 ++++ linux-2.4.20/fs/ext3/ioctl.c 2004-01-24 14:54:31.000000000 +0300 +@@ -189,6 +189,10 @@ + return ret; + } + #endif ++ case EXT3_IOC_GET_EXTENTS: ++ case EXT3_IOC_GET_TREE_STATS: ++ case EXT3_IOC_GET_TREE_DEPTH: ++ return ext3_ext_ioctl(inode, filp, cmd, arg); + default: + return -ENOTTY; + } +Index: linux-2.4.20/include/linux/ext3_fs.h +=================================================================== +--- linux-2.4.20.orig/include/linux/ext3_fs.h 2004-01-23 19:00:25.000000000 +0300 ++++ linux-2.4.20/include/linux/ext3_fs.h 2004-01-24 01:28:06.000000000 +0300 +@@ -184,6 +184,7 @@ #define EXT3_IMAGIC_FL 0x00002000 /* AFS directory */ #define EXT3_JOURNAL_DATA_FL 0x00004000 /* file data should be journaled */ #define EXT3_RESERVED_FL 0x80000000 /* reserved for ext3 lib */ @@ -1745,36 +2404,34 @@ #define EXT3_FL_USER_VISIBLE 0x00005FFF /* User visible flags */ #define EXT3_FL_USER_MODIFIABLE 0x000000FF /* User modifiable flags */ -@@ -244,7 +245,7 @@ struct ext3_inode { - struct { - __u8 l_i_frag; /* Fragment number */ - __u8 l_i_fsize; /* Fragment size */ -- __u16 i_pad1; -+ __u16 l_i_depth; - __u16 l_i_uid_high; /* these 2 fields */ - __u16 l_i_gid_high; /* were reserved2[0] */ - __u32 l_i_reserved2; -@@ -325,6 +326,8 @@ struct ext3_inode { +@@ -208,6 +209,9 @@ + #ifdef CONFIG_JBD_DEBUG + #define EXT3_IOC_WAIT_FOR_READONLY _IOR('f', 99, long) + #endif ++#define EXT3_IOC_GET_EXTENTS _IOR('f', 5, long) ++#define EXT3_IOC_GET_TREE_DEPTH _IOR('f', 6, long) ++#define EXT3_IOC_GET_TREE_STATS _IOR('f', 7, long) + + /* + * Structure of an inode on the disk +@@ -327,6 +331,8 @@ #define EXT3_MOUNT_IOPEN 0x8000 /* Allow access via iopen */ #define EXT3_MOUNT_IOPEN_NOPRIV 0x10000 /* Make iopen world-readable */ #define EXT3_MOUNT_ASYNCDEL 0x20000 /* Delayed deletion */ -+#define EXT3_MOUNT_EXTENTS 0x40000 /* Extents support */ -+#define EXT3_MOUNT_EXTDEBUG 0x80000 /* Extents debug */ ++#define EXT3_MOUNT_EXTENTS 0x100000/* Extents support */ ++#define EXT3_MOUNT_EXTDEBUG 0x200000/* Extents debug */ /* Compatibility, for having both ext2_fs.h and ext3_fs.h included at once */ #ifndef _LINUX_EXT2_FS_H -@@ -702,6 +705,10 @@ extern void ext3_discard_prealloc (struc - extern void ext3_dirty_inode(struct inode *); - extern int ext3_change_inode_journal_flag(struct inode *, int); - extern void ext3_truncate (struct inode *); +@@ -687,6 +693,7 @@ + extern unsigned long ext3_count_free (struct buffer_head *, unsigned); + + /* inode.c */ +extern int ext3_block_truncate_page(handle_t *, struct address_space *, loff_t); -+extern int ext3_forget(handle_t *handle, int is_metadata, -+ struct inode *inode, struct buffer_head *bh, -+ int blocknr); - #ifdef EXT3_DELETE_THREAD - extern void ext3_truncate_thread(struct inode *inode); - #endif -@@ -765,6 +772,13 @@ extern struct inode_operations ext3_spec + extern int ext3_forget(handle_t *, int, struct inode *, struct buffer_head *, int); + extern struct buffer_head * ext3_getblk (handle_t *, struct inode *, long, int, int *); + extern struct buffer_head * ext3_bread (handle_t *, struct inode *, int, int, int *); +@@ -767,6 +774,14 @@ extern struct inode_operations ext3_symlink_inode_operations; extern struct inode_operations ext3_fast_symlink_inode_operations; @@ -1785,40 +2442,219 @@ +extern void ext3_ext_truncate(struct inode *); +extern void ext3_ext_init(struct super_block *); +extern void ext3_ext_release(struct super_block *); ++extern void ext3_extents_initialize_blockmap(handle_t *, struct inode *); #endif /* __KERNEL__ */ ---- linux-2.4.20-vanilla/include/linux/ext3_fs_i.h~ext3-extents-2.4.20 2003-09-15 10:16:38.000000000 +0400 -+++ linux-2.4.20-vanilla-alexey/include/linux/ext3_fs_i.h 2003-09-15 20:14:40.000000000 +0400 -@@ -73,6 +73,10 @@ struct ext3_inode_info { - * by other means, so we have truncate_sem. - */ - struct rw_semaphore truncate_sem; -+ -+ /* extents-related data */ -+ struct semaphore i_ext_sem; -+ __u16 i_depth; - }; - - #endif /* _LINUX_EXT3_FS_I */ ---- linux-2.4.20-vanilla/include/linux/ext3_fs_sb.h~ext3-extents-2.4.20 2003-09-15 18:54:57.000000000 +0400 -+++ linux-2.4.20-vanilla-alexey/include/linux/ext3_fs_sb.h 2003-09-15 20:14:40.000000000 +0400 -@@ -86,6 +86,16 @@ struct ext3_sb_info { - wait_queue_head_t s_delete_thread_queue; - wait_queue_head_t s_delete_waiter_queue; - #endif +Index: linux-2.4.20/include/linux/ext3_extents.h +=================================================================== +--- linux-2.4.20.orig/include/linux/ext3_extents.h 2003-01-30 13:24:37.000000000 +0300 ++++ linux-2.4.20/include/linux/ext3_extents.h 2004-01-24 15:15:11.000000000 +0300 +@@ -0,0 +1,207 @@ ++/* ++ * Copyright (C) 2003 Alex Tomas ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. ++ * ++ * 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 Licens ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111- ++ */ ++ ++ ++/* ++ * with AGRESSIVE_TEST defined capacity of index/leaf blocks ++ * become very little, so index split, in-depth growing and ++ * other hard changes happens much more often ++ * this is for debug purposes only ++ */ ++#define AGRESSIVE_TEST_ ++ ++/* ++ * if CHECK_BINSEARCH defined, then results of binary search ++ * will be checked by linear search ++ */ ++#define CHECK_BINSEARCH_ ++ ++/* ++ * if EXT_DEBUG is defined you can use 'extdebug' mount option ++ * to get lots of info what's going on ++ */ ++#define EXT_DEBUG ++#ifdef EXT_DEBUG ++#define ext_debug(tree,fmt,a...) \ ++do { \ ++ if (test_opt((tree)->inode->i_sb, EXTDEBUG)) \ ++ printk(fmt, ##a); \ ++} while (0); ++#else ++#define ext_debug(tree,fmt,a...) ++#endif ++ ++/* ++ * if EXT_STATS is defined then stats numbers are collected ++ * these number will be displayed at umount time ++ */ ++#define EXT_STATS_ ++ ++ ++#define EXT3_ALLOC_NEEDED 2 /* block bitmap + group descriptor */ ++ ++/* ++ * ext3_inode has i_block array (total 60 bytes) ++ * first 4 bytes are used to store: ++ * - tree depth (0 mean there is no tree yet. all extents in the inode) ++ * - number of alive extents in the inode ++ */ ++ ++/* ++ * this is extent on-disk structure ++ * it's used at the bottom of the tree ++ */ ++struct ext3_extent { ++ __u32 e_block; /* first logical block extent covers */ ++ __u32 e_start; /* first physical block extents lives */ ++ __u32 e_num; /* number of blocks covered by extent */ ++}; ++ ++/* ++ * this is index on-disk structure ++ * it's used at all the levels, but the bottom ++ */ ++struct ext3_extent_idx { ++ __u32 e_block; /* index covers logical blocks from 'block' */ ++ __u32 e_leaf; /* pointer to the physical block of the next * ++ * level. leaf or next index could bet here */ ++}; ++ ++/* ++ * each block (leaves and indexes), even inode-stored has header ++ */ ++struct ext3_extent_header { ++ __u16 e_magic; /* probably will support different formats */ ++ __u16 e_num; /* number of valid entries */ ++ __u16 e_max; /* capacity of store in entries */ ++ __u16 e_depth; /* has tree real underlaying blocks? */ ++}; ++ ++/* ++ * array of ext3_ext_path contains path to some extent ++ * creation/lookup routines use it for traversal/splitting/etc ++ * truncate uses it to simulate recursive walking ++ */ ++struct ext3_ext_path { ++ __u32 p_block; ++ __u16 p_depth; ++ struct ext3_extent *p_ext; ++ struct ext3_extent_idx *p_idx; ++ struct ext3_extent_header *p_hdr; ++ struct buffer_head *p_bh; ++}; ++ ++/* ++ * structure for external API ++ */ ++ ++ ++/* ++ * ext3_extents_tree is used to pass initial information ++ * to top-level extents API ++ */ ++struct ext3_extents_tree { ++ struct inode *inode; /* inode which tree belongs to */ ++ void *root; /* ptr to data top of tree resides at */ ++ void *buffer; /* will be passed as arg to ^^ routines */ ++ int buffer_len; ++ void *private; ++ struct ext3_extent *cex;/* last found extent */ ++ int (*get_write_access)(handle_t *h, void *buffer); ++ int (*mark_buffer_dirty)(handle_t *h, void *buffer); ++ int (*mergable)(struct ext3_extent *ex1, struct ext3_extent *ex2); ++ int (*remove_extent_credits)(struct ext3_extents_tree *, ++ struct ext3_extent *, unsigned long, ++ unsigned long); ++ int (*remove_extent)(struct ext3_extents_tree *, ++ struct ext3_extent *, unsigned long, ++ unsigned long); ++ int (*new_block)(handle_t *, struct ext3_extents_tree *, ++ struct ext3_ext_path *, struct ext3_extent *, ++ int *); ++}; ++ ++/* ++ * to be called by ext3_ext_walk_space() ++ * negative retcode - error ++ * positive retcode - signal for ext3_ext_walk_space(), see below ++ * callback must return valid extent (passed or newly created) ++ */ ++typedef int (*ext_prepare_callback)(struct ext3_extents_tree *, ++ struct ext3_ext_path *, ++ struct ext3_extent *, int); ++ ++#define EXT_CONTINUE 0 ++#define EXT_BREAK 1 ++ ++ ++#define EXT_FIRST_EXTENT(__hdr__) \ ++ ((struct ext3_extent *) (((char *) (__hdr__)) + \ ++ sizeof(struct ext3_extent_header))) ++#define EXT_FIRST_INDEX(__hdr__) \ ++ ((struct ext3_extent_idx *) (((char *) (__hdr__)) + \ ++ sizeof(struct ext3_extent_header))) ++#define EXT_HAS_FREE_INDEX(__path__) \ ++ ((__path__)->p_hdr->e_num < (__path__)->p_hdr->e_max) ++#define EXT_LAST_EXTENT(__hdr__) \ ++ (EXT_FIRST_EXTENT((__hdr__)) + (__hdr__)->e_num - 1) ++#define EXT_LAST_INDEX(__hdr__) \ ++ (EXT_FIRST_INDEX((__hdr__)) + (__hdr__)->e_num - 1) ++#define EXT_MAX_EXTENT(__hdr__) \ ++ (EXT_FIRST_EXTENT((__hdr__)) + (__hdr__)->e_max - 1) ++#define EXT_MAX_INDEX(__hdr__) \ ++ (EXT_FIRST_INDEX((__hdr__)) + (__hdr__)->e_max - 1) ++ ++#define EXT_ROOT_HDR(tree) \ ++ ((struct ext3_extent_header *) (tree)->root) ++#define EXT_BLOCK_HDR(bh) \ ++ ((struct ext3_extent_header *) (bh)->b_data) ++#define EXT_DEPTH(_t_) \ ++ (((struct ext3_extent_header *)((_t_)->root))->e_depth) ++ ++ ++#define EXT_ASSERT(__x__) if (!(__x__)) BUG(); ++ ++ ++/* ++ * this structure is used to gather extents from the tree via ioctl ++ */ ++struct ext3_extent_buf { ++ unsigned long start; ++ int buflen; ++ void *buffer; ++ void *cur; ++ int err; ++}; ++ ++/* ++ * this structure is used to collect stats info about the tree ++ */ ++struct ext3_extent_tree_stats { ++ int depth; ++ int extents_num; ++ int leaf_num; ++}; ++ ++extern int ext3_extent_tree_init(handle_t *, struct ext3_extents_tree *); ++extern int ext3_ext_calc_credits_for_insert(struct ext3_extents_tree *, struct ext3_ext_path *); ++extern int ext3_ext_insert_extent(handle_t *, struct ext3_extents_tree *, struct ext3_ext_path *, struct ext3_extent *); ++extern int ext3_ext_walk_space(struct ext3_extents_tree *, unsigned long, unsigned long, ext_prepare_callback); ++extern int ext3_ext_remove_space(struct ext3_extents_tree *, unsigned long, unsigned long); ++extern struct ext3_ext_path * ext3_ext_find_extent(struct ext3_extents_tree *, int, struct ext3_ext_path *); ++ + -+ /* extents */ -+ int s_ext_debug; -+ int s_ext_mindepth; -+ int s_ext_maxdepth; -+ int s_ext_sum; -+ int s_ext_count; -+ spinlock_t s_ext_lock; -+ int s_ext_extents; -+ int s_ext_blocks; - }; - - #endif /* _LINUX_EXT3_FS_SB */ - -_ diff --git a/lustre/kernel_patches/patches/ext3-map_inode_page-2.6.0.patch b/lustre/kernel_patches/patches/ext3-map_inode_page-2.6.0.patch index 675d54e..91063b3 100644 --- a/lustre/kernel_patches/patches/ext3-map_inode_page-2.6.0.patch +++ b/lustre/kernel_patches/patches/ext3-map_inode_page-2.6.0.patch @@ -2,9 +2,11 @@ fs/ext3/super.c | 3 +++ 2 files changed, 55 insertions(+) ---- linux-2.6.0-test6/fs/ext3/inode.c~ext3-map_inode_page-2.6.0 2003-10-14 17:03:48.000000000 +0400 -+++ linux-2.6.0-test6-alexey/fs/ext3/inode.c 2003-10-14 17:03:49.000000000 +0400 -@@ -3143,3 +3143,55 @@ int ext3_prep_san_write(struct inode *in +Index: linux-2.6.0/fs/ext3/inode.c +=================================================================== +--- linux-2.6.0.orig/fs/ext3/inode.c 2003-12-31 00:33:49.000000000 +0300 ++++ linux-2.6.0/fs/ext3/inode.c 2003-12-31 01:14:17.000000000 +0300 +@@ -3136,3 +3136,58 @@ ret = ret2; return ret; } @@ -51,6 +53,9 @@ + "block %ld\n", iblock); + goto out; + } ++ if (buffer_new(&dummy)) ++ unmap_underlying_metadata(dummy.b_bdev, ++ dummy.b_blocknr); + blocks[i] = dummy.b_blocknr; + created[i] = 1; + } @@ -60,9 +65,11 @@ + return rc; +} + ---- linux-2.6.0-test6/fs/ext3/super.c~ext3-map_inode_page-2.6.0 2003-10-14 17:03:48.000000000 +0400 -+++ linux-2.6.0-test6-alexey/fs/ext3/super.c 2003-10-14 17:09:05.000000000 +0400 -@@ -2043,6 +2043,9 @@ static void __exit exit_ext3_fs(void) +Index: linux-2.6.0/fs/ext3/super.c +=================================================================== +--- linux-2.6.0.orig/fs/ext3/super.c 2003-12-31 00:33:49.000000000 +0300 ++++ linux-2.6.0/fs/ext3/super.c 2003-12-31 01:10:40.000000000 +0300 +@@ -2051,6 +2051,9 @@ int ext3_prep_san_write(struct inode *inode, long *blocks, int nblocks, loff_t newsize); EXPORT_SYMBOL(ext3_prep_san_write); @@ -72,5 +79,3 @@ MODULE_AUTHOR("Remy Card, Stephen Tweedie, Andrew Morton, Andreas Dilger, Theodore Ts'o and others"); MODULE_DESCRIPTION("Second Extended Filesystem with journaling extensions"); - -_ diff --git a/lustre/kernel_patches/patches/iopen-2.6.0-test6.patch b/lustre/kernel_patches/patches/iopen-2.6.0-test6.patch index 3c64e1e..cfa1587 100644 --- a/lustre/kernel_patches/patches/iopen-2.6.0-test6.patch +++ b/lustre/kernel_patches/patches/iopen-2.6.0-test6.patch @@ -7,9 +7,11 @@ include/linux/ext3_fs.h | 2 7 files changed, 304 insertions(+), 1 deletion(-) ---- linux-2.6.0-test6/Documentation/filesystems/ext2.txt~iopen-2.6.0-test6 2002-11-11 06:28:06.000000000 +0300 -+++ linux-2.6.0-test6-alexey/Documentation/filesystems/ext2.txt 2003-10-14 17:03:48.000000000 +0400 -@@ -35,6 +35,22 @@ resgid=n The group ID which may use th +Index: linux-2.6.0/Documentation/filesystems/ext2.txt +=================================================================== +--- linux-2.6.0.orig/Documentation/filesystems/ext2.txt 2002-11-11 06:28:06.000000000 +0300 ++++ linux-2.6.0/Documentation/filesystems/ext2.txt 2004-01-07 17:12:07.000000000 +0300 +@@ -35,6 +35,22 @@ sb=n Use alternate superblock at this location. @@ -32,8 +34,10 @@ grpquota,noquota,quota,usrquota Quota options are silently ignored by ext2. ---- linux-2.6.0-test6/fs/ext3/inode.c~iopen-2.6.0-test6 2003-10-14 17:03:47.000000000 +0400 -+++ linux-2.6.0-test6-alexey/fs/ext3/inode.c 2003-10-14 17:03:48.000000000 +0400 +Index: linux-2.6.0/fs/ext3/inode.c +=================================================================== +--- linux-2.6.0.orig/fs/ext3/inode.c 2004-01-04 15:27:40.000000000 +0300 ++++ linux-2.6.0/fs/ext3/inode.c 2004-01-07 17:12:07.000000000 +0300 @@ -37,6 +37,7 @@ #include #include @@ -42,7 +46,7 @@ #include "acl.h" /* -@@ -2479,6 +2480,8 @@ void ext3_read_inode(struct inode * inod +@@ -2472,6 +2473,8 @@ ei->i_acl = EXT3_ACL_NOT_CACHED; ei->i_default_acl = EXT3_ACL_NOT_CACHED; #endif @@ -51,9 +55,11 @@ if (ext3_get_inode_loc(inode, &iloc, 0)) goto bad_inode; bh = iloc.bh; ---- /dev/null 2003-01-30 13:24:37.000000000 +0300 -+++ linux-2.6.0-test6-alexey/fs/ext3/iopen.c 2003-10-14 17:03:48.000000000 +0400 -@@ -0,0 +1,239 @@ +Index: linux-2.6.0/fs/ext3/iopen.c +=================================================================== +--- linux-2.6.0.orig/fs/ext3/iopen.c 2003-01-30 13:24:37.000000000 +0300 ++++ linux-2.6.0/fs/ext3/iopen.c 2004-01-07 17:14:22.000000000 +0300 +@@ -0,0 +1,223 @@ + + +/* @@ -186,31 +192,15 @@ + break; + } + } ++ spin_unlock(&dcache_lock); + -+ if (!goal) { -+ spin_unlock(&dcache_lock); ++ if (!goal) + return NULL; -+ } + -+ /* Move the goal to the de hash queue */ + goal->d_flags &= ~DCACHE_DISCONNECTED; -+ hlist_add_before(&goal->d_hash, &de->d_hash); -+ hlist_del(&goal->d_hash); -+ -+ list_del(&goal->d_child); -+ list_del(&de->d_child); ++ d_rehash(de); ++ d_move(goal, de); + -+ /* Switch the parents and the names.. */ -+ switch_names(goal, de); -+ do_switch(goal->d_parent, de->d_parent); -+ do_switch(goal->d_name.len, de->d_name.len); -+ do_switch(goal->d_name.hash, de->d_name.hash); -+ -+ /* And add them back to the (new) parent lists */ -+ list_add(&goal->d_child, &goal->d_parent->d_subdirs); -+ list_add(&de->d_child, &de->d_parent->d_subdirs); -+ -+ spin_unlock(&dcache_lock); + return goal; +} + @@ -293,8 +283,10 @@ + + return 1; +} ---- /dev/null 2003-01-30 13:24:37.000000000 +0300 -+++ linux-2.6.0-test6-alexey/fs/ext3/iopen.h 2003-10-14 17:03:48.000000000 +0400 +Index: linux-2.6.0/fs/ext3/iopen.h +=================================================================== +--- linux-2.6.0.orig/fs/ext3/iopen.h 2003-01-30 13:24:37.000000000 +0300 ++++ linux-2.6.0/fs/ext3/iopen.h 2004-01-07 17:12:07.000000000 +0300 @@ -0,0 +1,15 @@ +/* + * iopen.h @@ -311,8 +303,10 @@ +extern int ext3_iopen_get_inode(struct inode * inode); + + ---- linux-2.6.0-test6/fs/ext3/namei.c~iopen-2.6.0-test6 2003-10-14 17:03:47.000000000 +0400 -+++ linux-2.6.0-test6-alexey/fs/ext3/namei.c 2003-10-14 17:03:48.000000000 +0400 +Index: linux-2.6.0/fs/ext3/namei.c +=================================================================== +--- linux-2.6.0.orig/fs/ext3/namei.c 2004-01-04 15:27:40.000000000 +0300 ++++ linux-2.6.0/fs/ext3/namei.c 2004-01-07 17:12:45.000000000 +0300 @@ -37,6 +37,7 @@ #include #include @@ -321,7 +315,7 @@ #include "acl.h" /* -@@ -970,15 +971,21 @@ errout: +@@ -970,15 +971,21 @@ } #endif @@ -343,22 +337,26 @@ bh = ext3_find_entry(dentry, &de); inode = NULL; if (bh) { -@@ -991,6 +998,12 @@ static struct dentry *ext3_lookup(struct +@@ -989,8 +996,14 @@ + if (!inode) + return ERR_PTR(-EACCES); } - if (inode) - return d_splice_alias(inode, dentry); -+ + if (inode && (alternate = iopen_connect_dentry(dentry, inode))) { + iput(inode); + return alternate; + } + + if (inode) + return d_splice_alias(inode, dentry); ++ d_add(dentry, inode); return NULL; } ---- linux-2.6.0-test6/fs/ext3/super.c~iopen-2.6.0-test6 2003-10-14 17:03:47.000000000 +0400 -+++ linux-2.6.0-test6-alexey/fs/ext3/super.c 2003-10-14 17:03:48.000000000 +0400 -@@ -534,7 +534,7 @@ enum { +Index: linux-2.6.0/fs/ext3/super.c +=================================================================== +--- linux-2.6.0.orig/fs/ext3/super.c 2004-01-04 15:27:40.000000000 +0300 ++++ linux-2.6.0/fs/ext3/super.c 2004-01-07 17:12:07.000000000 +0300 +@@ -535,7 +535,7 @@ Opt_user_xattr, Opt_nouser_xattr, Opt_acl, Opt_noacl, Opt_noload, Opt_commit, Opt_journal_update, Opt_journal_inum, Opt_abort, Opt_data_journal, Opt_data_ordered, Opt_data_writeback, @@ -367,7 +365,7 @@ }; static match_table_t tokens = { -@@ -573,6 +573,9 @@ static match_table_t tokens = { +@@ -574,6 +574,9 @@ {Opt_ignore, "noquota"}, {Opt_ignore, "quota"}, {Opt_ignore, "usrquota"}, @@ -377,7 +375,7 @@ {Opt_err, NULL} }; -@@ -760,6 +763,18 @@ static int parse_options (char * options +@@ -761,6 +764,18 @@ case Opt_abort: set_opt(sbi->s_mount_opt, ABORT); break; @@ -396,9 +394,24 @@ case Opt_ignore: break; default: ---- linux-2.6.0-test6/include/linux/ext3_fs.h~iopen-2.6.0-test6 2003-10-14 17:03:47.000000000 +0400 -+++ linux-2.6.0-test6-alexey/include/linux/ext3_fs.h 2003-10-14 17:03:48.000000000 +0400 -@@ -325,6 +325,8 @@ struct ext3_inode { +Index: linux-2.6.0/fs/ext3/Makefile +=================================================================== +--- linux-2.6.0.orig/fs/ext3/Makefile 2003-09-19 18:00:24.000000000 +0400 ++++ linux-2.6.0/fs/ext3/Makefile 2004-01-07 17:12:07.000000000 +0300 +@@ -5,7 +5,7 @@ + obj-$(CONFIG_EXT3_FS) += ext3.o + + ext3-y := balloc.o bitmap.o dir.o file.o fsync.o ialloc.o inode.o \ +- ioctl.o namei.o super.o symlink.o hash.o ++ ioctl.o namei.o super.o symlink.o hash.o iopen.o + + ext3-$(CONFIG_EXT3_FS_XATTR) += xattr.o xattr_user.o xattr_trusted.o + ext3-$(CONFIG_EXT3_FS_POSIX_ACL) += acl.o +Index: linux-2.6.0/include/linux/ext3_fs.h +=================================================================== +--- linux-2.6.0.orig/include/linux/ext3_fs.h 2004-01-04 15:27:40.000000000 +0300 ++++ linux-2.6.0/include/linux/ext3_fs.h 2004-01-07 17:12:07.000000000 +0300 +@@ -325,6 +325,8 @@ #define EXT3_MOUNT_NO_UID32 0x2000 /* Disable 32-bit UIDs */ #define EXT3_MOUNT_XATTR_USER 0x4000 /* Extended user attributes */ #define EXT3_MOUNT_POSIX_ACL 0x8000 /* POSIX Access Control Lists */ @@ -407,5 +420,3 @@ /* Compatibility, for having both ext2_fs.h and ext3_fs.h included at once */ #ifndef _LINUX_EXT2_FS_H - -_ diff --git a/lustre/kernel_patches/patches/linux-2.4.19-pre1-xattr-0.8.54.patch b/lustre/kernel_patches/patches/linux-2.4.19-pre1-xattr-0.8.54.patch index d5d0030..4107e70 100644 --- a/lustre/kernel_patches/patches/linux-2.4.19-pre1-xattr-0.8.54.patch +++ b/lustre/kernel_patches/patches/linux-2.4.19-pre1-xattr-0.8.54.patch @@ -66,8 +66,8 @@ Index: linux-2.4.19-pre1/Documentation/Configure.help =================================================================== ---- linux-2.4.19-pre1.orig/Documentation/Configure.help 2003-11-20 19:01:44.000000000 +0300 -+++ linux-2.4.19-pre1/Documentation/Configure.help 2003-11-21 03:51:05.000000000 +0300 +--- linux-2.4.19-pre1.orig/Documentation/Configure.help 2004-01-14 01:11:29.000000000 +0300 ++++ linux-2.4.19-pre1/Documentation/Configure.help 2004-01-14 01:11:49.000000000 +0300 @@ -14035,6 +14035,39 @@ be compiled as a module, and so this could be dangerous. Most everyone wants to say Y here. @@ -151,7 +151,7 @@ Index: linux-2.4.19-pre1/Documentation/Configure.help Index: linux-2.4.19-pre1/arch/alpha/defconfig =================================================================== --- linux-2.4.19-pre1.orig/arch/alpha/defconfig 2001-11-20 02:19:42.000000000 +0300 -+++ linux-2.4.19-pre1/arch/alpha/defconfig 2003-11-21 03:51:05.000000000 +0300 ++++ linux-2.4.19-pre1/arch/alpha/defconfig 2004-01-14 01:11:49.000000000 +0300 @@ -1,6 +1,13 @@ # # Automatically generated make config: don't edit @@ -169,7 +169,7 @@ Index: linux-2.4.19-pre1/arch/alpha/defconfig Index: linux-2.4.19-pre1/arch/alpha/kernel/entry.S =================================================================== --- linux-2.4.19-pre1.orig/arch/alpha/kernel/entry.S 2001-11-10 00:45:35.000000000 +0300 -+++ linux-2.4.19-pre1/arch/alpha/kernel/entry.S 2003-11-21 03:51:05.000000000 +0300 ++++ linux-2.4.19-pre1/arch/alpha/kernel/entry.S 2004-01-14 01:11:49.000000000 +0300 @@ -1148,3 +1148,16 @@ .quad sys_gettid .quad sys_readahead @@ -190,7 +190,7 @@ Index: linux-2.4.19-pre1/arch/alpha/kernel/entry.S Index: linux-2.4.19-pre1/arch/arm/defconfig =================================================================== --- linux-2.4.19-pre1.orig/arch/arm/defconfig 2001-05-20 04:43:05.000000000 +0400 -+++ linux-2.4.19-pre1/arch/arm/defconfig 2003-11-21 03:51:05.000000000 +0300 ++++ linux-2.4.19-pre1/arch/arm/defconfig 2004-01-14 01:11:49.000000000 +0300 @@ -1,6 +1,13 @@ # # Automatically generated make config: don't edit @@ -208,7 +208,7 @@ Index: linux-2.4.19-pre1/arch/arm/defconfig Index: linux-2.4.19-pre1/arch/arm/kernel/calls.S =================================================================== --- linux-2.4.19-pre1.orig/arch/arm/kernel/calls.S 2001-10-08 21:39:18.000000000 +0400 -+++ linux-2.4.19-pre1/arch/arm/kernel/calls.S 2003-11-21 03:51:05.000000000 +0300 ++++ linux-2.4.19-pre1/arch/arm/kernel/calls.S 2004-01-14 01:11:49.000000000 +0300 @@ -236,6 +236,22 @@ .long SYMBOL_NAME(sys_mincore) /* 220 */ .long SYMBOL_NAME(sys_madvise) @@ -234,8 +234,8 @@ Index: linux-2.4.19-pre1/arch/arm/kernel/calls.S .rept NR_syscalls - (__syscall_end - __syscall_start) / 4 Index: linux-2.4.19-pre1/arch/i386/defconfig =================================================================== ---- linux-2.4.19-pre1.orig/arch/i386/defconfig 2003-11-20 19:01:35.000000000 +0300 -+++ linux-2.4.19-pre1/arch/i386/defconfig 2003-11-21 03:51:05.000000000 +0300 +--- linux-2.4.19-pre1.orig/arch/i386/defconfig 2004-01-14 01:10:36.000000000 +0300 ++++ linux-2.4.19-pre1/arch/i386/defconfig 2004-01-14 01:11:49.000000000 +0300 @@ -1,6 +1,13 @@ # # Automatically generated make config: don't edit @@ -250,10 +250,45 @@ Index: linux-2.4.19-pre1/arch/i386/defconfig CONFIG_X86=y CONFIG_ISA=y # CONFIG_SBUS is not set +Index: linux-2.4.19-pre1/arch/i386/kernel/entry.S +=================================================================== +--- linux-2.4.19-pre1.orig/arch/i386/kernel/entry.S 2004-01-14 01:11:46.000000000 +0300 ++++ linux-2.4.19-pre1/arch/i386/kernel/entry.S 2004-01-14 01:11:49.000000000 +0300 +@@ -619,18 +619,18 @@ + .long SYMBOL_NAME(sys_ni_syscall) /* Reserved for Security */ + .long SYMBOL_NAME(sys_gettid) + .long SYMBOL_NAME(sys_readahead) /* 225 */ +- .long SYMBOL_NAME(sys_ni_syscall) /* reserved for setxattr */ +- .long SYMBOL_NAME(sys_ni_syscall) /* reserved for lsetxattr */ +- .long SYMBOL_NAME(sys_ni_syscall) /* reserved for fsetxattr */ +- .long SYMBOL_NAME(sys_ni_syscall) /* reserved for getxattr */ +- .long SYMBOL_NAME(sys_ni_syscall) /* 230 reserved for lgetxattr */ +- .long SYMBOL_NAME(sys_ni_syscall) /* reserved for fgetxattr */ +- .long SYMBOL_NAME(sys_ni_syscall) /* reserved for listxattr */ +- .long SYMBOL_NAME(sys_ni_syscall) /* reserved for llistxattr */ +- .long SYMBOL_NAME(sys_ni_syscall) /* reserved for flistxattr */ +- .long SYMBOL_NAME(sys_ni_syscall) /* 235 reserved for removexattr */ +- .long SYMBOL_NAME(sys_ni_syscall) /* reserved for lremovexattr */ +- .long SYMBOL_NAME(sys_ni_syscall) /* reserved for fremovexattr */ ++ .long SYMBOL_NAME(sys_setxattr) ++ .long SYMBOL_NAME(sys_lsetxattr) ++ .long SYMBOL_NAME(sys_fsetxattr) ++ .long SYMBOL_NAME(sys_getxattr) ++ .long SYMBOL_NAME(sys_lgetxattr) /* 230 */ ++ .long SYMBOL_NAME(sys_fgetxattr) ++ .long SYMBOL_NAME(sys_listxattr) ++ .long SYMBOL_NAME(sys_llistxattr) ++ .long SYMBOL_NAME(sys_flistxattr) ++ .long SYMBOL_NAME(sys_removexattr) /* 235 */ ++ .long SYMBOL_NAME(sys_lremovexattr) ++ .long SYMBOL_NAME(sys_fremovexattr) + + .rept NR_syscalls-(.-sys_call_table)/4 + .long SYMBOL_NAME(sys_ni_syscall) Index: linux-2.4.19-pre1/arch/ia64/defconfig =================================================================== --- linux-2.4.19-pre1.orig/arch/ia64/defconfig 2001-11-10 01:26:17.000000000 +0300 -+++ linux-2.4.19-pre1/arch/ia64/defconfig 2003-11-21 03:51:05.000000000 +0300 ++++ linux-2.4.19-pre1/arch/ia64/defconfig 2004-01-14 01:11:49.000000000 +0300 @@ -1,6 +1,13 @@ # # Automatically generated make config: don't edit @@ -271,7 +306,7 @@ Index: linux-2.4.19-pre1/arch/ia64/defconfig Index: linux-2.4.19-pre1/arch/ia64/kernel/entry.S =================================================================== --- linux-2.4.19-pre1.orig/arch/ia64/kernel/entry.S 2001-11-10 01:26:17.000000000 +0300 -+++ linux-2.4.19-pre1/arch/ia64/kernel/entry.S 2003-11-21 03:51:05.000000000 +0300 ++++ linux-2.4.19-pre1/arch/ia64/kernel/entry.S 2004-01-14 01:11:49.000000000 +0300 @@ -1130,18 +1130,18 @@ data8 sys_getdents64 data8 sys_getunwind // 1215 @@ -306,7 +341,7 @@ Index: linux-2.4.19-pre1/arch/ia64/kernel/entry.S Index: linux-2.4.19-pre1/arch/m68k/defconfig =================================================================== --- linux-2.4.19-pre1.orig/arch/m68k/defconfig 2000-06-19 23:56:08.000000000 +0400 -+++ linux-2.4.19-pre1/arch/m68k/defconfig 2003-11-21 03:51:05.000000000 +0300 ++++ linux-2.4.19-pre1/arch/m68k/defconfig 2004-01-14 01:11:49.000000000 +0300 @@ -1,6 +1,13 @@ # # Automatically generated make config: don't edit @@ -324,7 +359,7 @@ Index: linux-2.4.19-pre1/arch/m68k/defconfig Index: linux-2.4.19-pre1/arch/mips/defconfig =================================================================== --- linux-2.4.19-pre1.orig/arch/mips/defconfig 2001-09-09 21:43:02.000000000 +0400 -+++ linux-2.4.19-pre1/arch/mips/defconfig 2003-11-21 03:51:05.000000000 +0300 ++++ linux-2.4.19-pre1/arch/mips/defconfig 2004-01-14 01:11:49.000000000 +0300 @@ -1,6 +1,13 @@ # # Automatically generated make config: don't edit @@ -342,7 +377,7 @@ Index: linux-2.4.19-pre1/arch/mips/defconfig Index: linux-2.4.19-pre1/arch/mips64/defconfig =================================================================== --- linux-2.4.19-pre1.orig/arch/mips64/defconfig 2001-09-09 21:43:02.000000000 +0400 -+++ linux-2.4.19-pre1/arch/mips64/defconfig 2003-11-21 03:51:05.000000000 +0300 ++++ linux-2.4.19-pre1/arch/mips64/defconfig 2004-01-14 01:11:49.000000000 +0300 @@ -1,6 +1,13 @@ # # Automatically generated make config: don't edit @@ -359,8 +394,8 @@ Index: linux-2.4.19-pre1/arch/mips64/defconfig # Code maturity level options Index: linux-2.4.19-pre1/arch/ppc/defconfig =================================================================== ---- linux-2.4.19-pre1.orig/arch/ppc/defconfig 2003-11-20 19:01:35.000000000 +0300 -+++ linux-2.4.19-pre1/arch/ppc/defconfig 2003-11-21 03:51:05.000000000 +0300 +--- linux-2.4.19-pre1.orig/arch/ppc/defconfig 2004-01-14 01:10:36.000000000 +0300 ++++ linux-2.4.19-pre1/arch/ppc/defconfig 2004-01-14 01:11:49.000000000 +0300 @@ -1,6 +1,20 @@ # # Automatically generated make config: don't edit @@ -384,8 +419,8 @@ Index: linux-2.4.19-pre1/arch/ppc/defconfig CONFIG_RWSEM_XCHGADD_ALGORITHM=y Index: linux-2.4.19-pre1/arch/s390/defconfig =================================================================== ---- linux-2.4.19-pre1.orig/arch/s390/defconfig 2003-11-20 19:01:35.000000000 +0300 -+++ linux-2.4.19-pre1/arch/s390/defconfig 2003-11-21 03:51:05.000000000 +0300 +--- linux-2.4.19-pre1.orig/arch/s390/defconfig 2004-01-14 01:10:36.000000000 +0300 ++++ linux-2.4.19-pre1/arch/s390/defconfig 2004-01-14 01:11:49.000000000 +0300 @@ -1,6 +1,13 @@ # # Automatically generated make config: don't edit @@ -402,8 +437,8 @@ Index: linux-2.4.19-pre1/arch/s390/defconfig # CONFIG_MCA is not set Index: linux-2.4.19-pre1/arch/s390/kernel/entry.S =================================================================== ---- linux-2.4.19-pre1.orig/arch/s390/kernel/entry.S 2003-11-20 19:01:35.000000000 +0300 -+++ linux-2.4.19-pre1/arch/s390/kernel/entry.S 2003-11-21 03:51:05.000000000 +0300 +--- linux-2.4.19-pre1.orig/arch/s390/kernel/entry.S 2004-01-14 01:10:36.000000000 +0300 ++++ linux-2.4.19-pre1/arch/s390/kernel/entry.S 2004-01-14 01:11:49.000000000 +0300 @@ -599,8 +599,19 @@ .long sys_fcntl64 .long sys_ni_syscall /* 222 - reserved for posix_acl */ @@ -428,8 +463,8 @@ Index: linux-2.4.19-pre1/arch/s390/kernel/entry.S Index: linux-2.4.19-pre1/arch/s390x/defconfig =================================================================== ---- linux-2.4.19-pre1.orig/arch/s390x/defconfig 2003-11-20 19:01:35.000000000 +0300 -+++ linux-2.4.19-pre1/arch/s390x/defconfig 2003-11-21 03:51:05.000000000 +0300 +--- linux-2.4.19-pre1.orig/arch/s390x/defconfig 2004-01-14 01:10:36.000000000 +0300 ++++ linux-2.4.19-pre1/arch/s390x/defconfig 2004-01-14 01:11:49.000000000 +0300 @@ -1,6 +1,13 @@ # # Automatically generated make config: don't edit @@ -446,8 +481,8 @@ Index: linux-2.4.19-pre1/arch/s390x/defconfig # CONFIG_MCA is not set Index: linux-2.4.19-pre1/arch/s390x/kernel/entry.S =================================================================== ---- linux-2.4.19-pre1.orig/arch/s390x/kernel/entry.S 2003-11-20 19:01:35.000000000 +0300 -+++ linux-2.4.19-pre1/arch/s390x/kernel/entry.S 2003-11-21 03:51:05.000000000 +0300 +--- linux-2.4.19-pre1.orig/arch/s390x/kernel/entry.S 2004-01-14 01:10:36.000000000 +0300 ++++ linux-2.4.19-pre1/arch/s390x/kernel/entry.S 2004-01-14 01:11:49.000000000 +0300 @@ -632,8 +632,19 @@ .long SYSCALL(sys_ni_syscall,sys32_fcntl64_wrapper) .long SYSCALL(sys_ni_syscall,sys_ni_syscall) /* 222 - reserved for posix_acl */ @@ -472,8 +507,8 @@ Index: linux-2.4.19-pre1/arch/s390x/kernel/entry.S Index: linux-2.4.19-pre1/arch/s390x/kernel/wrapper32.S =================================================================== ---- linux-2.4.19-pre1.orig/arch/s390x/kernel/wrapper32.S 2003-11-20 19:01:35.000000000 +0300 -+++ linux-2.4.19-pre1/arch/s390x/kernel/wrapper32.S 2003-11-21 03:51:05.000000000 +0300 +--- linux-2.4.19-pre1.orig/arch/s390x/kernel/wrapper32.S 2004-01-14 01:10:36.000000000 +0300 ++++ linux-2.4.19-pre1/arch/s390x/kernel/wrapper32.S 2004-01-14 01:11:49.000000000 +0300 @@ -1091,3 +1091,95 @@ llgtr %r3,%r3 # struct stat64 * llgfr %r4,%r4 # long @@ -572,8 +607,8 @@ Index: linux-2.4.19-pre1/arch/s390x/kernel/wrapper32.S + Index: linux-2.4.19-pre1/arch/sparc/defconfig =================================================================== ---- linux-2.4.19-pre1.orig/arch/sparc/defconfig 2003-11-20 19:01:35.000000000 +0300 -+++ linux-2.4.19-pre1/arch/sparc/defconfig 2003-11-21 03:51:05.000000000 +0300 +--- linux-2.4.19-pre1.orig/arch/sparc/defconfig 2004-01-14 01:10:36.000000000 +0300 ++++ linux-2.4.19-pre1/arch/sparc/defconfig 2004-01-14 01:11:49.000000000 +0300 @@ -1,6 +1,13 @@ # # Automatically generated make config: don't edit @@ -591,7 +626,7 @@ Index: linux-2.4.19-pre1/arch/sparc/defconfig Index: linux-2.4.19-pre1/arch/sparc/kernel/systbls.S =================================================================== --- linux-2.4.19-pre1.orig/arch/sparc/kernel/systbls.S 2001-10-21 21:36:54.000000000 +0400 -+++ linux-2.4.19-pre1/arch/sparc/kernel/systbls.S 2003-11-21 03:51:05.000000000 +0300 ++++ linux-2.4.19-pre1/arch/sparc/kernel/systbls.S 2004-01-14 01:11:49.000000000 +0300 @@ -51,11 +51,11 @@ /*150*/ .long sys_nis_syscall, sys_nis_syscall, sys_nis_syscall, sys_poll, sys_getdents64 /*155*/ .long sys_fcntl64, sys_nis_syscall, sys_statfs, sys_fstatfs, sys_oldumount @@ -611,8 +646,8 @@ Index: linux-2.4.19-pre1/arch/sparc/kernel/systbls.S /*200*/ .long sys_ssetmask, sys_sigsuspend, sys_newlstat, sys_uselib, old_readdir Index: linux-2.4.19-pre1/arch/sparc64/defconfig =================================================================== ---- linux-2.4.19-pre1.orig/arch/sparc64/defconfig 2003-11-20 19:01:35.000000000 +0300 -+++ linux-2.4.19-pre1/arch/sparc64/defconfig 2003-11-21 03:51:05.000000000 +0300 +--- linux-2.4.19-pre1.orig/arch/sparc64/defconfig 2004-01-14 01:10:36.000000000 +0300 ++++ linux-2.4.19-pre1/arch/sparc64/defconfig 2004-01-14 01:11:49.000000000 +0300 @@ -1,6 +1,13 @@ # # Automatically generated make config: don't edit @@ -630,7 +665,7 @@ Index: linux-2.4.19-pre1/arch/sparc64/defconfig Index: linux-2.4.19-pre1/arch/sparc64/kernel/systbls.S =================================================================== --- linux-2.4.19-pre1.orig/arch/sparc64/kernel/systbls.S 2001-10-21 21:36:54.000000000 +0400 -+++ linux-2.4.19-pre1/arch/sparc64/kernel/systbls.S 2003-11-21 03:51:05.000000000 +0300 ++++ linux-2.4.19-pre1/arch/sparc64/kernel/systbls.S 2004-01-14 01:11:49.000000000 +0300 @@ -52,11 +52,11 @@ /*150*/ .word sys_nis_syscall, sys_nis_syscall, sys_nis_syscall, sys_poll, sys_getdents64 .word sys32_fcntl64, sys_nis_syscall, sys32_statfs, sys32_fstatfs, sys_oldumount @@ -667,8 +702,8 @@ Index: linux-2.4.19-pre1/arch/sparc64/kernel/systbls.S /*200*/ .word sys_ssetmask, sys_nis_syscall, sys_newlstat, sys_uselib, sys_nis_syscall Index: linux-2.4.19-pre1/fs/Config.in =================================================================== ---- linux-2.4.19-pre1.orig/fs/Config.in 2003-11-20 19:01:36.000000000 +0300 -+++ linux-2.4.19-pre1/fs/Config.in 2003-11-21 03:51:05.000000000 +0300 +--- linux-2.4.19-pre1.orig/fs/Config.in 2004-01-14 01:10:37.000000000 +0300 ++++ linux-2.4.19-pre1/fs/Config.in 2004-01-14 01:11:49.000000000 +0300 @@ -22,6 +22,11 @@ dep_tristate 'BFS file system support (EXPERIMENTAL)' CONFIG_BFS_FS $CONFIG_EXPERIMENTAL @@ -706,8 +741,8 @@ Index: linux-2.4.19-pre1/fs/Config.in source fs/partitions/Config.in Index: linux-2.4.19-pre1/fs/Makefile =================================================================== ---- linux-2.4.19-pre1.orig/fs/Makefile 2003-11-21 03:51:01.000000000 +0300 -+++ linux-2.4.19-pre1/fs/Makefile 2003-11-21 03:51:05.000000000 +0300 +--- linux-2.4.19-pre1.orig/fs/Makefile 2004-01-14 01:11:49.000000000 +0300 ++++ linux-2.4.19-pre1/fs/Makefile 2004-01-14 01:11:49.000000000 +0300 @@ -14,7 +14,7 @@ super.o block_dev.o char_dev.o stat.o exec.o pipe.o namei.o \ fcntl.o ioctl.o readdir.o select.o fifo.o locks.o \ @@ -730,7 +765,7 @@ Index: linux-2.4.19-pre1/fs/Makefile Index: linux-2.4.19-pre1/fs/ext2/Makefile =================================================================== --- linux-2.4.19-pre1.orig/fs/ext2/Makefile 2001-10-11 19:05:18.000000000 +0400 -+++ linux-2.4.19-pre1/fs/ext2/Makefile 2003-11-21 03:51:05.000000000 +0300 ++++ linux-2.4.19-pre1/fs/ext2/Makefile 2004-01-14 01:11:49.000000000 +0300 @@ -13,4 +13,8 @@ ioctl.o namei.o super.o symlink.o obj-m := $(O_TARGET) @@ -743,7 +778,7 @@ Index: linux-2.4.19-pre1/fs/ext2/Makefile Index: linux-2.4.19-pre1/fs/ext2/file.c =================================================================== --- linux-2.4.19-pre1.orig/fs/ext2/file.c 2001-10-11 19:05:18.000000000 +0400 -+++ linux-2.4.19-pre1/fs/ext2/file.c 2003-11-21 03:51:05.000000000 +0300 ++++ linux-2.4.19-pre1/fs/ext2/file.c 2004-01-14 01:11:49.000000000 +0300 @@ -20,6 +20,7 @@ #include @@ -763,8 +798,8 @@ Index: linux-2.4.19-pre1/fs/ext2/file.c }; Index: linux-2.4.19-pre1/fs/ext2/ialloc.c =================================================================== ---- linux-2.4.19-pre1.orig/fs/ext2/ialloc.c 2003-11-20 19:01:36.000000000 +0300 -+++ linux-2.4.19-pre1/fs/ext2/ialloc.c 2003-11-21 03:51:05.000000000 +0300 +--- linux-2.4.19-pre1.orig/fs/ext2/ialloc.c 2004-01-14 01:10:37.000000000 +0300 ++++ linux-2.4.19-pre1/fs/ext2/ialloc.c 2004-01-14 01:11:49.000000000 +0300 @@ -15,6 +15,7 @@ #include #include @@ -783,8 +818,8 @@ Index: linux-2.4.19-pre1/fs/ext2/ialloc.c } Index: linux-2.4.19-pre1/fs/ext2/inode.c =================================================================== ---- linux-2.4.19-pre1.orig/fs/ext2/inode.c 2003-11-20 19:01:36.000000000 +0300 -+++ linux-2.4.19-pre1/fs/ext2/inode.c 2003-11-21 03:51:05.000000000 +0300 +--- linux-2.4.19-pre1.orig/fs/ext2/inode.c 2004-01-14 01:10:37.000000000 +0300 ++++ linux-2.4.19-pre1/fs/ext2/inode.c 2004-01-14 01:11:49.000000000 +0300 @@ -39,6 +39,18 @@ static int ext2_update_inode(struct inode * inode, int do_sync); @@ -870,7 +905,7 @@ Index: linux-2.4.19-pre1/fs/ext2/inode.c Index: linux-2.4.19-pre1/fs/ext2/namei.c =================================================================== --- linux-2.4.19-pre1.orig/fs/ext2/namei.c 2001-10-04 09:57:36.000000000 +0400 -+++ linux-2.4.19-pre1/fs/ext2/namei.c 2003-11-21 03:51:05.000000000 +0300 ++++ linux-2.4.19-pre1/fs/ext2/namei.c 2004-01-14 01:11:49.000000000 +0300 @@ -31,6 +31,7 @@ #include @@ -906,8 +941,8 @@ Index: linux-2.4.19-pre1/fs/ext2/namei.c }; Index: linux-2.4.19-pre1/fs/ext2/super.c =================================================================== ---- linux-2.4.19-pre1.orig/fs/ext2/super.c 2003-11-20 19:01:36.000000000 +0300 -+++ linux-2.4.19-pre1/fs/ext2/super.c 2003-11-21 03:51:05.000000000 +0300 +--- linux-2.4.19-pre1.orig/fs/ext2/super.c 2004-01-14 01:10:37.000000000 +0300 ++++ linux-2.4.19-pre1/fs/ext2/super.c 2004-01-14 01:11:49.000000000 +0300 @@ -21,6 +21,7 @@ #include #include @@ -980,7 +1015,7 @@ Index: linux-2.4.19-pre1/fs/ext2/super.c Index: linux-2.4.19-pre1/fs/ext2/symlink.c =================================================================== --- linux-2.4.19-pre1.orig/fs/ext2/symlink.c 2000-09-28 00:41:33.000000000 +0400 -+++ linux-2.4.19-pre1/fs/ext2/symlink.c 2003-11-21 03:51:05.000000000 +0300 ++++ linux-2.4.19-pre1/fs/ext2/symlink.c 2004-01-14 01:11:49.000000000 +0300 @@ -19,6 +19,7 @@ #include @@ -1012,8 +1047,8 @@ Index: linux-2.4.19-pre1/fs/ext2/symlink.c }; Index: linux-2.4.19-pre1/fs/ext2/xattr.c =================================================================== ---- linux-2.4.19-pre1.orig/fs/ext2/xattr.c 2003-11-21 03:51:05.000000000 +0300 -+++ linux-2.4.19-pre1/fs/ext2/xattr.c 2003-11-21 03:51:05.000000000 +0300 +--- linux-2.4.19-pre1.orig/fs/ext2/xattr.c 2003-01-30 13:24:37.000000000 +0300 ++++ linux-2.4.19-pre1/fs/ext2/xattr.c 2004-01-14 01:11:49.000000000 +0300 @@ -0,0 +1,1212 @@ +/* + * linux/fs/ext2/xattr.c @@ -2229,8 +2264,8 @@ Index: linux-2.4.19-pre1/fs/ext2/xattr.c +#endif /* CONFIG_EXT2_FS_XATTR_SHARING */ Index: linux-2.4.19-pre1/fs/ext2/xattr_user.c =================================================================== ---- linux-2.4.19-pre1.orig/fs/ext2/xattr_user.c 2003-11-21 03:51:05.000000000 +0300 -+++ linux-2.4.19-pre1/fs/ext2/xattr_user.c 2003-11-21 03:51:05.000000000 +0300 +--- linux-2.4.19-pre1.orig/fs/ext2/xattr_user.c 2003-01-30 13:24:37.000000000 +0300 ++++ linux-2.4.19-pre1/fs/ext2/xattr_user.c 2004-01-14 01:11:49.000000000 +0300 @@ -0,0 +1,103 @@ +/* + * linux/fs/ext2/xattr_user.c @@ -2337,8 +2372,8 @@ Index: linux-2.4.19-pre1/fs/ext2/xattr_user.c +} Index: linux-2.4.19-pre1/fs/ext3/Makefile =================================================================== ---- linux-2.4.19-pre1.orig/fs/ext3/Makefile 2003-11-21 03:51:02.000000000 +0300 -+++ linux-2.4.19-pre1/fs/ext3/Makefile 2003-11-21 03:51:05.000000000 +0300 +--- linux-2.4.19-pre1.orig/fs/ext3/Makefile 2004-01-14 01:11:49.000000000 +0300 ++++ linux-2.4.19-pre1/fs/ext3/Makefile 2004-01-14 01:11:49.000000000 +0300 @@ -1,5 +1,5 @@ # -# Makefile for the linux ext2-filesystem routines. @@ -2365,8 +2400,8 @@ Index: linux-2.4.19-pre1/fs/ext3/Makefile include $(TOPDIR)/Rules.make Index: linux-2.4.19-pre1/fs/ext3/file.c =================================================================== ---- linux-2.4.19-pre1.orig/fs/ext3/file.c 2003-11-21 03:51:02.000000000 +0300 -+++ linux-2.4.19-pre1/fs/ext3/file.c 2003-11-21 03:51:05.000000000 +0300 +--- linux-2.4.19-pre1.orig/fs/ext3/file.c 2004-01-14 01:11:49.000000000 +0300 ++++ linux-2.4.19-pre1/fs/ext3/file.c 2004-01-14 01:11:49.000000000 +0300 @@ -23,6 +23,7 @@ #include #include @@ -2387,8 +2422,8 @@ Index: linux-2.4.19-pre1/fs/ext3/file.c Index: linux-2.4.19-pre1/fs/ext3/ialloc.c =================================================================== ---- linux-2.4.19-pre1.orig/fs/ext3/ialloc.c 2003-11-20 19:01:36.000000000 +0300 -+++ linux-2.4.19-pre1/fs/ext3/ialloc.c 2003-11-21 03:51:05.000000000 +0300 +--- linux-2.4.19-pre1.orig/fs/ext3/ialloc.c 2004-01-14 01:10:37.000000000 +0300 ++++ linux-2.4.19-pre1/fs/ext3/ialloc.c 2004-01-14 01:11:49.000000000 +0300 @@ -17,6 +17,7 @@ #include #include @@ -2407,8 +2442,8 @@ Index: linux-2.4.19-pre1/fs/ext3/ialloc.c Index: linux-2.4.19-pre1/fs/ext3/inode.c =================================================================== ---- linux-2.4.19-pre1.orig/fs/ext3/inode.c 2003-11-20 19:01:36.000000000 +0300 -+++ linux-2.4.19-pre1/fs/ext3/inode.c 2003-11-21 03:51:05.000000000 +0300 +--- linux-2.4.19-pre1.orig/fs/ext3/inode.c 2004-01-14 01:10:37.000000000 +0300 ++++ linux-2.4.19-pre1/fs/ext3/inode.c 2004-01-14 01:11:49.000000000 +0300 @@ -39,6 +39,18 @@ */ #undef SEARCH_FROM_ZERO @@ -2501,8 +2536,8 @@ Index: linux-2.4.19-pre1/fs/ext3/inode.c /* inode->i_attr_flags |= ATTR_FLAG_SYNCRONOUS; unused */ Index: linux-2.4.19-pre1/fs/ext3/namei.c =================================================================== ---- linux-2.4.19-pre1.orig/fs/ext3/namei.c 2003-11-21 03:51:02.000000000 +0300 -+++ linux-2.4.19-pre1/fs/ext3/namei.c 2003-11-21 03:51:05.000000000 +0300 +--- linux-2.4.19-pre1.orig/fs/ext3/namei.c 2004-01-14 01:11:49.000000000 +0300 ++++ linux-2.4.19-pre1/fs/ext3/namei.c 2004-01-14 01:11:49.000000000 +0300 @@ -29,6 +29,7 @@ #include #include @@ -2566,8 +2601,8 @@ Index: linux-2.4.19-pre1/fs/ext3/namei.c + Index: linux-2.4.19-pre1/fs/ext3/super.c =================================================================== ---- linux-2.4.19-pre1.orig/fs/ext3/super.c 2003-11-21 03:51:02.000000000 +0300 -+++ linux-2.4.19-pre1/fs/ext3/super.c 2003-11-21 03:51:05.000000000 +0300 +--- linux-2.4.19-pre1.orig/fs/ext3/super.c 2004-01-14 01:11:49.000000000 +0300 ++++ linux-2.4.19-pre1/fs/ext3/super.c 2004-01-14 01:11:49.000000000 +0300 @@ -24,6 +24,7 @@ #include #include @@ -2656,7 +2691,7 @@ Index: linux-2.4.19-pre1/fs/ext3/super.c Index: linux-2.4.19-pre1/fs/ext3/symlink.c =================================================================== --- linux-2.4.19-pre1.orig/fs/ext3/symlink.c 2001-11-10 01:25:04.000000000 +0300 -+++ linux-2.4.19-pre1/fs/ext3/symlink.c 2003-11-21 03:51:05.000000000 +0300 ++++ linux-2.4.19-pre1/fs/ext3/symlink.c 2004-01-14 01:11:49.000000000 +0300 @@ -20,6 +20,7 @@ #include #include @@ -2688,8 +2723,8 @@ Index: linux-2.4.19-pre1/fs/ext3/symlink.c }; Index: linux-2.4.19-pre1/fs/ext3/xattr.c =================================================================== ---- linux-2.4.19-pre1.orig/fs/ext3/xattr.c 2003-11-21 03:51:05.000000000 +0300 -+++ linux-2.4.19-pre1/fs/ext3/xattr.c 2003-11-21 03:51:05.000000000 +0300 +--- linux-2.4.19-pre1.orig/fs/ext3/xattr.c 2003-01-30 13:24:37.000000000 +0300 ++++ linux-2.4.19-pre1/fs/ext3/xattr.c 2004-01-14 01:11:49.000000000 +0300 @@ -0,0 +1,1225 @@ +/* + * linux/fs/ext3/xattr.c @@ -3918,8 +3953,8 @@ Index: linux-2.4.19-pre1/fs/ext3/xattr.c +#endif /* CONFIG_EXT3_FS_XATTR_SHARING */ Index: linux-2.4.19-pre1/fs/ext3/xattr_user.c =================================================================== ---- linux-2.4.19-pre1.orig/fs/ext3/xattr_user.c 2003-11-21 03:51:05.000000000 +0300 -+++ linux-2.4.19-pre1/fs/ext3/xattr_user.c 2003-11-21 03:51:05.000000000 +0300 +--- linux-2.4.19-pre1.orig/fs/ext3/xattr_user.c 2003-01-30 13:24:37.000000000 +0300 ++++ linux-2.4.19-pre1/fs/ext3/xattr_user.c 2004-01-14 01:11:49.000000000 +0300 @@ -0,0 +1,111 @@ +/* + * linux/fs/ext3/xattr_user.c @@ -4032,10 +4067,28 @@ Index: linux-2.4.19-pre1/fs/ext3/xattr_user.c + ext3_xattr_unregister(EXT3_XATTR_INDEX_USER, + &ext3_xattr_user_handler); +} +Index: linux-2.4.19-pre1/fs/ext3/ext3-exports.c +=================================================================== +--- linux-2.4.19-pre1.orig/fs/ext3/ext3-exports.c 2003-01-30 13:24:37.000000000 +0300 ++++ linux-2.4.19-pre1/fs/ext3/ext3-exports.c 2004-01-14 01:11:49.000000000 +0300 +@@ -0,0 +1,13 @@ ++#include ++#include ++#include ++#include ++#include ++ ++EXPORT_SYMBOL(ext3_force_commit); ++EXPORT_SYMBOL(ext3_bread); ++EXPORT_SYMBOL(ext3_xattr_register); ++EXPORT_SYMBOL(ext3_xattr_unregister); ++EXPORT_SYMBOL(ext3_xattr_get); ++EXPORT_SYMBOL(ext3_xattr_list); ++EXPORT_SYMBOL(ext3_xattr_set); Index: linux-2.4.19-pre1/fs/mbcache.c =================================================================== ---- linux-2.4.19-pre1.orig/fs/mbcache.c 2003-11-21 03:51:05.000000000 +0300 -+++ linux-2.4.19-pre1/fs/mbcache.c 2003-11-21 03:51:05.000000000 +0300 +--- linux-2.4.19-pre1.orig/fs/mbcache.c 2003-01-30 13:24:37.000000000 +0300 ++++ linux-2.4.19-pre1/fs/mbcache.c 2004-01-14 01:11:49.000000000 +0300 @@ -0,0 +1,648 @@ +/* + * linux/fs/mbcache.c @@ -4685,489 +4738,601 @@ Index: linux-2.4.19-pre1/fs/mbcache.c +module_init(init_mbcache) +module_exit(exit_mbcache) + -Index: linux-2.4.19-pre1/include/asm-arm/unistd.h -=================================================================== ---- linux-2.4.19-pre1.orig/include/asm-arm/unistd.h 2001-08-12 22:14:00.000000000 +0400 -+++ linux-2.4.19-pre1/include/asm-arm/unistd.h 2003-11-21 03:51:05.000000000 +0300 -@@ -240,6 +240,18 @@ - #define __NR_mincore (__NR_SYSCALL_BASE+219) - #define __NR_madvise (__NR_SYSCALL_BASE+220) - #define __NR_fcntl64 (__NR_SYSCALL_BASE+221) -+#define __NR_setxattr (__NR_SYSCALL_BASE+226) -+#define __NR_lsetxattr (__NR_SYSCALL_BASE+227) -+#define __NR_fsetxattr (__NR_SYSCALL_BASE+228) -+#define __NR_getxattr (__NR_SYSCALL_BASE+229) -+#define __NR_lgetxattr (__NR_SYSCALL_BASE+230) -+#define __NR_fgetxattr (__NR_SYSCALL_BASE+231) -+#define __NR_listxattr (__NR_SYSCALL_BASE+232) -+#define __NR_llistxattr (__NR_SYSCALL_BASE+233) -+#define __NR_flistxattr (__NR_SYSCALL_BASE+234) -+#define __NR_removexattr (__NR_SYSCALL_BASE+235) -+#define __NR_lremovexattr (__NR_SYSCALL_BASE+236) -+#define __NR_fremovexattr (__NR_SYSCALL_BASE+237) - - /* - * The following SWIs are ARM private. -Index: linux-2.4.19-pre1/include/asm-ia64/unistd.h -=================================================================== ---- linux-2.4.19-pre1.orig/include/asm-ia64/unistd.h 2001-11-10 01:26:17.000000000 +0300 -+++ linux-2.4.19-pre1/include/asm-ia64/unistd.h 2003-11-21 03:51:05.000000000 +0300 -@@ -206,6 +206,18 @@ - #define __NR_getdents64 1214 - #define __NR_getunwind 1215 - #define __NR_readahead 1216 -+#define __NR_setxattr 1217 -+#define __NR_lsetxattr 1218 -+#define __NR_fsetxattr 1219 -+#define __NR_getxattr 1220 -+#define __NR_lgetxattr 1221 -+#define __NR_fgetxattr 1222 -+#define __NR_listxattr 1223 -+#define __NR_llistxattr 1224 -+#define __NR_flistxattr 1225 -+#define __NR_removexattr 1226 -+#define __NR_lremovexattr 1227 -+#define __NR_fremovexattr 1228 - - #if !defined(__ASSEMBLY__) && !defined(ASSEMBLER) - -Index: linux-2.4.19-pre1/include/asm-s390/unistd.h -=================================================================== ---- linux-2.4.19-pre1.orig/include/asm-s390/unistd.h 2001-10-11 20:43:38.000000000 +0400 -+++ linux-2.4.19-pre1/include/asm-s390/unistd.h 2003-11-21 03:51:05.000000000 +0300 -@@ -211,6 +211,18 @@ - #define __NR_mincore 218 - #define __NR_madvise 219 - #define __NR_getdents64 220 -+#define __NR_setxattr 224 -+#define __NR_lsetxattr 225 -+#define __NR_fsetxattr 226 -+#define __NR_getxattr 227 -+#define __NR_lgetxattr 228 -+#define __NR_fgetxattr 229 -+#define __NR_listxattr 230 -+#define __NR_llistxattr 231 -+#define __NR_flistxattr 232 -+#define __NR_removexattr 233 -+#define __NR_lremovexattr 234 -+#define __NR_fremovexattr 235 - - - /* user-visible error numbers are in the range -1 - -122: see */ -Index: linux-2.4.19-pre1/include/asm-s390x/unistd.h -=================================================================== ---- linux-2.4.19-pre1.orig/include/asm-s390x/unistd.h 2001-10-11 20:43:38.000000000 +0400 -+++ linux-2.4.19-pre1/include/asm-s390x/unistd.h 2003-11-21 03:51:05.000000000 +0300 -@@ -181,6 +181,18 @@ - #define __NR_mincore 218 - #define __NR_madvise 219 - #define __NR_getdents64 220 -+#define __NR_setxattr 224 -+#define __NR_lsetxattr 225 -+#define __NR_fsetxattr 226 -+#define __NR_getxattr 227 -+#define __NR_lgetxattr 228 -+#define __NR_fgetxattr 229 -+#define __NR_listxattr 230 -+#define __NR_llistxattr 231 -+#define __NR_flistxattr 232 -+#define __NR_removexattr 233 -+#define __NR_lremovexattr 234 -+#define __NR_fremovexattr 235 - - - /* user-visible error numbers are in the range -1 - -122: see */ -Index: linux-2.4.19-pre1/include/asm-sparc/unistd.h -=================================================================== ---- linux-2.4.19-pre1.orig/include/asm-sparc/unistd.h 2001-10-21 21:36:54.000000000 +0400 -+++ linux-2.4.19-pre1/include/asm-sparc/unistd.h 2003-11-21 03:51:05.000000000 +0300 -@@ -184,24 +184,24 @@ - /* #define __NR_exportfs 166 SunOS Specific */ - #define __NR_mount 167 /* Common */ - #define __NR_ustat 168 /* Common */ --/* #define __NR_semsys 169 SunOS Specific */ --/* #define __NR_msgsys 170 SunOS Specific */ --/* #define __NR_shmsys 171 SunOS Specific */ --/* #define __NR_auditsys 172 SunOS Specific */ --/* #define __NR_rfssys 173 SunOS Specific */ -+#define __NR_setxattr 169 /* SunOS: semsys */ -+#define __NR_lsetxattr 170 /* SunOS: msgsys */ -+#define __NR_fsetxattr 171 /* SunOS: shmsys */ -+#define __NR_getxattr 172 /* SunOS: auditsys */ -+#define __NR_lgetxattr 173 /* SunOS: rfssys */ - #define __NR_getdents 174 /* Common */ - #define __NR_setsid 175 /* Common */ - #define __NR_fchdir 176 /* Common */ --/* #define __NR_fchroot 177 SunOS Specific */ --/* #define __NR_vpixsys 178 SunOS Specific */ --/* #define __NR_aioread 179 SunOS Specific */ --/* #define __NR_aiowrite 180 SunOS Specific */ --/* #define __NR_aiowait 181 SunOS Specific */ --/* #define __NR_aiocancel 182 SunOS Specific */ -+#define __NR_fgetxattr 177 /* SunOS: fchroot */ -+#define __NR_listxattr 178 /* SunOS: vpixsys */ -+#define __NR_llistxattr 179 /* SunOS: aioread */ -+#define __NR_flistxattr 180 /* SunOS: aiowrite */ -+#define __NR_removexattr 181 /* SunOS: aiowait */ -+#define __NR_lremovexattr 182 /* SunOS: aiocancel */ - #define __NR_sigpending 183 /* Common */ - #define __NR_query_module 184 /* Linux Specific */ - #define __NR_setpgid 185 /* Common */ --/* #define __NR_pathconf 186 SunOS Specific */ -+#define __NR_fremovexattr 186 /* SunOS: pathconf */ - /* #define __NR_fpathconf 187 SunOS Specific */ - /* #define __NR_sysconf 188 SunOS Specific */ - #define __NR_uname 189 /* Linux Specific */ -Index: linux-2.4.19-pre1/include/asm-sparc64/unistd.h -=================================================================== ---- linux-2.4.19-pre1.orig/include/asm-sparc64/unistd.h 2001-10-21 21:36:54.000000000 +0400 -+++ linux-2.4.19-pre1/include/asm-sparc64/unistd.h 2003-11-21 03:51:05.000000000 +0300 -@@ -184,24 +184,24 @@ - /* #define __NR_exportfs 166 SunOS Specific */ - #define __NR_mount 167 /* Common */ - #define __NR_ustat 168 /* Common */ --/* #define __NR_semsys 169 SunOS Specific */ --/* #define __NR_msgsys 170 SunOS Specific */ --/* #define __NR_shmsys 171 SunOS Specific */ --/* #define __NR_auditsys 172 SunOS Specific */ --/* #define __NR_rfssys 173 SunOS Specific */ -+#define __NR_setxattr 169 /* SunOS: semsys */ -+#define __NR_lsetxattr 170 /* SunOS: msgsys */ -+#define __NR_fsetxattr 171 /* SunOS: shmsys */ -+#define __NR_getxattr 172 /* SunOS: auditsys */ -+#define __NR_lgetxattr 173 /* SunOS: rfssys */ - #define __NR_getdents 174 /* Common */ - #define __NR_setsid 175 /* Common */ - #define __NR_fchdir 176 /* Common */ --/* #define __NR_fchroot 177 SunOS Specific */ --/* #define __NR_vpixsys 178 SunOS Specific */ --/* #define __NR_aioread 179 SunOS Specific */ --/* #define __NR_aiowrite 180 SunOS Specific */ --/* #define __NR_aiowait 181 SunOS Specific */ --/* #define __NR_aiocancel 182 SunOS Specific */ -+#define __NR_fgetxattr 177 /* SunOS: fchroot */ -+#define __NR_listxattr 178 /* SunOS: vpixsys */ -+#define __NR_llistxattr 179 /* SunOS: aioread */ -+#define __NR_flistxattr 180 /* SunOS: aiowrite */ -+#define __NR_removexattr 181 /* SunOS: aiowait */ -+#define __NR_lremovexattr 182 /* SunOS: aiocancel */ - #define __NR_sigpending 183 /* Common */ - #define __NR_query_module 184 /* Linux Specific */ - #define __NR_setpgid 185 /* Common */ --/* #define __NR_pathconf 186 SunOS Specific */ -+#define __NR_fremovexattr 186 /* SunOS: pathconf */ - /* #define __NR_fpathconf 187 SunOS Specific */ - /* #define __NR_sysconf 188 SunOS Specific */ - #define __NR_uname 189 /* Linux Specific */ -Index: linux-2.4.19-pre1/include/linux/cache_def.h +Index: linux-2.4.19-pre1/fs/xattr.c =================================================================== ---- linux-2.4.19-pre1.orig/include/linux/cache_def.h 2003-11-21 03:51:05.000000000 +0300 -+++ linux-2.4.19-pre1/include/linux/cache_def.h 2003-11-21 03:51:05.000000000 +0300 -@@ -0,0 +1,15 @@ +--- linux-2.4.19-pre1.orig/fs/xattr.c 2003-01-30 13:24:37.000000000 +0300 ++++ linux-2.4.19-pre1/fs/xattr.c 2004-01-14 01:11:49.000000000 +0300 +@@ -0,0 +1,355 @@ +/* -+ * linux/cache_def.h -+ * Handling of caches defined in drivers, filesystems, ... -+ * -+ * Copyright (C) 2002 by Andreas Gruenbacher, -+ */ ++ File: fs/xattr.c + -+struct cache_definition { -+ const char *name; -+ void (*shrink)(int, unsigned int); -+ struct list_head link; -+}; ++ Extended attribute handling. + -+extern void register_cache(struct cache_definition *); -+extern void unregister_cache(struct cache_definition *); -Index: linux-2.4.19-pre1/include/linux/errno.h -=================================================================== ---- linux-2.4.19-pre1.orig/include/linux/errno.h 2001-02-10 01:46:13.000000000 +0300 -+++ linux-2.4.19-pre1/include/linux/errno.h 2003-11-21 03:51:05.000000000 +0300 -@@ -23,4 +23,8 @@ - - #endif - -+/* Defined for extended attributes */ -+#define ENOATTR ENODATA /* No such attribute */ -+#define ENOTSUP EOPNOTSUPP /* Operation not supported */ ++ Copyright (C) 2001 by Andreas Gruenbacher ++ Copyright (C) 2001 SGI - Silicon Graphics, Inc ++ */ ++#include ++#include ++#include ++#include ++#include ++#include ++#include + - #endif -Index: linux-2.4.19-pre1/include/linux/ext2_fs.h -=================================================================== ---- linux-2.4.19-pre1.orig/include/linux/ext2_fs.h 2001-11-22 22:46:52.000000000 +0300 -+++ linux-2.4.19-pre1/include/linux/ext2_fs.h 2003-11-21 03:51:05.000000000 +0300 -@@ -57,8 +57,6 @@ - */ - #define EXT2_BAD_INO 1 /* Bad blocks inode */ - #define EXT2_ROOT_INO 2 /* Root inode */ --#define EXT2_ACL_IDX_INO 3 /* ACL inode */ --#define EXT2_ACL_DATA_INO 4 /* ACL inode */ - #define EXT2_BOOT_LOADER_INO 5 /* Boot loader inode */ - #define EXT2_UNDEL_DIR_INO 6 /* Undelete directory inode */ - -@@ -86,7 +84,6 @@ - #else - # define EXT2_BLOCK_SIZE(s) (EXT2_MIN_BLOCK_SIZE << (s)->s_log_block_size) - #endif --#define EXT2_ACLE_PER_BLOCK(s) (EXT2_BLOCK_SIZE(s) / sizeof (struct ext2_acl_entry)) - #define EXT2_ADDR_PER_BLOCK(s) (EXT2_BLOCK_SIZE(s) / sizeof (__u32)) - #ifdef __KERNEL__ - # define EXT2_BLOCK_SIZE_BITS(s) ((s)->s_blocksize_bits) -@@ -121,28 +118,6 @@ - #endif - - /* -- * ACL structures -- */ --struct ext2_acl_header /* Header of Access Control Lists */ --{ -- __u32 aclh_size; -- __u32 aclh_file_count; -- __u32 aclh_acle_count; -- __u32 aclh_first_acle; --}; -- --struct ext2_acl_entry /* Access Control List Entry */ --{ -- __u32 acle_size; -- __u16 acle_perms; /* Access permissions */ -- __u16 acle_type; /* Type of entry */ -- __u16 acle_tag; /* User or group identity */ -- __u16 acle_pad1; -- __u32 acle_next; /* Pointer on next entry for the */ -- /* same inode or on next free entry */ --}; -- --/* - * Structure of a blocks group descriptor - */ - struct ext2_group_desc -@@ -314,6 +289,7 @@ - #define EXT2_MOUNT_ERRORS_PANIC 0x0040 /* Panic on errors */ - #define EXT2_MOUNT_MINIX_DF 0x0080 /* Mimics the Minix statfs */ - #define EXT2_MOUNT_NO_UID32 0x0200 /* Disable 32-bit UIDs */ -+#define EXT2_MOUNT_XATTR_USER 0x4000 /* Extended user attributes */ - - #define clear_opt(o, opt) o &= ~EXT2_MOUNT_##opt - #define set_opt(o, opt) o |= EXT2_MOUNT_##opt -@@ -397,6 +373,7 @@ - - #ifdef __KERNEL__ - #define EXT2_SB(sb) (&((sb)->u.ext2_sb)) -+#define EXT2_I(inode) (&((inode)->u.ext2_i)) - #else - /* Assume that user mode programs are passing in an ext2fs superblock, not - * a kernel struct super_block. This will allow us to call the feature-test -@@ -466,7 +443,7 @@ - #define EXT3_FEATURE_INCOMPAT_JOURNAL_DEV 0x0008 - #define EXT2_FEATURE_INCOMPAT_ANY 0xffffffff - --#define EXT2_FEATURE_COMPAT_SUPP 0 -+#define EXT2_FEATURE_COMPAT_SUPP EXT2_FEATURE_COMPAT_EXT_ATTR - #define EXT2_FEATURE_INCOMPAT_SUPP EXT2_FEATURE_INCOMPAT_FILETYPE - #define EXT2_FEATURE_RO_COMPAT_SUPP (EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER| \ - EXT2_FEATURE_RO_COMPAT_LARGE_FILE| \ -@@ -623,8 +600,10 @@ - - /* namei.c */ - extern struct inode_operations ext2_dir_inode_operations; -+extern struct inode_operations ext2_special_inode_operations; - - /* symlink.c */ -+extern struct inode_operations ext2_symlink_inode_operations; - extern struct inode_operations ext2_fast_symlink_inode_operations; - - #endif /* __KERNEL__ */ -Index: linux-2.4.19-pre1/include/linux/ext2_xattr.h -=================================================================== ---- linux-2.4.19-pre1.orig/include/linux/ext2_xattr.h 2003-11-21 03:51:05.000000000 +0300 -+++ linux-2.4.19-pre1/include/linux/ext2_xattr.h 2003-11-21 03:51:05.000000000 +0300 -@@ -0,0 +1,157 @@ +/* -+ File: linux/ext2_xattr.h ++ * Extended attribute memory allocation wrappers, originally ++ * based on the Intermezzo PRESTO_ALLOC/PRESTO_FREE macros. ++ * The vmalloc use here is very uncommon - extended attributes ++ * are supposed to be small chunks of metadata, and it is quite ++ * unusual to have very many extended attributes, so lists tend ++ * to be quite short as well. The 64K upper limit is derived ++ * from the extended attribute size limit used by XFS. ++ * Intentionally allow zero @size for value/list size requests. ++ */ ++static void * ++xattr_alloc(size_t size, size_t limit) ++{ ++ void *ptr; + -+ On-disk format of extended attributes for the ext2 filesystem. ++ if (size > limit) ++ return ERR_PTR(-E2BIG); + -+ (C) 2001 Andreas Gruenbacher, -+*/ ++ if (!size) /* size request, no buffer is needed */ ++ return NULL; ++ else if (size <= PAGE_SIZE) ++ ptr = kmalloc((unsigned long) size, GFP_KERNEL); ++ else ++ ptr = vmalloc((unsigned long) size); ++ if (!ptr) ++ return ERR_PTR(-ENOMEM); ++ return ptr; ++} + -+#include -+#include -+#include ++static void ++xattr_free(void *ptr, size_t size) ++{ ++ if (!size) /* size request, no buffer was needed */ ++ return; ++ else if (size <= PAGE_SIZE) ++ kfree(ptr); ++ else ++ vfree(ptr); ++} + -+/* Magic value in attribute blocks */ -+#define EXT2_XATTR_MAGIC 0xEA020000 ++/* ++ * Extended attribute SET operations ++ */ ++static long ++setxattr(struct dentry *d, char *name, void *value, size_t size, int flags) ++{ ++ int error; ++ void *kvalue; ++ char kname[XATTR_NAME_MAX + 1]; + -+/* Maximum number of references to one attribute block */ -+#define EXT2_XATTR_REFCOUNT_MAX 1024 ++ if (flags & ~(XATTR_CREATE|XATTR_REPLACE)) ++ return -EINVAL; + -+/* Name indexes */ -+#define EXT2_XATTR_INDEX_MAX 10 -+#define EXT2_XATTR_INDEX_USER 1 -+#define EXT2_XATTR_INDEX_POSIX_ACL_ACCESS 2 -+#define EXT2_XATTR_INDEX_POSIX_ACL_DEFAULT 3 ++ error = strncpy_from_user(kname, name, sizeof(kname)); ++ if (error == 0 || error == sizeof(kname)) ++ error = -ERANGE; ++ if (error < 0) ++ return error; + -+struct ext2_xattr_header { -+ __u32 h_magic; /* magic number for identification */ -+ __u32 h_refcount; /* reference count */ -+ __u32 h_blocks; /* number of disk blocks used */ -+ __u32 h_hash; /* hash value of all attributes */ -+ __u32 h_reserved[4]; /* zero right now */ -+}; ++ kvalue = xattr_alloc(size, XATTR_SIZE_MAX); ++ if (IS_ERR(kvalue)) ++ return PTR_ERR(kvalue); + -+struct ext2_xattr_entry { -+ __u8 e_name_len; /* length of name */ -+ __u8 e_name_index; /* attribute name index */ -+ __u16 e_value_offs; /* offset in disk block of value */ -+ __u32 e_value_block; /* disk block attribute is stored on (n/i) */ -+ __u32 e_value_size; /* size of attribute value */ -+ __u32 e_hash; /* hash value of name and value */ -+ char e_name[0]; /* attribute name */ -+}; ++ if (size > 0 && copy_from_user(kvalue, value, size)) { ++ xattr_free(kvalue, size); ++ return -EFAULT; ++ } + -+#define EXT2_XATTR_PAD_BITS 2 -+#define EXT2_XATTR_PAD (1<e_name_len)) ) -+#define EXT2_XATTR_SIZE(size) \ -+ (((size) + EXT2_XATTR_ROUND) & ~EXT2_XATTR_ROUND) ++ error = -EOPNOTSUPP; ++ if (d->d_inode->i_op && d->d_inode->i_op->setxattr) { ++ down(&d->d_inode->i_sem); ++ lock_kernel(); ++ error = d->d_inode->i_op->setxattr(d, kname, kvalue, size, flags); ++ unlock_kernel(); ++ up(&d->d_inode->i_sem); ++ } + -+#ifdef __KERNEL__ ++ xattr_free(kvalue, size); ++ return error; ++} + -+# ifdef CONFIG_EXT2_FS_XATTR ++asmlinkage long ++sys_setxattr(char *path, char *name, void *value, size_t size, int flags) ++{ ++ struct nameidata nd; ++ int error; ++ ++ error = user_path_walk(path, &nd); ++ if (error) ++ return error; ++ error = setxattr(nd.dentry, name, value, size, flags); ++ path_release(&nd); ++ return error; ++} ++ ++asmlinkage long ++sys_lsetxattr(char *path, char *name, void *value, size_t size, int flags) ++{ ++ struct nameidata nd; ++ int error; ++ ++ error = user_path_walk_link(path, &nd); ++ if (error) ++ return error; ++ error = setxattr(nd.dentry, name, value, size, flags); ++ path_release(&nd); ++ return error; ++} ++ ++asmlinkage long ++sys_fsetxattr(int fd, char *name, void *value, size_t size, int flags) ++{ ++ struct file *f; ++ int error = -EBADF; ++ ++ f = fget(fd); ++ if (!f) ++ return error; ++ error = setxattr(f->f_dentry, name, value, size, flags); ++ fput(f); ++ return error; ++} ++ ++/* ++ * Extended attribute GET operations ++ */ ++static ssize_t ++getxattr(struct dentry *d, char *name, void *value, size_t size) ++{ ++ ssize_t error; ++ void *kvalue; ++ char kname[XATTR_NAME_MAX + 1]; ++ ++ error = strncpy_from_user(kname, name, sizeof(kname)); ++ if (error == 0 || error == sizeof(kname)) ++ error = -ERANGE; ++ if (error < 0) ++ return error; ++ ++ kvalue = xattr_alloc(size, XATTR_SIZE_MAX); ++ if (IS_ERR(kvalue)) ++ return PTR_ERR(kvalue); ++ ++ error = -EOPNOTSUPP; ++ if (d->d_inode->i_op && d->d_inode->i_op->getxattr) { ++ down(&d->d_inode->i_sem); ++ lock_kernel(); ++ error = d->d_inode->i_op->getxattr(d, kname, kvalue, size); ++ unlock_kernel(); ++ up(&d->d_inode->i_sem); ++ } ++ ++ if (kvalue && error > 0) ++ if (copy_to_user(value, kvalue, error)) ++ error = -EFAULT; ++ xattr_free(kvalue, size); ++ return error; ++} ++ ++asmlinkage ssize_t ++sys_getxattr(char *path, char *name, void *value, size_t size) ++{ ++ struct nameidata nd; ++ ssize_t error; ++ ++ error = user_path_walk(path, &nd); ++ if (error) ++ return error; ++ error = getxattr(nd.dentry, name, value, size); ++ path_release(&nd); ++ return error; ++} ++ ++asmlinkage ssize_t ++sys_lgetxattr(char *path, char *name, void *value, size_t size) ++{ ++ struct nameidata nd; ++ ssize_t error; ++ ++ error = user_path_walk_link(path, &nd); ++ if (error) ++ return error; ++ error = getxattr(nd.dentry, name, value, size); ++ path_release(&nd); ++ return error; ++} ++ ++asmlinkage ssize_t ++sys_fgetxattr(int fd, char *name, void *value, size_t size) ++{ ++ struct file *f; ++ ssize_t error = -EBADF; ++ ++ f = fget(fd); ++ if (!f) ++ return error; ++ error = getxattr(f->f_dentry, name, value, size); ++ fput(f); ++ return error; ++} ++ ++/* ++ * Extended attribute LIST operations ++ */ ++static ssize_t ++listxattr(struct dentry *d, char *list, size_t size) ++{ ++ ssize_t error; ++ char *klist; ++ ++ klist = (char *)xattr_alloc(size, XATTR_LIST_MAX); ++ if (IS_ERR(klist)) ++ return PTR_ERR(klist); ++ ++ error = -EOPNOTSUPP; ++ if (d->d_inode->i_op && d->d_inode->i_op->listxattr) { ++ down(&d->d_inode->i_sem); ++ lock_kernel(); ++ error = d->d_inode->i_op->listxattr(d, klist, size); ++ unlock_kernel(); ++ up(&d->d_inode->i_sem); ++ } ++ ++ if (klist && error > 0) ++ if (copy_to_user(list, klist, error)) ++ error = -EFAULT; ++ xattr_free(klist, size); ++ return error; ++} ++ ++asmlinkage ssize_t ++sys_listxattr(char *path, char *list, size_t size) ++{ ++ struct nameidata nd; ++ ssize_t error; ++ ++ error = user_path_walk(path, &nd); ++ if (error) ++ return error; ++ error = listxattr(nd.dentry, list, size); ++ path_release(&nd); ++ return error; ++} ++ ++asmlinkage ssize_t ++sys_llistxattr(char *path, char *list, size_t size) ++{ ++ struct nameidata nd; ++ ssize_t error; ++ ++ error = user_path_walk_link(path, &nd); ++ if (error) ++ return error; ++ error = listxattr(nd.dentry, list, size); ++ path_release(&nd); ++ return error; ++} ++ ++asmlinkage ssize_t ++sys_flistxattr(int fd, char *list, size_t size) ++{ ++ struct file *f; ++ ssize_t error = -EBADF; ++ ++ f = fget(fd); ++ if (!f) ++ return error; ++ error = listxattr(f->f_dentry, list, size); ++ fput(f); ++ return error; ++} ++ ++/* ++ * Extended attribute REMOVE operations ++ */ ++static long ++removexattr(struct dentry *d, char *name) ++{ ++ int error; ++ char kname[XATTR_NAME_MAX + 1]; ++ ++ error = strncpy_from_user(kname, name, sizeof(kname)); ++ if (error == 0 || error == sizeof(kname)) ++ error = -ERANGE; ++ if (error < 0) ++ return error; ++ ++ error = -EOPNOTSUPP; ++ if (d->d_inode->i_op && d->d_inode->i_op->removexattr) { ++ down(&d->d_inode->i_sem); ++ lock_kernel(); ++ error = d->d_inode->i_op->removexattr(d, kname); ++ unlock_kernel(); ++ up(&d->d_inode->i_sem); ++ } ++ return error; ++} ++ ++asmlinkage long ++sys_removexattr(char *path, char *name) ++{ ++ struct nameidata nd; ++ int error; ++ ++ error = user_path_walk(path, &nd); ++ if (error) ++ return error; ++ error = removexattr(nd.dentry, name); ++ path_release(&nd); ++ return error; ++} ++ ++asmlinkage long ++sys_lremovexattr(char *path, char *name) ++{ ++ struct nameidata nd; ++ int error; ++ ++ error = user_path_walk_link(path, &nd); ++ if (error) ++ return error; ++ error = removexattr(nd.dentry, name); ++ path_release(&nd); ++ return error; ++} ++ ++asmlinkage long ++sys_fremovexattr(int fd, char *name) ++{ ++ struct file *f; ++ int error = -EBADF; ++ ++ f = fget(fd); ++ if (!f) ++ return error; ++ error = removexattr(f->f_dentry, name); ++ fput(f); ++ return error; ++} +Index: linux-2.4.19-pre1/include/asm-arm/unistd.h +=================================================================== +--- linux-2.4.19-pre1.orig/include/asm-arm/unistd.h 2001-08-12 22:14:00.000000000 +0400 ++++ linux-2.4.19-pre1/include/asm-arm/unistd.h 2004-01-14 01:11:49.000000000 +0300 +@@ -240,6 +240,18 @@ + #define __NR_mincore (__NR_SYSCALL_BASE+219) + #define __NR_madvise (__NR_SYSCALL_BASE+220) + #define __NR_fcntl64 (__NR_SYSCALL_BASE+221) ++#define __NR_setxattr (__NR_SYSCALL_BASE+226) ++#define __NR_lsetxattr (__NR_SYSCALL_BASE+227) ++#define __NR_fsetxattr (__NR_SYSCALL_BASE+228) ++#define __NR_getxattr (__NR_SYSCALL_BASE+229) ++#define __NR_lgetxattr (__NR_SYSCALL_BASE+230) ++#define __NR_fgetxattr (__NR_SYSCALL_BASE+231) ++#define __NR_listxattr (__NR_SYSCALL_BASE+232) ++#define __NR_llistxattr (__NR_SYSCALL_BASE+233) ++#define __NR_flistxattr (__NR_SYSCALL_BASE+234) ++#define __NR_removexattr (__NR_SYSCALL_BASE+235) ++#define __NR_lremovexattr (__NR_SYSCALL_BASE+236) ++#define __NR_fremovexattr (__NR_SYSCALL_BASE+237) + + /* + * The following SWIs are ARM private. +Index: linux-2.4.19-pre1/include/asm-ia64/unistd.h +=================================================================== +--- linux-2.4.19-pre1.orig/include/asm-ia64/unistd.h 2001-11-10 01:26:17.000000000 +0300 ++++ linux-2.4.19-pre1/include/asm-ia64/unistd.h 2004-01-14 01:11:49.000000000 +0300 +@@ -206,6 +206,18 @@ + #define __NR_getdents64 1214 + #define __NR_getunwind 1215 + #define __NR_readahead 1216 ++#define __NR_setxattr 1217 ++#define __NR_lsetxattr 1218 ++#define __NR_fsetxattr 1219 ++#define __NR_getxattr 1220 ++#define __NR_lgetxattr 1221 ++#define __NR_fgetxattr 1222 ++#define __NR_listxattr 1223 ++#define __NR_llistxattr 1224 ++#define __NR_flistxattr 1225 ++#define __NR_removexattr 1226 ++#define __NR_lremovexattr 1227 ++#define __NR_fremovexattr 1228 + + #if !defined(__ASSEMBLY__) && !defined(ASSEMBLER) + +Index: linux-2.4.19-pre1/include/asm-s390/unistd.h +=================================================================== +--- linux-2.4.19-pre1.orig/include/asm-s390/unistd.h 2001-10-11 20:43:38.000000000 +0400 ++++ linux-2.4.19-pre1/include/asm-s390/unistd.h 2004-01-14 01:11:49.000000000 +0300 +@@ -211,6 +211,18 @@ + #define __NR_mincore 218 + #define __NR_madvise 219 + #define __NR_getdents64 220 ++#define __NR_setxattr 224 ++#define __NR_lsetxattr 225 ++#define __NR_fsetxattr 226 ++#define __NR_getxattr 227 ++#define __NR_lgetxattr 228 ++#define __NR_fgetxattr 229 ++#define __NR_listxattr 230 ++#define __NR_llistxattr 231 ++#define __NR_flistxattr 232 ++#define __NR_removexattr 233 ++#define __NR_lremovexattr 234 ++#define __NR_fremovexattr 235 + + + /* user-visible error numbers are in the range -1 - -122: see */ +Index: linux-2.4.19-pre1/include/asm-s390x/unistd.h +=================================================================== +--- linux-2.4.19-pre1.orig/include/asm-s390x/unistd.h 2001-10-11 20:43:38.000000000 +0400 ++++ linux-2.4.19-pre1/include/asm-s390x/unistd.h 2004-01-14 01:11:49.000000000 +0300 +@@ -181,6 +181,18 @@ + #define __NR_mincore 218 + #define __NR_madvise 219 + #define __NR_getdents64 220 ++#define __NR_setxattr 224 ++#define __NR_lsetxattr 225 ++#define __NR_fsetxattr 226 ++#define __NR_getxattr 227 ++#define __NR_lgetxattr 228 ++#define __NR_fgetxattr 229 ++#define __NR_listxattr 230 ++#define __NR_llistxattr 231 ++#define __NR_flistxattr 232 ++#define __NR_removexattr 233 ++#define __NR_lremovexattr 234 ++#define __NR_fremovexattr 235 + + + /* user-visible error numbers are in the range -1 - -122: see */ +Index: linux-2.4.19-pre1/include/asm-sparc/unistd.h +=================================================================== +--- linux-2.4.19-pre1.orig/include/asm-sparc/unistd.h 2001-10-21 21:36:54.000000000 +0400 ++++ linux-2.4.19-pre1/include/asm-sparc/unistd.h 2004-01-14 01:11:49.000000000 +0300 +@@ -184,24 +184,24 @@ + /* #define __NR_exportfs 166 SunOS Specific */ + #define __NR_mount 167 /* Common */ + #define __NR_ustat 168 /* Common */ +-/* #define __NR_semsys 169 SunOS Specific */ +-/* #define __NR_msgsys 170 SunOS Specific */ +-/* #define __NR_shmsys 171 SunOS Specific */ +-/* #define __NR_auditsys 172 SunOS Specific */ +-/* #define __NR_rfssys 173 SunOS Specific */ ++#define __NR_setxattr 169 /* SunOS: semsys */ ++#define __NR_lsetxattr 170 /* SunOS: msgsys */ ++#define __NR_fsetxattr 171 /* SunOS: shmsys */ ++#define __NR_getxattr 172 /* SunOS: auditsys */ ++#define __NR_lgetxattr 173 /* SunOS: rfssys */ + #define __NR_getdents 174 /* Common */ + #define __NR_setsid 175 /* Common */ + #define __NR_fchdir 176 /* Common */ +-/* #define __NR_fchroot 177 SunOS Specific */ +-/* #define __NR_vpixsys 178 SunOS Specific */ +-/* #define __NR_aioread 179 SunOS Specific */ +-/* #define __NR_aiowrite 180 SunOS Specific */ +-/* #define __NR_aiowait 181 SunOS Specific */ +-/* #define __NR_aiocancel 182 SunOS Specific */ ++#define __NR_fgetxattr 177 /* SunOS: fchroot */ ++#define __NR_listxattr 178 /* SunOS: vpixsys */ ++#define __NR_llistxattr 179 /* SunOS: aioread */ ++#define __NR_flistxattr 180 /* SunOS: aiowrite */ ++#define __NR_removexattr 181 /* SunOS: aiowait */ ++#define __NR_lremovexattr 182 /* SunOS: aiocancel */ + #define __NR_sigpending 183 /* Common */ + #define __NR_query_module 184 /* Linux Specific */ + #define __NR_setpgid 185 /* Common */ +-/* #define __NR_pathconf 186 SunOS Specific */ ++#define __NR_fremovexattr 186 /* SunOS: pathconf */ + /* #define __NR_fpathconf 187 SunOS Specific */ + /* #define __NR_sysconf 188 SunOS Specific */ + #define __NR_uname 189 /* Linux Specific */ +Index: linux-2.4.19-pre1/include/asm-sparc64/unistd.h +=================================================================== +--- linux-2.4.19-pre1.orig/include/asm-sparc64/unistd.h 2001-10-21 21:36:54.000000000 +0400 ++++ linux-2.4.19-pre1/include/asm-sparc64/unistd.h 2004-01-14 01:11:49.000000000 +0300 +@@ -184,24 +184,24 @@ + /* #define __NR_exportfs 166 SunOS Specific */ + #define __NR_mount 167 /* Common */ + #define __NR_ustat 168 /* Common */ +-/* #define __NR_semsys 169 SunOS Specific */ +-/* #define __NR_msgsys 170 SunOS Specific */ +-/* #define __NR_shmsys 171 SunOS Specific */ +-/* #define __NR_auditsys 172 SunOS Specific */ +-/* #define __NR_rfssys 173 SunOS Specific */ ++#define __NR_setxattr 169 /* SunOS: semsys */ ++#define __NR_lsetxattr 170 /* SunOS: msgsys */ ++#define __NR_fsetxattr 171 /* SunOS: shmsys */ ++#define __NR_getxattr 172 /* SunOS: auditsys */ ++#define __NR_lgetxattr 173 /* SunOS: rfssys */ + #define __NR_getdents 174 /* Common */ + #define __NR_setsid 175 /* Common */ + #define __NR_fchdir 176 /* Common */ +-/* #define __NR_fchroot 177 SunOS Specific */ +-/* #define __NR_vpixsys 178 SunOS Specific */ +-/* #define __NR_aioread 179 SunOS Specific */ +-/* #define __NR_aiowrite 180 SunOS Specific */ +-/* #define __NR_aiowait 181 SunOS Specific */ +-/* #define __NR_aiocancel 182 SunOS Specific */ ++#define __NR_fgetxattr 177 /* SunOS: fchroot */ ++#define __NR_listxattr 178 /* SunOS: vpixsys */ ++#define __NR_llistxattr 179 /* SunOS: aioread */ ++#define __NR_flistxattr 180 /* SunOS: aiowrite */ ++#define __NR_removexattr 181 /* SunOS: aiowait */ ++#define __NR_lremovexattr 182 /* SunOS: aiocancel */ + #define __NR_sigpending 183 /* Common */ + #define __NR_query_module 184 /* Linux Specific */ + #define __NR_setpgid 185 /* Common */ +-/* #define __NR_pathconf 186 SunOS Specific */ ++#define __NR_fremovexattr 186 /* SunOS: pathconf */ + /* #define __NR_fpathconf 187 SunOS Specific */ + /* #define __NR_sysconf 188 SunOS Specific */ + #define __NR_uname 189 /* Linux Specific */ +Index: linux-2.4.19-pre1/include/linux/cache_def.h +=================================================================== +--- linux-2.4.19-pre1.orig/include/linux/cache_def.h 2003-01-30 13:24:37.000000000 +0300 ++++ linux-2.4.19-pre1/include/linux/cache_def.h 2004-01-14 01:11:49.000000000 +0300 +@@ -0,0 +1,15 @@ ++/* ++ * linux/cache_def.h ++ * Handling of caches defined in drivers, filesystems, ... ++ * ++ * Copyright (C) 2002 by Andreas Gruenbacher, ++ */ + -+struct ext2_xattr_handler { -+ char *prefix; -+ size_t (*list)(char *list, struct inode *inode, const char *name, -+ int name_len); -+ int (*get)(struct inode *inode, const char *name, void *buffer, -+ size_t size); -+ int (*set)(struct inode *inode, const char *name, const void *buffer, -+ size_t size, int flags); ++struct cache_definition { ++ const char *name; ++ void (*shrink)(int, unsigned int); ++ struct list_head link; +}; + -+extern int ext2_xattr_register(int, struct ext2_xattr_handler *); -+extern void ext2_xattr_unregister(int, struct ext2_xattr_handler *); -+ -+extern int ext2_setxattr(struct dentry *, const char *, const void *, size_t, int); -+extern ssize_t ext2_getxattr(struct dentry *, const char *, void *, size_t); -+extern ssize_t ext2_listxattr(struct dentry *, char *, size_t); -+extern int ext2_removexattr(struct dentry *, const char *); -+ -+extern int ext2_xattr_get(struct inode *, int, const char *, void *, size_t); -+extern int ext2_xattr_list(struct inode *, char *, size_t); -+extern int ext2_xattr_set(struct inode *, int, const char *, const void *, size_t, int); -+ -+extern void ext2_xattr_delete_inode(struct inode *); -+extern void ext2_xattr_put_super(struct super_block *); -+ -+extern int init_ext2_xattr(void) __init; -+extern void exit_ext2_xattr(void); -+ -+# else /* CONFIG_EXT2_FS_XATTR */ -+# define ext2_setxattr NULL -+# define ext2_getxattr NULL -+# define ext2_listxattr NULL -+# define ext2_removexattr NULL -+ -+static inline int -+ext2_xattr_get(struct inode *inode, int name_index, -+ const char *name, void *buffer, size_t size) -+{ -+ return -ENOTSUP; -+} -+ -+static inline int -+ext2_xattr_list(struct inode *inode, char *buffer, size_t size) -+{ -+ return -ENOTSUP; -+} -+ -+static inline int -+ext2_xattr_set(struct inode *inode, int name_index, const char *name, -+ const void *value, size_t size, int flags) -+{ -+ return -ENOTSUP; -+} -+ -+static inline void -+ext2_xattr_delete_inode(struct inode *inode) -+{ -+} -+ -+static inline void -+ext2_xattr_put_super(struct super_block *sb) -+{ -+} -+ -+static inline int -+init_ext2_xattr(void) -+{ -+ return 0; -+} -+ -+static inline void -+exit_ext2_xattr(void) -+{ -+} -+ -+# endif /* CONFIG_EXT2_FS_XATTR */ -+ -+# ifdef CONFIG_EXT2_FS_XATTR_USER -+ -+extern int init_ext2_xattr_user(void) __init; -+extern void exit_ext2_xattr_user(void); -+ -+# else /* CONFIG_EXT2_FS_XATTR_USER */ -+ -+static inline int -+init_ext2_xattr_user(void) -+{ -+ return 0; -+} -+ -+static inline void -+exit_ext2_xattr_user(void) -+{ -+} -+ -+# endif /* CONFIG_EXT2_FS_XATTR_USER */ -+ -+#endif /* __KERNEL__ */ ++extern void register_cache(struct cache_definition *); ++extern void unregister_cache(struct cache_definition *); +Index: linux-2.4.19-pre1/include/linux/errno.h +=================================================================== +--- linux-2.4.19-pre1.orig/include/linux/errno.h 2001-02-10 01:46:13.000000000 +0300 ++++ linux-2.4.19-pre1/include/linux/errno.h 2004-01-14 01:11:49.000000000 +0300 +@@ -23,4 +23,8 @@ + + #endif + ++/* Defined for extended attributes */ ++#define ENOATTR ENODATA /* No such attribute */ ++#define ENOTSUP EOPNOTSUPP /* Operation not supported */ + -Index: linux-2.4.19-pre1/include/linux/ext3_fs.h + #endif +Index: linux-2.4.19-pre1/include/linux/ext2_fs.h =================================================================== ---- linux-2.4.19-pre1.orig/include/linux/ext3_fs.h 2003-11-21 03:51:02.000000000 +0300 -+++ linux-2.4.19-pre1/include/linux/ext3_fs.h 2003-11-21 03:51:05.000000000 +0300 -@@ -63,8 +63,6 @@ +--- linux-2.4.19-pre1.orig/include/linux/ext2_fs.h 2001-11-22 22:46:52.000000000 +0300 ++++ linux-2.4.19-pre1/include/linux/ext2_fs.h 2004-01-14 01:18:00.000000000 +0300 +@@ -57,8 +57,6 @@ */ - #define EXT3_BAD_INO 1 /* Bad blocks inode */ - #define EXT3_ROOT_INO 2 /* Root inode */ --#define EXT3_ACL_IDX_INO 3 /* ACL inode */ --#define EXT3_ACL_DATA_INO 4 /* ACL inode */ - #define EXT3_BOOT_LOADER_INO 5 /* Boot loader inode */ - #define EXT3_UNDEL_DIR_INO 6 /* Undelete directory inode */ - #define EXT3_RESIZE_INO 7 /* Reserved group descriptors inode */ -@@ -94,7 +92,6 @@ + #define EXT2_BAD_INO 1 /* Bad blocks inode */ + #define EXT2_ROOT_INO 2 /* Root inode */ +-#define EXT2_ACL_IDX_INO 3 /* ACL inode */ +-#define EXT2_ACL_DATA_INO 4 /* ACL inode */ + #define EXT2_BOOT_LOADER_INO 5 /* Boot loader inode */ + #define EXT2_UNDEL_DIR_INO 6 /* Undelete directory inode */ + +@@ -86,7 +84,6 @@ #else - # define EXT3_BLOCK_SIZE(s) (EXT3_MIN_BLOCK_SIZE << (s)->s_log_block_size) + # define EXT2_BLOCK_SIZE(s) (EXT2_MIN_BLOCK_SIZE << (s)->s_log_block_size) #endif --#define EXT3_ACLE_PER_BLOCK(s) (EXT3_BLOCK_SIZE(s) / sizeof (struct ext3_acl_entry)) - #define EXT3_ADDR_PER_BLOCK(s) (EXT3_BLOCK_SIZE(s) / sizeof (__u32)) +-#define EXT2_ACLE_PER_BLOCK(s) (EXT2_BLOCK_SIZE(s) / sizeof (struct ext2_acl_entry)) + #define EXT2_ADDR_PER_BLOCK(s) (EXT2_BLOCK_SIZE(s) / sizeof (__u32)) #ifdef __KERNEL__ - # define EXT3_BLOCK_SIZE_BITS(s) ((s)->s_blocksize_bits) -@@ -129,28 +126,6 @@ + # define EXT2_BLOCK_SIZE_BITS(s) ((s)->s_blocksize_bits) +@@ -121,28 +118,6 @@ #endif /* - * ACL structures - */ --struct ext3_acl_header /* Header of Access Control Lists */ +-struct ext2_acl_header /* Header of Access Control Lists */ -{ - __u32 aclh_size; - __u32 aclh_file_count; @@ -5175,7 +5340,7 @@ Index: linux-2.4.19-pre1/include/linux/ext3_fs.h - __u32 aclh_first_acle; -}; - --struct ext3_acl_entry /* Access Control List Entry */ +-struct ext2_acl_entry /* Access Control List Entry */ -{ - __u32 acle_size; - __u16 acle_perms; /* Access permissions */ @@ -5189,77 +5354,52 @@ Index: linux-2.4.19-pre1/include/linux/ext3_fs.h -/* * Structure of a blocks group descriptor */ - struct ext3_group_desc -@@ -344,6 +319,7 @@ - #define EXT3_MOUNT_WRITEBACK_DATA 0x0C00 /* No data ordering */ - #define EXT3_MOUNT_UPDATE_JOURNAL 0x1000 /* Update the journal format */ - #define EXT3_MOUNT_NO_UID32 0x2000 /* Disable 32-bit UIDs */ -+#define EXT3_MOUNT_XATTR_USER 0x4000 /* Extended user attributes */ - - /* Compatibility, for having both ext2_fs.h and ext3_fs.h included at once */ - #ifndef _LINUX_EXT2_FS_H -@@ -520,7 +496,7 @@ - #define EXT3_FEATURE_INCOMPAT_RECOVER 0x0004 /* Needs recovery */ - #define EXT3_FEATURE_INCOMPAT_JOURNAL_DEV 0x0008 /* Journal device */ + struct ext2_group_desc +@@ -314,6 +289,7 @@ + #define EXT2_MOUNT_ERRORS_PANIC 0x0040 /* Panic on errors */ + #define EXT2_MOUNT_MINIX_DF 0x0080 /* Mimics the Minix statfs */ + #define EXT2_MOUNT_NO_UID32 0x0200 /* Disable 32-bit UIDs */ ++#define EXT2_MOUNT_XATTR_USER 0x4000 /* Extended user attributes */ --#define EXT3_FEATURE_COMPAT_SUPP 0 -+#define EXT3_FEATURE_COMPAT_SUPP EXT2_FEATURE_COMPAT_EXT_ATTR - #define EXT3_FEATURE_INCOMPAT_SUPP (EXT3_FEATURE_INCOMPAT_FILETYPE| \ - EXT3_FEATURE_INCOMPAT_RECOVER) - #define EXT3_FEATURE_RO_COMPAT_SUPP (EXT3_FEATURE_RO_COMPAT_SPARSE_SUPER| \ -@@ -703,6 +679,7 @@ - extern unsigned long ext3_count_free (struct buffer_head *, unsigned); + #define clear_opt(o, opt) o &= ~EXT2_MOUNT_##opt + #define set_opt(o, opt) o |= EXT2_MOUNT_##opt +@@ -397,6 +373,7 @@ - /* inode.c */ -+extern int ext3_forget(handle_t *, int, struct inode *, struct buffer_head *, int); - extern struct buffer_head * ext3_getblk (handle_t *, struct inode *, long, int, int *); - extern struct buffer_head * ext3_bread (handle_t *, struct inode *, int, int, int *); + #ifdef __KERNEL__ + #define EXT2_SB(sb) (&((sb)->u.ext2_sb)) ++#define EXT2_I(inode) (&((inode)->u.ext2_i)) + #else + /* Assume that user mode programs are passing in an ext2fs superblock, not + * a kernel struct super_block. This will allow us to call the feature-test +@@ -466,7 +443,7 @@ + #define EXT3_FEATURE_INCOMPAT_JOURNAL_DEV 0x0008 + #define EXT2_FEATURE_INCOMPAT_ANY 0xffffffff -@@ -771,8 +748,10 @@ +-#define EXT2_FEATURE_COMPAT_SUPP 0 ++#define EXT2_FEATURE_COMPAT_SUPP EXT2_FEATURE_COMPAT_EXT_ATTR + #define EXT2_FEATURE_INCOMPAT_SUPP EXT2_FEATURE_INCOMPAT_FILETYPE + #define EXT2_FEATURE_RO_COMPAT_SUPP (EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER| \ + EXT2_FEATURE_RO_COMPAT_LARGE_FILE| \ +@@ -623,8 +600,10 @@ /* namei.c */ - extern struct inode_operations ext3_dir_inode_operations; -+extern struct inode_operations ext3_special_inode_operations; + extern struct inode_operations ext2_dir_inode_operations; ++extern struct inode_operations ext2_special_inode_operations; /* symlink.c */ -+extern struct inode_operations ext3_symlink_inode_operations; - extern struct inode_operations ext3_fast_symlink_inode_operations; - - -Index: linux-2.4.19-pre1/include/linux/ext3_jbd.h -=================================================================== ---- linux-2.4.19-pre1.orig/include/linux/ext3_jbd.h 2003-11-21 03:51:02.000000000 +0300 -+++ linux-2.4.19-pre1/include/linux/ext3_jbd.h 2003-11-21 03:51:05.000000000 +0300 -@@ -30,13 +30,19 @@ - - #define EXT3_SINGLEDATA_TRANS_BLOCKS 8 - -+/* Extended attributes may touch two data buffers, two bitmap buffers, -+ * and two group and summaries. */ -+ -+#define EXT3_XATTR_TRANS_BLOCKS 8 -+ - /* Define the minimum size for a transaction which modifies data. This - * needs to take into account the fact that we may end up modifying two - * quota files too (one for the group, one for the user quota). The - * superblock only gets updated once, of course, so don't bother - * counting that again for the quota updates. */ - --#define EXT3_DATA_TRANS_BLOCKS (3 * EXT3_SINGLEDATA_TRANS_BLOCKS - 2) -+#define EXT3_DATA_TRANS_BLOCKS (3 * EXT3_SINGLEDATA_TRANS_BLOCKS + \ -+ EXT3_XATTR_TRANS_BLOCKS - 2) - - extern int ext3_writepage_trans_blocks(struct inode *inode); ++extern struct inode_operations ext2_symlink_inode_operations; + extern struct inode_operations ext2_fast_symlink_inode_operations; -Index: linux-2.4.19-pre1/include/linux/ext3_xattr.h + #endif /* __KERNEL__ */ +Index: linux-2.4.19-pre1/include/linux/ext2_xattr.h =================================================================== ---- linux-2.4.19-pre1.orig/include/linux/ext3_xattr.h 2003-11-21 03:51:05.000000000 +0300 -+++ linux-2.4.19-pre1/include/linux/ext3_xattr.h 2003-11-21 03:51:05.000000000 +0300 +--- linux-2.4.19-pre1.orig/include/linux/ext2_xattr.h 2003-01-30 13:24:37.000000000 +0300 ++++ linux-2.4.19-pre1/include/linux/ext2_xattr.h 2004-01-14 01:18:01.000000000 +0300 @@ -0,0 +1,157 @@ +/* -+ File: linux/ext3_xattr.h ++ File: linux/ext2_xattr.h + -+ On-disk format of extended attributes for the ext3 filesystem. ++ On-disk format of extended attributes for the ext2 filesystem. + + (C) 2001 Andreas Gruenbacher, +*/ @@ -5269,18 +5409,18 @@ Index: linux-2.4.19-pre1/include/linux/ext3_xattr.h +#include + +/* Magic value in attribute blocks */ -+#define EXT3_XATTR_MAGIC 0xEA020000 ++#define EXT2_XATTR_MAGIC 0xEA020000 + +/* Maximum number of references to one attribute block */ -+#define EXT3_XATTR_REFCOUNT_MAX 1024 ++#define EXT2_XATTR_REFCOUNT_MAX 1024 + +/* Name indexes */ -+#define EXT3_XATTR_INDEX_MAX 10 -+#define EXT3_XATTR_INDEX_USER 1 -+#define EXT3_XATTR_INDEX_POSIX_ACL_ACCESS 2 -+#define EXT3_XATTR_INDEX_POSIX_ACL_DEFAULT 3 ++#define EXT2_XATTR_INDEX_MAX 10 ++#define EXT2_XATTR_INDEX_USER 1 ++#define EXT2_XATTR_INDEX_POSIX_ACL_ACCESS 2 ++#define EXT2_XATTR_INDEX_POSIX_ACL_DEFAULT 3 + -+struct ext3_xattr_header { ++struct ext2_xattr_header { + __u32 h_magic; /* magic number for identification */ + __u32 h_refcount; /* reference count */ + __u32 h_blocks; /* number of disk blocks used */ @@ -5288,7 +5428,7 @@ Index: linux-2.4.19-pre1/include/linux/ext3_xattr.h + __u32 h_reserved[4]; /* zero right now */ +}; + -+struct ext3_xattr_entry { ++struct ext2_xattr_entry { + __u8 e_name_len; /* length of name */ + __u8 e_name_index; /* attribute name index */ + __u16 e_value_offs; /* offset in disk block of value */ @@ -5298,23 +5438,23 @@ Index: linux-2.4.19-pre1/include/linux/ext3_xattr.h + char e_name[0]; /* attribute name */ +}; + -+#define EXT3_XATTR_PAD_BITS 2 -+#define EXT3_XATTR_PAD (1<e_name_len)) ) -+#define EXT3_XATTR_SIZE(size) \ -+ (((size) + EXT3_XATTR_ROUND) & ~EXT3_XATTR_ROUND) ++#define EXT2_XATTR_PAD_BITS 2 ++#define EXT2_XATTR_PAD (1<e_name_len)) ) ++#define EXT2_XATTR_SIZE(size) \ ++ (((size) + EXT2_XATTR_ROUND) & ~EXT2_XATTR_ROUND) + +#ifdef __KERNEL__ + -+# ifdef CONFIG_EXT3_FS_XATTR ++# ifdef CONFIG_EXT2_FS_XATTR + -+struct ext3_xattr_handler { ++struct ext2_xattr_handler { + char *prefix; + size_t (*list)(char *list, struct inode *inode, const char *name, + int name_len); @@ -5324,710 +5464,481 @@ Index: linux-2.4.19-pre1/include/linux/ext3_xattr.h + size_t size, int flags); +}; + -+extern int ext3_xattr_register(int, struct ext3_xattr_handler *); -+extern void ext3_xattr_unregister(int, struct ext3_xattr_handler *); ++extern int ext2_xattr_register(int, struct ext2_xattr_handler *); ++extern void ext2_xattr_unregister(int, struct ext2_xattr_handler *); + -+extern int ext3_setxattr(struct dentry *, const char *, const void *, size_t, int); -+extern ssize_t ext3_getxattr(struct dentry *, const char *, void *, size_t); -+extern ssize_t ext3_listxattr(struct dentry *, char *, size_t); -+extern int ext3_removexattr(struct dentry *, const char *); ++extern int ext2_setxattr(struct dentry *, const char *, const void *, size_t, int); ++extern ssize_t ext2_getxattr(struct dentry *, const char *, void *, size_t); ++extern ssize_t ext2_listxattr(struct dentry *, char *, size_t); ++extern int ext2_removexattr(struct dentry *, const char *); + -+extern int ext3_xattr_get(struct inode *, int, const char *, void *, size_t); -+extern int ext3_xattr_list(struct inode *, char *, size_t); -+extern int ext3_xattr_set(handle_t *handle, struct inode *, int, const char *, const void *, size_t, int); ++extern int ext2_xattr_get(struct inode *, int, const char *, void *, size_t); ++extern int ext2_xattr_list(struct inode *, char *, size_t); ++extern int ext2_xattr_set(struct inode *, int, const char *, const void *, size_t, int); + -+extern void ext3_xattr_delete_inode(handle_t *, struct inode *); -+extern void ext3_xattr_put_super(struct super_block *); ++extern void ext2_xattr_delete_inode(struct inode *); ++extern void ext2_xattr_put_super(struct super_block *); + -+extern int init_ext3_xattr(void) __init; -+extern void exit_ext3_xattr(void); ++extern int init_ext2_xattr(void) __init; ++extern void exit_ext2_xattr(void); + -+# else /* CONFIG_EXT3_FS_XATTR */ -+# define ext3_setxattr NULL -+# define ext3_getxattr NULL -+# define ext3_listxattr NULL -+# define ext3_removexattr NULL ++# else /* CONFIG_EXT2_FS_XATTR */ ++# define ext2_setxattr NULL ++# define ext2_getxattr NULL ++# define ext2_listxattr NULL ++# define ext2_removexattr NULL + +static inline int -+ext3_xattr_get(struct inode *inode, int name_index, const char *name, -+ void *buffer, size_t size) ++ext2_xattr_get(struct inode *inode, int name_index, ++ const char *name, void *buffer, size_t size) +{ + return -ENOTSUP; +} + +static inline int -+ext3_xattr_list(struct inode *inode, void *buffer, size_t size) ++ext2_xattr_list(struct inode *inode, char *buffer, size_t size) +{ + return -ENOTSUP; +} + +static inline int -+ext3_xattr_set(handle_t *handle, struct inode *inode, int name_index, -+ const char *name, const void *value, size_t size, int flags) ++ext2_xattr_set(struct inode *inode, int name_index, const char *name, ++ const void *value, size_t size, int flags) +{ + return -ENOTSUP; +} + +static inline void -+ext3_xattr_delete_inode(handle_t *handle, struct inode *inode) ++ext2_xattr_delete_inode(struct inode *inode) +{ +} + +static inline void -+ext3_xattr_put_super(struct super_block *sb) ++ext2_xattr_put_super(struct super_block *sb) +{ +} + +static inline int -+init_ext3_xattr(void) ++init_ext2_xattr(void) +{ + return 0; +} + +static inline void -+exit_ext3_xattr(void) ++exit_ext2_xattr(void) +{ +} + -+# endif /* CONFIG_EXT3_FS_XATTR */ ++# endif /* CONFIG_EXT2_FS_XATTR */ + -+# ifdef CONFIG_EXT3_FS_XATTR_USER ++# ifdef CONFIG_EXT2_FS_XATTR_USER + -+extern int init_ext3_xattr_user(void) __init; -+extern void exit_ext3_xattr_user(void); ++extern int init_ext2_xattr_user(void) __init; ++extern void exit_ext2_xattr_user(void); + -+# else /* CONFIG_EXT3_FS_XATTR_USER */ ++# else /* CONFIG_EXT2_FS_XATTR_USER */ + +static inline int -+init_ext3_xattr_user(void) ++init_ext2_xattr_user(void) +{ + return 0; +} + +static inline void -+exit_ext3_xattr_user(void) ++exit_ext2_xattr_user(void) +{ +} + -+#endif /* CONFIG_EXT3_FS_XATTR_USER */ ++# endif /* CONFIG_EXT2_FS_XATTR_USER */ + +#endif /* __KERNEL__ */ + -Index: linux-2.4.19-pre1/include/linux/fs.h +Index: linux-2.4.19-pre1/include/linux/ext3_fs.h =================================================================== ---- linux-2.4.19-pre1.orig/include/linux/fs.h 2003-11-21 03:51:00.000000000 +0300 -+++ linux-2.4.19-pre1/include/linux/fs.h 2003-11-21 03:51:05.000000000 +0300 -@@ -872,6 +872,10 @@ - int (*setattr) (struct dentry *, struct iattr *); - int (*setattr_raw) (struct inode *, struct iattr *); - int (*getattr) (struct dentry *, struct iattr *); -+ int (*setxattr) (struct dentry *, const char *, const void *, size_t, int); -+ ssize_t (*getxattr) (struct dentry *, const char *, void *, size_t); -+ ssize_t (*listxattr) (struct dentry *, char *, size_t); -+ int (*removexattr) (struct dentry *, const char *); - }; +--- linux-2.4.19-pre1.orig/include/linux/ext3_fs.h 2004-01-14 01:11:49.000000000 +0300 ++++ linux-2.4.19-pre1/include/linux/ext3_fs.h 2004-01-14 01:11:49.000000000 +0300 +@@ -63,8 +63,6 @@ + */ + #define EXT3_BAD_INO 1 /* Bad blocks inode */ + #define EXT3_ROOT_INO 2 /* Root inode */ +-#define EXT3_ACL_IDX_INO 3 /* ACL inode */ +-#define EXT3_ACL_DATA_INO 4 /* ACL inode */ + #define EXT3_BOOT_LOADER_INO 5 /* Boot loader inode */ + #define EXT3_UNDEL_DIR_INO 6 /* Undelete directory inode */ + #define EXT3_RESIZE_INO 7 /* Reserved group descriptors inode */ +@@ -94,7 +92,6 @@ + #else + # define EXT3_BLOCK_SIZE(s) (EXT3_MIN_BLOCK_SIZE << (s)->s_log_block_size) + #endif +-#define EXT3_ACLE_PER_BLOCK(s) (EXT3_BLOCK_SIZE(s) / sizeof (struct ext3_acl_entry)) + #define EXT3_ADDR_PER_BLOCK(s) (EXT3_BLOCK_SIZE(s) / sizeof (__u32)) + #ifdef __KERNEL__ + # define EXT3_BLOCK_SIZE_BITS(s) ((s)->s_blocksize_bits) +@@ -129,28 +126,6 @@ + #endif - struct seq_file; -Index: linux-2.4.19-pre1/include/linux/mbcache.h -=================================================================== ---- linux-2.4.19-pre1.orig/include/linux/mbcache.h 2003-11-21 03:51:05.000000000 +0300 -+++ linux-2.4.19-pre1/include/linux/mbcache.h 2003-11-21 03:51:05.000000000 +0300 -@@ -0,0 +1,69 @@ -+/* -+ File: linux/mbcache.h -+ -+ (C) 2001 by Andreas Gruenbacher, -+*/ -+ -+/* Hardwire the number of additional indexes */ -+#define MB_CACHE_INDEXES_COUNT 1 -+ -+struct mb_cache_entry; -+ -+struct mb_cache_op { -+ int (*free)(struct mb_cache_entry *, int); -+}; -+ -+struct mb_cache { -+ struct list_head c_cache_list; -+ const char *c_name; -+ struct mb_cache_op c_op; -+ atomic_t c_entry_count; -+ int c_bucket_count; -+#ifndef MB_CACHE_INDEXES_COUNT -+ int c_indexes_count; -+#endif -+ kmem_cache_t *c_entry_cache; -+ struct list_head *c_block_hash; -+ struct list_head *c_indexes_hash[0]; -+}; -+ -+struct mb_cache_entry_index { -+ struct list_head o_list; -+ unsigned int o_key; -+}; -+ -+struct mb_cache_entry { -+ struct list_head e_lru_list; -+ struct mb_cache *e_cache; -+ atomic_t e_used; -+ kdev_t e_dev; -+ unsigned long e_block; -+ struct list_head e_block_list; -+ struct mb_cache_entry_index e_indexes[0]; -+}; -+ -+/* Functions on caches */ -+ -+struct mb_cache * mb_cache_create(const char *, struct mb_cache_op *, size_t, -+ int, int); -+void mb_cache_shrink(struct mb_cache *, kdev_t); -+void mb_cache_destroy(struct mb_cache *); -+ -+/* Functions on cache entries */ -+ -+struct mb_cache_entry *mb_cache_entry_alloc(struct mb_cache *); -+int mb_cache_entry_insert(struct mb_cache_entry *, kdev_t, unsigned long, -+ unsigned int[]); -+void mb_cache_entry_rehash(struct mb_cache_entry *, unsigned int[]); -+void mb_cache_entry_release(struct mb_cache_entry *); -+void mb_cache_entry_takeout(struct mb_cache_entry *); -+void mb_cache_entry_free(struct mb_cache_entry *); -+struct mb_cache_entry *mb_cache_entry_dup(struct mb_cache_entry *); -+struct mb_cache_entry *mb_cache_entry_get(struct mb_cache *, kdev_t, -+ unsigned long); -+#if !defined(MB_CACHE_INDEXES_COUNT) || (MB_CACHE_INDEXES_COUNT > 0) -+struct mb_cache_entry *mb_cache_entry_find_first(struct mb_cache *cache, int, -+ kdev_t, unsigned int); -+struct mb_cache_entry *mb_cache_entry_find_next(struct mb_cache_entry *, int, -+ kdev_t, unsigned int); -+#endif -Index: linux-2.4.19-pre1/kernel/ksyms.c -=================================================================== ---- linux-2.4.19-pre1.orig/kernel/ksyms.c 2003-11-21 03:50:59.000000000 +0300 -+++ linux-2.4.19-pre1/kernel/ksyms.c 2003-11-21 03:51:05.000000000 +0300 -@@ -11,6 +11,7 @@ + /* +- * ACL structures +- */ +-struct ext3_acl_header /* Header of Access Control Lists */ +-{ +- __u32 aclh_size; +- __u32 aclh_file_count; +- __u32 aclh_acle_count; +- __u32 aclh_first_acle; +-}; +- +-struct ext3_acl_entry /* Access Control List Entry */ +-{ +- __u32 acle_size; +- __u16 acle_perms; /* Access permissions */ +- __u16 acle_type; /* Type of entry */ +- __u16 acle_tag; /* User or group identity */ +- __u16 acle_pad1; +- __u32 acle_next; /* Pointer on next entry for the */ +- /* same inode or on next free entry */ +-}; +- +-/* + * Structure of a blocks group descriptor + */ + struct ext3_group_desc +@@ -344,6 +319,7 @@ + #define EXT3_MOUNT_WRITEBACK_DATA 0x0C00 /* No data ordering */ + #define EXT3_MOUNT_UPDATE_JOURNAL 0x1000 /* Update the journal format */ + #define EXT3_MOUNT_NO_UID32 0x2000 /* Disable 32-bit UIDs */ ++#define EXT3_MOUNT_XATTR_USER 0x4000 /* Extended user attributes */ + + /* Compatibility, for having both ext2_fs.h and ext3_fs.h included at once */ + #ifndef _LINUX_EXT2_FS_H +@@ -520,7 +496,7 @@ + #define EXT3_FEATURE_INCOMPAT_RECOVER 0x0004 /* Needs recovery */ + #define EXT3_FEATURE_INCOMPAT_JOURNAL_DEV 0x0008 /* Journal device */ - #include - #include -+#include - #include - #include - #include -@@ -88,6 +89,7 @@ - EXPORT_SYMBOL(exit_files); - EXPORT_SYMBOL(exit_fs); - EXPORT_SYMBOL(exit_sighand); -+EXPORT_SYMBOL(copy_fs_struct); +-#define EXT3_FEATURE_COMPAT_SUPP 0 ++#define EXT3_FEATURE_COMPAT_SUPP EXT2_FEATURE_COMPAT_EXT_ATTR + #define EXT3_FEATURE_INCOMPAT_SUPP (EXT3_FEATURE_INCOMPAT_FILETYPE| \ + EXT3_FEATURE_INCOMPAT_RECOVER) + #define EXT3_FEATURE_RO_COMPAT_SUPP (EXT3_FEATURE_RO_COMPAT_SPARSE_SUPER| \ +@@ -703,6 +679,7 @@ + extern unsigned long ext3_count_free (struct buffer_head *, unsigned); - /* internal kernel memory management */ - EXPORT_SYMBOL(_alloc_pages); -@@ -104,6 +106,8 @@ - EXPORT_SYMBOL(kmem_cache_shrink); - EXPORT_SYMBOL(kmem_cache_alloc); - EXPORT_SYMBOL(kmem_cache_free); -+EXPORT_SYMBOL(register_cache); -+EXPORT_SYMBOL(unregister_cache); - EXPORT_SYMBOL(kmalloc); - EXPORT_SYMBOL(kfree); - EXPORT_SYMBOL(vfree); -Index: linux-2.4.19-pre1/mm/vmscan.c + /* inode.c */ ++extern int ext3_forget(handle_t *, int, struct inode *, struct buffer_head *, int); + extern struct buffer_head * ext3_getblk (handle_t *, struct inode *, long, int, int *); + extern struct buffer_head * ext3_bread (handle_t *, struct inode *, int, int, int *); + +@@ -771,8 +748,10 @@ + + /* namei.c */ + extern struct inode_operations ext3_dir_inode_operations; ++extern struct inode_operations ext3_special_inode_operations; + + /* symlink.c */ ++extern struct inode_operations ext3_symlink_inode_operations; + extern struct inode_operations ext3_fast_symlink_inode_operations; + + +Index: linux-2.4.19-pre1/include/linux/ext3_jbd.h =================================================================== ---- linux-2.4.19-pre1.orig/mm/vmscan.c 2003-11-20 19:01:38.000000000 +0300 -+++ linux-2.4.19-pre1/mm/vmscan.c 2003-11-21 03:51:05.000000000 +0300 -@@ -15,6 +15,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -32,6 +33,39 @@ - */ - #define DEF_PRIORITY (6) +--- linux-2.4.19-pre1.orig/include/linux/ext3_jbd.h 2004-01-14 01:11:49.000000000 +0300 ++++ linux-2.4.19-pre1/include/linux/ext3_jbd.h 2004-01-14 01:18:04.000000000 +0300 +@@ -30,13 +30,19 @@ -+static DECLARE_MUTEX(other_caches_sem); -+static LIST_HEAD(cache_definitions); -+ -+void register_cache(struct cache_definition *cache) -+{ -+ down(&other_caches_sem); -+ list_add(&cache->link, &cache_definitions); -+ up(&other_caches_sem); -+} -+ -+void unregister_cache(struct cache_definition *cache) -+{ -+ down(&other_caches_sem); -+ list_del(&cache->link); -+ up(&other_caches_sem); -+} -+ -+static void shrink_other_caches(unsigned int priority, int gfp_mask) -+{ -+ struct list_head *p; -+ -+ if (down_trylock(&other_caches_sem)) -+ return; -+ -+ list_for_each_prev(p, &cache_definitions) { -+ struct cache_definition *cache = -+ list_entry(p, struct cache_definition, link); + #define EXT3_SINGLEDATA_TRANS_BLOCKS 8 + ++/* Extended attributes may touch two data buffers, two bitmap buffers, ++ * and two group and summaries. */ + -+ cache->shrink(priority, gfp_mask); -+ } -+ up(&other_caches_sem); -+} ++#define EXT3_XATTR_TRANS_BLOCKS 8 + - /* - * The swap-out function returns 1 if it successfully - * scanned all the pages it was asked to (`count'). -@@ -578,6 +612,7 @@ + /* Define the minimum size for a transaction which modifies data. This + * needs to take into account the fact that we may end up modifying two + * quota files too (one for the group, one for the user quota). The + * superblock only gets updated once, of course, so don't bother + * counting that again for the quota updates. */ - shrink_dcache_memory(priority, gfp_mask); - shrink_icache_memory(priority, gfp_mask); -+ shrink_other_caches(priority, gfp_mask); - #ifdef CONFIG_QUOTA - shrink_dqcache_memory(DEF_PRIORITY, gfp_mask); - #endif -Index: linux-2.4.19-pre1/fs/ext3/ext3-exports.c -=================================================================== ---- linux-2.4.19-pre1.orig/fs/ext3/ext3-exports.c 2003-11-21 03:51:05.000000000 +0300 -+++ linux-2.4.19-pre1/fs/ext3/ext3-exports.c 2003-11-21 03:51:05.000000000 +0300 -@@ -0,0 +1,13 @@ -+#include -+#include -+#include -+#include -+#include -+ -+EXPORT_SYMBOL(ext3_force_commit); -+EXPORT_SYMBOL(ext3_bread); -+EXPORT_SYMBOL(ext3_xattr_register); -+EXPORT_SYMBOL(ext3_xattr_unregister); -+EXPORT_SYMBOL(ext3_xattr_get); -+EXPORT_SYMBOL(ext3_xattr_list); -+EXPORT_SYMBOL(ext3_xattr_set); -Index: linux-2.4.19-pre1/include/linux/xattr.h +-#define EXT3_DATA_TRANS_BLOCKS (3 * EXT3_SINGLEDATA_TRANS_BLOCKS - 2) ++#define EXT3_DATA_TRANS_BLOCKS (3 * EXT3_SINGLEDATA_TRANS_BLOCKS + \ ++ EXT3_XATTR_TRANS_BLOCKS - 2) + + extern int ext3_writepage_trans_blocks(struct inode *inode); + +Index: linux-2.4.19-pre1/include/linux/ext3_xattr.h =================================================================== ---- linux-2.4.19-pre1.orig/include/linux/xattr.h 2003-11-21 03:51:05.000000000 +0300 -+++ linux-2.4.19-pre1/include/linux/xattr.h 2003-11-21 03:51:05.000000000 +0300 -@@ -0,0 +1,15 @@ +--- linux-2.4.19-pre1.orig/include/linux/ext3_xattr.h 2003-01-30 13:24:37.000000000 +0300 ++++ linux-2.4.19-pre1/include/linux/ext3_xattr.h 2004-01-14 01:11:49.000000000 +0300 +@@ -0,0 +1,157 @@ +/* -+ File: linux/xattr.h ++ File: linux/ext3_xattr.h + -+ Extended attributes handling. ++ On-disk format of extended attributes for the ext3 filesystem. + -+ Copyright (C) 2001 by Andreas Gruenbacher -+ Copyright (c) 2001-2002 Silicon Graphics, Inc. All Rights Reserved. ++ (C) 2001 Andreas Gruenbacher, +*/ -+#ifndef _LINUX_XATTR_H -+#define _LINUX_XATTR_H + -+#define XATTR_CREATE 0x1 /* set the value, fail if attr already exists */ -+#define XATTR_REPLACE 0x2 /* set the value, fail if attr does not exist */ ++#include ++#include ++#include + -+#endif /* _LINUX_XATTR_H */ -Index: linux-2.4.19-pre1/arch/i386/kernel/entry.S -=================================================================== ---- linux-2.4.19-pre1.orig/arch/i386/kernel/entry.S 2003-11-21 03:38:55.000000000 +0300 -+++ linux-2.4.19-pre1/arch/i386/kernel/entry.S 2003-11-21 03:51:05.000000000 +0300 -@@ -622,18 +622,18 @@ - .long SYMBOL_NAME(sys_ni_syscall) /* Reserved for Security */ - .long SYMBOL_NAME(sys_gettid) - .long SYMBOL_NAME(sys_readahead) /* 225 */ -- .long SYMBOL_NAME(sys_ni_syscall) /* reserved for setxattr */ -- .long SYMBOL_NAME(sys_ni_syscall) /* reserved for lsetxattr */ -- .long SYMBOL_NAME(sys_ni_syscall) /* reserved for fsetxattr */ -- .long SYMBOL_NAME(sys_ni_syscall) /* reserved for getxattr */ -- .long SYMBOL_NAME(sys_ni_syscall) /* 230 reserved for lgetxattr */ -- .long SYMBOL_NAME(sys_ni_syscall) /* reserved for fgetxattr */ -- .long SYMBOL_NAME(sys_ni_syscall) /* reserved for listxattr */ -- .long SYMBOL_NAME(sys_ni_syscall) /* reserved for llistxattr */ -- .long SYMBOL_NAME(sys_ni_syscall) /* reserved for flistxattr */ -- .long SYMBOL_NAME(sys_ni_syscall) /* 235 reserved for removexattr */ -- .long SYMBOL_NAME(sys_ni_syscall) /* reserved for lremovexattr */ -- .long SYMBOL_NAME(sys_ni_syscall) /* reserved for fremovexattr */ -+ .long SYMBOL_NAME(sys_setxattr) -+ .long SYMBOL_NAME(sys_lsetxattr) -+ .long SYMBOL_NAME(sys_fsetxattr) -+ .long SYMBOL_NAME(sys_getxattr) -+ .long SYMBOL_NAME(sys_lgetxattr) /* 230 */ -+ .long SYMBOL_NAME(sys_fgetxattr) -+ .long SYMBOL_NAME(sys_listxattr) -+ .long SYMBOL_NAME(sys_llistxattr) -+ .long SYMBOL_NAME(sys_flistxattr) -+ .long SYMBOL_NAME(sys_removexattr) /* 235 */ -+ .long SYMBOL_NAME(sys_lremovexattr) -+ .long SYMBOL_NAME(sys_fremovexattr) - - .rept NR_syscalls-(.-sys_call_table)/4 - .long SYMBOL_NAME(sys_ni_syscall) -Index: linux-2.4.19-pre1/fs/xattr.c -=================================================================== ---- linux-2.4.19-pre1.orig/fs/xattr.c 2003-11-21 03:51:05.000000000 +0300 -+++ linux-2.4.19-pre1/fs/xattr.c 2003-11-21 03:51:05.000000000 +0300 -@@ -0,0 +1,355 @@ -+/* -+ File: fs/xattr.c ++/* Magic value in attribute blocks */ ++#define EXT3_XATTR_MAGIC 0xEA020000 + -+ Extended attribute handling. ++/* Maximum number of references to one attribute block */ ++#define EXT3_XATTR_REFCOUNT_MAX 1024 + -+ Copyright (C) 2001 by Andreas Gruenbacher -+ Copyright (C) 2001 SGI - Silicon Graphics, Inc -+ */ -+#include -+#include -+#include -+#include -+#include -+#include -+#include ++/* Name indexes */ ++#define EXT3_XATTR_INDEX_MAX 10 ++#define EXT3_XATTR_INDEX_USER 1 ++#define EXT3_XATTR_INDEX_POSIX_ACL_ACCESS 2 ++#define EXT3_XATTR_INDEX_POSIX_ACL_DEFAULT 3 + -+/* -+ * Extended attribute memory allocation wrappers, originally -+ * based on the Intermezzo PRESTO_ALLOC/PRESTO_FREE macros. -+ * The vmalloc use here is very uncommon - extended attributes -+ * are supposed to be small chunks of metadata, and it is quite -+ * unusual to have very many extended attributes, so lists tend -+ * to be quite short as well. The 64K upper limit is derived -+ * from the extended attribute size limit used by XFS. -+ * Intentionally allow zero @size for value/list size requests. -+ */ -+static void * -+xattr_alloc(size_t size, size_t limit) -+{ -+ void *ptr; ++struct ext3_xattr_header { ++ __u32 h_magic; /* magic number for identification */ ++ __u32 h_refcount; /* reference count */ ++ __u32 h_blocks; /* number of disk blocks used */ ++ __u32 h_hash; /* hash value of all attributes */ ++ __u32 h_reserved[4]; /* zero right now */ ++}; + -+ if (size > limit) -+ return ERR_PTR(-E2BIG); ++struct ext3_xattr_entry { ++ __u8 e_name_len; /* length of name */ ++ __u8 e_name_index; /* attribute name index */ ++ __u16 e_value_offs; /* offset in disk block of value */ ++ __u32 e_value_block; /* disk block attribute is stored on (n/i) */ ++ __u32 e_value_size; /* size of attribute value */ ++ __u32 e_hash; /* hash value of name and value */ ++ char e_name[0]; /* attribute name */ ++}; + -+ if (!size) /* size request, no buffer is needed */ -+ return NULL; -+ else if (size <= PAGE_SIZE) -+ ptr = kmalloc((unsigned long) size, GFP_KERNEL); -+ else -+ ptr = vmalloc((unsigned long) size); -+ if (!ptr) -+ return ERR_PTR(-ENOMEM); -+ return ptr; -+} ++#define EXT3_XATTR_PAD_BITS 2 ++#define EXT3_XATTR_PAD (1<e_name_len)) ) ++#define EXT3_XATTR_SIZE(size) \ ++ (((size) + EXT3_XATTR_ROUND) & ~EXT3_XATTR_ROUND) + -+static void -+xattr_free(void *ptr, size_t size) -+{ -+ if (!size) /* size request, no buffer was needed */ -+ return; -+ else if (size <= PAGE_SIZE) -+ kfree(ptr); -+ else -+ vfree(ptr); -+} ++#ifdef __KERNEL__ + -+/* -+ * Extended attribute SET operations -+ */ -+static long -+setxattr(struct dentry *d, char *name, void *value, size_t size, int flags) -+{ -+ int error; -+ void *kvalue; -+ char kname[XATTR_NAME_MAX + 1]; ++# ifdef CONFIG_EXT3_FS_XATTR + -+ if (flags & ~(XATTR_CREATE|XATTR_REPLACE)) -+ return -EINVAL; ++struct ext3_xattr_handler { ++ char *prefix; ++ size_t (*list)(char *list, struct inode *inode, const char *name, ++ int name_len); ++ int (*get)(struct inode *inode, const char *name, void *buffer, ++ size_t size); ++ int (*set)(struct inode *inode, const char *name, const void *buffer, ++ size_t size, int flags); ++}; + -+ error = strncpy_from_user(kname, name, sizeof(kname)); -+ if (error == 0 || error == sizeof(kname)) -+ error = -ERANGE; -+ if (error < 0) -+ return error; ++extern int ext3_xattr_register(int, struct ext3_xattr_handler *); ++extern void ext3_xattr_unregister(int, struct ext3_xattr_handler *); + -+ kvalue = xattr_alloc(size, XATTR_SIZE_MAX); -+ if (IS_ERR(kvalue)) -+ return PTR_ERR(kvalue); ++extern int ext3_setxattr(struct dentry *, const char *, const void *, size_t, int); ++extern ssize_t ext3_getxattr(struct dentry *, const char *, void *, size_t); ++extern ssize_t ext3_listxattr(struct dentry *, char *, size_t); ++extern int ext3_removexattr(struct dentry *, const char *); + -+ if (size > 0 && copy_from_user(kvalue, value, size)) { -+ xattr_free(kvalue, size); -+ return -EFAULT; -+ } ++extern int ext3_xattr_get(struct inode *, int, const char *, void *, size_t); ++extern int ext3_xattr_list(struct inode *, char *, size_t); ++extern int ext3_xattr_set(handle_t *handle, struct inode *, int, const char *, const void *, size_t, int); + -+ error = -EOPNOTSUPP; -+ if (d->d_inode->i_op && d->d_inode->i_op->setxattr) { -+ down(&d->d_inode->i_sem); -+ lock_kernel(); -+ error = d->d_inode->i_op->setxattr(d, kname, kvalue, size, flags); -+ unlock_kernel(); -+ up(&d->d_inode->i_sem); -+ } ++extern void ext3_xattr_delete_inode(handle_t *, struct inode *); ++extern void ext3_xattr_put_super(struct super_block *); + -+ xattr_free(kvalue, size); -+ return error; -+} ++extern int init_ext3_xattr(void) __init; ++extern void exit_ext3_xattr(void); + -+asmlinkage long -+sys_setxattr(char *path, char *name, void *value, size_t size, int flags) -+{ -+ struct nameidata nd; -+ int error; ++# else /* CONFIG_EXT3_FS_XATTR */ ++# define ext3_setxattr NULL ++# define ext3_getxattr NULL ++# define ext3_listxattr NULL ++# define ext3_removexattr NULL + -+ error = user_path_walk(path, &nd); -+ if (error) -+ return error; -+ error = setxattr(nd.dentry, name, value, size, flags); -+ path_release(&nd); -+ return error; ++static inline int ++ext3_xattr_get(struct inode *inode, int name_index, const char *name, ++ void *buffer, size_t size) ++{ ++ return -ENOTSUP; +} + -+asmlinkage long -+sys_lsetxattr(char *path, char *name, void *value, size_t size, int flags) ++static inline int ++ext3_xattr_list(struct inode *inode, void *buffer, size_t size) +{ -+ struct nameidata nd; -+ int error; -+ -+ error = user_path_walk_link(path, &nd); -+ if (error) -+ return error; -+ error = setxattr(nd.dentry, name, value, size, flags); -+ path_release(&nd); -+ return error; ++ return -ENOTSUP; +} + -+asmlinkage long -+sys_fsetxattr(int fd, char *name, void *value, size_t size, int flags) ++static inline int ++ext3_xattr_set(handle_t *handle, struct inode *inode, int name_index, ++ const char *name, const void *value, size_t size, int flags) +{ -+ struct file *f; -+ int error = -EBADF; -+ -+ f = fget(fd); -+ if (!f) -+ return error; -+ error = setxattr(f->f_dentry, name, value, size, flags); -+ fput(f); -+ return error; ++ return -ENOTSUP; +} + -+/* -+ * Extended attribute GET operations -+ */ -+static ssize_t -+getxattr(struct dentry *d, char *name, void *value, size_t size) ++static inline void ++ext3_xattr_delete_inode(handle_t *handle, struct inode *inode) +{ -+ ssize_t error; -+ void *kvalue; -+ char kname[XATTR_NAME_MAX + 1]; -+ -+ error = strncpy_from_user(kname, name, sizeof(kname)); -+ if (error == 0 || error == sizeof(kname)) -+ error = -ERANGE; -+ if (error < 0) -+ return error; -+ -+ kvalue = xattr_alloc(size, XATTR_SIZE_MAX); -+ if (IS_ERR(kvalue)) -+ return PTR_ERR(kvalue); -+ -+ error = -EOPNOTSUPP; -+ if (d->d_inode->i_op && d->d_inode->i_op->getxattr) { -+ down(&d->d_inode->i_sem); -+ lock_kernel(); -+ error = d->d_inode->i_op->getxattr(d, kname, kvalue, size); -+ unlock_kernel(); -+ up(&d->d_inode->i_sem); -+ } -+ -+ if (kvalue && error > 0) -+ if (copy_to_user(value, kvalue, error)) -+ error = -EFAULT; -+ xattr_free(kvalue, size); -+ return error; +} + -+asmlinkage ssize_t -+sys_getxattr(char *path, char *name, void *value, size_t size) ++static inline void ++ext3_xattr_put_super(struct super_block *sb) +{ -+ struct nameidata nd; -+ ssize_t error; -+ -+ error = user_path_walk(path, &nd); -+ if (error) -+ return error; -+ error = getxattr(nd.dentry, name, value, size); -+ path_release(&nd); -+ return error; +} + -+asmlinkage ssize_t -+sys_lgetxattr(char *path, char *name, void *value, size_t size) ++static inline int ++init_ext3_xattr(void) +{ -+ struct nameidata nd; -+ ssize_t error; -+ -+ error = user_path_walk_link(path, &nd); -+ if (error) -+ return error; -+ error = getxattr(nd.dentry, name, value, size); -+ path_release(&nd); -+ return error; ++ return 0; +} + -+asmlinkage ssize_t -+sys_fgetxattr(int fd, char *name, void *value, size_t size) ++static inline void ++exit_ext3_xattr(void) +{ -+ struct file *f; -+ ssize_t error = -EBADF; ++} + -+ f = fget(fd); -+ if (!f) -+ return error; -+ error = getxattr(f->f_dentry, name, value, size); -+ fput(f); -+ return error; ++# endif /* CONFIG_EXT3_FS_XATTR */ ++ ++# ifdef CONFIG_EXT3_FS_XATTR_USER ++ ++extern int init_ext3_xattr_user(void) __init; ++extern void exit_ext3_xattr_user(void); ++ ++# else /* CONFIG_EXT3_FS_XATTR_USER */ ++ ++static inline int ++init_ext3_xattr_user(void) ++{ ++ return 0; +} + -+/* -+ * Extended attribute LIST operations -+ */ -+static ssize_t -+listxattr(struct dentry *d, char *list, size_t size) ++static inline void ++exit_ext3_xattr_user(void) +{ -+ ssize_t error; -+ char *klist; ++} + -+ klist = (char *)xattr_alloc(size, XATTR_LIST_MAX); -+ if (IS_ERR(klist)) -+ return PTR_ERR(klist); ++#endif /* CONFIG_EXT3_FS_XATTR_USER */ + -+ error = -EOPNOTSUPP; -+ if (d->d_inode->i_op && d->d_inode->i_op->listxattr) { -+ down(&d->d_inode->i_sem); -+ lock_kernel(); -+ error = d->d_inode->i_op->listxattr(d, klist, size); -+ unlock_kernel(); -+ up(&d->d_inode->i_sem); -+ } ++#endif /* __KERNEL__ */ + -+ if (klist && error > 0) -+ if (copy_to_user(list, klist, error)) -+ error = -EFAULT; -+ xattr_free(klist, size); -+ return error; -+} +Index: linux-2.4.19-pre1/include/linux/fs.h +=================================================================== +--- linux-2.4.19-pre1.orig/include/linux/fs.h 2004-01-14 01:11:48.000000000 +0300 ++++ linux-2.4.19-pre1/include/linux/fs.h 2004-01-14 01:11:49.000000000 +0300 +@@ -872,6 +872,10 @@ + int (*setattr) (struct dentry *, struct iattr *); + int (*setattr_raw) (struct inode *, struct iattr *); + int (*getattr) (struct dentry *, struct iattr *); ++ int (*setxattr) (struct dentry *, const char *, const void *, size_t, int); ++ ssize_t (*getxattr) (struct dentry *, const char *, void *, size_t); ++ ssize_t (*listxattr) (struct dentry *, char *, size_t); ++ int (*removexattr) (struct dentry *, const char *); + }; + + struct seq_file; +Index: linux-2.4.19-pre1/include/linux/mbcache.h +=================================================================== +--- linux-2.4.19-pre1.orig/include/linux/mbcache.h 2003-01-30 13:24:37.000000000 +0300 ++++ linux-2.4.19-pre1/include/linux/mbcache.h 2004-01-14 01:11:49.000000000 +0300 +@@ -0,0 +1,69 @@ ++/* ++ File: linux/mbcache.h + -+asmlinkage ssize_t -+sys_listxattr(char *path, char *list, size_t size) -+{ -+ struct nameidata nd; -+ ssize_t error; ++ (C) 2001 by Andreas Gruenbacher, ++*/ + -+ error = user_path_walk(path, &nd); -+ if (error) -+ return error; -+ error = listxattr(nd.dentry, list, size); -+ path_release(&nd); -+ return error; -+} ++/* Hardwire the number of additional indexes */ ++#define MB_CACHE_INDEXES_COUNT 1 + -+asmlinkage ssize_t -+sys_llistxattr(char *path, char *list, size_t size) -+{ -+ struct nameidata nd; -+ ssize_t error; ++struct mb_cache_entry; + -+ error = user_path_walk_link(path, &nd); -+ if (error) -+ return error; -+ error = listxattr(nd.dentry, list, size); -+ path_release(&nd); -+ return error; -+} ++struct mb_cache_op { ++ int (*free)(struct mb_cache_entry *, int); ++}; + -+asmlinkage ssize_t -+sys_flistxattr(int fd, char *list, size_t size) -+{ -+ struct file *f; -+ ssize_t error = -EBADF; ++struct mb_cache { ++ struct list_head c_cache_list; ++ const char *c_name; ++ struct mb_cache_op c_op; ++ atomic_t c_entry_count; ++ int c_bucket_count; ++#ifndef MB_CACHE_INDEXES_COUNT ++ int c_indexes_count; ++#endif ++ kmem_cache_t *c_entry_cache; ++ struct list_head *c_block_hash; ++ struct list_head *c_indexes_hash[0]; ++}; + -+ f = fget(fd); -+ if (!f) -+ return error; -+ error = listxattr(f->f_dentry, list, size); -+ fput(f); -+ return error; -+} ++struct mb_cache_entry_index { ++ struct list_head o_list; ++ unsigned int o_key; ++}; + -+/* -+ * Extended attribute REMOVE operations -+ */ -+static long -+removexattr(struct dentry *d, char *name) -+{ -+ int error; -+ char kname[XATTR_NAME_MAX + 1]; ++struct mb_cache_entry { ++ struct list_head e_lru_list; ++ struct mb_cache *e_cache; ++ atomic_t e_used; ++ kdev_t e_dev; ++ unsigned long e_block; ++ struct list_head e_block_list; ++ struct mb_cache_entry_index e_indexes[0]; ++}; + -+ error = strncpy_from_user(kname, name, sizeof(kname)); -+ if (error == 0 || error == sizeof(kname)) -+ error = -ERANGE; -+ if (error < 0) -+ return error; ++/* Functions on caches */ + -+ error = -EOPNOTSUPP; -+ if (d->d_inode->i_op && d->d_inode->i_op->removexattr) { -+ down(&d->d_inode->i_sem); -+ lock_kernel(); -+ error = d->d_inode->i_op->removexattr(d, kname); -+ unlock_kernel(); -+ up(&d->d_inode->i_sem); -+ } -+ return error; -+} ++struct mb_cache * mb_cache_create(const char *, struct mb_cache_op *, size_t, ++ int, int); ++void mb_cache_shrink(struct mb_cache *, kdev_t); ++void mb_cache_destroy(struct mb_cache *); + -+asmlinkage long -+sys_removexattr(char *path, char *name) -+{ -+ struct nameidata nd; -+ int error; ++/* Functions on cache entries */ + -+ error = user_path_walk(path, &nd); -+ if (error) -+ return error; -+ error = removexattr(nd.dentry, name); -+ path_release(&nd); -+ return error; -+} ++struct mb_cache_entry *mb_cache_entry_alloc(struct mb_cache *); ++int mb_cache_entry_insert(struct mb_cache_entry *, kdev_t, unsigned long, ++ unsigned int[]); ++void mb_cache_entry_rehash(struct mb_cache_entry *, unsigned int[]); ++void mb_cache_entry_release(struct mb_cache_entry *); ++void mb_cache_entry_takeout(struct mb_cache_entry *); ++void mb_cache_entry_free(struct mb_cache_entry *); ++struct mb_cache_entry *mb_cache_entry_dup(struct mb_cache_entry *); ++struct mb_cache_entry *mb_cache_entry_get(struct mb_cache *, kdev_t, ++ unsigned long); ++#if !defined(MB_CACHE_INDEXES_COUNT) || (MB_CACHE_INDEXES_COUNT > 0) ++struct mb_cache_entry *mb_cache_entry_find_first(struct mb_cache *cache, int, ++ kdev_t, unsigned int); ++struct mb_cache_entry *mb_cache_entry_find_next(struct mb_cache_entry *, int, ++ kdev_t, unsigned int); ++#endif +Index: linux-2.4.19-pre1/include/linux/xattr.h +=================================================================== +--- linux-2.4.19-pre1.orig/include/linux/xattr.h 2003-01-30 13:24:37.000000000 +0300 ++++ linux-2.4.19-pre1/include/linux/xattr.h 2004-01-14 01:11:49.000000000 +0300 +@@ -0,0 +1,15 @@ ++/* ++ File: linux/xattr.h + -+asmlinkage long -+sys_lremovexattr(char *path, char *name) -+{ -+ struct nameidata nd; -+ int error; ++ Extended attributes handling. + -+ error = user_path_walk_link(path, &nd); -+ if (error) -+ return error; -+ error = removexattr(nd.dentry, name); -+ path_release(&nd); -+ return error; -+} ++ Copyright (C) 2001 by Andreas Gruenbacher ++ Copyright (c) 2001-2002 Silicon Graphics, Inc. All Rights Reserved. ++*/ ++#ifndef _LINUX_XATTR_H ++#define _LINUX_XATTR_H + -+asmlinkage long -+sys_fremovexattr(int fd, char *name) -+{ -+ struct file *f; -+ int error = -EBADF; ++#define XATTR_CREATE 0x1 /* set the value, fail if attr already exists */ ++#define XATTR_REPLACE 0x2 /* set the value, fail if attr does not exist */ + -+ f = fget(fd); -+ if (!f) -+ return error; -+ error = removexattr(f->f_dentry, name); -+ fput(f); -+ return error; -+} ++#endif /* _LINUX_XATTR_H */ Index: linux-2.4.19-pre1/include/linux/kernel.h =================================================================== ---- linux-2.4.19-pre1.orig/include/linux/kernel.h 2003-11-21 02:25:34.000000000 +0300 -+++ linux-2.4.19-pre1/include/linux/kernel.h 2003-11-21 03:51:05.000000000 +0300 +--- linux-2.4.19-pre1.orig/include/linux/kernel.h 2004-01-14 01:10:37.000000000 +0300 ++++ linux-2.4.19-pre1/include/linux/kernel.h 2004-01-14 01:16:51.000000000 +0300 @@ -11,6 +11,7 @@ #include #include @@ -6036,3 +5947,106 @@ Index: linux-2.4.19-pre1/include/linux/kernel.h /* Optimization barrier */ /* The "volatile" is due to gcc bugs */ +Index: linux-2.4.19-pre1/include/linux/limits.h +=================================================================== +--- linux-2.4.19-pre1.orig/include/linux/limits.h 2004-01-14 01:10:37.000000000 +0300 ++++ linux-2.4.19-pre1/include/linux/limits.h 2004-01-14 01:22:08.000000000 +0300 +@@ -13,6 +13,9 @@ + #define NAME_MAX 255 /* # chars in a file name */ + #define PATH_MAX 4096 /* # chars in a path name including nul */ + #define PIPE_BUF 4096 /* # bytes in atomic write to a pipe */ ++#define XATTR_NAME_MAX 255 /* # chars in an extended attribute name */ ++#define XATTR_SIZE_MAX 65536 /* size of an extended attribute value (64k) */ ++#define XATTR_LIST_MAX 65536 /* size of extended attribute namelist (64k) */ + + #define RTSIG_MAX 32 + +Index: linux-2.4.19-pre1/kernel/ksyms.c +=================================================================== +--- linux-2.4.19-pre1.orig/kernel/ksyms.c 2004-01-14 01:11:48.000000000 +0300 ++++ linux-2.4.19-pre1/kernel/ksyms.c 2004-01-14 01:11:49.000000000 +0300 +@@ -11,6 +11,7 @@ + + #include + #include ++#include + #include + #include + #include +@@ -88,6 +89,7 @@ + EXPORT_SYMBOL(exit_files); + EXPORT_SYMBOL(exit_fs); + EXPORT_SYMBOL(exit_sighand); ++EXPORT_SYMBOL(copy_fs_struct); + + /* internal kernel memory management */ + EXPORT_SYMBOL(_alloc_pages); +@@ -104,6 +106,8 @@ + EXPORT_SYMBOL(kmem_cache_shrink); + EXPORT_SYMBOL(kmem_cache_alloc); + EXPORT_SYMBOL(kmem_cache_free); ++EXPORT_SYMBOL(register_cache); ++EXPORT_SYMBOL(unregister_cache); + EXPORT_SYMBOL(kmalloc); + EXPORT_SYMBOL(kfree); + EXPORT_SYMBOL(vfree); +Index: linux-2.4.19-pre1/mm/vmscan.c +=================================================================== +--- linux-2.4.19-pre1.orig/mm/vmscan.c 2004-01-14 01:10:37.000000000 +0300 ++++ linux-2.4.19-pre1/mm/vmscan.c 2004-01-14 01:11:49.000000000 +0300 +@@ -15,6 +15,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -32,6 +33,39 @@ + */ + #define DEF_PRIORITY (6) + ++static DECLARE_MUTEX(other_caches_sem); ++static LIST_HEAD(cache_definitions); ++ ++void register_cache(struct cache_definition *cache) ++{ ++ down(&other_caches_sem); ++ list_add(&cache->link, &cache_definitions); ++ up(&other_caches_sem); ++} ++ ++void unregister_cache(struct cache_definition *cache) ++{ ++ down(&other_caches_sem); ++ list_del(&cache->link); ++ up(&other_caches_sem); ++} ++ ++static void shrink_other_caches(unsigned int priority, int gfp_mask) ++{ ++ struct list_head *p; ++ ++ if (down_trylock(&other_caches_sem)) ++ return; ++ ++ list_for_each_prev(p, &cache_definitions) { ++ struct cache_definition *cache = ++ list_entry(p, struct cache_definition, link); ++ ++ cache->shrink(priority, gfp_mask); ++ } ++ up(&other_caches_sem); ++} ++ + /* + * The swap-out function returns 1 if it successfully + * scanned all the pages it was asked to (`count'). +@@ -578,6 +612,7 @@ + + shrink_dcache_memory(priority, gfp_mask); + shrink_icache_memory(priority, gfp_mask); ++ shrink_other_caches(priority, gfp_mask); + #ifdef CONFIG_QUOTA + shrink_dqcache_memory(DEF_PRIORITY, gfp_mask); + #endif diff --git a/lustre/kernel_patches/patches/vfs_nointent_2.6.0-test6.patch b/lustre/kernel_patches/patches/vfs_nointent_2.6.0-test6.patch index 7c2ea35..4177aa7 100644 --- a/lustre/kernel_patches/patches/vfs_nointent_2.6.0-test6.patch +++ b/lustre/kernel_patches/patches/vfs_nointent_2.6.0-test6.patch @@ -1,9 +1,9 @@ 0 files changed -Index: linux-2.6.0-test6/fs/namei.c +Index: linux-2.6.0/fs/namei.c =================================================================== ---- linux-2.6.0-test6.orig/fs/namei.c 2003-10-07 15:33:15.000000000 +0800 -+++ linux-2.6.0-test6/fs/namei.c 2003-10-07 15:39:16.000000000 +0800 +--- linux-2.6.0.orig/fs/namei.c 2004-01-04 15:22:42.000000000 +0300 ++++ linux-2.6.0/fs/namei.c 2004-01-04 15:25:04.000000000 +0300 @@ -1270,7 +1270,7 @@ if (!error) { DQUOT_INIT(inode); @@ -220,11 +220,11 @@ Index: linux-2.6.0-test6/fs/namei.c exit5: dput(new_dentry); exit4: -Index: linux-2.6.0-test6/fs/open.c +Index: linux-2.6.0/fs/open.c =================================================================== ---- linux-2.6.0-test6.orig/fs/open.c 2003-10-07 15:33:15.000000000 +0800 -+++ linux-2.6.0-test6/fs/open.c 2003-10-07 15:40:41.000000000 +0800 -@@ -178,9 +178,10 @@ +--- linux-2.6.0.orig/fs/open.c 2004-01-04 15:21:49.000000000 +0300 ++++ linux-2.6.0/fs/open.c 2004-01-04 15:25:04.000000000 +0300 +@@ -180,9 +180,10 @@ return error; } @@ -236,7 +236,7 @@ Index: linux-2.6.0-test6/fs/open.c struct iattr newattrs; /* Not pretty: "inode->i_size" shouldn't really be signed. But it is. */ -@@ -191,7 +192,14 @@ +@@ -193,7 +194,14 @@ newattrs.ia_valid = ATTR_SIZE | ATTR_CTIME; down(&dentry->d_inode->i_sem); down_write(&dentry->d_inode->i_alloc_sem); @@ -252,7 +252,7 @@ Index: linux-2.6.0-test6/fs/open.c up_write(&dentry->d_inode->i_alloc_sem); up(&dentry->d_inode->i_sem); return err; -@@ -247,7 +255,7 @@ +@@ -249,7 +257,7 @@ error = locks_verify_truncate(inode, NULL, length); if (!error) { DQUOT_INIT(inode); @@ -261,7 +261,7 @@ Index: linux-2.6.0-test6/fs/open.c } put_write_access(inode); -@@ -299,7 +307,7 @@ +@@ -301,7 +309,7 @@ error = locks_verify_truncate(inode, file, length); if (!error) @@ -270,7 +270,7 @@ Index: linux-2.6.0-test6/fs/open.c out_putf: fput(file); out: -@@ -378,9 +386,19 @@ +@@ -380,9 +388,19 @@ (error = permission(inode,MAY_WRITE,&nd)) != 0) goto dput_and_out; } @@ -293,7 +293,7 @@ Index: linux-2.6.0-test6/fs/open.c dput_and_out: path_release(&nd); out: -@@ -431,9 +449,19 @@ +@@ -433,9 +451,19 @@ (error = permission(inode,MAY_WRITE,&nd)) != 0) goto dput_and_out; } @@ -316,7 +316,7 @@ Index: linux-2.6.0-test6/fs/open.c dput_and_out: path_release(&nd); out: -@@ -634,6 +662,18 @@ +@@ -636,6 +664,18 @@ if (IS_RDONLY(inode)) goto dput_and_out; @@ -335,7 +335,7 @@ Index: linux-2.6.0-test6/fs/open.c error = -EPERM; if (IS_IMMUTABLE(inode) || IS_APPEND(inode)) goto dput_and_out; -@@ -667,6 +707,18 @@ +@@ -669,6 +709,18 @@ if (IS_RDONLY(inode)) goto out; error = -EPERM; @@ -354,7 +354,7 @@ Index: linux-2.6.0-test6/fs/open.c if (IS_IMMUTABLE(inode) || IS_APPEND(inode)) goto out; newattrs.ia_valid = ATTR_CTIME; -@@ -680,6 +732,7 @@ +@@ -682,6 +734,7 @@ } if (!S_ISDIR(inode->i_mode)) newattrs.ia_valid |= ATTR_KILL_SUID|ATTR_KILL_SGID; @@ -362,11 +362,24 @@ Index: linux-2.6.0-test6/fs/open.c down(&inode->i_sem); error = notify_change(dentry, &newattrs); up(&inode->i_sem); -Index: linux-2.6.0-test6/include/linux/fs.h +Index: linux-2.6.0/fs/exec.c =================================================================== ---- linux-2.6.0-test6.orig/include/linux/fs.h 2003-10-07 15:34:10.000000000 +0800 -+++ linux-2.6.0-test6/include/linux/fs.h 2003-10-07 15:39:17.000000000 +0800 -@@ -831,13 +831,20 @@ +--- linux-2.6.0.orig/fs/exec.c 2004-01-04 15:21:49.000000000 +0300 ++++ linux-2.6.0/fs/exec.c 2004-01-04 15:25:04.000000000 +0300 +@@ -1405,7 +1405,7 @@ + goto close_fail; + if (!file->f_op->write) + goto close_fail; +- if (do_truncate(file->f_dentry, 0) != 0) ++ if (do_truncate(file->f_dentry, 0, 0) != 0) + goto close_fail; + + retval = binfmt->core_dump(signr, regs, file); +Index: linux-2.6.0/include/linux/fs.h +=================================================================== +--- linux-2.6.0.orig/include/linux/fs.h 2004-01-04 15:21:49.000000000 +0300 ++++ linux-2.6.0/include/linux/fs.h 2004-01-04 15:25:04.000000000 +0300 +@@ -836,13 +836,20 @@ int (*create) (struct inode *,struct dentry *,int, struct nameidata *); struct dentry * (*lookup) (struct inode *,struct dentry *, struct nameidata *); int (*link) (struct dentry *,struct inode *,struct dentry *); @@ -387,7 +400,7 @@ Index: linux-2.6.0-test6/include/linux/fs.h int (*readlink) (struct dentry *, char __user *,int); int (*follow_link) (struct dentry *, struct nameidata *); void (*truncate) (struct inode *); -@@ -1122,7 +1129,7 @@ +@@ -1127,7 +1134,7 @@ asmlinkage long sys_open(const char __user *, int, int); asmlinkage long sys_close(unsigned int); /* yes, it's really unsigned */ @@ -396,16 +409,15 @@ Index: linux-2.6.0-test6/include/linux/fs.h extern struct file *filp_open(const char *, int, int); extern struct file * dentry_open(struct dentry *, struct vfsmount *, int); -Index: linux-2.6.0-test6/fs/exec.c +Index: linux-2.6.0/net/unix/af_unix.c =================================================================== ---- linux-2.6.0-test6.orig/fs/exec.c 2003-10-07 15:33:15.000000000 +0800 -+++ linux-2.6.0-test6/fs/exec.c 2003-10-07 15:39:17.000000000 +0800 -@@ -1390,7 +1390,7 @@ - goto close_fail; - if (!file->f_op->write) - goto close_fail; -- if (do_truncate(file->f_dentry, 0) != 0) -+ if (do_truncate(file->f_dentry, 0, 0) != 0) - goto close_fail; - - retval = binfmt->core_dump(signr, regs, file); +--- linux-2.6.0.orig/net/unix/af_unix.c 2004-01-04 15:21:21.000000000 +0300 ++++ linux-2.6.0/net/unix/af_unix.c 2004-01-04 15:25:18.000000000 +0300 +@@ -592,6 +592,7 @@ + int err = 0; + + if (sunname->sun_path[0]) { ++ intent_init(&nd.intent, IT_LOOKUP); + err = path_lookup(sunname->sun_path, LOOKUP_FOLLOW, &nd); + if (err) + goto fail; diff --git a/lustre/llite/Makefile.mk b/lustre/llite/Makefile.mk index f01dfde..0cc6697d 100644 --- a/lustre/llite/Makefile.mk +++ b/lustre/llite/Makefile.mk @@ -8,4 +8,4 @@ include $(src)/../portals/Kernelenv obj-y += llite.o llite-objs := llite_lib.o dcache.o super.o rw.o \ super25.o file.o dir.o sysctl.o symlink.o namei.o lproc_llite.o \ - rw26.o llite_nfs.o + rw26.o llite_nfs.o llite_close.o diff --git a/lustre/llite/rw26.c b/lustre/llite/rw26.c index 2df14c4..7edee0d 100644 --- a/lustre/llite/rw26.c +++ b/lustre/llite/rw26.c @@ -51,57 +51,86 @@ #include "llite_internal.h" #include -/* called as the osc engine completes an rpc that included our ocp. - * the ocp itself holds a reference to the page and will drop it when - * the page is removed from the page cache. our job is simply to - * transfer rc into the page and unlock it */ -void ll_complete_writepage_26(struct obd_client_page *ocp, int rc) +/* called for each page in a completed rpc.*/ +void ll_ap_completion_26(void *data, int cmd, int rc) { - struct page *page = ocp->ocp_page; + struct ll_async_page *llap; + struct page *page; - LASSERT(page->private == (unsigned long)ocp); + llap = llap_from_cookie(data); + if (IS_ERR(llap)) { + EXIT; + return; + } + + page = llap->llap_page; LASSERT(PageLocked(page)); - if (rc != 0) { - CERROR("writeback error on page %p index %ld: %d\n", page, - page->index, rc); + if (rc == 0) { + if (cmd == OBD_BRW_READ) { + if (!llap->llap_defer_uptodate) + SetPageUptodate(page); + } else { + llap->llap_write_queued = 0; + } + } else { SetPageError(page); } - ocp->ocp_flags &= ~OCP_IO_READY; - /* let everyone get at this page again.. I wonder if this ordering - * is corect */ + LL_CDEBUG_PAGE(page, "io complete, unlocking\n"); + unlock_page(page); - end_page_writeback(page); + + if (0 && cmd == OBD_BRW_WRITE) { + llap_write_complete(page->mapping->host, llap); + ll_try_done_writing(page->mapping->host); + } page_cache_release(page); } static int ll_writepage_26(struct page *page, struct writeback_control *wbc) { - struct obd_client_page *ocp; + struct inode *inode = page->mapping->host; + struct obd_export *exp; + struct ll_async_page *llap; + int rc; ENTRY; LASSERT(!PageDirty(page)); LASSERT(PageLocked(page)); - LASSERT(page->private != 0); - ocp = (struct obd_client_page *)page->private; - ocp->ocp_flags |= OCP_IO_READY; + exp = ll_i2obdexp(inode); + if (exp == NULL) + GOTO(out, rc = -EINVAL); + llap = llap_from_page(page); + if (IS_ERR(llap)) + GOTO(out, rc = PTR_ERR(llap)); page_cache_get(page); - /* filemap_fdatawait() makes me think we need to set PageWriteback - * on pages that are in flight. But our ocp mechanics doesn't - * really expect a page to be on both the osc lru and in flight. - * so for now, we don't unlock the page.. dirtiers whill wait - * for io to complete */ - SetPageWriteback(page); - - /* sadly, not all callers who writepage eventually call sync_page - * (ahem, kswapd) so we need to raise this page's priority - * immediately */ - RETURN(ll_sync_page(page)); + if (llap->llap_write_queued) { + LL_CDEBUG_PAGE(page, "marking urgent\n"); + rc = obd_set_async_flags(exp, ll_i2info(inode)->lli_smd, NULL, + llap->llap_cookie, ASYNC_READY | + ASYNC_URGENT); + } else { + llap->llap_write_queued = 1; + rc = obd_queue_async_io(exp, ll_i2info(inode)->lli_smd, NULL, + llap->llap_cookie, OBD_BRW_WRITE, 0, 0, + OBD_BRW_CREATE, ASYNC_READY | + ASYNC_URGENT); + if (rc == 0) + LL_CDEBUG_PAGE(page, "mmap write queued\n"); + else + llap->llap_write_queued = 0; + } + if (rc) + page_cache_release(page); +out: + if (rc) + unlock_page(page); + RETURN(rc); } struct address_space_operations ll_aops = { @@ -111,8 +140,9 @@ struct address_space_operations ll_aops = { writepage: ll_writepage_26, writepages: generic_writepages, set_page_dirty: __set_page_dirty_nobuffers, - sync_page: block_sync_page, + sync_page: ll_sync_page, prepare_write: ll_prepare_write, commit_write: ll_commit_write, + removepage: ll_removepage, bmap: NULL }; diff --git a/lustre/osc/Makefile.mk b/lustre/osc/Makefile.mk index 40ac179..2a17b1c 100644 --- a/lustre/osc/Makefile.mk +++ b/lustre/osc/Makefile.mk @@ -6,5 +6,5 @@ include $(src)/../portals/Kernelenv obj-y += osc.o -osc-objs := osc_request.o lproc_osc.o osc_lib.o osc_rpcd.o osc_create.o +osc-objs := osc_request.o lproc_osc.o osc_lib.o osc_create.o diff --git a/lustre/tests/conf-sanity.sh b/lustre/tests/conf-sanity.sh index f71e39e..f6f77db 100644 --- a/lustre/tests/conf-sanity.sh +++ b/lustre/tests/conf-sanity.sh @@ -212,5 +212,85 @@ test_8() { } run_test 8 "double mount setup" +test_9() { + # backup the old values of PTLDEBUG and SUBSYSTEM + OLDPTLDEBUG=$PTLDEBUG + OLDSUBSYSTEM=$SUBSYSTEM + + # generate new configuration file with lmc --ptldebug and --subsystem + PTLDEBUG="trace" + SUBSYSTEM="mdc" + gen_config + + # check the result of lmc --ptldebug/subsystem + start_ost + start_mds + mount_client $MOUNT + [ "`cat /proc/sys/portals/debug`" = "1" ] && \ + echo "lmc --debug success" || return 1 + [ "`cat /proc/sys/portals/subsystem_debug`" = "16777216" ] && \ + echo "lmc --subsystem success" || return 1 + check_mount || return 41 + cleanup + + # the new PTLDEBUG/SUBSYSTEM used for lconf --ptldebug/subsystem + PTLDEBUG="inode" + SUBSYSTEM="mds" + + # check lconf --ptldebug/subsystem overriding lmc --ptldebug/subsystem + start_ost + start_mds + mount_client $MOUNT + [ "`cat /proc/sys/portals/debug`" = "2" ] && \ + echo "lconf --debug overriding success" || return 1 + [ "`cat /proc/sys/portals/subsystem_debug`" = "33554432" ] && \ + echo "lconf --subsystem overriding success" || return 1 + check_mount || return 41 + cleanup + + # resume the old configuration + PTLDEBUG=$OLDPTLDEBUG + SUBSYSTEM=$OLDSUBSYSTEM + gen_config +} +run_test 9 "test --ptldebug and --subsystem for lmc" + +test_10() { + OLDXMLCONFIG=$XMLCONFIG + XMLCONFIG="broken.xml" + [ -f "$XMLCONFIG" ] && rm -f $XMLCONFIG + SAMENAME="mds1" + do_lmc --add node --node $SAMENAME + do_lmc --add net --node $SAMENAME --nid $SAMENAME --nettype tcp + do_lmc --add mds --node $SAMENAME --mds $SAMENAME --nid $SAMENAME \ + --fstype ext3 --dev /dev/mds1 || return $? + do_lmc --add lov --lov lov1 --mds $SAMENAME --stripe_sz 65536 \ + --stripe_cnt 1 --stripe_pattern 0 || return $? + echo "Success!" + XMLCONFIG=$OLDXMLCONFIG +} +run_test 10 "use lmc with the same name for node and mds" + +test_11() { + OLDXMLCONFIG=$XMLCONFIG + XMLCONFIG="conf11.xml" + + [ -f "$XMLCONFIG" ] && rm -f $XMLCONFIG + add_mds mds --dev $MDSDEV --size $MDSSIZE + add_ost ost --dev $OSTDEV --size $OSTSIZE + add_client client mds --path $MOUNT --ost ost_svc || return $? + echo "Default lov config success!" + + [ -f "$XMLCONFIG" ] && rm -f $XMLCONFIG + add_mds mds --dev $MDSDEV --size $MDSSIZE + add_ost ost --dev $OSTDEV --size $OSTSIZE + add_client client mds --path $MOUNT && return $? + echo "--add mtpt with neither --lov nor --ost will return error" + + echo "" + echo "Success!" + XMLCONFIG=$OLDXMLCONFIG +} +run_test 11 "use default lov configuration (should return error)" equals_msg "Done" diff --git a/lustre/tests/iopentest1.c b/lustre/tests/iopentest1.c index 107970e..acc1112 100644 --- a/lustre/tests/iopentest1.c +++ b/lustre/tests/iopentest1.c @@ -87,7 +87,7 @@ int main(int argc, char *argv[]) __FILE__, __LINE__, fname, strerror(errno)); exit(1); } - + rc = stat(iname, &buf); if (rc != 0) { fprintf(stderr, "%s:%d: stat(%s) failed: %s\n", @@ -95,6 +95,7 @@ int main(int argc, char *argv[]) exit(1); } } + printf("%s:finished...\n", argv[0]); return 0; } diff --git a/lustre/tests/iopentest2.c b/lustre/tests/iopentest2.c index 6f95f95..046de92 100644 --- a/lustre/tests/iopentest2.c +++ b/lustre/tests/iopentest2.c @@ -12,6 +12,7 @@ #include #include #include +#include const char *progname; const char usage_fmt[] = "Usage: %s \n"; @@ -66,6 +67,7 @@ int main(int argc, char *argv[]) char *fname_iname, *dir; char *dir_iname = NULL, *foo = NULL, *bar = NULL; int rc, fd, i, thread = 0; + int pidlist[10]; pname = strdup(argv[0]); progname = basename(argv[0]); @@ -86,6 +88,7 @@ int main(int argc, char *argv[]) break; } printf("%s: thread #%d (PID %d) started\n", argv[0], i, rc); + pidlist[i-1] = rc; rc = 0; } @@ -175,6 +178,9 @@ int main(int argc, char *argv[]) free(dir_iname); } + } else { + for ( i=0; i<10; i++) + waitpid(pidlist[i], NULL, 0); } return 0; } diff --git a/lustre/tests/multiop.c b/lustre/tests/multiop.c index 07605be..de59be6 100755 --- a/lustre/tests/multiop.c +++ b/lustre/tests/multiop.c @@ -1,3 +1,4 @@ +#define _GNU_SOURCE /* pull in O_DIRECTORY in bits/fcntl.h */ #include #include #include @@ -17,12 +18,16 @@ char usage[] = "Usage: %s filename command-sequence\n" " command-sequence items:\n" " d mkdir\n" +" D open(O_DIRECTORY)\n" " o open(O_RDONLY)\n" " O open(O_CREAT|O_RDWR)\n" +" L link\n" +" l symlink\n" " u unlink\n" " U munmap\n" " m mknod\n" " M rw mmap to EOF (must open and stat prior)\n" +" N rename\n" " c close\n" " _ wait for signal\n" " R reference entire mmap-ed region\n" @@ -39,15 +44,28 @@ char usage[] = void null_handler(int unused) { } +static const char * +pop_arg(int argc, char *argv[]) +{ + static int cur_arg = 3; + + if (cur_arg >= argc) + return NULL; + + return argv[cur_arg++]; +} +#define POP_ARG() (pop_arg(argc, argv)) + int main(int argc, char **argv) { char *fname, *commands; + const char *newfile; struct stat st; size_t mmap_len, i; unsigned char *mmap_ptr = NULL, junk = 0; int fd = -1; - if (argc != 3) { + if (argc < 3) { fprintf(stderr, usage, argv[0]); exit(1); } @@ -74,6 +92,30 @@ int main(int argc, char **argv) exit(1); } break; + case 'D': + if (open(fname, O_DIRECTORY) == -1) { + perror("open(O_DIRECTORY)"); + exit(1); + } + break; + case 'l': + newfile = POP_ARG(); + if (!newfile) + newfile = fname; + if (symlink(fname, newfile)) { + perror("symlink()"); + exit(1); + } + break; + case 'L': + newfile = POP_ARG(); + if (!newfile) + newfile = fname; + if (link(fname, newfile)) { + perror("symlink()"); + exit(1); + } + break; case 'm': if (mknod(fname, S_IFREG | 0644, 0) == -1) { perror("mknod(S_IFREG|0644, 0)"); @@ -89,6 +131,15 @@ int main(int argc, char **argv) exit(1); } break; + case 'N': + newfile = POP_ARG(); + if (!newfile) + newfile = fname; + if (rename (fname, newfile)) { + perror("rename()"); + exit(1); + } + break; case 'O': fd = open(fname, O_CREAT|O_RDWR, 0644); if (fd == -1) { diff --git a/lustre/tests/run-llog.sh b/lustre/tests/run-llog.sh index 64d6403..6a4ffc1 100644 --- a/lustre/tests/run-llog.sh +++ b/lustre/tests/run-llog.sh @@ -1,16 +1,25 @@ #!/bin/bash -insmod ../obdclass/llog_test.o -../utils/lctl modules > /r/tmp/ogdb-localhost.localdomain +PATH=`dirname $0`:`dirname $0`/../utils:$PATH +TMP=${TMP:-/tmp} +insmod ../obdclass/llog_test.o || exit 1 +lctl modules > $TMP/ogdb-`hostname` echo "NOW reload debugging syms.." -# Using ignore_errors will allow lctl to cleanup even if the test -# fails. -../utils/lctl <lmd_nal == QSWNAL) { - FILE *fp; - fp = fopen("/proc/elan/device0/position", "r"); - if (fp == NULL) { - perror("mount: /proc/elan/device0/position"); - return -1; - } - rc = fscanf(fp, "%*s %255s", buf); - fclose(fp); - if (rc != 1) { - fprintf(stderr, "mount: problem read elan NID"); +#if MULTIRAIL_EKC + char *pfiles[] = {"/proc/qsnet/elan3/device0/position", + "/proc/qsnet/elan4/device0/position", + NULL}; +#else + char *pfiles[] = {"/proc/elan/device0/position", + NULL}; +#endif + int i = 0; + + do { + rc = get_local_elan_id(pfiles[i], buf); + } while (rc != 0 && + pfiles[++i] != NULL); + + if (rc != 0) { + fprintf(stderr, "mount: can't read elan ID" + " from /proc\n"); return -1; } - } if (ptl_parse_nid (&nid, buf) != 0) { -- 1.8.3.1