diff options
author | davem <davem> | 2002-02-11 06:42:05 +0000 |
---|---|---|
committer | davem <davem> | 2002-02-11 06:42:05 +0000 |
commit | 692d4e12a95ae02549f2e5e41df12bdc912da3be (patch) | |
tree | 9ab3a1df4f9305dacbf621cbe82c94a5882b7e71 | |
parent | 0d606fce7f40fc0f25d10f91b4852b20f538a6e3 (diff) | |
download | netdev-vger-cvs-master.tar.gz |
possibly the last vger CVS merge I'll be doing
as Linus moves over to Bitkeeper which I am already
using to push 2.5.x changes to him.
The 2.4.x CVS will remain active assuming Marcelo decides
to not use BK for his work.
347 files changed, 1584 insertions, 1150 deletions
@@ -990,8 +990,8 @@ S: Brazil N: Nigel Gamble E: nigel@nrg.org -E: nigel@sgi.com D: Interrupt-driven printer driver +D: Preemptible kernel S: 120 Alley Way S: Mountain View, California 94040 S: USA diff --git a/Documentation/preempt-locking.txt b/Documentation/preempt-locking.txt new file mode 100644 index 000000000..08e2b4719 --- /dev/null +++ b/Documentation/preempt-locking.txt @@ -0,0 +1,104 @@ + Proper Locking Under a Preemptible Kernel: + Keeping Kernel Code Preempt-Safe + Robert Love <rml@tech9.net> + Last Updated: 22 Jan 2002 + + +INTRODUCTION + + +A preemptible kernel creates new locking issues. The issues are the same as +those under SMP: concurrency and reentrancy. Thankfully, the Linux preemptible +kernel model leverages existing SMP locking mechanisms. Thus, the kernel +requires explicit additional locking for very few additional situations. + +This document is for all kernel hackers. Developing code in the kernel +requires protecting these situations. + + +RULE #1: Per-CPU data structures need explicit protection + + +Two similar problems arise. An example code snippet: + + struct this_needs_locking tux[NR_CPUS]; + tux[smp_processor_id()] = some_value; + /* task is preempted here... */ + something = tux[smp_processor_id()]; + +First, since the data is per-CPU, it may not have explicit SMP locking, but +require it otherwise. Second, when a preempted task is finally rescheduled, +the previous value of smp_processor_id may not equal the current. You must +protect these situations by disabling preemption around them. + + +RULE #2: CPU state must be protected. + + +Under preemption, the state of the CPU must be protected. This is arch- +dependent, but includes CPU structures and state not preserved over a context +switch. For example, on x86, entering and exiting FPU mode is now a critical +section that must occur while preemption is disabled. Think what would happen +if the kernel is executing a floating-point instruction and is then preempted. +Remember, the kernel does not save FPU state except for user tasks. Therefore, +upon preemption, the FPU registers will be sold to the lowest bidder. Thus, +preemption must be disabled around such regions. + +Note, some FPU functions are already explicitly preempt safe. For example, +kernel_fpu_begin and kernel_fpu_end will disable and enable preemption. +However, math_state_restore must be called with preemption disabled. + + +RULE #3: Lock acquire and release must be performed by same task + + +A lock acquired in one task must be released by the same task. This +means you can't do oddball things like acquire a lock and go off to +play while another task releases it. If you want to do something +like this, acquire and release the task in the same code path and +have the caller wait on an event by the other task. + + +SOLUTION + + +Data protection under preemption is achieved by disabling preemption for the +duration of the critical region. + +preempt_enable() decrement the preempt counter +preempt_disable() increment the preempt counter +preempt_enable_no_resched() decrement, but do not immediately preempt +preempt_get_count() return the preempt counter + +The functions are nestable. In other words, you can call preempt_disable +n-times in a code path, and preemption will not be reenabled until the n-th +call to preempt_enable. The preempt statements define to nothing if +preemption is not enabled. + +Note that you do not need to explicitly prevent preemption if you are holding +any locks or interrupts are disabled, since preemption is implicitly disabled +in those cases. + +Example: + + cpucache_t *cc; /* this is per-CPU */ + preempt_disable(); + cc = cc_data(searchp); + if (cc && cc->avail) { + __free_block(searchp, cc_entry(cc), cc->avail); + cc->avail = 0; + } + preempt_enable(); + return 0; + +Notice how the preemption statements must encompass every reference of the +critical variables. Another example: + + int buf[NR_CPUS]; + set_cpu_val(buf); + if (buf[smp_processor_id()] == -1) printf(KERN_INFO "wee!\n"); + spin_lock(&buf_lock); + /* ... */ + +This code is not preempt-safe, but see how easily we can fix it by simply +moving the spin_lock up two lines. diff --git a/MAINTAINERS b/MAINTAINERS index f716e1a64..f2d6ca4c9 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -1240,6 +1240,14 @@ P: Michal Ostrowski M: mostrows@styx.uwaterloo.ca S: Maintained +PREEMPTIBLE KERNEL +P: Robert Love +M: rml@tech9.net +L: linux-kernel@vger.kernel.org +L: kpreempt-tech@lists.sourceforge.net +W: ftp://ftp.kernel.org/pub/linux/kernel/people/rml/preempt-kernel +S: Supported + PROMISE DC4030 CACHING DISK CONTROLLER DRIVER P: Peter Denison M: promise@pnd-pc.demon.co.uk @@ -1,7 +1,7 @@ VERSION = 2 PATCHLEVEL = 5 SUBLEVEL = 4 -EXTRAVERSION =-pre5 +EXTRAVERSION = KERNELRELEASE=$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION) @@ -140,7 +140,6 @@ DRIVERS-y += drivers/base/base.o \ DRIVERS-$(CONFIG_AGP) += drivers/char/agp/agp.o DRIVERS-$(CONFIG_DRM) += drivers/char/drm/drm.o DRIVERS-$(CONFIG_NUBUS) += drivers/nubus/nubus.a -DRIVERS-$(CONFIG_ISDN) += drivers/isdn/isdn.a DRIVERS-$(CONFIG_NET_FC) += drivers/net/fc/fc.o DRIVERS-$(CONFIG_APPLETALK) += drivers/net/appletalk/appletalk.o DRIVERS-$(CONFIG_TR) += drivers/net/tokenring/tr.o @@ -187,6 +186,7 @@ DRIVERS-$(CONFIG_PHONE) += drivers/telephony/telephony.o DRIVERS-$(CONFIG_MD) += drivers/md/mddev.o DRIVERS-$(CONFIG_BLUEZ) += drivers/bluetooth/bluetooth.o DRIVERS-$(CONFIG_HOTPLUG_PCI) += drivers/hotplug/vmlinux-obj.o +DRIVERS-$(CONFIG_ISDN) += drivers/isdn/vmlinux-obj.o DRIVERS := $(DRIVERS-y) @@ -207,7 +207,7 @@ CLEAN_FILES = \ drivers/scsi/aic7xxx/aicasm/aicasm_scan.c \ drivers/scsi/aic7xxx/aicasm/y.tab.h \ drivers/scsi/aic7xxx/aicasm/aicasm \ - drivers/scsi/53c700-mem.c \ + drivers/scsi/53c700_d.h \ net/khttpd/make_times_h \ net/khttpd/times.h \ submenu* diff --git a/arch/alpha/Config.help b/arch/alpha/Config.help index 4a5b50343..3a7e6b9fb 100644 --- a/arch/alpha/Config.help +++ b/arch/alpha/Config.help @@ -597,31 +597,6 @@ CONFIG_MAGIC_SYSRQ keys are documented in <file:Documentation/sysrq.txt>. Don't say Y unless you really know what this hack does. -CONFIG_ISDN - ISDN ("Integrated Services Digital Networks", called RNIS in France) - is a special type of fully digital telephone service; it's mostly - used to connect to your Internet service provider (with SLIP or - PPP). The main advantage is that the speed is higher than ordinary - modem/telephone connections, and that you can have voice - conversations while downloading stuff. It only works if your - computer is equipped with an ISDN card and both you and your service - provider purchased an ISDN line from the phone company. For - details, read <http://alumni.caltech.edu/~dank/isdn/> on the WWW. - - This driver allows you to use an ISDN-card for networking - connections and as dialin/out device. The isdn-tty's have a built - in AT-compatible modem emulator. Network devices support autodial, - channel-bundling, callback and caller-authentication without having - a daemon running. A reduced T.70 protocol is supported with tty's - suitable for German BTX. On D-Channel, the protocols EDSS1 - (Euro-ISDN) and 1TR6 (German style) are supported. See - <file:Documentation/isdn/README> for more information. - - If you want to compile the ISDN code as a module ( = code which can - be inserted in and removed from the running kernel whenever you - want), say M here and read <file:Documentation/modules.txt>. The - module will be called isdn.o. If unsure, say N. - CONFIG_SRM_ENV If you enable this option, a subdirectory called srm_environment will give you access to the most important SRM environment diff --git a/arch/alpha/defconfig b/arch/alpha/defconfig index a7dedd38e..b1c6709aa 100644 --- a/arch/alpha/defconfig +++ b/arch/alpha/defconfig @@ -12,6 +12,14 @@ CONFIG_RWSEM_XCHGADD_ALGORITHM=y CONFIG_EXPERIMENTAL=y # +# General setup +# +CONFIG_NET=y +CONFIG_SYSVIPC=y +# CONFIG_BSD_PROCESS_ACCT is not set +CONFIG_SYSCTL=y + +# # Loadable module support # CONFIG_MODULES=y @@ -63,10 +71,6 @@ CONFIG_ALPHA_BROKEN_IRQ_MASK=y CONFIG_PCI_NAMES=y # CONFIG_HOTPLUG is not set # CONFIG_PCMCIA is not set -CONFIG_NET=y -CONFIG_SYSVIPC=y -# CONFIG_BSD_PROCESS_ACCT is not set -CONFIG_SYSCTL=y CONFIG_KCORE_ELF=y # CONFIG_KCORE_AOUT is not set # CONFIG_BINFMT_AOUT is not set @@ -89,6 +93,7 @@ CONFIG_BINFMT_ELF=y # CONFIG_PNP=y CONFIG_ISAPNP=y +# CONFIG_PNPBIOS is not set # # Block devices @@ -98,6 +103,7 @@ CONFIG_BLK_DEV_FD=y # CONFIG_PARIDE is not set # CONFIG_BLK_CPQ_DA is not set # CONFIG_BLK_CPQ_CISS_DA is not set +# CONFIG_CISS_SCSI_TAPE is not set # CONFIG_BLK_DEV_DAC960 is not set CONFIG_BLK_DEV_LOOP=m # CONFIG_BLK_DEV_NBD is not set @@ -121,7 +127,7 @@ CONFIG_BLK_DEV_LOOP=m # CONFIG_PACKET=y # CONFIG_PACKET_MMAP is not set -# CONFIG_NETLINK is not set +CONFIG_NETLINK_DEV=y CONFIG_NETFILTER=y # CONFIG_NETFILTER_DEBUG is not set # CONFIG_FILTER is not set @@ -133,6 +139,7 @@ CONFIG_IP_MULTICAST=y # CONFIG_NET_IPIP is not set # CONFIG_NET_IPGRE is not set # CONFIG_IP_MROUTE is not set +# CONFIG_ARPD is not set CONFIG_INET_ECN=y # CONFIG_SYN_COOKIES is not set @@ -142,12 +149,14 @@ CONFIG_INET_ECN=y CONFIG_IP_NF_CONNTRACK=m CONFIG_IP_NF_FTP=m CONFIG_IP_NF_IRC=m +CONFIG_IP_NF_QUEUE=m CONFIG_IP_NF_IPTABLES=m # CONFIG_IP_NF_MATCH_LIMIT is not set # CONFIG_IP_NF_MATCH_MAC is not set # CONFIG_IP_NF_MATCH_MARK is not set # CONFIG_IP_NF_MATCH_MULTIPORT is not set # CONFIG_IP_NF_MATCH_TOS is not set +# CONFIG_IP_NF_MATCH_AH_ESP is not set # CONFIG_IP_NF_MATCH_LENGTH is not set # CONFIG_IP_NF_MATCH_TTL is not set # CONFIG_IP_NF_MATCH_TCPMSS is not set @@ -166,6 +175,7 @@ CONFIG_IP_NF_NAT_IRC=m CONFIG_IP_NF_NAT_FTP=m # CONFIG_IP_NF_MANGLE is not set # CONFIG_IP_NF_TARGET_LOG is not set +# CONFIG_IP_NF_TARGET_ULOG is not set # CONFIG_IP_NF_TARGET_TCPMSS is not set CONFIG_IP_NF_COMPAT_IPCHAINS=y CONFIG_IP_NF_NAT_NEEDED=y @@ -212,6 +222,7 @@ CONFIG_BLK_DEV_IDE=y # 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_IDEDISK_VENDOR is not set # CONFIG_BLK_DEV_IDEDISK_FUJITSU is not set # CONFIG_BLK_DEV_IDEDISK_IBM is not set @@ -226,6 +237,7 @@ CONFIG_BLK_DEV_IDECD=y # CONFIG_BLK_DEV_IDETAPE is not set # CONFIG_BLK_DEV_IDEFLOPPY is not set # CONFIG_BLK_DEV_IDESCSI is not set +# CONFIG_IDE_TASK_IOCTL is not set # # IDE chipset support/bugfixes @@ -237,12 +249,15 @@ CONFIG_BLK_DEV_IDECD=y CONFIG_BLK_DEV_IDEPCI=y # CONFIG_IDEPCI_SHARE_IRQ is not set CONFIG_BLK_DEV_IDEDMA_PCI=y -CONFIG_BLK_DEV_ADMA=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_IDEDMA_TIMEOUT is not set # CONFIG_IDEDMA_NEW_DRIVE_LISTINGS is not set +CONFIG_BLK_DEV_ADMA=y # CONFIG_BLK_DEV_AEC62XX is not set # CONFIG_AEC62XX_TUNING is not set CONFIG_BLK_DEV_ALI15X3=y @@ -257,6 +272,7 @@ CONFIG_BLK_DEV_CY82C693=y # CONFIG_BLK_DEV_HPT366 is not set # CONFIG_BLK_DEV_NS87415 is not set # CONFIG_BLK_DEV_OPTI621 is not set +# CONFIG_BLK_DEV_PDC_ADMA is not set # CONFIG_BLK_DEV_PDC202XX is not set # CONFIG_PDC202XX_BURST is not set # CONFIG_PDC202XX_FORCE is not set @@ -294,7 +310,6 @@ CONFIG_SR_EXTRA_DEVS=2 # # 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 is not set # CONFIG_SCSI_LOGGING is not set @@ -331,6 +346,7 @@ CONFIG_AIC7XXX_RESET_DELAY_MS=5000 # CONFIG_SCSI_INIA100 is not set # CONFIG_SCSI_NCR53C406A is not set # CONFIG_SCSI_NCR53C7xx is not set +# CONFIG_SCSI_SYM53C8XX_2 is not set CONFIG_SCSI_NCR53C8XX=y CONFIG_SCSI_SYM53C8XX=y CONFIG_SCSI_NCR53C8XX_DEFAULT_TAGS=8 @@ -356,6 +372,15 @@ CONFIG_SCSI_NCR53C8XX_SYNC=20 # CONFIG_SCSI_DEBUG is not set # +# Fusion MPT device support +# +# CONFIG_FUSION is not set +# CONFIG_FUSION_BOOT is not set +# CONFIG_FUSION_ISENSE is not set +# CONFIG_FUSION_CTL is not set +# CONFIG_FUSION_LAN is not set + +# # Network device support # CONFIG_NETDEVICES=y @@ -368,6 +393,7 @@ CONFIG_DUMMY=m # CONFIG_BONDING is not set # CONFIG_EQUALIZER is not set # CONFIG_TUN is not set +# CONFIG_ETHERTAP is not set # CONFIG_NET_SB1000 is not set # @@ -378,7 +404,6 @@ CONFIG_NET_ETHERNET=y # CONFIG_HAPPYMEAL is not set # CONFIG_SUNBMAC is not set # CONFIG_SUNQE is not set -# CONFIG_SUNLANCE is not set # CONFIG_SUNGEM is not set CONFIG_NET_VENDOR_3COM=y # CONFIG_EL1 is not set @@ -403,23 +428,32 @@ CONFIG_NET_PCI=y # CONFIG_AC3200 is not set # CONFIG_APRICOT is not set # CONFIG_CS89x0 is not set -# CONFIG_DE4X5 is not set +CONFIG_DE2104X=m CONFIG_TULIP=y +# CONFIG_TULIP_MWI is not set +CONFIG_TULIP_MMIO=y +# CONFIG_DE4X5 is not set # CONFIG_DGRS is not set # CONFIG_DM9102 is not set # CONFIG_EEPRO100 is not set # CONFIG_LNE390 is not set +# CONFIG_FEALNX is not set # CONFIG_NATSEMI is not set # CONFIG_NE2K_PCI is not set # CONFIG_NE3210 is not set # CONFIG_ES3210 is not set -# CONFIG_RTL8129 is not set +# CONFIG_8139CP is not set # CONFIG_8139TOO is not set +# CONFIG_8139TOO_PIO is not set +# CONFIG_8139TOO_TUNE_TWISTER is not set +# CONFIG_8139TOO_8129 is not set +# CONFIG_8139_NEW_RX_RESET is not set # CONFIG_SIS900 is not set # CONFIG_EPIC100 is not set # CONFIG_SUNDANCE is not set # CONFIG_TLAN is not set # CONFIG_VIA_RHINE is not set +# CONFIG_VIA_RHINE_MMIO is not set # CONFIG_WINBOND_840 is not set # CONFIG_NET_POCKET is not set @@ -497,19 +531,6 @@ CONFIG_MOUSE=y CONFIG_PSMOUSE=y # CONFIG_82C710_MOUSE is not set # CONFIG_PC110_PAD is not set - -# -# Joysticks -# -# CONFIG_INPUT_GAMEPORT is not set - -# -# Input core support is needed for gameports -# - -# -# Input core support is needed for joysticks -# # CONFIG_QIC02_TAPE is not set # @@ -543,11 +564,15 @@ CONFIG_AUTOFS_FS=m # CONFIG_AUTOFS4_FS is not set CONFIG_REISERFS_FS=m # CONFIG_REISERFS_CHECK is not set +# CONFIG_REISERFS_PROC_INFO is not set # CONFIG_ADFS_FS is not set # CONFIG_ADFS_FS_RW is not set # CONFIG_AFFS_FS is not set # CONFIG_HFS_FS is not set # CONFIG_BFS_FS is not set +# CONFIG_EXT3_FS is not set +# CONFIG_JBD is not set +# CONFIG_JBD_DEBUG is not set CONFIG_FAT_FS=y CONFIG_MSDOS_FS=y # CONFIG_UMSDOS_FS is not set @@ -557,7 +582,7 @@ CONFIG_VFAT_FS=y # CONFIG_JFFS2_FS is not set # CONFIG_CRAMFS is not set CONFIG_TMPFS=y -# CONFIG_RAMFS is not set +CONFIG_RAMFS=y CONFIG_ISO9660_FS=y # CONFIG_JOLIET is not set # CONFIG_ZISOFS is not set @@ -585,6 +610,7 @@ CONFIG_EXT2_FS=y # Network File Systems # # CONFIG_CODA_FS is not set +# CONFIG_INTERMEZZO_FS is not set CONFIG_NFS_FS=m CONFIG_NFS_V3=y # CONFIG_ROOT_NFS is not set @@ -604,7 +630,6 @@ CONFIG_LOCKD_V4=y # CONFIG_NCPFS_NLS is not set # CONFIG_NCPFS_EXTRAS is not set # CONFIG_ZISOFS_FS is not set -# CONFIG_ZLIB_FS_INFLATE is not set # # Partition Types @@ -677,8 +702,10 @@ CONFIG_VGA_CONSOLE=y # CONFIG_USB is not set # -# USB Controllers +# USB Host Controller Drivers # +# CONFIG_USB_EHCI_HCD is not set +# CONFIG_USB_OHCI_HCD is not set # CONFIG_USB_UHCI is not set # CONFIG_USB_UHCI_ALT is not set # CONFIG_USB_OHCI is not set @@ -750,6 +777,7 @@ CONFIG_VGA_CONSOLE=y # CONFIG_USB_SERIAL_EMPEG is not set # CONFIG_USB_SERIAL_FTDI_SIO is not set # CONFIG_USB_SERIAL_VISOR is not set +# CONFIG_USB_SERIAL_IPAQ is not set # CONFIG_USB_SERIAL_IR is not set # CONFIG_USB_SERIAL_EDGEPORT is not set # CONFIG_USB_SERIAL_KEYSPAN_PDA is not set @@ -763,6 +791,7 @@ CONFIG_VGA_CONSOLE=y # CONFIG_USB_SERIAL_KEYSPAN_USA19W is not set # CONFIG_USB_SERIAL_KEYSPAN_USA49W is not set # CONFIG_USB_SERIAL_MCT_U232 is not set +# CONFIG_USB_SERIAL_KLSI is not set # CONFIG_USB_SERIAL_PL2303 is not set # CONFIG_USB_SERIAL_CYBERJACK is not set # CONFIG_USB_SERIAL_XIRCOM is not set @@ -772,15 +801,26 @@ CONFIG_VGA_CONSOLE=y # USB Miscellaneous drivers # # CONFIG_USB_RIO500 is not set +# CONFIG_USB_AUERSWALD is not set # -# Input core support +# Input device support # # CONFIG_INPUT is not set # CONFIG_INPUT_KEYBDEV is not set # CONFIG_INPUT_MOUSEDEV is not set # CONFIG_INPUT_JOYDEV is not set # CONFIG_INPUT_EVDEV is not set +# CONFIG_GAMEPORT is not set +CONFIG_SOUND_GAMEPORT=y +# CONFIG_GAMEPORT_NS558 is not set +# CONFIG_GAMEPORT_L4 is not set +# CONFIG_INPUT_EMU10K1 is not set +# CONFIG_GAMEPORT_PCIGAME is not set +# CONFIG_GAMEPORT_FM801 is not set +# CONFIG_GAMEPORT_CS461x is not set +# CONFIG_SERIO is not set +# CONFIG_SERIO_SERPORT is not set # # Bluetooth support @@ -795,3 +835,13 @@ CONFIG_DEBUG_KERNEL=y CONFIG_MATHEMU=y # CONFIG_DEBUG_SLAB is not set CONFIG_MAGIC_SYSRQ=y +# CONFIG_DEBUG_SPINLOCK is not set +# CONFIG_DEBUG_RWLOCK is not set +# CONFIG_DEBUG_SEMAPHORE is not set + +# +# Library routines +# +CONFIG_CRC32=y +# CONFIG_ZLIB_INFLATE is not set +# CONFIG_ZLIB_DEFLATE is not set diff --git a/arch/arm/Config.help b/arch/arm/Config.help index ff4735b21..7b8bfc3f5 100644 --- a/arch/arm/Config.help +++ b/arch/arm/Config.help @@ -471,31 +471,6 @@ CONFIG_MAGIC_SYSRQ keys are documented in <file:Documentation/sysrq.txt>. Don't say Y unless you really know what this hack does. -CONFIG_ISDN - ISDN ("Integrated Services Digital Networks", called RNIS in France) - is a special type of fully digital telephone service; it's mostly - used to connect to your Internet service provider (with SLIP or - PPP). The main advantage is that the speed is higher than ordinary - modem/telephone connections, and that you can have voice - conversations while downloading stuff. It only works if your - computer is equipped with an ISDN card and both you and your service - provider purchased an ISDN line from the phone company. For - details, read <http://alumni.caltech.edu/~dank/isdn/> on the WWW. - - This driver allows you to use an ISDN-card for networking - connections and as dialin/out device. The isdn-tty's have a built - in AT-compatible modem emulator. Network devices support autodial, - channel-bundling, callback and caller-authentication without having - a daemon running. A reduced T.70 protocol is supported with tty's - suitable for German BTX. On D-Channel, the protocols EDSS1 - (Euro-ISDN) and 1TR6 (German style) are supported. See - <file:Documentation/isdn/README> for more information. - - If you want to compile the ISDN code as a module ( = code which can - be inserted in and removed from the running kernel whenever you - want), say M here and read <file:Documentation/modules.txt>. The - module will be called isdn.o. If unsure, say N. - CONFIG_ARCH_ARCA5K This selects what ARM system you wish to build the kernel for. It also selects to some extent the CPU type. If you are unsure what diff --git a/arch/cris/Config.help b/arch/cris/Config.help index 6dc300a70..3f3108558 100644 --- a/arch/cris/Config.help +++ b/arch/cris/Config.help @@ -171,31 +171,6 @@ CONFIG_SOUND Kernel patches and supporting utilities to do that are in the pcsp package, available at <ftp://ftp.infradead.org/pub/pcsp/>. -CONFIG_ISDN - ISDN ("Integrated Services Digital Networks", called RNIS in France) - is a special type of fully digital telephone service; it's mostly - used to connect to your Internet service provider (with SLIP or - PPP). The main advantage is that the speed is higher than ordinary - modem/telephone connections, and that you can have voice - conversations while downloading stuff. It only works if your - computer is equipped with an ISDN card and both you and your service - provider purchased an ISDN line from the phone company. For - details, read <http://alumni.caltech.edu/~dank/isdn/> on the WWW. - - This driver allows you to use an ISDN-card for networking - connections and as dialin/out device. The isdn-tty's have a built - in AT-compatible modem emulator. Network devices support autodial, - channel-bundling, callback and caller-authentication without having - a daemon running. A reduced T.70 protocol is supported with tty's - suitable for German BTX. On D-Channel, the protocols EDSS1 - (Euro-ISDN) and 1TR6 (German style) are supported. See - <file:Documentation/isdn/README> for more information. - - If you want to compile the ISDN code as a module ( = code which can - be inserted in and removed from the running kernel whenever you - want), say M here and read <file:Documentation/modules.txt>. The - module will be called isdn.o. If unsure, say N. - CONFIG_ETRAX100LX Support version 1 of the Etrax 100LX. diff --git a/arch/i386/Config.help b/arch/i386/Config.help index 98b4c7542..c5d53f7eb 100644 --- a/arch/i386/Config.help +++ b/arch/i386/Config.help @@ -25,6 +25,16 @@ CONFIG_SMP If you don't know what to do here, say N. +CONFIG_PREEMPT + This option reduces the latency of the kernel when reacting to + real-time or interactive events by allowing a low priority process to + be preempted even if it is in kernel mode executing a system call. + This allows applications to run more reliably even when the system is + under load. + + Say Y here if you are building a kernel for a desktop, embedded + or real-time system. Say N if you are unsure. + CONFIG_X86 This is Linux's home port. Linux was originally native to the Intel 386, and runs on all the later x86 processors including the Intel @@ -890,31 +900,6 @@ CONFIG_MAGIC_SYSRQ keys are documented in <file:Documentation/sysrq.txt>. Don't say Y unless you really know what this hack does. -CONFIG_ISDN - ISDN ("Integrated Services Digital Networks", called RNIS in France) - is a special type of fully digital telephone service; it's mostly - used to connect to your Internet service provider (with SLIP or - PPP). The main advantage is that the speed is higher than ordinary - modem/telephone connections, and that you can have voice - conversations while downloading stuff. It only works if your - computer is equipped with an ISDN card and both you and your service - provider purchased an ISDN line from the phone company. For - details, read <http://alumni.caltech.edu/~dank/isdn/> on the WWW. - - This driver allows you to use an ISDN-card for networking - connections and as dialin/out device. The isdn-tty's have a built - in AT-compatible modem emulator. Network devices support autodial, - channel-bundling, callback and caller-authentication without having - a daemon running. A reduced T.70 protocol is supported with tty's - suitable for German BTX. On D-Channel, the protocols EDSS1 - (Euro-ISDN) and 1TR6 (German style) are supported. See - <file:Documentation/isdn/README> for more information. - - If you want to compile the ISDN code as a module ( = code which can - be inserted in and removed from the running kernel whenever you - want), say M here and read <file:Documentation/modules.txt>. The - module will be called isdn.o. If unsure, say N. - CONFIG_DEBUG_HIGHMEM This options enables addition error checking for high memory systems. Disable for production systems. diff --git a/arch/i386/config.in b/arch/i386/config.in index ae7cd0b7d..21c258688 100644 --- a/arch/i386/config.in +++ b/arch/i386/config.in @@ -167,6 +167,7 @@ fi bool 'Math emulation' CONFIG_MATH_EMULATION bool 'MTRR (Memory Type Range Register) support' CONFIG_MTRR bool 'Symmetric multi-processing support' CONFIG_SMP +bool 'Preemptible Kernel' CONFIG_PREEMPT if [ "$CONFIG_SMP" != "y" ]; then bool 'Local APIC support on uniprocessors' CONFIG_X86_UP_APIC dep_bool 'IO-APIC support on uniprocessors' CONFIG_X86_UP_IOAPIC $CONFIG_X86_UP_APIC @@ -180,9 +181,12 @@ else bool 'Multiquad NUMA system' CONFIG_MULTIQUAD fi -if [ "$CONFIG_SMP" = "y" -a "$CONFIG_X86_CMPXCHG" = "y" ]; then - define_bool CONFIG_HAVE_DEC_LOCK y +if [ "$CONFIG_SMP" = "y" -o "$CONFIG_PREEMPT" = "y" ]; then + if [ "$CONFIG_X86_CMPXCHG" = "y" ]; then + define_bool CONFIG_HAVE_DEC_LOCK y + fi fi + endmenu mainmenu_option next_comment diff --git a/arch/i386/defconfig b/arch/i386/defconfig index 0d33e70a9..deccdea4c 100644 --- a/arch/i386/defconfig +++ b/arch/i386/defconfig @@ -7,6 +7,11 @@ CONFIG_ISA=y CONFIG_UID16=y # +# Code maturity level options +# +# CONFIG_EXPERIMENTAL is not set + +# # General setup # CONFIG_NET=y @@ -15,11 +20,6 @@ CONFIG_SYSVIPC=y CONFIG_SYSCTL=y # -# Code maturity level options -# -# CONFIG_EXPERIMENTAL is not set - -# # Loadable module support # CONFIG_MODULES=y @@ -68,6 +68,7 @@ CONFIG_NOHIGHMEM=y # CONFIG_MATH_EMULATION is not set # CONFIG_MTRR is not set CONFIG_SMP=y +# CONFIG_PREEMPT is not set # CONFIG_MULTIQUAD is not set CONFIG_HAVE_DEC_LOCK=y diff --git a/arch/i386/kernel/cpuid.c b/arch/i386/kernel/cpuid.c index 16b69e8f6..499b2fd70 100644 --- a/arch/i386/kernel/cpuid.c +++ b/arch/i386/kernel/cpuid.c @@ -36,6 +36,7 @@ #include <linux/smp.h> #include <linux/major.h> #include <linux/smp_lock.h> +#include <linux/fs.h> #include <asm/processor.h> #include <asm/msr.h> diff --git a/arch/i386/kernel/entry.S b/arch/i386/kernel/entry.S index 65bfc86e6..f006f47c4 100644 --- a/arch/i386/kernel/entry.S +++ b/arch/i386/kernel/entry.S @@ -69,6 +69,37 @@ IF_MASK = 0x00000200 NT_MASK = 0x00004000 VM_MASK = 0x00020000 +/* These are offsets into the irq_stat structure + * There is one per cpu and it is aligned to 32 + * byte boundry (we put that here as a shift count) + */ +irq_array_shift = CONFIG_X86_L1_CACHE_SHIFT +irq_stat_local_irq_count = 4 +irq_stat_local_bh_count = 8 + +#ifdef CONFIG_SMP +#define GET_CPU_INDX movl TI_CPU(%ebx),%eax; \ + shll $irq_array_shift,%eax +#define GET_CURRENT_CPU_INDX GET_THREAD_INFO(%ebx); \ + GET_CPU_INDX +#define CPU_INDX (,%eax) +#else +#define GET_CPU_INDX +#define GET_CURRENT_CPU_INDX GET_THREAD_INFO(%ebx) +#define CPU_INDX +#endif + +#ifdef CONFIG_PREEMPT +#define preempt_stop cli +#define init_ret_intr \ + cli; \ + decl TI_PRE_COUNT(%ebx); +#else +#define preempt_stop +#define init_ret_intr +#define resume_kernel restore_all +#endif + #define SAVE_ALL \ cld; \ pushl %es; \ @@ -176,11 +207,12 @@ ENTRY(ret_from_fork) ALIGN ENTRY(ret_from_intr) GET_THREAD_INFO(%ebx) + init_ret_intr ret_from_exception: movl EFLAGS(%esp),%eax # mix EFLAGS and CS movb CS(%esp),%al testl $(VM_MASK | 3),%eax - jz restore_all # returning to kernel-space or vm86-space + jz resume_kernel # returning to kernel or vm86-space ENTRY(resume_userspace) cli # make sure we don't miss an interrupt setting need_resched # or sigpending between sampling and the iret @@ -189,6 +221,22 @@ ENTRY(resume_userspace) jne work_pending jmp restore_all +#ifdef CONFIG_PREEMPT +ENTRY(resume_kernel) + cmpl $0,TI_PRE_COUNT(%ebx) + jnz restore_all + movl TI_FLAGS(%ebx),%ecx + testb $_TIF_NEED_RESCHED,%cl + jz restore_all + movl SYMBOL_NAME(irq_stat)+irq_stat_local_bh_count CPU_INDX,%ecx + addl SYMBOL_NAME(irq_stat)+irq_stat_local_irq_count CPU_INDX,%ecx + jnz restore_all + incl TI_PRE_COUNT(%ebx) + sti + call SYMBOL_NAME(preempt_schedule) + jmp ret_from_intr +#endif + # system call handler stub ALIGN ENTRY(system_call) @@ -302,6 +350,7 @@ error_code: GET_THREAD_INFO(%ebx) call *%edi addl $8,%esp + preempt_stop jmp ret_from_exception ENTRY(coprocessor_error) @@ -321,12 +370,14 @@ ENTRY(device_not_available) movl %cr0,%eax testl $0x4,%eax # EM (math emulation bit) jne device_not_available_emulate + preempt_stop call SYMBOL_NAME(math_state_restore) jmp ret_from_exception device_not_available_emulate: pushl $0 # temporary storage for ORIG_EIP call SYMBOL_NAME(math_emulate) addl $4,%esp + preempt_stop jmp ret_from_exception ENTRY(debug) diff --git a/arch/i386/kernel/i387.c b/arch/i386/kernel/i387.c index a87a362c4..c237c22fe 100644 --- a/arch/i386/kernel/i387.c +++ b/arch/i386/kernel/i387.c @@ -10,6 +10,7 @@ #include <linux/config.h> #include <linux/sched.h> +#include <linux/spinlock.h> #include <asm/processor.h> #include <asm/i387.h> #include <asm/math_emu.h> @@ -63,6 +64,7 @@ void save_init_fpu( struct task_struct *tsk ) void kernel_fpu_begin(void) { + preempt_disable(); if (test_thread_flag(TIF_USEDFPU)) { __save_init_fpu(current); return; diff --git a/arch/i386/kernel/init_task.c b/arch/i386/kernel/init_task.c index d12703283..f652f279b 100644 --- a/arch/i386/kernel/init_task.c +++ b/arch/i386/kernel/init_task.c @@ -2,6 +2,7 @@ #include <linux/sched.h> #include <linux/init.h> #include <linux/init_task.h> +#include <linux/fs.h> #include <asm/uaccess.h> #include <asm/pgtable.h> diff --git a/arch/i386/kernel/msr.c b/arch/i386/kernel/msr.c index 18560356a..4d377eeee 100644 --- a/arch/i386/kernel/msr.c +++ b/arch/i386/kernel/msr.c @@ -35,6 +35,7 @@ #include <linux/smp.h> #include <linux/smp_lock.h> #include <linux/major.h> +#include <linux/fs.h> #include <asm/processor.h> #include <asm/msr.h> diff --git a/arch/i386/kernel/process.c b/arch/i386/kernel/process.c index 142915bd3..99710bb8b 100644 --- a/arch/i386/kernel/process.c +++ b/arch/i386/kernel/process.c @@ -16,6 +16,7 @@ #include <linux/errno.h> #include <linux/sched.h> +#include <linux/fs.h> #include <linux/kernel.h> #include <linux/mm.h> #include <linux/smp.h> @@ -47,6 +48,7 @@ #endif #include <linux/irq.h> +#include <linux/err.h> asmlinkage void ret_from_fork(void) __asm__("ret_from_fork"); diff --git a/arch/i386/kernel/semaphore.c b/arch/i386/kernel/semaphore.c index 09c0852e5..06bdf8a44 100644 --- a/arch/i386/kernel/semaphore.c +++ b/arch/i386/kernel/semaphore.c @@ -14,6 +14,7 @@ */ #include <linux/config.h> #include <linux/sched.h> +#include <linux/err.h> #include <asm/semaphore.h> /* diff --git a/arch/i386/kernel/smp.c b/arch/i386/kernel/smp.c index af1dc7387..7fdbdfdba 100644 --- a/arch/i386/kernel/smp.c +++ b/arch/i386/kernel/smp.c @@ -497,7 +497,7 @@ void smp_migrate_task(int cpu, task_t *p) /* * The target CPU will unlock the migration spinlock: */ - spin_lock(&migration_lock); + _raw_spin_lock(&migration_lock); new_task = p; send_IPI_mask(1 << cpu, TASK_MIGRATION_VECTOR); } @@ -511,7 +511,7 @@ asmlinkage void smp_task_migration_interrupt(void) ack_APIC_irq(); p = new_task; - spin_unlock(&migration_lock); + _raw_spin_unlock(&migration_lock); sched_task_migrated(p); } /* diff --git a/arch/i386/kernel/traps.c b/arch/i386/kernel/traps.c index ad68256f8..7c2c2520d 100644 --- a/arch/i386/kernel/traps.c +++ b/arch/i386/kernel/traps.c @@ -710,6 +710,8 @@ asmlinkage void do_spurious_interrupt_bug(struct pt_regs * regs, * * Careful.. There are problems with IBM-designed IRQ13 behaviour. * Don't touch unless you *really* know how it works. + * + * Must be called with kernel preemption disabled. */ asmlinkage void math_state_restore(struct pt_regs regs) { diff --git a/arch/ia64/Config.help b/arch/ia64/Config.help index 23ae7ec73..2da75923f 100644 --- a/arch/ia64/Config.help +++ b/arch/ia64/Config.help @@ -424,31 +424,6 @@ CONFIG_MAGIC_SYSRQ keys are documented in <file:Documentation/sysrq.txt>. Don't say Y unless you really know what this hack does. -CONFIG_ISDN - ISDN ("Integrated Services Digital Networks", called RNIS in France) - is a special type of fully digital telephone service; it's mostly - used to connect to your Internet service provider (with SLIP or - PPP). The main advantage is that the speed is higher than ordinary - modem/telephone connections, and that you can have voice - conversations while downloading stuff. It only works if your - computer is equipped with an ISDN card and both you and your service - provider purchased an ISDN line from the phone company. For - details, read <http://alumni.caltech.edu/~dank/isdn/> on the WWW. - - This driver allows you to use an ISDN-card for networking - connections and as dialin/out device. The isdn-tty's have a built - in AT-compatible modem emulator. Network devices support autodial, - channel-bundling, callback and caller-authentication without having - a daemon running. A reduced T.70 protocol is supported with tty's - suitable for German BTX. On D-Channel, the protocols EDSS1 - (Euro-ISDN) and 1TR6 (German style) are supported. See - <file:Documentation/isdn/README> for more information. - - If you want to compile the ISDN code as a module ( = code which can - be inserted in and removed from the running kernel whenever you - want), say M here and read <file:Documentation/modules.txt>. The - module will be called isdn.o. If unsure, say N. - CONFIG_ITANIUM Select your IA64 processor type. The default is Intel Itanium. diff --git a/arch/mips/Config.help b/arch/mips/Config.help index 82851d00b..56a642678 100644 --- a/arch/mips/Config.help +++ b/arch/mips/Config.help @@ -899,31 +899,6 @@ CONFIG_MAGIC_SYSRQ keys are documented in <file:Documentation/sysrq.txt>. Don't say Y unless you really know what this hack does. -CONFIG_ISDN - ISDN ("Integrated Services Digital Networks", called RNIS in France) - is a special type of fully digital telephone service; it's mostly - used to connect to your Internet service provider (with SLIP or - PPP). The main advantage is that the speed is higher than ordinary - modem/telephone connections, and that you can have voice - conversations while downloading stuff. It only works if your - computer is equipped with an ISDN card and both you and your service - provider purchased an ISDN line from the phone company. For - details, read <http://alumni.caltech.edu/~dank/isdn/> on the WWW. - - This driver allows you to use an ISDN-card for networking - connections and as dialin/out device. The isdn-tty's have a built - in AT-compatible modem emulator. Network devices support autodial, - channel-bundling, callback and caller-authentication without having - a daemon running. A reduced T.70 protocol is supported with tty's - suitable for German BTX. On D-Channel, the protocols EDSS1 - (Euro-ISDN) and 1TR6 (German style) are supported. See - <file:Documentation/isdn/README> for more information. - - If you want to compile the ISDN code as a module ( = code which can - be inserted in and removed from the running kernel whenever you - want), say M here and read <file:Documentation/modules.txt>. The - module will be called isdn.o. If unsure, say N. - CONFIG_GDB_CONSOLE If you are using GDB for remote debugging over a serial port and would like kernel messages to be formatted into GDB $O packets so diff --git a/arch/mips64/Config.help b/arch/mips64/Config.help index f82765e84..3e09dbb67 100644 --- a/arch/mips64/Config.help +++ b/arch/mips64/Config.help @@ -438,31 +438,6 @@ CONFIG_MAGIC_SYSRQ keys are documented in <file:Documentation/sysrq.txt>. Don't say Y unless you really know what this hack does. -CONFIG_ISDN - ISDN ("Integrated Services Digital Networks", called RNIS in France) - is a special type of fully digital telephone service; it's mostly - used to connect to your Internet service provider (with SLIP or - PPP). The main advantage is that the speed is higher than ordinary - modem/telephone connections, and that you can have voice - conversations while downloading stuff. It only works if your - computer is equipped with an ISDN card and both you and your service - provider purchased an ISDN line from the phone company. For - details, read <http://alumni.caltech.edu/~dank/isdn/> on the WWW. - - This driver allows you to use an ISDN-card for networking - connections and as dialin/out device. The isdn-tty's have a built - in AT-compatible modem emulator. Network devices support autodial, - channel-bundling, callback and caller-authentication without having - a daemon running. A reduced T.70 protocol is supported with tty's - suitable for German BTX. On D-Channel, the protocols EDSS1 - (Euro-ISDN) and 1TR6 (German style) are supported. See - <file:Documentation/isdn/README> for more information. - - If you want to compile the ISDN code as a module ( = code which can - be inserted in and removed from the running kernel whenever you - want), say M here and read <file:Documentation/modules.txt>. The - module will be called isdn.o. If unsure, say N. - CONFIG_BINFMT_ELF32 This allows you to run 32-bit Linux/ELF binaries on your Ultra. Everybody wants this; say Y. diff --git a/arch/ppc/Config.help b/arch/ppc/Config.help index 5786797a8..603820e45 100644 --- a/arch/ppc/Config.help +++ b/arch/ppc/Config.help @@ -551,31 +551,6 @@ CONFIG_MAGIC_SYSRQ keys are documented in <file:Documentation/sysrq.txt>. Don't say Y unless you really know what this hack does. -CONFIG_ISDN - ISDN ("Integrated Services Digital Networks", called RNIS in France) - is a special type of fully digital telephone service; it's mostly - used to connect to your Internet service provider (with SLIP or - PPP). The main advantage is that the speed is higher than ordinary - modem/telephone connections, and that you can have voice - conversations while downloading stuff. It only works if your - computer is equipped with an ISDN card and both you and your service - provider purchased an ISDN line from the phone company. For - details, read <http://alumni.caltech.edu/~dank/isdn/> on the WWW. - - This driver allows you to use an ISDN-card for networking - connections and as dialin/out device. The isdn-tty's have a built - in AT-compatible modem emulator. Network devices support autodial, - channel-bundling, callback and caller-authentication without having - a daemon running. A reduced T.70 protocol is supported with tty's - suitable for German BTX. On D-Channel, the protocols EDSS1 - (Euro-ISDN) and 1TR6 (German style) are supported. See - <file:Documentation/isdn/README> for more information. - - If you want to compile the ISDN code as a module ( = code which can - be inserted in and removed from the running kernel whenever you - want), say M here and read <file:Documentation/modules.txt>. The - module will be called isdn.o. If unsure, say N. - CONFIG_PROC_HARDWARE Say Y here to support the /proc/hardware file, which gives you access to information about the machine you're running on, diff --git a/arch/sparc/Config.help b/arch/sparc/Config.help index a6c229093..f64c93438 100644 --- a/arch/sparc/Config.help +++ b/arch/sparc/Config.help @@ -1054,31 +1054,6 @@ CONFIG_MAGIC_SYSRQ keys are documented in <file:Documentation/sysrq.txt>. Don't say Y unless you really know what this hack does. -CONFIG_ISDN - ISDN ("Integrated Services Digital Networks", called RNIS in France) - is a special type of fully digital telephone service; it's mostly - used to connect to your Internet service provider (with SLIP or - PPP). The main advantage is that the speed is higher than ordinary - modem/telephone connections, and that you can have voice - conversations while downloading stuff. It only works if your - computer is equipped with an ISDN card and both you and your service - provider purchased an ISDN line from the phone company. For - details, read <http://alumni.caltech.edu/~dank/isdn/> on the WWW. - - This driver allows you to use an ISDN-card for networking - connections and as dialin/out device. The isdn-tty's have a built - in AT-compatible modem emulator. Network devices support autodial, - channel-bundling, callback and caller-authentication without having - a daemon running. A reduced T.70 protocol is supported with tty's - suitable for German BTX. On D-Channel, the protocols EDSS1 - (Euro-ISDN) and 1TR6 (German style) are supported. See - <file:Documentation/isdn/README> for more information. - - If you want to compile the ISDN code as a module ( = code which can - be inserted in and removed from the running kernel whenever you - want), say M here and read <file:Documentation/modules.txt>. The - module will be called isdn.o. If unsure, say N. - CONFIG_SUN4 Say Y here if, and only if, your machine is a Sun4. Note that a kernel compiled with this option will run only on Sun4. diff --git a/arch/sparc64/Config.help b/arch/sparc64/Config.help index 907510ad4..237c8af3c 100644 --- a/arch/sparc64/Config.help +++ b/arch/sparc64/Config.help @@ -25,6 +25,16 @@ CONFIG_SMP If you don't know what to do here, say N. +CONFIG_PREEMPT + This option reduces the latency of the kernel when reacting to + real-time or interactive events by allowing a low priority process to + be preempted even if it is in kernel mode executing a system call. + This allows applications to run more reliably even when the system is + under load. + + Say Y here if you are building a kernel for a desktop, embedded + or real-time system. Say N if you are unsure. + CONFIG_SPARC64 SPARC is a family of RISC microprocessors designed and marketed by Sun Microsystems, incorporated. This port covers the newer 64-bit diff --git a/arch/sparc64/config.in b/arch/sparc64/config.in index cd712df8c..616a2f6a5 100644 --- a/arch/sparc64/config.in +++ b/arch/sparc64/config.in @@ -1,4 +1,4 @@ -# $Id: config.in,v 1.158 2002-01-24 22:14:44 davem Exp $ +# $Id: config.in,v 1.159 2002-02-11 06:42:06 davem Exp $ # For a description of the syntax of this configuration file, # see the Configure script. # @@ -15,6 +15,7 @@ define_bool CONFIG_VT y define_bool CONFIG_VT_CONSOLE y bool 'Symmetric multi-processing support' CONFIG_SMP +bool 'Preemptible kernel' CONFIG_PREEMPT # Identify this as a Sparc64 build define_bool CONFIG_SPARC64 y diff --git a/arch/sparc64/kernel/entry.S b/arch/sparc64/kernel/entry.S index 285da2180..7069592d2 100644 --- a/arch/sparc64/kernel/entry.S +++ b/arch/sparc64/kernel/entry.S @@ -1,4 +1,4 @@ -/* $Id: entry.S,v 1.144 2002-02-09 19:49:30 davem Exp $ +/* $Id: entry.S,v 1.145 2002-02-11 06:42:06 davem Exp $ * arch/sparc64/kernel/entry.S: Sparc64 trap low-level entry points. * * Copyright (C) 1995,1997 David S. Miller (davem@caip.rutgers.edu) @@ -713,8 +713,8 @@ floppy_dosoftint: call sparc_floppy_irq add %sp, STACK_BIAS + REGWIN_SZ, %o2 - b,pt %xcc, rtrap - clr %l6 + b,pt %xcc, rtrap_irq + nop #endif /* CONFIG_BLK_DEV_FD */ @@ -883,7 +883,7 @@ cee_trap: mov %l5, %o1 call cee_log add %sp, STACK_BIAS + REGWIN_SZ, %o2 - ba,a,pt %xcc, rtrap_clr_l6 + ba,a,pt %xcc, rtrap_irq /* Capture I/D/E-cache state into per-cpu error scoreboard. * @@ -1109,7 +1109,7 @@ cheetah_fast_ecc: mov %l5, %o2 call cheetah_fecc_handler add %sp, STACK_BIAS + REGWIN_SZ, %o0 - ba,a,pt %xcc, rtrap_clr_l6 + ba,a,pt %xcc, rtrap_irq /* Our caller has disabled I-cache and performed membar Sync. */ .globl cheetah_cee @@ -1135,7 +1135,7 @@ cheetah_cee: mov %l5, %o2 call cheetah_cee_handler add %sp, STACK_BIAS + REGWIN_SZ, %o0 - ba,a,pt %xcc, rtrap_clr_l6 + ba,a,pt %xcc, rtrap_irq /* Our caller has disabled I-cache+D-cache and performed membar Sync. */ .globl cheetah_deferred_trap @@ -1161,7 +1161,7 @@ cheetah_deferred_trap: mov %l5, %o2 call cheetah_deferred_handler add %sp, STACK_BIAS + REGWIN_SZ, %o0 - ba,a,pt %xcc, rtrap_clr_l6 + ba,a,pt %xcc, rtrap_irq .globl __do_privact __do_privact: diff --git a/arch/sparc64/kernel/etrap.S b/arch/sparc64/kernel/etrap.S index 70e07eff4..3624e5012 100644 --- a/arch/sparc64/kernel/etrap.S +++ b/arch/sparc64/kernel/etrap.S @@ -1,10 +1,12 @@ -/* $Id: etrap.S,v 1.46 2002-02-09 19:49:30 davem Exp $ +/* $Id: etrap.S,v 1.47 2002-02-11 06:42:06 davem Exp $ * etrap.S: Preparing for entry into the kernel on Sparc V9. * * Copyright (C) 1996, 1997 David S. Miller (davem@caip.rutgers.edu) * Copyright (C) 1997, 1998, 1999 Jakub Jelinek (jj@ultra.linux.cz) */ +#include <linux/config.h> + #include <asm/asi.h> #include <asm/pstate.h> #include <asm/ptrace.h> @@ -25,9 +27,17 @@ .text .align 64 .globl etrap, etrap_irq, etraptl1 - +#ifdef CONFIG_PREEMPT +etrap_irq: ldsw [%g6 + TI_PRE_COUNT], %g1 + add %g1, 1, %g1 + ba,pt %xcc, etrap_irq2 + stw %g1, [%g6 + TI_PRE_COUNT] +#endif etrap: rdpr %pil, %g2 ! Single Group -etrap_irq: rdpr %tstate, %g1 ! Single Group +#ifndef CONFIG_PREEMPT +etrap_irq: +#endif +etrap_irq2: rdpr %tstate, %g1 ! Single Group sllx %g2, 20, %g3 ! IEU0 Group andcc %g1, TSTATE_PRIV, %g0 ! IEU1 or %g1, %g3, %g1 ! IEU0 Group diff --git a/arch/sparc64/kernel/process.c b/arch/sparc64/kernel/process.c index 561b24dbe..56d55e537 100644 --- a/arch/sparc64/kernel/process.c +++ b/arch/sparc64/kernel/process.c @@ -1,4 +1,4 @@ -/* $Id: process.c,v 1.133 2002-02-11 04:47:29 davem Exp $ +/* $Id: process.c,v 1.134 2002-02-11 06:42:06 davem Exp $ * arch/sparc64/kernel/process.c * * Copyright (C) 1995, 1996 David S. Miller (davem@caip.rutgers.edu) @@ -100,6 +100,18 @@ int cpu_idle(void) #endif +#ifdef CONFIG_PREEMPT +void kpreempt_maybe(void) +{ + int cpu = smp_processor_id(); + + if (local_irq_count(cpu) == 0 && + local_bh_count(cpu) == 0) + preempt_schedule(); + current_thread_info()->preempt_count--; +} +#endif + extern char reboot_command []; #ifdef CONFIG_SUN_CONSOLE @@ -371,7 +383,7 @@ unsigned long thread_saved_pc(struct task_struct *tsk) { struct thread_info *ti = tsk->thread_info; unsigned long ret = 0xdeadbeefUL; - + if (ti && ti->ksp) { unsigned long *sp; sp = (unsigned long *)(ti->ksp + STACK_BIAS); diff --git a/arch/sparc64/kernel/rtrap.S b/arch/sparc64/kernel/rtrap.S index 76b9b32de..5cdddfdb9 100644 --- a/arch/sparc64/kernel/rtrap.S +++ b/arch/sparc64/kernel/rtrap.S @@ -1,10 +1,12 @@ -/* $Id: rtrap.S,v 1.61 2002-02-09 19:49:31 davem Exp $ +/* $Id: rtrap.S,v 1.62 2002-02-11 06:42:06 davem Exp $ * rtrap.S: Preparing for return from trap on Sparc V9. * * Copyright (C) 1997,1998 Jakub Jelinek (jj@sunsite.mff.cuni.cz) * Copyright (C) 1997 David S. Miller (davem@caip.rutgers.edu) */ +#include <linux/config.h> + #include <asm/asi.h> #include <asm/pstate.h> #include <asm/ptrace.h> @@ -148,7 +150,13 @@ __handle_signal: andn %l1, %l4, %l1 .align 64 - .globl rtrap_clr_l6, rtrap, irqsz_patchme + .globl rtrap_irq, rtrap_clr_l6, rtrap, irqsz_patchme +rtrap_irq: +#ifdef CONFIG_PREEMPT + ldsw [%g6 + TI_PRE_COUNT], %l0 + sub %l0, 1, %l0 + stw %l0, [%g6 + TI_PRE_COUNT] +#endif rtrap_clr_l6: clr %l6 rtrap: ldub [%g6 + TI_CPU], %l0 sethi %hi(irq_stat), %l2 ! &softirq_active @@ -261,7 +269,18 @@ rt_continue: ldx [%sp + PTREGS_OFF + PT_V9_G1], %g1 kern_rtt: restore retry -to_kernel: ldub [%g6 + TI_FPDEPTH], %l5 +to_kernel: +#ifdef CONFIG_PREEMPT + ldsw [%g6 + TI_PRE_COUNT], %l5 + brnz %l5, kern_fpucheck + add %l5, 1, %l6 + stw %l6, [%g6 + TI_PRE_COUNT] + call kpreempt_maybe + wrpr %g0, RTRAP_PSTATE, %pstate + wrpr %g0, RTRAP_PSTATE_IRQOFF, %pstate + stw %l5, [%g6 + TI_PRE_COUNT] +#endif +kern_fpucheck: ldub [%g6 + TI_FPDEPTH], %l5 brz,pt %l5, rt_continue srl %l5, 1, %o0 add %g6, TI_FPSAVED, %l6 diff --git a/arch/sparc64/kernel/smp.c b/arch/sparc64/kernel/smp.c index 218b9d31c..e0b6632b0 100644 --- a/arch/sparc64/kernel/smp.c +++ b/arch/sparc64/kernel/smp.c @@ -902,7 +902,7 @@ void smp_migrate_task(int cpu, task_t *p) if (smp_processors_ready && (cpu_present_map & mask) != 0) { u64 data0 = (((u64)&xcall_migrate_task) & 0xffffffff); - spin_lock(&migration_lock); + _raw_spin_lock(&migration_lock); new_task = p; if (tlb_type == spitfire) @@ -923,7 +923,7 @@ asmlinkage void smp_task_migration_interrupt(int irq, struct pt_regs *regs) clear_softint(1 << irq); p = new_task; - spin_unlock(&migration_lock); + _raw_spin_unlock(&migration_lock); sched_task_migrated(p); } diff --git a/arch/sparc64/kernel/sys_sparc32.c b/arch/sparc64/kernel/sys_sparc32.c index b5a876d10..494c2a0bb 100644 --- a/arch/sparc64/kernel/sys_sparc32.c +++ b/arch/sparc64/kernel/sys_sparc32.c @@ -1,4 +1,4 @@ -/* $Id: sys_sparc32.c,v 1.184 2002-02-09 19:49:31 davem Exp $ +/* $Id: sys_sparc32.c,v 1.185 2002-02-11 06:42:06 davem Exp $ * sys_sparc32.c: Conversion between 32bit and 64bit native syscalls. * * Copyright (C) 1997,1998 Jakub Jelinek (jj@sunsite.mff.cuni.cz) @@ -49,6 +49,7 @@ #include <linux/in.h> #include <linux/icmpv6.h> #include <linux/sysctl.h> +#include <linux/binfmts.h> #include <asm/types.h> #include <asm/ipc.h> diff --git a/arch/sparc64/kernel/traps.c b/arch/sparc64/kernel/traps.c index 3f8e7abeb..0aa221c24 100644 --- a/arch/sparc64/kernel/traps.c +++ b/arch/sparc64/kernel/traps.c @@ -1,4 +1,4 @@ -/* $Id: traps.c,v 1.85 2002-02-09 19:49:31 davem Exp $ +/* $Id: traps.c,v 1.86 2002-02-11 06:42:06 davem Exp $ * arch/sparc64/kernel/traps.c * * Copyright (C) 1995,1997 David S. Miller (davem@caip.rutgers.edu) @@ -1700,6 +1700,7 @@ void trap_init(void) TI_KERN_CNTD1 != offsetof(struct thread_info, kernel_cntd1) || TI_PCR != offsetof(struct thread_info, pcr_reg) || TI_CEE_STUFF != offsetof(struct thread_info, cee_stuff) || + TI_PRE_COUNT != offsetof(struct thread_info, preempt_count) || TI_FPREGS != offsetof(struct thread_info, fpregs) || (TI_FPREGS & (64 - 1))) thread_info_offsets_are_bolixed_dave(); diff --git a/arch/sparc64/lib/VISsave.S b/arch/sparc64/lib/VISsave.S index b95beb596..e2aeb6d67 100644 --- a/arch/sparc64/lib/VISsave.S +++ b/arch/sparc64/lib/VISsave.S @@ -1,4 +1,4 @@ -/* $Id: VISsave.S,v 1.6 2002-02-09 19:49:30 davem Exp $ +/* $Id: VISsave.S,v 1.7 2002-02-11 06:42:06 davem Exp $ * VISsave.S: Code for saving FPU register state for * VIS routines. One should not call this directly, * but use macros provided in <asm/visasm.h>. @@ -18,6 +18,10 @@ /* On entry: %o5=current FPRS value, %g7 is callers address */ /* May clobber %o5, %g1, %g2, %g3, %g7, %icc, %xcc */ + /* Nothing special need be done here to handle pre-emption, this + * FPU save/restore mechanism is already preemption safe. + */ + .align 32 VISenter: ldub [%g6 + TI_FPDEPTH], %g1 diff --git a/arch/sparc64/lib/dec_and_lock.S b/arch/sparc64/lib/dec_and_lock.S index 28b7a9bf6..f83793804 100644 --- a/arch/sparc64/lib/dec_and_lock.S +++ b/arch/sparc64/lib/dec_and_lock.S @@ -1,10 +1,11 @@ -/* $Id: dec_and_lock.S,v 1.5 2001-11-18 00:12:56 davem Exp $ +/* $Id: dec_and_lock.S,v 1.6 2002-02-11 06:42:06 davem Exp $ * dec_and_lock.S: Sparc64 version of "atomic_dec_and_lock()" * using cas and ldstub instructions. * * Copyright (C) 2000 David S. Miller (davem@redhat.com) */ #include <linux/config.h> +#include <asm/thread_info.h> #ifndef CONFIG_DEBUG_SPINLOCK .text @@ -40,6 +41,11 @@ out: membar #StoreLoad | #StoreStore retl mov %g1, %o0 +#ifdef CONFIG_PREEMPT + ldsw [%g6 + TI_PRE_COUNT], %g3 + add %g3, 1, %g3 + stw %g3, [%g6 + TI_PRE_COUNT] +#endif to_zero: ldstub [%o1], %g3 brnz,pn %g3, spin_on_lock @@ -55,6 +61,11 @@ loop2: cas [%o0], %g5, %g7 /* ASSERT(g7 == 0) */ nop membar #StoreStore | #LoadStore stb %g0, [%o1] +#ifdef CONFIG_PREEMPT + ldsw [%g6 + TI_PRE_COUNT], %g3 + sub %g3, 1, %g3 + stw %g3, [%g6 + TI_PRE_COUNT] +#endif b,pt %xcc, nzero nop diff --git a/arch/sparc64/mm/ultra.S b/arch/sparc64/mm/ultra.S index 948a3b4fb..5344dcd65 100644 --- a/arch/sparc64/mm/ultra.S +++ b/arch/sparc64/mm/ultra.S @@ -1,4 +1,4 @@ -/* $Id: ultra.S,v 1.72 2002-02-09 19:49:31 davem Exp $ +/* $Id: ultra.S,v 1.73 2002-02-11 06:42:06 davem Exp $ * ultra.S: Don't expand these all over the place... * * Copyright (C) 1997, 2000 David S. Miller (davem@redhat.com) @@ -493,8 +493,8 @@ xcall_report_regs: 109: or %g7, %lo(109b), %g7 call __show_regs add %sp, STACK_BIAS + REGWIN_SZ, %o0 - b,pt %xcc, rtrap - clr %l6 + b,pt %xcc, rtrap_irq + nop .align 32 .globl xcall_flush_dcache_page_cheetah @@ -554,8 +554,8 @@ xcall_capture: 109: or %g7, %lo(109b), %g7 call smp_penguin_jailcell nop - b,pt %xcc, rtrap - clr %l6 + b,pt %xcc, rtrap_irq + nop .globl xcall_promstop xcall_promstop: @@ -681,8 +681,8 @@ xcall_call_function: 109: or %g7, %lo(109b), %g7 call smp_call_function_client nop - b,pt %xcc, rtrap - clr %l6 + b,pt %xcc, rtrap_irq + nop .globl xcall_migrate_task xcall_migrate_task: diff --git a/drivers/base/core.c b/drivers/base/core.c index 4a8b527c6..978e3f5e9 100644 --- a/drivers/base/core.c +++ b/drivers/base/core.c @@ -9,6 +9,7 @@ #include <linux/module.h> #include <linux/slab.h> #include <linux/init.h> +#include <linux/err.h> #undef DEBUG diff --git a/drivers/base/fs.c b/drivers/base/fs.c index 363ac8a1b..39cf1fb50 100644 --- a/drivers/base/fs.c +++ b/drivers/base/fs.c @@ -9,6 +9,8 @@ #include <linux/module.h> #include <linux/string.h> #include <linux/slab.h> +#include <linux/err.h> +#include <linux/stat.h> extern struct driver_file_entry * device_default_files[]; diff --git a/drivers/base/interface.c b/drivers/base/interface.c index 61a3fa599..f7698d3df 100644 --- a/drivers/base/interface.c +++ b/drivers/base/interface.c @@ -6,6 +6,8 @@ */ #include <linux/device.h> +#include <linux/err.h> +#include <linux/stat.h> /** * device_read_status - report some device information diff --git a/drivers/char/agp/agpgart_be.c b/drivers/char/agp/agpgart_be.c index 2f717b911..3c4b24e10 100644 --- a/drivers/char/agp/agpgart_be.c +++ b/drivers/char/agp/agpgart_be.c @@ -2391,7 +2391,7 @@ static int amd_create_gatt_table(void) agp_bridge.gatt_table_real = page_dir.real; agp_bridge.gatt_table = page_dir.remapped; - agp_bridge.gatt_bus_addr = virt_to_bus(page_dir.real); + agp_bridge.gatt_bus_addr = virt_to_phys(page_dir.real); /* Get the address for the gart region. * This is a bus address even on the alpha, b/c its @@ -2405,7 +2405,7 @@ static int amd_create_gatt_table(void) /* Calculate the agp offset */ for(i = 0; i < value->num_entries / 1024; i++, addr += 0x00400000) { page_dir.remapped[GET_PAGE_DIR_OFF(addr)] = - virt_to_bus(amd_irongate_private.gatt_pages[i]->real); + virt_to_phys(amd_irongate_private.gatt_pages[i]->real); page_dir.remapped[GET_PAGE_DIR_OFF(addr)] |= 0x00000001; } @@ -3027,7 +3027,7 @@ static int serverworks_create_gatt_table(void) for(i = 0; i < 1024; i++) { serverworks_private.scratch_dir.remapped[i] = (unsigned long) agp_bridge.scratch_page; page_dir.remapped[i] = - virt_to_bus(serverworks_private.scratch_dir.real); + virt_to_phys(serverworks_private.scratch_dir.real); page_dir.remapped[i] |= 0x00000001; } @@ -3040,7 +3040,7 @@ static int serverworks_create_gatt_table(void) agp_bridge.gatt_table_real = page_dir.real; agp_bridge.gatt_table = page_dir.remapped; - agp_bridge.gatt_bus_addr = virt_to_bus(page_dir.real); + agp_bridge.gatt_bus_addr = virt_to_phys(page_dir.real); /* Get the address for the gart region. * This is a bus address even on the alpha, b/c its @@ -3056,7 +3056,7 @@ static int serverworks_create_gatt_table(void) for(i = 0; i < value->num_entries / 1024; i++) { page_dir.remapped[i] = - virt_to_bus(serverworks_private.gatt_pages[i]->real); + virt_to_phys(serverworks_private.gatt_pages[i]->real); page_dir.remapped[i] |= 0x00000001; } diff --git a/drivers/char/generic_serial.c b/drivers/char/generic_serial.c index 9fa07e66f..4ff7dc3fe 100644 --- a/drivers/char/generic_serial.c +++ b/drivers/char/generic_serial.c @@ -143,9 +143,14 @@ int gs_write(struct tty_struct * tty, int from_user, /* Can't copy more? break out! */ if (c <= 0) break; if (from_user) - copy_from_user (port->xmit_buf + port->xmit_head, buf, c); + if (copy_from_user (port->xmit_buf + port->xmit_head, + buf, c)) { + up (& port->port_write_sem); + return -EFAULT; + } + else - memcpy (port->xmit_buf + port->xmit_head, buf, c); + memcpy (port->xmit_buf + port->xmit_head, buf, c); port -> xmit_cnt += c; port -> xmit_head = (port->xmit_head + c) & (SERIAL_XMIT_SIZE -1); @@ -604,7 +609,7 @@ int gs_block_til_ready(void *port_, struct file * filp) * until it's done, and then try again. */ if (tty_hung_up_p(filp) || port->flags & ASYNC_CLOSING) { - interruptible_sleep_on(&port->close_wait); + interruptible_sleep_on(&port->close_wait); if (port->flags & ASYNC_HUP_NOTIFY) return -EAGAIN; else @@ -1003,7 +1008,8 @@ int gs_setserial(struct gs_port *port, struct serial_struct *sp) { struct serial_struct sio; - copy_from_user(&sio, sp, sizeof(struct serial_struct)); + if (copy_from_user(&sio, sp, sizeof(struct serial_struct))) + return(-EFAULT); if (!capable(CAP_SYS_ADMIN)) { if ((sio.baud_base != port->baud_base) || @@ -1033,7 +1039,7 @@ int gs_setserial(struct gs_port *port, struct serial_struct *sp) * Generate the serial struct info. */ -void gs_getserial(struct gs_port *port, struct serial_struct *sp) +int gs_getserial(struct gs_port *port, struct serial_struct *sp) { struct serial_struct sio; @@ -1055,7 +1061,10 @@ void gs_getserial(struct gs_port *port, struct serial_struct *sp) if (port->rd->getserial) port->rd->getserial (port, &sio); - copy_to_user(sp, &sio, sizeof(struct serial_struct)); + if (copy_to_user(sp, &sio, sizeof(struct serial_struct))) + return -EFAULT; + return 0; + } diff --git a/drivers/char/random.c b/drivers/char/random.c index 656a38b22..0efd9b3ac 100644 --- a/drivers/char/random.c +++ b/drivers/char/random.c @@ -251,6 +251,7 @@ #include <linux/random.h> #include <linux/poll.h> #include <linux/init.h> +#include <linux/fs.h> #include <asm/processor.h> #include <asm/uaccess.h> diff --git a/drivers/char/rio/rio_linux.c b/drivers/char/rio/rio_linux.c index 3b41b68f1..293008c70 100644 --- a/drivers/char/rio/rio_linux.c +++ b/drivers/char/rio/rio_linux.c @@ -742,7 +742,7 @@ static int rio_ioctl (struct tty_struct * tty, struct file * filp, case TIOCGSERIAL: if ((rc = verify_area(VERIFY_WRITE, (void *) arg, sizeof(struct serial_struct))) == 0) - gs_getserial(&PortP->gs, (struct serial_struct *) arg); + rc = gs_getserial(&PortP->gs, (struct serial_struct *) arg); break; case TCSBRK: if ( PortP->State & RIO_DELETED ) { diff --git a/drivers/char/serial_tx3912.c b/drivers/char/serial_tx3912.c index d2b46ac44..4743489b0 100644 --- a/drivers/char/serial_tx3912.c +++ b/drivers/char/serial_tx3912.c @@ -673,7 +673,7 @@ static int rs_ioctl (struct tty_struct * tty, struct file * filp, case TIOCGSERIAL: if ((rc = verify_area(VERIFY_WRITE, (void *) arg, sizeof(struct serial_struct))) == 0) - gs_getserial(&port->gs, (struct serial_struct *) arg); + rc = gs_getserial(&port->gs, (struct serial_struct *) arg); break; case TIOCSSERIAL: if ((rc = verify_area(VERIFY_READ, (void *) arg, diff --git a/drivers/char/sh-sci.c b/drivers/char/sh-sci.c index 7b5b22b30..6ae9b6372 100644 --- a/drivers/char/sh-sci.c +++ b/drivers/char/sh-sci.c @@ -919,7 +919,7 @@ static int sci_ioctl(struct tty_struct * tty, struct file * filp, case TIOCGSERIAL: if ((rc = verify_area(VERIFY_WRITE, (void *) arg, sizeof(struct serial_struct))) == 0) - gs_getserial(&port->gs, (struct serial_struct *) arg); + rc = gs_getserial(&port->gs, (struct serial_struct *) arg); break; case TIOCSSERIAL: if ((rc = verify_area(VERIFY_READ, (void *) arg, diff --git a/drivers/char/sx.c b/drivers/char/sx.c index 3ff098490..947f76a60 100644 --- a/drivers/char/sx.c +++ b/drivers/char/sx.c @@ -1160,7 +1160,8 @@ static inline void sx_check_modem_signals (struct sx_port *port) /* DCD went UP */ if( (~(port->gs.flags & ASYNC_NORMAL_ACTIVE) || ~(port->gs.flags & ASYNC_CALLOUT_ACTIVE)) && - (sx_read_channel_byte(port, hi_hstat) != HS_IDLE_CLOSED)) { + (sx_read_channel_byte(port, hi_hstat) != HS_IDLE_CLOSED) && + !(port->gs.tty->termios->c_cflag & CLOCAL) ) { /* Are we blocking in open?*/ sx_dprintk (SX_DEBUG_MODEMSIGNALS, "DCD active, unblocking open\n"); wake_up_interruptible(&port->gs.open_wait); @@ -1170,7 +1171,8 @@ static inline void sx_check_modem_signals (struct sx_port *port) } else { /* DCD went down! */ if (!((port->gs.flags & ASYNC_CALLOUT_ACTIVE) && - (port->gs.flags & ASYNC_CALLOUT_NOHUP))) { + (port->gs.flags & ASYNC_CALLOUT_NOHUP)) && + !(port->gs.tty->termios->c_cflag & CLOCAL) ) { sx_dprintk (SX_DEBUG_MODEMSIGNALS, "DCD dropped. hanging up....\n"); tty_hangup (port->gs.tty); } else { @@ -1815,7 +1817,7 @@ static int sx_ioctl (struct tty_struct * tty, struct file * filp, case TIOCGSERIAL: if ((rc = verify_area(VERIFY_WRITE, (void *) arg, sizeof(struct serial_struct))) == 0) - gs_getserial(&port->gs, (struct serial_struct *) arg); + rc = gs_getserial(&port->gs, (struct serial_struct *) arg); break; case TIOCSSERIAL: if ((rc = verify_area(VERIFY_READ, (void *) arg, diff --git a/drivers/isdn/Makefile b/drivers/isdn/Makefile index a30e5f970..88e37e3d4 100644 --- a/drivers/isdn/Makefile +++ b/drivers/isdn/Makefile @@ -2,7 +2,7 @@ # The target object and module list name. -O_TARGET := isdn.a +O_TARGET := vmlinux-obj.o # Objects that export symbols. diff --git a/drivers/isdn/hisax/elsa.c b/drivers/isdn/hisax/elsa.c index 65043e636..446206066 100644 --- a/drivers/isdn/hisax/elsa.c +++ b/drivers/isdn/hisax/elsa.c @@ -1017,7 +1017,7 @@ setup_elsa(struct IsdnCard *card) return(0); } if (cs->hw.elsa.cfg & 0x80 && pci_rev == 1) { - printk(KERN_INFO "Elsa: PLX9050 rev1 workaround activated"); + printk(KERN_INFO "Elsa: PLX9050 rev1 workaround activated\n"); set_bit(FLG_BUGGY_PLX9050, &cs->HW_Flags); } cs->hw.elsa.ale = cs->hw.elsa.base; diff --git a/drivers/isdn/hisax/gazel.c b/drivers/isdn/hisax/gazel.c index a99fc45e1..3de9d2187 100644 --- a/drivers/isdn/hisax/gazel.c +++ b/drivers/isdn/hisax/gazel.c @@ -636,7 +636,7 @@ setup_gazelpci(struct IsdnCardState *cs) if (cs->hw.gazel.cfg_reg & 0x80) { pci_read_config_byte(dev_tel, PCI_REVISION_ID, &pci_rev); if (pci_rev == 1) { - printk(KERN_INFO "Gazel: PLX9050 rev1 workaround activated"); + printk(KERN_INFO "Gazel: PLX9050 rev1 workaround activated\n"); set_bit(FLG_BUGGY_PLX9050, &cs->HW_Flags); } } diff --git a/drivers/net/aironet4500_proc.c b/drivers/net/aironet4500_proc.c index 1946e9c7a..94a77d917 100644 --- a/drivers/net/aironet4500_proc.c +++ b/drivers/net/aironet4500_proc.c @@ -33,15 +33,10 @@ #include <linux/if_arp.h> #include <linux/ioport.h> - #ifdef CONFIG_PROC_FS -#ifdef CONFIG_PROC_FS #include <linux/sysctl.h> -#else -#error awc driver needs CONFIG_PROC_FS -#endif - +#include <linux/fs.h> #include "aironet4500.h" #include "aironet4500_rid.c" @@ -603,5 +598,8 @@ static void aironet_proc_exit(void){ module_init(aironet_proc_init); module_exit(aironet_proc_exit); +#else +#error awc driver needs CONFIG_PROC_FS + #endif // whole proc system styff MODULE_LICENSE("GPL"); diff --git a/drivers/net/bsd_comp.c b/drivers/net/bsd_comp.c index a93784df6..09afb2398 100644 --- a/drivers/net/bsd_comp.c +++ b/drivers/net/bsd_comp.c @@ -73,6 +73,8 @@ #include <linux/ppp-comp.h> #undef PACKETPTR +#include <asm/byteorder.h> + /* * PPP "BSD compress" compression * The differences between this compression and the classic BSD LZW diff --git a/drivers/net/eepro100.c b/drivers/net/eepro100.c index c670ba07f..cc17bdd3f 100644 --- a/drivers/net/eepro100.c +++ b/drivers/net/eepro100.c @@ -162,13 +162,6 @@ static inline int null_set_power_state(struct pci_dev *dev, int state) (dev)->watchdog_timeo = (tm); \ } while(0) -#ifndef PCI_DEVICE_ID_INTEL_ID1029 -#define PCI_DEVICE_ID_INTEL_ID1029 0x1029 -#endif -#ifndef PCI_DEVICE_ID_INTEL_ID1030 -#define PCI_DEVICE_ID_INTEL_ID1030 0x1030 -#endif - static int speedo_debug = 1; @@ -2272,18 +2265,24 @@ static void __devexit eepro100_remove_one (struct pci_dev *pdev) static struct pci_device_id eepro100_pci_tbl[] __devinitdata = { { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82557, PCI_ANY_ID, PCI_ANY_ID, }, - { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82562ET, - PCI_ANY_ID, PCI_ANY_ID, }, { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82559ER, PCI_ANY_ID, PCI_ANY_ID, }, - { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801CAM, - PCI_ANY_ID, PCI_ANY_ID, }, - { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ID1029, - PCI_ANY_ID, PCI_ANY_ID, }, - { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ID1030, - PCI_ANY_ID, PCI_ANY_ID, }, { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801BA_7, PCI_ANY_ID, PCI_ANY_ID, }, + { PCI_VENDOR_ID_INTEL, 0x1029, PCI_ANY_ID, PCI_ANY_ID, }, + { PCI_VENDOR_ID_INTEL, 0x1030, PCI_ANY_ID, PCI_ANY_ID, }, + { PCI_VENDOR_ID_INTEL, 0x1031, PCI_ANY_ID, PCI_ANY_ID, }, + { PCI_VENDOR_ID_INTEL, 0x1032, PCI_ANY_ID, PCI_ANY_ID, }, + { PCI_VENDOR_ID_INTEL, 0x1033, PCI_ANY_ID, PCI_ANY_ID, }, + { PCI_VENDOR_ID_INTEL, 0x1034, PCI_ANY_ID, PCI_ANY_ID, }, + { PCI_VENDOR_ID_INTEL, 0x1035, PCI_ANY_ID, PCI_ANY_ID, }, + { PCI_VENDOR_ID_INTEL, 0x1036, PCI_ANY_ID, PCI_ANY_ID, }, + { PCI_VENDOR_ID_INTEL, 0x1037, PCI_ANY_ID, PCI_ANY_ID, }, + { PCI_VENDOR_ID_INTEL, 0x1038, PCI_ANY_ID, PCI_ANY_ID, }, + { PCI_VENDOR_ID_INTEL, 0x1227, PCI_ANY_ID, PCI_ANY_ID, }, + { PCI_VENDOR_ID_INTEL, 0x1228, PCI_ANY_ID, PCI_ANY_ID, }, + { PCI_VENDOR_ID_INTEL, 0x5200, PCI_ANY_ID, PCI_ANY_ID, }, + { PCI_VENDOR_ID_INTEL, 0x5201, PCI_ANY_ID, PCI_ANY_ID, }, { 0,} }; MODULE_DEVICE_TABLE(pci, eepro100_pci_tbl); diff --git a/drivers/pcmcia/cardbus.c b/drivers/pcmcia/cardbus.c index 7001c37d1..580c9d93b 100644 --- a/drivers/pcmcia/cardbus.c +++ b/drivers/pcmcia/cardbus.c @@ -279,13 +279,13 @@ int cb_alloc(socket_info_t * s) pci_readw(dev, PCI_DEVICE_ID, &dev->device); dev->hdr_type = hdr & 0x7f; + pci_setup_device(dev); + dev->dev.parent = bus->dev; strcpy(dev->dev.name, dev->name); strcpy(dev->dev.bus_id, dev->slot_name); device_register(&dev->dev); - pci_setup_device(dev); - /* FIXME: Do we need to enable the expansion ROM? */ for (r = 0; r < 7; r++) { struct resource *res = dev->resource + r; diff --git a/drivers/pnp/pnpbios_core.c b/drivers/pnp/pnpbios_core.c index d60ec7444..55a844e05 100644 --- a/drivers/pnp/pnpbios_core.c +++ b/drivers/pnp/pnpbios_core.c @@ -45,6 +45,7 @@ #include <linux/completion.h> #include <linux/spinlock.h> #include <asm/system.h> +#include <asm/byteorder.h> /* diff --git a/drivers/scsi/53c700.c b/drivers/scsi/53c700.c index f4da7117c..14f8e55fc 100644 --- a/drivers/scsi/53c700.c +++ b/drivers/scsi/53c700.c @@ -51,6 +51,14 @@ /* CHANGELOG * + * Version 2.7 + * + * Fixed scripts problem which caused certain devices (notably CDRWs) + * to hang on initial INQUIRY. Updated NCR_700_readl/writel to use + * __raw_readl/writel for parisc compatibility (Thomas + * Bogendoerfer). Added missing SCp->request_bufflen initialisation + * for sense requests (Ryan Bradetich). + * * Version 2.6 * * Following test of the 64 bit parisc kernel by Richard Hirst, @@ -96,7 +104,7 @@ * Initial modularisation from the D700. See NCR_D700.c for the rest of * the changelog. * */ -#define NCR_700_VERSION "2.6" +#define NCR_700_VERSION "2.7" #include <linux/config.h> #include <linux/version.h> @@ -310,7 +318,6 @@ NCR_700_detect(Scsi_Host_Template *tpnt, hostdata->pScript = pScript; NCR_700_dma_cache_wback((unsigned long)script, sizeof(SCRIPT)); hostdata->state = NCR_700_HOST_FREE; - spin_lock_init(&hostdata->lock); hostdata->cmd = NULL; host->max_id = 7; host->max_lun = NCR_700_MAX_LUNS; @@ -1048,6 +1055,7 @@ process_script_interrupt(__u32 dsps, __u32 dsp, Scsi_Cmnd *SCp, slot->pCmd, SCp->cmd_len, PCI_DMA_TODEVICE); + SCp->request_bufflen = sizeof(SCp->sense_buffer); slot->dma_handle = pci_map_single(hostdata->pci_dev, SCp->sense_buffer, sizeof(SCp->sense_buffer), PCI_DMA_FROMDEVICE); slot->SG[0].ins = bS_to_host(SCRIPT_MOVE_DATA_IN | sizeof(SCp->sense_buffer)); slot->SG[0].pAddr = bS_to_host(slot->dma_handle); @@ -1508,6 +1516,11 @@ NCR_700_intr(int irq, void *dev_id, struct pt_regs *regs) __u8 pun = 0xff, lun = 0xff; unsigned long flags; + /* Use the host lock to serialise acess to the 53c700 + * hardware. Note: In future, we may need to take the queue + * lock to enter the done routines. When that happens, we + * need to ensure that for this driver, the host lock and the + * queue lock point to the same thing. */ spin_lock_irqsave(host->host_lock, flags); if((istat = NCR_700_readb(host, ISTAT_REG)) & (SCSI_INT_PENDING | DMA_INT_PENDING)) { diff --git a/drivers/scsi/53c700.h b/drivers/scsi/53c700.h index 66721ea23..c106937d2 100644 --- a/drivers/scsi/53c700.h +++ b/drivers/scsi/53c700.h @@ -210,7 +210,7 @@ struct NCR_700_command_slot { struct NCR_700_Host_Parameters { /* These must be filled in by the calling driver */ int clock; /* board clock speed in MHz */ - __u32 base; /* the base for the port (copied to host) */ + unsigned long base; /* the base for the port (copied to host) */ struct pci_dev *pci_dev; __u32 dmode_extra; /* adjustable bus settings */ __u32 differential:1; /* if we are differential */ @@ -234,10 +234,6 @@ struct NCR_700_Host_Parameters { __u32 *script; /* pointer to script location */ __u32 pScript; /* physical mem addr of script */ - /* This will be the host lock. Unfortunately, we can't use it - * at the moment because of the necessity of holding the - * io_request_lock */ - spinlock_t lock; enum NCR_700_Host_State state; /* protected by state lock */ Scsi_Cmnd *cmd; /* Note: pScript contains the single consistent block of @@ -503,7 +499,7 @@ NCR_700_readb(struct Scsi_Host *host, __u32 reg) static inline __u32 NCR_700_readl(struct Scsi_Host *host, __u32 reg) { - __u32 value = readl(host->base + reg); + __u32 value = __raw_readl(host->base + reg); const struct NCR_700_Host_Parameters *hostdata __attribute__((unused)) = (struct NCR_700_Host_Parameters *)host->hostdata[0]; #if 1 @@ -536,7 +532,7 @@ NCR_700_writel(__u32 value, struct Scsi_Host *host, __u32 reg) BUG(); #endif - writel(bS_to_host(value), host->base + reg); + __raw_writel(bS_to_host(value), host->base + reg); } #elif defined(CONFIG_53C700_IO_MAPPED) static inline __u8 diff --git a/drivers/scsi/53c700.scr b/drivers/scsi/53c700.scr index 737c3c7e1..a064a092c 100644 --- a/drivers/scsi/53c700.scr +++ b/drivers/scsi/53c700.scr @@ -242,7 +242,7 @@ SendMessageWithATN: SendIdentifyMsg: CALL SendMessage - JUMP SendCommand + CLEAR ATN IgnoreMsgBeforeCommand: CLEAR ACK diff --git a/drivers/scsi/NCR_D700.c b/drivers/scsi/NCR_D700.c index 80a6c1d52..810d81ea6 100644 --- a/drivers/scsi/NCR_D700.c +++ b/drivers/scsi/NCR_D700.c @@ -36,6 +36,10 @@ /* CHANGELOG * + * Version 2.2 + * + * Added mca_set_adapter_name(). + * * Version 2.1 * * Modularise the driver into a Board piece (this file) and a chip @@ -86,7 +90,7 @@ * disconnections and reselections are being processed correctly. * */ -#define NCR_D700_VERSION "2.1" +#define NCR_D700_VERSION "2.2" #include <linux/config.h> #include <linux/version.h> @@ -299,6 +303,7 @@ D700_detect(Scsi_Host_Template *tpnt) continue; } found++; + mca_set_adapter_name(slot, "NCR D700 SCSI Adapter (version " NCR_D700_VERSION ")"); } } diff --git a/drivers/scsi/aha1542.c b/drivers/scsi/aha1542.c index a93ff6dd3..b49fb0e75 100644 --- a/drivers/scsi/aha1542.c +++ b/drivers/scsi/aha1542.c @@ -58,7 +58,7 @@ static void BAD_DMA(void *address, unsigned int length) { printk(KERN_CRIT "buf vaddress %p paddress 0x%lx length %d\n", address, - SCSI_BUS_PA(address), + SCSI_BUF_PA(address), length); panic("Buffer at physical address > 16Mb used for aha1542"); } @@ -68,7 +68,7 @@ static void BAD_SG_DMA(Scsi_Cmnd * SCpnt, int nseg, int badseg) { - printk(KERN_CRIT "sgpnt[%d:%d] page %p/0x%lx length %d\n", + printk(KERN_CRIT "sgpnt[%d:%d] page %p/0x%x length %d\n", badseg, nseg, page_address(sgpnt[badseg].page) + sgpnt[badseg].offset, SCSI_SG_PA(&sgpnt[badseg]), @@ -727,7 +727,7 @@ static int aha1542_queuecommand(Scsi_Cmnd * SCpnt, void (*done) (Scsi_Cmnd *)) panic("Foooooooood fight!"); }; any2scsi(cptr[i].dataptr, SCSI_SG_PA(&sgpnt[i])); - if (SCSI_SG_PA(&sgpnt[i].page) + sgpnt[i].length - 1 > ISA_DMA_THRESHOLD) + if (SCSI_SG_PA(&sgpnt[i]) + sgpnt[i].length - 1 > ISA_DMA_THRESHOLD) BAD_SG_DMA(SCpnt, sgpnt, SCpnt->use_sg, i); any2scsi(cptr[i].datalen, sgpnt[i].length); }; diff --git a/drivers/scsi/lasi700.c b/drivers/scsi/lasi700.c index b678ced62..e61e7310e 100644 --- a/drivers/scsi/lasi700.c +++ b/drivers/scsi/lasi700.c @@ -136,7 +136,6 @@ static int __init lasi700_driver_callback(struct parisc_device *dev) { unsigned long base = dev->hpa + LASI_SCSI_CORE_OFFSET; - int irq = busdevice_alloc_irq(dev); char *driver_name; struct Scsi_Host *host; struct NCR_700_Host_Parameters *hostdata = @@ -170,14 +169,15 @@ lasi700_driver_callback(struct parisc_device *dev) hostdata->chip710 = 1; hostdata->dmode_extra = DMODE_FC2; } + hostdata->pci_dev = ccio_get_fake(dev); if((host = NCR_700_detect(host_tpnt, hostdata)) == NULL) { kfree(hostdata); release_mem_region(host->base, 64); return 1; } - host->irq = irq; - if(request_irq(irq, NCR_700_intr, SA_SHIRQ, driver_name, host)) { - printk(KERN_ERR "%s: irq problem, detatching\n", + host->irq = dev->irq; + if(request_irq(dev->irq, NCR_700_intr, SA_SHIRQ, driver_name, host)) { + printk(KERN_ERR "%s: irq problem, detaching\n", driver_name); scsi_unregister(host); NCR_700_release(host); @@ -197,6 +197,7 @@ lasi700_release(struct Scsi_Host *host) kfree(hostdata); free_irq(host->irq, host); release_mem_region(host->base, 64); + unregister_parisc_driver(&lasi700_driver); return 1; } diff --git a/drivers/sound/cs4281/cs4281m.c b/drivers/sound/cs4281/cs4281m.c index 6854d7041..c67291e39 100644 --- a/drivers/sound/cs4281/cs4281m.c +++ b/drivers/sound/cs4281/cs4281m.c @@ -75,6 +75,7 @@ #include <linux/poll.h> #include <linux/smp_lock.h> #include <linux/wrapper.h> +#include <linux/fs.h> #include <asm/uaccess.h> #include <asm/hardirq.h> //#include "cs_dm.h" diff --git a/drivers/sound/opl3sa2.c b/drivers/sound/opl3sa2.c index d8b25ed3a..bd52c74cb 100644 --- a/drivers/sound/opl3sa2.c +++ b/drivers/sound/opl3sa2.c @@ -63,6 +63,7 @@ #include <linux/init.h> #include <linux/module.h> #include <linux/isapnp.h> +#include <linux/delay.h> #include <linux/pm.h> #include "sound_config.h" diff --git a/drivers/sound/ymfpci.c b/drivers/sound/ymfpci.c index 0b372c810..8614108b1 100644 --- a/drivers/sound/ymfpci.c +++ b/drivers/sound/ymfpci.c @@ -55,6 +55,7 @@ #include <linux/module.h> #include <linux/init.h> #include <linux/ioport.h> +#include <linux/delay.h> #include <linux/pci.h> #include <linux/slab.h> #include <linux/poll.h> diff --git a/drivers/telephony/phonedev.c b/drivers/telephony/phonedev.c index c8eb8d1e4..d58a3777e 100644 --- a/drivers/telephony/phonedev.c +++ b/drivers/telephony/phonedev.c @@ -18,7 +18,7 @@ #include <linux/module.h> #include <linux/types.h> #include <linux/kernel.h> -#include <linux/sched.h> +#include <linux/fs.h> #include <linux/mm.h> #include <linux/string.h> #include <linux/errno.h> diff --git a/drivers/usb/acm.c b/drivers/usb/acm.c index 77c42d87f..381b4be68 100644 --- a/drivers/usb/acm.c +++ b/drivers/usb/acm.c @@ -57,6 +57,7 @@ #include <linux/smp_lock.h> #undef DEBUG #include <linux/usb.h> +#include <asm/byteorder.h> /* * Version Information diff --git a/drivers/usb/auerswald.c b/drivers/usb/auerswald.c index 4c4ef0492..cd1c936ff 100644 --- a/drivers/usb/auerswald.c +++ b/drivers/usb/auerswald.c @@ -25,6 +25,7 @@ /* Standard Linux module include files */ #include <asm/uaccess.h> +#include <asm/byteorder.h> #include <linux/slab.h> #include <linux/module.h> #include <linux/init.h> diff --git a/drivers/usb/devio.c b/drivers/usb/devio.c index eeb86671e..96cbc98b5 100644 --- a/drivers/usb/devio.c +++ b/drivers/usb/devio.c @@ -44,6 +44,7 @@ #include <linux/usb.h> #include <linux/usbdevice_fs.h> #include <asm/uaccess.h> +#include <asm/byteorder.h> struct async { diff --git a/drivers/usb/hcd.c b/drivers/usb/hcd.c index 2f97c96bd..265143a39 100644 --- a/drivers/usb/hcd.c +++ b/drivers/usb/hcd.c @@ -50,6 +50,7 @@ #include <asm/irq.h> #include <asm/system.h> #include <asm/unaligned.h> +#include <asm/byteorder.h> /*-------------------------------------------------------------------------*/ diff --git a/drivers/usb/hcd/ehci-hub.c b/drivers/usb/hcd/ehci-hub.c index 798fd6066..4a7895645 100644 --- a/drivers/usb/hcd/ehci-hub.c +++ b/drivers/usb/hcd/ehci-hub.c @@ -18,6 +18,8 @@ /* this file is part of ehci-hcd.c */ +#include <asm/byteorder.h> + /*-------------------------------------------------------------------------*/ /* diff --git a/drivers/usb/hcd/ehci-mem.c b/drivers/usb/hcd/ehci-mem.c index b2ee617c6..94fd675e5 100644 --- a/drivers/usb/hcd/ehci-mem.c +++ b/drivers/usb/hcd/ehci-mem.c @@ -18,6 +18,8 @@ /* this file is part of ehci-hcd.c */ +#include <asm/byteorder.h> + /*-------------------------------------------------------------------------*/ /* diff --git a/drivers/usb/hcd/ehci-q.c b/drivers/usb/hcd/ehci-q.c index df6c07d3d..1837e8b2c 100644 --- a/drivers/usb/hcd/ehci-q.c +++ b/drivers/usb/hcd/ehci-q.c @@ -18,6 +18,8 @@ /* this file is part of ehci-hcd.c */ +#include <asm/byteorder.h> + /*-------------------------------------------------------------------------*/ /* diff --git a/drivers/usb/hcd/ehci-sched.c b/drivers/usb/hcd/ehci-sched.c index 62754b5a2..503032029 100644 --- a/drivers/usb/hcd/ehci-sched.c +++ b/drivers/usb/hcd/ehci-sched.c @@ -20,6 +20,8 @@ /*-------------------------------------------------------------------------*/ +#include "ehci.h" + /* * EHCI scheduled transaction support: interrupt, iso, split iso * These are called "periodic" transactions in the EHCI spec. diff --git a/drivers/usb/hcd/ohci-hcd.c b/drivers/usb/hcd/ohci-hcd.c index 9dbceb3aa..9a05081e4 100644 --- a/drivers/usb/hcd/ohci-hcd.c +++ b/drivers/usb/hcd/ohci-hcd.c @@ -87,6 +87,7 @@ #include <asm/irq.h> #include <asm/system.h> #include <asm/unaligned.h> +#include <asm/byteorder.h> #ifdef CONFIG_PMAC_PBOOK #include <asm/machdep.h> diff --git a/drivers/usb/hcd/ohci-q.c b/drivers/usb/hcd/ohci-q.c index 642e84b7a..ba17a661c 100644 --- a/drivers/usb/hcd/ohci-q.c +++ b/drivers/usb/hcd/ohci-q.c @@ -7,6 +7,8 @@ * This file is licenced under the GPL. * $Id: ohci-q.c,v 1.6 2002/01/19 00:23:15 dbrownell Exp $ */ + +#include <asm/byteorder.h> static void urb_free_priv (struct ohci_hcd *hc, urb_priv_t *urb_priv) { diff --git a/drivers/usb/hid-core.c b/drivers/usb/hid-core.c index f9ebfa1f8..670bcfcfa 100644 --- a/drivers/usb/hid-core.c +++ b/drivers/usb/hid-core.c @@ -39,6 +39,7 @@ #include <linux/smp_lock.h> #include <linux/spinlock.h> #include <asm/unaligned.h> +#include <asm/byteorder.h> #include <linux/input.h> #undef DEBUG diff --git a/drivers/usb/inode.c b/drivers/usb/inode.c index a541dd5ee..ad1147485 100644 --- a/drivers/usb/inode.c +++ b/drivers/usb/inode.c @@ -37,6 +37,7 @@ #include <linux/usb.h> #include <linux/usbdevice_fs.h> #include <linux/smp_lock.h> +#include <asm/byteorder.h> static struct super_operations usbfs_ops; static struct address_space_operations usbfs_aops; diff --git a/drivers/usb/kaweth.c b/drivers/usb/kaweth.c index 65cb2b123..19f04a6ac 100644 --- a/drivers/usb/kaweth.c +++ b/drivers/usb/kaweth.c @@ -55,6 +55,7 @@ #include <linux/usb.h> #include <linux/types.h> #include <asm/semaphore.h> +#include <asm/byteorder.h> #define DEBUG diff --git a/drivers/usb/mdc800.c b/drivers/usb/mdc800.c index eb3d1df91..542d56c75 100644 --- a/drivers/usb/mdc800.c +++ b/drivers/usb/mdc800.c @@ -98,6 +98,7 @@ #include <linux/smp_lock.h> #include <linux/usb.h> +#include <linux/fs.h> /* * Version Information diff --git a/drivers/usb/pegasus.c b/drivers/usb/pegasus.c index 02e1a8e84..7e04aafd4 100644 --- a/drivers/usb/pegasus.c +++ b/drivers/usb/pegasus.c @@ -48,6 +48,7 @@ #include <linux/etherdevice.h> #include <linux/usb.h> #include <linux/module.h> +#include <asm/byteorder.h> #include "pegasus.h" /* diff --git a/drivers/usb/scanner.c b/drivers/usb/scanner.c index 8b262b83c..f9ad345ed 100644 --- a/drivers/usb/scanner.c +++ b/drivers/usb/scanner.c @@ -328,6 +328,8 @@ * 24 Bit Color ~ 70 secs - 3.6 Mbit/sec * 8 Bit Gray ~ 17 secs - 4.2 Mbit/sec */ +#include <asm/byteorder.h> + /* * Scanner definitions, macros, module info, * debug/ioctl/data_dump enable, and other constants. diff --git a/drivers/usb/usb-ohci.c b/drivers/usb/usb-ohci.c index 29384b449..63fb3a7b1 100644 --- a/drivers/usb/usb-ohci.c +++ b/drivers/usb/usb-ohci.c @@ -68,6 +68,7 @@ #include <asm/irq.h> #include <asm/system.h> #include <asm/unaligned.h> +#include <asm/byteorder.h> #define OHCI_USE_NPS // force NoPowerSwitching mode // #define OHCI_VERBOSE_DEBUG /* not always helpful */ diff --git a/drivers/usb/usb-uhci.c b/drivers/usb/usb-uhci.c index 6d332d305..2f38a1985 100644 --- a/drivers/usb/usb-uhci.c +++ b/drivers/usb/usb-uhci.c @@ -40,6 +40,7 @@ #include <asm/io.h> #include <asm/irq.h> #include <asm/system.h> +#include <asm/byteorder.h> /* This enables more detailed sanity checks in submit_iso */ //#define ISO_SANITY_CHECK diff --git a/drivers/usb/usb.c b/drivers/usb/usb.c index be9fa8a78..d6d446e84 100644 --- a/drivers/usb/usb.c +++ b/drivers/usb/usb.c @@ -31,6 +31,7 @@ #include <linux/init.h> #include <linux/devfs_fs_kernel.h> #include <linux/spinlock.h> +#include <asm/byteorder.h> #ifdef CONFIG_USB_DEBUG #define DEBUG diff --git a/drivers/zorro/proc.c b/drivers/zorro/proc.c index 07a3ae80e..2a10b08b3 100644 --- a/drivers/zorro/proc.c +++ b/drivers/zorro/proc.c @@ -24,6 +24,7 @@ proc_bus_zorro_lseek(struct file *file, loff_t off, int whence) { loff_t new = -1; + lock_kernel(); switch (whence) { case 0: new = off; diff --git a/fs/adfs/dir.c b/fs/adfs/dir.c index cb6304a1d..f41160b23 100644 --- a/fs/adfs/dir.c +++ b/fs/adfs/dir.c @@ -14,7 +14,7 @@ #include <linux/errno.h> #include <linux/fs.h> #include <linux/adfs_fs.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/stat.h> #include <linux/spinlock.h> diff --git a/fs/adfs/dir_f.c b/fs/adfs/dir_f.c index 66a0c36a7..7ca21e16a 100644 --- a/fs/adfs/dir_f.c +++ b/fs/adfs/dir_f.c @@ -13,7 +13,7 @@ #include <linux/errno.h> #include <linux/fs.h> #include <linux/adfs_fs.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/stat.h> #include <linux/spinlock.h> diff --git a/fs/adfs/dir_fplus.c b/fs/adfs/dir_fplus.c index 71064bc55..ff9011614 100644 --- a/fs/adfs/dir_fplus.c +++ b/fs/adfs/dir_fplus.c @@ -11,7 +11,7 @@ #include <linux/errno.h> #include <linux/fs.h> #include <linux/adfs_fs.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/stat.h> #include <linux/spinlock.h> diff --git a/fs/adfs/file.c b/fs/adfs/file.c index c00ebea8b..9ab958b9a 100644 --- a/fs/adfs/file.c +++ b/fs/adfs/file.c @@ -23,7 +23,7 @@ #include <linux/errno.h> #include <linux/fs.h> #include <linux/fcntl.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/stat.h> #include "adfs.h" diff --git a/fs/adfs/inode.c b/fs/adfs/inode.c index f757844eb..660dc4b16 100644 --- a/fs/adfs/inode.c +++ b/fs/adfs/inode.c @@ -11,7 +11,7 @@ #include <linux/errno.h> #include <linux/fs.h> #include <linux/adfs_fs.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/stat.h> #include <linux/string.h> #include <linux/locks.h> diff --git a/fs/adfs/super.c b/fs/adfs/super.c index 8a0ce050c..58912a4fd 100644 --- a/fs/adfs/super.c +++ b/fs/adfs/super.c @@ -13,7 +13,7 @@ #include <linux/fs.h> #include <linux/adfs_fs.h> #include <linux/slab.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/stat.h> #include <linux/string.h> #include <linux/locks.h> diff --git a/fs/affs/amigaffs.c b/fs/affs/amigaffs.c index bf53d8735..d0532a67a 100644 --- a/fs/affs/amigaffs.c +++ b/fs/affs/amigaffs.c @@ -10,7 +10,7 @@ #include <stdarg.h> #include <linux/stat.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/affs_fs.h> #include <linux/string.h> #include <linux/locks.h> diff --git a/fs/affs/bitmap.c b/fs/affs/bitmap.c index 919309b10..1726db8a0 100644 --- a/fs/affs/bitmap.c +++ b/fs/affs/bitmap.c @@ -7,7 +7,7 @@ * block allocation, deallocation, calculation of free space. */ -#include <linux/sched.h> +#include <linux/time.h> #include <linux/affs_fs.h> #include <linux/stat.h> #include <linux/kernel.h> diff --git a/fs/affs/file.c b/fs/affs/file.c index 510dffaf9..de3d01935 100644 --- a/fs/affs/file.c +++ b/fs/affs/file.c @@ -15,7 +15,7 @@ #include <asm/div64.h> #include <asm/uaccess.h> #include <asm/system.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/affs_fs.h> #include <linux/fcntl.h> #include <linux/kernel.h> diff --git a/fs/affs/inode.c b/fs/affs/inode.c index b804256a8..83e4ce9dd 100644 --- a/fs/affs/inode.c +++ b/fs/affs/inode.c @@ -15,7 +15,7 @@ #include <linux/fs.h> #include <linux/slab.h> #include <linux/stat.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/affs_fs.h> #include <linux/kernel.h> #include <linux/mm.h> diff --git a/fs/affs/namei.c b/fs/affs/namei.c index cd32c3b81..b5eb611fc 100644 --- a/fs/affs/namei.c +++ b/fs/affs/namei.c @@ -8,7 +8,7 @@ * (C) 1991 Linus Torvalds - minix filesystem */ -#include <linux/sched.h> +#include <linux/time.h> #include <linux/affs_fs.h> #include <linux/kernel.h> #include <linux/string.h> diff --git a/fs/affs/super.c b/fs/affs/super.c index ecf11f3de..f526b3fe5 100644 --- a/fs/affs/super.c +++ b/fs/affs/super.c @@ -15,7 +15,7 @@ #include <linux/fs.h> #include <linux/slab.h> #include <linux/stat.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/affs_fs.h> #include <linux/kernel.h> #include <linux/mm.h> @@ -270,9 +270,8 @@ static int affs_fill_super(struct super_block *sb, void *data, int silent) struct buffer_head *root_bh = NULL; struct buffer_head *boot_bh; struct inode *root_inode = NULL; - kdev_t dev = sb->s_dev; s32 root_block; - int blocks, size, blocksize; + int size, blocksize; u32 chksum; int num_bm; int i, j; @@ -308,12 +307,7 @@ static int affs_fill_super(struct super_block *sb, void *data, int silent) * blocks, we will have to change it. */ - blocks = blk_size[major(dev)] ? blk_size[major(dev)][minor(dev)] : 0; - if (!blocks) { - printk(KERN_ERR "AFFS: Could not determine device size\n"); - goto out_error; - } - size = (BLOCK_SIZE / 512) * blocks; + size = sb->s_bdev->bd_inode->i_size >> 9; pr_debug("AFFS: initial blksize=%d, blocks=%d\n", 512, blocks); affs_set_blocksize(sb, PAGE_SIZE); @@ -5,7 +5,7 @@ * changes by Thomas Schoebel-Theuer */ -#include <linux/sched.h> +#include <linux/time.h> #include <linux/mm.h> #include <linux/string.h> #include <linux/smp_lock.h> diff --git a/fs/autofs/autofs_i.h b/fs/autofs/autofs_i.h index 354af8325..51e754d5c 100644 --- a/fs/autofs/autofs_i.h +++ b/fs/autofs/autofs_i.h @@ -20,7 +20,7 @@ #include <linux/kernel.h> #include <linux/slab.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/string.h> #include <linux/wait.h> #include <asm/uaccess.h> diff --git a/fs/autofs/root.c b/fs/autofs/root.c index fe3db57a0..66512c830 100644 --- a/fs/autofs/root.c +++ b/fs/autofs/root.c @@ -13,7 +13,7 @@ #include <linux/errno.h> #include <linux/stat.h> #include <linux/param.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/smp_lock.h> #include "autofs_i.h" diff --git a/fs/autofs/waitq.c b/fs/autofs/waitq.c index c7da7f518..b70b72d84 100644 --- a/fs/autofs/waitq.c +++ b/fs/autofs/waitq.c @@ -11,7 +11,7 @@ * ------------------------------------------------------------------------- */ #include <linux/slab.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/signal.h> #include <linux/file.h> #include "autofs_i.h" diff --git a/fs/autofs4/autofs_i.h b/fs/autofs4/autofs_i.h index 7e43620bc..e1c4fb912 100644 --- a/fs/autofs4/autofs_i.h +++ b/fs/autofs4/autofs_i.h @@ -21,7 +21,7 @@ #include <linux/kernel.h> #include <linux/slab.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/string.h> #include <linux/wait.h> #include <asm/uaccess.h> diff --git a/fs/autofs4/root.c b/fs/autofs4/root.c index 2a1a29b93..09423a1af 100644 --- a/fs/autofs4/root.c +++ b/fs/autofs4/root.c @@ -14,7 +14,7 @@ #include <linux/errno.h> #include <linux/stat.h> #include <linux/param.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/smp_lock.h> #include "autofs_i.h" diff --git a/fs/autofs4/waitq.c b/fs/autofs4/waitq.c index 9e5fe900f..74c010997 100644 --- a/fs/autofs4/waitq.c +++ b/fs/autofs4/waitq.c @@ -11,7 +11,7 @@ * ------------------------------------------------------------------------- */ #include <linux/slab.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/signal.h> #include <linux/file.h> #include "autofs_i.h" diff --git a/fs/bad_inode.c b/fs/bad_inode.c index 2ff8ae8f2..e44c02ac2 100644 --- a/fs/bad_inode.c +++ b/fs/bad_inode.c @@ -8,7 +8,7 @@ #include <linux/fs.h> #include <linux/stat.h> -#include <linux/sched.h> +#include <linux/time.h> /* * The follow_link operation is special: it must behave as a no-op diff --git a/fs/bfs/dir.c b/fs/bfs/dir.c index cc46c9170..6445ca7e6 100644 --- a/fs/bfs/dir.c +++ b/fs/bfs/dir.c @@ -4,7 +4,7 @@ * Copyright (C) 1999,2000 Tigran Aivazian <tigran@veritas.com> */ -#include <linux/sched.h> +#include <linux/time.h> #include <linux/string.h> #include <linux/bfs_fs.h> #include <linux/locks.h> diff --git a/fs/binfmt_aout.c b/fs/binfmt_aout.c index 9f8a58578..018cfc13b 100644 --- a/fs/binfmt_aout.c +++ b/fs/binfmt_aout.c @@ -6,7 +6,7 @@ #include <linux/module.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/kernel.h> #include <linux/mm.h> #include <linux/mman.h> diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c index b73559da9..008303866 100644 --- a/fs/binfmt_elf.c +++ b/fs/binfmt_elf.c @@ -13,7 +13,7 @@ #include <linux/fs.h> #include <linux/stat.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/mm.h> #include <linux/mman.h> #include <linux/a.out.h> diff --git a/fs/binfmt_script.c b/fs/binfmt_script.c index 2348332e4..5121800fc 100644 --- a/fs/binfmt_script.c +++ b/fs/binfmt_script.c @@ -13,6 +13,8 @@ #include <linux/init.h> #include <linux/file.h> #include <linux/smp_lock.h> +#include <linux/err.h> +#include <linux/fs.h> static int load_script(struct linux_binprm *bprm,struct pt_regs *regs) { diff --git a/fs/buffer.c b/fs/buffer.c index 866a5a41f..0aef10bb4 100644 --- a/fs/buffer.c +++ b/fs/buffer.c @@ -29,7 +29,7 @@ /* async buffer flushing, 1999 Andrea Arcangeli <andrea@suse.de> */ #include <linux/config.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/fs.h> #include <linux/slab.h> #include <linux/locks.h> diff --git a/fs/coda/cache.c b/fs/coda/cache.c index 03ab04df4..2b2d3fbd1 100644 --- a/fs/coda/cache.c +++ b/fs/coda/cache.c @@ -9,7 +9,7 @@ #include <linux/types.h> #include <linux/kernel.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/fs.h> #include <linux/stat.h> #include <linux/errno.h> diff --git a/fs/coda/coda_linux.c b/fs/coda/coda_linux.c index 837072a79..935fc18a9 100644 --- a/fs/coda/coda_linux.c +++ b/fs/coda/coda_linux.c @@ -10,7 +10,7 @@ #include <linux/version.h> #include <linux/types.h> #include <linux/kernel.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/fs.h> #include <linux/stat.h> #include <linux/errno.h> diff --git a/fs/coda/dir.c b/fs/coda/dir.c index 782f017ff..bd9acec25 100644 --- a/fs/coda/dir.c +++ b/fs/coda/dir.c @@ -10,7 +10,7 @@ #include <linux/types.h> #include <linux/kernel.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/fs.h> #include <linux/file.h> #include <linux/stat.h> diff --git a/fs/coda/file.c b/fs/coda/file.c index d3bc9a225..eeee82fbb 100644 --- a/fs/coda/file.c +++ b/fs/coda/file.c @@ -9,7 +9,7 @@ #include <linux/types.h> #include <linux/kernel.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/file.h> #include <linux/fs.h> #include <linux/stat.h> diff --git a/fs/coda/pioctl.c b/fs/coda/pioctl.c index 861a87741..cc29c5ec7 100644 --- a/fs/coda/pioctl.c +++ b/fs/coda/pioctl.c @@ -9,7 +9,7 @@ #include <linux/types.h> #include <linux/kernel.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/fs.h> #include <linux/stat.h> #include <linux/errno.h> diff --git a/fs/coda/psdev.c b/fs/coda/psdev.c index add25fd1c..086622107 100644 --- a/fs/coda/psdev.c +++ b/fs/coda/psdev.c @@ -21,7 +21,7 @@ #include <linux/errno.h> #include <linux/kernel.h> #include <linux/major.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/lp.h> #include <linux/slab.h> #include <linux/ioport.h> diff --git a/fs/coda/symlink.c b/fs/coda/symlink.c index f3318b82b..15dc80abf 100644 --- a/fs/coda/symlink.c +++ b/fs/coda/symlink.c @@ -9,7 +9,7 @@ #include <linux/types.h> #include <linux/kernel.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/fs.h> #include <linux/stat.h> #include <linux/errno.h> diff --git a/fs/coda/sysctl.c b/fs/coda/sysctl.c index 231b7713b..9491772ca 100644 --- a/fs/coda/sysctl.c +++ b/fs/coda/sysctl.c @@ -12,7 +12,7 @@ */ #include <linux/config.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/mm.h> #include <linux/sysctl.h> #include <linux/swapctl.h> diff --git a/fs/coda/upcall.c b/fs/coda/upcall.c index 9c87ee4de..ea22075e3 100644 --- a/fs/coda/upcall.c +++ b/fs/coda/upcall.c @@ -21,7 +21,7 @@ #include <linux/types.h> #include <linux/kernel.h> #include <linux/mm.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/fs.h> #include <linux/file.h> #include <linux/stat.h> diff --git a/fs/devfs/base.c b/fs/devfs/base.c index 637255735..0d595669d 100644 --- a/fs/devfs/base.c +++ b/fs/devfs/base.c @@ -615,7 +615,7 @@ */ #include <linux/types.h> #include <linux/errno.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/tty.h> #include <linux/timer.h> #include <linux/config.h> diff --git a/fs/devices.c b/fs/devices.c index e859ba71d..0447d805a 100644 --- a/fs/devices.c +++ b/fs/devices.c @@ -13,7 +13,7 @@ #include <linux/fs.h> #include <linux/major.h> #include <linux/string.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/stat.h> #include <linux/fcntl.h> #include <linux/errno.h> diff --git a/fs/dquot.c b/fs/dquot.c index a9a697a0a..ff2326ae0 100644 --- a/fs/dquot.c +++ b/fs/dquot.c @@ -51,7 +51,7 @@ #include <linux/errno.h> #include <linux/kernel.h> #include <linux/fs.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/types.h> #include <linux/string.h> #include <linux/fcntl.h> @@ -289,7 +289,7 @@ static void write_dquot(struct dquot *dquot) sizeof(struct dqblk), &offset); if (ret != sizeof(struct dqblk)) printk(KERN_WARNING "VFS: dquota write failed on dev %s\n", - kdevname(dquot->dq_sb->s_dev)); + dquot->dq_sb->s_id); set_fs(fs); up(sem); @@ -440,7 +440,7 @@ static void dqput(struct dquot *dquot) if (!dquot->dq_count) { printk("VFS: dqput: trying to free free dquot\n"); printk("VFS: device %s, dquot of %s %d\n", - kdevname(dquot->dq_sb->s_dev), + dquot->dq_sb->s_id, quotatypes[dquot->dq_type], dquot->dq_id); return; @@ -715,7 +715,7 @@ static void print_warning(struct dquot *dquot, const char warntype) if (!need_print_warning(dquot, flag)) return; dquot->dq_flags |= flag; - tty_write_message(current->tty, (char *)bdevname(dquot->dq_sb->s_dev)); + tty_write_message(current->tty, dquot->dq_sb->s_id); if (warntype == ISOFTWARN || warntype == BSOFTWARN) tty_write_message(current->tty, ": warning, "); else diff --git a/fs/driverfs/inode.c b/fs/driverfs/inode.c index 9502dc7cd..94d8b0d4e 100644 --- a/fs/driverfs/inode.c +++ b/fs/driverfs/inode.c @@ -701,7 +701,8 @@ static void __remove_file(struct dentry * dentry) vfs_unlink(dentry->d_parent->d_inode,dentry); - unlock_dir(dentry); + up(&dentry->d_inode->i_sem); + dput(dentry); /* remove reference count from when file was created */ dput(dentry); @@ -741,7 +742,8 @@ void driverfs_remove_file(struct driver_dir_entry * dir, const char * name) } node = node->next; } - unlock_dir(dentry); + up(&dentry->d_inode->i_sem); + dput(dentry); } /** @@ -760,8 +762,9 @@ void driverfs_remove_dir(struct driver_dir_entry * dir) if (!dir->dentry) goto done; - /* lock the directory while we remove the files */ dentry = dget(dir->dentry); + dget(dentry->d_parent); + down(&dentry->d_parent->d_inode->i_sem); down(&dentry->d_inode->i_sem); node = dir->files.next; @@ -776,11 +779,9 @@ void driverfs_remove_dir(struct driver_dir_entry * dir) node = dir->files.next; } - /* now lock the parent, so we can remove this directory */ - lock_parent(dentry); - vfs_rmdir(dentry->d_parent->d_inode,dentry); - double_unlock(dentry,dentry->d_parent); + up(&dentry->d_parent->d_inode->i_sem); + up(&dentry->d_inode->i_sem); /* remove reference count from when directory was created */ dput(dentry); diff --git a/fs/efs/inode.c b/fs/efs/inode.c index 67d050f22..4af8ea9eb 100644 --- a/fs/efs/inode.c +++ b/fs/efs/inode.c @@ -10,6 +10,7 @@ #include <linux/efs_fs.h> #include <linux/efs_fs_sb.h> #include <linux/module.h> +#include <linux/fs.h> extern int efs_get_block(struct inode *, sector_t, struct buffer_head *, int); @@ -35,6 +35,7 @@ #include <linux/highmem.h> #include <linux/spinlock.h> #include <linux/personality.h> +#include <linux/binfmts.h> #define __NO_VERSION__ #include <linux/module.h> @@ -420,8 +421,8 @@ static int exec_mmap(void) active_mm = current->active_mm; current->mm = mm; current->active_mm = mm; - task_unlock(current); activate_mm(active_mm, mm); + task_unlock(current); mm_release(); if (old_mm) { if (active_mm != old_mm) BUG(); diff --git a/fs/ext2/balloc.c b/fs/ext2/balloc.c index 5d3f1486f..cc6c6217e 100644 --- a/fs/ext2/balloc.c +++ b/fs/ext2/balloc.c @@ -32,15 +32,15 @@ */ -#define in_range(b, first, len) ((b) >= (first) && (b) <= (first) + (len) - 1) +#define in_range(b, first, len) ((b) >= (first) && (b) <= (first) + (len) - 1) struct ext2_group_desc * ext2_get_group_desc(struct super_block * sb, unsigned int block_group, struct buffer_head ** bh) { unsigned long group_desc; - unsigned long desc; - struct ext2_group_desc * gdp; + unsigned long offset; + struct ext2_group_desc * desc; struct ext2_sb_info *sbi = &sb->u.ext2_sb; if (block_group >= sbi->s_groups_count) { @@ -53,19 +53,19 @@ struct ext2_group_desc * ext2_get_group_desc(struct super_block * sb, } group_desc = block_group / EXT2_DESC_PER_BLOCK(sb); - desc = block_group % EXT2_DESC_PER_BLOCK(sb); + offset = block_group % EXT2_DESC_PER_BLOCK(sb); if (!sbi->s_group_desc[group_desc]) { ext2_error (sb, "ext2_get_group_desc", "Group descriptor not loaded - " "block_group = %d, group_desc = %lu, desc = %lu", - block_group, group_desc, desc); + block_group, group_desc, offset); return NULL; } - gdp = (struct ext2_group_desc *) sbi->s_group_desc[group_desc]->b_data; + desc = (struct ext2_group_desc *) sbi->s_group_desc[group_desc]->b_data; if (bh) *bh = sbi->s_group_desc[group_desc]; - return gdp + desc; + return desc + offset; } /* @@ -78,18 +78,18 @@ struct ext2_group_desc * ext2_get_group_desc(struct super_block * sb, static struct buffer_head *read_block_bitmap(struct super_block *sb, unsigned int block_group) { - struct ext2_group_desc * gdp; + struct ext2_group_desc * desc; struct buffer_head * bh = NULL; - gdp = ext2_get_group_desc (sb, block_group, NULL); - if (!gdp) + desc = ext2_get_group_desc (sb, block_group, NULL); + if (!desc) goto error_out; - bh = sb_bread(sb, le32_to_cpu(gdp->bg_block_bitmap)); + bh = sb_bread(sb, le32_to_cpu(desc->bg_block_bitmap)); if (!bh) ext2_error (sb, "read_block_bitmap", "Cannot read block bitmap - " "block_group = %d, block_bitmap = %lu", - block_group, (unsigned long) gdp->bg_block_bitmap); + block_group, (unsigned long) desc->bg_block_bitmap); error_out: return bh; } @@ -135,7 +135,7 @@ static struct buffer_head *load_block_bitmap(struct super_block * sb, goto read_it; if (sbi->s_block_bitmap_number[slot] == slot) goto found; - ext2_panic (sb, "__load_block_bitmap", + ext2_panic (sb, "load_block_bitmap", "block_group != block_bitmap_number"); } @@ -166,6 +166,73 @@ found: return bh; } +static inline int reserve_blocks(struct super_block *sb, int count) +{ + struct ext2_sb_info * sbi = EXT2_SB(sb); + struct ext2_super_block * es = sbi->s_es; + unsigned free_blocks = le32_to_cpu(es->s_free_blocks_count); + unsigned root_blocks = le32_to_cpu(es->s_r_blocks_count); + + if (free_blocks < count) + count = free_blocks; + + if (free_blocks < root_blocks + count && !capable(CAP_SYS_RESOURCE) && + sbi->s_resuid != current->fsuid && + (sbi->s_resgid == 0 || !in_group_p (sbi->s_resgid))) { + /* + * We are too close to reserve and we are not privileged. + * Can we allocate anything at all? + */ + if (free_blocks > root_blocks) + count = free_blocks - root_blocks; + else + return 0; + } + + es->s_free_blocks_count = cpu_to_le32(free_blocks - count); + mark_buffer_dirty(sbi->s_sbh); + sb->s_dirt = 1; + return count; +} + +static inline void release_blocks(struct super_block *sb, int count) +{ + if (count) { + struct ext2_sb_info * sbi = EXT2_SB(sb); + struct ext2_super_block * es = sbi->s_es; + unsigned free_blocks = le32_to_cpu(es->s_free_blocks_count); + es->s_free_blocks_count = cpu_to_le32(free_blocks + count); + mark_buffer_dirty(sbi->s_sbh); + sb->s_dirt = 1; + } +} + +static inline int group_reserve_blocks(struct ext2_group_desc *desc, + struct buffer_head *bh, int count) +{ + unsigned free_blocks; + + if (!desc->bg_free_blocks_count) + return 0; + + free_blocks = le16_to_cpu(desc->bg_free_blocks_count); + if (free_blocks < count) + count = free_blocks; + desc->bg_free_blocks_count = cpu_to_le16(free_blocks - count); + mark_buffer_dirty(bh); + return count; +} + +static inline void group_release_blocks(struct ext2_group_desc *desc, + struct buffer_head *bh, int count) +{ + if (count) { + unsigned free_blocks = le16_to_cpu(desc->bg_free_blocks_count); + desc->bg_free_blocks_count = cpu_to_le16(free_blocks + count); + mark_buffer_dirty(bh); + } +} + /* Free given blocks, update quota and i_blocks field */ void ext2_free_blocks (struct inode * inode, unsigned long block, unsigned long count) @@ -176,15 +243,11 @@ void ext2_free_blocks (struct inode * inode, unsigned long block, unsigned long bit; unsigned long i; unsigned long overflow; - struct super_block * sb; - struct ext2_group_desc * gdp; + struct super_block * sb = inode->i_sb; + struct ext2_group_desc * desc; struct ext2_super_block * es; + unsigned freed = 0, group_freed; - sb = inode->i_sb; - if (!sb) { - printk ("ext2_free_blocks: nonexistent device"); - return; - } lock_super (sb); es = sb->u.ext2_sb.s_es; if (block < le32_to_cpu(es->s_first_data_block) || @@ -214,53 +277,99 @@ do_more: bh = load_block_bitmap (sb, block_group); if (IS_ERR(bh)) goto error_return; - - gdp = ext2_get_group_desc (sb, block_group, &bh2); - if (!gdp) + + desc = ext2_get_group_desc (sb, block_group, &bh2); + if (!desc) goto error_return; - if (in_range (le32_to_cpu(gdp->bg_block_bitmap), block, count) || - in_range (le32_to_cpu(gdp->bg_inode_bitmap), block, count) || - in_range (block, le32_to_cpu(gdp->bg_inode_table), + if (in_range (le32_to_cpu(desc->bg_block_bitmap), block, count) || + in_range (le32_to_cpu(desc->bg_inode_bitmap), block, count) || + in_range (block, le32_to_cpu(desc->bg_inode_table), sb->u.ext2_sb.s_itb_per_group) || - in_range (block + count - 1, le32_to_cpu(gdp->bg_inode_table), + in_range (block + count - 1, le32_to_cpu(desc->bg_inode_table), sb->u.ext2_sb.s_itb_per_group)) ext2_error (sb, "ext2_free_blocks", "Freeing blocks in system zones - " "Block = %lu, count = %lu", block, count); - for (i = 0; i < count; i++) { + for (i = 0, group_freed = 0; i < count; i++) { if (!ext2_clear_bit (bit + i, bh->b_data)) ext2_error (sb, "ext2_free_blocks", "bit already cleared for block %lu", block + i); - else { - DQUOT_FREE_BLOCK(inode, 1); - gdp->bg_free_blocks_count = - cpu_to_le16(le16_to_cpu(gdp->bg_free_blocks_count)+1); - es->s_free_blocks_count = - cpu_to_le32(le32_to_cpu(es->s_free_blocks_count)+1); - } + else + group_freed++; } - - mark_buffer_dirty(bh2); - mark_buffer_dirty(sb->u.ext2_sb.s_sbh); mark_buffer_dirty(bh); if (sb->s_flags & MS_SYNCHRONOUS) { ll_rw_block (WRITE, 1, &bh); wait_on_buffer (bh); } + + group_release_blocks(desc, bh2, group_freed); + freed += group_freed; + if (overflow) { block += count; count = overflow; goto do_more; } - sb->s_dirt = 1; error_return: + release_blocks(sb, freed); unlock_super (sb); - return; + DQUOT_FREE_BLOCK(inode, freed); +} + +static int grab_block(char *map, unsigned size, int goal) +{ + int k; + char *p, *r; + + if (!ext2_test_bit(goal, map)) + goto got_it; + if (goal) { + /* + * The goal was occupied; search forward for a free + * block within the next XX blocks. + * + * end_goal is more or less random, but it has to be + * less than EXT2_BLOCKS_PER_GROUP. Aligning up to the + * next 64-bit boundary is simple.. + */ + k = (goal + 63) & ~63; + goal = ext2_find_next_zero_bit(map, k, goal); + if (goal < k) + goto got_it; + /* + * Search in the remainder of the current group. + */ + } + + p = map + (goal >> 3); + r = memscan(p, 0, (size - goal + 7) >> 3); + k = (r - map) << 3; + if (k < size) { + /* + * We have succeeded in finding a free byte in the block + * bitmap. Now search backwards to find the start of this + * group of free blocks - won't take more than 7 iterations. + */ + for (goal = k; goal && !ext2_test_bit (goal - 1, map); goal--) + ; + goto got_it; + } + + k = ext2_find_next_zero_bit ((u32 *)map, size, goal); + if (k < size) { + goal = k; + goto got_it; + } + return -1; +got_it: + ext2_set_bit(goal, map); + return goal; } /* @@ -274,224 +383,148 @@ error_return: int ext2_new_block (struct inode * inode, unsigned long goal, u32 * prealloc_count, u32 * prealloc_block, int * err) { - struct buffer_head * bh; - struct buffer_head * bh2; - char * p, * r; + struct buffer_head *bh; + struct buffer_head *bh2; + struct ext2_group_desc *desc; int i, j, k, tmp; - struct super_block * sb; - struct ext2_group_desc * gdp; - struct ext2_super_block * es; -#ifdef EXT2FS_DEBUG - static int goal_hits = 0, goal_attempts = 0; -#endif + int block = 0; + struct super_block *sb = inode->i_sb; + struct ext2_sb_info *sbi = EXT2_SB(sb); + struct ext2_super_block *es = sbi->s_es; + unsigned group_size = EXT2_BLOCKS_PER_GROUP(sb); + unsigned prealloc_goal = es->s_prealloc_blocks; + unsigned group_alloc = 0, es_alloc, dq_alloc; + + if (!prealloc_goal--) + prealloc_goal = EXT2_DEFAULT_PREALLOC_BLOCKS - 1; + if (!prealloc_count || *prealloc_count) + prealloc_goal = 0; + + *err = -EDQUOT; + if (DQUOT_ALLOC_BLOCK(inode, 1)) + goto out; + + while (prealloc_goal && DQUOT_PREALLOC_BLOCK(inode, prealloc_goal)) + prealloc_goal--; + + dq_alloc = prealloc_goal + 1; + *err = -ENOSPC; - sb = inode->i_sb; - if (!sb) { - printk ("ext2_new_block: nonexistent device"); - return 0; - } lock_super (sb); - es = sb->u.ext2_sb.s_es; - if (le32_to_cpu(es->s_free_blocks_count) <= le32_to_cpu(es->s_r_blocks_count) && - ((sb->u.ext2_sb.s_resuid != current->fsuid) && - (sb->u.ext2_sb.s_resgid == 0 || - !in_group_p (sb->u.ext2_sb.s_resgid)) && - !capable(CAP_SYS_RESOURCE))) - goto out; + + es_alloc = reserve_blocks(sb, dq_alloc); + if (!es_alloc) + goto out_unlock; ext2_debug ("goal=%lu.\n", goal); -repeat: - /* - * First, test whether the goal block is free. - */ if (goal < le32_to_cpu(es->s_first_data_block) || goal >= le32_to_cpu(es->s_blocks_count)) goal = le32_to_cpu(es->s_first_data_block); - i = (goal - le32_to_cpu(es->s_first_data_block)) / EXT2_BLOCKS_PER_GROUP(sb); - gdp = ext2_get_group_desc (sb, i, &bh2); - if (!gdp) + i = (goal - le32_to_cpu(es->s_first_data_block)) / group_size; + desc = ext2_get_group_desc (sb, i, &bh2); + if (!desc) goto io_error; - if (le16_to_cpu(gdp->bg_free_blocks_count) > 0) { - j = ((goal - le32_to_cpu(es->s_first_data_block)) % EXT2_BLOCKS_PER_GROUP(sb)); -#ifdef EXT2FS_DEBUG - if (j) - goal_attempts++; -#endif + group_alloc = group_reserve_blocks(desc, bh2, es_alloc); + if (group_alloc) { + j = ((goal - le32_to_cpu(es->s_first_data_block)) % group_size); bh = load_block_bitmap (sb, i); if (IS_ERR(bh)) goto io_error; ext2_debug ("goal is at %d:%d.\n", i, j); - if (!ext2_test_bit(j, bh->b_data)) { - ext2_debug("goal bit allocated, %d hits\n",++goal_hits); + j = grab_block(bh->b_data, group_size, j); + if (j >= 0) goto got_block; - } - if (j) { - /* - * The goal was occupied; search forward for a free - * block within the next XX blocks. - * - * end_goal is more or less random, but it has to be - * less than EXT2_BLOCKS_PER_GROUP. Aligning up to the - * next 64-bit boundary is simple.. - */ - int end_goal = (j + 63) & ~63; - j = ext2_find_next_zero_bit(bh->b_data, end_goal, j); - if (j < end_goal) - goto got_block; - } - - ext2_debug ("Bit not found near goal\n"); - - /* - * There has been no free block found in the near vicinity - * of the goal: do a search forward through the block groups, - * searching in each group first for an entire free byte in - * the bitmap and then for any free bit. - * - * Search first in the remainder of the current group; then, - * cyclicly search through the rest of the groups. - */ - p = ((char *) bh->b_data) + (j >> 3); - r = memscan(p, 0, (EXT2_BLOCKS_PER_GROUP(sb) - j + 7) >> 3); - k = (r - ((char *) bh->b_data)) << 3; - if (k < EXT2_BLOCKS_PER_GROUP(sb)) { - j = k; - goto search_back; - } - - k = ext2_find_next_zero_bit ((unsigned long *) bh->b_data, - EXT2_BLOCKS_PER_GROUP(sb), - j); - if (k < EXT2_BLOCKS_PER_GROUP(sb)) { - j = k; - goto got_block; - } + group_release_blocks(desc, bh2, group_alloc); + group_alloc = 0; } ext2_debug ("Bit not found in block group %d.\n", i); /* * Now search the rest of the groups. We assume that - * i and gdp correctly point to the last group visited. + * i and desc correctly point to the last group visited. */ - for (k = 0; k < sb->u.ext2_sb.s_groups_count; k++) { + for (k = 0; !group_alloc && k < sbi->s_groups_count; k++) { i++; - if (i >= sb->u.ext2_sb.s_groups_count) + if (i >= sbi->s_groups_count) i = 0; - gdp = ext2_get_group_desc (sb, i, &bh2); - if (!gdp) + desc = ext2_get_group_desc (sb, i, &bh2); + if (!desc) goto io_error; - if (le16_to_cpu(gdp->bg_free_blocks_count) > 0) - break; + group_alloc = group_reserve_blocks(desc, bh2, es_alloc); } - if (k >= sb->u.ext2_sb.s_groups_count) - goto out; + if (k >= sbi->s_groups_count) + goto out_release; bh = load_block_bitmap (sb, i); if (IS_ERR(bh)) goto io_error; - r = memscan(bh->b_data, 0, EXT2_BLOCKS_PER_GROUP(sb) >> 3); - j = (r - bh->b_data) << 3; - if (j < EXT2_BLOCKS_PER_GROUP(sb)) - goto search_back; - else - j = ext2_find_first_zero_bit ((unsigned long *) bh->b_data, - EXT2_BLOCKS_PER_GROUP(sb)); - if (j >= EXT2_BLOCKS_PER_GROUP(sb)) { + j = grab_block(bh->b_data, group_size, 0); + if (j < 0) { ext2_error (sb, "ext2_new_block", "Free blocks count corrupted for block group %d", i); - goto out; + group_alloc = 0; + goto out_release; } -search_back: - /* - * We have succeeded in finding a free byte in the block - * bitmap. Now search backwards up to 7 bits to find the - * start of this group of free blocks. - */ - for (k = 0; k < 7 && j > 0 && !ext2_test_bit (j - 1, bh->b_data); k++, j--); - got_block: + ext2_debug("using block group %d(%d)\n", i, desc->bg_free_blocks_count); - ext2_debug ("using block group %d(%d)\n", i, gdp->bg_free_blocks_count); - - /* - * Check quota for allocation of this block. - */ - if(DQUOT_ALLOC_BLOCK(inode, 1)) { - *err = -EDQUOT; - goto out; - } - - tmp = j + i * EXT2_BLOCKS_PER_GROUP(sb) + le32_to_cpu(es->s_first_data_block); + tmp = j + i * group_size + le32_to_cpu(es->s_first_data_block); - if (tmp == le32_to_cpu(gdp->bg_block_bitmap) || - tmp == le32_to_cpu(gdp->bg_inode_bitmap) || - in_range (tmp, le32_to_cpu(gdp->bg_inode_table), - sb->u.ext2_sb.s_itb_per_group)) + if (tmp == le32_to_cpu(desc->bg_block_bitmap) || + tmp == le32_to_cpu(desc->bg_inode_bitmap) || + in_range (tmp, le32_to_cpu(desc->bg_inode_table), + sbi->s_itb_per_group)) ext2_error (sb, "ext2_new_block", "Allocating block in system zone - " "block = %u", tmp); - if (ext2_set_bit (j, bh->b_data)) { - ext2_warning (sb, "ext2_new_block", - "bit already set for block %d", j); - DQUOT_FREE_BLOCK(inode, 1); - goto repeat; + if (tmp >= le32_to_cpu(es->s_blocks_count)) { + ext2_error (sb, "ext2_new_block", + "block(%d) >= blocks count(%d) - " + "block_group = %d, es == %p ",j, + le32_to_cpu(es->s_blocks_count), i, es); + goto out_release; } + block = tmp; + /* OK, we _had_ allocated something */ ext2_debug ("found bit %d\n", j); + dq_alloc--; + es_alloc--; + group_alloc--; + /* * Do block preallocation now if required. */ -#ifdef EXT2_PREALLOCATE /* Writer: ->i_prealloc* */ - if (prealloc_count && !*prealloc_count) { - int prealloc_goal; - unsigned long next_block = tmp + 1; - - prealloc_goal = es->s_prealloc_blocks ? - es->s_prealloc_blocks : EXT2_DEFAULT_PREALLOC_BLOCKS; + if (group_alloc && !*prealloc_count) { + unsigned long next_block = block + 1; *prealloc_block = next_block; /* Writer: end */ - for (k = 1; - k < prealloc_goal && (j + k) < EXT2_BLOCKS_PER_GROUP(sb); - k++, next_block++) { - if (DQUOT_PREALLOC_BLOCK(inode, 1)) - break; + while (group_alloc && ++j < group_size) { /* Writer: ->i_prealloc* */ if (*prealloc_block + *prealloc_count != next_block || - ext2_set_bit (j + k, bh->b_data)) { + ext2_set_bit (j, bh->b_data)) { /* Writer: end */ - DQUOT_FREE_BLOCK(inode, 1); break; } (*prealloc_count)++; /* Writer: end */ + next_block++; + es_alloc--; + dq_alloc--; + group_alloc--; } - /* - * As soon as we go for per-group spinlocks we'll need these - * done inside the loop above. - */ - gdp->bg_free_blocks_count = - cpu_to_le16(le16_to_cpu(gdp->bg_free_blocks_count) - - (k - 1)); - es->s_free_blocks_count = - cpu_to_le32(le32_to_cpu(es->s_free_blocks_count) - - (k - 1)); - ext2_debug ("Preallocated a further %lu bits.\n", - (k - 1)); } -#endif - - j = tmp; mark_buffer_dirty(bh); if (sb->s_flags & MS_SYNCHRONOUS) { @@ -499,32 +532,21 @@ got_block: wait_on_buffer (bh); } - if (j >= le32_to_cpu(es->s_blocks_count)) { - ext2_error (sb, "ext2_new_block", - "block(%d) >= blocks count(%d) - " - "block_group = %d, es == %p ",j, - le32_to_cpu(es->s_blocks_count), i, es); - goto out; - } - - ext2_debug ("allocating block %d. " - "Goal hits %d of %d.\n", j, goal_hits, goal_attempts); + ext2_debug ("allocating block %d. ", block); - gdp->bg_free_blocks_count = cpu_to_le16(le16_to_cpu(gdp->bg_free_blocks_count) - 1); - mark_buffer_dirty(bh2); - es->s_free_blocks_count = cpu_to_le32(le32_to_cpu(es->s_free_blocks_count) - 1); - mark_buffer_dirty(sb->u.ext2_sb.s_sbh); - sb->s_dirt = 1; - unlock_super (sb); +out_release: + group_release_blocks(desc, bh2, group_alloc); + release_blocks(sb, es_alloc); *err = 0; - return j; - +out_unlock: + unlock_super (sb); + DQUOT_FREE_BLOCK(inode, dq_alloc); +out: + return block; + io_error: *err = -EIO; -out: - unlock_super (sb); - return 0; - + goto out_release; } unsigned long ext2_count_free_blocks (struct super_block * sb) @@ -532,27 +554,27 @@ unsigned long ext2_count_free_blocks (struct super_block * sb) #ifdef EXT2FS_DEBUG struct ext2_super_block * es; unsigned long desc_count, bitmap_count, x; - struct ext2_group_desc * gdp; + struct ext2_group_desc * desc; int i; lock_super (sb); es = sb->u.ext2_sb.s_es; desc_count = 0; bitmap_count = 0; - gdp = NULL; + desc = NULL; for (i = 0; i < sb->u.ext2_sb.s_groups_count; i++) { struct buffer_head *bh; - gdp = ext2_get_group_desc (sb, i, NULL); - if (!gdp) + desc = ext2_get_group_desc (sb, i, NULL); + if (!desc) continue; - desc_count += le16_to_cpu(gdp->bg_free_blocks_count); + desc_count += le16_to_cpu(desc->bg_free_blocks_count); bh = load_block_bitmap (sb, i); if (IS_ERR(bh)) continue; x = ext2_count_free (bh, sb->s_blocksize); printk ("group %d: stored = %d, counted = %lu\n", - i, le16_to_cpu(gdp->bg_free_blocks_count), x); + i, le16_to_cpu(desc->bg_free_blocks_count), x); bitmap_count += x; } printk("ext2_count_free_blocks: stored = %lu, computed = %lu, %lu\n", @@ -632,18 +654,18 @@ void ext2_check_blocks_bitmap (struct super_block * sb) struct ext2_super_block * es; unsigned long desc_count, bitmap_count, x, j; unsigned long desc_blocks; - struct ext2_group_desc * gdp; + struct ext2_group_desc * desc; int i; es = sb->u.ext2_sb.s_es; desc_count = 0; bitmap_count = 0; - gdp = NULL; + desc = NULL; for (i = 0; i < sb->u.ext2_sb.s_groups_count; i++) { - gdp = ext2_get_group_desc (sb, i, NULL); - if (!gdp) + desc = ext2_get_group_desc (sb, i, NULL); + if (!desc) continue; - desc_count += le16_to_cpu(gdp->bg_free_blocks_count); + desc_count += le16_to_cpu(desc->bg_free_blocks_count); bh = load_block_bitmap (sb, i); if (IS_ERR(bh)) continue; @@ -659,28 +681,28 @@ void ext2_check_blocks_bitmap (struct super_block * sb) "Descriptor block #%ld in group " "%d is marked free", j, i); - if (!block_in_use (le32_to_cpu(gdp->bg_block_bitmap), sb, bh->b_data)) + if (!block_in_use (le32_to_cpu(desc->bg_block_bitmap), sb, bh->b_data)) ext2_error (sb, "ext2_check_blocks_bitmap", "Block bitmap for group %d is marked free", i); - if (!block_in_use (le32_to_cpu(gdp->bg_inode_bitmap), sb, bh->b_data)) + if (!block_in_use (le32_to_cpu(desc->bg_inode_bitmap), sb, bh->b_data)) ext2_error (sb, "ext2_check_blocks_bitmap", "Inode bitmap for group %d is marked free", i); for (j = 0; j < sb->u.ext2_sb.s_itb_per_group; j++) - if (!block_in_use (le32_to_cpu(gdp->bg_inode_table) + j, sb, bh->b_data)) + if (!block_in_use (le32_to_cpu(desc->bg_inode_table) + j, sb, bh->b_data)) ext2_error (sb, "ext2_check_blocks_bitmap", "Block #%ld of the inode table in " "group %d is marked free", j, i); x = ext2_count_free (bh, sb->s_blocksize); - if (le16_to_cpu(gdp->bg_free_blocks_count) != x) + if (le16_to_cpu(desc->bg_free_blocks_count) != x) ext2_error (sb, "ext2_check_blocks_bitmap", "Wrong free blocks count for group %d, " "stored = %d, counted = %lu", i, - le16_to_cpu(gdp->bg_free_blocks_count), x); + le16_to_cpu(desc->bg_free_blocks_count), x); bitmap_count += x; } if (le32_to_cpu(es->s_free_blocks_count) != bitmap_count) diff --git a/fs/ext2/file.c b/fs/ext2/file.c index 9843debce..e005965f6 100644 --- a/fs/ext2/file.c +++ b/fs/ext2/file.c @@ -19,7 +19,7 @@ */ #include "ext2.h" -#include <linux/sched.h> +#include <linux/time.h> /* * Called when an inode is released. Note that this is different diff --git a/fs/ext2/inode.c b/fs/ext2/inode.c index c355f6cbf..76074e943 100644 --- a/fs/ext2/inode.c +++ b/fs/ext2/inode.c @@ -25,7 +25,7 @@ #include "ext2.h" #include <linux/locks.h> #include <linux/smp_lock.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/highuid.h> #include <linux/quotaops.h> #include <linux/module.h> diff --git a/fs/ext2/ioctl.c b/fs/ext2/ioctl.c index 07e9aafbc..680eb331a 100644 --- a/fs/ext2/ioctl.c +++ b/fs/ext2/ioctl.c @@ -8,7 +8,7 @@ */ #include "ext2.h" -#include <linux/sched.h> +#include <linux/time.h> #include <asm/uaccess.h> diff --git a/fs/ext3/balloc.c b/fs/ext3/balloc.c index f4f87da52..24336e4c8 100644 --- a/fs/ext3/balloc.c +++ b/fs/ext3/balloc.c @@ -12,7 +12,7 @@ */ #include <linux/config.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/fs.h> #include <linux/jbd.h> #include <linux/ext3_fs.h> diff --git a/fs/ext3/file.c b/fs/ext3/file.c index 65ee4b28d..3ed85a1ad 100644 --- a/fs/ext3/file.c +++ b/fs/ext3/file.c @@ -18,7 +18,7 @@ * (jj@sunsite.ms.mff.cuni.cz) */ -#include <linux/sched.h> +#include <linux/time.h> #include <linux/fs.h> #include <linux/locks.h> #include <linux/jbd.h> diff --git a/fs/ext3/fsync.c b/fs/ext3/fsync.c index 79f4f8385..e474547eb 100644 --- a/fs/ext3/fsync.c +++ b/fs/ext3/fsync.c @@ -22,7 +22,7 @@ * we can depend on generic_block_fdatasync() to sync the data blocks. */ -#include <linux/sched.h> +#include <linux/time.h> #include <linux/fs.h> #include <linux/jbd.h> #include <linux/ext3_fs.h> diff --git a/fs/ext3/ialloc.c b/fs/ext3/ialloc.c index 20e8aea82..2febb5495 100644 --- a/fs/ext3/ialloc.c +++ b/fs/ext3/ialloc.c @@ -12,7 +12,7 @@ * David S. Miller (davem@caip.rutgers.edu), 1995 */ -#include <linux/sched.h> +#include <linux/time.h> #include <linux/fs.h> #include <linux/jbd.h> #include <linux/ext3_fs.h> diff --git a/fs/ext3/inode.c b/fs/ext3/inode.c index 4398759a1..83cc1283e 100644 --- a/fs/ext3/inode.c +++ b/fs/ext3/inode.c @@ -23,7 +23,7 @@ */ #include <linux/fs.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/ext3_jbd.h> #include <linux/jbd.h> #include <linux/locks.h> diff --git a/fs/ext3/ioctl.c b/fs/ext3/ioctl.c index 07f7fdd93..beca674d3 100644 --- a/fs/ext3/ioctl.c +++ b/fs/ext3/ioctl.c @@ -11,7 +11,7 @@ #include <linux/jbd.h> #include <linux/ext3_fs.h> #include <linux/ext3_jbd.h> -#include <linux/sched.h> +#include <linux/time.h> #include <asm/uaccess.h> diff --git a/fs/ext3/namei.c b/fs/ext3/namei.c index ca49f46f9..7b9e7c9d8 100644 --- a/fs/ext3/namei.c +++ b/fs/ext3/namei.c @@ -20,7 +20,7 @@ #include <linux/fs.h> #include <linux/jbd.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/ext3_fs.h> #include <linux/ext3_jbd.h> #include <linux/fcntl.h> diff --git a/fs/ext3/super.c b/fs/ext3/super.c index 24ddd1d43..009ee4622 100644 --- a/fs/ext3/super.c +++ b/fs/ext3/super.c @@ -20,7 +20,7 @@ #include <linux/module.h> #include <linux/string.h> #include <linux/fs.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/jbd.h> #include <linux/ext3_fs.h> #include <linux/ext3_jbd.h> diff --git a/fs/fat/dir.c b/fs/fat/dir.c index a1ee11a74..6a81b8259 100644 --- a/fs/fat/dir.c +++ b/fs/fat/dir.c @@ -14,7 +14,7 @@ */ #include <linux/slab.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/msdos_fs.h> #include <linux/dirent.h> diff --git a/fs/fat/file.c b/fs/fat/file.c index 27911fbd9..942fdebef 100644 --- a/fs/fat/file.c +++ b/fs/fat/file.c @@ -6,7 +6,7 @@ * regular file handling primitives for fat-based filesystems */ -#include <linux/sched.h> +#include <linux/time.h> #include <linux/locks.h> #include <linux/msdos_fs.h> #include <linux/fat_cvf.h> diff --git a/fs/fat/inode.c b/fs/fat/inode.c index 8755a715a..9e3b7ec82 100644 --- a/fs/fat/inode.c +++ b/fs/fat/inode.c @@ -11,7 +11,7 @@ */ #include <linux/module.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/locks.h> #include <linux/slab.h> #include <linux/smp_lock.h> @@ -12,6 +12,7 @@ #include <linux/mm.h> #include <linux/slab.h> #include <linux/smp_lock.h> +#include <linux/fs.h> static void wait_for_partner(struct inode* inode, unsigned int* cnt) { @@ -8,7 +8,7 @@ #include <linux/fs.h> #include <linux/mm.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/slab.h> #include <linux/vmalloc.h> #include <linux/file.h> diff --git a/fs/file_table.c b/fs/file_table.c index e7248739e..d9e8a5b3d 100644 --- a/fs/file_table.c +++ b/fs/file_table.c @@ -12,6 +12,7 @@ #include <linux/module.h> #include <linux/smp_lock.h> #include <linux/iobuf.h> +#include <linux/fs.h> /* sysctl tunables... */ struct files_stat_struct files_stat = {0, 0, NR_FILE}; diff --git a/fs/filesystems.c b/fs/filesystems.c index 98be56d1f..beb785f3c 100644 --- a/fs/filesystems.c +++ b/fs/filesystems.c @@ -8,10 +8,11 @@ #include <linux/config.h> #include <linux/module.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/smp_lock.h> #include <linux/kmod.h> #include <linux/nfsd/interface.h> +#include <linux/linkage.h> #if defined(CONFIG_NFSD_MODULE) struct nfsd_linkage *nfsd_linkage = NULL; diff --git a/fs/freevxfs/vxfs_lookup.c b/fs/freevxfs/vxfs_lookup.c index 2942766f2..9d52234f9 100644 --- a/fs/freevxfs/vxfs_lookup.c +++ b/fs/freevxfs/vxfs_lookup.c @@ -33,7 +33,7 @@ * Veritas filesystem driver - lookup and other directory related code. */ #include <linux/fs.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/mm.h> #include <linux/highmem.h> #include <linux/kernel.h> diff --git a/fs/hpfs/dir.c b/fs/hpfs/dir.c index 8943d6d15..513f2bd2a 100644 --- a/fs/hpfs/dir.c +++ b/fs/hpfs/dir.c @@ -7,7 +7,7 @@ */ #include "hpfs_fn.h" -#include <linux/sched.h> +#include <linux/time.h> #include <linux/smp_lock.h> int hpfs_dir_release(struct inode *inode, struct file *filp) diff --git a/fs/hpfs/file.c b/fs/hpfs/file.c index d841654ed..10bc9d887 100644 --- a/fs/hpfs/file.c +++ b/fs/hpfs/file.c @@ -7,7 +7,7 @@ */ #include <linux/string.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/smp_lock.h> #include "hpfs_fn.h" diff --git a/fs/hpfs/hpfs_fn.h b/fs/hpfs/hpfs_fn.h index ce0c2b0f2..a6cb5a596 100644 --- a/fs/hpfs/hpfs_fn.h +++ b/fs/hpfs/hpfs_fn.h @@ -15,7 +15,7 @@ #include <linux/errno.h> #include <linux/slab.h> #include <linux/kernel.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/locks.h> #include <linux/stat.h> #include <linux/string.h> diff --git a/fs/hpfs/inode.c b/fs/hpfs/inode.c index a45a3303b..c1411921e 100644 --- a/fs/hpfs/inode.c +++ b/fs/hpfs/inode.c @@ -6,7 +6,7 @@ * inode VFS functions */ -#include <linux/sched.h> +#include <linux/time.h> #include <linux/smp_lock.h> #include "hpfs_fn.h" diff --git a/fs/intermezzo/cache.c b/fs/intermezzo/cache.c index b7ef2eb49..0526fd33a 100644 --- a/fs/intermezzo/cache.c +++ b/fs/intermezzo/cache.c @@ -19,7 +19,7 @@ #include <linux/ext2_fs.h> #include <linux/slab.h> #include <linux/vmalloc.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/stat.h> #include <linux/string.h> #include <linux/locks.h> diff --git a/fs/intermezzo/dcache.c b/fs/intermezzo/dcache.c index 4b94a8ec3..eca114afc 100644 --- a/fs/intermezzo/dcache.c +++ b/fs/intermezzo/dcache.c @@ -10,7 +10,7 @@ #define __NO_VERSION__ #include <linux/types.h> #include <linux/kernel.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/fs.h> #include <linux/stat.h> #include <linux/errno.h> diff --git a/fs/intermezzo/dir.c b/fs/intermezzo/dir.c index 25f7f1810..de2d4afc0 100644 --- a/fs/intermezzo/dir.c +++ b/fs/intermezzo/dir.c @@ -21,7 +21,7 @@ #include <linux/ext2_fs.h> #include <linux/slab.h> #include <linux/vmalloc.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/stat.h> #include <linux/string.h> #include <linux/locks.h> diff --git a/fs/intermezzo/file.c b/fs/intermezzo/file.c index 8464b2618..68084e55e 100644 --- a/fs/intermezzo/file.c +++ b/fs/intermezzo/file.c @@ -28,7 +28,7 @@ #include <linux/ext2_fs.h> #include <linux/slab.h> #include <linux/vmalloc.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/stat.h> #include <linux/string.h> #include <linux/locks.h> diff --git a/fs/intermezzo/journal_ext2.c b/fs/intermezzo/journal_ext2.c index ceeb9f941..dfe97bbe7 100644 --- a/fs/intermezzo/journal_ext2.c +++ b/fs/intermezzo/journal_ext2.c @@ -5,7 +5,7 @@ #include <linux/types.h> #include <linux/kernel.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/fs.h> #include <linux/slab.h> #include <linux/vmalloc.h> diff --git a/fs/intermezzo/journal_ext3.c b/fs/intermezzo/journal_ext3.c index eadd1d857..58ab5f50d 100644 --- a/fs/intermezzo/journal_ext3.c +++ b/fs/intermezzo/journal_ext3.c @@ -10,7 +10,7 @@ #include <linux/types.h> #include <linux/param.h> #include <linux/kernel.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/fs.h> #include <linux/slab.h> #include <linux/vmalloc.h> diff --git a/fs/intermezzo/journal_obdfs.c b/fs/intermezzo/journal_obdfs.c index bda86f328..c6d239b26 100644 --- a/fs/intermezzo/journal_obdfs.c +++ b/fs/intermezzo/journal_obdfs.c @@ -10,7 +10,7 @@ #include <linux/types.h> #include <linux/param.h> #include <linux/kernel.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/fs.h> #include <linux/slab.h> #include <linux/vmalloc.h> diff --git a/fs/intermezzo/journal_reiserfs.c b/fs/intermezzo/journal_reiserfs.c index 780d9daa1..6531887ad 100644 --- a/fs/intermezzo/journal_reiserfs.c +++ b/fs/intermezzo/journal_reiserfs.c @@ -9,7 +9,7 @@ #include <linux/types.h> #include <linux/param.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/fs.h> #include <linux/slab.h> #include <linux/vmalloc.h> diff --git a/fs/intermezzo/journal_xfs.c b/fs/intermezzo/journal_xfs.c index fed141fdc..0ec4372e9 100644 --- a/fs/intermezzo/journal_xfs.c +++ b/fs/intermezzo/journal_xfs.c @@ -5,7 +5,7 @@ #include <linux/types.h> #include <linux/kernel.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/fs.h> #include <linux/slab.h> #include <linux/vmalloc.h> diff --git a/fs/intermezzo/methods.c b/fs/intermezzo/methods.c index 09496b3ca..05af7f28b 100644 --- a/fs/intermezzo/methods.c +++ b/fs/intermezzo/methods.c @@ -20,7 +20,7 @@ #include <linux/ext2_fs.h> #include <linux/slab.h> #include <linux/vmalloc.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/stat.h> #include <linux/string.h> #include <linux/locks.h> diff --git a/fs/intermezzo/presto.c b/fs/intermezzo/presto.c index 1eba374ae..ad89030be 100644 --- a/fs/intermezzo/presto.c +++ b/fs/intermezzo/presto.c @@ -10,7 +10,7 @@ */ #include <linux/types.h> #include <linux/kernel.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/fs.h> #include <linux/stat.h> #include <linux/errno.h> diff --git a/fs/intermezzo/psdev.c b/fs/intermezzo/psdev.c index 0384ab5c3..b7501c1a4 100644 --- a/fs/intermezzo/psdev.c +++ b/fs/intermezzo/psdev.c @@ -32,7 +32,7 @@ #include <linux/errno.h> #include <linux/kernel.h> #include <linux/major.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/lp.h> #include <linux/slab.h> #include <asm/ioctls.h> diff --git a/fs/intermezzo/super.c b/fs/intermezzo/super.c index 2b011f171..7081dbdd2 100644 --- a/fs/intermezzo/super.c +++ b/fs/intermezzo/super.c @@ -20,7 +20,7 @@ #include <linux/ext2_fs.h> #include <linux/slab.h> #include <linux/vmalloc.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/stat.h> #include <linux/string.h> #include <linux/locks.h> diff --git a/fs/intermezzo/sysctl.c b/fs/intermezzo/sysctl.c index 212e4c19f..ec438c487 100644 --- a/fs/intermezzo/sysctl.c +++ b/fs/intermezzo/sysctl.c @@ -5,7 +5,7 @@ #define __NO_VERSION__ #include <linux/config.h> /* for CONFIG_PROC_FS */ #include <linux/module.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/mm.h> #include <linux/sysctl.h> #include <linux/swapctl.h> diff --git a/fs/intermezzo/upcall.c b/fs/intermezzo/upcall.c index 95ecdef0b..37491a4c3 100644 --- a/fs/intermezzo/upcall.c +++ b/fs/intermezzo/upcall.c @@ -28,7 +28,7 @@ #include <linux/mm.h> #include <linux/vmalloc.h> #include <linux/slab.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/fs.h> #include <linux/stat.h> #include <linux/errno.h> diff --git a/fs/ioctl.c b/fs/ioctl.c index f46bdb1ed..a36c61f18 100644 --- a/fs/ioctl.c +++ b/fs/ioctl.c @@ -7,6 +7,7 @@ #include <linux/mm.h> #include <linux/smp_lock.h> #include <linux/file.h> +#include <linux/fs.h> #include <asm/uaccess.h> #include <asm/ioctls.h> diff --git a/fs/isofs/compress.c b/fs/isofs/compress.c index 595599161..bc9773364 100644 --- a/fs/isofs/compress.c +++ b/fs/isofs/compress.c @@ -20,7 +20,7 @@ #include <linux/module.h> #include <linux/stat.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/iso_fs.h> #include <linux/kernel.h> #include <linux/major.h> diff --git a/fs/isofs/dir.c b/fs/isofs/dir.c index 29db6b6c0..9c7ff0c3b 100644 --- a/fs/isofs/dir.c +++ b/fs/isofs/dir.c @@ -18,7 +18,7 @@ #include <linux/string.h> #include <linux/mm.h> #include <linux/slab.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/locks.h> #include <linux/config.h> diff --git a/fs/isofs/inode.c b/fs/isofs/inode.c index 66ea867e7..eca947cb9 100644 --- a/fs/isofs/inode.c +++ b/fs/isofs/inode.c @@ -13,7 +13,7 @@ #include <linux/module.h> #include <linux/stat.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/iso_fs.h> #include <linux/kernel.h> #include <linux/major.h> diff --git a/fs/isofs/namei.c b/fs/isofs/namei.c index a9aa14892..0b952b365 100644 --- a/fs/isofs/namei.c +++ b/fs/isofs/namei.c @@ -6,7 +6,7 @@ * (C) 1991 Linus Torvalds - minix filesystem */ -#include <linux/sched.h> +#include <linux/time.h> #include <linux/iso_fs.h> #include <linux/kernel.h> #include <linux/string.h> diff --git a/fs/isofs/rock.c b/fs/isofs/rock.c index 08a6c8a3e..5065d2fdc 100644 --- a/fs/isofs/rock.c +++ b/fs/isofs/rock.c @@ -7,7 +7,7 @@ */ #include <linux/stat.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/iso_fs.h> #include <linux/string.h> #include <linux/mm.h> diff --git a/fs/jbd/checkpoint.c b/fs/jbd/checkpoint.c index e682155bf..895bd4053 100644 --- a/fs/jbd/checkpoint.c +++ b/fs/jbd/checkpoint.c @@ -17,7 +17,7 @@ * reused. */ -#include <linux/sched.h> +#include <linux/time.h> #include <linux/fs.h> #include <linux/jbd.h> #include <linux/errno.h> diff --git a/fs/jbd/commit.c b/fs/jbd/commit.c index ee8f2248c..94900b340 100644 --- a/fs/jbd/commit.c +++ b/fs/jbd/commit.c @@ -13,7 +13,7 @@ * part of the ext2fs journaling system. */ -#include <linux/sched.h> +#include <linux/time.h> #include <linux/fs.h> #include <linux/jbd.h> #include <linux/errno.h> diff --git a/fs/jbd/journal.c b/fs/jbd/journal.c index 92388ce7e..32801472a 100644 --- a/fs/jbd/journal.c +++ b/fs/jbd/journal.c @@ -23,14 +23,13 @@ */ #include <linux/module.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/fs.h> #include <linux/jbd.h> #include <linux/errno.h> #include <linux/slab.h> #include <linux/locks.h> #include <linux/smp_lock.h> -#include <linux/sched.h> #include <linux/init.h> #include <linux/mm.h> #include <linux/slab.h> diff --git a/fs/jbd/recovery.c b/fs/jbd/recovery.c index b4f2cd890..68b2137ab 100644 --- a/fs/jbd/recovery.c +++ b/fs/jbd/recovery.c @@ -16,7 +16,7 @@ #ifndef __KERNEL__ #include "jfs_user.h" #else -#include <linux/sched.h> +#include <linux/time.h> #include <linux/fs.h> #include <linux/jbd.h> #include <linux/errno.h> diff --git a/fs/jbd/revoke.c b/fs/jbd/revoke.c index 43987b60f..77efb3552 100644 --- a/fs/jbd/revoke.c +++ b/fs/jbd/revoke.c @@ -60,7 +60,7 @@ #ifndef __KERNEL__ #include "jfs_user.h" #else -#include <linux/sched.h> +#include <linux/time.h> #include <linux/fs.h> #include <linux/jbd.h> #include <linux/errno.h> diff --git a/fs/jbd/transaction.c b/fs/jbd/transaction.c index 1b113947c..859c45380 100644 --- a/fs/jbd/transaction.c +++ b/fs/jbd/transaction.c @@ -17,7 +17,7 @@ * filesystem). */ -#include <linux/sched.h> +#include <linux/time.h> #include <linux/fs.h> #include <linux/jbd.h> #include <linux/errno.h> diff --git a/fs/jffs/inode-v23.c b/fs/jffs/inode-v23.c index 2bc47cf04..dd2351582 100644 --- a/fs/jffs/inode-v23.c +++ b/fs/jffs/inode-v23.c @@ -32,7 +32,7 @@ dwmw2 */ #define __KERNEL_SYSCALLS__ -#include <linux/sched.h> +#include <linux/time.h> #include <linux/unistd.h> #include <linux/module.h> diff --git a/fs/jffs/intrep.c b/fs/jffs/intrep.c index 64b5898d2..39b6c3730 100644 --- a/fs/jffs/intrep.c +++ b/fs/jffs/intrep.c @@ -68,7 +68,7 @@ #include <asm/byteorder.h> #include <linux/version.h> #include <linux/smp_lock.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/ctype.h> #include "intrep.h" diff --git a/fs/jffs/jffs_proc.c b/fs/jffs/jffs_proc.c index 22107954f..b100bff2c 100644 --- a/fs/jffs/jffs_proc.c +++ b/fs/jffs/jffs_proc.c @@ -26,7 +26,7 @@ #include <linux/jffs.h> #include <linux/slab.h> #include <linux/proc_fs.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/types.h> #include "jffs_fm.h" #include "jffs_proc.h" diff --git a/fs/jffs2/background.c b/fs/jffs2/background.c index be5f8be03..ac1a66b9a 100644 --- a/fs/jffs2/background.c +++ b/fs/jffs2/background.c @@ -38,7 +38,7 @@ #define __KERNEL_SYSCALLS__ #include <linux/kernel.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/unistd.h> #include <linux/jffs2.h> #include <linux/mtd/mtd.h> diff --git a/fs/jffs2/dir.c b/fs/jffs2/dir.c index 4712eb7fd..8d5c14268 100644 --- a/fs/jffs2/dir.c +++ b/fs/jffs2/dir.c @@ -42,7 +42,7 @@ #include <linux/jffs2.h> #include <linux/jffs2_fs_i.h> #include <linux/jffs2_fs_sb.h> -#include <linux/sched.h> +#include <linux/time.h> #include "nodelist.h" static int jffs2_readdir (struct file *, void *, filldir_t); diff --git a/fs/jffs2/gc.c b/fs/jffs2/gc.c index 9294e584c..fc4ab75ea 100644 --- a/fs/jffs2/gc.c +++ b/fs/jffs2/gc.c @@ -39,7 +39,7 @@ #include <linux/mtd/mtd.h> #include <linux/slab.h> #include <linux/jffs2.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/interrupt.h> #include <linux/pagemap.h> #include <linux/crc32.h> diff --git a/fs/lockd/clntlock.c b/fs/lockd/clntlock.c index f092bfa9c..f38a04057 100644 --- a/fs/lockd/clntlock.c +++ b/fs/lockd/clntlock.c @@ -10,7 +10,7 @@ #include <linux/module.h> #include <linux/types.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/nfs_fs.h> #include <linux/unistd.h> #include <linux/sunrpc/clnt.h> diff --git a/fs/lockd/lockd_syms.c b/fs/lockd/lockd_syms.c index 2de24bbfd..c8c4a603a 100644 --- a/fs/lockd/lockd_syms.c +++ b/fs/lockd/lockd_syms.c @@ -16,7 +16,7 @@ #include <linux/types.h> #include <linux/socket.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/uio.h> #include <linux/unistd.h> diff --git a/fs/lockd/svc4proc.c b/fs/lockd/svc4proc.c index 28d8cbf1e..6ef8cb8c2 100644 --- a/fs/lockd/svc4proc.c +++ b/fs/lockd/svc4proc.c @@ -8,7 +8,7 @@ */ #include <linux/types.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/slab.h> #include <linux/in.h> #include <linux/sunrpc/svc.h> diff --git a/fs/lockd/svclock.c b/fs/lockd/svclock.c index db4be6f10..67c4743d2 100644 --- a/fs/lockd/svclock.c +++ b/fs/lockd/svclock.c @@ -306,9 +306,8 @@ nlmsvc_lock(struct svc_rqst *rqstp, struct nlm_file *file, struct nlm_block *block; int error; - dprintk("lockd: nlmsvc_lock(%02x:%02x/%ld, ty=%d, pi=%d, %Ld-%Ld, bl=%d)\n", - major(file->f_file.f_dentry->d_inode->i_dev), - minor(file->f_file.f_dentry->d_inode->i_dev), + dprintk("lockd: nlmsvc_lock(%s/%ld, ty=%d, pi=%d, %Ld-%Ld, bl=%d)\n", + file->f_file.f_dentry->d_inode->i_sb->s_id, file->f_file.f_dentry->d_inode->i_ino, lock->fl.fl_type, lock->fl.fl_pid, (long long)lock->fl.fl_start, @@ -386,9 +385,8 @@ nlmsvc_testlock(struct nlm_file *file, struct nlm_lock *lock, { struct file_lock *fl; - dprintk("lockd: nlmsvc_testlock(%02x:%02x/%ld, ty=%d, %Ld-%Ld)\n", - major(file->f_file.f_dentry->d_inode->i_dev), - minor(file->f_file.f_dentry->d_inode->i_dev), + dprintk("lockd: nlmsvc_testlock(%s/%ld, ty=%d, %Ld-%Ld)\n", + file->f_file.f_dentry->d_inode->i_sb->s_id, file->f_file.f_dentry->d_inode->i_ino, lock->fl.fl_type, (long long)lock->fl.fl_start, @@ -419,9 +417,8 @@ nlmsvc_unlock(struct nlm_file *file, struct nlm_lock *lock) { int error; - dprintk("lockd: nlmsvc_unlock(%02x:%02x/%ld, pi=%d, %Ld-%Ld)\n", - major(file->f_file.f_dentry->d_inode->i_dev), - minor(file->f_file.f_dentry->d_inode->i_dev), + dprintk("lockd: nlmsvc_unlock(%s/%ld, pi=%d, %Ld-%Ld)\n", + file->f_file.f_dentry->d_inode->i_sb->s_id, file->f_file.f_dentry->d_inode->i_ino, lock->fl.fl_pid, (long long)lock->fl.fl_start, @@ -448,9 +445,8 @@ nlmsvc_cancel_blocked(struct nlm_file *file, struct nlm_lock *lock) { struct nlm_block *block; - dprintk("lockd: nlmsvc_cancel(%02x:%02x/%ld, pi=%d, %Ld-%Ld)\n", - major(file->f_file.f_dentry->d_inode->i_dev), - minor(file->f_file.f_dentry->d_inode->i_dev), + dprintk("lockd: nlmsvc_cancel(%s/%ld, pi=%d, %Ld-%Ld)\n", + file->f_file.f_dentry->d_inode->i_sb->s_id, file->f_file.f_dentry->d_inode->i_ino, lock->fl.fl_pid, (long long)lock->fl.fl_start, diff --git a/fs/lockd/svcproc.c b/fs/lockd/svcproc.c index a5283be9b..9eb586612 100644 --- a/fs/lockd/svcproc.c +++ b/fs/lockd/svcproc.c @@ -9,7 +9,7 @@ #include <linux/config.h> #include <linux/types.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/slab.h> #include <linux/in.h> #include <linux/sunrpc/svc.h> diff --git a/fs/lockd/svcshare.c b/fs/lockd/svcshare.c index 73fbb1ba4..ef24965f9 100644 --- a/fs/lockd/svcshare.c +++ b/fs/lockd/svcshare.c @@ -6,7 +6,7 @@ * Copyright (C) 1996 Olaf Kirch <okir@monad.swb.de> */ -#include <linux/sched.h> +#include <linux/time.h> #include <linux/unistd.h> #include <linux/string.h> #include <linux/slab.h> diff --git a/fs/lockd/svcsubs.c b/fs/lockd/svcsubs.c index e7bcab775..6c07d3af8 100644 --- a/fs/lockd/svcsubs.c +++ b/fs/lockd/svcsubs.c @@ -9,7 +9,7 @@ #include <linux/config.h> #include <linux/types.h> #include <linux/string.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/in.h> #include <linux/sunrpc/svc.h> #include <linux/sunrpc/clnt.h> @@ -128,7 +128,7 @@ nlm_delete_file(struct nlm_file *file) struct nlm_file **fp, *f; dprintk("lockd: closing file %s/%ld\n", - kdevname(inode->i_dev), inode->i_ino); + inode->i_sb->s_id, inode->i_ino); fp = nlm_files + file->f_hash; while ((f = *fp) != NULL) { if (f == file) { diff --git a/fs/locks.c b/fs/locks.c index eeaa45b14..2c6d2d305 100644 --- a/fs/locks.c +++ b/fs/locks.c @@ -120,7 +120,8 @@ #include <linux/smp_lock.h> #include <linux/init.h> #include <linux/capability.h> -#include <linux/sched.h> +#include <linux/time.h> +#include <linux/fs.h> #include <asm/semaphore.h> #include <asm/uaccess.h> diff --git a/fs/msdos/namei.c b/fs/msdos/namei.c index 6b136aad9..77ec25b61 100644 --- a/fs/msdos/namei.c +++ b/fs/msdos/namei.c @@ -10,7 +10,7 @@ #define __NO_VERSION__ #include <linux/module.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/msdos_fs.h> #define MSDOS_DEBUG 0 diff --git a/fs/ncpfs/dir.c b/fs/ncpfs/dir.c index 25ac483a1..929d6df7e 100644 --- a/fs/ncpfs/dir.c +++ b/fs/ncpfs/dir.c @@ -11,7 +11,7 @@ #include <linux/config.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/errno.h> #include <linux/stat.h> #include <linux/kernel.h> diff --git a/fs/ncpfs/file.c b/fs/ncpfs/file.c index bc7b38e55..0b5f43771 100644 --- a/fs/ncpfs/file.c +++ b/fs/ncpfs/file.c @@ -9,7 +9,7 @@ #include <asm/uaccess.h> #include <asm/system.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/kernel.h> #include <linux/errno.h> #include <linux/fcntl.h> diff --git a/fs/ncpfs/inode.c b/fs/ncpfs/inode.c index 4e79dcb47..b3882c7d6 100644 --- a/fs/ncpfs/inode.c +++ b/fs/ncpfs/inode.c @@ -15,7 +15,7 @@ #include <asm/uaccess.h> #include <asm/byteorder.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/kernel.h> #include <linux/mm.h> #include <linux/string.h> diff --git a/fs/ncpfs/ioctl.c b/fs/ncpfs/ioctl.c index f10cb81a9..d923de41e 100644 --- a/fs/ncpfs/ioctl.c +++ b/fs/ncpfs/ioctl.c @@ -13,7 +13,7 @@ #include <linux/errno.h> #include <linux/fs.h> #include <linux/ioctl.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/mm.h> #include <linux/highuid.h> #include <linux/vmalloc.h> diff --git a/fs/ncpfs/mmap.c b/fs/ncpfs/mmap.c index 7d9bc345d..57573efb2 100644 --- a/fs/ncpfs/mmap.c +++ b/fs/ncpfs/mmap.c @@ -7,7 +7,7 @@ */ #include <linux/stat.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/kernel.h> #include <linux/mm.h> #include <linux/shm.h> diff --git a/fs/ncpfs/sock.c b/fs/ncpfs/sock.c index 095498a2b..a9c4a4c3b 100644 --- a/fs/ncpfs/sock.c +++ b/fs/ncpfs/sock.c @@ -10,7 +10,7 @@ #include <linux/config.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/errno.h> #include <linux/socket.h> #include <linux/fcntl.h> diff --git a/fs/ncpfs/symlink.c b/fs/ncpfs/symlink.c index 843aed064..c1eb6d3a4 100644 --- a/fs/ncpfs/symlink.c +++ b/fs/ncpfs/symlink.c @@ -25,7 +25,7 @@ #include <linux/errno.h> #include <linux/fs.h> #include <linux/ncp_fs.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/mm.h> #include <linux/stat.h> #include "ncplib_kernel.h" diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c index bc193639e..72b052b12 100644 --- a/fs/nfs/dir.c +++ b/fs/nfs/dir.c @@ -17,7 +17,7 @@ * 6 Jun 1999 Cache readdir lookups in the page cache. -DaveM */ -#include <linux/sched.h> +#include <linux/time.h> #include <linux/errno.h> #include <linux/stat.h> #include <linux/fcntl.h> diff --git a/fs/nfs/file.c b/fs/nfs/file.c index d25cb4968..f7fa8ac19 100644 --- a/fs/nfs/file.c +++ b/fs/nfs/file.c @@ -16,7 +16,7 @@ * nfs regular file handling functions */ -#include <linux/sched.h> +#include <linux/time.h> #include <linux/kernel.h> #include <linux/errno.h> #include <linux/fcntl.h> diff --git a/fs/nfs/flushd.c b/fs/nfs/flushd.c index 8dca7b945..c1e64de64 100644 --- a/fs/nfs/flushd.c +++ b/fs/nfs/flushd.c @@ -28,7 +28,7 @@ #include <linux/pagemap.h> #include <linux/file.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/sunrpc/auth.h> #include <linux/sunrpc/clnt.h> diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c index 28d57bf19..e2821e8a9 100644 --- a/fs/nfs/inode.c +++ b/fs/nfs/inode.c @@ -17,7 +17,7 @@ #include <linux/module.h> #include <linux/init.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/kernel.h> #include <linux/mm.h> #include <linux/string.h> diff --git a/fs/nfs/nfs2xdr.c b/fs/nfs/nfs2xdr.c index 30ab0b8c4..9f9b72bf5 100644 --- a/fs/nfs/nfs2xdr.c +++ b/fs/nfs/nfs2xdr.c @@ -10,7 +10,7 @@ */ #include <linux/param.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/mm.h> #include <linux/slab.h> #include <linux/utsname.h> diff --git a/fs/nfs/nfs3xdr.c b/fs/nfs/nfs3xdr.c index 1936438a2..a89441ec7 100644 --- a/fs/nfs/nfs3xdr.c +++ b/fs/nfs/nfs3xdr.c @@ -7,7 +7,7 @@ */ #include <linux/param.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/mm.h> #include <linux/slab.h> #include <linux/utsname.h> diff --git a/fs/nfs/nfsroot.c b/fs/nfs/nfsroot.c index 51fbb9be0..5541efe6e 100644 --- a/fs/nfs/nfsroot.c +++ b/fs/nfs/nfsroot.c @@ -70,7 +70,7 @@ #include <linux/types.h> #include <linux/string.h> #include <linux/kernel.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/fs.h> #include <linux/init.h> #include <linux/sunrpc/clnt.h> diff --git a/fs/nfs/proc.c b/fs/nfs/proc.c index e19009ea7..5cd3459fb 100644 --- a/fs/nfs/proc.c +++ b/fs/nfs/proc.c @@ -30,7 +30,7 @@ #include <linux/types.h> #include <linux/param.h> #include <linux/slab.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/mm.h> #include <linux/utsname.h> #include <linux/errno.h> diff --git a/fs/nfs/read.c b/fs/nfs/read.c index 909f44712..87fe7389f 100644 --- a/fs/nfs/read.c +++ b/fs/nfs/read.c @@ -16,7 +16,7 @@ */ #include <linux/config.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/kernel.h> #include <linux/errno.h> #include <linux/fcntl.h> diff --git a/fs/nfs/symlink.c b/fs/nfs/symlink.c index 4350cf8e7..82203f1b2 100644 --- a/fs/nfs/symlink.c +++ b/fs/nfs/symlink.c @@ -11,7 +11,7 @@ */ #define NFS_NEED_XDR_TYPES -#include <linux/sched.h> +#include <linux/time.h> #include <linux/errno.h> #include <linux/sunrpc/clnt.h> #include <linux/nfs.h> diff --git a/fs/nfsd/export.c b/fs/nfsd/export.c index 03c7735c7..6f725d356 100644 --- a/fs/nfsd/export.c +++ b/fs/nfsd/export.c @@ -375,7 +375,6 @@ exp_rootfh(struct svc_client *clp, char *path, struct knfsd_fh *f, int maxsize) struct nameidata nd; struct inode *inode; struct svc_fh fh; - kdev_t dev; int err; err = -EPERM; @@ -386,11 +385,10 @@ exp_rootfh(struct svc_client *clp, char *path, struct knfsd_fh *f, int maxsize) return err; } inode = nd.dentry->d_inode; - dev = inode->i_dev; - dprintk("nfsd: exp_rootfh(%s [%p] %s:%02x:%02x/%ld)\n", + dprintk("nfsd: exp_rootfh(%s [%p] %s:%s/%ld)\n", path, nd.dentry, clp->cl_ident, - major(dev), minor(dev), (long) inode->i_ino); + inode->i_sb->s_id, inode->i_ino); exp = exp_parent(clp, inode->i_sb, nd.dentry); if (!exp) { dprintk("nfsd: exp_rootfh export not found.\n"); diff --git a/fs/nfsd/nfs3proc.c b/fs/nfsd/nfs3proc.c index c5253b5cf..d117b4fbb 100644 --- a/fs/nfsd/nfs3proc.c +++ b/fs/nfsd/nfs3proc.c @@ -7,7 +7,7 @@ */ #include <linux/linkage.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/errno.h> #include <linux/locks.h> #include <linux/fs.h> diff --git a/fs/nfsd/nfs3xdr.c b/fs/nfsd/nfs3xdr.c index 834974627..710132891 100644 --- a/fs/nfsd/nfs3xdr.c +++ b/fs/nfsd/nfs3xdr.c @@ -7,7 +7,7 @@ */ #include <linux/types.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/nfs3.h> #include <linux/sunrpc/xdr.h> diff --git a/fs/nfsd/nfscache.c b/fs/nfsd/nfscache.c index 2157f622a..1329160c9 100644 --- a/fs/nfsd/nfscache.c +++ b/fs/nfsd/nfscache.c @@ -11,7 +11,7 @@ */ #include <linux/kernel.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/slab.h> #include <linux/string.h> diff --git a/fs/nfsd/nfsctl.c b/fs/nfsd/nfsctl.c index aad14fba7..d19e5cea3 100644 --- a/fs/nfsd/nfsctl.c +++ b/fs/nfsd/nfsctl.c @@ -11,7 +11,7 @@ #include <linux/version.h> #include <linux/linkage.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/errno.h> #include <linux/fs.h> #include <linux/fcntl.h> diff --git a/fs/nfsd/nfsfh.c b/fs/nfsd/nfsfh.c index 952e01259..82152dc03 100644 --- a/fs/nfsd/nfsfh.c +++ b/fs/nfsd/nfsfh.c @@ -424,8 +424,7 @@ find_fh_dentry(struct super_block *sb, __u32 *datap, int len, int fhtype, int ne /* It's a directory, or we are required to confirm the file's * location in the tree. */ - dprintk("nfs_fh: need to look harder for %02x:%02x/%d\n", - major(sb->s_dev), minor(sb->s_dev), datap[0]); + dprintk("nfs_fh: need to look harder for %s/%d\n", sb->s_id, datap[0]); if (!S_ISDIR(result->d_inode->i_mode)) { nfsdstats.fh_nocache_nondir++; diff --git a/fs/nfsd/nfsproc.c b/fs/nfsd/nfsproc.c index 8c4599d20..3e481a051 100644 --- a/fs/nfsd/nfsproc.c +++ b/fs/nfsd/nfsproc.c @@ -8,7 +8,7 @@ */ #include <linux/linkage.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/errno.h> #include <linux/locks.h> #include <linux/fs.h> diff --git a/fs/nfsd/nfssvc.c b/fs/nfsd/nfssvc.c index a4d9a9818..cade5f6e1 100644 --- a/fs/nfsd/nfssvc.c +++ b/fs/nfsd/nfssvc.c @@ -12,7 +12,7 @@ #include <linux/config.h> #include <linux/module.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/errno.h> #include <linux/nfs.h> #include <linux/in.h> diff --git a/fs/nfsd/nfsxdr.c b/fs/nfsd/nfsxdr.c index d557f956f..4611beb2f 100644 --- a/fs/nfsd/nfsxdr.c +++ b/fs/nfsd/nfsxdr.c @@ -7,7 +7,7 @@ */ #include <linux/types.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/nfs.h> #include <linux/sunrpc/xdr.h> diff --git a/fs/nfsd/stats.c b/fs/nfsd/stats.c index 2bcffc4ee..166c3e836 100644 --- a/fs/nfsd/stats.c +++ b/fs/nfsd/stats.c @@ -24,7 +24,7 @@ */ #include <linux/kernel.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/proc_fs.h> #include <linux/stat.h> #define __NO_VERSION__ diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c index 245560649..55a29adf3 100644 --- a/fs/nfsd/vfs.c +++ b/fs/nfsd/vfs.c @@ -18,7 +18,7 @@ #include <linux/config.h> #include <linux/version.h> #include <linux/string.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/errno.h> #include <linux/locks.h> #include <linux/fs.h> @@ -1410,8 +1410,8 @@ nfsd_readdir(struct svc_rqst *rqstp, struct svc_fh *fhp, loff_t offset, oldlen = cd.buflen; /* - dprintk("nfsd: f_op->readdir(%x/%ld @ %d) buflen = %d (%d)\n", - file.f_inode->i_dev, file.f_inode->i_ino, + dprintk("nfsd: f_op->readdir(%s/%ld @ %d) buflen = %d (%d)\n", + file.f_inode->i_sb->s_id, file.f_inode->i_ino, (int) file.f_pos, (int) oldlen, (int) cd.buflen); */ err = file.f_op->readdir(&file, &cd, (filldir_t) func); @@ -10,6 +10,7 @@ #include <linux/slab.h> #include <linux/module.h> #include <linux/init.h> +#include <linux/fs.h> #include <asm/uaccess.h> #include <asm/ioctls.h> diff --git a/fs/proc/array.c b/fs/proc/array.c index 08993e30d..d1e5d9eed 100644 --- a/fs/proc/array.c +++ b/fs/proc/array.c @@ -55,7 +55,7 @@ #include <linux/config.h> #include <linux/types.h> #include <linux/errno.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/kernel.h> #include <linux/kernel_stat.h> #include <linux/tty.h> diff --git a/fs/proc/base.c b/fs/proc/base.c index 47c5cfdc6..8358560d9 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c @@ -17,7 +17,7 @@ #include <linux/config.h> #include <linux/errno.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/proc_fs.h> #include <linux/stat.h> #include <linux/init.h> diff --git a/fs/proc/generic.c b/fs/proc/generic.c index f50b13026..cf45ec098 100644 --- a/fs/proc/generic.c +++ b/fs/proc/generic.c @@ -11,7 +11,7 @@ #include <asm/uaccess.h> #include <linux/errno.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/proc_fs.h> #include <linux/stat.h> #define __NO_VERSION__ diff --git a/fs/proc/inode.c b/fs/proc/inode.c index 5e6b47602..c18499050 100644 --- a/fs/proc/inode.c +++ b/fs/proc/inode.c @@ -4,7 +4,7 @@ * Copyright (C) 1991, 1992 Linus Torvalds */ -#include <linux/sched.h> +#include <linux/time.h> #include <linux/proc_fs.h> #include <linux/kernel.h> #include <linux/mm.h> diff --git a/fs/proc/kmsg.c b/fs/proc/kmsg.c index 69aeddd3f..a2d8499ca 100644 --- a/fs/proc/kmsg.c +++ b/fs/proc/kmsg.c @@ -7,9 +7,10 @@ #include <linux/types.h> #include <linux/errno.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/kernel.h> #include <linux/poll.h> +#include <linux/fs.h> #include <asm/uaccess.h> #include <asm/io.h> diff --git a/fs/proc/proc_devtree.c b/fs/proc/proc_devtree.c index c64166f78..18917b659 100644 --- a/fs/proc/proc_devtree.c +++ b/fs/proc/proc_devtree.c @@ -4,7 +4,7 @@ * Copyright 1997 Paul Mackerras */ #include <linux/errno.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/proc_fs.h> #include <linux/stat.h> #include <linux/string.h> diff --git a/fs/proc/proc_misc.c b/fs/proc/proc_misc.c index 5dc1a8f7b..b176467ff 100644 --- a/fs/proc/proc_misc.c +++ b/fs/proc/proc_misc.c @@ -17,7 +17,7 @@ #include <linux/types.h> #include <linux/errno.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/kernel.h> #include <linux/kernel_stat.h> #include <linux/tty.h> @@ -50,9 +50,6 @@ * have a way to deal with that gracefully. Right now I used straightforward * wrappers, but this needs further analysis wrt potential overflows. */ -#ifdef CONFIG_MODULES -extern int get_module_list(char *); -#endif extern int get_device_list(char *); extern int get_partition_list(char *, char **, off_t, int); extern int get_filesystem_list(char *); @@ -203,13 +200,17 @@ static struct file_operations proc_cpuinfo_operations = { }; #ifdef CONFIG_MODULES -static int modules_read_proc(char *page, char **start, off_t off, - int count, int *eof, void *data) +extern struct seq_operations modules_op; +static int modules_open(struct inode *inode, struct file *file) { - int len = get_module_list(page); - return proc_calc_metrics(page, start, off, count, eof, len); + return seq_open(file, &modules_op); } - +static struct file_operations proc_modules_operations = { + open: modules_open, + read: seq_read, + llseek: seq_lseek, + release: seq_release, +}; extern struct seq_operations ksyms_op; static int ksyms_open(struct inode *inode, struct file *file) { @@ -223,6 +224,20 @@ static struct file_operations proc_ksyms_operations = { }; #endif +extern struct seq_operations slabinfo_op; +extern ssize_t slabinfo_write(struct file *, const char *, size_t, loff_t *); +static int slabinfo_open(struct inode *inode, struct file *file) +{ + return seq_open(file, &slabinfo_op); +} +static struct file_operations proc_slabinfo_operations = { + open: slabinfo_open, + read: seq_read, + write: slabinfo_write, + llseek: seq_lseek, + release: seq_release, +}; + static int kstat_read_proc(char *page, char **start, off_t off, int count, int *eof, void *data) { @@ -521,9 +536,6 @@ void __init proc_misc_init(void) {"uptime", uptime_read_proc}, {"meminfo", meminfo_read_proc}, {"version", version_read_proc}, -#ifdef CONFIG_MODULES - {"modules", modules_read_proc}, -#endif {"stat", kstat_read_proc}, {"devices", devices_read_proc}, {"partitions", partitions_read_proc}, @@ -551,7 +563,9 @@ void __init proc_misc_init(void) entry->proc_fops = &proc_kmsg_operations; create_seq_entry("cpuinfo", 0, &proc_cpuinfo_operations); create_seq_entry("interrupts", 0, &proc_interrupts_operations); + create_seq_entry("slabinfo",S_IWUSR|S_IRUGO,&proc_slabinfo_operations); #ifdef CONFIG_MODULES + create_seq_entry("modules", 0, &proc_modules_operations); create_seq_entry("ksyms", 0, &proc_ksyms_operations); #endif proc_root_kcore = create_proc_entry("kcore", S_IRUSR, NULL); @@ -575,8 +589,4 @@ void __init proc_misc_init(void) entry->proc_fops = &ppc_htab_operations; } #endif - entry = create_proc_read_entry("slabinfo", S_IWUSR | S_IRUGO, NULL, - slabinfo_read_proc, NULL); - if (entry) - entry->write_proc = slabinfo_write_proc; } diff --git a/fs/proc/proc_tty.c b/fs/proc/proc_tty.c index 1d55d4989..9de90ed4b 100644 --- a/fs/proc/proc_tty.c +++ b/fs/proc/proc_tty.c @@ -8,7 +8,7 @@ #include <linux/init.h> #include <linux/errno.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/proc_fs.h> #include <linux/stat.h> #include <linux/tty.h> diff --git a/fs/proc/root.c b/fs/proc/root.c index 666166bfc..98e089b34 100644 --- a/fs/proc/root.c +++ b/fs/proc/root.c @@ -9,7 +9,7 @@ #include <asm/uaccess.h> #include <linux/errno.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/proc_fs.h> #include <linux/stat.h> #include <linux/config.h> diff --git a/fs/qnx4/bitmap.c b/fs/qnx4/bitmap.c index b06d5c1d9..f45c43ddb 100644 --- a/fs/qnx4/bitmap.c +++ b/fs/qnx4/bitmap.c @@ -14,7 +14,8 @@ */ #include <linux/config.h> -#include <linux/sched.h> +#include <linux/time.h> +#include <linux/fs.h> #include <linux/qnx4_fs.h> #include <linux/stat.h> #include <linux/kernel.h> diff --git a/fs/qnx4/file.c b/fs/qnx4/file.c index ab5856ace..ecf6d0506 100644 --- a/fs/qnx4/file.c +++ b/fs/qnx4/file.c @@ -15,7 +15,7 @@ #include <linux/config.h> #include <linux/types.h> #include <linux/fs.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/qnx4_fs.h> /* diff --git a/fs/qnx4/fsync.c b/fs/qnx4/fsync.c index f3d2301f1..56136f136 100644 --- a/fs/qnx4/fsync.c +++ b/fs/qnx4/fsync.c @@ -12,7 +12,7 @@ #include <linux/config.h> #include <linux/errno.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/stat.h> #include <linux/fcntl.h> #include <linux/locks.h> diff --git a/fs/qnx4/namei.c b/fs/qnx4/namei.c index f282935b7..6af2f7714 100644 --- a/fs/qnx4/namei.c +++ b/fs/qnx4/namei.c @@ -13,7 +13,8 @@ */ #include <linux/config.h> -#include <linux/sched.h> +#include <linux/time.h> +#include <linux/fs.h> #include <linux/qnx4_fs.h> #include <linux/kernel.h> #include <linux/string.h> diff --git a/fs/readdir.c b/fs/readdir.c index 7ec20be60..083165f37 100644 --- a/fs/readdir.c +++ b/fs/readdir.c @@ -4,12 +4,13 @@ * Copyright (C) 1995 Linus Torvalds */ -#include <linux/sched.h> +#include <linux/time.h> #include <linux/mm.h> #include <linux/errno.h> #include <linux/stat.h> #include <linux/file.h> #include <linux/smp_lock.h> +#include <linux/fs.h> #include <asm/uaccess.h> diff --git a/fs/reiserfs/bitmap.c b/fs/reiserfs/bitmap.c index 427a00387..1130f91cb 100644 --- a/fs/reiserfs/bitmap.c +++ b/fs/reiserfs/bitmap.c @@ -3,7 +3,7 @@ */ #include <linux/config.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/reiserfs_fs.h> #include <linux/locks.h> #include <asm/bitops.h> diff --git a/fs/reiserfs/buffer2.c b/fs/reiserfs/buffer2.c index 2d0b29a21..b7025254a 100644 --- a/fs/reiserfs/buffer2.c +++ b/fs/reiserfs/buffer2.c @@ -3,7 +3,7 @@ */ #include <linux/config.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/locks.h> #include <linux/reiserfs_fs.h> #include <linux/smp_lock.h> diff --git a/fs/reiserfs/do_balan.c b/fs/reiserfs/do_balan.c index 1c9e1bca9..0ae4d3482 100644 --- a/fs/reiserfs/do_balan.c +++ b/fs/reiserfs/do_balan.c @@ -18,7 +18,7 @@ #include <linux/config.h> #include <asm/uaccess.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/reiserfs_fs.h> #ifdef CONFIG_REISERFS_CHECK diff --git a/fs/reiserfs/file.c b/fs/reiserfs/file.c index f967d463b..91e51da6b 100644 --- a/fs/reiserfs/file.c +++ b/fs/reiserfs/file.c @@ -3,7 +3,7 @@ */ -#include <linux/sched.h> +#include <linux/time.h> #include <linux/reiserfs_fs.h> #include <linux/smp_lock.h> diff --git a/fs/reiserfs/fix_node.c b/fs/reiserfs/fix_node.c index 5444f25fe..5a8f9f6f6 100644 --- a/fs/reiserfs/fix_node.c +++ b/fs/reiserfs/fix_node.c @@ -36,7 +36,7 @@ #include <linux/config.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/string.h> #include <linux/locks.h> #include <linux/reiserfs_fs.h> diff --git a/fs/reiserfs/ibalance.c b/fs/reiserfs/ibalance.c index c77948ecf..b4a4b2d3e 100644 --- a/fs/reiserfs/ibalance.c +++ b/fs/reiserfs/ibalance.c @@ -5,7 +5,7 @@ #include <linux/config.h> #include <asm/uaccess.h> #include <linux/string.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/reiserfs_fs.h> /* this is one and only function that is used outside (do_balance.c) */ diff --git a/fs/reiserfs/inode.c b/fs/reiserfs/inode.c index c35cb51a9..34462717d 100644 --- a/fs/reiserfs/inode.c +++ b/fs/reiserfs/inode.c @@ -3,7 +3,7 @@ */ #include <linux/config.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/reiserfs_fs.h> #include <linux/locks.h> #include <linux/smp_lock.h> diff --git a/fs/reiserfs/ioctl.c b/fs/reiserfs/ioctl.c index dccd1c3a0..a3c2d858d 100644 --- a/fs/reiserfs/ioctl.c +++ b/fs/reiserfs/ioctl.c @@ -4,7 +4,7 @@ #include <linux/fs.h> #include <linux/reiserfs_fs.h> -#include <linux/sched.h> +#include <linux/time.h> #include <asm/uaccess.h> #include <linux/smp_lock.h> #include <linux/locks.h> diff --git a/fs/reiserfs/item_ops.c b/fs/reiserfs/item_ops.c index 74305fa68..9881a2662 100644 --- a/fs/reiserfs/item_ops.c +++ b/fs/reiserfs/item_ops.c @@ -2,7 +2,7 @@ * Copyright 2000 by Hans Reiser, licensing governed by reiserfs/README */ -#include <linux/sched.h> +#include <linux/time.h> #include <linux/reiserfs_fs.h> // this contains item handlers for old item types: sd, direct, diff --git a/fs/reiserfs/journal.c b/fs/reiserfs/journal.c index 199678292..3bb94741c 100644 --- a/fs/reiserfs/journal.c +++ b/fs/reiserfs/journal.c @@ -45,7 +45,7 @@ #include <asm/uaccess.h> #include <asm/system.h> -#include <linux/sched.h> +#include <linux/time.h> #include <asm/semaphore.h> #include <linux/vmalloc.h> diff --git a/fs/reiserfs/lbalance.c b/fs/reiserfs/lbalance.c index 64f2dba60..f39feaf13 100644 --- a/fs/reiserfs/lbalance.c +++ b/fs/reiserfs/lbalance.c @@ -5,7 +5,7 @@ #include <linux/config.h> #include <asm/uaccess.h> #include <linux/string.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/reiserfs_fs.h> /* these are used in do_balance.c */ diff --git a/fs/reiserfs/namei.c b/fs/reiserfs/namei.c index 9d2d24bd1..ed3c0aaa9 100644 --- a/fs/reiserfs/namei.c +++ b/fs/reiserfs/namei.c @@ -12,7 +12,7 @@ */ #include <linux/config.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/bitops.h> #include <linux/reiserfs_fs.h> #include <linux/smp_lock.h> diff --git a/fs/reiserfs/objectid.c b/fs/reiserfs/objectid.c index 45c2537ff..503ef628a 100644 --- a/fs/reiserfs/objectid.c +++ b/fs/reiserfs/objectid.c @@ -6,7 +6,7 @@ #include <linux/string.h> #include <linux/locks.h> #include <linux/random.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/reiserfs_fs.h> #include <linux/reiserfs_fs_sb.h> diff --git a/fs/reiserfs/prints.c b/fs/reiserfs/prints.c index c7c18e383..16bf7ce51 100644 --- a/fs/reiserfs/prints.c +++ b/fs/reiserfs/prints.c @@ -3,7 +3,7 @@ */ #include <linux/config.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/fs.h> #include <linux/reiserfs_fs.h> #include <linux/string.h> diff --git a/fs/reiserfs/procfs.c b/fs/reiserfs/procfs.c index b6ef3e5a4..2b6a8ada5 100644 --- a/fs/reiserfs/procfs.c +++ b/fs/reiserfs/procfs.c @@ -12,7 +12,7 @@ #include <linux/config.h> #include <linux/module.h> -#include <linux/sched.h> +#include <linux/time.h> #include <asm/uaccess.h> #include <linux/reiserfs_fs.h> #include <linux/reiserfs_fs_sb.h> diff --git a/fs/reiserfs/stree.c b/fs/reiserfs/stree.c index 5d3eee75a..5ab2d7e57 100644 --- a/fs/reiserfs/stree.c +++ b/fs/reiserfs/stree.c @@ -54,7 +54,7 @@ */ #include <linux/config.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/string.h> #include <linux/locks.h> #include <linux/pagemap.h> diff --git a/fs/reiserfs/super.c b/fs/reiserfs/super.c index a9ae97dfc..5051b81c3 100644 --- a/fs/reiserfs/super.c +++ b/fs/reiserfs/super.c @@ -13,7 +13,7 @@ #include <linux/config.h> #include <linux/module.h> -#include <linux/sched.h> +#include <linux/time.h> #include <asm/uaccess.h> #include <linux/reiserfs_fs.h> #include <linux/smp_lock.h> diff --git a/fs/reiserfs/tail_conversion.c b/fs/reiserfs/tail_conversion.c index 18f1bda12..98106becb 100644 --- a/fs/reiserfs/tail_conversion.c +++ b/fs/reiserfs/tail_conversion.c @@ -3,7 +3,7 @@ */ #include <linux/config.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/pagemap.h> #include <linux/reiserfs_fs.h> #include <linux/locks.h> diff --git a/fs/select.c b/fs/select.c index b059b905f..30c29f1e4 100644 --- a/fs/select.c +++ b/fs/select.c @@ -19,6 +19,7 @@ #include <linux/poll.h> #include <linux/personality.h> /* for STICKY_TIMEOUTS */ #include <linux/file.h> +#include <linux/fs.h> #include <asm/uaccess.h> diff --git a/fs/smbfs/cache.c b/fs/smbfs/cache.c index 3e98f83ab..369c13927 100644 --- a/fs/smbfs/cache.c +++ b/fs/smbfs/cache.c @@ -9,7 +9,7 @@ * Please add a note about your changes to smbfs in the ChangeLog file. */ -#include <linux/sched.h> +#include <linux/time.h> #include <linux/errno.h> #include <linux/kernel.h> #include <linux/mm.h> diff --git a/fs/smbfs/dir.c b/fs/smbfs/dir.c index 53bedfd86..4ef7212a0 100644 --- a/fs/smbfs/dir.c +++ b/fs/smbfs/dir.c @@ -7,7 +7,7 @@ * Please add a note about your changes to smbfs in the ChangeLog file. */ -#include <linux/sched.h> +#include <linux/time.h> #include <linux/errno.h> #include <linux/kernel.h> #include <linux/smp_lock.h> diff --git a/fs/smbfs/file.c b/fs/smbfs/file.c index 39badd716..63f6aaac3 100644 --- a/fs/smbfs/file.c +++ b/fs/smbfs/file.c @@ -7,7 +7,7 @@ * Please add a note about your changes to smbfs in the ChangeLog file. */ -#include <linux/sched.h> +#include <linux/time.h> #include <linux/kernel.h> #include <linux/errno.h> #include <linux/fcntl.h> diff --git a/fs/smbfs/inode.c b/fs/smbfs/inode.c index 688ba2df2..7c964fe66 100644 --- a/fs/smbfs/inode.c +++ b/fs/smbfs/inode.c @@ -9,7 +9,7 @@ #include <linux/config.h> #include <linux/module.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/kernel.h> #include <linux/mm.h> #include <linux/string.h> diff --git a/fs/smbfs/ioctl.c b/fs/smbfs/ioctl.c index afc45b4f7..e68ebd7df 100644 --- a/fs/smbfs/ioctl.c +++ b/fs/smbfs/ioctl.c @@ -10,7 +10,7 @@ #include <linux/errno.h> #include <linux/fs.h> #include <linux/ioctl.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/mm.h> #include <linux/highuid.h> diff --git a/fs/smbfs/sock.c b/fs/smbfs/sock.c index 8c66f4c5e..78ea22184 100644 --- a/fs/smbfs/sock.c +++ b/fs/smbfs/sock.c @@ -7,7 +7,8 @@ * Please add a note about your changes to smbfs in the ChangeLog file. */ -#include <linux/sched.h> +#include <linux/fs.h> +#include <linux/time.h> #include <linux/errno.h> #include <linux/socket.h> #include <linux/fcntl.h> @@ -10,6 +10,7 @@ #include <linux/file.h> #include <linux/smp_lock.h> #include <linux/highuid.h> +#include <linux/fs.h> #include <asm/uaccess.h> diff --git a/fs/udf/symlink.c b/fs/udf/symlink.c index 3254e530f..7a0eebeda 100644 --- a/fs/udf/symlink.c +++ b/fs/udf/symlink.c @@ -29,7 +29,7 @@ #include <linux/errno.h> #include <linux/fs.h> #include <linux/udf_fs.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/mm.h> #include <linux/stat.h> #include <linux/slab.h> diff --git a/fs/ufs/balloc.c b/fs/ufs/balloc.c index 8f82baf1f..861593acd 100644 --- a/fs/ufs/balloc.c +++ b/fs/ufs/balloc.c @@ -9,7 +9,7 @@ #include <linux/fs.h> #include <linux/ufs_fs.h> #include <linux/stat.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/string.h> #include <linux/locks.h> #include <linux/quotaops.h> diff --git a/fs/ufs/cylinder.c b/fs/ufs/cylinder.c index 97391b4d6..a0729feed 100644 --- a/fs/ufs/cylinder.c +++ b/fs/ufs/cylinder.c @@ -10,7 +10,7 @@ #include <linux/fs.h> #include <linux/ufs_fs.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/stat.h> #include <linux/string.h> #include <linux/locks.h> diff --git a/fs/ufs/dir.c b/fs/ufs/dir.c index 3dca14b36..117126107 100644 --- a/fs/ufs/dir.c +++ b/fs/ufs/dir.c @@ -13,7 +13,7 @@ * on code by Martin von Loewis <martin@mira.isdn.cs.tu-berlin.de>. */ -#include <linux/sched.h> +#include <linux/time.h> #include <linux/locks.h> #include <linux/fs.h> #include <linux/ufs_fs.h> diff --git a/fs/ufs/file.c b/fs/ufs/file.c index 819e6945b..fd6332175 100644 --- a/fs/ufs/file.c +++ b/fs/ufs/file.c @@ -30,7 +30,7 @@ #include <linux/fs.h> #include <linux/ufs_fs.h> #include <linux/fcntl.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/stat.h> #include <linux/locks.h> #include <linux/mm.h> diff --git a/fs/ufs/ialloc.c b/fs/ufs/ialloc.c index d1eea1f58..c0a435a09 100644 --- a/fs/ufs/ialloc.c +++ b/fs/ufs/ialloc.c @@ -22,7 +22,7 @@ #include <linux/fs.h> #include <linux/ufs_fs.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/stat.h> #include <linux/string.h> #include <linux/locks.h> diff --git a/fs/ufs/inode.c b/fs/ufs/inode.c index cc08c9feb..e11438305 100644 --- a/fs/ufs/inode.c +++ b/fs/ufs/inode.c @@ -31,7 +31,7 @@ #include <linux/errno.h> #include <linux/fs.h> #include <linux/ufs_fs.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/stat.h> #include <linux/string.h> #include <linux/locks.h> diff --git a/fs/ufs/namei.c b/fs/ufs/namei.c index 0a95f62f7..3742b3ebe 100644 --- a/fs/ufs/namei.c +++ b/fs/ufs/namei.c @@ -24,7 +24,7 @@ * David S. Miller (davem@caip.rutgers.edu), 1995 */ -#include <linux/sched.h> +#include <linux/time.h> #include <linux/fs.h> #include <linux/ufs_fs.h> diff --git a/fs/ufs/super.c b/fs/ufs/super.c index ef84557f1..d07905696 100644 --- a/fs/ufs/super.c +++ b/fs/ufs/super.c @@ -74,7 +74,7 @@ #include <linux/fs.h> #include <linux/ufs_fs.h> #include <linux/slab.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/stat.h> #include <linux/string.h> #include <linux/locks.h> diff --git a/fs/ufs/truncate.c b/fs/ufs/truncate.c index 448466b31..2cec5fedf 100644 --- a/fs/ufs/truncate.c +++ b/fs/ufs/truncate.c @@ -33,7 +33,7 @@ #include <linux/fs.h> #include <linux/ufs_fs.h> #include <linux/fcntl.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/stat.h> #include <linux/locks.h> #include <linux/string.h> diff --git a/fs/umsdos/dir.c b/fs/umsdos/dir.c index 8d797bb6d..4586fc684 100644 --- a/fs/umsdos/dir.c +++ b/fs/umsdos/dir.c @@ -7,7 +7,7 @@ * Extended MS-DOS directory handling functions */ -#include <linux/sched.h> +#include <linux/time.h> #include <linux/string.h> #include <linux/fs.h> #include <linux/msdos_fs.h> diff --git a/fs/umsdos/emd.c b/fs/umsdos/emd.c index 51d76ca24..2b64394eb 100644 --- a/fs/umsdos/emd.c +++ b/fs/umsdos/emd.c @@ -9,7 +9,7 @@ #include <linux/types.h> #include <linux/fcntl.h> #include <linux/kernel.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/errno.h> #include <linux/string.h> #include <linux/msdos_fs.h> diff --git a/fs/umsdos/inode.c b/fs/umsdos/inode.c index befdd474f..ad0104d26 100644 --- a/fs/umsdos/inode.c +++ b/fs/umsdos/inode.c @@ -11,7 +11,7 @@ #include <linux/fs.h> #include <linux/msdos_fs.h> #include <linux/kernel.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/errno.h> #include <asm/uaccess.h> #include <linux/string.h> diff --git a/fs/umsdos/ioctl.c b/fs/umsdos/ioctl.c index 13cd83d75..722581c1a 100644 --- a/fs/umsdos/ioctl.c +++ b/fs/umsdos/ioctl.c @@ -10,7 +10,7 @@ #include <linux/errno.h> #include <linux/mm.h> #include <linux/kernel.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/fs.h> #include <linux/msdos_fs.h> #include <linux/umsdos_fs.h> diff --git a/fs/umsdos/namei.c b/fs/umsdos/namei.c index 1e40fd8e9..f7640dbda 100644 --- a/fs/umsdos/namei.c +++ b/fs/umsdos/namei.c @@ -13,7 +13,7 @@ #include <linux/errno.h> #include <linux/kernel.h> -#include <linux/sched.h> +#include <linux/time.h> #include <linux/types.h> #include <linux/fcntl.h> #include <linux/stat.h> diff --git a/fs/umsdos/rdir.c b/fs/umsdos/rdir.c index 372454a2e..edd41d95a 100644 --- a/fs/umsdos/rdir.c +++ b/fs/umsdos/rdir.c @@ -7,7 +7,7 @@ * (For directory without EMD file). */ -#include <linux/sched.h> +#include <linux/time.h> #include <linux/fs.h> #include <linux/msdos_fs.h> #include <linux/errno.h> diff --git a/include/asm-i386/hardirq.h b/include/asm-i386/hardirq.h index 4acb4b09d..64ef2bcf2 100644 --- a/include/asm-i386/hardirq.h +++ b/include/asm-i386/hardirq.h @@ -36,6 +36,8 @@ typedef struct { #define synchronize_irq() barrier() +#define release_irqlock(cpu) do { } while (0) + #else #include <asm/atomic.h> diff --git a/include/asm-i386/highmem.h b/include/asm-i386/highmem.h index 42f32426e..e8d4f37ae 100644 --- a/include/asm-i386/highmem.h +++ b/include/asm-i386/highmem.h @@ -88,6 +88,7 @@ static inline void *kmap_atomic(struct page *page, enum km_type type) enum fixed_addresses idx; unsigned long vaddr; + preempt_disable(); if (page < highmem_start_page) return page_address(page); @@ -109,8 +110,10 @@ static inline void kunmap_atomic(void *kvaddr, enum km_type type) unsigned long vaddr = (unsigned long) kvaddr; enum fixed_addresses idx = type + KM_TYPE_NR*smp_processor_id(); - if (vaddr < FIXADDR_START) // FIXME + if (vaddr < FIXADDR_START) { // FIXME + preempt_enable(); return; + } if (vaddr != __fix_to_virt(FIX_KMAP_BEGIN+idx)) BUG(); @@ -122,6 +125,8 @@ static inline void kunmap_atomic(void *kvaddr, enum km_type type) pte_clear(kmap_pte-idx); __flush_tlb_one(vaddr); #endif + + preempt_enable(); } #endif /* __KERNEL__ */ diff --git a/include/asm-i386/hw_irq.h b/include/asm-i386/hw_irq.h index 5b43b7c41..b572c2874 100644 --- a/include/asm-i386/hw_irq.h +++ b/include/asm-i386/hw_irq.h @@ -96,6 +96,18 @@ extern char _stext, _etext; #define __STR(x) #x #define STR(x) __STR(x) +#define GET_THREAD_INFO \ + "movl $-8192, %ebx\n\t" \ + "andl %esp, %ebx\n\t" + +#ifdef CONFIG_PREEMPT +#define BUMP_LOCK_COUNT \ + GET_THREAD_INFO \ + "incl 16(%ebx)\n\t" +#else +#define BUMP_LOCK_COUNT +#endif + #define SAVE_ALL \ "cld\n\t" \ "pushl %es\n\t" \ @@ -109,7 +121,8 @@ extern char _stext, _etext; "pushl %ebx\n\t" \ "movl $" STR(__KERNEL_DS) ",%edx\n\t" \ "movl %edx,%ds\n\t" \ - "movl %edx,%es\n\t" + "movl %edx,%es\n\t" \ + BUMP_LOCK_COUNT #define IRQ_NAME2(nr) nr##_interrupt(void) #define IRQ_NAME(nr) IRQ_NAME2(IRQ##nr) diff --git a/include/asm-i386/i387.h b/include/asm-i386/i387.h index 462ec5a23..b8b60c274 100644 --- a/include/asm-i386/i387.h +++ b/include/asm-i386/i387.h @@ -12,6 +12,7 @@ #define __ASM_I386_I387_H #include <linux/sched.h> +#include <linux/spinlock.h> #include <asm/processor.h> #include <asm/sigcontext.h> #include <asm/user.h> @@ -24,7 +25,7 @@ extern void save_init_fpu( struct task_struct *tsk ); extern void restore_fpu( struct task_struct *tsk ); extern void kernel_fpu_begin(void); -#define kernel_fpu_end() stts() +#define kernel_fpu_end() do { stts(); preempt_enable(); } while(0) #define unlazy_fpu( tsk ) do { \ diff --git a/include/asm-i386/io_apic.h b/include/asm-i386/io_apic.h index b132819e0..3e90f195d 100644 --- a/include/asm-i386/io_apic.h +++ b/include/asm-i386/io_apic.h @@ -3,6 +3,7 @@ #include <linux/config.h> #include <asm/types.h> +#include <asm/mpspec.h> /* * Intel IO-APIC support for SMP and UP systems. diff --git a/include/asm-i386/pgalloc.h b/include/asm-i386/pgalloc.h index 090573f59..67773c047 100644 --- a/include/asm-i386/pgalloc.h +++ b/include/asm-i386/pgalloc.h @@ -75,20 +75,26 @@ static inline pgd_t *get_pgd_fast(void) { unsigned long *ret; + preempt_disable(); if ((ret = pgd_quicklist) != NULL) { pgd_quicklist = (unsigned long *)(*ret); ret[0] = 0; pgtable_cache_size--; - } else + preempt_enable(); + } else { + preempt_enable(); ret = (unsigned long *)get_pgd_slow(); + } return (pgd_t *)ret; } static inline void free_pgd_fast(pgd_t *pgd) { + preempt_disable(); *(unsigned long *)pgd = (unsigned long) pgd_quicklist; pgd_quicklist = (unsigned long *) pgd; pgtable_cache_size++; + preempt_enable(); } static inline void free_pgd_slow(pgd_t *pgd) @@ -119,19 +125,23 @@ static inline pte_t *pte_alloc_one_fast(struct mm_struct *mm, { unsigned long *ret; + preempt_disable(); if ((ret = (unsigned long *)pte_quicklist) != NULL) { pte_quicklist = (unsigned long *)(*ret); ret[0] = ret[1]; pgtable_cache_size--; } + preempt_enable(); return (pte_t *)ret; } static inline void pte_free_fast(pte_t *pte) { + preempt_disable(); *(unsigned long *)pte = (unsigned long) pte_quicklist; pte_quicklist = (unsigned long *) pte; pgtable_cache_size++; + preempt_enable(); } static __inline__ void pte_free_slow(pte_t *pte) diff --git a/include/asm-i386/smplock.h b/include/asm-i386/smplock.h index c270defe9..e1d592575 100644 --- a/include/asm-i386/smplock.h +++ b/include/asm-i386/smplock.h @@ -10,7 +10,16 @@ extern spinlock_t kernel_flag; +#ifdef CONFIG_SMP #define kernel_locked() spin_is_locked(&kernel_flag) +#else +#ifdef CONFIG_PREEMPT +#define kernel_locked() preempt_get_count() +#define global_irq_holder 0 +#else +#define kernel_locked() 1 +#endif +#endif /* * Release global kernel lock and global interrupt lock @@ -43,6 +52,11 @@ do { \ */ static __inline__ void lock_kernel(void) { +#ifdef CONFIG_PREEMPT + if (current->lock_depth == -1) + spin_lock(&kernel_flag); + ++current->lock_depth; +#else #if 1 if (!++current->lock_depth) spin_lock(&kernel_flag); @@ -55,6 +69,7 @@ static __inline__ void lock_kernel(void) :"=m" (__dummy_lock(&kernel_flag)), "=m" (current->lock_depth)); #endif +#endif } static __inline__ void unlock_kernel(void) diff --git a/include/asm-i386/softirq.h b/include/asm-i386/softirq.h index b9f7796b2..c62cbece6 100644 --- a/include/asm-i386/softirq.h +++ b/include/asm-i386/softirq.h @@ -5,9 +5,9 @@ #include <asm/hardirq.h> #define __cpu_bh_enable(cpu) \ - do { barrier(); local_bh_count(cpu)--; } while (0) + do { barrier(); local_bh_count(cpu)--; preempt_enable(); } while (0) #define cpu_bh_disable(cpu) \ - do { local_bh_count(cpu)++; barrier(); } while (0) + do { preempt_disable(); local_bh_count(cpu)++; barrier(); } while (0) #define local_bh_disable() cpu_bh_disable(smp_processor_id()) #define __local_bh_enable() __cpu_bh_enable(smp_processor_id()) @@ -22,7 +22,7 @@ * If you change the offsets in irq_stat then you have to * update this code as well. */ -#define local_bh_enable() \ +#define _local_bh_enable() \ do { \ unsigned int *ptr = &local_bh_count(smp_processor_id()); \ \ @@ -45,4 +45,6 @@ do { \ /* no registers clobbered */ ); \ } while (0) +#define local_bh_enable() do { _local_bh_enable(); preempt_enable(); } while (0) + #endif /* __ASM_SOFTIRQ_H */ diff --git a/include/asm-i386/spinlock.h b/include/asm-i386/spinlock.h index 89118fced..1a4b4879c 100644 --- a/include/asm-i386/spinlock.h +++ b/include/asm-i386/spinlock.h @@ -77,7 +77,7 @@ typedef struct { :"=m" (lock->lock) : : "memory" -static inline void spin_unlock(spinlock_t *lock) +static inline void _raw_spin_unlock(spinlock_t *lock) { #if SPINLOCK_DEBUG if (lock->magic != SPINLOCK_MAGIC) @@ -97,7 +97,7 @@ static inline void spin_unlock(spinlock_t *lock) :"=q" (oldval), "=m" (lock->lock) \ :"0" (oldval) : "memory" -static inline void spin_unlock(spinlock_t *lock) +static inline void _raw_spin_unlock(spinlock_t *lock) { char oldval = 1; #if SPINLOCK_DEBUG @@ -113,7 +113,7 @@ static inline void spin_unlock(spinlock_t *lock) #endif -static inline int spin_trylock(spinlock_t *lock) +static inline int _raw_spin_trylock(spinlock_t *lock) { char oldval; __asm__ __volatile__( @@ -123,7 +123,7 @@ static inline int spin_trylock(spinlock_t *lock) return oldval > 0; } -static inline void spin_lock(spinlock_t *lock) +static inline void _raw_spin_lock(spinlock_t *lock) { #if SPINLOCK_DEBUG __label__ here; @@ -179,7 +179,7 @@ typedef struct { */ /* the spinlock helpers are in arch/i386/kernel/semaphore.c */ -static inline void read_lock(rwlock_t *rw) +static inline void _raw_read_lock(rwlock_t *rw) { #if SPINLOCK_DEBUG if (rw->magic != RWLOCK_MAGIC) @@ -188,7 +188,7 @@ static inline void read_lock(rwlock_t *rw) __build_read_lock(rw, "__read_lock_failed"); } -static inline void write_lock(rwlock_t *rw) +static inline void _raw_write_lock(rwlock_t *rw) { #if SPINLOCK_DEBUG if (rw->magic != RWLOCK_MAGIC) @@ -197,10 +197,10 @@ static inline void write_lock(rwlock_t *rw) __build_write_lock(rw, "__write_lock_failed"); } -#define read_unlock(rw) asm volatile("lock ; incl %0" :"=m" ((rw)->lock) : : "memory") -#define write_unlock(rw) asm volatile("lock ; addl $" RW_LOCK_BIAS_STR ",%0":"=m" ((rw)->lock) : : "memory") +#define _raw_read_unlock(rw) asm volatile("lock ; incl %0" :"=m" ((rw)->lock) : : "memory") +#define _raw_write_unlock(rw) asm volatile("lock ; addl $" RW_LOCK_BIAS_STR ",%0":"=m" ((rw)->lock) : : "memory") -static inline int write_trylock(rwlock_t *lock) +static inline int _raw_write_trylock(rwlock_t *lock) { atomic_t *count = (atomic_t *)lock; if (atomic_sub_and_test(RW_LOCK_BIAS, count)) diff --git a/include/asm-i386/thread_info.h b/include/asm-i386/thread_info.h index 61c7b4220..55bca60e2 100644 --- a/include/asm-i386/thread_info.h +++ b/include/asm-i386/thread_info.h @@ -25,6 +25,7 @@ struct thread_info { struct exec_domain *exec_domain; /* execution domain */ unsigned long flags; /* low level flags */ __u32 cpu; /* current CPU */ + __s32 preempt_count; /* 0 => preemptable, <0 => BUG */ mm_segment_t addr_limit; /* thread address space: 0-0xBFFFFFFF for user-thead @@ -41,7 +42,8 @@ struct thread_info { #define TI_EXEC_DOMAIN 0x00000004 #define TI_FLAGS 0x00000008 #define TI_CPU 0x0000000C -#define TI_ADDR_LIMIT 0x00000010 +#define TI_PRE_COUNT 0x00000010 +#define TI_ADDR_LIMIT 0x00000014 #endif diff --git a/include/asm-i386/uaccess.h b/include/asm-i386/uaccess.h index c932a6980..7143971ad 100644 --- a/include/asm-i386/uaccess.h +++ b/include/asm-i386/uaccess.h @@ -5,6 +5,7 @@ * User space memory access functions */ #include <linux/config.h> +#include <linux/errno.h> #include <linux/sched.h> #include <linux/prefetch.h> #include <asm/page.h> diff --git a/include/asm-sparc64/hardirq.h b/include/asm-sparc64/hardirq.h index 62bfae557..d55bd01d7 100644 --- a/include/asm-sparc64/hardirq.h +++ b/include/asm-sparc64/hardirq.h @@ -56,6 +56,8 @@ typedef struct { #define synchronize_irq() barrier() +#define release_irqlock(cpu) do { } while (0) + #else /* (CONFIG_SMP) */ static __inline__ int irqs_running(void) diff --git a/include/asm-sparc64/pgalloc.h b/include/asm-sparc64/pgalloc.h index f8f85d314..1d8b25d66 100644 --- a/include/asm-sparc64/pgalloc.h +++ b/include/asm-sparc64/pgalloc.h @@ -1,4 +1,4 @@ -/* $Id: pgalloc.h,v 1.30 2001-12-21 04:56:17 davem Exp $ */ +/* $Id: pgalloc.h,v 1.31 2002-02-11 06:42:10 davem Exp $ */ #ifndef _SPARC64_PGALLOC_H #define _SPARC64_PGALLOC_H @@ -158,6 +158,7 @@ extern __inline__ void free_pgd_fast(pgd_t *pgd) { struct page *page = virt_to_page(pgd); + preempt_disable(); if (!page->pprev_hash) { (unsigned long *)page->next_hash = pgd_quicklist; pgd_quicklist = (unsigned long *)page; @@ -165,12 +166,14 @@ extern __inline__ void free_pgd_fast(pgd_t *pgd) (unsigned long)page->pprev_hash |= (((unsigned long)pgd & (PAGE_SIZE / 2)) ? 2 : 1); pgd_cache_size++; + preempt_enable(); } extern __inline__ pgd_t *get_pgd_fast(void) { struct page *ret; + preempt_disable(); if ((ret = (struct page *)pgd_quicklist) != NULL) { unsigned long mask = (unsigned long)ret->pprev_hash; unsigned long off = 0; @@ -186,16 +189,22 @@ extern __inline__ pgd_t *get_pgd_fast(void) pgd_quicklist = (unsigned long *)ret->next_hash; ret = (struct page *)(__page_address(ret) + off); pgd_cache_size--; + preempt_enable(); } else { - struct page *page = alloc_page(GFP_KERNEL); + struct page *page; + preempt_enable(); + page = alloc_page(GFP_KERNEL); if (page) { ret = (struct page *)page_address(page); clear_page(ret); (unsigned long)page->pprev_hash = 2; + + preempt_disable(); (unsigned long *)page->next_hash = pgd_quicklist; pgd_quicklist = (unsigned long *)page; pgd_cache_size++; + preempt_enable(); } } return (pgd_t *)ret; @@ -205,20 +214,25 @@ extern __inline__ pgd_t *get_pgd_fast(void) extern __inline__ void free_pgd_fast(pgd_t *pgd) { + preempt_disable(); *(unsigned long *)pgd = (unsigned long) pgd_quicklist; pgd_quicklist = (unsigned long *) pgd; pgtable_cache_size++; + preempt_enable(); } extern __inline__ pgd_t *get_pgd_fast(void) { unsigned long *ret; + preempt_disable(); if((ret = pgd_quicklist) != NULL) { pgd_quicklist = (unsigned long *)(*ret); ret[0] = 0; pgtable_cache_size--; + preempt_enable(); } else { + preempt_enable(); ret = (unsigned long *) __get_free_page(GFP_KERNEL); if(ret) memset(ret, 0, PAGE_SIZE); @@ -258,20 +272,27 @@ extern __inline__ pmd_t *pmd_alloc_one_fast(struct mm_struct *mm, unsigned long if (pte_quicklist[color] == NULL) color = 1; + + preempt_disable(); if((ret = (unsigned long *)pte_quicklist[color]) != NULL) { pte_quicklist[color] = (unsigned long *)(*ret); ret[0] = 0; pgtable_cache_size--; } + preempt_enable(); + return (pmd_t *)ret; } extern __inline__ void free_pmd_fast(pmd_t *pmd) { unsigned long color = DCACHE_COLOR((unsigned long)pmd); + + preempt_disable(); *(unsigned long *)pmd = (unsigned long) pte_quicklist[color]; pte_quicklist[color] = (unsigned long *) pmd; pgtable_cache_size++; + preempt_enable(); } extern __inline__ void free_pmd_slow(pmd_t *pmd) @@ -288,20 +309,25 @@ extern __inline__ pte_t *pte_alloc_one_fast(struct mm_struct *mm, unsigned long unsigned long color = VPTE_COLOR(address); unsigned long *ret; + preempt_disable(); if((ret = (unsigned long *)pte_quicklist[color]) != NULL) { pte_quicklist[color] = (unsigned long *)(*ret); ret[0] = 0; pgtable_cache_size--; } + preempt_enable(); return (pte_t *)ret; } extern __inline__ void free_pte_fast(pte_t *pte) { unsigned long color = DCACHE_COLOR((unsigned long)pte); + + preempt_disable(); *(unsigned long *)pte = (unsigned long) pte_quicklist[color]; pte_quicklist[color] = (unsigned long *) pte; pgtable_cache_size++; + preempt_enable(); } extern __inline__ void free_pte_slow(pte_t *pte) diff --git a/include/asm-sparc64/smplock.h b/include/asm-sparc64/smplock.h index dd2cc2b54..d9c87542f 100644 --- a/include/asm-sparc64/smplock.h +++ b/include/asm-sparc64/smplock.h @@ -9,9 +9,17 @@ extern spinlock_t kernel_flag; +#ifdef CONFIG_SMP #define kernel_locked() \ (spin_is_locked(&kernel_flag) &&\ (current->lock_depth >= 0)) +#else +#ifdef CONFIG_PREEMPT +#define kernel_locked() preempt_get_count() +#else +#define kernel_locked() 1 +#endif +#endif /* * Release global kernel lock and global interrupt lock diff --git a/include/asm-sparc64/softirq.h b/include/asm-sparc64/softirq.h index e97b25e0c..0239b7275 100644 --- a/include/asm-sparc64/softirq.h +++ b/include/asm-sparc64/softirq.h @@ -10,14 +10,15 @@ #include <asm/hardirq.h> #include <asm/system.h> /* for membar() */ -#define local_bh_disable() (local_bh_count(smp_processor_id())++) -#define __local_bh_enable() (local_bh_count(smp_processor_id())--) +#define local_bh_disable() do { barrier(); preempt_disable(); local_bh_count(smp_processor_id())++; } while (0) +#define __local_bh_enable() do { local_bh_count(smp_processor_id())--; preempt_enable(); barrier(); } while (0) #define local_bh_enable() \ do { if (!--local_bh_count(smp_processor_id()) && \ softirq_pending(smp_processor_id())) { \ do_softirq(); \ __sti(); \ } \ + preempt_enable(); \ } while (0) #define in_softirq() (local_bh_count(smp_processor_id()) != 0) diff --git a/include/asm-sparc64/spinlock.h b/include/asm-sparc64/spinlock.h index ce905b461..55fef6560 100644 --- a/include/asm-sparc64/spinlock.h +++ b/include/asm-sparc64/spinlock.h @@ -40,7 +40,7 @@ typedef unsigned char spinlock_t; do { membar("#LoadLoad"); \ } while(*((volatile unsigned char *)lock)) -extern __inline__ void spin_lock(spinlock_t *lock) +extern __inline__ void _raw_spin_lock(spinlock_t *lock) { __asm__ __volatile__( "1: ldstub [%0], %%g7\n" @@ -57,7 +57,7 @@ extern __inline__ void spin_lock(spinlock_t *lock) : "g7", "memory"); } -extern __inline__ int spin_trylock(spinlock_t *lock) +extern __inline__ int _raw_spin_trylock(spinlock_t *lock) { unsigned int result; __asm__ __volatile__("ldstub [%1], %0\n\t" @@ -68,7 +68,7 @@ extern __inline__ int spin_trylock(spinlock_t *lock) return (result == 0); } -extern __inline__ void spin_unlock(spinlock_t *lock) +extern __inline__ void _raw_spin_unlock(spinlock_t *lock) { __asm__ __volatile__("membar #StoreStore | #LoadStore\n\t" "stb %%g0, [%0]" @@ -99,9 +99,9 @@ extern void _do_spin_lock (spinlock_t *lock, char *str); extern void _do_spin_unlock (spinlock_t *lock); extern int _spin_trylock (spinlock_t *lock); -#define spin_trylock(lp) _spin_trylock(lp) -#define spin_lock(lock) _do_spin_lock(lock, "spin_lock") -#define spin_unlock(lock) _do_spin_unlock(lock) +#define _raw_spin_trylock(lp) _spin_trylock(lp) +#define _raw_spin_lock(lock) _do_spin_lock(lock, "spin_lock") +#define _raw_spin_unlock(lock) _do_spin_unlock(lock) #endif /* CONFIG_DEBUG_SPINLOCK */ @@ -118,10 +118,10 @@ extern void __read_unlock(rwlock_t *); extern void __write_lock(rwlock_t *); extern void __write_unlock(rwlock_t *); -#define read_lock(p) __read_lock(p) -#define read_unlock(p) __read_unlock(p) -#define write_lock(p) __write_lock(p) -#define write_unlock(p) __write_unlock(p) +#define _raw_read_lock(p) __read_lock(p) +#define _raw_read_unlock(p) __read_unlock(p) +#define _raw_write_lock(p) __write_lock(p) +#define _raw_write_unlock(p) __write_unlock(p) #else /* !(CONFIG_DEBUG_SPINLOCK) */ @@ -138,28 +138,28 @@ extern void _do_read_unlock(rwlock_t *rw, char *str); extern void _do_write_lock(rwlock_t *rw, char *str); extern void _do_write_unlock(rwlock_t *rw); -#define read_lock(lock) \ +#define _raw_read_lock(lock) \ do { unsigned long flags; \ __save_and_cli(flags); \ _do_read_lock(lock, "read_lock"); \ __restore_flags(flags); \ } while(0) -#define read_unlock(lock) \ +#define _raw_read_unlock(lock) \ do { unsigned long flags; \ __save_and_cli(flags); \ _do_read_unlock(lock, "read_unlock"); \ __restore_flags(flags); \ } while(0) -#define write_lock(lock) \ +#define _raw_write_lock(lock) \ do { unsigned long flags; \ __save_and_cli(flags); \ _do_write_lock(lock, "write_lock"); \ __restore_flags(flags); \ } while(0) -#define write_unlock(lock) \ +#define _raw_write_unlock(lock) \ do { unsigned long flags; \ __save_and_cli(flags); \ _do_write_unlock(lock); \ diff --git a/include/asm-sparc64/thread_info.h b/include/asm-sparc64/thread_info.h index 35d2e003e..35d2a9e36 100644 --- a/include/asm-sparc64/thread_info.h +++ b/include/asm-sparc64/thread_info.h @@ -1,4 +1,4 @@ -/* $Id: thread_info.h,v 1.1 2002-02-10 00:00:58 davem Exp $ +/* $Id: thread_info.h,v 1.2 2002-02-11 06:42:10 davem Exp $ * thread_info.h: sparc64 low-level thread information * * Copyright (C) 2002 David S. Miller (davem@redhat.com) @@ -27,6 +27,7 @@ #ifndef __ASSEMBLY__ #include <asm/ptrace.h> +#include <asm/types.h> struct task_struct; struct exec_domain; @@ -42,8 +43,10 @@ struct thread_info { /* D$ line 2 */ unsigned long fault_address; struct pt_regs *kregs; - unsigned long *utraps; struct exec_domain *exec_domain; + int preempt_count; + + unsigned long *utraps; struct reg_window reg_window[NSWINS]; unsigned long rwbuf_stkptrs[NSWINS]; @@ -76,18 +79,19 @@ struct thread_info { #define TI_KSP 0x00000018 #define TI_FAULT_ADDR 0x00000020 #define TI_KREGS 0x00000028 -#define TI_UTRAPS 0x00000030 -#define TI_EXEC_DOMAIN 0x00000038 -#define TI_REG_WINDOW 0x00000040 -#define TI_RWIN_SPTRS 0x000003c0 -#define TI_GSR 0x000003f8 -#define TI_XFSR 0x00000430 -#define TI_USER_CNTD0 0x00000468 -#define TI_USER_CNTD1 0x00000470 -#define TI_KERN_CNTD0 0x00000478 -#define TI_KERN_CNTD1 0x00000480 -#define TI_PCR 0x00000488 -#define TI_CEE_STUFF 0x00000490 +#define TI_EXEC_DOMAIN 0x00000030 +#define TI_PRE_COUNT 0x00000038 +#define TI_UTRAPS 0x00000040 +#define TI_REG_WINDOW 0x00000048 +#define TI_RWIN_SPTRS 0x000003c8 +#define TI_GSR 0x00000400 +#define TI_XFSR 0x00000438 +#define TI_USER_CNTD0 0x00000470 +#define TI_USER_CNTD1 0x00000478 +#define TI_KERN_CNTD0 0x00000480 +#define TI_KERN_CNTD1 0x00000488 +#define TI_PCR 0x00000490 +#define TI_CEE_STUFF 0x00000498 #define TI_FPREGS 0x000004c0 /* We embed this in the uppermost byte of thread_info->flags */ diff --git a/include/asm-sparc64/ttable.h b/include/asm-sparc64/ttable.h index a3025150d..3c3fa2e4b 100644 --- a/include/asm-sparc64/ttable.h +++ b/include/asm-sparc64/ttable.h @@ -1,4 +1,4 @@ -/* $Id: ttable.h,v 1.18 2002-02-09 19:49:32 davem Exp $ */ +/* $Id: ttable.h,v 1.19 2002-02-11 06:42:10 davem Exp $ */ #ifndef _SPARC64_TTABLE_H #define _SPARC64_TTABLE_H @@ -140,7 +140,7 @@ mov level, %o0; \ call routine; \ add %sp, STACK_BIAS + REGWIN_SZ, %o1; \ - ba,a,pt %xcc, rtrap_clr_l6; + ba,a,pt %xcc, rtrap_irq; #define TICK_SMP_IRQ \ rdpr %pil, %g2; \ @@ -150,7 +150,7 @@ 109: or %g7, %lo(109b), %g7; \ call smp_percpu_timer_interrupt; \ add %sp, STACK_BIAS + REGWIN_SZ, %o0; \ - ba,a,pt %xcc, rtrap_clr_l6; + ba,a,pt %xcc, rtrap_irq; #define TRAP_IVEC TRAP_NOSAVE(do_ivec) diff --git a/include/linux/affs_fs_i.h b/include/linux/affs_fs_i.h index c32f69ca1..89872f778 100644 --- a/include/linux/affs_fs_i.h +++ b/include/linux/affs_fs_i.h @@ -2,6 +2,8 @@ #define _AFFS_FS_I #include <linux/a.out.h> +#include <linux/fs.h> +#include <asm/semaphore.h> #define AFFS_CACHE_SIZE PAGE_SIZE //#define AFFS_CACHE_SIZE (4*4) diff --git a/include/linux/ax25.h b/include/linux/ax25.h index 9191445bb..6dfc8fc91 100644 --- a/include/linux/ax25.h +++ b/include/linux/ax25.h @@ -6,6 +6,8 @@ #ifndef AX25_KERNEL_H #define AX25_KERNEL_H +#include <linux/socket.h> + #define AX25_MTU 256 #define AX25_MAX_DIGIS 8 diff --git a/include/linux/bfs_fs_i.h b/include/linux/bfs_fs_i.h index ca1432a1e..5a85f1dc1 100644 --- a/include/linux/bfs_fs_i.h +++ b/include/linux/bfs_fs_i.h @@ -6,6 +6,8 @@ #ifndef _LINUX_BFS_FS_I #define _LINUX_BFS_FS_I +#include <linux/fs.h> + /* * BFS file system in-core inode info */ diff --git a/include/linux/brlock.h b/include/linux/brlock.h index 208c45733..e36492e06 100644 --- a/include/linux/brlock.h +++ b/include/linux/brlock.h @@ -171,11 +171,11 @@ static inline void br_write_unlock (enum brlock_indices idx) } #else -# define br_read_lock(idx) ((void)(idx)) -# define br_read_unlock(idx) ((void)(idx)) -# define br_write_lock(idx) ((void)(idx)) -# define br_write_unlock(idx) ((void)(idx)) -#endif +# define br_read_lock(idx) ({ (void)(idx); preempt_disable(); }) +# define br_read_unlock(idx) ({ (void)(idx); preempt_enable(); }) +# define br_write_lock(idx) ({ (void)(idx); preempt_disable(); }) +# define br_write_unlock(idx) ({ (void)(idx); preempt_enable(); }) +#endif /* CONFIG_SMP */ /* * Now enumerate all of the possible sw/hw IRQ protected diff --git a/include/linux/capability.h b/include/linux/capability.h index 73e972803..1cccb9db2 100644 --- a/include/linux/capability.h +++ b/include/linux/capability.h @@ -14,7 +14,6 @@ #define _LINUX_CAPABILITY_H #include <linux/types.h> -#include <linux/fs.h> /* User-level do most of the mapping between kernel and user capabilities based on the version tag given by the kernel. The diff --git a/include/linux/efs_fs.h b/include/linux/efs_fs.h index c5cbc107c..2f55b03f5 100644 --- a/include/linux/efs_fs.h +++ b/include/linux/efs_fs.h @@ -27,6 +27,7 @@ static const char cprt[] = "EFS: "EFS_VERSION" - (c) 1999 Al Smith <Al.Smith@aes #define EFS_BLOCKSIZE_BITS 9 #define EFS_BLOCKSIZE (1 << EFS_BLOCKSIZE_BITS) +#include <linux/fs.h> #include <linux/efs_fs_i.h> #include <linux/efs_dir.h> diff --git a/include/linux/err.h b/include/linux/err.h new file mode 100644 index 000000000..92cab64fd --- /dev/null +++ b/include/linux/err.h @@ -0,0 +1,29 @@ +#ifndef _LINUX_ERR_H +#define _LINUX_ERR_H + +#include <asm/errno.h> + +/* + * Kernel pointers have redundant information, so we can use a + * scheme where we can return either an error code or a dentry + * pointer with the same return value. + * + * This should be a per-architecture thing, to allow different + * error and pointer decisions. + */ +static inline void *ERR_PTR(long error) +{ + return (void *) error; +} + +static inline long PTR_ERR(const void *ptr) +{ + return (long) ptr; +} + +static inline long IS_ERR(const void *ptr) +{ + return (unsigned long)ptr > (unsigned long)-1000L; +} + +#endif /* _LINUX_ERR_H */ diff --git a/include/linux/file.h b/include/linux/file.h index 5e006ad08..067ca7773 100644 --- a/include/linux/file.h +++ b/include/linux/file.h @@ -8,6 +8,7 @@ #include <asm/atomic.h> #include <linux/posix_types.h> #include <linux/compiler.h> +#include <linux/spinlock.h> /* * The default fd array needs to be at least BITS_PER_LONG, diff --git a/include/linux/fs.h b/include/linux/fs.h index 28027aaaf..cc874fa97 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -1257,28 +1257,7 @@ extern struct file * open_exec(const char *); extern int is_subdir(struct dentry *, struct dentry *); extern ino_t find_inode_number(struct dentry *, struct qstr *); -/* - * Kernel pointers have redundant information, so we can use a - * scheme where we can return either an error code or a dentry - * pointer with the same return value. - * - * This should be a per-architecture thing, to allow different - * error and pointer decisions. - */ -static inline void *ERR_PTR(long error) -{ - return (void *) error; -} - -static inline long PTR_ERR(const void *ptr) -{ - return (long) ptr; -} - -static inline long IS_ERR(const void *ptr) -{ - return (unsigned long)ptr > (unsigned long)-1000L; -} +#include <linux/err.h> /* * The bitmask for a lookup event: diff --git a/include/linux/fs_struct.h b/include/linux/fs_struct.h index 3d2df3cf4..1082b5b16 100644 --- a/include/linux/fs_struct.h +++ b/include/linux/fs_struct.h @@ -2,6 +2,9 @@ #define _LINUX_FS_STRUCT_H #ifdef __KERNEL__ +#include <linux/mount.h> +#include <linux/dcache.h> + struct fs_struct { atomic_t count; rwlock_t lock; diff --git a/include/linux/generic_serial.h b/include/linux/generic_serial.h index 1d8b041bf..5c30fc929 100644 --- a/include/linux/generic_serial.h +++ b/include/linux/generic_serial.h @@ -12,9 +12,6 @@ #ifndef GENERIC_SERIAL_H #define GENERIC_SERIAL_H - - - struct real_driver { void (*disable_tx_interrupts) (void *); void (*enable_tx_interrupts) (void *); @@ -98,7 +95,7 @@ void gs_set_termios (struct tty_struct * tty, struct termios * old_termios); int gs_init_port(struct gs_port *port); int gs_setserial(struct gs_port *port, struct serial_struct *sp); -void gs_getserial(struct gs_port *port, struct serial_struct *sp); +int gs_getserial(struct gs_port *port, struct serial_struct *sp); void gs_got_break(struct gs_port *port); extern int gs_debug; diff --git a/include/linux/highmem.h b/include/linux/highmem.h index 118afad79..c7651b47b 100644 --- a/include/linux/highmem.h +++ b/include/linux/highmem.h @@ -3,6 +3,7 @@ #include <linux/config.h> #include <linux/bio.h> +#include <linux/fs.h> #include <asm/pgalloc.h> #ifdef CONFIG_HIGHMEM diff --git a/include/linux/in.h b/include/linux/in.h index 1d5f14ad6..f41a61dce 100644 --- a/include/linux/in.h +++ b/include/linux/in.h @@ -19,6 +19,7 @@ #define _LINUX_IN_H #include <linux/types.h> +#include <linux/socket.h> /* Standard well-defined IP protocols. */ enum { diff --git a/include/linux/inet.h b/include/linux/inet.h index acb93765f..940f3208a 100644 --- a/include/linux/inet.h +++ b/include/linux/inet.h @@ -44,6 +44,8 @@ #ifdef __KERNEL__ +#include <linux/net.h> + extern void inet_proto_init(struct net_proto *pro); extern char *in_ntoa(__u32 in); extern __u32 in_aton(const char *str); diff --git a/include/linux/iso_fs_i.h b/include/linux/iso_fs_i.h index e4fc9d8e4..01a1ae26b 100644 --- a/include/linux/iso_fs_i.h +++ b/include/linux/iso_fs_i.h @@ -1,6 +1,8 @@ #ifndef _ISO_FS_I #define _ISO_FS_I +#include <linux/fs.h> + enum isofs_file_format { isofs_file_normal = 0, isofs_file_sparse = 1, diff --git a/include/linux/lp.h b/include/linux/lp.h index 9b04225db..521bcd2fe 100644 --- a/include/linux/lp.h +++ b/include/linux/lp.h @@ -98,6 +98,9 @@ #ifdef __KERNEL__ +#include <linux/wait.h> +#include <asm/semaphore.h> + /* Magic numbers for defining port-device mappings */ #define LP_PARPORT_UNSPEC -4 #define LP_PARPORT_AUTO -3 diff --git a/include/linux/mm.h b/include/linux/mm.h index ba870227f..5377dd783 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -13,6 +13,7 @@ #include <linux/mmzone.h> #include <linux/swap.h> #include <linux/rbtree.h> +#include <linux/fs.h> extern unsigned long max_mapnr; extern unsigned long num_physpages; diff --git a/include/linux/msdos_fs_i.h b/include/linux/msdos_fs_i.h index 7b102ea2e..438afd880 100644 --- a/include/linux/msdos_fs_i.h +++ b/include/linux/msdos_fs_i.h @@ -1,6 +1,8 @@ #ifndef _MSDOS_FS_I #define _MSDOS_FS_I +#include <linux/fs.h> + /* * MS-DOS file system inode data in memory */ diff --git a/include/linux/namespace.h b/include/linux/namespace.h index 8695e5f96..da92ede04 100644 --- a/include/linux/namespace.h +++ b/include/linux/namespace.h @@ -9,6 +9,8 @@ struct namespace { struct rw_semaphore sem; }; +void umount_tree(struct vfsmount *mnt); + static inline void put_namespace(struct namespace *namespace) { if (atomic_dec_and_test(&namespace->count)) { diff --git a/include/linux/quotaops.h b/include/linux/quotaops.h index c22d9f32e..0a1df9e1f 100644 --- a/include/linux/quotaops.h +++ b/include/linux/quotaops.h @@ -13,10 +13,10 @@ #include <linux/config.h> #include <linux/smp_lock.h> -#if defined(CONFIG_QUOTA) - #include <linux/fs.h> +#if defined(CONFIG_QUOTA) + /* * declaration of quota_function calls in kernel. */ diff --git a/include/linux/sched.h b/include/linux/sched.h index 78a5834f8..dd6dc6983 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -6,7 +6,8 @@ extern unsigned long event; #include <linux/config.h> -#include <linux/binfmts.h> +#include <linux/capability.h> +#include <linux/tqueue.h> #include <linux/threads.h> #include <linux/kernel.h> #include <linux/types.h> @@ -91,6 +92,7 @@ extern unsigned long nr_running(void); #define TASK_UNINTERRUPTIBLE 2 #define TASK_ZOMBIE 4 #define TASK_STOPPED 8 +#define PREEMPT_ACTIVE 0x4000000 #define __set_task_state(tsk, state_value) \ do { (tsk)->state = (state_value); } while (0) @@ -508,15 +510,12 @@ extern void free_uid(struct user_struct *); extern unsigned long volatile jiffies; extern unsigned long itimer_ticks; extern unsigned long itimer_next; -extern struct timeval xtime; extern void do_timer(struct pt_regs *); extern unsigned int * prof_buffer; extern unsigned long prof_len; extern unsigned long prof_shift; -#define CURRENT_TIME (xtime.tv_sec) - extern void FASTCALL(__wake_up(wait_queue_head_t *q, unsigned int mode, int nr)); extern void FASTCALL(__wake_up_sync(wait_queue_head_t *q, unsigned int mode, int nr)); extern void FASTCALL(sleep_on(wait_queue_head_t *q)); diff --git a/include/linux/shmem_fs.h b/include/linux/shmem_fs.h index 183b1e49d..46b6b67b0 100644 --- a/include/linux/shmem_fs.h +++ b/include/linux/shmem_fs.h @@ -1,22 +1,12 @@ #ifndef __SHMEM_FS_H #define __SHMEM_FS_H +#include <linux/swap.h> + /* inode in-kernel data */ #define SHMEM_NR_DIRECT 16 -/* - * A swap entry has to fit into a "unsigned long", as - * the entry is hidden in the "index" field of the - * swapper address space. - * - * We have to move it here, since not every user of fs.h is including - * mm.h, but mm.h is including fs.h via sched .h :-/ - */ -typedef struct { - unsigned long val; -} swp_entry_t; - extern atomic_t shmem_nrpages; struct shmem_inode_info { diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h index a1d9d4e34..2bec5fabc 100644 --- a/include/linux/skbuff.h +++ b/include/linux/skbuff.h @@ -25,6 +25,8 @@ #include <linux/spinlock.h> #include <linux/mm.h> #include <linux/highmem.h> +#include <linux/poll.h> +#include <linux/net.h> #define HAVE_ALLOC_SKB /* For the drivers to know */ #define HAVE_ALIGNABLE_SKB /* Ditto 8) */ diff --git a/include/linux/slab.h b/include/linux/slab.h index ceff3509f..50cefbbc9 100644 --- a/include/linux/slab.h +++ b/include/linux/slab.h @@ -62,11 +62,6 @@ extern void *kmalloc(size_t, int); extern void kfree(const void *); extern int FASTCALL(kmem_cache_reap(int)); -extern int slabinfo_read_proc(char *page, char **start, off_t off, - int count, int *eof, void *data); -struct file; -extern int slabinfo_write_proc(struct file *file, const char *buffer, - unsigned long count, void *data); /* System wide caches */ extern kmem_cache_t *vm_area_cachep; diff --git a/include/linux/smb.h b/include/linux/smb.h index 9cf2d068b..d47f28f9f 100644 --- a/include/linux/smb.h +++ b/include/linux/smb.h @@ -10,6 +10,7 @@ #define _LINUX_SMB_H #include <linux/types.h> +#include <linux/kdev_t.h> enum smb_protocol { SMB_PROTOCOL_NONE, diff --git a/include/linux/smb_fs_i.h b/include/linux/smb_fs_i.h index 309e8b973..8516954a5 100644 --- a/include/linux/smb_fs_i.h +++ b/include/linux/smb_fs_i.h @@ -11,6 +11,7 @@ #ifdef __KERNEL__ #include <linux/types.h> +#include <linux/fs.h> /* * smb fs inode data (in memory only) diff --git a/include/linux/smp.h b/include/linux/smp.h index bb1ff5c5e..43bef9087 100644 --- a/include/linux/smp.h +++ b/include/linux/smp.h @@ -81,7 +81,9 @@ extern volatile int smp_msg_id; #define smp_processor_id() 0 #define hard_smp_processor_id() 0 #define smp_threads_ready 1 +#ifndef CONFIG_PREEMPT #define kernel_lock() +#endif #define cpu_logical_map(cpu) 0 #define cpu_number_map(cpu) 0 #define smp_call_function(func,info,retry,wait) ({ 0; }) diff --git a/include/linux/smp_lock.h b/include/linux/smp_lock.h index d1bb03872..13d8c7ace 100644 --- a/include/linux/smp_lock.h +++ b/include/linux/smp_lock.h @@ -3,7 +3,7 @@ #include <linux/config.h> -#ifndef CONFIG_SMP +#if !defined(CONFIG_SMP) && !defined(CONFIG_PREEMPT) #define lock_kernel() do { } while(0) #define unlock_kernel() do { } while(0) diff --git a/include/linux/sound.h b/include/linux/sound.h index 18a673320..428f59794 100644 --- a/include/linux/sound.h +++ b/include/linux/sound.h @@ -3,6 +3,8 @@ * Minor numbers for the sound driver. */ +#include <linux/fs.h> + #define SND_DEV_CTL 0 /* Control port /dev/mixer */ #define SND_DEV_SEQ 1 /* Sequencer output /dev/sequencer (FM synthesizer and MIDI output) */ diff --git a/include/linux/spinlock.h b/include/linux/spinlock.h index dc27910a6..6e3ef75fd 100644 --- a/include/linux/spinlock.h +++ b/include/linux/spinlock.h @@ -2,6 +2,10 @@ #define __LINUX_SPINLOCK_H #include <linux/config.h> +#include <linux/linkage.h> +#include <linux/compiler.h> +#include <linux/thread_info.h> +#include <linux/kernel.h> /* * These are the generic versions of the spinlocks and read-write @@ -62,8 +66,10 @@ #if (DEBUG_SPINLOCKS < 1) +#ifndef CONFIG_PREEMPT #define atomic_dec_and_lock(atomic,lock) atomic_dec_and_test(atomic) #define ATOMIC_DEC_AND_LOCK +#endif /* * Your basic spinlocks, allowing only a single CPU anywhere @@ -79,11 +85,11 @@ #endif #define spin_lock_init(lock) do { } while(0) -#define spin_lock(lock) (void)(lock) /* Not "unused variable". */ +#define _raw_spin_lock(lock) (void)(lock) /* Not "unused variable". */ #define spin_is_locked(lock) (0) -#define spin_trylock(lock) ({1; }) +#define _raw_spin_trylock(lock) ({1; }) #define spin_unlock_wait(lock) do { } while(0) -#define spin_unlock(lock) do { } while(0) +#define _raw_spin_unlock(lock) do { } while(0) #elif (DEBUG_SPINLOCKS < 2) @@ -142,13 +148,79 @@ typedef struct { #endif #define rwlock_init(lock) do { } while(0) -#define read_lock(lock) (void)(lock) /* Not "unused variable". */ -#define read_unlock(lock) do { } while(0) -#define write_lock(lock) (void)(lock) /* Not "unused variable". */ -#define write_unlock(lock) do { } while(0) +#define _raw_read_lock(lock) (void)(lock) /* Not "unused variable". */ +#define _raw_read_unlock(lock) do { } while(0) +#define _raw_write_lock(lock) (void)(lock) /* Not "unused variable". */ +#define _raw_write_unlock(lock) do { } while(0) #endif /* !SMP */ +#ifdef CONFIG_PREEMPT + +asmlinkage void preempt_schedule(void); + +#define preempt_get_count() (current_thread_info()->preempt_count) + +#define preempt_disable() \ +do { \ + ++current_thread_info()->preempt_count; \ + barrier(); \ +} while (0) + +#define preempt_enable_no_resched() \ +do { \ + --current_thread_info()->preempt_count; \ + barrier(); \ +} while (0) + +#define preempt_enable() \ +do { \ + --current_thread_info()->preempt_count; \ + barrier(); \ + if (unlikely(!(current_thread_info()->preempt_count) && \ + test_thread_flag(TIF_NEED_RESCHED))) \ + preempt_schedule(); \ +} while (0) + +#define spin_lock(lock) \ +do { \ + preempt_disable(); \ + _raw_spin_lock(lock); \ +} while(0) + +#define spin_trylock(lock) ({preempt_disable(); _raw_spin_trylock(lock) ? \ + 1 : ({preempt_enable(); 0;});}) +#define spin_unlock(lock) \ +do { \ + _raw_spin_unlock(lock); \ + preempt_enable(); \ +} while (0) + +#define read_lock(lock) ({preempt_disable(); _raw_read_lock(lock);}) +#define read_unlock(lock) ({_raw_read_unlock(lock); preempt_enable();}) +#define write_lock(lock) ({preempt_disable(); _raw_write_lock(lock);}) +#define write_unlock(lock) ({_raw_write_unlock(lock); preempt_enable();}) +#define write_trylock(lock) ({preempt_disable();_raw_write_trylock(lock) ? \ + 1 : ({preempt_enable(); 0;});}) + +#else + +#define preempt_get_count() do { } while (0) +#define preempt_disable() do { } while (0) +#define preempt_enable_no_resched() do {} while(0) +#define preempt_enable() do { } while (0) + +#define spin_lock(lock) _raw_spin_lock(lock) +#define spin_trylock(lock) _raw_spin_trylock(lock) +#define spin_unlock(lock) _raw_spin_unlock(lock) + +#define read_lock(lock) _raw_read_lock(lock) +#define read_unlock(lock) _raw_read_unlock(lock) +#define write_lock(lock) _raw_write_lock(lock) +#define write_unlock(lock) _raw_write_unlock(lock) +#define write_trylock(lock) _raw_write_trylock(lock) +#endif + /* "lock on reference count zero" */ #ifndef ATOMIC_DEC_AND_LOCK #include <asm/atomic.h> diff --git a/include/linux/sunrpc/svc.h b/include/linux/sunrpc/svc.h index fb33c6b5f..f6439cb4f 100644 --- a/include/linux/sunrpc/svc.h +++ b/include/linux/sunrpc/svc.h @@ -14,6 +14,7 @@ #include <linux/sunrpc/types.h> #include <linux/sunrpc/xdr.h> #include <linux/sunrpc/svcauth.h> +#include <linux/wait.h> /* * RPC service. diff --git a/include/linux/sunrpc/xdr.h b/include/linux/sunrpc/xdr.h index facaddcd5..69827d88d 100644 --- a/include/linux/sunrpc/xdr.h +++ b/include/linux/sunrpc/xdr.h @@ -10,6 +10,7 @@ #ifdef __KERNEL__ #include <linux/uio.h> +#include <asm/byteorder.h> /* * Buffer adjustment diff --git a/include/linux/swap.h b/include/linux/swap.h index 3535d0dba..6c149d15e 100644 --- a/include/linux/swap.h +++ b/include/linux/swap.h @@ -2,6 +2,9 @@ #define _LINUX_SWAP_H #include <linux/spinlock.h> +#include <linux/kdev_t.h> +#include <linux/linkage.h> +#include <linux/mmzone.h> #include <asm/page.h> #define SWAP_FLAG_PREFER 0x8000 /* set if swap priority specified */ @@ -39,6 +42,14 @@ union swap_header { } info; }; + /* A swap entry has to fit into a "unsigned long", as + * the entry is hidden in the "index" field of the + * swapper address space. + */ +typedef struct { + unsigned long val; +} swp_entry_t; + #ifdef __KERNEL__ /* diff --git a/include/linux/time.h b/include/linux/time.h index 15ba838c2..e7447958e 100644 --- a/include/linux/time.h +++ b/include/linux/time.h @@ -82,6 +82,10 @@ mktime (unsigned int year, unsigned int mon, )*60 + sec; /* finally seconds */ } +extern struct timeval xtime; + +#define CURRENT_TIME (xtime.tv_sec) + #endif /* __KERNEL__ */ diff --git a/include/linux/timex.h b/include/linux/timex.h index 3a00a26e2..b82cbdc77 100644 --- a/include/linux/timex.h +++ b/include/linux/timex.h @@ -51,6 +51,7 @@ #ifndef _LINUX_TIMEX_H #define _LINUX_TIMEX_H +#include <linux/time.h> #include <asm/param.h> /* diff --git a/include/linux/vmalloc.h b/include/linux/vmalloc.h index f87bd8571..e08fcf85c 100644 --- a/include/linux/vmalloc.h +++ b/include/linux/vmalloc.h @@ -1,7 +1,6 @@ #ifndef __LINUX_VMALLOC_H #define __LINUX_VMALLOC_H -#include <linux/sched.h> #include <linux/mm.h> #include <linux/spinlock.h> diff --git a/include/net/neighbour.h b/include/net/neighbour.h index 1a60139a3..bfcc2fa80 100644 --- a/include/net/neighbour.h +++ b/include/net/neighbour.h @@ -46,6 +46,8 @@ #include <asm/atomic.h> #include <linux/skbuff.h> +#include <linux/err.h> + #define NUD_IN_TIMER (NUD_INCOMPLETE|NUD_DELAY|NUD_PROBE) #define NUD_VALID (NUD_PERMANENT|NUD_NOARP|NUD_REACHABLE|NUD_PROBE|NUD_STALE|NUD_DELAY) #define NUD_CONNECTED (NUD_PERMANENT|NUD_NOARP|NUD_REACHABLE) diff --git a/include/net/scm.h b/include/net/scm.h index e26b43f5e..214707434 100644 --- a/include/net/scm.h +++ b/include/net/scm.h @@ -1,6 +1,8 @@ #ifndef __LINUX_NET_SCM_H #define __LINUX_NET_SCM_H +#include <linux/limits.h> + /* Well, we should have at least one descriptor open * to accept passed FDs 8) */ diff --git a/include/net/sock.h b/include/net/sock.h index 77dcd26ec..898193d61 100644 --- a/include/net/sock.h +++ b/include/net/sock.h @@ -301,6 +301,8 @@ static __inline__ void sock_prot_dec_use(struct proto *prot) #define SOCK_BINDADDR_LOCK 4 #define SOCK_BINDPORT_LOCK 8 +#include <linux/fs.h> /* just for inode - yeuch.*/ + /* Used by processes to "lock" a socket state, so that * interrupts and bottom half handlers won't change it diff --git a/kernel/exit.c b/kernel/exit.c index 6b5a7cba0..2566c5c5b 100644 --- a/kernel/exit.c +++ b/kernel/exit.c @@ -18,6 +18,7 @@ #include <linux/acct.h> #endif #include <linux/file.h> +#include <linux/binfmts.h> #include <asm/uaccess.h> #include <asm/pgtable.h> @@ -390,8 +391,8 @@ static inline void __exit_mm(struct task_struct * tsk) /* more a memory barrier than a real lock */ task_lock(tsk); tsk->mm = NULL; - task_unlock(tsk); enter_lazy_tlb(mm, current, smp_processor_id()); + task_unlock(tsk); mmput(mm); } } diff --git a/kernel/fork.c b/kernel/fork.c index 3e49ad5c1..94ccd2aea 100644 --- a/kernel/fork.c +++ b/kernel/fork.c @@ -22,6 +22,8 @@ #include <linux/namespace.h> #include <linux/personality.h> #include <linux/file.h> +#include <linux/binfmts.h> +#include <linux/fs.h> #include <asm/pgtable.h> #include <asm/pgalloc.h> @@ -650,6 +652,13 @@ int do_fork(unsigned long clone_flags, unsigned long stack_start, if (p->binfmt && p->binfmt->module) __MOD_INC_USE_COUNT(p->binfmt->module); +#ifdef CONFIG_PREEMPT + /* + * schedule_tail drops this_rq()->lock so we compensate with a count + * of 1. Also, we want to start with kernel preemption disabled. + */ + p->thread_info->preempt_count = 1; +#endif p->did_exec = 0; p->swappable = 0; p->state = TASK_UNINTERRUPTIBLE; diff --git a/kernel/ksyms.c b/kernel/ksyms.c index 57e60f019..3f0b16ccf 100644 --- a/kernel/ksyms.c +++ b/kernel/ksyms.c @@ -47,6 +47,7 @@ #include <linux/in6.h> #include <linux/completion.h> #include <linux/seq_file.h> +#include <linux/binfmts.h> #include <asm/checksum.h> #if defined(CONFIG_PROC_FS) @@ -448,6 +449,9 @@ EXPORT_SYMBOL(sleep_on_timeout); EXPORT_SYMBOL(interruptible_sleep_on); EXPORT_SYMBOL(interruptible_sleep_on_timeout); EXPORT_SYMBOL(schedule); +#ifdef CONFIG_PREEMPT +EXPORT_SYMBOL(preempt_schedule); +#endif EXPORT_SYMBOL(schedule_timeout); EXPORT_SYMBOL(sys_sched_yield); EXPORT_SYMBOL(set_user_nice); diff --git a/kernel/module.c b/kernel/module.c index 34bb9edaa..d0ed46708 100644 --- a/kernel/module.c +++ b/kernel/module.c @@ -10,6 +10,7 @@ #include <linux/slab.h> #include <linux/kmod.h> #include <linux/seq_file.h> +#include <linux/fs.h> /* * Originally by Anonymous (as far as I know...) @@ -1074,84 +1075,67 @@ free_module(struct module *mod, int tag_freed) /* * Called by the /proc file system to return a current list of modules. */ - -int get_module_list(char *p) +static void *m_start(struct seq_file *m, loff_t *pos) { - size_t left = PAGE_SIZE; - struct module *mod; - char tmpstr[64]; - struct module_ref *ref; - - for (mod = module_list; mod != &kernel_module; mod = mod->next) { - long len; - const char *q; - -#define safe_copy_str(str, len) \ - do { \ - if (left < len) \ - goto fini; \ - memcpy(p, str, len); p += len, left -= len; \ - } while (0) -#define safe_copy_cstr(str) safe_copy_str(str, sizeof(str)-1) - - len = strlen(mod->name); - safe_copy_str(mod->name, len); - - if ((len = 20 - len) > 0) { - if (left < len) - goto fini; - memset(p, ' ', len); - p += len; - left -= len; - } - - len = sprintf(tmpstr, "%8lu", mod->size); - safe_copy_str(tmpstr, len); - - if (mod->flags & MOD_RUNNING) { - len = sprintf(tmpstr, "%4ld", - (mod_member_present(mod, can_unload) - && mod->can_unload - ? -1L : (long)atomic_read(&mod->uc.usecount))); - safe_copy_str(tmpstr, len); - } + struct module *v; + loff_t n = *pos; + lock_kernel(); + for (v = module_list; v && n--; v = v->next) + ; + return v; +} +static void *m_next(struct seq_file *m, void *p, loff_t *pos) +{ + struct module *v = p; + (*pos)++; + return v->next; +} +static void m_stop(struct seq_file *m, void *p) +{ + unlock_kernel(); +} +static int m_show(struct seq_file *m, void *p) +{ + struct module *mod = p; + struct module_ref *ref = mod->refs; - if (mod->flags & MOD_DELETED) - safe_copy_cstr(" (deleted)"); - else if (mod->flags & MOD_RUNNING) { - if (mod->flags & MOD_AUTOCLEAN) - safe_copy_cstr(" (autoclean)"); - if (!(mod->flags & MOD_USED_ONCE)) - safe_copy_cstr(" (unused)"); - } - else if (mod->flags & MOD_INITIALIZING) - safe_copy_cstr(" (initializing)"); - else - safe_copy_cstr(" (uninitialized)"); - - if ((ref = mod->refs) != NULL) { - safe_copy_cstr(" ["); - while (1) { - q = ref->ref->name; - len = strlen(q); - safe_copy_str(q, len); - - if ((ref = ref->next_ref) != NULL) - safe_copy_cstr(" "); - else - break; - } - safe_copy_cstr("]"); - } - safe_copy_cstr("\n"); + if (mod == &kernel_module) + return 0; -#undef safe_copy_str -#undef safe_copy_cstr + seq_printf(m, "%-20s%8lu", mod->name, mod->size); + if (mod->flags & MOD_RUNNING) + seq_printf(m, "%4ld", + (mod_member_present(mod, can_unload) + && mod->can_unload + ? -1L : (long)atomic_read(&mod->uc.usecount))); + + if (mod->flags & MOD_DELETED) + seq_puts(m, " (deleted)"); + else if (mod->flags & MOD_RUNNING) { + if (mod->flags & MOD_AUTOCLEAN) + seq_puts(m, " (autoclean)"); + if (!(mod->flags & MOD_USED_ONCE)) + seq_puts(m, " (unused)"); + } else if (mod->flags & MOD_INITIALIZING) + seq_puts(m, " (initializing)"); + else + seq_puts(m, " (uninitialized)"); + if (ref) { + char c; + seq_putc(m, ' '); + for (c = '[' ; ref; c = ' ', ref = ref->next_ref) + seq_printf(m, "%c%s", c, ref->ref->name); + seq_putc(m, ']'); } - -fini: - return PAGE_SIZE - left; + seq_putc(m, '\n'); + return 0; } +struct seq_operations modules_op = { + start: m_start, + next: m_next, + stop: m_stop, + show: m_show +}; /* * Called by the /proc file system to return a current list of ksyms. diff --git a/kernel/sched.c b/kernel/sched.c index 6fc59ef6d..c8b01155f 100644 --- a/kernel/sched.c +++ b/kernel/sched.c @@ -18,6 +18,7 @@ #include <asm/uaccess.h> #include <linux/smp_lock.h> #include <linux/interrupt.h> +#include <linux/completion.h> #include <asm/mmu_context.h> #define BITMAP_SIZE ((((MAX_PRIO+7)/8)+sizeof(long)-1)/sizeof(long)) @@ -61,10 +62,12 @@ static inline runqueue_t *lock_task_rq(task_t *p, unsigned long *flags) struct runqueue *__rq; repeat_lock_task: + preempt_disable(); __rq = task_rq(p); spin_lock_irqsave(&__rq->lock, *flags); if (unlikely(__rq != task_rq(p))) { spin_unlock_irqrestore(&__rq->lock, *flags); + preempt_enable(); goto repeat_lock_task; } return __rq; @@ -73,6 +76,7 @@ repeat_lock_task: static inline void unlock_task_rq(runqueue_t *rq, unsigned long *flags) { spin_unlock_irqrestore(&rq->lock, *flags); + preempt_enable(); } /* * Adding/removing a task to/from a priority array: @@ -195,6 +199,7 @@ static inline void resched_task(task_t *p) #ifdef CONFIG_SMP int need_resched, nrpolling; + preempt_disable(); /* minimise the chance of sending an interrupt to poll_idle() */ nrpolling = test_tsk_thread_flag(p,TIF_POLLING_NRFLAG); need_resched = test_and_set_tsk_thread_flag(p,TIF_NEED_RESCHED); @@ -202,6 +207,7 @@ static inline void resched_task(task_t *p) if (!need_resched && !nrpolling && (p->thread_info->cpu != smp_processor_id())) smp_send_reschedule(p->thread_info->cpu); + preempt_enable(); #else set_tsk_need_resched(p); #endif @@ -219,6 +225,7 @@ void wait_task_inactive(task_t * p) runqueue_t *rq; repeat: + preempt_disable(); rq = task_rq(p); while (unlikely(rq->curr == p)) { cpu_relax(); @@ -227,9 +234,11 @@ repeat: rq = lock_task_rq(p, &flags); if (unlikely(rq->curr == p)) { unlock_task_rq(rq, &flags); + preempt_enable(); goto repeat; } unlock_task_rq(rq, &flags); + preempt_enable(); } /* @@ -295,7 +304,10 @@ int wake_up_process(task_t * p) void wake_up_forked_process(task_t * p) { - runqueue_t *rq = this_rq(); + runqueue_t *rq; + + preempt_disable(); + rq = this_rq(); p->state = TASK_RUNNING; if (!rt_task(p)) { @@ -308,6 +320,7 @@ void wake_up_forked_process(task_t * p) p->thread_info->cpu = smp_processor_id(); activate_task(p, rq); spin_unlock_irq(&rq->lock); + preempt_enable(); } asmlinkage void schedule_tail(task_t *prev) @@ -635,17 +648,31 @@ void scheduling_functions_start_here(void) { } */ asmlinkage void schedule(void) { - task_t *prev = current, *next; - runqueue_t *rq = this_rq(); + task_t *prev, *next; + runqueue_t *rq; prio_array_t *array; list_t *queue; int idx; if (unlikely(in_interrupt())) BUG(); + + preempt_disable(); + prev = current; + rq = this_rq(); + release_kernel_lock(prev, smp_processor_id()); spin_lock_irq(&rq->lock); +#ifdef CONFIG_PREEMPT + /* + * if entering from preempt_schedule, off a kernel preemption, + * go straight to picking the next task. + */ + if (unlikely(preempt_get_count() & PREEMPT_ACTIVE)) + goto pick_next_task; +#endif + switch (prev->state) { case TASK_RUNNING: prev->sleep_timestamp = jiffies; @@ -659,7 +686,7 @@ asmlinkage void schedule(void) default: deactivate_task(prev, rq); } -#if CONFIG_SMP +#if CONFIG_SMP || CONFIG_PREEMPT pick_next_task: #endif if (unlikely(!rq->nr_running)) { @@ -707,9 +734,25 @@ switch_tasks: spin_unlock_irq(&rq->lock); reacquire_kernel_lock(current); + preempt_enable_no_resched(); return; } +#ifdef CONFIG_PREEMPT +/* + * this is is the entry point to schedule() from in-kernel preemption. + */ +asmlinkage void preempt_schedule(void) +{ + do { + current_thread_info()->preempt_count += PREEMPT_ACTIVE; + schedule(); + current_thread_info()->preempt_count -= PREEMPT_ACTIVE; + barrier(); + } while (test_thread_flag(TIF_NEED_RESCHED)); +} +#endif /* CONFIG_PREEMPT */ + /* * The core wakeup function. Non-exclusive wakeups (nr_exclusive == 0) just * wake everything up. If it's an exclusive wakeup (nr_exclusive == small +ve @@ -1105,9 +1148,12 @@ out_unlock: asmlinkage long sys_sched_yield(void) { - runqueue_t *rq = this_rq(); + runqueue_t *rq; prio_array_t *array; + preempt_disable(); + rq = this_rq(); + /* * Decrease the yielding task's priority by one, to avoid * livelocks. This priority loss is temporary, it's recovered @@ -1134,6 +1180,7 @@ asmlinkage long sys_sched_yield(void) __set_bit(current->prio, array->bitmap); } spin_unlock(&rq->lock); + preempt_enable_no_resched(); schedule(); diff --git a/kernel/signal.c b/kernel/signal.c index 74d783557..78a9be269 100644 --- a/kernel/signal.c +++ b/kernel/signal.c @@ -13,6 +13,7 @@ #include <linux/smp_lock.h> #include <linux/init.h> #include <linux/sched.h> +#include <linux/fs.h> #include <asm/uaccess.h> diff --git a/kernel/sys.c b/kernel/sys.c index 21c21ca8b..15e7e3455 100644 --- a/kernel/sys.c +++ b/kernel/sys.c @@ -14,6 +14,7 @@ #include <linux/prctl.h> #include <linux/init.h> #include <linux/highuid.h> +#include <linux/fs.h> #include <asm/uaccess.h> #include <asm/io.h> diff --git a/kernel/time.c b/kernel/time.c index 461a87de3..8c5450db7 100644 --- a/kernel/time.c +++ b/kernel/time.c @@ -24,7 +24,6 @@ * (Even though the technical memorandum forbids it) */ -#include <linux/mm.h> #include <linux/timex.h> #include <linux/smp_lock.h> diff --git a/mm/filemap.c b/mm/filemap.c index 7fdfbdf97..16b924b0c 100644 --- a/mm/filemap.c +++ b/mm/filemap.c @@ -24,6 +24,7 @@ #include <linux/mm.h> #include <linux/iobuf.h> #include <linux/compiler.h> +#include <linux/fs.h> #include <asm/pgalloc.h> #include <asm/uaccess.h> diff --git a/mm/mprotect.c b/mm/mprotect.c index 895ba466e..d6cd10db9 100644 --- a/mm/mprotect.c +++ b/mm/mprotect.c @@ -8,6 +8,7 @@ #include <linux/smp_lock.h> #include <linux/shm.h> #include <linux/mman.h> +#include <linux/fs.h> #include <asm/uaccess.h> #include <asm/pgalloc.h> diff --git a/mm/mremap.c b/mm/mremap.c index 0a42e05cb..055cdfa0f 100644 --- a/mm/mremap.c +++ b/mm/mremap.c @@ -10,6 +10,7 @@ #include <linux/shm.h> #include <linux/mman.h> #include <linux/swap.h> +#include <linux/fs.h> #include <asm/uaccess.h> #include <asm/pgalloc.h> @@ -49,7 +49,8 @@ * constructors and destructors are called without any locking. * Several members in kmem_cache_t and slab_t never change, they * are accessed without any locking. - * The per-cpu arrays are never accessed from the wrong cpu, no locking. + * The per-cpu arrays are never accessed from the wrong cpu, no locking, + * and local interrupts are disabled so slab code is preempt-safe. * The non-constant members are protected with a per-cache irq spinlock. * * Further notes from the original documentation: @@ -75,6 +76,7 @@ #include <linux/interrupt.h> #include <linux/init.h> #include <linux/compiler.h> +#include <linux/seq_file.h> #include <asm/uaccess.h> /* @@ -1869,31 +1871,56 @@ out: } #ifdef CONFIG_PROC_FS -/* /proc/slabinfo - * cache-name num-active-objs total-objs - * obj-size num-active-slabs total-slabs - * num-pages-per-slab - */ -#define FIXUP(t) \ - do { \ - if (len <= off) { \ - off -= len; \ - len = 0; \ - } else { \ - if (len-off > count) \ - goto t; \ - } \ - } while (0) -static int proc_getdata (char*page, char**start, off_t off, int count) +static void *s_start(struct seq_file *m, loff_t *pos) { + loff_t n = *pos; struct list_head *p; - int len = 0; - /* Output format version, so at least we can change it without _too_ - * many complaints. - */ - len += sprintf(page+len, "slabinfo - version: 1.1" + down(&cache_chain_sem); + if (!n) + return (void *)1; + p = &cache_cache.next; + while (--n) { + p = p->next; + if (p == &cache_cache.next) + return NULL; + } + return list_entry(p, kmem_cache_t, next); +} + +static void *s_next(struct seq_file *m, void *p, loff_t *pos) +{ + kmem_cache_t *cachep = p; + ++*pos; + if (p == (void *)1) + return &cache_cache; + cachep = list_entry(cachep->next.next, kmem_cache_t, next); + return cachep == &cache_cache ? NULL : cachep; +} + +static void s_stop(struct seq_file *m, void *p) +{ + up(&cache_chain_sem); +} + +static int s_show(struct seq_file *m, void *p) +{ + kmem_cache_t *cachep = p; + struct list_head *q; + slab_t *slabp; + unsigned long active_objs; + unsigned long num_objs; + unsigned long active_slabs = 0; + unsigned long num_slabs; + const char *name; + + if (p == (void*)1) { + /* + * Output format version, so at least we can change it + * without _too_ many complaints. + */ + seq_puts(m, "slabinfo - version: 1.1" #if STATS " (statistics)" #endif @@ -1901,116 +1928,89 @@ static int proc_getdata (char*page, char**start, off_t off, int count) " (SMP)" #endif "\n"); - FIXUP(got_data); - - down(&cache_chain_sem); - p = &cache_cache.next; - do { - kmem_cache_t *cachep; - struct list_head *q; - slab_t *slabp; - unsigned long active_objs; - unsigned long num_objs; - unsigned long active_slabs = 0; - unsigned long num_slabs; - const char *name; - cachep = list_entry(p, kmem_cache_t, next); + return 0; + } - spin_lock_irq(&cachep->spinlock); - active_objs = 0; - num_slabs = 0; - list_for_each(q,&cachep->slabs_full) { - slabp = list_entry(q, slab_t, list); - if (slabp->inuse != cachep->num) - BUG(); - active_objs += cachep->num; - active_slabs++; - } - list_for_each(q,&cachep->slabs_partial) { - slabp = list_entry(q, slab_t, list); - if (slabp->inuse == cachep->num || !slabp->inuse) - BUG(); - active_objs += slabp->inuse; - active_slabs++; - } - list_for_each(q,&cachep->slabs_free) { - slabp = list_entry(q, slab_t, list); - if (slabp->inuse) - BUG(); - num_slabs++; - } - num_slabs+=active_slabs; - num_objs = num_slabs*cachep->num; + spin_lock_irq(&cachep->spinlock); + active_objs = 0; + num_slabs = 0; + list_for_each(q,&cachep->slabs_full) { + slabp = list_entry(q, slab_t, list); + if (slabp->inuse != cachep->num) + BUG(); + active_objs += cachep->num; + active_slabs++; + } + list_for_each(q,&cachep->slabs_partial) { + slabp = list_entry(q, slab_t, list); + if (slabp->inuse == cachep->num || !slabp->inuse) + BUG(); + active_objs += slabp->inuse; + active_slabs++; + } + list_for_each(q,&cachep->slabs_free) { + slabp = list_entry(q, slab_t, list); + if (slabp->inuse) + BUG(); + num_slabs++; + } + num_slabs+=active_slabs; + num_objs = num_slabs*cachep->num; - name = cachep->name; - { - char tmp; - if (__get_user(tmp, name)) - name = "broken"; - } + name = cachep->name; + { + char tmp; + if (__get_user(tmp, name)) + name = "broken"; + } - len += sprintf(page+len, "%-17s %6lu %6lu %6u %4lu %4lu %4u", - name, active_objs, num_objs, cachep->objsize, - active_slabs, num_slabs, (1<<cachep->gfporder)); + seq_printf(m, "%-17s %6lu %6lu %6u %4lu %4lu %4u", + name, active_objs, num_objs, cachep->objsize, + active_slabs, num_slabs, (1<<cachep->gfporder)); #if STATS - { - unsigned long errors = cachep->errors; - unsigned long high = cachep->high_mark; - unsigned long grown = cachep->grown; - unsigned long reaped = cachep->reaped; - unsigned long allocs = cachep->num_allocations; - - len += sprintf(page+len, " : %6lu %7lu %5lu %4lu %4lu", - high, allocs, grown, reaped, errors); - } + { + unsigned long errors = cachep->errors; + unsigned long high = cachep->high_mark; + unsigned long grown = cachep->grown; + unsigned long reaped = cachep->reaped; + unsigned long allocs = cachep->num_allocations; + + seq_printf(m, " : %6lu %7lu %5lu %4lu %4lu", + high, allocs, grown, reaped, errors); + } #endif #ifdef CONFIG_SMP - { - unsigned int batchcount = cachep->batchcount; - unsigned int limit; - - if (cc_data(cachep)) - limit = cc_data(cachep)->limit; - else - limit = 0; - len += sprintf(page+len, " : %4u %4u", - limit, batchcount); - } + { + unsigned int batchcount = cachep->batchcount; + unsigned int limit; + + if (cc_data(cachep)) + limit = cc_data(cachep)->limit; + else + limit = 0; + seq_printf(m, " : %4u %4u", limit, batchcount); + } #endif #if STATS && defined(CONFIG_SMP) - { - unsigned long allochit = atomic_read(&cachep->allochit); - unsigned long allocmiss = atomic_read(&cachep->allocmiss); - unsigned long freehit = atomic_read(&cachep->freehit); - unsigned long freemiss = atomic_read(&cachep->freemiss); - len += sprintf(page+len, " : %6lu %6lu %6lu %6lu", - allochit, allocmiss, freehit, freemiss); - } + { + unsigned long allochit = atomic_read(&cachep->allochit); + unsigned long allocmiss = atomic_read(&cachep->allocmiss); + unsigned long freehit = atomic_read(&cachep->freehit); + unsigned long freemiss = atomic_read(&cachep->freemiss); + seq_printf(m, " : %6lu %6lu %6lu %6lu", + allochit, allocmiss, freehit, freemiss); + } #endif - len += sprintf(page+len,"\n"); - spin_unlock_irq(&cachep->spinlock); - FIXUP(got_data_up); - p = cachep->next.next; - } while (p != &cache_cache.next); -got_data_up: - up(&cache_chain_sem); - -got_data: - *start = page+off; - return len; + spin_unlock_irq(&cachep->spinlock); + seq_putc(m, '\n'); + return 0; } /** - * slabinfo_read_proc - generates /proc/slabinfo - * @page: scratch area, one page long - * @start: pointer to the pointer to the output buffer - * @off: offset within /proc/slabinfo the caller is interested in - * @count: requested len in bytes - * @eof: eof marker - * @data: unused + * slabinfo_op - iterator that generates /proc/slabinfo * - * The contents of the buffer are + * Output layout: * cache-name * num-active-objs * total-objs @@ -2020,28 +2020,24 @@ got_data: * num-pages-per-slab * + further values on SMP and with statistics enabled */ -int slabinfo_read_proc (char *page, char **start, off_t off, - int count, int *eof, void *data) -{ - int len = proc_getdata(page, start, off, count); - len -= (*start-page); - if (len <= count) - *eof = 1; - if (len>count) len = count; - if (len<0) len = 0; - return len; -} + +struct seq_operations slabinfo_op = { + start: s_start, + next: s_next, + stop: s_stop, + show: s_show +}; #define MAX_SLABINFO_WRITE 128 /** - * slabinfo_write_proc - SMP tuning for the slab allocator + * slabinfo_write - SMP tuning for the slab allocator * @file: unused * @buffer: user buffer * @count: data len * @data: unused */ -int slabinfo_write_proc (struct file *file, const char *buffer, - unsigned long count, void *data) +ssize_t slabinfo_write(struct file *file, const char *buffer, + size_t count, loff_t *ppos) { #ifdef CONFIG_SMP char kbuf[MAX_SLABINFO_WRITE+1], *tmp; diff --git a/net/socket.c b/net/socket.c index 2965aa8d0..588328c30 100644 --- a/net/socket.c +++ b/net/socket.c @@ -132,7 +132,7 @@ static struct file_operations socket_file_ops = { static struct net_proto_family *net_families[NPROTO]; -#ifdef CONFIG_SMP +#if defined(CONFIG_SMP) || defined(CONFIG_PREEMPT) static atomic_t net_family_lockct = ATOMIC_INIT(0); static spinlock_t net_family_lock = SPIN_LOCK_UNLOCKED; diff --git a/net/sunrpc/svcauth.c b/net/sunrpc/svcauth.c index 42813acfa..3b0c40040 100644 --- a/net/sunrpc/svcauth.c +++ b/net/sunrpc/svcauth.c @@ -15,6 +15,7 @@ #include <linux/sunrpc/xdr.h> #include <linux/sunrpc/svcauth.h> #include <linux/sunrpc/svcsock.h> +#include <linux/err.h> #define RPCDBG_FACILITY RPCDBG_AUTH |