Browse Source

Merge branch 'master' into gfs2

Steven Whitehouse 18 năm trước cách đây
mục cha
commit
0bc0748dfb
100 tập tin đã thay đổi với 1041 bổ sung535 xóa
  1. 1 1
      Makefile
  2. 1 0
      arch/arm/mach-ixp4xx/nslu2-pci.c
  3. 1 0
      arch/arm/mach-ixp4xx/nslu2-power.c
  4. 1 0
      arch/arm/mach-s3c2410/Makefile
  5. 0 10
      arch/arm/mach-s3c2410/cpu.h
  6. 2 10
      arch/arm/mach-s3c2410/devs.c
  7. 2 2
      arch/arm/mach-s3c2410/irq.c
  8. 5 0
      arch/arm/mach-s3c2410/irq.h
  9. 0 25
      arch/arm/mach-s3c2410/mach-bast.c
  10. 0 17
      arch/arm/mach-s3c2410/mach-h1940.c
  11. 0 9
      arch/arm/mach-s3c2410/mach-rx3715.c
  12. 0 4
      arch/arm/mach-s3c2410/mach-smdk2410.c
  13. 14 1
      arch/arm/mach-s3c2410/mach-smdk2413.c
  14. 0 19
      arch/arm/mach-s3c2410/mach-vr1000.c
  15. 1 4
      arch/arm/mach-s3c2410/s3c2400-gpio.c
  16. 0 8
      arch/arm/mach-s3c2410/s3c2410.h
  17. 130 0
      arch/arm/mach-s3c2410/s3c2412-irq.c
  18. 0 3
      arch/arm/mach-s3c2410/s3c2440-irq.c
  19. 6 6
      arch/arm/mach-s3c2410/s3c244x-irq.c
  20. 1 1
      arch/arm/mm/proc-arm926.S
  21. 4 0
      arch/frv/Kconfig
  22. 0 81
      arch/frv/kernel/time.c
  23. 0 1
      arch/i386/kernel/Makefile
  24. 0 23
      arch/i386/kernel/audit.c
  25. 4 0
      arch/ia64/Kconfig
  26. 26 0
      arch/ia64/ia32/audit.c
  27. 35 0
      arch/ia64/kernel/audit.c
  28. 2 2
      arch/ia64/kernel/entry.S
  29. 5 0
      arch/ia64/kernel/head.S
  30. 3 1
      arch/ia64/kernel/perfmon.c
  31. 16 12
      arch/ia64/kernel/sys_ia64.c
  32. 1 1
      arch/ia64/sn/kernel/setup.c
  33. 4 0
      arch/powerpc/Kconfig
  34. 2 0
      arch/powerpc/kernel/Makefile
  35. 66 0
      arch/powerpc/kernel/audit.c
  36. 38 0
      arch/powerpc/kernel/compat_audit.c
  37. 4 0
      arch/s390/Kconfig
  38. 3 1
      arch/s390/kernel/Makefile
  39. 66 0
      arch/s390/kernel/audit.c
  40. 38 0
      arch/s390/kernel/compat_audit.c
  41. 0 1
      arch/sh64/Makefile
  42. 3 0
      arch/sh64/kernel/process.c
  43. 4 2
      arch/sh64/mach-cayman/setup.c
  44. 3 1
      arch/sh64/mm/ioremap.c
  45. 15 12
      arch/sparc/kernel/sys_sparc.c
  46. 4 0
      arch/sparc64/Kconfig
  47. 3 0
      arch/sparc64/kernel/Makefile
  48. 66 0
      arch/sparc64/kernel/audit.c
  49. 37 0
      arch/sparc64/kernel/compat_audit.c
  50. 20 16
      arch/sparc64/kernel/sys_sparc.c
  51. 4 0
      arch/x86_64/Kconfig
  52. 26 0
      arch/x86_64/ia32/audit.c
  53. 35 0
      arch/x86_64/kernel/audit.c
  54. 2 0
      drivers/ide/ide-proc.c
  55. 6 6
      drivers/ide/pci/aec62xx.c
  56. 5 5
      drivers/ide/pci/serverworks.c
  57. 3 3
      drivers/ide/pci/siimage.c
  58. 2 0
      drivers/ide/pci/sis5513.c
  59. 1 1
      drivers/media/Kconfig
  60. 2 0
      drivers/media/common/saa7146_video.c
  61. 1 0
      drivers/media/dvb/b2c2/Kconfig
  62. 1 0
      drivers/media/dvb/bt8xx/Kconfig
  63. 1 0
      drivers/media/dvb/dvb-usb/Kconfig
  64. 32 28
      drivers/media/dvb/frontends/Kconfig
  65. 1 1
      drivers/media/dvb/frontends/Makefile
  66. 1 0
      drivers/media/dvb/pluto2/Kconfig
  67. 5 0
      drivers/media/dvb/ttpci/Kconfig
  68. 2 1
      drivers/media/dvb/ttusb-budget/Kconfig
  69. 4 4
      drivers/media/video/Kconfig
  70. 1 0
      drivers/media/video/bt8xx/bttv-input.c
  71. 1 0
      drivers/media/video/cx88/Kconfig
  72. 1 0
      drivers/media/video/saa7134/Kconfig
  73. 8 2
      drivers/media/video/tuner-types.c
  74. 1 1
      drivers/media/video/zoran.h
  75. 11 11
      drivers/media/video/zoran_driver.c
  76. 35 34
      drivers/mmc/imxmmc.c
  77. 51 4
      drivers/mmc/mmc.c
  78. 7 53
      drivers/mmc/mmc_block.c
  79. 1 1
      drivers/net/Kconfig
  80. 2 2
      drivers/net/dm9000.c
  81. 34 2
      drivers/scsi/ata_piix.c
  82. 1 2
      drivers/scsi/sata_mv.c
  83. 1 0
      drivers/scsi/sata_via.c
  84. 2 2
      drivers/serial/sh-sci.c
  85. 2 2
      drivers/usb/input/hid-core.c
  86. 1 1
      drivers/usb/input/usbtouchscreen.c
  87. 6 6
      drivers/usb/input/yealink.c
  88. 2 0
      drivers/usb/misc/sisusbvga/sisusb.c
  89. 1 0
      drivers/usb/serial/ftdi_sio.c
  90. 5 0
      drivers/usb/serial/ftdi_sio.h
  91. 3 1
      drivers/usb/serial/usb-serial.c
  92. 7 4
      fs/cifs/readdir.c
  93. 7 4
      fs/ext3/inode.c
  94. 14 36
      fs/nfs/direct.c
  95. 13 11
      fs/nfs/read.c
  96. 15 22
      fs/nfs/write.c
  97. 1 0
      fs/super.c
  98. 13 5
      fs/xfs/linux-2.6/xfs_aops.c
  99. 22 5
      fs/xfs/linux-2.6/xfs_lrw.c
  100. 1 1
      fs/xfs/quota/xfs_qm_bhv.c

+ 1 - 1
Makefile

@@ -1,7 +1,7 @@
 VERSION = 2
 VERSION = 2
 PATCHLEVEL = 6
 PATCHLEVEL = 6
 SUBLEVEL = 18
 SUBLEVEL = 18
-EXTRAVERSION = -rc6
+EXTRAVERSION = -rc7
 NAME=Crazed Snow-Weasel
 NAME=Crazed Snow-Weasel
 
 
 # *DOCUMENTATION*
 # *DOCUMENTATION*

+ 1 - 0
arch/arm/mach-ixp4xx/nslu2-pci.c

@@ -17,6 +17,7 @@
 
 
 #include <linux/pci.h>
 #include <linux/pci.h>
 #include <linux/init.h>
 #include <linux/init.h>
+#include <linux/irq.h>
 
 
 #include <asm/mach/pci.h>
 #include <asm/mach/pci.h>
 #include <asm/mach-types.h>
 #include <asm/mach-types.h>

+ 1 - 0
arch/arm/mach-ixp4xx/nslu2-power.c

@@ -19,6 +19,7 @@
 
 
 #include <linux/module.h>
 #include <linux/module.h>
 #include <linux/reboot.h>
 #include <linux/reboot.h>
+#include <linux/irq.h>
 #include <linux/interrupt.h>
 #include <linux/interrupt.h>
 #include <linux/reboot.h>
 #include <linux/reboot.h>
 
 

+ 1 - 0
arch/arm/mach-s3c2410/Makefile

@@ -28,6 +28,7 @@ obj-$(CONFIG_PM_SIMTEC)		+= pm-simtec.o
 
 
 # S3C2412 support
 # S3C2412 support
 obj-$(CONFIG_CPU_S3C2412)	+= s3c2412.o
 obj-$(CONFIG_CPU_S3C2412)	+= s3c2412.o
+obj-$(CONFIG_CPU_S3C2412)	+= s3c2412-irq.o
 obj-$(CONFIG_CPU_S3C2412)	+= s3c2412-clock.o
 obj-$(CONFIG_CPU_S3C2412)	+= s3c2412-clock.o
 
 
 #
 #

+ 0 - 10
arch/arm/mach-s3c2410/cpu.h

@@ -8,16 +8,6 @@
  * This program is free software; you can redistribute it and/or modify
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 as
  * it under the terms of the GNU General Public License version 2 as
  * published by the Free Software Foundation.
  * published by the Free Software Foundation.
- *
- * Modifications:
- *     24-Aug-2004 BJD  Start of generic S3C24XX support
- *     18-Oct-2004 BJD  Moved board struct into this file
- *     04-Jan-2005 BJD  New uart initialisation
- *     10-Jan-2005 BJD  Moved generic init here, specific to cpu headers
- *     14-Jan-2005 BJD  Added s3c24xx_init_clocks() call
- *     10-Mar-2005 LCVR Changed S3C2410_{VA,SZ} to S3C24XX_{VA,SZ} & IODESC_ENT
- *     14-Mar-2005 BJD  Updated for __iomem
- *     15-Jan-2006 LCVR Updated S3C2410_PA_##x to new S3C24XX_PA_##x macro
 */
 */
 
 
 /* todo - fix when rmk changes iodescs to use `void __iomem *` */
 /* todo - fix when rmk changes iodescs to use `void __iomem *` */

+ 2 - 10
arch/arm/mach-s3c2410/devs.c

@@ -1,22 +1,14 @@
 /* linux/arch/arm/mach-s3c2410/devs.c
 /* linux/arch/arm/mach-s3c2410/devs.c
  *
  *
  * Copyright (c) 2004 Simtec Electronics
  * Copyright (c) 2004 Simtec Electronics
- * Ben Dooks <ben@simtec.co.uk>
+ *	Ben Dooks <ben@simtec.co.uk>
  *
  *
- * Base S3C2410 platform device definitions
+ * Base S3C24XX platform device definitions
  *
  *
  * This program is free software; you can redistribute it and/or modify
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 as
  * it under the terms of the GNU General Public License version 2 as
  * published by the Free Software Foundation.
  * published by the Free Software Foundation.
  *
  *
- * Modifications:
- *     15-Jan-2006 LCVR Using S3C24XX_PA_##x macro for common S3C24XX devices
- *     10-Mar-2005 LCVR Changed S3C2410_{VA,SZ} to S3C24XX_{VA,SZ}
- *     10-Feb-2005 BJD  Added camera from guillaume.gourat@nexvision.tv
- *     29-Aug-2004 BJD  Added timers 0 through 3
- *     29-Aug-2004 BJD  Changed index of devices we only have one of to -1
- *     21-Aug-2004 BJD  Added IRQ_TICK to RTC resources
- *     18-Aug-2004 BJD  Created initial version
 */
 */
 
 
 #include <linux/kernel.h>
 #include <linux/kernel.h>

+ 2 - 2
arch/arm/mach-s3c2410/irq.c

@@ -86,7 +86,7 @@ unsigned long s3c_irqwake_intmask	= 0xffffffffL;
 unsigned long s3c_irqwake_eintallow	= 0x0000fff0L;
 unsigned long s3c_irqwake_eintallow	= 0x0000fff0L;
 unsigned long s3c_irqwake_eintmask	= 0xffffffffL;
 unsigned long s3c_irqwake_eintmask	= 0xffffffffL;
 
 
-static int
+int
 s3c_irq_wake(unsigned int irqno, unsigned int state)
 s3c_irq_wake(unsigned int irqno, unsigned int state)
 {
 {
 	unsigned long irqbit = 1 << (irqno - IRQ_EINT0);
 	unsigned long irqbit = 1 << (irqno - IRQ_EINT0);
@@ -260,7 +260,7 @@ s3c_irqext_unmask(unsigned int irqno)
 	s3c_irq_unmask((irqno <= (IRQ_EINT7 - EXTINT_OFF)) ? IRQ_EINT4t7 : IRQ_EINT8t23);
 	s3c_irq_unmask((irqno <= (IRQ_EINT7 - EXTINT_OFF)) ? IRQ_EINT4t7 : IRQ_EINT8t23);
 }
 }
 
 
-static int
+int
 s3c_irqext_type(unsigned int irq, unsigned int type)
 s3c_irqext_type(unsigned int irq, unsigned int type)
 {
 {
 	void __iomem *extint_reg;
 	void __iomem *extint_reg;

+ 5 - 0
arch/arm/mach-s3c2410/irq.h

@@ -97,3 +97,8 @@ s3c_irqsub_ack(unsigned int irqno, unsigned int parentmask, unsigned int group)
 		__raw_writel(parentmask, S3C2410_INTPND);
 		__raw_writel(parentmask, S3C2410_INTPND);
 	}
 	}
 }
 }
+
+/* exported for use in arch/arm/mach-s3c2410 */
+
+extern int s3c_irq_wake(unsigned int irqno, unsigned int state);
+extern int s3c_irqext_type(unsigned int irq, unsigned int type);

+ 0 - 25
arch/arm/mach-s3c2410/mach-bast.c

@@ -8,31 +8,6 @@
  * This program is free software; you can redistribute it and/or modify
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 as
  * it under the terms of the GNU General Public License version 2 as
  * published by the Free Software Foundation.
  * published by the Free Software Foundation.
- *
- * Modifications:
- *     14-Sep-2004 BJD  USB power control
- *     20-Aug-2004 BJD  Added s3c2410_board struct
- *     18-Aug-2004 BJD  Added platform devices from default set
- *     16-May-2003 BJD  Created initial version
- *     16-Aug-2003 BJD  Fixed header files and copyright, added URL
- *     05-Sep-2003 BJD  Moved to v2.6 kernel
- *     06-Jan-2003 BJD  Updates for <arch/map.h>
- *     18-Jan-2003 BJD  Added serial port configuration
- *     05-Oct-2004 BJD  Power management code
- *     04-Nov-2004 BJD  Updated serial port clocks
- *     04-Jan-2005 BJD  New uart init call
- *     10-Jan-2005 BJD  Removed include of s3c2410.h
- *     14-Jan-2005 BJD  Add support for muitlple NAND devices
- *     03-Mar-2005 BJD  Ensured that bast-cpld.h is included
- *     10-Mar-2005 LCVR Changed S3C2410_VA to S3C24XX_VA
- *     14-Mar-2005 BJD  Updated for __iomem changes
- *     22-Jun-2005 BJD  Added DM9000 platform information
- *     28-Jun-2005 BJD  Moved pm functionality out to common code
- *     17-Jul-2005 BJD  Changed to platform device for SuperIO 16550s
- *     25-Jul-2005 BJD  Removed ASIX static mappings
- *     27-Jul-2005 BJD  Ensure maximum frequency of i2c bus
- *     20-Sep-2005 BJD  Added static to non-exported items
- *     26-Oct-2005 BJD  Added FB platform data
 */
 */
 
 
 #include <linux/kernel.h>
 #include <linux/kernel.h>

+ 0 - 17
arch/arm/mach-s3c2410/mach-h1940.c

@@ -9,23 +9,6 @@
  * it under the terms of the GNU General Public License version 2 as
  * it under the terms of the GNU General Public License version 2 as
  * published by the Free Software Foundation.
  * published by the Free Software Foundation.
  *
  *
- * Modifications:
- *     16-May-2003 BJD  Created initial version
- *     16-Aug-2003 BJD  Fixed header files and copyright, added URL
- *     05-Sep-2003 BJD  Moved to v2.6 kernel
- *     06-Jan-2003 BJD  Updates for <arch/map.h>
- *     18-Jan-2003 BJD  Added serial port configuration
- *     17-Feb-2003 BJD  Copied to mach-ipaq.c
- *     21-Aug-2004 BJD  Added struct s3c2410_board
- *     04-Sep-2004 BJD  Changed uart init, renamed ipaq_ -> h1940_
- *     18-Oct-2004 BJD  Updated new board structure name
- *     04-Nov-2004 BJD  Change for new serial clock
- *     04-Jan-2005 BJD  Updated uart init call
- *     10-Jan-2005 BJD  Removed include of s3c2410.h
- *     14-Jan-2005 BJD  Added clock init
- *     10-Mar-2005 LCVR Changed S3C2410_VA to S3C24XX_VA
- *     20-Sep-2005 BJD  Added static to non-exported items
- *     26-Oct-2005 BJD  Changed name of fb init call
 */
 */
 
 
 #include <linux/kernel.h>
 #include <linux/kernel.h>

+ 0 - 9
arch/arm/mach-s3c2410/mach-rx3715.c

@@ -9,15 +9,6 @@
  * it under the terms of the GNU General Public License version 2 as
  * it under the terms of the GNU General Public License version 2 as
  * published by the Free Software Foundation.
  * published by the Free Software Foundation.
  *
  *
- * Modifications:
- *	16-Sep-2004 BJD  Copied from mach-h1940.c
- *	25-Oct-2004 BJD  Updates for 2.6.10-rc1
- *	10-Jan-2005 BJD  Removed include of s3c2410.h s3c2440.h
- *	14-Jan-2005 BJD  Added new clock init
- *	10-Mar-2005 LCVR Changed S3C2410_VA to S3C24XX_VA
- *	14-Mar-2005 BJD  Fixed __iomem warnings
- *	20-Sep-2005 BJD  Added static to non-exported items
- *	31-Oct-2005 BJD  Added LCD setup for framebuffer
 */
 */
 
 
 #include <linux/kernel.h>
 #include <linux/kernel.h>

+ 0 - 4
arch/arm/mach-s3c2410/mach-smdk2410.c

@@ -27,10 +27,6 @@
  * derived from linux/arch/arm/mach-s3c2410/mach-bast.c, written by
  * derived from linux/arch/arm/mach-s3c2410/mach-bast.c, written by
  * Ben Dooks <ben@simtec.co.uk>
  * Ben Dooks <ben@simtec.co.uk>
  *
  *
- * 10-Mar-2005 LCVR  Changed S3C2410_VA to S3C24XX_VA
- * 20-Sep-2005 BJD   Added static to non-exported items
- * 01-Apr-2006 BJD   Moved init code to common smdk
- *
  ***********************************************************************/
  ***********************************************************************/
 
 
 #include <linux/kernel.h>
 #include <linux/kernel.h>

+ 14 - 1
arch/arm/mach-s3c2410/mach-smdk2413.c

@@ -112,7 +112,20 @@ static void __init smdk2413_machine_init(void)
 	smdk_machine_init();
 	smdk_machine_init();
 }
 }
 
 
-MACHINE_START(S3C2413, "SMDK2413")
+MACHINE_START(S3C2413, "S3C2413")
+	/* Maintainer: Ben Dooks <ben@fluff.org> */
+	.phys_io	= S3C2410_PA_UART,
+	.io_pg_offst	= (((u32)S3C24XX_VA_UART) >> 18) & 0xfffc,
+	.boot_params	= S3C2410_SDRAM_PA + 0x100,
+
+	.fixup		= smdk2413_fixup,
+	.init_irq	= s3c24xx_init_irq,
+	.map_io		= smdk2413_map_io,
+	.init_machine	= smdk2413_machine_init,
+	.timer		= &s3c24xx_timer,
+MACHINE_END
+
+MACHINE_START(SMDK2413, "SMDK2413")
 	/* Maintainer: Ben Dooks <ben@fluff.org> */
 	/* Maintainer: Ben Dooks <ben@fluff.org> */
 	.phys_io	= S3C2410_PA_UART,
 	.phys_io	= S3C2410_PA_UART,
 	.io_pg_offst	= (((u32)S3C24XX_VA_UART) >> 18) & 0xfffc,
 	.io_pg_offst	= (((u32)S3C24XX_VA_UART) >> 18) & 0xfffc,

+ 0 - 19
arch/arm/mach-s3c2410/mach-vr1000.c

@@ -10,25 +10,6 @@
  * it under the terms of the GNU General Public License version 2 as
  * it under the terms of the GNU General Public License version 2 as
  * published by the Free Software Foundation.
  * published by the Free Software Foundation.
  *
  *
- * Modifications:
- *     14-Sep-2004 BJD  USB Power control
- *     04-Sep-2004 BJD  Added new uart init, and io init
- *     21-Aug-2004 BJD  Added struct s3c2410_board
- *     06-Aug-2004 BJD  Fixed call to time initialisation
- *     05-Apr-2004 BJD  Copied to make mach-vr1000.c
- *     18-Oct-2004 BJD  Updated board struct
- *     04-Nov-2004 BJD  Clock and serial configuration update
- *
- *     04-Jan-2005 BJD  Updated uart init call
- *     10-Jan-2005 BJD  Removed include of s3c2410.h
- *     14-Jan-2005 BJD  Added clock init
- *     15-Jan-2005 BJD  Add serial port device definition
- *     20-Jan-2005 BJD  Use UPF_IOREMAP for ports
- *     10-Feb-2005 BJD  Added power-off capability
- *     10-Mar-2005 LCVR Changed S3C2410_VA to S3C24XX_VA
- *     14-Mar-2006 BJD  void __iomem fixes
- *     22-Jun-2006 BJD  Added DM9000 platform information
- *     20-Sep-2005 BJD  Added static to non-exported items
 */
 */
 
 
 #include <linux/kernel.h>
 #include <linux/kernel.h>

