aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeff Garzik <jeff@garzik.org>2006-03-11 19:21:17 -0500
committerJeff Garzik <jeff@garzik.org>2006-03-11 19:21:17 -0500
commitce1e7a2ac721eb9d825b63f74752d0c9e0c635c2 (patch)
treea7c0d18d6486734dffb9498e30db5b226b6e23bf
parentc2956a3b0d1c17b38da369811a6ce93eb7a01a04 (diff)
parent75deb6fa985bd3162b9472f1fc394e23294da816 (diff)
Merge branch 'upstream'
-rw-r--r--CREDITS6
-rw-r--r--Documentation/dvb/bt8xx.txt6
-rw-r--r--Documentation/feature-removal-schedule.txt9
-rw-r--r--Documentation/kernel-parameters.txt19
-rw-r--r--Documentation/video4linux/CARDLIST.saa71344
-rw-r--r--MAINTAINERS5
-rw-r--r--Makefile2
-rw-r--r--arch/alpha/kernel/irq.c7
-rw-r--r--arch/arm/Kconfig2
-rw-r--r--arch/arm/kernel/time.c10
-rw-r--r--arch/arm/mach-ixp4xx/nas100d-power.c3
-rw-r--r--arch/arm/mm/tlb-v6.S1
-rw-r--r--arch/h8300/kernel/process.c3
-rw-r--r--arch/i386/kernel/Makefile2
-rw-r--r--arch/i386/kernel/acpi/Makefile2
-rw-r--r--arch/i386/kernel/acpi/boot.c3
-rw-r--r--arch/i386/kernel/acpi/earlyquirk.c8
-rw-r--r--arch/i386/kernel/cpu/common.c4
-rw-r--r--arch/i386/kernel/efi.c14
-rw-r--r--arch/i386/kernel/io_apic.c19
-rw-r--r--arch/i386/kernel/machine_kexec.c14
-rw-r--r--arch/i386/kernel/nmi.c4
-rw-r--r--arch/i386/kernel/setup.c4
-rw-r--r--arch/i386/kernel/time.c4
-rw-r--r--arch/ia64/configs/gensparse_defconfig12
-rw-r--r--arch/ia64/kernel/cyclone.c2
-rw-r--r--arch/ia64/kernel/ivt.S15
-rw-r--r--arch/ia64/kernel/mca_drv.c16
-rw-r--r--arch/ia64/sn/kernel/sn2/sn2_smp.c2
-rw-r--r--arch/ia64/sn/kernel/tiocx.c2
-rw-r--r--arch/mips/Kconfig4
-rw-r--r--arch/mips/Makefile1
-rw-r--r--arch/mips/arc/arc_con.c2
-rw-r--r--arch/mips/kernel/irq-mv6434x.c8
-rw-r--r--arch/mips/kernel/time.c5
-rw-r--r--arch/mips/kernel/vmlinux.lds.S4
-rw-r--r--arch/mips/mm/tlbex.c34
-rw-r--r--arch/mips/momentum/jaguar_atx/prom.c2
-rw-r--r--arch/mips/momentum/jaguar_atx/setup.c5
-rw-r--r--arch/mips/momentum/ocelot_c/irq.c2
-rw-r--r--arch/mips/momentum/ocelot_c/prom.c2
-rw-r--r--arch/mips/momentum/ocelot_c/setup.c27
-rw-r--r--arch/mips/pci/pci-ocelot-c.c6
-rw-r--r--arch/powerpc/kernel/asm-offsets.c1
-rw-r--r--arch/powerpc/kernel/cputable.c9
-rw-r--r--arch/powerpc/kernel/entry_32.S95
-rw-r--r--arch/powerpc/kernel/entry_64.S94
-rw-r--r--arch/powerpc/kernel/head_64.S3
-rw-r--r--arch/powerpc/kernel/prom_init.c2
-rw-r--r--arch/powerpc/kernel/ptrace.c5
-rw-r--r--arch/powerpc/kernel/signal_32.c19
-rw-r--r--arch/powerpc/kernel/signal_64.c9
-rw-r--r--arch/powerpc/kernel/systbl.S2
-rw-r--r--arch/powerpc/kernel/traps.c2
-rw-r--r--arch/powerpc/platforms/powermac/pfunc_base.c5
-rw-r--r--arch/powerpc/platforms/powermac/pfunc_core.c6
-rw-r--r--arch/powerpc/platforms/powermac/smp.c2
-rw-r--r--arch/ppc/kernel/asm-offsets.c1
-rw-r--r--arch/ppc/kernel/entry.S95
-rw-r--r--arch/s390/lib/spinlock.c15
-rw-r--r--arch/s390/lib/uaccess.S6
-rw-r--r--arch/s390/lib/uaccess64.S6
-rw-r--r--arch/sh/Kconfig4
-rw-r--r--arch/sparc64/kernel/sys32.S2
-rw-r--r--arch/sparc64/kernel/una_asm.S4
-rw-r--r--arch/sparc64/lib/U1copy_from_user.S2
-rw-r--r--arch/sparc64/lib/U1copy_to_user.S2
-rw-r--r--arch/sparc64/lib/U3copy_from_user.S2
-rw-r--r--arch/sparc64/lib/U3copy_to_user.S2
-rw-r--r--arch/sparc64/lib/bzero.S2
-rw-r--r--arch/sparc64/lib/copy_in_user.S2
-rw-r--r--arch/sparc64/lib/csum_copy_from_user.S2
-rw-r--r--arch/sparc64/lib/csum_copy_to_user.S2
-rw-r--r--arch/sparc64/lib/strlen_user.S2
-rw-r--r--arch/sparc64/lib/strncpy_from_user.S2
-rw-r--r--arch/sparc64/solaris/entry64.S2
-rw-r--r--arch/v850/kernel/process.c3
-rw-r--r--arch/x86_64/kernel/machine_kexec.c2
-rw-r--r--arch/xtensa/Kconfig4
-rw-r--r--arch/xtensa/kernel/process.c3
-rw-r--r--block/ll_rw_blk.c33
-rw-r--r--drivers/atm/fore200e.c36
-rw-r--r--drivers/block/DAC960.c3
-rw-r--r--drivers/char/hw_random.c2
-rw-r--r--drivers/char/mmtimer.c2
-rw-r--r--drivers/char/pcmcia/cm4000_cs.c24
-rw-r--r--drivers/char/pcmcia/cm4040_cs.c23
-rw-r--r--drivers/edac/Kconfig18
-rw-r--r--drivers/edac/edac_mc.c12
-rw-r--r--drivers/firmware/dcdbas.c8
-rw-r--r--drivers/ide/legacy/ide-cs.c1
-rw-r--r--drivers/infiniband/ulp/srp/ib_srp.c6
-rw-r--r--drivers/input/mouse/psmouse-base.c2
-rw-r--r--drivers/isdn/hisax/config.c2
-rw-r--r--drivers/isdn/hisax/hfc_pci.c2
-rw-r--r--drivers/isdn/hisax/hfc_usb.c32
-rw-r--r--drivers/isdn/i4l/isdn_tty.c1
-rw-r--r--drivers/macintosh/windfarm_core.c7
-rw-r--r--drivers/macintosh/windfarm_cpufreq_clamp.c8
-rw-r--r--drivers/macintosh/windfarm_lm75_sensor.c32
-rw-r--r--drivers/macintosh/windfarm_max6690_sensor.c25
-rw-r--r--drivers/macintosh/windfarm_pid.c4
-rw-r--r--drivers/macintosh/windfarm_pm112.c8
-rw-r--r--drivers/md/raid1.c13
-rw-r--r--drivers/media/dvb/b2c2/flexcop-fe-tuner.c2
-rw-r--r--drivers/media/dvb/bt8xx/bt878.c2
-rw-r--r--drivers/media/dvb/bt8xx/dst.c2
-rw-r--r--drivers/media/dvb/dvb-core/demux.h2
-rw-r--r--drivers/media/dvb/dvb-usb/cxusb.c8
-rw-r--r--drivers/media/dvb/dvb-usb/dvb-usb-init.c2
-rw-r--r--drivers/media/dvb/dvb-usb/dvb-usb.h2
-rw-r--r--drivers/media/dvb/frontends/Kconfig2
-rw-r--r--drivers/media/dvb/frontends/mt312.c116
-rw-r--r--drivers/media/dvb/frontends/mt312.h6
-rw-r--r--drivers/media/dvb/frontends/stv0297.c4
-rw-r--r--drivers/media/dvb/ttpci/av7110.c9
-rw-r--r--drivers/media/dvb/ttpci/av7110_hw.c3
-rw-r--r--drivers/media/dvb/ttpci/av7110_ir.c4
-rw-r--r--drivers/media/video/cpia.c2
-rw-r--r--drivers/media/video/cx25840/cx25840-core.c4
-rw-r--r--drivers/media/video/saa7115.c4
-rw-r--r--drivers/media/video/saa7134/saa7134-alsa.c4
-rw-r--r--drivers/media/video/saa7134/saa7134-cards.c21
-rw-r--r--drivers/media/video/saa7134/saa7134-dvb.c12
-rw-r--r--drivers/media/video/tda8290.c8
-rw-r--r--drivers/media/video/tuner-core.c5
-rw-r--r--drivers/media/video/videocodec.h2
-rw-r--r--drivers/media/video/zr36050.c2
-rw-r--r--drivers/media/video/zr36060.c2
-rw-r--r--drivers/media/video/zr36120_i2c.c2
-rw-r--r--drivers/misc/ibmasm/ibmasm.h9
-rw-r--r--drivers/mmc/au1xmmc.c24
-rw-r--r--drivers/mtd/redboot.c22
-rw-r--r--drivers/net/chelsio/espi.c4
-rw-r--r--drivers/net/e1000/e1000.h3
-rw-r--r--drivers/net/e1000/e1000_main.c119
-rw-r--r--drivers/net/pcmcia/axnet_cs.c1
-rw-r--r--drivers/net/s2io.c1
-rw-r--r--drivers/net/tg3.c87
-rw-r--r--drivers/net/wireless/hostap/hostap_cs.c5
-rw-r--r--drivers/parport/parport_serial.c11
-rw-r--r--drivers/pcmcia/ds.c40
-rw-r--r--drivers/s390/block/dasd.c38
-rw-r--r--drivers/s390/block/dasd_genhd.c2
-rw-r--r--drivers/s390/block/dasd_int.h7
-rw-r--r--drivers/s390/block/dasd_proc.c3
-rw-r--r--drivers/s390/cio/chsc.c5
-rw-r--r--drivers/s390/net/smsgiucv.c2
-rw-r--r--drivers/scsi/ahci.c14
-rw-r--r--drivers/scsi/ata_piix.c315
-rw-r--r--drivers/scsi/libata-core.c1003
-rw-r--r--drivers/scsi/libata-scsi.c2
-rw-r--r--drivers/scsi/libata.h1
-rw-r--r--drivers/scsi/sata_promise.c2
-rw-r--r--drivers/scsi/sata_sil.c99
-rw-r--r--drivers/scsi/sata_sil24.c1
-rw-r--r--drivers/scsi/sr_ioctl.c2
-rw-r--r--drivers/serial/ioc4_serial.c6
-rw-r--r--drivers/serial/ip22zilog.c4
-rw-r--r--drivers/serial/serial_core.c32
-rw-r--r--drivers/serial/sn_console.c2
-rw-r--r--drivers/usb/serial/usb-serial.c10
-rw-r--r--drivers/video/arcfb.c5
-rw-r--r--drivers/video/aty/aty128fb.c7
-rw-r--r--drivers/video/aty/radeon_monitor.c4
-rw-r--r--drivers/video/backlight/backlight.c2
-rw-r--r--drivers/video/backlight/lcd.c2
-rw-r--r--drivers/video/imsttfb.c2
-rw-r--r--drivers/video/intelfb/intelfbdrv.c50
-rw-r--r--drivers/video/kyro/STG4000VTG.c2
-rw-r--r--drivers/video/neofb.c4
-rw-r--r--drivers/video/s1d13xxxfb.c3
-rw-r--r--drivers/video/savage/savagefb_driver.c2
-rw-r--r--drivers/video/tdfxfb.c42
-rw-r--r--fs/9p/9p.c1
-rw-r--r--fs/9p/fid.c145
-rw-r--r--fs/9p/fid.h6
-rw-r--r--fs/9p/trans_fd.c1
-rw-r--r--fs/9p/v9fs.c1
-rw-r--r--fs/9p/v9fs_vfs.h1
-rw-r--r--fs/9p/vfs_dentry.c45
-rw-r--r--fs/9p/vfs_file.c106
-rw-r--r--fs/9p/vfs_inode.c476
-rw-r--r--fs/9p/vfs_super.c10
-rw-r--r--fs/cifs/cifsproto.h2
-rw-r--r--fs/cifs/connect.c2
-rw-r--r--fs/cifs/misc.c4
-rw-r--r--fs/compat_ioctl.c2
-rw-r--r--fs/cramfs/inode.c60
-rw-r--r--fs/dcache.c2
-rw-r--r--fs/ext3/inode.c17
-rw-r--r--fs/ext3/namei.c3
-rw-r--r--fs/fifo.c7
-rw-r--r--fs/file_table.c87
-rw-r--r--fs/jffs2/nodelist.c3
-rw-r--r--fs/jffs2/readinode.c2
-rw-r--r--fs/jffs2/scan.c2
-rw-r--r--fs/namei.c13
-rw-r--r--fs/ocfs2/cluster/masklog.c1
-rw-r--r--fs/ocfs2/cluster/masklog.h2
-rw-r--r--fs/ocfs2/cluster/nodemanager.c4
-rw-r--r--fs/ocfs2/cluster/tcp.c14
-rw-r--r--fs/ocfs2/cluster/tcp.h5
-rw-r--r--fs/ocfs2/dlm/dlmcommon.h8
-rw-r--r--fs/ocfs2/dlm/dlmdebug.c12
-rw-r--r--fs/ocfs2/dlm/dlmdomain.c39
-rw-r--r--fs/ocfs2/dlm/dlmmaster.c4
-rw-r--r--fs/ocfs2/dlm/dlmrecovery.c23
-rw-r--r--fs/ocfs2/extent_map.c38
-rw-r--r--fs/ocfs2/file.c51
-rw-r--r--fs/ocfs2/heartbeat.c1
-rw-r--r--fs/ocfs2/inode.c46
-rw-r--r--fs/ocfs2/journal.c124
-rw-r--r--fs/ocfs2/ocfs2.h7
-rw-r--r--fs/ocfs2/ocfs2_fs.h1
-rw-r--r--fs/ocfs2/super.c11
-rw-r--r--fs/partitions/ibm.c16
-rw-r--r--fs/pipe.c6
-rw-r--r--fs/proc/task_mmu.c11
-rw-r--r--fs/ramfs/inode.c1
-rw-r--r--fs/reiserfs/file.c14
-rw-r--r--fs/reiserfs/inode.c8
-rw-r--r--fs/reiserfs/journal.c3
-rw-r--r--fs/reiserfs/namei.c8
-rw-r--r--fs/udf/inode.c16
-rw-r--r--fs/udf/super.c18
-rw-r--r--fs/udf/udf_sb.h4
-rw-r--r--include/asm-arm/tlbflush.h6
-rw-r--r--include/asm-generic/unaligned.h4
-rw-r--r--include/asm-i386/apic.h2
-rw-r--r--include/asm-m68k/atomic.h35
-rw-r--r--include/asm-mips/vga.h3
-rw-r--r--include/asm-powerpc/cputable.h2
-rw-r--r--include/asm-powerpc/eeh.h3
-rw-r--r--include/asm-powerpc/kexec.h3
-rw-r--r--include/asm-powerpc/pgtable-4k.h2
-rw-r--r--include/asm-powerpc/thread_info.h8
-rw-r--r--include/asm-s390/system.h2
-rw-r--r--include/asm-sparc64/futex.h2
-rw-r--r--include/asm-sparc64/uaccess.h12
-rw-r--r--include/linux/compat_ioctl.h2
-rw-r--r--include/linux/file.h2
-rw-r--r--include/linux/fs.h6
-rw-r--r--include/linux/gfp.h4
-rw-r--r--include/linux/hrtimer.h4
-rw-r--r--include/linux/kmalloc_sizes.h4
-rw-r--r--include/linux/libata.h36
-rw-r--r--include/linux/memory_hotplug.h4
-rw-r--r--include/linux/pci_ids.h2
-rw-r--r--include/linux/percpu_counter.h6
-rw-r--r--include/linux/rcupdate.h6
-rw-r--r--include/linux/reiserfs_fs.h2
-rw-r--r--include/linux/sched.h1
-rw-r--r--include/pcmcia/device_id.h9
-rw-r--r--kernel/fork.c4
-rw-r--r--kernel/hrtimer.c35
-rw-r--r--kernel/rcupdate.c76
-rw-r--r--kernel/sched.c10
-rw-r--r--kernel/sysctl.c7
-rw-r--r--kernel/timer.c22
-rw-r--r--mm/memory_hotplug.c1
-rw-r--r--mm/mempolicy.c129
-rw-r--r--mm/oom_kill.c3
-rw-r--r--mm/page_alloc.c17
-rw-r--r--mm/rmap.c3
-rw-r--r--mm/slab.c122
-rw-r--r--mm/swap.c25
-rw-r--r--mm/vmscan.c3
-rw-r--r--net/atm/signaling.c10
-rw-r--r--net/bridge/br_if.c33
-rw-r--r--net/bridge/br_stp_if.c2
-rw-r--r--net/dccp/ccids/ccid3.c10
-rw-r--r--net/ipv4/netfilter/ip_queue.c2
-rw-r--r--net/ipv6/netfilter/ip6_queue.c2
-rw-r--r--net/unix/af_unix.c2
-rw-r--r--scripts/mod/file2alias.c2
-rw-r--r--security/selinux/hooks.c2
-rw-r--r--sound/core/control.c6
278 files changed, 3199 insertions, 2259 deletions
diff --git a/CREDITS b/CREDITS
index 6957ef4efab3..64511e2abc8e 100644
--- a/CREDITS
+++ b/CREDITS
@@ -3643,11 +3643,9 @@ S: Cambridge. CB1 7EG
3643S: England 3643S: England
3644 3644
3645N: Chris Wright 3645N: Chris Wright
3646E: chrisw@osdl.org 3646E: chrisw@sous-sol.org
3647D: hacking on LSM framework and security modules. 3647D: hacking on LSM framework and security modules.
3648S: c/o OSDL 3648S: Portland, OR
3649S: 12725 SW Millikan Way, Suite 400
3650S: Beaverton, OR 97005
3651S: USA 3649S: USA
3652 3650
3653N: Michal Wronski 3651N: Michal Wronski
diff --git a/Documentation/dvb/bt8xx.txt b/Documentation/dvb/bt8xx.txt
index df6c05453cb5..52ed462061df 100644
--- a/Documentation/dvb/bt8xx.txt
+++ b/Documentation/dvb/bt8xx.txt
@@ -111,4 +111,8 @@ source: linux/Documentation/video4linux/CARDLIST.bttv
111If you have problems with this please do ask on the mailing list. 111If you have problems with this please do ask on the mailing list.
112 112
113-- 113--
114Authors: Richard Walker, Jamie Honan, Michael Hunold, Manu Abraham 114Authors: Richard Walker,
115 Jamie Honan,
116 Michael Hunold,
117 Manu Abraham,
118 Michael Krufky
diff --git a/Documentation/feature-removal-schedule.txt b/Documentation/feature-removal-schedule.txt
index be5ae600f533..81bc51369f59 100644
--- a/Documentation/feature-removal-schedule.txt
+++ b/Documentation/feature-removal-schedule.txt
@@ -180,3 +180,12 @@ Why: These events are not correct, and do not properly let userspace know
180 when a file system has been mounted or unmounted. Userspace should 180 when a file system has been mounted or unmounted. Userspace should
181 poll the /proc/mounts file instead to detect this properly. 181 poll the /proc/mounts file instead to detect this properly.
182Who: Greg Kroah-Hartman <gregkh@suse.de> 182Who: Greg Kroah-Hartman <gregkh@suse.de>
183
184---------------------------
185
186What: Support for NEC DDB5074 and DDB5476 evaluation boards.
187When: June 2006
188Why: Board specific code doesn't build anymore since ~2.6.0 and no
189 users have complained indicating there is no more need for these
190 boards. This should really be considered a last call.
191Who: Ralf Baechle <ralf@linux-mips.org>
diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt
index 75205391b335..fc99075e0af4 100644
--- a/Documentation/kernel-parameters.txt
+++ b/Documentation/kernel-parameters.txt
@@ -335,6 +335,12 @@ running once the system is up.
335 timesource is not avalible, it defaults to PIT. 335 timesource is not avalible, it defaults to PIT.
336 Format: { pit | tsc | cyclone | pmtmr } 336 Format: { pit | tsc | cyclone | pmtmr }
337 337
338 disable_8254_timer
339 enable_8254_timer
340 [IA32/X86_64] Disable/Enable interrupt 0 timer routing
341 over the 8254 in addition to over the IO-APIC. The
342 kernel tries to set a sensible default.
343
338 hpet= [IA-32,HPET] option to disable HPET and use PIT. 344 hpet= [IA-32,HPET] option to disable HPET and use PIT.
339 Format: disable 345 Format: disable
340 346
@@ -1284,6 +1290,19 @@ running once the system is up.
1284 New name for the ramdisk parameter. 1290 New name for the ramdisk parameter.
1285 See Documentation/ramdisk.txt. 1291 See Documentation/ramdisk.txt.
1286 1292
1293 rcu.blimit= [KNL,BOOT] Set maximum number of finished
1294 RCU callbacks to process in one batch.
1295
1296 rcu.qhimark= [KNL,BOOT] Set threshold of queued
1297 RCU callbacks over which batch limiting is disabled.
1298
1299 rcu.qlowmark= [KNL,BOOT] Set threshold of queued
1300 RCU callbacks below which batch limiting is re-enabled.
1301
1302 rcu.rsinterval= [KNL,BOOT,SMP] Set the number of additional
1303 RCU callbacks to queued before forcing reschedule
1304 on all cpus.
1305
1287 rdinit= [KNL] 1306 rdinit= [KNL]
1288 Format: <full_path> 1307 Format: <full_path>
1289 Run specified binary instead of /init from the ramdisk, 1308 Run specified binary instead of /init from the ramdisk,
diff --git a/Documentation/video4linux/CARDLIST.saa7134 b/Documentation/video4linux/CARDLIST.saa7134
index 8a352597830f..da4fb890165f 100644
--- a/Documentation/video4linux/CARDLIST.saa7134
+++ b/Documentation/video4linux/CARDLIST.saa7134
@@ -13,7 +13,7 @@
13 12 -> Medion 7134 [16be:0003] 13 12 -> Medion 7134 [16be:0003]
14 13 -> Typhoon TV+Radio 90031 14 13 -> Typhoon TV+Radio 90031
15 14 -> ELSA EX-VISION 300TV [1048:226b] 15 14 -> ELSA EX-VISION 300TV [1048:226b]
16 15 -> ELSA EX-VISION 500TV [1048:226b] 16 15 -> ELSA EX-VISION 500TV [1048:226a]
17 16 -> ASUS TV-FM 7134 [1043:4842,1043:4830,1043:4840] 17 16 -> ASUS TV-FM 7134 [1043:4842,1043:4830,1043:4840]
18 17 -> AOPEN VA1000 POWER [1131:7133] 18 17 -> AOPEN VA1000 POWER [1131:7133]
19 18 -> BMK MPEX No Tuner 19 18 -> BMK MPEX No Tuner
@@ -75,7 +75,7 @@
75 74 -> LifeView FlyTV Platinum Mini2 [14c0:1212] 75 74 -> LifeView FlyTV Platinum Mini2 [14c0:1212]
76 75 -> AVerMedia AVerTVHD MCE A180 [1461:1044] 76 75 -> AVerMedia AVerTVHD MCE A180 [1461:1044]
77 76 -> SKNet MonsterTV Mobile [1131:4ee9] 77 76 -> SKNet MonsterTV Mobile [1131:4ee9]
78 77 -> Pinnacle PCTV 110i (saa7133) [11bd:002e] 78 77 -> Pinnacle PCTV 40i/50i/110i (saa7133) [11bd:002e]
79 78 -> ASUSTeK P7131 Dual [1043:4862] 79 78 -> ASUSTeK P7131 Dual [1043:4862]
80 79 -> Sedna/MuchTV PC TV Cardbus TV/Radio (ITO25 Rev:2B) 80 79 -> Sedna/MuchTV PC TV Cardbus TV/Radio (ITO25 Rev:2B)
81 80 -> ASUS Digimatrix TV [1043:0210] 81 80 -> ASUS Digimatrix TV [1043:0210]
diff --git a/MAINTAINERS b/MAINTAINERS
index 9c592aa0280c..3d7d30dc5439 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -838,7 +838,6 @@ S: Maintained
838 838
839DVB SUBSYSTEM AND DRIVERS 839DVB SUBSYSTEM AND DRIVERS
840P: LinuxTV.org Project 840P: LinuxTV.org Project
841M: mchehab@infradead.org
842M: v4l-dvb-maintainer@linuxtv.org 841M: v4l-dvb-maintainer@linuxtv.org
843L: linux-dvb@linuxtv.org (subscription required) 842L: linux-dvb@linuxtv.org (subscription required)
844W: http://linuxtv.org/ 843W: http://linuxtv.org/
@@ -1632,8 +1631,8 @@ S: Supported
1632 1631
1633LINUX SECURITY MODULE (LSM) FRAMEWORK 1632LINUX SECURITY MODULE (LSM) FRAMEWORK
1634P: Chris Wright 1633P: Chris Wright
1635M: chrisw@osdl.org 1634M: chrisw@sous-sol.org
1636L: linux-security-module@wirex.com 1635L: linux-security-module@vger.kernel.org
1637W: http://lsm.immunix.org 1636W: http://lsm.immunix.org
1638T: git kernel.org:/pub/scm/linux/kernel/git/chrisw/lsm-2.6.git 1637T: git kernel.org:/pub/scm/linux/kernel/git/chrisw/lsm-2.6.git
1639S: Supported 1638S: Supported
diff --git a/Makefile b/Makefile
index 46eea76bc570..65a0337bebe0 100644
--- a/Makefile
+++ b/Makefile
@@ -905,7 +905,7 @@ define filechk_version.h
905 ) 905 )
906endef 906endef
907 907
908include/linux/version.h: $(srctree)/Makefile .config FORCE 908include/linux/version.h: $(srctree)/Makefile .config .kernelrelease FORCE
909 $(call filechk,version.h) 909 $(call filechk,version.h)
910 910
911# --------------------------------------------------------------------------- 911# ---------------------------------------------------------------------------
diff --git a/arch/alpha/kernel/irq.c b/arch/alpha/kernel/irq.c
index 9006063e7369..da677f829f76 100644
--- a/arch/alpha/kernel/irq.c
+++ b/arch/alpha/kernel/irq.c
@@ -151,8 +151,13 @@ handle_irq(int irq, struct pt_regs * regs)
151 } 151 }
152 152
153 irq_enter(); 153 irq_enter();
154 /*
155 * __do_IRQ() must be called with IPL_MAX. Note that we do not
156 * explicitly enable interrupts afterwards - some MILO PALcode
157 * (namely LX164 one) seems to have severe problems with RTI
158 * at IPL 0.
159 */
154 local_irq_disable(); 160 local_irq_disable();
155 __do_IRQ(irq, regs); 161 __do_IRQ(irq, regs);
156 local_irq_enable();
157 irq_exit(); 162 irq_exit();
158} 163}
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
index 15dc1a0dffbb..9f80fa502f8f 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -78,7 +78,7 @@ menu "System Type"
78 78
79choice 79choice
80 prompt "ARM system type" 80 prompt "ARM system type"
81 default ARCH_RPC 81 default ARCH_VERSATILE
82 82
83config ARCH_CLPS7500 83config ARCH_CLPS7500
84 bool "Cirrus-CL-PS7500FE" 84 bool "Cirrus-CL-PS7500FE"
diff --git a/arch/arm/kernel/time.c b/arch/arm/kernel/time.c
index d7d932c02866..d6bd435a6857 100644
--- a/arch/arm/kernel/time.c
+++ b/arch/arm/kernel/time.c
@@ -422,12 +422,14 @@ static int timer_dyn_tick_disable(void)
422void timer_dyn_reprogram(void) 422void timer_dyn_reprogram(void)
423{ 423{
424 struct dyn_tick_timer *dyn_tick = system_timer->dyn_tick; 424 struct dyn_tick_timer *dyn_tick = system_timer->dyn_tick;
425 unsigned long next, seq;
425 426
426 if (dyn_tick) { 427 if (dyn_tick && (dyn_tick->state & DYN_TICK_ENABLED)) {
427 write_seqlock(&xtime_lock); 428 next = next_timer_interrupt();
428 if (dyn_tick->state & DYN_TICK_ENABLED) 429 do {
430 seq = read_seqbegin(&xtime_lock);
429 dyn_tick->reprogram(next_timer_interrupt() - jiffies); 431 dyn_tick->reprogram(next_timer_interrupt() - jiffies);
430 write_sequnlock(&xtime_lock); 432 } while (read_seqretry(&xtime_lock, seq));
431 } 433 }
432} 434}
433 435
diff --git a/arch/arm/mach-ixp4xx/nas100d-power.c b/arch/arm/mach-ixp4xx/nas100d-power.c
index 2bec69bfa715..99d333d7ebdd 100644
--- a/arch/arm/mach-ixp4xx/nas100d-power.c
+++ b/arch/arm/mach-ixp4xx/nas100d-power.c
@@ -56,6 +56,9 @@ static int __init nas100d_power_init(void)
56 56
57static void __exit nas100d_power_exit(void) 57static void __exit nas100d_power_exit(void)
58{ 58{
59 if (!(machine_is_nas100d()))
60 return;
61
59 free_irq(NAS100D_RB_IRQ, NULL); 62 free_irq(NAS100D_RB_IRQ, NULL);
60} 63}
61 64
diff --git a/arch/arm/mm/tlb-v6.S b/arch/arm/mm/tlb-v6.S
index 6f76b89ef46e..fd6adde39091 100644
--- a/arch/arm/mm/tlb-v6.S
+++ b/arch/arm/mm/tlb-v6.S
@@ -80,6 +80,7 @@ ENTRY(v6wbi_flush_kern_tlb_range)
80 add r0, r0, #PAGE_SZ 80 add r0, r0, #PAGE_SZ
81 cmp r0, r1 81 cmp r0, r1
82 blo 1b 82 blo 1b
83 mcr p15, 0, r2, c7, c10, 4 @ data synchronization barrier
83 mov pc, lr 84 mov pc, lr
84 85
85 .section ".text.init", #alloc, #execinstr 86 .section ".text.init", #alloc, #execinstr
diff --git a/arch/h8300/kernel/process.c b/arch/h8300/kernel/process.c
index ed79ae20e88d..dd344f112cfe 100644
--- a/arch/h8300/kernel/process.c
+++ b/arch/h8300/kernel/process.c
@@ -45,6 +45,9 @@
45#include <asm/setup.h> 45#include <asm/setup.h>
46#include <asm/pgtable.h> 46#include <asm/pgtable.h>
47 47
48void (*pm_power_off)(void) = NULL;
49EXPORT_SYMBOL(pm_power_off);
50
48asmlinkage void ret_from_fork(void); 51asmlinkage void ret_from_fork(void);
49 52
50/* 53/*
diff --git a/arch/i386/kernel/Makefile b/arch/i386/kernel/Makefile
index 53bb9a79e274..65656c033d70 100644
--- a/arch/i386/kernel/Makefile
+++ b/arch/i386/kernel/Makefile
@@ -11,7 +11,7 @@ obj-y := process.o semaphore.o signal.o entry.o traps.o irq.o \
11 11
12obj-y += cpu/ 12obj-y += cpu/
13obj-y += timers/ 13obj-y += timers/
14obj-$(CONFIG_ACPI) += acpi/ 14obj-y += acpi/
15obj-$(CONFIG_X86_BIOS_REBOOT) += reboot.o 15obj-$(CONFIG_X86_BIOS_REBOOT) += reboot.o
16obj-$(CONFIG_MCA) += mca.o 16obj-$(CONFIG_MCA) += mca.o
17obj-$(CONFIG_X86_MSR) += msr.o 17obj-$(CONFIG_X86_MSR) += msr.o
diff --git a/arch/i386/kernel/acpi/Makefile b/arch/i386/kernel/acpi/Makefile
index d51c7313cae8..7e9ac99354f4 100644
--- a/arch/i386/kernel/acpi/Makefile
+++ b/arch/i386/kernel/acpi/Makefile
@@ -1,4 +1,4 @@
1obj-y := boot.o 1obj-$(CONFIG_ACPI) += boot.o
2obj-$(CONFIG_X86_IO_APIC) += earlyquirk.o 2obj-$(CONFIG_X86_IO_APIC) += earlyquirk.o
3obj-$(CONFIG_ACPI_SLEEP) += sleep.o wakeup.o 3obj-$(CONFIG_ACPI_SLEEP) += sleep.o wakeup.o
4 4
diff --git a/arch/i386/kernel/acpi/boot.c b/arch/i386/kernel/acpi/boot.c
index 79577f0ace98..f1a21945963d 100644
--- a/arch/i386/kernel/acpi/boot.c
+++ b/arch/i386/kernel/acpi/boot.c
@@ -1111,9 +1111,6 @@ int __init acpi_boot_table_init(void)
1111 disable_acpi(); 1111 disable_acpi();
1112 return error; 1112 return error;
1113 } 1113 }
1114#ifdef __i386__
1115 check_acpi_pci();
1116#endif
1117 1114
1118 acpi_table_parse(ACPI_BOOT, acpi_parse_sbf); 1115 acpi_table_parse(ACPI_BOOT, acpi_parse_sbf);
1119 1116
diff --git a/arch/i386/kernel/acpi/earlyquirk.c b/arch/i386/kernel/acpi/earlyquirk.c
index f1b9d2a46dab..2e3b643a4dc4 100644
--- a/arch/i386/kernel/acpi/earlyquirk.c
+++ b/arch/i386/kernel/acpi/earlyquirk.c
@@ -7,14 +7,22 @@
7#include <linux/pci.h> 7#include <linux/pci.h>
8#include <asm/pci-direct.h> 8#include <asm/pci-direct.h>
9#include <asm/acpi.h> 9#include <asm/acpi.h>
10#include <asm/apic.h>
10 11
11static int __init check_bridge(int vendor, int device) 12static int __init check_bridge(int vendor, int device)
12{ 13{
14#ifdef CONFIG_ACPI
13 /* According to Nvidia all timer overrides are bogus. Just ignore 15 /* According to Nvidia all timer overrides are bogus. Just ignore
14 them all. */ 16 them all. */
15 if (vendor == PCI_VENDOR_ID_NVIDIA) { 17 if (vendor == PCI_VENDOR_ID_NVIDIA) {
16 acpi_skip_timer_override = 1; 18 acpi_skip_timer_override = 1;
17 } 19 }
20#endif
21 if (vendor == PCI_VENDOR_ID_ATI && timer_over_8254 == 1) {
22 timer_over_8254 = 0;
23 printk(KERN_INFO "ATI board detected. Disabling timer routing "
24 "over 8254.\n");
25 }
18 return 0; 26 return 0;
19} 27}
20 28
diff --git a/arch/i386/kernel/cpu/common.c b/arch/i386/kernel/cpu/common.c
index 4ecd4b326ded..e6bd095ae108 100644
--- a/arch/i386/kernel/cpu/common.c
+++ b/arch/i386/kernel/cpu/common.c
@@ -278,10 +278,10 @@ void __devinit generic_identify(struct cpuinfo_x86 * c)
278 c->x86_capability[4] = excap; 278 c->x86_capability[4] = excap;
279 c->x86 = (tfms >> 8) & 15; 279 c->x86 = (tfms >> 8) & 15;
280 c->x86_model = (tfms >> 4) & 15; 280 c->x86_model = (tfms >> 4) & 15;
281 if (c->x86 == 0xf) { 281 if (c->x86 == 0xf)
282 c->x86 += (tfms >> 20) & 0xff; 282 c->x86 += (tfms >> 20) & 0xff;
283 if (c->x86 >= 0x6)
283 c->x86_model += ((tfms >> 16) & 0xF) << 4; 284 c->x86_model += ((tfms >> 16) & 0xF) << 4;
284 }
285 c->x86_mask = tfms & 15; 285 c->x86_mask = tfms & 15;
286 } else { 286 } else {
287 /* Have CPUID level 0 only - unheard of */ 287 /* Have CPUID level 0 only - unheard of */
diff --git a/arch/i386/kernel/efi.c b/arch/i386/kernel/efi.c
index e3e42fd62401..c9cad7ba0d2d 100644
--- a/arch/i386/kernel/efi.c
+++ b/arch/i386/kernel/efi.c
@@ -70,10 +70,13 @@ static void efi_call_phys_prelog(void)
70{ 70{
71 unsigned long cr4; 71 unsigned long cr4;
72 unsigned long temp; 72 unsigned long temp;
73 struct Xgt_desc_struct *cpu_gdt_descr;
73 74
74 spin_lock(&efi_rt_lock); 75 spin_lock(&efi_rt_lock);
75 local_irq_save(efi_rt_eflags); 76 local_irq_save(efi_rt_eflags);
76 77
78 cpu_gdt_descr = &per_cpu(cpu_gdt_descr, 0);
79
77 /* 80 /*
78 * If I don't have PSE, I should just duplicate two entries in page 81 * If I don't have PSE, I should just duplicate two entries in page
79 * directory. If I have PSE, I just need to duplicate one entry in 82 * directory. If I have PSE, I just need to duplicate one entry in
@@ -103,18 +106,17 @@ static void efi_call_phys_prelog(void)
103 */ 106 */
104 local_flush_tlb(); 107 local_flush_tlb();
105 108
106 per_cpu(cpu_gdt_descr, 0).address = 109 cpu_gdt_descr->address = __pa(cpu_gdt_descr->address);
107 __pa(per_cpu(cpu_gdt_descr, 0).address); 110 load_gdt(cpu_gdt_descr);
108 load_gdt((struct Xgt_desc_struct *)__pa(&per_cpu(cpu_gdt_descr, 0)));
109} 111}
110 112
111static void efi_call_phys_epilog(void) 113static void efi_call_phys_epilog(void)
112{ 114{
113 unsigned long cr4; 115 unsigned long cr4;
116 struct Xgt_desc_struct *cpu_gdt_descr = &per_cpu(cpu_gdt_descr, 0);
114 117
115 per_cpu(cpu_gdt_descr, 0).address = 118 cpu_gdt_descr->address = __va(cpu_gdt_descr->address);
116 (unsigned long)__va(per_cpu(cpu_gdt_descr, 0).address); 119 load_gdt(cpu_gdt_descr);
117 load_gdt((struct Xgt_desc_struct *)__va(&per_cpu(cpu_gdt_descr, 0)));
118 120
119 cr4 = read_cr4(); 121 cr4 = read_cr4();
120 122
diff --git a/arch/i386/kernel/io_apic.c b/arch/i386/kernel/io_apic.c
index 235822b3f41b..39d9a5fa907e 100644
--- a/arch/i386/kernel/io_apic.c
+++ b/arch/i386/kernel/io_apic.c
@@ -51,6 +51,8 @@ static struct { int pin, apic; } ioapic_i8259 = { -1, -1 };
51 51
52static DEFINE_SPINLOCK(ioapic_lock); 52static DEFINE_SPINLOCK(ioapic_lock);
53 53
54int timer_over_8254 __initdata = 1;
55
54/* 56/*
55 * Is the SiS APIC rmw bug present ? 57 * Is the SiS APIC rmw bug present ?
56 * -1 = don't know, 0 = no, 1 = yes 58 * -1 = don't know, 0 = no, 1 = yes
@@ -2267,7 +2269,8 @@ static inline void check_timer(void)
2267 apic_write_around(APIC_LVT0, APIC_LVT_MASKED | APIC_DM_EXTINT); 2269 apic_write_around(APIC_LVT0, APIC_LVT_MASKED | APIC_DM_EXTINT);
2268 init_8259A(1); 2270 init_8259A(1);
2269 timer_ack = 1; 2271 timer_ack = 1;
2270 enable_8259A_irq(0); 2272 if (timer_over_8254 > 0)
2273 enable_8259A_irq(0);
2271 2274
2272 pin1 = find_isa_irq_pin(0, mp_INT); 2275 pin1 = find_isa_irq_pin(0, mp_INT);
2273 apic1 = find_isa_irq_apic(0, mp_INT); 2276 apic1 = find_isa_irq_apic(0, mp_INT);
@@ -2392,6 +2395,20 @@ void __init setup_IO_APIC(void)
2392 print_IO_APIC(); 2395 print_IO_APIC();
2393} 2396}
2394 2397
2398static int __init setup_disable_8254_timer(char *s)
2399{
2400 timer_over_8254 = -1;
2401 return 1;
2402}
2403static int __init setup_enable_8254_timer(char *s)
2404{
2405 timer_over_8254 = 2;
2406 return 1;
2407}
2408
2409__setup("disable_8254_timer", setup_disable_8254_timer);
2410__setup("enable_8254_timer", setup_enable_8254_timer);
2411
2395/* 2412/*
2396 * Called after all the initialization is done. If we didnt find any 2413 * Called after all the initialization is done. If we didnt find any
2397 * APIC bugs then we can allow the modify fast path 2414 * APIC bugs then we can allow the modify fast path
diff --git a/arch/i386/kernel/machine_kexec.c b/arch/i386/kernel/machine_kexec.c
index a912fed48482..f73d7374a2ba 100644
--- a/arch/i386/kernel/machine_kexec.c
+++ b/arch/i386/kernel/machine_kexec.c
@@ -116,13 +116,13 @@ static void load_segments(void)
116 __asm__ __volatile__ ( 116 __asm__ __volatile__ (
117 "\tljmp $"STR(__KERNEL_CS)",$1f\n" 117 "\tljmp $"STR(__KERNEL_CS)",$1f\n"
118 "\t1:\n" 118 "\t1:\n"
119 "\tmovl $"STR(__KERNEL_DS)",%eax\n" 119 "\tmovl $"STR(__KERNEL_DS)",%%eax\n"
120 "\tmovl %eax,%ds\n" 120 "\tmovl %%eax,%%ds\n"
121 "\tmovl %eax,%es\n" 121 "\tmovl %%eax,%%es\n"
122 "\tmovl %eax,%fs\n" 122 "\tmovl %%eax,%%fs\n"
123 "\tmovl %eax,%gs\n" 123 "\tmovl %%eax,%%gs\n"
124 "\tmovl %eax,%ss\n" 124 "\tmovl %%eax,%%ss\n"
125 ); 125 ::: "eax", "memory");
126#undef STR 126#undef STR
127#undef __STR 127#undef __STR
128} 128}
diff --git a/arch/i386/kernel/nmi.c b/arch/i386/kernel/nmi.c
index 63f39a7e2c96..be87c5e2ee95 100644
--- a/arch/i386/kernel/nmi.c
+++ b/arch/i386/kernel/nmi.c
@@ -357,7 +357,7 @@ static void clear_msr_range(unsigned int base, unsigned int n)
357 wrmsr(base+i, 0, 0); 357 wrmsr(base+i, 0, 0);
358} 358}
359 359
360static inline void write_watchdog_counter(const char *descr) 360static void write_watchdog_counter(const char *descr)
361{ 361{
362 u64 count = (u64)cpu_khz * 1000; 362 u64 count = (u64)cpu_khz * 1000;
363 363
@@ -544,7 +544,7 @@ void nmi_watchdog_tick (struct pt_regs * regs)
544 * die_nmi will return ONLY if NOTIFY_STOP happens.. 544 * die_nmi will return ONLY if NOTIFY_STOP happens..
545 */ 545 */
546 die_nmi(regs, "NMI Watchdog detected LOCKUP"); 546 die_nmi(regs, "NMI Watchdog detected LOCKUP");
547 547 } else {
548 last_irq_sums[cpu] = sum; 548 last_irq_sums[cpu] = sum;
549 alert_counter[cpu] = 0; 549 alert_counter[cpu] = 0;
550 } 550 }
diff --git a/arch/i386/kernel/setup.c b/arch/i386/kernel/setup.c
index 51e513b4f72d..ab62a9f4701e 100644
--- a/arch/i386/kernel/setup.c
+++ b/arch/i386/kernel/setup.c
@@ -1599,6 +1599,10 @@ void __init setup_arch(char **cmdline_p)
1599 if (efi_enabled) 1599 if (efi_enabled)
1600 efi_map_memmap(); 1600 efi_map_memmap();
1601 1601
1602#ifdef CONFIG_X86_IO_APIC
1603 check_acpi_pci(); /* Checks more than just ACPI actually */
1604#endif
1605
1602#ifdef CONFIG_ACPI 1606#ifdef CONFIG_ACPI
1603 /* 1607 /*
1604 * Parse the ACPI tables for possible boot-time SMP configuration. 1608 * Parse the ACPI tables for possible boot-time SMP configuration.
diff --git a/arch/i386/kernel/time.c b/arch/i386/kernel/time.c
index a14d594bfbeb..9d3074759856 100644
--- a/arch/i386/kernel/time.c
+++ b/arch/i386/kernel/time.c
@@ -412,9 +412,9 @@ static int timer_resume(struct sys_device *dev)
412 write_seqlock_irqsave(&xtime_lock, flags); 412 write_seqlock_irqsave(&xtime_lock, flags);
413 xtime.tv_sec = sec; 413 xtime.tv_sec = sec;
414 xtime.tv_nsec = 0; 414 xtime.tv_nsec = 0;
415 write_sequnlock_irqrestore(&xtime_lock, flags); 415 jiffies_64 += sleep_length;
416 jiffies += sleep_length;
417 wall_jiffies += sleep_length; 416 wall_jiffies += sleep_length;
417 write_sequnlock_irqrestore(&xtime_lock, flags);
418 if (last_timer->resume) 418 if (last_timer->resume)
419 last_timer->resume(); 419 last_timer->resume();
420 cur_timer = last_timer; 420 cur_timer = last_timer;
diff --git a/arch/ia64/configs/gensparse_defconfig b/arch/ia64/configs/gensparse_defconfig
index 184678fe7832..744fd2f79f61 100644
--- a/arch/ia64/configs/gensparse_defconfig
+++ b/arch/ia64/configs/gensparse_defconfig
@@ -1,7 +1,7 @@
1# 1#
2# Automatically generated make config: don't edit 2# Automatically generated make config: don't edit
3# Linux kernel version: 2.6.16-rc5 3# Linux kernel version: 2.6.16-rc5
4# Mon Feb 27 16:15:43 2006 4# Thu Mar 2 16:39:10 2006
5# 5#
6 6
7# 7#
@@ -312,7 +312,13 @@ CONFIG_FW_LOADER=m
312# 312#
313# Plug and Play support 313# Plug and Play support
314# 314#
315# CONFIG_PNP is not set 315CONFIG_PNP=y
316# CONFIG_PNP_DEBUG is not set
317
318#
319# Protocols
320#
321CONFIG_PNPACPI=y
316 322
317# 323#
318# Block devices 324# Block devices
@@ -357,6 +363,7 @@ CONFIG_BLK_DEV_IDESCSI=m
357# IDE chipset support/bugfixes 363# IDE chipset support/bugfixes
358# 364#
359CONFIG_IDE_GENERIC=y 365CONFIG_IDE_GENERIC=y
366# CONFIG_BLK_DEV_IDEPNP is not set
360CONFIG_BLK_DEV_IDEPCI=y 367CONFIG_BLK_DEV_IDEPCI=y
361# CONFIG_IDEPCI_SHARE_IRQ is not set 368# CONFIG_IDEPCI_SHARE_IRQ is not set
362# CONFIG_BLK_DEV_OFFBOARD is not set 369# CONFIG_BLK_DEV_OFFBOARD is not set
@@ -525,6 +532,7 @@ CONFIG_DUMMY=m
525# CONFIG_BONDING is not set 532# CONFIG_BONDING is not set
526# CONFIG_EQUALIZER is not set 533# CONFIG_EQUALIZER is not set
527# CONFIG_TUN is not set 534# CONFIG_TUN is not set
535# CONFIG_NET_SB1000 is not set
528 536
529# 537#
530# ARCnet devices 538# ARCnet devices
diff --git a/arch/ia64/kernel/cyclone.c b/arch/ia64/kernel/cyclone.c
index 6ade3790ce07..e00b21514f7c 100644
--- a/arch/ia64/kernel/cyclone.c
+++ b/arch/ia64/kernel/cyclone.c
@@ -36,7 +36,7 @@ int __init init_cyclone_clock(void)
36 u32* volatile cyclone_timer; /* Cyclone MPMC0 register */ 36 u32* volatile cyclone_timer; /* Cyclone MPMC0 register */
37 37
38 if (!use_cyclone) 38 if (!use_cyclone)
39 return -ENODEV; 39 return 0;
40 40
41 printk(KERN_INFO "Summit chipset: Starting Cyclone Counter.\n"); 41 printk(KERN_INFO "Summit chipset: Starting Cyclone Counter.\n");
42 42
diff --git a/arch/ia64/kernel/ivt.S b/arch/ia64/kernel/ivt.S
index 9f80569a32b0..dcd906fe5749 100644
--- a/arch/ia64/kernel/ivt.S
+++ b/arch/ia64/kernel/ivt.S
@@ -561,11 +561,12 @@ ENTRY(dirty_bit)
561 ;; // avoid RAW on r18 561 ;; // avoid RAW on r18
562 mov ar.ccv=r18 // set compare value for cmpxchg 562 mov ar.ccv=r18 // set compare value for cmpxchg
563 or r25=_PAGE_D|_PAGE_A,r18 // set the dirty and accessed bits 563 or r25=_PAGE_D|_PAGE_A,r18 // set the dirty and accessed bits
564 tbit.z p7,p6 = r18,_PAGE_P_BIT // Check present bit
564 ;; 565 ;;
565 cmpxchg8.acq r26=[r17],r25,ar.ccv 566(p6) cmpxchg8.acq r26=[r17],r25,ar.ccv // Only update if page is present
566 mov r24=PAGE_SHIFT<<2 567 mov r24=PAGE_SHIFT<<2
567 ;; 568 ;;
568 cmp.eq p6,p7=r26,r18 569(p6) cmp.eq p6,p7=r26,r18 // Only compare if page is present
569 ;; 570 ;;
570(p6) itc.d r25 // install updated PTE 571(p6) itc.d r25 // install updated PTE
571 ;; 572 ;;
@@ -626,11 +627,12 @@ ENTRY(iaccess_bit)
626 ;; 627 ;;
627 mov ar.ccv=r18 // set compare value for cmpxchg 628 mov ar.ccv=r18 // set compare value for cmpxchg
628 or r25=_PAGE_A,r18 // set the accessed bit 629 or r25=_PAGE_A,r18 // set the accessed bit
630 tbit.z p7,p6 = r18,_PAGE_P_BIT // Check present bit
629 ;; 631 ;;
630 cmpxchg8.acq r26=[r17],r25,ar.ccv 632(p6) cmpxchg8.acq r26=[r17],r25,ar.ccv // Only if page present
631 mov r24=PAGE_SHIFT<<2 633 mov r24=PAGE_SHIFT<<2
632 ;; 634 ;;
633 cmp.eq p6,p7=r26,r18 635(p6) cmp.eq p6,p7=r26,r18 // Only if page present
634 ;; 636 ;;
635(p6) itc.i r25 // install updated PTE 637(p6) itc.i r25 // install updated PTE
636 ;; 638 ;;
@@ -680,11 +682,12 @@ ENTRY(daccess_bit)
680 ;; // avoid RAW on r18 682 ;; // avoid RAW on r18
681 mov ar.ccv=r18 // set compare value for cmpxchg 683 mov ar.ccv=r18 // set compare value for cmpxchg
682 or r25=_PAGE_A,r18 // set the dirty bit 684 or r25=_PAGE_A,r18 // set the dirty bit
685 tbit.z p7,p6 = r18,_PAGE_P_BIT // Check present bit
683 ;; 686 ;;
684 cmpxchg8.acq r26=[r17],r25,ar.ccv 687(p6) cmpxchg8.acq r26=[r17],r25,ar.ccv // Only if page is present
685 mov r24=PAGE_SHIFT<<2 688 mov r24=PAGE_SHIFT<<2
686 ;; 689 ;;
687 cmp.eq p6,p7=r26,r18 690(p6) cmp.eq p6,p7=r26,r18 // Only if page is present
688 ;; 691 ;;
689(p6) itc.d r25 // install updated PTE 692(p6) itc.d r25 // install updated PTE
690 /* 693 /*
diff --git a/arch/ia64/kernel/mca_drv.c b/arch/ia64/kernel/mca_drv.c
index 8fd93afa75a7..e883d85906db 100644
--- a/arch/ia64/kernel/mca_drv.c
+++ b/arch/ia64/kernel/mca_drv.c
@@ -123,8 +123,9 @@ mca_page_isolate(unsigned long paddr)
123void 123void
124mca_handler_bh(unsigned long paddr) 124mca_handler_bh(unsigned long paddr)
125{ 125{
126 printk(KERN_DEBUG "OS_MCA: process [pid: %d](%s) encounters MCA.\n", 126 printk(KERN_ERR
127 current->pid, current->comm); 127 "OS_MCA: process [pid: %d](%s) encounters MCA (paddr=%lx)\n",
128 current->pid, current->comm, paddr);
128 129
129 spin_lock(&mca_bh_lock); 130 spin_lock(&mca_bh_lock);
130 switch (mca_page_isolate(paddr)) { 131 switch (mca_page_isolate(paddr)) {
@@ -132,7 +133,7 @@ mca_handler_bh(unsigned long paddr)
132 printk(KERN_DEBUG "Page isolation: ( %lx ) success.\n", paddr); 133 printk(KERN_DEBUG "Page isolation: ( %lx ) success.\n", paddr);
133 break; 134 break;
134 case ISOLATE_NG: 135 case ISOLATE_NG:
135 printk(KERN_DEBUG "Page isolation: ( %lx ) failure.\n", paddr); 136 printk(KERN_CRIT "Page isolation: ( %lx ) failure.\n", paddr);
136 break; 137 break;
137 default: 138 default:
138 break; 139 break;
@@ -567,10 +568,15 @@ recover_from_processor_error(int platform, slidx_table_t *slidx,
567 return 0; 568 return 0;
568 569
569 /* 570 /*
570 * If there is no bus error, record is weird but we need not to recover. 571 * The cache check and bus check bits have four possible states
572 * cc bc
573 * 0 0 Weird record, not recovered
574 * 1 0 Cache error, not recovered
575 * 0 1 I/O error, attempt recovery
576 * 1 1 Memory error, attempt recovery
571 */ 577 */
572 if (psp->bc == 0 || pbci == NULL) 578 if (psp->bc == 0 || pbci == NULL)
573 return 1; 579 return 0;
574 580
575 /* 581 /*
576 * Sorry, we cannot handle so many. 582 * Sorry, we cannot handle so many.
diff --git a/arch/ia64/sn/kernel/sn2/sn2_smp.c b/arch/ia64/sn/kernel/sn2/sn2_smp.c
index 24eefb2fc55f..b2e1e746b47f 100644
--- a/arch/ia64/sn/kernel/sn2/sn2_smp.c
+++ b/arch/ia64/sn/kernel/sn2/sn2_smp.c
@@ -446,7 +446,7 @@ static struct proc_dir_entry *proc_sn2_ptc;
446static int __init sn2_ptc_init(void) 446static int __init sn2_ptc_init(void)
447{ 447{
448 if (!ia64_platform_is("sn2")) 448 if (!ia64_platform_is("sn2"))
449 return -ENOSYS; 449 return 0;
450 450
451 if (!(proc_sn2_ptc = create_proc_entry(PTC_BASENAME, 0444, NULL))) { 451 if (!(proc_sn2_ptc = create_proc_entry(PTC_BASENAME, 0444, NULL))) {
452 printk(KERN_ERR "unable to create %s proc entry", PTC_BASENAME); 452 printk(KERN_ERR "unable to create %s proc entry", PTC_BASENAME);
diff --git a/arch/ia64/sn/kernel/tiocx.c b/arch/ia64/sn/kernel/tiocx.c
index 8a56f8b5ffa2..99cb28e74295 100644
--- a/arch/ia64/sn/kernel/tiocx.c
+++ b/arch/ia64/sn/kernel/tiocx.c
@@ -484,7 +484,7 @@ static int __init tiocx_init(void)
484 int found_tiocx_device = 0; 484 int found_tiocx_device = 0;
485 485
486 if (!ia64_platform_is("sn2")) 486 if (!ia64_platform_is("sn2"))
487 return -ENODEV; 487 return 0;
488 488
489 bus_register(&tiocx_bus_type); 489 bus_register(&tiocx_bus_type);
490 490
diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig
index 767de847b4ab..3a0f89d2c8dc 100644
--- a/arch/mips/Kconfig
+++ b/arch/mips/Kconfig
@@ -1053,6 +1053,7 @@ config CPU_MIPS32_R1
1053 depends on SYS_HAS_CPU_MIPS32_R1 1053 depends on SYS_HAS_CPU_MIPS32_R1
1054 select CPU_HAS_PREFETCH 1054 select CPU_HAS_PREFETCH
1055 select CPU_SUPPORTS_32BIT_KERNEL 1055 select CPU_SUPPORTS_32BIT_KERNEL
1056 select CPU_SUPPORTS_HIGHMEM
1056 help 1057 help
1057 Choose this option to build a kernel for release 1 or later of the 1058 Choose this option to build a kernel for release 1 or later of the
1058 MIPS32 architecture. Most modern embedded systems with a 32-bit 1059 MIPS32 architecture. Most modern embedded systems with a 32-bit
@@ -1069,6 +1070,7 @@ config CPU_MIPS32_R2
1069 depends on SYS_HAS_CPU_MIPS32_R2 1070 depends on SYS_HAS_CPU_MIPS32_R2
1070 select CPU_HAS_PREFETCH 1071 select CPU_HAS_PREFETCH
1071 select CPU_SUPPORTS_32BIT_KERNEL 1072 select CPU_SUPPORTS_32BIT_KERNEL
1073 select CPU_SUPPORTS_HIGHMEM
1072 help 1074 help
1073 Choose this option to build a kernel for release 2 or later of the 1075 Choose this option to build a kernel for release 2 or later of the
1074 MIPS32 architecture. Most modern embedded systems with a 32-bit 1076 MIPS32 architecture. Most modern embedded systems with a 32-bit
@@ -1082,6 +1084,7 @@ config CPU_MIPS64_R1
1082 select CPU_HAS_PREFETCH 1084 select CPU_HAS_PREFETCH
1083 select CPU_SUPPORTS_32BIT_KERNEL 1085 select CPU_SUPPORTS_32BIT_KERNEL
1084 select CPU_SUPPORTS_64BIT_KERNEL 1086 select CPU_SUPPORTS_64BIT_KERNEL
1087 select CPU_SUPPORTS_HIGHMEM
1085 help 1088 help
1086 Choose this option to build a kernel for release 1 or later of the 1089 Choose this option to build a kernel for release 1 or later of the
1087 MIPS64 architecture. Many modern embedded systems with a 64-bit 1090 MIPS64 architecture. Many modern embedded systems with a 64-bit
@@ -1099,6 +1102,7 @@ config CPU_MIPS64_R2
1099 select CPU_HAS_PREFETCH 1102 select CPU_HAS_PREFETCH
1100 select CPU_SUPPORTS_32BIT_KERNEL 1103 select CPU_SUPPORTS_32BIT_KERNEL
1101 select CPU_SUPPORTS_64BIT_KERNEL 1104 select CPU_SUPPORTS_64BIT_KERNEL
1105 select CPU_SUPPORTS_HIGHMEM
1102 help 1106 help
1103 Choose this option to build a kernel for release 2 or later of the 1107 Choose this option to build a kernel for release 2 or later of the
1104 MIPS64 architecture. Many modern embedded systems with a 64-bit 1108 MIPS64 architecture. Many modern embedded systems with a 64-bit
diff --git a/arch/mips/Makefile b/arch/mips/Makefile
index 38c0f3360d51..fe9da16f3a40 100644
--- a/arch/mips/Makefile
+++ b/arch/mips/Makefile
@@ -95,6 +95,7 @@ endif
95# crossformat linking we rely on the elf2ecoff tool for format conversion. 95# crossformat linking we rely on the elf2ecoff tool for format conversion.
96# 96#
97cflags-y += -G 0 -mno-abicalls -fno-pic -pipe 97cflags-y += -G 0 -mno-abicalls -fno-pic -pipe
98cflags-y += -msoft-float
98LDFLAGS_vmlinux += -G 0 -static -n -nostdlib 99LDFLAGS_vmlinux += -G 0 -static -n -nostdlib
99MODFLAGS += -mlong-calls 100MODFLAGS += -mlong-calls
100 101
diff --git a/arch/mips/arc/arc_con.c b/arch/mips/arc/arc_con.c
index 51785a6a7328..bc32fe64f42a 100644
--- a/arch/mips/arc/arc_con.c
+++ b/arch/mips/arc/arc_con.c
@@ -24,7 +24,7 @@ static void prom_console_write(struct console *co, const char *s,
24 } 24 }
25} 25}
26 26
27static int __init prom_console_setup(struct console *co, char *options) 27static int prom_console_setup(struct console *co, char *options)
28{ 28{
29 return !(prom_flags & PROM_FLAG_USE_AS_CONSOLE); 29 return !(prom_flags & PROM_FLAG_USE_AS_CONSOLE);
30} 30}
diff --git a/arch/mips/kernel/irq-mv6434x.c b/arch/mips/kernel/irq-mv6434x.c
index 0ac067f45cf5..0613f1f36b1b 100644
--- a/arch/mips/kernel/irq-mv6434x.c
+++ b/arch/mips/kernel/irq-mv6434x.c
@@ -11,12 +11,14 @@
11#include <linux/module.h> 11#include <linux/module.h>
12#include <linux/interrupt.h> 12#include <linux/interrupt.h>
13#include <linux/kernel.h> 13#include <linux/kernel.h>
14#include <asm/ptrace.h>
15#include <linux/sched.h>
16#include <linux/kernel_stat.h> 14#include <linux/kernel_stat.h>
15#include <linux/mv643xx.h>
16#include <linux/sched.h>
17
18#include <asm/ptrace.h>
17#include <asm/io.h> 19#include <asm/io.h>
18#include <asm/irq.h> 20#include <asm/irq.h>
19#include <linux/mv643xx.h> 21#include <asm/marvell.h>
20 22
21static unsigned int irq_base; 23static unsigned int irq_base;
22 24
diff --git a/arch/mips/kernel/time.c b/arch/mips/kernel/time.c
index 7050b4ffffcd..42c94c771afb 100644
--- a/arch/mips/kernel/time.c
+++ b/arch/mips/kernel/time.c
@@ -163,7 +163,7 @@ void do_gettimeofday(struct timeval *tv)
163 unsigned long seq; 163 unsigned long seq;
164 unsigned long lost; 164 unsigned long lost;
165 unsigned long usec, sec; 165 unsigned long usec, sec;
166 unsigned long max_ntp_tick = tick_usec - tickadj; 166 unsigned long max_ntp_tick;
167 167
168 do { 168 do {
169 seq = read_seqbegin(&xtime_lock); 169 seq = read_seqbegin(&xtime_lock);
@@ -178,12 +178,13 @@ void do_gettimeofday(struct timeval *tv)
178 * Better to lose some accuracy than have time go backwards.. 178 * Better to lose some accuracy than have time go backwards..
179 */ 179 */
180 if (unlikely(time_adjust < 0)) { 180 if (unlikely(time_adjust < 0)) {
181 max_ntp_tick = (USEC_PER_SEC / HZ) - tickadj;
181 usec = min(usec, max_ntp_tick); 182 usec = min(usec, max_ntp_tick);
182 183
183 if (lost) 184 if (lost)
184 usec += lost * max_ntp_tick; 185 usec += lost * max_ntp_tick;
185 } else if (unlikely(lost)) 186 } else if (unlikely(lost))
186 usec += lost * tick_usec; 187 usec += lost * (USEC_PER_SEC / HZ);
187 188
188 sec = xtime.tv_sec; 189 sec = xtime.tv_sec;
189 usec += (xtime.tv_nsec / 1000); 190 usec += (xtime.tv_nsec / 1000);
diff --git a/arch/mips/kernel/vmlinux.lds.S b/arch/mips/kernel/vmlinux.lds.S
index ff699dbb99f7..2ad0cedf29fe 100644
--- a/arch/mips/kernel/vmlinux.lds.S
+++ b/arch/mips/kernel/vmlinux.lds.S
@@ -106,6 +106,9 @@ SECTIONS
106 .con_initcall.init : { *(.con_initcall.init) } 106 .con_initcall.init : { *(.con_initcall.init) }
107 __con_initcall_end = .; 107 __con_initcall_end = .;
108 SECURITY_INIT 108 SECURITY_INIT
109 /* .exit.text is discarded at runtime, not link time, to deal with
110 references from .rodata */
111 .exit.text : { *(.exit.text) }
109 . = ALIGN(_PAGE_SIZE); 112 . = ALIGN(_PAGE_SIZE);
110 __initramfs_start = .; 113 __initramfs_start = .;
111 .init.ramfs : { *(.init.ramfs) } 114 .init.ramfs : { *(.init.ramfs) }
@@ -133,7 +136,6 @@ SECTIONS
133 136
134 /* Sections to be discarded */ 137 /* Sections to be discarded */
135 /DISCARD/ : { 138 /DISCARD/ : {
136 *(.exit.text)
137 *(.exit.data) 139 *(.exit.data)
138 *(.exitcall.exit) 140 *(.exitcall.exit)
139 141
diff --git a/arch/mips/mm/tlbex.c b/arch/mips/mm/tlbex.c
index 0f9485806bac..ac4f4bfaae50 100644
--- a/arch/mips/mm/tlbex.c
+++ b/arch/mips/mm/tlbex.c
@@ -280,69 +280,69 @@ static void __init build_insn(u32 **buf, enum opcode opc, ...)
280} 280}
281 281
282#define I_u1u2u3(op) \ 282#define I_u1u2u3(op) \
283 static inline void i##op(u32 **buf, unsigned int a, \ 283 static inline void __init i##op(u32 **buf, unsigned int a, \
284 unsigned int b, unsigned int c) \ 284 unsigned int b, unsigned int c) \
285 { \ 285 { \
286 build_insn(buf, insn##op, a, b, c); \ 286 build_insn(buf, insn##op, a, b, c); \
287 } 287 }
288 288
289#define I_u2u1u3(op) \ 289#define I_u2u1u3(op) \
290 static inline void i##op(u32 **buf, unsigned int a, \ 290 static inline void __init i##op(u32 **buf, unsigned int a, \
291 unsigned int b, unsigned int c) \ 291 unsigned int b, unsigned int c) \
292 { \ 292 { \
293 build_insn(buf, insn##op, b, a, c); \ 293 build_insn(buf, insn##op, b, a, c); \
294 } 294 }
295 295
296#define I_u3u1u2(op) \ 296#define I_u3u1u2(op) \
297 static inline void i##op(u32 **buf, unsigned int a, \ 297 static inline void __init i##op(u32 **buf, unsigned int a, \
298 unsigned int b, unsigned int c) \ 298 unsigned int b, unsigned int c) \
299 { \ 299 { \
300 build_insn(buf, insn##op, b, c, a); \ 300 build_insn(buf, insn##op, b, c, a); \
301 } 301 }
302 302
303#define I_u1u2s3(op) \ 303#define I_u1u2s3(op) \
304 static inline void i##op(u32 **buf, unsigned int a, \ 304 static inline void __init i##op(u32 **buf, unsigned int a, \
305 unsigned int b, signed int c) \ 305 unsigned int b, signed int c) \
306 { \ 306 { \
307 build_insn(buf, insn##op, a, b, c); \ 307 build_insn(buf, insn##op, a, b, c); \
308 } 308 }
309 309
310#define I_u2s3u1(op) \ 310#define I_u2s3u1(op) \
311 static inline void i##op(u32 **buf, unsigned int a, \ 311 static inline void __init i##op(u32 **buf, unsigned int a, \
312 signed int b, unsigned int c) \ 312 signed int b, unsigned int c) \
313 { \ 313 { \
314 build_insn(buf, insn##op, c, a, b); \ 314 build_insn(buf, insn##op, c, a, b); \
315 } 315 }
316 316
317#define I_u2u1s3(op) \ 317#define I_u2u1s3(op) \
318 static inline void i##op(u32 **buf, unsigned int a, \ 318 static inline void __init i##op(u32 **buf, unsigned int a, \
319 unsigned int b, signed int c) \ 319 unsigned int b, signed int c) \
320 { \ 320 { \
321 build_insn(buf, insn##op, b, a, c); \ 321 build_insn(buf, insn##op, b, a, c); \
322 } 322 }
323 323
324#define I_u1u2(op) \ 324#define I_u1u2(op) \
325 static inline void i##op(u32 **buf, unsigned int a, \ 325 static inline void __init i##op(u32 **buf, unsigned int a, \
326 unsigned int b) \ 326 unsigned int b) \
327 { \ 327 { \
328 build_insn(buf, insn##op, a, b); \ 328 build_insn(buf, insn##op, a, b); \
329 } 329 }
330 330
331#define I_u1s2(op) \ 331#define I_u1s2(op) \
332 static inline void i##op(u32 **buf, unsigned int a, \ 332 static inline void __init i##op(u32 **buf, unsigned int a, \
333 signed int b) \ 333 signed int b) \
334 { \ 334 { \
335 build_insn(buf, insn##op, a, b); \ 335 build_insn(buf, insn##op, a, b); \
336 } 336 }
337 337
338#define I_u1(op) \ 338#define I_u1(op) \
339 static inline void i##op(u32 **buf, unsigned int a) \ 339 static inline void __init i##op(u32 **buf, unsigned int a) \
340 { \ 340 { \
341 build_insn(buf, insn##op, a); \ 341 build_insn(buf, insn##op, a); \
342 } 342 }
343 343
344#define I_0(op) \ 344#define I_0(op) \
345 static inline void i##op(u32 **buf) \ 345 static inline void __init i##op(u32 **buf) \
346 { \ 346 { \
347 build_insn(buf, insn##op); \ 347 build_insn(buf, insn##op); \
348 } 348 }
@@ -623,42 +623,42 @@ static __init int __attribute__((unused)) insn_has_bdelay(struct reloc *rel,
623} 623}
624 624
625/* convenience functions for labeled branches */ 625/* convenience functions for labeled branches */
626static void __attribute__((unused)) il_bltz(u32 **p, struct reloc **r, 626static void __init __attribute__((unused))
627 unsigned int reg, enum label_id l) 627 il_bltz(u32 **p, struct reloc **r, unsigned int reg, enum label_id l)
628{ 628{
629 r_mips_pc16(r, *p, l); 629 r_mips_pc16(r, *p, l);
630 i_bltz(p, reg, 0); 630 i_bltz(p, reg, 0);
631} 631}
632 632
633static void __attribute__((unused)) il_b(u32 **p, struct reloc **r, 633static void __init __attribute__((unused)) il_b(u32 **p, struct reloc **r,
634 enum label_id l) 634 enum label_id l)
635{ 635{
636 r_mips_pc16(r, *p, l); 636 r_mips_pc16(r, *p, l);
637 i_b(p, 0); 637 i_b(p, 0);
638} 638}
639 639
640static void il_beqz(u32 **p, struct reloc **r, unsigned int reg, 640static void __init il_beqz(u32 **p, struct reloc **r, unsigned int reg,
641 enum label_id l) 641 enum label_id l)
642{ 642{
643 r_mips_pc16(r, *p, l); 643 r_mips_pc16(r, *p, l);
644 i_beqz(p, reg, 0); 644 i_beqz(p, reg, 0);
645} 645}
646 646
647static void __attribute__((unused)) 647static void __init __attribute__((unused))
648il_beqzl(u32 **p, struct reloc **r, unsigned int reg, enum label_id l) 648il_beqzl(u32 **p, struct reloc **r, unsigned int reg, enum label_id l)
649{ 649{
650 r_mips_pc16(r, *p, l); 650 r_mips_pc16(r, *p, l);
651 i_beqzl(p, reg, 0); 651 i_beqzl(p, reg, 0);
652} 652}
653 653
654static void il_bnez(u32 **p, struct reloc **r, unsigned int reg, 654static void __init il_bnez(u32 **p, struct reloc **r, unsigned int reg,
655 enum label_id l) 655 enum label_id l)
656{ 656{
657 r_mips_pc16(r, *p, l); 657 r_mips_pc16(r, *p, l);
658 i_bnez(p, reg, 0); 658 i_bnez(p, reg, 0);
659} 659}
660 660
661static void il_bgezl(u32 **p, struct reloc **r, unsigned int reg, 661static void __init il_bgezl(u32 **p, struct reloc **r, unsigned int reg,
662 enum label_id l) 662 enum label_id l)
663{ 663{
664 r_mips_pc16(r, *p, l); 664 r_mips_pc16(r, *p, l);
diff --git a/arch/mips/momentum/jaguar_atx/prom.c b/arch/mips/momentum/jaguar_atx/prom.c
index aae7a802767a..1cadaa92946a 100644
--- a/arch/mips/momentum/jaguar_atx/prom.c
+++ b/arch/mips/momentum/jaguar_atx/prom.c
@@ -21,10 +21,10 @@
21#include <linux/mm.h> 21#include <linux/mm.h>
22#include <linux/sched.h> 22#include <linux/sched.h>
23#include <linux/bootmem.h> 23#include <linux/bootmem.h>
24#include <linux/mv643xx.h>
24 25
25#include <asm/addrspace.h> 26#include <asm/addrspace.h>
26#include <asm/bootinfo.h> 27#include <asm/bootinfo.h>
27#include <asm/mv64340.h>
28#include <asm/pmon.h> 28#include <asm/pmon.h>
29 29
30#include "jaguar_atx_fpga.h" 30#include "jaguar_atx_fpga.h"
diff --git a/arch/mips/momentum/jaguar_atx/setup.c b/arch/mips/momentum/jaguar_atx/setup.c
index 301d67226d72..2699917b640a 100644
--- a/arch/mips/momentum/jaguar_atx/setup.c
+++ b/arch/mips/momentum/jaguar_atx/setup.c
@@ -2,7 +2,7 @@
2 * BRIEF MODULE DESCRIPTION 2 * BRIEF MODULE DESCRIPTION
3 * Momentum Computer Jaguar-ATX board dependent boot routines 3 * Momentum Computer Jaguar-ATX board dependent boot routines
4 * 4 *
5 * Copyright (C) 1996, 1997, 2001, 2004 Ralf Baechle (ralf@linux-mips.org) 5 * Copyright (C) 1996, 1997, 2001, 04, 06 Ralf Baechle (ralf@linux-mips.org)
6 * Copyright (C) 2000 RidgeRun, Inc. 6 * Copyright (C) 2000 RidgeRun, Inc.
7 * Copyright (C) 2001 Red Hat, Inc. 7 * Copyright (C) 2001 Red Hat, Inc.
8 * Copyright (C) 2002 Momentum Computer 8 * Copyright (C) 2002 Momentum Computer
@@ -55,6 +55,8 @@
55#include <linux/interrupt.h> 55#include <linux/interrupt.h>
56#include <linux/timex.h> 56#include <linux/timex.h>
57#include <linux/vmalloc.h> 57#include <linux/vmalloc.h>
58#include <linux/mv643xx.h>
59
58#include <asm/time.h> 60#include <asm/time.h>
59#include <asm/bootinfo.h> 61#include <asm/bootinfo.h>
60#include <asm/page.h> 62#include <asm/page.h>
@@ -64,7 +66,6 @@
64#include <asm/ptrace.h> 66#include <asm/ptrace.h>
65#include <asm/reboot.h> 67#include <asm/reboot.h>
66#include <asm/tlbflush.h> 68#include <asm/tlbflush.h>
67#include <asm/mv64340.h>
68 69
69#include "jaguar_atx_fpga.h" 70#include "jaguar_atx_fpga.h"
70 71
diff --git a/arch/mips/momentum/ocelot_c/irq.c b/arch/mips/momentum/ocelot_c/irq.c
index 300fe8e4fbe8..a5764bc20e36 100644
--- a/arch/mips/momentum/ocelot_c/irq.c
+++ b/arch/mips/momentum/ocelot_c/irq.c
@@ -41,11 +41,11 @@
41#include <linux/slab.h> 41#include <linux/slab.h>
42#include <linux/random.h> 42#include <linux/random.h>
43#include <linux/bitops.h> 43#include <linux/bitops.h>
44#include <linux/mv643xx.h>
44#include <asm/bootinfo.h> 45#include <asm/bootinfo.h>
45#include <asm/io.h> 46#include <asm/io.h>
46#include <asm/irq_cpu.h> 47#include <asm/irq_cpu.h>
47#include <asm/mipsregs.h> 48#include <asm/mipsregs.h>
48#include <asm/mv64340.h>
49#include <asm/system.h> 49#include <asm/system.h>
50 50
51extern asmlinkage void ocelot_handle_int(void); 51extern asmlinkage void ocelot_handle_int(void);
diff --git a/arch/mips/momentum/ocelot_c/prom.c b/arch/mips/momentum/ocelot_c/prom.c
index 5b6809724b15..e92364482c7b 100644
--- a/arch/mips/momentum/ocelot_c/prom.c
+++ b/arch/mips/momentum/ocelot_c/prom.c
@@ -19,10 +19,10 @@
19#include <linux/mm.h> 19#include <linux/mm.h>
20#include <linux/sched.h> 20#include <linux/sched.h>
21#include <linux/bootmem.h> 21#include <linux/bootmem.h>
22#include <linux/mv643xx.h>
22 23
23#include <asm/addrspace.h> 24#include <asm/addrspace.h>
24#include <asm/bootinfo.h> 25#include <asm/bootinfo.h>
25#include <asm/mv64340.h>
26#include <asm/pmon.h> 26#include <asm/pmon.h>
27 27
28#include "ocelot_c_fpga.h" 28#include "ocelot_c_fpga.h"
diff --git a/arch/mips/momentum/ocelot_c/setup.c b/arch/mips/momentum/ocelot_c/setup.c
index 15998d8a9341..bd02e60d037a 100644
--- a/arch/mips/momentum/ocelot_c/setup.c
+++ b/arch/mips/momentum/ocelot_c/setup.c
@@ -54,6 +54,7 @@
54#include <linux/pm.h> 54#include <linux/pm.h>
55#include <linux/timex.h> 55#include <linux/timex.h>
56#include <linux/vmalloc.h> 56#include <linux/vmalloc.h>
57#include <linux/mv643xx.h>
57 58
58#include <asm/time.h> 59#include <asm/time.h>
59#include <asm/bootinfo.h> 60#include <asm/bootinfo.h>
@@ -64,9 +65,9 @@
64#include <asm/processor.h> 65#include <asm/processor.h>
65#include <asm/ptrace.h> 66#include <asm/ptrace.h>
66#include <asm/reboot.h> 67#include <asm/reboot.h>
68#include <asm/marvell.h>
67#include <linux/bootmem.h> 69#include <linux/bootmem.h>
68#include <linux/blkdev.h> 70#include <linux/blkdev.h>
69#include <asm/mv64340.h>
70#include "ocelot_c_fpga.h" 71#include "ocelot_c_fpga.h"
71 72
72unsigned long marvell_base; 73unsigned long marvell_base;
@@ -252,22 +253,22 @@ void __init plat_setup(void)
252 /* shut down ethernet ports, just to be sure our memory doesn't get 253 /* shut down ethernet ports, just to be sure our memory doesn't get
253 * corrupted by random ethernet traffic. 254 * corrupted by random ethernet traffic.
254 */ 255 */
255 MV_WRITE(MV64340_ETH_TRANSMIT_QUEUE_COMMAND_REG(0), 0xff << 8); 256 MV_WRITE(MV643XX_ETH_TRANSMIT_QUEUE_COMMAND_REG(0), 0xff << 8);
256 MV_WRITE(MV64340_ETH_TRANSMIT_QUEUE_COMMAND_REG(1), 0xff << 8); 257 MV_WRITE(MV643XX_ETH_TRANSMIT_QUEUE_COMMAND_REG(1), 0xff << 8);
257 MV_WRITE(MV64340_ETH_RECEIVE_QUEUE_COMMAND_REG(0), 0xff << 8); 258 MV_WRITE(MV643XX_ETH_RECEIVE_QUEUE_COMMAND_REG(0), 0xff << 8);
258 MV_WRITE(MV64340_ETH_RECEIVE_QUEUE_COMMAND_REG(1), 0xff << 8); 259 MV_WRITE(MV643XX_ETH_RECEIVE_QUEUE_COMMAND_REG(1), 0xff << 8);
259 do {} 260 do {}
260 while (MV_READ(MV64340_ETH_RECEIVE_QUEUE_COMMAND_REG(0)) & 0xff); 261 while (MV_READ(MV643XX_ETH_RECEIVE_QUEUE_COMMAND_REG(0)) & 0xff);
261 do {} 262 do {}
262 while (MV_READ(MV64340_ETH_RECEIVE_QUEUE_COMMAND_REG(1)) & 0xff); 263 while (MV_READ(MV643XX_ETH_RECEIVE_QUEUE_COMMAND_REG(1)) & 0xff);
263 do {} 264 do {}
264 while (MV_READ(MV64340_ETH_TRANSMIT_QUEUE_COMMAND_REG(0)) & 0xff); 265 while (MV_READ(MV643XX_ETH_TRANSMIT_QUEUE_COMMAND_REG(0)) & 0xff);
265 do {} 266 do {}
266 while (MV_READ(MV64340_ETH_TRANSMIT_QUEUE_COMMAND_REG(1)) & 0xff); 267 while (MV_READ(MV643XX_ETH_TRANSMIT_QUEUE_COMMAND_REG(1)) & 0xff);
267 MV_WRITE(MV64340_ETH_PORT_SERIAL_CONTROL_REG(0), 268 MV_WRITE(MV643XX_ETH_PORT_SERIAL_CONTROL_REG(0),
268 MV_READ(MV64340_ETH_PORT_SERIAL_CONTROL_REG(0)) & ~1); 269 MV_READ(MV643XX_ETH_PORT_SERIAL_CONTROL_REG(0)) & ~1);
269 MV_WRITE(MV64340_ETH_PORT_SERIAL_CONTROL_REG(1), 270 MV_WRITE(MV643XX_ETH_PORT_SERIAL_CONTROL_REG(1),
270 MV_READ(MV64340_ETH_PORT_SERIAL_CONTROL_REG(1)) & ~1); 271 MV_READ(MV643XX_ETH_PORT_SERIAL_CONTROL_REG(1)) & ~1);
271 272
272 /* Turn off the Bit-Error LED */ 273 /* Turn off the Bit-Error LED */
273 OCELOT_FPGA_WRITE(0x80, CLR); 274 OCELOT_FPGA_WRITE(0x80, CLR);
diff --git a/arch/mips/pci/pci-ocelot-c.c b/arch/mips/pci/pci-ocelot-c.c
index 1d84d36e034d..027759f7c904 100644
--- a/arch/mips/pci/pci-ocelot-c.c
+++ b/arch/mips/pci/pci-ocelot-c.c
@@ -3,15 +3,17 @@
3 * License. See the file "COPYING" in the main directory of this archive 3 * License. See the file "COPYING" in the main directory of this archive
4 * for more details. 4 * for more details.
5 * 5 *
6 * Copyright (C) 2004 by Ralf Baechle (ralf@linux-mips.org) 6 * Copyright (C) 2004, 06 by Ralf Baechle (ralf@linux-mips.org)
7 */ 7 */
8 8
9#include <linux/types.h> 9#include <linux/types.h>
10#include <linux/pci.h> 10#include <linux/pci.h>
11#include <asm/mv64340.h> 11#include <linux/mv643xx.h>
12 12
13#include <linux/init.h> 13#include <linux/init.h>
14 14
15#include <asm/marvell.h>
16
15/* 17/*
16 * We assume the address ranges have already been setup appropriately by 18 * We assume the address ranges have already been setup appropriately by
17 * the firmware. PMON in case of the Ocelot C does that. 19 * the firmware. PMON in case of the Ocelot C does that.
diff --git a/arch/powerpc/kernel/asm-offsets.c b/arch/powerpc/kernel/asm-offsets.c
index 840aad43a98b..c9a660e4c2db 100644
--- a/arch/powerpc/kernel/asm-offsets.c
+++ b/arch/powerpc/kernel/asm-offsets.c
@@ -92,7 +92,6 @@ int main(void)
92 92
93 DEFINE(TI_FLAGS, offsetof(struct thread_info, flags)); 93 DEFINE(TI_FLAGS, offsetof(struct thread_info, flags));
94 DEFINE(TI_PREEMPT, offsetof(struct thread_info, preempt_count)); 94 DEFINE(TI_PREEMPT, offsetof(struct thread_info, preempt_count));
95 DEFINE(TI_SIGFRAME, offsetof(struct thread_info, nvgprs_frame));
96 DEFINE(TI_TASK, offsetof(struct thread_info, task)); 95 DEFINE(TI_TASK, offsetof(struct thread_info, task));
97#ifdef CONFIG_PPC32 96#ifdef CONFIG_PPC32
98 DEFINE(TI_EXECDOMAIN, offsetof(struct thread_info, exec_domain)); 97 DEFINE(TI_EXECDOMAIN, offsetof(struct thread_info, exec_domain));
diff --git a/arch/powerpc/kernel/cputable.c b/arch/powerpc/kernel/cputable.c
index 10696456a4c6..e4e81374cb9a 100644
--- a/arch/powerpc/kernel/cputable.c
+++ b/arch/powerpc/kernel/cputable.c
@@ -53,8 +53,10 @@ extern void __setup_cpu_ppc970(unsigned long offset, struct cpu_spec* spec);
53 PPC_FEATURE_HAS_MMU) 53 PPC_FEATURE_HAS_MMU)
54#define COMMON_USER_PPC64 (COMMON_USER | PPC_FEATURE_64) 54#define COMMON_USER_PPC64 (COMMON_USER | PPC_FEATURE_64)
55#define COMMON_USER_POWER4 (COMMON_USER_PPC64 | PPC_FEATURE_POWER4) 55#define COMMON_USER_POWER4 (COMMON_USER_PPC64 | PPC_FEATURE_POWER4)
56#define COMMON_USER_POWER5 (COMMON_USER_PPC64 | PPC_FEATURE_POWER5) 56#define COMMON_USER_POWER5 (COMMON_USER_PPC64 | PPC_FEATURE_POWER5 |\
57#define COMMON_USER_POWER5_PLUS (COMMON_USER_PPC64 | PPC_FEATURE_POWER5_PLUS) 57 PPC_FEATURE_SMT | PPC_FEATURE_ICACHE_SNOOP)
58#define COMMON_USER_POWER5_PLUS (COMMON_USER_PPC64 | PPC_FEATURE_POWER5_PLUS|\
59 PPC_FEATURE_SMT | PPC_FEATURE_ICACHE_SNOOP)
58#define COMMON_USER_BOOKE (PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU | \ 60#define COMMON_USER_BOOKE (PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU | \
59 PPC_FEATURE_BOOKE) 61 PPC_FEATURE_BOOKE)
60 62
@@ -267,7 +269,8 @@ struct cpu_spec cpu_specs[] = {
267 .cpu_name = "Cell Broadband Engine", 269 .cpu_name = "Cell Broadband Engine",
268 .cpu_features = CPU_FTRS_CELL, 270 .cpu_features = CPU_FTRS_CELL,
269 .cpu_user_features = COMMON_USER_PPC64 | 271 .cpu_user_features = COMMON_USER_PPC64 |
270 PPC_FEATURE_CELL | PPC_FEATURE_HAS_ALTIVEC_COMP, 272 PPC_FEATURE_CELL | PPC_FEATURE_HAS_ALTIVEC_COMP |
273 PPC_FEATURE_SMT,
271 .icache_bsize = 128, 274 .icache_bsize = 128,
272 .dcache_bsize = 128, 275 .dcache_bsize = 128,
273 .cpu_setup = __setup_cpu_be, 276 .cpu_setup = __setup_cpu_be,
diff --git a/arch/powerpc/kernel/entry_32.S b/arch/powerpc/kernel/entry_32.S
index f20a67261ec7..4827ca1ec89b 100644
--- a/arch/powerpc/kernel/entry_32.S
+++ b/arch/powerpc/kernel/entry_32.S
@@ -227,7 +227,7 @@ ret_from_syscall:
227 MTMSRD(r10) 227 MTMSRD(r10)
228 lwz r9,TI_FLAGS(r12) 228 lwz r9,TI_FLAGS(r12)
229 li r8,-_LAST_ERRNO 229 li r8,-_LAST_ERRNO
230 andi. r0,r9,(_TIF_SYSCALL_T_OR_A|_TIF_SIGPENDING|_TIF_NEED_RESCHED|_TIF_RESTOREALL|_TIF_RESTORE_SIGMASK) 230 andi. r0,r9,(_TIF_SYSCALL_T_OR_A|_TIF_SINGLESTEP|_TIF_USER_WORK_MASK|_TIF_PERSYSCALL_MASK)
231 bne- syscall_exit_work 231 bne- syscall_exit_work
232 cmplw 0,r3,r8 232 cmplw 0,r3,r8
233 blt+ syscall_exit_cont 233 blt+ syscall_exit_cont
@@ -287,8 +287,10 @@ syscall_dotrace:
287 287
288syscall_exit_work: 288syscall_exit_work:
289 andi. r0,r9,_TIF_RESTOREALL 289 andi. r0,r9,_TIF_RESTOREALL
290 bne- 2f 290 beq+ 0f
291 cmplw 0,r3,r8 291 REST_NVGPRS(r1)
292 b 2f
2930: cmplw 0,r3,r8
292 blt+ 1f 294 blt+ 1f
293 andi. r0,r9,_TIF_NOERROR 295 andi. r0,r9,_TIF_NOERROR
294 bne- 1f 296 bne- 1f
@@ -302,9 +304,7 @@ syscall_exit_work:
3022: andi. r0,r9,(_TIF_PERSYSCALL_MASK) 3042: andi. r0,r9,(_TIF_PERSYSCALL_MASK)
303 beq 4f 305 beq 4f
304 306
305 /* Clear per-syscall TIF flags if any are set, but _leave_ 307 /* Clear per-syscall TIF flags if any are set. */
306 _TIF_SAVE_NVGPRS set in r9 since we haven't dealt with that
307 yet. */
308 308
309 li r11,_TIF_PERSYSCALL_MASK 309 li r11,_TIF_PERSYSCALL_MASK
310 addi r12,r12,TI_FLAGS 310 addi r12,r12,TI_FLAGS
@@ -318,8 +318,13 @@ syscall_exit_work:
318 subi r12,r12,TI_FLAGS 318 subi r12,r12,TI_FLAGS
319 319
3204: /* Anything which requires enabling interrupts? */ 3204: /* Anything which requires enabling interrupts? */
321 andi. r0,r9,(_TIF_SYSCALL_T_OR_A|_TIF_SINGLESTEP|_TIF_SAVE_NVGPRS) 321 andi. r0,r9,(_TIF_SYSCALL_T_OR_A|_TIF_SINGLESTEP)
322 beq 7f 322 beq ret_from_except
323
324 /* Re-enable interrupts */
325 ori r10,r10,MSR_EE
326 SYNC
327 MTMSRD(r10)
323 328
324 /* Save NVGPRS if they're not saved already */ 329 /* Save NVGPRS if they're not saved already */
325 lwz r4,_TRAP(r1) 330 lwz r4,_TRAP(r1)
@@ -328,71 +333,11 @@ syscall_exit_work:
328 SAVE_NVGPRS(r1) 333 SAVE_NVGPRS(r1)
329 li r4,0xc00 334 li r4,0xc00
330 stw r4,_TRAP(r1) 335 stw r4,_TRAP(r1)
331 3365:
332 /* Re-enable interrupts */
3335: ori r10,r10,MSR_EE
334 SYNC
335 MTMSRD(r10)
336
337 andi. r0,r9,_TIF_SAVE_NVGPRS
338 bne save_user_nvgprs
339
340save_user_nvgprs_cont:
341 andi. r0,r9,(_TIF_SYSCALL_T_OR_A|_TIF_SINGLESTEP)
342 beq 7f
343
344 addi r3,r1,STACK_FRAME_OVERHEAD 337 addi r3,r1,STACK_FRAME_OVERHEAD
345 bl do_syscall_trace_leave 338 bl do_syscall_trace_leave
346 REST_NVGPRS(r1) 339 b ret_from_except_full
347
3486: lwz r3,GPR3(r1)
349 LOAD_MSR_KERNEL(r10,MSR_KERNEL) /* doesn't include MSR_EE */
350 SYNC
351 MTMSRD(r10) /* disable interrupts again */
352 rlwinm r12,r1,0,0,(31-THREAD_SHIFT) /* current_thread_info() */
353 lwz r9,TI_FLAGS(r12)
3547:
355 andi. r0,r9,_TIF_NEED_RESCHED
356 bne 8f
357 lwz r5,_MSR(r1)
358 andi. r5,r5,MSR_PR
359 beq ret_from_except
360 andi. r0,r9,_TIF_SIGPENDING|_TIF_RESTORE_SIGMASK
361 beq ret_from_except
362 b do_user_signal
3638:
364 ori r10,r10,MSR_EE
365 SYNC
366 MTMSRD(r10) /* re-enable interrupts */
367 bl schedule
368 b 6b
369
370save_user_nvgprs:
371 lwz r8,TI_SIGFRAME(r12)
372
373.macro savewords start, end
374 1: stw \start,4*(\start)(r8)
375 .section __ex_table,"a"
376 .align 2
377 .long 1b,save_user_nvgprs_fault
378 .previous
379 .if \end - \start
380 savewords "(\start+1)",\end
381 .endif
382.endm
383 savewords 14,31
384 b save_user_nvgprs_cont
385
386
387save_user_nvgprs_fault:
388 li r3,11 /* SIGSEGV */
389 lwz r4,TI_TASK(r12)
390 bl force_sigsegv
391 340
392 rlwinm r12,r1,0,0,(31-THREAD_SHIFT) /* current_thread_info() */
393 lwz r9,TI_FLAGS(r12)
394 b save_user_nvgprs_cont
395
396#ifdef SHOW_SYSCALLS 341#ifdef SHOW_SYSCALLS
397do_show_syscall: 342do_show_syscall:
398#ifdef SHOW_SYSCALLS_TASK 343#ifdef SHOW_SYSCALLS_TASK
@@ -490,6 +435,14 @@ ppc_clone:
490 stw r0,_TRAP(r1) /* register set saved */ 435 stw r0,_TRAP(r1) /* register set saved */
491 b sys_clone 436 b sys_clone
492 437
438 .globl ppc_swapcontext
439ppc_swapcontext:
440 SAVE_NVGPRS(r1)
441 lwz r0,_TRAP(r1)
442 rlwinm r0,r0,0,0,30 /* clear LSB to indicate full */
443 stw r0,_TRAP(r1) /* register set saved */
444 b sys_swapcontext
445
493/* 446/*
494 * Top-level page fault handling. 447 * Top-level page fault handling.
495 * This is in assembler because if do_page_fault tells us that 448 * This is in assembler because if do_page_fault tells us that
@@ -683,7 +636,7 @@ user_exc_return: /* r10 contains MSR_KERNEL here */
683 /* Check current_thread_info()->flags */ 636 /* Check current_thread_info()->flags */
684 rlwinm r9,r1,0,0,(31-THREAD_SHIFT) 637 rlwinm r9,r1,0,0,(31-THREAD_SHIFT)
685 lwz r9,TI_FLAGS(r9) 638 lwz r9,TI_FLAGS(r9)
686 andi. r0,r9,(_TIF_SIGPENDING|_TIF_NEED_RESCHED|_TIF_RESTOREALL|_TIF_RESTORE_SIGMASK) 639 andi. r0,r9,(_TIF_SIGPENDING|_TIF_RESTORE_SIGMASK|_TIF_NEED_RESCHED)
687 bne do_work 640 bne do_work
688 641
689restore_user: 642restore_user:
diff --git a/arch/powerpc/kernel/entry_64.S b/arch/powerpc/kernel/entry_64.S
index 388f861b8ed1..24be0cf86d7f 100644
--- a/arch/powerpc/kernel/entry_64.S
+++ b/arch/powerpc/kernel/entry_64.S
@@ -160,7 +160,7 @@ syscall_exit:
160 mtmsrd r10,1 160 mtmsrd r10,1
161 ld r9,TI_FLAGS(r12) 161 ld r9,TI_FLAGS(r12)
162 li r11,-_LAST_ERRNO 162 li r11,-_LAST_ERRNO
163 andi. r0,r9,(_TIF_SYSCALL_T_OR_A|_TIF_SINGLESTEP|_TIF_SIGPENDING|_TIF_NEED_RESCHED|_TIF_RESTOREALL|_TIF_SAVE_NVGPRS|_TIF_NOERROR|_TIF_RESTORE_SIGMASK) 163 andi. r0,r9,(_TIF_SYSCALL_T_OR_A|_TIF_SINGLESTEP|_TIF_USER_WORK_MASK|_TIF_PERSYSCALL_MASK)
164 bne- syscall_exit_work 164 bne- syscall_exit_work
165 cmpld r3,r11 165 cmpld r3,r11
166 ld r5,_CCR(r1) 166 ld r5,_CCR(r1)
@@ -216,8 +216,10 @@ syscall_exit_work:
216 If TIF_NOERROR is set, just save r3 as it is. */ 216 If TIF_NOERROR is set, just save r3 as it is. */
217 217
218 andi. r0,r9,_TIF_RESTOREALL 218 andi. r0,r9,_TIF_RESTOREALL
219 bne- 2f 219 beq+ 0f
220 cmpld r3,r11 /* r10 is -LAST_ERRNO */ 220 REST_NVGPRS(r1)
221 b 2f
2220: cmpld r3,r11 /* r10 is -LAST_ERRNO */
221 blt+ 1f 223 blt+ 1f
222 andi. r0,r9,_TIF_NOERROR 224 andi. r0,r9,_TIF_NOERROR
223 bne- 1f 225 bne- 1f
@@ -229,9 +231,7 @@ syscall_exit_work:
2292: andi. r0,r9,(_TIF_PERSYSCALL_MASK) 2312: andi. r0,r9,(_TIF_PERSYSCALL_MASK)
230 beq 4f 232 beq 4f
231 233
232 /* Clear per-syscall TIF flags if any are set, but _leave_ 234 /* Clear per-syscall TIF flags if any are set. */
233 _TIF_SAVE_NVGPRS set in r9 since we haven't dealt with that
234 yet. */
235 235
236 li r11,_TIF_PERSYSCALL_MASK 236 li r11,_TIF_PERSYSCALL_MASK
237 addi r12,r12,TI_FLAGS 237 addi r12,r12,TI_FLAGS
@@ -240,10 +240,9 @@ syscall_exit_work:
240 stdcx. r10,0,r12 240 stdcx. r10,0,r12
241 bne- 3b 241 bne- 3b
242 subi r12,r12,TI_FLAGS 242 subi r12,r12,TI_FLAGS
243 243
2444: bl .save_nvgprs 2444: /* Anything else left to do? */
245 /* Anything else left to do? */ 245 andi. r0,r9,(_TIF_SYSCALL_T_OR_A|_TIF_SINGLESTEP)
246 andi. r0,r9,(_TIF_SYSCALL_T_OR_A|_TIF_SINGLESTEP|_TIF_SAVE_NVGPRS)
247 beq .ret_from_except_lite 246 beq .ret_from_except_lite
248 247
249 /* Re-enable interrupts */ 248 /* Re-enable interrupts */
@@ -251,26 +250,10 @@ syscall_exit_work:
251 ori r10,r10,MSR_EE 250 ori r10,r10,MSR_EE
252 mtmsrd r10,1 251 mtmsrd r10,1
253 252
254 andi. r0,r9,_TIF_SAVE_NVGPRS 253 bl .save_nvgprs
255 bne save_user_nvgprs
256
257 /* If tracing, re-enable interrupts and do it */
258save_user_nvgprs_cont:
259 andi. r0,r9,(_TIF_SYSCALL_T_OR_A|_TIF_SINGLESTEP)
260 beq 5f
261
262 addi r3,r1,STACK_FRAME_OVERHEAD 254 addi r3,r1,STACK_FRAME_OVERHEAD
263 bl .do_syscall_trace_leave 255 bl .do_syscall_trace_leave
264 REST_NVGPRS(r1) 256 b .ret_from_except
265 clrrdi r12,r1,THREAD_SHIFT
266
267 /* Disable interrupts again and handle other work if any */
2685: mfmsr r10
269 rldicl r10,r10,48,1
270 rotldi r10,r10,16
271 mtmsrd r10,1
272
273 b .ret_from_except_lite
274 257
275/* Save non-volatile GPRs, if not already saved. */ 258/* Save non-volatile GPRs, if not already saved. */
276_GLOBAL(save_nvgprs) 259_GLOBAL(save_nvgprs)
@@ -282,51 +265,6 @@ _GLOBAL(save_nvgprs)
282 std r0,_TRAP(r1) 265 std r0,_TRAP(r1)
283 blr 266 blr
284 267
285
286save_user_nvgprs:
287 ld r10,TI_SIGFRAME(r12)
288 andi. r0,r9,_TIF_32BIT
289 beq- save_user_nvgprs_64
290
291 /* 32-bit save to userspace */
292
293.macro savewords start, end
294 1: stw \start,4*(\start)(r10)
295 .section __ex_table,"a"
296 .align 3
297 .llong 1b,save_user_nvgprs_fault
298 .previous
299 .if \end - \start
300 savewords "(\start+1)",\end
301 .endif
302.endm
303 savewords 14,31
304 b save_user_nvgprs_cont
305
306save_user_nvgprs_64:
307 /* 64-bit save to userspace */
308
309.macro savelongs start, end
310 1: std \start,8*(\start)(r10)
311 .section __ex_table,"a"
312 .align 3
313 .llong 1b,save_user_nvgprs_fault
314 .previous
315 .if \end - \start
316 savelongs "(\start+1)",\end
317 .endif
318.endm
319 savelongs 14,31
320 b save_user_nvgprs_cont
321
322save_user_nvgprs_fault:
323 li r3,11 /* SIGSEGV */
324 ld r4,TI_TASK(r12)
325 bl .force_sigsegv
326
327 clrrdi r12,r1,THREAD_SHIFT
328 ld r9,TI_FLAGS(r12)
329 b save_user_nvgprs_cont
330 268
331/* 269/*
332 * The sigsuspend and rt_sigsuspend system calls can call do_signal 270 * The sigsuspend and rt_sigsuspend system calls can call do_signal
@@ -352,6 +290,16 @@ _GLOBAL(ppc_clone)
352 bl .sys_clone 290 bl .sys_clone
353 b syscall_exit 291 b syscall_exit
354 292
293_GLOBAL(ppc32_swapcontext)
294 bl .save_nvgprs
295 bl .compat_sys_swapcontext
296 b syscall_exit
297
298_GLOBAL(ppc64_swapcontext)
299 bl .save_nvgprs
300 bl .sys_swapcontext
301 b syscall_exit
302
355_GLOBAL(ret_from_fork) 303_GLOBAL(ret_from_fork)
356 bl .schedule_tail 304 bl .schedule_tail
357 REST_NVGPRS(r1) 305 REST_NVGPRS(r1)
diff --git a/arch/powerpc/kernel/head_64.S b/arch/powerpc/kernel/head_64.S
index 11f2cd5af7dc..9b65029dd2a3 100644
--- a/arch/powerpc/kernel/head_64.S
+++ b/arch/powerpc/kernel/head_64.S
@@ -1537,6 +1537,9 @@ _STATIC(__boot_from_prom)
1537 mr r28,r6 1537 mr r28,r6
1538 mr r27,r7 1538 mr r27,r7
1539 1539
1540 /* Align the stack to 16-byte boundary for broken yaboot */
1541 rldicr r1,r1,0,59
1542
1540 /* Make sure we are running in 64 bits mode */ 1543 /* Make sure we are running in 64 bits mode */
1541 bl .enable_64b_mode 1544 bl .enable_64b_mode
1542 1545
diff --git a/arch/powerpc/kernel/prom_init.c b/arch/powerpc/kernel/prom_init.c
index d34fe537400e..813c2cd194c2 100644
--- a/arch/powerpc/kernel/prom_init.c
+++ b/arch/powerpc/kernel/prom_init.c
@@ -978,7 +978,7 @@ static void __init prom_init_mem(void)
978 if (size == 0) 978 if (size == 0)
979 continue; 979 continue;
980 prom_debug(" %x %x\n", base, size); 980 prom_debug(" %x %x\n", base, size);
981 if (base == 0) 981 if (base == 0 && (RELOC(of_platform) & PLATFORM_LPAR))
982 RELOC(rmo_top) = size; 982 RELOC(rmo_top) = size;
983 if ((base + size) > RELOC(ram_top)) 983 if ((base + size) > RELOC(ram_top))
984 RELOC(ram_top) = base + size; 984 RELOC(ram_top) = base + size;
diff --git a/arch/powerpc/kernel/ptrace.c b/arch/powerpc/kernel/ptrace.c
index 400793c71304..bcb83574335b 100644
--- a/arch/powerpc/kernel/ptrace.c
+++ b/arch/powerpc/kernel/ptrace.c
@@ -561,10 +561,7 @@ void do_syscall_trace_leave(struct pt_regs *regs)
561 regs->result); 561 regs->result);
562 562
563 if ((test_thread_flag(TIF_SYSCALL_TRACE) 563 if ((test_thread_flag(TIF_SYSCALL_TRACE)
564#ifdef CONFIG_PPC64 564 || test_thread_flag(TIF_SINGLESTEP))
565 || test_thread_flag(TIF_SINGLESTEP)
566#endif
567 )
568 && (current->ptrace & PT_PTRACED)) 565 && (current->ptrace & PT_PTRACED))
569 do_syscall_trace(); 566 do_syscall_trace();
570} 567}
diff --git a/arch/powerpc/kernel/signal_32.c b/arch/powerpc/kernel/signal_32.c
index bd837b5dbf06..d7a4e814974d 100644
--- a/arch/powerpc/kernel/signal_32.c
+++ b/arch/powerpc/kernel/signal_32.c
@@ -151,10 +151,7 @@ static inline int save_general_regs(struct pt_regs *regs,
151 elf_greg_t64 *gregs = (elf_greg_t64 *)regs; 151 elf_greg_t64 *gregs = (elf_greg_t64 *)regs;
152 int i; 152 int i;
153 153
154 if (!FULL_REGS(regs)) { 154 WARN_ON(!FULL_REGS(regs));
155 set_thread_flag(TIF_SAVE_NVGPRS);
156 current_thread_info()->nvgprs_frame = frame->mc_gregs;
157 }
158 155
159 for (i = 0; i <= PT_RESULT; i ++) { 156 for (i = 0; i <= PT_RESULT; i ++) {
160 if (i == 14 && !FULL_REGS(regs)) 157 if (i == 14 && !FULL_REGS(regs))
@@ -215,15 +212,7 @@ static inline int get_old_sigaction(struct k_sigaction *new_ka,
215static inline int save_general_regs(struct pt_regs *regs, 212static inline int save_general_regs(struct pt_regs *regs,
216 struct mcontext __user *frame) 213 struct mcontext __user *frame)
217{ 214{
218 if (!FULL_REGS(regs)) { 215 WARN_ON(!FULL_REGS(regs));
219 /* Zero out the unsaved GPRs to avoid information
220 leak, and set TIF_SAVE_NVGPRS to ensure that the
221 registers do actually get saved later. */
222 memset(&regs->gpr[14], 0, 18 * sizeof(unsigned long));
223 current_thread_info()->nvgprs_frame = &frame->mc_gregs;
224 set_thread_flag(TIF_SAVE_NVGPRS);
225 }
226
227 return __copy_to_user(&frame->mc_gregs, regs, GP_REGS_SIZE); 216 return __copy_to_user(&frame->mc_gregs, regs, GP_REGS_SIZE);
228} 217}
229 218
@@ -826,8 +815,8 @@ static int do_setcontext(struct ucontext __user *ucp, struct pt_regs *regs, int
826} 815}
827 816
828long sys_swapcontext(struct ucontext __user *old_ctx, 817long sys_swapcontext(struct ucontext __user *old_ctx,
829 struct ucontext __user *new_ctx, 818 struct ucontext __user *new_ctx,
830 int ctx_size, int r6, int r7, int r8, struct pt_regs *regs) 819 int ctx_size, int r6, int r7, int r8, struct pt_regs *regs)
831{ 820{
832 unsigned char tmp; 821 unsigned char tmp;
833 822
diff --git a/arch/powerpc/kernel/signal_64.c b/arch/powerpc/kernel/signal_64.c
index 497a5d3df359..4324f8a8ba24 100644
--- a/arch/powerpc/kernel/signal_64.c
+++ b/arch/powerpc/kernel/signal_64.c
@@ -118,14 +118,7 @@ static long setup_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs,
118 err |= __put_user(0, &sc->v_regs); 118 err |= __put_user(0, &sc->v_regs);
119#endif /* CONFIG_ALTIVEC */ 119#endif /* CONFIG_ALTIVEC */
120 err |= __put_user(&sc->gp_regs, &sc->regs); 120 err |= __put_user(&sc->gp_regs, &sc->regs);
121 if (!FULL_REGS(regs)) { 121 WARN_ON(!FULL_REGS(regs));
122 /* Zero out the unsaved GPRs to avoid information
123 leak, and set TIF_SAVE_NVGPRS to ensure that the
124 registers do actually get saved later. */
125 memset(&regs->gpr[14], 0, 18 * sizeof(unsigned long));
126 set_thread_flag(TIF_SAVE_NVGPRS);
127 current_thread_info()->nvgprs_frame = &sc->gp_regs;
128 }
129 err |= __copy_to_user(&sc->gp_regs, regs, GP_REGS_SIZE); 122 err |= __copy_to_user(&sc->gp_regs, regs, GP_REGS_SIZE);
130 err |= __copy_to_user(&sc->fp_regs, &current->thread.fpr, FP_REGS_SIZE); 123 err |= __copy_to_user(&sc->fp_regs, &current->thread.fpr, FP_REGS_SIZE);
131 err |= __put_user(signr, &sc->signal); 124 err |= __put_user(signr, &sc->signal);
diff --git a/arch/powerpc/kernel/systbl.S b/arch/powerpc/kernel/systbl.S
index 8a9f994ed917..1ad55f0466fd 100644
--- a/arch/powerpc/kernel/systbl.S
+++ b/arch/powerpc/kernel/systbl.S
@@ -288,7 +288,7 @@ COMPAT_SYS(clock_settime)
288COMPAT_SYS(clock_gettime) 288COMPAT_SYS(clock_gettime)
289COMPAT_SYS(clock_getres) 289COMPAT_SYS(clock_getres)
290COMPAT_SYS(clock_nanosleep) 290COMPAT_SYS(clock_nanosleep)
291COMPAT_SYS(swapcontext) 291SYSX(ppc64_swapcontext,ppc32_swapcontext,ppc_swapcontext)
292COMPAT_SYS(tgkill) 292COMPAT_SYS(tgkill)
293COMPAT_SYS(utimes) 293COMPAT_SYS(utimes)
294COMPAT_SYS(statfs64) 294COMPAT_SYS(statfs64)
diff --git a/arch/powerpc/kernel/traps.c b/arch/powerpc/kernel/traps.c
index 7509aa6474f2..98660aedeeb7 100644
--- a/arch/powerpc/kernel/traps.c
+++ b/arch/powerpc/kernel/traps.c
@@ -814,6 +814,8 @@ void __kprobes program_check_exception(struct pt_regs *regs)
814 return; 814 return;
815 } 815 }
816 816
817 local_irq_enable();
818
817 /* Try to emulate it if we should. */ 819 /* Try to emulate it if we should. */
818 if (reason & (REASON_ILLEGAL | REASON_PRIVILEGED)) { 820 if (reason & (REASON_ILLEGAL | REASON_PRIVILEGED)) {
819 switch (emulate_instruction(regs)) { 821 switch (emulate_instruction(regs)) {
diff --git a/arch/powerpc/platforms/powermac/pfunc_base.c b/arch/powerpc/platforms/powermac/pfunc_base.c
index 4ffd2a9832a0..9b7150f10414 100644
--- a/arch/powerpc/platforms/powermac/pfunc_base.c
+++ b/arch/powerpc/platforms/powermac/pfunc_base.c
@@ -9,7 +9,12 @@
9#include <asm/pmac_feature.h> 9#include <asm/pmac_feature.h>
10#include <asm/pmac_pfunc.h> 10#include <asm/pmac_pfunc.h>
11 11
12#undef DEBUG
13#ifdef DEBUG
12#define DBG(fmt...) printk(fmt) 14#define DBG(fmt...) printk(fmt)
15#else
16#define DBG(fmt...)
17#endif
13 18
14static irqreturn_t macio_gpio_irq(int irq, void *data, struct pt_regs *regs) 19static irqreturn_t macio_gpio_irq(int irq, void *data, struct pt_regs *regs)
15{ 20{
diff --git a/arch/powerpc/platforms/powermac/pfunc_core.c b/arch/powerpc/platforms/powermac/pfunc_core.c
index 356a739e52b2..4baa75b1d36f 100644
--- a/arch/powerpc/platforms/powermac/pfunc_core.c
+++ b/arch/powerpc/platforms/powermac/pfunc_core.c
@@ -20,7 +20,13 @@
20#define LOG_PARSE(fmt...) 20#define LOG_PARSE(fmt...)
21#define LOG_ERROR(fmt...) printk(fmt) 21#define LOG_ERROR(fmt...) printk(fmt)
22#define LOG_BLOB(t,b,c) 22#define LOG_BLOB(t,b,c)
23
24#undef DEBUG
25#ifdef DEBUG
23#define DBG(fmt...) printk(fmt) 26#define DBG(fmt...) printk(fmt)
27#else
28#define DBG(fmt...)
29#endif
24 30
25/* Command numbers */ 31/* Command numbers */
26#define PMF_CMD_LIST 0 32#define PMF_CMD_LIST 0
diff --git a/arch/powerpc/platforms/powermac/smp.c b/arch/powerpc/platforms/powermac/smp.c
index 0df2cdcd805c..6d64a9bf3474 100644
--- a/arch/powerpc/platforms/powermac/smp.c
+++ b/arch/powerpc/platforms/powermac/smp.c
@@ -435,7 +435,7 @@ struct smp_ops_t psurge_smp_ops = {
435 */ 435 */
436 436
437static void (*pmac_tb_freeze)(int freeze); 437static void (*pmac_tb_freeze)(int freeze);
438static unsigned long timebase; 438static u64 timebase;
439static int tb_req; 439static int tb_req;
440 440
441static void smp_core99_give_timebase(void) 441static void smp_core99_give_timebase(void)
diff --git a/arch/ppc/kernel/asm-offsets.c b/arch/ppc/kernel/asm-offsets.c
index 7964bf660e92..77e4dc780f8c 100644
--- a/arch/ppc/kernel/asm-offsets.c
+++ b/arch/ppc/kernel/asm-offsets.c
@@ -131,7 +131,6 @@ main(void)
131 DEFINE(CPU_SPEC_FEATURES, offsetof(struct cpu_spec, cpu_features)); 131 DEFINE(CPU_SPEC_FEATURES, offsetof(struct cpu_spec, cpu_features));
132 DEFINE(CPU_SPEC_SETUP, offsetof(struct cpu_spec, cpu_setup)); 132 DEFINE(CPU_SPEC_SETUP, offsetof(struct cpu_spec, cpu_setup));
133 133
134 DEFINE(TI_SIGFRAME, offsetof(struct thread_info, nvgprs_frame));
135 DEFINE(TI_TASK, offsetof(struct thread_info, task)); 134 DEFINE(TI_TASK, offsetof(struct thread_info, task));
136 DEFINE(TI_EXECDOMAIN, offsetof(struct thread_info, exec_domain)); 135 DEFINE(TI_EXECDOMAIN, offsetof(struct thread_info, exec_domain));
137 DEFINE(TI_FLAGS, offsetof(struct thread_info, flags)); 136 DEFINE(TI_FLAGS, offsetof(struct thread_info, flags));
diff --git a/arch/ppc/kernel/entry.S b/arch/ppc/kernel/entry.S
index a48b950722a1..3a2815978488 100644
--- a/arch/ppc/kernel/entry.S
+++ b/arch/ppc/kernel/entry.S
@@ -227,7 +227,7 @@ ret_from_syscall:
227 MTMSRD(r10) 227 MTMSRD(r10)
228 lwz r9,TI_FLAGS(r12) 228 lwz r9,TI_FLAGS(r12)
229 li r8,-_LAST_ERRNO 229 li r8,-_LAST_ERRNO
230 andi. r0,r9,(_TIF_SYSCALL_T_OR_A|_TIF_SIGPENDING|_TIF_NEED_RESCHED|_TIF_RESTOREALL) 230 andi. r0,r9,(_TIF_SYSCALL_T_OR_A|_TIF_SINGLESTEP|_TIF_USER_WORK_MASK|_TIF_PERSYSCALL_MASK)
231 bne- syscall_exit_work 231 bne- syscall_exit_work
232 cmplw 0,r3,r8 232 cmplw 0,r3,r8
233 blt+ syscall_exit_cont 233 blt+ syscall_exit_cont
@@ -287,8 +287,10 @@ syscall_dotrace:
287 287
288syscall_exit_work: 288syscall_exit_work:
289 andi. r0,r9,_TIF_RESTOREALL 289 andi. r0,r9,_TIF_RESTOREALL
290 bne- 2f 290 beq+ 0f
291 cmplw 0,r3,r8 291 REST_NVGPRS(r1)
292 b 2f
2930: cmplw 0,r3,r8
292 blt+ 1f 294 blt+ 1f
293 andi. r0,r9,_TIF_NOERROR 295 andi. r0,r9,_TIF_NOERROR
294 bne- 1f 296 bne- 1f
@@ -302,9 +304,7 @@ syscall_exit_work:
3022: andi. r0,r9,(_TIF_PERSYSCALL_MASK) 3042: andi. r0,r9,(_TIF_PERSYSCALL_MASK)
303 beq 4f 305 beq 4f
304 306
305 /* Clear per-syscall TIF flags if any are set, but _leave_ 307 /* Clear per-syscall TIF flags if any are set. */
306 _TIF_SAVE_NVGPRS set in r9 since we haven't dealt with that
307 yet. */
308 308
309 li r11,_TIF_PERSYSCALL_MASK 309 li r11,_TIF_PERSYSCALL_MASK
310 addi r12,r12,TI_FLAGS 310 addi r12,r12,TI_FLAGS
@@ -318,8 +318,13 @@ syscall_exit_work:
318 subi r12,r12,TI_FLAGS 318 subi r12,r12,TI_FLAGS
319 319
3204: /* Anything which requires enabling interrupts? */ 3204: /* Anything which requires enabling interrupts? */
321 andi. r0,r9,(_TIF_SYSCALL_T_OR_A|_TIF_SINGLESTEP|_TIF_SAVE_NVGPRS) 321 andi. r0,r9,(_TIF_SYSCALL_T_OR_A|_TIF_SINGLESTEP)
322 beq 7f 322 beq ret_from_except
323
324 /* Re-enable interrupts */
325 ori r10,r10,MSR_EE
326 SYNC
327 MTMSRD(r10)
323 328
324 /* Save NVGPRS if they're not saved already */ 329 /* Save NVGPRS if they're not saved already */
325 lwz r4,TRAP(r1) 330 lwz r4,TRAP(r1)
@@ -328,71 +333,11 @@ syscall_exit_work:
328 SAVE_NVGPRS(r1) 333 SAVE_NVGPRS(r1)
329 li r4,0xc00 334 li r4,0xc00
330 stw r4,TRAP(r1) 335 stw r4,TRAP(r1)
331 3365:
332 /* Re-enable interrupts */
3335: ori r10,r10,MSR_EE
334 SYNC
335 MTMSRD(r10)
336
337 andi. r0,r9,_TIF_SAVE_NVGPRS
338 bne save_user_nvgprs
339
340save_user_nvgprs_cont:
341 andi. r0,r9,(_TIF_SYSCALL_T_OR_A|_TIF_SINGLESTEP)
342 beq 7f
343
344 addi r3,r1,STACK_FRAME_OVERHEAD 337 addi r3,r1,STACK_FRAME_OVERHEAD
345 bl do_syscall_trace_leave 338 bl do_syscall_trace_leave
346 REST_NVGPRS(r1) 339 b ret_from_except_full
347
3486: lwz r3,GPR3(r1)
349 LOAD_MSR_KERNEL(r10,MSR_KERNEL) /* doesn't include MSR_EE */
350 SYNC
351 MTMSRD(r10) /* disable interrupts again */
352 rlwinm r12,r1,0,0,18 /* current_thread_info() */
353 lwz r9,TI_FLAGS(r12)
3547:
355 andi. r0,r9,_TIF_NEED_RESCHED
356 bne 8f
357 lwz r5,_MSR(r1)
358 andi. r5,r5,MSR_PR
359 beq ret_from_except
360 andi. r0,r9,_TIF_SIGPENDING
361 beq ret_from_except
362 b do_user_signal
3638:
364 ori r10,r10,MSR_EE
365 SYNC
366 MTMSRD(r10) /* re-enable interrupts */
367 bl schedule
368 b 6b
369
370save_user_nvgprs:
371 lwz r8,TI_SIGFRAME(r12)
372
373.macro savewords start, end
374 1: stw \start,4*(\start)(r8)
375 .section __ex_table,"a"
376 .align 2
377 .long 1b,save_user_nvgprs_fault
378 .previous
379 .if \end - \start
380 savewords "(\start+1)",\end
381 .endif
382.endm
383 savewords 14,31
384 b save_user_nvgprs_cont
385
386
387save_user_nvgprs_fault:
388 li r3,11 /* SIGSEGV */
389 lwz r4,TI_TASK(r12)
390 bl force_sigsegv
391 340
392 rlwinm r12,r1,0,0,18 /* current_thread_info() */
393 lwz r9,TI_FLAGS(r12)
394 b save_user_nvgprs_cont
395
396#ifdef SHOW_SYSCALLS 341#ifdef SHOW_SYSCALLS
397do_show_syscall: 342do_show_syscall:
398#ifdef SHOW_SYSCALLS_TASK 343#ifdef SHOW_SYSCALLS_TASK
@@ -490,6 +435,14 @@ ppc_clone:
490 stw r0,TRAP(r1) /* register set saved */ 435 stw r0,TRAP(r1) /* register set saved */
491 b sys_clone 436 b sys_clone
492 437
438 .globl ppc_swapcontext
439ppc_swapcontext:
440 SAVE_NVGPRS(r1)
441 lwz r0,TRAP(r1)
442 rlwinm r0,r0,0,0,30 /* clear LSB to indicate full */
443 stw r0,TRAP(r1) /* register set saved */
444 b sys_swapcontext
445
493/* 446/*
494 * Top-level page fault handling. 447 * Top-level page fault handling.
495 * This is in assembler because if do_page_fault tells us that 448 * This is in assembler because if do_page_fault tells us that
@@ -683,7 +636,7 @@ user_exc_return: /* r10 contains MSR_KERNEL here */
683 /* Check current_thread_info()->flags */ 636 /* Check current_thread_info()->flags */
684 rlwinm r9,r1,0,0,18 637 rlwinm r9,r1,0,0,18
685 lwz r9,TI_FLAGS(r9) 638 lwz r9,TI_FLAGS(r9)
686 andi. r0,r9,(_TIF_SIGPENDING|_TIF_NEED_RESCHED|_TIF_RESTOREALL) 639 andi. r0,r9,(_TIF_SIGPENDING|_TIF_RESTORE_SIGMASK|_TIF_NEED_RESCHED)
687 bne do_work 640 bne do_work
688 641
689restore_user: 642restore_user:
diff --git a/arch/s390/lib/spinlock.c b/arch/s390/lib/spinlock.c
index 60f80a4eed4e..b9b7958a226a 100644
--- a/arch/s390/lib/spinlock.c
+++ b/arch/s390/lib/spinlock.c
@@ -2,8 +2,7 @@
2 * arch/s390/lib/spinlock.c 2 * arch/s390/lib/spinlock.c
3 * Out of line spinlock code. 3 * Out of line spinlock code.
4 * 4 *
5 * S390 version 5 * Copyright (C) IBM Corp. 2004, 2006
6 * Copyright (C) 2004 IBM Deutschland Entwicklung GmbH, IBM Corporation
7 * Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com) 6 * Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com)
8 */ 7 */
9 8
@@ -44,6 +43,8 @@ _raw_spin_lock_wait(raw_spinlock_t *lp, unsigned int pc)
44 _diag44(); 43 _diag44();
45 count = spin_retry; 44 count = spin_retry;
46 } 45 }
46 if (__raw_spin_is_locked(lp))
47 continue;
47 if (_raw_compare_and_swap(&lp->lock, 0, pc) == 0) 48 if (_raw_compare_and_swap(&lp->lock, 0, pc) == 0)
48 return; 49 return;
49 } 50 }
@@ -56,6 +57,8 @@ _raw_spin_trylock_retry(raw_spinlock_t *lp, unsigned int pc)
56 int count = spin_retry; 57 int count = spin_retry;
57 58
58 while (count-- > 0) { 59 while (count-- > 0) {
60 if (__raw_spin_is_locked(lp))
61 continue;
59 if (_raw_compare_and_swap(&lp->lock, 0, pc) == 0) 62 if (_raw_compare_and_swap(&lp->lock, 0, pc) == 0)
60 return 1; 63 return 1;
61 } 64 }
@@ -74,6 +77,8 @@ _raw_read_lock_wait(raw_rwlock_t *rw)
74 _diag44(); 77 _diag44();
75 count = spin_retry; 78 count = spin_retry;
76 } 79 }
80 if (!__raw_read_can_lock(rw))
81 continue;
77 old = rw->lock & 0x7fffffffU; 82 old = rw->lock & 0x7fffffffU;
78 if (_raw_compare_and_swap(&rw->lock, old, old + 1) == old) 83 if (_raw_compare_and_swap(&rw->lock, old, old + 1) == old)
79 return; 84 return;
@@ -88,6 +93,8 @@ _raw_read_trylock_retry(raw_rwlock_t *rw)
88 int count = spin_retry; 93 int count = spin_retry;
89 94
90 while (count-- > 0) { 95 while (count-- > 0) {
96 if (!__raw_read_can_lock(rw))
97 continue;
91 old = rw->lock & 0x7fffffffU; 98 old = rw->lock & 0x7fffffffU;
92 if (_raw_compare_and_swap(&rw->lock, old, old + 1) == old) 99 if (_raw_compare_and_swap(&rw->lock, old, old + 1) == old)
93 return 1; 100 return 1;
@@ -106,6 +113,8 @@ _raw_write_lock_wait(raw_rwlock_t *rw)
106 _diag44(); 113 _diag44();
107 count = spin_retry; 114 count = spin_retry;
108 } 115 }
116 if (!__raw_write_can_lock(rw))
117 continue;
109 if (_raw_compare_and_swap(&rw->lock, 0, 0x80000000) == 0) 118 if (_raw_compare_and_swap(&rw->lock, 0, 0x80000000) == 0)
110 return; 119 return;
111 } 120 }
@@ -118,6 +127,8 @@ _raw_write_trylock_retry(raw_rwlock_t *rw)
118 int count = spin_retry; 127 int count = spin_retry;
119 128
120 while (count-- > 0) { 129 while (count-- > 0) {
130 if (!__raw_write_can_lock(rw))
131 continue;
121 if (_raw_compare_and_swap(&rw->lock, 0, 0x80000000) == 0) 132 if (_raw_compare_and_swap(&rw->lock, 0, 0x80000000) == 0)
122 return 1; 133 return 1;
123 } 134 }
diff --git a/arch/s390/lib/uaccess.S b/arch/s390/lib/uaccess.S
index 88fc94fe6488..5d59e2625048 100644
--- a/arch/s390/lib/uaccess.S
+++ b/arch/s390/lib/uaccess.S
@@ -198,12 +198,12 @@ __strnlen_user_asm:
1980: srst %r2,%r1 1980: srst %r2,%r1
199 jo 0b 199 jo 0b
200 sacf 0 200 sacf 0
201 jh 1f # \0 found in string ?
202 ahi %r2,1 # strnlen_user result includes the \0 201 ahi %r2,1 # strnlen_user result includes the \0
2031: slr %r2,%r3 202 # or return count+1 if \0 not found
203 slr %r2,%r3
204 br %r14 204 br %r14
2052: sacf 0 2052: sacf 0
206 lhi %r2,-EFAULT 206 slr %r2,%r2 # return 0 on exception
207 br %r14 207 br %r14
208 .section __ex_table,"a" 208 .section __ex_table,"a"
209 .long 0b,2b 209 .long 0b,2b
diff --git a/arch/s390/lib/uaccess64.S b/arch/s390/lib/uaccess64.S
index 50219786fc7a..19b41a33c230 100644
--- a/arch/s390/lib/uaccess64.S
+++ b/arch/s390/lib/uaccess64.S
@@ -194,12 +194,12 @@ __strnlen_user_asm:
1940: srst %r2,%r1 1940: srst %r2,%r1
195 jo 0b 195 jo 0b
196 sacf 0 196 sacf 0
197 jh 1f # \0 found in string ?
198 aghi %r2,1 # strnlen_user result includes the \0 197 aghi %r2,1 # strnlen_user result includes the \0
1991: slgr %r2,%r3 198 # or return count+1 if \0 not found
199 slgr %r2,%r3
200 br %r14 200 br %r14
2012: sacf 0 2012: sacf 0
202 lghi %r2,-EFAULT 202 slgr %r2,%r2 # return 0 on exception
203 br %r14 203 br %r14
204 .section __ex_table,"a" 204 .section __ex_table,"a"
205 .quad 0b,2b 205 .quad 0b,2b
diff --git a/arch/sh/Kconfig b/arch/sh/Kconfig
index e73621d03a28..e9b275d90737 100644
--- a/arch/sh/Kconfig
+++ b/arch/sh/Kconfig
@@ -392,9 +392,9 @@ config SH_TMU
392 392
393endmenu 393endmenu
394 394
395source "arch/sh/boards/renesas/hs7751rvoip/Kconfig" 395#source "arch/sh/boards/renesas/hs7751rvoip/Kconfig"
396 396
397source "arch/sh/boards/renesas/rts7751r2d/Kconfig" 397#source "arch/sh/boards/renesas/rts7751r2d/Kconfig"
398 398
399config SH_PCLK_FREQ 399config SH_PCLK_FREQ
400 int "Peripheral clock frequency (in Hz)" 400 int "Peripheral clock frequency (in Hz)"
diff --git a/arch/sparc64/kernel/sys32.S b/arch/sparc64/kernel/sys32.S
index 60b59375aa78..c4a1cef4b1e5 100644
--- a/arch/sparc64/kernel/sys32.S
+++ b/arch/sparc64/kernel/sys32.S
@@ -318,7 +318,7 @@ do_sys_recvmsg: /* compat_sys_recvmsg(int, struct compat_msghdr *, unsigned int)
318 nop 318 nop
319 nop 319 nop
320 320
321 .section __ex_table 321 .section __ex_table,"a"
322 .align 4 322 .align 4
323 .word 1b, __retl_efault, 2b, __retl_efault 323 .word 1b, __retl_efault, 2b, __retl_efault
324 .word 3b, __retl_efault, 4b, __retl_efault 324 .word 3b, __retl_efault, 4b, __retl_efault
diff --git a/arch/sparc64/kernel/una_asm.S b/arch/sparc64/kernel/una_asm.S
index 1f5b5b708ce7..be183fe41443 100644
--- a/arch/sparc64/kernel/una_asm.S
+++ b/arch/sparc64/kernel/una_asm.S
@@ -47,7 +47,7 @@ __do_int_store:
47 mov 0, %o0 47 mov 0, %o0
48 .size __do_int_store, .-__do_int_store 48 .size __do_int_store, .-__do_int_store
49 49
50 .section __ex_table 50 .section __ex_table,"a"
51 .word 4b, __retl_efault 51 .word 4b, __retl_efault
52 .word 5b, __retl_efault 52 .word 5b, __retl_efault
53 .word 6b, __retl_efault 53 .word 6b, __retl_efault
@@ -129,7 +129,7 @@ do_int_load:
129 mov 0, %o0 129 mov 0, %o0
130 .size __do_int_load, .-__do_int_load 130 .size __do_int_load, .-__do_int_load
131 131
132 .section __ex_table 132 .section __ex_table,"a"
133 .word 4b, __retl_efault 133 .word 4b, __retl_efault
134 .word 5b, __retl_efault 134 .word 5b, __retl_efault
135 .word 6b, __retl_efault 135 .word 6b, __retl_efault
diff --git a/arch/sparc64/lib/U1copy_from_user.S b/arch/sparc64/lib/U1copy_from_user.S
index 93146a81e2d3..3192b0bf4fab 100644
--- a/arch/sparc64/lib/U1copy_from_user.S
+++ b/arch/sparc64/lib/U1copy_from_user.S
@@ -9,7 +9,7 @@
9 .align 4; \ 9 .align 4; \
1099: retl; \ 1099: retl; \
11 mov 1, %o0; \ 11 mov 1, %o0; \
12 .section __ex_table; \ 12 .section __ex_table,"a";\
13 .align 4; \ 13 .align 4; \
14 .word 98b, 99b; \ 14 .word 98b, 99b; \
15 .text; \ 15 .text; \
diff --git a/arch/sparc64/lib/U1copy_to_user.S b/arch/sparc64/lib/U1copy_to_user.S
index 1fccc521e2bd..d1210ffb0b82 100644
--- a/arch/sparc64/lib/U1copy_to_user.S
+++ b/arch/sparc64/lib/U1copy_to_user.S
@@ -9,7 +9,7 @@
9 .align 4; \ 9 .align 4; \
1099: retl; \ 1099: retl; \
11 mov 1, %o0; \ 11 mov 1, %o0; \
12 .section __ex_table; \ 12 .section __ex_table,"a";\
13 .align 4; \ 13 .align 4; \
14 .word 98b, 99b; \ 14 .word 98b, 99b; \
15 .text; \ 15 .text; \
diff --git a/arch/sparc64/lib/U3copy_from_user.S b/arch/sparc64/lib/U3copy_from_user.S
index df600b667e48..f5bfc8d9d216 100644
--- a/arch/sparc64/lib/U3copy_from_user.S
+++ b/arch/sparc64/lib/U3copy_from_user.S
@@ -9,7 +9,7 @@
9 .align 4; \ 9 .align 4; \
1099: retl; \ 1099: retl; \
11 mov 1, %o0; \ 11 mov 1, %o0; \
12 .section __ex_table; \ 12 .section __ex_table,"a";\
13 .align 4; \ 13 .align 4; \
14 .word 98b, 99b; \ 14 .word 98b, 99b; \
15 .text; \ 15 .text; \
diff --git a/arch/sparc64/lib/U3copy_to_user.S b/arch/sparc64/lib/U3copy_to_user.S
index f337f22ed82e..2334f111bb0c 100644
--- a/arch/sparc64/lib/U3copy_to_user.S
+++ b/arch/sparc64/lib/U3copy_to_user.S
@@ -9,7 +9,7 @@
9 .align 4; \ 9 .align 4; \
1099: retl; \ 1099: retl; \
11 mov 1, %o0; \ 11 mov 1, %o0; \
12 .section __ex_table; \ 12 .section __ex_table,"a";\
13 .align 4; \ 13 .align 4; \
14 .word 98b, 99b; \ 14 .word 98b, 99b; \
15 .text; \ 15 .text; \
diff --git a/arch/sparc64/lib/bzero.S b/arch/sparc64/lib/bzero.S
index 21a933ffb7c2..1d2abcfa4e52 100644
--- a/arch/sparc64/lib/bzero.S
+++ b/arch/sparc64/lib/bzero.S
@@ -92,7 +92,7 @@ __bzero_done:
92 .align 4; \ 92 .align 4; \
9399: retl; \ 9399: retl; \
94 mov %o1, %o0; \ 94 mov %o1, %o0; \
95 .section __ex_table; \ 95 .section __ex_table,"a";\
96 .align 4; \ 96 .align 4; \
97 .word 98b, 99b; \ 97 .word 98b, 99b; \
98 .text; \ 98 .text; \
diff --git a/arch/sparc64/lib/copy_in_user.S b/arch/sparc64/lib/copy_in_user.S
index 816076c0bc06..650af3f21f78 100644
--- a/arch/sparc64/lib/copy_in_user.S
+++ b/arch/sparc64/lib/copy_in_user.S
@@ -13,7 +13,7 @@
13 .align 4; \ 13 .align 4; \
1499: retl; \ 1499: retl; \
15 mov 1, %o0; \ 15 mov 1, %o0; \
16 .section __ex_table; \ 16 .section __ex_table,"a";\
17 .align 4; \ 17 .align 4; \
18 .word 98b, 99b; \ 18 .word 98b, 99b; \
19 .text; \ 19 .text; \
diff --git a/arch/sparc64/lib/csum_copy_from_user.S b/arch/sparc64/lib/csum_copy_from_user.S
index 817ebdae39f8..a22eddbe5dba 100644
--- a/arch/sparc64/lib/csum_copy_from_user.S
+++ b/arch/sparc64/lib/csum_copy_from_user.S
@@ -9,7 +9,7 @@
9 .align 4; \ 9 .align 4; \
1099: retl; \ 1099: retl; \
11 mov -1, %o0; \ 11 mov -1, %o0; \
12 .section __ex_table; \ 12 .section __ex_table,"a";\
13 .align 4; \ 13 .align 4; \
14 .word 98b, 99b; \ 14 .word 98b, 99b; \
15 .text; \ 15 .text; \
diff --git a/arch/sparc64/lib/csum_copy_to_user.S b/arch/sparc64/lib/csum_copy_to_user.S
index c2f9463ea1e2..d5b12f441f02 100644
--- a/arch/sparc64/lib/csum_copy_to_user.S
+++ b/arch/sparc64/lib/csum_copy_to_user.S
@@ -9,7 +9,7 @@
9 .align 4; \ 9 .align 4; \
1099: retl; \ 1099: retl; \
11 mov -1, %o0; \ 11 mov -1, %o0; \
12 .section __ex_table; \ 12 .section __ex_table,"a";\
13 .align 4; \ 13 .align 4; \
14 .word 98b, 99b; \ 14 .word 98b, 99b; \
15 .text; \ 15 .text; \
diff --git a/arch/sparc64/lib/strlen_user.S b/arch/sparc64/lib/strlen_user.S
index 9ed54ba14fc6..114ed111e251 100644
--- a/arch/sparc64/lib/strlen_user.S
+++ b/arch/sparc64/lib/strlen_user.S
@@ -85,7 +85,7 @@ __strnlen_user:
85 retl 85 retl
86 clr %o0 86 clr %o0
87 87
88 .section __ex_table,#alloc 88 .section __ex_table,"a"
89 .align 4 89 .align 4
90 90
91 .word 10b, 30b 91 .word 10b, 30b
diff --git a/arch/sparc64/lib/strncpy_from_user.S b/arch/sparc64/lib/strncpy_from_user.S
index e1264650ca7a..b2f499f79427 100644
--- a/arch/sparc64/lib/strncpy_from_user.S
+++ b/arch/sparc64/lib/strncpy_from_user.S
@@ -125,7 +125,7 @@ __strncpy_from_user:
125 add %o2, %o3, %o0 125 add %o2, %o3, %o0
126 .size __strncpy_from_user, .-__strncpy_from_user 126 .size __strncpy_from_user, .-__strncpy_from_user
127 127
128 .section __ex_table,#alloc 128 .section __ex_table,"a"
129 .align 4 129 .align 4
130 .word 60b, __retl_efault 130 .word 60b, __retl_efault
131 .word 61b, __retl_efault 131 .word 61b, __retl_efault
diff --git a/arch/sparc64/solaris/entry64.S b/arch/sparc64/solaris/entry64.S
index eb314ed23cdb..f170324e8bf2 100644
--- a/arch/sparc64/solaris/entry64.S
+++ b/arch/sparc64/solaris/entry64.S
@@ -217,7 +217,7 @@ solaris_unimplemented:
217 ba,pt %xcc, ret_from_solaris 217 ba,pt %xcc, ret_from_solaris
218 nop 218 nop
219 219
220 .section __ex_table,#alloc 220 .section __ex_table,"a"
221 .align 4 221 .align 4
222 .word exen, exenf 222 .word exen, exenf
223 223
diff --git a/arch/v850/kernel/process.c b/arch/v850/kernel/process.c
index eb909937958b..621111ddf907 100644
--- a/arch/v850/kernel/process.c
+++ b/arch/v850/kernel/process.c
@@ -30,6 +30,9 @@
30#include <asm/system.h> 30#include <asm/system.h>
31#include <asm/pgtable.h> 31#include <asm/pgtable.h>
32 32
33void (*pm_power_off)(void) = NULL;
34EXPORT_SYMBOL(pm_power_off);
35
33extern void ret_from_fork (void); 36extern void ret_from_fork (void);
34 37
35 38
diff --git a/arch/x86_64/kernel/machine_kexec.c b/arch/x86_64/kernel/machine_kexec.c
index 89fab51e20f4..25ac8a3faae6 100644
--- a/arch/x86_64/kernel/machine_kexec.c
+++ b/arch/x86_64/kernel/machine_kexec.c
@@ -140,7 +140,7 @@ static void load_segments(void)
140 "\tmovl %0,%%ss\n" 140 "\tmovl %0,%%ss\n"
141 "\tmovl %0,%%fs\n" 141 "\tmovl %0,%%fs\n"
142 "\tmovl %0,%%gs\n" 142 "\tmovl %0,%%gs\n"
143 : : "a" (__KERNEL_DS) 143 : : "a" (__KERNEL_DS) : "memory"
144 ); 144 );
145} 145}
146 146
diff --git a/arch/xtensa/Kconfig b/arch/xtensa/Kconfig
index 7ee4a14ec3b1..e90ef5db8913 100644
--- a/arch/xtensa/Kconfig
+++ b/arch/xtensa/Kconfig
@@ -26,6 +26,10 @@ config GENERIC_HARDIRQS
26 bool 26 bool
27 default y 27 default y
28 28
29config RWSEM_GENERIC_SPINLOCK
30 bool
31 default y
32
29source "init/Kconfig" 33source "init/Kconfig"
30 34
31menu "Processor type and features" 35menu "Processor type and features"
diff --git a/arch/xtensa/kernel/process.c b/arch/xtensa/kernel/process.c
index f1f596644bfc..64a649eb883f 100644
--- a/arch/xtensa/kernel/process.c
+++ b/arch/xtensa/kernel/process.c
@@ -64,6 +64,9 @@ EXPORT_SYMBOL(init_task);
64 64
65struct task_struct *current_set[NR_CPUS] = {&init_task, }; 65struct task_struct *current_set[NR_CPUS] = {&init_task, };
66 66
67void (*pm_power_off)(void) = NULL;
68EXPORT_SYMBOL(pm_power_off);
69
67 70
68#if XCHAL_CP_NUM > 0 71#if XCHAL_CP_NUM > 0
69 72
diff --git a/block/ll_rw_blk.c b/block/ll_rw_blk.c
index 03d9c82b0fe7..0ef2971a9e82 100644
--- a/block/ll_rw_blk.c
+++ b/block/ll_rw_blk.c
@@ -625,26 +625,31 @@ static inline int ordered_bio_endio(struct request *rq, struct bio *bio,
625 * Different hardware can have different requirements as to what pages 625 * Different hardware can have different requirements as to what pages
626 * it can do I/O directly to. A low level driver can call 626 * it can do I/O directly to. A low level driver can call
627 * blk_queue_bounce_limit to have lower memory pages allocated as bounce 627 * blk_queue_bounce_limit to have lower memory pages allocated as bounce
628 * buffers for doing I/O to pages residing above @page. By default 628 * buffers for doing I/O to pages residing above @page.
629 * the block layer sets this to the highest numbered "low" memory page.
630 **/ 629 **/
631void blk_queue_bounce_limit(request_queue_t *q, u64 dma_addr) 630void blk_queue_bounce_limit(request_queue_t *q, u64 dma_addr)
632{ 631{
633 unsigned long bounce_pfn = dma_addr >> PAGE_SHIFT; 632 unsigned long bounce_pfn = dma_addr >> PAGE_SHIFT;
634 633 int dma = 0;
635 /* 634
636 * set appropriate bounce gfp mask -- unfortunately we don't have a 635 q->bounce_gfp = GFP_NOIO;
637 * full 4GB zone, so we have to resort to low memory for any bounces. 636#if BITS_PER_LONG == 64
638 * ISA has its own < 16MB zone. 637 /* Assume anything <= 4GB can be handled by IOMMU.
639 */ 638 Actually some IOMMUs can handle everything, but I don't
640 if (bounce_pfn < blk_max_low_pfn) { 639 know of a way to test this here. */
641 BUG_ON(dma_addr < BLK_BOUNCE_ISA); 640 if (bounce_pfn < (0xffffffff>>PAGE_SHIFT))
641 dma = 1;
642 q->bounce_pfn = max_low_pfn;
643#else
644 if (bounce_pfn < blk_max_low_pfn)
645 dma = 1;
646 q->bounce_pfn = bounce_pfn;
647#endif
648 if (dma) {
642 init_emergency_isa_pool(); 649 init_emergency_isa_pool();
643 q->bounce_gfp = GFP_NOIO | GFP_DMA; 650 q->bounce_gfp = GFP_NOIO | GFP_DMA;
644 } else 651 q->bounce_pfn = bounce_pfn;
645 q->bounce_gfp = GFP_NOIO; 652 }
646
647 q->bounce_pfn = bounce_pfn;
648} 653}
649 654
650EXPORT_SYMBOL(blk_queue_bounce_limit); 655EXPORT_SYMBOL(blk_queue_bounce_limit);
diff --git a/drivers/atm/fore200e.c b/drivers/atm/fore200e.c
index 14f6a6201da3..05983a312d50 100644
--- a/drivers/atm/fore200e.c
+++ b/drivers/atm/fore200e.c
@@ -555,7 +555,7 @@ fore200e_pca_reset(struct fore200e* fore200e)
555} 555}
556 556
557 557
558static int __init 558static int __devinit
559fore200e_pca_map(struct fore200e* fore200e) 559fore200e_pca_map(struct fore200e* fore200e)
560{ 560{
561 DPRINTK(2, "device %s being mapped in memory\n", fore200e->name); 561 DPRINTK(2, "device %s being mapped in memory\n", fore200e->name);
@@ -589,7 +589,7 @@ fore200e_pca_unmap(struct fore200e* fore200e)
589} 589}
590 590
591 591
592static int __init 592static int __devinit
593fore200e_pca_configure(struct fore200e* fore200e) 593fore200e_pca_configure(struct fore200e* fore200e)
594{ 594{
595 struct pci_dev* pci_dev = (struct pci_dev*)fore200e->bus_dev; 595 struct pci_dev* pci_dev = (struct pci_dev*)fore200e->bus_dev;
@@ -2125,7 +2125,7 @@ fore200e_change_qos(struct atm_vcc* vcc,struct atm_qos* qos, int flags)
2125} 2125}
2126 2126
2127 2127
2128static int __init 2128static int __devinit
2129fore200e_irq_request(struct fore200e* fore200e) 2129fore200e_irq_request(struct fore200e* fore200e)
2130{ 2130{
2131 if (request_irq(fore200e->irq, fore200e_interrupt, SA_SHIRQ, fore200e->name, fore200e->atm_dev) < 0) { 2131 if (request_irq(fore200e->irq, fore200e_interrupt, SA_SHIRQ, fore200e->name, fore200e->atm_dev) < 0) {
@@ -2148,7 +2148,7 @@ fore200e_irq_request(struct fore200e* fore200e)
2148} 2148}
2149 2149
2150 2150
2151static int __init 2151static int __devinit
2152fore200e_get_esi(struct fore200e* fore200e) 2152fore200e_get_esi(struct fore200e* fore200e)
2153{ 2153{
2154 struct prom_data* prom = fore200e_kmalloc(sizeof(struct prom_data), GFP_KERNEL | GFP_DMA); 2154 struct prom_data* prom = fore200e_kmalloc(sizeof(struct prom_data), GFP_KERNEL | GFP_DMA);
@@ -2180,7 +2180,7 @@ fore200e_get_esi(struct fore200e* fore200e)
2180} 2180}
2181 2181
2182 2182
2183static int __init 2183static int __devinit
2184fore200e_alloc_rx_buf(struct fore200e* fore200e) 2184fore200e_alloc_rx_buf(struct fore200e* fore200e)
2185{ 2185{
2186 int scheme, magn, nbr, size, i; 2186 int scheme, magn, nbr, size, i;
@@ -2245,7 +2245,7 @@ fore200e_alloc_rx_buf(struct fore200e* fore200e)
2245} 2245}
2246 2246
2247 2247
2248static int __init 2248static int __devinit
2249fore200e_init_bs_queue(struct fore200e* fore200e) 2249fore200e_init_bs_queue(struct fore200e* fore200e)
2250{ 2250{
2251 int scheme, magn, i; 2251 int scheme, magn, i;
@@ -2308,7 +2308,7 @@ fore200e_init_bs_queue(struct fore200e* fore200e)
2308} 2308}
2309 2309
2310 2310
2311static int __init 2311static int __devinit
2312fore200e_init_rx_queue(struct fore200e* fore200e) 2312fore200e_init_rx_queue(struct fore200e* fore200e)
2313{ 2313{
2314 struct host_rxq* rxq = &fore200e->host_rxq; 2314 struct host_rxq* rxq = &fore200e->host_rxq;
@@ -2368,7 +2368,7 @@ fore200e_init_rx_queue(struct fore200e* fore200e)
2368} 2368}
2369 2369
2370 2370
2371static int __init 2371static int __devinit
2372fore200e_init_tx_queue(struct fore200e* fore200e) 2372fore200e_init_tx_queue(struct fore200e* fore200e)
2373{ 2373{
2374 struct host_txq* txq = &fore200e->host_txq; 2374 struct host_txq* txq = &fore200e->host_txq;
@@ -2431,7 +2431,7 @@ fore200e_init_tx_queue(struct fore200e* fore200e)
2431} 2431}
2432 2432
2433 2433
2434static int __init 2434static int __devinit
2435fore200e_init_cmd_queue(struct fore200e* fore200e) 2435fore200e_init_cmd_queue(struct fore200e* fore200e)
2436{ 2436{
2437 struct host_cmdq* cmdq = &fore200e->host_cmdq; 2437 struct host_cmdq* cmdq = &fore200e->host_cmdq;
@@ -2487,7 +2487,7 @@ fore200e_param_bs_queue(struct fore200e* fore200e,
2487} 2487}
2488 2488
2489 2489
2490static int __init 2490static int __devinit
2491fore200e_initialize(struct fore200e* fore200e) 2491fore200e_initialize(struct fore200e* fore200e)
2492{ 2492{
2493 struct cp_queues __iomem * cpq; 2493 struct cp_queues __iomem * cpq;
@@ -2539,7 +2539,7 @@ fore200e_initialize(struct fore200e* fore200e)
2539} 2539}
2540 2540
2541 2541
2542static void __init 2542static void __devinit
2543fore200e_monitor_putc(struct fore200e* fore200e, char c) 2543fore200e_monitor_putc(struct fore200e* fore200e, char c)
2544{ 2544{
2545 struct cp_monitor __iomem * monitor = fore200e->cp_monitor; 2545 struct cp_monitor __iomem * monitor = fore200e->cp_monitor;
@@ -2551,7 +2551,7 @@ fore200e_monitor_putc(struct fore200e* fore200e, char c)
2551} 2551}
2552 2552
2553 2553
2554static int __init 2554static int __devinit
2555fore200e_monitor_getc(struct fore200e* fore200e) 2555fore200e_monitor_getc(struct fore200e* fore200e)
2556{ 2556{
2557 struct cp_monitor __iomem * monitor = fore200e->cp_monitor; 2557 struct cp_monitor __iomem * monitor = fore200e->cp_monitor;
@@ -2576,7 +2576,7 @@ fore200e_monitor_getc(struct fore200e* fore200e)
2576} 2576}
2577 2577
2578 2578
2579static void __init 2579static void __devinit
2580fore200e_monitor_puts(struct fore200e* fore200e, char* str) 2580fore200e_monitor_puts(struct fore200e* fore200e, char* str)
2581{ 2581{
2582 while (*str) { 2582 while (*str) {
@@ -2591,7 +2591,7 @@ fore200e_monitor_puts(struct fore200e* fore200e, char* str)
2591} 2591}
2592 2592
2593 2593
2594static int __init 2594static int __devinit
2595fore200e_start_fw(struct fore200e* fore200e) 2595fore200e_start_fw(struct fore200e* fore200e)
2596{ 2596{
2597 int ok; 2597 int ok;
@@ -2622,7 +2622,7 @@ fore200e_start_fw(struct fore200e* fore200e)
2622} 2622}
2623 2623
2624 2624
2625static int __init 2625static int __devinit
2626fore200e_load_fw(struct fore200e* fore200e) 2626fore200e_load_fw(struct fore200e* fore200e)
2627{ 2627{
2628 u32* fw_data = (u32*) fore200e->bus->fw_data; 2628 u32* fw_data = (u32*) fore200e->bus->fw_data;
@@ -2648,7 +2648,7 @@ fore200e_load_fw(struct fore200e* fore200e)
2648} 2648}
2649 2649
2650 2650
2651static int __init 2651static int __devinit
2652fore200e_register(struct fore200e* fore200e) 2652fore200e_register(struct fore200e* fore200e)
2653{ 2653{
2654 struct atm_dev* atm_dev; 2654 struct atm_dev* atm_dev;
@@ -2675,7 +2675,7 @@ fore200e_register(struct fore200e* fore200e)
2675} 2675}
2676 2676
2677 2677
2678static int __init 2678static int __devinit
2679fore200e_init(struct fore200e* fore200e) 2679fore200e_init(struct fore200e* fore200e)
2680{ 2680{
2681 if (fore200e_register(fore200e) < 0) 2681 if (fore200e_register(fore200e) < 0)
@@ -2721,7 +2721,7 @@ fore200e_init(struct fore200e* fore200e)
2721 return -EBUSY; 2721 return -EBUSY;
2722 2722
2723 fore200e_supply(fore200e); 2723 fore200e_supply(fore200e);
2724 2724
2725 /* all done, board initialization is now complete */ 2725 /* all done, board initialization is now complete */
2726 fore200e->state = FORE200E_STATE_COMPLETE; 2726 fore200e->state = FORE200E_STATE_COMPLETE;
2727 return 0; 2727 return 0;
diff --git a/drivers/block/DAC960.c b/drivers/block/DAC960.c
index 6ede1f352c29..37b8cda3e8bc 100644
--- a/drivers/block/DAC960.c
+++ b/drivers/block/DAC960.c
@@ -41,6 +41,7 @@
41#include <linux/timer.h> 41#include <linux/timer.h>
42#include <linux/pci.h> 42#include <linux/pci.h>
43#include <linux/init.h> 43#include <linux/init.h>
44#include <linux/random.h>
44#include <asm/io.h> 45#include <asm/io.h>
45#include <asm/uaccess.h> 46#include <asm/uaccess.h>
46#include "DAC960.h" 47#include "DAC960.h"
@@ -3463,7 +3464,7 @@ static inline boolean DAC960_ProcessCompletedRequest(DAC960_Command_T *Command,
3463 Command->SegmentCount, Command->DmaDirection); 3464 Command->SegmentCount, Command->DmaDirection);
3464 3465
3465 if (!end_that_request_first(Request, UpToDate, Command->BlockCount)) { 3466 if (!end_that_request_first(Request, UpToDate, Command->BlockCount)) {
3466 3467 add_disk_randomness(Request->rq_disk);
3467 end_that_request_last(Request, UpToDate); 3468 end_that_request_last(Request, UpToDate);
3468 3469
3469 if (Command->Completion) { 3470 if (Command->Completion) {
diff --git a/drivers/char/hw_random.c b/drivers/char/hw_random.c
index b3bc2e37e616..29dc87e59020 100644
--- a/drivers/char/hw_random.c
+++ b/drivers/char/hw_random.c
@@ -131,7 +131,9 @@ enum {
131 rng_hw_none, 131 rng_hw_none,
132 rng_hw_intel, 132 rng_hw_intel,
133 rng_hw_amd, 133 rng_hw_amd,
134#ifdef __i386__
134 rng_hw_via, 135 rng_hw_via,
136#endif
135 rng_hw_geode, 137 rng_hw_geode,
136}; 138};
137 139
diff --git a/drivers/char/mmtimer.c b/drivers/char/mmtimer.c
index c92378121b4c..1b05fa688996 100644
--- a/drivers/char/mmtimer.c
+++ b/drivers/char/mmtimer.c
@@ -675,7 +675,7 @@ static int __init mmtimer_init(void)
675 cnodeid_t node, maxn = -1; 675 cnodeid_t node, maxn = -1;
676 676
677 if (!ia64_platform_is("sn2")) 677 if (!ia64_platform_is("sn2"))
678 return -1; 678 return 0;
679 679
680 /* 680 /*
681 * Sanity check the cycles/sec variable 681 * Sanity check the cycles/sec variable
diff --git a/drivers/char/pcmcia/cm4000_cs.c b/drivers/char/pcmcia/cm4000_cs.c
index 649677b5dc36..5fdf18515433 100644
--- a/drivers/char/pcmcia/cm4000_cs.c
+++ b/drivers/char/pcmcia/cm4000_cs.c
@@ -13,11 +13,12 @@
13 * 13 *
14 * (C) 2000,2001,2002,2003,2004 Omnikey AG 14 * (C) 2000,2001,2002,2003,2004 Omnikey AG
15 * 15 *
16 * (C) 2005 Harald Welte <laforge@gnumonks.org> 16 * (C) 2005-2006 Harald Welte <laforge@gnumonks.org>
17 * - Adhere to Kernel CodingStyle 17 * - Adhere to Kernel CodingStyle
18 * - Port to 2.6.13 "new" style PCMCIA 18 * - Port to 2.6.13 "new" style PCMCIA
19 * - Check for copy_{from,to}_user return values 19 * - Check for copy_{from,to}_user return values
20 * - Use nonseekable_open() 20 * - Use nonseekable_open()
21 * - add class interface for udev device creation
21 * 22 *
22 * All rights reserved. Licensed under dual BSD/GPL license. 23 * All rights reserved. Licensed under dual BSD/GPL license.
23 */ 24 */
@@ -56,7 +57,7 @@ module_param(pc_debug, int, 0600);
56#else 57#else
57#define DEBUGP(n, rdr, x, args...) 58#define DEBUGP(n, rdr, x, args...)
58#endif 59#endif
59static char *version = "cm4000_cs.c v2.4.0gm5 - All bugs added by Harald Welte"; 60static char *version = "cm4000_cs.c v2.4.0gm6 - All bugs added by Harald Welte";
60 61
61#define T_1SEC (HZ) 62#define T_1SEC (HZ)
62#define T_10MSEC msecs_to_jiffies(10) 63#define T_10MSEC msecs_to_jiffies(10)
@@ -156,6 +157,7 @@ struct cm4000_dev {
156 /*queue*/ 4*sizeof(wait_queue_head_t)) 157 /*queue*/ 4*sizeof(wait_queue_head_t))
157 158
158static dev_link_t *dev_table[CM4000_MAX_DEV]; 159static dev_link_t *dev_table[CM4000_MAX_DEV];
160static struct class *cmm_class;
159 161
160/* This table doesn't use spaces after the comma between fields and thus 162/* This table doesn't use spaces after the comma between fields and thus
161 * violates CodingStyle. However, I don't really think wrapping it around will 163 * violates CodingStyle. However, I don't really think wrapping it around will
@@ -1937,6 +1939,9 @@ static int cm4000_attach(struct pcmcia_device *p_dev)
1937 link->state |= DEV_PRESENT | DEV_CONFIG_PENDING; 1939 link->state |= DEV_PRESENT | DEV_CONFIG_PENDING;
1938 cm4000_config(link, i); 1940 cm4000_config(link, i);
1939 1941
1942 class_device_create(cmm_class, NULL, MKDEV(major, i), NULL,
1943 "cmm%d", i);
1944
1940 return 0; 1945 return 0;
1941} 1946}
1942 1947
@@ -1962,6 +1967,8 @@ static void cm4000_detach(struct pcmcia_device *p_dev)
1962 dev_table[devno] = NULL; 1967 dev_table[devno] = NULL;
1963 kfree(dev); 1968 kfree(dev);
1964 1969
1970 class_device_destroy(cmm_class, MKDEV(major, devno));
1971
1965 return; 1972 return;
1966} 1973}
1967 1974
@@ -1995,8 +2002,18 @@ static struct pcmcia_driver cm4000_driver = {
1995 2002
1996static int __init cmm_init(void) 2003static int __init cmm_init(void)
1997{ 2004{
2005 int rc;
2006
1998 printk(KERN_INFO "%s\n", version); 2007 printk(KERN_INFO "%s\n", version);
1999 pcmcia_register_driver(&cm4000_driver); 2008
2009 cmm_class = class_create(THIS_MODULE, "cardman_4000");
2010 if (!cmm_class)
2011 return -1;
2012
2013 rc = pcmcia_register_driver(&cm4000_driver);
2014 if (rc < 0)
2015 return rc;
2016
2000 major = register_chrdev(0, DEVICE_NAME, &cm4000_fops); 2017 major = register_chrdev(0, DEVICE_NAME, &cm4000_fops);
2001 if (major < 0) { 2018 if (major < 0) {
2002 printk(KERN_WARNING MODULE_NAME 2019 printk(KERN_WARNING MODULE_NAME
@@ -2012,6 +2029,7 @@ static void __exit cmm_exit(void)
2012 printk(KERN_INFO MODULE_NAME ": unloading\n"); 2029 printk(KERN_INFO MODULE_NAME ": unloading\n");
2013 pcmcia_unregister_driver(&cm4000_driver); 2030 pcmcia_unregister_driver(&cm4000_driver);
2014 unregister_chrdev(major, DEVICE_NAME); 2031 unregister_chrdev(major, DEVICE_NAME);
2032 class_destroy(cmm_class);
2015}; 2033};
2016 2034
2017module_init(cmm_init); 2035module_init(cmm_init);
diff --git a/drivers/char/pcmcia/cm4040_cs.c b/drivers/char/pcmcia/cm4040_cs.c
index 46eb371bf17e..466e33bab029 100644
--- a/drivers/char/pcmcia/cm4040_cs.c
+++ b/drivers/char/pcmcia/cm4040_cs.c
@@ -3,12 +3,13 @@
3 * 3 *
4 * (c) 2000-2004 Omnikey AG (http://www.omnikey.com/) 4 * (c) 2000-2004 Omnikey AG (http://www.omnikey.com/)
5 * 5 *
6 * (C) 2005 Harald Welte <laforge@gnumonks.org> 6 * (C) 2005-2006 Harald Welte <laforge@gnumonks.org>
7 * - add support for poll() 7 * - add support for poll()
8 * - driver cleanup 8 * - driver cleanup
9 * - add waitqueues 9 * - add waitqueues
10 * - adhere to linux kernel coding style and policies 10 * - adhere to linux kernel coding style and policies
11 * - support 2.6.13 "new style" pcmcia interface 11 * - support 2.6.13 "new style" pcmcia interface
12 * - add class interface for udev device creation
12 * 13 *
13 * The device basically is a USB CCID compliant device that has been 14 * The device basically is a USB CCID compliant device that has been
14 * attached to an I/O-Mapped FIFO. 15 * attached to an I/O-Mapped FIFO.
@@ -53,7 +54,7 @@ module_param(pc_debug, int, 0600);
53#endif 54#endif
54 55
55static char *version = 56static char *version =
56"OMNIKEY CardMan 4040 v1.1.0gm4 - All bugs added by Harald Welte"; 57"OMNIKEY CardMan 4040 v1.1.0gm5 - All bugs added by Harald Welte";
57 58
58#define CCID_DRIVER_BULK_DEFAULT_TIMEOUT (150*HZ) 59#define CCID_DRIVER_BULK_DEFAULT_TIMEOUT (150*HZ)
59#define CCID_DRIVER_ASYNC_POWERUP_TIMEOUT (35*HZ) 60#define CCID_DRIVER_ASYNC_POWERUP_TIMEOUT (35*HZ)
@@ -67,6 +68,7 @@ static char *version =
67static void reader_release(dev_link_t *link); 68static void reader_release(dev_link_t *link);
68 69
69static int major; 70static int major;
71static struct class *cmx_class;
70 72
71#define BS_READABLE 0x01 73#define BS_READABLE 0x01
72#define BS_WRITABLE 0x02 74#define BS_WRITABLE 0x02
@@ -696,6 +698,9 @@ static int reader_attach(struct pcmcia_device *p_dev)
696 link->state |= DEV_PRESENT | DEV_CONFIG_PENDING; 698 link->state |= DEV_PRESENT | DEV_CONFIG_PENDING;
697 reader_config(link, i); 699 reader_config(link, i);
698 700
701 class_device_create(cmx_class, NULL, MKDEV(major, i), NULL,
702 "cmx%d", i);
703
699 return 0; 704 return 0;
700} 705}
701 706
@@ -721,6 +726,8 @@ static void reader_detach(struct pcmcia_device *p_dev)
721 dev_table[devno] = NULL; 726 dev_table[devno] = NULL;
722 kfree(dev); 727 kfree(dev);
723 728
729 class_device_destroy(cmx_class, MKDEV(major, devno));
730
724 return; 731 return;
725} 732}
726 733
@@ -755,8 +762,17 @@ static struct pcmcia_driver reader_driver = {
755 762
756static int __init cm4040_init(void) 763static int __init cm4040_init(void)
757{ 764{
765 int rc;
766
758 printk(KERN_INFO "%s\n", version); 767 printk(KERN_INFO "%s\n", version);
759 pcmcia_register_driver(&reader_driver); 768 cmx_class = class_create(THIS_MODULE, "cardman_4040");
769 if (!cmx_class)
770 return -1;
771
772 rc = pcmcia_register_driver(&reader_driver);
773 if (rc < 0)
774 return rc;
775
760 major = register_chrdev(0, DEVICE_NAME, &reader_fops); 776 major = register_chrdev(0, DEVICE_NAME, &reader_fops);
761 if (major < 0) { 777 if (major < 0) {
762 printk(KERN_WARNING MODULE_NAME 778 printk(KERN_WARNING MODULE_NAME
@@ -771,6 +787,7 @@ static void __exit cm4040_exit(void)
771 printk(KERN_INFO MODULE_NAME ": unloading\n"); 787 printk(KERN_INFO MODULE_NAME ": unloading\n");
772 pcmcia_unregister_driver(&reader_driver); 788 pcmcia_unregister_driver(&reader_driver);
773 unregister_chrdev(major, DEVICE_NAME); 789 unregister_chrdev(major, DEVICE_NAME);
790 class_destroy(cmx_class);
774} 791}
775 792
776module_init(cm4040_init); 793module_init(cm4040_init);
diff --git a/drivers/edac/Kconfig b/drivers/edac/Kconfig
index 18a455651121..52f3eb45d2b9 100644
--- a/drivers/edac/Kconfig
+++ b/drivers/edac/Kconfig
@@ -6,17 +6,29 @@
6# $Id: Kconfig,v 1.4.2.7 2005/07/08 22:05:38 dsp_llnl Exp $ 6# $Id: Kconfig,v 1.4.2.7 2005/07/08 22:05:38 dsp_llnl Exp $
7# 7#
8 8
9menu 'EDAC - error detection and reporting (RAS)' 9menu 'EDAC - error detection and reporting (RAS) (EXPERIMENTAL)'
10 10
11config EDAC 11config EDAC
12 tristate "EDAC core system error reporting" 12 tristate "EDAC core system error reporting (EXPERIMENTAL)"
13 depends on X86 13 depends on X86 && EXPERIMENTAL
14 help 14 help
15 EDAC is designed to report errors in the core system. 15 EDAC is designed to report errors in the core system.
16 These are low-level errors that are reported in the CPU or 16 These are low-level errors that are reported in the CPU or
17 supporting chipset: memory errors, cache errors, PCI errors, 17 supporting chipset: memory errors, cache errors, PCI errors,
18 thermal throttling, etc.. If unsure, select 'Y'. 18 thermal throttling, etc.. If unsure, select 'Y'.
19 19
20 If this code is reporting problems on your system, please
21 see the EDAC project web pages for more information at:
22
23 <http://bluesmoke.sourceforge.net/>
24
25 and:
26
27 <http://buttersideup.com/edacwiki>
28
29 There is also a mailing list for the EDAC project, which can
30 be found via the sourceforge page.
31
20 32
21comment "Reporting subsystems" 33comment "Reporting subsystems"
22 depends on EDAC 34 depends on EDAC
diff --git a/drivers/edac/edac_mc.c b/drivers/edac/edac_mc.c
index b10ee4698b1d..262e44544dc8 100644
--- a/drivers/edac/edac_mc.c
+++ b/drivers/edac/edac_mc.c
@@ -132,11 +132,13 @@ static struct kobject edac_pci_kobj;
132 * /sys/devices/system/edac/mc; 132 * /sys/devices/system/edac/mc;
133 * data structures and methods 133 * data structures and methods
134 */ 134 */
135#if 0
135static ssize_t memctrl_string_show(void *ptr, char *buffer) 136static ssize_t memctrl_string_show(void *ptr, char *buffer)
136{ 137{
137 char *value = (char*) ptr; 138 char *value = (char*) ptr;
138 return sprintf(buffer, "%s\n", value); 139 return sprintf(buffer, "%s\n", value);
139} 140}
141#endif
140 142
141static ssize_t memctrl_int_show(void *ptr, char *buffer) 143static ssize_t memctrl_int_show(void *ptr, char *buffer)
142{ 144{
@@ -207,7 +209,9 @@ struct memctrl_dev_attribute attr_##_name = { \
207}; 209};
208 210
209/* cwrow<id> attribute f*/ 211/* cwrow<id> attribute f*/
212#if 0
210MEMCTRL_STRING_ATTR(mc_version,EDAC_MC_VERSION,S_IRUGO,memctrl_string_show,NULL); 213MEMCTRL_STRING_ATTR(mc_version,EDAC_MC_VERSION,S_IRUGO,memctrl_string_show,NULL);
214#endif
211 215
212/* csrow<id> control files */ 216/* csrow<id> control files */
213MEMCTRL_ATTR(panic_on_ue,S_IRUGO|S_IWUSR,memctrl_int_show,memctrl_int_store); 217MEMCTRL_ATTR(panic_on_ue,S_IRUGO|S_IWUSR,memctrl_int_show,memctrl_int_store);
@@ -222,7 +226,6 @@ static struct memctrl_dev_attribute *memctrl_attr[] = {
222 &attr_log_ue, 226 &attr_log_ue,
223 &attr_log_ce, 227 &attr_log_ce,
224 &attr_poll_msec, 228 &attr_poll_msec,
225 &attr_mc_version,
226 NULL, 229 NULL,
227}; 230};
228 231
@@ -309,6 +312,8 @@ struct list_control {
309 int *count; 312 int *count;
310}; 313};
311 314
315
316#if 0
312/* Output the list as: vendor_id:device:id<,vendor_id:device_id> */ 317/* Output the list as: vendor_id:device:id<,vendor_id:device_id> */
313static ssize_t edac_pci_list_string_show(void *ptr, char *buffer) 318static ssize_t edac_pci_list_string_show(void *ptr, char *buffer)
314{ 319{
@@ -430,6 +435,7 @@ static ssize_t edac_pci_list_string_store(void *ptr, const char *buffer,
430 return count; 435 return count;
431} 436}
432 437
438#endif
433static ssize_t edac_pci_int_show(void *ptr, char *buffer) 439static ssize_t edac_pci_int_show(void *ptr, char *buffer)
434{ 440{
435 int *value = ptr; 441 int *value = ptr;
@@ -498,6 +504,7 @@ struct edac_pci_dev_attribute edac_pci_attr_##_name = { \
498 .store = _store, \ 504 .store = _store, \
499}; 505};
500 506
507#if 0
501static struct list_control pci_whitelist_control = { 508static struct list_control pci_whitelist_control = {
502 .list = pci_whitelist, 509 .list = pci_whitelist,
503 .count = &pci_whitelist_count 510 .count = &pci_whitelist_count
@@ -520,6 +527,7 @@ EDAC_PCI_STRING_ATTR(pci_parity_blacklist,
520 S_IRUGO|S_IWUSR, 527 S_IRUGO|S_IWUSR,
521 edac_pci_list_string_show, 528 edac_pci_list_string_show,
522 edac_pci_list_string_store); 529 edac_pci_list_string_store);
530#endif
523 531
524/* PCI Parity control files */ 532/* PCI Parity control files */
525EDAC_PCI_ATTR(check_pci_parity,S_IRUGO|S_IWUSR,edac_pci_int_show,edac_pci_int_store); 533EDAC_PCI_ATTR(check_pci_parity,S_IRUGO|S_IWUSR,edac_pci_int_show,edac_pci_int_store);
@@ -531,8 +539,6 @@ static struct edac_pci_dev_attribute *edac_pci_attr[] = {
531 &edac_pci_attr_check_pci_parity, 539 &edac_pci_attr_check_pci_parity,
532 &edac_pci_attr_panic_on_pci_parity, 540 &edac_pci_attr_panic_on_pci_parity,
533 &edac_pci_attr_pci_parity_count, 541 &edac_pci_attr_pci_parity_count,
534 &edac_pci_attr_pci_parity_whitelist,
535 &edac_pci_attr_pci_parity_blacklist,
536 NULL, 542 NULL,
537}; 543};
538 544
diff --git a/drivers/firmware/dcdbas.c b/drivers/firmware/dcdbas.c
index 8ed6ddbb9c5d..4652512f7d1a 100644
--- a/drivers/firmware/dcdbas.c
+++ b/drivers/firmware/dcdbas.c
@@ -39,7 +39,7 @@
39#include "dcdbas.h" 39#include "dcdbas.h"
40 40
41#define DRIVER_NAME "dcdbas" 41#define DRIVER_NAME "dcdbas"
42#define DRIVER_VERSION "5.6.0-1" 42#define DRIVER_VERSION "5.6.0-2"
43#define DRIVER_DESCRIPTION "Dell Systems Management Base Driver" 43#define DRIVER_DESCRIPTION "Dell Systems Management Base Driver"
44 44
45static struct platform_device *dcdbas_pdev; 45static struct platform_device *dcdbas_pdev;
@@ -581,9 +581,13 @@ static int __init dcdbas_init(void)
581 */ 581 */
582static void __exit dcdbas_exit(void) 582static void __exit dcdbas_exit(void)
583{ 583{
584 platform_device_unregister(dcdbas_pdev); 584 /*
585 * make sure functions that use dcdbas_pdev are called
586 * before platform_device_unregister
587 */
585 unregister_reboot_notifier(&dcdbas_reboot_nb); 588 unregister_reboot_notifier(&dcdbas_reboot_nb);
586 smi_data_buf_free(); 589 smi_data_buf_free();
590 platform_device_unregister(dcdbas_pdev);
587} 591}
588 592
589module_init(dcdbas_init); 593module_init(dcdbas_init);
diff --git a/drivers/ide/legacy/ide-cs.c b/drivers/ide/legacy/ide-cs.c
index 4c2af9020905..6213bd3caee5 100644
--- a/drivers/ide/legacy/ide-cs.c
+++ b/drivers/ide/legacy/ide-cs.c
@@ -445,6 +445,7 @@ static struct pcmcia_device_id ide_ids[] = {
445 PCMCIA_DEVICE_PROD_ID12("PCMCIA", "PnPIDE", 0x281f1c5d, 0x0c694728), 445 PCMCIA_DEVICE_PROD_ID12("PCMCIA", "PnPIDE", 0x281f1c5d, 0x0c694728),
446 PCMCIA_DEVICE_PROD_ID12("SHUTTLE TECHNOLOGY LTD.", "PCCARD-IDE/ATAPI Adapter", 0x4a3f0ba0, 0x322560e1), 446 PCMCIA_DEVICE_PROD_ID12("SHUTTLE TECHNOLOGY LTD.", "PCCARD-IDE/ATAPI Adapter", 0x4a3f0ba0, 0x322560e1),
447 PCMCIA_DEVICE_PROD_ID12("TOSHIBA", "MK2001MPL", 0xb4585a1a, 0x3489e003), 447 PCMCIA_DEVICE_PROD_ID12("TOSHIBA", "MK2001MPL", 0xb4585a1a, 0x3489e003),
448 PCMCIA_DEVICE_PROD_ID1("TRANSCEND 512M ", 0xd0909443),
448 PCMCIA_DEVICE_PROD_ID12("WIT", "IDE16", 0x244e5994, 0x3e232852), 449 PCMCIA_DEVICE_PROD_ID12("WIT", "IDE16", 0x244e5994, 0x3e232852),
449 PCMCIA_DEVICE_PROD_ID1("STI Flash", 0xe4a13209), 450 PCMCIA_DEVICE_PROD_ID1("STI Flash", 0xe4a13209),
450 PCMCIA_DEVICE_PROD_ID12("STI", "Flash 5.0", 0xbf2df18d, 0x8cb57a0e), 451 PCMCIA_DEVICE_PROD_ID12("STI", "Flash 5.0", 0xbf2df18d, 0x8cb57a0e),
diff --git a/drivers/infiniband/ulp/srp/ib_srp.c b/drivers/infiniband/ulp/srp/ib_srp.c
index 2d2d4ac3525a..960dae5c87d1 100644
--- a/drivers/infiniband/ulp/srp/ib_srp.c
+++ b/drivers/infiniband/ulp/srp/ib_srp.c
@@ -1155,6 +1155,12 @@ static int srp_send_tsk_mgmt(struct scsi_cmnd *scmnd, u8 func)
1155 1155
1156 spin_lock_irq(target->scsi_host->host_lock); 1156 spin_lock_irq(target->scsi_host->host_lock);
1157 1157
1158 if (target->state == SRP_TARGET_DEAD ||
1159 target->state == SRP_TARGET_REMOVED) {
1160 scmnd->result = DID_BAD_TARGET << 16;
1161 goto out;
1162 }
1163
1158 if (scmnd->host_scribble == (void *) -1L) 1164 if (scmnd->host_scribble == (void *) -1L)
1159 goto out; 1165 goto out;
1160 1166
diff --git a/drivers/input/mouse/psmouse-base.c b/drivers/input/mouse/psmouse-base.c
index 19b1b0121726..ad6217467676 100644
--- a/drivers/input/mouse/psmouse-base.c
+++ b/drivers/input/mouse/psmouse-base.c
@@ -58,7 +58,7 @@ static unsigned int psmouse_resetafter = 5;
58module_param_named(resetafter, psmouse_resetafter, uint, 0644); 58module_param_named(resetafter, psmouse_resetafter, uint, 0644);
59MODULE_PARM_DESC(resetafter, "Reset device after so many bad packets (0 = never)."); 59MODULE_PARM_DESC(resetafter, "Reset device after so many bad packets (0 = never).");
60 60
61static unsigned int psmouse_resync_time = 5; 61static unsigned int psmouse_resync_time;
62module_param_named(resync_time, psmouse_resync_time, uint, 0644); 62module_param_named(resync_time, psmouse_resync_time, uint, 0644);
63MODULE_PARM_DESC(resync_time, "How long can mouse stay idle before forcing resync (in seconds, 0 = never)."); 63MODULE_PARM_DESC(resync_time, "How long can mouse stay idle before forcing resync (in seconds, 0 = never).");
64 64
diff --git a/drivers/isdn/hisax/config.c b/drivers/isdn/hisax/config.c
index 8159bcecd0c2..df9d65201819 100644
--- a/drivers/isdn/hisax/config.c
+++ b/drivers/isdn/hisax/config.c
@@ -1929,6 +1929,8 @@ static struct pci_device_id hisax_pci_tbl[] __initdata = {
1929 {PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_B00B, PCI_ANY_ID, PCI_ANY_ID}, 1929 {PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_B00B, PCI_ANY_ID, PCI_ANY_ID},
1930 {PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_B00C, PCI_ANY_ID, PCI_ANY_ID}, 1930 {PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_B00C, PCI_ANY_ID, PCI_ANY_ID},
1931 {PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_B100, PCI_ANY_ID, PCI_ANY_ID}, 1931 {PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_B100, PCI_ANY_ID, PCI_ANY_ID},
1932 {PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_B700, PCI_ANY_ID, PCI_ANY_ID},
1933 {PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_B701, PCI_ANY_ID, PCI_ANY_ID},
1932 {PCI_VENDOR_ID_ABOCOM, PCI_DEVICE_ID_ABOCOM_2BD1, PCI_ANY_ID, PCI_ANY_ID}, 1934 {PCI_VENDOR_ID_ABOCOM, PCI_DEVICE_ID_ABOCOM_2BD1, PCI_ANY_ID, PCI_ANY_ID},
1933 {PCI_VENDOR_ID_ASUSTEK, PCI_DEVICE_ID_ASUSTEK_0675, PCI_ANY_ID, PCI_ANY_ID}, 1935 {PCI_VENDOR_ID_ASUSTEK, PCI_DEVICE_ID_ASUSTEK_0675, PCI_ANY_ID, PCI_ANY_ID},
1934 {PCI_VENDOR_ID_BERKOM, PCI_DEVICE_ID_BERKOM_T_CONCEPT, PCI_ANY_ID, PCI_ANY_ID}, 1936 {PCI_VENDOR_ID_BERKOM, PCI_DEVICE_ID_BERKOM_T_CONCEPT, PCI_ANY_ID, PCI_ANY_ID},
diff --git a/drivers/isdn/hisax/hfc_pci.c b/drivers/isdn/hisax/hfc_pci.c
index 4866fc32d8d9..91d25acb5ede 100644
--- a/drivers/isdn/hisax/hfc_pci.c
+++ b/drivers/isdn/hisax/hfc_pci.c
@@ -51,6 +51,8 @@ static const PCI_ENTRY id_list[] =
51 {PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_B00B, "Billion", "B00B"}, 51 {PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_B00B, "Billion", "B00B"},
52 {PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_B00C, "Billion", "B00C"}, 52 {PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_B00C, "Billion", "B00C"},
53 {PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_B100, "Seyeon", "B100"}, 53 {PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_B100, "Seyeon", "B100"},
54 {PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_B700, "Primux II S0", "B700"},
55 {PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_B701, "Primux II S0 NT", "B701"},
54 {PCI_VENDOR_ID_ABOCOM, PCI_DEVICE_ID_ABOCOM_2BD1, "Abocom/Magitek", "2BD1"}, 56 {PCI_VENDOR_ID_ABOCOM, PCI_DEVICE_ID_ABOCOM_2BD1, "Abocom/Magitek", "2BD1"},
55 {PCI_VENDOR_ID_ASUSTEK, PCI_DEVICE_ID_ASUSTEK_0675, "Asuscom/Askey", "675"}, 57 {PCI_VENDOR_ID_ASUSTEK, PCI_DEVICE_ID_ASUSTEK_0675, "Asuscom/Askey", "675"},
56 {PCI_VENDOR_ID_BERKOM, PCI_DEVICE_ID_BERKOM_T_CONCEPT, "German telekom", "T-Concept"}, 58 {PCI_VENDOR_ID_BERKOM, PCI_DEVICE_ID_BERKOM_T_CONCEPT, "German telekom", "T-Concept"},
diff --git a/drivers/isdn/hisax/hfc_usb.c b/drivers/isdn/hisax/hfc_usb.c
index ca5b4a3b683e..262c44127419 100644
--- a/drivers/isdn/hisax/hfc_usb.c
+++ b/drivers/isdn/hisax/hfc_usb.c
@@ -1,7 +1,7 @@
1/* 1/*
2 * hfc_usb.c 2 * hfc_usb.c
3 * 3 *
4 * $Id: hfc_usb.c,v 4.36 2005/04/08 09:55:13 martinb1 Exp $ 4 * $Id: hfc_usb.c,v 2.3.2.13 2006/02/17 17:17:22 mbachem Exp $
5 * 5 *
6 * modular HiSax ISDN driver for Colognechip HFC-S USB chip 6 * modular HiSax ISDN driver for Colognechip HFC-S USB chip
7 * 7 *
@@ -45,7 +45,7 @@
45#include "hfc_usb.h" 45#include "hfc_usb.h"
46 46
47static const char *hfcusb_revision = 47static const char *hfcusb_revision =
48 "$Revision: 4.36 $ $Date: 2005/04/08 09:55:13 $ "; 48 "$Revision: 2.3.2.13 $ $Date: 2006/02/17 17:17:22 $ ";
49 49
50/* Hisax debug support 50/* Hisax debug support
51* use "modprobe debug=x" where x is bitfield of USB_DBG & ISDN_DBG 51* use "modprobe debug=x" where x is bitfield of USB_DBG & ISDN_DBG
@@ -219,7 +219,7 @@ symbolic(struct hfcusb_symbolic_list list[], const int num)
219 for (i = 0; list[i].name != NULL; i++) 219 for (i = 0; list[i].name != NULL; i++)
220 if (list[i].num == num) 220 if (list[i].num == num)
221 return (list[i].name); 221 return (list[i].name);
222 return "<unkown ERROR>"; 222 return "<unknown ERROR>";
223} 223}
224 224
225 225
@@ -235,9 +235,9 @@ ctrl_start_transfer(hfcusb_data * hfc)
235 hfc->ctrl_urb->transfer_buffer = NULL; 235 hfc->ctrl_urb->transfer_buffer = NULL;
236 hfc->ctrl_urb->transfer_buffer_length = 0; 236 hfc->ctrl_urb->transfer_buffer_length = 0;
237 hfc->ctrl_write.wIndex = 237 hfc->ctrl_write.wIndex =
238 hfc->ctrl_buff[hfc->ctrl_out_idx].hfc_reg; 238 cpu_to_le16(hfc->ctrl_buff[hfc->ctrl_out_idx].hfc_reg);
239 hfc->ctrl_write.wValue = 239 hfc->ctrl_write.wValue =
240 hfc->ctrl_buff[hfc->ctrl_out_idx].reg_val; 240 cpu_to_le16(hfc->ctrl_buff[hfc->ctrl_out_idx].reg_val);
241 241
242 usb_submit_urb(hfc->ctrl_urb, GFP_ATOMIC); /* start transfer */ 242 usb_submit_urb(hfc->ctrl_urb, GFP_ATOMIC); /* start transfer */
243 } 243 }
@@ -1282,7 +1282,7 @@ usb_init(hfcusb_data * hfc)
1282 /* init the background machinery for control requests */ 1282 /* init the background machinery for control requests */
1283 hfc->ctrl_read.bRequestType = 0xc0; 1283 hfc->ctrl_read.bRequestType = 0xc0;
1284 hfc->ctrl_read.bRequest = 1; 1284 hfc->ctrl_read.bRequest = 1;
1285 hfc->ctrl_read.wLength = 1; 1285 hfc->ctrl_read.wLength = cpu_to_le16(1);
1286 hfc->ctrl_write.bRequestType = 0x40; 1286 hfc->ctrl_write.bRequestType = 0x40;
1287 hfc->ctrl_write.bRequest = 0; 1287 hfc->ctrl_write.bRequest = 0;
1288 hfc->ctrl_write.wLength = 0; 1288 hfc->ctrl_write.wLength = 0;
@@ -1373,9 +1373,8 @@ hfc_usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
1373 1373
1374 vend_idx = 0xffff; 1374 vend_idx = 0xffff;
1375 for (i = 0; hfcusb_idtab[i].idVendor; i++) { 1375 for (i = 0; hfcusb_idtab[i].idVendor; i++) {
1376 if (dev->descriptor.idVendor == hfcusb_idtab[i].idVendor 1376 if ((le16_to_cpu(dev->descriptor.idVendor) == hfcusb_idtab[i].idVendor)
1377 && dev->descriptor.idProduct == 1377 && (le16_to_cpu(dev->descriptor.idProduct) == hfcusb_idtab[i].idProduct)) {
1378 hfcusb_idtab[i].idProduct) {
1379 vend_idx = i; 1378 vend_idx = i;
1380 continue; 1379 continue;
1381 } 1380 }
@@ -1516,8 +1515,7 @@ hfc_usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
1516 usb_transfer_mode 1515 usb_transfer_mode
1517 = USB_INT; 1516 = USB_INT;
1518 packet_size = 1517 packet_size =
1519 ep->desc. 1518 le16_to_cpu(ep->desc.wMaxPacketSize);
1520 wMaxPacketSize;
1521 break; 1519 break;
1522 case USB_ENDPOINT_XFER_BULK: 1520 case USB_ENDPOINT_XFER_BULK:
1523 if (ep_addr & 0x80) 1521 if (ep_addr & 0x80)
@@ -1545,8 +1543,7 @@ hfc_usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
1545 usb_transfer_mode 1543 usb_transfer_mode
1546 = USB_BULK; 1544 = USB_BULK;
1547 packet_size = 1545 packet_size =
1548 ep->desc. 1546 le16_to_cpu(ep->desc.wMaxPacketSize);
1549 wMaxPacketSize;
1550 break; 1547 break;
1551 case USB_ENDPOINT_XFER_ISOC: 1548 case USB_ENDPOINT_XFER_ISOC:
1552 if (ep_addr & 0x80) 1549 if (ep_addr & 0x80)
@@ -1574,8 +1571,7 @@ hfc_usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
1574 usb_transfer_mode 1571 usb_transfer_mode
1575 = USB_ISOC; 1572 = USB_ISOC;
1576 iso_packet_size = 1573 iso_packet_size =
1577 ep->desc. 1574 le16_to_cpu(ep->desc.wMaxPacketSize);
1578 wMaxPacketSize;
1579 break; 1575 break;
1580 default: 1576 default:
1581 context-> 1577 context->
@@ -1588,10 +1584,8 @@ hfc_usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
1588 fifonum = cidx; 1584 fifonum = cidx;
1589 context->fifos[cidx].hfc = 1585 context->fifos[cidx].hfc =
1590 context; 1586 context;
1591 context->fifos[cidx]. 1587 context->fifos[cidx].usb_packet_maxlen =
1592 usb_packet_maxlen = 1588 le16_to_cpu(ep->desc.wMaxPacketSize);
1593 ep->desc.
1594 wMaxPacketSize;
1595 context->fifos[cidx]. 1589 context->fifos[cidx].
1596 intervall = 1590 intervall =
1597 ep->desc.bInterval; 1591 ep->desc.bInterval;
diff --git a/drivers/isdn/i4l/isdn_tty.c b/drivers/isdn/i4l/isdn_tty.c
index 393633681f49..aeaa1db74bd8 100644
--- a/drivers/isdn/i4l/isdn_tty.c
+++ b/drivers/isdn/i4l/isdn_tty.c
@@ -1682,6 +1682,7 @@ isdn_tty_close(struct tty_struct *tty, struct file *filp)
1682#ifdef ISDN_DEBUG_MODEM_OPEN 1682#ifdef ISDN_DEBUG_MODEM_OPEN
1683 printk(KERN_DEBUG "isdn_tty_close after info->count != 0\n"); 1683 printk(KERN_DEBUG "isdn_tty_close after info->count != 0\n");
1684#endif 1684#endif
1685 module_put(info->owner);
1685 return; 1686 return;
1686 } 1687 }
1687 info->flags |= ISDN_ASYNC_CLOSING; 1688 info->flags |= ISDN_ASYNC_CLOSING;
diff --git a/drivers/macintosh/windfarm_core.c b/drivers/macintosh/windfarm_core.c
index bb8d5efe19bf..6c0ba04bc57a 100644
--- a/drivers/macintosh/windfarm_core.c
+++ b/drivers/macintosh/windfarm_core.c
@@ -35,6 +35,8 @@
35#include <linux/platform_device.h> 35#include <linux/platform_device.h>
36#include <linux/mutex.h> 36#include <linux/mutex.h>
37 37
38#include <asm/prom.h>
39
38#include "windfarm.h" 40#include "windfarm.h"
39 41
40#define VERSION "0.2" 42#define VERSION "0.2"
@@ -465,6 +467,11 @@ static int __init windfarm_core_init(void)
465{ 467{
466 DBG("wf: core loaded\n"); 468 DBG("wf: core loaded\n");
467 469
470 /* Don't register on old machines that use therm_pm72 for now */
471 if (machine_is_compatible("PowerMac7,2") ||
472 machine_is_compatible("PowerMac7,3") ||
473 machine_is_compatible("RackMac3,1"))
474 return -ENODEV;
468 platform_device_register(&wf_platform_device); 475 platform_device_register(&wf_platform_device);
469 return 0; 476 return 0;
470} 477}
diff --git a/drivers/macintosh/windfarm_cpufreq_clamp.c b/drivers/macintosh/windfarm_cpufreq_clamp.c
index 607dbaca69c9..81337cd16e80 100644
--- a/drivers/macintosh/windfarm_cpufreq_clamp.c
+++ b/drivers/macintosh/windfarm_cpufreq_clamp.c
@@ -8,6 +8,8 @@
8#include <linux/wait.h> 8#include <linux/wait.h>
9#include <linux/cpufreq.h> 9#include <linux/cpufreq.h>
10 10
11#include <asm/prom.h>
12
11#include "windfarm.h" 13#include "windfarm.h"
12 14
13#define VERSION "0.3" 15#define VERSION "0.3"
@@ -74,6 +76,12 @@ static int __init wf_cpufreq_clamp_init(void)
74{ 76{
75 struct wf_control *clamp; 77 struct wf_control *clamp;
76 78
79 /* Don't register on old machines that use therm_pm72 for now */
80 if (machine_is_compatible("PowerMac7,2") ||
81 machine_is_compatible("PowerMac7,3") ||
82 machine_is_compatible("RackMac3,1"))
83 return -ENODEV;
84
77 clamp = kmalloc(sizeof(struct wf_control), GFP_KERNEL); 85 clamp = kmalloc(sizeof(struct wf_control), GFP_KERNEL);
78 if (clamp == NULL) 86 if (clamp == NULL)
79 return -ENOMEM; 87 return -ENOMEM;
diff --git a/drivers/macintosh/windfarm_lm75_sensor.c b/drivers/macintosh/windfarm_lm75_sensor.c
index 906d3ecae6e6..423bfa2432c0 100644
--- a/drivers/macintosh/windfarm_lm75_sensor.c
+++ b/drivers/macintosh/windfarm_lm75_sensor.c
@@ -25,7 +25,7 @@
25 25
26#include "windfarm.h" 26#include "windfarm.h"
27 27
28#define VERSION "0.1" 28#define VERSION "0.2"
29 29
30#undef DEBUG 30#undef DEBUG
31 31
@@ -113,6 +113,7 @@ static struct wf_lm75_sensor *wf_lm75_create(struct i2c_adapter *adapter,
113 const char *loc) 113 const char *loc)
114{ 114{
115 struct wf_lm75_sensor *lm; 115 struct wf_lm75_sensor *lm;
116 int rc;
116 117
117 DBG("wf_lm75: creating %s device at address 0x%02x\n", 118 DBG("wf_lm75: creating %s device at address 0x%02x\n",
118 ds1775 ? "ds1775" : "lm75", addr); 119 ds1775 ? "ds1775" : "lm75", addr);
@@ -139,9 +140,11 @@ static struct wf_lm75_sensor *wf_lm75_create(struct i2c_adapter *adapter,
139 lm->i2c.driver = &wf_lm75_driver; 140 lm->i2c.driver = &wf_lm75_driver;
140 strncpy(lm->i2c.name, lm->sens.name, I2C_NAME_SIZE-1); 141 strncpy(lm->i2c.name, lm->sens.name, I2C_NAME_SIZE-1);
141 142
142 if (i2c_attach_client(&lm->i2c)) { 143 rc = i2c_attach_client(&lm->i2c);
143 printk(KERN_ERR "windfarm: failed to attach %s %s to i2c\n", 144 if (rc) {
144 ds1775 ? "ds1775" : "lm75", lm->i2c.name); 145 printk(KERN_ERR "windfarm: failed to attach %s %s to i2c,"
146 " err %d\n", ds1775 ? "ds1775" : "lm75",
147 lm->i2c.name, rc);
145 goto fail; 148 goto fail;
146 } 149 }
147 150
@@ -175,16 +178,22 @@ static int wf_lm75_attach(struct i2c_adapter *adapter)
175 (dev = of_get_next_child(busnode, dev)) != NULL;) { 178 (dev = of_get_next_child(busnode, dev)) != NULL;) {
176 const char *loc = 179 const char *loc =
177 get_property(dev, "hwsensor-location", NULL); 180 get_property(dev, "hwsensor-location", NULL);
178 u32 *reg = (u32 *)get_property(dev, "reg", NULL); 181 u8 addr;
179 DBG(" dev: %s... (loc: %p, reg: %p)\n", dev->name, loc, reg); 182
180 if (loc == NULL || reg == NULL) 183 /* We must re-match the adapter in order to properly check
184 * the channel on multibus setups
185 */
186 if (!pmac_i2c_match_adapter(dev, adapter))
187 continue;
188 addr = pmac_i2c_get_dev_addr(dev);
189 if (loc == NULL || addr == 0)
181 continue; 190 continue;
182 /* real lm75 */ 191 /* real lm75 */
183 if (device_is_compatible(dev, "lm75")) 192 if (device_is_compatible(dev, "lm75"))
184 wf_lm75_create(adapter, *reg, 0, loc); 193 wf_lm75_create(adapter, addr, 0, loc);
185 /* ds1775 (compatible, better resolution */ 194 /* ds1775 (compatible, better resolution */
186 else if (device_is_compatible(dev, "ds1775")) 195 else if (device_is_compatible(dev, "ds1775"))
187 wf_lm75_create(adapter, *reg, 1, loc); 196 wf_lm75_create(adapter, addr, 1, loc);
188 } 197 }
189 return 0; 198 return 0;
190} 199}
@@ -206,6 +215,11 @@ static int wf_lm75_detach(struct i2c_client *client)
206 215
207static int __init wf_lm75_sensor_init(void) 216static int __init wf_lm75_sensor_init(void)
208{ 217{
218 /* Don't register on old machines that use therm_pm72 for now */
219 if (machine_is_compatible("PowerMac7,2") ||
220 machine_is_compatible("PowerMac7,3") ||
221 machine_is_compatible("RackMac3,1"))
222 return -ENODEV;
209 return i2c_add_driver(&wf_lm75_driver); 223 return i2c_add_driver(&wf_lm75_driver);
210} 224}
211 225
diff --git a/drivers/macintosh/windfarm_max6690_sensor.c b/drivers/macintosh/windfarm_max6690_sensor.c
index 5b9ad6ca7cba..8e99d408fddd 100644
--- a/drivers/macintosh/windfarm_max6690_sensor.c
+++ b/drivers/macintosh/windfarm_max6690_sensor.c
@@ -17,7 +17,7 @@
17 17
18#include "windfarm.h" 18#include "windfarm.h"
19 19
20#define VERSION "0.1" 20#define VERSION "0.2"
21 21
22/* This currently only exports the external temperature sensor, 22/* This currently only exports the external temperature sensor,
23 since that's all the control loops need. */ 23 since that's all the control loops need. */
@@ -81,7 +81,7 @@ static struct wf_sensor_ops wf_max6690_ops = {
81static void wf_max6690_create(struct i2c_adapter *adapter, u8 addr) 81static void wf_max6690_create(struct i2c_adapter *adapter, u8 addr)
82{ 82{
83 struct wf_6690_sensor *max; 83 struct wf_6690_sensor *max;
84 char *name = "u4-temp"; 84 char *name = "backside-temp";
85 85
86 max = kzalloc(sizeof(struct wf_6690_sensor), GFP_KERNEL); 86 max = kzalloc(sizeof(struct wf_6690_sensor), GFP_KERNEL);
87 if (max == NULL) { 87 if (max == NULL) {
@@ -118,7 +118,6 @@ static int wf_max6690_attach(struct i2c_adapter *adapter)
118 struct device_node *busnode, *dev = NULL; 118 struct device_node *busnode, *dev = NULL;
119 struct pmac_i2c_bus *bus; 119 struct pmac_i2c_bus *bus;
120 const char *loc; 120 const char *loc;
121 u32 *reg;
122 121
123 bus = pmac_i2c_adapter_to_bus(adapter); 122 bus = pmac_i2c_adapter_to_bus(adapter);
124 if (bus == NULL) 123 if (bus == NULL)
@@ -126,16 +125,23 @@ static int wf_max6690_attach(struct i2c_adapter *adapter)
126 busnode = pmac_i2c_get_bus_node(bus); 125 busnode = pmac_i2c_get_bus_node(bus);
127 126
128 while ((dev = of_get_next_child(busnode, dev)) != NULL) { 127 while ((dev = of_get_next_child(busnode, dev)) != NULL) {
128 u8 addr;
129
130 /* We must re-match the adapter in order to properly check
131 * the channel on multibus setups
132 */
133 if (!pmac_i2c_match_adapter(dev, adapter))
134 continue;
129 if (!device_is_compatible(dev, "max6690")) 135 if (!device_is_compatible(dev, "max6690"))
130 continue; 136 continue;
137 addr = pmac_i2c_get_dev_addr(dev);
131 loc = get_property(dev, "hwsensor-location", NULL); 138 loc = get_property(dev, "hwsensor-location", NULL);
132 reg = (u32 *) get_property(dev, "reg", NULL); 139 if (loc == NULL || addr == 0)
133 if (!loc || !reg)
134 continue; 140 continue;
135 printk("found max6690, loc=%s reg=%x\n", loc, *reg); 141 printk("found max6690, loc=%s addr=0x%02x\n", loc, addr);
136 if (strcmp(loc, "BACKSIDE")) 142 if (strcmp(loc, "BACKSIDE"))
137 continue; 143 continue;
138 wf_max6690_create(adapter, *reg); 144 wf_max6690_create(adapter, addr);
139 } 145 }
140 146
141 return 0; 147 return 0;
@@ -153,6 +159,11 @@ static int wf_max6690_detach(struct i2c_client *client)
153 159
154static int __init wf_max6690_sensor_init(void) 160static int __init wf_max6690_sensor_init(void)
155{ 161{
162 /* Don't register on old machines that use therm_pm72 for now */
163 if (machine_is_compatible("PowerMac7,2") ||
164 machine_is_compatible("PowerMac7,3") ||
165 machine_is_compatible("RackMac3,1"))
166 return -ENODEV;
156 return i2c_add_driver(&wf_max6690_driver); 167 return i2c_add_driver(&wf_max6690_driver);
157} 168}
158 169
diff --git a/drivers/macintosh/windfarm_pid.c b/drivers/macintosh/windfarm_pid.c
index 0842432e27ad..f10efb28cae4 100644
--- a/drivers/macintosh/windfarm_pid.c
+++ b/drivers/macintosh/windfarm_pid.c
@@ -143,3 +143,7 @@ s32 wf_cpu_pid_run(struct wf_cpu_pid_state *st, s32 new_power, s32 new_temp)
143 return st->target; 143 return st->target;
144} 144}
145EXPORT_SYMBOL_GPL(wf_cpu_pid_run); 145EXPORT_SYMBOL_GPL(wf_cpu_pid_run);
146
147MODULE_AUTHOR("Benjamin Herrenschmidt <benh@kernel.crashing.org>");
148MODULE_DESCRIPTION("PID algorithm for PowerMacs thermal control");
149MODULE_LICENSE("GPL");
diff --git a/drivers/macintosh/windfarm_pm112.c b/drivers/macintosh/windfarm_pm112.c
index c2a4e689c784..ef66bf2778ec 100644
--- a/drivers/macintosh/windfarm_pm112.c
+++ b/drivers/macintosh/windfarm_pm112.c
@@ -358,6 +358,7 @@ static void backside_fan_tick(void)
358 return; 358 return;
359 if (!backside_tick) { 359 if (!backside_tick) {
360 /* first time; initialize things */ 360 /* first time; initialize things */
361 printk(KERN_INFO "windfarm: Backside control loop started.\n");
361 backside_param.min = backside_fan->ops->get_min(backside_fan); 362 backside_param.min = backside_fan->ops->get_min(backside_fan);
362 backside_param.max = backside_fan->ops->get_max(backside_fan); 363 backside_param.max = backside_fan->ops->get_max(backside_fan);
363 wf_pid_init(&backside_pid, &backside_param); 364 wf_pid_init(&backside_pid, &backside_param);
@@ -407,6 +408,7 @@ static void drive_bay_fan_tick(void)
407 return; 408 return;
408 if (!drive_bay_tick) { 409 if (!drive_bay_tick) {
409 /* first time; initialize things */ 410 /* first time; initialize things */
411 printk(KERN_INFO "windfarm: Drive bay control loop started.\n");
410 drive_bay_prm.min = drive_bay_fan->ops->get_min(drive_bay_fan); 412 drive_bay_prm.min = drive_bay_fan->ops->get_min(drive_bay_fan);
411 drive_bay_prm.max = drive_bay_fan->ops->get_max(drive_bay_fan); 413 drive_bay_prm.max = drive_bay_fan->ops->get_max(drive_bay_fan);
412 wf_pid_init(&drive_bay_pid, &drive_bay_prm); 414 wf_pid_init(&drive_bay_pid, &drive_bay_prm);
@@ -458,6 +460,7 @@ static void slots_fan_tick(void)
458 return; 460 return;
459 if (!slots_started) { 461 if (!slots_started) {
460 /* first time; initialize things */ 462 /* first time; initialize things */
463 printk(KERN_INFO "windfarm: Slots control loop started.\n");
461 wf_pid_init(&slots_pid, &slots_param); 464 wf_pid_init(&slots_pid, &slots_param);
462 slots_started = 1; 465 slots_started = 1;
463 } 466 }
@@ -504,6 +507,7 @@ static void pm112_tick(void)
504 507
505 if (!started) { 508 if (!started) {
506 started = 1; 509 started = 1;
510 printk(KERN_INFO "windfarm: CPUs control loops started.\n");
507 for (i = 0; i < nr_cores; ++i) { 511 for (i = 0; i < nr_cores; ++i) {
508 if (create_cpu_loop(i) < 0) { 512 if (create_cpu_loop(i) < 0) {
509 failure_state = FAILURE_PERM; 513 failure_state = FAILURE_PERM;
@@ -594,8 +598,6 @@ static void pm112_new_sensor(struct wf_sensor *sr)
594{ 598{
595 unsigned int i; 599 unsigned int i;
596 600
597 if (have_all_sensors)
598 return;
599 if (!strncmp(sr->name, "cpu-temp-", 9)) { 601 if (!strncmp(sr->name, "cpu-temp-", 9)) {
600 i = sr->name[9] - '0'; 602 i = sr->name[9] - '0';
601 if (sr->name[10] == 0 && i < NR_CORES && 603 if (sr->name[10] == 0 && i < NR_CORES &&
@@ -613,7 +615,7 @@ static void pm112_new_sensor(struct wf_sensor *sr)
613 } else if (!strcmp(sr->name, "slots-power")) { 615 } else if (!strcmp(sr->name, "slots-power")) {
614 if (slots_power == NULL && wf_get_sensor(sr) == 0) 616 if (slots_power == NULL && wf_get_sensor(sr) == 0)
615 slots_power = sr; 617 slots_power = sr;
616 } else if (!strcmp(sr->name, "u4-temp")) { 618 } else if (!strcmp(sr->name, "backside-temp")) {
617 if (u4_temp == NULL && wf_get_sensor(sr) == 0) 619 if (u4_temp == NULL && wf_get_sensor(sr) == 0)
618 u4_temp = sr; 620 u4_temp = sr;
619 } else 621 } else
diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c
index d39f584cd8b3..5d88329e3c7a 100644
--- a/drivers/md/raid1.c
+++ b/drivers/md/raid1.c
@@ -306,6 +306,7 @@ static int raid1_end_write_request(struct bio *bio, unsigned int bytes_done, int
306 r1bio_t * r1_bio = (r1bio_t *)(bio->bi_private); 306 r1bio_t * r1_bio = (r1bio_t *)(bio->bi_private);
307 int mirror, behind = test_bit(R1BIO_BehindIO, &r1_bio->state); 307 int mirror, behind = test_bit(R1BIO_BehindIO, &r1_bio->state);
308 conf_t *conf = mddev_to_conf(r1_bio->mddev); 308 conf_t *conf = mddev_to_conf(r1_bio->mddev);
309 struct bio *to_put = NULL;
309 310
310 if (bio->bi_size) 311 if (bio->bi_size)
311 return 1; 312 return 1;
@@ -323,6 +324,7 @@ static int raid1_end_write_request(struct bio *bio, unsigned int bytes_done, int
323 * this branch is our 'one mirror IO has finished' event handler: 324 * this branch is our 'one mirror IO has finished' event handler:
324 */ 325 */
325 r1_bio->bios[mirror] = NULL; 326 r1_bio->bios[mirror] = NULL;
327 to_put = bio;
326 if (!uptodate) { 328 if (!uptodate) {
327 md_error(r1_bio->mddev, conf->mirrors[mirror].rdev); 329 md_error(r1_bio->mddev, conf->mirrors[mirror].rdev);
328 /* an I/O failed, we can't clear the bitmap */ 330 /* an I/O failed, we can't clear the bitmap */
@@ -375,7 +377,7 @@ static int raid1_end_write_request(struct bio *bio, unsigned int bytes_done, int
375 /* Don't dec_pending yet, we want to hold 377 /* Don't dec_pending yet, we want to hold
376 * the reference over the retry 378 * the reference over the retry
377 */ 379 */
378 return 0; 380 goto out;
379 } 381 }
380 if (test_bit(R1BIO_BehindIO, &r1_bio->state)) { 382 if (test_bit(R1BIO_BehindIO, &r1_bio->state)) {
381 /* free extra copy of the data pages */ 383 /* free extra copy of the data pages */
@@ -392,10 +394,11 @@ static int raid1_end_write_request(struct bio *bio, unsigned int bytes_done, int
392 raid_end_bio_io(r1_bio); 394 raid_end_bio_io(r1_bio);
393 } 395 }
394 396
395 if (r1_bio->bios[mirror]==NULL)
396 bio_put(bio);
397
398 rdev_dec_pending(conf->mirrors[mirror].rdev, conf->mddev); 397 rdev_dec_pending(conf->mirrors[mirror].rdev, conf->mddev);
398 out:
399 if (to_put)
400 bio_put(to_put);
401
399 return 0; 402 return 0;
400} 403}
401 404
@@ -857,7 +860,7 @@ static int make_request(request_queue_t *q, struct bio * bio)
857 atomic_set(&r1_bio->remaining, 0); 860 atomic_set(&r1_bio->remaining, 0);
858 atomic_set(&r1_bio->behind_remaining, 0); 861 atomic_set(&r1_bio->behind_remaining, 0);
859 862
860 do_barriers = bio->bi_rw & BIO_RW_BARRIER; 863 do_barriers = bio_barrier(bio);
861 if (do_barriers) 864 if (do_barriers)
862 set_bit(R1BIO_Barrier, &r1_bio->state); 865 set_bit(R1BIO_Barrier, &r1_bio->state);
863 866
diff --git a/drivers/media/dvb/b2c2/flexcop-fe-tuner.c b/drivers/media/dvb/b2c2/flexcop-fe-tuner.c
index 390cc3a99ce6..9c7f122826e0 100644
--- a/drivers/media/dvb/b2c2/flexcop-fe-tuner.c
+++ b/drivers/media/dvb/b2c2/flexcop-fe-tuner.c
@@ -526,7 +526,7 @@ int flexcop_frontend_init(struct flexcop_device *fc)
526 info("found the stv0297 at i2c address: 0x%02x",alps_tdee4_stv0297_config.demod_address); 526 info("found the stv0297 at i2c address: 0x%02x",alps_tdee4_stv0297_config.demod_address);
527 } else 527 } else
528 /* try the sky v2.3 (vp310/Samsung tbdu18132(tsa5059)) */ 528 /* try the sky v2.3 (vp310/Samsung tbdu18132(tsa5059)) */
529 if ((fc->fe = vp310_attach(&skystar23_samsung_tbdu18132_config, &fc->i2c_adap)) != NULL) { 529 if ((fc->fe = vp310_mt312_attach(&skystar23_samsung_tbdu18132_config, &fc->i2c_adap)) != NULL) {
530 ops = fc->fe->ops; 530 ops = fc->fe->ops;
531 531
532 ops->diseqc_send_master_cmd = flexcop_diseqc_send_master_cmd; 532 ops->diseqc_send_master_cmd = flexcop_diseqc_send_master_cmd;
diff --git a/drivers/media/dvb/bt8xx/bt878.c b/drivers/media/dvb/bt8xx/bt878.c
index 34c3189a1a33..356f447ee2ab 100644
--- a/drivers/media/dvb/bt8xx/bt878.c
+++ b/drivers/media/dvb/bt8xx/bt878.c
@@ -382,7 +382,7 @@ bt878_device_control(struct bt878 *bt, unsigned int cmd, union dst_gpio_packet *
382EXPORT_SYMBOL(bt878_device_control); 382EXPORT_SYMBOL(bt878_device_control);
383 383
384 384
385struct cards card_list[] __devinitdata = { 385static struct cards card_list[] __devinitdata = {
386 386
387 { 0x01010071, BTTV_BOARD_NEBULA_DIGITV, "Nebula Electronics DigiTV" }, 387 { 0x01010071, BTTV_BOARD_NEBULA_DIGITV, "Nebula Electronics DigiTV" },
388 { 0x07611461, BTTV_BOARD_AVDVBT_761, "AverMedia AverTV DVB-T 761" }, 388 { 0x07611461, BTTV_BOARD_AVDVBT_761, "AverMedia AverTV DVB-T 761" },
diff --git a/drivers/media/dvb/bt8xx/dst.c b/drivers/media/dvb/bt8xx/dst.c
index 3a2ff1cc24b7..0310e3dd07e6 100644
--- a/drivers/media/dvb/bt8xx/dst.c
+++ b/drivers/media/dvb/bt8xx/dst.c
@@ -602,7 +602,7 @@ static int dst_type_print(u8 type)
602 602
603*/ 603*/
604 604
605struct dst_types dst_tlist[] = { 605static struct dst_types dst_tlist[] = {
606 { 606 {
607 .device_id = "200103A", 607 .device_id = "200103A",
608 .offset = 0, 608 .offset = 0,
diff --git a/drivers/media/dvb/dvb-core/demux.h b/drivers/media/dvb/dvb-core/demux.h
index 9f025825b2d2..0c1d87c5227a 100644
--- a/drivers/media/dvb/dvb-core/demux.h
+++ b/drivers/media/dvb/dvb-core/demux.h
@@ -216,7 +216,7 @@ struct dmx_frontend {
216/*--------------------------------------------------------------------------*/ 216/*--------------------------------------------------------------------------*/
217 217
218/* 218/*
219 * Flags OR'ed in the capabilites field of struct dmx_demux. 219 * Flags OR'ed in the capabilities field of struct dmx_demux.
220 */ 220 */
221 221
222#define DMX_TS_FILTERING 1 222#define DMX_TS_FILTERING 1
diff --git a/drivers/media/dvb/dvb-usb/cxusb.c b/drivers/media/dvb/dvb-usb/cxusb.c
index f327fac1688e..162f9795cd89 100644
--- a/drivers/media/dvb/dvb-usb/cxusb.c
+++ b/drivers/media/dvb/dvb-usb/cxusb.c
@@ -282,7 +282,7 @@ static struct cx22702_config cxusb_cx22702_config = {
282 .pll_set = dvb_usb_pll_set_i2c, 282 .pll_set = dvb_usb_pll_set_i2c,
283}; 283};
284 284
285static struct lgdt330x_config cxusb_lgdt330x_config = { 285static struct lgdt330x_config cxusb_lgdt3303_config = {
286 .demod_address = 0x0e, 286 .demod_address = 0x0e,
287 .demod_chip = LGDT3303, 287 .demod_chip = LGDT3303,
288 .pll_set = dvb_usb_pll_set_i2c, 288 .pll_set = dvb_usb_pll_set_i2c,
@@ -357,14 +357,14 @@ static int cxusb_cx22702_frontend_attach(struct dvb_usb_device *d)
357 return -EIO; 357 return -EIO;
358} 358}
359 359
360static int cxusb_lgdt330x_frontend_attach(struct dvb_usb_device *d) 360static int cxusb_lgdt3303_frontend_attach(struct dvb_usb_device *d)
361{ 361{
362 if (usb_set_interface(d->udev,0,7) < 0) 362 if (usb_set_interface(d->udev,0,7) < 0)
363 err("set interface failed"); 363 err("set interface failed");
364 364
365 cxusb_ctrl_msg(d,CMD_DIGITAL, NULL, 0, NULL, 0); 365 cxusb_ctrl_msg(d,CMD_DIGITAL, NULL, 0, NULL, 0);
366 366
367 if ((d->fe = lgdt330x_attach(&cxusb_lgdt330x_config, &d->i2c_adap)) != NULL) 367 if ((d->fe = lgdt330x_attach(&cxusb_lgdt3303_config, &d->i2c_adap)) != NULL)
368 return 0; 368 return 0;
369 369
370 return -EIO; 370 return -EIO;
@@ -506,7 +506,7 @@ static struct dvb_usb_properties cxusb_bluebird_lgh064f_properties = {
506 506
507 .streaming_ctrl = cxusb_streaming_ctrl, 507 .streaming_ctrl = cxusb_streaming_ctrl,
508 .power_ctrl = cxusb_power_ctrl, 508 .power_ctrl = cxusb_power_ctrl,
509 .frontend_attach = cxusb_lgdt330x_frontend_attach, 509 .frontend_attach = cxusb_lgdt3303_frontend_attach,
510 .tuner_attach = cxusb_lgh064f_tuner_attach, 510 .tuner_attach = cxusb_lgh064f_tuner_attach,
511 511
512 .i2c_algo = &cxusb_i2c_algo, 512 .i2c_algo = &cxusb_i2c_algo,
diff --git a/drivers/media/dvb/dvb-usb/dvb-usb-init.c b/drivers/media/dvb/dvb-usb/dvb-usb-init.c
index 716f8bf528cd..ce34a55e5c24 100644
--- a/drivers/media/dvb/dvb-usb/dvb-usb-init.c
+++ b/drivers/media/dvb/dvb-usb/dvb-usb-init.c
@@ -47,7 +47,7 @@ static int dvb_usb_init(struct dvb_usb_device *d)
47 47
48 d->state = DVB_USB_STATE_INIT; 48 d->state = DVB_USB_STATE_INIT;
49 49
50/* check the capabilites and set appropriate variables */ 50/* check the capabilities and set appropriate variables */
51 51
52/* speed - when running at FULL speed we need a HW PID filter */ 52/* speed - when running at FULL speed we need a HW PID filter */
53 if (d->udev->speed == USB_SPEED_FULL && !(d->props.caps & DVB_USB_HAS_PID_FILTER)) { 53 if (d->udev->speed == USB_SPEED_FULL && !(d->props.caps & DVB_USB_HAS_PID_FILTER)) {
diff --git a/drivers/media/dvb/dvb-usb/dvb-usb.h b/drivers/media/dvb/dvb-usb/dvb-usb.h
index 5e5d21ad93c9..d4909e5c67e0 100644
--- a/drivers/media/dvb/dvb-usb/dvb-usb.h
+++ b/drivers/media/dvb/dvb-usb/dvb-usb.h
@@ -87,7 +87,7 @@ struct dvb_usb_device;
87 87
88/** 88/**
89 * struct dvb_usb_properties - properties of a dvb-usb-device 89 * struct dvb_usb_properties - properties of a dvb-usb-device
90 * @caps: capabilites of the DVB USB device. 90 * @caps: capabilities of the DVB USB device.
91 * @pid_filter_count: number of PID filter position in the optional hardware 91 * @pid_filter_count: number of PID filter position in the optional hardware
92 * PID-filter. 92 * PID-filter.
93 * 93 *
diff --git a/drivers/media/dvb/frontends/Kconfig b/drivers/media/dvb/frontends/Kconfig
index 76b6a2aef32f..c676b1e23ab0 100644
--- a/drivers/media/dvb/frontends/Kconfig
+++ b/drivers/media/dvb/frontends/Kconfig
@@ -29,7 +29,7 @@ config DVB_TDA8083
29 A DVB-S tuner module. Say Y when you want to support this frontend. 29 A DVB-S tuner module. Say Y when you want to support this frontend.
30 30
31config DVB_MT312 31config DVB_MT312
32 tristate "Zarlink MT312 based" 32 tristate "Zarlink VP310/MT312 based"
33 depends on DVB_CORE 33 depends on DVB_CORE
34 help 34 help
35 A DVB-S tuner module. Say Y when you want to support this frontend. 35 A DVB-S tuner module. Say Y when you want to support this frontend.
diff --git a/drivers/media/dvb/frontends/mt312.c b/drivers/media/dvb/frontends/mt312.c
index ec4e641acc64..d3aea83cf218 100644
--- a/drivers/media/dvb/frontends/mt312.c
+++ b/drivers/media/dvb/frontends/mt312.c
@@ -612,76 +612,6 @@ static void mt312_release(struct dvb_frontend* fe)
612 kfree(state); 612 kfree(state);
613} 613}
614 614
615static struct dvb_frontend_ops vp310_mt312_ops;
616
617struct dvb_frontend* vp310_attach(const struct mt312_config* config,
618 struct i2c_adapter* i2c)
619{
620 struct mt312_state* state = NULL;
621
622 /* allocate memory for the internal state */
623 state = kmalloc(sizeof(struct mt312_state), GFP_KERNEL);
624 if (state == NULL)
625 goto error;
626
627 /* setup the state */
628 state->config = config;
629 state->i2c = i2c;
630 memcpy(&state->ops, &vp310_mt312_ops, sizeof(struct dvb_frontend_ops));
631 strcpy(state->ops.info.name, "Zarlink VP310 DVB-S");
632
633 /* check if the demod is there */
634 if (mt312_readreg(state, ID, &state->id) < 0)
635 goto error;
636 if (state->id != ID_VP310) {
637 goto error;
638 }
639
640 /* create dvb_frontend */
641 state->frequency = 90;
642 state->frontend.ops = &state->ops;
643 state->frontend.demodulator_priv = state;
644 return &state->frontend;
645
646error:
647 kfree(state);
648 return NULL;
649}
650
651struct dvb_frontend* mt312_attach(const struct mt312_config* config,
652 struct i2c_adapter* i2c)
653{
654 struct mt312_state* state = NULL;
655
656 /* allocate memory for the internal state */
657 state = kmalloc(sizeof(struct mt312_state), GFP_KERNEL);
658 if (state == NULL)
659 goto error;
660
661 /* setup the state */
662 state->config = config;
663 state->i2c = i2c;
664 memcpy(&state->ops, &vp310_mt312_ops, sizeof(struct dvb_frontend_ops));
665 strcpy(state->ops.info.name, "Zarlink MT312 DVB-S");
666
667 /* check if the demod is there */
668 if (mt312_readreg(state, ID, &state->id) < 0)
669 goto error;
670 if (state->id != ID_MT312) {
671 goto error;
672 }
673
674 /* create dvb_frontend */
675 state->frequency = 60;
676 state->frontend.ops = &state->ops;
677 state->frontend.demodulator_priv = state;
678 return &state->frontend;
679
680error:
681 kfree(state);
682 return NULL;
683}
684
685static struct dvb_frontend_ops vp310_mt312_ops = { 615static struct dvb_frontend_ops vp310_mt312_ops = {
686 616
687 .info = { 617 .info = {
@@ -720,6 +650,49 @@ static struct dvb_frontend_ops vp310_mt312_ops = {
720 .set_voltage = mt312_set_voltage, 650 .set_voltage = mt312_set_voltage,
721}; 651};
722 652
653struct dvb_frontend* vp310_mt312_attach(const struct mt312_config* config,
654 struct i2c_adapter* i2c)
655{
656 struct mt312_state* state = NULL;
657
658 /* allocate memory for the internal state */
659 state = kmalloc(sizeof(struct mt312_state), GFP_KERNEL);
660 if (state == NULL)
661 goto error;
662
663 /* setup the state */
664 state->config = config;
665 state->i2c = i2c;
666 memcpy(&state->ops, &vp310_mt312_ops, sizeof(struct dvb_frontend_ops));
667
668 /* check if the demod is there */
669 if (mt312_readreg(state, ID, &state->id) < 0)
670 goto error;
671
672 switch (state->id) {
673 case ID_VP310:
674 strcpy(state->ops.info.name, "Zarlink VP310 DVB-S");
675 state->frequency = 90;
676 break;
677 case ID_MT312:
678 strcpy(state->ops.info.name, "Zarlink MT312 DVB-S");
679 state->frequency = 60;
680 break;
681 default:
682 printk (KERN_WARNING "Only Zarlink VP310/MT312 are supported chips.\n");
683 goto error;
684 }
685
686 /* create dvb_frontend */
687 state->frontend.ops = &state->ops;
688 state->frontend.demodulator_priv = state;
689 return &state->frontend;
690
691error:
692 kfree(state);
693 return NULL;
694}
695
723module_param(debug, int, 0644); 696module_param(debug, int, 0644);
724MODULE_PARM_DESC(debug, "Turn on/off frontend debugging (default:off)."); 697MODULE_PARM_DESC(debug, "Turn on/off frontend debugging (default:off).");
725 698
@@ -727,5 +700,4 @@ MODULE_DESCRIPTION("Zarlink VP310/MT312 DVB-S Demodulator driver");
727MODULE_AUTHOR("Andreas Oberritter <obi@linuxtv.org>"); 700MODULE_AUTHOR("Andreas Oberritter <obi@linuxtv.org>");
728MODULE_LICENSE("GPL"); 701MODULE_LICENSE("GPL");
729 702
730EXPORT_SYMBOL(mt312_attach); 703EXPORT_SYMBOL(vp310_mt312_attach);
731EXPORT_SYMBOL(vp310_attach);
diff --git a/drivers/media/dvb/frontends/mt312.h b/drivers/media/dvb/frontends/mt312.h
index b3a53a73a117..074d844f0139 100644
--- a/drivers/media/dvb/frontends/mt312.h
+++ b/drivers/media/dvb/frontends/mt312.h
@@ -38,10 +38,8 @@ struct mt312_config
38 int (*pll_set)(struct dvb_frontend* fe, struct dvb_frontend_parameters* params); 38 int (*pll_set)(struct dvb_frontend* fe, struct dvb_frontend_parameters* params);
39}; 39};
40 40
41extern struct dvb_frontend* mt312_attach(const struct mt312_config* config, 41struct dvb_frontend* vp310_mt312_attach(const struct mt312_config* config,
42 struct i2c_adapter* i2c); 42 struct i2c_adapter* i2c);
43 43
44extern struct dvb_frontend* vp310_attach(const struct mt312_config* config,
45 struct i2c_adapter* i2c);
46 44
47#endif // MT312_H 45#endif // MT312_H
diff --git a/drivers/media/dvb/frontends/stv0297.c b/drivers/media/dvb/frontends/stv0297.c
index 6122ba754bc5..eb15676d374f 100644
--- a/drivers/media/dvb/frontends/stv0297.c
+++ b/drivers/media/dvb/frontends/stv0297.c
@@ -393,10 +393,6 @@ static int stv0297_set_frontend(struct dvb_frontend *fe, struct dvb_frontend_par
393 break; 393 break;
394 394
395 case QAM_128: 395 case QAM_128:
396 delay = 150;
397 sweeprate = 1000;
398 break;
399
400 case QAM_256: 396 case QAM_256:
401 delay = 200; 397 delay = 200;
402 sweeprate = 500; 398 sweeprate = 500;
diff --git a/drivers/media/dvb/ttpci/av7110.c b/drivers/media/dvb/ttpci/av7110.c
index d36369e9e88f..7c6ccb96b157 100644
--- a/drivers/media/dvb/ttpci/av7110.c
+++ b/drivers/media/dvb/ttpci/av7110.c
@@ -1439,7 +1439,7 @@ static int check_firmware(struct av7110* av7110)
1439 len = ntohl(*(u32*) ptr); 1439 len = ntohl(*(u32*) ptr);
1440 ptr += 4; 1440 ptr += 4;
1441 if (len >= 512) { 1441 if (len >= 512) {
1442 printk("dvb-ttpci: dpram file is way to big.\n"); 1442 printk("dvb-ttpci: dpram file is way too big.\n");
1443 return -EINVAL; 1443 return -EINVAL;
1444 } 1444 }
1445 if (crc != crc32_le(0, ptr, len)) { 1445 if (crc != crc32_le(0, ptr, len)) {
@@ -2477,7 +2477,8 @@ static int frontend_init(struct av7110 *av7110)
2477 * The same behaviour of missing VSYNC can be duplicated on budget 2477 * The same behaviour of missing VSYNC can be duplicated on budget
2478 * cards, by seting DD1_INIT trigger mode 7 in 3rd nibble. 2478 * cards, by seting DD1_INIT trigger mode 7 in 3rd nibble.
2479 */ 2479 */
2480static int av7110_attach(struct saa7146_dev* dev, struct saa7146_pci_extension_data *pci_ext) 2480static int __devinit av7110_attach(struct saa7146_dev* dev,
2481 struct saa7146_pci_extension_data *pci_ext)
2481{ 2482{
2482 const int length = TS_WIDTH * TS_HEIGHT; 2483 const int length = TS_WIDTH * TS_HEIGHT;
2483 struct pci_dev *pdev = dev->pci; 2484 struct pci_dev *pdev = dev->pci;
@@ -2827,7 +2828,7 @@ err_kfree_0:
2827 goto out; 2828 goto out;
2828} 2829}
2829 2830
2830static int av7110_detach(struct saa7146_dev* saa) 2831static int __devexit av7110_detach(struct saa7146_dev* saa)
2831{ 2832{
2832 struct av7110 *av7110 = saa->ext_priv; 2833 struct av7110 *av7110 = saa->ext_priv;
2833 dprintk(4, "%p\n", av7110); 2834 dprintk(4, "%p\n", av7110);
@@ -2974,7 +2975,7 @@ static struct saa7146_extension av7110_extension = {
2974 .module = THIS_MODULE, 2975 .module = THIS_MODULE,
2975 .pci_tbl = &pci_tbl[0], 2976 .pci_tbl = &pci_tbl[0],
2976 .attach = av7110_attach, 2977 .attach = av7110_attach,
2977 .detach = av7110_detach, 2978 .detach = __devexit_p(av7110_detach),
2978 2979
2979 .irq_mask = MASK_19 | MASK_03 | MASK_10, 2980 .irq_mask = MASK_19 | MASK_03 | MASK_10,
2980 .irq_func = av7110_irq, 2981 .irq_func = av7110_irq,
diff --git a/drivers/media/dvb/ttpci/av7110_hw.c b/drivers/media/dvb/ttpci/av7110_hw.c
index b2e63e9fc053..0bb6e74ae7f0 100644
--- a/drivers/media/dvb/ttpci/av7110_hw.c
+++ b/drivers/media/dvb/ttpci/av7110_hw.c
@@ -245,6 +245,9 @@ int av7110_bootarm(struct av7110 *av7110)
245 245
246 /* test DEBI */ 246 /* test DEBI */
247 iwdebi(av7110, DEBISWAP, DPRAM_BASE, 0x76543210, 4); 247 iwdebi(av7110, DEBISWAP, DPRAM_BASE, 0x76543210, 4);
248 /* FIXME: Why does Nexus CA require 2x iwdebi for first init? */
249 iwdebi(av7110, DEBISWAP, DPRAM_BASE, 0x76543210, 4);
250
248 if ((ret=irdebi(av7110, DEBINOSWAP, DPRAM_BASE, 0, 4)) != 0x10325476) { 251 if ((ret=irdebi(av7110, DEBINOSWAP, DPRAM_BASE, 0, 4)) != 0x10325476) {
249 printk(KERN_ERR "dvb-ttpci: debi test in av7110_bootarm() failed: " 252 printk(KERN_ERR "dvb-ttpci: debi test in av7110_bootarm() failed: "
250 "%08x != %08x (check your BIOS 'Plug&Play OS' settings)\n", 253 "%08x != %08x (check your BIOS 'Plug&Play OS' settings)\n",
diff --git a/drivers/media/dvb/ttpci/av7110_ir.c b/drivers/media/dvb/ttpci/av7110_ir.c
index 617e4f6c0ed7..d54bbcdde2cc 100644
--- a/drivers/media/dvb/ttpci/av7110_ir.c
+++ b/drivers/media/dvb/ttpci/av7110_ir.c
@@ -208,7 +208,7 @@ static void ir_handler(struct av7110 *av7110, u32 ircom)
208} 208}
209 209
210 210
211int __init av7110_ir_init(struct av7110 *av7110) 211int __devinit av7110_ir_init(struct av7110 *av7110)
212{ 212{
213 static struct proc_dir_entry *e; 213 static struct proc_dir_entry *e;
214 214
@@ -248,7 +248,7 @@ int __init av7110_ir_init(struct av7110 *av7110)
248} 248}
249 249
250 250
251void __exit av7110_ir_exit(struct av7110 *av7110) 251void __devexit av7110_ir_exit(struct av7110 *av7110)
252{ 252{
253 int i; 253 int i;
254 254
diff --git a/drivers/media/video/cpia.c b/drivers/media/video/cpia.c
index 9f59541155d9..85d964b5b33c 100644
--- a/drivers/media/video/cpia.c
+++ b/drivers/media/video/cpia.c
@@ -3369,7 +3369,7 @@ static int cpia_do_ioctl(struct inode *inode, struct file *file,
3369 //DBG("cpia_ioctl: %u\n", ioctlnr); 3369 //DBG("cpia_ioctl: %u\n", ioctlnr);
3370 3370
3371 switch (ioctlnr) { 3371 switch (ioctlnr) {
3372 /* query capabilites */ 3372 /* query capabilities */
3373 case VIDIOCGCAP: 3373 case VIDIOCGCAP:
3374 { 3374 {
3375 struct video_capability *b = arg; 3375 struct video_capability *b = arg;
diff --git a/drivers/media/video/cx25840/cx25840-core.c b/drivers/media/video/cx25840/cx25840-core.c
index 08ffd1f325fc..5588b9a5c430 100644
--- a/drivers/media/video/cx25840/cx25840-core.c
+++ b/drivers/media/video/cx25840/cx25840-core.c
@@ -567,7 +567,7 @@ static struct v4l2_queryctrl cx25840_qctrl[] = {
567 .type = V4L2_CTRL_TYPE_INTEGER, 567 .type = V4L2_CTRL_TYPE_INTEGER,
568 .name = "Contrast", 568 .name = "Contrast",
569 .minimum = 0, 569 .minimum = 0,
570 .maximum = 255, 570 .maximum = 127,
571 .step = 1, 571 .step = 1,
572 .default_value = 64, 572 .default_value = 64,
573 .flags = 0, 573 .flags = 0,
@@ -576,7 +576,7 @@ static struct v4l2_queryctrl cx25840_qctrl[] = {
576 .type = V4L2_CTRL_TYPE_INTEGER, 576 .type = V4L2_CTRL_TYPE_INTEGER,
577 .name = "Saturation", 577 .name = "Saturation",
578 .minimum = 0, 578 .minimum = 0,
579 .maximum = 255, 579 .maximum = 127,
580 .step = 1, 580 .step = 1,
581 .default_value = 64, 581 .default_value = 64,
582 .flags = 0, 582 .flags = 0,
diff --git a/drivers/media/video/saa7115.c b/drivers/media/video/saa7115.c
index 048d000941c7..ffd87ce55556 100644
--- a/drivers/media/video/saa7115.c
+++ b/drivers/media/video/saa7115.c
@@ -1027,7 +1027,7 @@ static struct v4l2_queryctrl saa7115_qctrl[] = {
1027 .type = V4L2_CTRL_TYPE_INTEGER, 1027 .type = V4L2_CTRL_TYPE_INTEGER,
1028 .name = "Contrast", 1028 .name = "Contrast",
1029 .minimum = 0, 1029 .minimum = 0,
1030 .maximum = 255, 1030 .maximum = 127,
1031 .step = 1, 1031 .step = 1,
1032 .default_value = 64, 1032 .default_value = 64,
1033 .flags = 0, 1033 .flags = 0,
@@ -1036,7 +1036,7 @@ static struct v4l2_queryctrl saa7115_qctrl[] = {
1036 .type = V4L2_CTRL_TYPE_INTEGER, 1036 .type = V4L2_CTRL_TYPE_INTEGER,
1037 .name = "Saturation", 1037 .name = "Saturation",
1038 .minimum = 0, 1038 .minimum = 0,
1039 .maximum = 255, 1039 .maximum = 127,
1040 .step = 1, 1040 .step = 1,
1041 .default_value = 64, 1041 .default_value = 64,
1042 .flags = 0, 1042 .flags = 0,
diff --git a/drivers/media/video/saa7134/saa7134-alsa.c b/drivers/media/video/saa7134/saa7134-alsa.c
index a7a6ab9298a9..7df5e0826e12 100644
--- a/drivers/media/video/saa7134/saa7134-alsa.c
+++ b/drivers/media/video/saa7134/saa7134-alsa.c
@@ -54,10 +54,12 @@ MODULE_PARM_DESC(debug,"enable debug messages [alsa]");
54 54
55static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX; /* Index 0-MAX */ 55static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX; /* Index 0-MAX */
56static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR; /* ID for this card */ 56static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR; /* ID for this card */
57static int enable[SNDRV_CARDS] = {1, [1 ... (SNDRV_CARDS - 1)] = 0}; 57static int enable[SNDRV_CARDS] = {1, [1 ... (SNDRV_CARDS - 1)] = 1};
58 58
59module_param_array(index, int, NULL, 0444); 59module_param_array(index, int, NULL, 0444);
60module_param_array(enable, int, NULL, 0444);
60MODULE_PARM_DESC(index, "Index value for SAA7134 capture interface(s)."); 61MODULE_PARM_DESC(index, "Index value for SAA7134 capture interface(s).");
62MODULE_PARM_DESC(enable, "Enable (or not) the SAA7134 capture interface(s).");
61 63
62#define dprintk(fmt, arg...) if (debug) \ 64#define dprintk(fmt, arg...) if (debug) \
63 printk(KERN_DEBUG "%s/alsa: " fmt, dev->name , ##arg) 65 printk(KERN_DEBUG "%s/alsa: " fmt, dev->name , ##arg)
diff --git a/drivers/media/video/saa7134/saa7134-cards.c b/drivers/media/video/saa7134/saa7134-cards.c
index 5a35d3b6550d..6bc63a4086c1 100644
--- a/drivers/media/video/saa7134/saa7134-cards.c
+++ b/drivers/media/video/saa7134/saa7134-cards.c
@@ -977,7 +977,7 @@ struct saa7134_board saa7134_boards[] = {
977 .radio_type = UNSET, 977 .radio_type = UNSET,
978 .tuner_addr = ADDR_UNSET, 978 .tuner_addr = ADDR_UNSET,
979 .radio_addr = ADDR_UNSET, 979 .radio_addr = ADDR_UNSET,
980 .tda9887_conf = TDA9887_PRESENT | TDA9887_INTERCARRIER | TDA9887_PORT2_ACTIVE, 980 .tda9887_conf = TDA9887_PRESENT | TDA9887_INTERCARRIER | TDA9887_PORT2_INACTIVE,
981 .inputs = {{ 981 .inputs = {{
982 .name = name_tv, 982 .name = name_tv,
983 .vmux = 3, 983 .vmux = 3,
@@ -1666,7 +1666,7 @@ struct saa7134_board saa7134_boards[] = {
1666 .radio_type = UNSET, 1666 .radio_type = UNSET,
1667 .tuner_addr = ADDR_UNSET, 1667 .tuner_addr = ADDR_UNSET,
1668 .radio_addr = ADDR_UNSET, 1668 .radio_addr = ADDR_UNSET,
1669 .tda9887_conf = TDA9887_PRESENT | TDA9887_INTERCARRIER | TDA9887_PORT2_ACTIVE, 1669 .tda9887_conf = TDA9887_PRESENT | TDA9887_INTERCARRIER | TDA9887_PORT2_INACTIVE,
1670 .mpeg = SAA7134_MPEG_DVB, 1670 .mpeg = SAA7134_MPEG_DVB,
1671 .inputs = {{ 1671 .inputs = {{
1672 .name = name_tv, 1672 .name = name_tv,
@@ -2187,7 +2187,7 @@ struct saa7134_board saa7134_boards[] = {
2187 .radio_type = UNSET, 2187 .radio_type = UNSET,
2188 .tuner_addr = 0x61, 2188 .tuner_addr = 0x61,
2189 .radio_addr = ADDR_UNSET, 2189 .radio_addr = ADDR_UNSET,
2190 .tda9887_conf = TDA9887_PRESENT, 2190 .tda9887_conf = TDA9887_PRESENT | TDA9887_PORT1_ACTIVE,
2191 .mpeg = SAA7134_MPEG_DVB, 2191 .mpeg = SAA7134_MPEG_DVB,
2192 .inputs = {{ 2192 .inputs = {{
2193 .name = name_tv, 2193 .name = name_tv,
@@ -2211,7 +2211,7 @@ struct saa7134_board saa7134_boards[] = {
2211 .radio_type = UNSET, 2211 .radio_type = UNSET,
2212 .tuner_addr = 0x61, 2212 .tuner_addr = 0x61,
2213 .radio_addr = ADDR_UNSET, 2213 .radio_addr = ADDR_UNSET,
2214 .tda9887_conf = TDA9887_PRESENT, 2214 .tda9887_conf = TDA9887_PRESENT | TDA9887_PORT1_ACTIVE,
2215 .mpeg = SAA7134_MPEG_DVB, 2215 .mpeg = SAA7134_MPEG_DVB,
2216 .inputs = {{ 2216 .inputs = {{
2217 .name = name_tv, 2217 .name = name_tv,
@@ -2392,7 +2392,7 @@ struct saa7134_board saa7134_boards[] = {
2392 }}, 2392 }},
2393 }, 2393 },
2394 [SAA7134_BOARD_PINNACLE_PCTV_110i] = { 2394 [SAA7134_BOARD_PINNACLE_PCTV_110i] = {
2395 .name = "Pinnacle PCTV 110i (saa7133)", 2395 .name = "Pinnacle PCTV 40i/50i/110i (saa7133)",
2396 .audio_clock = 0x00187de7, 2396 .audio_clock = 0x00187de7,
2397 .tuner_type = TUNER_PHILIPS_TDA8290, 2397 .tuner_type = TUNER_PHILIPS_TDA8290,
2398 .radio_type = UNSET, 2398 .radio_type = UNSET,
@@ -2407,6 +2407,10 @@ struct saa7134_board saa7134_boards[] = {
2407 },{ 2407 },{
2408 .name = name_comp1, 2408 .name = name_comp1,
2409 .vmux = 1, 2409 .vmux = 1,
2410 .amux = LINE2,
2411 },{
2412 .name = name_comp2,
2413 .vmux = 0,
2410 .amux = LINE2, 2414 .amux = LINE2,
2411 },{ 2415 },{
2412 .name = name_svideo, 2416 .name = name_svideo,
@@ -2745,7 +2749,7 @@ struct pci_device_id saa7134_pci_tbl[] = {
2745 .vendor = PCI_VENDOR_ID_PHILIPS, 2749 .vendor = PCI_VENDOR_ID_PHILIPS,
2746 .device = PCI_DEVICE_ID_PHILIPS_SAA7130, 2750 .device = PCI_DEVICE_ID_PHILIPS_SAA7130,
2747 .subvendor = 0x1048, 2751 .subvendor = 0x1048,
2748 .subdevice = 0x226b, 2752 .subdevice = 0x226a,
2749 .driver_data = SAA7134_BOARD_ELSA_500TV, 2753 .driver_data = SAA7134_BOARD_ELSA_500TV,
2750 },{ 2754 },{
2751 .vendor = PCI_VENDOR_ID_PHILIPS, 2755 .vendor = PCI_VENDOR_ID_PHILIPS,
@@ -3201,6 +3205,11 @@ int saa7134_board_init1(struct saa7134_dev *dev)
3201 /* power-up tuner chip */ 3205 /* power-up tuner chip */
3202 saa_andorl(SAA7134_GPIO_GPMODE0 >> 2, 0x00040000, 0x00040000); 3206 saa_andorl(SAA7134_GPIO_GPMODE0 >> 2, 0x00040000, 0x00040000);
3203 saa_andorl(SAA7134_GPIO_GPSTATUS0 >> 2, 0x00040000, 0x00000000); 3207 saa_andorl(SAA7134_GPIO_GPSTATUS0 >> 2, 0x00040000, 0x00000000);
3208 case SAA7134_BOARD_PINNACLE_300I_DVBT_PAL:
3209 /* this turns the remote control chip off to work around a bug in it */
3210 saa_writeb(SAA7134_GPIO_GPMODE1, 0x80);
3211 saa_writeb(SAA7134_GPIO_GPSTATUS1, 0x80);
3212 break;
3204 case SAA7134_BOARD_MONSTERTV_MOBILE: 3213 case SAA7134_BOARD_MONSTERTV_MOBILE:
3205 /* power-up tuner chip */ 3214 /* power-up tuner chip */
3206 saa_andorl(SAA7134_GPIO_GPMODE0 >> 2, 0x00040000, 0x00040000); 3215 saa_andorl(SAA7134_GPIO_GPMODE0 >> 2, 0x00040000, 0x00040000);
diff --git a/drivers/media/video/saa7134/saa7134-dvb.c b/drivers/media/video/saa7134/saa7134-dvb.c
index 1a536e865277..9db8e13f21c3 100644
--- a/drivers/media/video/saa7134/saa7134-dvb.c
+++ b/drivers/media/video/saa7134/saa7134-dvb.c
@@ -110,6 +110,7 @@ static int mt352_pinnacle_init(struct dvb_frontend* fe)
110 mt352_write(fe, fsm_ctl_cfg, sizeof(fsm_ctl_cfg)); 110 mt352_write(fe, fsm_ctl_cfg, sizeof(fsm_ctl_cfg));
111 mt352_write(fe, scan_ctl_cfg, sizeof(scan_ctl_cfg)); 111 mt352_write(fe, scan_ctl_cfg, sizeof(scan_ctl_cfg));
112 mt352_write(fe, irq_cfg, sizeof(irq_cfg)); 112 mt352_write(fe, irq_cfg, sizeof(irq_cfg));
113
113 return 0; 114 return 0;
114} 115}
115 116
@@ -117,8 +118,10 @@ static int mt352_pinnacle_pll_set(struct dvb_frontend* fe,
117 struct dvb_frontend_parameters* params, 118 struct dvb_frontend_parameters* params,
118 u8* pllbuf) 119 u8* pllbuf)
119{ 120{
120 static int on = TDA9887_PRESENT | TDA9887_PORT2_INACTIVE; 121 u8 off[] = { 0x00, 0xf1};
121 static int off = TDA9887_PRESENT | TDA9887_PORT2_ACTIVE; 122 u8 on[] = { 0x00, 0x71};
123 struct i2c_msg msg = {.addr=0x43, .flags=0, .buf=off, .len = sizeof(off)};
124
122 struct saa7134_dev *dev = fe->dvb->priv; 125 struct saa7134_dev *dev = fe->dvb->priv;
123 struct v4l2_frequency f; 126 struct v4l2_frequency f;
124 127
@@ -126,9 +129,10 @@ static int mt352_pinnacle_pll_set(struct dvb_frontend* fe,
126 f.tuner = 0; 129 f.tuner = 0;
127 f.type = V4L2_TUNER_DIGITAL_TV; 130 f.type = V4L2_TUNER_DIGITAL_TV;
128 f.frequency = params->frequency / 1000 * 16 / 1000; 131 f.frequency = params->frequency / 1000 * 16 / 1000;
129 saa7134_i2c_call_clients(dev,TDA9887_SET_CONFIG,&on); 132 i2c_transfer(&dev->i2c_adap, &msg, 1);
130 saa7134_i2c_call_clients(dev,VIDIOC_S_FREQUENCY,&f); 133 saa7134_i2c_call_clients(dev,VIDIOC_S_FREQUENCY,&f);
131 saa7134_i2c_call_clients(dev,TDA9887_SET_CONFIG,&off); 134 msg.buf = on;
135 i2c_transfer(&dev->i2c_adap, &msg, 1);
132 136
133 pinnacle_antenna_pwr(dev, antenna_pwr); 137 pinnacle_antenna_pwr(dev, antenna_pwr);
134 138
diff --git a/drivers/media/video/tda8290.c b/drivers/media/video/tda8290.c
index 7b4fb282ac82..a796a4e1917c 100644
--- a/drivers/media/video/tda8290.c
+++ b/drivers/media/video/tda8290.c
@@ -580,9 +580,10 @@ int tda8290_init(struct i2c_client *c)
580 580
581int tda8290_probe(struct i2c_client *c) 581int tda8290_probe(struct i2c_client *c)
582{ 582{
583 unsigned char soft_reset[] = { 0x00, 0x00 }; 583 unsigned char soft_reset[] = { 0x00, 0x00 };
584 unsigned char easy_mode_b[] = { 0x01, 0x02 }; 584 unsigned char easy_mode_b[] = { 0x01, 0x02 };
585 unsigned char easy_mode_g[] = { 0x01, 0x04 }; 585 unsigned char easy_mode_g[] = { 0x01, 0x04 };
586 unsigned char restore_9886[] = { 0x00, 0xd6, 0x30 };
586 unsigned char addr_dto_lsb = 0x07; 587 unsigned char addr_dto_lsb = 0x07;
587 unsigned char data; 588 unsigned char data;
588 589
@@ -599,6 +600,7 @@ int tda8290_probe(struct i2c_client *c)
599 return 0; 600 return 0;
600 } 601 }
601 } 602 }
603 i2c_master_send(c, restore_9886, 3);
602 return -1; 604 return -1;
603} 605}
604 606
diff --git a/drivers/media/video/tuner-core.c b/drivers/media/video/tuner-core.c
index e7ee619d62c5..b6101bf446d4 100644
--- a/drivers/media/video/tuner-core.c
+++ b/drivers/media/video/tuner-core.c
@@ -713,8 +713,9 @@ static int tuner_command(struct i2c_client *client, unsigned int cmd, void *arg)
713 struct v4l2_frequency *f = arg; 713 struct v4l2_frequency *f = arg;
714 714
715 switch_v4l2(); 715 switch_v4l2();
716 if (V4L2_TUNER_RADIO == f->type && 716 if ((V4L2_TUNER_RADIO == f->type && V4L2_TUNER_RADIO != t->mode)
717 V4L2_TUNER_RADIO != t->mode) { 717 || (V4L2_TUNER_DIGITAL_TV == f->type
718 && V4L2_TUNER_DIGITAL_TV != t->mode)) {
718 if (set_mode (client, t, f->type, "VIDIOC_S_FREQUENCY") 719 if (set_mode (client, t, f->type, "VIDIOC_S_FREQUENCY")
719 == EINVAL) 720 == EINVAL)
720 return 0; 721 return 0;
diff --git a/drivers/media/video/videocodec.h b/drivers/media/video/videocodec.h
index 156ae57096fe..b1239ac7f371 100644
--- a/drivers/media/video/videocodec.h
+++ b/drivers/media/video/videocodec.h
@@ -56,7 +56,7 @@
56 the slave is bound to it). Otherwise it doesn't need this functions and 56 the slave is bound to it). Otherwise it doesn't need this functions and
57 therfor they may not be initialized. 57 therfor they may not be initialized.
58 58
59 The other fuctions are just for convenience, as they are for shure used by 59 The other fuctions are just for convenience, as they are for sure used by
60 most/all of the codecs. The last ones may be ommited, too. 60 most/all of the codecs. The last ones may be ommited, too.
61 61
62 See the structure declaration below for more information and which data has 62 See the structure declaration below for more information and which data has
diff --git a/drivers/media/video/zr36050.c b/drivers/media/video/zr36050.c
index bd0cd28543ca..6699725be605 100644
--- a/drivers/media/video/zr36050.c
+++ b/drivers/media/video/zr36050.c
@@ -159,7 +159,7 @@ zr36050_wait_end (struct zr36050 *ptr)
159 159
160 while (!(zr36050_read_status1(ptr) & 0x4)) { 160 while (!(zr36050_read_status1(ptr) & 0x4)) {
161 udelay(1); 161 udelay(1);
162 if (i++ > 200000) { // 200ms, there is for shure something wrong!!! 162 if (i++ > 200000) { // 200ms, there is for sure something wrong!!!
163 dprintk(1, 163 dprintk(1,
164 "%s: timout at wait_end (last status: 0x%02x)\n", 164 "%s: timout at wait_end (last status: 0x%02x)\n",
165 ptr->name, ptr->status1); 165 ptr->name, ptr->status1);
diff --git a/drivers/media/video/zr36060.c b/drivers/media/video/zr36060.c
index 28fa31a5f150..d8dd003a7aad 100644
--- a/drivers/media/video/zr36060.c
+++ b/drivers/media/video/zr36060.c
@@ -161,7 +161,7 @@ zr36060_wait_end (struct zr36060 *ptr)
161 161
162 while (zr36060_read_status(ptr) & ZR060_CFSR_Busy) { 162 while (zr36060_read_status(ptr) & ZR060_CFSR_Busy) {
163 udelay(1); 163 udelay(1);
164 if (i++ > 200000) { // 200ms, there is for shure something wrong!!! 164 if (i++ > 200000) { // 200ms, there is for sure something wrong!!!
165 dprintk(1, 165 dprintk(1,
166 "%s: timout at wait_end (last status: 0x%02x)\n", 166 "%s: timout at wait_end (last status: 0x%02x)\n",
167 ptr->name, ptr->status); 167 ptr->name, ptr->status);
diff --git a/drivers/media/video/zr36120_i2c.c b/drivers/media/video/zr36120_i2c.c
index 6bfe84d657f1..21fde43a6aed 100644
--- a/drivers/media/video/zr36120_i2c.c
+++ b/drivers/media/video/zr36120_i2c.c
@@ -65,7 +65,7 @@ void attach_inform(struct i2c_bus *bus, int id)
65 case I2C_DRIVERID_VIDEODECODER: 65 case I2C_DRIVERID_VIDEODECODER:
66 DEBUG(printk(CARD_INFO "decoder attached\n",CARD)); 66 DEBUG(printk(CARD_INFO "decoder attached\n",CARD));
67 67
68 /* fetch the capabilites of the decoder */ 68 /* fetch the capabilities of the decoder */
69 rv = i2c_control_device(&ztv->i2c, I2C_DRIVERID_VIDEODECODER, DECODER_GET_CAPABILITIES, &dc); 69 rv = i2c_control_device(&ztv->i2c, I2C_DRIVERID_VIDEODECODER, DECODER_GET_CAPABILITIES, &dc);
70 if (rv) { 70 if (rv) {
71 DEBUG(printk(CARD_DEBUG "decoder is not V4L aware!\n",CARD)); 71 DEBUG(printk(CARD_DEBUG "decoder is not V4L aware!\n",CARD));
diff --git a/drivers/misc/ibmasm/ibmasm.h b/drivers/misc/ibmasm/ibmasm.h
index 1cef2387fa65..6aba41954448 100644
--- a/drivers/misc/ibmasm/ibmasm.h
+++ b/drivers/misc/ibmasm/ibmasm.h
@@ -101,15 +101,16 @@ struct command {
101static inline void command_put(struct command *cmd) 101static inline void command_put(struct command *cmd)
102{ 102{
103 unsigned long flags; 103 unsigned long flags;
104 spinlock_t *lock = cmd->lock;
104 105
105 spin_lock_irqsave(cmd->lock, flags); 106 spin_lock_irqsave(lock, flags);
106 kobject_put(&cmd->kobj); 107 kobject_put(&cmd->kobj);
107 spin_unlock_irqrestore(cmd->lock, flags); 108 spin_unlock_irqrestore(lock, flags);
108} 109}
109 110
110static inline void command_get(struct command *cmd) 111static inline void command_get(struct command *cmd)
111{ 112{
112 kobject_get(&cmd->kobj); 113 kobject_get(&cmd->kobj);
113} 114}
114 115
115 116
diff --git a/drivers/mmc/au1xmmc.c b/drivers/mmc/au1xmmc.c
index 227c39a7c1b4..8d84b045bc83 100644
--- a/drivers/mmc/au1xmmc.c
+++ b/drivers/mmc/au1xmmc.c
@@ -37,7 +37,7 @@
37#include <linux/config.h> 37#include <linux/config.h>
38#include <linux/module.h> 38#include <linux/module.h>
39#include <linux/init.h> 39#include <linux/init.h>
40#include <linux/device.h> 40#include <linux/platform_device.h>
41#include <linux/mm.h> 41#include <linux/mm.h>
42#include <linux/interrupt.h> 42#include <linux/interrupt.h>
43#include <linux/dma-mapping.h> 43#include <linux/dma-mapping.h>
@@ -194,7 +194,7 @@ static int au1xmmc_send_command(struct au1xmmc_host *host, int wait,
194 194
195 u32 mmccmd = (cmd->opcode << SD_CMD_CI_SHIFT); 195 u32 mmccmd = (cmd->opcode << SD_CMD_CI_SHIFT);
196 196
197 switch (mmc_rsp_type(cmd->flags)) { 197 switch (mmc_resp_type(cmd)) {
198 case MMC_RSP_R1: 198 case MMC_RSP_R1:
199 mmccmd |= SD_CMD_RT_1; 199 mmccmd |= SD_CMD_RT_1;
200 break; 200 break;
@@ -740,7 +740,6 @@ static void au1xmmc_set_ios(struct mmc_host* mmc, struct mmc_ios* ios)
740static void au1xmmc_dma_callback(int irq, void *dev_id, struct pt_regs *regs) 740static void au1xmmc_dma_callback(int irq, void *dev_id, struct pt_regs *regs)
741{ 741{
742 struct au1xmmc_host *host = (struct au1xmmc_host *) dev_id; 742 struct au1xmmc_host *host = (struct au1xmmc_host *) dev_id;
743 u32 status;
744 743
745 /* Avoid spurious interrupts */ 744 /* Avoid spurious interrupts */
746 745
@@ -887,7 +886,7 @@ struct mmc_host_ops au1xmmc_ops = {
887 .set_ios = au1xmmc_set_ios, 886 .set_ios = au1xmmc_set_ios,
888}; 887};
889 888
890static int au1xmmc_probe(struct device *dev) 889static int __devinit au1xmmc_probe(struct platform_device *pdev)
891{ 890{
892 891
893 int i, ret = 0; 892 int i, ret = 0;
@@ -904,7 +903,7 @@ static int au1xmmc_probe(struct device *dev)
904 disable_irq(AU1100_SD_IRQ); 903 disable_irq(AU1100_SD_IRQ);
905 904
906 for(i = 0; i < AU1XMMC_CONTROLLER_COUNT; i++) { 905 for(i = 0; i < AU1XMMC_CONTROLLER_COUNT; i++) {
907 struct mmc_host *mmc = mmc_alloc_host(sizeof(struct au1xmmc_host), dev); 906 struct mmc_host *mmc = mmc_alloc_host(sizeof(struct au1xmmc_host), &pdev->dev);
908 struct au1xmmc_host *host = 0; 907 struct au1xmmc_host *host = 0;
909 908
910 if (!mmc) { 909 if (!mmc) {
@@ -967,7 +966,7 @@ static int au1xmmc_probe(struct device *dev)
967 return 0; 966 return 0;
968} 967}
969 968
970static int au1xmmc_remove(struct device *dev) 969static int __devexit au1xmmc_remove(struct platform_device *pdev)
971{ 970{
972 971
973 int i; 972 int i;
@@ -997,23 +996,24 @@ static int au1xmmc_remove(struct device *dev)
997 return 0; 996 return 0;
998} 997}
999 998
1000static struct device_driver au1xmmc_driver = { 999static struct platform_driver au1xmmc_driver = {
1001 .name = DRIVER_NAME,
1002 .bus = &platform_bus_type,
1003 .probe = au1xmmc_probe, 1000 .probe = au1xmmc_probe,
1004 .remove = au1xmmc_remove, 1001 .remove = au1xmmc_remove,
1005 .suspend = NULL, 1002 .suspend = NULL,
1006 .resume = NULL 1003 .resume = NULL,
1004 .driver = {
1005 .name = DRIVER_NAME,
1006 },
1007}; 1007};
1008 1008
1009static int __init au1xmmc_init(void) 1009static int __init au1xmmc_init(void)
1010{ 1010{
1011 return driver_register(&au1xmmc_driver); 1011 return platform_driver_register(&au1xmmc_driver);
1012} 1012}
1013 1013
1014static void __exit au1xmmc_exit(void) 1014static void __exit au1xmmc_exit(void)
1015{ 1015{
1016 driver_unregister(&au1xmmc_driver); 1016 platform_driver_unregister(&au1xmmc_driver);
1017} 1017}
1018 1018
1019module_init(au1xmmc_init); 1019module_init(au1xmmc_init);
diff --git a/drivers/mtd/redboot.c b/drivers/mtd/redboot.c
index d01b6a9198e0..8815c8dbef2d 100644
--- a/drivers/mtd/redboot.c
+++ b/drivers/mtd/redboot.c
@@ -1,5 +1,5 @@
1/* 1/*
2 * $Id: redboot.c,v 1.18 2005/11/07 11:14:21 gleixner Exp $ 2 * $Id: redboot.c,v 1.19 2005/12/01 10:03:51 dwmw2 Exp $
3 * 3 *
4 * Parse RedBoot-style Flash Image System (FIS) tables and 4 * Parse RedBoot-style Flash Image System (FIS) tables and
5 * produce a Linux partition array to match. 5 * produce a Linux partition array to match.
@@ -92,10 +92,10 @@ static int parse_redboot_partitions(struct mtd_info *master,
92 if (!memcmp(buf[i].name, "FIS directory", 14)) { 92 if (!memcmp(buf[i].name, "FIS directory", 14)) {
93 /* This is apparently the FIS directory entry for the 93 /* This is apparently the FIS directory entry for the
94 * FIS directory itself. The FIS directory size is 94 * FIS directory itself. The FIS directory size is
95 * one erase block, if the buf[i].size field is 95 * one erase block; if the buf[i].size field is
96 * swab32(erasesize) then we know we are looking at 96 * swab32(erasesize) then we know we are looking at
97 * a byte swapped FIS directory - swap all the entries! 97 * a byte swapped FIS directory - swap all the entries!
98 * (NOTE: this is 'size' not 'data_length', size is 98 * (NOTE: this is 'size' not 'data_length'; size is
99 * the full size of the entry.) 99 * the full size of the entry.)
100 */ 100 */
101 if (swab32(buf[i].size) == master->erasesize) { 101 if (swab32(buf[i].size) == master->erasesize) {
@@ -104,15 +104,13 @@ static int parse_redboot_partitions(struct mtd_info *master,
104 /* The unsigned long fields were written with the 104 /* The unsigned long fields were written with the
105 * wrong byte sex, name and pad have no byte sex. 105 * wrong byte sex, name and pad have no byte sex.
106 */ 106 */
107# define do_swab32(x) (x) = swab32(x) 107 swab32s(&buf[j].flash_base);
108 do_swab32(buf[j].flash_base); 108 swab32s(&buf[j].mem_base);
109 do_swab32(buf[j].mem_base); 109 swab32s(&buf[j].size);
110 do_swab32(buf[j].size); 110 swab32s(&buf[j].entry_point);
111 do_swab32(buf[j].entry_point); 111 swab32s(&buf[j].data_length);
112 do_swab32(buf[j].data_length); 112 swab32s(&buf[j].desc_cksum);
113 do_swab32(buf[j].desc_cksum); 113 swab32s(&buf[j].file_cksum);
114 do_swab32(buf[j].file_cksum);
115# undef do_swab32
116 } 114 }
117 } 115 }
118 break; 116 break;
diff --git a/drivers/net/chelsio/espi.c b/drivers/net/chelsio/espi.c
index 230642571c92..e824acaf188a 100644
--- a/drivers/net/chelsio/espi.c
+++ b/drivers/net/chelsio/espi.c
@@ -296,9 +296,7 @@ void t1_espi_destroy(struct peespi *espi)
296 296
297struct peespi *t1_espi_create(adapter_t *adapter) 297struct peespi *t1_espi_create(adapter_t *adapter)
298{ 298{
299 struct peespi *espi = kmalloc(sizeof(*espi), GFP_KERNEL); 299 struct peespi *espi = kzalloc(sizeof(*espi), GFP_KERNEL);
300
301 memset(espi, 0, sizeof(*espi));
302 300
303 if (espi) 301 if (espi)
304 espi->adapter = adapter; 302 espi->adapter = adapter;
diff --git a/drivers/net/e1000/e1000.h b/drivers/net/e1000/e1000.h
index 27c77306193b..99baf0e099fc 100644
--- a/drivers/net/e1000/e1000.h
+++ b/drivers/net/e1000/e1000.h
@@ -225,9 +225,6 @@ struct e1000_rx_ring {
225 struct e1000_ps_page *ps_page; 225 struct e1000_ps_page *ps_page;
226 struct e1000_ps_page_dma *ps_page_dma; 226 struct e1000_ps_page_dma *ps_page_dma;
227 227
228 struct sk_buff *rx_skb_top;
229 struct sk_buff *rx_skb_prev;
230
231 /* cpu for rx queue */ 228 /* cpu for rx queue */
232 int cpu; 229 int cpu;
233 230
diff --git a/drivers/net/e1000/e1000_main.c b/drivers/net/e1000/e1000_main.c
index 31e332935e5a..5b7d0f425af2 100644
--- a/drivers/net/e1000/e1000_main.c
+++ b/drivers/net/e1000/e1000_main.c
@@ -103,7 +103,7 @@ static char e1000_driver_string[] = "Intel(R) PRO/1000 Network Driver";
103#else 103#else
104#define DRIVERNAPI "-NAPI" 104#define DRIVERNAPI "-NAPI"
105#endif 105#endif
106#define DRV_VERSION "6.3.9-k2"DRIVERNAPI 106#define DRV_VERSION "6.3.9-k4"DRIVERNAPI
107char e1000_driver_version[] = DRV_VERSION; 107char e1000_driver_version[] = DRV_VERSION;
108static char e1000_copyright[] = "Copyright (c) 1999-2005 Intel Corporation."; 108static char e1000_copyright[] = "Copyright (c) 1999-2005 Intel Corporation.";
109 109
@@ -1635,8 +1635,6 @@ setup_rx_desc_die:
1635 1635
1636 rxdr->next_to_clean = 0; 1636 rxdr->next_to_clean = 0;
1637 rxdr->next_to_use = 0; 1637 rxdr->next_to_use = 0;
1638 rxdr->rx_skb_top = NULL;
1639 rxdr->rx_skb_prev = NULL;
1640 1638
1641 return 0; 1639 return 0;
1642} 1640}
@@ -1713,8 +1711,23 @@ e1000_setup_rctl(struct e1000_adapter *adapter)
1713 rctl |= adapter->rx_buffer_len << 0x11; 1711 rctl |= adapter->rx_buffer_len << 0x11;
1714 } else { 1712 } else {
1715 rctl &= ~E1000_RCTL_SZ_4096; 1713 rctl &= ~E1000_RCTL_SZ_4096;
1716 rctl &= ~E1000_RCTL_BSEX; 1714 rctl |= E1000_RCTL_BSEX;
1717 rctl |= E1000_RCTL_SZ_2048; 1715 switch (adapter->rx_buffer_len) {
1716 case E1000_RXBUFFER_2048:
1717 default:
1718 rctl |= E1000_RCTL_SZ_2048;
1719 rctl &= ~E1000_RCTL_BSEX;
1720 break;
1721 case E1000_RXBUFFER_4096:
1722 rctl |= E1000_RCTL_SZ_4096;
1723 break;
1724 case E1000_RXBUFFER_8192:
1725 rctl |= E1000_RCTL_SZ_8192;
1726 break;
1727 case E1000_RXBUFFER_16384:
1728 rctl |= E1000_RCTL_SZ_16384;
1729 break;
1730 }
1718 } 1731 }
1719 1732
1720#ifndef CONFIG_E1000_DISABLE_PACKET_SPLIT 1733#ifndef CONFIG_E1000_DISABLE_PACKET_SPLIT
@@ -2107,16 +2120,6 @@ e1000_clean_rx_ring(struct e1000_adapter *adapter,
2107 } 2120 }
2108 } 2121 }
2109 2122
2110 /* there also may be some cached data in our adapter */
2111 if (rx_ring->rx_skb_top) {
2112 dev_kfree_skb(rx_ring->rx_skb_top);
2113
2114 /* rx_skb_prev will be wiped out by rx_skb_top */
2115 rx_ring->rx_skb_top = NULL;
2116 rx_ring->rx_skb_prev = NULL;
2117 }
2118
2119
2120 size = sizeof(struct e1000_buffer) * rx_ring->count; 2123 size = sizeof(struct e1000_buffer) * rx_ring->count;
2121 memset(rx_ring->buffer_info, 0, size); 2124 memset(rx_ring->buffer_info, 0, size);
2122 size = sizeof(struct e1000_ps_page) * rx_ring->count; 2125 size = sizeof(struct e1000_ps_page) * rx_ring->count;
@@ -3106,24 +3109,27 @@ e1000_change_mtu(struct net_device *netdev, int new_mtu)
3106 break; 3109 break;
3107 } 3110 }
3108 3111
3109 /* since the driver code now supports splitting a packet across 3112
3110 * multiple descriptors, most of the fifo related limitations on
3111 * jumbo frame traffic have gone away.
3112 * simply use 2k descriptors for everything.
3113 *
3114 * NOTE: dev_alloc_skb reserves 16 bytes, and typically NET_IP_ALIGN
3115 * means we reserve 2 more, this pushes us to allocate from the next
3116 * larger slab size
3117 * i.e. RXBUFFER_2048 --> size-4096 slab */
3118
3119 /* recent hardware supports 1KB granularity */
3120 if (adapter->hw.mac_type > e1000_82547_rev_2) { 3113 if (adapter->hw.mac_type > e1000_82547_rev_2) {
3121 adapter->rx_buffer_len = 3114 adapter->rx_buffer_len = max_frame;
3122 ((max_frame < E1000_RXBUFFER_2048) ?
3123 max_frame : E1000_RXBUFFER_2048);
3124 E1000_ROUNDUP(adapter->rx_buffer_len, 1024); 3115 E1000_ROUNDUP(adapter->rx_buffer_len, 1024);
3125 } else 3116 } else {
3126 adapter->rx_buffer_len = E1000_RXBUFFER_2048; 3117 if(unlikely((adapter->hw.mac_type < e1000_82543) &&
3118 (max_frame > MAXIMUM_ETHERNET_FRAME_SIZE))) {
3119 DPRINTK(PROBE, ERR, "Jumbo Frames not supported "
3120 "on 82542\n");
3121 return -EINVAL;
3122 } else {
3123 if(max_frame <= E1000_RXBUFFER_2048)
3124 adapter->rx_buffer_len = E1000_RXBUFFER_2048;
3125 else if(max_frame <= E1000_RXBUFFER_4096)
3126 adapter->rx_buffer_len = E1000_RXBUFFER_4096;
3127 else if(max_frame <= E1000_RXBUFFER_8192)
3128 adapter->rx_buffer_len = E1000_RXBUFFER_8192;
3129 else if(max_frame <= E1000_RXBUFFER_16384)
3130 adapter->rx_buffer_len = E1000_RXBUFFER_16384;
3131 }
3132 }
3127 3133
3128 netdev->mtu = new_mtu; 3134 netdev->mtu = new_mtu;
3129 3135
@@ -3620,7 +3626,7 @@ e1000_clean_rx_irq(struct e1000_adapter *adapter,
3620 uint8_t last_byte; 3626 uint8_t last_byte;
3621 unsigned int i; 3627 unsigned int i;
3622 int cleaned_count = 0; 3628 int cleaned_count = 0;
3623 boolean_t cleaned = FALSE, multi_descriptor = FALSE; 3629 boolean_t cleaned = FALSE;
3624 3630
3625 i = rx_ring->next_to_clean; 3631 i = rx_ring->next_to_clean;
3626 rx_desc = E1000_RX_DESC(*rx_ring, i); 3632 rx_desc = E1000_RX_DESC(*rx_ring, i);
@@ -3652,43 +3658,12 @@ e1000_clean_rx_irq(struct e1000_adapter *adapter,
3652 3658
3653 length = le16_to_cpu(rx_desc->length); 3659 length = le16_to_cpu(rx_desc->length);
3654 3660
3655 skb_put(skb, length); 3661 if (unlikely(!(status & E1000_RXD_STAT_EOP))) {
3656 3662 /* All receives must fit into a single buffer */
3657 if (!(status & E1000_RXD_STAT_EOP)) { 3663 E1000_DBG("%s: Receive packet consumed multiple"
3658 if (!rx_ring->rx_skb_top) { 3664 " buffers\n", netdev->name);
3659 rx_ring->rx_skb_top = skb; 3665 dev_kfree_skb_irq(skb);
3660 rx_ring->rx_skb_top->len = length;
3661 rx_ring->rx_skb_prev = skb;
3662 } else {
3663 if (skb_shinfo(rx_ring->rx_skb_top)->frag_list) {
3664 rx_ring->rx_skb_prev->next = skb;
3665 skb->prev = rx_ring->rx_skb_prev;
3666 } else {
3667 skb_shinfo(rx_ring->rx_skb_top)->frag_list = skb;
3668 }
3669 rx_ring->rx_skb_prev = skb;
3670 rx_ring->rx_skb_top->data_len += length;
3671 }
3672 goto next_desc; 3666 goto next_desc;
3673 } else {
3674 if (rx_ring->rx_skb_top) {
3675 if (skb_shinfo(rx_ring->rx_skb_top)
3676 ->frag_list) {
3677 rx_ring->rx_skb_prev->next = skb;
3678 skb->prev = rx_ring->rx_skb_prev;
3679 } else
3680 skb_shinfo(rx_ring->rx_skb_top)
3681 ->frag_list = skb;
3682
3683 rx_ring->rx_skb_top->data_len += length;
3684 rx_ring->rx_skb_top->len +=
3685 rx_ring->rx_skb_top->data_len;
3686
3687 skb = rx_ring->rx_skb_top;
3688 multi_descriptor = TRUE;
3689 rx_ring->rx_skb_top = NULL;
3690 rx_ring->rx_skb_prev = NULL;
3691 }
3692 } 3667 }
3693 3668
3694 if (unlikely(rx_desc->errors & E1000_RXD_ERR_FRAME_ERR_MASK)) { 3669 if (unlikely(rx_desc->errors & E1000_RXD_ERR_FRAME_ERR_MASK)) {
@@ -3712,10 +3687,7 @@ e1000_clean_rx_irq(struct e1000_adapter *adapter,
3712 * performance for small packets with large amounts 3687 * performance for small packets with large amounts
3713 * of reassembly being done in the stack */ 3688 * of reassembly being done in the stack */
3714#define E1000_CB_LENGTH 256 3689#define E1000_CB_LENGTH 256
3715 if ((length < E1000_CB_LENGTH) && 3690 if (length < E1000_CB_LENGTH) {
3716 !rx_ring->rx_skb_top &&
3717 /* or maybe (status & E1000_RXD_STAT_EOP) && */
3718 !multi_descriptor) {
3719 struct sk_buff *new_skb = 3691 struct sk_buff *new_skb =
3720 dev_alloc_skb(length + NET_IP_ALIGN); 3692 dev_alloc_skb(length + NET_IP_ALIGN);
3721 if (new_skb) { 3693 if (new_skb) {
@@ -3729,7 +3701,8 @@ e1000_clean_rx_irq(struct e1000_adapter *adapter,
3729 skb = new_skb; 3701 skb = new_skb;
3730 skb_put(skb, length); 3702 skb_put(skb, length);
3731 } 3703 }
3732 } 3704 } else
3705 skb_put(skb, length);
3733 3706
3734 /* end copybreak code */ 3707 /* end copybreak code */
3735 3708
diff --git a/drivers/net/pcmcia/axnet_cs.c b/drivers/net/pcmcia/axnet_cs.c
index 01ddfc8cce3f..aa5581369399 100644
--- a/drivers/net/pcmcia/axnet_cs.c
+++ b/drivers/net/pcmcia/axnet_cs.c
@@ -806,6 +806,7 @@ static struct pcmcia_device_id axnet_ids[] = {
806 PCMCIA_DEVICE_MANF_CARD(0x026f, 0x0309), 806 PCMCIA_DEVICE_MANF_CARD(0x026f, 0x0309),
807 PCMCIA_DEVICE_MANF_CARD(0x0274, 0x1106), 807 PCMCIA_DEVICE_MANF_CARD(0x0274, 0x1106),
808 PCMCIA_DEVICE_MANF_CARD(0x8a01, 0xc1ab), 808 PCMCIA_DEVICE_MANF_CARD(0x8a01, 0xc1ab),
809 PCMCIA_DEVICE_PROD_ID12("AmbiCom,Inc.", "Fast Ethernet PC Card(AMB8110)", 0x49b020a7, 0x119cc9fc),
809 PCMCIA_DEVICE_PROD_ID124("Fast Ethernet", "16-bit PC Card", "AX88190", 0xb4be14e3, 0x9a12eb6a, 0xab9be5ef), 810 PCMCIA_DEVICE_PROD_ID124("Fast Ethernet", "16-bit PC Card", "AX88190", 0xb4be14e3, 0x9a12eb6a, 0xab9be5ef),
810 PCMCIA_DEVICE_PROD_ID12("ASIX", "AX88190", 0x0959823b, 0xab9be5ef), 811 PCMCIA_DEVICE_PROD_ID12("ASIX", "AX88190", 0x0959823b, 0xab9be5ef),
811 PCMCIA_DEVICE_PROD_ID12("Billionton", "LNA-100B", 0x552ab682, 0xbc3b87e1), 812 PCMCIA_DEVICE_PROD_ID12("Billionton", "LNA-100B", 0x552ab682, 0xbc3b87e1),
diff --git a/drivers/net/s2io.c b/drivers/net/s2io.c
index 49b597cbc19a..b7f00d6eb6a6 100644
--- a/drivers/net/s2io.c
+++ b/drivers/net/s2io.c
@@ -4092,6 +4092,7 @@ static void s2io_set_multicast(struct net_device *dev)
4092 i++, mclist = mclist->next) { 4092 i++, mclist = mclist->next) {
4093 memcpy(sp->usr_addrs[i].addr, mclist->dmi_addr, 4093 memcpy(sp->usr_addrs[i].addr, mclist->dmi_addr,
4094 ETH_ALEN); 4094 ETH_ALEN);
4095 mac_addr = 0;
4095 for (j = 0; j < ETH_ALEN; j++) { 4096 for (j = 0; j < ETH_ALEN; j++) {
4096 mac_addr |= mclist->dmi_addr[j]; 4097 mac_addr |= mclist->dmi_addr[j];
4097 mac_addr <<= 8; 4098 mac_addr <<= 8;
diff --git a/drivers/net/tg3.c b/drivers/net/tg3.c
index e8e92c853e89..15545620ab0e 100644
--- a/drivers/net/tg3.c
+++ b/drivers/net/tg3.c
@@ -3532,9 +3532,23 @@ static inline int tg3_4g_overflow_test(dma_addr_t mapping, int len)
3532 (base + len + 8 < base)); 3532 (base + len + 8 < base));
3533} 3533}
3534 3534
3535/* Test for DMA addresses > 40-bit */
3536static inline int tg3_40bit_overflow_test(struct tg3 *tp, dma_addr_t mapping,
3537 int len)
3538{
3539#if defined(CONFIG_HIGHMEM) && (BITS_PER_LONG == 64)
3540 if (tp->tg3_flags2 & TG3_FLG2_5780_CLASS)
3541 return (((u64) mapping + len) > DMA_40BIT_MASK);
3542 return 0;
3543#else
3544 return 0;
3545#endif
3546}
3547
3535static void tg3_set_txd(struct tg3 *, int, dma_addr_t, int, u32, u32); 3548static void tg3_set_txd(struct tg3 *, int, dma_addr_t, int, u32, u32);
3536 3549
3537static int tigon3_4gb_hwbug_workaround(struct tg3 *tp, struct sk_buff *skb, 3550/* Workaround 4GB and 40-bit hardware DMA bugs. */
3551static int tigon3_dma_hwbug_workaround(struct tg3 *tp, struct sk_buff *skb,
3538 u32 last_plus_one, u32 *start, 3552 u32 last_plus_one, u32 *start,
3539 u32 base_flags, u32 mss) 3553 u32 base_flags, u32 mss)
3540{ 3554{
@@ -3742,6 +3756,9 @@ static int tg3_start_xmit(struct sk_buff *skb, struct net_device *dev)
3742 if (tg3_4g_overflow_test(mapping, len)) 3756 if (tg3_4g_overflow_test(mapping, len))
3743 would_hit_hwbug = 1; 3757 would_hit_hwbug = 1;
3744 3758
3759 if (tg3_40bit_overflow_test(tp, mapping, len))
3760 would_hit_hwbug = 1;
3761
3745 if (tp->tg3_flags2 & TG3_FLG2_HW_TSO) 3762 if (tp->tg3_flags2 & TG3_FLG2_HW_TSO)
3746 tg3_set_txd(tp, entry, mapping, len, 3763 tg3_set_txd(tp, entry, mapping, len,
3747 base_flags, (i == last)|(mss << 1)); 3764 base_flags, (i == last)|(mss << 1));
@@ -3763,7 +3780,7 @@ static int tg3_start_xmit(struct sk_buff *skb, struct net_device *dev)
3763 /* If the workaround fails due to memory/mapping 3780 /* If the workaround fails due to memory/mapping
3764 * failure, silently drop this packet. 3781 * failure, silently drop this packet.
3765 */ 3782 */
3766 if (tigon3_4gb_hwbug_workaround(tp, skb, last_plus_one, 3783 if (tigon3_dma_hwbug_workaround(tp, skb, last_plus_one,
3767 &start, base_flags, mss)) 3784 &start, base_flags, mss))
3768 goto out_unlock; 3785 goto out_unlock;
3769 3786
@@ -10608,8 +10625,9 @@ static int __devinit tg3_init_one(struct pci_dev *pdev,
10608 unsigned long tg3reg_base, tg3reg_len; 10625 unsigned long tg3reg_base, tg3reg_len;
10609 struct net_device *dev; 10626 struct net_device *dev;
10610 struct tg3 *tp; 10627 struct tg3 *tp;
10611 int i, err, pci_using_dac, pm_cap; 10628 int i, err, pm_cap;
10612 char str[40]; 10629 char str[40];
10630 u64 dma_mask, persist_dma_mask;
10613 10631
10614 if (tg3_version_printed++ == 0) 10632 if (tg3_version_printed++ == 0)
10615 printk(KERN_INFO "%s", version); 10633 printk(KERN_INFO "%s", version);
@@ -10646,26 +10664,6 @@ static int __devinit tg3_init_one(struct pci_dev *pdev,
10646 goto err_out_free_res; 10664 goto err_out_free_res;
10647 } 10665 }
10648 10666
10649 /* Configure DMA attributes. */
10650 err = pci_set_dma_mask(pdev, DMA_64BIT_MASK);
10651 if (!err) {
10652 pci_using_dac = 1;
10653 err = pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK);
10654 if (err < 0) {
10655 printk(KERN_ERR PFX "Unable to obtain 64 bit DMA "
10656 "for consistent allocations\n");
10657 goto err_out_free_res;
10658 }
10659 } else {
10660 err = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
10661 if (err) {
10662 printk(KERN_ERR PFX "No usable DMA configuration, "
10663 "aborting.\n");
10664 goto err_out_free_res;
10665 }
10666 pci_using_dac = 0;
10667 }
10668
10669 tg3reg_base = pci_resource_start(pdev, 0); 10667 tg3reg_base = pci_resource_start(pdev, 0);
10670 tg3reg_len = pci_resource_len(pdev, 0); 10668 tg3reg_len = pci_resource_len(pdev, 0);
10671 10669
@@ -10679,8 +10677,6 @@ static int __devinit tg3_init_one(struct pci_dev *pdev,
10679 SET_MODULE_OWNER(dev); 10677 SET_MODULE_OWNER(dev);
10680 SET_NETDEV_DEV(dev, &pdev->dev); 10678 SET_NETDEV_DEV(dev, &pdev->dev);
10681 10679
10682 if (pci_using_dac)
10683 dev->features |= NETIF_F_HIGHDMA;
10684 dev->features |= NETIF_F_LLTX; 10680 dev->features |= NETIF_F_LLTX;
10685#if TG3_VLAN_TAG_USED 10681#if TG3_VLAN_TAG_USED
10686 dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX; 10682 dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
@@ -10765,6 +10761,44 @@ static int __devinit tg3_init_one(struct pci_dev *pdev,
10765 goto err_out_iounmap; 10761 goto err_out_iounmap;
10766 } 10762 }
10767 10763
10764 /* 5714, 5715 and 5780 cannot support DMA addresses > 40-bit.
10765 * On 64-bit systems with IOMMU, use 40-bit dma_mask.
10766 * On 64-bit systems without IOMMU, use 64-bit dma_mask and
10767 * do DMA address check in tg3_start_xmit().
10768 */
10769 if (tp->tg3_flags2 & TG3_FLG2_5780_CLASS) {
10770 persist_dma_mask = dma_mask = DMA_40BIT_MASK;
10771#ifdef CONFIG_HIGHMEM
10772 dma_mask = DMA_64BIT_MASK;
10773#endif
10774 } else if (tp->tg3_flags2 & TG3_FLG2_IS_5788)
10775 persist_dma_mask = dma_mask = DMA_32BIT_MASK;
10776 else
10777 persist_dma_mask = dma_mask = DMA_64BIT_MASK;
10778
10779 /* Configure DMA attributes. */
10780 if (dma_mask > DMA_32BIT_MASK) {
10781 err = pci_set_dma_mask(pdev, dma_mask);
10782 if (!err) {
10783 dev->features |= NETIF_F_HIGHDMA;
10784 err = pci_set_consistent_dma_mask(pdev,
10785 persist_dma_mask);
10786 if (err < 0) {
10787 printk(KERN_ERR PFX "Unable to obtain 64 bit "
10788 "DMA for consistent allocations\n");
10789 goto err_out_iounmap;
10790 }
10791 }
10792 }
10793 if (err || dma_mask == DMA_32BIT_MASK) {
10794 err = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
10795 if (err) {
10796 printk(KERN_ERR PFX "No usable DMA configuration, "
10797 "aborting.\n");
10798 goto err_out_iounmap;
10799 }
10800 }
10801
10768 tg3_init_bufmgr_config(tp); 10802 tg3_init_bufmgr_config(tp);
10769 10803
10770#if TG3_TSO_SUPPORT != 0 10804#if TG3_TSO_SUPPORT != 0
@@ -10833,9 +10867,6 @@ static int __devinit tg3_init_one(struct pci_dev *pdev,
10833 } else 10867 } else
10834 tp->tg3_flags &= ~TG3_FLAG_RX_CHECKSUMS; 10868 tp->tg3_flags &= ~TG3_FLAG_RX_CHECKSUMS;
10835 10869
10836 if (tp->tg3_flags2 & TG3_FLG2_IS_5788)
10837 dev->features &= ~NETIF_F_HIGHDMA;
10838
10839 /* flow control autonegotiation is default behavior */ 10870 /* flow control autonegotiation is default behavior */
10840 tp->tg3_flags |= TG3_FLAG_PAUSE_AUTONEG; 10871 tp->tg3_flags |= TG3_FLAG_PAUSE_AUTONEG;
10841 10872
diff --git a/drivers/net/wireless/hostap/hostap_cs.c b/drivers/net/wireless/hostap/hostap_cs.c
index 8bc0b528548f..f8f4503475f9 100644
--- a/drivers/net/wireless/hostap/hostap_cs.c
+++ b/drivers/net/wireless/hostap/hostap_cs.c
@@ -877,7 +877,6 @@ static struct pcmcia_device_id hostap_cs_ids[] = {
877 PCMCIA_DEVICE_MANF_CARD(0x0101, 0x0777), 877 PCMCIA_DEVICE_MANF_CARD(0x0101, 0x0777),
878 PCMCIA_DEVICE_MANF_CARD(0x0126, 0x8000), 878 PCMCIA_DEVICE_MANF_CARD(0x0126, 0x8000),
879 PCMCIA_DEVICE_MANF_CARD(0x0138, 0x0002), 879 PCMCIA_DEVICE_MANF_CARD(0x0138, 0x0002),
880 PCMCIA_DEVICE_MANF_CARD(0x0156, 0x0002),
881 PCMCIA_DEVICE_MANF_CARD(0x0250, 0x0002), 880 PCMCIA_DEVICE_MANF_CARD(0x0250, 0x0002),
882 PCMCIA_DEVICE_MANF_CARD(0x026f, 0x030b), 881 PCMCIA_DEVICE_MANF_CARD(0x026f, 0x030b),
883 PCMCIA_DEVICE_MANF_CARD(0x0274, 0x1612), 882 PCMCIA_DEVICE_MANF_CARD(0x0274, 0x1612),
@@ -891,6 +890,10 @@ static struct pcmcia_device_id hostap_cs_ids[] = {
891 PCMCIA_DEVICE_MANF_CARD(0xd601, 0x0002), 890 PCMCIA_DEVICE_MANF_CARD(0xd601, 0x0002),
892 PCMCIA_DEVICE_MANF_CARD(0xd601, 0x0005), 891 PCMCIA_DEVICE_MANF_CARD(0xd601, 0x0005),
893 PCMCIA_DEVICE_MANF_CARD(0xd601, 0x0010), 892 PCMCIA_DEVICE_MANF_CARD(0xd601, 0x0010),
893 PCMCIA_DEVICE_MANF_CARD_PROD_ID1(0x0156, 0x0002, "INTERSIL",
894 0x74c5e40d),
895 PCMCIA_DEVICE_MANF_CARD_PROD_ID1(0x0156, 0x0002, "Intersil",
896 0x4b801a17),
894 PCMCIA_MFC_DEVICE_PROD_ID12(0, "SanDisk", "ConnectPlus", 897 PCMCIA_MFC_DEVICE_PROD_ID12(0, "SanDisk", "ConnectPlus",
895 0x7a954bd9, 0x74be00c6), 898 0x7a954bd9, 0x74be00c6),
896 PCMCIA_DEVICE_PROD_ID1234( 899 PCMCIA_DEVICE_PROD_ID1234(
diff --git a/drivers/parport/parport_serial.c b/drivers/parport/parport_serial.c
index 166de3507780..10845253c9e0 100644
--- a/drivers/parport/parport_serial.c
+++ b/drivers/parport/parport_serial.c
@@ -312,8 +312,7 @@ static int __devinit parport_register (struct pci_dev *dev,
312{ 312{
313 struct parport_pc_pci *card; 313 struct parport_pc_pci *card;
314 struct parport_serial_private *priv = pci_get_drvdata (dev); 314 struct parport_serial_private *priv = pci_get_drvdata (dev);
315 int i = id->driver_data, n; 315 int n, success = 0;
316 int success = 0;
317 316
318 priv->par = cards[id->driver_data]; 317 priv->par = cards[id->driver_data];
319 card = &priv->par; 318 card = &priv->par;
@@ -344,10 +343,8 @@ static int __devinit parport_register (struct pci_dev *dev,
344 "hi" as an offset (see SYBA 343 "hi" as an offset (see SYBA
345 def.) */ 344 def.) */
346 /* TODO: test if sharing interrupts works */ 345 /* TODO: test if sharing interrupts works */
347 printk (KERN_DEBUG "PCI parallel port detected: %04x:%04x, " 346 dev_dbg(&dev->dev, "PCI parallel port detected: I/O at "
348 "I/O at %#lx(%#lx)\n", 347 "%#lx(%#lx)\n", io_lo, io_hi);
349 parport_serial_pci_tbl[i].vendor,
350 parport_serial_pci_tbl[i].device, io_lo, io_hi);
351 port = parport_pc_probe_port (io_lo, io_hi, PARPORT_IRQ_NONE, 348 port = parport_pc_probe_port (io_lo, io_hi, PARPORT_IRQ_NONE,
352 PARPORT_DMA_NONE, dev); 349 PARPORT_DMA_NONE, dev);
353 if (port) { 350 if (port) {
@@ -359,7 +356,7 @@ static int __devinit parport_register (struct pci_dev *dev,
359 if (card->postinit_hook) 356 if (card->postinit_hook)
360 card->postinit_hook (dev, card, !success); 357 card->postinit_hook (dev, card, !success);
361 358
362 return success ? 0 : 1; 359 return 0;
363} 360}
364 361
365static int __devinit parport_serial_pci_probe (struct pci_dev *dev, 362static int __devinit parport_serial_pci_probe (struct pci_dev *dev,
diff --git a/drivers/pcmcia/ds.c b/drivers/pcmcia/ds.c
index 0a424a4e8187..bb96ce1db08c 100644
--- a/drivers/pcmcia/ds.c
+++ b/drivers/pcmcia/ds.c
@@ -352,11 +352,20 @@ static void pcmcia_release_dev(struct device *dev)
352 kfree(p_dev); 352 kfree(p_dev);
353} 353}
354 354
355static void pcmcia_add_pseudo_device(struct pcmcia_socket *s)
356{
357 if (!s->pcmcia_state.device_add_pending) {
358 s->pcmcia_state.device_add_pending = 1;
359 schedule_work(&s->device_add);
360 }
361 return;
362}
355 363
356static int pcmcia_device_probe(struct device * dev) 364static int pcmcia_device_probe(struct device * dev)
357{ 365{
358 struct pcmcia_device *p_dev; 366 struct pcmcia_device *p_dev;
359 struct pcmcia_driver *p_drv; 367 struct pcmcia_driver *p_drv;
368 struct pcmcia_device_id *did;
360 struct pcmcia_socket *s; 369 struct pcmcia_socket *s;
361 int ret = 0; 370 int ret = 0;
362 371
@@ -392,6 +401,19 @@ static int pcmcia_device_probe(struct device * dev)
392 } 401 }
393 402
394 ret = p_drv->probe(p_dev); 403 ret = p_drv->probe(p_dev);
404 if (ret)
405 goto put_module;
406
407 /* handle pseudo multifunction devices:
408 * there are at most two pseudo multifunction devices.
409 * if we're matching against the first, schedule a
410 * call which will then check whether there are two
411 * pseudo devices, and if not, add the second one.
412 */
413 did = (struct pcmcia_device_id *) p_dev->dev.driver_data;
414 if (did && (did->match_flags & PCMCIA_DEV_ID_MATCH_DEVICE_NO) &&
415 (p_dev->socket->device_count == 1) && (p_dev->device_no == 0))
416 pcmcia_add_pseudo_device(p_dev->socket);
395 417
396 put_module: 418 put_module:
397 if (ret) 419 if (ret)
@@ -660,15 +682,6 @@ static void pcmcia_delayed_add_pseudo_device(void *data)
660 s->pcmcia_state.device_add_pending = 0; 682 s->pcmcia_state.device_add_pending = 0;
661} 683}
662 684
663static inline void pcmcia_add_pseudo_device(struct pcmcia_socket *s)
664{
665 if (!s->pcmcia_state.device_add_pending) {
666 s->pcmcia_state.device_add_pending = 1;
667 schedule_work(&s->device_add);
668 }
669 return;
670}
671
672static int pcmcia_requery(struct device *dev, void * _data) 685static int pcmcia_requery(struct device *dev, void * _data)
673{ 686{
674 struct pcmcia_device *p_dev = to_pcmcia_dev(dev); 687 struct pcmcia_device *p_dev = to_pcmcia_dev(dev);
@@ -755,15 +768,6 @@ static inline int pcmcia_devmatch(struct pcmcia_device *dev,
755 } 768 }
756 769
757 if (did->match_flags & PCMCIA_DEV_ID_MATCH_DEVICE_NO) { 770 if (did->match_flags & PCMCIA_DEV_ID_MATCH_DEVICE_NO) {
758 /* handle pseudo multifunction devices:
759 * there are at most two pseudo multifunction devices.
760 * if we're matching against the first, schedule a
761 * call which will then check whether there are two
762 * pseudo devices, and if not, add the second one.
763 */
764 if (dev->device_no == 0)
765 pcmcia_add_pseudo_device(dev->socket);
766
767 if (dev->device_no != did->device_no) 771 if (dev->device_no != did->device_no)
768 return 0; 772 return 0;
769 } 773 }
diff --git a/drivers/s390/block/dasd.c b/drivers/s390/block/dasd.c
index af1d5b404cee..33157c84d1d3 100644
--- a/drivers/s390/block/dasd.c
+++ b/drivers/s390/block/dasd.c
@@ -215,9 +215,10 @@ dasd_state_basic_to_known(struct dasd_device * device)
215 * interrupt for this detection ccw uses the kernel event daemon to 215 * interrupt for this detection ccw uses the kernel event daemon to
216 * trigger the call to dasd_change_state. All this is done in the 216 * trigger the call to dasd_change_state. All this is done in the
217 * discipline code, see dasd_eckd.c. 217 * discipline code, see dasd_eckd.c.
218 * After the analysis ccw is done (do_analysis returned 0 or error) 218 * After the analysis ccw is done (do_analysis returned 0) the block
219 * the block device is setup. Either a fake disk is added to allow 219 * device is setup.
220 * formatting or a proper device request queue is created. 220 * In case the analysis returns an error, the device setup is stopped
221 * (a fake disk was already added to allow formatting).
221 */ 222 */
222static inline int 223static inline int
223dasd_state_basic_to_ready(struct dasd_device * device) 224dasd_state_basic_to_ready(struct dasd_device * device)
@@ -227,13 +228,19 @@ dasd_state_basic_to_ready(struct dasd_device * device)
227 rc = 0; 228 rc = 0;
228 if (device->discipline->do_analysis != NULL) 229 if (device->discipline->do_analysis != NULL)
229 rc = device->discipline->do_analysis(device); 230 rc = device->discipline->do_analysis(device);
230 if (rc) 231 if (rc) {
232 if (rc != -EAGAIN)
233 device->state = DASD_STATE_UNFMT;
231 return rc; 234 return rc;
235 }
236 /* make disk known with correct capacity */
232 dasd_setup_queue(device); 237 dasd_setup_queue(device);
238 set_capacity(device->gdp, device->blocks << device->s2b_shift);
233 device->state = DASD_STATE_READY; 239 device->state = DASD_STATE_READY;
234 if (dasd_scan_partitions(device) != 0) 240 rc = dasd_scan_partitions(device);
241 if (rc)
235 device->state = DASD_STATE_BASIC; 242 device->state = DASD_STATE_BASIC;
236 return 0; 243 return rc;
237} 244}
238 245
239/* 246/*
@@ -254,6 +261,15 @@ dasd_state_ready_to_basic(struct dasd_device * device)
254} 261}
255 262
256/* 263/*
264 * Back to basic.
265 */
266static inline void
267dasd_state_unfmt_to_basic(struct dasd_device * device)
268{
269 device->state = DASD_STATE_BASIC;
270}
271
272/*
257 * Make the device online and schedule the bottom half to start 273 * Make the device online and schedule the bottom half to start
258 * the requeueing of requests from the linux request queue to the 274 * the requeueing of requests from the linux request queue to the
259 * ccw queue. 275 * ccw queue.
@@ -319,8 +335,12 @@ dasd_decrease_state(struct dasd_device *device)
319 if (device->state == DASD_STATE_READY && 335 if (device->state == DASD_STATE_READY &&
320 device->target <= DASD_STATE_BASIC) 336 device->target <= DASD_STATE_BASIC)
321 dasd_state_ready_to_basic(device); 337 dasd_state_ready_to_basic(device);
322 338
323 if (device->state == DASD_STATE_BASIC && 339 if (device->state == DASD_STATE_UNFMT &&
340 device->target <= DASD_STATE_BASIC)
341 dasd_state_unfmt_to_basic(device);
342
343 if (device->state == DASD_STATE_BASIC &&
324 device->target <= DASD_STATE_KNOWN) 344 device->target <= DASD_STATE_KNOWN)
325 dasd_state_basic_to_known(device); 345 dasd_state_basic_to_known(device);
326 346
@@ -1722,7 +1742,7 @@ dasd_open(struct inode *inp, struct file *filp)
1722 goto out; 1742 goto out;
1723 } 1743 }
1724 1744
1725 if (device->state < DASD_STATE_BASIC) { 1745 if (device->state <= DASD_STATE_BASIC) {
1726 DBF_DEV_EVENT(DBF_ERR, device, " %s", 1746 DBF_DEV_EVENT(DBF_ERR, device, " %s",
1727 " Cannot open unrecognized device"); 1747 " Cannot open unrecognized device");
1728 rc = -ENODEV; 1748 rc = -ENODEV;
diff --git a/drivers/s390/block/dasd_genhd.c b/drivers/s390/block/dasd_genhd.c
index 65dc844b975c..fce2835e7d19 100644
--- a/drivers/s390/block/dasd_genhd.c
+++ b/drivers/s390/block/dasd_genhd.c
@@ -100,8 +100,6 @@ dasd_scan_partitions(struct dasd_device * device)
100{ 100{
101 struct block_device *bdev; 101 struct block_device *bdev;
102 102
103 /* Make the disk known. */
104 set_capacity(device->gdp, device->blocks << device->s2b_shift);
105 bdev = bdget_disk(device->gdp, 0); 103 bdev = bdget_disk(device->gdp, 0);
106 if (!bdev || blkdev_get(bdev, FMODE_READ, 1) < 0) 104 if (!bdev || blkdev_get(bdev, FMODE_READ, 1) < 0)
107 return -ENODEV; 105 return -ENODEV;
diff --git a/drivers/s390/block/dasd_int.h b/drivers/s390/block/dasd_int.h
index 0592354cc604..7cb0b9e78a6a 100644
--- a/drivers/s390/block/dasd_int.h
+++ b/drivers/s390/block/dasd_int.h
@@ -26,7 +26,7 @@
26 * new: the dasd_device structure is allocated. 26 * new: the dasd_device structure is allocated.
27 * known: the discipline for the device is identified. 27 * known: the discipline for the device is identified.
28 * basic: the device can do basic i/o. 28 * basic: the device can do basic i/o.
29 * accept: the device is analysed (format is known). 29 * unfmt: the device could not be analyzed (format is unknown).
30 * ready: partition detection is done and the device is can do block io. 30 * ready: partition detection is done and the device is can do block io.
31 * online: the device accepts requests from the block device queue. 31 * online: the device accepts requests from the block device queue.
32 * 32 *
@@ -47,8 +47,9 @@
47#define DASD_STATE_NEW 0 47#define DASD_STATE_NEW 0
48#define DASD_STATE_KNOWN 1 48#define DASD_STATE_KNOWN 1
49#define DASD_STATE_BASIC 2 49#define DASD_STATE_BASIC 2
50#define DASD_STATE_READY 3 50#define DASD_STATE_UNFMT 3
51#define DASD_STATE_ONLINE 4 51#define DASD_STATE_READY 4
52#define DASD_STATE_ONLINE 5
52 53
53#include <linux/module.h> 54#include <linux/module.h>
54#include <linux/wait.h> 55#include <linux/wait.h>
diff --git a/drivers/s390/block/dasd_proc.c b/drivers/s390/block/dasd_proc.c
index 2d5da3c75ca7..1aa3c261718a 100644
--- a/drivers/s390/block/dasd_proc.c
+++ b/drivers/s390/block/dasd_proc.c
@@ -93,6 +93,9 @@ dasd_devices_show(struct seq_file *m, void *v)
93 case DASD_STATE_BASIC: 93 case DASD_STATE_BASIC:
94 seq_printf(m, "basic"); 94 seq_printf(m, "basic");
95 break; 95 break;
96 case DASD_STATE_UNFMT:
97 seq_printf(m, "unformatted");
98 break;
96 case DASD_STATE_READY: 99 case DASD_STATE_READY:
97 case DASD_STATE_ONLINE: 100 case DASD_STATE_ONLINE:
98 seq_printf(m, "active "); 101 seq_printf(m, "active ");
diff --git a/drivers/s390/cio/chsc.c b/drivers/s390/cio/chsc.c
index 8cf9905d484b..f4183d660258 100644
--- a/drivers/s390/cio/chsc.c
+++ b/drivers/s390/cio/chsc.c
@@ -1115,6 +1115,9 @@ chsc_enable_facility(int operation_code)
1115 goto out; 1115 goto out;
1116 } 1116 }
1117 switch (sda_area->response.code) { 1117 switch (sda_area->response.code) {
1118 case 0x0001: /* everything ok */
1119 ret = 0;
1120 break;
1118 case 0x0003: /* invalid request block */ 1121 case 0x0003: /* invalid request block */
1119 case 0x0007: 1122 case 0x0007:
1120 ret = -EINVAL; 1123 ret = -EINVAL;
@@ -1123,6 +1126,8 @@ chsc_enable_facility(int operation_code)
1123 case 0x0101: /* facility not provided */ 1126 case 0x0101: /* facility not provided */
1124 ret = -EOPNOTSUPP; 1127 ret = -EOPNOTSUPP;
1125 break; 1128 break;
1129 default: /* something went wrong */
1130 ret = -EIO;
1126 } 1131 }
1127 out: 1132 out:
1128 free_page((unsigned long)sda_area); 1133 free_page((unsigned long)sda_area);
diff --git a/drivers/s390/net/smsgiucv.c b/drivers/s390/net/smsgiucv.c
index d6469baa7e16..72118ee68954 100644
--- a/drivers/s390/net/smsgiucv.c
+++ b/drivers/s390/net/smsgiucv.c
@@ -168,7 +168,7 @@ smsg_init(void)
168 driver_unregister(&smsg_driver); 168 driver_unregister(&smsg_driver);
169 return -EIO; /* better errno ? */ 169 return -EIO; /* better errno ? */
170 } 170 }
171 rc = iucv_connect (&smsg_pathid, 1, 0, "*MSG ", 0, 0, 0, 0, 171 rc = iucv_connect (&smsg_pathid, 255, 0, "*MSG ", 0, 0, 0, 0,
172 smsg_handle, 0); 172 smsg_handle, 0);
173 if (rc) { 173 if (rc) {
174 printk(KERN_ERR "SMSGIUCV: failed to connect to *MSG"); 174 printk(KERN_ERR "SMSGIUCV: failed to connect to *MSG");
diff --git a/drivers/scsi/ahci.c b/drivers/scsi/ahci.c
index 1c2ab3dede71..00dfdefe2967 100644
--- a/drivers/scsi/ahci.c
+++ b/drivers/scsi/ahci.c
@@ -778,23 +778,17 @@ static irqreturn_t ahci_interrupt (int irq, void *dev_instance, struct pt_regs *
778 struct ata_queued_cmd *qc; 778 struct ata_queued_cmd *qc;
779 qc = ata_qc_from_tag(ap, ap->active_tag); 779 qc = ata_qc_from_tag(ap, ap->active_tag);
780 if (!ahci_host_intr(ap, qc)) 780 if (!ahci_host_intr(ap, qc))
781 if (ata_ratelimit()) { 781 if (ata_ratelimit())
782 struct pci_dev *pdev = 782 dev_printk(KERN_WARNING, host_set->dev,
783 to_pci_dev(ap->host_set->dev);
784 dev_printk(KERN_WARNING, &pdev->dev,
785 "unhandled interrupt on port %u\n", 783 "unhandled interrupt on port %u\n",
786 i); 784 i);
787 }
788 785
789 VPRINTK("port %u\n", i); 786 VPRINTK("port %u\n", i);
790 } else { 787 } else {
791 VPRINTK("port %u (no irq)\n", i); 788 VPRINTK("port %u (no irq)\n", i);
792 if (ata_ratelimit()) { 789 if (ata_ratelimit())
793 struct pci_dev *pdev = 790 dev_printk(KERN_WARNING, host_set->dev,
794 to_pci_dev(ap->host_set->dev);
795 dev_printk(KERN_WARNING, &pdev->dev,
796 "interrupt on disabled port %u\n", i); 791 "interrupt on disabled port %u\n", i);
797 }
798 } 792 }
799 793
800 irq_ack |= (1 << i); 794 irq_ack |= (1 << i);
diff --git a/drivers/scsi/ata_piix.c b/drivers/scsi/ata_piix.c
index c662bf531514..9327b62f97de 100644
--- a/drivers/scsi/ata_piix.c
+++ b/drivers/scsi/ata_piix.c
@@ -101,6 +101,8 @@ enum {
101 ICH5_PCS = 0x92, /* port control and status */ 101 ICH5_PCS = 0x92, /* port control and status */
102 PIIX_SCC = 0x0A, /* sub-class code register */ 102 PIIX_SCC = 0x0A, /* sub-class code register */
103 103
104 PIIX_FLAG_IGNORE_PCS = (1 << 25), /* ignore PCS present bits */
105 PIIX_FLAG_SCR = (1 << 26), /* SCR available */
104 PIIX_FLAG_AHCI = (1 << 27), /* AHCI possible */ 106 PIIX_FLAG_AHCI = (1 << 27), /* AHCI possible */
105 PIIX_FLAG_CHECKINTR = (1 << 28), /* make sure PCI INTx enabled */ 107 PIIX_FLAG_CHECKINTR = (1 << 28), /* make sure PCI INTx enabled */
106 PIIX_FLAG_COMBINED = (1 << 29), /* combined mode possible */ 108 PIIX_FLAG_COMBINED = (1 << 29), /* combined mode possible */
@@ -110,24 +112,38 @@ enum {
110 /* combined mode. if set, PATA is channel 0. 112 /* combined mode. if set, PATA is channel 0.
111 * if clear, PATA is channel 1. 113 * if clear, PATA is channel 1.
112 */ 114 */
113 PIIX_COMB_PATA_P0 = (1 << 1),
114 PIIX_COMB = (1 << 2), /* combined mode enabled? */
115
116 PIIX_PORT_ENABLED = (1 << 0), 115 PIIX_PORT_ENABLED = (1 << 0),
117 PIIX_PORT_PRESENT = (1 << 4), 116 PIIX_PORT_PRESENT = (1 << 4),
118 117
119 PIIX_80C_PRI = (1 << 5) | (1 << 4), 118 PIIX_80C_PRI = (1 << 5) | (1 << 4),
120 PIIX_80C_SEC = (1 << 7) | (1 << 6), 119 PIIX_80C_SEC = (1 << 7) | (1 << 6),
121 120
122 ich5_pata = 0, 121 /* controller IDs */
123 ich5_sata = 1, 122 piix4_pata = 0,
124 piix4_pata = 2, 123 ich5_pata = 1,
125 ich6_sata = 3, 124 ich5_sata = 2,
126 ich6_sata_ahci = 4, 125 esb_sata = 3,
126 ich6_sata = 4,
127 ich6_sata_ahci = 5,
128 ich6m_sata_ahci = 6,
129
130 /* constants for mapping table */
131 P0 = 0, /* port 0 */
132 P1 = 1, /* port 1 */
133 P2 = 2, /* port 2 */
134 P3 = 3, /* port 3 */
135 IDE = -1, /* IDE */
136 NA = -2, /* not avaliable */
137 RV = -3, /* reserved */
127 138
128 PIIX_AHCI_DEVICE = 6, 139 PIIX_AHCI_DEVICE = 6,
129}; 140};
130 141
142struct piix_map_db {
143 const u32 mask;
144 const int map[][4];
145};
146
131static int piix_init_one (struct pci_dev *pdev, 147static int piix_init_one (struct pci_dev *pdev,
132 const struct pci_device_id *ent); 148 const struct pci_device_id *ent);
133 149
@@ -149,19 +165,32 @@ static const struct pci_device_id piix_pci_tbl[] = {
149 * list in drivers/pci/quirks.c. 165 * list in drivers/pci/quirks.c.
150 */ 166 */
151 167
168 /* 82801EB (ICH5) */
152 { 0x8086, 0x24d1, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich5_sata }, 169 { 0x8086, 0x24d1, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich5_sata },
170 /* 82801EB (ICH5) */
153 { 0x8086, 0x24df, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich5_sata }, 171 { 0x8086, 0x24df, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich5_sata },
154 { 0x8086, 0x25a3, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich5_sata }, 172 /* 6300ESB (ICH5 variant with broken PCS present bits) */
155 { 0x8086, 0x25b0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich5_sata }, 173 { 0x8086, 0x25a3, PCI_ANY_ID, PCI_ANY_ID, 0, 0, esb_sata },
174 /* 6300ESB pretending RAID */
175 { 0x8086, 0x25b0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, esb_sata },
176 /* 82801FB/FW (ICH6/ICH6W) */
156 { 0x8086, 0x2651, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata }, 177 { 0x8086, 0x2651, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata },
178 /* 82801FR/FRW (ICH6R/ICH6RW) */
157 { 0x8086, 0x2652, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata_ahci }, 179 { 0x8086, 0x2652, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata_ahci },
158 { 0x8086, 0x2653, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata_ahci }, 180 /* 82801FBM ICH6M (ICH6R with only port 0 and 2 implemented) */
181 { 0x8086, 0x2653, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6m_sata_ahci },
182 /* 82801GB/GR/GH (ICH7, identical to ICH6) */
159 { 0x8086, 0x27c0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata_ahci }, 183 { 0x8086, 0x27c0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata_ahci },
160 { 0x8086, 0x27c4, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata_ahci }, 184 /* 2801GBM/GHM (ICH7M, identical to ICH6M) */
185 { 0x8086, 0x27c4, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6m_sata_ahci },
186 /* Enterprise Southbridge 2 (where's the datasheet?) */
161 { 0x8086, 0x2680, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata_ahci }, 187 { 0x8086, 0x2680, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata_ahci },
188 /* SATA Controller 1 IDE (ICH8, no datasheet yet) */
162 { 0x8086, 0x2820, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata_ahci }, 189 { 0x8086, 0x2820, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata_ahci },
190 /* SATA Controller 2 IDE (ICH8, ditto) */
163 { 0x8086, 0x2825, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata_ahci }, 191 { 0x8086, 0x2825, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata_ahci },
164 { 0x8086, 0x2828, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata_ahci }, 192 /* Mobile SATA Controller IDE (ICH8M, ditto) */
193 { 0x8086, 0x2828, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6m_sata_ahci },
165 194
166 { } /* terminate list */ 195 { } /* terminate list */
167}; 196};
@@ -254,7 +283,58 @@ static const struct ata_port_operations piix_sata_ops = {
254 .host_stop = ata_host_stop, 283 .host_stop = ata_host_stop,
255}; 284};
256 285
286static struct piix_map_db ich5_map_db = {
287 .mask = 0x7,
288 .map = {
289 /* PM PS SM SS MAP */
290 { P0, NA, P1, NA }, /* 000b */
291 { P1, NA, P0, NA }, /* 001b */
292 { RV, RV, RV, RV },
293 { RV, RV, RV, RV },
294 { P0, P1, IDE, IDE }, /* 100b */
295 { P1, P0, IDE, IDE }, /* 101b */
296 { IDE, IDE, P0, P1 }, /* 110b */
297 { IDE, IDE, P1, P0 }, /* 111b */
298 },
299};
300
301static struct piix_map_db ich6_map_db = {
302 .mask = 0x3,
303 .map = {
304 /* PM PS SM SS MAP */
305 { P0, P1, P2, P3 }, /* 00b */
306 { IDE, IDE, P1, P3 }, /* 01b */
307 { P0, P2, IDE, IDE }, /* 10b */
308 { RV, RV, RV, RV },
309 },
310};
311
312static struct piix_map_db ich6m_map_db = {
313 .mask = 0x3,
314 .map = {
315 /* PM PS SM SS MAP */
316 { P0, P1, P2, P3 }, /* 00b */
317 { RV, RV, RV, RV },
318 { P0, P2, IDE, IDE }, /* 10b */
319 { RV, RV, RV, RV },
320 },
321};
322
257static struct ata_port_info piix_port_info[] = { 323static struct ata_port_info piix_port_info[] = {
324 /* piix4_pata */
325 {
326 .sht = &piix_sht,
327 .host_flags = ATA_FLAG_SLAVE_POSS,
328 .pio_mask = 0x1f, /* pio0-4 */
329#if 0
330 .mwdma_mask = 0x06, /* mwdma1-2 */
331#else
332 .mwdma_mask = 0x00, /* mwdma broken */
333#endif
334 .udma_mask = ATA_UDMA_MASK_40C,
335 .port_ops = &piix_pata_ops,
336 },
337
258 /* ich5_pata */ 338 /* ich5_pata */
259 { 339 {
260 .sht = &piix_sht, 340 .sht = &piix_sht,
@@ -278,43 +358,57 @@ static struct ata_port_info piix_port_info[] = {
278 .mwdma_mask = 0x07, /* mwdma0-2 */ 358 .mwdma_mask = 0x07, /* mwdma0-2 */
279 .udma_mask = 0x7f, /* udma0-6 */ 359 .udma_mask = 0x7f, /* udma0-6 */
280 .port_ops = &piix_sata_ops, 360 .port_ops = &piix_sata_ops,
361 .private_data = &ich5_map_db,
281 }, 362 },
282 363
283 /* piix4_pata */ 364 /* i6300esb_sata */
284 { 365 {
285 .sht = &piix_sht, 366 .sht = &piix_sht,
286 .host_flags = ATA_FLAG_SLAVE_POSS, 367 .host_flags = ATA_FLAG_SATA | PIIX_FLAG_COMBINED |
368 PIIX_FLAG_CHECKINTR | PIIX_FLAG_IGNORE_PCS,
287 .pio_mask = 0x1f, /* pio0-4 */ 369 .pio_mask = 0x1f, /* pio0-4 */
288#if 0 370 .mwdma_mask = 0x07, /* mwdma0-2 */
289 .mwdma_mask = 0x06, /* mwdma1-2 */ 371 .udma_mask = 0x7f, /* udma0-6 */
290#else 372 .port_ops = &piix_sata_ops,
291 .mwdma_mask = 0x00, /* mwdma broken */ 373 .private_data = &ich5_map_db,
292#endif
293 .udma_mask = ATA_UDMA_MASK_40C,
294 .port_ops = &piix_pata_ops,
295 }, 374 },
296 375
297 /* ich6_sata */ 376 /* ich6_sata */
298 { 377 {
299 .sht = &piix_sht, 378 .sht = &piix_sht,
300 .host_flags = ATA_FLAG_SATA | PIIX_FLAG_COMBINED_ICH6 | 379 .host_flags = ATA_FLAG_SATA | PIIX_FLAG_COMBINED_ICH6 |
301 PIIX_FLAG_CHECKINTR | ATA_FLAG_SLAVE_POSS, 380 PIIX_FLAG_CHECKINTR | PIIX_FLAG_SCR,
302 .pio_mask = 0x1f, /* pio0-4 */ 381 .pio_mask = 0x1f, /* pio0-4 */
303 .mwdma_mask = 0x07, /* mwdma0-2 */ 382 .mwdma_mask = 0x07, /* mwdma0-2 */
304 .udma_mask = 0x7f, /* udma0-6 */ 383 .udma_mask = 0x7f, /* udma0-6 */
305 .port_ops = &piix_sata_ops, 384 .port_ops = &piix_sata_ops,
385 .private_data = &ich6_map_db,
306 }, 386 },
307 387
308 /* ich6_sata_ahci */ 388 /* ich6_sata_ahci */
309 { 389 {
310 .sht = &piix_sht, 390 .sht = &piix_sht,
311 .host_flags = ATA_FLAG_SATA | PIIX_FLAG_COMBINED_ICH6 | 391 .host_flags = ATA_FLAG_SATA | PIIX_FLAG_COMBINED_ICH6 |
312 PIIX_FLAG_CHECKINTR | ATA_FLAG_SLAVE_POSS | 392 PIIX_FLAG_CHECKINTR | PIIX_FLAG_SCR |
313 PIIX_FLAG_AHCI, 393 PIIX_FLAG_AHCI,
314 .pio_mask = 0x1f, /* pio0-4 */ 394 .pio_mask = 0x1f, /* pio0-4 */
315 .mwdma_mask = 0x07, /* mwdma0-2 */ 395 .mwdma_mask = 0x07, /* mwdma0-2 */
316 .udma_mask = 0x7f, /* udma0-6 */ 396 .udma_mask = 0x7f, /* udma0-6 */
317 .port_ops = &piix_sata_ops, 397 .port_ops = &piix_sata_ops,
398 .private_data = &ich6_map_db,
399 },
400
401 /* ich6m_sata_ahci */
402 {
403 .sht = &piix_sht,
404 .host_flags = ATA_FLAG_SATA | PIIX_FLAG_COMBINED_ICH6 |
405 PIIX_FLAG_CHECKINTR | PIIX_FLAG_SCR |
406 PIIX_FLAG_AHCI,
407 .pio_mask = 0x1f, /* pio0-4 */
408 .mwdma_mask = 0x07, /* mwdma0-2 */
409 .udma_mask = 0x7f, /* udma0-6 */
410 .port_ops = &piix_sata_ops,
411 .private_data = &ich6m_map_db,
318 }, 412 },
319}; 413};
320 414
@@ -405,44 +499,59 @@ static int piix_pata_probe_reset(struct ata_port *ap, unsigned int *classes)
405 * piix_sata_probe - Probe PCI device for present SATA devices 499 * piix_sata_probe - Probe PCI device for present SATA devices
406 * @ap: Port associated with the PCI device we wish to probe 500 * @ap: Port associated with the PCI device we wish to probe
407 * 501 *
408 * Reads SATA PCI device's PCI config register Port Configuration 502 * Reads and configures SATA PCI device's PCI config register
409 * and Status (PCS) to determine port and device availability. 503 * Port Configuration and Status (PCS) to determine port and
504 * device availability.
410 * 505 *
411 * LOCKING: 506 * LOCKING:
412 * None (inherited from caller). 507 * None (inherited from caller).
413 * 508 *
414 * RETURNS: 509 * RETURNS:
415 * Non-zero if port is enabled, it may or may not have a device 510 * Mask of avaliable devices on the port.
416 * attached in that case (PRESENT bit would only be set if BIOS probe
417 * was done). Zero is returned if port is disabled.
418 */ 511 */
419static int piix_sata_probe (struct ata_port *ap) 512static unsigned int piix_sata_probe (struct ata_port *ap)
420{ 513{
421 struct pci_dev *pdev = to_pci_dev(ap->host_set->dev); 514 struct pci_dev *pdev = to_pci_dev(ap->host_set->dev);
422 int combined = (ap->flags & ATA_FLAG_SLAVE_POSS); 515 const unsigned int *map = ap->host_set->private_data;
423 int orig_mask, mask, i; 516 int base = 2 * ap->hard_port_no;
517 unsigned int present_mask = 0;
518 int port, i;
424 u8 pcs; 519 u8 pcs;
425 520
426 pci_read_config_byte(pdev, ICH5_PCS, &pcs); 521 pci_read_config_byte(pdev, ICH5_PCS, &pcs);
427 orig_mask = (int) pcs & 0xff; 522 DPRINTK("ata%u: ENTER, pcs=0x%x base=%d\n", ap->id, pcs, base);
428
429 /* TODO: this is vaguely wrong for ICH6 combined mode,
430 * where only two of the four SATA ports are mapped
431 * onto a single ATA channel. It is also vaguely inaccurate
432 * for ICH5, which has only two ports. However, this is ok,
433 * as further device presence detection code will handle
434 * any false positives produced here.
435 */
436 523
437 for (i = 0; i < 4; i++) { 524 /* enable all ports on this ap and wait for them to settle */
438 mask = (PIIX_PORT_ENABLED << i); 525 for (i = 0; i < 2; i++) {
526 port = map[base + i];
527 if (port >= 0)
528 pcs |= 1 << port;
529 }
439 530
440 if ((orig_mask & mask) == mask) 531 pci_write_config_byte(pdev, ICH5_PCS, pcs);
441 if (combined || (i == ap->hard_port_no)) 532 msleep(100);
442 return 1; 533
534 /* let's see which devices are present */
535 pci_read_config_byte(pdev, ICH5_PCS, &pcs);
536
537 for (i = 0; i < 2; i++) {
538 port = map[base + i];
539 if (port < 0)
540 continue;
541 if (ap->flags & PIIX_FLAG_IGNORE_PCS || pcs & 1 << (4 + port))
542 present_mask |= 1 << i;
543 else
544 pcs &= ~(1 << port);
443 } 545 }
444 546
445 return 0; 547 /* disable offline ports on non-AHCI controllers */
548 if (!(ap->flags & PIIX_FLAG_AHCI))
549 pci_write_config_byte(pdev, ICH5_PCS, pcs);
550
551 DPRINTK("ata%u: LEAVE, pcs=0x%x present_mask=0x%x\n",
552 ap->id, pcs, present_mask);
553
554 return present_mask;
446} 555}
447 556
448/** 557/**
@@ -666,6 +775,54 @@ static int __devinit piix_check_450nx_errata(struct pci_dev *ata_dev)
666 return no_piix_dma; 775 return no_piix_dma;
667} 776}
668 777
778static void __devinit piix_init_sata_map(struct pci_dev *pdev,
779 struct ata_port_info *pinfo)
780{
781 struct piix_map_db *map_db = pinfo[0].private_data;
782 const unsigned int *map;
783 int i, invalid_map = 0;
784 u8 map_value;
785
786 pci_read_config_byte(pdev, ICH5_PMR, &map_value);
787
788 map = map_db->map[map_value & map_db->mask];
789
790 dev_printk(KERN_INFO, &pdev->dev, "MAP [");
791 for (i = 0; i < 4; i++) {
792 switch (map[i]) {
793 case RV:
794 invalid_map = 1;
795 printk(" XX");
796 break;
797
798 case NA:
799 printk(" --");
800 break;
801
802 case IDE:
803 WARN_ON((i & 1) || map[i + 1] != IDE);
804 pinfo[i / 2] = piix_port_info[ich5_pata];
805 i++;
806 printk(" IDE IDE");
807 break;
808
809 default:
810 printk(" P%d", map[i]);
811 if (i & 1)
812 pinfo[i / 2].host_flags |= ATA_FLAG_SLAVE_POSS;
813 break;
814 }
815 }
816 printk(" ]\n");
817
818 if (invalid_map)
819 dev_printk(KERN_ERR, &pdev->dev,
820 "invalid MAP value %u\n", map_value);
821
822 pinfo[0].private_data = (void *)map;
823 pinfo[1].private_data = (void *)map;
824}
825
669/** 826/**
670 * piix_init_one - Register PIIX ATA PCI device with kernel services 827 * piix_init_one - Register PIIX ATA PCI device with kernel services
671 * @pdev: PCI device to register 828 * @pdev: PCI device to register
@@ -684,9 +841,8 @@ static int __devinit piix_check_450nx_errata(struct pci_dev *ata_dev)
684static int piix_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) 841static int piix_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
685{ 842{
686 static int printed_version; 843 static int printed_version;
687 struct ata_port_info *port_info[2]; 844 struct ata_port_info port_info[2];
688 unsigned int combined = 0; 845 struct ata_port_info *ppinfo[2] = { &port_info[0], &port_info[1] };
689 unsigned int pata_chan = 0, sata_chan = 0;
690 unsigned long host_flags; 846 unsigned long host_flags;
691 847
692 if (!printed_version++) 848 if (!printed_version++)
@@ -697,10 +853,10 @@ static int piix_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
697 if (!in_module_init) 853 if (!in_module_init)
698 return -ENODEV; 854 return -ENODEV;
699 855
700 port_info[0] = &piix_port_info[ent->driver_data]; 856 port_info[0] = piix_port_info[ent->driver_data];
701 port_info[1] = &piix_port_info[ent->driver_data]; 857 port_info[1] = piix_port_info[ent->driver_data];
702 858
703 host_flags = port_info[0]->host_flags; 859 host_flags = port_info[0].host_flags;
704 860
705 if (host_flags & PIIX_FLAG_AHCI) { 861 if (host_flags & PIIX_FLAG_AHCI) {
706 u8 tmp; 862 u8 tmp;
@@ -712,37 +868,9 @@ static int piix_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
712 } 868 }
713 } 869 }
714 870
715 if (host_flags & PIIX_FLAG_COMBINED) { 871 /* Initialize SATA map */
716 u8 tmp; 872 if (host_flags & ATA_FLAG_SATA)
717 pci_read_config_byte(pdev, ICH5_PMR, &tmp); 873 piix_init_sata_map(pdev, port_info);
718
719 if (host_flags & PIIX_FLAG_COMBINED_ICH6) {
720 switch (tmp & 0x3) {
721 case 0:
722 break;
723 case 1:
724 combined = 1;
725 sata_chan = 1;
726 break;
727 case 2:
728 combined = 1;
729 pata_chan = 1;
730 break;
731 case 3:
732 dev_printk(KERN_WARNING, &pdev->dev,
733 "invalid MAP value %u\n", tmp);
734 break;
735 }
736 } else {
737 if (tmp & PIIX_COMB) {
738 combined = 1;
739 if (tmp & PIIX_COMB_PATA_P0)
740 sata_chan = 1;
741 else
742 pata_chan = 1;
743 }
744 }
745 }
746 874
747 /* On ICH5, some BIOSen disable the interrupt using the 875 /* On ICH5, some BIOSen disable the interrupt using the
748 * PCI_COMMAND_INTX_DISABLE bit added in PCI 2.3. 876 * PCI_COMMAND_INTX_DISABLE bit added in PCI 2.3.
@@ -753,25 +881,16 @@ static int piix_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
753 if (host_flags & PIIX_FLAG_CHECKINTR) 881 if (host_flags & PIIX_FLAG_CHECKINTR)
754 pci_intx(pdev, 1); 882 pci_intx(pdev, 1);
755 883
756 if (combined) {
757 port_info[sata_chan] = &piix_port_info[ent->driver_data];
758 port_info[sata_chan]->host_flags |= ATA_FLAG_SLAVE_POSS;
759 port_info[pata_chan] = &piix_port_info[ich5_pata];
760
761 dev_printk(KERN_WARNING, &pdev->dev,
762 "combined mode detected (p=%u, s=%u)\n",
763 pata_chan, sata_chan);
764 }
765 if (piix_check_450nx_errata(pdev)) { 884 if (piix_check_450nx_errata(pdev)) {
766 /* This writes into the master table but it does not 885 /* This writes into the master table but it does not
767 really matter for this errata as we will apply it to 886 really matter for this errata as we will apply it to
768 all the PIIX devices on the board */ 887 all the PIIX devices on the board */
769 port_info[0]->mwdma_mask = 0; 888 port_info[0].mwdma_mask = 0;
770 port_info[0]->udma_mask = 0; 889 port_info[0].udma_mask = 0;
771 port_info[1]->mwdma_mask = 0; 890 port_info[1].mwdma_mask = 0;
772 port_info[1]->udma_mask = 0; 891 port_info[1].udma_mask = 0;
773 } 892 }
774 return ata_pci_init_one(pdev, port_info, 2); 893 return ata_pci_init_one(pdev, ppinfo, 2);
775} 894}
776 895
777static int __init piix_init(void) 896static int __init piix_init(void)
diff --git a/drivers/scsi/libata-core.c b/drivers/scsi/libata-core.c
index 9132698d29b8..5060a1a1ad25 100644
--- a/drivers/scsi/libata-core.c
+++ b/drivers/scsi/libata-core.c
@@ -65,12 +65,9 @@ static unsigned int ata_dev_init_params(struct ata_port *ap,
65 struct ata_device *dev); 65 struct ata_device *dev);
66static void ata_set_mode(struct ata_port *ap); 66static void ata_set_mode(struct ata_port *ap);
67static void ata_dev_set_xfermode(struct ata_port *ap, struct ata_device *dev); 67static void ata_dev_set_xfermode(struct ata_port *ap, struct ata_device *dev);
68static unsigned int ata_get_mode_mask(const struct ata_port *ap, int shift);
69static int fgb(u32 bitmap);
70static int ata_choose_xfer_mode(const struct ata_port *ap,
71 u8 *xfer_mode_out,
72 unsigned int *xfer_shift_out);
73static void ata_pio_error(struct ata_port *ap); 68static void ata_pio_error(struct ata_port *ap);
69static unsigned int ata_dev_xfermask(struct ata_port *ap,
70 struct ata_device *dev);
74 71
75static unsigned int ata_unique_id = 1; 72static unsigned int ata_unique_id = 1;
76static struct workqueue_struct *ata_wq; 73static struct workqueue_struct *ata_wq;
@@ -232,58 +229,148 @@ int ata_rwcmd_protocol(struct ata_queued_cmd *qc)
232 return -1; 229 return -1;
233} 230}
234 231
235static const char * const xfer_mode_str[] = { 232/**
236 "UDMA/16", 233 * ata_pack_xfermask - Pack pio, mwdma and udma masks into xfer_mask
237 "UDMA/25", 234 * @pio_mask: pio_mask
238 "UDMA/33", 235 * @mwdma_mask: mwdma_mask
239 "UDMA/44", 236 * @udma_mask: udma_mask
240 "UDMA/66", 237 *
241 "UDMA/100", 238 * Pack @pio_mask, @mwdma_mask and @udma_mask into a single
242 "UDMA/133", 239 * unsigned int xfer_mask.
243 "UDMA7", 240 *
244 "MWDMA0", 241 * LOCKING:
245 "MWDMA1", 242 * None.
246 "MWDMA2", 243 *
247 "PIO0", 244 * RETURNS:
248 "PIO1", 245 * Packed xfer_mask.
249 "PIO2", 246 */
250 "PIO3", 247static unsigned int ata_pack_xfermask(unsigned int pio_mask,
251 "PIO4", 248 unsigned int mwdma_mask,
249 unsigned int udma_mask)
250{
251 return ((pio_mask << ATA_SHIFT_PIO) & ATA_MASK_PIO) |
252 ((mwdma_mask << ATA_SHIFT_MWDMA) & ATA_MASK_MWDMA) |
253 ((udma_mask << ATA_SHIFT_UDMA) & ATA_MASK_UDMA);
254}
255
256static const struct ata_xfer_ent {
257 unsigned int shift, bits;
258 u8 base;
259} ata_xfer_tbl[] = {
260 { ATA_SHIFT_PIO, ATA_BITS_PIO, XFER_PIO_0 },
261 { ATA_SHIFT_MWDMA, ATA_BITS_MWDMA, XFER_MW_DMA_0 },
262 { ATA_SHIFT_UDMA, ATA_BITS_UDMA, XFER_UDMA_0 },
263 { -1, },
252}; 264};
253 265
254/** 266/**
255 * ata_udma_string - convert UDMA bit offset to string 267 * ata_xfer_mask2mode - Find matching XFER_* for the given xfer_mask
256 * @mask: mask of bits supported; only highest bit counts. 268 * @xfer_mask: xfer_mask of interest
257 * 269 *
258 * Determine string which represents the highest speed 270 * Return matching XFER_* value for @xfer_mask. Only the highest
259 * (highest bit in @udma_mask). 271 * bit of @xfer_mask is considered.
260 * 272 *
261 * LOCKING: 273 * LOCKING:
262 * None. 274 * None.
263 * 275 *
264 * RETURNS: 276 * RETURNS:
265 * Constant C string representing highest speed listed in 277 * Matching XFER_* value, 0 if no match found.
266 * @udma_mask, or the constant C string "<n/a>".
267 */ 278 */
279static u8 ata_xfer_mask2mode(unsigned int xfer_mask)
280{
281 int highbit = fls(xfer_mask) - 1;
282 const struct ata_xfer_ent *ent;
268 283
269static const char *ata_mode_string(unsigned int mask) 284 for (ent = ata_xfer_tbl; ent->shift >= 0; ent++)
285 if (highbit >= ent->shift && highbit < ent->shift + ent->bits)
286 return ent->base + highbit - ent->shift;
287 return 0;
288}
289
290/**
291 * ata_xfer_mode2mask - Find matching xfer_mask for XFER_*
292 * @xfer_mode: XFER_* of interest
293 *
294 * Return matching xfer_mask for @xfer_mode.
295 *
296 * LOCKING:
297 * None.
298 *
299 * RETURNS:
300 * Matching xfer_mask, 0 if no match found.
301 */
302static unsigned int ata_xfer_mode2mask(u8 xfer_mode)
270{ 303{
271 int i; 304 const struct ata_xfer_ent *ent;
272 305
273 for (i = 7; i >= 0; i--) 306 for (ent = ata_xfer_tbl; ent->shift >= 0; ent++)
274 if (mask & (1 << i)) 307 if (xfer_mode >= ent->base && xfer_mode < ent->base + ent->bits)
275 goto out; 308 return 1 << (ent->shift + xfer_mode - ent->base);
276 for (i = ATA_SHIFT_MWDMA + 2; i >= ATA_SHIFT_MWDMA; i--) 309 return 0;
277 if (mask & (1 << i)) 310}
278 goto out;
279 for (i = ATA_SHIFT_PIO + 4; i >= ATA_SHIFT_PIO; i--)
280 if (mask & (1 << i))
281 goto out;
282 311
283 return "<n/a>"; 312/**
313 * ata_xfer_mode2shift - Find matching xfer_shift for XFER_*
314 * @xfer_mode: XFER_* of interest
315 *
316 * Return matching xfer_shift for @xfer_mode.
317 *
318 * LOCKING:
319 * None.
320 *
321 * RETURNS:
322 * Matching xfer_shift, -1 if no match found.
323 */
324static int ata_xfer_mode2shift(unsigned int xfer_mode)
325{
326 const struct ata_xfer_ent *ent;
284 327
285out: 328 for (ent = ata_xfer_tbl; ent->shift >= 0; ent++)
286 return xfer_mode_str[i]; 329 if (xfer_mode >= ent->base && xfer_mode < ent->base + ent->bits)
330 return ent->shift;
331 return -1;
332}
333
334/**
335 * ata_mode_string - convert xfer_mask to string
336 * @xfer_mask: mask of bits supported; only highest bit counts.
337 *
338 * Determine string which represents the highest speed
339 * (highest bit in @modemask).
340 *
341 * LOCKING:
342 * None.
343 *
344 * RETURNS:
345 * Constant C string representing highest speed listed in
346 * @mode_mask, or the constant C string "<n/a>".
347 */
348static const char *ata_mode_string(unsigned int xfer_mask)
349{
350 static const char * const xfer_mode_str[] = {
351 "PIO0",
352 "PIO1",
353 "PIO2",
354 "PIO3",
355 "PIO4",
356 "MWDMA0",
357 "MWDMA1",
358 "MWDMA2",
359 "UDMA/16",
360 "UDMA/25",
361 "UDMA/33",
362 "UDMA/44",
363 "UDMA/66",
364 "UDMA/100",
365 "UDMA/133",
366 "UDMA7",
367 };
368 int highbit;
369
370 highbit = fls(xfer_mask) - 1;
371 if (highbit >= 0 && highbit < ARRAY_SIZE(xfer_mode_str))
372 return xfer_mode_str[highbit];
373 return "<n/a>";
287} 374}
288 375
289/** 376/**
@@ -693,69 +780,104 @@ static inline void ata_dump_id(const u16 *id)
693 id[93]); 780 id[93]);
694} 781}
695 782
696/* 783/**
697 * Compute the PIO modes available for this device. This is not as 784 * ata_id_xfermask - Compute xfermask from the given IDENTIFY data
698 * trivial as it seems if we must consider early devices correctly. 785 * @id: IDENTIFY data to compute xfer mask from
699 * 786 *
700 * FIXME: pre IDE drive timing (do we care ?). 787 * Compute the xfermask for this device. This is not as trivial
788 * as it seems if we must consider early devices correctly.
789 *
790 * FIXME: pre IDE drive timing (do we care ?).
791 *
792 * LOCKING:
793 * None.
794 *
795 * RETURNS:
796 * Computed xfermask
701 */ 797 */
702 798static unsigned int ata_id_xfermask(const u16 *id)
703static unsigned int ata_pio_modes(const struct ata_device *adev)
704{ 799{
705 u16 modes; 800 unsigned int pio_mask, mwdma_mask, udma_mask;
706 801
707 /* Usual case. Word 53 indicates word 64 is valid */ 802 /* Usual case. Word 53 indicates word 64 is valid */
708 if (adev->id[ATA_ID_FIELD_VALID] & (1 << 1)) { 803 if (id[ATA_ID_FIELD_VALID] & (1 << 1)) {
709 modes = adev->id[ATA_ID_PIO_MODES] & 0x03; 804 pio_mask = id[ATA_ID_PIO_MODES] & 0x03;
710 modes <<= 3; 805 pio_mask <<= 3;
711 modes |= 0x7; 806 pio_mask |= 0x7;
712 return modes; 807 } else {
808 /* If word 64 isn't valid then Word 51 high byte holds
809 * the PIO timing number for the maximum. Turn it into
810 * a mask.
811 */
812 pio_mask = (2 << (id[ATA_ID_OLD_PIO_MODES] & 0xFF)) - 1 ;
813
814 /* But wait.. there's more. Design your standards by
815 * committee and you too can get a free iordy field to
816 * process. However its the speeds not the modes that
817 * are supported... Note drivers using the timing API
818 * will get this right anyway
819 */
713 } 820 }
714 821
715 /* If word 64 isn't valid then Word 51 high byte holds the PIO timing 822 mwdma_mask = id[ATA_ID_MWDMA_MODES] & 0x07;
716 number for the maximum. Turn it into a mask and return it */ 823 udma_mask = id[ATA_ID_UDMA_MODES] & 0xff;
717 modes = (2 << ((adev->id[ATA_ID_OLD_PIO_MODES] >> 8) & 0xFF)) - 1 ;
718 return modes;
719 /* But wait.. there's more. Design your standards by committee and
720 you too can get a free iordy field to process. However its the
721 speeds not the modes that are supported... Note drivers using the
722 timing API will get this right anyway */
723}
724 824
725static inline void 825 return ata_pack_xfermask(pio_mask, mwdma_mask, udma_mask);
726ata_queue_pio_task(struct ata_port *ap)
727{
728 if (!(ap->flags & ATA_FLAG_FLUSH_PIO_TASK))
729 queue_work(ata_wq, &ap->pio_task);
730} 826}
731 827
732static inline void 828/**
733ata_queue_delayed_pio_task(struct ata_port *ap, unsigned long delay) 829 * ata_port_queue_task - Queue port_task
830 * @ap: The ata_port to queue port_task for
831 *
832 * Schedule @fn(@data) for execution after @delay jiffies using
833 * port_task. There is one port_task per port and it's the
834 * user(low level driver)'s responsibility to make sure that only
835 * one task is active at any given time.
836 *
837 * libata core layer takes care of synchronization between
838 * port_task and EH. ata_port_queue_task() may be ignored for EH
839 * synchronization.
840 *
841 * LOCKING:
842 * Inherited from caller.
843 */
844void ata_port_queue_task(struct ata_port *ap, void (*fn)(void *), void *data,
845 unsigned long delay)
734{ 846{
735 if (!(ap->flags & ATA_FLAG_FLUSH_PIO_TASK)) 847 int rc;
736 queue_delayed_work(ata_wq, &ap->pio_task, delay); 848
849 if (ap->flags & ATA_FLAG_FLUSH_PORT_TASK)
850 return;
851
852 PREPARE_WORK(&ap->port_task, fn, data);
853
854 if (!delay)
855 rc = queue_work(ata_wq, &ap->port_task);
856 else
857 rc = queue_delayed_work(ata_wq, &ap->port_task, delay);
858
859 /* rc == 0 means that another user is using port task */
860 WARN_ON(rc == 0);
737} 861}
738 862
739/** 863/**
740 * ata_flush_pio_tasks - Flush pio_task 864 * ata_port_flush_task - Flush port_task
741 * @ap: the target ata_port 865 * @ap: The ata_port to flush port_task for
742 * 866 *
743 * After this function completes, pio_task is 867 * After this function completes, port_task is guranteed not to
744 * guranteed not to be running or scheduled. 868 * be running or scheduled.
745 * 869 *
746 * LOCKING: 870 * LOCKING:
747 * Kernel thread context (may sleep) 871 * Kernel thread context (may sleep)
748 */ 872 */
749 873void ata_port_flush_task(struct ata_port *ap)
750static void ata_flush_pio_tasks(struct ata_port *ap)
751{ 874{
752 int tmp = 0;
753 unsigned long flags; 875 unsigned long flags;
754 876
755 DPRINTK("ENTER\n"); 877 DPRINTK("ENTER\n");
756 878
757 spin_lock_irqsave(&ap->host_set->lock, flags); 879 spin_lock_irqsave(&ap->host_set->lock, flags);
758 ap->flags |= ATA_FLAG_FLUSH_PIO_TASK; 880 ap->flags |= ATA_FLAG_FLUSH_PORT_TASK;
759 spin_unlock_irqrestore(&ap->host_set->lock, flags); 881 spin_unlock_irqrestore(&ap->host_set->lock, flags);
760 882
761 DPRINTK("flush #1\n"); 883 DPRINTK("flush #1\n");
@@ -766,14 +888,13 @@ static void ata_flush_pio_tasks(struct ata_port *ap)
766 * the FLUSH flag; thus, it will never queue pio tasks again. 888 * the FLUSH flag; thus, it will never queue pio tasks again.
767 * Cancel and flush. 889 * Cancel and flush.
768 */ 890 */
769 tmp |= cancel_delayed_work(&ap->pio_task); 891 if (!cancel_delayed_work(&ap->port_task)) {
770 if (!tmp) {
771 DPRINTK("flush #2\n"); 892 DPRINTK("flush #2\n");
772 flush_workqueue(ata_wq); 893 flush_workqueue(ata_wq);
773 } 894 }
774 895
775 spin_lock_irqsave(&ap->host_set->lock, flags); 896 spin_lock_irqsave(&ap->host_set->lock, flags);
776 ap->flags &= ~ATA_FLAG_FLUSH_PIO_TASK; 897 ap->flags &= ~ATA_FLAG_FLUSH_PORT_TASK;
777 spin_unlock_irqrestore(&ap->host_set->lock, flags); 898 spin_unlock_irqrestore(&ap->host_set->lock, flags);
778 899
779 DPRINTK("EXIT\n"); 900 DPRINTK("EXIT\n");
@@ -904,7 +1025,7 @@ unsigned int ata_pio_need_iordy(const struct ata_device *adev)
904 * @dev: target device 1025 * @dev: target device
905 * @p_class: pointer to class of the target device (may be changed) 1026 * @p_class: pointer to class of the target device (may be changed)
906 * @post_reset: is this read ID post-reset? 1027 * @post_reset: is this read ID post-reset?
907 * @id: buffer to fill IDENTIFY page into 1028 * @p_id: read IDENTIFY page (newly allocated)
908 * 1029 *
909 * Read ID data from the specified device. ATA_CMD_ID_ATA is 1030 * Read ID data from the specified device. ATA_CMD_ID_ATA is
910 * performed on ATA devices and ATA_CMD_ID_ATAPI on ATAPI 1031 * performed on ATA devices and ATA_CMD_ID_ATAPI on ATAPI
@@ -919,12 +1040,13 @@ unsigned int ata_pio_need_iordy(const struct ata_device *adev)
919 * 0 on success, -errno otherwise. 1040 * 0 on success, -errno otherwise.
920 */ 1041 */
921static int ata_dev_read_id(struct ata_port *ap, struct ata_device *dev, 1042static int ata_dev_read_id(struct ata_port *ap, struct ata_device *dev,
922 unsigned int *p_class, int post_reset, u16 *id) 1043 unsigned int *p_class, int post_reset, u16 **p_id)
923{ 1044{
924 unsigned int class = *p_class; 1045 unsigned int class = *p_class;
925 unsigned int using_edd; 1046 unsigned int using_edd;
926 struct ata_taskfile tf; 1047 struct ata_taskfile tf;
927 unsigned int err_mask = 0; 1048 unsigned int err_mask = 0;
1049 u16 *id;
928 const char *reason; 1050 const char *reason;
929 int rc; 1051 int rc;
930 1052
@@ -938,6 +1060,13 @@ static int ata_dev_read_id(struct ata_port *ap, struct ata_device *dev,
938 1060
939 ata_dev_select(ap, dev->devno, 1, 1); /* select device 0/1 */ 1061 ata_dev_select(ap, dev->devno, 1, 1); /* select device 0/1 */
940 1062
1063 id = kmalloc(sizeof(id[0]) * ATA_ID_WORDS, GFP_KERNEL);
1064 if (id == NULL) {
1065 rc = -ENOMEM;
1066 reason = "out of memory";
1067 goto err_out;
1068 }
1069
941 retry: 1070 retry:
942 ata_tf_init(ap, &tf, dev->devno); 1071 ata_tf_init(ap, &tf, dev->devno);
943 1072
@@ -1028,53 +1157,59 @@ static int ata_dev_read_id(struct ata_port *ap, struct ata_device *dev,
1028 } 1157 }
1029 1158
1030 *p_class = class; 1159 *p_class = class;
1160 *p_id = id;
1031 return 0; 1161 return 0;
1032 1162
1033 err_out: 1163 err_out:
1034 printk(KERN_WARNING "ata%u: dev %u failed to IDENTIFY (%s)\n", 1164 printk(KERN_WARNING "ata%u: dev %u failed to IDENTIFY (%s)\n",
1035 ap->id, dev->devno, reason); 1165 ap->id, dev->devno, reason);
1166 kfree(id);
1036 return rc; 1167 return rc;
1037} 1168}
1038 1169
1170static inline u8 ata_dev_knobble(const struct ata_port *ap,
1171 struct ata_device *dev)
1172{
1173 return ((ap->cbl == ATA_CBL_SATA) && (!ata_id_is_sata(dev->id)));
1174}
1175
1039/** 1176/**
1040 * ata_dev_identify - obtain IDENTIFY x DEVICE page 1177 * ata_dev_configure - Configure the specified ATA/ATAPI device
1041 * @ap: port on which device we wish to probe resides 1178 * @ap: Port on which target device resides
1042 * @device: device bus address, starting at zero 1179 * @dev: Target device to configure
1043 * 1180 * @print_info: Enable device info printout
1044 * Following bus reset, we issue the IDENTIFY [PACKET] DEVICE 1181 *
1045 * command, and read back the 512-byte device information page. 1182 * Configure @dev according to @dev->id. Generic and low-level
1046 * The device information page is fed to us via the standard 1183 * driver specific fixups are also applied.
1047 * PIO-IN protocol, but we hand-code it here. (TODO: investigate
1048 * using standard PIO-IN paths)
1049 *
1050 * After reading the device information page, we use several
1051 * bits of information from it to initialize data structures
1052 * that will be used during the lifetime of the ata_device.
1053 * Other data from the info page is used to disqualify certain
1054 * older ATA devices we do not wish to support.
1055 * 1184 *
1056 * LOCKING: 1185 * LOCKING:
1057 * Inherited from caller. Some functions called by this function 1186 * Kernel thread context (may sleep)
1058 * obtain the host_set lock. 1187 *
1188 * RETURNS:
1189 * 0 on success, -errno otherwise
1059 */ 1190 */
1060 1191static int ata_dev_configure(struct ata_port *ap, struct ata_device *dev,
1061static void ata_dev_identify(struct ata_port *ap, unsigned int device) 1192 int print_info)
1062{ 1193{
1063 struct ata_device *dev = &ap->device[device]; 1194 unsigned int xfer_mask;
1064 unsigned long xfer_modes;
1065 int i, rc; 1195 int i, rc;
1066 1196
1067 if (!ata_dev_present(dev)) { 1197 if (!ata_dev_present(dev)) {
1068 DPRINTK("ENTER/EXIT (host %u, dev %u) -- nodev\n", 1198 DPRINTK("ENTER/EXIT (host %u, dev %u) -- nodev\n",
1069 ap->id, device); 1199 ap->id, dev->devno);
1070 return; 1200 return 0;
1071 } 1201 }
1072 1202
1073 DPRINTK("ENTER, host %u, dev %u\n", ap->id, device); 1203 DPRINTK("ENTER, host %u, dev %u\n", ap->id, dev->devno);
1074 1204
1075 rc = ata_dev_read_id(ap, dev, &dev->class, 1, dev->id); 1205 /* initialize to-be-configured parameters */
1076 if (rc) 1206 dev->flags = 0;
1077 goto err_out; 1207 dev->max_sectors = 0;
1208 dev->cdb_len = 0;
1209 dev->n_sectors = 0;
1210 dev->cylinders = 0;
1211 dev->heads = 0;
1212 dev->sectors = 0;
1078 1213
1079 /* 1214 /*
1080 * common ATA, ATAPI feature tests 1215 * common ATA, ATAPI feature tests
@@ -1083,15 +1218,12 @@ static void ata_dev_identify(struct ata_port *ap, unsigned int device)
1083 /* we require DMA support (bits 8 of word 49) */ 1218 /* we require DMA support (bits 8 of word 49) */
1084 if (!ata_id_has_dma(dev->id)) { 1219 if (!ata_id_has_dma(dev->id)) {
1085 printk(KERN_DEBUG "ata%u: no dma\n", ap->id); 1220 printk(KERN_DEBUG "ata%u: no dma\n", ap->id);
1221 rc = -EINVAL;
1086 goto err_out_nosup; 1222 goto err_out_nosup;
1087 } 1223 }
1088 1224
1089 /* quick-n-dirty find max transfer mode; for printk only */ 1225 /* find max transfer mode; for printk only */
1090 xfer_modes = dev->id[ATA_ID_UDMA_MODES]; 1226 xfer_mask = ata_id_xfermask(dev->id);
1091 if (!xfer_modes)
1092 xfer_modes = (dev->id[ATA_ID_MWDMA_MODES]) << ATA_SHIFT_MWDMA;
1093 if (!xfer_modes)
1094 xfer_modes = ata_pio_modes(dev);
1095 1227
1096 ata_dump_id(dev->id); 1228 ata_dump_id(dev->id);
1097 1229
@@ -1100,19 +1232,25 @@ static void ata_dev_identify(struct ata_port *ap, unsigned int device)
1100 dev->n_sectors = ata_id_n_sectors(dev->id); 1232 dev->n_sectors = ata_id_n_sectors(dev->id);
1101 1233
1102 if (ata_id_has_lba(dev->id)) { 1234 if (ata_id_has_lba(dev->id)) {
1103 dev->flags |= ATA_DFLAG_LBA; 1235 const char *lba_desc;
1104 1236
1105 if (ata_id_has_lba48(dev->id)) 1237 lba_desc = "LBA";
1238 dev->flags |= ATA_DFLAG_LBA;
1239 if (ata_id_has_lba48(dev->id)) {
1106 dev->flags |= ATA_DFLAG_LBA48; 1240 dev->flags |= ATA_DFLAG_LBA48;
1241 lba_desc = "LBA48";
1242 }
1107 1243
1108 /* print device info to dmesg */ 1244 /* print device info to dmesg */
1109 printk(KERN_INFO "ata%u: dev %u ATA-%d, max %s, %Lu sectors:%s\n", 1245 if (print_info)
1110 ap->id, device, 1246 printk(KERN_INFO "ata%u: dev %u ATA-%d, "
1111 ata_id_major_version(dev->id), 1247 "max %s, %Lu sectors: %s\n",
1112 ata_mode_string(xfer_modes), 1248 ap->id, dev->devno,
1113 (unsigned long long)dev->n_sectors, 1249 ata_id_major_version(dev->id),
1114 dev->flags & ATA_DFLAG_LBA48 ? " LBA48" : " LBA"); 1250 ata_mode_string(xfer_mask),
1115 } else { 1251 (unsigned long long)dev->n_sectors,
1252 lba_desc);
1253 } else {
1116 /* CHS */ 1254 /* CHS */
1117 1255
1118 /* Default translation */ 1256 /* Default translation */
@@ -1128,13 +1266,14 @@ static void ata_dev_identify(struct ata_port *ap, unsigned int device)
1128 } 1266 }
1129 1267
1130 /* print device info to dmesg */ 1268 /* print device info to dmesg */
1131 printk(KERN_INFO "ata%u: dev %u ATA-%d, max %s, %Lu sectors: CHS %d/%d/%d\n", 1269 if (print_info)
1132 ap->id, device, 1270 printk(KERN_INFO "ata%u: dev %u ATA-%d, "
1133 ata_id_major_version(dev->id), 1271 "max %s, %Lu sectors: CHS %u/%u/%u\n",
1134 ata_mode_string(xfer_modes), 1272 ap->id, dev->devno,
1135 (unsigned long long)dev->n_sectors, 1273 ata_id_major_version(dev->id),
1136 (int)dev->cylinders, (int)dev->heads, (int)dev->sectors); 1274 ata_mode_string(xfer_mask),
1137 1275 (unsigned long long)dev->n_sectors,
1276 dev->cylinders, dev->heads, dev->sectors);
1138 } 1277 }
1139 1278
1140 if (dev->id[59] & 0x100) { 1279 if (dev->id[59] & 0x100) {
@@ -1150,6 +1289,7 @@ static void ata_dev_identify(struct ata_port *ap, unsigned int device)
1150 rc = atapi_cdb_len(dev->id); 1289 rc = atapi_cdb_len(dev->id);
1151 if ((rc < 12) || (rc > ATAPI_CDB_LEN)) { 1290 if ((rc < 12) || (rc > ATAPI_CDB_LEN)) {
1152 printk(KERN_WARNING "ata%u: unsupported CDB len\n", ap->id); 1291 printk(KERN_WARNING "ata%u: unsupported CDB len\n", ap->id);
1292 rc = -EINVAL;
1153 goto err_out_nosup; 1293 goto err_out_nosup;
1154 } 1294 }
1155 dev->cdb_len = (unsigned int) rc; 1295 dev->cdb_len = (unsigned int) rc;
@@ -1158,9 +1298,9 @@ static void ata_dev_identify(struct ata_port *ap, unsigned int device)
1158 dev->flags |= ATA_DFLAG_CDB_INTR; 1298 dev->flags |= ATA_DFLAG_CDB_INTR;
1159 1299
1160 /* print device info to dmesg */ 1300 /* print device info to dmesg */
1161 printk(KERN_INFO "ata%u: dev %u ATAPI, max %s\n", 1301 if (print_info)
1162 ap->id, device, 1302 printk(KERN_INFO "ata%u: dev %u ATAPI, max %s\n",
1163 ata_mode_string(xfer_modes)); 1303 ap->id, dev->devno, ata_mode_string(xfer_mask));
1164 } 1304 }
1165 1305
1166 ap->host->max_cmd_len = 0; 1306 ap->host->max_cmd_len = 0;
@@ -1169,44 +1309,26 @@ static void ata_dev_identify(struct ata_port *ap, unsigned int device)
1169 ap->host->max_cmd_len, 1309 ap->host->max_cmd_len,
1170 ap->device[i].cdb_len); 1310 ap->device[i].cdb_len);
1171 1311
1172 DPRINTK("EXIT, drv_stat = 0x%x\n", ata_chk_status(ap));
1173 return;
1174
1175err_out_nosup:
1176 printk(KERN_WARNING "ata%u: dev %u not supported, ignoring\n",
1177 ap->id, device);
1178err_out:
1179 dev->class++; /* converts ATA_DEV_xxx into ATA_DEV_xxx_UNSUP */
1180 DPRINTK("EXIT, err\n");
1181}
1182
1183
1184static inline u8 ata_dev_knobble(const struct ata_port *ap,
1185 struct ata_device *dev)
1186{
1187 return ((ap->cbl == ATA_CBL_SATA) && (!ata_id_is_sata(dev->id)));
1188}
1189
1190/**
1191 * ata_dev_config - Run device specific handlers & check for SATA->PATA bridges
1192 * @ap: Bus
1193 * @i: Device
1194 *
1195 * LOCKING:
1196 */
1197
1198void ata_dev_config(struct ata_port *ap, unsigned int i)
1199{
1200 /* limit bridge transfers to udma5, 200 sectors */ 1312 /* limit bridge transfers to udma5, 200 sectors */
1201 if (ata_dev_knobble(ap, &ap->device[i])) { 1313 if (ata_dev_knobble(ap, dev)) {
1202 printk(KERN_INFO "ata%u(%u): applying bridge limits\n", 1314 if (print_info)
1203 ap->id, i); 1315 printk(KERN_INFO "ata%u(%u): applying bridge limits\n",
1316 ap->id, dev->devno);
1204 ap->udma_mask &= ATA_UDMA5; 1317 ap->udma_mask &= ATA_UDMA5;
1205 ap->device[i].max_sectors = ATA_MAX_SECTORS; 1318 dev->max_sectors = ATA_MAX_SECTORS;
1206 } 1319 }
1207 1320
1208 if (ap->ops->dev_config) 1321 if (ap->ops->dev_config)
1209 ap->ops->dev_config(ap, &ap->device[i]); 1322 ap->ops->dev_config(ap, dev);
1323
1324 DPRINTK("EXIT, drv_stat = 0x%x\n", ata_chk_status(ap));
1325 return 0;
1326
1327err_out_nosup:
1328 printk(KERN_WARNING "ata%u: dev %u not supported, ignoring\n",
1329 ap->id, dev->devno);
1330 DPRINTK("EXIT, err\n");
1331 return rc;
1210} 1332}
1211 1333
1212/** 1334/**
@@ -1226,41 +1348,61 @@ void ata_dev_config(struct ata_port *ap, unsigned int i)
1226 1348
1227static int ata_bus_probe(struct ata_port *ap) 1349static int ata_bus_probe(struct ata_port *ap)
1228{ 1350{
1229 unsigned int i, found = 0; 1351 unsigned int classes[ATA_MAX_DEVICES];
1352 unsigned int i, rc, found = 0;
1230 1353
1231 if (ap->ops->probe_reset) { 1354 ata_port_probe(ap);
1232 unsigned int classes[ATA_MAX_DEVICES];
1233 int rc;
1234 1355
1235 ata_port_probe(ap); 1356 /* reset */
1357 if (ap->ops->probe_reset) {
1358 for (i = 0; i < ATA_MAX_DEVICES; i++)
1359 classes[i] = ATA_DEV_UNKNOWN;
1236 1360
1237 rc = ap->ops->probe_reset(ap, classes); 1361 rc = ap->ops->probe_reset(ap, classes);
1238 if (rc == 0) { 1362 if (rc) {
1239 for (i = 0; i < ATA_MAX_DEVICES; i++) { 1363 printk("ata%u: reset failed (errno=%d)\n", ap->id, rc);
1240 if (classes[i] == ATA_DEV_UNKNOWN) 1364 return rc;
1241 classes[i] = ATA_DEV_NONE;
1242 ap->device[i].class = classes[i];
1243 }
1244 } else {
1245 printk(KERN_ERR "ata%u: probe reset failed, "
1246 "disabling port\n", ap->id);
1247 ata_port_disable(ap);
1248 } 1365 }
1249 } else 1366
1367 for (i = 0; i < ATA_MAX_DEVICES; i++)
1368 if (classes[i] == ATA_DEV_UNKNOWN)
1369 classes[i] = ATA_DEV_NONE;
1370 } else {
1250 ap->ops->phy_reset(ap); 1371 ap->ops->phy_reset(ap);
1251 1372
1252 if (ap->flags & ATA_FLAG_PORT_DISABLED) 1373 for (i = 0; i < ATA_MAX_DEVICES; i++) {
1253 goto err_out; 1374 if (!(ap->flags & ATA_FLAG_PORT_DISABLED))
1375 classes[i] = ap->device[i].class;
1376 else
1377 ap->device[i].class = ATA_DEV_UNKNOWN;
1378 }
1379 ata_port_probe(ap);
1380 }
1254 1381
1382 /* read IDENTIFY page and configure devices */
1255 for (i = 0; i < ATA_MAX_DEVICES; i++) { 1383 for (i = 0; i < ATA_MAX_DEVICES; i++) {
1256 ata_dev_identify(ap, i); 1384 struct ata_device *dev = &ap->device[i];
1257 if (ata_dev_present(&ap->device[i])) { 1385
1258 found = 1; 1386 dev->class = classes[i];
1259 ata_dev_config(ap,i); 1387
1388 if (!ata_dev_present(dev))
1389 continue;
1390
1391 WARN_ON(dev->id != NULL);
1392 if (ata_dev_read_id(ap, dev, &dev->class, 1, &dev->id)) {
1393 dev->class = ATA_DEV_NONE;
1394 continue;
1395 }
1396
1397 if (ata_dev_configure(ap, dev, 1)) {
1398 dev->class++; /* disable device */
1399 continue;
1260 } 1400 }
1401
1402 found = 1;
1261 } 1403 }
1262 1404
1263 if ((!found) || (ap->flags & ATA_FLAG_PORT_DISABLED)) 1405 if (!found)
1264 goto err_out_disable; 1406 goto err_out_disable;
1265 1407
1266 ata_set_mode(ap); 1408 ata_set_mode(ap);
@@ -1271,7 +1413,6 @@ static int ata_bus_probe(struct ata_port *ap)
1271 1413
1272err_out_disable: 1414err_out_disable:
1273 ap->ops->port_disable(ap); 1415 ap->ops->port_disable(ap);
1274err_out:
1275 return -1; 1416 return -1;
1276} 1417}
1277 1418
@@ -1567,31 +1708,8 @@ int ata_timing_compute(struct ata_device *adev, unsigned short speed,
1567 return 0; 1708 return 0;
1568} 1709}
1569 1710
1570static const struct {
1571 unsigned int shift;
1572 u8 base;
1573} xfer_mode_classes[] = {
1574 { ATA_SHIFT_UDMA, XFER_UDMA_0 },
1575 { ATA_SHIFT_MWDMA, XFER_MW_DMA_0 },
1576 { ATA_SHIFT_PIO, XFER_PIO_0 },
1577};
1578
1579static u8 base_from_shift(unsigned int shift)
1580{
1581 int i;
1582
1583 for (i = 0; i < ARRAY_SIZE(xfer_mode_classes); i++)
1584 if (xfer_mode_classes[i].shift == shift)
1585 return xfer_mode_classes[i].base;
1586
1587 return 0xff;
1588}
1589
1590static void ata_dev_set_mode(struct ata_port *ap, struct ata_device *dev) 1711static void ata_dev_set_mode(struct ata_port *ap, struct ata_device *dev)
1591{ 1712{
1592 int ofs, idx;
1593 u8 base;
1594
1595 if (!ata_dev_present(dev) || (ap->flags & ATA_FLAG_PORT_DISABLED)) 1713 if (!ata_dev_present(dev) || (ap->flags & ATA_FLAG_PORT_DISABLED))
1596 return; 1714 return;
1597 1715
@@ -1600,65 +1718,58 @@ static void ata_dev_set_mode(struct ata_port *ap, struct ata_device *dev)
1600 1718
1601 ata_dev_set_xfermode(ap, dev); 1719 ata_dev_set_xfermode(ap, dev);
1602 1720
1603 base = base_from_shift(dev->xfer_shift); 1721 if (ata_dev_revalidate(ap, dev, 0)) {
1604 ofs = dev->xfer_mode - base; 1722 printk(KERN_ERR "ata%u: failed to revalidate after set "
1605 idx = ofs + dev->xfer_shift; 1723 "xfermode, disabled\n", ap->id);
1606 WARN_ON(idx >= ARRAY_SIZE(xfer_mode_str)); 1724 ata_port_disable(ap);
1725 }
1607 1726
1608 DPRINTK("idx=%d xfer_shift=%u, xfer_mode=0x%x, base=0x%x, offset=%d\n", 1727 DPRINTK("xfer_shift=%u, xfer_mode=0x%x\n",
1609 idx, dev->xfer_shift, (int)dev->xfer_mode, (int)base, ofs); 1728 dev->xfer_shift, (int)dev->xfer_mode);
1610 1729
1611 printk(KERN_INFO "ata%u: dev %u configured for %s\n", 1730 printk(KERN_INFO "ata%u: dev %u configured for %s\n",
1612 ap->id, dev->devno, xfer_mode_str[idx]); 1731 ap->id, dev->devno,
1732 ata_mode_string(ata_xfer_mode2mask(dev->xfer_mode)));
1613} 1733}
1614 1734
1615static int ata_host_set_pio(struct ata_port *ap) 1735static int ata_host_set_pio(struct ata_port *ap)
1616{ 1736{
1617 unsigned int mask; 1737 int i;
1618 int x, i;
1619 u8 base, xfer_mode;
1620
1621 mask = ata_get_mode_mask(ap, ATA_SHIFT_PIO);
1622 x = fgb(mask);
1623 if (x < 0) {
1624 printk(KERN_WARNING "ata%u: no PIO support\n", ap->id);
1625 return -1;
1626 }
1627
1628 base = base_from_shift(ATA_SHIFT_PIO);
1629 xfer_mode = base + x;
1630
1631 DPRINTK("base 0x%x xfer_mode 0x%x mask 0x%x x %d\n",
1632 (int)base, (int)xfer_mode, mask, x);
1633 1738
1634 for (i = 0; i < ATA_MAX_DEVICES; i++) { 1739 for (i = 0; i < ATA_MAX_DEVICES; i++) {
1635 struct ata_device *dev = &ap->device[i]; 1740 struct ata_device *dev = &ap->device[i];
1636 if (ata_dev_present(dev)) { 1741
1637 dev->pio_mode = xfer_mode; 1742 if (!ata_dev_present(dev))
1638 dev->xfer_mode = xfer_mode; 1743 continue;
1639 dev->xfer_shift = ATA_SHIFT_PIO; 1744
1640 if (ap->ops->set_piomode) 1745 if (!dev->pio_mode) {
1641 ap->ops->set_piomode(ap, dev); 1746 printk(KERN_WARNING "ata%u: no PIO support\n", ap->id);
1747 return -1;
1642 } 1748 }
1749
1750 dev->xfer_mode = dev->pio_mode;
1751 dev->xfer_shift = ATA_SHIFT_PIO;
1752 if (ap->ops->set_piomode)
1753 ap->ops->set_piomode(ap, dev);
1643 } 1754 }
1644 1755
1645 return 0; 1756 return 0;
1646} 1757}
1647 1758
1648static void ata_host_set_dma(struct ata_port *ap, u8 xfer_mode, 1759static void ata_host_set_dma(struct ata_port *ap)
1649 unsigned int xfer_shift)
1650{ 1760{
1651 int i; 1761 int i;
1652 1762
1653 for (i = 0; i < ATA_MAX_DEVICES; i++) { 1763 for (i = 0; i < ATA_MAX_DEVICES; i++) {
1654 struct ata_device *dev = &ap->device[i]; 1764 struct ata_device *dev = &ap->device[i];
1655 if (ata_dev_present(dev)) { 1765
1656 dev->dma_mode = xfer_mode; 1766 if (!ata_dev_present(dev) || !dev->dma_mode)
1657 dev->xfer_mode = xfer_mode; 1767 continue;
1658 dev->xfer_shift = xfer_shift; 1768
1659 if (ap->ops->set_dmamode) 1769 dev->xfer_mode = dev->dma_mode;
1660 ap->ops->set_dmamode(ap, dev); 1770 dev->xfer_shift = ata_xfer_mode2shift(dev->dma_mode);
1661 } 1771 if (ap->ops->set_dmamode)
1772 ap->ops->set_dmamode(ap, dev);
1662 } 1773 }
1663} 1774}
1664 1775
@@ -1673,28 +1784,34 @@ static void ata_host_set_dma(struct ata_port *ap, u8 xfer_mode,
1673 */ 1784 */
1674static void ata_set_mode(struct ata_port *ap) 1785static void ata_set_mode(struct ata_port *ap)
1675{ 1786{
1676 unsigned int xfer_shift; 1787 int i, rc;
1677 u8 xfer_mode;
1678 int rc;
1679 1788
1680 /* step 1: always set host PIO timings */ 1789 /* step 1: calculate xfer_mask */
1681 rc = ata_host_set_pio(ap); 1790 for (i = 0; i < ATA_MAX_DEVICES; i++) {
1682 if (rc) 1791 struct ata_device *dev = &ap->device[i];
1683 goto err_out; 1792 unsigned int xfer_mask;
1793
1794 if (!ata_dev_present(dev))
1795 continue;
1796
1797 xfer_mask = ata_dev_xfermask(ap, dev);
1684 1798
1685 /* step 2: choose the best data xfer mode */ 1799 dev->pio_mode = ata_xfer_mask2mode(xfer_mask & ATA_MASK_PIO);
1686 xfer_mode = xfer_shift = 0; 1800 dev->dma_mode = ata_xfer_mask2mode(xfer_mask & (ATA_MASK_MWDMA |
1687 rc = ata_choose_xfer_mode(ap, &xfer_mode, &xfer_shift); 1801 ATA_MASK_UDMA));
1802 }
1803
1804 /* step 2: always set host PIO timings */
1805 rc = ata_host_set_pio(ap);
1688 if (rc) 1806 if (rc)
1689 goto err_out; 1807 goto err_out;
1690 1808
1691 /* step 3: if that xfer mode isn't PIO, set host DMA timings */ 1809 /* step 3: set host DMA timings */
1692 if (xfer_shift != ATA_SHIFT_PIO) 1810 ata_host_set_dma(ap);
1693 ata_host_set_dma(ap, xfer_mode, xfer_shift);
1694 1811
1695 /* step 4: update devices' xfer mode */ 1812 /* step 4: update devices' xfer mode */
1696 ata_dev_set_mode(ap, &ap->device[0]); 1813 for (i = 0; i < ATA_MAX_DEVICES; i++)
1697 ata_dev_set_mode(ap, &ap->device[1]); 1814 ata_dev_set_mode(ap, &ap->device[i]);
1698 1815
1699 if (ap->flags & ATA_FLAG_PORT_DISABLED) 1816 if (ap->flags & ATA_FLAG_PORT_DISABLED)
1700 return; 1817 return;
@@ -2325,11 +2442,118 @@ int ata_drive_probe_reset(struct ata_port *ap, ata_probeinit_fn_t probeinit,
2325 return rc; 2442 return rc;
2326} 2443}
2327 2444
2328static void ata_pr_blacklisted(const struct ata_port *ap, 2445/**
2329 const struct ata_device *dev) 2446 * ata_dev_same_device - Determine whether new ID matches configured device
2447 * @ap: port on which the device to compare against resides
2448 * @dev: device to compare against
2449 * @new_class: class of the new device
2450 * @new_id: IDENTIFY page of the new device
2451 *
2452 * Compare @new_class and @new_id against @dev and determine
2453 * whether @dev is the device indicated by @new_class and
2454 * @new_id.
2455 *
2456 * LOCKING:
2457 * None.
2458 *
2459 * RETURNS:
2460 * 1 if @dev matches @new_class and @new_id, 0 otherwise.
2461 */
2462static int ata_dev_same_device(struct ata_port *ap, struct ata_device *dev,
2463 unsigned int new_class, const u16 *new_id)
2464{
2465 const u16 *old_id = dev->id;
2466 unsigned char model[2][41], serial[2][21];
2467 u64 new_n_sectors;
2468
2469 if (dev->class != new_class) {
2470 printk(KERN_INFO
2471 "ata%u: dev %u class mismatch %d != %d\n",
2472 ap->id, dev->devno, dev->class, new_class);
2473 return 0;
2474 }
2475
2476 ata_id_c_string(old_id, model[0], ATA_ID_PROD_OFS, sizeof(model[0]));
2477 ata_id_c_string(new_id, model[1], ATA_ID_PROD_OFS, sizeof(model[1]));
2478 ata_id_c_string(old_id, serial[0], ATA_ID_SERNO_OFS, sizeof(serial[0]));
2479 ata_id_c_string(new_id, serial[1], ATA_ID_SERNO_OFS, sizeof(serial[1]));
2480 new_n_sectors = ata_id_n_sectors(new_id);
2481
2482 if (strcmp(model[0], model[1])) {
2483 printk(KERN_INFO
2484 "ata%u: dev %u model number mismatch '%s' != '%s'\n",
2485 ap->id, dev->devno, model[0], model[1]);
2486 return 0;
2487 }
2488
2489 if (strcmp(serial[0], serial[1])) {
2490 printk(KERN_INFO
2491 "ata%u: dev %u serial number mismatch '%s' != '%s'\n",
2492 ap->id, dev->devno, serial[0], serial[1]);
2493 return 0;
2494 }
2495
2496 if (dev->class == ATA_DEV_ATA && dev->n_sectors != new_n_sectors) {
2497 printk(KERN_INFO
2498 "ata%u: dev %u n_sectors mismatch %llu != %llu\n",
2499 ap->id, dev->devno, (unsigned long long)dev->n_sectors,
2500 (unsigned long long)new_n_sectors);
2501 return 0;
2502 }
2503
2504 return 1;
2505}
2506
2507/**
2508 * ata_dev_revalidate - Revalidate ATA device
2509 * @ap: port on which the device to revalidate resides
2510 * @dev: device to revalidate
2511 * @post_reset: is this revalidation after reset?
2512 *
2513 * Re-read IDENTIFY page and make sure @dev is still attached to
2514 * the port.
2515 *
2516 * LOCKING:
2517 * Kernel thread context (may sleep)
2518 *
2519 * RETURNS:
2520 * 0 on success, negative errno otherwise
2521 */
2522int ata_dev_revalidate(struct ata_port *ap, struct ata_device *dev,
2523 int post_reset)
2330{ 2524{
2331 printk(KERN_WARNING "ata%u: dev %u is on DMA blacklist, disabling DMA\n", 2525 unsigned int class;
2332 ap->id, dev->devno); 2526 u16 *id;
2527 int rc;
2528
2529 if (!ata_dev_present(dev))
2530 return -ENODEV;
2531
2532 class = dev->class;
2533 id = NULL;
2534
2535 /* allocate & read ID data */
2536 rc = ata_dev_read_id(ap, dev, &class, post_reset, &id);
2537 if (rc)
2538 goto fail;
2539
2540 /* is the device still there? */
2541 if (!ata_dev_same_device(ap, dev, class, id)) {
2542 rc = -ENODEV;
2543 goto fail;
2544 }
2545
2546 kfree(dev->id);
2547 dev->id = id;
2548
2549 /* configure device according to the new ID */
2550 return ata_dev_configure(ap, dev, 0);
2551
2552 fail:
2553 printk(KERN_ERR "ata%u: dev %u revalidation failed (errno=%d)\n",
2554 ap->id, dev->devno, rc);
2555 kfree(id);
2556 return rc;
2333} 2557}
2334 2558
2335static const char * const ata_dma_blacklist [] = { 2559static const char * const ata_dma_blacklist [] = {
@@ -2378,128 +2602,45 @@ static int ata_dma_blacklisted(const struct ata_device *dev)
2378 return 0; 2602 return 0;
2379} 2603}
2380 2604
2381static unsigned int ata_get_mode_mask(const struct ata_port *ap, int shift)
2382{
2383 const struct ata_device *master, *slave;
2384 unsigned int mask;
2385
2386 master = &ap->device[0];
2387 slave = &ap->device[1];
2388
2389 WARN_ON(!ata_dev_present(master) && !ata_dev_present(slave));
2390
2391 if (shift == ATA_SHIFT_UDMA) {
2392 mask = ap->udma_mask;
2393 if (ata_dev_present(master)) {
2394 mask &= (master->id[ATA_ID_UDMA_MODES] & 0xff);
2395 if (ata_dma_blacklisted(master)) {
2396 mask = 0;
2397 ata_pr_blacklisted(ap, master);
2398 }
2399 }
2400 if (ata_dev_present(slave)) {
2401 mask &= (slave->id[ATA_ID_UDMA_MODES] & 0xff);
2402 if (ata_dma_blacklisted(slave)) {
2403 mask = 0;
2404 ata_pr_blacklisted(ap, slave);
2405 }
2406 }
2407 }
2408 else if (shift == ATA_SHIFT_MWDMA) {
2409 mask = ap->mwdma_mask;
2410 if (ata_dev_present(master)) {
2411 mask &= (master->id[ATA_ID_MWDMA_MODES] & 0x07);
2412 if (ata_dma_blacklisted(master)) {
2413 mask = 0;
2414 ata_pr_blacklisted(ap, master);
2415 }
2416 }
2417 if (ata_dev_present(slave)) {
2418 mask &= (slave->id[ATA_ID_MWDMA_MODES] & 0x07);
2419 if (ata_dma_blacklisted(slave)) {
2420 mask = 0;
2421 ata_pr_blacklisted(ap, slave);
2422 }
2423 }
2424 }
2425 else if (shift == ATA_SHIFT_PIO) {
2426 mask = ap->pio_mask;
2427 if (ata_dev_present(master)) {
2428 /* spec doesn't return explicit support for
2429 * PIO0-2, so we fake it
2430 */
2431 u16 tmp_mode = master->id[ATA_ID_PIO_MODES] & 0x03;
2432 tmp_mode <<= 3;
2433 tmp_mode |= 0x7;
2434 mask &= tmp_mode;
2435 }
2436 if (ata_dev_present(slave)) {
2437 /* spec doesn't return explicit support for
2438 * PIO0-2, so we fake it
2439 */
2440 u16 tmp_mode = slave->id[ATA_ID_PIO_MODES] & 0x03;
2441 tmp_mode <<= 3;
2442 tmp_mode |= 0x7;
2443 mask &= tmp_mode;
2444 }
2445 }
2446 else {
2447 mask = 0xffffffff; /* shut up compiler warning */
2448 BUG();
2449 }
2450
2451 return mask;
2452}
2453
2454/* find greatest bit */
2455static int fgb(u32 bitmap)
2456{
2457 unsigned int i;
2458 int x = -1;
2459
2460 for (i = 0; i < 32; i++)
2461 if (bitmap & (1 << i))
2462 x = i;
2463
2464 return x;
2465}
2466
2467/** 2605/**
2468 * ata_choose_xfer_mode - attempt to find best transfer mode 2606 * ata_dev_xfermask - Compute supported xfermask of the given device
2469 * @ap: Port for which an xfer mode will be selected 2607 * @ap: Port on which the device to compute xfermask for resides
2470 * @xfer_mode_out: (output) SET FEATURES - XFER MODE code 2608 * @dev: Device to compute xfermask for
2471 * @xfer_shift_out: (output) bit shift that selects this mode
2472 * 2609 *
2473 * Based on host and device capabilities, determine the 2610 * Compute supported xfermask of @dev. This function is
2474 * maximum transfer mode that is amenable to all. 2611 * responsible for applying all known limits including host
2612 * controller limits, device blacklist, etc...
2475 * 2613 *
2476 * LOCKING: 2614 * LOCKING:
2477 * PCI/etc. bus probe sem. 2615 * None.
2478 * 2616 *
2479 * RETURNS: 2617 * RETURNS:
2480 * Zero on success, negative on error. 2618 * Computed xfermask.
2481 */ 2619 */
2482 2620static unsigned int ata_dev_xfermask(struct ata_port *ap,
2483static int ata_choose_xfer_mode(const struct ata_port *ap, 2621 struct ata_device *dev)
2484 u8 *xfer_mode_out,
2485 unsigned int *xfer_shift_out)
2486{ 2622{
2487 unsigned int mask, shift; 2623 unsigned long xfer_mask;
2488 int x, i; 2624 int i;
2489 2625
2490 for (i = 0; i < ARRAY_SIZE(xfer_mode_classes); i++) { 2626 xfer_mask = ata_pack_xfermask(ap->pio_mask, ap->mwdma_mask,
2491 shift = xfer_mode_classes[i].shift; 2627 ap->udma_mask);
2492 mask = ata_get_mode_mask(ap, shift);
2493 2628
2494 x = fgb(mask); 2629 /* use port-wide xfermask for now */
2495 if (x >= 0) { 2630 for (i = 0; i < ATA_MAX_DEVICES; i++) {
2496 *xfer_mode_out = xfer_mode_classes[i].base + x; 2631 struct ata_device *d = &ap->device[i];
2497 *xfer_shift_out = shift; 2632 if (!ata_dev_present(d))
2498 return 0; 2633 continue;
2499 } 2634 xfer_mask &= ata_id_xfermask(d->id);
2635 if (ata_dma_blacklisted(d))
2636 xfer_mask &= ~(ATA_MASK_MWDMA | ATA_MASK_UDMA);
2500 } 2637 }
2501 2638
2502 return -1; 2639 if (ata_dma_blacklisted(dev))
2640 printk(KERN_WARNING "ata%u: dev %u is on DMA blacklist, "
2641 "disabling DMA\n", ap->id, dev->devno);
2642
2643 return xfer_mask;
2503} 2644}
2504 2645
2505/** 2646/**
@@ -3667,12 +3808,84 @@ fsm_start:
3667 } 3808 }
3668 3809
3669 if (timeout) 3810 if (timeout)
3670 ata_queue_delayed_pio_task(ap, timeout); 3811 ata_port_queue_task(ap, ata_pio_task, ap, timeout);
3671 else if (has_next) 3812 else if (!qc_completed)
3672 goto fsm_start; 3813 goto fsm_start;
3673} 3814}
3674 3815
3675/** 3816/**
3817 * atapi_packet_task - Write CDB bytes to hardware
3818 * @_data: Port to which ATAPI device is attached.
3819 *
3820 * When device has indicated its readiness to accept
3821 * a CDB, this function is called. Send the CDB.
3822 * If DMA is to be performed, exit immediately.
3823 * Otherwise, we are in polling mode, so poll
3824 * status under operation succeeds or fails.
3825 *
3826 * LOCKING:
3827 * Kernel thread context (may sleep)
3828 */
3829
3830static void atapi_packet_task(void *_data)
3831{
3832 struct ata_port *ap = _data;
3833 struct ata_queued_cmd *qc;
3834 u8 status;
3835
3836 qc = ata_qc_from_tag(ap, ap->active_tag);
3837 WARN_ON(qc == NULL);
3838 WARN_ON(!(qc->flags & ATA_QCFLAG_ACTIVE));
3839
3840 /* sleep-wait for BSY to clear */
3841 DPRINTK("busy wait\n");
3842 if (ata_busy_sleep(ap, ATA_TMOUT_CDB_QUICK, ATA_TMOUT_CDB)) {
3843 qc->err_mask |= AC_ERR_TIMEOUT;
3844 goto err_out;
3845 }
3846
3847 /* make sure DRQ is set */
3848 status = ata_chk_status(ap);
3849 if ((status & (ATA_BUSY | ATA_DRQ)) != ATA_DRQ) {
3850 qc->err_mask |= AC_ERR_HSM;
3851 goto err_out;
3852 }
3853
3854 /* send SCSI cdb */
3855 DPRINTK("send cdb\n");
3856 WARN_ON(qc->dev->cdb_len < 12);
3857
3858 if (qc->tf.protocol == ATA_PROT_ATAPI_DMA ||
3859 qc->tf.protocol == ATA_PROT_ATAPI_NODATA) {
3860 unsigned long flags;
3861
3862 /* Once we're done issuing command and kicking bmdma,
3863 * irq handler takes over. To not lose irq, we need
3864 * to clear NOINTR flag before sending cdb, but
3865 * interrupt handler shouldn't be invoked before we're
3866 * finished. Hence, the following locking.
3867 */
3868 spin_lock_irqsave(&ap->host_set->lock, flags);
3869 ap->flags &= ~ATA_FLAG_NOINTR;
3870 ata_data_xfer(ap, qc->cdb, qc->dev->cdb_len, 1);
3871 if (qc->tf.protocol == ATA_PROT_ATAPI_DMA)
3872 ap->ops->bmdma_start(qc); /* initiate bmdma */
3873 spin_unlock_irqrestore(&ap->host_set->lock, flags);
3874 } else {
3875 ata_data_xfer(ap, qc->cdb, qc->dev->cdb_len, 1);
3876
3877 /* PIO commands are handled by polling */
3878 ap->hsm_task_state = HSM_ST;
3879 ata_port_queue_task(ap, ata_pio_task, ap, 0);
3880 }
3881
3882 return;
3883
3884err_out:
3885 ata_poll_qc_complete(qc);
3886}
3887
3888/**
3676 * ata_qc_timeout - Handle timeout of queued command 3889 * ata_qc_timeout - Handle timeout of queued command
3677 * @qc: Command that timed out 3890 * @qc: Command that timed out
3678 * 3891 *
@@ -3700,7 +3913,6 @@ static void ata_qc_timeout(struct ata_queued_cmd *qc)
3700 3913
3701 DPRINTK("ENTER\n"); 3914 DPRINTK("ENTER\n");
3702 3915
3703 ata_flush_pio_tasks(ap);
3704 ap->hsm_task_state = HSM_ST_IDLE; 3916 ap->hsm_task_state = HSM_ST_IDLE;
3705 3917
3706 spin_lock_irqsave(&host_set->lock, flags); 3918 spin_lock_irqsave(&host_set->lock, flags);
@@ -4010,7 +4222,7 @@ unsigned int ata_qc_issue_prot(struct ata_queued_cmd *qc)
4010 if (qc->tf.flags & ATA_TFLAG_WRITE) { 4222 if (qc->tf.flags & ATA_TFLAG_WRITE) {
4011 /* PIO data out protocol */ 4223 /* PIO data out protocol */
4012 ap->hsm_task_state = HSM_ST_FIRST; 4224 ap->hsm_task_state = HSM_ST_FIRST;
4013 ata_queue_pio_task(ap); 4225 ata_port_queue_task(ap, ata_pio_task, ap, 0);
4014 4226
4015 /* always send first data block using 4227 /* always send first data block using
4016 * the ata_pio_task() codepath. 4228 * the ata_pio_task() codepath.
@@ -4020,7 +4232,7 @@ unsigned int ata_qc_issue_prot(struct ata_queued_cmd *qc)
4020 ap->hsm_task_state = HSM_ST; 4232 ap->hsm_task_state = HSM_ST;
4021 4233
4022 if (qc->tf.flags & ATA_TFLAG_POLLING) 4234 if (qc->tf.flags & ATA_TFLAG_POLLING)
4023 ata_queue_pio_task(ap); 4235 ata_port_queue_task(ap, ata_pio_task, ap, 0);
4024 4236
4025 /* if polling, ata_pio_task() handles the rest. 4237 /* if polling, ata_pio_task() handles the rest.
4026 * otherwise, interrupt handler takes over from here. 4238 * otherwise, interrupt handler takes over from here.
@@ -4041,7 +4253,7 @@ unsigned int ata_qc_issue_prot(struct ata_queued_cmd *qc)
4041 /* send cdb by polling if no cdb interrupt */ 4253 /* send cdb by polling if no cdb interrupt */
4042 if ((!(qc->dev->flags & ATA_DFLAG_CDB_INTR)) || 4254 if ((!(qc->dev->flags & ATA_DFLAG_CDB_INTR)) ||
4043 (qc->tf.flags & ATA_TFLAG_POLLING)) 4255 (qc->tf.flags & ATA_TFLAG_POLLING))
4044 ata_queue_pio_task(ap); 4256 ata_port_queue_task(ap, atapi_packet_task, ap, 0);
4045 break; 4257 break;
4046 4258
4047 case ATA_PROT_ATAPI_DMA: 4259 case ATA_PROT_ATAPI_DMA:
@@ -4053,7 +4265,7 @@ unsigned int ata_qc_issue_prot(struct ata_queued_cmd *qc)
4053 4265
4054 /* send cdb by polling if no cdb interrupt */ 4266 /* send cdb by polling if no cdb interrupt */
4055 if (!(qc->dev->flags & ATA_DFLAG_CDB_INTR)) 4267 if (!(qc->dev->flags & ATA_DFLAG_CDB_INTR))
4056 ata_queue_pio_task(ap); 4268 ata_port_queue_task(ap, atapi_packet_task, ap, 0);
4057 break; 4269 break;
4058 4270
4059 default: 4271 default:
@@ -4533,6 +4745,7 @@ irqreturn_t ata_interrupt (int irq, void *dev_instance, struct pt_regs *regs)
4533 return IRQ_RETVAL(handled); 4745 return IRQ_RETVAL(handled);
4534} 4746}
4535 4747
4748
4536/* 4749/*
4537 * Execute a 'simple' command, that only consists of the opcode 'cmd' itself, 4750 * Execute a 'simple' command, that only consists of the opcode 'cmd' itself,
4538 * without filling any other registers 4751 * without filling any other registers
@@ -4752,7 +4965,7 @@ static void ata_host_init(struct ata_port *ap, struct Scsi_Host *host,
4752 ap->active_tag = ATA_TAG_POISON; 4965 ap->active_tag = ATA_TAG_POISON;
4753 ap->last_ctl = 0xFF; 4966 ap->last_ctl = 0xFF;
4754 4967
4755 INIT_WORK(&ap->pio_task, ata_pio_task, ap); 4968 INIT_WORK(&ap->port_task, NULL, NULL);
4756 INIT_LIST_HEAD(&ap->eh_done_q); 4969 INIT_LIST_HEAD(&ap->eh_done_q);
4757 4970
4758 for (i = 0; i < ATA_MAX_DEVICES; i++) 4971 for (i = 0; i < ATA_MAX_DEVICES; i++)
@@ -5007,11 +5220,14 @@ void ata_host_set_remove(struct ata_host_set *host_set)
5007int ata_scsi_release(struct Scsi_Host *host) 5220int ata_scsi_release(struct Scsi_Host *host)
5008{ 5221{
5009 struct ata_port *ap = (struct ata_port *) &host->hostdata[0]; 5222 struct ata_port *ap = (struct ata_port *) &host->hostdata[0];
5223 int i;
5010 5224
5011 DPRINTK("ENTER\n"); 5225 DPRINTK("ENTER\n");
5012 5226
5013 ap->ops->port_disable(ap); 5227 ap->ops->port_disable(ap);
5014 ata_host_remove(ap, 0); 5228 ata_host_remove(ap, 0);
5229 for (i = 0; i < ATA_MAX_DEVICES; i++)
5230 kfree(ap->device[i].id);
5015 5231
5016 DPRINTK("EXIT\n"); 5232 DPRINTK("EXIT\n");
5017 return 1; 5233 return 1;
@@ -5215,9 +5431,11 @@ EXPORT_SYMBOL_GPL(sata_std_hardreset);
5215EXPORT_SYMBOL_GPL(ata_std_postreset); 5431EXPORT_SYMBOL_GPL(ata_std_postreset);
5216EXPORT_SYMBOL_GPL(ata_std_probe_reset); 5432EXPORT_SYMBOL_GPL(ata_std_probe_reset);
5217EXPORT_SYMBOL_GPL(ata_drive_probe_reset); 5433EXPORT_SYMBOL_GPL(ata_drive_probe_reset);
5434EXPORT_SYMBOL_GPL(ata_dev_revalidate);
5218EXPORT_SYMBOL_GPL(ata_port_disable); 5435EXPORT_SYMBOL_GPL(ata_port_disable);
5219EXPORT_SYMBOL_GPL(ata_ratelimit); 5436EXPORT_SYMBOL_GPL(ata_ratelimit);
5220EXPORT_SYMBOL_GPL(ata_busy_sleep); 5437EXPORT_SYMBOL_GPL(ata_busy_sleep);
5438EXPORT_SYMBOL_GPL(ata_port_queue_task);
5221EXPORT_SYMBOL_GPL(ata_scsi_ioctl); 5439EXPORT_SYMBOL_GPL(ata_scsi_ioctl);
5222EXPORT_SYMBOL_GPL(ata_scsi_queuecmd); 5440EXPORT_SYMBOL_GPL(ata_scsi_queuecmd);
5223EXPORT_SYMBOL_GPL(ata_scsi_timed_out); 5441EXPORT_SYMBOL_GPL(ata_scsi_timed_out);
@@ -5228,7 +5446,6 @@ EXPORT_SYMBOL_GPL(ata_host_intr);
5228EXPORT_SYMBOL_GPL(ata_dev_classify); 5446EXPORT_SYMBOL_GPL(ata_dev_classify);
5229EXPORT_SYMBOL_GPL(ata_id_string); 5447EXPORT_SYMBOL_GPL(ata_id_string);
5230EXPORT_SYMBOL_GPL(ata_id_c_string); 5448EXPORT_SYMBOL_GPL(ata_id_c_string);
5231EXPORT_SYMBOL_GPL(ata_dev_config);
5232EXPORT_SYMBOL_GPL(ata_scsi_simulate); 5449EXPORT_SYMBOL_GPL(ata_scsi_simulate);
5233EXPORT_SYMBOL_GPL(ata_eh_qc_complete); 5450EXPORT_SYMBOL_GPL(ata_eh_qc_complete);
5234EXPORT_SYMBOL_GPL(ata_eh_qc_retry); 5451EXPORT_SYMBOL_GPL(ata_eh_qc_retry);
diff --git a/drivers/scsi/libata-scsi.c b/drivers/scsi/libata-scsi.c
index d0bd94abb413..ccedb4536977 100644
--- a/drivers/scsi/libata-scsi.c
+++ b/drivers/scsi/libata-scsi.c
@@ -785,6 +785,8 @@ int ata_scsi_error(struct Scsi_Host *host)
785 WARN_ON(ata_qc_from_tag(ap, ap->active_tag) == NULL); 785 WARN_ON(ata_qc_from_tag(ap, ap->active_tag) == NULL);
786 spin_unlock_irqrestore(&ap->host_set->lock, flags); 786 spin_unlock_irqrestore(&ap->host_set->lock, flags);
787 787
788 ata_port_flush_task(ap);
789
788 ap->ops->eng_timeout(ap); 790 ap->ops->eng_timeout(ap);
789 791
790 WARN_ON(host->host_failed || !list_empty(&host->eh_cmd_q)); 792 WARN_ON(host->host_failed || !list_empty(&host->eh_cmd_q));
diff --git a/drivers/scsi/libata.h b/drivers/scsi/libata.h
index d822eba05f3c..f4c48c91b63d 100644
--- a/drivers/scsi/libata.h
+++ b/drivers/scsi/libata.h
@@ -45,6 +45,7 @@ extern int libata_fua;
45extern struct ata_queued_cmd *ata_qc_new_init(struct ata_port *ap, 45extern struct ata_queued_cmd *ata_qc_new_init(struct ata_port *ap,
46 struct ata_device *dev); 46 struct ata_device *dev);
47extern int ata_rwcmd_protocol(struct ata_queued_cmd *qc); 47extern int ata_rwcmd_protocol(struct ata_queued_cmd *qc);
48extern void ata_port_flush_task(struct ata_port *ap);
48extern void ata_qc_free(struct ata_queued_cmd *qc); 49extern void ata_qc_free(struct ata_queued_cmd *qc);
49extern unsigned int ata_qc_issue(struct ata_queued_cmd *qc); 50extern unsigned int ata_qc_issue(struct ata_queued_cmd *qc);
50extern int ata_check_atapi_dma(struct ata_queued_cmd *qc); 51extern int ata_check_atapi_dma(struct ata_queued_cmd *qc);
diff --git a/drivers/scsi/sata_promise.c b/drivers/scsi/sata_promise.c
index 7fa807d7d9e1..e5862ad5e6cd 100644
--- a/drivers/scsi/sata_promise.c
+++ b/drivers/scsi/sata_promise.c
@@ -256,6 +256,8 @@ static const struct pci_device_id pdc_ata_pci_tbl[] = {
256 board_20319 }, 256 board_20319 },
257 { PCI_VENDOR_ID_PROMISE, 0x3319, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 257 { PCI_VENDOR_ID_PROMISE, 0x3319, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
258 board_20319 }, 258 board_20319 },
259 { PCI_VENDOR_ID_PROMISE, 0x3515, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
260 board_20319 },
259 { PCI_VENDOR_ID_PROMISE, 0x3519, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 261 { PCI_VENDOR_ID_PROMISE, 0x3519, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
260 board_20319 }, 262 board_20319 },
261 { PCI_VENDOR_ID_PROMISE, 0x3d17, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 263 { PCI_VENDOR_ID_PROMISE, 0x3d17, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
diff --git a/drivers/scsi/sata_sil.c b/drivers/scsi/sata_sil.c
index cdf800e3ec13..4f2a67ed39d8 100644
--- a/drivers/scsi/sata_sil.c
+++ b/drivers/scsi/sata_sil.c
@@ -49,24 +49,30 @@
49#define DRV_VERSION "0.9" 49#define DRV_VERSION "0.9"
50 50
51enum { 51enum {
52 /*
53 * host flags
54 */
52 SIL_FLAG_RERR_ON_DMA_ACT = (1 << 29), 55 SIL_FLAG_RERR_ON_DMA_ACT = (1 << 29),
53 SIL_FLAG_MOD15WRITE = (1 << 30), 56 SIL_FLAG_MOD15WRITE = (1 << 30),
57 SIL_DFL_HOST_FLAGS = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY |
58 ATA_FLAG_MMIO,
54 59
60 /*
61 * Controller IDs
62 */
55 sil_3112 = 0, 63 sil_3112 = 0,
56 sil_3112_m15w = 1, 64 sil_3512 = 1,
57 sil_3512 = 2, 65 sil_3114 = 2,
58 sil_3114 = 3,
59
60 SIL_FIFO_R0 = 0x40,
61 SIL_FIFO_W0 = 0x41,
62 SIL_FIFO_R1 = 0x44,
63 SIL_FIFO_W1 = 0x45,
64 SIL_FIFO_R2 = 0x240,
65 SIL_FIFO_W2 = 0x241,
66 SIL_FIFO_R3 = 0x244,
67 SIL_FIFO_W3 = 0x245,
68 66
67 /*
68 * Register offsets
69 */
69 SIL_SYSCFG = 0x48, 70 SIL_SYSCFG = 0x48,
71
72 /*
73 * Register bits
74 */
75 /* SYSCFG */
70 SIL_MASK_IDE0_INT = (1 << 22), 76 SIL_MASK_IDE0_INT = (1 << 22),
71 SIL_MASK_IDE1_INT = (1 << 23), 77 SIL_MASK_IDE1_INT = (1 << 23),
72 SIL_MASK_IDE2_INT = (1 << 24), 78 SIL_MASK_IDE2_INT = (1 << 24),
@@ -75,9 +81,12 @@ enum {
75 SIL_MASK_4PORT = SIL_MASK_2PORT | 81 SIL_MASK_4PORT = SIL_MASK_2PORT |
76 SIL_MASK_IDE2_INT | SIL_MASK_IDE3_INT, 82 SIL_MASK_IDE2_INT | SIL_MASK_IDE3_INT,
77 83
78 SIL_IDE2_BMDMA = 0x200, 84 /* BMDMA/BMDMA2 */
79
80 SIL_INTR_STEERING = (1 << 1), 85 SIL_INTR_STEERING = (1 << 1),
86
87 /*
88 * Others
89 */
81 SIL_QUIRK_MOD15WRITE = (1 << 0), 90 SIL_QUIRK_MOD15WRITE = (1 << 0),
82 SIL_QUIRK_UDMA5MAX = (1 << 1), 91 SIL_QUIRK_UDMA5MAX = (1 << 1),
83}; 92};
@@ -90,13 +99,13 @@ static void sil_post_set_mode (struct ata_port *ap);
90 99
91 100
92static const struct pci_device_id sil_pci_tbl[] = { 101static const struct pci_device_id sil_pci_tbl[] = {
93 { 0x1095, 0x3112, PCI_ANY_ID, PCI_ANY_ID, 0, 0, sil_3112_m15w }, 102 { 0x1095, 0x3112, PCI_ANY_ID, PCI_ANY_ID, 0, 0, sil_3112 },
94 { 0x1095, 0x0240, PCI_ANY_ID, PCI_ANY_ID, 0, 0, sil_3112_m15w }, 103 { 0x1095, 0x0240, PCI_ANY_ID, PCI_ANY_ID, 0, 0, sil_3112 },
95 { 0x1095, 0x3512, PCI_ANY_ID, PCI_ANY_ID, 0, 0, sil_3512 }, 104 { 0x1095, 0x3512, PCI_ANY_ID, PCI_ANY_ID, 0, 0, sil_3512 },
96 { 0x1095, 0x3114, PCI_ANY_ID, PCI_ANY_ID, 0, 0, sil_3114 }, 105 { 0x1095, 0x3114, PCI_ANY_ID, PCI_ANY_ID, 0, 0, sil_3114 },
97 { 0x1002, 0x436e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, sil_3112_m15w }, 106 { 0x1002, 0x436e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, sil_3112 },
98 { 0x1002, 0x4379, PCI_ANY_ID, PCI_ANY_ID, 0, 0, sil_3112_m15w }, 107 { 0x1002, 0x4379, PCI_ANY_ID, PCI_ANY_ID, 0, 0, sil_3112 },
99 { 0x1002, 0x437a, PCI_ANY_ID, PCI_ANY_ID, 0, 0, sil_3112_m15w }, 108 { 0x1002, 0x437a, PCI_ANY_ID, PCI_ANY_ID, 0, 0, sil_3112 },
100 { } /* terminate list */ 109 { } /* terminate list */
101}; 110};
102 111
@@ -181,18 +190,7 @@ static const struct ata_port_info sil_port_info[] = {
181 /* sil_3112 */ 190 /* sil_3112 */
182 { 191 {
183 .sht = &sil_sht, 192 .sht = &sil_sht,
184 .host_flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY | 193 .host_flags = SIL_DFL_HOST_FLAGS | SIL_FLAG_MOD15WRITE,
185 ATA_FLAG_MMIO,
186 .pio_mask = 0x1f, /* pio0-4 */
187 .mwdma_mask = 0x07, /* mwdma0-2 */
188 .udma_mask = 0x3f, /* udma0-5 */
189 .port_ops = &sil_ops,
190 },
191 /* sil_3112_15w - keep it sync'd w/ sil_3112 */
192 {
193 .sht = &sil_sht,
194 .host_flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY |
195 ATA_FLAG_MMIO | SIL_FLAG_MOD15WRITE,
196 .pio_mask = 0x1f, /* pio0-4 */ 194 .pio_mask = 0x1f, /* pio0-4 */
197 .mwdma_mask = 0x07, /* mwdma0-2 */ 195 .mwdma_mask = 0x07, /* mwdma0-2 */
198 .udma_mask = 0x3f, /* udma0-5 */ 196 .udma_mask = 0x3f, /* udma0-5 */
@@ -201,9 +199,7 @@ static const struct ata_port_info sil_port_info[] = {
201 /* sil_3512 */ 199 /* sil_3512 */
202 { 200 {
203 .sht = &sil_sht, 201 .sht = &sil_sht,
204 .host_flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY | 202 .host_flags = SIL_DFL_HOST_FLAGS | SIL_FLAG_RERR_ON_DMA_ACT,
205 ATA_FLAG_MMIO |
206 SIL_FLAG_RERR_ON_DMA_ACT,
207 .pio_mask = 0x1f, /* pio0-4 */ 203 .pio_mask = 0x1f, /* pio0-4 */
208 .mwdma_mask = 0x07, /* mwdma0-2 */ 204 .mwdma_mask = 0x07, /* mwdma0-2 */
209 .udma_mask = 0x3f, /* udma0-5 */ 205 .udma_mask = 0x3f, /* udma0-5 */
@@ -212,9 +208,7 @@ static const struct ata_port_info sil_port_info[] = {
212 /* sil_3114 */ 208 /* sil_3114 */
213 { 209 {
214 .sht = &sil_sht, 210 .sht = &sil_sht,
215 .host_flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY | 211 .host_flags = SIL_DFL_HOST_FLAGS | SIL_FLAG_RERR_ON_DMA_ACT,
216 ATA_FLAG_MMIO |
217 SIL_FLAG_RERR_ON_DMA_ACT,
218 .pio_mask = 0x1f, /* pio0-4 */ 212 .pio_mask = 0x1f, /* pio0-4 */
219 .mwdma_mask = 0x07, /* mwdma0-2 */ 213 .mwdma_mask = 0x07, /* mwdma0-2 */
220 .udma_mask = 0x3f, /* udma0-5 */ 214 .udma_mask = 0x3f, /* udma0-5 */
@@ -228,16 +222,17 @@ static const struct {
228 unsigned long tf; /* ATA taskfile register block */ 222 unsigned long tf; /* ATA taskfile register block */
229 unsigned long ctl; /* ATA control/altstatus register block */ 223 unsigned long ctl; /* ATA control/altstatus register block */
230 unsigned long bmdma; /* DMA register block */ 224 unsigned long bmdma; /* DMA register block */
225 unsigned long fifo_cfg; /* FIFO Valid Byte Count and Control */
231 unsigned long scr; /* SATA control register block */ 226 unsigned long scr; /* SATA control register block */
232 unsigned long sien; /* SATA Interrupt Enable register */ 227 unsigned long sien; /* SATA Interrupt Enable register */
233 unsigned long xfer_mode;/* data transfer mode register */ 228 unsigned long xfer_mode;/* data transfer mode register */
234 unsigned long sfis_cfg; /* SATA FIS reception config register */ 229 unsigned long sfis_cfg; /* SATA FIS reception config register */
235} sil_port[] = { 230} sil_port[] = {
236 /* port 0 ... */ 231 /* port 0 ... */
237 { 0x80, 0x8A, 0x00, 0x100, 0x148, 0xb4, 0x14c }, 232 { 0x80, 0x8A, 0x00, 0x40, 0x100, 0x148, 0xb4, 0x14c },
238 { 0xC0, 0xCA, 0x08, 0x180, 0x1c8, 0xf4, 0x1cc }, 233 { 0xC0, 0xCA, 0x08, 0x44, 0x180, 0x1c8, 0xf4, 0x1cc },
239 { 0x280, 0x28A, 0x200, 0x300, 0x348, 0x2b4, 0x34c }, 234 { 0x280, 0x28A, 0x200, 0x240, 0x300, 0x348, 0x2b4, 0x34c },
240 { 0x2C0, 0x2CA, 0x208, 0x380, 0x3c8, 0x2f4, 0x3cc }, 235 { 0x2C0, 0x2CA, 0x208, 0x244, 0x380, 0x3c8, 0x2f4, 0x3cc },
241 /* ... port 3 */ 236 /* ... port 3 */
242}; 237};
243 238
@@ -418,13 +413,12 @@ static int sil_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
418 if (rc) 413 if (rc)
419 goto err_out_regions; 414 goto err_out_regions;
420 415
421 probe_ent = kmalloc(sizeof(*probe_ent), GFP_KERNEL); 416 probe_ent = kzalloc(sizeof(*probe_ent), GFP_KERNEL);
422 if (probe_ent == NULL) { 417 if (probe_ent == NULL) {
423 rc = -ENOMEM; 418 rc = -ENOMEM;
424 goto err_out_regions; 419 goto err_out_regions;
425 } 420 }
426 421
427 memset(probe_ent, 0, sizeof(*probe_ent));
428 INIT_LIST_HEAD(&probe_ent->node); 422 INIT_LIST_HEAD(&probe_ent->node);
429 probe_ent->dev = pci_dev_to_dev(pdev); 423 probe_ent->dev = pci_dev_to_dev(pdev);
430 probe_ent->port_ops = sil_port_info[ent->driver_data].port_ops; 424 probe_ent->port_ops = sil_port_info[ent->driver_data].port_ops;
@@ -461,19 +455,12 @@ static int sil_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
461 if (cls) { 455 if (cls) {
462 cls >>= 3; 456 cls >>= 3;
463 cls++; /* cls = (line_size/8)+1 */ 457 cls++; /* cls = (line_size/8)+1 */
464 writeb(cls, mmio_base + SIL_FIFO_R0); 458 for (i = 0; i < probe_ent->n_ports; i++)
465 writeb(cls, mmio_base + SIL_FIFO_W0); 459 writew(cls << 8 | cls,
466 writeb(cls, mmio_base + SIL_FIFO_R1); 460 mmio_base + sil_port[i].fifo_cfg);
467 writeb(cls, mmio_base + SIL_FIFO_W1);
468 if (ent->driver_data == sil_3114) {
469 writeb(cls, mmio_base + SIL_FIFO_R2);
470 writeb(cls, mmio_base + SIL_FIFO_W2);
471 writeb(cls, mmio_base + SIL_FIFO_R3);
472 writeb(cls, mmio_base + SIL_FIFO_W3);
473 }
474 } else 461 } else
475 dev_printk(KERN_WARNING, &pdev->dev, 462 dev_printk(KERN_WARNING, &pdev->dev,
476 "cache line size not set. Driver may not function\n"); 463 "cache line size not set. Driver may not function\n");
477 464
478 /* Apply R_ERR on DMA activate FIS errata workaround */ 465 /* Apply R_ERR on DMA activate FIS errata workaround */
479 if (probe_ent->host_flags & SIL_FLAG_RERR_ON_DMA_ACT) { 466 if (probe_ent->host_flags & SIL_FLAG_RERR_ON_DMA_ACT) {
@@ -496,10 +483,10 @@ static int sil_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
496 irq_mask = SIL_MASK_4PORT; 483 irq_mask = SIL_MASK_4PORT;
497 484
498 /* flip the magic "make 4 ports work" bit */ 485 /* flip the magic "make 4 ports work" bit */
499 tmp = readl(mmio_base + SIL_IDE2_BMDMA); 486 tmp = readl(mmio_base + sil_port[2].bmdma);
500 if ((tmp & SIL_INTR_STEERING) == 0) 487 if ((tmp & SIL_INTR_STEERING) == 0)
501 writel(tmp | SIL_INTR_STEERING, 488 writel(tmp | SIL_INTR_STEERING,
502 mmio_base + SIL_IDE2_BMDMA); 489 mmio_base + sil_port[2].bmdma);
503 490
504 } else { 491 } else {
505 irq_mask = SIL_MASK_2PORT; 492 irq_mask = SIL_MASK_2PORT;
diff --git a/drivers/scsi/sata_sil24.c b/drivers/scsi/sata_sil24.c
index 5c5822e33a49..8fb62427be84 100644
--- a/drivers/scsi/sata_sil24.c
+++ b/drivers/scsi/sata_sil24.c
@@ -892,6 +892,7 @@ static int sil24_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
892 probe_ent->sht = pinfo->sht; 892 probe_ent->sht = pinfo->sht;
893 probe_ent->host_flags = pinfo->host_flags; 893 probe_ent->host_flags = pinfo->host_flags;
894 probe_ent->pio_mask = pinfo->pio_mask; 894 probe_ent->pio_mask = pinfo->pio_mask;
895 probe_ent->mwdma_mask = pinfo->mwdma_mask;
895 probe_ent->udma_mask = pinfo->udma_mask; 896 probe_ent->udma_mask = pinfo->udma_mask;
896 probe_ent->port_ops = pinfo->port_ops; 897 probe_ent->port_ops = pinfo->port_ops;
897 probe_ent->n_ports = SIL24_FLAG2NPORTS(pinfo->host_flags); 898 probe_ent->n_ports = SIL24_FLAG2NPORTS(pinfo->host_flags);
diff --git a/drivers/scsi/sr_ioctl.c b/drivers/scsi/sr_ioctl.c
index 5d02ff4db6cc..b65462f76484 100644
--- a/drivers/scsi/sr_ioctl.c
+++ b/drivers/scsi/sr_ioctl.c
@@ -192,7 +192,7 @@ int sr_do_ioctl(Scsi_CD *cd, struct packet_command *cgc)
192 SDev = cd->device; 192 SDev = cd->device;
193 193
194 if (!sense) { 194 if (!sense) {
195 sense = kmalloc(sizeof(*sense), GFP_KERNEL); 195 sense = kmalloc(SCSI_SENSE_BUFFERSIZE, GFP_KERNEL);
196 if (!sense) { 196 if (!sense) {
197 err = -ENOMEM; 197 err = -ENOMEM;
198 goto out; 198 goto out;
diff --git a/drivers/serial/ioc4_serial.c b/drivers/serial/ioc4_serial.c
index f3763d2ccb86..a37579ce6d76 100644
--- a/drivers/serial/ioc4_serial.c
+++ b/drivers/serial/ioc4_serial.c
@@ -2301,7 +2301,6 @@ static void receive_chars(struct uart_port *the_port)
2301 int read_count, request_count = IOC4_MAX_CHARS; 2301 int read_count, request_count = IOC4_MAX_CHARS;
2302 struct uart_icount *icount; 2302 struct uart_icount *icount;
2303 struct uart_info *info = the_port->info; 2303 struct uart_info *info = the_port->info;
2304 int flip = 0;
2305 unsigned long pflags; 2304 unsigned long pflags;
2306 2305
2307 /* Make sure all the pointers are "good" ones */ 2306 /* Make sure all the pointers are "good" ones */
@@ -2313,7 +2312,7 @@ static void receive_chars(struct uart_port *the_port)
2313 spin_lock_irqsave(&the_port->lock, pflags); 2312 spin_lock_irqsave(&the_port->lock, pflags);
2314 tty = info->tty; 2313 tty = info->tty;
2315 2314
2316 request_count = tty_buffer_request_room(tty, IOC4_MAX_CHARS - 2); 2315 request_count = tty_buffer_request_room(tty, IOC4_MAX_CHARS);
2317 2316
2318 if (request_count > 0) { 2317 if (request_count > 0) {
2319 icount = &the_port->icount; 2318 icount = &the_port->icount;
@@ -2326,8 +2325,7 @@ static void receive_chars(struct uart_port *the_port)
2326 2325
2327 spin_unlock_irqrestore(&the_port->lock, pflags); 2326 spin_unlock_irqrestore(&the_port->lock, pflags);
2328 2327
2329 if (flip) 2328 tty_flip_buffer_push(tty);
2330 tty_flip_buffer_push(tty);
2331} 2329}
2332 2330
2333/** 2331/**
diff --git a/drivers/serial/ip22zilog.c b/drivers/serial/ip22zilog.c
index 419dd3cd7862..193722d680cf 100644
--- a/drivers/serial/ip22zilog.c
+++ b/drivers/serial/ip22zilog.c
@@ -420,10 +420,8 @@ static void ip22zilog_transmit_chars(struct uart_ip22zilog_port *up,
420 if (up->port.info == NULL) 420 if (up->port.info == NULL)
421 goto ack_tx_int; 421 goto ack_tx_int;
422 xmit = &up->port.info->xmit; 422 xmit = &up->port.info->xmit;
423 if (uart_circ_empty(xmit)) { 423 if (uart_circ_empty(xmit))
424 uart_write_wakeup(&up->port);
425 goto ack_tx_int; 424 goto ack_tx_int;
426 }
427 if (uart_tx_stopped(&up->port)) 425 if (uart_tx_stopped(&up->port))
428 goto ack_tx_int; 426 goto ack_tx_int;
429 427
diff --git a/drivers/serial/serial_core.c b/drivers/serial/serial_core.c
index 95fb4939c675..cc1faa31d124 100644
--- a/drivers/serial/serial_core.c
+++ b/drivers/serial/serial_core.c
@@ -71,6 +71,11 @@ static void uart_change_pm(struct uart_state *state, int pm_state);
71void uart_write_wakeup(struct uart_port *port) 71void uart_write_wakeup(struct uart_port *port)
72{ 72{
73 struct uart_info *info = port->info; 73 struct uart_info *info = port->info;
74 /*
75 * This means you called this function _after_ the port was
76 * closed. No cookie for you.
77 */
78 BUG_ON(!info);
74 tasklet_schedule(&info->tlet); 79 tasklet_schedule(&info->tlet);
75} 80}
76 81
@@ -471,14 +476,26 @@ static void uart_flush_chars(struct tty_struct *tty)
471} 476}
472 477
473static int 478static int
474uart_write(struct tty_struct *tty, const unsigned char * buf, int count) 479uart_write(struct tty_struct *tty, const unsigned char *buf, int count)
475{ 480{
476 struct uart_state *state = tty->driver_data; 481 struct uart_state *state = tty->driver_data;
477 struct uart_port *port = state->port; 482 struct uart_port *port;
478 struct circ_buf *circ = &state->info->xmit; 483 struct circ_buf *circ;
479 unsigned long flags; 484 unsigned long flags;
480 int c, ret = 0; 485 int c, ret = 0;
481 486
487 /*
488 * This means you called this function _after_ the port was
489 * closed. No cookie for you.
490 */
491 if (!state || !state->info) {
492 WARN_ON(1);
493 return -EL3HLT;
494 }
495
496 port = state->port;
497 circ = &state->info->xmit;
498
482 if (!circ->buf) 499 if (!circ->buf)
483 return 0; 500 return 0;
484 501
@@ -521,6 +538,15 @@ static void uart_flush_buffer(struct tty_struct *tty)
521 struct uart_port *port = state->port; 538 struct uart_port *port = state->port;
522 unsigned long flags; 539 unsigned long flags;
523 540
541 /*
542 * This means you called this function _after_ the port was
543 * closed. No cookie for you.
544 */
545 if (!state || !state->info) {
546 WARN_ON(1);
547 return;
548 }
549
524 DPRINTK("uart_flush_buffer(%d) called\n", tty->index); 550 DPRINTK("uart_flush_buffer(%d) called\n", tty->index);
525 551
526 spin_lock_irqsave(&port->lock, flags); 552 spin_lock_irqsave(&port->lock, flags);
diff --git a/drivers/serial/sn_console.c b/drivers/serial/sn_console.c
index 43e67d6c29d4..60ea4a3f0713 100644
--- a/drivers/serial/sn_console.c
+++ b/drivers/serial/sn_console.c
@@ -820,7 +820,7 @@ static int __init sn_sal_module_init(void)
820 int retval; 820 int retval;
821 821
822 if (!ia64_platform_is("sn2")) 822 if (!ia64_platform_is("sn2"))
823 return -ENODEV; 823 return 0;
824 824
825 printk(KERN_INFO "sn_console: Console driver init\n"); 825 printk(KERN_INFO "sn_console: Console driver init\n");
826 826
diff --git a/drivers/usb/serial/usb-serial.c b/drivers/usb/serial/usb-serial.c
index 4dd6865d32b0..b5c96e74a903 100644
--- a/drivers/usb/serial/usb-serial.c
+++ b/drivers/usb/serial/usb-serial.c
@@ -242,8 +242,10 @@ static void serial_close(struct tty_struct *tty, struct file * filp)
242 242
243 down(&port->sem); 243 down(&port->sem);
244 244
245 if (port->open_count == 0) 245 if (port->open_count == 0) {
246 goto out; 246 up(&port->sem);
247 return;
248 }
247 249
248 --port->open_count; 250 --port->open_count;
249 if (port->open_count == 0) { 251 if (port->open_count == 0) {
@@ -260,10 +262,8 @@ static void serial_close(struct tty_struct *tty, struct file * filp)
260 module_put(port->serial->type->driver.owner); 262 module_put(port->serial->type->driver.owner);
261 } 263 }
262 264
263 kref_put(&port->serial->kref, destroy_serial);
264
265out:
266 up(&port->sem); 265 up(&port->sem);
266 kref_put(&port->serial->kref, destroy_serial);
267} 267}
268 268
269static int serial_write (struct tty_struct * tty, const unsigned char *buf, int count) 269static int serial_write (struct tty_struct * tty, const unsigned char *buf, int count)
diff --git a/drivers/video/arcfb.c b/drivers/video/arcfb.c
index df8e5667b348..466042808daf 100644
--- a/drivers/video/arcfb.c
+++ b/drivers/video/arcfb.c
@@ -253,7 +253,7 @@ static void arcfb_lcd_update_page(struct arcfb_par *par, unsigned int upper,
253{ 253{
254 unsigned char *src; 254 unsigned char *src;
255 unsigned int xindex, yindex, chipindex, linesize; 255 unsigned int xindex, yindex, chipindex, linesize;
256 int i, count; 256 int i;
257 unsigned char val; 257 unsigned char val;
258 unsigned char bitmask, rightshift; 258 unsigned char bitmask, rightshift;
259 259
@@ -282,7 +282,6 @@ static void arcfb_lcd_update_page(struct arcfb_par *par, unsigned int upper,
282 } 282 }
283 ks108_writeb_data(par, chipindex, val); 283 ks108_writeb_data(par, chipindex, val);
284 left++; 284 left++;
285 count++;
286 if (bitmask == 0x80) { 285 if (bitmask == 0x80) {
287 bitmask = 1; 286 bitmask = 1;
288 src++; 287 src++;
@@ -460,11 +459,11 @@ static ssize_t arcfb_write(struct file *file, const char __user *buf, size_t cou
460 inode = file->f_dentry->d_inode; 459 inode = file->f_dentry->d_inode;
461 fbidx = iminor(inode); 460 fbidx = iminor(inode);
462 info = registered_fb[fbidx]; 461 info = registered_fb[fbidx];
463 par = info->par;
464 462
465 if (!info || !info->screen_base) 463 if (!info || !info->screen_base)
466 return -ENODEV; 464 return -ENODEV;
467 465
466 par = info->par;
468 xres = info->var.xres; 467 xres = info->var.xres;
469 fbmemlength = (xres * info->var.yres)/8; 468 fbmemlength = (xres * info->var.yres)/8;
470 469
diff --git a/drivers/video/aty/aty128fb.c b/drivers/video/aty/aty128fb.c
index bfc8a93b2c73..620c9a934e0e 100644
--- a/drivers/video/aty/aty128fb.c
+++ b/drivers/video/aty/aty128fb.c
@@ -1326,7 +1326,7 @@ static int aty128_var_to_pll(u32 period_in_ps, struct aty128_pll *pll,
1326 unsigned char post_dividers[] = {1,2,4,8,3,6,12}; 1326 unsigned char post_dividers[] = {1,2,4,8,3,6,12};
1327 u32 output_freq; 1327 u32 output_freq;
1328 u32 vclk; /* in .01 MHz */ 1328 u32 vclk; /* in .01 MHz */
1329 int i; 1329 int i = 0;
1330 u32 n, d; 1330 u32 n, d;
1331 1331
1332 vclk = 100000000 / period_in_ps; /* convert units to 10 kHz */ 1332 vclk = 100000000 / period_in_ps; /* convert units to 10 kHz */
@@ -1340,15 +1340,16 @@ static int aty128_var_to_pll(u32 period_in_ps, struct aty128_pll *pll,
1340 /* now, find an acceptable divider */ 1340 /* now, find an acceptable divider */
1341 for (i = 0; i < sizeof(post_dividers); i++) { 1341 for (i = 0; i < sizeof(post_dividers); i++) {
1342 output_freq = post_dividers[i] * vclk; 1342 output_freq = post_dividers[i] * vclk;
1343 if (output_freq >= c.ppll_min && output_freq <= c.ppll_max) 1343 if (output_freq >= c.ppll_min && output_freq <= c.ppll_max) {
1344 pll->post_divider = post_dividers[i];
1344 break; 1345 break;
1346 }
1345 } 1347 }
1346 1348
1347 /* calculate feedback divider */ 1349 /* calculate feedback divider */
1348 n = c.ref_divider * output_freq; 1350 n = c.ref_divider * output_freq;
1349 d = c.ref_clk; 1351 d = c.ref_clk;
1350 1352
1351 pll->post_divider = post_dividers[i];
1352 pll->feedback_divider = round_div(n, d); 1353 pll->feedback_divider = round_div(n, d);
1353 pll->vclk = vclk; 1354 pll->vclk = vclk;
1354 1355
diff --git a/drivers/video/aty/radeon_monitor.c b/drivers/video/aty/radeon_monitor.c
index 7f9838dceab5..98c05bc0de44 100644
--- a/drivers/video/aty/radeon_monitor.c
+++ b/drivers/video/aty/radeon_monitor.c
@@ -396,6 +396,10 @@ static int __devinit radeon_parse_monitor_layout(struct radeonfb_info *rinfo,
396 s1[i] = *s; 396 s1[i] = *s;
397 i++; 397 i++;
398 } 398 }
399
400 if (i > 4)
401 i = 4;
402
399 } while (*s++); 403 } while (*s++);
400 if (second) 404 if (second)
401 s2[i] = 0; 405 s2[i] = 0;
diff --git a/drivers/video/backlight/backlight.c b/drivers/video/backlight/backlight.c
index bd39bbd88d41..151fda8dded0 100644
--- a/drivers/video/backlight/backlight.c
+++ b/drivers/video/backlight/backlight.c
@@ -172,7 +172,7 @@ struct backlight_device *backlight_device_register(const char *name, void *devda
172 172
173 new_bd = kmalloc(sizeof(struct backlight_device), GFP_KERNEL); 173 new_bd = kmalloc(sizeof(struct backlight_device), GFP_KERNEL);
174 if (unlikely(!new_bd)) 174 if (unlikely(!new_bd))
175 return ERR_PTR(ENOMEM); 175 return ERR_PTR(-ENOMEM);
176 176
177 init_MUTEX(&new_bd->sem); 177 init_MUTEX(&new_bd->sem);
178 new_bd->props = bp; 178 new_bd->props = bp;
diff --git a/drivers/video/backlight/lcd.c b/drivers/video/backlight/lcd.c
index 9e32485ee7bb..86908a60c630 100644
--- a/drivers/video/backlight/lcd.c
+++ b/drivers/video/backlight/lcd.c
@@ -171,7 +171,7 @@ struct lcd_device *lcd_device_register(const char *name, void *devdata,
171 171
172 new_ld = kmalloc(sizeof(struct lcd_device), GFP_KERNEL); 172 new_ld = kmalloc(sizeof(struct lcd_device), GFP_KERNEL);
173 if (unlikely(!new_ld)) 173 if (unlikely(!new_ld))
174 return ERR_PTR(ENOMEM); 174 return ERR_PTR(-ENOMEM);
175 175
176 init_MUTEX(&new_ld->sem); 176 init_MUTEX(&new_ld->sem);
177 new_ld->props = lp; 177 new_ld->props = lp;
diff --git a/drivers/video/imsttfb.c b/drivers/video/imsttfb.c
index ad416ae47596..7db42542eb19 100644
--- a/drivers/video/imsttfb.c
+++ b/drivers/video/imsttfb.c
@@ -1510,6 +1510,8 @@ imsttfb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
1510 default: 1510 default:
1511 printk(KERN_INFO "imsttfb: Device 0x%x unknown, " 1511 printk(KERN_INFO "imsttfb: Device 0x%x unknown, "
1512 "contact maintainer.\n", pdev->device); 1512 "contact maintainer.\n", pdev->device);
1513 release_mem_region(addr, size);
1514 framebuffer_release(info);
1513 return -ENODEV; 1515 return -ENODEV;
1514 } 1516 }
1515 1517
diff --git a/drivers/video/intelfb/intelfbdrv.c b/drivers/video/intelfb/intelfbdrv.c
index 6b8bd3cdf9c0..995b47c165a7 100644
--- a/drivers/video/intelfb/intelfbdrv.c
+++ b/drivers/video/intelfb/intelfbdrv.c
@@ -1333,33 +1333,35 @@ intelfb_setcolreg(unsigned regno, unsigned red, unsigned green,
1333 if (regno > 255) 1333 if (regno > 255)
1334 return 1; 1334 return 1;
1335 1335
1336 switch (dinfo->depth) { 1336 if (dinfo->depth == 8) {
1337 case 8: 1337 red >>= 8;
1338 { 1338 green >>= 8;
1339 red >>= 8; 1339 blue >>= 8;
1340 green >>= 8; 1340
1341 blue >>= 8; 1341 intelfbhw_setcolreg(dinfo, regno, red, green, blue,
1342 transp);
1343 }
1342 1344
1343 intelfbhw_setcolreg(dinfo, regno, red, green, blue, 1345 if (regno < 16) {
1344 transp); 1346 switch (dinfo->depth) {
1347 case 15:
1348 dinfo->pseudo_palette[regno] = ((red & 0xf800) >> 1) |
1349 ((green & 0xf800) >> 6) |
1350 ((blue & 0xf800) >> 11);
1351 break;
1352 case 16:
1353 dinfo->pseudo_palette[regno] = (red & 0xf800) |
1354 ((green & 0xfc00) >> 5) |
1355 ((blue & 0xf800) >> 11);
1356 break;
1357 case 24:
1358 dinfo->pseudo_palette[regno] = ((red & 0xff00) << 8) |
1359 (green & 0xff00) |
1360 ((blue & 0xff00) >> 8);
1361 break;
1345 } 1362 }
1346 break;
1347 case 15:
1348 dinfo->pseudo_palette[regno] = ((red & 0xf800) >> 1) |
1349 ((green & 0xf800) >> 6) |
1350 ((blue & 0xf800) >> 11);
1351 break;
1352 case 16:
1353 dinfo->pseudo_palette[regno] = (red & 0xf800) |
1354 ((green & 0xfc00) >> 5) |
1355 ((blue & 0xf800) >> 11);
1356 break;
1357 case 24:
1358 dinfo->pseudo_palette[regno] = ((red & 0xff00) << 8) |
1359 (green & 0xff00) |
1360 ((blue & 0xff00) >> 8);
1361 break;
1362 } 1363 }
1364
1363 return 0; 1365 return 0;
1364} 1366}
1365 1367
diff --git a/drivers/video/kyro/STG4000VTG.c b/drivers/video/kyro/STG4000VTG.c
index 3690b04190af..bd389709d234 100644
--- a/drivers/video/kyro/STG4000VTG.c
+++ b/drivers/video/kyro/STG4000VTG.c
@@ -17,7 +17,7 @@
17void DisableVGA(volatile STG4000REG __iomem *pSTGReg) 17void DisableVGA(volatile STG4000REG __iomem *pSTGReg)
18{ 18{
19 u32 tmp; 19 u32 tmp;
20 volatile u32 count, i; 20 volatile u32 count = 0, i;
21 21
22 /* Reset the VGA registers */ 22 /* Reset the VGA registers */
23 tmp = STG_READ_REG(SoftwareReset); 23 tmp = STG_READ_REG(SoftwareReset);
diff --git a/drivers/video/neofb.c b/drivers/video/neofb.c
index a2e201dc40f7..b961d5601bd9 100644
--- a/drivers/video/neofb.c
+++ b/drivers/video/neofb.c
@@ -486,10 +486,8 @@ static void vgaHWRestore(const struct fb_info *info,
486static inline int neo2200_sync(struct fb_info *info) 486static inline int neo2200_sync(struct fb_info *info)
487{ 487{
488 struct neofb_par *par = info->par; 488 struct neofb_par *par = info->par;
489 int waitcycles;
490 489
491 while (readl(&par->neo2200->bltStat) & 1) 490 while (readl(&par->neo2200->bltStat) & 1);
492 waitcycles++;
493 return 0; 491 return 0;
494} 492}
495 493
diff --git a/drivers/video/s1d13xxxfb.c b/drivers/video/s1d13xxxfb.c
index e5d0f92eeae3..feec47bdd479 100644
--- a/drivers/video/s1d13xxxfb.c
+++ b/drivers/video/s1d13xxxfb.c
@@ -588,6 +588,7 @@ s1d13xxxfb_probe(struct platform_device *pdev)
588 goto bail; 588 goto bail;
589 } 589 }
590 590
591 platform_set_drvdata(pdev, info);
591 default_par = info->par; 592 default_par = info->par;
592 default_par->regs = ioremap_nocache(pdev->resource[1].start, 593 default_par->regs = ioremap_nocache(pdev->resource[1].start,
593 pdev->resource[1].end - pdev->resource[1].start +1); 594 pdev->resource[1].end - pdev->resource[1].start +1);
@@ -638,8 +639,6 @@ s1d13xxxfb_probe(struct platform_device *pdev)
638 goto bail; 639 goto bail;
639 } 640 }
640 641
641 platform_set_drvdata(pdev, info);
642
643 printk(KERN_INFO "fb%d: %s frame buffer device\n", 642 printk(KERN_INFO "fb%d: %s frame buffer device\n",
644 info->node, info->fix.id); 643 info->node, info->fix.id);
645 644
diff --git a/drivers/video/savage/savagefb_driver.c b/drivers/video/savage/savagefb_driver.c
index ab727eaa7f43..10e6b3aab9ea 100644
--- a/drivers/video/savage/savagefb_driver.c
+++ b/drivers/video/savage/savagefb_driver.c
@@ -2021,8 +2021,8 @@ static int __devinit savagefb_probe (struct pci_dev* dev,
2021#if defined(CONFIG_FB_SAVAGE_I2C) 2021#if defined(CONFIG_FB_SAVAGE_I2C)
2022 savagefb_create_i2c_busses(info); 2022 savagefb_create_i2c_busses(info);
2023 savagefb_probe_i2c_connector(info, &par->edid); 2023 savagefb_probe_i2c_connector(info, &par->edid);
2024 kfree(par->edid);
2025 fb_edid_to_monspecs(par->edid, &info->monspecs); 2024 fb_edid_to_monspecs(par->edid, &info->monspecs);
2025 kfree(par->edid);
2026 fb_videomode_to_modelist(info->monspecs.modedb, 2026 fb_videomode_to_modelist(info->monspecs.modedb,
2027 info->monspecs.modedb_len, 2027 info->monspecs.modedb_len,
2028 &info->modelist); 2028 &info->modelist);
diff --git a/drivers/video/tdfxfb.c b/drivers/video/tdfxfb.c
index 3e7baf4c9fa8..5e5328d682db 100644
--- a/drivers/video/tdfxfb.c
+++ b/drivers/video/tdfxfb.c
@@ -786,28 +786,32 @@ static int tdfxfb_setcolreg(unsigned regno, unsigned red, unsigned green,
786 if (regno >= info->cmap.len || regno > 255) return 1; 786 if (regno >= info->cmap.len || regno > 255) return 1;
787 787
788 switch (info->fix.visual) { 788 switch (info->fix.visual) {
789 case FB_VISUAL_PSEUDOCOLOR: 789 case FB_VISUAL_PSEUDOCOLOR:
790 rgbcol =(((u32)red & 0xff00) << 8) | 790 rgbcol =(((u32)red & 0xff00) << 8) |
791 (((u32)green & 0xff00) << 0) | 791 (((u32)green & 0xff00) << 0) |
792 (((u32)blue & 0xff00) >> 8); 792 (((u32)blue & 0xff00) >> 8);
793 do_setpalentry(par, regno, rgbcol); 793 do_setpalentry(par, regno, rgbcol);
794 break; 794 break;
795 /* Truecolor has no hardware color palettes. */ 795 /* Truecolor has no hardware color palettes. */
796 case FB_VISUAL_TRUECOLOR: 796 case FB_VISUAL_TRUECOLOR:
797 if (regno < 16) {
797 rgbcol = (CNVT_TOHW( red, info->var.red.length) << 798 rgbcol = (CNVT_TOHW( red, info->var.red.length) <<
798 info->var.red.offset) | 799 info->var.red.offset) |
799 (CNVT_TOHW( green, info->var.green.length) << 800 (CNVT_TOHW( green, info->var.green.length) <<
800 info->var.green.offset) | 801 info->var.green.offset) |
801 (CNVT_TOHW( blue, info->var.blue.length) << 802 (CNVT_TOHW( blue, info->var.blue.length) <<
802 info->var.blue.offset) | 803 info->var.blue.offset) |
803 (CNVT_TOHW( transp, info->var.transp.length) << 804 (CNVT_TOHW( transp, info->var.transp.length) <<
804 info->var.transp.offset); 805 info->var.transp.offset);
805 par->palette[regno] = rgbcol; 806 par->palette[regno] = rgbcol;
806 break; 807 }
807 default: 808
808 DPRINTK("bad depth %u\n", info->var.bits_per_pixel); 809 break;
809 break; 810 default:
811 DPRINTK("bad depth %u\n", info->var.bits_per_pixel);
812 break;
810 } 813 }
814
811 return 0; 815 return 0;
812} 816}
813 817
diff --git a/fs/9p/9p.c b/fs/9p/9p.c
index 1a6d08761f39..f86a28d1d6a6 100644
--- a/fs/9p/9p.c
+++ b/fs/9p/9p.c
@@ -111,7 +111,6 @@ static void v9fs_t_clunk_cb(void *a, struct v9fs_fcall *tc,
111 if (!rc) 111 if (!rc)
112 return; 112 return;
113 113
114 dprintk(DEBUG_9P, "tcall id %d rcall id %d\n", tc->id, rc->id);
115 v9ses = a; 114 v9ses = a;
116 if (rc->id == RCLUNK) 115 if (rc->id == RCLUNK)
117 v9fs_put_idpool(fid, &v9ses->fidpool); 116 v9fs_put_idpool(fid, &v9ses->fidpool);
diff --git a/fs/9p/fid.c b/fs/9p/fid.c
index eda449778fa5..c4d13bf904d2 100644
--- a/fs/9p/fid.c
+++ b/fs/9p/fid.c
@@ -1,7 +1,7 @@
1/* 1/*
2 * V9FS FID Management 2 * V9FS FID Management
3 * 3 *
4 * Copyright (C) 2005 by Eric Van Hensbergen <ericvh@gmail.com> 4 * Copyright (C) 2005, 2006 by Eric Van Hensbergen <ericvh@gmail.com>
5 * 5 *
6 * This program is free software; you can redistribute it and/or modify 6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by 7 * it under the terms of the GNU General Public License as published by
@@ -40,7 +40,7 @@
40 * 40 *
41 */ 41 */
42 42
43static int v9fs_fid_insert(struct v9fs_fid *fid, struct dentry *dentry) 43int v9fs_fid_insert(struct v9fs_fid *fid, struct dentry *dentry)
44{ 44{
45 struct list_head *fid_list = (struct list_head *)dentry->d_fsdata; 45 struct list_head *fid_list = (struct list_head *)dentry->d_fsdata;
46 dprintk(DEBUG_9P, "fid %d (%p) dentry %s (%p)\n", fid->fid, fid, 46 dprintk(DEBUG_9P, "fid %d (%p) dentry %s (%p)\n", fid->fid, fid,
@@ -57,7 +57,6 @@ static int v9fs_fid_insert(struct v9fs_fid *fid, struct dentry *dentry)
57 } 57 }
58 58
59 fid->uid = current->uid; 59 fid->uid = current->uid;
60 fid->pid = current->pid;
61 list_add(&fid->list, fid_list); 60 list_add(&fid->list, fid_list);
62 return 0; 61 return 0;
63} 62}
@@ -68,14 +67,11 @@ static int v9fs_fid_insert(struct v9fs_fid *fid, struct dentry *dentry)
68 * 67 *
69 */ 68 */
70 69
71struct v9fs_fid *v9fs_fid_create(struct dentry *dentry, 70struct v9fs_fid *v9fs_fid_create(struct v9fs_session_info *v9ses, int fid)
72 struct v9fs_session_info *v9ses, int fid, int create)
73{ 71{
74 struct v9fs_fid *new; 72 struct v9fs_fid *new;
75 73
76 dprintk(DEBUG_9P, "fid create dentry %p, fid %d, create %d\n", 74 dprintk(DEBUG_9P, "fid create fid %d\n", fid);
77 dentry, fid, create);
78
79 new = kmalloc(sizeof(struct v9fs_fid), GFP_KERNEL); 75 new = kmalloc(sizeof(struct v9fs_fid), GFP_KERNEL);
80 if (new == NULL) { 76 if (new == NULL) {
81 dprintk(DEBUG_ERROR, "Out of Memory\n"); 77 dprintk(DEBUG_ERROR, "Out of Memory\n");
@@ -85,19 +81,13 @@ struct v9fs_fid *v9fs_fid_create(struct dentry *dentry,
85 new->fid = fid; 81 new->fid = fid;
86 new->v9ses = v9ses; 82 new->v9ses = v9ses;
87 new->fidopen = 0; 83 new->fidopen = 0;
88 new->fidcreate = create;
89 new->fidclunked = 0; 84 new->fidclunked = 0;
90 new->iounit = 0; 85 new->iounit = 0;
91 new->rdir_pos = 0; 86 new->rdir_pos = 0;
92 new->rdir_fcall = NULL; 87 new->rdir_fcall = NULL;
88 INIT_LIST_HEAD(&new->list);
93 89
94 if (v9fs_fid_insert(new, dentry) == 0) 90 return new;
95 return new;
96 else {
97 dprintk(DEBUG_ERROR, "Problems inserting to dentry\n");
98 kfree(new);
99 return NULL;
100 }
101} 91}
102 92
103/** 93/**
@@ -113,140 +103,29 @@ void v9fs_fid_destroy(struct v9fs_fid *fid)
113} 103}
114 104
115/** 105/**
116 * v9fs_fid_walk_up - walks from the process current directory
117 * up to the specified dentry.
118 */
119static struct v9fs_fid *v9fs_fid_walk_up(struct dentry *dentry)
120{
121 int fidnum, cfidnum, err;
122 struct v9fs_fid *cfid;
123 struct dentry *cde;
124 struct v9fs_session_info *v9ses;
125
126 v9ses = v9fs_inode2v9ses(current->fs->pwd->d_inode);
127 cfid = v9fs_fid_lookup(current->fs->pwd);
128 if (cfid == NULL) {
129 dprintk(DEBUG_ERROR, "process cwd doesn't have a fid\n");
130 return ERR_PTR(-ENOENT);
131 }
132
133 cfidnum = cfid->fid;
134 cde = current->fs->pwd;
135 /* TODO: take advantage of multiwalk */
136
137 fidnum = v9fs_get_idpool(&v9ses->fidpool);
138 if (fidnum < 0) {
139 dprintk(DEBUG_ERROR, "could not get a new fid num\n");
140 err = -ENOENT;
141 goto clunk_fid;
142 }
143
144 while (cde != dentry) {
145 if (cde == cde->d_parent) {
146 dprintk(DEBUG_ERROR, "can't find dentry\n");
147 err = -ENOENT;
148 goto clunk_fid;
149 }
150
151 err = v9fs_t_walk(v9ses, cfidnum, fidnum, "..", NULL);
152 if (err < 0) {
153 dprintk(DEBUG_ERROR, "problem walking to parent\n");
154 goto clunk_fid;
155 }
156
157 cfidnum = fidnum;
158 cde = cde->d_parent;
159 }
160
161 return v9fs_fid_create(dentry, v9ses, fidnum, 0);
162
163clunk_fid:
164 v9fs_t_clunk(v9ses, fidnum);
165 return ERR_PTR(err);
166}
167
168/**
169 * v9fs_fid_lookup - retrieve the right fid from a particular dentry 106 * v9fs_fid_lookup - retrieve the right fid from a particular dentry
170 * @dentry: dentry to look for fid in 107 * @dentry: dentry to look for fid in
171 * @type: intent of lookup (operation or traversal) 108 * @type: intent of lookup (operation or traversal)
172 * 109 *
173 * search list of fids associated with a dentry for a fid with a matching 110 * find a fid in the dentry
174 * thread id or uid. If that fails, look up the dentry's parents to see if you 111 *
175 * can find a matching fid. 112 * TODO: only match fids that have the same uid as current user
176 * 113 *
177 */ 114 */
178 115
179struct v9fs_fid *v9fs_fid_lookup(struct dentry *dentry) 116struct v9fs_fid *v9fs_fid_lookup(struct dentry *dentry)
180{ 117{
181 struct list_head *fid_list = (struct list_head *)dentry->d_fsdata; 118 struct list_head *fid_list = (struct list_head *)dentry->d_fsdata;
182 struct v9fs_fid *current_fid = NULL;
183 struct v9fs_fid *temp = NULL;
184 struct v9fs_fid *return_fid = NULL; 119 struct v9fs_fid *return_fid = NULL;
185 120
186 dprintk(DEBUG_9P, " dentry: %s (%p)\n", dentry->d_iname, dentry); 121 dprintk(DEBUG_9P, " dentry: %s (%p)\n", dentry->d_iname, dentry);
187 122
188 if (fid_list) { 123 if (fid_list)
189 list_for_each_entry_safe(current_fid, temp, fid_list, list) { 124 return_fid = list_entry(fid_list->next, struct v9fs_fid, list);
190 if (!current_fid->fidcreate) {
191 return_fid = current_fid;
192 break;
193 }
194 }
195
196 if (!return_fid)
197 return_fid = current_fid;
198 }
199
200 /* we are at the root but didn't match */
201 if ((!return_fid) && (dentry->d_parent == dentry)) {
202 /* TODO: clone attach with new uid */
203 return_fid = current_fid;
204 }
205 125
206 if (!return_fid) { 126 if (!return_fid) {
207 struct dentry *par = current->fs->pwd->d_parent; 127 dprintk(DEBUG_ERROR, "Couldn't find a fid in dentry\n");
208 int count = 1;
209 while (par != NULL) {
210 if (par == dentry)
211 break;
212 count++;
213 if (par == par->d_parent) {
214 dprintk(DEBUG_ERROR,
215 "got to root without finding dentry\n");
216 break;
217 }
218 par = par->d_parent;
219 }
220
221/* XXX - there may be some duplication we can get rid of */
222 if (par == dentry) {
223 return_fid = v9fs_fid_walk_up(dentry);
224 if (IS_ERR(return_fid))
225 return_fid = NULL;
226 }
227 } 128 }
228 129
229 return return_fid; 130 return return_fid;
230} 131}
231
232struct v9fs_fid *v9fs_fid_get_created(struct dentry *dentry)
233{
234 struct list_head *fid_list;
235 struct v9fs_fid *fid, *ftmp, *ret;
236
237 dprintk(DEBUG_9P, " dentry: %s (%p)\n", dentry->d_iname, dentry);
238 fid_list = (struct list_head *)dentry->d_fsdata;
239 ret = NULL;
240 if (fid_list) {
241 list_for_each_entry_safe(fid, ftmp, fid_list, list) {
242 if (fid->fidcreate && fid->pid == current->pid) {
243 list_del(&fid->list);
244 ret = fid;
245 break;
246 }
247 }
248 }
249
250 dprintk(DEBUG_9P, "return %p\n", ret);
251 return ret;
252}
diff --git a/fs/9p/fid.h b/fs/9p/fid.h
index 84c673a44c83..1fc2dd08d75a 100644
--- a/fs/9p/fid.h
+++ b/fs/9p/fid.h
@@ -33,7 +33,6 @@ struct v9fs_fid {
33 33
34 u32 fid; 34 u32 fid;
35 unsigned char fidopen; /* set when fid is opened */ 35 unsigned char fidopen; /* set when fid is opened */
36 unsigned char fidcreate; /* set when fid was just created */
37 unsigned char fidclunked; /* set when fid has already been clunked */ 36 unsigned char fidclunked; /* set when fid has already been clunked */
38 37
39 struct v9fs_qid qid; 38 struct v9fs_qid qid;
@@ -45,7 +44,6 @@ struct v9fs_fid {
45 struct v9fs_fcall *rdir_fcall; 44 struct v9fs_fcall *rdir_fcall;
46 45
47 /* management stuff */ 46 /* management stuff */
48 pid_t pid; /* thread associated with this fid */
49 uid_t uid; /* user associated with this fid */ 47 uid_t uid; /* user associated with this fid */
50 48
51 /* private data */ 49 /* private data */
@@ -56,5 +54,5 @@ struct v9fs_fid {
56struct v9fs_fid *v9fs_fid_lookup(struct dentry *dentry); 54struct v9fs_fid *v9fs_fid_lookup(struct dentry *dentry);
57struct v9fs_fid *v9fs_fid_get_created(struct dentry *); 55struct v9fs_fid *v9fs_fid_get_created(struct dentry *);
58void v9fs_fid_destroy(struct v9fs_fid *fid); 56void v9fs_fid_destroy(struct v9fs_fid *fid);
59struct v9fs_fid *v9fs_fid_create(struct dentry *, 57struct v9fs_fid *v9fs_fid_create(struct v9fs_session_info *, int fid);
60 struct v9fs_session_info *v9ses, int fid, int create); 58int v9fs_fid_insert(struct v9fs_fid *fid, struct dentry *dentry);
diff --git a/fs/9p/trans_fd.c b/fs/9p/trans_fd.c
index 1a28ef97a3d1..5b2ce21b10fa 100644
--- a/fs/9p/trans_fd.c
+++ b/fs/9p/trans_fd.c
@@ -80,6 +80,7 @@ static int v9fs_fd_send(struct v9fs_transport *trans, void *v, int len)
80 if (!trans || trans->status != Connected || !ts) 80 if (!trans || trans->status != Connected || !ts)
81 return -EIO; 81 return -EIO;
82 82
83 oldfs = get_fs();
83 set_fs(get_ds()); 84 set_fs(get_ds());
84 /* The cast to a user pointer is valid due to the set_fs() */ 85 /* The cast to a user pointer is valid due to the set_fs() */
85 ret = vfs_write(ts->out_file, (void __user *)v, len, &ts->out_file->f_pos); 86 ret = vfs_write(ts->out_file, (void __user *)v, len, &ts->out_file->f_pos);
diff --git a/fs/9p/v9fs.c b/fs/9p/v9fs.c
index ef3386549140..61352491ba36 100644
--- a/fs/9p/v9fs.c
+++ b/fs/9p/v9fs.c
@@ -397,6 +397,7 @@ v9fs_session_init(struct v9fs_session_info *v9ses,
397 } 397 }
398 398
399 if (v9ses->afid != ~0) { 399 if (v9ses->afid != ~0) {
400 dprintk(DEBUG_ERROR, "afid not equal to ~0\n");
400 if (v9fs_t_clunk(v9ses, v9ses->afid)) 401 if (v9fs_t_clunk(v9ses, v9ses->afid))
401 dprintk(DEBUG_ERROR, "clunk failed\n"); 402 dprintk(DEBUG_ERROR, "clunk failed\n");
402 } 403 }
diff --git a/fs/9p/v9fs_vfs.h b/fs/9p/v9fs_vfs.h
index 69cf2905dc90..a759278acaae 100644
--- a/fs/9p/v9fs_vfs.h
+++ b/fs/9p/v9fs_vfs.h
@@ -51,3 +51,4 @@ int v9fs_dir_release(struct inode *inode, struct file *filp);
51int v9fs_file_open(struct inode *inode, struct file *file); 51int v9fs_file_open(struct inode *inode, struct file *file);
52void v9fs_inode2stat(struct inode *inode, struct v9fs_stat *stat); 52void v9fs_inode2stat(struct inode *inode, struct v9fs_stat *stat);
53void v9fs_dentry_release(struct dentry *); 53void v9fs_dentry_release(struct dentry *);
54int v9fs_uflags2omode(int uflags);
diff --git a/fs/9p/vfs_dentry.c b/fs/9p/vfs_dentry.c
index 2dd806dac9f1..12c9cc926b71 100644
--- a/fs/9p/vfs_dentry.c
+++ b/fs/9p/vfs_dentry.c
@@ -43,47 +43,18 @@
43#include "fid.h" 43#include "fid.h"
44 44
45/** 45/**
46 * v9fs_dentry_validate - VFS dcache hook to validate cache 46 * v9fs_dentry_delete - called when dentry refcount equals 0
47 * @dentry: dentry that is being validated 47 * @dentry: dentry in question
48 * @nd: path data
49 * 48 *
50 * dcache really shouldn't be used for 9P2000 as at all due to 49 * By returning 1 here we should remove cacheing of unused
51 * potential attached semantics to directory traversal (walk). 50 * dentry components.
52 *
53 * FUTURE: look into how to use dcache to allow multi-stage
54 * walks in Plan 9 & potential for better dcache operation which
55 * would remain valid for Plan 9 semantics. Older versions
56 * had validation via stat for those interested. However, since
57 * stat has the same approximate overhead as walk there really
58 * is no difference. The only improvement would be from a
59 * time-decay cache like NFS has and that undermines the
60 * synchronous nature of 9P2000.
61 * 51 *
62 */ 52 */
63 53
64static int v9fs_dentry_validate(struct dentry *dentry, struct nameidata *nd) 54int v9fs_dentry_delete(struct dentry *dentry)
65{ 55{
66 struct dentry *dc = current->fs->pwd; 56 dprintk(DEBUG_VFS, " dentry: %s (%p)\n", dentry->d_iname, dentry);
67 57 return 1;
68 dprintk(DEBUG_VFS, "dentry: %s (%p)\n", dentry->d_iname, dentry);
69 if (v9fs_fid_lookup(dentry)) {
70 dprintk(DEBUG_VFS, "VALID\n");
71 return 1;
72 }
73
74 while (dc != NULL) {
75 if (dc == dentry) {
76 dprintk(DEBUG_VFS, "VALID\n");
77 return 1;
78 }
79 if (dc == dc->d_parent)
80 break;
81
82 dc = dc->d_parent;
83 }
84
85 dprintk(DEBUG_VFS, "INVALID\n");
86 return 0;
87} 58}
88 59
89/** 60/**
@@ -118,6 +89,6 @@ void v9fs_dentry_release(struct dentry *dentry)
118} 89}
119 90
120struct dentry_operations v9fs_dentry_operations = { 91struct dentry_operations v9fs_dentry_operations = {
121 .d_revalidate = v9fs_dentry_validate, 92 .d_delete = v9fs_dentry_delete,
122 .d_release = v9fs_dentry_release, 93 .d_release = v9fs_dentry_release,
123}; 94};
diff --git a/fs/9p/vfs_file.c b/fs/9p/vfs_file.c
index c7e14d917215..de3a129698da 100644
--- a/fs/9p/vfs_file.c
+++ b/fs/9p/vfs_file.c
@@ -53,94 +53,70 @@
53int v9fs_file_open(struct inode *inode, struct file *file) 53int v9fs_file_open(struct inode *inode, struct file *file)
54{ 54{
55 struct v9fs_session_info *v9ses = v9fs_inode2v9ses(inode); 55 struct v9fs_session_info *v9ses = v9fs_inode2v9ses(inode);
56 struct v9fs_fid *v9fid, *fid; 56 struct v9fs_fid *vfid;
57 struct v9fs_fcall *fcall = NULL; 57 struct v9fs_fcall *fcall = NULL;
58 int open_mode = 0; 58 int omode;
59 unsigned int iounit = 0; 59 int fid = V9FS_NOFID;
60 int newfid = -1; 60 int err;
61 long result = -1;
62 61
63 dprintk(DEBUG_VFS, "inode: %p file: %p \n", inode, file); 62 dprintk(DEBUG_VFS, "inode: %p file: %p \n", inode, file);
64 63
65 v9fid = v9fs_fid_get_created(file->f_dentry); 64 vfid = v9fs_fid_lookup(file->f_dentry);
66 if (!v9fid) 65 if (!vfid) {
67 v9fid = v9fs_fid_lookup(file->f_dentry);
68
69 if (!v9fid) {
70 dprintk(DEBUG_ERROR, "Couldn't resolve fid from dentry\n"); 66 dprintk(DEBUG_ERROR, "Couldn't resolve fid from dentry\n");
71 return -EBADF; 67 return -EBADF;
72 } 68 }
73 69
74 if (!v9fid->fidcreate) { 70 fid = v9fs_get_idpool(&v9ses->fidpool);
75 fid = kmalloc(sizeof(struct v9fs_fid), GFP_KERNEL); 71 if (fid < 0) {
76 if (fid == NULL) {
77 dprintk(DEBUG_ERROR, "Out of Memory\n");
78 return -ENOMEM;
79 }
80
81 fid->fidopen = 0;
82 fid->fidcreate = 0;
83 fid->fidclunked = 0;
84 fid->iounit = 0;
85 fid->v9ses = v9ses;
86
87 newfid = v9fs_get_idpool(&v9ses->fidpool);
88 if (newfid < 0) {
89 eprintk(KERN_WARNING, "newfid fails!\n"); 72 eprintk(KERN_WARNING, "newfid fails!\n");
90 return -ENOSPC; 73 return -ENOSPC;
91 } 74 }
92 75
93 result = 76 err = v9fs_t_walk(v9ses, vfid->fid, fid, NULL, NULL);
94 v9fs_t_walk(v9ses, v9fid->fid, newfid, NULL, NULL); 77 if (err < 0) {
95
96 if (result < 0) {
97 v9fs_put_idpool(newfid, &v9ses->fidpool);
98 dprintk(DEBUG_ERROR, "rewalk didn't work\n"); 78 dprintk(DEBUG_ERROR, "rewalk didn't work\n");
99 return -EBADF; 79 goto put_fid;
80 }
81
82 vfid = kmalloc(sizeof(struct v9fs_fid), GFP_KERNEL);
83 if (vfid == NULL) {
84 dprintk(DEBUG_ERROR, "out of memory\n");
85 goto clunk_fid;
100 } 86 }
101 87
102 fid->fid = newfid;
103 v9fid = fid;
104 /* TODO: do special things for O_EXCL, O_NOFOLLOW, O_SYNC */ 88 /* TODO: do special things for O_EXCL, O_NOFOLLOW, O_SYNC */
105 /* translate open mode appropriately */ 89 /* translate open mode appropriately */
106 open_mode = file->f_flags & 0x3; 90 omode = v9fs_uflags2omode(file->f_flags);
91 err = v9fs_t_open(v9ses, fid, omode, &fcall);
92 if (err < 0) {
93 PRINT_FCALL_ERROR("open failed", fcall);
94 goto destroy_vfid;
95 }
107 96
108 if (file->f_flags & O_EXCL) 97 file->private_data = vfid;
109 open_mode |= V9FS_OEXCL; 98 vfid->fid = fid;
99 vfid->fidopen = 1;
100 vfid->fidclunked = 0;
101 vfid->iounit = fcall->params.ropen.iounit;
102 vfid->rdir_pos = 0;
103 vfid->rdir_fcall = NULL;
104 vfid->filp = file;
105 kfree(fcall);
110 106
111 if (v9ses->extended) { 107 return 0;
112 if (file->f_flags & O_TRUNC)
113 open_mode |= V9FS_OTRUNC;
114 108
115 if (file->f_flags & O_APPEND) 109destroy_vfid:
116 open_mode |= V9FS_OAPPEND; 110 v9fs_fid_destroy(vfid);
117 }
118 111
119 result = v9fs_t_open(v9ses, newfid, open_mode, &fcall); 112clunk_fid:
120 if (result < 0) { 113 v9fs_t_clunk(v9ses, fid);
121 PRINT_FCALL_ERROR("open failed", fcall);
122 kfree(fcall);
123 return result;
124 }
125 114
126 iounit = fcall->params.ropen.iounit; 115put_fid:
116 v9fs_put_idpool(fid, &v9ses->fidpool);
127 kfree(fcall); 117 kfree(fcall);
128 } else {
129 /* create case */
130 newfid = v9fid->fid;
131 iounit = v9fid->iounit;
132 v9fid->fidcreate = 0;
133 }
134
135 file->private_data = v9fid;
136
137 v9fid->rdir_pos = 0;
138 v9fid->rdir_fcall = NULL;
139 v9fid->fidopen = 1;
140 v9fid->filp = file;
141 v9fid->iounit = iounit;
142 118
143 return 0; 119 return err;
144} 120}
145 121
146/** 122/**
@@ -289,9 +265,7 @@ v9fs_file_write(struct file *filp, const char __user * data,
289 total += result; 265 total += result;
290 } while (count); 266 } while (count);
291 267
292 if(inode->i_mapping->nrpages)
293 invalidate_inode_pages2(inode->i_mapping); 268 invalidate_inode_pages2(inode->i_mapping);
294
295 return total; 269 return total;
296} 270}
297 271
diff --git a/fs/9p/vfs_inode.c b/fs/9p/vfs_inode.c
index 63e5b0398e8b..3ad8455f8577 100644
--- a/fs/9p/vfs_inode.c
+++ b/fs/9p/vfs_inode.c
@@ -125,6 +125,38 @@ static int p9mode2unixmode(struct v9fs_session_info *v9ses, int mode)
125 return res; 125 return res;
126} 126}
127 127
128int v9fs_uflags2omode(int uflags)
129{
130 int ret;
131
132 ret = 0;
133 switch (uflags&3) {
134 default:
135 case O_RDONLY:
136 ret = V9FS_OREAD;
137 break;
138
139 case O_WRONLY:
140 ret = V9FS_OWRITE;
141 break;
142
143 case O_RDWR:
144 ret = V9FS_ORDWR;
145 break;
146 }
147
148 if (uflags & O_EXCL)
149 ret |= V9FS_OEXCL;
150
151 if (uflags & O_TRUNC)
152 ret |= V9FS_OTRUNC;
153
154 if (uflags & O_APPEND)
155 ret |= V9FS_OAPPEND;
156
157 return ret;
158}
159
128/** 160/**
129 * v9fs_blank_wstat - helper function to setup a 9P stat structure 161 * v9fs_blank_wstat - helper function to setup a 9P stat structure
130 * @v9ses: 9P session info (for determining extended mode) 162 * @v9ses: 9P session info (for determining extended mode)
@@ -163,7 +195,7 @@ v9fs_blank_wstat(struct v9fs_wstat *wstat)
163 195
164struct inode *v9fs_get_inode(struct super_block *sb, int mode) 196struct inode *v9fs_get_inode(struct super_block *sb, int mode)
165{ 197{
166 struct inode *inode = NULL; 198 struct inode *inode;
167 struct v9fs_session_info *v9ses = sb->s_fs_info; 199 struct v9fs_session_info *v9ses = sb->s_fs_info;
168 200
169 dprintk(DEBUG_VFS, "super block: %p mode: %o\n", sb, mode); 201 dprintk(DEBUG_VFS, "super block: %p mode: %o\n", sb, mode);
@@ -222,171 +254,133 @@ struct inode *v9fs_get_inode(struct super_block *sb, int mode)
222 return inode; 254 return inode;
223} 255}
224 256
225/**
226 * v9fs_create - helper function to create files and directories
227 * @dir: directory inode file is being created in
228 * @file_dentry: dentry file is being created in
229 * @perm: permissions file is being created with
230 * @open_mode: resulting open mode for file
231 *
232 */
233
234static int 257static int
235v9fs_create(struct inode *dir, 258v9fs_create(struct v9fs_session_info *v9ses, u32 pfid, char *name,
236 struct dentry *file_dentry, 259 u32 perm, u8 mode, u32 *fidp, struct v9fs_qid *qid, u32 *iounit)
237 unsigned int perm, unsigned int open_mode)
238{ 260{
239 struct v9fs_session_info *v9ses = v9fs_inode2v9ses(dir); 261 u32 fid;
240 struct super_block *sb = dir->i_sb;
241 struct v9fs_fid *dirfid =
242 v9fs_fid_lookup(file_dentry->d_parent);
243 struct v9fs_fid *fid = NULL;
244 struct inode *file_inode = NULL;
245 struct v9fs_fcall *fcall = NULL;
246 struct v9fs_qid qid;
247 int dirfidnum = -1;
248 long newfid = -1;
249 int result = 0;
250 unsigned int iounit = 0;
251 int wfidno = -1;
252 int err; 262 int err;
263 struct v9fs_fcall *fcall;
253 264
254 perm = unixmode2p9mode(v9ses, perm); 265 fid = v9fs_get_idpool(&v9ses->fidpool);
255 266 if (fid < 0) {
256 dprintk(DEBUG_VFS, "dir: %p dentry: %p perm: %o mode: %o\n", dir,
257 file_dentry, perm, open_mode);
258
259 if (!dirfid)
260 return -EBADF;
261
262 dirfidnum = dirfid->fid;
263 if (dirfidnum < 0) {
264 dprintk(DEBUG_ERROR, "No fid for the directory #%lu\n",
265 dir->i_ino);
266 return -EBADF;
267 }
268
269 if (file_dentry->d_inode) {
270 dprintk(DEBUG_ERROR,
271 "Odd. There is an inode for dir %lu, name :%s:\n",
272 dir->i_ino, file_dentry->d_name.name);
273 return -EEXIST;
274 }
275
276 newfid = v9fs_get_idpool(&v9ses->fidpool);
277 if (newfid < 0) {
278 eprintk(KERN_WARNING, "no free fids available\n"); 267 eprintk(KERN_WARNING, "no free fids available\n");
279 return -ENOSPC; 268 return -ENOSPC;
280 } 269 }
281 270
282 result = v9fs_t_walk(v9ses, dirfidnum, newfid, NULL, &fcall); 271 err = v9fs_t_walk(v9ses, pfid, fid, NULL, &fcall);
283 if (result < 0) { 272 if (err < 0) {
284 PRINT_FCALL_ERROR("clone error", fcall); 273 PRINT_FCALL_ERROR("clone error", fcall);
285 v9fs_put_idpool(newfid, &v9ses->fidpool); 274 goto error;
286 newfid = -1;
287 goto CleanUpFid;
288 } 275 }
289
290 kfree(fcall); 276 kfree(fcall);
291 fcall = NULL;
292 277
293 result = v9fs_t_create(v9ses, newfid, (char *)file_dentry->d_name.name, 278 err = v9fs_t_create(v9ses, fid, name, perm, mode, &fcall);
294 perm, open_mode, &fcall); 279 if (err < 0) {
295 if (result < 0) {
296 PRINT_FCALL_ERROR("create fails", fcall); 280 PRINT_FCALL_ERROR("create fails", fcall);
297 goto CleanUpFid; 281 goto error;
298 } 282 }
299 283
300 iounit = fcall->params.rcreate.iounit; 284 if (iounit)
301 qid = fcall->params.rcreate.qid; 285 *iounit = fcall->params.rcreate.iounit;
286
287 if (qid)
288 *qid = fcall->params.rcreate.qid;
289
290 if (fidp)
291 *fidp = fid;
292
302 kfree(fcall); 293 kfree(fcall);
303 fcall = NULL; 294 return 0;
304 295
305 if (!(perm&V9FS_DMDIR)) { 296error:
306 fid = v9fs_fid_create(file_dentry, v9ses, newfid, 1); 297 if (fid >= 0)
307 dprintk(DEBUG_VFS, "fid %p %d\n", fid, fid->fidcreate); 298 v9fs_put_idpool(fid, &v9ses->fidpool);
308 if (!fid) {
309 result = -ENOMEM;
310 goto CleanUpFid;
311 }
312 299
313 fid->qid = qid; 300 kfree(fcall);
314 fid->iounit = iounit; 301 return err;
315 } else { 302}
316 err = v9fs_t_clunk(v9ses, newfid); 303
317 newfid = -1; 304static struct v9fs_fid*
318 if (err < 0) 305v9fs_clone_walk(struct v9fs_session_info *v9ses, u32 fid, struct dentry *dentry)
319 dprintk(DEBUG_ERROR, "clunk for mkdir failed: %d\n", err); 306{
320 } 307 int err;
308 u32 nfid;
309 struct v9fs_fid *ret;
310 struct v9fs_fcall *fcall;
321 311
322 /* walk to the newly created file and put the fid in the dentry */ 312 nfid = v9fs_get_idpool(&v9ses->fidpool);
323 wfidno = v9fs_get_idpool(&v9ses->fidpool); 313 if (nfid < 0) {
324 if (wfidno < 0) {
325 eprintk(KERN_WARNING, "no free fids available\n"); 314 eprintk(KERN_WARNING, "no free fids available\n");
326 return -ENOSPC; 315 return ERR_PTR(-ENOSPC);
327 } 316 }
328 317
329 result = v9fs_t_walk(v9ses, dirfidnum, wfidno, 318 err = v9fs_t_walk(v9ses, fid, nfid, (char *) dentry->d_name.name,
330 (char *) file_dentry->d_name.name, &fcall); 319 &fcall);
331 if (result < 0) { 320
332 PRINT_FCALL_ERROR("clone error", fcall); 321 if (err < 0) {
333 v9fs_put_idpool(wfidno, &v9ses->fidpool); 322 PRINT_FCALL_ERROR("walk error", fcall);
334 wfidno = -1; 323 v9fs_put_idpool(nfid, &v9ses->fidpool);
335 goto CleanUpFid; 324 goto error;
336 } 325 }
326
337 kfree(fcall); 327 kfree(fcall);
338 fcall = NULL; 328 fcall = NULL;
329 ret = v9fs_fid_create(v9ses, nfid);
330 if (!ret) {
331 err = -ENOMEM;
332 goto clunk_fid;
333 }
339 334
340 if (!v9fs_fid_create(file_dentry, v9ses, wfidno, 0)) { 335 err = v9fs_fid_insert(ret, dentry);
341 v9fs_put_idpool(wfidno, &v9ses->fidpool); 336 if (err < 0) {
342 337 v9fs_fid_destroy(ret);
343 goto CleanUpFid; 338 goto clunk_fid;
344 } 339 }
345 340
346 if ((perm & V9FS_DMSYMLINK) || (perm & V9FS_DMLINK) || 341 return ret;
347 (perm & V9FS_DMNAMEDPIPE) || (perm & V9FS_DMSOCKET) ||
348 (perm & V9FS_DMDEVICE))
349 return 0;
350 342
351 result = v9fs_t_stat(v9ses, wfidno, &fcall); 343clunk_fid:
352 if (result < 0) { 344 v9fs_t_clunk(v9ses, nfid);
353 PRINT_FCALL_ERROR("stat error", fcall);
354 goto CleanUpFid;
355 }
356 345
346error:
347 kfree(fcall);
348 return ERR_PTR(err);
349}
357 350
358 file_inode = v9fs_get_inode(sb, 351struct inode *
359 p9mode2unixmode(v9ses, fcall->params.rstat.stat.mode)); 352v9fs_inode_from_fid(struct v9fs_session_info *v9ses, u32 fid,
353 struct super_block *sb)
354{
355 int err, umode;
356 struct inode *ret;
357 struct v9fs_fcall *fcall;
360 358
361 if ((!file_inode) || IS_ERR(file_inode)) { 359 ret = NULL;
362 dprintk(DEBUG_ERROR, "create inode failed\n"); 360 err = v9fs_t_stat(v9ses, fid, &fcall);
363 result = -EBADF; 361 if (err) {
364 goto CleanUpFid; 362 PRINT_FCALL_ERROR("stat error", fcall);
363 goto error;
365 } 364 }
366 365
367 v9fs_stat2inode(&fcall->params.rstat.stat, file_inode, sb); 366 umode = p9mode2unixmode(v9ses, fcall->params.rstat.stat.mode);
368 kfree(fcall); 367 ret = v9fs_get_inode(sb, umode);
369 fcall = NULL; 368 if (IS_ERR(ret)) {
370 file_dentry->d_op = &v9fs_dentry_operations; 369 err = PTR_ERR(ret);
371 d_instantiate(file_dentry, file_inode); 370 ret = NULL;
371 goto error;
372 }
372 373
373 return 0; 374 v9fs_stat2inode(&fcall->params.rstat.stat, ret, sb);
375 kfree(fcall);
376 return ret;
374 377
375 CleanUpFid: 378error:
376 kfree(fcall); 379 kfree(fcall);
377 fcall = NULL; 380 if (ret)
381 iput(ret);
378 382
379 if (newfid >= 0) { 383 return ERR_PTR(err);
380 err = v9fs_t_clunk(v9ses, newfid);
381 if (err < 0)
382 dprintk(DEBUG_ERROR, "clunk failed: %d\n", err);
383 }
384 if (wfidno >= 0) {
385 err = v9fs_t_clunk(v9ses, wfidno);
386 if (err < 0)
387 dprintk(DEBUG_ERROR, "clunk failed: %d\n", err);
388 }
389 return result;
390} 384}
391 385
392/** 386/**
@@ -440,20 +434,97 @@ static int v9fs_remove(struct inode *dir, struct dentry *file, int rmdir)
440 return result; 434 return result;
441} 435}
442 436
437static int
438v9fs_open_created(struct inode *inode, struct file *file)
439{
440 return 0;
441}
442
443/** 443/**
444 * v9fs_vfs_create - VFS hook to create files 444 * v9fs_vfs_create - VFS hook to create files
445 * @inode: directory inode that is being deleted 445 * @inode: directory inode that is being deleted
446 * @dentry: dentry that is being deleted 446 * @dentry: dentry that is being deleted
447 * @perm: create permissions 447 * @mode: create permissions
448 * @nd: path information 448 * @nd: path information
449 * 449 *
450 */ 450 */
451 451
452static int 452static int
453v9fs_vfs_create(struct inode *inode, struct dentry *dentry, int perm, 453v9fs_vfs_create(struct inode *dir, struct dentry *dentry, int mode,
454 struct nameidata *nd) 454 struct nameidata *nd)
455{ 455{
456 return v9fs_create(inode, dentry, perm, O_RDWR); 456 int err;
457 u32 fid, perm, iounit;
458 int flags;
459 struct v9fs_session_info *v9ses;
460 struct v9fs_fid *dfid, *vfid, *ffid;
461 struct inode *inode;
462 struct v9fs_qid qid;
463 struct file *filp;
464
465 inode = NULL;
466 vfid = NULL;
467 v9ses = v9fs_inode2v9ses(dir);
468 dfid = v9fs_fid_lookup(dentry->d_parent);
469 perm = unixmode2p9mode(v9ses, mode);
470
471 if (nd && nd->flags & LOOKUP_OPEN)
472 flags = nd->intent.open.flags - 1;
473 else
474 flags = O_RDWR;
475
476 err = v9fs_create(v9ses, dfid->fid, (char *) dentry->d_name.name,
477 perm, v9fs_uflags2omode(flags), &fid, &qid, &iounit);
478
479 if (err)
480 goto error;
481
482 vfid = v9fs_clone_walk(v9ses, dfid->fid, dentry);
483 if (IS_ERR(vfid)) {
484 err = PTR_ERR(vfid);
485 vfid = NULL;
486 goto error;
487 }
488
489 inode = v9fs_inode_from_fid(v9ses, vfid->fid, dir->i_sb);
490 if (IS_ERR(inode)) {
491 err = PTR_ERR(inode);
492 inode = NULL;
493 goto error;
494 }
495
496 dentry->d_op = &v9fs_dentry_operations;
497 d_instantiate(dentry, inode);
498
499 if (nd && nd->flags & LOOKUP_OPEN) {
500 ffid = v9fs_fid_create(v9ses, fid);
501 if (!ffid)
502 return -ENOMEM;
503
504 filp = lookup_instantiate_filp(nd, dentry, v9fs_open_created);
505 if (IS_ERR(filp)) {
506 v9fs_fid_destroy(ffid);
507 return PTR_ERR(filp);
508 }
509
510 ffid->rdir_pos = 0;
511 ffid->rdir_fcall = NULL;
512 ffid->fidopen = 1;
513 ffid->iounit = iounit;
514 ffid->filp = filp;
515 filp->private_data = ffid;
516 }
517
518 return 0;
519
520error:
521 if (vfid)
522 v9fs_fid_destroy(vfid);
523
524 if (inode)
525 iput(inode);
526
527 return err;
457} 528}
458 529
459/** 530/**
@@ -464,9 +535,57 @@ v9fs_vfs_create(struct inode *inode, struct dentry *dentry, int perm,
464 * 535 *
465 */ 536 */
466 537
467static int v9fs_vfs_mkdir(struct inode *inode, struct dentry *dentry, int mode) 538static int v9fs_vfs_mkdir(struct inode *dir, struct dentry *dentry, int mode)
468{ 539{
469 return v9fs_create(inode, dentry, mode | S_IFDIR, O_RDONLY); 540 int err;
541 u32 fid, perm;
542 struct v9fs_session_info *v9ses;
543 struct v9fs_fid *dfid, *vfid;
544 struct inode *inode;
545
546 inode = NULL;
547 vfid = NULL;
548 v9ses = v9fs_inode2v9ses(dir);
549 dfid = v9fs_fid_lookup(dentry->d_parent);
550 perm = unixmode2p9mode(v9ses, mode | S_IFDIR);
551
552 err = v9fs_create(v9ses, dfid->fid, (char *) dentry->d_name.name,
553 perm, V9FS_OREAD, &fid, NULL, NULL);
554
555 if (err) {
556 dprintk(DEBUG_ERROR, "create error %d\n", err);
557 goto error;
558 }
559
560 err = v9fs_t_clunk(v9ses, fid);
561 if (err) {
562 dprintk(DEBUG_ERROR, "clunk error %d\n", err);
563 goto error;
564 }
565
566 vfid = v9fs_clone_walk(v9ses, dfid->fid, dentry);
567 if (IS_ERR(vfid)) {
568 err = PTR_ERR(vfid);
569 vfid = NULL;
570 goto error;
571 }
572
573 inode = v9fs_inode_from_fid(v9ses, vfid->fid, dir->i_sb);
574 if (IS_ERR(inode)) {
575 err = PTR_ERR(inode);
576 inode = NULL;
577 goto error;
578 }
579
580 dentry->d_op = &v9fs_dentry_operations;
581 d_instantiate(dentry, inode);
582 return 0;
583
584error:
585 if (vfid)
586 v9fs_fid_destroy(vfid);
587
588 return err;
470} 589}
471 590
472/** 591/**
@@ -491,7 +610,7 @@ static struct dentry *v9fs_vfs_lookup(struct inode *dir, struct dentry *dentry,
491 int result = 0; 610 int result = 0;
492 611
493 dprintk(DEBUG_VFS, "dir: %p dentry: (%s) %p nameidata: %p\n", 612 dprintk(DEBUG_VFS, "dir: %p dentry: (%s) %p nameidata: %p\n",
494 dir, dentry->d_iname, dentry, nameidata); 613 dir, dentry->d_name.name, dentry, nameidata);
495 614
496 sb = dir->i_sb; 615 sb = dir->i_sb;
497 v9ses = v9fs_inode2v9ses(dir); 616 v9ses = v9fs_inode2v9ses(dir);
@@ -516,9 +635,8 @@ static struct dentry *v9fs_vfs_lookup(struct inode *dir, struct dentry *dentry,
516 return ERR_PTR(-ENOSPC); 635 return ERR_PTR(-ENOSPC);
517 } 636 }
518 637
519 result = 638 result = v9fs_t_walk(v9ses, dirfidnum, newfid,
520 v9fs_t_walk(v9ses, dirfidnum, newfid, (char *)dentry->d_name.name, 639 (char *)dentry->d_name.name, NULL);
521 NULL);
522 if (result < 0) { 640 if (result < 0) {
523 v9fs_put_idpool(newfid, &v9ses->fidpool); 641 v9fs_put_idpool(newfid, &v9ses->fidpool);
524 if (result == -ENOENT) { 642 if (result == -ENOENT) {
@@ -551,13 +669,17 @@ static struct dentry *v9fs_vfs_lookup(struct inode *dir, struct dentry *dentry,
551 669
552 inode->i_ino = v9fs_qid2ino(&fcall->params.rstat.stat.qid); 670 inode->i_ino = v9fs_qid2ino(&fcall->params.rstat.stat.qid);
553 671
554 fid = v9fs_fid_create(dentry, v9ses, newfid, 0); 672 fid = v9fs_fid_create(v9ses, newfid);
555 if (fid == NULL) { 673 if (fid == NULL) {
556 dprintk(DEBUG_ERROR, "couldn't insert\n"); 674 dprintk(DEBUG_ERROR, "couldn't insert\n");
557 result = -ENOMEM; 675 result = -ENOMEM;
558 goto FreeFcall; 676 goto FreeFcall;
559 } 677 }
560 678
679 result = v9fs_fid_insert(fid, dentry);
680 if (result < 0)
681 goto FreeFcall;
682
561 fid->qid = fcall->params.rstat.stat.qid; 683 fid->qid = fcall->params.rstat.stat.qid;
562 684
563 dentry->d_op = &v9fs_dentry_operations; 685 dentry->d_op = &v9fs_dentry_operations;
@@ -886,8 +1008,8 @@ static int v9fs_readlink(struct dentry *dentry, char *buffer, int buflen)
886 } 1008 }
887 1009
888 /* copy extension buffer into buffer */ 1010 /* copy extension buffer into buffer */
889 if (fcall->params.rstat.stat.extension.len+1 < buflen) 1011 if (fcall->params.rstat.stat.extension.len < buflen)
890 buflen = fcall->params.rstat.stat.extension.len + 1; 1012 buflen = fcall->params.rstat.stat.extension.len;
891 1013
892 memcpy(buffer, fcall->params.rstat.stat.extension.str, buflen - 1); 1014 memcpy(buffer, fcall->params.rstat.stat.extension.str, buflen - 1);
893 buffer[buflen-1] = 0; 1015 buffer[buflen-1] = 0;
@@ -951,7 +1073,7 @@ static void *v9fs_vfs_follow_link(struct dentry *dentry, struct nameidata *nd)
951 if (!link) 1073 if (!link)
952 link = ERR_PTR(-ENOMEM); 1074 link = ERR_PTR(-ENOMEM);
953 else { 1075 else {
954 len = v9fs_readlink(dentry, link, PATH_MAX); 1076 len = v9fs_readlink(dentry, link, strlen(link));
955 1077
956 if (len < 0) { 1078 if (len < 0) {
957 __putname(link); 1079 __putname(link);
@@ -983,53 +1105,75 @@ static void v9fs_vfs_put_link(struct dentry *dentry, struct nameidata *nd, void
983static int v9fs_vfs_mkspecial(struct inode *dir, struct dentry *dentry, 1105static int v9fs_vfs_mkspecial(struct inode *dir, struct dentry *dentry,
984 int mode, const char *extension) 1106 int mode, const char *extension)
985{ 1107{
986 int err, retval; 1108 int err;
1109 u32 fid, perm;
987 struct v9fs_session_info *v9ses; 1110 struct v9fs_session_info *v9ses;
1111 struct v9fs_fid *dfid, *vfid;
1112 struct inode *inode;
988 struct v9fs_fcall *fcall; 1113 struct v9fs_fcall *fcall;
989 struct v9fs_fid *fid;
990 struct v9fs_wstat wstat; 1114 struct v9fs_wstat wstat;
991 1115
992 v9ses = v9fs_inode2v9ses(dir);
993 retval = -EPERM;
994 fcall = NULL; 1116 fcall = NULL;
1117 inode = NULL;
1118 vfid = NULL;
1119 v9ses = v9fs_inode2v9ses(dir);
1120 dfid = v9fs_fid_lookup(dentry->d_parent);
1121 perm = unixmode2p9mode(v9ses, mode);
995 1122
996 if (!v9ses->extended) { 1123 if (!v9ses->extended) {
997 dprintk(DEBUG_ERROR, "not extended\n"); 1124 dprintk(DEBUG_ERROR, "not extended\n");
998 goto free_mem; 1125 return -EPERM;
999 } 1126 }
1000 1127
1001 /* issue a create */ 1128 err = v9fs_create(v9ses, dfid->fid, (char *) dentry->d_name.name,
1002 retval = v9fs_create(dir, dentry, mode, 0); 1129 perm, V9FS_OREAD, &fid, NULL, NULL);
1003 if (retval != 0)
1004 goto free_mem;
1005 1130
1006 fid = v9fs_fid_get_created(dentry); 1131 if (err)
1007 if (!fid) { 1132 goto error;
1008 dprintk(DEBUG_ERROR, "couldn't resolve fid from dentry\n"); 1133
1009 goto free_mem; 1134 err = v9fs_t_clunk(v9ses, fid);
1135 if (err)
1136 goto error;
1137
1138 vfid = v9fs_clone_walk(v9ses, dfid->fid, dentry);
1139 if (IS_ERR(vfid)) {
1140 err = PTR_ERR(vfid);
1141 vfid = NULL;
1142 goto error;
1143 }
1144
1145 inode = v9fs_inode_from_fid(v9ses, vfid->fid, dir->i_sb);
1146 if (IS_ERR(inode)) {
1147 err = PTR_ERR(inode);
1148 inode = NULL;
1149 goto error;
1010 } 1150 }
1011 1151
1012 /* issue a Twstat */ 1152 /* issue a Twstat */
1013 v9fs_blank_wstat(&wstat); 1153 v9fs_blank_wstat(&wstat);
1014 wstat.muid = v9ses->name; 1154 wstat.muid = v9ses->name;
1015 wstat.extension = (char *) extension; 1155 wstat.extension = (char *) extension;
1016 retval = v9fs_t_wstat(v9ses, fid->fid, &wstat, &fcall); 1156 err = v9fs_t_wstat(v9ses, vfid->fid, &wstat, &fcall);
1017 if (retval < 0) {
1018 PRINT_FCALL_ERROR("wstat error", fcall);
1019 goto free_mem;
1020 }
1021
1022 err = v9fs_t_clunk(v9ses, fid->fid);
1023 if (err < 0) { 1157 if (err < 0) {
1024 dprintk(DEBUG_ERROR, "clunk failed: %d\n", err); 1158 PRINT_FCALL_ERROR("wstat error", fcall);
1025 goto free_mem; 1159 goto error;
1026 } 1160 }
1027 1161
1028 d_drop(dentry); /* FID - will this also clunk? */ 1162 kfree(fcall);
1163 dentry->d_op = &v9fs_dentry_operations;
1164 d_instantiate(dentry, inode);
1165 return 0;
1029 1166
1030free_mem: 1167error:
1031 kfree(fcall); 1168 kfree(fcall);
1032 return retval; 1169 if (vfid)
1170 v9fs_fid_destroy(vfid);
1171
1172 if (inode)
1173 iput(inode);
1174
1175 return err;
1176
1033} 1177}
1034 1178
1035/** 1179/**
diff --git a/fs/9p/vfs_super.c b/fs/9p/vfs_super.c
index 2c4fa75be025..d05318fa684e 100644
--- a/fs/9p/vfs_super.c
+++ b/fs/9p/vfs_super.c
@@ -146,7 +146,6 @@ static struct super_block *v9fs_get_sb(struct file_system_type
146 inode->i_gid = gid; 146 inode->i_gid = gid;
147 147
148 root = d_alloc_root(inode); 148 root = d_alloc_root(inode);
149
150 if (!root) { 149 if (!root) {
151 retval = -ENOMEM; 150 retval = -ENOMEM;
152 goto put_back_sb; 151 goto put_back_sb;
@@ -158,15 +157,20 @@ static struct super_block *v9fs_get_sb(struct file_system_type
158 if (stat_result < 0) { 157 if (stat_result < 0) {
159 dprintk(DEBUG_ERROR, "stat error\n"); 158 dprintk(DEBUG_ERROR, "stat error\n");
160 v9fs_t_clunk(v9ses, newfid); 159 v9fs_t_clunk(v9ses, newfid);
161 v9fs_put_idpool(newfid, &v9ses->fidpool);
162 } else { 160 } else {
163 /* Setup the Root Inode */ 161 /* Setup the Root Inode */
164 root_fid = v9fs_fid_create(root, v9ses, newfid, 0); 162 root_fid = v9fs_fid_create(v9ses, newfid);
165 if (root_fid == NULL) { 163 if (root_fid == NULL) {
166 retval = -ENOMEM; 164 retval = -ENOMEM;
167 goto put_back_sb; 165 goto put_back_sb;
168 } 166 }
169 167
168 retval = v9fs_fid_insert(root_fid, root);
169 if (retval < 0) {
170 kfree(fcall);
171 goto put_back_sb;
172 }
173
170 root_fid->qid = fcall->params.rstat.stat.qid; 174 root_fid->qid = fcall->params.rstat.stat.qid;
171 root->d_inode->i_ino = 175 root->d_inode->i_ino =
172 v9fs_qid2ino(&fcall->params.rstat.stat.qid); 176 v9fs_qid2ino(&fcall->params.rstat.stat.qid);
diff --git a/fs/cifs/cifsproto.h b/fs/cifs/cifsproto.h
index 3c03aadaff0c..7b25463d3c14 100644
--- a/fs/cifs/cifsproto.h
+++ b/fs/cifs/cifsproto.h
@@ -52,7 +52,7 @@ extern int SendReceive2(const unsigned int /* xid */ , struct cifsSesInfo *,
52 int * /* type of buf returned */ , const int long_op); 52 int * /* type of buf returned */ , const int long_op);
53extern int checkSMBhdr(struct smb_hdr *smb, __u16 mid); 53extern int checkSMBhdr(struct smb_hdr *smb, __u16 mid);
54extern int checkSMB(struct smb_hdr *smb, __u16 mid, int length); 54extern int checkSMB(struct smb_hdr *smb, __u16 mid, int length);
55extern int is_valid_oplock_break(struct smb_hdr *smb); 55extern int is_valid_oplock_break(struct smb_hdr *smb, struct TCP_Server_Info *);
56extern int is_size_safe_to_change(struct cifsInodeInfo *); 56extern int is_size_safe_to_change(struct cifsInodeInfo *);
57extern struct cifsFileInfo *find_writable_file(struct cifsInodeInfo *); 57extern struct cifsFileInfo *find_writable_file(struct cifsInodeInfo *);
58extern unsigned int smbCalcSize(struct smb_hdr *ptr); 58extern unsigned int smbCalcSize(struct smb_hdr *ptr);
diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c
index ef5ae6f93c75..2a0c1f4ca0ae 100644
--- a/fs/cifs/connect.c
+++ b/fs/cifs/connect.c
@@ -630,7 +630,7 @@ multi_t2_fnd:
630 smallbuf = NULL; 630 smallbuf = NULL;
631 } 631 }
632 wake_up_process(task_to_wake); 632 wake_up_process(task_to_wake);
633 } else if ((is_valid_oplock_break(smb_buffer) == FALSE) 633 } else if ((is_valid_oplock_break(smb_buffer, server) == FALSE)
634 && (isMultiRsp == FALSE)) { 634 && (isMultiRsp == FALSE)) {
635 cERROR(1, ("No task to wake, unknown frame rcvd!")); 635 cERROR(1, ("No task to wake, unknown frame rcvd!"));
636 cifs_dump_mem("Received Data is: ",(char *)smb_buffer, 636 cifs_dump_mem("Received Data is: ",(char *)smb_buffer,
diff --git a/fs/cifs/misc.c b/fs/cifs/misc.c
index 812c6bb0fe38..432ba15e2c2d 100644
--- a/fs/cifs/misc.c
+++ b/fs/cifs/misc.c
@@ -475,7 +475,7 @@ checkSMB(struct smb_hdr *smb, __u16 mid, int length)
475 return 0; 475 return 0;
476} 476}
477int 477int
478is_valid_oplock_break(struct smb_hdr *buf) 478is_valid_oplock_break(struct smb_hdr *buf, struct TCP_Server_Info *srv)
479{ 479{
480 struct smb_com_lock_req * pSMB = (struct smb_com_lock_req *)buf; 480 struct smb_com_lock_req * pSMB = (struct smb_com_lock_req *)buf;
481 struct list_head *tmp; 481 struct list_head *tmp;
@@ -535,7 +535,7 @@ is_valid_oplock_break(struct smb_hdr *buf)
535 read_lock(&GlobalSMBSeslock); 535 read_lock(&GlobalSMBSeslock);
536 list_for_each(tmp, &GlobalTreeConnectionList) { 536 list_for_each(tmp, &GlobalTreeConnectionList) {
537 tcon = list_entry(tmp, struct cifsTconInfo, cifsConnectionList); 537 tcon = list_entry(tmp, struct cifsTconInfo, cifsConnectionList);
538 if (tcon->tid == buf->Tid) { 538 if ((tcon->tid == buf->Tid) && (srv == tcon->ses->server)) {
539 cifs_stats_inc(&tcon->num_oplock_brks); 539 cifs_stats_inc(&tcon->num_oplock_brks);
540 list_for_each(tmp1,&tcon->openFileList){ 540 list_for_each(tmp1,&tcon->openFileList){
541 netfile = list_entry(tmp1,struct cifsFileInfo, 541 netfile = list_entry(tmp1,struct cifsFileInfo,
diff --git a/fs/compat_ioctl.c b/fs/compat_ioctl.c
index 537ac70edfe5..c666769a875d 100644
--- a/fs/compat_ioctl.c
+++ b/fs/compat_ioctl.c
@@ -446,7 +446,7 @@ static int dev_ifconf(unsigned int fd, unsigned int cmd, unsigned long arg)
446 ifr = ifc.ifc_req; 446 ifr = ifc.ifc_req;
447 ifr32 = compat_ptr(ifc32.ifcbuf); 447 ifr32 = compat_ptr(ifc32.ifcbuf);
448 for (i = 0, j = 0; 448 for (i = 0, j = 0;
449 i + sizeof (struct ifreq32) < ifc32.ifc_len && j < ifc.ifc_len; 449 i + sizeof (struct ifreq32) <= ifc32.ifc_len && j < ifc.ifc_len;
450 i += sizeof (struct ifreq32), j += sizeof (struct ifreq)) { 450 i += sizeof (struct ifreq32), j += sizeof (struct ifreq)) {
451 if (copy_in_user(ifr32, ifr, sizeof (struct ifreq32))) 451 if (copy_in_user(ifr32, ifr, sizeof (struct ifreq32)))
452 return -EFAULT; 452 return -EFAULT;
diff --git a/fs/cramfs/inode.c b/fs/cramfs/inode.c
index 7fe85415ae7c..8ad52f5bf255 100644
--- a/fs/cramfs/inode.c
+++ b/fs/cramfs/inode.c
@@ -36,7 +36,7 @@ static DECLARE_MUTEX(read_mutex);
36 36
37/* These two macros may change in future, to provide better st_ino 37/* These two macros may change in future, to provide better st_ino
38 semantics. */ 38 semantics. */
39#define CRAMINO(x) ((x)->offset?(x)->offset<<2:1) 39#define CRAMINO(x) (((x)->offset && (x)->size)?(x)->offset<<2:1)
40#define OFFSET(x) ((x)->i_ino) 40#define OFFSET(x) ((x)->i_ino)
41 41
42 42
@@ -66,8 +66,36 @@ static int cramfs_iget5_test(struct inode *inode, void *opaque)
66 66
67static int cramfs_iget5_set(struct inode *inode, void *opaque) 67static int cramfs_iget5_set(struct inode *inode, void *opaque)
68{ 68{
69 static struct timespec zerotime;
69 struct cramfs_inode *cramfs_inode = opaque; 70 struct cramfs_inode *cramfs_inode = opaque;
71 inode->i_mode = cramfs_inode->mode;
72 inode->i_uid = cramfs_inode->uid;
73 inode->i_size = cramfs_inode->size;
74 inode->i_blocks = (cramfs_inode->size - 1) / 512 + 1;
75 inode->i_blksize = PAGE_CACHE_SIZE;
76 inode->i_gid = cramfs_inode->gid;
77 /* Struct copy intentional */
78 inode->i_mtime = inode->i_atime = inode->i_ctime = zerotime;
70 inode->i_ino = CRAMINO(cramfs_inode); 79 inode->i_ino = CRAMINO(cramfs_inode);
80 /* inode->i_nlink is left 1 - arguably wrong for directories,
81 but it's the best we can do without reading the directory
82 contents. 1 yields the right result in GNU find, even
83 without -noleaf option. */
84 if (S_ISREG(inode->i_mode)) {
85 inode->i_fop = &generic_ro_fops;
86 inode->i_data.a_ops = &cramfs_aops;
87 } else if (S_ISDIR(inode->i_mode)) {
88 inode->i_op = &cramfs_dir_inode_operations;
89 inode->i_fop = &cramfs_directory_operations;
90 } else if (S_ISLNK(inode->i_mode)) {
91 inode->i_op = &page_symlink_inode_operations;
92 inode->i_data.a_ops = &cramfs_aops;
93 } else {
94 inode->i_size = 0;
95 inode->i_blocks = 0;
96 init_special_inode(inode, inode->i_mode,
97 old_decode_dev(cramfs_inode->size));
98 }
71 return 0; 99 return 0;
72} 100}
73 101
@@ -77,37 +105,7 @@ static struct inode *get_cramfs_inode(struct super_block *sb,
77 struct inode *inode = iget5_locked(sb, CRAMINO(cramfs_inode), 105 struct inode *inode = iget5_locked(sb, CRAMINO(cramfs_inode),
78 cramfs_iget5_test, cramfs_iget5_set, 106 cramfs_iget5_test, cramfs_iget5_set,
79 cramfs_inode); 107 cramfs_inode);
80 static struct timespec zerotime;
81
82 if (inode && (inode->i_state & I_NEW)) { 108 if (inode && (inode->i_state & I_NEW)) {
83 inode->i_mode = cramfs_inode->mode;
84 inode->i_uid = cramfs_inode->uid;
85 inode->i_size = cramfs_inode->size;
86 inode->i_blocks = (cramfs_inode->size - 1) / 512 + 1;
87 inode->i_blksize = PAGE_CACHE_SIZE;
88 inode->i_gid = cramfs_inode->gid;
89 /* Struct copy intentional */
90 inode->i_mtime = inode->i_atime = inode->i_ctime = zerotime;
91 inode->i_ino = CRAMINO(cramfs_inode);
92 /* inode->i_nlink is left 1 - arguably wrong for directories,
93 but it's the best we can do without reading the directory
94 contents. 1 yields the right result in GNU find, even
95 without -noleaf option. */
96 if (S_ISREG(inode->i_mode)) {
97 inode->i_fop = &generic_ro_fops;
98 inode->i_data.a_ops = &cramfs_aops;
99 } else if (S_ISDIR(inode->i_mode)) {
100 inode->i_op = &cramfs_dir_inode_operations;
101 inode->i_fop = &cramfs_directory_operations;
102 } else if (S_ISLNK(inode->i_mode)) {
103 inode->i_op = &page_symlink_inode_operations;
104 inode->i_data.a_ops = &cramfs_aops;
105 } else {
106 inode->i_size = 0;
107 inode->i_blocks = 0;
108 init_special_inode(inode, inode->i_mode,
109 old_decode_dev(cramfs_inode->size));
110 }
111 unlock_new_inode(inode); 109 unlock_new_inode(inode);
112 } 110 }
113 return inode; 111 return inode;
diff --git a/fs/dcache.c b/fs/dcache.c
index a173bba32666..11dc83092d4a 100644
--- a/fs/dcache.c
+++ b/fs/dcache.c
@@ -1736,7 +1736,7 @@ void __init vfs_caches_init(unsigned long mempages)
1736 SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL, NULL); 1736 SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL, NULL);
1737 1737
1738 filp_cachep = kmem_cache_create("filp", sizeof(struct file), 0, 1738 filp_cachep = kmem_cache_create("filp", sizeof(struct file), 0,
1739 SLAB_HWCACHE_ALIGN|SLAB_PANIC, filp_ctor, filp_dtor); 1739 SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL, NULL);
1740 1740
1741 dcache_init(mempages); 1741 dcache_init(mempages);
1742 inode_init(mempages); 1742 inode_init(mempages);
diff --git a/fs/ext3/inode.c b/fs/ext3/inode.c
index 3fc4238e9703..0384e539b88f 100644
--- a/fs/ext3/inode.c
+++ b/fs/ext3/inode.c
@@ -1624,15 +1624,14 @@ static int ext3_block_truncate_page(handle_t *handle, struct page *page,
1624 * For "nobh" option, we can only work if we don't need to 1624 * For "nobh" option, we can only work if we don't need to
1625 * read-in the page - otherwise we create buffers to do the IO. 1625 * read-in the page - otherwise we create buffers to do the IO.
1626 */ 1626 */
1627 if (!page_has_buffers(page) && test_opt(inode->i_sb, NOBH)) { 1627 if (!page_has_buffers(page) && test_opt(inode->i_sb, NOBH) &&
1628 if (PageUptodate(page)) { 1628 ext3_should_writeback_data(inode) && PageUptodate(page)) {
1629 kaddr = kmap_atomic(page, KM_USER0); 1629 kaddr = kmap_atomic(page, KM_USER0);
1630 memset(kaddr + offset, 0, length); 1630 memset(kaddr + offset, 0, length);
1631 flush_dcache_page(page); 1631 flush_dcache_page(page);
1632 kunmap_atomic(kaddr, KM_USER0); 1632 kunmap_atomic(kaddr, KM_USER0);
1633 set_page_dirty(page); 1633 set_page_dirty(page);
1634 goto unlock; 1634 goto unlock;
1635 }
1636 } 1635 }
1637 1636
1638 if (!page_has_buffers(page)) 1637 if (!page_has_buffers(page))
diff --git a/fs/ext3/namei.c b/fs/ext3/namei.c
index 8bd8ac077704..b8f5cd1e540d 100644
--- a/fs/ext3/namei.c
+++ b/fs/ext3/namei.c
@@ -2141,7 +2141,8 @@ retry:
2141 * We have a transaction open. All is sweetness. It also sets 2141 * We have a transaction open. All is sweetness. It also sets
2142 * i_size in generic_commit_write(). 2142 * i_size in generic_commit_write().
2143 */ 2143 */
2144 err = page_symlink(inode, symname, l); 2144 err = __page_symlink(inode, symname, l,
2145 mapping_gfp_mask(inode->i_mapping) & ~__GFP_FS);
2145 if (err) { 2146 if (err) {
2146 ext3_dec_count(handle, inode); 2147 ext3_dec_count(handle, inode);
2147 ext3_mark_inode_dirty(handle, inode); 2148 ext3_mark_inode_dirty(handle, inode);
diff --git a/fs/fifo.c b/fs/fifo.c
index 923371b753ab..d13fcd3ec803 100644
--- a/fs/fifo.c
+++ b/fs/fifo.c
@@ -34,10 +34,7 @@ static int fifo_open(struct inode *inode, struct file *filp)
34{ 34{
35 int ret; 35 int ret;
36 36
37 ret = -ERESTARTSYS; 37 mutex_lock(PIPE_MUTEX(*inode));
38 if (mutex_lock_interruptible(PIPE_MUTEX(*inode)))
39 goto err_nolock_nocleanup;
40
41 if (!inode->i_pipe) { 38 if (!inode->i_pipe) {
42 ret = -ENOMEM; 39 ret = -ENOMEM;
43 if(!pipe_new(inode)) 40 if(!pipe_new(inode))
@@ -140,8 +137,6 @@ err:
140 137
141err_nocleanup: 138err_nocleanup:
142 mutex_unlock(PIPE_MUTEX(*inode)); 139 mutex_unlock(PIPE_MUTEX(*inode));
143
144err_nolock_nocleanup:
145 return ret; 140 return ret;
146} 141}
147 142
diff --git a/fs/file_table.c b/fs/file_table.c
index 768b58167543..44fabeaa9415 100644
--- a/fs/file_table.c
+++ b/fs/file_table.c
@@ -5,6 +5,7 @@
5 * Copyright (C) 1997 David S. Miller (davem@caip.rutgers.edu) 5 * Copyright (C) 1997 David S. Miller (davem@caip.rutgers.edu)
6 */ 6 */
7 7
8#include <linux/config.h>
8#include <linux/string.h> 9#include <linux/string.h>
9#include <linux/slab.h> 10#include <linux/slab.h>
10#include <linux/file.h> 11#include <linux/file.h>
@@ -19,52 +20,67 @@
19#include <linux/capability.h> 20#include <linux/capability.h>
20#include <linux/cdev.h> 21#include <linux/cdev.h>
21#include <linux/fsnotify.h> 22#include <linux/fsnotify.h>
23#include <linux/sysctl.h>
24#include <linux/percpu_counter.h>
25
26#include <asm/atomic.h>
22 27
23/* sysctl tunables... */ 28/* sysctl tunables... */
24struct files_stat_struct files_stat = { 29struct files_stat_struct files_stat = {
25 .max_files = NR_FILE 30 .max_files = NR_FILE
26}; 31};
27 32
28EXPORT_SYMBOL(files_stat); /* Needed by unix.o */
29
30/* public. Not pretty! */ 33/* public. Not pretty! */
31 __cacheline_aligned_in_smp DEFINE_SPINLOCK(files_lock); 34__cacheline_aligned_in_smp DEFINE_SPINLOCK(files_lock);
32 35
33static DEFINE_SPINLOCK(filp_count_lock); 36static struct percpu_counter nr_files __cacheline_aligned_in_smp;
34 37
35/* slab constructors and destructors are called from arbitrary 38static inline void file_free_rcu(struct rcu_head *head)
36 * context and must be fully threaded - use a local spinlock
37 * to protect files_stat.nr_files
38 */
39void filp_ctor(void *objp, struct kmem_cache *cachep, unsigned long cflags)
40{ 39{
41 if ((cflags & (SLAB_CTOR_VERIFY|SLAB_CTOR_CONSTRUCTOR)) == 40 struct file *f = container_of(head, struct file, f_u.fu_rcuhead);
42 SLAB_CTOR_CONSTRUCTOR) { 41 kmem_cache_free(filp_cachep, f);
43 unsigned long flags;
44 spin_lock_irqsave(&filp_count_lock, flags);
45 files_stat.nr_files++;
46 spin_unlock_irqrestore(&filp_count_lock, flags);
47 }
48} 42}
49 43
50void filp_dtor(void *objp, struct kmem_cache *cachep, unsigned long dflags) 44static inline void file_free(struct file *f)
51{ 45{
52 unsigned long flags; 46 percpu_counter_dec(&nr_files);
53 spin_lock_irqsave(&filp_count_lock, flags); 47 call_rcu(&f->f_u.fu_rcuhead, file_free_rcu);
54 files_stat.nr_files--;
55 spin_unlock_irqrestore(&filp_count_lock, flags);
56} 48}
57 49
58static inline void file_free_rcu(struct rcu_head *head) 50/*
51 * Return the total number of open files in the system
52 */
53static int get_nr_files(void)
59{ 54{
60 struct file *f = container_of(head, struct file, f_u.fu_rcuhead); 55 return percpu_counter_read_positive(&nr_files);
61 kmem_cache_free(filp_cachep, f);
62} 56}
63 57
64static inline void file_free(struct file *f) 58/*
59 * Return the maximum number of open files in the system
60 */
61int get_max_files(void)
65{ 62{
66 call_rcu(&f->f_u.fu_rcuhead, file_free_rcu); 63 return files_stat.max_files;
67} 64}
65EXPORT_SYMBOL_GPL(get_max_files);
66
67/*
68 * Handle nr_files sysctl
69 */
70#if defined(CONFIG_SYSCTL) && defined(CONFIG_PROC_FS)
71int proc_nr_files(ctl_table *table, int write, struct file *filp,
72 void __user *buffer, size_t *lenp, loff_t *ppos)
73{
74 files_stat.nr_files = get_nr_files();
75 return proc_dointvec(table, write, filp, buffer, lenp, ppos);
76}
77#else
78int proc_nr_files(ctl_table *table, int write, struct file *filp,
79 void __user *buffer, size_t *lenp, loff_t *ppos)
80{
81 return -ENOSYS;
82}
83#endif
68 84
69/* Find an unused file structure and return a pointer to it. 85/* Find an unused file structure and return a pointer to it.
70 * Returns NULL, if there are no more free file structures or 86 * Returns NULL, if there are no more free file structures or
@@ -78,14 +94,20 @@ struct file *get_empty_filp(void)
78 /* 94 /*
79 * Privileged users can go above max_files 95 * Privileged users can go above max_files
80 */ 96 */
81 if (files_stat.nr_files >= files_stat.max_files && 97 if (get_nr_files() >= files_stat.max_files && !capable(CAP_SYS_ADMIN)) {
82 !capable(CAP_SYS_ADMIN)) 98 /*
83 goto over; 99 * percpu_counters are inaccurate. Do an expensive check before
100 * we go and fail.
101 */
102 if (percpu_counter_sum(&nr_files) >= files_stat.max_files)
103 goto over;
104 }
84 105
85 f = kmem_cache_alloc(filp_cachep, GFP_KERNEL); 106 f = kmem_cache_alloc(filp_cachep, GFP_KERNEL);
86 if (f == NULL) 107 if (f == NULL)
87 goto fail; 108 goto fail;
88 109
110 percpu_counter_inc(&nr_files);
89 memset(f, 0, sizeof(*f)); 111 memset(f, 0, sizeof(*f));
90 if (security_file_alloc(f)) 112 if (security_file_alloc(f))
91 goto fail_sec; 113 goto fail_sec;
@@ -101,10 +123,10 @@ struct file *get_empty_filp(void)
101 123
102over: 124over:
103 /* Ran out of filps - report that */ 125 /* Ran out of filps - report that */
104 if (files_stat.nr_files > old_max) { 126 if (get_nr_files() > old_max) {
105 printk(KERN_INFO "VFS: file-max limit %d reached\n", 127 printk(KERN_INFO "VFS: file-max limit %d reached\n",
106 files_stat.max_files); 128 get_max_files());
107 old_max = files_stat.nr_files; 129 old_max = get_nr_files();
108 } 130 }
109 goto fail; 131 goto fail;
110 132
@@ -276,4 +298,5 @@ void __init files_init(unsigned long mempages)
276 if (files_stat.max_files < NR_FILE) 298 if (files_stat.max_files < NR_FILE)
277 files_stat.max_files = NR_FILE; 299 files_stat.max_files = NR_FILE;
278 files_defer_init(); 300 files_defer_init();
301 percpu_counter_init(&nr_files);
279} 302}
diff --git a/fs/jffs2/nodelist.c b/fs/jffs2/nodelist.c
index b635e167a3fa..d4d0c41490cd 100644
--- a/fs/jffs2/nodelist.c
+++ b/fs/jffs2/nodelist.c
@@ -406,7 +406,8 @@ static int check_node_data(struct jffs2_sb_info *c, struct jffs2_tmp_dnode_info
406 int err = 0, pointed = 0; 406 int err = 0, pointed = 0;
407 struct jffs2_eraseblock *jeb; 407 struct jffs2_eraseblock *jeb;
408 unsigned char *buffer; 408 unsigned char *buffer;
409 uint32_t crc, ofs, retlen, len; 409 uint32_t crc, ofs, len;
410 size_t retlen;
410 411
411 BUG_ON(tn->csize == 0); 412 BUG_ON(tn->csize == 0);
412 413
diff --git a/fs/jffs2/readinode.c b/fs/jffs2/readinode.c
index 5f0652df5d47..f1695642d0f7 100644
--- a/fs/jffs2/readinode.c
+++ b/fs/jffs2/readinode.c
@@ -112,7 +112,7 @@ static struct jffs2_raw_node_ref *jffs2_first_valid_node(struct jffs2_raw_node_r
112 * negative error code on failure. 112 * negative error code on failure.
113 */ 113 */
114static inline int read_direntry(struct jffs2_sb_info *c, struct jffs2_raw_node_ref *ref, 114static inline int read_direntry(struct jffs2_sb_info *c, struct jffs2_raw_node_ref *ref,
115 struct jffs2_raw_dirent *rd, uint32_t read, struct jffs2_full_dirent **fdp, 115 struct jffs2_raw_dirent *rd, size_t read, struct jffs2_full_dirent **fdp,
116 uint32_t *latest_mctime, uint32_t *mctime_ver) 116 uint32_t *latest_mctime, uint32_t *mctime_ver)
117{ 117{
118 struct jffs2_full_dirent *fd; 118 struct jffs2_full_dirent *fd;
diff --git a/fs/jffs2/scan.c b/fs/jffs2/scan.c
index 3e51dd1da8aa..cf55b221fc2b 100644
--- a/fs/jffs2/scan.c
+++ b/fs/jffs2/scan.c
@@ -233,7 +233,7 @@ int jffs2_scan_medium(struct jffs2_sb_info *c)
233 c->nextblock->dirty_size = 0; 233 c->nextblock->dirty_size = 0;
234 } 234 }
235#ifdef CONFIG_JFFS2_FS_WRITEBUFFER 235#ifdef CONFIG_JFFS2_FS_WRITEBUFFER
236 if (!jffs2_can_mark_obsolete(c) && c->nextblock && (c->nextblock->free_size % c->wbuf_pagesize)) { 236 if (!jffs2_can_mark_obsolete(c) && c->wbuf_pagesize && c->nextblock && (c->nextblock->free_size % c->wbuf_pagesize)) {
237 /* If we're going to start writing into a block which already 237 /* If we're going to start writing into a block which already
238 contains data, and the end of the data isn't page-aligned, 238 contains data, and the end of the data isn't page-aligned,
239 skip a little and align it. */ 239 skip a little and align it. */
diff --git a/fs/namei.c b/fs/namei.c
index 557dcf395ca1..8dc2b038d5d9 100644
--- a/fs/namei.c
+++ b/fs/namei.c
@@ -2613,13 +2613,15 @@ void page_put_link(struct dentry *dentry, struct nameidata *nd, void *cookie)
2613 } 2613 }
2614} 2614}
2615 2615
2616int page_symlink(struct inode *inode, const char *symname, int len) 2616int __page_symlink(struct inode *inode, const char *symname, int len,
2617 gfp_t gfp_mask)
2617{ 2618{
2618 struct address_space *mapping = inode->i_mapping; 2619 struct address_space *mapping = inode->i_mapping;
2619 struct page *page = grab_cache_page(mapping, 0); 2620 struct page *page;
2620 int err = -ENOMEM; 2621 int err = -ENOMEM;
2621 char *kaddr; 2622 char *kaddr;
2622 2623
2624 page = find_or_create_page(mapping, 0, gfp_mask);
2623 if (!page) 2625 if (!page)
2624 goto fail; 2626 goto fail;
2625 err = mapping->a_ops->prepare_write(NULL, page, 0, len-1); 2627 err = mapping->a_ops->prepare_write(NULL, page, 0, len-1);
@@ -2654,6 +2656,12 @@ fail:
2654 return err; 2656 return err;
2655} 2657}
2656 2658
2659int page_symlink(struct inode *inode, const char *symname, int len)
2660{
2661 return __page_symlink(inode, symname, len,
2662 mapping_gfp_mask(inode->i_mapping));
2663}
2664
2657struct inode_operations page_symlink_inode_operations = { 2665struct inode_operations page_symlink_inode_operations = {
2658 .readlink = generic_readlink, 2666 .readlink = generic_readlink,
2659 .follow_link = page_follow_link_light, 2667 .follow_link = page_follow_link_light,
@@ -2672,6 +2680,7 @@ EXPORT_SYMBOL(lookup_one_len);
2672EXPORT_SYMBOL(page_follow_link_light); 2680EXPORT_SYMBOL(page_follow_link_light);
2673EXPORT_SYMBOL(page_put_link); 2681EXPORT_SYMBOL(page_put_link);
2674EXPORT_SYMBOL(page_readlink); 2682EXPORT_SYMBOL(page_readlink);
2683EXPORT_SYMBOL(__page_symlink);
2675EXPORT_SYMBOL(page_symlink); 2684EXPORT_SYMBOL(page_symlink);
2676EXPORT_SYMBOL(page_symlink_inode_operations); 2685EXPORT_SYMBOL(page_symlink_inode_operations);
2677EXPORT_SYMBOL(path_lookup); 2686EXPORT_SYMBOL(path_lookup);
diff --git a/fs/ocfs2/cluster/masklog.c b/fs/ocfs2/cluster/masklog.c
index fd741cea5705..636593bf4d17 100644
--- a/fs/ocfs2/cluster/masklog.c
+++ b/fs/ocfs2/cluster/masklog.c
@@ -74,6 +74,7 @@ struct mlog_attribute {
74#define define_mask(_name) { \ 74#define define_mask(_name) { \
75 .attr = { \ 75 .attr = { \
76 .name = #_name, \ 76 .name = #_name, \
77 .owner = THIS_MODULE, \
77 .mode = S_IRUGO | S_IWUSR, \ 78 .mode = S_IRUGO | S_IWUSR, \
78 }, \ 79 }, \
79 .mask = ML_##_name, \ 80 .mask = ML_##_name, \
diff --git a/fs/ocfs2/cluster/masklog.h b/fs/ocfs2/cluster/masklog.h
index e8c56a3d9c64..2cadc3009c83 100644
--- a/fs/ocfs2/cluster/masklog.h
+++ b/fs/ocfs2/cluster/masklog.h
@@ -256,7 +256,7 @@ extern struct mlog_bits mlog_and_bits, mlog_not_bits;
256 } \ 256 } \
257} while (0) 257} while (0)
258 258
259#if (BITS_PER_LONG == 32) || defined(CONFIG_X86_64) 259#if (BITS_PER_LONG == 32) || defined(CONFIG_X86_64) || (defined(CONFIG_UML_X86) && defined(CONFIG_64BIT))
260#define MLFi64 "lld" 260#define MLFi64 "lld"
261#define MLFu64 "llu" 261#define MLFu64 "llu"
262#define MLFx64 "llx" 262#define MLFx64 "llx"
diff --git a/fs/ocfs2/cluster/nodemanager.c b/fs/ocfs2/cluster/nodemanager.c
index cf7828f23361..e1fceb8aa32d 100644
--- a/fs/ocfs2/cluster/nodemanager.c
+++ b/fs/ocfs2/cluster/nodemanager.c
@@ -756,7 +756,7 @@ static int __init init_o2nm(void)
756 if (!ocfs2_table_header) { 756 if (!ocfs2_table_header) {
757 printk(KERN_ERR "nodemanager: unable to register sysctl\n"); 757 printk(KERN_ERR "nodemanager: unable to register sysctl\n");
758 ret = -ENOMEM; /* or something. */ 758 ret = -ENOMEM; /* or something. */
759 goto out; 759 goto out_o2net;
760 } 760 }
761 761
762 ret = o2net_register_hb_callbacks(); 762 ret = o2net_register_hb_callbacks();
@@ -780,6 +780,8 @@ out_callbacks:
780 o2net_unregister_hb_callbacks(); 780 o2net_unregister_hb_callbacks();
781out_sysctl: 781out_sysctl:
782 unregister_sysctl_table(ocfs2_table_header); 782 unregister_sysctl_table(ocfs2_table_header);
783out_o2net:
784 o2net_exit();
783out: 785out:
784 return ret; 786 return ret;
785} 787}
diff --git a/fs/ocfs2/cluster/tcp.c b/fs/ocfs2/cluster/tcp.c
index d22d4cf08db1..0f60cc0d3985 100644
--- a/fs/ocfs2/cluster/tcp.c
+++ b/fs/ocfs2/cluster/tcp.c
@@ -1318,7 +1318,7 @@ static void o2net_start_connect(void *arg)
1318{ 1318{
1319 struct o2net_node *nn = arg; 1319 struct o2net_node *nn = arg;
1320 struct o2net_sock_container *sc = NULL; 1320 struct o2net_sock_container *sc = NULL;
1321 struct o2nm_node *node = NULL; 1321 struct o2nm_node *node = NULL, *mynode = NULL;
1322 struct socket *sock = NULL; 1322 struct socket *sock = NULL;
1323 struct sockaddr_in myaddr = {0, }, remoteaddr = {0, }; 1323 struct sockaddr_in myaddr = {0, }, remoteaddr = {0, };
1324 int ret = 0; 1324 int ret = 0;
@@ -1334,6 +1334,12 @@ static void o2net_start_connect(void *arg)
1334 goto out; 1334 goto out;
1335 } 1335 }
1336 1336
1337 mynode = o2nm_get_node_by_num(o2nm_this_node());
1338 if (mynode == NULL) {
1339 ret = 0;
1340 goto out;
1341 }
1342
1337 spin_lock(&nn->nn_lock); 1343 spin_lock(&nn->nn_lock);
1338 /* see if we already have one pending or have given up */ 1344 /* see if we already have one pending or have given up */
1339 if (nn->nn_sc || nn->nn_persistent_error) 1345 if (nn->nn_sc || nn->nn_persistent_error)
@@ -1361,12 +1367,14 @@ static void o2net_start_connect(void *arg)
1361 sock->sk->sk_allocation = GFP_ATOMIC; 1367 sock->sk->sk_allocation = GFP_ATOMIC;
1362 1368
1363 myaddr.sin_family = AF_INET; 1369 myaddr.sin_family = AF_INET;
1370 myaddr.sin_addr.s_addr = (__force u32)mynode->nd_ipv4_address;
1364 myaddr.sin_port = (__force u16)htons(0); /* any port */ 1371 myaddr.sin_port = (__force u16)htons(0); /* any port */
1365 1372
1366 ret = sock->ops->bind(sock, (struct sockaddr *)&myaddr, 1373 ret = sock->ops->bind(sock, (struct sockaddr *)&myaddr,
1367 sizeof(myaddr)); 1374 sizeof(myaddr));
1368 if (ret) { 1375 if (ret) {
1369 mlog(0, "bind failed: %d\n", ret); 1376 mlog(ML_ERROR, "bind failed with %d at address %u.%u.%u.%u\n",
1377 ret, NIPQUAD(mynode->nd_ipv4_address));
1370 goto out; 1378 goto out;
1371 } 1379 }
1372 1380
@@ -1407,6 +1415,8 @@ out:
1407 sc_put(sc); 1415 sc_put(sc);
1408 if (node) 1416 if (node)
1409 o2nm_node_put(node); 1417 o2nm_node_put(node);
1418 if (mynode)
1419 o2nm_node_put(mynode);
1410 1420
1411 return; 1421 return;
1412} 1422}
diff --git a/fs/ocfs2/cluster/tcp.h b/fs/ocfs2/cluster/tcp.h
index a6f4585501c8..616ff2b8434a 100644
--- a/fs/ocfs2/cluster/tcp.h
+++ b/fs/ocfs2/cluster/tcp.h
@@ -85,13 +85,10 @@ enum {
85 O2NET_DRIVER_READY, 85 O2NET_DRIVER_READY,
86}; 86};
87 87
88int o2net_init_tcp_sock(struct inode *inode);
89int o2net_send_message(u32 msg_type, u32 key, void *data, u32 len, 88int o2net_send_message(u32 msg_type, u32 key, void *data, u32 len,
90 u8 target_node, int *status); 89 u8 target_node, int *status);
91int o2net_send_message_vec(u32 msg_type, u32 key, struct kvec *vec, 90int o2net_send_message_vec(u32 msg_type, u32 key, struct kvec *vec,
92 size_t veclen, u8 target_node, int *status); 91 size_t veclen, u8 target_node, int *status);
93int o2net_broadcast_message(u32 msg_type, u32 key, void *data, u32 len,
94 struct inode *group);
95 92
96int o2net_register_handler(u32 msg_type, u32 key, u32 max_len, 93int o2net_register_handler(u32 msg_type, u32 key, u32 max_len,
97 o2net_msg_handler_func *func, void *data, 94 o2net_msg_handler_func *func, void *data,
@@ -107,7 +104,5 @@ void o2net_disconnect_node(struct o2nm_node *node);
107 104
108int o2net_init(void); 105int o2net_init(void);
109void o2net_exit(void); 106void o2net_exit(void);
110int o2net_proc_init(struct proc_dir_entry *parent);
111void o2net_proc_exit(struct proc_dir_entry *parent);
112 107
113#endif /* O2CLUSTER_TCP_H */ 108#endif /* O2CLUSTER_TCP_H */
diff --git a/fs/ocfs2/dlm/dlmcommon.h b/fs/ocfs2/dlm/dlmcommon.h
index 23ceaa7127b4..9c772583744a 100644
--- a/fs/ocfs2/dlm/dlmcommon.h
+++ b/fs/ocfs2/dlm/dlmcommon.h
@@ -37,9 +37,7 @@
37#define DLM_THREAD_SHUFFLE_INTERVAL 5 // flush everything every 5 passes 37#define DLM_THREAD_SHUFFLE_INTERVAL 5 // flush everything every 5 passes
38#define DLM_THREAD_MS 200 // flush at least every 200 ms 38#define DLM_THREAD_MS 200 // flush at least every 200 ms
39 39
40#define DLM_HASH_BITS 7 40#define DLM_HASH_BUCKETS (PAGE_SIZE / sizeof(struct hlist_head))
41#define DLM_HASH_SIZE (1 << DLM_HASH_BITS)
42#define DLM_HASH_MASK (DLM_HASH_SIZE - 1)
43 41
44enum dlm_ast_type { 42enum dlm_ast_type {
45 DLM_AST = 0, 43 DLM_AST = 0,
@@ -87,7 +85,7 @@ enum dlm_ctxt_state {
87struct dlm_ctxt 85struct dlm_ctxt
88{ 86{
89 struct list_head list; 87 struct list_head list;
90 struct list_head *resources; 88 struct hlist_head *lockres_hash;
91 struct list_head dirty_list; 89 struct list_head dirty_list;
92 struct list_head purge_list; 90 struct list_head purge_list;
93 struct list_head pending_asts; 91 struct list_head pending_asts;
@@ -217,7 +215,7 @@ struct dlm_lock_resource
217{ 215{
218 /* WARNING: Please see the comment in dlm_init_lockres before 216 /* WARNING: Please see the comment in dlm_init_lockres before
219 * adding fields here. */ 217 * adding fields here. */
220 struct list_head list; 218 struct hlist_node hash_node;
221 struct kref refs; 219 struct kref refs;
222 220
223 /* please keep these next 3 in this order 221 /* please keep these next 3 in this order
diff --git a/fs/ocfs2/dlm/dlmdebug.c b/fs/ocfs2/dlm/dlmdebug.c
index f339fe27975a..54f61b76ab51 100644
--- a/fs/ocfs2/dlm/dlmdebug.c
+++ b/fs/ocfs2/dlm/dlmdebug.c
@@ -117,8 +117,8 @@ EXPORT_SYMBOL_GPL(dlm_print_one_lock);
117void dlm_dump_lock_resources(struct dlm_ctxt *dlm) 117void dlm_dump_lock_resources(struct dlm_ctxt *dlm)
118{ 118{
119 struct dlm_lock_resource *res; 119 struct dlm_lock_resource *res;
120 struct list_head *iter; 120 struct hlist_node *iter;
121 struct list_head *bucket; 121 struct hlist_head *bucket;
122 int i; 122 int i;
123 123
124 mlog(ML_NOTICE, "struct dlm_ctxt: %s, node=%u, key=%u\n", 124 mlog(ML_NOTICE, "struct dlm_ctxt: %s, node=%u, key=%u\n",
@@ -129,12 +129,10 @@ void dlm_dump_lock_resources(struct dlm_ctxt *dlm)
129 } 129 }
130 130
131 spin_lock(&dlm->spinlock); 131 spin_lock(&dlm->spinlock);
132 for (i=0; i<DLM_HASH_SIZE; i++) { 132 for (i=0; i<DLM_HASH_BUCKETS; i++) {
133 bucket = &(dlm->resources[i]); 133 bucket = &(dlm->lockres_hash[i]);
134 list_for_each(iter, bucket) { 134 hlist_for_each_entry(res, iter, bucket, hash_node)
135 res = list_entry(iter, struct dlm_lock_resource, list);
136 dlm_print_one_lock_resource(res); 135 dlm_print_one_lock_resource(res);
137 }
138 } 136 }
139 spin_unlock(&dlm->spinlock); 137 spin_unlock(&dlm->spinlock);
140} 138}
diff --git a/fs/ocfs2/dlm/dlmdomain.c b/fs/ocfs2/dlm/dlmdomain.c
index 6ee30837389c..8f3a9e3106fd 100644
--- a/fs/ocfs2/dlm/dlmdomain.c
+++ b/fs/ocfs2/dlm/dlmdomain.c
@@ -77,26 +77,26 @@ static void dlm_unregister_domain_handlers(struct dlm_ctxt *dlm);
77 77
78void __dlm_unhash_lockres(struct dlm_lock_resource *lockres) 78void __dlm_unhash_lockres(struct dlm_lock_resource *lockres)
79{ 79{
80 list_del_init(&lockres->list); 80 hlist_del_init(&lockres->hash_node);
81 dlm_lockres_put(lockres); 81 dlm_lockres_put(lockres);
82} 82}
83 83
84void __dlm_insert_lockres(struct dlm_ctxt *dlm, 84void __dlm_insert_lockres(struct dlm_ctxt *dlm,
85 struct dlm_lock_resource *res) 85 struct dlm_lock_resource *res)
86{ 86{
87 struct list_head *bucket; 87 struct hlist_head *bucket;
88 struct qstr *q; 88 struct qstr *q;
89 89
90 assert_spin_locked(&dlm->spinlock); 90 assert_spin_locked(&dlm->spinlock);
91 91
92 q = &res->lockname; 92 q = &res->lockname;
93 q->hash = full_name_hash(q->name, q->len); 93 q->hash = full_name_hash(q->name, q->len);
94 bucket = &(dlm->resources[q->hash & DLM_HASH_MASK]); 94 bucket = &(dlm->lockres_hash[q->hash % DLM_HASH_BUCKETS]);
95 95
96 /* get a reference for our hashtable */ 96 /* get a reference for our hashtable */
97 dlm_lockres_get(res); 97 dlm_lockres_get(res);
98 98
99 list_add_tail(&res->list, bucket); 99 hlist_add_head(&res->hash_node, bucket);
100} 100}
101 101
102struct dlm_lock_resource * __dlm_lookup_lockres(struct dlm_ctxt *dlm, 102struct dlm_lock_resource * __dlm_lookup_lockres(struct dlm_ctxt *dlm,
@@ -104,9 +104,9 @@ struct dlm_lock_resource * __dlm_lookup_lockres(struct dlm_ctxt *dlm,
104 unsigned int len) 104 unsigned int len)
105{ 105{
106 unsigned int hash; 106 unsigned int hash;
107 struct list_head *iter; 107 struct hlist_node *iter;
108 struct dlm_lock_resource *tmpres=NULL; 108 struct dlm_lock_resource *tmpres=NULL;
109 struct list_head *bucket; 109 struct hlist_head *bucket;
110 110
111 mlog_entry("%.*s\n", len, name); 111 mlog_entry("%.*s\n", len, name);
112 112
@@ -114,11 +114,11 @@ struct dlm_lock_resource * __dlm_lookup_lockres(struct dlm_ctxt *dlm,
114 114
115 hash = full_name_hash(name, len); 115 hash = full_name_hash(name, len);
116 116
117 bucket = &(dlm->resources[hash & DLM_HASH_MASK]); 117 bucket = &(dlm->lockres_hash[hash % DLM_HASH_BUCKETS]);
118 118
119 /* check for pre-existing lock */ 119 /* check for pre-existing lock */
120 list_for_each(iter, bucket) { 120 hlist_for_each(iter, bucket) {
121 tmpres = list_entry(iter, struct dlm_lock_resource, list); 121 tmpres = hlist_entry(iter, struct dlm_lock_resource, hash_node);
122 if (tmpres->lockname.len == len && 122 if (tmpres->lockname.len == len &&
123 memcmp(tmpres->lockname.name, name, len) == 0) { 123 memcmp(tmpres->lockname.name, name, len) == 0) {
124 dlm_lockres_get(tmpres); 124 dlm_lockres_get(tmpres);
@@ -193,8 +193,8 @@ static int dlm_wait_on_domain_helper(const char *domain)
193 193
194static void dlm_free_ctxt_mem(struct dlm_ctxt *dlm) 194static void dlm_free_ctxt_mem(struct dlm_ctxt *dlm)
195{ 195{
196 if (dlm->resources) 196 if (dlm->lockres_hash)
197 free_page((unsigned long) dlm->resources); 197 free_page((unsigned long) dlm->lockres_hash);
198 198
199 if (dlm->name) 199 if (dlm->name)
200 kfree(dlm->name); 200 kfree(dlm->name);
@@ -303,10 +303,10 @@ static void dlm_migrate_all_locks(struct dlm_ctxt *dlm)
303 mlog(0, "Migrating locks from domain %s\n", dlm->name); 303 mlog(0, "Migrating locks from domain %s\n", dlm->name);
304restart: 304restart:
305 spin_lock(&dlm->spinlock); 305 spin_lock(&dlm->spinlock);
306 for (i=0; i<DLM_HASH_SIZE; i++) { 306 for (i = 0; i < DLM_HASH_BUCKETS; i++) {
307 while (!list_empty(&dlm->resources[i])) { 307 while (!hlist_empty(&dlm->lockres_hash[i])) {
308 res = list_entry(dlm->resources[i].next, 308 res = hlist_entry(dlm->lockres_hash[i].first,
309 struct dlm_lock_resource, list); 309 struct dlm_lock_resource, hash_node);
310 /* need reference when manually grabbing lockres */ 310 /* need reference when manually grabbing lockres */
311 dlm_lockres_get(res); 311 dlm_lockres_get(res);
312 /* this should unhash the lockres 312 /* this should unhash the lockres
@@ -1191,18 +1191,17 @@ static struct dlm_ctxt *dlm_alloc_ctxt(const char *domain,
1191 goto leave; 1191 goto leave;
1192 } 1192 }
1193 1193
1194 dlm->resources = (struct list_head *) __get_free_page(GFP_KERNEL); 1194 dlm->lockres_hash = (struct hlist_head *) __get_free_page(GFP_KERNEL);
1195 if (!dlm->resources) { 1195 if (!dlm->lockres_hash) {
1196 mlog_errno(-ENOMEM); 1196 mlog_errno(-ENOMEM);
1197 kfree(dlm->name); 1197 kfree(dlm->name);
1198 kfree(dlm); 1198 kfree(dlm);
1199 dlm = NULL; 1199 dlm = NULL;
1200 goto leave; 1200 goto leave;
1201 } 1201 }
1202 memset(dlm->resources, 0, PAGE_SIZE);
1203 1202
1204 for (i=0; i<DLM_HASH_SIZE; i++) 1203 for (i=0; i<DLM_HASH_BUCKETS; i++)
1205 INIT_LIST_HEAD(&dlm->resources[i]); 1204 INIT_HLIST_HEAD(&dlm->lockres_hash[i]);
1206 1205
1207 strcpy(dlm->name, domain); 1206 strcpy(dlm->name, domain);
1208 dlm->key = key; 1207 dlm->key = key;
diff --git a/fs/ocfs2/dlm/dlmmaster.c b/fs/ocfs2/dlm/dlmmaster.c
index 2e2e95e69499..847dd3cc4cf5 100644
--- a/fs/ocfs2/dlm/dlmmaster.c
+++ b/fs/ocfs2/dlm/dlmmaster.c
@@ -564,7 +564,7 @@ static void dlm_lockres_release(struct kref *kref)
564 564
565 /* By the time we're ready to blow this guy away, we shouldn't 565 /* By the time we're ready to blow this guy away, we shouldn't
566 * be on any lists. */ 566 * be on any lists. */
567 BUG_ON(!list_empty(&res->list)); 567 BUG_ON(!hlist_unhashed(&res->hash_node));
568 BUG_ON(!list_empty(&res->granted)); 568 BUG_ON(!list_empty(&res->granted));
569 BUG_ON(!list_empty(&res->converting)); 569 BUG_ON(!list_empty(&res->converting));
570 BUG_ON(!list_empty(&res->blocked)); 570 BUG_ON(!list_empty(&res->blocked));
@@ -605,7 +605,7 @@ static void dlm_init_lockres(struct dlm_ctxt *dlm,
605 605
606 init_waitqueue_head(&res->wq); 606 init_waitqueue_head(&res->wq);
607 spin_lock_init(&res->spinlock); 607 spin_lock_init(&res->spinlock);
608 INIT_LIST_HEAD(&res->list); 608 INIT_HLIST_NODE(&res->hash_node);
609 INIT_LIST_HEAD(&res->granted); 609 INIT_LIST_HEAD(&res->granted);
610 INIT_LIST_HEAD(&res->converting); 610 INIT_LIST_HEAD(&res->converting);
611 INIT_LIST_HEAD(&res->blocked); 611 INIT_LIST_HEAD(&res->blocked);
diff --git a/fs/ocfs2/dlm/dlmrecovery.c b/fs/ocfs2/dlm/dlmrecovery.c
index ed76bda1a534..1e232000f3f7 100644
--- a/fs/ocfs2/dlm/dlmrecovery.c
+++ b/fs/ocfs2/dlm/dlmrecovery.c
@@ -1693,7 +1693,10 @@ static void dlm_finish_local_lockres_recovery(struct dlm_ctxt *dlm,
1693 u8 dead_node, u8 new_master) 1693 u8 dead_node, u8 new_master)
1694{ 1694{
1695 int i; 1695 int i;
1696 struct list_head *iter, *iter2, *bucket; 1696 struct list_head *iter, *iter2;
1697 struct hlist_node *hash_iter;
1698 struct hlist_head *bucket;
1699
1697 struct dlm_lock_resource *res; 1700 struct dlm_lock_resource *res;
1698 1701
1699 mlog_entry_void(); 1702 mlog_entry_void();
@@ -1717,10 +1720,9 @@ static void dlm_finish_local_lockres_recovery(struct dlm_ctxt *dlm,
1717 * for now we need to run the whole hash, clear 1720 * for now we need to run the whole hash, clear
1718 * the RECOVERING state and set the owner 1721 * the RECOVERING state and set the owner
1719 * if necessary */ 1722 * if necessary */
1720 for (i=0; i<DLM_HASH_SIZE; i++) { 1723 for (i = 0; i < DLM_HASH_BUCKETS; i++) {
1721 bucket = &(dlm->resources[i]); 1724 bucket = &(dlm->lockres_hash[i]);
1722 list_for_each(iter, bucket) { 1725 hlist_for_each_entry(res, hash_iter, bucket, hash_node) {
1723 res = list_entry (iter, struct dlm_lock_resource, list);
1724 if (res->state & DLM_LOCK_RES_RECOVERING) { 1726 if (res->state & DLM_LOCK_RES_RECOVERING) {
1725 if (res->owner == dead_node) { 1727 if (res->owner == dead_node) {
1726 mlog(0, "(this=%u) res %.*s owner=%u " 1728 mlog(0, "(this=%u) res %.*s owner=%u "
@@ -1852,10 +1854,10 @@ static void dlm_free_dead_locks(struct dlm_ctxt *dlm,
1852 1854
1853static void dlm_do_local_recovery_cleanup(struct dlm_ctxt *dlm, u8 dead_node) 1855static void dlm_do_local_recovery_cleanup(struct dlm_ctxt *dlm, u8 dead_node)
1854{ 1856{
1855 struct list_head *iter; 1857 struct hlist_node *iter;
1856 struct dlm_lock_resource *res; 1858 struct dlm_lock_resource *res;
1857 int i; 1859 int i;
1858 struct list_head *bucket; 1860 struct hlist_head *bucket;
1859 struct dlm_lock *lock; 1861 struct dlm_lock *lock;
1860 1862
1861 1863
@@ -1876,10 +1878,9 @@ static void dlm_do_local_recovery_cleanup(struct dlm_ctxt *dlm, u8 dead_node)
1876 * can be kicked again to see if any ASTs or BASTs 1878 * can be kicked again to see if any ASTs or BASTs
1877 * need to be fired as a result. 1879 * need to be fired as a result.
1878 */ 1880 */
1879 for (i=0; i<DLM_HASH_SIZE; i++) { 1881 for (i = 0; i < DLM_HASH_BUCKETS; i++) {
1880 bucket = &(dlm->resources[i]); 1882 bucket = &(dlm->lockres_hash[i]);
1881 list_for_each(iter, bucket) { 1883 hlist_for_each_entry(res, iter, bucket, hash_node) {
1882 res = list_entry (iter, struct dlm_lock_resource, list);
1883 /* always prune any $RECOVERY entries for dead nodes, 1884 /* always prune any $RECOVERY entries for dead nodes,
1884 * otherwise hangs can occur during later recovery */ 1885 * otherwise hangs can occur during later recovery */
1885 if (dlm_is_recovery_lock(res->lockname.name, 1886 if (dlm_is_recovery_lock(res->lockname.name,
diff --git a/fs/ocfs2/extent_map.c b/fs/ocfs2/extent_map.c
index b6ba292e9544..e6f207eebab4 100644
--- a/fs/ocfs2/extent_map.c
+++ b/fs/ocfs2/extent_map.c
@@ -181,6 +181,12 @@ static int ocfs2_extent_map_find_leaf(struct inode *inode,
181 ret = -EBADR; 181 ret = -EBADR;
182 if (rec_end > OCFS2_I(inode)->ip_clusters) { 182 if (rec_end > OCFS2_I(inode)->ip_clusters) {
183 mlog_errno(ret); 183 mlog_errno(ret);
184 ocfs2_error(inode->i_sb,
185 "Extent %d at e_blkno %"MLFu64" of inode %"MLFu64" goes past ip_clusters of %u\n",
186 i,
187 le64_to_cpu(rec->e_blkno),
188 OCFS2_I(inode)->ip_blkno,
189 OCFS2_I(inode)->ip_clusters);
184 goto out_free; 190 goto out_free;
185 } 191 }
186 192
@@ -226,6 +232,12 @@ static int ocfs2_extent_map_find_leaf(struct inode *inode,
226 ret = -EBADR; 232 ret = -EBADR;
227 if (blkno) { 233 if (blkno) {
228 mlog_errno(ret); 234 mlog_errno(ret);
235 ocfs2_error(inode->i_sb,
236 "Multiple extents for (cpos = %u, clusters = %u) on inode %"MLFu64"; e_blkno %"MLFu64" and rec %d at e_blkno %"MLFu64"\n",
237 cpos, clusters,
238 OCFS2_I(inode)->ip_blkno,
239 blkno, i,
240 le64_to_cpu(rec->e_blkno));
229 goto out_free; 241 goto out_free;
230 } 242 }
231 243
@@ -238,6 +250,10 @@ static int ocfs2_extent_map_find_leaf(struct inode *inode,
238 */ 250 */
239 ret = -EBADR; 251 ret = -EBADR;
240 if (!blkno) { 252 if (!blkno) {
253 ocfs2_error(inode->i_sb,
254 "No record found for (cpos = %u, clusters = %u) on inode %"MLFu64"\n",
255 cpos, clusters,
256 OCFS2_I(inode)->ip_blkno);
241 mlog_errno(ret); 257 mlog_errno(ret);
242 goto out_free; 258 goto out_free;
243 } 259 }
@@ -266,6 +282,20 @@ static int ocfs2_extent_map_find_leaf(struct inode *inode,
266 282
267 for (i = 0; i < le16_to_cpu(el->l_next_free_rec); i++) { 283 for (i = 0; i < le16_to_cpu(el->l_next_free_rec); i++) {
268 rec = &el->l_recs[i]; 284 rec = &el->l_recs[i];
285
286 if ((le32_to_cpu(rec->e_cpos) + le32_to_cpu(rec->e_clusters)) >
287 OCFS2_I(inode)->ip_clusters) {
288 ret = -EBADR;
289 mlog_errno(ret);
290 ocfs2_error(inode->i_sb,
291 "Extent %d at e_blkno %"MLFu64" of inode %"MLFu64" goes past ip_clusters of %u\n",
292 i,
293 le64_to_cpu(rec->e_blkno),
294 OCFS2_I(inode)->ip_blkno,
295 OCFS2_I(inode)->ip_clusters);
296 return ret;
297 }
298
269 ret = ocfs2_extent_map_insert(inode, rec, 299 ret = ocfs2_extent_map_insert(inode, rec,
270 le16_to_cpu(el->l_tree_depth)); 300 le16_to_cpu(el->l_tree_depth));
271 if (ret) { 301 if (ret) {
@@ -526,6 +556,10 @@ static int ocfs2_extent_map_insert(struct inode *inode,
526 OCFS2_I(inode)->ip_map.em_clusters) { 556 OCFS2_I(inode)->ip_map.em_clusters) {
527 ret = -EBADR; 557 ret = -EBADR;
528 mlog_errno(ret); 558 mlog_errno(ret);
559 ocfs2_error(inode->i_sb,
560 "Zero e_clusters on non-tail extent record at e_blkno %"MLFu64" on inode %"MLFu64"\n",
561 le64_to_cpu(rec->e_blkno),
562 OCFS2_I(inode)->ip_blkno);
529 return ret; 563 return ret;
530 } 564 }
531 565
@@ -588,12 +622,12 @@ static int ocfs2_extent_map_insert(struct inode *inode,
588 * Existing record in the extent map: 622 * Existing record in the extent map:
589 * 623 *
590 * cpos = 10, len = 10 624 * cpos = 10, len = 10
591 * |---------| 625 * |---------|
592 * 626 *
593 * New Record: 627 * New Record:
594 * 628 *
595 * cpos = 10, len = 20 629 * cpos = 10, len = 20
596 * |------------------| 630 * |------------------|
597 * 631 *
598 * The passed record is the new on-disk record. The new_clusters value 632 * The passed record is the new on-disk record. The new_clusters value
599 * is how many clusters were added to the file. If the append is a 633 * is how many clusters were added to the file. If the append is a
diff --git a/fs/ocfs2/file.c b/fs/ocfs2/file.c
index 1715bc90e705..8a4048b55fdc 100644
--- a/fs/ocfs2/file.c
+++ b/fs/ocfs2/file.c
@@ -933,9 +933,6 @@ static ssize_t ocfs2_file_aio_write(struct kiocb *iocb,
933 struct file *filp = iocb->ki_filp; 933 struct file *filp = iocb->ki_filp;
934 struct inode *inode = filp->f_dentry->d_inode; 934 struct inode *inode = filp->f_dentry->d_inode;
935 loff_t newsize, saved_pos; 935 loff_t newsize, saved_pos;
936#ifdef OCFS2_ORACORE_WORKAROUNDS
937 struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
938#endif
939 936
940 mlog_entry("(0x%p, 0x%p, %u, '%.*s')\n", filp, buf, 937 mlog_entry("(0x%p, 0x%p, %u, '%.*s')\n", filp, buf,
941 (unsigned int)count, 938 (unsigned int)count,
@@ -951,14 +948,6 @@ static ssize_t ocfs2_file_aio_write(struct kiocb *iocb,
951 return -EIO; 948 return -EIO;
952 } 949 }
953 950
954#ifdef OCFS2_ORACORE_WORKAROUNDS
955 /* ugh, work around some applications which open everything O_DIRECT +
956 * O_APPEND and really don't mean to use O_DIRECT. */
957 if (osb->s_mount_opt & OCFS2_MOUNT_COMPAT_OCFS &&
958 (filp->f_flags & O_APPEND) && (filp->f_flags & O_DIRECT))
959 filp->f_flags &= ~O_DIRECT;
960#endif
961
962 mutex_lock(&inode->i_mutex); 951 mutex_lock(&inode->i_mutex);
963 /* to match setattr's i_mutex -> i_alloc_sem -> rw_lock ordering */ 952 /* to match setattr's i_mutex -> i_alloc_sem -> rw_lock ordering */
964 if (filp->f_flags & O_DIRECT) { 953 if (filp->f_flags & O_DIRECT) {
@@ -1079,27 +1068,7 @@ static ssize_t ocfs2_file_aio_write(struct kiocb *iocb,
1079 /* communicate with ocfs2_dio_end_io */ 1068 /* communicate with ocfs2_dio_end_io */
1080 ocfs2_iocb_set_rw_locked(iocb); 1069 ocfs2_iocb_set_rw_locked(iocb);
1081 1070
1082#ifdef OCFS2_ORACORE_WORKAROUNDS 1071 ret = generic_file_aio_write_nolock(iocb, &local_iov, 1, &iocb->ki_pos);
1083 if (osb->s_mount_opt & OCFS2_MOUNT_COMPAT_OCFS &&
1084 filp->f_flags & O_DIRECT) {
1085 unsigned int saved_flags = filp->f_flags;
1086 int sector_size = 1 << osb->s_sectsize_bits;
1087
1088 if ((saved_pos & (sector_size - 1)) ||
1089 (count & (sector_size - 1)) ||
1090 ((unsigned long)buf & (sector_size - 1))) {
1091 filp->f_flags |= O_SYNC;
1092 filp->f_flags &= ~O_DIRECT;
1093 }
1094
1095 ret = generic_file_aio_write_nolock(iocb, &local_iov, 1,
1096 &iocb->ki_pos);
1097
1098 filp->f_flags = saved_flags;
1099 } else
1100#endif
1101 ret = generic_file_aio_write_nolock(iocb, &local_iov, 1,
1102 &iocb->ki_pos);
1103 1072
1104 /* buffered aio wouldn't have proper lock coverage today */ 1073 /* buffered aio wouldn't have proper lock coverage today */
1105 BUG_ON(ret == -EIOCBQUEUED && !(filp->f_flags & O_DIRECT)); 1074 BUG_ON(ret == -EIOCBQUEUED && !(filp->f_flags & O_DIRECT));
@@ -1140,9 +1109,6 @@ static ssize_t ocfs2_file_aio_read(struct kiocb *iocb,
1140 int ret = 0, rw_level = -1, have_alloc_sem = 0; 1109 int ret = 0, rw_level = -1, have_alloc_sem = 0;
1141 struct file *filp = iocb->ki_filp; 1110 struct file *filp = iocb->ki_filp;
1142 struct inode *inode = filp->f_dentry->d_inode; 1111 struct inode *inode = filp->f_dentry->d_inode;
1143#ifdef OCFS2_ORACORE_WORKAROUNDS
1144 struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
1145#endif
1146 1112
1147 mlog_entry("(0x%p, 0x%p, %u, '%.*s')\n", filp, buf, 1113 mlog_entry("(0x%p, 0x%p, %u, '%.*s')\n", filp, buf,
1148 (unsigned int)count, 1114 (unsigned int)count,
@@ -1155,21 +1121,6 @@ static ssize_t ocfs2_file_aio_read(struct kiocb *iocb,
1155 goto bail; 1121 goto bail;
1156 } 1122 }
1157 1123
1158#ifdef OCFS2_ORACORE_WORKAROUNDS
1159 if (osb->s_mount_opt & OCFS2_MOUNT_COMPAT_OCFS) {
1160 if (filp->f_flags & O_DIRECT) {
1161 int sector_size = 1 << osb->s_sectsize_bits;
1162
1163 if ((pos & (sector_size - 1)) ||
1164 (count & (sector_size - 1)) ||
1165 ((unsigned long)buf & (sector_size - 1)) ||
1166 (i_size_read(inode) & (sector_size -1))) {
1167 filp->f_flags &= ~O_DIRECT;
1168 }
1169 }
1170 }
1171#endif
1172
1173 /* 1124 /*
1174 * buffered reads protect themselves in ->readpage(). O_DIRECT reads 1125 * buffered reads protect themselves in ->readpage(). O_DIRECT reads
1175 * need locks to protect pending reads from racing with truncate. 1126 * need locks to protect pending reads from racing with truncate.
diff --git a/fs/ocfs2/heartbeat.c b/fs/ocfs2/heartbeat.c
index 0bbd22f46c80..cbfd45a97a63 100644
--- a/fs/ocfs2/heartbeat.c
+++ b/fs/ocfs2/heartbeat.c
@@ -67,6 +67,7 @@ void ocfs2_init_node_maps(struct ocfs2_super *osb)
67 ocfs2_node_map_init(&osb->mounted_map); 67 ocfs2_node_map_init(&osb->mounted_map);
68 ocfs2_node_map_init(&osb->recovery_map); 68 ocfs2_node_map_init(&osb->recovery_map);
69 ocfs2_node_map_init(&osb->umount_map); 69 ocfs2_node_map_init(&osb->umount_map);
70 ocfs2_node_map_init(&osb->osb_recovering_orphan_dirs);
70} 71}
71 72
72static void ocfs2_do_node_down(int node_num, 73static void ocfs2_do_node_down(int node_num,
diff --git a/fs/ocfs2/inode.c b/fs/ocfs2/inode.c
index 8122489c5762..315472a5c192 100644
--- a/fs/ocfs2/inode.c
+++ b/fs/ocfs2/inode.c
@@ -41,6 +41,7 @@
41#include "dlmglue.h" 41#include "dlmglue.h"
42#include "extent_map.h" 42#include "extent_map.h"
43#include "file.h" 43#include "file.h"
44#include "heartbeat.h"
44#include "inode.h" 45#include "inode.h"
45#include "journal.h" 46#include "journal.h"
46#include "namei.h" 47#include "namei.h"
@@ -544,6 +545,42 @@ bail:
544 return status; 545 return status;
545} 546}
546 547
548/*
549 * Serialize with orphan dir recovery. If the process doing
550 * recovery on this orphan dir does an iget() with the dir
551 * i_mutex held, we'll deadlock here. Instead we detect this
552 * and exit early - recovery will wipe this inode for us.
553 */
554static int ocfs2_check_orphan_recovery_state(struct ocfs2_super *osb,
555 int slot)
556{
557 int ret = 0;
558
559 spin_lock(&osb->osb_lock);
560 if (ocfs2_node_map_test_bit(osb, &osb->osb_recovering_orphan_dirs, slot)) {
561 mlog(0, "Recovery is happening on orphan dir %d, will skip "
562 "this inode\n", slot);
563 ret = -EDEADLK;
564 goto out;
565 }
566 /* This signals to the orphan recovery process that it should
567 * wait for us to handle the wipe. */
568 osb->osb_orphan_wipes[slot]++;
569out:
570 spin_unlock(&osb->osb_lock);
571 return ret;
572}
573
574static void ocfs2_signal_wipe_completion(struct ocfs2_super *osb,
575 int slot)
576{
577 spin_lock(&osb->osb_lock);
578 osb->osb_orphan_wipes[slot]--;
579 spin_unlock(&osb->osb_lock);
580
581 wake_up(&osb->osb_wipe_event);
582}
583
547static int ocfs2_wipe_inode(struct inode *inode, 584static int ocfs2_wipe_inode(struct inode *inode,
548 struct buffer_head *di_bh) 585 struct buffer_head *di_bh)
549{ 586{
@@ -555,6 +592,11 @@ static int ocfs2_wipe_inode(struct inode *inode,
555 /* We've already voted on this so it should be readonly - no 592 /* We've already voted on this so it should be readonly - no
556 * spinlock needed. */ 593 * spinlock needed. */
557 orphaned_slot = OCFS2_I(inode)->ip_orphaned_slot; 594 orphaned_slot = OCFS2_I(inode)->ip_orphaned_slot;
595
596 status = ocfs2_check_orphan_recovery_state(osb, orphaned_slot);
597 if (status)
598 return status;
599
558 orphan_dir_inode = ocfs2_get_system_file_inode(osb, 600 orphan_dir_inode = ocfs2_get_system_file_inode(osb,
559 ORPHAN_DIR_SYSTEM_INODE, 601 ORPHAN_DIR_SYSTEM_INODE,
560 orphaned_slot); 602 orphaned_slot);
@@ -597,6 +639,7 @@ bail_unlock_dir:
597 brelse(orphan_dir_bh); 639 brelse(orphan_dir_bh);
598bail: 640bail:
599 iput(orphan_dir_inode); 641 iput(orphan_dir_inode);
642 ocfs2_signal_wipe_completion(osb, orphaned_slot);
600 643
601 return status; 644 return status;
602} 645}
@@ -822,7 +865,8 @@ void ocfs2_delete_inode(struct inode *inode)
822 865
823 status = ocfs2_wipe_inode(inode, di_bh); 866 status = ocfs2_wipe_inode(inode, di_bh);
824 if (status < 0) { 867 if (status < 0) {
825 mlog_errno(status); 868 if (status != -EDEADLK)
869 mlog_errno(status);
826 goto bail_unlock_inode; 870 goto bail_unlock_inode;
827 } 871 }
828 872
diff --git a/fs/ocfs2/journal.c b/fs/ocfs2/journal.c
index d329c9df90ae..4be801f4559b 100644
--- a/fs/ocfs2/journal.c
+++ b/fs/ocfs2/journal.c
@@ -1408,21 +1408,17 @@ bail:
1408 return status; 1408 return status;
1409} 1409}
1410 1410
1411static int ocfs2_recover_orphans(struct ocfs2_super *osb, 1411static int ocfs2_queue_orphans(struct ocfs2_super *osb,
1412 int slot) 1412 int slot,
1413 struct inode **head)
1413{ 1414{
1414 int status = 0; 1415 int status;
1415 int have_disk_lock = 0;
1416 struct inode *inode = NULL;
1417 struct inode *iter;
1418 struct inode *orphan_dir_inode = NULL; 1416 struct inode *orphan_dir_inode = NULL;
1417 struct inode *iter;
1419 unsigned long offset, blk, local; 1418 unsigned long offset, blk, local;
1420 struct buffer_head *bh = NULL; 1419 struct buffer_head *bh = NULL;
1421 struct ocfs2_dir_entry *de; 1420 struct ocfs2_dir_entry *de;
1422 struct super_block *sb = osb->sb; 1421 struct super_block *sb = osb->sb;
1423 struct ocfs2_inode_info *oi;
1424
1425 mlog(0, "Recover inodes from orphan dir in slot %d\n", slot);
1426 1422
1427 orphan_dir_inode = ocfs2_get_system_file_inode(osb, 1423 orphan_dir_inode = ocfs2_get_system_file_inode(osb,
1428 ORPHAN_DIR_SYSTEM_INODE, 1424 ORPHAN_DIR_SYSTEM_INODE,
@@ -1430,17 +1426,15 @@ static int ocfs2_recover_orphans(struct ocfs2_super *osb,
1430 if (!orphan_dir_inode) { 1426 if (!orphan_dir_inode) {
1431 status = -ENOENT; 1427 status = -ENOENT;
1432 mlog_errno(status); 1428 mlog_errno(status);
1433 goto out; 1429 return status;
1434 } 1430 }
1435 1431
1436 mutex_lock(&orphan_dir_inode->i_mutex); 1432 mutex_lock(&orphan_dir_inode->i_mutex);
1437 status = ocfs2_meta_lock(orphan_dir_inode, NULL, NULL, 0); 1433 status = ocfs2_meta_lock(orphan_dir_inode, NULL, NULL, 0);
1438 if (status < 0) { 1434 if (status < 0) {
1439 mutex_unlock(&orphan_dir_inode->i_mutex);
1440 mlog_errno(status); 1435 mlog_errno(status);
1441 goto out; 1436 goto out;
1442 } 1437 }
1443 have_disk_lock = 1;
1444 1438
1445 offset = 0; 1439 offset = 0;
1446 iter = NULL; 1440 iter = NULL;
@@ -1451,11 +1445,10 @@ static int ocfs2_recover_orphans(struct ocfs2_super *osb,
1451 if (!bh) 1445 if (!bh)
1452 status = -EINVAL; 1446 status = -EINVAL;
1453 if (status < 0) { 1447 if (status < 0) {
1454 mutex_unlock(&orphan_dir_inode->i_mutex);
1455 if (bh) 1448 if (bh)
1456 brelse(bh); 1449 brelse(bh);
1457 mlog_errno(status); 1450 mlog_errno(status);
1458 goto out; 1451 goto out_unlock;
1459 } 1452 }
1460 1453
1461 local = 0; 1454 local = 0;
@@ -1465,11 +1458,10 @@ static int ocfs2_recover_orphans(struct ocfs2_super *osb,
1465 1458
1466 if (!ocfs2_check_dir_entry(orphan_dir_inode, 1459 if (!ocfs2_check_dir_entry(orphan_dir_inode,
1467 de, bh, local)) { 1460 de, bh, local)) {
1468 mutex_unlock(&orphan_dir_inode->i_mutex);
1469 status = -EINVAL; 1461 status = -EINVAL;
1470 mlog_errno(status); 1462 mlog_errno(status);
1471 brelse(bh); 1463 brelse(bh);
1472 goto out; 1464 goto out_unlock;
1473 } 1465 }
1474 1466
1475 local += le16_to_cpu(de->rec_len); 1467 local += le16_to_cpu(de->rec_len);
@@ -1504,18 +1496,95 @@ static int ocfs2_recover_orphans(struct ocfs2_super *osb,
1504 1496
1505 mlog(0, "queue orphan %"MLFu64"\n", 1497 mlog(0, "queue orphan %"MLFu64"\n",
1506 OCFS2_I(iter)->ip_blkno); 1498 OCFS2_I(iter)->ip_blkno);
1507 OCFS2_I(iter)->ip_next_orphan = inode; 1499 /* No locking is required for the next_orphan
1508 inode = iter; 1500 * queue as there is only ever a single
1501 * process doing orphan recovery. */
1502 OCFS2_I(iter)->ip_next_orphan = *head;
1503 *head = iter;
1509 } 1504 }
1510 brelse(bh); 1505 brelse(bh);
1511 } 1506 }
1512 mutex_unlock(&orphan_dir_inode->i_mutex);
1513 1507
1508out_unlock:
1514 ocfs2_meta_unlock(orphan_dir_inode, 0); 1509 ocfs2_meta_unlock(orphan_dir_inode, 0);
1515 have_disk_lock = 0; 1510out:
1516 1511 mutex_unlock(&orphan_dir_inode->i_mutex);
1517 iput(orphan_dir_inode); 1512 iput(orphan_dir_inode);
1518 orphan_dir_inode = NULL; 1513 return status;
1514}
1515
1516static int ocfs2_orphan_recovery_can_continue(struct ocfs2_super *osb,
1517 int slot)
1518{
1519 int ret;
1520
1521 spin_lock(&osb->osb_lock);
1522 ret = !osb->osb_orphan_wipes[slot];
1523 spin_unlock(&osb->osb_lock);
1524 return ret;
1525}
1526
1527static void ocfs2_mark_recovering_orphan_dir(struct ocfs2_super *osb,
1528 int slot)
1529{
1530 spin_lock(&osb->osb_lock);
1531 /* Mark ourselves such that new processes in delete_inode()
1532 * know to quit early. */
1533 ocfs2_node_map_set_bit(osb, &osb->osb_recovering_orphan_dirs, slot);
1534 while (osb->osb_orphan_wipes[slot]) {
1535 /* If any processes are already in the middle of an
1536 * orphan wipe on this dir, then we need to wait for
1537 * them. */
1538 spin_unlock(&osb->osb_lock);
1539 wait_event_interruptible(osb->osb_wipe_event,
1540 ocfs2_orphan_recovery_can_continue(osb, slot));
1541 spin_lock(&osb->osb_lock);
1542 }
1543 spin_unlock(&osb->osb_lock);
1544}
1545
1546static void ocfs2_clear_recovering_orphan_dir(struct ocfs2_super *osb,
1547 int slot)
1548{
1549 ocfs2_node_map_clear_bit(osb, &osb->osb_recovering_orphan_dirs, slot);
1550}
1551
1552/*
1553 * Orphan recovery. Each mounted node has it's own orphan dir which we
1554 * must run during recovery. Our strategy here is to build a list of
1555 * the inodes in the orphan dir and iget/iput them. The VFS does
1556 * (most) of the rest of the work.
1557 *
1558 * Orphan recovery can happen at any time, not just mount so we have a
1559 * couple of extra considerations.
1560 *
1561 * - We grab as many inodes as we can under the orphan dir lock -
1562 * doing iget() outside the orphan dir risks getting a reference on
1563 * an invalid inode.
1564 * - We must be sure not to deadlock with other processes on the
1565 * system wanting to run delete_inode(). This can happen when they go
1566 * to lock the orphan dir and the orphan recovery process attempts to
1567 * iget() inside the orphan dir lock. This can be avoided by
1568 * advertising our state to ocfs2_delete_inode().
1569 */
1570static int ocfs2_recover_orphans(struct ocfs2_super *osb,
1571 int slot)
1572{
1573 int ret = 0;
1574 struct inode *inode = NULL;
1575 struct inode *iter;
1576 struct ocfs2_inode_info *oi;
1577
1578 mlog(0, "Recover inodes from orphan dir in slot %d\n", slot);
1579
1580 ocfs2_mark_recovering_orphan_dir(osb, slot);
1581 ret = ocfs2_queue_orphans(osb, slot, &inode);
1582 ocfs2_clear_recovering_orphan_dir(osb, slot);
1583
1584 /* Error here should be noted, but we want to continue with as
1585 * many queued inodes as we've got. */
1586 if (ret)
1587 mlog_errno(ret);
1519 1588
1520 while (inode) { 1589 while (inode) {
1521 oi = OCFS2_I(inode); 1590 oi = OCFS2_I(inode);
@@ -1541,14 +1610,7 @@ static int ocfs2_recover_orphans(struct ocfs2_super *osb,
1541 inode = iter; 1610 inode = iter;
1542 } 1611 }
1543 1612
1544out: 1613 return ret;
1545 if (have_disk_lock)
1546 ocfs2_meta_unlock(orphan_dir_inode, 0);
1547
1548 if (orphan_dir_inode)
1549 iput(orphan_dir_inode);
1550
1551 return status;
1552} 1614}
1553 1615
1554static int ocfs2_wait_on_mount(struct ocfs2_super *osb) 1616static int ocfs2_wait_on_mount(struct ocfs2_super *osb)
diff --git a/fs/ocfs2/ocfs2.h b/fs/ocfs2/ocfs2.h
index 8d8e4779df92..e89de9b6e491 100644
--- a/fs/ocfs2/ocfs2.h
+++ b/fs/ocfs2/ocfs2.h
@@ -174,9 +174,6 @@ enum ocfs2_mount_options
174 OCFS2_MOUNT_NOINTR = 1 << 2, /* Don't catch signals */ 174 OCFS2_MOUNT_NOINTR = 1 << 2, /* Don't catch signals */
175 OCFS2_MOUNT_ERRORS_PANIC = 1 << 3, /* Panic on errors */ 175 OCFS2_MOUNT_ERRORS_PANIC = 1 << 3, /* Panic on errors */
176 OCFS2_MOUNT_DATA_WRITEBACK = 1 << 4, /* No data ordering */ 176 OCFS2_MOUNT_DATA_WRITEBACK = 1 << 4, /* No data ordering */
177#ifdef OCFS2_ORACORE_WORKAROUNDS
178 OCFS2_MOUNT_COMPAT_OCFS = 1 << 30, /* ocfs1 compatibility mode */
179#endif
180}; 177};
181 178
182#define OCFS2_OSB_SOFT_RO 0x0001 179#define OCFS2_OSB_SOFT_RO 0x0001
@@ -290,6 +287,10 @@ struct ocfs2_super
290 struct inode *osb_tl_inode; 287 struct inode *osb_tl_inode;
291 struct buffer_head *osb_tl_bh; 288 struct buffer_head *osb_tl_bh;
292 struct work_struct osb_truncate_log_wq; 289 struct work_struct osb_truncate_log_wq;
290
291 struct ocfs2_node_map osb_recovering_orphan_dirs;
292 unsigned int *osb_orphan_wipes;
293 wait_queue_head_t osb_wipe_event;
293}; 294};
294 295
295#define OCFS2_SB(sb) ((struct ocfs2_super *)(sb)->s_fs_info) 296#define OCFS2_SB(sb) ((struct ocfs2_super *)(sb)->s_fs_info)
diff --git a/fs/ocfs2/ocfs2_fs.h b/fs/ocfs2/ocfs2_fs.h
index dfb8a5bedfc8..c5b1ac547c15 100644
--- a/fs/ocfs2/ocfs2_fs.h
+++ b/fs/ocfs2/ocfs2_fs.h
@@ -138,7 +138,6 @@
138 138
139/* Journal limits (in bytes) */ 139/* Journal limits (in bytes) */
140#define OCFS2_MIN_JOURNAL_SIZE (4 * 1024 * 1024) 140#define OCFS2_MIN_JOURNAL_SIZE (4 * 1024 * 1024)
141#define OCFS2_MAX_JOURNAL_SIZE (500 * 1024 * 1024)
142 141
143struct ocfs2_system_inode_info { 142struct ocfs2_system_inode_info {
144 char *si_name; 143 char *si_name;
diff --git a/fs/ocfs2/super.c b/fs/ocfs2/super.c
index 046824b6b625..8dd3aafec499 100644
--- a/fs/ocfs2/super.c
+++ b/fs/ocfs2/super.c
@@ -1325,6 +1325,16 @@ static int ocfs2_initialize_super(struct super_block *sb,
1325 } 1325 }
1326 mlog(ML_NOTICE, "max_slots for this device: %u\n", osb->max_slots); 1326 mlog(ML_NOTICE, "max_slots for this device: %u\n", osb->max_slots);
1327 1327
1328 init_waitqueue_head(&osb->osb_wipe_event);
1329 osb->osb_orphan_wipes = kcalloc(osb->max_slots,
1330 sizeof(*osb->osb_orphan_wipes),
1331 GFP_KERNEL);
1332 if (!osb->osb_orphan_wipes) {
1333 status = -ENOMEM;
1334 mlog_errno(status);
1335 goto bail;
1336 }
1337
1328 osb->s_feature_compat = 1338 osb->s_feature_compat =
1329 le32_to_cpu(OCFS2_RAW_SB(di)->s_feature_compat); 1339 le32_to_cpu(OCFS2_RAW_SB(di)->s_feature_compat);
1330 osb->s_feature_ro_compat = 1340 osb->s_feature_ro_compat =
@@ -1638,6 +1648,7 @@ static void ocfs2_delete_osb(struct ocfs2_super *osb)
1638 if (osb->slot_info) 1648 if (osb->slot_info)
1639 ocfs2_free_slot_info(osb->slot_info); 1649 ocfs2_free_slot_info(osb->slot_info);
1640 1650
1651 kfree(osb->osb_orphan_wipes);
1641 /* FIXME 1652 /* FIXME
1642 * This belongs in journal shutdown, but because we have to 1653 * This belongs in journal shutdown, but because we have to
1643 * allocate osb->journal at the start of ocfs2_initalize_osb(), 1654 * allocate osb->journal at the start of ocfs2_initalize_osb(),
diff --git a/fs/partitions/ibm.c b/fs/partitions/ibm.c
index 78010ad60e47..1e4a93835fed 100644
--- a/fs/partitions/ibm.c
+++ b/fs/partitions/ibm.c
@@ -52,6 +52,7 @@ int
52ibm_partition(struct parsed_partitions *state, struct block_device *bdev) 52ibm_partition(struct parsed_partitions *state, struct block_device *bdev)
53{ 53{
54 int blocksize, offset, size; 54 int blocksize, offset, size;
55 loff_t i_size;
55 dasd_information_t *info; 56 dasd_information_t *info;
56 struct hd_geometry *geo; 57 struct hd_geometry *geo;
57 char type[5] = {0,}; 58 char type[5] = {0,};
@@ -63,6 +64,13 @@ ibm_partition(struct parsed_partitions *state, struct block_device *bdev)
63 unsigned char *data; 64 unsigned char *data;
64 Sector sect; 65 Sector sect;
65 66
67 blocksize = bdev_hardsect_size(bdev);
68 if (blocksize <= 0)
69 return 0;
70 i_size = i_size_read(bdev->bd_inode);
71 if (i_size == 0)
72 return 0;
73
66 if ((info = kmalloc(sizeof(dasd_information_t), GFP_KERNEL)) == NULL) 74 if ((info = kmalloc(sizeof(dasd_information_t), GFP_KERNEL)) == NULL)
67 goto out_noinfo; 75 goto out_noinfo;
68 if ((geo = kmalloc(sizeof(struct hd_geometry), GFP_KERNEL)) == NULL) 76 if ((geo = kmalloc(sizeof(struct hd_geometry), GFP_KERNEL)) == NULL)
@@ -73,9 +81,6 @@ ibm_partition(struct parsed_partitions *state, struct block_device *bdev)
73 if (ioctl_by_bdev(bdev, BIODASDINFO, (unsigned long)info) != 0 || 81 if (ioctl_by_bdev(bdev, BIODASDINFO, (unsigned long)info) != 0 ||
74 ioctl_by_bdev(bdev, HDIO_GETGEO, (unsigned long)geo) != 0) 82 ioctl_by_bdev(bdev, HDIO_GETGEO, (unsigned long)geo) != 0)
75 goto out_noioctl; 83 goto out_noioctl;
76
77 if ((blocksize = bdev_hardsect_size(bdev)) <= 0)
78 goto out_badsect;
79 84
80 /* 85 /*
81 * Get volume label, extract name and type. 86 * Get volume label, extract name and type.
@@ -111,7 +116,7 @@ ibm_partition(struct parsed_partitions *state, struct block_device *bdev)
111 } else { 116 } else {
112 printk("CMS1/%8s:", name); 117 printk("CMS1/%8s:", name);
113 offset = (info->label_block + 1); 118 offset = (info->label_block + 1);
114 size = bdev->bd_inode->i_size >> 9; 119 size = i_size >> 9;
115 } 120 }
116 put_partition(state, 1, offset*(blocksize >> 9), 121 put_partition(state, 1, offset*(blocksize >> 9),
117 size-offset*(blocksize >> 9)); 122 size-offset*(blocksize >> 9));
@@ -168,7 +173,7 @@ ibm_partition(struct parsed_partitions *state, struct block_device *bdev)
168 else 173 else
169 printk("(nonl)/%8s:", name); 174 printk("(nonl)/%8s:", name);
170 offset = (info->label_block + 1); 175 offset = (info->label_block + 1);
171 size = (bdev->bd_inode->i_size >> 9); 176 size = i_size >> 9;
172 put_partition(state, 1, offset*(blocksize >> 9), 177 put_partition(state, 1, offset*(blocksize >> 9),
173 size-offset*(blocksize >> 9)); 178 size-offset*(blocksize >> 9));
174 } 179 }
@@ -180,7 +185,6 @@ ibm_partition(struct parsed_partitions *state, struct block_device *bdev)
180 return 1; 185 return 1;
181 186
182out_readerr: 187out_readerr:
183out_badsect:
184out_noioctl: 188out_noioctl:
185 kfree(label); 189 kfree(label);
186out_nolab: 190out_nolab:
diff --git a/fs/pipe.c b/fs/pipe.c
index d722579df79a..8aada8e426f4 100644
--- a/fs/pipe.c
+++ b/fs/pipe.c
@@ -605,7 +605,7 @@ struct file_operations rdwr_fifo_fops = {
605 .fasync = pipe_rdwr_fasync, 605 .fasync = pipe_rdwr_fasync,
606}; 606};
607 607
608struct file_operations read_pipe_fops = { 608static struct file_operations read_pipe_fops = {
609 .llseek = no_llseek, 609 .llseek = no_llseek,
610 .read = pipe_read, 610 .read = pipe_read,
611 .readv = pipe_readv, 611 .readv = pipe_readv,
@@ -617,7 +617,7 @@ struct file_operations read_pipe_fops = {
617 .fasync = pipe_read_fasync, 617 .fasync = pipe_read_fasync,
618}; 618};
619 619
620struct file_operations write_pipe_fops = { 620static struct file_operations write_pipe_fops = {
621 .llseek = no_llseek, 621 .llseek = no_llseek,
622 .read = bad_pipe_r, 622 .read = bad_pipe_r,
623 .write = pipe_write, 623 .write = pipe_write,
@@ -629,7 +629,7 @@ struct file_operations write_pipe_fops = {
629 .fasync = pipe_write_fasync, 629 .fasync = pipe_write_fasync,
630}; 630};
631 631
632struct file_operations rdwr_pipe_fops = { 632static struct file_operations rdwr_pipe_fops = {
633 .llseek = no_llseek, 633 .llseek = no_llseek,
634 .read = pipe_read, 634 .read = pipe_read,
635 .readv = pipe_readv, 635 .readv = pipe_readv,
diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c
index 0eaad41f4658..91b7c15ab373 100644
--- a/fs/proc/task_mmu.c
+++ b/fs/proc/task_mmu.c
@@ -204,7 +204,6 @@ static void smaps_pte_range(struct vm_area_struct *vma, pmd_t *pmd,
204{ 204{
205 pte_t *pte, ptent; 205 pte_t *pte, ptent;
206 spinlock_t *ptl; 206 spinlock_t *ptl;
207 unsigned long pfn;
208 struct page *page; 207 struct page *page;
209 208
210 pte = pte_offset_map_lock(vma->vm_mm, pmd, addr, &ptl); 209 pte = pte_offset_map_lock(vma->vm_mm, pmd, addr, &ptl);
@@ -214,12 +213,12 @@ static void smaps_pte_range(struct vm_area_struct *vma, pmd_t *pmd,
214 continue; 213 continue;
215 214
216 mss->resident += PAGE_SIZE; 215 mss->resident += PAGE_SIZE;
217 pfn = pte_pfn(ptent); 216
218 if (!pfn_valid(pfn)) 217 page = vm_normal_page(vma, addr, ptent);
218 if (!page)
219 continue; 219 continue;
220 220
221 page = pfn_to_page(pfn); 221 if (page_mapcount(page) >= 2) {
222 if (page_count(page) >= 2) {
223 if (pte_dirty(ptent)) 222 if (pte_dirty(ptent))
224 mss->shared_dirty += PAGE_SIZE; 223 mss->shared_dirty += PAGE_SIZE;
225 else 224 else
@@ -289,7 +288,7 @@ static int show_smap(struct seq_file *m, void *v)
289 struct mem_size_stats mss; 288 struct mem_size_stats mss;
290 289
291 memset(&mss, 0, sizeof mss); 290 memset(&mss, 0, sizeof mss);
292 if (vma->vm_mm) 291 if (vma->vm_mm && !is_vm_hugetlb_page(vma))
293 smaps_pgd_range(vma, vma->vm_start, vma->vm_end, &mss); 292 smaps_pgd_range(vma, vma->vm_start, vma->vm_end, &mss);
294 return show_map_internal(m, v, &mss); 293 return show_map_internal(m, v, &mss);
295} 294}
diff --git a/fs/ramfs/inode.c b/fs/ramfs/inode.c
index cde5d48994ae..14bd2246fb6d 100644
--- a/fs/ramfs/inode.c
+++ b/fs/ramfs/inode.c
@@ -137,6 +137,7 @@ static int ramfs_symlink(struct inode * dir, struct dentry *dentry, const char *
137 inode->i_gid = dir->i_gid; 137 inode->i_gid = dir->i_gid;
138 d_instantiate(dentry, inode); 138 d_instantiate(dentry, inode);
139 dget(dentry); 139 dget(dentry);
140 dir->i_mtime = dir->i_ctime = CURRENT_TIME;
140 } else 141 } else
141 iput(inode); 142 iput(inode);
142 } 143 }
diff --git a/fs/reiserfs/file.c b/fs/reiserfs/file.c
index f3473176c83a..be12879bb179 100644
--- a/fs/reiserfs/file.c
+++ b/fs/reiserfs/file.c
@@ -1464,13 +1464,11 @@ static ssize_t reiserfs_file_write(struct file *file, /* the file we are going t
1464 partially overwritten pages, if needed. And lock the pages, 1464 partially overwritten pages, if needed. And lock the pages,
1465 so that nobody else can access these until we are done. 1465 so that nobody else can access these until we are done.
1466 We get number of actual blocks needed as a result. */ 1466 We get number of actual blocks needed as a result. */
1467 blocks_to_allocate = 1467 res = reiserfs_prepare_file_region_for_write(inode, pos,
1468 reiserfs_prepare_file_region_for_write(inode, pos, 1468 num_pages,
1469 num_pages, 1469 write_bytes,
1470 write_bytes, 1470 prepared_pages);
1471 prepared_pages); 1471 if (res < 0) {
1472 if (blocks_to_allocate < 0) {
1473 res = blocks_to_allocate;
1474 reiserfs_release_claimed_blocks(inode->i_sb, 1472 reiserfs_release_claimed_blocks(inode->i_sb,
1475 num_pages << 1473 num_pages <<
1476 (PAGE_CACHE_SHIFT - 1474 (PAGE_CACHE_SHIFT -
@@ -1478,6 +1476,8 @@ static ssize_t reiserfs_file_write(struct file *file, /* the file we are going t
1478 break; 1476 break;
1479 } 1477 }
1480 1478
1479 blocks_to_allocate = res;
1480
1481 /* First we correct our estimate of how many blocks we need */ 1481 /* First we correct our estimate of how many blocks we need */
1482 reiserfs_release_claimed_blocks(inode->i_sb, 1482 reiserfs_release_claimed_blocks(inode->i_sb,
1483 (num_pages << 1483 (num_pages <<
diff --git a/fs/reiserfs/inode.c b/fs/reiserfs/inode.c
index b33d67bba2fd..d60f6238c66a 100644
--- a/fs/reiserfs/inode.c
+++ b/fs/reiserfs/inode.c
@@ -627,11 +627,6 @@ int reiserfs_get_block(struct inode *inode, sector_t block,
627 reiserfs_write_lock(inode->i_sb); 627 reiserfs_write_lock(inode->i_sb);
628 version = get_inode_item_key_version(inode); 628 version = get_inode_item_key_version(inode);
629 629
630 if (block < 0) {
631 reiserfs_write_unlock(inode->i_sb);
632 return -EIO;
633 }
634
635 if (!file_capable(inode, block)) { 630 if (!file_capable(inode, block)) {
636 reiserfs_write_unlock(inode->i_sb); 631 reiserfs_write_unlock(inode->i_sb);
637 return -EFBIG; 632 return -EFBIG;
@@ -934,12 +929,13 @@ int reiserfs_get_block(struct inode *inode, sector_t block,
934 //pos_in_item * inode->i_sb->s_blocksize, 929 //pos_in_item * inode->i_sb->s_blocksize,
935 TYPE_INDIRECT, 3); // key type is unimportant 930 TYPE_INDIRECT, 3); // key type is unimportant
936 931
932 RFALSE(cpu_key_k_offset(&tmp_key) > cpu_key_k_offset(&key),
933 "green-805: invalid offset");
937 blocks_needed = 934 blocks_needed =
938 1 + 935 1 +
939 ((cpu_key_k_offset(&key) - 936 ((cpu_key_k_offset(&key) -
940 cpu_key_k_offset(&tmp_key)) >> inode->i_sb-> 937 cpu_key_k_offset(&tmp_key)) >> inode->i_sb->
941 s_blocksize_bits); 938 s_blocksize_bits);
942 RFALSE(blocks_needed < 0, "green-805: invalid offset");
943 939
944 if (blocks_needed == 1) { 940 if (blocks_needed == 1) {
945 un = &unf_single; 941 un = &unf_single;
diff --git a/fs/reiserfs/journal.c b/fs/reiserfs/journal.c
index b7a179560ab4..5a9d2722fa0a 100644
--- a/fs/reiserfs/journal.c
+++ b/fs/reiserfs/journal.c
@@ -2319,8 +2319,7 @@ static int journal_read(struct super_block *p_s_sb)
2319 return 1; 2319 return 1;
2320 } 2320 }
2321 jh = (struct reiserfs_journal_header *)(journal->j_header_bh->b_data); 2321 jh = (struct reiserfs_journal_header *)(journal->j_header_bh->b_data);
2322 if (le32_to_cpu(jh->j_first_unflushed_offset) >= 0 && 2322 if (le32_to_cpu(jh->j_first_unflushed_offset) <
2323 le32_to_cpu(jh->j_first_unflushed_offset) <
2324 SB_ONDISK_JOURNAL_SIZE(p_s_sb) 2323 SB_ONDISK_JOURNAL_SIZE(p_s_sb)
2325 && le32_to_cpu(jh->j_last_flush_trans_id) > 0) { 2324 && le32_to_cpu(jh->j_last_flush_trans_id) > 0) {
2326 oldest_start = 2325 oldest_start =
diff --git a/fs/reiserfs/namei.c b/fs/reiserfs/namei.c
index c8123308e060..284f7852de8b 100644
--- a/fs/reiserfs/namei.c
+++ b/fs/reiserfs/namei.c
@@ -247,7 +247,7 @@ static int linear_search_in_dir_item(struct cpu_key *key,
247 /* mark, that this generation number is used */ 247 /* mark, that this generation number is used */
248 if (de->de_gen_number_bit_string) 248 if (de->de_gen_number_bit_string)
249 set_bit(GET_GENERATION_NUMBER(deh_offset(deh)), 249 set_bit(GET_GENERATION_NUMBER(deh_offset(deh)),
250 (unsigned long *)de->de_gen_number_bit_string); 250 de->de_gen_number_bit_string);
251 251
252 // calculate pointer to name and namelen 252 // calculate pointer to name and namelen
253 de->de_entry_num = i; 253 de->de_entry_num = i;
@@ -431,7 +431,7 @@ static int reiserfs_add_entry(struct reiserfs_transaction_handle *th,
431 struct reiserfs_de_head *deh; 431 struct reiserfs_de_head *deh;
432 INITIALIZE_PATH(path); 432 INITIALIZE_PATH(path);
433 struct reiserfs_dir_entry de; 433 struct reiserfs_dir_entry de;
434 int bit_string[MAX_GENERATION_NUMBER / (sizeof(int) * 8) + 1]; 434 DECLARE_BITMAP(bit_string, MAX_GENERATION_NUMBER + 1);
435 int gen_number; 435 int gen_number;
436 char small_buf[32 + DEH_SIZE]; /* 48 bytes now and we avoid kmalloc 436 char small_buf[32 + DEH_SIZE]; /* 48 bytes now and we avoid kmalloc
437 if we create file with short name */ 437 if we create file with short name */
@@ -486,7 +486,7 @@ static int reiserfs_add_entry(struct reiserfs_transaction_handle *th,
486 486
487 /* find the proper place for the new entry */ 487 /* find the proper place for the new entry */
488 memset(bit_string, 0, sizeof(bit_string)); 488 memset(bit_string, 0, sizeof(bit_string));
489 de.de_gen_number_bit_string = (char *)bit_string; 489 de.de_gen_number_bit_string = bit_string;
490 retval = reiserfs_find_entry(dir, name, namelen, &path, &de); 490 retval = reiserfs_find_entry(dir, name, namelen, &path, &de);
491 if (retval != NAME_NOT_FOUND) { 491 if (retval != NAME_NOT_FOUND) {
492 if (buffer != small_buf) 492 if (buffer != small_buf)
@@ -508,7 +508,7 @@ static int reiserfs_add_entry(struct reiserfs_transaction_handle *th,
508 } 508 }
509 509
510 gen_number = 510 gen_number =
511 find_first_zero_bit((unsigned long *)bit_string, 511 find_first_zero_bit(bit_string,
512 MAX_GENERATION_NUMBER + 1); 512 MAX_GENERATION_NUMBER + 1);
513 if (gen_number > MAX_GENERATION_NUMBER) { 513 if (gen_number > MAX_GENERATION_NUMBER) {
514 /* there is no free generation number */ 514 /* there is no free generation number */
diff --git a/fs/udf/inode.c b/fs/udf/inode.c
index 395e582ee542..d04cff2273b6 100644
--- a/fs/udf/inode.c
+++ b/fs/udf/inode.c
@@ -1045,10 +1045,14 @@ static void udf_fill_inode(struct inode *inode, struct buffer_head *bh)
1045 } 1045 }
1046 1046
1047 inode->i_uid = le32_to_cpu(fe->uid); 1047 inode->i_uid = le32_to_cpu(fe->uid);
1048 if ( inode->i_uid == -1 ) inode->i_uid = UDF_SB(inode->i_sb)->s_uid; 1048 if (inode->i_uid == -1 || UDF_QUERY_FLAG(inode->i_sb,
1049 UDF_FLAG_UID_IGNORE))
1050 inode->i_uid = UDF_SB(inode->i_sb)->s_uid;
1049 1051
1050 inode->i_gid = le32_to_cpu(fe->gid); 1052 inode->i_gid = le32_to_cpu(fe->gid);
1051 if ( inode->i_gid == -1 ) inode->i_gid = UDF_SB(inode->i_sb)->s_gid; 1053 if (inode->i_gid == -1 || UDF_QUERY_FLAG(inode->i_sb,
1054 UDF_FLAG_GID_IGNORE))
1055 inode->i_gid = UDF_SB(inode->i_sb)->s_gid;
1052 1056
1053 inode->i_nlink = le16_to_cpu(fe->fileLinkCount); 1057 inode->i_nlink = le16_to_cpu(fe->fileLinkCount);
1054 if (!inode->i_nlink) 1058 if (!inode->i_nlink)
@@ -1335,10 +1339,14 @@ udf_update_inode(struct inode *inode, int do_sync)
1335 return err; 1339 return err;
1336 } 1340 }
1337 1341
1338 if (inode->i_uid != UDF_SB(inode->i_sb)->s_uid) 1342 if (UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_UID_FORGET))
1343 fe->uid = cpu_to_le32(-1);
1344 else if (inode->i_uid != UDF_SB(inode->i_sb)->s_uid)
1339 fe->uid = cpu_to_le32(inode->i_uid); 1345 fe->uid = cpu_to_le32(inode->i_uid);
1340 1346
1341 if (inode->i_gid != UDF_SB(inode->i_sb)->s_gid) 1347 if (UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_GID_FORGET))
1348 fe->gid = cpu_to_le32(-1);
1349 else if (inode->i_gid != UDF_SB(inode->i_sb)->s_gid)
1342 fe->gid = cpu_to_le32(inode->i_gid); 1350 fe->gid = cpu_to_le32(inode->i_gid);
1343 1351
1344 udfperms = ((inode->i_mode & S_IRWXO) ) | 1352 udfperms = ((inode->i_mode & S_IRWXO) ) |
diff --git a/fs/udf/super.c b/fs/udf/super.c
index 4a6f49adc609..368d8f81fe54 100644
--- a/fs/udf/super.c
+++ b/fs/udf/super.c
@@ -269,7 +269,7 @@ enum {
269 Opt_gid, Opt_uid, Opt_umask, Opt_session, Opt_lastblock, 269 Opt_gid, Opt_uid, Opt_umask, Opt_session, Opt_lastblock,
270 Opt_anchor, Opt_volume, Opt_partition, Opt_fileset, 270 Opt_anchor, Opt_volume, Opt_partition, Opt_fileset,
271 Opt_rootdir, Opt_utf8, Opt_iocharset, 271 Opt_rootdir, Opt_utf8, Opt_iocharset,
272 Opt_err 272 Opt_err, Opt_uforget, Opt_uignore, Opt_gforget, Opt_gignore
273}; 273};
274 274
275static match_table_t tokens = { 275static match_table_t tokens = {
@@ -282,6 +282,10 @@ static match_table_t tokens = {
282 {Opt_adinicb, "adinicb"}, 282 {Opt_adinicb, "adinicb"},
283 {Opt_shortad, "shortad"}, 283 {Opt_shortad, "shortad"},
284 {Opt_longad, "longad"}, 284 {Opt_longad, "longad"},
285 {Opt_uforget, "uid=forget"},
286 {Opt_uignore, "uid=ignore"},
287 {Opt_gforget, "gid=forget"},
288 {Opt_gignore, "gid=ignore"},
285 {Opt_gid, "gid=%u"}, 289 {Opt_gid, "gid=%u"},
286 {Opt_uid, "uid=%u"}, 290 {Opt_uid, "uid=%u"},
287 {Opt_umask, "umask=%o"}, 291 {Opt_umask, "umask=%o"},
@@ -414,6 +418,18 @@ udf_parse_options(char *options, struct udf_options *uopt)
414 uopt->flags |= (1 << UDF_FLAG_NLS_MAP); 418 uopt->flags |= (1 << UDF_FLAG_NLS_MAP);
415 break; 419 break;
416#endif 420#endif
421 case Opt_uignore:
422 uopt->flags |= (1 << UDF_FLAG_UID_IGNORE);
423 break;
424 case Opt_uforget:
425 uopt->flags |= (1 << UDF_FLAG_UID_FORGET);
426 break;
427 case Opt_gignore:
428 uopt->flags |= (1 << UDF_FLAG_GID_IGNORE);
429 break;
430 case Opt_gforget:
431 uopt->flags |= (1 << UDF_FLAG_GID_FORGET);
432 break;
417 default: 433 default:
418 printk(KERN_ERR "udf: bad mount option \"%s\" " 434 printk(KERN_ERR "udf: bad mount option \"%s\" "
419 "or missing value\n", p); 435 "or missing value\n", p);
diff --git a/fs/udf/udf_sb.h b/fs/udf/udf_sb.h
index 663669810be6..110f8d62616f 100644
--- a/fs/udf/udf_sb.h
+++ b/fs/udf/udf_sb.h
@@ -20,6 +20,10 @@
20#define UDF_FLAG_VARCONV 8 20#define UDF_FLAG_VARCONV 8
21#define UDF_FLAG_NLS_MAP 9 21#define UDF_FLAG_NLS_MAP 9
22#define UDF_FLAG_UTF8 10 22#define UDF_FLAG_UTF8 10
23#define UDF_FLAG_UID_FORGET 11 /* save -1 for uid to disk */
24#define UDF_FLAG_UID_IGNORE 12 /* use sb uid instead of on disk uid */
25#define UDF_FLAG_GID_FORGET 13
26#define UDF_FLAG_GID_IGNORE 14
23 27
24#define UDF_PART_FLAG_UNALLOC_BITMAP 0x0001 28#define UDF_PART_FLAG_UNALLOC_BITMAP 0x0001
25#define UDF_PART_FLAG_UNALLOC_TABLE 0x0002 29#define UDF_PART_FLAG_UNALLOC_TABLE 0x0002
diff --git a/include/asm-arm/tlbflush.h b/include/asm-arm/tlbflush.h
index 9387a5e1ffe0..0c2acc944a0a 100644
--- a/include/asm-arm/tlbflush.h
+++ b/include/asm-arm/tlbflush.h
@@ -340,6 +340,12 @@ static inline void local_flush_tlb_kernel_page(unsigned long kaddr)
340 asm("mcr%? p15, 0, %0, c8, c6, 1" : : "r" (kaddr)); 340 asm("mcr%? p15, 0, %0, c8, c6, 1" : : "r" (kaddr));
341 if (tlb_flag(TLB_V6_I_PAGE)) 341 if (tlb_flag(TLB_V6_I_PAGE))
342 asm("mcr%? p15, 0, %0, c8, c5, 1" : : "r" (kaddr)); 342 asm("mcr%? p15, 0, %0, c8, c5, 1" : : "r" (kaddr));
343
344 /* The ARM ARM states that the completion of a TLB maintenance
345 * operation is only guaranteed by a DSB instruction
346 */
347 if (tlb_flag(TLB_V6_U_PAGE | TLB_V6_D_PAGE | TLB_V6_I_PAGE))
348 asm("mcr%? p15, 0, %0, c7, c10, 4" : : "r" (zero));
343} 349}
344 350
345/* 351/*
diff --git a/include/asm-generic/unaligned.h b/include/asm-generic/unaligned.h
index 4dc8ddb401c1..09ec447fe2af 100644
--- a/include/asm-generic/unaligned.h
+++ b/include/asm-generic/unaligned.h
@@ -78,7 +78,7 @@ static inline void __ustw(__u16 val, __u16 *addr)
78 78
79#define __get_unaligned(ptr, size) ({ \ 79#define __get_unaligned(ptr, size) ({ \
80 const void *__gu_p = ptr; \ 80 const void *__gu_p = ptr; \
81 __typeof__(*(ptr)) val; \ 81 __u64 val; \
82 switch (size) { \ 82 switch (size) { \
83 case 1: \ 83 case 1: \
84 val = *(const __u8 *)__gu_p; \ 84 val = *(const __u8 *)__gu_p; \
@@ -95,7 +95,7 @@ static inline void __ustw(__u16 val, __u16 *addr)
95 default: \ 95 default: \
96 bad_unaligned_access_length(); \ 96 bad_unaligned_access_length(); \
97 }; \ 97 }; \
98 val; \ 98 (__typeof__(*(ptr)))val; \
99}) 99})
100 100
101#define __put_unaligned(val, ptr, size) \ 101#define __put_unaligned(val, ptr, size) \
diff --git a/include/asm-i386/apic.h b/include/asm-i386/apic.h
index d30b8571573f..ff9ac8d19eb2 100644
--- a/include/asm-i386/apic.h
+++ b/include/asm-i386/apic.h
@@ -137,6 +137,8 @@ void switch_APIC_timer_to_ipi(void *cpumask);
137void switch_ipi_to_APIC_timer(void *cpumask); 137void switch_ipi_to_APIC_timer(void *cpumask);
138#define ARCH_APICTIMER_STOPS_ON_C3 1 138#define ARCH_APICTIMER_STOPS_ON_C3 1
139 139
140extern int timer_over_8254;
141
140#else /* !CONFIG_X86_LOCAL_APIC */ 142#else /* !CONFIG_X86_LOCAL_APIC */
141static inline void lapic_shutdown(void) { } 143static inline void lapic_shutdown(void) { }
142 144
diff --git a/include/asm-m68k/atomic.h b/include/asm-m68k/atomic.h
index a4a84d5c65d5..862e497c2645 100644
--- a/include/asm-m68k/atomic.h
+++ b/include/asm-m68k/atomic.h
@@ -55,6 +55,7 @@ static inline int atomic_inc_and_test(atomic_t *v)
55} 55}
56 56
57#ifdef CONFIG_RMW_INSNS 57#ifdef CONFIG_RMW_INSNS
58
58static inline int atomic_add_return(int i, atomic_t *v) 59static inline int atomic_add_return(int i, atomic_t *v)
59{ 60{
60 int t, tmp; 61 int t, tmp;
@@ -82,7 +83,12 @@ static inline int atomic_sub_return(int i, atomic_t *v)
82 : "g" (i), "2" (atomic_read(v))); 83 : "g" (i), "2" (atomic_read(v)));
83 return t; 84 return t;
84} 85}
86
87#define atomic_cmpxchg(v, o, n) ((int)cmpxchg(&((v)->counter), (o), (n)))
88#define atomic_xchg(v, new) (xchg(&((v)->counter), new))
89
85#else /* !CONFIG_RMW_INSNS */ 90#else /* !CONFIG_RMW_INSNS */
91
86static inline int atomic_add_return(int i, atomic_t * v) 92static inline int atomic_add_return(int i, atomic_t * v)
87{ 93{
88 unsigned long flags; 94 unsigned long flags;
@@ -110,6 +116,32 @@ static inline int atomic_sub_return(int i, atomic_t * v)
110 116
111 return t; 117 return t;
112} 118}
119
120static inline int atomic_cmpxchg(atomic_t *v, int old, int new)
121{
122 unsigned long flags;
123 int prev;
124
125 local_irq_save(flags);
126 prev = atomic_read(v);
127 if (prev == old)
128 atomic_set(v, new);
129 local_irq_restore(flags);
130 return prev;
131}
132
133static inline int atomic_xchg(atomic_t *v, int new)
134{
135 unsigned long flags;
136 int prev;
137
138 local_irq_save(flags);
139 prev = atomic_read(v);
140 atomic_set(v, new);
141 local_irq_restore(flags);
142 return prev;
143}
144
113#endif /* !CONFIG_RMW_INSNS */ 145#endif /* !CONFIG_RMW_INSNS */
114 146
115#define atomic_dec_return(v) atomic_sub_return(1, (v)) 147#define atomic_dec_return(v) atomic_sub_return(1, (v))
@@ -139,9 +171,6 @@ static inline void atomic_set_mask(unsigned long mask, unsigned long *v)
139 __asm__ __volatile__("orl %1,%0" : "+m" (*v) : "id" (mask)); 171 __asm__ __volatile__("orl %1,%0" : "+m" (*v) : "id" (mask));
140} 172}
141 173
142#define atomic_cmpxchg(v, o, n) ((int)cmpxchg(&((v)->counter), (o), (n)))
143#define atomic_xchg(v, new) (xchg(&((v)->counter), new))
144
145#define atomic_add_unless(v, a, u) \ 174#define atomic_add_unless(v, a, u) \
146({ \ 175({ \
147 int c, old; \ 176 int c, old; \
diff --git a/include/asm-mips/vga.h b/include/asm-mips/vga.h
index ca5cec97e167..34755c0a6398 100644
--- a/include/asm-mips/vga.h
+++ b/include/asm-mips/vga.h
@@ -26,6 +26,9 @@
26 * <linux/vt_buffer.h> has already done the right job for us. 26 * <linux/vt_buffer.h> has already done the right job for us.
27 */ 27 */
28 28
29#undef scr_writew
30#undef scr_readw
31
29static inline void scr_writew(u16 val, volatile u16 *addr) 32static inline void scr_writew(u16 val, volatile u16 *addr)
30{ 33{
31 *addr = cpu_to_le16(val); 34 *addr = cpu_to_le16(val);
diff --git a/include/asm-powerpc/cputable.h b/include/asm-powerpc/cputable.h
index 90d005bb4d1c..5638518968c3 100644
--- a/include/asm-powerpc/cputable.h
+++ b/include/asm-powerpc/cputable.h
@@ -20,6 +20,8 @@
20#define PPC_FEATURE_POWER5_PLUS 0x00020000 20#define PPC_FEATURE_POWER5_PLUS 0x00020000
21#define PPC_FEATURE_CELL 0x00010000 21#define PPC_FEATURE_CELL 0x00010000
22#define PPC_FEATURE_BOOKE 0x00008000 22#define PPC_FEATURE_BOOKE 0x00008000
23#define PPC_FEATURE_SMT 0x00004000
24#define PPC_FEATURE_ICACHE_SNOOP 0x00002000
23 25
24#ifdef __KERNEL__ 26#ifdef __KERNEL__
25#ifndef __ASSEMBLY__ 27#ifndef __ASSEMBLY__
diff --git a/include/asm-powerpc/eeh.h b/include/asm-powerpc/eeh.h
index 7dfb408fe2ca..5207758a6dd9 100644
--- a/include/asm-powerpc/eeh.h
+++ b/include/asm-powerpc/eeh.h
@@ -61,6 +61,7 @@ void __init pci_addr_cache_build(void);
61 * to finish the eeh setup for this device. 61 * to finish the eeh setup for this device.
62 */ 62 */
63void eeh_add_device_early(struct device_node *); 63void eeh_add_device_early(struct device_node *);
64void eeh_add_device_late(struct pci_dev *dev);
64void eeh_add_device_tree_early(struct device_node *); 65void eeh_add_device_tree_early(struct device_node *);
65void eeh_add_device_tree_late(struct pci_bus *); 66void eeh_add_device_tree_late(struct pci_bus *);
66 67
@@ -117,6 +118,8 @@ static inline void pci_addr_cache_build(void) { }
117 118
118static inline void eeh_add_device_early(struct device_node *dn) { } 119static inline void eeh_add_device_early(struct device_node *dn) { }
119 120
121static inline void eeh_add_device_late(struct pci_dev *dev) { }
122
120static inline void eeh_remove_device(struct pci_dev *dev) { } 123static inline void eeh_remove_device(struct pci_dev *dev) { }
121 124
122static inline void eeh_add_device_tree_early(struct device_node *dn) { } 125static inline void eeh_add_device_tree_early(struct device_node *dn) { }
diff --git a/include/asm-powerpc/kexec.h b/include/asm-powerpc/kexec.h
index bda2f217e6fe..6a2af2f6853b 100644
--- a/include/asm-powerpc/kexec.h
+++ b/include/asm-powerpc/kexec.h
@@ -93,7 +93,8 @@ static inline void crash_setup_regs(struct pt_regs *newregs,
93 "mfxer %0\n" 93 "mfxer %0\n"
94 "std %0, 296(%2)\n" 94 "std %0, 296(%2)\n"
95 : "=&r" (tmp1), "=&r" (tmp2) 95 : "=&r" (tmp1), "=&r" (tmp2)
96 : "b" (newregs)); 96 : "b" (newregs)
97 : "memory");
97 } 98 }
98} 99}
99#else 100#else
diff --git a/include/asm-powerpc/pgtable-4k.h b/include/asm-powerpc/pgtable-4k.h
index e9590c06ad92..80a7832d2721 100644
--- a/include/asm-powerpc/pgtable-4k.h
+++ b/include/asm-powerpc/pgtable-4k.h
@@ -88,4 +88,4 @@
88 (((addr) >> PUD_SHIFT) & (PTRS_PER_PUD - 1))) 88 (((addr) >> PUD_SHIFT) & (PTRS_PER_PUD - 1)))
89 89
90#define pud_ERROR(e) \ 90#define pud_ERROR(e) \
91 printk("%s:%d: bad pmd %08lx.\n", __FILE__, __LINE__, pud_val(e)) 91 printk("%s:%d: bad pud %08lx.\n", __FILE__, __LINE__, pud_val(e))
diff --git a/include/asm-powerpc/thread_info.h b/include/asm-powerpc/thread_info.h
index 237fc2b72974..ffc7462d77ba 100644
--- a/include/asm-powerpc/thread_info.h
+++ b/include/asm-powerpc/thread_info.h
@@ -37,7 +37,6 @@ struct thread_info {
37 int preempt_count; /* 0 => preemptable, 37 int preempt_count; /* 0 => preemptable,
38 <0 => BUG */ 38 <0 => BUG */
39 struct restart_block restart_block; 39 struct restart_block restart_block;
40 void __user *nvgprs_frame;
41 /* low level flags - has atomic operations done on it */ 40 /* low level flags - has atomic operations done on it */
42 unsigned long flags ____cacheline_aligned_in_smp; 41 unsigned long flags ____cacheline_aligned_in_smp;
43}; 42};
@@ -120,7 +119,6 @@ static inline struct thread_info *current_thread_info(void)
120#define TIF_MEMDIE 10 119#define TIF_MEMDIE 10
121#define TIF_SECCOMP 11 /* secure computing */ 120#define TIF_SECCOMP 11 /* secure computing */
122#define TIF_RESTOREALL 12 /* Restore all regs (implies NOERROR) */ 121#define TIF_RESTOREALL 12 /* Restore all regs (implies NOERROR) */
123#define TIF_SAVE_NVGPRS 13 /* Save r14-r31 in signal frame */
124#define TIF_NOERROR 14 /* Force successful syscall return */ 122#define TIF_NOERROR 14 /* Force successful syscall return */
125#define TIF_RESTORE_SIGMASK 15 /* Restore signal mask in do_signal */ 123#define TIF_RESTORE_SIGMASK 15 /* Restore signal mask in do_signal */
126 124
@@ -137,15 +135,13 @@ static inline struct thread_info *current_thread_info(void)
137#define _TIF_SINGLESTEP (1<<TIF_SINGLESTEP) 135#define _TIF_SINGLESTEP (1<<TIF_SINGLESTEP)
138#define _TIF_SECCOMP (1<<TIF_SECCOMP) 136#define _TIF_SECCOMP (1<<TIF_SECCOMP)
139#define _TIF_RESTOREALL (1<<TIF_RESTOREALL) 137#define _TIF_RESTOREALL (1<<TIF_RESTOREALL)
140#define _TIF_SAVE_NVGPRS (1<<TIF_SAVE_NVGPRS)
141#define _TIF_NOERROR (1<<TIF_NOERROR) 138#define _TIF_NOERROR (1<<TIF_NOERROR)
142#define _TIF_RESTORE_SIGMASK (1<<TIF_RESTORE_SIGMASK) 139#define _TIF_RESTORE_SIGMASK (1<<TIF_RESTORE_SIGMASK)
143#define _TIF_SYSCALL_T_OR_A (_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT|_TIF_SECCOMP) 140#define _TIF_SYSCALL_T_OR_A (_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT|_TIF_SECCOMP)
144 141
145#define _TIF_USER_WORK_MASK (_TIF_NOTIFY_RESUME | _TIF_SIGPENDING | \ 142#define _TIF_USER_WORK_MASK (_TIF_NOTIFY_RESUME | _TIF_SIGPENDING | \
146 _TIF_NEED_RESCHED | _TIF_RESTOREALL | \ 143 _TIF_NEED_RESCHED | _TIF_RESTORE_SIGMASK)
147 _TIF_RESTORE_SIGMASK) 144#define _TIF_PERSYSCALL_MASK (_TIF_RESTOREALL|_TIF_NOERROR)
148#define _TIF_PERSYSCALL_MASK (_TIF_RESTOREALL|_TIF_NOERROR|_TIF_SAVE_NVGPRS)
149 145
150#endif /* __KERNEL__ */ 146#endif /* __KERNEL__ */
151 147
diff --git a/include/asm-s390/system.h b/include/asm-s390/system.h
index b2e65e8bf812..6a89dbb03c1e 100644
--- a/include/asm-s390/system.h
+++ b/include/asm-s390/system.h
@@ -118,6 +118,8 @@ static inline void sched_cacheflush(void)
118extern void account_vtime(struct task_struct *); 118extern void account_vtime(struct task_struct *);
119extern void account_tick_vtime(struct task_struct *); 119extern void account_tick_vtime(struct task_struct *);
120extern void account_system_vtime(struct task_struct *); 120extern void account_system_vtime(struct task_struct *);
121#else
122#define account_vtime(x) do { /* empty */ } while (0)
121#endif 123#endif
122 124
123#define finish_arch_switch(prev) do { \ 125#define finish_arch_switch(prev) do { \
diff --git a/include/asm-sparc64/futex.h b/include/asm-sparc64/futex.h
index 0caf60147e97..34c4b43d3f98 100644
--- a/include/asm-sparc64/futex.h
+++ b/include/asm-sparc64/futex.h
@@ -20,7 +20,7 @@
20 "4: ba 3b\n" \ 20 "4: ba 3b\n" \
21 " mov %5, %0\n" \ 21 " mov %5, %0\n" \
22 " .previous\n" \ 22 " .previous\n" \
23 " .section __ex_table,#alloc\n" \ 23 " .section __ex_table,\"a\"\n" \
24 " .align 4\n" \ 24 " .align 4\n" \
25 " .word 1b, 4b\n" \ 25 " .word 1b, 4b\n" \
26 " .word 2b, 4b\n" \ 26 " .word 2b, 4b\n" \
diff --git a/include/asm-sparc64/uaccess.h b/include/asm-sparc64/uaccess.h
index 203e8eee6351..c91d1e38eac6 100644
--- a/include/asm-sparc64/uaccess.h
+++ b/include/asm-sparc64/uaccess.h
@@ -136,7 +136,7 @@ __asm__ __volatile__( \
136 "b 2b\n\t" \ 136 "b 2b\n\t" \
137 " mov %3, %0\n\n\t" \ 137 " mov %3, %0\n\n\t" \
138 ".previous\n\t" \ 138 ".previous\n\t" \
139 ".section __ex_table,#alloc\n\t" \ 139 ".section __ex_table,\"a\"\n\t" \
140 ".align 4\n\t" \ 140 ".align 4\n\t" \
141 ".word 1b, 3b\n\t" \ 141 ".word 1b, 3b\n\t" \
142 ".previous\n\n\t" \ 142 ".previous\n\n\t" \
@@ -148,7 +148,7 @@ if (__builtin_constant_p(ret) && ret == -EFAULT) \
148__asm__ __volatile__( \ 148__asm__ __volatile__( \
149 "/* Put user asm ret, inline. */\n" \ 149 "/* Put user asm ret, inline. */\n" \
150"1:\t" "st"#size "a %1, [%2] %%asi\n\n\t" \ 150"1:\t" "st"#size "a %1, [%2] %%asi\n\n\t" \
151 ".section __ex_table,#alloc\n\t" \ 151 ".section __ex_table,\"a\"\n\t" \
152 ".align 4\n\t" \ 152 ".align 4\n\t" \
153 ".word 1b, __ret_efault\n\n\t" \ 153 ".word 1b, __ret_efault\n\n\t" \
154 ".previous\n\n\t" \ 154 ".previous\n\n\t" \
@@ -163,7 +163,7 @@ __asm__ __volatile__( \
163 "ret\n\t" \ 163 "ret\n\t" \
164 " restore %%g0, %3, %%o0\n\n\t" \ 164 " restore %%g0, %3, %%o0\n\n\t" \
165 ".previous\n\t" \ 165 ".previous\n\t" \
166 ".section __ex_table,#alloc\n\t" \ 166 ".section __ex_table,\"a\"\n\t" \
167 ".align 4\n\t" \ 167 ".align 4\n\t" \
168 ".word 1b, 3b\n\n\t" \ 168 ".word 1b, 3b\n\n\t" \
169 ".previous\n\n\t" \ 169 ".previous\n\n\t" \
@@ -206,7 +206,7 @@ __asm__ __volatile__( \
206 "b 2b\n\t" \ 206 "b 2b\n\t" \
207 " mov %3, %0\n\n\t" \ 207 " mov %3, %0\n\n\t" \
208 ".previous\n\t" \ 208 ".previous\n\t" \
209 ".section __ex_table,#alloc\n\t" \ 209 ".section __ex_table,\"a\"\n\t" \
210 ".align 4\n\t" \ 210 ".align 4\n\t" \
211 ".word 1b, 3b\n\n\t" \ 211 ".word 1b, 3b\n\n\t" \
212 ".previous\n\t" \ 212 ".previous\n\t" \
@@ -218,7 +218,7 @@ if (__builtin_constant_p(retval) && retval == -EFAULT) \
218__asm__ __volatile__( \ 218__asm__ __volatile__( \
219 "/* Get user asm ret, inline. */\n" \ 219 "/* Get user asm ret, inline. */\n" \
220"1:\t" "ld"#size "a [%1] %%asi, %0\n\n\t" \ 220"1:\t" "ld"#size "a [%1] %%asi, %0\n\n\t" \
221 ".section __ex_table,#alloc\n\t" \ 221 ".section __ex_table,\"a\"\n\t" \
222 ".align 4\n\t" \ 222 ".align 4\n\t" \
223 ".word 1b,__ret_efault\n\n\t" \ 223 ".word 1b,__ret_efault\n\n\t" \
224 ".previous\n\t" \ 224 ".previous\n\t" \
@@ -233,7 +233,7 @@ __asm__ __volatile__( \
233 "ret\n\t" \ 233 "ret\n\t" \
234 " restore %%g0, %2, %%o0\n\n\t" \ 234 " restore %%g0, %2, %%o0\n\n\t" \
235 ".previous\n\t" \ 235 ".previous\n\t" \
236 ".section __ex_table,#alloc\n\t" \ 236 ".section __ex_table,\"a\"\n\t" \
237 ".align 4\n\t" \ 237 ".align 4\n\t" \
238 ".word 1b, 3b\n\n\t" \ 238 ".word 1b, 3b\n\n\t" \
239 ".previous\n\t" \ 239 ".previous\n\t" \
diff --git a/include/linux/compat_ioctl.h b/include/linux/compat_ioctl.h
index 8fad50f8e389..ae7dfb790df3 100644
--- a/include/linux/compat_ioctl.h
+++ b/include/linux/compat_ioctl.h
@@ -696,6 +696,8 @@ COMPATIBLE_IOCTL(MEMLOCK)
696COMPATIBLE_IOCTL(MEMUNLOCK) 696COMPATIBLE_IOCTL(MEMUNLOCK)
697COMPATIBLE_IOCTL(MEMGETREGIONCOUNT) 697COMPATIBLE_IOCTL(MEMGETREGIONCOUNT)
698COMPATIBLE_IOCTL(MEMGETREGIONINFO) 698COMPATIBLE_IOCTL(MEMGETREGIONINFO)
699COMPATIBLE_IOCTL(MEMGETBADBLOCK)
700COMPATIBLE_IOCTL(MEMSETBADBLOCK)
699/* NBD */ 701/* NBD */
700ULONG_IOCTL(NBD_SET_SOCK) 702ULONG_IOCTL(NBD_SET_SOCK)
701ULONG_IOCTL(NBD_SET_BLKSIZE) 703ULONG_IOCTL(NBD_SET_BLKSIZE)
diff --git a/include/linux/file.h b/include/linux/file.h
index 418b6101b59a..9901b850f2e4 100644
--- a/include/linux/file.h
+++ b/include/linux/file.h
@@ -60,8 +60,6 @@ extern void put_filp(struct file *);
60extern int get_unused_fd(void); 60extern int get_unused_fd(void);
61extern void FASTCALL(put_unused_fd(unsigned int fd)); 61extern void FASTCALL(put_unused_fd(unsigned int fd));
62struct kmem_cache; 62struct kmem_cache;
63extern void filp_ctor(void * objp, struct kmem_cache *cachep, unsigned long cflags);
64extern void filp_dtor(void * objp, struct kmem_cache *cachep, unsigned long dflags);
65 63
66extern struct file ** alloc_fd_array(int); 64extern struct file ** alloc_fd_array(int);
67extern void free_fd_array(struct file **, int); 65extern void free_fd_array(struct file **, int);
diff --git a/include/linux/fs.h b/include/linux/fs.h
index e059da947007..128d0082522c 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -35,6 +35,7 @@ struct files_stat_struct {
35 int max_files; /* tunable */ 35 int max_files; /* tunable */
36}; 36};
37extern struct files_stat_struct files_stat; 37extern struct files_stat_struct files_stat;
38extern int get_max_files(void);
38 39
39struct inodes_stat_t { 40struct inodes_stat_t {
40 int nr_inodes; 41 int nr_inodes;
@@ -1418,9 +1419,6 @@ extern int is_bad_inode(struct inode *);
1418extern struct file_operations read_fifo_fops; 1419extern struct file_operations read_fifo_fops;
1419extern struct file_operations write_fifo_fops; 1420extern struct file_operations write_fifo_fops;
1420extern struct file_operations rdwr_fifo_fops; 1421extern struct file_operations rdwr_fifo_fops;
1421extern struct file_operations read_pipe_fops;
1422extern struct file_operations write_pipe_fops;
1423extern struct file_operations rdwr_pipe_fops;
1424 1422
1425extern int fs_may_remount_ro(struct super_block *); 1423extern int fs_may_remount_ro(struct super_block *);
1426 1424
@@ -1666,6 +1664,8 @@ extern int vfs_follow_link(struct nameidata *, const char *);
1666extern int page_readlink(struct dentry *, char __user *, int); 1664extern int page_readlink(struct dentry *, char __user *, int);
1667extern void *page_follow_link_light(struct dentry *, struct nameidata *); 1665extern void *page_follow_link_light(struct dentry *, struct nameidata *);
1668extern void page_put_link(struct dentry *, struct nameidata *, void *); 1666extern void page_put_link(struct dentry *, struct nameidata *, void *);
1667extern int __page_symlink(struct inode *inode, const char *symname, int len,
1668 gfp_t gfp_mask);
1669extern int page_symlink(struct inode *inode, const char *symname, int len); 1669extern int page_symlink(struct inode *inode, const char *symname, int len);
1670extern struct inode_operations page_symlink_inode_operations; 1670extern struct inode_operations page_symlink_inode_operations;
1671extern int generic_readlink(struct dentry *, char __user *, int); 1671extern int generic_readlink(struct dentry *, char __user *, int);
diff --git a/include/linux/gfp.h b/include/linux/gfp.h
index 20f9148e38d9..7851e6b520cf 100644
--- a/include/linux/gfp.h
+++ b/include/linux/gfp.h
@@ -157,9 +157,9 @@ extern void FASTCALL(free_cold_page(struct page *page));
157 157
158void page_alloc_init(void); 158void page_alloc_init(void);
159#ifdef CONFIG_NUMA 159#ifdef CONFIG_NUMA
160void drain_remote_pages(void); 160void drain_node_pages(int node);
161#else 161#else
162static inline void drain_remote_pages(void) { }; 162static inline void drain_node_pages(int node) { };
163#endif 163#endif
164 164
165#endif /* __LINUX_GFP_H */ 165#endif /* __LINUX_GFP_H */
diff --git a/include/linux/hrtimer.h b/include/linux/hrtimer.h
index 6361544bb6ae..6401c31d6add 100644
--- a/include/linux/hrtimer.h
+++ b/include/linux/hrtimer.h
@@ -116,6 +116,10 @@ extern int hrtimer_try_to_cancel(struct hrtimer *timer);
116extern ktime_t hrtimer_get_remaining(const struct hrtimer *timer); 116extern ktime_t hrtimer_get_remaining(const struct hrtimer *timer);
117extern int hrtimer_get_res(const clockid_t which_clock, struct timespec *tp); 117extern int hrtimer_get_res(const clockid_t which_clock, struct timespec *tp);
118 118
119#ifdef CONFIG_NO_IDLE_HZ
120extern ktime_t hrtimer_get_next_event(void);
121#endif
122
119static inline int hrtimer_active(const struct hrtimer *timer) 123static inline int hrtimer_active(const struct hrtimer *timer)
120{ 124{
121 return timer->state == HRTIMER_PENDING; 125 return timer->state == HRTIMER_PENDING;
diff --git a/include/linux/kmalloc_sizes.h b/include/linux/kmalloc_sizes.h
index d82d4c05c12d..bda23e00ed71 100644
--- a/include/linux/kmalloc_sizes.h
+++ b/include/linux/kmalloc_sizes.h
@@ -19,8 +19,10 @@
19 CACHE(32768) 19 CACHE(32768)
20 CACHE(65536) 20 CACHE(65536)
21 CACHE(131072) 21 CACHE(131072)
22#ifndef CONFIG_MMU 22#if (NR_CPUS > 512) || (MAX_NUMNODES > 256) || !defined(CONFIG_MMU)
23 CACHE(262144) 23 CACHE(262144)
24#endif
25#ifndef CONFIG_MMU
24 CACHE(524288) 26 CACHE(524288)
25 CACHE(1048576) 27 CACHE(1048576)
26#ifdef CONFIG_LARGE_ALLOCS 28#ifdef CONFIG_LARGE_ALLOCS
diff --git a/include/linux/libata.h b/include/linux/libata.h
index 2558abac9fb2..d051a823758b 100644
--- a/include/linux/libata.h
+++ b/include/linux/libata.h
@@ -152,7 +152,7 @@ enum {
152 ATA_FLAG_PIO_LBA48 = (1 << 13), /* Host DMA engine is LBA28 only */ 152 ATA_FLAG_PIO_LBA48 = (1 << 13), /* Host DMA engine is LBA28 only */
153 ATA_FLAG_IRQ_MASK = (1 << 14), /* Mask IRQ in PIO xfers */ 153 ATA_FLAG_IRQ_MASK = (1 << 14), /* Mask IRQ in PIO xfers */
154 154
155 ATA_FLAG_FLUSH_PIO_TASK = (1 << 15), /* Flush PIO task */ 155 ATA_FLAG_FLUSH_PORT_TASK = (1 << 15), /* Flush port task */
156 ATA_FLAG_IN_EH = (1 << 16), /* EH in progress */ 156 ATA_FLAG_IN_EH = (1 << 16), /* EH in progress */
157 157
158 ATA_QCFLAG_ACTIVE = (1 << 1), /* cmd not yet ack'd to scsi lyer */ 158 ATA_QCFLAG_ACTIVE = (1 << 1), /* cmd not yet ack'd to scsi lyer */
@@ -191,11 +191,19 @@ enum {
191 PORT_DISABLED = 2, 191 PORT_DISABLED = 2,
192 192
193 /* encoding various smaller bitmaps into a single 193 /* encoding various smaller bitmaps into a single
194 * unsigned long bitmap 194 * unsigned int bitmap
195 */ 195 */
196 ATA_SHIFT_UDMA = 0, 196 ATA_BITS_PIO = 5,
197 ATA_SHIFT_MWDMA = 8, 197 ATA_BITS_MWDMA = 3,
198 ATA_SHIFT_PIO = 11, 198 ATA_BITS_UDMA = 8,
199
200 ATA_SHIFT_PIO = 0,
201 ATA_SHIFT_MWDMA = ATA_SHIFT_PIO + ATA_BITS_PIO,
202 ATA_SHIFT_UDMA = ATA_SHIFT_MWDMA + ATA_BITS_MWDMA,
203
204 ATA_MASK_PIO = ((1 << ATA_BITS_PIO) - 1) << ATA_SHIFT_PIO,
205 ATA_MASK_MWDMA = ((1 << ATA_BITS_MWDMA) - 1) << ATA_SHIFT_MWDMA,
206 ATA_MASK_UDMA = ((1 << ATA_BITS_UDMA) - 1) << ATA_SHIFT_UDMA,
199 207
200 /* size of buffer to pad xfers ending on unaligned boundaries */ 208 /* size of buffer to pad xfers ending on unaligned boundaries */
201 ATA_DMA_PAD_SZ = 4, 209 ATA_DMA_PAD_SZ = 4,
@@ -344,7 +352,7 @@ struct ata_device {
344 unsigned long flags; /* ATA_DFLAG_xxx */ 352 unsigned long flags; /* ATA_DFLAG_xxx */
345 unsigned int class; /* ATA_DEV_xxx */ 353 unsigned int class; /* ATA_DEV_xxx */
346 unsigned int devno; /* 0 or 1 */ 354 unsigned int devno; /* 0 or 1 */
347 u16 id[ATA_ID_WORDS]; /* IDENTIFY xxx DEVICE data */ 355 u16 *id; /* IDENTIFY xxx DEVICE data */
348 u8 pio_mode; 356 u8 pio_mode;
349 u8 dma_mode; 357 u8 dma_mode;
350 u8 xfer_mode; 358 u8 xfer_mode;
@@ -393,7 +401,8 @@ struct ata_port {
393 struct ata_host_stats stats; 401 struct ata_host_stats stats;
394 struct ata_host_set *host_set; 402 struct ata_host_set *host_set;
395 403
396 struct work_struct pio_task; 404 struct work_struct port_task;
405
397 unsigned int hsm_task_state; 406 unsigned int hsm_task_state;
398 unsigned long pio_task_timeout; 407 unsigned long pio_task_timeout;
399 408
@@ -488,6 +497,8 @@ extern int ata_std_softreset(struct ata_port *ap, int verbose,
488extern int sata_std_hardreset(struct ata_port *ap, int verbose, 497extern int sata_std_hardreset(struct ata_port *ap, int verbose,
489 unsigned int *class); 498 unsigned int *class);
490extern void ata_std_postreset(struct ata_port *ap, unsigned int *classes); 499extern void ata_std_postreset(struct ata_port *ap, unsigned int *classes);
500extern int ata_dev_revalidate(struct ata_port *ap, struct ata_device *dev,
501 int post_reset);
491extern void ata_port_disable(struct ata_port *); 502extern void ata_port_disable(struct ata_port *);
492extern void ata_std_ports(struct ata_ioports *ioaddr); 503extern void ata_std_ports(struct ata_ioports *ioaddr);
493#ifdef CONFIG_PCI 504#ifdef CONFIG_PCI
@@ -516,6 +527,8 @@ extern int ata_ratelimit(void);
516extern unsigned int ata_busy_sleep(struct ata_port *ap, 527extern unsigned int ata_busy_sleep(struct ata_port *ap,
517 unsigned long timeout_pat, 528 unsigned long timeout_pat,
518 unsigned long timeout); 529 unsigned long timeout);
530extern void ata_port_queue_task(struct ata_port *ap, void (*fn)(void *),
531 void *data, unsigned long delay);
519 532
520/* 533/*
521 * Default driver ops implementations 534 * Default driver ops implementations
@@ -545,7 +558,6 @@ extern void ata_id_string(const u16 *id, unsigned char *s,
545 unsigned int ofs, unsigned int len); 558 unsigned int ofs, unsigned int len);
546extern void ata_id_c_string(const u16 *id, unsigned char *s, 559extern void ata_id_c_string(const u16 *id, unsigned char *s,
547 unsigned int ofs, unsigned int len); 560 unsigned int ofs, unsigned int len);
548extern void ata_dev_config(struct ata_port *ap, unsigned int i);
549extern void ata_bmdma_setup (struct ata_queued_cmd *qc); 561extern void ata_bmdma_setup (struct ata_queued_cmd *qc);
550extern void ata_bmdma_start (struct ata_queued_cmd *qc); 562extern void ata_bmdma_start (struct ata_queued_cmd *qc);
551extern void ata_bmdma_stop(struct ata_queued_cmd *qc); 563extern void ata_bmdma_stop(struct ata_queued_cmd *qc);
@@ -648,10 +660,14 @@ static inline unsigned int ata_tag_valid(unsigned int tag)
648 return (tag < ATA_MAX_QUEUE) ? 1 : 0; 660 return (tag < ATA_MAX_QUEUE) ? 1 : 0;
649} 661}
650 662
663static inline unsigned int ata_class_present(unsigned int class)
664{
665 return class == ATA_DEV_ATA || class == ATA_DEV_ATAPI;
666}
667
651static inline unsigned int ata_dev_present(const struct ata_device *dev) 668static inline unsigned int ata_dev_present(const struct ata_device *dev)
652{ 669{
653 return ((dev->class == ATA_DEV_ATA) || 670 return ata_class_present(dev->class);
654 (dev->class == ATA_DEV_ATAPI));
655} 671}
656 672
657static inline u8 ata_chk_status(struct ata_port *ap) 673static inline u8 ata_chk_status(struct ata_port *ap)
diff --git a/include/linux/memory_hotplug.h b/include/linux/memory_hotplug.h
index 01f03bc06eff..968b1aa3732c 100644
--- a/include/linux/memory_hotplug.h
+++ b/include/linux/memory_hotplug.h
@@ -6,6 +6,10 @@
6#include <linux/mmzone.h> 6#include <linux/mmzone.h>
7#include <linux/notifier.h> 7#include <linux/notifier.h>
8 8
9struct page;
10struct zone;
11struct pglist_data;
12
9#ifdef CONFIG_MEMORY_HOTPLUG 13#ifdef CONFIG_MEMORY_HOTPLUG
10/* 14/*
11 * pgdat resizing functions 15 * pgdat resizing functions
diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h
index 82b83da25d77..1709b5009d2e 100644
--- a/include/linux/pci_ids.h
+++ b/include/linux/pci_ids.h
@@ -1752,6 +1752,8 @@
1752#define PCI_DEVICE_ID_CCD_B00B 0xb00b 1752#define PCI_DEVICE_ID_CCD_B00B 0xb00b
1753#define PCI_DEVICE_ID_CCD_B00C 0xb00c 1753#define PCI_DEVICE_ID_CCD_B00C 0xb00c
1754#define PCI_DEVICE_ID_CCD_B100 0xb100 1754#define PCI_DEVICE_ID_CCD_B100 0xb100
1755#define PCI_DEVICE_ID_CCD_B700 0xb700
1756#define PCI_DEVICE_ID_CCD_B701 0xb701
1755 1757
1756#define PCI_VENDOR_ID_EXAR 0x13a8 1758#define PCI_VENDOR_ID_EXAR 0x13a8
1757#define PCI_DEVICE_ID_EXAR_XR17C152 0x0152 1759#define PCI_DEVICE_ID_EXAR_XR17C152 0x0152
diff --git a/include/linux/percpu_counter.h b/include/linux/percpu_counter.h
index bd6708e2c027..682525511c9e 100644
--- a/include/linux/percpu_counter.h
+++ b/include/linux/percpu_counter.h
@@ -39,6 +39,7 @@ static inline void percpu_counter_destroy(struct percpu_counter *fbc)
39} 39}
40 40
41void percpu_counter_mod(struct percpu_counter *fbc, long amount); 41void percpu_counter_mod(struct percpu_counter *fbc, long amount);
42long percpu_counter_sum(struct percpu_counter *fbc);
42 43
43static inline long percpu_counter_read(struct percpu_counter *fbc) 44static inline long percpu_counter_read(struct percpu_counter *fbc)
44{ 45{
@@ -92,6 +93,11 @@ static inline long percpu_counter_read_positive(struct percpu_counter *fbc)
92 return fbc->count; 93 return fbc->count;
93} 94}
94 95
96static inline long percpu_counter_sum(struct percpu_counter *fbc)
97{
98 return percpu_counter_read_positive(fbc);
99}
100
95#endif /* CONFIG_SMP */ 101#endif /* CONFIG_SMP */
96 102
97static inline void percpu_counter_inc(struct percpu_counter *fbc) 103static inline void percpu_counter_inc(struct percpu_counter *fbc)
diff --git a/include/linux/rcupdate.h b/include/linux/rcupdate.h
index b87aefa082e2..c2ec6c77874e 100644
--- a/include/linux/rcupdate.h
+++ b/include/linux/rcupdate.h
@@ -98,13 +98,17 @@ struct rcu_data {
98 long batch; /* Batch # for current RCU batch */ 98 long batch; /* Batch # for current RCU batch */
99 struct rcu_head *nxtlist; 99 struct rcu_head *nxtlist;
100 struct rcu_head **nxttail; 100 struct rcu_head **nxttail;
101 long count; /* # of queued items */ 101 long qlen; /* # of queued callbacks */
102 struct rcu_head *curlist; 102 struct rcu_head *curlist;
103 struct rcu_head **curtail; 103 struct rcu_head **curtail;
104 struct rcu_head *donelist; 104 struct rcu_head *donelist;
105 struct rcu_head **donetail; 105 struct rcu_head **donetail;
106 long blimit; /* Upper limit on a processed batch */
106 int cpu; 107 int cpu;
107 struct rcu_head barrier; 108 struct rcu_head barrier;
109#ifdef CONFIG_SMP
110 long last_rs_qlen; /* qlen during the last resched */
111#endif
108}; 112};
109 113
110DECLARE_PER_CPU(struct rcu_data, rcu_data); 114DECLARE_PER_CPU(struct rcu_data, rcu_data);
diff --git a/include/linux/reiserfs_fs.h b/include/linux/reiserfs_fs.h
index 7d51149bd793..dad78cecfd20 100644
--- a/include/linux/reiserfs_fs.h
+++ b/include/linux/reiserfs_fs.h
@@ -1052,7 +1052,7 @@ struct reiserfs_dir_entry {
1052 int de_entrylen; 1052 int de_entrylen;
1053 int de_namelen; 1053 int de_namelen;
1054 char *de_name; 1054 char *de_name;
1055 char *de_gen_number_bit_string; 1055 unsigned long *de_gen_number_bit_string;
1056 1056
1057 __u32 de_dir_id; 1057 __u32 de_dir_id;
1058 __u32 de_objectid; 1058 __u32 de_objectid;
diff --git a/include/linux/sched.h b/include/linux/sched.h
index ff2e09c953b9..62e6314382f0 100644
--- a/include/linux/sched.h
+++ b/include/linux/sched.h
@@ -892,7 +892,6 @@ static inline int pid_alive(struct task_struct *p)
892} 892}
893 893
894extern void free_task(struct task_struct *tsk); 894extern void free_task(struct task_struct *tsk);
895extern void __put_task_struct(struct task_struct *tsk);
896#define get_task_struct(tsk) do { atomic_inc(&(tsk)->usage); } while(0) 895#define get_task_struct(tsk) do { atomic_inc(&(tsk)->usage); } while(0)
897 896
898extern void __put_task_struct_cb(struct rcu_head *rhp); 897extern void __put_task_struct_cb(struct rcu_head *rhp);
diff --git a/include/pcmcia/device_id.h b/include/pcmcia/device_id.h
index 346d81ece287..e04e0b0d9a25 100644
--- a/include/pcmcia/device_id.h
+++ b/include/pcmcia/device_id.h
@@ -72,6 +72,15 @@
72 .prod_id = { (v1), (v2), (v3), (v4) }, \ 72 .prod_id = { (v1), (v2), (v3), (v4) }, \
73 .prod_id_hash = { (vh1), (vh2), (vh3), (vh4) }, } 73 .prod_id_hash = { (vh1), (vh2), (vh3), (vh4) }, }
74 74
75#define PCMCIA_DEVICE_MANF_CARD_PROD_ID1(manf, card, v1, vh1) { \
76 .match_flags = PCMCIA_DEV_ID_MATCH_MANF_ID| \
77 PCMCIA_DEV_ID_MATCH_CARD_ID| \
78 PCMCIA_DEV_ID_MATCH_PROD_ID1, \
79 .manf_id = (manf), \
80 .card_id = (card), \
81 .prod_id = { (v1), NULL, NULL, NULL }, \
82 .prod_id_hash = { (vh1), 0, 0, 0 }, }
83
75 84
76/* multi-function devices */ 85/* multi-function devices */
77 86
diff --git a/kernel/fork.c b/kernel/fork.c
index fbea12d7a943..a8eab86de7f1 100644
--- a/kernel/fork.c
+++ b/kernel/fork.c
@@ -108,8 +108,10 @@ void free_task(struct task_struct *tsk)
108} 108}
109EXPORT_SYMBOL(free_task); 109EXPORT_SYMBOL(free_task);
110 110
111void __put_task_struct(struct task_struct *tsk) 111void __put_task_struct_cb(struct rcu_head *rhp)
112{ 112{
113 struct task_struct *tsk = container_of(rhp, struct task_struct, rcu);
114
113 WARN_ON(!(tsk->exit_state & (EXIT_DEAD | EXIT_ZOMBIE))); 115 WARN_ON(!(tsk->exit_state & (EXIT_DEAD | EXIT_ZOMBIE)));
114 WARN_ON(atomic_read(&tsk->usage)); 116 WARN_ON(atomic_read(&tsk->usage));
115 WARN_ON(tsk == current); 117 WARN_ON(tsk == current);
diff --git a/kernel/hrtimer.c b/kernel/hrtimer.c
index 5ae51f1bc7c8..14bc9cfa6399 100644
--- a/kernel/hrtimer.c
+++ b/kernel/hrtimer.c
@@ -505,6 +505,41 @@ ktime_t hrtimer_get_remaining(const struct hrtimer *timer)
505 return rem; 505 return rem;
506} 506}
507 507
508#ifdef CONFIG_NO_IDLE_HZ
509/**
510 * hrtimer_get_next_event - get the time until next expiry event
511 *
512 * Returns the delta to the next expiry event or KTIME_MAX if no timer
513 * is pending.
514 */
515ktime_t hrtimer_get_next_event(void)
516{
517 struct hrtimer_base *base = __get_cpu_var(hrtimer_bases);
518 ktime_t delta, mindelta = { .tv64 = KTIME_MAX };
519 unsigned long flags;
520 int i;
521
522 for (i = 0; i < MAX_HRTIMER_BASES; i++, base++) {
523 struct hrtimer *timer;
524
525 spin_lock_irqsave(&base->lock, flags);
526 if (!base->first) {
527 spin_unlock_irqrestore(&base->lock, flags);
528 continue;
529 }
530 timer = rb_entry(base->first, struct hrtimer, node);
531 delta.tv64 = timer->expires.tv64;
532 spin_unlock_irqrestore(&base->lock, flags);
533 delta = ktime_sub(delta, base->get_time());
534 if (delta.tv64 < mindelta.tv64)
535 mindelta.tv64 = delta.tv64;
536 }
537 if (mindelta.tv64 < 0)
538 mindelta.tv64 = 0;
539 return mindelta;
540}
541#endif
542
508/** 543/**
509 * hrtimer_init - initialize a timer to the given clock 544 * hrtimer_init - initialize a timer to the given clock
510 * 545 *
diff --git a/kernel/rcupdate.c b/kernel/rcupdate.c
index 0cf8146bd585..8cf15a569fcd 100644
--- a/kernel/rcupdate.c
+++ b/kernel/rcupdate.c
@@ -67,7 +67,43 @@ DEFINE_PER_CPU(struct rcu_data, rcu_bh_data) = { 0L };
67 67
68/* Fake initialization required by compiler */ 68/* Fake initialization required by compiler */
69static DEFINE_PER_CPU(struct tasklet_struct, rcu_tasklet) = {NULL}; 69static DEFINE_PER_CPU(struct tasklet_struct, rcu_tasklet) = {NULL};
70static int maxbatch = 10000; 70static int blimit = 10;
71static int qhimark = 10000;
72static int qlowmark = 100;
73#ifdef CONFIG_SMP
74static int rsinterval = 1000;
75#endif
76
77static atomic_t rcu_barrier_cpu_count;
78static struct semaphore rcu_barrier_sema;
79static struct completion rcu_barrier_completion;
80
81#ifdef CONFIG_SMP
82static void force_quiescent_state(struct rcu_data *rdp,
83 struct rcu_ctrlblk *rcp)
84{
85 int cpu;
86 cpumask_t cpumask;
87 set_need_resched();
88 if (unlikely(rdp->qlen - rdp->last_rs_qlen > rsinterval)) {
89 rdp->last_rs_qlen = rdp->qlen;
90 /*
91 * Don't send IPI to itself. With irqs disabled,
92 * rdp->cpu is the current cpu.
93 */
94 cpumask = rcp->cpumask;
95 cpu_clear(rdp->cpu, cpumask);
96 for_each_cpu_mask(cpu, cpumask)
97 smp_send_reschedule(cpu);
98 }
99}
100#else
101static inline void force_quiescent_state(struct rcu_data *rdp,
102 struct rcu_ctrlblk *rcp)
103{
104 set_need_resched();
105}
106#endif
71 107
72/** 108/**
73 * call_rcu - Queue an RCU callback for invocation after a grace period. 109 * call_rcu - Queue an RCU callback for invocation after a grace period.
@@ -92,17 +128,13 @@ void fastcall call_rcu(struct rcu_head *head,
92 rdp = &__get_cpu_var(rcu_data); 128 rdp = &__get_cpu_var(rcu_data);
93 *rdp->nxttail = head; 129 *rdp->nxttail = head;
94 rdp->nxttail = &head->next; 130 rdp->nxttail = &head->next;
95 131 if (unlikely(++rdp->qlen > qhimark)) {
96 if (unlikely(++rdp->count > 10000)) 132 rdp->blimit = INT_MAX;
97 set_need_resched(); 133 force_quiescent_state(rdp, &rcu_ctrlblk);
98 134 }
99 local_irq_restore(flags); 135 local_irq_restore(flags);
100} 136}
101 137
102static atomic_t rcu_barrier_cpu_count;
103static struct semaphore rcu_barrier_sema;
104static struct completion rcu_barrier_completion;
105
106/** 138/**
107 * call_rcu_bh - Queue an RCU for invocation after a quicker grace period. 139 * call_rcu_bh - Queue an RCU for invocation after a quicker grace period.
108 * @head: structure to be used for queueing the RCU updates. 140 * @head: structure to be used for queueing the RCU updates.
@@ -131,12 +163,12 @@ void fastcall call_rcu_bh(struct rcu_head *head,
131 rdp = &__get_cpu_var(rcu_bh_data); 163 rdp = &__get_cpu_var(rcu_bh_data);
132 *rdp->nxttail = head; 164 *rdp->nxttail = head;
133 rdp->nxttail = &head->next; 165 rdp->nxttail = &head->next;
134 rdp->count++; 166
135/* 167 if (unlikely(++rdp->qlen > qhimark)) {
136 * Should we directly call rcu_do_batch() here ? 168 rdp->blimit = INT_MAX;
137 * if (unlikely(rdp->count > 10000)) 169 force_quiescent_state(rdp, &rcu_bh_ctrlblk);
138 * rcu_do_batch(rdp); 170 }
139 */ 171
140 local_irq_restore(flags); 172 local_irq_restore(flags);
141} 173}
142 174
@@ -199,10 +231,12 @@ static void rcu_do_batch(struct rcu_data *rdp)
199 next = rdp->donelist = list->next; 231 next = rdp->donelist = list->next;
200 list->func(list); 232 list->func(list);
201 list = next; 233 list = next;
202 rdp->count--; 234 rdp->qlen--;
203 if (++count >= maxbatch) 235 if (++count >= rdp->blimit)
204 break; 236 break;
205 } 237 }
238 if (rdp->blimit == INT_MAX && rdp->qlen <= qlowmark)
239 rdp->blimit = blimit;
206 if (!rdp->donelist) 240 if (!rdp->donelist)
207 rdp->donetail = &rdp->donelist; 241 rdp->donetail = &rdp->donelist;
208 else 242 else
@@ -473,6 +507,7 @@ static void rcu_init_percpu_data(int cpu, struct rcu_ctrlblk *rcp,
473 rdp->quiescbatch = rcp->completed; 507 rdp->quiescbatch = rcp->completed;
474 rdp->qs_pending = 0; 508 rdp->qs_pending = 0;
475 rdp->cpu = cpu; 509 rdp->cpu = cpu;
510 rdp->blimit = blimit;
476} 511}
477 512
478static void __devinit rcu_online_cpu(int cpu) 513static void __devinit rcu_online_cpu(int cpu)
@@ -567,7 +602,12 @@ void synchronize_kernel(void)
567 synchronize_rcu(); 602 synchronize_rcu();
568} 603}
569 604
570module_param(maxbatch, int, 0); 605module_param(blimit, int, 0);
606module_param(qhimark, int, 0);
607module_param(qlowmark, int, 0);
608#ifdef CONFIG_SMP
609module_param(rsinterval, int, 0);
610#endif
571EXPORT_SYMBOL_GPL(rcu_batches_completed); 611EXPORT_SYMBOL_GPL(rcu_batches_completed);
572EXPORT_SYMBOL(call_rcu); /* WARNING: GPL-only in April 2006. */ 612EXPORT_SYMBOL(call_rcu); /* WARNING: GPL-only in April 2006. */
573EXPORT_SYMBOL(call_rcu_bh); /* WARNING: GPL-only in April 2006. */ 613EXPORT_SYMBOL(call_rcu_bh); /* WARNING: GPL-only in April 2006. */
diff --git a/kernel/sched.c b/kernel/sched.c
index 12d291bf3379..4d46e90f59c3 100644
--- a/kernel/sched.c
+++ b/kernel/sched.c
@@ -178,13 +178,6 @@ static unsigned int task_timeslice(task_t *p)
178#define task_hot(p, now, sd) ((long long) ((now) - (p)->last_ran) \ 178#define task_hot(p, now, sd) ((long long) ((now) - (p)->last_ran) \
179 < (long long) (sd)->cache_hot_time) 179 < (long long) (sd)->cache_hot_time)
180 180
181void __put_task_struct_cb(struct rcu_head *rhp)
182{
183 __put_task_struct(container_of(rhp, struct task_struct, rcu));
184}
185
186EXPORT_SYMBOL_GPL(__put_task_struct_cb);
187
188/* 181/*
189 * These are the runqueue data structures: 182 * These are the runqueue data structures:
190 */ 183 */
@@ -4028,6 +4021,8 @@ static inline void __cond_resched(void)
4028 */ 4021 */
4029 if (unlikely(preempt_count())) 4022 if (unlikely(preempt_count()))
4030 return; 4023 return;
4024 if (unlikely(system_state != SYSTEM_RUNNING))
4025 return;
4031 do { 4026 do {
4032 add_preempt_count(PREEMPT_ACTIVE); 4027 add_preempt_count(PREEMPT_ACTIVE);
4033 schedule(); 4028 schedule();
@@ -4333,6 +4328,7 @@ void __devinit init_idle(task_t *idle, int cpu)
4333 runqueue_t *rq = cpu_rq(cpu); 4328 runqueue_t *rq = cpu_rq(cpu);
4334 unsigned long flags; 4329 unsigned long flags;
4335 4330
4331 idle->timestamp = sched_clock();
4336 idle->sleep_avg = 0; 4332 idle->sleep_avg = 0;
4337 idle->array = NULL; 4333 idle->array = NULL;
4338 idle->prio = MAX_PRIO; 4334 idle->prio = MAX_PRIO;
diff --git a/kernel/sysctl.c b/kernel/sysctl.c
index acf6c1550f27..32b48e8ee36e 100644
--- a/kernel/sysctl.c
+++ b/kernel/sysctl.c
@@ -50,6 +50,9 @@
50#include <asm/uaccess.h> 50#include <asm/uaccess.h>
51#include <asm/processor.h> 51#include <asm/processor.h>
52 52
53extern int proc_nr_files(ctl_table *table, int write, struct file *filp,
54 void __user *buffer, size_t *lenp, loff_t *ppos);
55
53#if defined(CONFIG_SYSCTL) 56#if defined(CONFIG_SYSCTL)
54 57
55/* External variables not in a header file. */ 58/* External variables not in a header file. */
@@ -667,7 +670,7 @@ static ctl_table kern_table[] = {
667 .data = &acpi_video_flags, 670 .data = &acpi_video_flags,
668 .maxlen = sizeof (unsigned long), 671 .maxlen = sizeof (unsigned long),
669 .mode = 0644, 672 .mode = 0644,
670 .proc_handler = &proc_dointvec, 673 .proc_handler = &proc_doulongvec_minmax,
671 }, 674 },
672#endif 675#endif
673#ifdef CONFIG_IA64 676#ifdef CONFIG_IA64
@@ -943,7 +946,7 @@ static ctl_table fs_table[] = {
943 .data = &files_stat, 946 .data = &files_stat,
944 .maxlen = 3*sizeof(int), 947 .maxlen = 3*sizeof(int),
945 .mode = 0444, 948 .mode = 0444,
946 .proc_handler = &proc_dointvec, 949 .proc_handler = &proc_nr_files,
947 }, 950 },
948 { 951 {
949 .ctl_name = FS_MAXFILE, 952 .ctl_name = FS_MAXFILE,
diff --git a/kernel/timer.c b/kernel/timer.c
index fe3a9a9f8328..bf7c4193b936 100644
--- a/kernel/timer.c
+++ b/kernel/timer.c
@@ -489,9 +489,21 @@ unsigned long next_timer_interrupt(void)
489 struct list_head *list; 489 struct list_head *list;
490 struct timer_list *nte; 490 struct timer_list *nte;
491 unsigned long expires; 491 unsigned long expires;
492 unsigned long hr_expires = MAX_JIFFY_OFFSET;
493 ktime_t hr_delta;
492 tvec_t *varray[4]; 494 tvec_t *varray[4];
493 int i, j; 495 int i, j;
494 496
497 hr_delta = hrtimer_get_next_event();
498 if (hr_delta.tv64 != KTIME_MAX) {
499 struct timespec tsdelta;
500 tsdelta = ktime_to_timespec(hr_delta);
501 hr_expires = timespec_to_jiffies(&tsdelta);
502 if (hr_expires < 3)
503 return hr_expires + jiffies;
504 }
505 hr_expires += jiffies;
506
495 base = &__get_cpu_var(tvec_bases); 507 base = &__get_cpu_var(tvec_bases);
496 spin_lock(&base->t_base.lock); 508 spin_lock(&base->t_base.lock);
497 expires = base->timer_jiffies + (LONG_MAX >> 1); 509 expires = base->timer_jiffies + (LONG_MAX >> 1);
@@ -542,6 +554,10 @@ found:
542 } 554 }
543 } 555 }
544 spin_unlock(&base->t_base.lock); 556 spin_unlock(&base->t_base.lock);
557
558 if (time_before(hr_expires, expires))
559 return hr_expires;
560
545 return expires; 561 return expires;
546} 562}
547#endif 563#endif
@@ -925,6 +941,8 @@ static inline void update_times(void)
925void do_timer(struct pt_regs *regs) 941void do_timer(struct pt_regs *regs)
926{ 942{
927 jiffies_64++; 943 jiffies_64++;
944 /* prevent loading jiffies before storing new jiffies_64 value. */
945 barrier();
928 update_times(); 946 update_times();
929 softlockup_tick(regs); 947 softlockup_tick(regs);
930} 948}
@@ -1351,10 +1369,10 @@ static inline u64 time_interpolator_get_cycles(unsigned int src)
1351 return x(); 1369 return x();
1352 1370
1353 case TIME_SOURCE_MMIO64 : 1371 case TIME_SOURCE_MMIO64 :
1354 return readq((void __iomem *) time_interpolator->addr); 1372 return readq_relaxed((void __iomem *)time_interpolator->addr);
1355 1373
1356 case TIME_SOURCE_MMIO32 : 1374 case TIME_SOURCE_MMIO32 :
1357 return readl((void __iomem *) time_interpolator->addr); 1375 return readl_relaxed((void __iomem *)time_interpolator->addr);
1358 1376
1359 default: return get_cycles(); 1377 default: return get_cycles();
1360 } 1378 }
diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c
index a918f77f02f3..1fe76d963ac2 100644
--- a/mm/memory_hotplug.c
+++ b/mm/memory_hotplug.c
@@ -130,6 +130,7 @@ int online_pages(unsigned long pfn, unsigned long nr_pages)
130 onlined_pages++; 130 onlined_pages++;
131 } 131 }
132 zone->present_pages += onlined_pages; 132 zone->present_pages += onlined_pages;
133 zone->zone_pgdat->node_present_pages += onlined_pages;
133 134
134 setup_per_zone_pages_min(); 135 setup_per_zone_pages_min();
135 136
diff --git a/mm/mempolicy.c b/mm/mempolicy.c
index 5643cfed6b0f..954981b14303 100644
--- a/mm/mempolicy.c
+++ b/mm/mempolicy.c
@@ -197,7 +197,7 @@ static struct mempolicy *mpol_new(int mode, nodemask_t *nodes)
197 return policy; 197 return policy;
198} 198}
199 199
200static void gather_stats(struct page *, void *); 200static void gather_stats(struct page *, void *, int pte_dirty);
201static void migrate_page_add(struct page *page, struct list_head *pagelist, 201static void migrate_page_add(struct page *page, struct list_head *pagelist,
202 unsigned long flags); 202 unsigned long flags);
203 203
@@ -239,7 +239,7 @@ static int check_pte_range(struct vm_area_struct *vma, pmd_t *pmd,
239 continue; 239 continue;
240 240
241 if (flags & MPOL_MF_STATS) 241 if (flags & MPOL_MF_STATS)
242 gather_stats(page, private); 242 gather_stats(page, private, pte_dirty(*pte));
243 else if (flags & (MPOL_MF_MOVE | MPOL_MF_MOVE_ALL)) 243 else if (flags & (MPOL_MF_MOVE | MPOL_MF_MOVE_ALL))
244 migrate_page_add(page, private, flags); 244 migrate_page_add(page, private, flags);
245 else 245 else
@@ -1753,66 +1753,145 @@ static inline int mpol_to_str(char *buffer, int maxlen, struct mempolicy *pol)
1753struct numa_maps { 1753struct numa_maps {
1754 unsigned long pages; 1754 unsigned long pages;
1755 unsigned long anon; 1755 unsigned long anon;
1756 unsigned long mapped; 1756 unsigned long active;
1757 unsigned long writeback;
1757 unsigned long mapcount_max; 1758 unsigned long mapcount_max;
1759 unsigned long dirty;
1760 unsigned long swapcache;
1758 unsigned long node[MAX_NUMNODES]; 1761 unsigned long node[MAX_NUMNODES];
1759}; 1762};
1760 1763
1761static void gather_stats(struct page *page, void *private) 1764static void gather_stats(struct page *page, void *private, int pte_dirty)
1762{ 1765{
1763 struct numa_maps *md = private; 1766 struct numa_maps *md = private;
1764 int count = page_mapcount(page); 1767 int count = page_mapcount(page);
1765 1768
1766 if (count) 1769 md->pages++;
1767 md->mapped++; 1770 if (pte_dirty || PageDirty(page))
1771 md->dirty++;
1768 1772
1769 if (count > md->mapcount_max) 1773 if (PageSwapCache(page))
1770 md->mapcount_max = count; 1774 md->swapcache++;
1771 1775
1772 md->pages++; 1776 if (PageActive(page))
1777 md->active++;
1778
1779 if (PageWriteback(page))
1780 md->writeback++;
1773 1781
1774 if (PageAnon(page)) 1782 if (PageAnon(page))
1775 md->anon++; 1783 md->anon++;
1776 1784
1785 if (count > md->mapcount_max)
1786 md->mapcount_max = count;
1787
1777 md->node[page_to_nid(page)]++; 1788 md->node[page_to_nid(page)]++;
1778 cond_resched(); 1789 cond_resched();
1779} 1790}
1780 1791
1792#ifdef CONFIG_HUGETLB_PAGE
1793static void check_huge_range(struct vm_area_struct *vma,
1794 unsigned long start, unsigned long end,
1795 struct numa_maps *md)
1796{
1797 unsigned long addr;
1798 struct page *page;
1799
1800 for (addr = start; addr < end; addr += HPAGE_SIZE) {
1801 pte_t *ptep = huge_pte_offset(vma->vm_mm, addr & HPAGE_MASK);
1802 pte_t pte;
1803
1804 if (!ptep)
1805 continue;
1806
1807 pte = *ptep;
1808 if (pte_none(pte))
1809 continue;
1810
1811 page = pte_page(pte);
1812 if (!page)
1813 continue;
1814
1815 gather_stats(page, md, pte_dirty(*ptep));
1816 }
1817}
1818#else
1819static inline void check_huge_range(struct vm_area_struct *vma,
1820 unsigned long start, unsigned long end,
1821 struct numa_maps *md)
1822{
1823}
1824#endif
1825
1781int show_numa_map(struct seq_file *m, void *v) 1826int show_numa_map(struct seq_file *m, void *v)
1782{ 1827{
1783 struct task_struct *task = m->private; 1828 struct task_struct *task = m->private;
1784 struct vm_area_struct *vma = v; 1829 struct vm_area_struct *vma = v;
1785 struct numa_maps *md; 1830 struct numa_maps *md;
1831 struct file *file = vma->vm_file;
1832 struct mm_struct *mm = vma->vm_mm;
1786 int n; 1833 int n;
1787 char buffer[50]; 1834 char buffer[50];
1788 1835
1789 if (!vma->vm_mm) 1836 if (!mm)
1790 return 0; 1837 return 0;
1791 1838
1792 md = kzalloc(sizeof(struct numa_maps), GFP_KERNEL); 1839 md = kzalloc(sizeof(struct numa_maps), GFP_KERNEL);
1793 if (!md) 1840 if (!md)
1794 return 0; 1841 return 0;
1795 1842
1796 check_pgd_range(vma, vma->vm_start, vma->vm_end, 1843 mpol_to_str(buffer, sizeof(buffer),
1797 &node_online_map, MPOL_MF_STATS, md); 1844 get_vma_policy(task, vma, vma->vm_start));
1798 1845
1799 if (md->pages) { 1846 seq_printf(m, "%08lx %s", vma->vm_start, buffer);
1800 mpol_to_str(buffer, sizeof(buffer),
1801 get_vma_policy(task, vma, vma->vm_start));
1802 1847
1803 seq_printf(m, "%08lx %s pages=%lu mapped=%lu maxref=%lu", 1848 if (file) {
1804 vma->vm_start, buffer, md->pages, 1849 seq_printf(m, " file=");
1805 md->mapped, md->mapcount_max); 1850 seq_path(m, file->f_vfsmnt, file->f_dentry, "\n\t= ");
1851 } else if (vma->vm_start <= mm->brk && vma->vm_end >= mm->start_brk) {
1852 seq_printf(m, " heap");
1853 } else if (vma->vm_start <= mm->start_stack &&
1854 vma->vm_end >= mm->start_stack) {
1855 seq_printf(m, " stack");
1856 }
1806 1857
1807 if (md->anon) 1858 if (is_vm_hugetlb_page(vma)) {
1808 seq_printf(m," anon=%lu",md->anon); 1859 check_huge_range(vma, vma->vm_start, vma->vm_end, md);
1860 seq_printf(m, " huge");
1861 } else {
1862 check_pgd_range(vma, vma->vm_start, vma->vm_end,
1863 &node_online_map, MPOL_MF_STATS, md);
1864 }
1809 1865
1810 for_each_online_node(n) 1866 if (!md->pages)
1811 if (md->node[n]) 1867 goto out;
1812 seq_printf(m, " N%d=%lu", n, md->node[n]);
1813 1868
1814 seq_putc(m, '\n'); 1869 if (md->anon)
1815 } 1870 seq_printf(m," anon=%lu",md->anon);
1871
1872 if (md->dirty)
1873 seq_printf(m," dirty=%lu",md->dirty);
1874
1875 if (md->pages != md->anon && md->pages != md->dirty)
1876 seq_printf(m, " mapped=%lu", md->pages);
1877
1878 if (md->mapcount_max > 1)
1879 seq_printf(m, " mapmax=%lu", md->mapcount_max);
1880
1881 if (md->swapcache)
1882 seq_printf(m," swapcache=%lu", md->swapcache);
1883
1884 if (md->active < md->pages && !is_vm_hugetlb_page(vma))
1885 seq_printf(m," active=%lu", md->active);
1886
1887 if (md->writeback)
1888 seq_printf(m," writeback=%lu", md->writeback);
1889
1890 for_each_online_node(n)
1891 if (md->node[n])
1892 seq_printf(m, " N%d=%lu", n, md->node[n]);
1893out:
1894 seq_putc(m, '\n');
1816 kfree(md); 1895 kfree(md);
1817 1896
1818 if (m->count < m->size) 1897 if (m->count < m->size)
diff --git a/mm/oom_kill.c b/mm/oom_kill.c
index c86c737d2433..78747afad6b0 100644
--- a/mm/oom_kill.c
+++ b/mm/oom_kill.c
@@ -355,6 +355,7 @@ retry:
355 } 355 }
356 356
357out: 357out:
358 read_unlock(&tasklist_lock);
358 cpuset_unlock(); 359 cpuset_unlock();
359 if (mm) 360 if (mm)
360 mmput(mm); 361 mmput(mm);
@@ -364,5 +365,5 @@ out:
364 * retry to allocate memory unless "p" is current 365 * retry to allocate memory unless "p" is current
365 */ 366 */
366 if (!test_thread_flag(TIF_MEMDIE)) 367 if (!test_thread_flag(TIF_MEMDIE))
367 schedule_timeout_interruptible(1); 368 schedule_timeout_uninterruptible(1);
368} 369}
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index 791690d7d3fa..234bd4895d14 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -590,21 +590,20 @@ static int rmqueue_bulk(struct zone *zone, unsigned int order,
590} 590}
591 591
592#ifdef CONFIG_NUMA 592#ifdef CONFIG_NUMA
593/* Called from the slab reaper to drain remote pagesets */ 593/*
594void drain_remote_pages(void) 594 * Called from the slab reaper to drain pagesets on a particular node that
595 * belong to the currently executing processor.
596 */
597void drain_node_pages(int nodeid)
595{ 598{
596 struct zone *zone; 599 int i, z;
597 int i;
598 unsigned long flags; 600 unsigned long flags;
599 601
600 local_irq_save(flags); 602 local_irq_save(flags);
601 for_each_zone(zone) { 603 for (z = 0; z < MAX_NR_ZONES; z++) {
604 struct zone *zone = NODE_DATA(nodeid)->node_zones + z;
602 struct per_cpu_pageset *pset; 605 struct per_cpu_pageset *pset;
603 606
604 /* Do not drain local pagesets */
605 if (zone->zone_pgdat->node_id == numa_node_id())
606 continue;
607
608 pset = zone_pcp(zone, smp_processor_id()); 607 pset = zone_pcp(zone, smp_processor_id());
609 for (i = 0; i < ARRAY_SIZE(pset->pcp); i++) { 608 for (i = 0; i < ARRAY_SIZE(pset->pcp); i++) {
610 struct per_cpu_pages *pcp; 609 struct per_cpu_pages *pcp;
diff --git a/mm/rmap.c b/mm/rmap.c
index d8ce5ff61454..67f0e20b101f 100644
--- a/mm/rmap.c
+++ b/mm/rmap.c
@@ -537,9 +537,6 @@ void page_add_new_anon_rmap(struct page *page,
537 */ 537 */
538void page_add_file_rmap(struct page *page) 538void page_add_file_rmap(struct page *page)
539{ 539{
540 BUG_ON(PageAnon(page));
541 BUG_ON(!pfn_valid(page_to_pfn(page)));
542
543 if (atomic_inc_and_test(&page->_mapcount)) 540 if (atomic_inc_and_test(&page->_mapcount))
544 __inc_page_state(nr_mapped); 541 __inc_page_state(nr_mapped);
545} 542}
diff --git a/mm/slab.c b/mm/slab.c
index add05d808a4a..d0bd7f07ab04 100644
--- a/mm/slab.c
+++ b/mm/slab.c
@@ -789,6 +789,47 @@ static void __slab_error(const char *function, struct kmem_cache *cachep, char *
789 dump_stack(); 789 dump_stack();
790} 790}
791 791
792#ifdef CONFIG_NUMA
793/*
794 * Special reaping functions for NUMA systems called from cache_reap().
795 * These take care of doing round robin flushing of alien caches (containing
796 * objects freed on different nodes from which they were allocated) and the
797 * flushing of remote pcps by calling drain_node_pages.
798 */
799static DEFINE_PER_CPU(unsigned long, reap_node);
800
801static void init_reap_node(int cpu)
802{
803 int node;
804
805 node = next_node(cpu_to_node(cpu), node_online_map);
806 if (node == MAX_NUMNODES)
807 node = 0;
808
809 __get_cpu_var(reap_node) = node;
810}
811
812static void next_reap_node(void)
813{
814 int node = __get_cpu_var(reap_node);
815
816 /*
817 * Also drain per cpu pages on remote zones
818 */
819 if (node != numa_node_id())
820 drain_node_pages(node);
821
822 node = next_node(node, node_online_map);
823 if (unlikely(node >= MAX_NUMNODES))
824 node = first_node(node_online_map);
825 __get_cpu_var(reap_node) = node;
826}
827
828#else
829#define init_reap_node(cpu) do { } while (0)
830#define next_reap_node(void) do { } while (0)
831#endif
832
792/* 833/*
793 * Initiate the reap timer running on the target CPU. We run at around 1 to 2Hz 834 * Initiate the reap timer running on the target CPU. We run at around 1 to 2Hz
794 * via the workqueue/eventd. 835 * via the workqueue/eventd.
@@ -806,6 +847,7 @@ static void __devinit start_cpu_timer(int cpu)
806 * at that time. 847 * at that time.
807 */ 848 */
808 if (keventd_up() && reap_work->func == NULL) { 849 if (keventd_up() && reap_work->func == NULL) {
850 init_reap_node(cpu);
809 INIT_WORK(reap_work, cache_reap, NULL); 851 INIT_WORK(reap_work, cache_reap, NULL);
810 schedule_delayed_work_on(cpu, reap_work, HZ + 3 * cpu); 852 schedule_delayed_work_on(cpu, reap_work, HZ + 3 * cpu);
811 } 853 }
@@ -884,6 +926,23 @@ static void __drain_alien_cache(struct kmem_cache *cachep,
884 } 926 }
885} 927}
886 928
929/*
930 * Called from cache_reap() to regularly drain alien caches round robin.
931 */
932static void reap_alien(struct kmem_cache *cachep, struct kmem_list3 *l3)
933{
934 int node = __get_cpu_var(reap_node);
935
936 if (l3->alien) {
937 struct array_cache *ac = l3->alien[node];
938 if (ac && ac->avail) {
939 spin_lock_irq(&ac->lock);
940 __drain_alien_cache(cachep, ac, node);
941 spin_unlock_irq(&ac->lock);
942 }
943 }
944}
945
887static void drain_alien_cache(struct kmem_cache *cachep, struct array_cache **alien) 946static void drain_alien_cache(struct kmem_cache *cachep, struct array_cache **alien)
888{ 947{
889 int i = 0; 948 int i = 0;
@@ -902,6 +961,7 @@ static void drain_alien_cache(struct kmem_cache *cachep, struct array_cache **al
902#else 961#else
903 962
904#define drain_alien_cache(cachep, alien) do { } while (0) 963#define drain_alien_cache(cachep, alien) do { } while (0)
964#define reap_alien(cachep, l3) do { } while (0)
905 965
906static inline struct array_cache **alloc_alien_cache(int node, int limit) 966static inline struct array_cache **alloc_alien_cache(int node, int limit)
907{ 967{
@@ -1124,6 +1184,7 @@ void __init kmem_cache_init(void)
1124 struct cache_sizes *sizes; 1184 struct cache_sizes *sizes;
1125 struct cache_names *names; 1185 struct cache_names *names;
1126 int i; 1186 int i;
1187 int order;
1127 1188
1128 for (i = 0; i < NUM_INIT_LISTS; i++) { 1189 for (i = 0; i < NUM_INIT_LISTS; i++) {
1129 kmem_list3_init(&initkmem_list3[i]); 1190 kmem_list3_init(&initkmem_list3[i]);
@@ -1167,11 +1228,15 @@ void __init kmem_cache_init(void)
1167 1228
1168 cache_cache.buffer_size = ALIGN(cache_cache.buffer_size, cache_line_size()); 1229 cache_cache.buffer_size = ALIGN(cache_cache.buffer_size, cache_line_size());
1169 1230
1170 cache_estimate(0, cache_cache.buffer_size, cache_line_size(), 0, 1231 for (order = 0; order < MAX_ORDER; order++) {
1171 &left_over, &cache_cache.num); 1232 cache_estimate(order, cache_cache.buffer_size,
1233 cache_line_size(), 0, &left_over, &cache_cache.num);
1234 if (cache_cache.num)
1235 break;
1236 }
1172 if (!cache_cache.num) 1237 if (!cache_cache.num)
1173 BUG(); 1238 BUG();
1174 1239 cache_cache.gfporder = order;
1175 cache_cache.colour = left_over / cache_cache.colour_off; 1240 cache_cache.colour = left_over / cache_cache.colour_off;
1176 cache_cache.slab_size = ALIGN(cache_cache.num * sizeof(kmem_bufctl_t) + 1241 cache_cache.slab_size = ALIGN(cache_cache.num * sizeof(kmem_bufctl_t) +
1177 sizeof(struct slab), cache_line_size()); 1242 sizeof(struct slab), cache_line_size());
@@ -1628,36 +1693,44 @@ static inline size_t calculate_slab_order(struct kmem_cache *cachep,
1628 size_t size, size_t align, unsigned long flags) 1693 size_t size, size_t align, unsigned long flags)
1629{ 1694{
1630 size_t left_over = 0; 1695 size_t left_over = 0;
1696 int gfporder;
1631 1697
1632 for (;; cachep->gfporder++) { 1698 for (gfporder = 0 ; gfporder <= MAX_GFP_ORDER; gfporder++) {
1633 unsigned int num; 1699 unsigned int num;
1634 size_t remainder; 1700 size_t remainder;
1635 1701
1636 if (cachep->gfporder > MAX_GFP_ORDER) { 1702 cache_estimate(gfporder, size, align, flags, &remainder, &num);
1637 cachep->num = 0;
1638 break;
1639 }
1640
1641 cache_estimate(cachep->gfporder, size, align, flags,
1642 &remainder, &num);
1643 if (!num) 1703 if (!num)
1644 continue; 1704 continue;
1705
1645 /* More than offslab_limit objects will cause problems */ 1706 /* More than offslab_limit objects will cause problems */
1646 if (flags & CFLGS_OFF_SLAB && cachep->num > offslab_limit) 1707 if ((flags & CFLGS_OFF_SLAB) && num > offslab_limit)
1647 break; 1708 break;
1648 1709
1710 /* Found something acceptable - save it away */
1649 cachep->num = num; 1711 cachep->num = num;
1712 cachep->gfporder = gfporder;
1650 left_over = remainder; 1713 left_over = remainder;
1651 1714
1652 /* 1715 /*
1716 * A VFS-reclaimable slab tends to have most allocations
1717 * as GFP_NOFS and we really don't want to have to be allocating
1718 * higher-order pages when we are unable to shrink dcache.
1719 */
1720 if (flags & SLAB_RECLAIM_ACCOUNT)
1721 break;
1722
1723 /*
1653 * Large number of objects is good, but very large slabs are 1724 * Large number of objects is good, but very large slabs are
1654 * currently bad for the gfp()s. 1725 * currently bad for the gfp()s.
1655 */ 1726 */
1656 if (cachep->gfporder >= slab_break_gfp_order) 1727 if (gfporder >= slab_break_gfp_order)
1657 break; 1728 break;
1658 1729
1659 if ((left_over * 8) <= (PAGE_SIZE << cachep->gfporder)) 1730 /*
1660 /* Acceptable internal fragmentation */ 1731 * Acceptable internal fragmentation?
1732 */
1733 if ((left_over * 8) <= (PAGE_SIZE << gfporder))
1661 break; 1734 break;
1662 } 1735 }
1663 return left_over; 1736 return left_over;
@@ -1869,17 +1942,7 @@ kmem_cache_create (const char *name, size_t size, size_t align,
1869 1942
1870 size = ALIGN(size, align); 1943 size = ALIGN(size, align);
1871 1944
1872 if ((flags & SLAB_RECLAIM_ACCOUNT) && size <= PAGE_SIZE) { 1945 left_over = calculate_slab_order(cachep, size, align, flags);
1873 /*
1874 * A VFS-reclaimable slab tends to have most allocations
1875 * as GFP_NOFS and we really don't want to have to be allocating
1876 * higher-order pages when we are unable to shrink dcache.
1877 */
1878 cachep->gfporder = 0;
1879 cache_estimate(cachep->gfporder, size, align, flags,
1880 &left_over, &cachep->num);
1881 } else
1882 left_over = calculate_slab_order(cachep, size, align, flags);
1883 1946
1884 if (!cachep->num) { 1947 if (!cachep->num) {
1885 printk("kmem_cache_create: couldn't create cache %s.\n", name); 1948 printk("kmem_cache_create: couldn't create cache %s.\n", name);
@@ -2554,7 +2617,7 @@ static void check_slabp(struct kmem_cache *cachep, struct slab *slabp)
2554 "slab: Internal list corruption detected in cache '%s'(%d), slabp %p(%d). Hexdump:\n", 2617 "slab: Internal list corruption detected in cache '%s'(%d), slabp %p(%d). Hexdump:\n",
2555 cachep->name, cachep->num, slabp, slabp->inuse); 2618 cachep->name, cachep->num, slabp, slabp->inuse);
2556 for (i = 0; 2619 for (i = 0;
2557 i < sizeof(slabp) + cachep->num * sizeof(kmem_bufctl_t); 2620 i < sizeof(*slabp) + cachep->num * sizeof(kmem_bufctl_t);
2558 i++) { 2621 i++) {
2559 if ((i % 16) == 0) 2622 if ((i % 16) == 0)
2560 printk("\n%03x:", i); 2623 printk("\n%03x:", i);
@@ -3494,8 +3557,7 @@ static void cache_reap(void *unused)
3494 check_irq_on(); 3557 check_irq_on();
3495 3558
3496 l3 = searchp->nodelists[numa_node_id()]; 3559 l3 = searchp->nodelists[numa_node_id()];
3497 if (l3->alien) 3560 reap_alien(searchp, l3);
3498 drain_alien_cache(searchp, l3->alien);
3499 spin_lock_irq(&l3->list_lock); 3561 spin_lock_irq(&l3->list_lock);
3500 3562
3501 drain_array_locked(searchp, cpu_cache_get(searchp), 0, 3563 drain_array_locked(searchp, cpu_cache_get(searchp), 0,
@@ -3545,7 +3607,7 @@ static void cache_reap(void *unused)
3545 } 3607 }
3546 check_irq_on(); 3608 check_irq_on();
3547 mutex_unlock(&cache_chain_mutex); 3609 mutex_unlock(&cache_chain_mutex);
3548 drain_remote_pages(); 3610 next_reap_node();
3549 /* Setup the next iteration */ 3611 /* Setup the next iteration */
3550 schedule_delayed_work(&__get_cpu_var(reap_work), REAPTIMEOUT_CPUC); 3612 schedule_delayed_work(&__get_cpu_var(reap_work), REAPTIMEOUT_CPUC);
3551} 3613}
diff --git a/mm/swap.c b/mm/swap.c
index cce3dda59c59..e9ec06d845e8 100644
--- a/mm/swap.c
+++ b/mm/swap.c
@@ -489,13 +489,34 @@ void percpu_counter_mod(struct percpu_counter *fbc, long amount)
489 if (count >= FBC_BATCH || count <= -FBC_BATCH) { 489 if (count >= FBC_BATCH || count <= -FBC_BATCH) {
490 spin_lock(&fbc->lock); 490 spin_lock(&fbc->lock);
491 fbc->count += count; 491 fbc->count += count;
492 *pcount = 0;
492 spin_unlock(&fbc->lock); 493 spin_unlock(&fbc->lock);
493 count = 0; 494 } else {
495 *pcount = count;
494 } 496 }
495 *pcount = count;
496 put_cpu(); 497 put_cpu();
497} 498}
498EXPORT_SYMBOL(percpu_counter_mod); 499EXPORT_SYMBOL(percpu_counter_mod);
500
501/*
502 * Add up all the per-cpu counts, return the result. This is a more accurate
503 * but much slower version of percpu_counter_read_positive()
504 */
505long percpu_counter_sum(struct percpu_counter *fbc)
506{
507 long ret;
508 int cpu;
509
510 spin_lock(&fbc->lock);
511 ret = fbc->count;
512 for_each_cpu(cpu) {
513 long *pcount = per_cpu_ptr(fbc->counters, cpu);
514 ret += *pcount;
515 }
516 spin_unlock(&fbc->lock);
517 return ret < 0 ? 0 : ret;
518}
519EXPORT_SYMBOL(percpu_counter_sum);
499#endif 520#endif
500 521
501/* 522/*
diff --git a/mm/vmscan.c b/mm/vmscan.c
index b0af7593d01e..7ccf763bb30b 100644
--- a/mm/vmscan.c
+++ b/mm/vmscan.c
@@ -1883,7 +1883,8 @@ int zone_reclaim(struct zone *zone, gfp_t gfp_mask, unsigned int order)
1883 1883
1884 if (!(gfp_mask & __GFP_WAIT) || 1884 if (!(gfp_mask & __GFP_WAIT) ||
1885 zone->all_unreclaimable || 1885 zone->all_unreclaimable ||
1886 atomic_read(&zone->reclaim_in_progress) > 0) 1886 atomic_read(&zone->reclaim_in_progress) > 0 ||
1887 (p->flags & PF_MEMALLOC))
1887 return 0; 1888 return 0;
1888 1889
1889 node_id = zone->zone_pgdat->node_id; 1890 node_id = zone->zone_pgdat->node_id;
diff --git a/net/atm/signaling.c b/net/atm/signaling.c
index 93ad59a28ef5..31d98b57e1de 100644
--- a/net/atm/signaling.c
+++ b/net/atm/signaling.c
@@ -39,25 +39,19 @@ static DECLARE_WAIT_QUEUE_HEAD(sigd_sleep);
39static void sigd_put_skb(struct sk_buff *skb) 39static void sigd_put_skb(struct sk_buff *skb)
40{ 40{
41#ifdef WAIT_FOR_DEMON 41#ifdef WAIT_FOR_DEMON
42 static unsigned long silence;
43 DECLARE_WAITQUEUE(wait,current); 42 DECLARE_WAITQUEUE(wait,current);
44 43
45 add_wait_queue(&sigd_sleep,&wait); 44 add_wait_queue(&sigd_sleep,&wait);
46 while (!sigd) { 45 while (!sigd) {
47 set_current_state(TASK_UNINTERRUPTIBLE); 46 set_current_state(TASK_UNINTERRUPTIBLE);
48 if (time_after(jiffies, silence) || silence == 0) { 47 DPRINTK("atmsvc: waiting for signaling demon...\n");
49 printk(KERN_INFO "atmsvc: waiting for signaling demon "
50 "...\n");
51 silence = (jiffies+30*HZ)|1;
52 }
53 schedule(); 48 schedule();
54 } 49 }
55 current->state = TASK_RUNNING; 50 current->state = TASK_RUNNING;
56 remove_wait_queue(&sigd_sleep,&wait); 51 remove_wait_queue(&sigd_sleep,&wait);
57#else 52#else
58 if (!sigd) { 53 if (!sigd) {
59 if (net_ratelimit()) 54 DPRINTK("atmsvc: no signaling demon\n");
60 printk(KERN_WARNING "atmsvc: no signaling demon\n");
61 kfree_skb(skb); 55 kfree_skb(skb);
62 return; 56 return;
63 } 57 }
diff --git a/net/bridge/br_if.c b/net/bridge/br_if.c
index 7fa3a5a9971f..f36b35edd60c 100644
--- a/net/bridge/br_if.c
+++ b/net/bridge/br_if.c
@@ -81,26 +81,27 @@ static void port_carrier_check(void *arg)
81{ 81{
82 struct net_device *dev = arg; 82 struct net_device *dev = arg;
83 struct net_bridge_port *p; 83 struct net_bridge_port *p;
84 struct net_bridge *br;
84 85
85 rtnl_lock(); 86 rtnl_lock();
86 p = dev->br_port; 87 p = dev->br_port;
87 if (!p) 88 if (!p)
88 goto done; 89 goto done;
89 90 br = p->br;
90 if (netif_carrier_ok(p->dev)) { 91
91 u32 cost = port_cost(p->dev); 92 if (netif_carrier_ok(dev))
92 93 p->path_cost = port_cost(dev);
93 spin_lock_bh(&p->br->lock); 94
94 if (p->state == BR_STATE_DISABLED) { 95 if (br->dev->flags & IFF_UP) {
95 p->path_cost = cost; 96 spin_lock_bh(&br->lock);
96 br_stp_enable_port(p); 97 if (netif_carrier_ok(dev)) {
98 if (p->state == BR_STATE_DISABLED)
99 br_stp_enable_port(p);
100 } else {
101 if (p->state != BR_STATE_DISABLED)
102 br_stp_disable_port(p);
97 } 103 }
98 spin_unlock_bh(&p->br->lock); 104 spin_unlock_bh(&br->lock);
99 } else {
100 spin_lock_bh(&p->br->lock);
101 if (p->state != BR_STATE_DISABLED)
102 br_stp_disable_port(p);
103 spin_unlock_bh(&p->br->lock);
104 } 105 }
105done: 106done:
106 rtnl_unlock(); 107 rtnl_unlock();
@@ -168,6 +169,7 @@ static void del_nbp(struct net_bridge_port *p)
168 169
169 rcu_assign_pointer(dev->br_port, NULL); 170 rcu_assign_pointer(dev->br_port, NULL);
170 171
172 kobject_uevent(&p->kobj, KOBJ_REMOVE);
171 kobject_del(&p->kobj); 173 kobject_del(&p->kobj);
172 174
173 call_rcu(&p->rcu, destroy_nbp_rcu); 175 call_rcu(&p->rcu, destroy_nbp_rcu);
@@ -276,8 +278,9 @@ static struct net_bridge_port *new_nbp(struct net_bridge *br,
276 br_init_port(p); 278 br_init_port(p);
277 p->state = BR_STATE_DISABLED; 279 p->state = BR_STATE_DISABLED;
278 INIT_WORK(&p->carrier_check, port_carrier_check, dev); 280 INIT_WORK(&p->carrier_check, port_carrier_check, dev);
279 kobject_init(&p->kobj); 281 br_stp_port_timer_init(p);
280 282
283 kobject_init(&p->kobj);
281 kobject_set_name(&p->kobj, SYSFS_BRIDGE_PORT_ATTR); 284 kobject_set_name(&p->kobj, SYSFS_BRIDGE_PORT_ATTR);
282 p->kobj.ktype = &brport_ktype; 285 p->kobj.ktype = &brport_ktype;
283 p->kobj.parent = &(dev->class_dev.kobj); 286 p->kobj.parent = &(dev->class_dev.kobj);
diff --git a/net/bridge/br_stp_if.c b/net/bridge/br_stp_if.c
index 35cf3a074087..23dea1422c9a 100644
--- a/net/bridge/br_stp_if.c
+++ b/net/bridge/br_stp_if.c
@@ -39,8 +39,6 @@ void br_init_port(struct net_bridge_port *p)
39 p->state = BR_STATE_BLOCKING; 39 p->state = BR_STATE_BLOCKING;
40 p->topology_change_ack = 0; 40 p->topology_change_ack = 0;
41 p->config_pending = 0; 41 p->config_pending = 0;
42
43 br_stp_port_timer_init(p);
44} 42}
45 43
46/* called under bridge lock */ 44/* called under bridge lock */
diff --git a/net/dccp/ccids/ccid3.c b/net/dccp/ccids/ccid3.c
index aa68e0ab274d..35d1d347541c 100644
--- a/net/dccp/ccids/ccid3.c
+++ b/net/dccp/ccids/ccid3.c
@@ -2,7 +2,7 @@
2 * net/dccp/ccids/ccid3.c 2 * net/dccp/ccids/ccid3.c
3 * 3 *
4 * Copyright (c) 2005 The University of Waikato, Hamilton, New Zealand. 4 * Copyright (c) 2005 The University of Waikato, Hamilton, New Zealand.
5 * Copyright (c) 2005 Ian McDonald <iam4@cs.waikato.ac.nz> 5 * Copyright (c) 2005-6 Ian McDonald <imcdnzl@gmail.com>
6 * 6 *
7 * An implementation of the DCCP protocol 7 * An implementation of the DCCP protocol
8 * 8 *
@@ -1033,9 +1033,13 @@ static void ccid3_hc_rx_packet_recv(struct sock *sk, struct sk_buff *skb)
1033 p_prev = hcrx->ccid3hcrx_p; 1033 p_prev = hcrx->ccid3hcrx_p;
1034 1034
1035 /* Calculate loss event rate */ 1035 /* Calculate loss event rate */
1036 if (!list_empty(&hcrx->ccid3hcrx_li_hist)) 1036 if (!list_empty(&hcrx->ccid3hcrx_li_hist)) {
1037 u32 i_mean = dccp_li_hist_calc_i_mean(&hcrx->ccid3hcrx_li_hist);
1038
1037 /* Scaling up by 1000000 as fixed decimal */ 1039 /* Scaling up by 1000000 as fixed decimal */
1038 hcrx->ccid3hcrx_p = 1000000 / dccp_li_hist_calc_i_mean(&hcrx->ccid3hcrx_li_hist); 1040 if (i_mean != 0)
1041 hcrx->ccid3hcrx_p = 1000000 / i_mean;
1042 }
1039 1043
1040 if (hcrx->ccid3hcrx_p > p_prev) { 1044 if (hcrx->ccid3hcrx_p > p_prev) {
1041 ccid3_hc_rx_send_feedback(sk); 1045 ccid3_hc_rx_send_feedback(sk);
diff --git a/net/ipv4/netfilter/ip_queue.c b/net/ipv4/netfilter/ip_queue.c
index 36339eb39e17..08f80e2ea2aa 100644
--- a/net/ipv4/netfilter/ip_queue.c
+++ b/net/ipv4/netfilter/ip_queue.c
@@ -524,7 +524,7 @@ ipq_rcv_skb(struct sk_buff *skb)
524 write_unlock_bh(&queue_lock); 524 write_unlock_bh(&queue_lock);
525 525
526 status = ipq_receive_peer(NLMSG_DATA(nlh), type, 526 status = ipq_receive_peer(NLMSG_DATA(nlh), type,
527 skblen - NLMSG_LENGTH(0)); 527 nlmsglen - NLMSG_LENGTH(0));
528 if (status < 0) 528 if (status < 0)
529 RCV_SKB_FAIL(status); 529 RCV_SKB_FAIL(status);
530 530
diff --git a/net/ipv6/netfilter/ip6_queue.c b/net/ipv6/netfilter/ip6_queue.c
index 5027bbe6415e..af0635084df8 100644
--- a/net/ipv6/netfilter/ip6_queue.c
+++ b/net/ipv6/netfilter/ip6_queue.c
@@ -522,7 +522,7 @@ ipq_rcv_skb(struct sk_buff *skb)
522 write_unlock_bh(&queue_lock); 522 write_unlock_bh(&queue_lock);
523 523
524 status = ipq_receive_peer(NLMSG_DATA(nlh), type, 524 status = ipq_receive_peer(NLMSG_DATA(nlh), type,
525 skblen - NLMSG_LENGTH(0)); 525 nlmsglen - NLMSG_LENGTH(0));
526 if (status < 0) 526 if (status < 0)
527 RCV_SKB_FAIL(status); 527 RCV_SKB_FAIL(status);
528 528
diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c
index 1b5989b1b670..c323cc6a28b0 100644
--- a/net/unix/af_unix.c
+++ b/net/unix/af_unix.c
@@ -547,7 +547,7 @@ static struct sock * unix_create1(struct socket *sock)
547 struct sock *sk = NULL; 547 struct sock *sk = NULL;
548 struct unix_sock *u; 548 struct unix_sock *u;
549 549
550 if (atomic_read(&unix_nr_socks) >= 2*files_stat.max_files) 550 if (atomic_read(&unix_nr_socks) >= 2*get_max_files())
551 goto out; 551 goto out;
552 552
553 sk = sk_alloc(PF_UNIX, GFP_KERNEL, &unix_proto, 1); 553 sk = sk_alloc(PF_UNIX, GFP_KERNEL, &unix_proto, 1);
diff --git a/scripts/mod/file2alias.c b/scripts/mod/file2alias.c
index be97caf664bb..c164b230ad6f 100644
--- a/scripts/mod/file2alias.c
+++ b/scripts/mod/file2alias.c
@@ -246,7 +246,7 @@ static int do_ccw_entry(const char *filename,
246 id->cu_model); 246 id->cu_model);
247 ADD(alias, "dt", id->match_flags&CCW_DEVICE_ID_MATCH_DEVICE_TYPE, 247 ADD(alias, "dt", id->match_flags&CCW_DEVICE_ID_MATCH_DEVICE_TYPE,
248 id->dev_type); 248 id->dev_type);
249 ADD(alias, "dm", id->match_flags&CCW_DEVICE_ID_MATCH_DEVICE_TYPE, 249 ADD(alias, "dm", id->match_flags&CCW_DEVICE_ID_MATCH_DEVICE_MODEL,
250 id->dev_model); 250 id->dev_model);
251 return 1; 251 return 1;
252} 252}
diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c
index b7773bf68efa..b65c201e9ff5 100644
--- a/security/selinux/hooks.c
+++ b/security/selinux/hooks.c
@@ -1262,7 +1262,7 @@ static int selinux_ptrace(struct task_struct *parent, struct task_struct *child)
1262 1262
1263 rc = task_has_perm(parent, child, PROCESS__PTRACE); 1263 rc = task_has_perm(parent, child, PROCESS__PTRACE);
1264 /* Save the SID of the tracing process for later use in apply_creds. */ 1264 /* Save the SID of the tracing process for later use in apply_creds. */
1265 if (!rc) 1265 if (!(child->ptrace & PT_PTRACED) && !rc)
1266 csec->ptrace_sid = psec->sid; 1266 csec->ptrace_sid = psec->sid;
1267 return rc; 1267 return rc;
1268} 1268}
diff --git a/sound/core/control.c b/sound/core/control.c
index abd62f943726..0c29679a8576 100644
--- a/sound/core/control.c
+++ b/sound/core/control.c
@@ -959,17 +959,15 @@ static int snd_ctl_elem_add(struct snd_ctl_file *file,
959 kctl.private_free = snd_ctl_elem_user_free; 959 kctl.private_free = snd_ctl_elem_user_free;
960 _kctl = snd_ctl_new(&kctl, access); 960 _kctl = snd_ctl_new(&kctl, access);
961 if (_kctl == NULL) { 961 if (_kctl == NULL) {
962 kfree(_kctl->private_data); 962 kfree(ue);
963 return -ENOMEM; 963 return -ENOMEM;
964 } 964 }
965 _kctl->private_data = ue; 965 _kctl->private_data = ue;
966 for (idx = 0; idx < _kctl->count; idx++) 966 for (idx = 0; idx < _kctl->count; idx++)
967 _kctl->vd[idx].owner = file; 967 _kctl->vd[idx].owner = file;
968 err = snd_ctl_add(card, _kctl); 968 err = snd_ctl_add(card, _kctl);
969 if (err < 0) { 969 if (err < 0)
970 snd_ctl_free_one(_kctl);
971 return err; 970 return err;
972 }
973 971
974 down_write(&card->controls_rwsem); 972 down_write(&card->controls_rwsem);
975 card->user_ctl_count++; 973 card->user_ctl_count++;