+ 1 - 4
arch/arm/mach-s3c2410/s3c2400-gpio.c

@@ -17,10 +17,7 @@
  * You should have received a copy of the GNU General Public License
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Changelog
- *	15-Jan-2006  LCVR  Splitted from gpio.c, adding support for the S3C2400
- */
+*/
 
 
 #include <linux/kernel.h>
 #include <linux/kernel.h>
 #include <linux/init.h>
 #include <linux/init.h>

+ 0 - 8
arch/arm/mach-s3c2410/s3c2410.h

@@ -9,14 +9,6 @@
  * it under the terms of the GNU General Public License version 2 as
  * it under the terms of the GNU General Public License version 2 as
  * published by the Free Software Foundation.
  * published by the Free Software Foundation.
  *
  *
- * Modifications:
- *     18-Aug-2004 BJD  Created initial version
- *     20-Aug-2004 BJD  Added s3c2410_board struct
- *     04-Sep-2004 BJD  Added s3c2410_init_uarts() call
- *     17-Oct-2004 BJD  Moved board out to cpu
- *     04-Jan-2005 BJD  Changed uart init
- *     10-Jan-2005 BJD  Removed timer to cpu.h, moved 2410 specific bits here
- *     14-Jan-2005 BJD  Added s3c2410_init_clocks call
 */
 */
 
 
 #ifdef CONFIG_CPU_S3C2410
 #ifdef CONFIG_CPU_S3C2410

+ 130 - 0
arch/arm/mach-s3c2410/s3c2412-irq.c

@@ -0,0 +1,130 @@
+/* linux/arch/arm/mach-s3c2412/s3c2412-irq.c
+ *
+ * Copyright (c) 2006 Simtec Electronics
+ *	Ben Dooks <ben@simtec.co.uk>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+*/
+
+#include <linux/init.h>
+#include <linux/module.h>
+#include <linux/interrupt.h>
+#include <linux/ioport.h>
+#include <linux/ptrace.h>
+#include <linux/sysdev.h>
+
+#include <asm/hardware.h>
+#include <asm/irq.h>
+#include <asm/io.h>
+
+#include <asm/mach/irq.h>
+
+#include <asm/arch/regs-irq.h>
+#include <asm/arch/regs-gpio.h>
+
+#include "cpu.h"
+#include "irq.h"
+
+/* the s3c2412 changes the behaviour of IRQ_EINT0 through IRQ_EINT3 by
+ * having them turn up in both the INT* and the EINT* registers. Whilst
+ * both show the status, they both now need to be acked when the IRQs
+ * go off.
+*/
+
+static void
+s3c2412_irq_mask(unsigned int irqno)
+{
+	unsigned long bitval = 1UL << (irqno - IRQ_EINT0);
+	unsigned long mask;
+
+	mask = __raw_readl(S3C2410_INTMSK);
+	__raw_writel(mask | bitval, S3C2410_INTMSK);
+
+	mask = __raw_readl(S3C2412_EINTMASK);
+	__raw_writel(mask | bitval, S3C2412_EINTMASK);
+}
+
+static inline void
+s3c2412_irq_ack(unsigned int irqno)
+{
+	unsigned long bitval = 1UL << (irqno - IRQ_EINT0);
+
+	__raw_writel(bitval, S3C2412_EINTPEND);
+	__raw_writel(bitval, S3C2410_SRCPND);
+	__raw_writel(bitval, S3C2410_INTPND);
+}
+
+static inline void
+s3c2412_irq_maskack(unsigned int irqno)
+{
+	unsigned long bitval = 1UL << (irqno - IRQ_EINT0);
+	unsigned long mask;
+
+	mask = __raw_readl(S3C2410_INTMSK);
+	__raw_writel(mask|bitval, S3C2410_INTMSK);
+
+	mask = __raw_readl(S3C2412_EINTMASK);
+	__raw_writel(mask | bitval, S3C2412_EINTMASK);
+
+	__raw_writel(bitval, S3C2412_EINTPEND);
+	__raw_writel(bitval, S3C2410_SRCPND);
+	__raw_writel(bitval, S3C2410_INTPND);
+}
+
+static void
+s3c2412_irq_unmask(unsigned int irqno)
+{
+	unsigned long bitval = 1UL << (irqno - IRQ_EINT0);
+	unsigned long mask;
+
+	mask = __raw_readl(S3C2412_EINTMASK);
+	__raw_writel(mask & ~bitval, S3C2412_EINTMASK);
+
+	mask = __raw_readl(S3C2410_INTMSK);
+	__raw_writel(mask & ~bitval, S3C2410_INTMSK);
+}
+
+static struct irqchip s3c2412_irq_eint0t4 = {
+	.ack	   = s3c2412_irq_ack,
+	.mask	   = s3c2412_irq_mask,
+	.unmask	   = s3c2412_irq_unmask,
+	.set_wake  = s3c_irq_wake,
+	.set_type  = s3c_irqext_type,
+};
+
+static int s3c2412_irq_add(struct sys_device *sysdev)
+{
+	unsigned int irqno;
+
+	for (irqno = IRQ_EINT0; irqno <= IRQ_EINT3; irqno++) {
+		set_irq_chip(irqno, &s3c2412_irq_eint0t4);
+		set_irq_handler(irqno, do_edge_IRQ);
+		set_irq_flags(irqno, IRQF_VALID);
+	}
+
+	return 0;
+}
+
+static struct sysdev_driver s3c2412_irq_driver = {
+	.add		= s3c2412_irq_add,
+};
+
+static int s3c2412_irq_init(void)
+{
+	return sysdev_driver_register(&s3c2412_sysclass, &s3c2412_irq_driver);
+}
+
+arch_initcall(s3c2412_irq_init);

+ 0 - 3
arch/arm/mach-s3c2410/s3c2440-irq.c

@@ -17,9 +17,6 @@
  * along with this program; if not, write to the Free Software
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  *
  *
- * Changelog:
- *	25-Jul-2005 BJD		Split from irq.c
- *
 */
 */
 
 
 #include <linux/init.h>
 #include <linux/init.h>

+ 6 - 6
arch/arm/mach-s3c2410/s3c244x-irq.c

@@ -17,9 +17,6 @@
  * along with this program; if not, write to the Free Software
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  *
  *
- * Changelog:
- *	25-Jul-2005 BJD		Split from irq.c
- *
 */
 */
 
 
 #include <linux/init.h>
 #include <linux/init.h>
@@ -122,21 +119,24 @@ static int s3c244x_irq_add(struct sys_device *sysdev)
 	return 0;
 	return 0;
 }
 }
 
 
-static struct sysdev_driver s3c244x_irq_driver = {
+static struct sysdev_driver s3c2440_irq_driver = {
 	.add	= s3c244x_irq_add,
 	.add	= s3c244x_irq_add,
 };
 };
 
 
 static int s3c2440_irq_init(void)
 static int s3c2440_irq_init(void)
 {
 {
-	return sysdev_driver_register(&s3c2440_sysclass, &s3c244x_irq_driver);
+	return sysdev_driver_register(&s3c2440_sysclass, &s3c2440_irq_driver);
 }
 }
 
 
 arch_initcall(s3c2440_irq_init);
 arch_initcall(s3c2440_irq_init);
 
 
+static struct sysdev_driver s3c2442_irq_driver = {
+	.add	= s3c244x_irq_add,
+};
 
 
 static int s3c2442_irq_init(void)
 static int s3c2442_irq_init(void)
 {
 {
-	return sysdev_driver_register(&s3c2442_sysclass, &s3c244x_irq_driver);
+	return sysdev_driver_register(&s3c2442_sysclass, &s3c2442_irq_driver);
 }
 }
 
 
 arch_initcall(s3c2442_irq_init);
 arch_initcall(s3c2442_irq_init);

+ 1 - 1
arch/arm/mm/proc-arm926.S

@@ -480,7 +480,7 @@ __arm926_proc_info:
 	b	__arm926_setup
 	b	__arm926_setup
 	.long	cpu_arch_name
 	.long	cpu_arch_name
 	.long	cpu_elf_name
 	.long	cpu_elf_name
-	.long	HWCAP_SWP|HWCAP_HALF|HWCAP_THUMB|HWCAP_FAST_MULT|HWCAP_EDSP|HWCAP_JAVA
+	.long	HWCAP_SWP|HWCAP_HALF|HWCAP_THUMB|HWCAP_FAST_MULT|HWCAP_VFP|HWCAP_EDSP|HWCAP_JAVA
 	.long	cpu_arm926_name
 	.long	cpu_arm926_name
 	.long	arm926_processor_functions
 	.long	arm926_processor_functions
 	.long	v4wbi_tlb_fns
 	.long	v4wbi_tlb_fns

+ 4 - 0
arch/frv/Kconfig

@@ -29,6 +29,10 @@ config GENERIC_HARDIRQS
 	bool
 	bool
 	default n
 	default n
 
 
+config GENERIC_TIME
+	bool
+	default y
+
 config TIME_LOW_RES
 config TIME_LOW_RES
 	bool
 	bool
 	default y
 	default y

+ 0 - 81
arch/frv/kernel/time.c

@@ -32,8 +32,6 @@
 
 
 #define TICK_SIZE (tick_nsec / 1000)
 #define TICK_SIZE (tick_nsec / 1000)
 
 
-extern unsigned long wall_jiffies;
-
 unsigned long __nongprelbss __clkin_clock_speed_HZ;
 unsigned long __nongprelbss __clkin_clock_speed_HZ;
 unsigned long __nongprelbss __ext_bus_clock_speed_HZ;
 unsigned long __nongprelbss __ext_bus_clock_speed_HZ;
 unsigned long __nongprelbss __res_bus_clock_speed_HZ;
 unsigned long __nongprelbss __res_bus_clock_speed_HZ;
@@ -144,85 +142,6 @@ void time_init(void)
 	time_divisor_init();
 	time_divisor_init();
 }
 }
 
 
-/*
- * This version of gettimeofday has near microsecond resolution.
- */
-void do_gettimeofday(struct timeval *tv)
-{
-	unsigned long seq;
-	unsigned long usec, sec;
-	unsigned long max_ntp_tick;
-
-	do {
-		unsigned long lost;
-
-		seq = read_seqbegin(&xtime_lock);
-
-		usec = 0;
-		lost = jiffies - wall_jiffies;
-
-		/*
-		 * If time_adjust is negative then NTP is slowing the clock
-		 * so make sure not to go into next possible interval.
-		 * Better to lose some accuracy than have time go backwards..
-		 */
-		if (unlikely(time_adjust < 0)) {
-			max_ntp_tick = (USEC_PER_SEC / HZ) - tickadj;
-			usec = min(usec, max_ntp_tick);
-
-			if (lost)
-				usec += lost * max_ntp_tick;
-		}
-		else if (unlikely(lost))
-			usec += lost * (USEC_PER_SEC / HZ);
-
-		sec = xtime.tv_sec;
-		usec += (xtime.tv_nsec / 1000);
-	} while (read_seqretry(&xtime_lock, seq));
-
-	while (usec >= 1000000) {
-		usec -= 1000000;
-		sec++;
-	}
-
-	tv->tv_sec = sec;
-	tv->tv_usec = usec;
-}
-
-EXPORT_SYMBOL(do_gettimeofday);
-
-int do_settimeofday(struct timespec *tv)
-{
-	time_t wtm_sec, sec = tv->tv_sec;
-	long wtm_nsec, nsec = tv->tv_nsec;
-
-	if ((unsigned long)tv->tv_nsec >= NSEC_PER_SEC)
-		return -EINVAL;
-
-	write_seqlock_irq(&xtime_lock);
-	/*
-	 * This is revolting. We need to set "xtime" correctly. However, the
-	 * value in this location is the value at the most recent update of
-	 * wall time.  Discover what correction gettimeofday() would have
-	 * made, and then undo it!
-	 */
-	nsec -= 0 * NSEC_PER_USEC;
-	nsec -= (jiffies - wall_jiffies) * TICK_NSEC;
-
-	wtm_sec  = wall_to_monotonic.tv_sec + (xtime.tv_sec - sec);
-	wtm_nsec = wall_to_monotonic.tv_nsec + (xtime.tv_nsec - nsec);
-
-	set_normalized_timespec(&xtime, sec, nsec);
-	set_normalized_timespec(&wall_to_monotonic, wtm_sec, wtm_nsec);
-
-	ntp_clear();
-	write_sequnlock_irq(&xtime_lock);
-	clock_was_set();
-	return 0;
-}
-
-EXPORT_SYMBOL(do_settimeofday);
-
 /*
 /*
  * Scheduler clock - returns current time in nanosec units.
  * Scheduler clock - returns current time in nanosec units.
  */
  */

+ 0 - 1
arch/i386/kernel/Makefile

@@ -39,7 +39,6 @@ obj-$(CONFIG_VM86)		+= vm86.o
 obj-$(CONFIG_EARLY_PRINTK)	+= early_printk.o
 obj-$(CONFIG_EARLY_PRINTK)	+= early_printk.o
 obj-$(CONFIG_HPET_TIMER) 	+= hpet.o
 obj-$(CONFIG_HPET_TIMER) 	+= hpet.o
 obj-$(CONFIG_K8_NB)		+= k8.o
 obj-$(CONFIG_K8_NB)		+= k8.o
-obj-$(CONFIG_AUDIT)		+= audit.o
 
 
 EXTRA_AFLAGS   := -traditional
 EXTRA_AFLAGS   := -traditional
 
 

+ 0 - 23
arch/i386/kernel/audit.c

@@ -1,23 +0,0 @@
-#include <linux/init.h>
-#include <linux/types.h>
-#include <linux/audit.h>
-#include <asm/unistd.h>
-
-static unsigned dir_class[] = {
-#include <asm-generic/audit_dir_write.h>
-~0U
-};
-
-static unsigned chattr_class[] = {
-#include <asm-generic/audit_change_attr.h>
-~0U
-};
-
-static int __init audit_classes_init(void)
-{
-	audit_register_class(AUDIT_CLASS_DIR_WRITE, dir_class);
-	audit_register_class(AUDIT_CLASS_CHATTR, chattr_class);
-	return 0;
-}
-
-__initcall(audit_classes_init);

+ 4 - 0
arch/ia64/Kconfig

@@ -75,6 +75,10 @@ config DMA_IS_NORMAL
 	depends on IA64_SGI_SN2
 	depends on IA64_SGI_SN2
 	default y
 	default y
 
 
+config AUDIT_ARCH
+	bool
+	default y
+
 choice
 choice
 	prompt "System type"
 	prompt "System type"
 	default IA64_GENERIC
 	default IA64_GENERIC

+ 26 - 0
arch/ia64/ia32/audit.c

@@ -9,3 +9,29 @@ unsigned ia32_chattr_class[] = {
 #include <asm-generic/audit_change_attr.h>
 #include <asm-generic/audit_change_attr.h>
 ~0U
 ~0U
 };
 };
+
+unsigned ia32_write_class[] = {
+#include <asm-generic/audit_write.h>
+~0U
+};
+
+unsigned ia32_read_class[] = {
+#include <asm-generic/audit_read.h>
+~0U
+};
+
+int ia32_classify_syscall(unsigned syscall)
+{
+	switch(syscall) {
+	case __NR_open:
+		return 2;
+	case __NR_openat:
+		return 3;
+	case __NR_socketcall:
+		return 4;
+	case __NR_execve:
+		return 5;
+	default:
+		return 1;
+	}
+}

+ 35 - 0
arch/ia64/kernel/audit.c

@@ -8,19 +8,54 @@ static unsigned dir_class[] = {
 ~0U
 ~0U
 };
 };
 
 
+static unsigned read_class[] = {
+#include <asm-generic/audit_read.h>
+~0U
+};
+
+static unsigned write_class[] = {
+#include <asm-generic/audit_write.h>
+~0U
+};
+
 static unsigned chattr_class[] = {
 static unsigned chattr_class[] = {
 #include <asm-generic/audit_change_attr.h>
 #include <asm-generic/audit_change_attr.h>
 ~0U
 ~0U
 };
 };
 
 
+int audit_classify_syscall(int abi, unsigned syscall)
+{
+#ifdef CONFIG_IA32_SUPPORT
+	extern int ia32_classify_syscall(unsigned);
+	if (abi == AUDIT_ARCH_I386)
+		return ia32_classify_syscall(syscall);
+#endif
+	switch(syscall) {
+	case __NR_open:
+		return 2;
+	case __NR_openat:
+		return 3;
+	case __NR_execve:
+		return 5;
+	default:
+		return 0;
+	}
+}
+
 static int __init audit_classes_init(void)
 static int __init audit_classes_init(void)
 {
 {
 #ifdef CONFIG_IA32_SUPPORT
 #ifdef CONFIG_IA32_SUPPORT
 	extern __u32 ia32_dir_class[];
 	extern __u32 ia32_dir_class[];
+	extern __u32 ia32_write_class[];
+	extern __u32 ia32_read_class[];
 	extern __u32 ia32_chattr_class[];
 	extern __u32 ia32_chattr_class[];
+	audit_register_class(AUDIT_CLASS_WRITE_32, ia32_write_class);
+	audit_register_class(AUDIT_CLASS_READ_32, ia32_read_class);
 	audit_register_class(AUDIT_CLASS_DIR_WRITE_32, ia32_dir_class);
 	audit_register_class(AUDIT_CLASS_DIR_WRITE_32, ia32_dir_class);
 	audit_register_class(AUDIT_CLASS_CHATTR_32, ia32_chattr_class);
 	audit_register_class(AUDIT_CLASS_CHATTR_32, ia32_chattr_class);
 #endif
 #endif
+	audit_register_class(AUDIT_CLASS_WRITE, write_class);
+	audit_register_class(AUDIT_CLASS_READ, read_class);
 	audit_register_class(AUDIT_CLASS_DIR_WRITE, dir_class);
 	audit_register_class(AUDIT_CLASS_DIR_WRITE, dir_class);
 	audit_register_class(AUDIT_CLASS_CHATTR, chattr_class);
 	audit_register_class(AUDIT_CLASS_CHATTR, chattr_class);
 	return 0;
 	return 0;

+ 2 - 2
arch/ia64/kernel/entry.S

@@ -1605,8 +1605,8 @@ sys_call_table:
 	data8 sys_ni_syscall			// 1295 reserved for ppoll
 	data8 sys_ni_syscall			// 1295 reserved for ppoll
 	data8 sys_unshare
 	data8 sys_unshare
 	data8 sys_splice
 	data8 sys_splice
-	data8 sys_set_robust_list
-	data8 sys_get_robust_list
+	data8 sys_ni_syscall			// reserved for set_robust_list
+	data8 sys_ni_syscall			// reserved for get_robust_list
 	data8 sys_sync_file_range		// 1300
 	data8 sys_sync_file_range		// 1300
 	data8 sys_tee
 	data8 sys_tee
 	data8 sys_vmsplice
 	data8 sys_vmsplice

+ 5 - 0
arch/ia64/kernel/head.S

@@ -197,6 +197,11 @@ start_ap:
 	;;
 	;;
 	srlz.i
 	srlz.i
 	;;
 	;;
+ {
+	flushrs				// must be first insn in group
+	srlz.i
+ }
+	;;
 	/*
 	/*
 	 * Save the region registers, predicate before they get clobbered
 	 * Save the region registers, predicate before they get clobbered
 	 */
 	 */

+ 3 - 1
arch/ia64/kernel/perfmon.c

@@ -4936,13 +4936,15 @@ abort_locked:
 	if (likely(ctx)) {
 	if (likely(ctx)) {
 		DPRINT(("context unlocked\n"));
 		DPRINT(("context unlocked\n"));
 		UNPROTECT_CTX(ctx, flags);
 		UNPROTECT_CTX(ctx, flags);
-		fput(file);
 	}
 	}
 
 
 	/* copy argument back to user, if needed */
 	/* copy argument back to user, if needed */
 	if (call_made && PFM_CMD_RW_ARG(cmd) && copy_to_user(arg, args_k, base_sz*count)) ret = -EFAULT;
 	if (call_made && PFM_CMD_RW_ARG(cmd) && copy_to_user(arg, args_k, base_sz*count)) ret = -EFAULT;
 
 
 error_args:
 error_args:
+	if (file)
+		fput(file);
+
 	kfree(args_k);
 	kfree(args_k);
 
 
 	DPRINT(("cmd=%s ret=%ld\n", PFM_CMD_NAME(cmd), ret));
 	DPRINT(("cmd=%s ret=%ld\n", PFM_CMD_NAME(cmd), ret));

+ 16 - 12
arch/ia64/kernel/sys_ia64.c

@@ -163,10 +163,25 @@ sys_pipe (void)
 	return retval;
 	return retval;
 }
 }
 
 
+int ia64_mmap_check(unsigned long addr, unsigned long len,
+		unsigned long flags)
+{
+	unsigned long roff;
+
+	/*
+	 * Don't permit mappings into unmapped space, the virtual page table
+	 * of a region, or across a region boundary.  Note: RGN_MAP_LIMIT is
+	 * equal to 2^n-PAGE_SIZE (for some integer n <= 61) and len > 0.
+	 */
+	roff = REGION_OFFSET(addr);
+	if ((len > RGN_MAP_LIMIT) || (roff > (RGN_MAP_LIMIT - len)))
+		return -EINVAL;
+	return 0;
+}
+
 static inline unsigned long
 static inline unsigned long
 do_mmap2 (unsigned long addr, unsigned long len, int prot, int flags, int fd, unsigned long pgoff)
 do_mmap2 (unsigned long addr, unsigned long len, int prot, int flags, int fd, unsigned long pgoff)
 {
 {
-	unsigned long roff;
 	struct file *file = NULL;
 	struct file *file = NULL;
 
 
 	flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE);
 	flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE);
@@ -188,17 +203,6 @@ do_mmap2 (unsigned long addr, unsigned long len, int prot, int flags, int fd, un
 		goto out;
 		goto out;
 	}
 	}
 
 
-	/*
-	 * Don't permit mappings into unmapped space, the virtual page table of a region,
-	 * or across a region boundary.  Note: RGN_MAP_LIMIT is equal to 2^n-PAGE_SIZE
-	 * (for some integer n <= 61) and len > 0.
-	 */
-	roff = REGION_OFFSET(addr);
-	if ((len > RGN_MAP_LIMIT) || (roff > (RGN_MAP_LIMIT - len))) {
-		addr = -EINVAL;
-		goto out;
-	}
-
 	down_write(&current->mm->mmap_sem);
 	down_write(&current->mm->mmap_sem);
 	addr = do_mmap_pgoff(file, addr, len, prot, flags, pgoff);
 	addr = do_mmap_pgoff(file, addr, len, prot, flags, pgoff);
 	up_write(&current->mm->mmap_sem);
 	up_write(&current->mm->mmap_sem);

+ 1 - 1
arch/ia64/sn/kernel/setup.c

@@ -565,7 +565,7 @@ static void __init sn_init_pdas(char **cmdline_p)
  * Also sets up a few fields in the nodepda.  Also known as
  * Also sets up a few fields in the nodepda.  Also known as
  * platform_cpu_init() by the ia64 machvec code.
  * platform_cpu_init() by the ia64 machvec code.
  */
  */
-void __init sn_cpu_init(void)
+void __cpuinit sn_cpu_init(void)
 {
 {
 	int cpuid;
 	int cpuid;
 	int cpuphyid;
 	int cpuphyid;

+ 4 - 0
arch/powerpc/Kconfig

@@ -95,6 +95,10 @@ config GENERIC_TBSYNC
 	default y if PPC32 && SMP
 	default y if PPC32 && SMP
 	default n
 	default n
 
 
+config AUDIT_ARCH
+	bool
+	default y
+
 config DEFAULT_UIMAGE
 config DEFAULT_UIMAGE
 	bool
 	bool
 	help
 	help

+ 2 - 0
arch/powerpc/kernel/Makefile

@@ -70,6 +70,8 @@ obj-$(CONFIG_PCI)		+= $(pci64-y) $(pci32-y)
 kexec-$(CONFIG_PPC64)		:= machine_kexec_64.o
 kexec-$(CONFIG_PPC64)		:= machine_kexec_64.o
 kexec-$(CONFIG_PPC32)		:= machine_kexec_32.o
 kexec-$(CONFIG_PPC32)		:= machine_kexec_32.o
 obj-$(CONFIG_KEXEC)		+= machine_kexec.o crash.o $(kexec-y)
 obj-$(CONFIG_KEXEC)		+= machine_kexec.o crash.o $(kexec-y)
+obj-$(CONFIG_AUDIT)		+= audit.o
+obj64-$(CONFIG_AUDIT)		+= compat_audit.o
 
 
 ifeq ($(CONFIG_PPC_ISERIES),y)
 ifeq ($(CONFIG_PPC_ISERIES),y)
 $(obj)/head_64.o: $(obj)/lparmap.s
 $(obj)/head_64.o: $(obj)/lparmap.s

+ 66 - 0
arch/powerpc/kernel/audit.c

@@ -0,0 +1,66 @@
+#include <linux/init.h>
+#include <linux/types.h>
+#include <linux/audit.h>
+#include <asm/unistd.h>
+
+static unsigned dir_class[] = {
+#include <asm-generic/audit_dir_write.h>
+~0U
+};
+
+static unsigned read_class[] = {
+#include <asm-generic/audit_read.h>
+~0U
+};
+
+static unsigned write_class[] = {
+#include <asm-generic/audit_write.h>
+~0U
+};
+
+static unsigned chattr_class[] = {
+#include <asm-generic/audit_change_attr.h>
+~0U
+};
+
+int audit_classify_syscall(int abi, unsigned syscall)
+{
+#ifdef CONFIG_PPC64
+	extern int ppc32_classify_syscall(unsigned);
+	if (abi == AUDIT_ARCH_PPC)
+		return ppc32_classify_syscall(syscall);
+#endif
+	switch(syscall) {
+	case __NR_open:
+		return 2;
+	case __NR_openat:
+		return 3;
+	case __NR_socketcall:
+		return 4;
+	case __NR_execve:
+		return 5;
+	default:
+		return 0;
+	}
+}
+
+static int __init audit_classes_init(void)
+{
+#ifdef CONFIG_PPC64
+	extern __u32 ppc32_dir_class[];
+	extern __u32 ppc32_write_class[];
+	extern __u32 ppc32_read_class[];
+	extern __u32 ppc32_chattr_class[];
+	audit_register_class(AUDIT_CLASS_WRITE_32, ppc32_write_class);
+	audit_register_class(AUDIT_CLASS_READ_32, ppc32_read_class);
+	audit_register_class(AUDIT_CLASS_DIR_WRITE_32, ppc32_dir_class);
+	audit_register_class(AUDIT_CLASS_CHATTR_32, ppc32_chattr_class);
+#endif
+	audit_register_class(AUDIT_CLASS_WRITE, write_class);
+	audit_register_class(AUDIT_CLASS_READ, read_class);
+	audit_register_class(AUDIT_CLASS_DIR_WRITE, dir_class);
+	audit_register_class(AUDIT_CLASS_CHATTR, chattr_class);
+	return 0;
+}
+
+__initcall(audit_classes_init);

+ 38 - 0
arch/powerpc/kernel/compat_audit.c

@@ -0,0 +1,38 @@
+#undef __powerpc64__
+#include <asm/unistd.h>
+
+unsigned ppc32_dir_class[] = {
+#include <asm-generic/audit_dir_write.h>
+~0U
+};
+
+unsigned ppc32_chattr_class[] = {
+#include <asm-generic/audit_change_attr.h>
+~0U
+};
+
+unsigned ppc32_write_class[] = {
+#include <asm-generic/audit_write.h>
+~0U
+};
+
+unsigned ppc32_read_class[] = {
+#include <asm-generic/audit_read.h>
+~0U
+};
+
+int ppc32_classify_syscall(unsigned syscall)
+{
+	switch(syscall) {
+	case __NR_open:
+		return 2;
+	case __NR_openat:
+		return 3;
+	case __NR_socketcall:
+		return 4;
+	case __NR_execve:
+		return 5;
+	default:
+		return 1;
+	}
+}

+ 4 - 0
arch/s390/Kconfig

@@ -118,6 +118,10 @@ config SYSVIPC_COMPAT
 	depends on COMPAT && SYSVIPC
 	depends on COMPAT && SYSVIPC
 	default y
 	default y
 
 
+config AUDIT_ARCH
+	bool
+	default y
+
 comment "Code generation options"
 comment "Code generation options"
 
 
 choice
 choice

+ 3 - 1
arch/s390/kernel/Makefile

@@ -16,9 +16,11 @@ extra-y				+= head.o init_task.o vmlinux.lds
 obj-$(CONFIG_MODULES)		+= s390_ksyms.o module.o
 obj-$(CONFIG_MODULES)		+= s390_ksyms.o module.o
 obj-$(CONFIG_SMP)		+= smp.o
 obj-$(CONFIG_SMP)		+= smp.o
 
 
+obj-$(CONFIG_AUDIT)		+= audit.o
+compat-obj-$(CONFIG_AUDIT)	+= compat_audit.o
 obj-$(CONFIG_COMPAT)		+= compat_linux.o compat_signal.o \
 obj-$(CONFIG_COMPAT)		+= compat_linux.o compat_signal.o \
 					compat_wrapper.o compat_exec_domain.o \
 					compat_wrapper.o compat_exec_domain.o \
-					binfmt_elf32.o
+					binfmt_elf32.o $(compat-obj-y)
 
 
 obj-$(CONFIG_VIRT_TIMER)	+= vtime.o
 obj-$(CONFIG_VIRT_TIMER)	+= vtime.o
 obj-$(CONFIG_STACKTRACE)	+= stacktrace.o
 obj-$(CONFIG_STACKTRACE)	+= stacktrace.o

+ 66 - 0
arch/s390/kernel/audit.c

@@ -0,0 +1,66 @@
+#include <linux/init.h>
+#include <linux/types.h>
+#include <linux/audit.h>
+#include <asm/unistd.h>
+
+static unsigned dir_class[] = {
+#include <asm-generic/audit_dir_write.h>
+~0U
+};
+
+static unsigned read_class[] = {
+#include <asm-generic/audit_read.h>
+~0U
+};
+
+static unsigned write_class[] = {
+#include <asm-generic/audit_write.h>
+~0U
+};
+
+static unsigned chattr_class[] = {
+#include <asm-generic/audit_change_attr.h>
+~0U
+};
+
+int audit_classify_syscall(int abi, unsigned syscall)
+{
+#ifdef CONFIG_COMPAT
+	extern int s390_classify_syscall(unsigned);
+	if (abi == AUDIT_ARCH_S390)
+		return s390_classify_syscall(syscall);
+#endif
+	switch(syscall) {
+	case __NR_open:
+		return 2;
+	case __NR_openat:
+		return 3;
+	case __NR_socketcall:
+		return 4;
+	case __NR_execve:
+		return 5;
+	default:
+		return 0;
+	}
+}
+
+static int __init audit_classes_init(void)
+{
+#ifdef CONFIG_COMPAT
+	extern __u32 s390_dir_class[];
+	extern __u32 s390_write_class[];
+	extern __u32 s390_read_class[];
+	extern __u32 s390_chattr_class[];
+	audit_register_class(AUDIT_CLASS_WRITE_32, s390_write_class);
+	audit_register_class(AUDIT_CLASS_READ_32, s390_read_class);
+	audit_register_class(AUDIT_CLASS_DIR_WRITE_32, s390_dir_class);
+	audit_register_class(AUDIT_CLASS_CHATTR_32, s390_chattr_class);
+#endif
+	audit_register_class(AUDIT_CLASS_WRITE, write_class);
+	audit_register_class(AUDIT_CLASS_READ, read_class);
+	audit_register_class(AUDIT_CLASS_DIR_WRITE, dir_class);
+	audit_register_class(AUDIT_CLASS_CHATTR, chattr_class);
+	return 0;
+}
+
+__initcall(audit_classes_init);

+ 38 - 0
arch/s390/kernel/compat_audit.c

@@ -0,0 +1,38 @@
+#undef __s390x__
+#include <asm/unistd.h>
+
+unsigned s390_dir_class[] = {
+#include <asm-generic/audit_dir_write.h>
+~0U
+};
+
+unsigned s390_chattr_class[] = {
+#include <asm-generic/audit_change_attr.h>
+~0U
+};
+
+unsigned s390_write_class[] = {
+#include <asm-generic/audit_write.h>
+~0U
+};
+
+unsigned s390_read_class[] = {
+#include <asm-generic/audit_read.h>
+~0U
+};
+
+int s390_classify_syscall(unsigned syscall)
+{
+	switch(syscall) {
+	case __NR_open:
+		return 2;
+	case __NR_openat:
+		return 3;
+	case __NR_socketcall:
+		return 4;
+	case __NR_execve:
+		return 5;
+	default:
+		return 1;
+	}
+}

+ 0 - 1
arch/sh64/Makefile

@@ -26,7 +26,6 @@ LDFLAGS			+= -EB  -mshelf32_linux
 endif
 endif
 
 
 # No requirements for endianess support from AFLAGS, 'as' always run through gcc
 # No requirements for endianess support from AFLAGS, 'as' always run through gcc
-AFLAGS		+= -m5 -isa=sh64 -traditional
 CFLAGS		+= $(cpu-y)
 CFLAGS		+= $(cpu-y)
 
 
 LDFLAGS_vmlinux	+= --defsym phys_stext=_stext-$(CONFIG_CACHED_MEMORY_OFFSET) \
 LDFLAGS_vmlinux	+= --defsym phys_stext=_stext-$(CONFIG_CACHED_MEMORY_OFFSET) \

+ 3 - 0
arch/sh64/kernel/process.c

@@ -355,6 +355,9 @@ void machine_power_off(void)
 	enter_deep_standby();
 	enter_deep_standby();
 }
 }
 
 
+void (*pm_power_off)(void) = machine_power_off;
+EXPORT_SYMBOL(pm_power_off);
+
 void show_regs(struct pt_regs * regs)
 void show_regs(struct pt_regs * regs)
 {
 {
 	unsigned long long ah, al, bh, bl, ch, cl;
 	unsigned long long ah, al, bh, bl, ch, cl;

+ 4 - 2
arch/sh64/mach-cayman/setup.c

@@ -112,8 +112,10 @@ struct resource io_resources[] = {
 };
 };
 
 
 struct resource kram_resources[] = {
 struct resource kram_resources[] = {
-	{ "Kernel code", 0, 0 },	/* These must be last in the array */
-	{ "Kernel data", 0, 0 }		/* These must be last in the array */
+	/* These must be last in the array */
+	{ .name = "Kernel code", .start = 0, .end = 0 },
+	/* These must be last in the array */
+	{ .name = "Kernel data", .start = 0, .end = 0 }
 };
 };
 
 
 struct resource xram_resources[] = {
 struct resource xram_resources[] = {

+ 3 - 1
arch/sh64/mm/ioremap.c

@@ -449,7 +449,9 @@ ioremap_proc_info(char *buf, char **start, off_t fpos, int length, int *eof,
 		if (p + 32 >= e)        /* Better than nothing */
 		if (p + 32 >= e)        /* Better than nothing */
 			break;
 			break;
 		if ((nm = r->name) == 0) nm = "???";
 		if ((nm = r->name) == 0) nm = "???";
-		p += sprintf(p, "%08lx-%08lx: %s\n", r->start, r->end, nm);
+		p += sprintf(p, "%08lx-%08lx: %s\n",
+			     (unsigned long)r->start,
+			     (unsigned long)r->end, nm);
 	}
 	}
 
 
 	return p-buf;
 	return p-buf;

+ 15 - 12
arch/sparc/kernel/sys_sparc.c

@@ -219,6 +219,21 @@ out:
 	return err;
 	return err;
 }
 }
 
 
+int sparc_mmap_check(unsigned long addr, unsigned long len, unsigned long flags)
+{
+	if (ARCH_SUN4C_SUN4 &&
+	    (len > 0x20000000 ||
+	     ((flags & MAP_FIXED) &&
+	      addr < 0xe0000000 && addr + len > 0x20000000)))
+		return -EINVAL;
+
+	/* See asm-sparc/uaccess.h */
+	if (len > TASK_SIZE - PAGE_SIZE || addr + len > TASK_SIZE - PAGE_SIZE)
+		return -EINVAL;
+
+	return 0;
+}
+
 /* Linux version of mmap */
 /* Linux version of mmap */
 static unsigned long do_mmap2(unsigned long addr, unsigned long len,
 static unsigned long do_mmap2(unsigned long addr, unsigned long len,
 	unsigned long prot, unsigned long flags, unsigned long fd,
 	unsigned long prot, unsigned long flags, unsigned long fd,
@@ -233,25 +248,13 @@ static unsigned long do_mmap2(unsigned long addr, unsigned long len,
 			goto out;
 			goto out;
 	}
 	}
 
 
-	retval = -EINVAL;
 	len = PAGE_ALIGN(len);
 	len = PAGE_ALIGN(len);
-	if (ARCH_SUN4C_SUN4 &&
-	    (len > 0x20000000 ||
-	     ((flags & MAP_FIXED) &&
-	      addr < 0xe0000000 && addr + len > 0x20000000)))
-		goto out_putf;
-
-	/* See asm-sparc/uaccess.h */
-	if (len > TASK_SIZE - PAGE_SIZE || addr + len > TASK_SIZE - PAGE_SIZE)
-		goto out_putf;
-
 	flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE);
 	flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE);
 
 
 	down_write(&current->mm->mmap_sem);
 	down_write(&current->mm->mmap_sem);
 	retval = do_mmap_pgoff(file, addr, len, prot, flags, pgoff);
 	retval = do_mmap_pgoff(file, addr, len, prot, flags, pgoff);
 	up_write(&current->mm->mmap_sem);
 	up_write(&current->mm->mmap_sem);
 
 
-out_putf:
 	if (file)
 	if (file)
 		fput(file);
 		fput(file);
 out:
 out:

+ 4 - 0
arch/sparc64/Kconfig

@@ -34,6 +34,10 @@ config ARCH_MAY_HAVE_PC_FDC
 	bool
 	bool
 	default y
 	default y
 
 
+config AUDIT_ARCH
+	bool
+	default y
+
 choice
 choice
 	prompt "Kernel page size"
 	prompt "Kernel page size"
 	default SPARC64_PAGE_SIZE_8KB
 	default SPARC64_PAGE_SIZE_8KB

+ 3 - 0
arch/sparc64/kernel/Makefile

@@ -25,6 +25,9 @@ obj-$(CONFIG_MODULES) += module.o
 obj-$(CONFIG_US3_FREQ) += us3_cpufreq.o
 obj-$(CONFIG_US3_FREQ) += us3_cpufreq.o
 obj-$(CONFIG_US2E_FREQ) += us2e_cpufreq.o
 obj-$(CONFIG_US2E_FREQ) += us2e_cpufreq.o
 obj-$(CONFIG_KPROBES) += kprobes.o
 obj-$(CONFIG_KPROBES) += kprobes.o
+obj-$(CONFIG_AUDIT) += audit.o
+obj-$(CONFIG_AUDIT)$(CONFIG_SPARC32_COMPAT) += compat_audit.o
+obj-y += $(obj-yy)
 
 
 ifdef CONFIG_SUNOS_EMUL
 ifdef CONFIG_SUNOS_EMUL
   obj-y += sys_sunos32.o sunos_ioctl32.o
   obj-y += sys_sunos32.o sunos_ioctl32.o

+ 66 - 0
arch/sparc64/kernel/audit.c

@@ -0,0 +1,66 @@
+#include <linux/init.h>
+#include <linux/types.h>
+#include <linux/audit.h>
+#include <asm/unistd.h>
+
+static unsigned dir_class[] = {
+#include <asm-generic/audit_dir_write.h>
+~0U
+};
+
+static unsigned read_class[] = {
+#include <asm-generic/audit_read.h>
+~0U
+};
+
+static unsigned write_class[] = {
+#include <asm-generic/audit_write.h>
+~0U
+};
+
+static unsigned chattr_class[] = {
+#include <asm-generic/audit_change_attr.h>
+~0U
+};
+
+int audit_classify_syscall(int abi, unsigned syscall)
+{
+#ifdef CONFIG_SPARC32_COMPAT
+	extern int sparc32_classify_syscall(unsigned);
+	if (abi == AUDIT_ARCH_SPARC)
+		return sparc32_classify_syscall(syscall);
+#endif
+	switch(syscall) {
+	case __NR_open:
+		return 2;
+	case __NR_openat:
+		return 3;
+	case __NR_socketcall:
+		return 4;
+	case __NR_execve:
+		return 5;
+	default:
+		return 0;
+	}
+}
+
+static int __init audit_classes_init(void)
+{
+#ifdef CONFIG_SPARC32_COMPAT
+	extern __u32 sparc32_dir_class[];
+	extern __u32 sparc32_write_class[];
+	extern __u32 sparc32_read_class[];
+	extern __u32 sparc32_chattr_class[];
+	audit_register_class(AUDIT_CLASS_WRITE_32, sparc32_write_class);
+	audit_register_class(AUDIT_CLASS_READ_32, sparc32_read_class);
+	audit_register_class(AUDIT_CLASS_DIR_WRITE_32, sparc32_dir_class);
+	audit_register_class(AUDIT_CLASS_CHATTR_32, sparc32_chattr_class);
+#endif
+	audit_register_class(AUDIT_CLASS_WRITE, write_class);
+	audit_register_class(AUDIT_CLASS_READ, read_class);
+	audit_register_class(AUDIT_CLASS_DIR_WRITE, dir_class);
+	audit_register_class(AUDIT_CLASS_CHATTR, chattr_class);
+	return 0;
+}
+
+__initcall(audit_classes_init);

+ 37 - 0
arch/sparc64/kernel/compat_audit.c

@@ -0,0 +1,37 @@
+#include <asm-sparc/unistd.h>
+
+unsigned sparc32_dir_class[] = {
+#include <asm-generic/audit_dir_write.h>
+~0U
+};
+
+unsigned sparc32_chattr_class[] = {
+#include <asm-generic/audit_change_attr.h>
+~0U
+};
+
+unsigned sparc32_write_class[] = {
+#include <asm-generic/audit_write.h>
+~0U
+};
+
+unsigned sparc32_read_class[] = {
+#include <asm-generic/audit_read.h>
+~0U
+};
+
+int sparc32_classify_syscall(unsigned syscall)
+{
+	switch(syscall) {
+	case __NR_open:
+		return 2;
+	case __NR_openat:
+		return 3;
+	case __NR_socketcall:
+		return 4;
+	case __NR_execve:
+		return 5;
+	default:
+		return 1;
+	}
+}

+ 20 - 16
arch/sparc64/kernel/sys_sparc.c

@@ -548,6 +548,26 @@ asmlinkage long sparc64_personality(unsigned long personality)
 	return ret;
 	return ret;
 }
 }
 
 
+int sparc64_mmap_check(unsigned long addr, unsigned long len,
+		unsigned long flags)
+{
+	if (test_thread_flag(TIF_32BIT)) {
+		if (len >= STACK_TOP32)
+			return -EINVAL;
+
+		if ((flags & MAP_FIXED) && addr > STACK_TOP32 - len)
+			return -EINVAL;
+	} else {
+		if (len >= VA_EXCLUDE_START)
+			return -EINVAL;
+
+		if ((flags & MAP_FIXED) && invalid_64bit_range(addr, len))
+			return -EINVAL;
+	}
+
+	return 0;
+}
+
 /* Linux version of mmap */
 /* Linux version of mmap */
 asmlinkage unsigned long sys_mmap(unsigned long addr, unsigned long len,
 asmlinkage unsigned long sys_mmap(unsigned long addr, unsigned long len,
 	unsigned long prot, unsigned long flags, unsigned long fd,
 	unsigned long prot, unsigned long flags, unsigned long fd,
@@ -563,27 +583,11 @@ asmlinkage unsigned long sys_mmap(unsigned long addr, unsigned long len,
 	}
 	}
 	flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE);
 	flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE);
 	len = PAGE_ALIGN(len);
 	len = PAGE_ALIGN(len);
-	retval = -EINVAL;
-
-	if (test_thread_flag(TIF_32BIT)) {
-		if (len >= STACK_TOP32)
-			goto out_putf;
-
-		if ((flags & MAP_FIXED) && addr > STACK_TOP32 - len)
-			goto out_putf;
-	} else {
-		if (len >= VA_EXCLUDE_START)
-			goto out_putf;
-
-		if ((flags & MAP_FIXED) && invalid_64bit_range(addr, len))
-			goto out_putf;
-	}
 
 
 	down_write(&current->mm->mmap_sem);
 	down_write(&current->mm->mmap_sem);
 	retval = do_mmap(file, addr, len, prot, flags, off);
 	retval = do_mmap(file, addr, len, prot, flags, off);
 	up_write(&current->mm->mmap_sem);
 	up_write(&current->mm->mmap_sem);
 
 
-out_putf:
 	if (file)
 	if (file)
 		fput(file);
 		fput(file);
 out:
 out:

+ 4 - 0
arch/x86_64/Kconfig

@@ -85,6 +85,10 @@ config DMI
 	bool
 	bool
 	default y
 	default y
 
 
+config AUDIT_ARCH
+	bool
+	default y
+
 source "init/Kconfig"
 source "init/Kconfig"
 
 
 
 

+ 26 - 0
arch/x86_64/ia32/audit.c

@@ -9,3 +9,29 @@ unsigned ia32_chattr_class[] = {
 #include <asm-generic/audit_change_attr.h>
 #include <asm-generic/audit_change_attr.h>
 ~0U
 ~0U
 };
 };
+
+unsigned ia32_write_class[] = {
+#include <asm-generic/audit_write.h>
+~0U
+};
+
+unsigned ia32_read_class[] = {
+#include <asm-generic/audit_read.h>
+~0U
+};
+
+int ia32_classify_syscall(unsigned syscall)
+{
+	switch(syscall) {
+	case __NR_open:
+		return 2;
+	case __NR_openat:
+		return 3;
+	case __NR_socketcall:
+		return 4;
+	case __NR_execve:
+		return 5;
+	default:
+		return 1;
+	}
+}

+ 35 - 0
arch/x86_64/kernel/audit.c

@@ -8,19 +8,54 @@ static unsigned dir_class[] = {
 ~0U
 ~0U
 };
 };
 
 
+static unsigned read_class[] = {
+#include <asm-generic/audit_read.h>
+~0U
+};
+
+static unsigned write_class[] = {
+#include <asm-generic/audit_write.h>
+~0U
+};
+
 static unsigned chattr_class[] = {
 static unsigned chattr_class[] = {
 #include <asm-generic/audit_change_attr.h>
 #include <asm-generic/audit_change_attr.h>
 ~0U
 ~0U
 };
 };
 
 
+int audit_classify_syscall(int abi, unsigned syscall)
+{
+#ifdef CONFIG_IA32_EMULATION
+	extern int ia32_classify_syscall(unsigned);
+	if (abi == AUDIT_ARCH_I386)
+		return ia32_classify_syscall(syscall);
+#endif
+	switch(syscall) {
+	case __NR_open:
+		return 2;
+	case __NR_openat:
+		return 3;
+	case __NR_execve:
+		return 5;
+	default:
+		return 0;
+	}
+}
+
 static int __init audit_classes_init(void)
 static int __init audit_classes_init(void)
 {
 {
 #ifdef CONFIG_IA32_EMULATION
 #ifdef CONFIG_IA32_EMULATION
 	extern __u32 ia32_dir_class[];
 	extern __u32 ia32_dir_class[];
+	extern __u32 ia32_write_class[];
+	extern __u32 ia32_read_class[];
 	extern __u32 ia32_chattr_class[];
 	extern __u32 ia32_chattr_class[];
+	audit_register_class(AUDIT_CLASS_WRITE_32, ia32_write_class);
+	audit_register_class(AUDIT_CLASS_READ_32, ia32_read_class);
 	audit_register_class(AUDIT_CLASS_DIR_WRITE_32, ia32_dir_class);
 	audit_register_class(AUDIT_CLASS_DIR_WRITE_32, ia32_dir_class);
 	audit_register_class(AUDIT_CLASS_CHATTR_32, ia32_chattr_class);
 	audit_register_class(AUDIT_CLASS_CHATTR_32, ia32_chattr_class);
 #endif
 #endif
+	audit_register_class(AUDIT_CLASS_WRITE, write_class);
+	audit_register_class(AUDIT_CLASS_READ, read_class);
 	audit_register_class(AUDIT_CLASS_DIR_WRITE, dir_class);
 	audit_register_class(AUDIT_CLASS_DIR_WRITE, dir_class);
 	audit_register_class(AUDIT_CLASS_CHATTR, chattr_class);
 	audit_register_class(AUDIT_CLASS_CHATTR, chattr_class);
 	return 0;
 	return 0;

+ 2 - 0
drivers/ide/ide-proc.c

@@ -376,6 +376,8 @@ static int proc_ide_read_media
 				break;
 				break;
 		case ide_floppy:media = "floppy\n";
 		case ide_floppy:media = "floppy\n";
 				break;
 				break;
+		case ide_optical:media = "optical\n";
+				break;
 		default:	media = "UNKNOWN\n";
 		default:	media = "UNKNOWN\n";
 				break;
 				break;
 	}
 	}

+ 6 - 6
drivers/ide/pci/aec62xx.c

@@ -425,12 +425,12 @@ static int __devinit aec62xx_init_one(struct pci_dev *dev, const struct pci_devi
 	return d->init_setup(dev, d);
 	return d->init_setup(dev, d);
 }
 }
 
 
-static const struct pci_device_id aec62xx_pci_tbl[] = {
-	{ PCI_DEVICE(PCI_VENDOR_ID_ARTOP, PCI_DEVICE_ID_ARTOP_ATP850UF), 0 },
-	{ PCI_DEVICE(PCI_VENDOR_ID_ARTOP, PCI_DEVICE_ID_ARTOP_ATP860), 1 },
-	{ PCI_DEVICE(PCI_VENDOR_ID_ARTOP, PCI_DEVICE_ID_ARTOP_ATP860R), 2 },
-	{ PCI_DEVICE(PCI_VENDOR_ID_ARTOP, PCI_DEVICE_ID_ARTOP_ATP865), 3 },
-	{ PCI_DEVICE(PCI_VENDOR_ID_ARTOP, PCI_DEVICE_ID_ARTOP_ATP865R), 4 },
+static struct pci_device_id aec62xx_pci_tbl[] = {
+	{ PCI_VENDOR_ID_ARTOP, PCI_DEVICE_ID_ARTOP_ATP850UF, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
+	{ PCI_VENDOR_ID_ARTOP, PCI_DEVICE_ID_ARTOP_ATP860,   PCI_ANY_ID, PCI_ANY_ID, 0, 0, 1 },
+	{ PCI_VENDOR_ID_ARTOP, PCI_DEVICE_ID_ARTOP_ATP860R,  PCI_ANY_ID, PCI_ANY_ID, 0, 0, 2 },
+	{ PCI_VENDOR_ID_ARTOP, PCI_DEVICE_ID_ARTOP_ATP865,   PCI_ANY_ID, PCI_ANY_ID, 0, 0, 3 },
+	{ PCI_VENDOR_ID_ARTOP, PCI_DEVICE_ID_ARTOP_ATP865R,  PCI_ANY_ID, PCI_ANY_ID, 0, 0, 4 },
 	{ 0, },
 	{ 0, },
 };
 };
 MODULE_DEVICE_TABLE(pci, aec62xx_pci_tbl);
 MODULE_DEVICE_TABLE(pci, aec62xx_pci_tbl);

+ 5 - 5
drivers/ide/pci/serverworks.c

@@ -649,11 +649,11 @@ static int __devinit svwks_init_one(struct pci_dev *dev, const struct pci_device
 }
 }
 
 
 static struct pci_device_id svwks_pci_tbl[] = {
 static struct pci_device_id svwks_pci_tbl[] = {
-	{ PCI_DEVICE(PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_OSB4IDE), 0},
-	{ PCI_DEVICE(PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_CSB5IDE), 1},
-	{ PCI_DEVICE(PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_CSB6IDE), 2},
-	{ PCI_DEVICE(PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_CSB6IDE2), 3},
-	{ PCI_DEVICE(PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_HT1000IDE), 4},
+	{ PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_OSB4IDE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
+	{ PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_CSB5IDE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 1},
+	{ PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_CSB6IDE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 2},
+	{ PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_CSB6IDE2, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 3},
+	{ PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_HT1000IDE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 4},
 	{ 0, },
 	{ 0, },
 };
 };
 MODULE_DEVICE_TABLE(pci, svwks_pci_tbl);
 MODULE_DEVICE_TABLE(pci, svwks_pci_tbl);

+ 3 - 3
drivers/ide/pci/siimage.c

@@ -1082,10 +1082,10 @@ static int __devinit siimage_init_one(struct pci_dev *dev, const struct pci_devi
 }
 }
 
 
 static struct pci_device_id siimage_pci_tbl[] = {
 static struct pci_device_id siimage_pci_tbl[] = {
-	{ PCI_DEVICE(PCI_VENDOR_ID_CMD, PCI_DEVICE_ID_SII_680), 0},
+	{ PCI_VENDOR_ID_CMD, PCI_DEVICE_ID_SII_680,  PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
 #ifdef CONFIG_BLK_DEV_IDE_SATA
 #ifdef CONFIG_BLK_DEV_IDE_SATA
-	{ PCI_DEVICE(PCI_VENDOR_ID_CMD, PCI_DEVICE_ID_SII_3112), 1},
-	{ PCI_DEVICE(PCI_VENDOR_ID_CMD, PCI_DEVICE_ID_SII_1210SA), 2},
+	{ PCI_VENDOR_ID_CMD, PCI_DEVICE_ID_SII_3112, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 1},
+	{ PCI_VENDOR_ID_CMD, PCI_DEVICE_ID_SII_1210SA, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 2},
 #endif
 #endif
 	{ 0, },
 	{ 0, },
 };
 };

+ 2 - 0
drivers/ide/pci/sis5513.c

@@ -86,6 +86,8 @@ static const struct {
 	u8 chipset_family;
 	u8 chipset_family;
 	u8 flags;
 	u8 flags;
 } SiSHostChipInfo[] = {
 } SiSHostChipInfo[] = {
+	{ "SiS968",	PCI_DEVICE_ID_SI_968,	ATA_133  },
+	{ "SiS966",	PCI_DEVICE_ID_SI_966,	ATA_133  },
 	{ "SiS965",	PCI_DEVICE_ID_SI_965,	ATA_133  },
 	{ "SiS965",	PCI_DEVICE_ID_SI_965,	ATA_133  },
 	{ "SiS745",	PCI_DEVICE_ID_SI_745,	ATA_100  },
 	{ "SiS745",	PCI_DEVICE_ID_SI_745,	ATA_100  },
 	{ "SiS735",	PCI_DEVICE_ID_SI_735,	ATA_100  },
 	{ "SiS735",	PCI_DEVICE_ID_SI_735,	ATA_100  },

+ 1 - 1
drivers/media/Kconfig

@@ -53,7 +53,7 @@ config VIDEO_V4L1_COMPAT
 	  If you are unsure as to whether this is required, answer Y.
 	  If you are unsure as to whether this is required, answer Y.
 
 
 config VIDEO_V4L2
 config VIDEO_V4L2
-	tristate
+	bool
 	default y
 	default y
 
 
 source "drivers/media/video/Kconfig"
 source "drivers/media/video/Kconfig"

+ 2 - 0
drivers/media/common/saa7146_video.c

@@ -1190,6 +1190,7 @@ int saa7146_video_do_ioctl(struct inode *inode, struct file *file, unsigned int
 		}
 		}
 		return err;
 		return err;
 	}
 	}
+#ifdef CONFIG_VIDEO_V4L1_COMPAT
 	case VIDIOCGMBUF:
 	case VIDIOCGMBUF:
 	{
 	{
 		struct video_mbuf *mbuf = arg;
 		struct video_mbuf *mbuf = arg;
@@ -1218,6 +1219,7 @@ int saa7146_video_do_ioctl(struct inode *inode, struct file *file, unsigned int
 		mutex_unlock(&q->lock);
 		mutex_unlock(&q->lock);
 		return 0;
 		return 0;
 	}
 	}
+#endif
 	default:
 	default:
 		return v4l_compat_translate_ioctl(inode,file,cmd,arg,
 		return v4l_compat_translate_ioctl(inode,file,cmd,arg,
 						  saa7146_video_do_ioctl);
 						  saa7146_video_do_ioctl);

+ 1 - 0
drivers/media/dvb/b2c2/Kconfig

@@ -1,6 +1,7 @@
 config DVB_B2C2_FLEXCOP
 config DVB_B2C2_FLEXCOP
 	tristate "Technisat/B2C2 FlexCopII(b) and FlexCopIII adapters"
 	tristate "Technisat/B2C2 FlexCopII(b) and FlexCopIII adapters"
 	depends on DVB_CORE && I2C
 	depends on DVB_CORE && I2C
+	select DVB_PLL
 	select DVB_STV0299
 	select DVB_STV0299
 	select DVB_MT352
 	select DVB_MT352
 	select DVB_MT312
 	select DVB_MT312

+ 1 - 0
drivers/media/dvb/bt8xx/Kconfig

@@ -1,6 +1,7 @@
 config DVB_BT8XX
 config DVB_BT8XX
 	tristate "BT8xx based PCI cards"
 	tristate "BT8xx based PCI cards"
 	depends on DVB_CORE && PCI && I2C && VIDEO_BT848
 	depends on DVB_CORE && PCI && I2C && VIDEO_BT848
+	select DVB_PLL
 	select DVB_MT352
 	select DVB_MT352
 	select DVB_SP887X
 	select DVB_SP887X
 	select DVB_NXT6000
 	select DVB_NXT6000

+ 1 - 0
drivers/media/dvb/dvb-usb/Kconfig

@@ -2,6 +2,7 @@ config DVB_USB
 	tristate "Support for various USB DVB devices"
 	tristate "Support for various USB DVB devices"
 	depends on DVB_CORE && USB && I2C
 	depends on DVB_CORE && USB && I2C
 	select FW_LOADER
 	select FW_LOADER
+	select DVB_PLL
 	help
 	help
 	  By enabling this you will be able to choose the various supported
 	  By enabling this you will be able to choose the various supported
 	  USB1.1 and USB2.0 DVB devices.
 	  USB1.1 and USB2.0 DVB devices.

+ 32 - 28
drivers/media/dvb/frontends/Kconfig

@@ -6,43 +6,43 @@ comment "DVB-S (satellite) frontends"
 
 
 config DVB_STV0299
 config DVB_STV0299
 	tristate "ST STV0299 based"
 	tristate "ST STV0299 based"
-	depends on DVB_CORE
+	depends on DVB_CORE && I2C
 	help
 	help
 	  A DVB-S tuner module. Say Y when you want to support this frontend.
 	  A DVB-S tuner module. Say Y when you want to support this frontend.
 
 
 config DVB_CX24110
 config DVB_CX24110
 	tristate "Conexant CX24110 based"
 	tristate "Conexant CX24110 based"
-	depends on DVB_CORE
+	depends on DVB_CORE && I2C
 	help
 	help
 	  A DVB-S tuner module. Say Y when you want to support this frontend.
 	  A DVB-S tuner module. Say Y when you want to support this frontend.
 
 
 config DVB_CX24123
 config DVB_CX24123
 	tristate "Conexant CX24123 based"
 	tristate "Conexant CX24123 based"
-	depends on DVB_CORE
+	depends on DVB_CORE && I2C
 	help
 	help
 	  A DVB-S tuner module. Say Y when you want to support this frontend.
 	  A DVB-S tuner module. Say Y when you want to support this frontend.
 
 
 config DVB_TDA8083
 config DVB_TDA8083
 	tristate "Philips TDA8083 based"
 	tristate "Philips TDA8083 based"
-	depends on DVB_CORE
+	depends on DVB_CORE && I2C
 	help
 	help
 	  A DVB-S tuner module. Say Y when you want to support this frontend.
 	  A DVB-S tuner module. Say Y when you want to support this frontend.
 
 
 config DVB_MT312
 config DVB_MT312
 	tristate "Zarlink VP310/MT312 based"
 	tristate "Zarlink VP310/MT312 based"
-	depends on DVB_CORE
+	depends on DVB_CORE && I2C
 	help
 	help
 	  A DVB-S tuner module. Say Y when you want to support this frontend.
 	  A DVB-S tuner module. Say Y when you want to support this frontend.
 
 
 config DVB_VES1X93
 config DVB_VES1X93
 	tristate "VLSI VES1893 or VES1993 based"
 	tristate "VLSI VES1893 or VES1993 based"
-	depends on DVB_CORE
+	depends on DVB_CORE && I2C
 	help
 	help
 	  A DVB-S tuner module. Say Y when you want to support this frontend.
 	  A DVB-S tuner module. Say Y when you want to support this frontend.
 
 
 config DVB_S5H1420
 config DVB_S5H1420
 	tristate "Samsung S5H1420 based"
 	tristate "Samsung S5H1420 based"
-	depends on DVB_CORE
+	depends on DVB_CORE && I2C
 	help
 	help
 	  A DVB-S tuner module. Say Y when you want to support this frontend.
 	  A DVB-S tuner module. Say Y when you want to support this frontend.
 
 
@@ -51,7 +51,7 @@ comment "DVB-T (terrestrial) frontends"
 
 
 config DVB_SP8870
 config DVB_SP8870
 	tristate "Spase sp8870 based"
 	tristate "Spase sp8870 based"
-	depends on DVB_CORE
+	depends on DVB_CORE && I2C
 	select FW_LOADER
 	select FW_LOADER
 	help
 	help
 	  A DVB-T tuner module. Say Y when you want to support this frontend.
 	  A DVB-T tuner module. Say Y when you want to support this frontend.
@@ -63,7 +63,7 @@ config DVB_SP8870
 
 
 config DVB_SP887X
 config DVB_SP887X
 	tristate "Spase sp887x based"
 	tristate "Spase sp887x based"
-	depends on DVB_CORE
+	depends on DVB_CORE && I2C
 	select FW_LOADER
 	select FW_LOADER
 	help
 	help
 	  A DVB-T tuner module. Say Y when you want to support this frontend.
 	  A DVB-T tuner module. Say Y when you want to support this frontend.
@@ -75,25 +75,25 @@ config DVB_SP887X
 
 
 config DVB_CX22700
 config DVB_CX22700
 	tristate "Conexant CX22700 based"
 	tristate "Conexant CX22700 based"
-	depends on DVB_CORE
+	depends on DVB_CORE && I2C
 	help
 	help
 	  A DVB-T tuner module. Say Y when you want to support this frontend.
 	  A DVB-T tuner module. Say Y when you want to support this frontend.
 
 
 config DVB_CX22702
 config DVB_CX22702
 	tristate "Conexant cx22702 demodulator (OFDM)"
 	tristate "Conexant cx22702 demodulator (OFDM)"
-	depends on DVB_CORE
+	depends on DVB_CORE && I2C
 	help
 	help
 	  A DVB-T tuner module. Say Y when you want to support this frontend.
 	  A DVB-T tuner module. Say Y when you want to support this frontend.
 
 
 config DVB_L64781
 config DVB_L64781
 	tristate "LSI L64781"
 	tristate "LSI L64781"
-	depends on DVB_CORE
+	depends on DVB_CORE && I2C
 	help
 	help
 	  A DVB-T tuner module. Say Y when you want to support this frontend.
 	  A DVB-T tuner module. Say Y when you want to support this frontend.
 
 
 config DVB_TDA1004X
 config DVB_TDA1004X
 	tristate "Philips TDA10045H/TDA10046H based"
 	tristate "Philips TDA10045H/TDA10046H based"
-	depends on DVB_CORE
+	depends on DVB_CORE && I2C
 	select FW_LOADER
 	select FW_LOADER
 	help
 	help
 	  A DVB-T tuner module. Say Y when you want to support this frontend.
 	  A DVB-T tuner module. Say Y when you want to support this frontend.
@@ -106,32 +106,32 @@ config DVB_TDA1004X
 
 
 config DVB_NXT6000
 config DVB_NXT6000
 	tristate "NxtWave Communications NXT6000 based"
 	tristate "NxtWave Communications NXT6000 based"
-	depends on DVB_CORE
+	depends on DVB_CORE && I2C
 	help
 	help
 	  A DVB-T tuner module. Say Y when you want to support this frontend.
 	  A DVB-T tuner module. Say Y when you want to support this frontend.
 
 
 config DVB_MT352
 config DVB_MT352
 	tristate "Zarlink MT352 based"
 	tristate "Zarlink MT352 based"
-	depends on DVB_CORE
+	depends on DVB_CORE && I2C
 	help
 	help
 	  A DVB-T tuner module. Say Y when you want to support this frontend.
 	  A DVB-T tuner module. Say Y when you want to support this frontend.
 
 
 config DVB_ZL10353
 config DVB_ZL10353
 	tristate "Zarlink ZL10353 based"
 	tristate "Zarlink ZL10353 based"
-	depends on DVB_CORE
+	depends on DVB_CORE && I2C
 	help
 	help
 	  A DVB-T tuner module. Say Y when you want to support this frontend.
 	  A DVB-T tuner module. Say Y when you want to support this frontend.
 
 
 config DVB_DIB3000MB
 config DVB_DIB3000MB
 	tristate "DiBcom 3000M-B"
 	tristate "DiBcom 3000M-B"
-	depends on DVB_CORE
+	depends on DVB_CORE && I2C
 	help
 	help
 	  A DVB-T tuner module. Designed for mobile usage. Say Y when you want
 	  A DVB-T tuner module. Designed for mobile usage. Say Y when you want
 	  to support this frontend.
 	  to support this frontend.
 
 
 config DVB_DIB3000MC
 config DVB_DIB3000MC
 	tristate "DiBcom 3000P/M-C"
 	tristate "DiBcom 3000P/M-C"
-	depends on DVB_CORE
+	depends on DVB_CORE && I2C
 	help
 	help
 	  A DVB-T tuner module. Designed for mobile usage. Say Y when you want
 	  A DVB-T tuner module. Designed for mobile usage. Say Y when you want
 	  to support this frontend.
 	  to support this frontend.
@@ -141,19 +141,19 @@ comment "DVB-C (cable) frontends"
 
 
 config DVB_VES1820
 config DVB_VES1820
 	tristate "VLSI VES1820 based"
 	tristate "VLSI VES1820 based"
-	depends on DVB_CORE
+	depends on DVB_CORE && I2C
 	help
 	help
 	  A DVB-C tuner module. Say Y when you want to support this frontend.
 	  A DVB-C tuner module. Say Y when you want to support this frontend.
 
 
 config DVB_TDA10021
 config DVB_TDA10021
 	tristate "Philips TDA10021 based"
 	tristate "Philips TDA10021 based"
-	depends on DVB_CORE
+	depends on DVB_CORE && I2C
 	help
 	help
 	  A DVB-C tuner module. Say Y when you want to support this frontend.
 	  A DVB-C tuner module. Say Y when you want to support this frontend.
 
 
 config DVB_STV0297
 config DVB_STV0297
 	tristate "ST STV0297 based"
 	tristate "ST STV0297 based"
-	depends on DVB_CORE
+	depends on DVB_CORE && I2C
 	help
 	help
 	  A DVB-C tuner module. Say Y when you want to support this frontend.
 	  A DVB-C tuner module. Say Y when you want to support this frontend.
 
 
@@ -162,7 +162,7 @@ comment "ATSC (North American/Korean Terrestrial/Cable DTV) frontends"
 
 
 config DVB_NXT200X
 config DVB_NXT200X
 	tristate "NxtWave Communications NXT2002/NXT2004 based"
 	tristate "NxtWave Communications NXT2002/NXT2004 based"
-	depends on DVB_CORE
+	depends on DVB_CORE && I2C
 	select FW_LOADER
 	select FW_LOADER
 	help
 	help
 	  An ATSC 8VSB and QAM64/256 tuner module. Say Y when you want
 	  An ATSC 8VSB and QAM64/256 tuner module. Say Y when you want
@@ -176,7 +176,7 @@ config DVB_NXT200X
 
 
 config DVB_OR51211
 config DVB_OR51211
 	tristate "Oren OR51211 based"
 	tristate "Oren OR51211 based"
-	depends on DVB_CORE
+	depends on DVB_CORE && I2C
 	select FW_LOADER
 	select FW_LOADER
 	help
 	help
 	  An ATSC 8VSB tuner module. Say Y when you want to support this frontend.
 	  An ATSC 8VSB tuner module. Say Y when you want to support this frontend.
@@ -188,7 +188,7 @@ config DVB_OR51211
 
 
 config DVB_OR51132
 config DVB_OR51132
 	tristate "Oren OR51132 based"
 	tristate "Oren OR51132 based"
-	depends on DVB_CORE
+	depends on DVB_CORE && I2C
 	select FW_LOADER
 	select FW_LOADER
 	help
 	help
 	  An ATSC 8VSB and QAM64/256 tuner module. Say Y when you want
 	  An ATSC 8VSB and QAM64/256 tuner module. Say Y when you want
@@ -203,7 +203,7 @@ config DVB_OR51132
 
 
 config DVB_BCM3510
 config DVB_BCM3510
 	tristate "Broadcom BCM3510"
 	tristate "Broadcom BCM3510"
-	depends on DVB_CORE
+	depends on DVB_CORE && I2C
 	select FW_LOADER
 	select FW_LOADER
 	help
 	help
 	  An ATSC 8VSB/16VSB and QAM64/256 tuner module. Say Y when you want to
 	  An ATSC 8VSB/16VSB and QAM64/256 tuner module. Say Y when you want to
@@ -211,7 +211,7 @@ config DVB_BCM3510
 
 
 config DVB_LGDT330X
 config DVB_LGDT330X
 	tristate "LG Electronics LGDT3302/LGDT3303 based"
 	tristate "LG Electronics LGDT3302/LGDT3303 based"
-	depends on DVB_CORE
+	depends on DVB_CORE && I2C
 	help
 	help
 	  An ATSC 8VSB and QAM64/256 tuner module. Say Y when you want
 	  An ATSC 8VSB and QAM64/256 tuner module. Say Y when you want
 	  to support this frontend.
 	  to support this frontend.
@@ -220,15 +220,19 @@ config DVB_LGDT330X
 comment "Miscellaneous devices"
 comment "Miscellaneous devices"
 	depends on DVB_CORE
 	depends on DVB_CORE
 
 
+config DVB_PLL
+	tristate
+	depends on DVB_CORE && I2C
+
 config DVB_LNBP21
 config DVB_LNBP21
 	tristate "LNBP21 SEC controller"
 	tristate "LNBP21 SEC controller"
-	depends on DVB_CORE
+	depends on DVB_CORE && I2C
 	help
 	help
 	  An SEC control chip.
 	  An SEC control chip.
 
 
 config DVB_ISL6421
 config DVB_ISL6421
 	tristate "ISL6421 SEC controller"
 	tristate "ISL6421 SEC controller"
-	depends on DVB_CORE
+	depends on DVB_CORE && I2C
 	help
 	help
 	  An SEC control chip.
 	  An SEC control chip.
 
 

+ 1 - 1
drivers/media/dvb/frontends/Makefile

@@ -4,7 +4,7 @@
 
 
 EXTRA_CFLAGS = -Idrivers/media/dvb/dvb-core/
 EXTRA_CFLAGS = -Idrivers/media/dvb/dvb-core/
 
 
-obj-$(CONFIG_DVB_CORE) += dvb-pll.o
+obj-$(CONFIG_DVB_PLL) += dvb-pll.o
 obj-$(CONFIG_DVB_STV0299) += stv0299.o
 obj-$(CONFIG_DVB_STV0299) += stv0299.o
 obj-$(CONFIG_DVB_SP8870) += sp8870.o
 obj-$(CONFIG_DVB_SP8870) += sp8870.o
 obj-$(CONFIG_DVB_CX22700) += cx22700.o
 obj-$(CONFIG_DVB_CX22700) += cx22700.o

+ 1 - 0
drivers/media/dvb/pluto2/Kconfig

@@ -2,6 +2,7 @@ config DVB_PLUTO2
 	tristate "Pluto2 cards"
 	tristate "Pluto2 cards"
 	depends on DVB_CORE && PCI && I2C
 	depends on DVB_CORE && PCI && I2C
 	select I2C_ALGOBIT
 	select I2C_ALGOBIT
+	select DVB_PLL
 	select DVB_TDA1004X
 	select DVB_TDA1004X
 	help
 	help
 	  Support for PCI cards based on the Pluto2 FPGA like the Satelco
 	  Support for PCI cards based on the Pluto2 FPGA like the Satelco

+ 5 - 0
drivers/media/dvb/ttpci/Kconfig

@@ -3,6 +3,7 @@ config DVB_AV7110
 	depends on DVB_CORE && PCI && I2C && VIDEO_V4L1
 	depends on DVB_CORE && PCI && I2C && VIDEO_V4L1
 	select FW_LOADER
 	select FW_LOADER
 	select VIDEO_SAA7146_VV
 	select VIDEO_SAA7146_VV
+	select DVB_PLL
 	select DVB_VES1820
 	select DVB_VES1820
 	select DVB_VES1X93
 	select DVB_VES1X93
 	select DVB_STV0299
 	select DVB_STV0299
@@ -61,6 +62,7 @@ config DVB_BUDGET
 	tristate "Budget cards"
 	tristate "Budget cards"
 	depends on DVB_CORE && PCI && I2C && VIDEO_V4L1
 	depends on DVB_CORE && PCI && I2C && VIDEO_V4L1
 	select VIDEO_SAA7146
 	select VIDEO_SAA7146
+	select DVB_PLL
 	select DVB_STV0299
 	select DVB_STV0299
 	select DVB_VES1X93
 	select DVB_VES1X93
 	select DVB_VES1820
 	select DVB_VES1820
@@ -83,6 +85,7 @@ config DVB_BUDGET_CI
 	tristate "Budget cards with onboard CI connector"
 	tristate "Budget cards with onboard CI connector"
 	depends on DVB_CORE && PCI && I2C && VIDEO_V4L1
 	depends on DVB_CORE && PCI && I2C && VIDEO_V4L1
 	select VIDEO_SAA7146
 	select VIDEO_SAA7146
+	select DVB_PLL
 	select DVB_STV0297
 	select DVB_STV0297
 	select DVB_STV0299
 	select DVB_STV0299
 	select DVB_TDA1004X
 	select DVB_TDA1004X
@@ -104,6 +107,7 @@ config DVB_BUDGET_AV
 	tristate "Budget cards with analog video inputs"
 	tristate "Budget cards with analog video inputs"
 	depends on DVB_CORE && PCI && I2C && VIDEO_V4L1
 	depends on DVB_CORE && PCI && I2C && VIDEO_V4L1
 	select VIDEO_SAA7146_VV
 	select VIDEO_SAA7146_VV
+	select DVB_PLL
 	select DVB_STV0299
 	select DVB_STV0299
 	select DVB_TDA1004X
 	select DVB_TDA1004X
 	select DVB_TDA10021
 	select DVB_TDA10021
@@ -122,6 +126,7 @@ config DVB_BUDGET_PATCH
 	tristate "AV7110 cards with Budget Patch"
 	tristate "AV7110 cards with Budget Patch"
 	depends on DVB_CORE && DVB_BUDGET && VIDEO_V4L1
 	depends on DVB_CORE && DVB_BUDGET && VIDEO_V4L1
 	select DVB_AV7110
 	select DVB_AV7110
+	select DVB_PLL
 	select DVB_STV0299
 	select DVB_STV0299
 	select DVB_VES1X93
 	select DVB_VES1X93
 	select DVB_TDA8083
 	select DVB_TDA8083

+ 2 - 1
drivers/media/dvb/ttusb-budget/Kconfig

@@ -1,6 +1,7 @@
 config DVB_TTUSB_BUDGET
 config DVB_TTUSB_BUDGET
 	tristate "Technotrend/Hauppauge Nova-USB devices"
 	tristate "Technotrend/Hauppauge Nova-USB devices"
-	depends on DVB_CORE && USB
+	depends on DVB_CORE && USB && I2C
+	select DVB_PLL
 	select DVB_CX22700
 	select DVB_CX22700
 	select DVB_TDA1004X
 	select DVB_TDA1004X
 	select DVB_VES1820
 	select DVB_VES1820

+ 4 - 4
drivers/media/video/Kconfig

@@ -260,7 +260,7 @@ source "drivers/media/video/saa7134/Kconfig"
 
 
 config VIDEO_MXB
 config VIDEO_MXB
 	tristate "Siemens-Nixdorf 'Multimedia eXtension Board'"
 	tristate "Siemens-Nixdorf 'Multimedia eXtension Board'"
-	depends on PCI && VIDEO_V4L1
+	depends on PCI && VIDEO_V4L1 && I2C
 	select VIDEO_SAA7146_VV
 	select VIDEO_SAA7146_VV
 	select VIDEO_TUNER
 	select VIDEO_TUNER
 	---help---
 	---help---
@@ -272,7 +272,7 @@ config VIDEO_MXB
 
 
 config VIDEO_DPC
 config VIDEO_DPC
 	tristate "Philips-Semiconductors 'dpc7146 demonstration board'"
 	tristate "Philips-Semiconductors 'dpc7146 demonstration board'"
-	depends on PCI && VIDEO_V4L1
+	depends on PCI && VIDEO_V4L1 && I2C
 	select VIDEO_SAA7146_VV
 	select VIDEO_SAA7146_VV
 	select VIDEO_V4L2
 	select VIDEO_V4L2
 	---help---
 	---help---
@@ -287,7 +287,7 @@ config VIDEO_DPC
 
 
 config VIDEO_HEXIUM_ORION
 config VIDEO_HEXIUM_ORION
 	tristate "Hexium HV-PCI6 and Orion frame grabber"
 	tristate "Hexium HV-PCI6 and Orion frame grabber"
-	depends on PCI && VIDEO_V4L1
+	depends on PCI && VIDEO_V4L1 && I2C
 	select VIDEO_SAA7146_VV
 	select VIDEO_SAA7146_VV
 	select VIDEO_V4L2
 	select VIDEO_V4L2
 	---help---
 	---help---
@@ -299,7 +299,7 @@ config VIDEO_HEXIUM_ORION
 
 
 config VIDEO_HEXIUM_GEMINI
 config VIDEO_HEXIUM_GEMINI
 	tristate "Hexium Gemini frame grabber"
 	tristate "Hexium Gemini frame grabber"
-	depends on PCI && VIDEO_V4L1
+	depends on PCI && VIDEO_V4L1 && I2C
 	select VIDEO_SAA7146_VV
 	select VIDEO_SAA7146_VV
 	select VIDEO_V4L2
 	select VIDEO_V4L2
 	---help---
 	---help---

+ 1 - 0
drivers/media/video/bt8xx/bttv-input.c

@@ -303,6 +303,7 @@ int bttv_input_init(struct bttv *btv)
 		ir->mask_keyup   = 0x010000;
 		ir->mask_keyup   = 0x010000;
 		ir->polling      = 50; // ms
 		ir->polling      = 50; // ms
 		break;
 		break;
+	case BTTV_BOARD_PV_M4900:
 	case BTTV_BOARD_PV_BT878P_9B:
 	case BTTV_BOARD_PV_BT878P_9B:
 	case BTTV_BOARD_PV_BT878P_PLUS:
 	case BTTV_BOARD_PV_BT878P_PLUS:
 		ir_codes         = ir_codes_pixelview;
 		ir_codes         = ir_codes_pixelview;

+ 1 - 0
drivers/media/video/cx88/Kconfig

@@ -51,6 +51,7 @@ config VIDEO_CX88_DVB
 	tristate "DVB/ATSC Support for cx2388x based TV cards"
 	tristate "DVB/ATSC Support for cx2388x based TV cards"
 	depends on VIDEO_CX88 && DVB_CORE
 	depends on VIDEO_CX88 && DVB_CORE
 	select VIDEO_BUF_DVB
 	select VIDEO_BUF_DVB
+	select DVB_PLL
 	---help---
 	---help---
 	  This adds support for DVB/ATSC cards based on the
 	  This adds support for DVB/ATSC cards based on the
 	  Conexant 2388x chip.
 	  Conexant 2388x chip.

+ 1 - 0
drivers/media/video/saa7134/Kconfig

@@ -40,6 +40,7 @@ config VIDEO_SAA7134_DVB
 	depends on VIDEO_SAA7134 && DVB_CORE
 	depends on VIDEO_SAA7134 && DVB_CORE
 	select VIDEO_BUF_DVB
 	select VIDEO_BUF_DVB
 	select FW_LOADER
 	select FW_LOADER
+	select DVB_PLL
 	---help---
 	---help---
 	  This adds support for DVB cards based on the
 	  This adds support for DVB cards based on the
 	  Philips saa7134 chip.
 	  Philips saa7134 chip.

+ 8 - 2
drivers/media/video/tuner-types.c

@@ -926,11 +926,17 @@ static struct tuner_params tuner_lg_tdvs_h06xf_params[] = {
 
 
 /* ------------ TUNER_YMEC_TVF66T5_B_DFF - Philips PAL ------------ */
 /* ------------ TUNER_YMEC_TVF66T5_B_DFF - Philips PAL ------------ */
 
 
+static struct tuner_range tuner_ymec_tvf66t5_b_dff_pal_ranges[] = {
+	{ 16 * 160.25 /*MHz*/, 0x8e, 0x01, },
+	{ 16 * 464.25 /*MHz*/, 0x8e, 0x02, },
+	{ 16 * 999.99        , 0x8e, 0x08, },
+};
+
 static struct tuner_params tuner_ymec_tvf66t5_b_dff_params[] = {
 static struct tuner_params tuner_ymec_tvf66t5_b_dff_params[] = {
 	{
 	{
 		.type   = TUNER_PARAM_TYPE_PAL,
 		.type   = TUNER_PARAM_TYPE_PAL,
-		.ranges = tuner_tena_9533_di_pal_ranges,
-		.count  = ARRAY_SIZE(tuner_tena_9533_di_pal_ranges),
+		.ranges = tuner_ymec_tvf66t5_b_dff_pal_ranges,
+		.count  = ARRAY_SIZE(tuner_ymec_tvf66t5_b_dff_pal_ranges),
 	},
 	},
 };
 };
 
 

+ 1 - 1
drivers/media/video/zoran.h

@@ -267,7 +267,7 @@ struct zoran_v4l_settings {
 };
 };
 
 
 /* whoops, this one is undeclared if !v4l2 */
 /* whoops, this one is undeclared if !v4l2 */
-#ifndef HAVE_V4L2
+#ifndef CONFIG_VIDEO_V4L2
 struct v4l2_jpegcompression {
 struct v4l2_jpegcompression {
 	int quality;
 	int quality;
 	int APPn;
 	int APPn;

+ 11 - 11
drivers/media/video/zoran_driver.c

@@ -86,7 +86,7 @@
 #include "zoran_device.h"
 #include "zoran_device.h"
 #include "zoran_card.h"
 #include "zoran_card.h"
 
 
-#ifdef HAVE_V4L2
+#ifdef CONFIG_VIDEO_V4L2
 	/* we declare some card type definitions here, they mean
 	/* we declare some card type definitions here, they mean
 	 * the same as the v4l1 ZORAN_VID_TYPE above, except it's v4l2 */
 	 * the same as the v4l1 ZORAN_VID_TYPE above, except it's v4l2 */
 #define ZORAN_V4L2_VID_FLAGS ( \
 #define ZORAN_V4L2_VID_FLAGS ( \
@@ -103,7 +103,7 @@ const struct zoran_format zoran_formats[] = {
 	{
 	{
 		.name = "15-bit RGB",
 		.name = "15-bit RGB",
 		.palette = VIDEO_PALETTE_RGB555,
 		.palette = VIDEO_PALETTE_RGB555,
-#ifdef HAVE_V4L2
+#ifdef CONFIG_VIDEO_V4L2
 #ifdef __LITTLE_ENDIAN
 #ifdef __LITTLE_ENDIAN
 		.fourcc = V4L2_PIX_FMT_RGB555,
 		.fourcc = V4L2_PIX_FMT_RGB555,
 #else
 #else
@@ -117,7 +117,7 @@ const struct zoran_format zoran_formats[] = {
 	}, {
 	}, {
 		.name = "16-bit RGB",
 		.name = "16-bit RGB",
 		.palette = VIDEO_PALETTE_RGB565,
 		.palette = VIDEO_PALETTE_RGB565,
-#ifdef HAVE_V4L2
+#ifdef CONFIG_VIDEO_V4L2
 #ifdef __LITTLE_ENDIAN
 #ifdef __LITTLE_ENDIAN
 		.fourcc = V4L2_PIX_FMT_RGB565,
 		.fourcc = V4L2_PIX_FMT_RGB565,
 #else
 #else
@@ -131,7 +131,7 @@ const struct zoran_format zoran_formats[] = {
 	}, {
 	}, {
 		.name = "24-bit RGB",
 		.name = "24-bit RGB",
 		.palette = VIDEO_PALETTE_RGB24,
 		.palette = VIDEO_PALETTE_RGB24,
-#ifdef HAVE_V4L2
+#ifdef CONFIG_VIDEO_V4L2
 #ifdef __LITTLE_ENDIAN
 #ifdef __LITTLE_ENDIAN
 		.fourcc = V4L2_PIX_FMT_BGR24,
 		.fourcc = V4L2_PIX_FMT_BGR24,
 #else
 #else
@@ -145,7 +145,7 @@ const struct zoran_format zoran_formats[] = {
 	}, {
 	}, {
 		.name = "32-bit RGB",
 		.name = "32-bit RGB",
 		.palette = VIDEO_PALETTE_RGB32,
 		.palette = VIDEO_PALETTE_RGB32,
-#ifdef HAVE_V4L2
+#ifdef CONFIG_VIDEO_V4L2
 #ifdef __LITTLE_ENDIAN
 #ifdef __LITTLE_ENDIAN
 		.fourcc = V4L2_PIX_FMT_BGR32,
 		.fourcc = V4L2_PIX_FMT_BGR32,
 #else
 #else
@@ -159,7 +159,7 @@ const struct zoran_format zoran_formats[] = {
 	}, {
 	}, {
 		.name = "4:2:2, packed, YUYV",
 		.name = "4:2:2, packed, YUYV",
 		.palette = VIDEO_PALETTE_YUV422,
 		.palette = VIDEO_PALETTE_YUV422,
-#ifdef HAVE_V4L2
+#ifdef CONFIG_VIDEO_V4L2
 		.fourcc = V4L2_PIX_FMT_YUYV,
 		.fourcc = V4L2_PIX_FMT_YUYV,
 		.colorspace = V4L2_COLORSPACE_SMPTE170M,
 		.colorspace = V4L2_COLORSPACE_SMPTE170M,
 #endif
 #endif
@@ -169,7 +169,7 @@ const struct zoran_format zoran_formats[] = {
 	}, {
 	}, {
 		.name = "Hardware-encoded Motion-JPEG",
 		.name = "Hardware-encoded Motion-JPEG",
 		.palette = -1,
 		.palette = -1,
-#ifdef HAVE_V4L2
+#ifdef CONFIG_VIDEO_V4L2
 		.fourcc = V4L2_PIX_FMT_MJPEG,
 		.fourcc = V4L2_PIX_FMT_MJPEG,
 		.colorspace = V4L2_COLORSPACE_SMPTE170M,
 		.colorspace = V4L2_COLORSPACE_SMPTE170M,
 #endif
 #endif
@@ -210,7 +210,7 @@ static int lock_norm = 0;	/* 1=Don't change TV standard (norm) */
 module_param(lock_norm, int, 0);
 module_param(lock_norm, int, 0);
 MODULE_PARM_DESC(lock_norm, "Users can't change norm");
 MODULE_PARM_DESC(lock_norm, "Users can't change norm");
 
 
-#ifdef HAVE_V4L2
+#ifdef CONFIG_VIDEO_V4L2
 	/* small helper function for calculating buffersizes for v4l2
 	/* small helper function for calculating buffersizes for v4l2
 	 * we calculate the nearest higher power-of-two, which
 	 * we calculate the nearest higher power-of-two, which
 	 * will be the recommended buffersize */
 	 * will be the recommended buffersize */
@@ -1761,7 +1761,7 @@ setup_overlay (struct file *file,
 	return wait_grab_pending(zr);
 	return wait_grab_pending(zr);
 }
 }
 
 
-#ifdef HAVE_V4L2
+#ifdef CONFIG_VIDEO_V4L2
 	/* get the status of a buffer in the clients buffer queue */
 	/* get the status of a buffer in the clients buffer queue */
 static int
 static int
 zoran_v4l2_buffer_status (struct file        *file,
 zoran_v4l2_buffer_status (struct file        *file,
@@ -2676,7 +2676,7 @@ zoran_do_ioctl (struct inode *inode,
 	}
 	}
 		break;
 		break;
 
 
-#ifdef HAVE_V4L2
+#ifdef CONFIG_VIDEO_V4L2
 
 
 		/* The new video4linux2 capture interface - much nicer than video4linux1, since
 		/* The new video4linux2 capture interface - much nicer than video4linux1, since
 		 * it allows for integrating the JPEG capturing calls inside standard v4l2
 		 * it allows for integrating the JPEG capturing calls inside standard v4l2
@@ -4689,7 +4689,7 @@ static struct file_operations zoran_fops = {
 struct video_device zoran_template __devinitdata = {
 struct video_device zoran_template __devinitdata = {
 	.name = ZORAN_NAME,
 	.name = ZORAN_NAME,
 	.type = ZORAN_VID_TYPE,
 	.type = ZORAN_VID_TYPE,
-#ifdef HAVE_V4L2
+#ifdef CONFIG_VIDEO_V4L2
 	.type2 = ZORAN_V4L2_VID_FLAGS,
 	.type2 = ZORAN_V4L2_VID_FLAGS,
 #endif
 #endif
 	.hardware = ZORAN_HARDWARE,
 	.hardware = ZORAN_HARDWARE,

+ 35 - 34
drivers/mmc/imxmmc.c

@@ -91,6 +91,8 @@ struct imxmci_host {
 	int			dma_allocated;
 	int			dma_allocated;
 
 
 	unsigned char		actual_bus_width;
 	unsigned char		actual_bus_width;
+
+	int			prev_cmd_code;
 };
 };
 
 
 #define IMXMCI_PEND_IRQ_b	0
 #define IMXMCI_PEND_IRQ_b	0
@@ -248,16 +250,14 @@ static void imxmci_setup_data(struct imxmci_host *host, struct mmc_data *data)
 	 * partial FIFO fills and reads. The length has to be rounded up to burst size multiple.
 	 * partial FIFO fills and reads. The length has to be rounded up to burst size multiple.
 	 * This is required for SCR read at least.
 	 * This is required for SCR read at least.
 	 */
 	 */
-	if (datasz < 64) {
+	if (datasz < 512) {
 		host->dma_size = datasz;
 		host->dma_size = datasz;
 		if (data->flags & MMC_DATA_READ) {
 		if (data->flags & MMC_DATA_READ) {
 			host->dma_dir = DMA_FROM_DEVICE;
 			host->dma_dir = DMA_FROM_DEVICE;
 
 
 			/* Hack to enable read SCR */
 			/* Hack to enable read SCR */
-			if(datasz < 16) {
-				MMC_NOB = 1;
-				MMC_BLK_LEN = 16;
-			}
+			MMC_NOB = 1;
+			MMC_BLK_LEN = 512;
 		} else {
 		} else {
 			host->dma_dir = DMA_TO_DEVICE;
 			host->dma_dir = DMA_TO_DEVICE;
 		}
 		}
@@ -409,6 +409,9 @@ static void imxmci_finish_request(struct imxmci_host *host, struct mmc_request *
 
 
 	spin_unlock_irqrestore(&host->lock, flags);
 	spin_unlock_irqrestore(&host->lock, flags);
 
 
+	if(req && req->cmd)
+		host->prev_cmd_code = req->cmd->opcode;
+
 	host->req = NULL;
 	host->req = NULL;
 	host->cmd = NULL;
 	host->cmd = NULL;
 	host->data = NULL;
 	host->data = NULL;
@@ -553,7 +556,6 @@ static int imxmci_cpu_driven_data(struct imxmci_host *host, unsigned int *pstat)
 {
 {
 	int i;
 	int i;
 	int burst_len;
 	int burst_len;
-	int flush_len;
 	int trans_done = 0;
 	int trans_done = 0;
 	unsigned int stat = *pstat;
 	unsigned int stat = *pstat;
 
 
@@ -566,44 +568,43 @@ static int imxmci_cpu_driven_data(struct imxmci_host *host, unsigned int *pstat)
 	dev_dbg(mmc_dev(host->mmc), "imxmci_cpu_driven_data running STATUS = 0x%x\n",
 	dev_dbg(mmc_dev(host->mmc), "imxmci_cpu_driven_data running STATUS = 0x%x\n",
 		stat);
 		stat);
 
 
+	udelay(20);	/* required for clocks < 8MHz*/
+
 	if(host->dma_dir == DMA_FROM_DEVICE) {
 	if(host->dma_dir == DMA_FROM_DEVICE) {
 		imxmci_busy_wait_for_status(host, &stat,
 		imxmci_busy_wait_for_status(host, &stat,
 				STATUS_APPL_BUFF_FF | STATUS_DATA_TRANS_DONE,
 				STATUS_APPL_BUFF_FF | STATUS_DATA_TRANS_DONE,
-				20, "imxmci_cpu_driven_data read");
+				50, "imxmci_cpu_driven_data read");
 
 
 		while((stat & (STATUS_APPL_BUFF_FF |  STATUS_DATA_TRANS_DONE)) &&
 		while((stat & (STATUS_APPL_BUFF_FF |  STATUS_DATA_TRANS_DONE)) &&
-		      (host->data_cnt < host->dma_size)) {
-			if(burst_len >= host->dma_size - host->data_cnt) {
-				flush_len = burst_len;
-				burst_len = host->dma_size - host->data_cnt;
-				flush_len -= burst_len;
-				host->data_cnt = host->dma_size;
-				trans_done = 1;
-			} else {
-				flush_len = 0;
-				host->data_cnt += burst_len;
-			}
+		      (host->data_cnt < 512)) {
+
+			udelay(20);	/* required for clocks < 8MHz*/
 
 
 			for(i = burst_len; i>=2 ; i-=2) {
 			for(i = burst_len; i>=2 ; i-=2) {
-				*(host->data_ptr++) = MMC_BUFFER_ACCESS;
-				udelay(20);	/* required for clocks < 8MHz*/
+				u16 data;
+				data = MMC_BUFFER_ACCESS;
+				udelay(10);	/* required for clocks < 8MHz*/
+				if(host->data_cnt+2 <= host->dma_size) {
+					*(host->data_ptr++) = data;
+				} else {
+					if(host->data_cnt < host->dma_size)
+						*(u8*)(host->data_ptr) = data;
+				}
+				host->data_cnt += 2;
 			}
 			}
 
 
-			if(i == 1)
-				*(u8*)(host->data_ptr) = MMC_BUFFER_ACCESS;
-
 			stat = MMC_STATUS;
 			stat = MMC_STATUS;
 
 
-			/* Flush extra bytes from FIFO */
-			while(flush_len && !(stat & STATUS_DATA_TRANS_DONE)){
-				i = MMC_BUFFER_ACCESS;
-				stat = MMC_STATUS;
-				stat &= ~STATUS_CRC_READ_ERR; /* Stupid but required there */
-			}
-
-			dev_dbg(mmc_dev(host->mmc), "imxmci_cpu_driven_data read burst %d STATUS = 0x%x\n",
-				burst_len, stat);
+			dev_dbg(mmc_dev(host->mmc), "imxmci_cpu_driven_data read %d burst %d STATUS = 0x%x\n",
+				host->data_cnt, burst_len, stat);
 		}
 		}
+
+		if((stat & STATUS_DATA_TRANS_DONE) && (host->data_cnt >= 512))
+			trans_done = 1;
+
+		if(host->dma_size & 0x1ff)
+			stat &= ~STATUS_CRC_READ_ERR;
+
 	} else {
 	} else {
 		imxmci_busy_wait_for_status(host, &stat,
 		imxmci_busy_wait_for_status(host, &stat,
 				STATUS_APPL_BUFF_FE,
 				STATUS_APPL_BUFF_FE,
@@ -692,8 +693,8 @@ static void imxmci_tasklet_fnc(unsigned long data)
 		       what, stat, MMC_INT_MASK);
 		       what, stat, MMC_INT_MASK);
 		dev_err(mmc_dev(host->mmc), "CMD_DAT_CONT = 0x%04x, MMC_BLK_LEN = 0x%04x, MMC_NOB = 0x%04x, DMA_CCR = 0x%08x\n",
 		dev_err(mmc_dev(host->mmc), "CMD_DAT_CONT = 0x%04x, MMC_BLK_LEN = 0x%04x, MMC_NOB = 0x%04x, DMA_CCR = 0x%08x\n",
 		       MMC_CMD_DAT_CONT, MMC_BLK_LEN, MMC_NOB, CCR(host->dma));
 		       MMC_CMD_DAT_CONT, MMC_BLK_LEN, MMC_NOB, CCR(host->dma));
-		dev_err(mmc_dev(host->mmc), "CMD%d, bus %d-bit, dma_size = 0x%x\n",
-		       host->cmd?host->cmd->opcode:0, 1<<host->actual_bus_width, host->dma_size);
+		dev_err(mmc_dev(host->mmc), "CMD%d, prevCMD%d, bus %d-bit, dma_size = 0x%x\n",
+		       host->cmd?host->cmd->opcode:0, host->prev_cmd_code, 1<<host->actual_bus_width, host->dma_size);
 	}
 	}
 
 
 	if(!host->present || timeout)
 	if(!host->present || timeout)

+ 51 - 4
drivers/mmc/mmc.c

@@ -247,6 +247,55 @@ int mmc_wait_for_app_cmd(struct mmc_host *host, unsigned int rca,
 
 
 EXPORT_SYMBOL(mmc_wait_for_app_cmd);
 EXPORT_SYMBOL(mmc_wait_for_app_cmd);
 
 
+/**
+ *	mmc_set_data_timeout - set the timeout for a data command
+ *	@data: data phase for command
+ *	@card: the MMC card associated with the data transfer
+ *	@write: flag to differentiate reads from writes
+ */
+void mmc_set_data_timeout(struct mmc_data *data, const struct mmc_card *card,
+			  int write)
+{
+	unsigned int mult;
+
+	/*
+	 * SD cards use a 100 multiplier rather than 10
+	 */
+	mult = mmc_card_sd(card) ? 100 : 10;
+
+	/*
+	 * Scale up the multiplier (and therefore the timeout) by
+	 * the r2w factor for writes.
+	 */
+	if (write)
+		mult <<= card->csd.r2w_factor;
+
+	data->timeout_ns = card->csd.tacc_ns * mult;
+	data->timeout_clks = card->csd.tacc_clks * mult;
+
+	/*
+	 * SD cards also have an upper limit on the timeout.
+	 */
+	if (mmc_card_sd(card)) {
+		unsigned int timeout_us, limit_us;
+
+		timeout_us = data->timeout_ns / 1000;
+		timeout_us += data->timeout_clks * 1000 /
+			(card->host->ios.clock / 1000);
+
+		if (write)
+			limit_us = 250000;
+		else
+			limit_us = 100000;
+
+		if (timeout_us > limit_us) {
+			data->timeout_ns = limit_us * 1000;
+			data->timeout_clks = 0;
+		}
+	}
+}
+EXPORT_SYMBOL(mmc_set_data_timeout);
+
 static int mmc_select_card(struct mmc_host *host, struct mmc_card *card);
 static int mmc_select_card(struct mmc_host *host, struct mmc_card *card);
 
 
 /**
 /**
@@ -908,11 +957,9 @@ static void mmc_read_scrs(struct mmc_host *host)
 {
 {
 	int err;
 	int err;
 	struct mmc_card *card;
 	struct mmc_card *card;
-
 	struct mmc_request mrq;
 	struct mmc_request mrq;
 	struct mmc_command cmd;
 	struct mmc_command cmd;
 	struct mmc_data data;
 	struct mmc_data data;
-
 	struct scatterlist sg;
 	struct scatterlist sg;
 
 
 	list_for_each_entry(card, &host->cards, node) {
 	list_for_each_entry(card, &host->cards, node) {
@@ -947,8 +994,8 @@ static void mmc_read_scrs(struct mmc_host *host)
 
 
 		memset(&data, 0, sizeof(struct mmc_data));
 		memset(&data, 0, sizeof(struct mmc_data));
 
 
-		data.timeout_ns = card->csd.tacc_ns * 10;
-		data.timeout_clks = card->csd.tacc_clks * 10;
+		mmc_set_data_timeout(&data, card, 0);
+
 		data.blksz_bits = 3;
 		data.blksz_bits = 3;
 		data.blksz = 1 << 3;
 		data.blksz = 1 << 3;
 		data.blocks = 1;
 		data.blocks = 1;

+ 7 - 53
drivers/mmc/mmc_block.c

@@ -30,6 +30,7 @@
 #include <linux/mutex.h>
 #include <linux/mutex.h>
 
 
 #include <linux/mmc/card.h>
 #include <linux/mmc/card.h>
+#include <linux/mmc/host.h>
 #include <linux/mmc/protocol.h>
 #include <linux/mmc/protocol.h>
 
 
 #include <asm/system.h>
 #include <asm/system.h>
@@ -171,8 +172,6 @@ static int mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req)
 
 
 		brq.cmd.arg = req->sector << 9;
 		brq.cmd.arg = req->sector << 9;
 		brq.cmd.flags = MMC_RSP_R1 | MMC_CMD_ADTC;
 		brq.cmd.flags = MMC_RSP_R1 | MMC_CMD_ADTC;
-		brq.data.timeout_ns = card->csd.tacc_ns * 10;
-		brq.data.timeout_clks = card->csd.tacc_clks * 10;
 		brq.data.blksz_bits = md->block_bits;
 		brq.data.blksz_bits = md->block_bits;
 		brq.data.blksz = 1 << md->block_bits;
 		brq.data.blksz = 1 << md->block_bits;
 		brq.data.blocks = req->nr_sectors >> (md->block_bits - 9);
 		brq.data.blocks = req->nr_sectors >> (md->block_bits - 9);
@@ -180,6 +179,8 @@ static int mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req)
 		brq.stop.arg = 0;
 		brq.stop.arg = 0;
 		brq.stop.flags = MMC_RSP_R1B | MMC_CMD_AC;
 		brq.stop.flags = MMC_RSP_R1B | MMC_CMD_AC;
 
 
+		mmc_set_data_timeout(&brq.data, card, rq_data_dir(req) != READ);
+
 		if (rq_data_dir(req) == READ) {
 		if (rq_data_dir(req) == READ) {
 			brq.cmd.opcode = brq.data.blocks > 1 ? MMC_READ_MULTIPLE_BLOCK : MMC_READ_SINGLE_BLOCK;
 			brq.cmd.opcode = brq.data.blocks > 1 ? MMC_READ_MULTIPLE_BLOCK : MMC_READ_SINGLE_BLOCK;
 			brq.data.flags |= MMC_DATA_READ;
 			brq.data.flags |= MMC_DATA_READ;
@@ -187,12 +188,6 @@ static int mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req)
 			brq.cmd.opcode = MMC_WRITE_BLOCK;
 			brq.cmd.opcode = MMC_WRITE_BLOCK;
 			brq.data.flags |= MMC_DATA_WRITE;
 			brq.data.flags |= MMC_DATA_WRITE;
 			brq.data.blocks = 1;
 			brq.data.blocks = 1;
-
-			/*
-			 * Scale up the timeout by the r2w factor
-			 */
-			brq.data.timeout_ns <<= card->csd.r2w_factor;
-			brq.data.timeout_clks <<= card->csd.r2w_factor;
 		}
 		}
 
 
 		if (brq.data.blocks > 1) {
 		if (brq.data.blocks > 1) {
@@ -324,52 +319,11 @@ static struct mmc_blk_data *mmc_blk_alloc(struct mmc_card *card)
 	md->read_only = mmc_blk_readonly(card);
 	md->read_only = mmc_blk_readonly(card);
 
 
 	/*
 	/*
-	 * Figure out a workable block size.  MMC cards have:
-	 *  - two block sizes, one for read and one for write.
-	 *  - may support partial reads and/or writes
-	 *    (allows block sizes smaller than specified)
-	 */
-	md->block_bits = card->csd.read_blkbits;
-	if (card->csd.write_blkbits != card->csd.read_blkbits) {
-		if (card->csd.write_blkbits < card->csd.read_blkbits &&
-		    card->csd.read_partial) {
-			/*
-			 * write block size is smaller than read block
-			 * size, but we support partial reads, so choose
-			 * the smaller write block size.
-			 */
-			md->block_bits = card->csd.write_blkbits;
-		} else if (card->csd.write_blkbits > card->csd.read_blkbits &&
-			   card->csd.write_partial) {
-			/*
-			 * read block size is smaller than write block
-			 * size, but we support partial writes.  Use read
-			 * block size.
-			 */
-		} else {
-			/*
-			 * We don't support this configuration for writes.
-			 */
-			printk(KERN_ERR "%s: unable to select block size for "
-				"writing (rb%u wb%u rp%u wp%u)\n",
-				mmc_card_id(card),
-				1 << card->csd.read_blkbits,
-				1 << card->csd.write_blkbits,
-				card->csd.read_partial,
-				card->csd.write_partial);
-			md->read_only = 1;
-		}
-	}
-
-	/*
-	 * Refuse to allow block sizes smaller than 512 bytes.
+	 * Both SD and MMC specifications state (although a bit
+	 * unclearly in the MMC case) that a block size of 512
+	 * bytes must always be supported by the card.
 	 */
 	 */
-	if (md->block_bits < 9) {
-		printk(KERN_ERR "%s: unable to support block size %u\n",
-			mmc_card_id(card), 1 << md->block_bits);
-		ret = -EINVAL;
-		goto err_kfree;
-	}
+	md->block_bits = 9;
 
 
 	md->disk = alloc_disk(1 << MMC_SHIFT);
 	md->disk = alloc_disk(1 << MMC_SHIFT);
 	if (md->disk == NULL) {
 	if (md->disk == NULL) {

+ 1 - 1
drivers/net/Kconfig

@@ -2393,7 +2393,7 @@ config MYRI10GE
 	  you will need a newer firmware image.
 	  you will need a newer firmware image.
 	  You may get this image or more information, at:
 	  You may get this image or more information, at:
 
 
-	  <http://www.myri.com/Myri-10G/>
+	  <http://www.myri.com/scs/download-Myri10GE.html>
 
 
 	  To compile this driver as a module, choose M here and read
 	  To compile this driver as a module, choose M here and read
 	  <file:Documentation/networking/net-modules.txt>.  The module
 	  <file:Documentation/networking/net-modules.txt>.  The module

+ 2 - 2
drivers/net/dm9000.c

@@ -377,8 +377,8 @@ dm9000_release_board(struct platform_device *pdev, struct board_info *db)
 		kfree(db->data_req);
 		kfree(db->data_req);
 	}
 	}
 
 
-	if (db->addr_res != NULL) {
-		release_resource(db->addr_res);
+	if (db->addr_req != NULL) {
+		release_resource(db->addr_req);
 		kfree(db->addr_req);
 		kfree(db->addr_req);
 	}
 	}
 }
 }

+ 34 - 2
drivers/scsi/ata_piix.c

@@ -123,7 +123,8 @@ enum {
 	ich6_sata		= 4,
 	ich6_sata		= 4,
 	ich6_sata_ahci		= 5,
 	ich6_sata_ahci		= 5,
 	ich6m_sata_ahci		= 6,
 	ich6m_sata_ahci		= 6,
-	ich8_sata_ahci		= 7,
+	ich7m_sata_ahci		= 7,
+	ich8_sata_ahci		= 8,
 
 
 	/* constants for mapping table */
 	/* constants for mapping table */
 	P0			= 0,  /* port 0 */
 	P0			= 0,  /* port 0 */
@@ -188,7 +189,7 @@ static const struct pci_device_id piix_pci_tbl[] = {
 	/* 82801GB/GR/GH (ICH7, identical to ICH6) */
 	/* 82801GB/GR/GH (ICH7, identical to ICH6) */
 	{ 0x8086, 0x27c0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata_ahci },
 	{ 0x8086, 0x27c0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata_ahci },
 	/* 2801GBM/GHM (ICH7M, identical to ICH6M) */
 	/* 2801GBM/GHM (ICH7M, identical to ICH6M) */
-	{ 0x8086, 0x27c4, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6m_sata_ahci },
+	{ 0x8086, 0x27c4, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich7m_sata_ahci },
 	/* Enterprise Southbridge 2 (where's the datasheet?) */
 	/* Enterprise Southbridge 2 (where's the datasheet?) */
 	{ 0x8086, 0x2680, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata_ahci },
 	{ 0x8086, 0x2680, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata_ahci },
 	/* SATA Controller 1 IDE (ICH8, no datasheet yet) */
 	/* SATA Controller 1 IDE (ICH8, no datasheet yet) */
@@ -336,6 +337,24 @@ static const struct piix_map_db ich6m_map_db = {
 	},
 	},
 };
 };
 
 
+static const struct piix_map_db ich7m_map_db = {
+	.mask = 0x3,
+	.port_enable = 0x5,
+	.present_shift = 4,
+
+	/* Map 01b isn't specified in the doc but some notebooks use
+	 * it anyway.  ATM, the only case spotted carries subsystem ID
+	 * 1025:0107.  This is the only difference from ich6m.
+	 */
+	.map = {
+		/* PM   PS   SM   SS       MAP */
+		{  P0,  P2,  RV,  RV }, /* 00b */
+		{ IDE, IDE,  P1,  P3 }, /* 01b */
+		{  P0,  P2, IDE, IDE }, /* 10b */
+		{  RV,  RV,  RV,  RV },
+	},
+};
+
 static const struct piix_map_db ich8_map_db = {
 static const struct piix_map_db ich8_map_db = {
 	.mask = 0x3,
 	.mask = 0x3,
 	.port_enable = 0x3,
 	.port_enable = 0x3,
@@ -355,6 +374,7 @@ static const struct piix_map_db *piix_map_db_table[] = {
 	[ich6_sata]		= &ich6_map_db,
 	[ich6_sata]		= &ich6_map_db,
 	[ich6_sata_ahci]	= &ich6_map_db,
 	[ich6_sata_ahci]	= &ich6_map_db,
 	[ich6m_sata_ahci]	= &ich6m_map_db,
 	[ich6m_sata_ahci]	= &ich6m_map_db,
+	[ich7m_sata_ahci]	= &ich7m_map_db,
 	[ich8_sata_ahci]	= &ich8_map_db,
 	[ich8_sata_ahci]	= &ich8_map_db,
 };
 };
 
 
@@ -444,6 +464,18 @@ static struct ata_port_info piix_port_info[] = {
 		.port_ops	= &piix_sata_ops,
 		.port_ops	= &piix_sata_ops,
 	},
 	},
 
 
+	/* ich7m_sata_ahci */
+	{
+		.sht		= &piix_sht,
+		.host_flags	= ATA_FLAG_SATA |
+				  PIIX_FLAG_CHECKINTR | PIIX_FLAG_SCR |
+				  PIIX_FLAG_AHCI,
+		.pio_mask	= 0x1f,	/* pio0-4 */
+		.mwdma_mask	= 0x07, /* mwdma0-2 */
+		.udma_mask	= 0x7f,	/* udma0-6 */
+		.port_ops	= &piix_sata_ops,
+	},
+
 	/* ich8_sata_ahci */
 	/* ich8_sata_ahci */
 	{
 	{
 		.sht		= &piix_sht,
 		.sht		= &piix_sht,

+ 1 - 2
drivers/scsi/sata_mv.c

@@ -1961,8 +1961,7 @@ comreset_retry:
 	timeout = jiffies + msecs_to_jiffies(200);
 	timeout = jiffies + msecs_to_jiffies(200);
 	do {
 	do {
 		sata_scr_read(ap, SCR_STATUS, &sstatus);
 		sata_scr_read(ap, SCR_STATUS, &sstatus);
-		sstatus &= 0x3;
-		if ((sstatus == 3) || (sstatus == 0))
+		if (((sstatus & 0x3) == 3) || ((sstatus & 0x3) == 0))
 			break;
 			break;
 
 
 		__msleep(1, can_sleep);
 		__msleep(1, can_sleep);

+ 1 - 0
drivers/scsi/sata_via.c

@@ -77,6 +77,7 @@ static void svia_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val);
 static void vt6420_error_handler(struct ata_port *ap);
 static void vt6420_error_handler(struct ata_port *ap);
 
 
 static const struct pci_device_id svia_pci_tbl[] = {
 static const struct pci_device_id svia_pci_tbl[] = {
+	{ 0x1106, 0x0591, PCI_ANY_ID, PCI_ANY_ID, 0, 0, vt6420 },
 	{ 0x1106, 0x3149, PCI_ANY_ID, PCI_ANY_ID, 0, 0, vt6420 },
 	{ 0x1106, 0x3149, PCI_ANY_ID, PCI_ANY_ID, 0, 0, vt6420 },
 	{ 0x1106, 0x3249, PCI_ANY_ID, PCI_ANY_ID, 0, 0, vt6421 },
 	{ 0x1106, 0x3249, PCI_ANY_ID, PCI_ANY_ID, 0, 0, vt6421 },
 
 

+ 2 - 2
drivers/serial/sh-sci.c

@@ -1579,7 +1579,7 @@ static int __init serial_console_setup(struct console *co, char *options)
 	h8300_sci_enable(port, sci_enable);
 	h8300_sci_enable(port, sci_enable);
 #endif
 #endif
 #elif defined(CONFIG_SUPERH64)
 #elif defined(CONFIG_SUPERH64)
-	port->uartclk = current_cpu_info.module_clock * 16;
+	port->uartclk = current_cpu_data.module_clock * 16;
 #else
 #else
 	{
 	{
 		struct clk *clk = clk_get("module_clk");
 		struct clk *clk = clk_get("module_clk");
@@ -1720,7 +1720,7 @@ static int __init sci_init(void)
 #if defined(__H8300H__) || defined(__H8300S__)
 #if defined(__H8300H__) || defined(__H8300S__)
 			sciport->port.uartclk = CONFIG_CPU_CLOCK;
 			sciport->port.uartclk = CONFIG_CPU_CLOCK;
 #elif defined(CONFIG_SUPERH64)
 #elif defined(CONFIG_SUPERH64)
-			sciport->port.uartclk = current_cpu_info.module_clock * 16;
+			sciport->port.uartclk = current_cpu_data.module_clock * 16;
 #else
 #else
 			struct clk *clk = clk_get("module_clk");
 			struct clk *clk = clk_get("module_clk");
 			sciport->port.uartclk = clk_get_rate(clk) * 16;
 			sciport->port.uartclk = clk_get_rate(clk) * 16;

+ 2 - 2
drivers/usb/input/hid-core.c

@@ -1444,7 +1444,7 @@ void hid_init_reports(struct hid_device *hid)
 #define USB_DEVICE_ID_GTCO_402		0x0402
 #define USB_DEVICE_ID_GTCO_402		0x0402
 #define USB_DEVICE_ID_GTCO_403		0x0403
 #define USB_DEVICE_ID_GTCO_403		0x0403
 #define USB_DEVICE_ID_GTCO_404		0x0404
 #define USB_DEVICE_ID_GTCO_404		0x0404
-#define USB_DEVICE_ID_GTCO_404		0x0405
+#define USB_DEVICE_ID_GTCO_405		0x0405
 #define USB_DEVICE_ID_GTCO_500		0x0500
 #define USB_DEVICE_ID_GTCO_500		0x0500
 #define USB_DEVICE_ID_GTCO_501		0x0501
 #define USB_DEVICE_ID_GTCO_501		0x0501
 #define USB_DEVICE_ID_GTCO_502		0x0502
 #define USB_DEVICE_ID_GTCO_502		0x0502
@@ -1657,7 +1657,7 @@ static const struct hid_blacklist {
 	{ USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_402, HID_QUIRK_IGNORE },
 	{ USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_402, HID_QUIRK_IGNORE },
 	{ USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_403, HID_QUIRK_IGNORE },
 	{ USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_403, HID_QUIRK_IGNORE },
 	{ USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_404, HID_QUIRK_IGNORE },
 	{ USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_404, HID_QUIRK_IGNORE },
-	{ USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_404, HID_QUIRK_IGNORE },
+	{ USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_405, HID_QUIRK_IGNORE },
 	{ USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_500, HID_QUIRK_IGNORE },
 	{ USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_500, HID_QUIRK_IGNORE },
 	{ USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_501, HID_QUIRK_IGNORE },
 	{ USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_501, HID_QUIRK_IGNORE },
 	{ USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_502, HID_QUIRK_IGNORE },
 	{ USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_502, HID_QUIRK_IGNORE },

+ 1 - 1
drivers/usb/input/usbtouchscreen.c

@@ -286,7 +286,7 @@ static int mtouch_init(struct usbtouch_usb *usbtouch)
 static int itm_read_data(unsigned char *pkt, int *x, int *y, int *touch, int *press)
 static int itm_read_data(unsigned char *pkt, int *x, int *y, int *touch, int *press)
 {
 {
 	*x = ((pkt[0] & 0x1F) << 7) | (pkt[3] & 0x7F);
 	*x = ((pkt[0] & 0x1F) << 7) | (pkt[3] & 0x7F);
-	*x = ((pkt[1] & 0x1F) << 7) | (pkt[4] & 0x7F);
+	*y = ((pkt[1] & 0x1F) << 7) | (pkt[4] & 0x7F);
 	*press = ((pkt[2] & 0x1F) << 7) | (pkt[5] & 0x7F);
 	*press = ((pkt[2] & 0x1F) << 7) | (pkt[5] & 0x7F);
 	*touch = ~pkt[7] & 0x20;
 	*touch = ~pkt[7] & 0x20;
 
 

+ 6 - 6
drivers/usb/input/yealink.c

@@ -810,12 +810,9 @@ static int usb_cleanup(struct yealink_dev *yld, int err)
 	if (yld == NULL)
 	if (yld == NULL)
 		return err;
 		return err;
 
 
-        if (yld->urb_irq) {
-		usb_kill_urb(yld->urb_irq);
-		usb_free_urb(yld->urb_irq);
-	}
-        if (yld->urb_ctl)
-		usb_free_urb(yld->urb_ctl);
+	usb_kill_urb(yld->urb_irq);	/* parameter validation in core/urb */
+	usb_kill_urb(yld->urb_ctl);	/* parameter validation in core/urb */
+
         if (yld->idev) {
         if (yld->idev) {
 		if (err)
 		if (err)
 			input_free_device(yld->idev);
 			input_free_device(yld->idev);
@@ -831,6 +828,9 @@ static int usb_cleanup(struct yealink_dev *yld, int err)
 	if (yld->irq_data)
 	if (yld->irq_data)
 		usb_buffer_free(yld->udev, USB_PKT_LEN,
 		usb_buffer_free(yld->udev, USB_PKT_LEN,
 				yld->irq_data, yld->irq_dma);
 				yld->irq_data, yld->irq_dma);
+
+	usb_free_urb(yld->urb_irq);	/* parameter validation in core/urb */
+	usb_free_urb(yld->urb_ctl);	/* parameter validation in core/urb */
 	kfree(yld);
 	kfree(yld);
 	return err;
 	return err;
 }
 }

+ 2 - 0
drivers/usb/misc/sisusbvga/sisusb.c

@@ -3435,6 +3435,8 @@ static void sisusb_disconnect(struct usb_interface *intf)
 
 
 static struct usb_device_id sisusb_table [] = {
 static struct usb_device_id sisusb_table [] = {
 	{ USB_DEVICE(0x0711, 0x0900) },
 	{ USB_DEVICE(0x0711, 0x0900) },
+	{ USB_DEVICE(0x0711, 0x0901) },
+	{ USB_DEVICE(0x0711, 0x0902) },
 	{ USB_DEVICE(0x182d, 0x021c) },
 	{ USB_DEVICE(0x182d, 0x021c) },
 	{ USB_DEVICE(0x182d, 0x0269) },
 	{ USB_DEVICE(0x182d, 0x0269) },
 	{ }
 	{ }

+ 1 - 0
drivers/usb/serial/ftdi_sio.c

@@ -506,6 +506,7 @@ static struct usb_device_id id_table_combined [] = {
 	{ USB_DEVICE(FTDI_VID, FTDI_YEI_SERVOCENTER31_PID) },
 	{ USB_DEVICE(FTDI_VID, FTDI_YEI_SERVOCENTER31_PID) },
 	{ USB_DEVICE(FTDI_VID, FTDI_THORLABS_PID) },
 	{ USB_DEVICE(FTDI_VID, FTDI_THORLABS_PID) },
 	{ USB_DEVICE(TESTO_VID, TESTO_USB_INTERFACE_PID) },
 	{ USB_DEVICE(TESTO_VID, TESTO_USB_INTERFACE_PID) },
+	{ USB_DEVICE(FTDI_VID, FTDI_GAMMA_SCOUT_PID) },
 	{ },					/* Optional parameter entry */
 	{ },					/* Optional parameter entry */
 	{ }					/* Terminating entry */
 	{ }					/* Terminating entry */
 };
 };

+ 5 - 0
drivers/usb/serial/ftdi_sio.h

@@ -467,6 +467,11 @@
 #define TESTO_VID			0x128D
 #define TESTO_VID			0x128D
 #define TESTO_USB_INTERFACE_PID		0x0001
 #define TESTO_USB_INTERFACE_PID		0x0001
 
 
+/*
+ * Gamma Scout (http://gamma-scout.com/). Submitted by rsc@runtux.com.
+ */
+#define FTDI_GAMMA_SCOUT_PID		0xD678	/* Gamma Scout online */
+
 /* Commands */
 /* Commands */
 #define FTDI_SIO_RESET 		0 /* Reset the port */
 #define FTDI_SIO_RESET 		0 /* Reset the port */
 #define FTDI_SIO_MODEM_CTRL 	1 /* Set the modem control register */
 #define FTDI_SIO_MODEM_CTRL 	1 /* Set the modem control register */

+ 3 - 1
drivers/usb/serial/usb-serial.c

@@ -464,8 +464,10 @@ static int serial_read_proc (char *page, char **start, off_t off, int count, int
 		length += sprintf (page+length, " path:%s", tmp);
 		length += sprintf (page+length, " path:%s", tmp);
 			
 			
 		length += sprintf (page+length, "\n");
 		length += sprintf (page+length, "\n");
-		if ((length + begin) > (off + count))
+		if ((length + begin) > (off + count)) {
+			usb_serial_put(serial);
 			goto done;
 			goto done;
+		}
 		if ((length + begin) < off) {
 		if ((length + begin) < off) {
 			begin += length;
 			begin += length;
 			length = 0;
 			length = 0;

+ 7 - 4
fs/cifs/readdir.c

@@ -82,7 +82,6 @@ static int construct_dentry(struct qstr *qstring, struct file *file,
 			if(*ptmp_inode == NULL)
 			if(*ptmp_inode == NULL)
 				return rc;
 				return rc;
 			rc = 1;
 			rc = 1;
-			d_instantiate(tmp_dentry, *ptmp_inode);
 		}
 		}
 	} else {
 	} else {
 		tmp_dentry = d_alloc(file->f_dentry, qstring);
 		tmp_dentry = d_alloc(file->f_dentry, qstring);
@@ -99,9 +98,7 @@ static int construct_dentry(struct qstr *qstring, struct file *file,
 			tmp_dentry->d_op = &cifs_dentry_ops;
 			tmp_dentry->d_op = &cifs_dentry_ops;
 		if(*ptmp_inode == NULL)
 		if(*ptmp_inode == NULL)
 			return rc;
 			return rc;
-		rc = 1;
-		d_instantiate(tmp_dentry, *ptmp_inode);
-		d_rehash(tmp_dentry);
+		rc = 2;
 	}
 	}
 
 
 	tmp_dentry->d_time = jiffies;
 	tmp_dentry->d_time = jiffies;
@@ -870,6 +867,12 @@ static int cifs_filldir(char *pfindEntry, struct file *file,
 				pfindEntry, &obj_type, rc);
 				pfindEntry, &obj_type, rc);
 	else
 	else
 		fill_in_inode(tmp_inode, 1 /* NT */, pfindEntry, &obj_type, rc);
 		fill_in_inode(tmp_inode, 1 /* NT */, pfindEntry, &obj_type, rc);
+
+	if(rc) /* new inode - needs to be tied to dentry */ {
+		d_instantiate(tmp_dentry, tmp_inode);
+		if(rc == 2)
+			d_rehash(tmp_dentry);
+	}
 	
 	
 	
 	
 	rc = filldir(direntry,qstring.name,qstring.len,file->f_pos,
 	rc = filldir(direntry,qstring.name,qstring.len,file->f_pos,

+ 7 - 4
fs/ext3/inode.c

@@ -1009,11 +1009,14 @@ struct buffer_head *ext3_getblk(handle_t *handle, struct inode *inode,
 	buffer_trace_init(&dummy.b_history);
 	buffer_trace_init(&dummy.b_history);
 	err = ext3_get_blocks_handle(handle, inode, block, 1,
 	err = ext3_get_blocks_handle(handle, inode, block, 1,
 					&dummy, create, 1);
 					&dummy, create, 1);
-	if (err == 1) {
+	/*
+	 * ext3_get_blocks_handle() returns number of blocks
+	 * mapped. 0 in case of a HOLE.
+	 */
+	if (err > 0) {
+		if (err > 1)
+			WARN_ON(1);
 		err = 0;
 		err = 0;
-	} else if (err >= 0) {
-		WARN_ON(1);
-		err = -EIO;
 	}
 	}
 	*errp = err;
 	*errp = err;
 	if (!err && buffer_mapped(&dummy)) {
 	if (!err && buffer_mapped(&dummy)) {

+ 14 - 36
fs/nfs/direct.c

@@ -100,25 +100,6 @@ static inline int put_dreq(struct nfs_direct_req *dreq)
 	return atomic_dec_and_test(&dreq->io_count);
 	return atomic_dec_and_test(&dreq->io_count);
 }
 }
 
 
-/*
- * "size" is never larger than rsize or wsize.
- */
-static inline int nfs_direct_count_pages(unsigned long user_addr, size_t size)
-{
-	int page_count;
-
-	page_count = (user_addr + size + PAGE_SIZE - 1) >> PAGE_SHIFT;
-	page_count -= user_addr >> PAGE_SHIFT;
-	BUG_ON(page_count < 0);
-
-	return page_count;
-}
-
-static inline unsigned int nfs_max_pages(unsigned int size)
-{
-	return (size + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT;
-}
-
 /**
 /**
  * nfs_direct_IO - NFS address space operation for direct I/O
  * nfs_direct_IO - NFS address space operation for direct I/O
  * @rw: direction (read or write)
  * @rw: direction (read or write)
@@ -276,28 +257,24 @@ static ssize_t nfs_direct_read_schedule(struct nfs_direct_req *dreq, unsigned lo
 	struct nfs_open_context *ctx = dreq->ctx;
 	struct nfs_open_context *ctx = dreq->ctx;
 	struct inode *inode = ctx->dentry->d_inode;
 	struct inode *inode = ctx->dentry->d_inode;
 	size_t rsize = NFS_SERVER(inode)->rsize;
 	size_t rsize = NFS_SERVER(inode)->rsize;
-	unsigned int rpages = nfs_max_pages(rsize);
 	unsigned int pgbase;
 	unsigned int pgbase;
 	int result;
 	int result;
 	ssize_t started = 0;
 	ssize_t started = 0;
 
 
 	get_dreq(dreq);
 	get_dreq(dreq);
 
 
-	pgbase = user_addr & ~PAGE_MASK;
 	do {
 	do {
 		struct nfs_read_data *data;
 		struct nfs_read_data *data;
 		size_t bytes;
 		size_t bytes;
 
 
+		pgbase = user_addr & ~PAGE_MASK;
+		bytes = min(rsize,count);
+
 		result = -ENOMEM;
 		result = -ENOMEM;
-		data = nfs_readdata_alloc(rpages);
+		data = nfs_readdata_alloc(pgbase + bytes);
 		if (unlikely(!data))
 		if (unlikely(!data))
 			break;
 			break;
 
 
-		bytes = rsize;
-		if (count < rsize)
-			bytes = count;
-
-		data->npages = nfs_direct_count_pages(user_addr, bytes);
 		down_read(&current->mm->mmap_sem);
 		down_read(&current->mm->mmap_sem);
 		result = get_user_pages(current, current->mm, user_addr,
 		result = get_user_pages(current, current->mm, user_addr,
 					data->npages, 1, 0, data->pagevec, NULL);
 					data->npages, 1, 0, data->pagevec, NULL);
@@ -344,8 +321,10 @@ static ssize_t nfs_direct_read_schedule(struct nfs_direct_req *dreq, unsigned lo
 		started += bytes;
 		started += bytes;
 		user_addr += bytes;
 		user_addr += bytes;
 		pos += bytes;
 		pos += bytes;
+		/* FIXME: Remove this unnecessary math from final patch */
 		pgbase += bytes;
 		pgbase += bytes;
 		pgbase &= ~PAGE_MASK;
 		pgbase &= ~PAGE_MASK;
+		BUG_ON(pgbase != (user_addr & ~PAGE_MASK));
 
 
 		count -= bytes;
 		count -= bytes;
 	} while (count != 0);
 	} while (count != 0);
@@ -524,7 +503,7 @@ static void nfs_direct_write_complete(struct nfs_direct_req *dreq, struct inode
 
 
 static void nfs_alloc_commit_data(struct nfs_direct_req *dreq)
 static void nfs_alloc_commit_data(struct nfs_direct_req *dreq)
 {
 {
-	dreq->commit_data = nfs_commit_alloc(0);
+	dreq->commit_data = nfs_commit_alloc();
 	if (dreq->commit_data != NULL)
 	if (dreq->commit_data != NULL)
 		dreq->commit_data->req = (struct nfs_page *) dreq;
 		dreq->commit_data->req = (struct nfs_page *) dreq;
 }
 }
@@ -605,28 +584,24 @@ static ssize_t nfs_direct_write_schedule(struct nfs_direct_req *dreq, unsigned l
 	struct nfs_open_context *ctx = dreq->ctx;
 	struct nfs_open_context *ctx = dreq->ctx;
 	struct inode *inode = ctx->dentry->d_inode;
 	struct inode *inode = ctx->dentry->d_inode;
 	size_t wsize = NFS_SERVER(inode)->wsize;
 	size_t wsize = NFS_SERVER(inode)->wsize;
-	unsigned int wpages = nfs_max_pages(wsize);
 	unsigned int pgbase;
 	unsigned int pgbase;
 	int result;
 	int result;
 	ssize_t started = 0;
 	ssize_t started = 0;
 
 
 	get_dreq(dreq);
 	get_dreq(dreq);
 
 
-	pgbase = user_addr & ~PAGE_MASK;
 	do {
 	do {
 		struct nfs_write_data *data;
 		struct nfs_write_data *data;
 		size_t bytes;
 		size_t bytes;
 
 
+		pgbase = user_addr & ~PAGE_MASK;
+		bytes = min(wsize,count);
+
 		result = -ENOMEM;
 		result = -ENOMEM;
-		data = nfs_writedata_alloc(wpages);
+		data = nfs_writedata_alloc(pgbase + bytes);
 		if (unlikely(!data))
 		if (unlikely(!data))
 			break;
 			break;
 
 
-		bytes = wsize;
-		if (count < wsize)
-			bytes = count;
-
-		data->npages = nfs_direct_count_pages(user_addr, bytes);
 		down_read(&current->mm->mmap_sem);
 		down_read(&current->mm->mmap_sem);
 		result = get_user_pages(current, current->mm, user_addr,
 		result = get_user_pages(current, current->mm, user_addr,
 					data->npages, 0, 0, data->pagevec, NULL);
 					data->npages, 0, 0, data->pagevec, NULL);
@@ -676,8 +651,11 @@ static ssize_t nfs_direct_write_schedule(struct nfs_direct_req *dreq, unsigned l
 		started += bytes;
 		started += bytes;
 		user_addr += bytes;
 		user_addr += bytes;
 		pos += bytes;
 		pos += bytes;
+
+		/* FIXME: Remove this useless math from the final patch */
 		pgbase += bytes;
 		pgbase += bytes;
 		pgbase &= ~PAGE_MASK;
 		pgbase &= ~PAGE_MASK;
+		BUG_ON(pgbase != (user_addr & ~PAGE_MASK));
 
 
 		count -= bytes;
 		count -= bytes;
 	} while (count != 0);
 	} while (count != 0);

+ 13 - 11
fs/nfs/read.c

@@ -43,13 +43,15 @@ static mempool_t *nfs_rdata_mempool;
 
 
 #define MIN_POOL_READ	(32)
 #define MIN_POOL_READ	(32)
 
 
-struct nfs_read_data *nfs_readdata_alloc(unsigned int pagecount)
+struct nfs_read_data *nfs_readdata_alloc(size_t len)
 {
 {
+	unsigned int pagecount = (len + PAGE_SIZE - 1) >> PAGE_SHIFT;
 	struct nfs_read_data *p = mempool_alloc(nfs_rdata_mempool, SLAB_NOFS);
 	struct nfs_read_data *p = mempool_alloc(nfs_rdata_mempool, SLAB_NOFS);
 
 
 	if (p) {
 	if (p) {
 		memset(p, 0, sizeof(*p));
 		memset(p, 0, sizeof(*p));
 		INIT_LIST_HEAD(&p->pages);
 		INIT_LIST_HEAD(&p->pages);
+		p->npages = pagecount;
 		if (pagecount <= ARRAY_SIZE(p->page_array))
 		if (pagecount <= ARRAY_SIZE(p->page_array))
 			p->pagevec = p->page_array;
 			p->pagevec = p->page_array;
 		else {
 		else {
@@ -140,7 +142,7 @@ static int nfs_readpage_sync(struct nfs_open_context *ctx, struct inode *inode,
 	int		result;
 	int		result;
 	struct nfs_read_data *rdata;
 	struct nfs_read_data *rdata;
 
 
-	rdata = nfs_readdata_alloc(1);
+	rdata = nfs_readdata_alloc(count);
 	if (!rdata)
 	if (!rdata)
 		return -ENOMEM;
 		return -ENOMEM;
 
 
@@ -336,25 +338,25 @@ static int nfs_pagein_multi(struct list_head *head, struct inode *inode)
 	struct nfs_page *req = nfs_list_entry(head->next);
 	struct nfs_page *req = nfs_list_entry(head->next);
 	struct page *page = req->wb_page;
 	struct page *page = req->wb_page;
 	struct nfs_read_data *data;
 	struct nfs_read_data *data;
-	unsigned int rsize = NFS_SERVER(inode)->rsize;
-	unsigned int nbytes, offset;
+	size_t rsize = NFS_SERVER(inode)->rsize, nbytes;
+	unsigned int offset;
 	int requests = 0;
 	int requests = 0;
 	LIST_HEAD(list);
 	LIST_HEAD(list);
 
 
 	nfs_list_remove_request(req);
 	nfs_list_remove_request(req);
 
 
 	nbytes = req->wb_bytes;
 	nbytes = req->wb_bytes;
-	for(;;) {
-		data = nfs_readdata_alloc(1);
+	do {
+		size_t len = min(nbytes,rsize);
+
+		data = nfs_readdata_alloc(len);
 		if (!data)
 		if (!data)
 			goto out_bad;
 			goto out_bad;
 		INIT_LIST_HEAD(&data->pages);
 		INIT_LIST_HEAD(&data->pages);
 		list_add(&data->pages, &list);
 		list_add(&data->pages, &list);
 		requests++;
 		requests++;
-		if (nbytes <= rsize)
-			break;
-		nbytes -= rsize;
-	}
+		nbytes -= len;
+	} while(nbytes != 0);
 	atomic_set(&req->wb_complete, requests);
 	atomic_set(&req->wb_complete, requests);
 
 
 	ClearPageError(page);
 	ClearPageError(page);
@@ -402,7 +404,7 @@ static int nfs_pagein_one(struct list_head *head, struct inode *inode)
 	if (NFS_SERVER(inode)->rsize < PAGE_CACHE_SIZE)
 	if (NFS_SERVER(inode)->rsize < PAGE_CACHE_SIZE)
 		return nfs_pagein_multi(head, inode);
 		return nfs_pagein_multi(head, inode);
 
 
-	data = nfs_readdata_alloc(NFS_SERVER(inode)->rpages);
+	data = nfs_readdata_alloc(NFS_SERVER(inode)->rsize);
 	if (!data)
 	if (!data)
 		goto out_bad;
 		goto out_bad;
 
 

+ 15 - 22
fs/nfs/write.c

@@ -90,22 +90,13 @@ static mempool_t *nfs_commit_mempool;
 
 
 static DECLARE_WAIT_QUEUE_HEAD(nfs_write_congestion);
 static DECLARE_WAIT_QUEUE_HEAD(nfs_write_congestion);
 
 
-struct nfs_write_data *nfs_commit_alloc(unsigned int pagecount)
+struct nfs_write_data *nfs_commit_alloc(void)
 {
 {
 	struct nfs_write_data *p = mempool_alloc(nfs_commit_mempool, SLAB_NOFS);
 	struct nfs_write_data *p = mempool_alloc(nfs_commit_mempool, SLAB_NOFS);
 
 
 	if (p) {
 	if (p) {
 		memset(p, 0, sizeof(*p));
 		memset(p, 0, sizeof(*p));
 		INIT_LIST_HEAD(&p->pages);
 		INIT_LIST_HEAD(&p->pages);
-		if (pagecount <= ARRAY_SIZE(p->page_array))
-			p->pagevec = p->page_array;
-		else {
-			p->pagevec = kcalloc(pagecount, sizeof(struct page *), GFP_NOFS);
-			if (!p->pagevec) {
-				mempool_free(p, nfs_commit_mempool);
-				p = NULL;
-			}
-		}
 	}
 	}
 	return p;
 	return p;
 }
 }
@@ -117,13 +108,15 @@ void nfs_commit_free(struct nfs_write_data *p)
 	mempool_free(p, nfs_commit_mempool);
 	mempool_free(p, nfs_commit_mempool);
 }
 }
 
 
-struct nfs_write_data *nfs_writedata_alloc(unsigned int pagecount)
+struct nfs_write_data *nfs_writedata_alloc(size_t len)
 {
 {
+	unsigned int pagecount = (len + PAGE_SIZE - 1) >> PAGE_SHIFT;
 	struct nfs_write_data *p = mempool_alloc(nfs_wdata_mempool, SLAB_NOFS);
 	struct nfs_write_data *p = mempool_alloc(nfs_wdata_mempool, SLAB_NOFS);
 
 
 	if (p) {
 	if (p) {
 		memset(p, 0, sizeof(*p));
 		memset(p, 0, sizeof(*p));
 		INIT_LIST_HEAD(&p->pages);
 		INIT_LIST_HEAD(&p->pages);
+		p->npages = pagecount;
 		if (pagecount <= ARRAY_SIZE(p->page_array))
 		if (pagecount <= ARRAY_SIZE(p->page_array))
 			p->pagevec = p->page_array;
 			p->pagevec = p->page_array;
 		else {
 		else {
@@ -208,7 +201,7 @@ static int nfs_writepage_sync(struct nfs_open_context *ctx, struct inode *inode,
 	int		result, written = 0;
 	int		result, written = 0;
 	struct nfs_write_data *wdata;
 	struct nfs_write_data *wdata;
 
 
-	wdata = nfs_writedata_alloc(1);
+	wdata = nfs_writedata_alloc(wsize);
 	if (!wdata)
 	if (!wdata)
 		return -ENOMEM;
 		return -ENOMEM;
 
 
@@ -999,24 +992,24 @@ static int nfs_flush_multi(struct inode *inode, struct list_head *head, int how)
 	struct nfs_page *req = nfs_list_entry(head->next);
 	struct nfs_page *req = nfs_list_entry(head->next);
 	struct page *page = req->wb_page;
 	struct page *page = req->wb_page;
 	struct nfs_write_data *data;
 	struct nfs_write_data *data;
-	unsigned int wsize = NFS_SERVER(inode)->wsize;
-	unsigned int nbytes, offset;
+	size_t wsize = NFS_SERVER(inode)->wsize, nbytes;
+	unsigned int offset;
 	int requests = 0;
 	int requests = 0;
 	LIST_HEAD(list);
 	LIST_HEAD(list);
 
 
 	nfs_list_remove_request(req);
 	nfs_list_remove_request(req);
 
 
 	nbytes = req->wb_bytes;
 	nbytes = req->wb_bytes;
-	for (;;) {
-		data = nfs_writedata_alloc(1);
+	do {
+		size_t len = min(nbytes, wsize);
+
+		data = nfs_writedata_alloc(len);
 		if (!data)
 		if (!data)
 			goto out_bad;
 			goto out_bad;
 		list_add(&data->pages, &list);
 		list_add(&data->pages, &list);
 		requests++;
 		requests++;
-		if (nbytes <= wsize)
-			break;
-		nbytes -= wsize;
-	}
+		nbytes -= len;
+	} while (nbytes != 0);
 	atomic_set(&req->wb_complete, requests);
 	atomic_set(&req->wb_complete, requests);
 
 
 	ClearPageError(page);
 	ClearPageError(page);
@@ -1070,7 +1063,7 @@ static int nfs_flush_one(struct inode *inode, struct list_head *head, int how)
 	struct nfs_write_data	*data;
 	struct nfs_write_data	*data;
 	unsigned int		count;
 	unsigned int		count;
 
 
-	data = nfs_writedata_alloc(NFS_SERVER(inode)->wpages);
+	data = nfs_writedata_alloc(NFS_SERVER(inode)->wsize);
 	if (!data)
 	if (!data)
 		goto out_bad;
 		goto out_bad;
 
 
@@ -1378,7 +1371,7 @@ nfs_commit_list(struct inode *inode, struct list_head *head, int how)
 	struct nfs_write_data	*data;
 	struct nfs_write_data	*data;
 	struct nfs_page         *req;
 	struct nfs_page         *req;
 
 
-	data = nfs_commit_alloc(NFS_SERVER(inode)->wpages);
+	data = nfs_commit_alloc();
 
 
 	if (!data)
 	if (!data)
 		goto out_bad;
 		goto out_bad;

+ 1 - 0
fs/super.c

@@ -49,6 +49,7 @@ DEFINE_SPINLOCK(sb_lock);
 
 
 /**
 /**
  *	alloc_super	-	create new superblock
  *	alloc_super	-	create new superblock
+ *	@type:	filesystem type superblock should belong to
  *
  *
  *	Allocates and initializes a new &struct super_block.  alloc_super()
  *	Allocates and initializes a new &struct super_block.  alloc_super()
  *	returns a pointer new superblock or %NULL if allocation had failed.
  *	returns a pointer new superblock or %NULL if allocation had failed.

+ 13 - 5
fs/xfs/linux-2.6/xfs_aops.c

@@ -1390,11 +1390,19 @@ xfs_vm_direct_IO(
 
 
 	iocb->private = xfs_alloc_ioend(inode, IOMAP_UNWRITTEN);
 	iocb->private = xfs_alloc_ioend(inode, IOMAP_UNWRITTEN);
 
 
-	ret = blockdev_direct_IO_own_locking(rw, iocb, inode,
-		iomap.iomap_target->bt_bdev,
-		iov, offset, nr_segs,
-		xfs_get_blocks_direct,
-		xfs_end_io_direct);
+	if (rw == WRITE) {
+		ret = blockdev_direct_IO_own_locking(rw, iocb, inode,
+			iomap.iomap_target->bt_bdev,
+			iov, offset, nr_segs,
+			xfs_get_blocks_direct,
+			xfs_end_io_direct);
+	} else {
+		ret = blockdev_direct_IO_no_locking(rw, iocb, inode,
+			iomap.iomap_target->bt_bdev,
+			iov, offset, nr_segs,
+			xfs_get_blocks_direct,
+			xfs_end_io_direct);
+	}
 
 
 	if (unlikely(ret <= 0 && iocb->private))
 	if (unlikely(ret <= 0 && iocb->private))
 		xfs_destroy_ioend(iocb->private);
 		xfs_destroy_ioend(iocb->private);

+ 22 - 5
fs/xfs/linux-2.6/xfs_lrw.c

@@ -264,7 +264,9 @@ xfs_read(
 					dmflags, &locktype);
 					dmflags, &locktype);
 		if (ret) {
 		if (ret) {
 			xfs_iunlock(ip, XFS_IOLOCK_SHARED);
 			xfs_iunlock(ip, XFS_IOLOCK_SHARED);
-			goto unlock_mutex;
+			if (unlikely(ioflags & IO_ISDIRECT))
+				mutex_unlock(&inode->i_mutex);
+			return ret;
 		}
 		}
 	}
 	}
 
 
@@ -272,6 +274,9 @@ xfs_read(
 		bhv_vop_flushinval_pages(vp, ctooff(offtoct(*offset)),
 		bhv_vop_flushinval_pages(vp, ctooff(offtoct(*offset)),
 						-1, FI_REMAPF_LOCKED);
 						-1, FI_REMAPF_LOCKED);
 
 
+	if (unlikely(ioflags & IO_ISDIRECT))
+		mutex_unlock(&inode->i_mutex);
+
 	xfs_rw_enter_trace(XFS_READ_ENTER, &ip->i_iocore,
 	xfs_rw_enter_trace(XFS_READ_ENTER, &ip->i_iocore,
 				(void *)iovp, segs, *offset, ioflags);
 				(void *)iovp, segs, *offset, ioflags);
 	ret = __generic_file_aio_read(iocb, iovp, segs, offset);
 	ret = __generic_file_aio_read(iocb, iovp, segs, offset);
@@ -281,10 +286,6 @@ xfs_read(
 		XFS_STATS_ADD(xs_read_bytes, ret);
 		XFS_STATS_ADD(xs_read_bytes, ret);
 
 
 	xfs_iunlock(ip, XFS_IOLOCK_SHARED);
 	xfs_iunlock(ip, XFS_IOLOCK_SHARED);
-
-unlock_mutex:
-	if (unlikely(ioflags & IO_ISDIRECT))
-		mutex_unlock(&inode->i_mutex);
 	return ret;
 	return ret;
 }
 }
 
 
@@ -390,6 +391,8 @@ xfs_splice_write(
 	xfs_inode_t		*ip = XFS_BHVTOI(bdp);
 	xfs_inode_t		*ip = XFS_BHVTOI(bdp);
 	xfs_mount_t		*mp = ip->i_mount;
 	xfs_mount_t		*mp = ip->i_mount;
 	ssize_t			ret;
 	ssize_t			ret;
+	struct inode		*inode = outfilp->f_mapping->host;
+	xfs_fsize_t		isize;
 
 
 	XFS_STATS_INC(xs_write_calls);
 	XFS_STATS_INC(xs_write_calls);
 	if (XFS_FORCED_SHUTDOWN(ip->i_mount))
 	if (XFS_FORCED_SHUTDOWN(ip->i_mount))
@@ -416,6 +419,20 @@ xfs_splice_write(
 	if (ret > 0)
 	if (ret > 0)
 		XFS_STATS_ADD(xs_write_bytes, ret);
 		XFS_STATS_ADD(xs_write_bytes, ret);
 
 
+	isize = i_size_read(inode);
+	if (unlikely(ret < 0 && ret != -EFAULT && *ppos > isize))
+		*ppos = isize;
+
+	if (*ppos > ip->i_d.di_size) {
+		xfs_ilock(ip, XFS_ILOCK_EXCL);
+		if (*ppos > ip->i_d.di_size) {
+			ip->i_d.di_size = *ppos;
+			i_size_write(inode, *ppos);
+			ip->i_update_core = 1;
+			ip->i_update_size = 1;
+		}
+		xfs_iunlock(ip, XFS_ILOCK_EXCL);
+	}
 	xfs_iunlock(ip, XFS_IOLOCK_EXCL);
 	xfs_iunlock(ip, XFS_IOLOCK_EXCL);
 	return ret;
 	return ret;
 }
 }

+ 1 - 1
fs/xfs/quota/xfs_qm_bhv.c

@@ -203,7 +203,7 @@ xfs_qm_statvfs(
 	if (error || !vnode)
 	if (error || !vnode)
 		return error;
 		return error;
 
 
-	mp = XFS_BHVTOM(bhv);
+	mp = xfs_vfstom(bhvtovfs(bhv));
 	ip = xfs_vtoi(vnode);
 	ip = xfs_vtoi(vnode);
 
 
 	if (!(ip->i_d.di_flags & XFS_DIFLAG_PROJINHERIT))
 	if (!(ip->i_d.di_flags & XFS_DIFLAG_PROJINHERIT))

Một số tệp đã không được hiển thị bởi vì quá nhiều tập tin thay đổi trong này khác