diff --git a/[refs] b/[refs]
index f584cd0d2b57..d22f042b4478 100644
--- a/[refs]
+++ b/[refs]
@@ -1,2 +1,2 @@
---
-refs/heads/master: effdb9492de01a51f8123e62e87e3330688f9bf1
+refs/heads/master: 0b6e4d56bf71866a2b58daa8323cf747988ce7e4
diff --git a/trunk/Documentation/DocBook/Makefile b/trunk/Documentation/DocBook/Makefile
index 9b1f6ca100d1..fabc06466b93 100644
--- a/trunk/Documentation/DocBook/Makefile
+++ b/trunk/Documentation/DocBook/Makefile
@@ -136,7 +136,7 @@ quiet_cmd_db2ps = PS $@
%.ps : %.xml
$(call cmd,db2ps)
-quiet_cmd_db2pdf = PDF $@
+quiet_cmd_db2pdf = PDF $@
cmd_db2pdf = $(subst TYPE,pdf, $($(PDF_METHOD)template))
%.pdf : %.xml
$(call cmd,db2pdf)
@@ -148,7 +148,7 @@ build_main_index = rm -rf $(main_idx) && \
echo '
Kernel Version: $(KERNELVERSION)
' >> $(main_idx) && \
cat $(HTML) >> $(main_idx)
-quiet_cmd_db2html = HTML $@
+quiet_cmd_db2html = HTML $@
cmd_db2html = xmlto xhtml $(XMLTOFLAGS) -o $(patsubst %.html,%,$@) $< && \
echo ' \
$(patsubst %.html,%,$(notdir $@))' > $@
diff --git a/trunk/Documentation/DocBook/deviceiobook.tmpl b/trunk/Documentation/DocBook/deviceiobook.tmpl
index 3ed88126ab8f..60d6e0b81bd9 100644
--- a/trunk/Documentation/DocBook/deviceiobook.tmpl
+++ b/trunk/Documentation/DocBook/deviceiobook.tmpl
@@ -24,7 +24,7 @@
Cox
- alan@lxorguk.ukuu.org.uk
+ alan@redhat.com
diff --git a/trunk/Documentation/DocBook/mcabook.tmpl b/trunk/Documentation/DocBook/mcabook.tmpl
index 467ccac6ec50..499eddc2d079 100644
--- a/trunk/Documentation/DocBook/mcabook.tmpl
+++ b/trunk/Documentation/DocBook/mcabook.tmpl
@@ -12,7 +12,7 @@
Cox
- alan@lxorguk.ukuu.org.uk
+ alan@redhat.com
diff --git a/trunk/Documentation/DocBook/wanbook.tmpl b/trunk/Documentation/DocBook/wanbook.tmpl
index 8c93db122f04..9eebcc304de4 100644
--- a/trunk/Documentation/DocBook/wanbook.tmpl
+++ b/trunk/Documentation/DocBook/wanbook.tmpl
@@ -12,7 +12,7 @@
Cox
- alan@lxorguk.ukuu.org.uk
+ alan@redhat.com
diff --git a/trunk/Documentation/DocBook/z8530book.tmpl b/trunk/Documentation/DocBook/z8530book.tmpl
index 6f3883be877e..a42a8a4c7689 100644
--- a/trunk/Documentation/DocBook/z8530book.tmpl
+++ b/trunk/Documentation/DocBook/z8530book.tmpl
@@ -12,7 +12,7 @@
Cox
- alan@lxorguk.ukuu.org.uk
+ alan@redhat.com
diff --git a/trunk/Documentation/ManagementStyle b/trunk/Documentation/ManagementStyle
index a5f0ea58c788..49a8efa5afeb 100644
--- a/trunk/Documentation/ManagementStyle
+++ b/trunk/Documentation/ManagementStyle
@@ -17,7 +17,7 @@ companies. If you sign purchase orders or you have any clue about the
budget of your group, you're almost certainly not a kernel manager.
These suggestions may or may not apply to you.
-First off, I'd suggest buying "Seven Habits of Highly Effective
+First off, I'd suggest buying "Seven Habits of Highly Successful
People", and NOT read it. Burn it, it's a great symbolic gesture.
(*) This document does so not so much by answering the question, but by
diff --git a/trunk/Documentation/accounting/.gitignore b/trunk/Documentation/accounting/.gitignore
deleted file mode 100644
index 86485203c4ae..000000000000
--- a/trunk/Documentation/accounting/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-getdelays
diff --git a/trunk/Documentation/auxdisplay/.gitignore b/trunk/Documentation/auxdisplay/.gitignore
deleted file mode 100644
index 7af222860a96..000000000000
--- a/trunk/Documentation/auxdisplay/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-cfag12864b-example
diff --git a/trunk/Documentation/connector/.gitignore b/trunk/Documentation/connector/.gitignore
deleted file mode 100644
index d2b9c32accd4..000000000000
--- a/trunk/Documentation/connector/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-ucon
diff --git a/trunk/Documentation/filesystems/Locking b/trunk/Documentation/filesystems/Locking
index 23d2f4460deb..8362860e21a7 100644
--- a/trunk/Documentation/filesystems/Locking
+++ b/trunk/Documentation/filesystems/Locking
@@ -161,12 +161,8 @@ prototypes:
int (*set_page_dirty)(struct page *page);
int (*readpages)(struct file *filp, struct address_space *mapping,
struct list_head *pages, unsigned nr_pages);
- int (*write_begin)(struct file *, struct address_space *mapping,
- loff_t pos, unsigned len, unsigned flags,
- struct page **pagep, void **fsdata);
- int (*write_end)(struct file *, struct address_space *mapping,
- loff_t pos, unsigned len, unsigned copied,
- struct page *page, void *fsdata);
+ int (*prepare_write)(struct file *, struct page *, unsigned, unsigned);
+ int (*commit_write)(struct file *, struct page *, unsigned, unsigned);
sector_t (*bmap)(struct address_space *, sector_t);
int (*invalidatepage) (struct page *, unsigned long);
int (*releasepage) (struct page *, int);
@@ -184,6 +180,8 @@ sync_page: no maybe
writepages: no
set_page_dirty no no
readpages: no
+prepare_write: no yes yes
+commit_write: no yes yes
write_begin: no locks the page yes
write_end: no yes, unlocks yes
perform_write: no n/a yes
@@ -193,7 +191,7 @@ releasepage: no yes
direct_IO: no
launder_page: no yes
- ->write_begin(), ->write_end(), ->sync_page() and ->readpage()
+ ->prepare_write(), ->commit_write(), ->sync_page() and ->readpage()
may be called from the request handler (/dev/loop).
->readpage() unlocks the page, either synchronously or via I/O
diff --git a/trunk/Documentation/filesystems/vfs.txt b/trunk/Documentation/filesystems/vfs.txt
index 5579bda58a6d..c4d348dabe94 100644
--- a/trunk/Documentation/filesystems/vfs.txt
+++ b/trunk/Documentation/filesystems/vfs.txt
@@ -492,7 +492,7 @@ written-back to storage typically in whole pages, however the
address_space has finer control of write sizes.
The read process essentially only requires 'readpage'. The write
-process is more complicated and uses write_begin/write_end or
+process is more complicated and uses prepare_write/commit_write or
set_page_dirty to write data into the address_space, and writepage,
sync_page, and writepages to writeback data to storage.
@@ -521,6 +521,8 @@ struct address_space_operations {
int (*set_page_dirty)(struct page *page);
int (*readpages)(struct file *filp, struct address_space *mapping,
struct list_head *pages, unsigned nr_pages);
+ int (*prepare_write)(struct file *, struct page *, unsigned, unsigned);
+ int (*commit_write)(struct file *, struct page *, unsigned, unsigned);
int (*write_begin)(struct file *, struct address_space *mapping,
loff_t pos, unsigned len, unsigned flags,
struct page **pagep, void **fsdata);
@@ -596,7 +598,37 @@ struct address_space_operations {
readpages is only used for read-ahead, so read errors are
ignored. If anything goes wrong, feel free to give up.
- write_begin:
+ prepare_write: called by the generic write path in VM to set up a write
+ request for a page. This indicates to the address space that
+ the given range of bytes is about to be written. The
+ address_space should check that the write will be able to
+ complete, by allocating space if necessary and doing any other
+ internal housekeeping. If the write will update parts of
+ any basic-blocks on storage, then those blocks should be
+ pre-read (if they haven't been read already) so that the
+ updated blocks can be written out properly.
+ The page will be locked.
+
+ Note: the page _must not_ be marked uptodate in this function
+ (or anywhere else) unless it actually is uptodate right now. As
+ soon as a page is marked uptodate, it is possible for a concurrent
+ read(2) to copy it to userspace.
+
+ commit_write: If prepare_write succeeds, new data will be copied
+ into the page and then commit_write will be called. It will
+ typically update the size of the file (if appropriate) and
+ mark the inode as dirty, and do any other related housekeeping
+ operations. It should avoid returning an error if possible -
+ errors should have been handled by prepare_write.
+
+ write_begin: This is intended as a replacement for prepare_write. The
+ key differences being that:
+ - it returns a locked page (in *pagep) rather than being
+ given a pre locked page;
+ - it must be able to cope with short writes (where the
+ length passed to write_begin is greater than the number
+ of bytes copied into the page).
+
Called by the generic buffered write code to ask the filesystem to
prepare to write len bytes at the given offset in the file. The
address_space should check that the write will be able to complete,
@@ -608,9 +640,6 @@ struct address_space_operations {
The filesystem must return the locked pagecache page for the specified
offset, in *pagep, for the caller to write into.
- It must be able to cope with short writes (where the length passed to
- write_begin is greater than the number of bytes copied into the page).
-
flags is a field for AOP_FLAG_xxx flags, described in
include/linux/fs.h.
diff --git a/trunk/Documentation/ia64/.gitignore b/trunk/Documentation/ia64/.gitignore
deleted file mode 100644
index ab806edc8732..000000000000
--- a/trunk/Documentation/ia64/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-aliasing-test
diff --git a/trunk/Documentation/isdn/CREDITS b/trunk/Documentation/isdn/CREDITS
index c1679e913fca..8cac6c2f23ee 100644
--- a/trunk/Documentation/isdn/CREDITS
+++ b/trunk/Documentation/isdn/CREDITS
@@ -5,7 +5,7 @@ I want to thank all who contributed to this project and especially to:
Thomas Bogendörfer (tsbogend@bigbug.franken.de)
Tester, lots of bugfixes and hints.
-Alan Cox (alan@lxorguk.ukuu.org.uk)
+Alan Cox (alan@redhat.com)
For help getting into standard-kernel.
Henner Eisen (eis@baty.hanse.de)
diff --git a/trunk/Documentation/networking/.gitignore b/trunk/Documentation/networking/.gitignore
deleted file mode 100644
index 286a5680f490..000000000000
--- a/trunk/Documentation/networking/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-ifenslave
diff --git a/trunk/Documentation/networking/dmfe.txt b/trunk/Documentation/networking/dmfe.txt
index 8006c227fda2..b1b7499dd9d3 100644
--- a/trunk/Documentation/networking/dmfe.txt
+++ b/trunk/Documentation/networking/dmfe.txt
@@ -60,6 +60,6 @@ Tobias Ringstrom : Current Maintainer
Contributors:
Marcelo Tosatti
-Alan Cox
+Alan Cox
Jeff Garzik
Vojtech Pavlik
diff --git a/trunk/Documentation/pcmcia/.gitignore b/trunk/Documentation/pcmcia/.gitignore
deleted file mode 100644
index 53d081336757..000000000000
--- a/trunk/Documentation/pcmcia/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-crc32hash
diff --git a/trunk/Documentation/scsi/aacraid.txt b/trunk/Documentation/scsi/aacraid.txt
index ddace3afc83b..709ca991a451 100644
--- a/trunk/Documentation/scsi/aacraid.txt
+++ b/trunk/Documentation/scsi/aacraid.txt
@@ -128,7 +128,7 @@ Supported Cards/Chipsets
People
-------------------------
-Alan Cox
+Alan Cox
Christoph Hellwig (updates for new-style PCI probing and SCSI host registration,
small cleanups/fixes)
Matt Domsch (revision ioctl, adapter messages)
diff --git a/trunk/Documentation/spi/.gitignore b/trunk/Documentation/spi/.gitignore
deleted file mode 100644
index 4280576397e8..000000000000
--- a/trunk/Documentation/spi/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-spidev_fdx
-spidev_test
diff --git a/trunk/Documentation/video4linux/.gitignore b/trunk/Documentation/video4linux/.gitignore
deleted file mode 100644
index 952703943e8e..000000000000
--- a/trunk/Documentation/video4linux/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-v4lgrab
diff --git a/trunk/Documentation/video4linux/bttv/CONTRIBUTORS b/trunk/Documentation/video4linux/bttv/CONTRIBUTORS
index eb41b2650860..8aad6dd93d6b 100644
--- a/trunk/Documentation/video4linux/bttv/CONTRIBUTORS
+++ b/trunk/Documentation/video4linux/bttv/CONTRIBUTORS
@@ -3,7 +3,7 @@ Contributors to bttv:
Michael Chu
AverMedia fix and more flexible card recognition
-Alan Cox
+Alan Cox
Video4Linux interface and 2.1.x kernel adaptation
Chris Kleitsch
diff --git a/trunk/Documentation/vm/.gitignore b/trunk/Documentation/vm/.gitignore
deleted file mode 100644
index 33e8a023df02..000000000000
--- a/trunk/Documentation/vm/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-slabinfo
diff --git a/trunk/Documentation/watchdog/src/.gitignore b/trunk/Documentation/watchdog/src/.gitignore
deleted file mode 100644
index ac90997dba93..000000000000
--- a/trunk/Documentation/watchdog/src/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-watchdog-simple
-watchdog-test
diff --git a/trunk/MAINTAINERS b/trunk/MAINTAINERS
index ce521d25ce34..16202c8ac68f 100644
--- a/trunk/MAINTAINERS
+++ b/trunk/MAINTAINERS
@@ -2701,16 +2701,6 @@ M: matthew@wil.cx
L: linux-scsi@vger.kernel.org
S: Maintained
-LTP (Linux Test Project)
-P: Subrata Modak
-M: subrata@linux.vnet.ibm.com
-P: Mike Frysinger
-M: vapier@gentoo.org
-L: ltp-list@lists.sourceforge.net (subscribers-only)
-W: http://ltp.sourceforge.net/
-T: git kernel.org/pub/scm/linux/kernel/git/galak/ltp.git
-S: Maintained
-
M32R ARCHITECTURE
P: Hirokazu Takata
M: takata@linux-m32r.org
diff --git a/trunk/arch/x86/boot/compressed/.gitignore b/trunk/arch/x86/boot/compressed/.gitignore
index 63eff3b04d01..be0ed065249b 100644
--- a/trunk/arch/x86/boot/compressed/.gitignore
+++ b/trunk/arch/x86/boot/compressed/.gitignore
@@ -1,3 +1 @@
relocs
-vmlinux.bin.all
-vmlinux.relocs
diff --git a/trunk/drivers/block/loop.c b/trunk/drivers/block/loop.c
index 5c4ee70d5cf3..3f09cd8bcc38 100644
--- a/trunk/drivers/block/loop.c
+++ b/trunk/drivers/block/loop.c
@@ -40,7 +40,8 @@
* Heinz Mauelshagen , Feb 2002
*
* Support for falling back on the write file operation when the address space
- * operations write_begin is not available on the backing filesystem.
+ * operations prepare_write and/or commit_write are not available on the
+ * backing filesystem.
* Anton Altaparmakov, 16 Feb 2005
*
* Still To Fix:
@@ -764,7 +765,7 @@ static int loop_set_fd(struct loop_device *lo, fmode_t mode,
*/
if (!file->f_op->splice_read)
goto out_putf;
- if (aops->write_begin)
+ if (aops->prepare_write || aops->write_begin)
lo_flags |= LO_FLAGS_USE_AOPS;
if (!(lo_flags & LO_FLAGS_USE_AOPS) && !file->f_op->write)
lo_flags |= LO_FLAGS_READ_ONLY;
diff --git a/trunk/drivers/char/ipmi/ipmi_devintf.c b/trunk/drivers/char/ipmi/ipmi_devintf.c
index 1d7b429f7ffa..835a33c8d5f5 100644
--- a/trunk/drivers/char/ipmi/ipmi_devintf.c
+++ b/trunk/drivers/char/ipmi/ipmi_devintf.c
@@ -957,4 +957,3 @@ module_exit(cleanup_ipmi);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Corey Minyard ");
MODULE_DESCRIPTION("Linux device interface for the IPMI message handler.");
-MODULE_ALIAS("platform:ipmi_si");
diff --git a/trunk/drivers/edac/Kconfig b/trunk/drivers/edac/Kconfig
index e0dbd388757f..5a11e3cbcae2 100644
--- a/trunk/drivers/edac/Kconfig
+++ b/trunk/drivers/edac/Kconfig
@@ -102,13 +102,6 @@ config EDAC_I3000
Support for error detection and correction on the Intel
3000 and 3010 server chipsets.
-config EDAC_X38
- tristate "Intel X38"
- depends on EDAC_MM_EDAC && PCI && X86
- help
- Support for error detection and correction on the Intel
- X38 server chipsets.
-
config EDAC_I82860
tristate "Intel 82860"
depends on EDAC_MM_EDAC && PCI && X86_32
diff --git a/trunk/drivers/edac/Makefile b/trunk/drivers/edac/Makefile
index 62c2d9bad8dc..e5e9104b5520 100644
--- a/trunk/drivers/edac/Makefile
+++ b/trunk/drivers/edac/Makefile
@@ -26,7 +26,6 @@ obj-$(CONFIG_EDAC_I82443BXGX) += i82443bxgx_edac.o
obj-$(CONFIG_EDAC_I82875P) += i82875p_edac.o
obj-$(CONFIG_EDAC_I82975X) += i82975x_edac.o
obj-$(CONFIG_EDAC_I3000) += i3000_edac.o
-obj-$(CONFIG_EDAC_X38) += x38_edac.o
obj-$(CONFIG_EDAC_I82860) += i82860_edac.o
obj-$(CONFIG_EDAC_R82600) += r82600_edac.o
obj-$(CONFIG_EDAC_PASEMI) += pasemi_edac.o
diff --git a/trunk/drivers/edac/cell_edac.c b/trunk/drivers/edac/cell_edac.c
index cd2e3b8087e7..887072f5dc8b 100644
--- a/trunk/drivers/edac/cell_edac.c
+++ b/trunk/drivers/edac/cell_edac.c
@@ -9,7 +9,6 @@
*/
#undef DEBUG
-#include
#include
#include
#include
@@ -165,8 +164,6 @@ static int __devinit cell_edac_probe(struct platform_device *pdev)
if (regs == NULL)
return -ENODEV;
- edac_op_state = EDAC_OPSTATE_POLL;
-
/* Get channel population */
reg = in_be64(®s->mic_mnt_cfg);
dev_dbg(&pdev->dev, "MIC_MNT_CFG = 0x%016lx\n", reg);
diff --git a/trunk/drivers/edac/x38_edac.c b/trunk/drivers/edac/x38_edac.c
deleted file mode 100644
index 2406c2ce2844..000000000000
--- a/trunk/drivers/edac/x38_edac.c
+++ /dev/null
@@ -1,524 +0,0 @@
-/*
- * Intel X38 Memory Controller kernel module
- * Copyright (C) 2008 Cluster Computing, Inc.
- *
- * This file may be distributed under the terms of the
- * GNU General Public License.
- *
- * This file is based on i3200_edac.c
- *
- */
-
-#include
-#include
-#include
-#include
-#include
-#include
-#include "edac_core.h"
-
-#define X38_REVISION "1.1"
-
-#define EDAC_MOD_STR "x38_edac"
-
-#define PCI_DEVICE_ID_INTEL_X38_HB 0x29e0
-
-#define X38_RANKS 8
-#define X38_RANKS_PER_CHANNEL 4
-#define X38_CHANNELS 2
-
-/* Intel X38 register addresses - device 0 function 0 - DRAM Controller */
-
-#define X38_MCHBAR_LOW 0x48 /* MCH Memory Mapped Register BAR */
-#define X38_MCHBAR_HIGH 0x4b
-#define X38_MCHBAR_MASK 0xfffffc000ULL /* bits 35:14 */
-#define X38_MMR_WINDOW_SIZE 16384
-
-#define X38_TOM 0xa0 /* Top of Memory (16b)
- *
- * 15:10 reserved
- * 9:0 total populated physical memory
- */
-#define X38_TOM_MASK 0x3ff /* bits 9:0 */
-#define X38_TOM_SHIFT 26 /* 64MiB grain */
-
-#define X38_ERRSTS 0xc8 /* Error Status Register (16b)
- *
- * 15 reserved
- * 14 Isochronous TBWRR Run Behind FIFO Full
- * (ITCV)
- * 13 Isochronous TBWRR Run Behind FIFO Put
- * (ITSTV)
- * 12 reserved
- * 11 MCH Thermal Sensor Event
- * for SMI/SCI/SERR (GTSE)
- * 10 reserved
- * 9 LOCK to non-DRAM Memory Flag (LCKF)
- * 8 reserved
- * 7 DRAM Throttle Flag (DTF)
- * 6:2 reserved
- * 1 Multi-bit DRAM ECC Error Flag (DMERR)
- * 0 Single-bit DRAM ECC Error Flag (DSERR)
- */
-#define X38_ERRSTS_UE 0x0002
-#define X38_ERRSTS_CE 0x0001
-#define X38_ERRSTS_BITS (X38_ERRSTS_UE | X38_ERRSTS_CE)
-
-
-/* Intel MMIO register space - device 0 function 0 - MMR space */
-
-#define X38_C0DRB 0x200 /* Channel 0 DRAM Rank Boundary (16b x 4)
- *
- * 15:10 reserved
- * 9:0 Channel 0 DRAM Rank Boundary Address
- */
-#define X38_C1DRB 0x600 /* Channel 1 DRAM Rank Boundary (16b x 4) */
-#define X38_DRB_MASK 0x3ff /* bits 9:0 */
-#define X38_DRB_SHIFT 26 /* 64MiB grain */
-
-#define X38_C0ECCERRLOG 0x280 /* Channel 0 ECC Error Log (64b)
- *
- * 63:48 Error Column Address (ERRCOL)
- * 47:32 Error Row Address (ERRROW)
- * 31:29 Error Bank Address (ERRBANK)
- * 28:27 Error Rank Address (ERRRANK)
- * 26:24 reserved
- * 23:16 Error Syndrome (ERRSYND)
- * 15: 2 reserved
- * 1 Multiple Bit Error Status (MERRSTS)
- * 0 Correctable Error Status (CERRSTS)
- */
-#define X38_C1ECCERRLOG 0x680 /* Channel 1 ECC Error Log (64b) */
-#define X38_ECCERRLOG_CE 0x1
-#define X38_ECCERRLOG_UE 0x2
-#define X38_ECCERRLOG_RANK_BITS 0x18000000
-#define X38_ECCERRLOG_SYNDROME_BITS 0xff0000
-
-#define X38_CAPID0 0xe0 /* see P.94 of spec for details */
-
-static int x38_channel_num;
-
-static int how_many_channel(struct pci_dev *pdev)
-{
- unsigned char capid0_8b; /* 8th byte of CAPID0 */
-
- pci_read_config_byte(pdev, X38_CAPID0 + 8, &capid0_8b);
- if (capid0_8b & 0x20) { /* check DCD: Dual Channel Disable */
- debugf0("In single channel mode.\n");
- x38_channel_num = 1;
- } else {
- debugf0("In dual channel mode.\n");
- x38_channel_num = 2;
- }
-
- return x38_channel_num;
-}
-
-static unsigned long eccerrlog_syndrome(u64 log)
-{
- return (log & X38_ECCERRLOG_SYNDROME_BITS) >> 16;
-}
-
-static int eccerrlog_row(int channel, u64 log)
-{
- return ((log & X38_ECCERRLOG_RANK_BITS) >> 27) |
- (channel * X38_RANKS_PER_CHANNEL);
-}
-
-enum x38_chips {
- X38 = 0,
-};
-
-struct x38_dev_info {
- const char *ctl_name;
-};
-
-struct x38_error_info {
- u16 errsts;
- u16 errsts2;
- u64 eccerrlog[X38_CHANNELS];
-};
-
-static const struct x38_dev_info x38_devs[] = {
- [X38] = {
- .ctl_name = "x38"},
-};
-
-static struct pci_dev *mci_pdev;
-static int x38_registered = 1;
-
-
-static void x38_clear_error_info(struct mem_ctl_info *mci)
-{
- struct pci_dev *pdev;
-
- pdev = to_pci_dev(mci->dev);
-
- /*
- * Clear any error bits.
- * (Yes, we really clear bits by writing 1 to them.)
- */
- pci_write_bits16(pdev, X38_ERRSTS, X38_ERRSTS_BITS,
- X38_ERRSTS_BITS);
-}
-
-static u64 x38_readq(const void __iomem *addr)
-{
- return readl(addr) | (((u64)readl(addr + 4)) << 32);
-}
-
-static void x38_get_and_clear_error_info(struct mem_ctl_info *mci,
- struct x38_error_info *info)
-{
- struct pci_dev *pdev;
- void __iomem *window = mci->pvt_info;
-
- pdev = to_pci_dev(mci->dev);
-
- /*
- * This is a mess because there is no atomic way to read all the
- * registers at once and the registers can transition from CE being
- * overwritten by UE.
- */
- pci_read_config_word(pdev, X38_ERRSTS, &info->errsts);
- if (!(info->errsts & X38_ERRSTS_BITS))
- return;
-
- info->eccerrlog[0] = x38_readq(window + X38_C0ECCERRLOG);
- if (x38_channel_num == 2)
- info->eccerrlog[1] = x38_readq(window + X38_C1ECCERRLOG);
-
- pci_read_config_word(pdev, X38_ERRSTS, &info->errsts2);
-
- /*
- * If the error is the same for both reads then the first set
- * of reads is valid. If there is a change then there is a CE
- * with no info and the second set of reads is valid and
- * should be UE info.
- */
- if ((info->errsts ^ info->errsts2) & X38_ERRSTS_BITS) {
- info->eccerrlog[0] = x38_readq(window + X38_C0ECCERRLOG);
- if (x38_channel_num == 2)
- info->eccerrlog[1] =
- x38_readq(window + X38_C1ECCERRLOG);
- }
-
- x38_clear_error_info(mci);
-}
-
-static void x38_process_error_info(struct mem_ctl_info *mci,
- struct x38_error_info *info)
-{
- int channel;
- u64 log;
-
- if (!(info->errsts & X38_ERRSTS_BITS))
- return;
-
- if ((info->errsts ^ info->errsts2) & X38_ERRSTS_BITS) {
- edac_mc_handle_ce_no_info(mci, "UE overwrote CE");
- info->errsts = info->errsts2;
- }
-
- for (channel = 0; channel < x38_channel_num; channel++) {
- log = info->eccerrlog[channel];
- if (log & X38_ECCERRLOG_UE) {
- edac_mc_handle_ue(mci, 0, 0,
- eccerrlog_row(channel, log), "x38 UE");
- } else if (log & X38_ECCERRLOG_CE) {
- edac_mc_handle_ce(mci, 0, 0,
- eccerrlog_syndrome(log),
- eccerrlog_row(channel, log), 0, "x38 CE");
- }
- }
-}
-
-static void x38_check(struct mem_ctl_info *mci)
-{
- struct x38_error_info info;
-
- debugf1("MC%d: %s()\n", mci->mc_idx, __func__);
- x38_get_and_clear_error_info(mci, &info);
- x38_process_error_info(mci, &info);
-}
-
-
-void __iomem *x38_map_mchbar(struct pci_dev *pdev)
-{
- union {
- u64 mchbar;
- struct {
- u32 mchbar_low;
- u32 mchbar_high;
- };
- } u;
- void __iomem *window;
-
- pci_read_config_dword(pdev, X38_MCHBAR_LOW, &u.mchbar_low);
- pci_write_config_dword(pdev, X38_MCHBAR_LOW, u.mchbar_low | 0x1);
- pci_read_config_dword(pdev, X38_MCHBAR_HIGH, &u.mchbar_high);
- u.mchbar &= X38_MCHBAR_MASK;
-
- if (u.mchbar != (resource_size_t)u.mchbar) {
- printk(KERN_ERR
- "x38: mmio space beyond accessible range (0x%llx)\n",
- (unsigned long long)u.mchbar);
- return NULL;
- }
-
- window = ioremap_nocache(u.mchbar, X38_MMR_WINDOW_SIZE);
- if (!window)
- printk(KERN_ERR "x38: cannot map mmio space at 0x%llx\n",
- (unsigned long long)u.mchbar);
-
- return window;
-}
-
-
-static void x38_get_drbs(void __iomem *window,
- u16 drbs[X38_CHANNELS][X38_RANKS_PER_CHANNEL])
-{
- int i;
-
- for (i = 0; i < X38_RANKS_PER_CHANNEL; i++) {
- drbs[0][i] = readw(window + X38_C0DRB + 2*i) & X38_DRB_MASK;
- drbs[1][i] = readw(window + X38_C1DRB + 2*i) & X38_DRB_MASK;
- }
-}
-
-static bool x38_is_stacked(struct pci_dev *pdev,
- u16 drbs[X38_CHANNELS][X38_RANKS_PER_CHANNEL])
-{
- u16 tom;
-
- pci_read_config_word(pdev, X38_TOM, &tom);
- tom &= X38_TOM_MASK;
-
- return drbs[X38_CHANNELS - 1][X38_RANKS_PER_CHANNEL - 1] == tom;
-}
-
-static unsigned long drb_to_nr_pages(
- u16 drbs[X38_CHANNELS][X38_RANKS_PER_CHANNEL],
- bool stacked, int channel, int rank)
-{
- int n;
-
- n = drbs[channel][rank];
- if (rank > 0)
- n -= drbs[channel][rank - 1];
- if (stacked && (channel == 1) && drbs[channel][rank] ==
- drbs[channel][X38_RANKS_PER_CHANNEL - 1]) {
- n -= drbs[0][X38_RANKS_PER_CHANNEL - 1];
- }
-
- n <<= (X38_DRB_SHIFT - PAGE_SHIFT);
- return n;
-}
-
-static int x38_probe1(struct pci_dev *pdev, int dev_idx)
-{
- int rc;
- int i;
- struct mem_ctl_info *mci = NULL;
- unsigned long last_page;
- u16 drbs[X38_CHANNELS][X38_RANKS_PER_CHANNEL];
- bool stacked;
- void __iomem *window;
-
- debugf0("MC: %s()\n", __func__);
-
- window = x38_map_mchbar(pdev);
- if (!window)
- return -ENODEV;
-
- x38_get_drbs(window, drbs);
-
- how_many_channel(pdev);
-
- /* FIXME: unconventional pvt_info usage */
- mci = edac_mc_alloc(0, X38_RANKS, x38_channel_num, 0);
- if (!mci)
- return -ENOMEM;
-
- debugf3("MC: %s(): init mci\n", __func__);
-
- mci->dev = &pdev->dev;
- mci->mtype_cap = MEM_FLAG_DDR2;
-
- mci->edac_ctl_cap = EDAC_FLAG_SECDED;
- mci->edac_cap = EDAC_FLAG_SECDED;
-
- mci->mod_name = EDAC_MOD_STR;
- mci->mod_ver = X38_REVISION;
- mci->ctl_name = x38_devs[dev_idx].ctl_name;
- mci->dev_name = pci_name(pdev);
- mci->edac_check = x38_check;
- mci->ctl_page_to_phys = NULL;
- mci->pvt_info = window;
-
- stacked = x38_is_stacked(pdev, drbs);
-
- /*
- * The dram rank boundary (DRB) reg values are boundary addresses
- * for each DRAM rank with a granularity of 64MB. DRB regs are
- * cumulative; the last one will contain the total memory
- * contained in all ranks.
- */
- last_page = -1UL;
- for (i = 0; i < mci->nr_csrows; i++) {
- unsigned long nr_pages;
- struct csrow_info *csrow = &mci->csrows[i];
-
- nr_pages = drb_to_nr_pages(drbs, stacked,
- i / X38_RANKS_PER_CHANNEL,
- i % X38_RANKS_PER_CHANNEL);
-
- if (nr_pages == 0) {
- csrow->mtype = MEM_EMPTY;
- continue;
- }
-
- csrow->first_page = last_page + 1;
- last_page += nr_pages;
- csrow->last_page = last_page;
- csrow->nr_pages = nr_pages;
-
- csrow->grain = nr_pages << PAGE_SHIFT;
- csrow->mtype = MEM_DDR2;
- csrow->dtype = DEV_UNKNOWN;
- csrow->edac_mode = EDAC_UNKNOWN;
- }
-
- x38_clear_error_info(mci);
-
- rc = -ENODEV;
- if (edac_mc_add_mc(mci)) {
- debugf3("MC: %s(): failed edac_mc_add_mc()\n", __func__);
- goto fail;
- }
-
- /* get this far and it's successful */
- debugf3("MC: %s(): success\n", __func__);
- return 0;
-
-fail:
- iounmap(window);
- if (mci)
- edac_mc_free(mci);
-
- return rc;
-}
-
-static int __devinit x38_init_one(struct pci_dev *pdev,
- const struct pci_device_id *ent)
-{
- int rc;
-
- debugf0("MC: %s()\n", __func__);
-
- if (pci_enable_device(pdev) < 0)
- return -EIO;
-
- rc = x38_probe1(pdev, ent->driver_data);
- if (!mci_pdev)
- mci_pdev = pci_dev_get(pdev);
-
- return rc;
-}
-
-static void __devexit x38_remove_one(struct pci_dev *pdev)
-{
- struct mem_ctl_info *mci;
-
- debugf0("%s()\n", __func__);
-
- mci = edac_mc_del_mc(&pdev->dev);
- if (!mci)
- return;
-
- iounmap(mci->pvt_info);
-
- edac_mc_free(mci);
-}
-
-static const struct pci_device_id x38_pci_tbl[] __devinitdata = {
- {
- PCI_VEND_DEV(INTEL, X38_HB), PCI_ANY_ID, PCI_ANY_ID, 0, 0,
- X38},
- {
- 0,
- } /* 0 terminated list. */
-};
-
-MODULE_DEVICE_TABLE(pci, x38_pci_tbl);
-
-static struct pci_driver x38_driver = {
- .name = EDAC_MOD_STR,
- .probe = x38_init_one,
- .remove = __devexit_p(x38_remove_one),
- .id_table = x38_pci_tbl,
-};
-
-static int __init x38_init(void)
-{
- int pci_rc;
-
- debugf3("MC: %s()\n", __func__);
-
- /* Ensure that the OPSTATE is set correctly for POLL or NMI */
- opstate_init();
-
- pci_rc = pci_register_driver(&x38_driver);
- if (pci_rc < 0)
- goto fail0;
-
- if (!mci_pdev) {
- x38_registered = 0;
- mci_pdev = pci_get_device(PCI_VENDOR_ID_INTEL,
- PCI_DEVICE_ID_INTEL_X38_HB, NULL);
- if (!mci_pdev) {
- debugf0("x38 pci_get_device fail\n");
- pci_rc = -ENODEV;
- goto fail1;
- }
-
- pci_rc = x38_init_one(mci_pdev, x38_pci_tbl);
- if (pci_rc < 0) {
- debugf0("x38 init fail\n");
- pci_rc = -ENODEV;
- goto fail1;
- }
- }
-
- return 0;
-
-fail1:
- pci_unregister_driver(&x38_driver);
-
-fail0:
- if (mci_pdev)
- pci_dev_put(mci_pdev);
-
- return pci_rc;
-}
-
-static void __exit x38_exit(void)
-{
- debugf3("MC: %s()\n", __func__);
-
- pci_unregister_driver(&x38_driver);
- if (!x38_registered) {
- x38_remove_one(mci_pdev);
- pci_dev_put(mci_pdev);
- }
-}
-
-module_init(x38_init);
-module_exit(x38_exit);
-
-MODULE_LICENSE("GPL");
-MODULE_AUTHOR("Cluster Computing, Inc. Hitoshi Mitake");
-MODULE_DESCRIPTION("MC support for Intel X38 memory hub controllers");
-
-module_param(edac_op_state, int, 0444);
-MODULE_PARM_DESC(edac_op_state, "EDAC Error Reporting state: 0=Poll,1=NMI");
diff --git a/trunk/drivers/message/i2o/i2o_block.c b/trunk/drivers/message/i2o/i2o_block.c
index 84bdc2ee69e6..11a617ab4243 100644
--- a/trunk/drivers/message/i2o/i2o_block.c
+++ b/trunk/drivers/message/i2o/i2o_block.c
@@ -567,8 +567,8 @@ static void i2o_block_biosparam(unsigned long capacity, unsigned short *cyls,
/**
* i2o_block_open - Open the block device
- * @bdev: block device being opened
- * @mode: file open mode
+ * @inode: inode for block device being opened
+ * @file: file to open
*
* Power up the device, mount and lock the media. This function is called,
* if the block device is opened for access.
@@ -596,8 +596,8 @@ static int i2o_block_open(struct block_device *bdev, fmode_t mode)
/**
* i2o_block_release - Release the I2O block device
- * @disk: gendisk device being released
- * @mode: file open mode
+ * @inode: inode for block device being released
+ * @file: file to close
*
* Unlock and unmount the media, and power down the device. Gets called if
* the block device is closed.
@@ -643,8 +643,8 @@ static int i2o_block_getgeo(struct block_device *bdev, struct hd_geometry *geo)
/**
* i2o_block_ioctl - Issue device specific ioctl calls.
- * @bdev: block device being opened
- * @mode: file open mode
+ * @inode: inode for block device ioctl
+ * @file: file for ioctl
* @cmd: ioctl command
* @arg: arg
*
diff --git a/trunk/drivers/misc/hdpuftrs/hdpu_nexus.c b/trunk/drivers/misc/hdpuftrs/hdpu_nexus.c
index ce39fa54949b..08e26beefe64 100644
--- a/trunk/drivers/misc/hdpuftrs/hdpu_nexus.c
+++ b/trunk/drivers/misc/hdpuftrs/hdpu_nexus.c
@@ -113,6 +113,7 @@ static int hdpu_nexus_probe(struct platform_device *pdev)
if (!hdpu_chassis_id)
printk(KERN_WARNING "sky_nexus: "
"Unable to create proc dir entry: sky_chassis_id\n");
+ }
return 0;
}
diff --git a/trunk/drivers/misc/sgi-xp/Makefile b/trunk/drivers/misc/sgi-xp/Makefile
index 4fc40d8e1bcc..35ce28578075 100644
--- a/trunk/drivers/misc/sgi-xp/Makefile
+++ b/trunk/drivers/misc/sgi-xp/Makefile
@@ -5,14 +5,14 @@
obj-$(CONFIG_SGI_XP) += xp.o
xp-y := xp_main.o
xp-$(CONFIG_IA64_SGI_SN2) += xp_sn2.o xp_nofault.o
-xp-$(CONFIG_IA64_GENERIC) += xp_sn2.o xp_nofault.o
+xp-$(CONFIG_IA64_GENERIC) += xp_sn2.o xp_nofault.o xp_uv.o
xp-$(CONFIG_IA64_SGI_UV) += xp_uv.o
xp-$(CONFIG_X86_64) += xp_uv.o
obj-$(CONFIG_SGI_XP) += xpc.o
xpc-y := xpc_main.o xpc_channel.o xpc_partition.o
xpc-$(CONFIG_IA64_SGI_SN2) += xpc_sn2.o
-xpc-$(CONFIG_IA64_GENERIC) += xpc_sn2.o
+xpc-$(CONFIG_IA64_GENERIC) += xpc_sn2.o xpc_uv.o
xpc-$(CONFIG_IA64_SGI_UV) += xpc_uv.o
xpc-$(CONFIG_X86_64) += xpc_uv.o
diff --git a/trunk/drivers/misc/sgi-xp/xp.h b/trunk/drivers/misc/sgi-xp/xp.h
index ed1722e50049..859a5281c61b 100644
--- a/trunk/drivers/misc/sgi-xp/xp.h
+++ b/trunk/drivers/misc/sgi-xp/xp.h
@@ -19,11 +19,7 @@
#include
#include /* defines is_shub1() and is_shub2() */
#define is_shub() ia64_platform_is("sn2")
-#ifdef CONFIG_IA64_SGI_UV
#define is_uv() ia64_platform_is("uv")
-#else
-#define is_uv() 0
-#endif
#endif
#ifdef CONFIG_X86_64
#include
diff --git a/trunk/drivers/misc/sgi-xp/xpc_main.c b/trunk/drivers/misc/sgi-xp/xpc_main.c
index e8d5cfbd32c2..46325fc84811 100644
--- a/trunk/drivers/misc/sgi-xp/xpc_main.c
+++ b/trunk/drivers/misc/sgi-xp/xpc_main.c
@@ -1104,7 +1104,7 @@ xpc_do_exit(enum xp_retval reason)
if (is_shub())
xpc_exit_sn2();
- else if (is_uv())
+ else
xpc_exit_uv();
}
@@ -1363,7 +1363,7 @@ xpc_init(void)
out_1:
if (is_shub())
xpc_exit_sn2();
- else if (is_uv())
+ else
xpc_exit_uv();
return ret;
}
diff --git a/trunk/drivers/misc/sony-laptop.c b/trunk/drivers/misc/sony-laptop.c
index f483c4221f76..5a97d3a9d745 100644
--- a/trunk/drivers/misc/sony-laptop.c
+++ b/trunk/drivers/misc/sony-laptop.c
@@ -2315,10 +2315,8 @@ static int sony_pic_possible_resources(struct acpi_device *device)
*/
static int sony_pic_disable(struct acpi_device *device)
{
- acpi_status ret = acpi_evaluate_object(device->handle, "_DIS", NULL,
- NULL);
-
- if (ACPI_FAILURE(ret) && ret != AE_NOT_FOUND)
+ if (ACPI_FAILURE(acpi_evaluate_object(device->handle,
+ "_DIS", NULL, NULL)))
return -ENXIO;
dprintk("Device disabled\n");
diff --git a/trunk/drivers/rtc/rtc-ds3234.c b/trunk/drivers/rtc/rtc-ds3234.c
index 45e5b106af73..37d131d03f33 100644
--- a/trunk/drivers/rtc/rtc-ds3234.c
+++ b/trunk/drivers/rtc/rtc-ds3234.c
@@ -189,7 +189,7 @@ static const struct rtc_class_ops ds3234_rtc_ops = {
.set_time = ds3234_set_time,
};
-static int __devinit ds3234_probe(struct spi_device *spi)
+static int ds3234_probe(struct spi_device *spi)
{
struct rtc_device *rtc;
unsigned char tmp;
@@ -249,7 +249,7 @@ static int __devinit ds3234_probe(struct spi_device *spi)
return 0;
}
-static int __devexit ds3234_remove(struct spi_device *spi)
+static int __exit ds3234_remove(struct spi_device *spi)
{
struct ds3234 *chip = platform_get_drvdata(spi);
struct rtc_device *rtc = chip->rtc;
diff --git a/trunk/drivers/rtc/rtc-s3c.c b/trunk/drivers/rtc/rtc-s3c.c
index f59277bbedaa..910bc704939c 100644
--- a/trunk/drivers/rtc/rtc-s3c.c
+++ b/trunk/drivers/rtc/rtc-s3c.c
@@ -455,8 +455,6 @@ static int __devinit s3c_rtc_probe(struct platform_device *pdev)
s3c_rtc_setfreq(&pdev->dev, 1);
- device_init_wakeup(&pdev->dev, 1);
-
/* register RTC and exit */
rtc = rtc_device_register("s3c", &pdev->dev, &s3c_rtcops,
@@ -509,7 +507,7 @@ static int s3c_rtc_resume(struct platform_device *pdev)
#define s3c_rtc_resume NULL
#endif
-static struct platform_driver s3c2410_rtc_driver = {
+static struct platform_driver s3c2410_rtcdrv = {
.probe = s3c_rtc_probe,
.remove = __devexit_p(s3c_rtc_remove),
.suspend = s3c_rtc_suspend,
@@ -525,12 +523,12 @@ static char __initdata banner[] = "S3C24XX RTC, (c) 2004,2006 Simtec Electronics
static int __init s3c_rtc_init(void)
{
printk(banner);
- return platform_driver_register(&s3c2410_rtc_driver);
+ return platform_driver_register(&s3c2410_rtcdrv);
}
static void __exit s3c_rtc_exit(void)
{
- platform_driver_unregister(&s3c2410_rtc_driver);
+ platform_driver_unregister(&s3c2410_rtcdrv);
}
module_init(s3c_rtc_init);
diff --git a/trunk/drivers/video/console/fbcon.c b/trunk/drivers/video/console/fbcon.c
index b92947d62ad6..64b3d30027b8 100644
--- a/trunk/drivers/video/console/fbcon.c
+++ b/trunk/drivers/video/console/fbcon.c
@@ -2118,7 +2118,7 @@ static void fbcon_bmove_rec(struct vc_data *vc, struct display *p, int sy, int s
height, width);
}
-static void updatescrollmode(struct display *p,
+static __inline__ void updatescrollmode(struct display *p,
struct fb_info *info,
struct vc_data *vc)
{
diff --git a/trunk/drivers/video/fbmem.c b/trunk/drivers/video/fbmem.c
index 6048b55f2878..cd5f20da738a 100644
--- a/trunk/drivers/video/fbmem.c
+++ b/trunk/drivers/video/fbmem.c
@@ -1262,8 +1262,8 @@ fb_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
case FBIOPUT_CON2FBMAP:
arg = (unsigned long) compat_ptr(arg);
case FBIOBLANK:
- mutex_unlock(&info->lock);
- return fb_ioctl(file, cmd, arg);
+ ret = fb_ioctl(file, cmd, arg);
+ break;
case FBIOGET_FSCREENINFO:
ret = fb_get_fscreeninfo(inode, file, cmd, arg);
diff --git a/trunk/drivers/video/via/global.h b/trunk/drivers/video/via/global.h
index 7543d5f7e309..8e5263c5b812 100644
--- a/trunk/drivers/video/via/global.h
+++ b/trunk/drivers/video/via/global.h
@@ -38,6 +38,7 @@
#include "iface.h"
#include "viafbdev.h"
#include "chip.h"
+#include "debug.h"
#include "accel.h"
#include "share.h"
#include "dvi.h"
@@ -47,10 +48,12 @@
#include "lcd.h"
#include "ioctl.h"
+#include "viamode.h"
#include "via_utility.h"
#include "vt1636.h"
#include "tblDPASetting.h"
#include "tbl1636.h"
+#include "viafbdev.h"
/* External struct*/
diff --git a/trunk/fs/ecryptfs/crypto.c b/trunk/fs/ecryptfs/crypto.c
index 6046239465a1..06db79d05c12 100644
--- a/trunk/fs/ecryptfs/crypto.c
+++ b/trunk/fs/ecryptfs/crypto.c
@@ -1251,7 +1251,6 @@ struct kmem_cache *ecryptfs_header_cache_2;
/**
* ecryptfs_write_headers_virt
* @page_virt: The virtual address to write the headers to
- * @max: The size of memory allocated at page_virt
* @size: Set to the number of bytes written by this function
* @crypt_stat: The cryptographic context
* @ecryptfs_dentry: The eCryptfs dentry
@@ -1279,8 +1278,7 @@ struct kmem_cache *ecryptfs_header_cache_2;
*
* Returns zero on success
*/
-static int ecryptfs_write_headers_virt(char *page_virt, size_t max,
- size_t *size,
+static int ecryptfs_write_headers_virt(char *page_virt, size_t *size,
struct ecryptfs_crypt_stat *crypt_stat,
struct dentry *ecryptfs_dentry)
{
@@ -1298,7 +1296,7 @@ static int ecryptfs_write_headers_virt(char *page_virt, size_t max,
offset += written;
rc = ecryptfs_generate_key_packet_set((page_virt + offset), crypt_stat,
ecryptfs_dentry, &written,
- max - offset);
+ PAGE_CACHE_SIZE - offset);
if (rc)
ecryptfs_printk(KERN_WARNING, "Error generating key packet "
"set; rc = [%d]\n", rc);
@@ -1370,14 +1368,14 @@ int ecryptfs_write_metadata(struct dentry *ecryptfs_dentry)
goto out;
}
/* Released in this function */
- virt = (char *)get_zeroed_page(GFP_KERNEL);
+ virt = kzalloc(crypt_stat->num_header_bytes_at_front, GFP_KERNEL);
if (!virt) {
printk(KERN_ERR "%s: Out of memory\n", __func__);
rc = -ENOMEM;
goto out;
}
- rc = ecryptfs_write_headers_virt(virt, PAGE_CACHE_SIZE, &size,
- crypt_stat, ecryptfs_dentry);
+ rc = ecryptfs_write_headers_virt(virt, &size, crypt_stat,
+ ecryptfs_dentry);
if (unlikely(rc)) {
printk(KERN_ERR "%s: Error whilst writing headers; rc = [%d]\n",
__func__, rc);
@@ -1395,7 +1393,8 @@ int ecryptfs_write_metadata(struct dentry *ecryptfs_dentry)
goto out_free;
}
out_free:
- free_page((unsigned long)virt);
+ memset(virt, 0, crypt_stat->num_header_bytes_at_front);
+ kfree(virt);
out:
return rc;
}
diff --git a/trunk/fs/fat/inode.c b/trunk/fs/fat/inode.c
index 2b2eec1283bf..19eafbe3c379 100644
--- a/trunk/fs/fat/inode.c
+++ b/trunk/fs/fat/inode.c
@@ -175,7 +175,7 @@ static ssize_t fat_direct_IO(int rw, struct kiocb *iocb,
if (rw == WRITE) {
/*
- * FIXME: blockdev_direct_IO() doesn't use ->write_begin(),
+ * FIXME: blockdev_direct_IO() doesn't use ->prepare_write(),
* so we need to update the ->mmu_private to block boundary.
*
* But we must fill the remaining area or hole by nul for
diff --git a/trunk/fs/jbd/transaction.c b/trunk/fs/jbd/transaction.c
index 60d4c32c8808..d15cd6e7251e 100644
--- a/trunk/fs/jbd/transaction.c
+++ b/trunk/fs/jbd/transaction.c
@@ -860,6 +860,7 @@ int journal_get_create_access(handle_t *handle, struct buffer_head *bh)
* int journal_get_undo_access() - Notify intent to modify metadata with non-rewindable consequences
* @handle: transaction
* @bh: buffer to undo
+ * @credits: store the number of taken credits here (if not NULL)
*
* Sometimes there is a need to distinguish between metadata which has
* been committed to disk and that which has not. The ext3fs code uses
diff --git a/trunk/fs/libfs.c b/trunk/fs/libfs.c
index e960a8321902..74688598bcf7 100644
--- a/trunk/fs/libfs.c
+++ b/trunk/fs/libfs.c
@@ -814,7 +814,7 @@ EXPORT_SYMBOL(simple_getattr);
EXPORT_SYMBOL(simple_link);
EXPORT_SYMBOL(simple_lookup);
EXPORT_SYMBOL(simple_pin_fs);
-EXPORT_UNUSED_SYMBOL(simple_prepare_write);
+EXPORT_SYMBOL(simple_prepare_write);
EXPORT_SYMBOL(simple_readpage);
EXPORT_SYMBOL(simple_release_fs);
EXPORT_SYMBOL(simple_rename);
diff --git a/trunk/fs/ocfs2/file.c b/trunk/fs/ocfs2/file.c
index 7efe937a415f..8d3225a78073 100644
--- a/trunk/fs/ocfs2/file.c
+++ b/trunk/fs/ocfs2/file.c
@@ -679,7 +679,8 @@ static int __ocfs2_extend_allocation(struct inode *inode, u32 logical_start,
/* Some parts of this taken from generic_cont_expand, which turned out
* to be too fragile to do exactly what we need without us having to
- * worry about recursive locking in ->write_begin() and ->write_end(). */
+ * worry about recursive locking in ->prepare_write() and
+ * ->commit_write(). */
static int ocfs2_write_zero_page(struct inode *inode,
u64 size)
{
diff --git a/trunk/fs/splice.c b/trunk/fs/splice.c
index 1abab5cee4ba..a1e701c27156 100644
--- a/trunk/fs/splice.c
+++ b/trunk/fs/splice.c
@@ -731,8 +731,8 @@ ssize_t splice_from_pipe(struct pipe_inode_info *pipe, struct file *out,
};
/*
- * The actor worker might be calling ->write_begin and
- * ->write_end. Most of the time, these expect i_mutex to
+ * The actor worker might be calling ->prepare_write and
+ * ->commit_write. Most of the time, these expect i_mutex to
* be held. Since this may result in an ABBA deadlock with
* pipe->inode, we have to order lock acquiry here.
*/
diff --git a/trunk/include/linux/cgroup.h b/trunk/include/linux/cgroup.h
index 1164963c3a85..8b00f6643e93 100644
--- a/trunk/include/linux/cgroup.h
+++ b/trunk/include/linux/cgroup.h
@@ -25,6 +25,7 @@ struct cgroup;
extern int cgroup_init_early(void);
extern int cgroup_init(void);
+extern void cgroup_init_smp(void);
extern void cgroup_lock(void);
extern bool cgroup_lock_live_group(struct cgroup *cgrp);
extern void cgroup_unlock(void);
@@ -347,6 +348,8 @@ struct cgroup_subsys {
struct cgroupfs_root *root;
struct list_head sibling;
+
+ void *private;
};
#define SUBSYS(_x) extern struct cgroup_subsys _x ## _subsys;
@@ -407,6 +410,7 @@ void cgroup_mm_owner_callbacks(struct task_struct *old,
static inline int cgroup_init_early(void) { return 0; }
static inline int cgroup_init(void) { return 0; }
+static inline void cgroup_init_smp(void) {}
static inline void cgroup_fork(struct task_struct *p) {}
static inline void cgroup_fork_callbacks(struct task_struct *p) {}
static inline void cgroup_post_fork(struct task_struct *p) {}
diff --git a/trunk/include/linux/freezer.h b/trunk/include/linux/freezer.h
index 5a361f85cfec..8f225339eee9 100644
--- a/trunk/include/linux/freezer.h
+++ b/trunk/include/linux/freezer.h
@@ -44,6 +44,11 @@ static inline bool should_send_signal(struct task_struct *p)
return !(p->flags & PF_FREEZER_NOSIG);
}
+/*
+ * Wake up a frozen process
+ */
+extern int __thaw_process(struct task_struct *p);
+
/* Takes and releases task alloc lock using task_lock() */
extern int thaw_process(struct task_struct *p);
diff --git a/trunk/include/linux/fs.h b/trunk/include/linux/fs.h
index 0dcdd9458f4b..5b248d61430c 100644
--- a/trunk/include/linux/fs.h
+++ b/trunk/include/linux/fs.h
@@ -489,6 +489,13 @@ struct address_space_operations {
int (*readpages)(struct file *filp, struct address_space *mapping,
struct list_head *pages, unsigned nr_pages);
+ /*
+ * ext3 requires that a successful prepare_write() call be followed
+ * by a commit_write() call - they must be balanced
+ */
+ int (*prepare_write)(struct file *, struct page *, unsigned, unsigned);
+ int (*commit_write)(struct file *, struct page *, unsigned, unsigned);
+
int (*write_begin)(struct file *, struct address_space *mapping,
loff_t pos, unsigned len, unsigned flags,
struct page **pagep, void **fsdata);
diff --git a/trunk/include/linux/kernel.h b/trunk/include/linux/kernel.h
index fba141d3ca07..396a350b87a6 100644
--- a/trunk/include/linux/kernel.h
+++ b/trunk/include/linux/kernel.h
@@ -116,8 +116,6 @@ extern int _cond_resched(void);
# define might_resched() do { } while (0)
#endif
-#ifdef CONFIG_DEBUG_SPINLOCK_SLEEP
- void __might_sleep(char *file, int line);
/**
* might_sleep - annotation for functions that can sleep
*
@@ -128,6 +126,8 @@ extern int _cond_resched(void);
* be bitten later when the calling function happens to sleep when it is not
* supposed to.
*/
+#ifdef CONFIG_DEBUG_SPINLOCK_SLEEP
+ void __might_sleep(char *file, int line);
# define might_sleep() \
do { __might_sleep(__FILE__, __LINE__); might_resched(); } while (0)
#else
diff --git a/trunk/include/linux/resource.h b/trunk/include/linux/resource.h
index 40fc7e626082..aaa423a6f3d9 100644
--- a/trunk/include/linux/resource.h
+++ b/trunk/include/linux/resource.h
@@ -59,10 +59,10 @@ struct rlimit {
#define _STK_LIM (8*1024*1024)
/*
- * GPG2 wants 64kB of mlocked memory, to make sure pass phrases
+ * GPG wants 32kB of mlocked memory, to make sure pass phrases
* and other sensitive information are never written to disk.
*/
-#define MLOCK_LIMIT ((PAGE_SIZE > 64*1024) ? PAGE_SIZE : 64*1024)
+#define MLOCK_LIMIT (8 * PAGE_SIZE)
/*
* Due to binary compatibility, the actual resource numbers
diff --git a/trunk/include/linux/security.h b/trunk/include/linux/security.h
index c13f1cec9abb..f5c4a51eb42e 100644
--- a/trunk/include/linux/security.h
+++ b/trunk/include/linux/security.h
@@ -1585,7 +1585,6 @@ int security_syslog(int type);
int security_settime(struct timespec *ts, struct timezone *tz);
int security_vm_enough_memory(long pages);
int security_vm_enough_memory_mm(struct mm_struct *mm, long pages);
-int security_vm_enough_memory_kern(long pages);
int security_bprm_alloc(struct linux_binprm *bprm);
void security_bprm_free(struct linux_binprm *bprm);
void security_bprm_apply_creds(struct linux_binprm *bprm, int unsafe);
@@ -1821,11 +1820,6 @@ static inline int security_vm_enough_memory(long pages)
return cap_vm_enough_memory(current->mm, pages);
}
-static inline int security_vm_enough_memory_kern(long pages)
-{
- return cap_vm_enough_memory(current->mm, pages);
-}
-
static inline int security_vm_enough_memory_mm(struct mm_struct *mm, long pages)
{
return cap_vm_enough_memory(mm, pages);
diff --git a/trunk/include/linux/spi/spi_bitbang.h b/trunk/include/linux/spi/spi_bitbang.h
index bf8de281b4ed..b8db32cea1de 100644
--- a/trunk/include/linux/spi/spi_bitbang.h
+++ b/trunk/include/linux/spi/spi_bitbang.h
@@ -18,9 +18,6 @@
* duplex (MicroWire) controllers. Provide chipslect() and txrx_bufs(),
* and custom setup()/cleanup() methods.
*/
-
-#include
-
struct spi_bitbang {
struct workqueue_struct *workqueue;
struct work_struct work;
diff --git a/trunk/init/Kconfig b/trunk/init/Kconfig
index 86b00c53fade..44e9208f9c78 100644
--- a/trunk/init/Kconfig
+++ b/trunk/init/Kconfig
@@ -401,20 +401,16 @@ config CGROUP_MEM_RES_CTLR
depends on CGROUPS && RESOURCE_COUNTERS
select MM_OWNER
help
- Provides a memory resource controller that manages both anonymous
- memory and page cache. (See Documentation/controllers/memory.txt)
+ Provides a memory resource controller that manages both page cache and
+ RSS memory.
Note that setting this option increases fixed memory overhead
- associated with each page of memory in the system. By this,
- 20(40)bytes/PAGE_SIZE on 32(64)bit system will be occupied by memory
- usage tracking struct at boot. Total amount of this is printed out
- at boot.
+ associated with each page of memory in the system by 4/8 bytes
+ and also increases cache misses because struct page on many 64bit
+ systems will not fit into a single cache line anymore.
Only enable when you're ok with these trade offs and really
- sure you need the memory resource controller. Even when you enable
- this, you can set "cgroup_disable=memory" at your boot option to
- disable memory resource controller and you can avoid overheads.
- (and lose benefits of memory resource contoller)
+ sure you need the memory resource controller.
This config option also selects MM_OWNER config option, which
could in turn add some fork/exit overhead.
diff --git a/trunk/init/do_mounts_md.c b/trunk/init/do_mounts_md.c
index 4d42f450b590..4c87ee1fe5d3 100644
--- a/trunk/init/do_mounts_md.c
+++ b/trunk/init/do_mounts_md.c
@@ -1,4 +1,4 @@
-#include
+
#include
#include
diff --git a/trunk/kernel/cgroup_freezer.c b/trunk/kernel/cgroup_freezer.c
index 7fa476f01d05..e95056954498 100644
--- a/trunk/kernel/cgroup_freezer.c
+++ b/trunk/kernel/cgroup_freezer.c
@@ -162,13 +162,9 @@ static int freezer_can_attach(struct cgroup_subsys *ss,
struct task_struct *task)
{
struct freezer *freezer;
+ int retval;
- /*
- * Anything frozen can't move or be moved to/from.
- *
- * Since orig_freezer->state == FROZEN means that @task has been
- * frozen, so it's sufficient to check the latter condition.
- */
+ /* Anything frozen can't move or be moved to/from */
if (is_task_frozen_enough(task))
return -EBUSY;
@@ -177,7 +173,13 @@ static int freezer_can_attach(struct cgroup_subsys *ss,
if (freezer->state == CGROUP_FROZEN)
return -EBUSY;
- return 0;
+ retval = 0;
+ task_lock(task);
+ freezer = task_freezer(task);
+ if (freezer->state == CGROUP_FROZEN)
+ retval = -EBUSY;
+ task_unlock(task);
+ return retval;
}
static void freezer_fork(struct cgroup_subsys *ss, struct task_struct *task)
@@ -188,9 +190,8 @@ static void freezer_fork(struct cgroup_subsys *ss, struct task_struct *task)
freezer = task_freezer(task);
task_unlock(task);
- spin_lock_irq(&freezer->lock);
BUG_ON(freezer->state == CGROUP_FROZEN);
-
+ spin_lock_irq(&freezer->lock);
/* Locking avoids race with FREEZING -> THAWED transitions. */
if (freezer->state == CGROUP_FREEZING)
freeze_task(task, true);
@@ -275,18 +276,25 @@ static int try_to_freeze_cgroup(struct cgroup *cgroup, struct freezer *freezer)
return num_cant_freeze_now ? -EBUSY : 0;
}
-static void unfreeze_cgroup(struct cgroup *cgroup, struct freezer *freezer)
+static int unfreeze_cgroup(struct cgroup *cgroup, struct freezer *freezer)
{
struct cgroup_iter it;
struct task_struct *task;
cgroup_iter_start(cgroup, &it);
while ((task = cgroup_iter_next(cgroup, &it))) {
- thaw_process(task);
+ int do_wake;
+
+ task_lock(task);
+ do_wake = __thaw_process(task);
+ task_unlock(task);
+ if (do_wake)
+ wake_up_process(task);
}
cgroup_iter_end(cgroup, &it);
-
freezer->state = CGROUP_THAWED;
+
+ return 0;
}
static int freezer_change_state(struct cgroup *cgroup,
@@ -296,22 +304,27 @@ static int freezer_change_state(struct cgroup *cgroup,
int retval = 0;
freezer = cgroup_freezer(cgroup);
-
spin_lock_irq(&freezer->lock);
-
update_freezer_state(cgroup, freezer);
if (goal_state == freezer->state)
goto out;
-
- switch (goal_state) {
+ switch (freezer->state) {
case CGROUP_THAWED:
- unfreeze_cgroup(cgroup, freezer);
+ retval = try_to_freeze_cgroup(cgroup, freezer);
break;
+ case CGROUP_FREEZING:
+ if (goal_state == CGROUP_FROZEN) {
+ /* Userspace is retrying after
+ * "/bin/echo FROZEN > freezer.state" returned -EBUSY */
+ retval = try_to_freeze_cgroup(cgroup, freezer);
+ break;
+ }
+ /* state == FREEZING and goal_state == THAWED, so unfreeze */
case CGROUP_FROZEN:
- retval = try_to_freeze_cgroup(cgroup, freezer);
+ retval = unfreeze_cgroup(cgroup, freezer);
break;
default:
- BUG();
+ break;
}
out:
spin_unlock_irq(&freezer->lock);
diff --git a/trunk/kernel/freezer.c b/trunk/kernel/freezer.c
index 2f4936cf7083..ba6248b323ef 100644
--- a/trunk/kernel/freezer.c
+++ b/trunk/kernel/freezer.c
@@ -121,16 +121,6 @@ void cancel_freezing(struct task_struct *p)
}
}
-static int __thaw_process(struct task_struct *p)
-{
- if (frozen(p)) {
- p->flags &= ~PF_FROZEN;
- return 1;
- }
- clear_freeze_flag(p);
- return 0;
-}
-
/*
* Wake up a frozen process
*
@@ -140,6 +130,16 @@ static int __thaw_process(struct task_struct *p)
* refrigerator() could call frozen_process(), in which case the task would be
* frozen and no one would thaw it.
*/
+int __thaw_process(struct task_struct *p)
+{
+ if (frozen(p)) {
+ p->flags &= ~PF_FROZEN;
+ return 1;
+ }
+ clear_freeze_flag(p);
+ return 0;
+}
+
int thaw_process(struct task_struct *p)
{
task_lock(p);
diff --git a/trunk/kernel/profile.c b/trunk/kernel/profile.c
index 9830a037d8db..a9e422df6bf6 100644
--- a/trunk/kernel/profile.c
+++ b/trunk/kernel/profile.c
@@ -102,7 +102,7 @@ int profile_setup(char *str)
__setup("profile=", profile_setup);
-int __ref profile_init(void)
+int profile_init(void)
{
int buffer_bytes;
if (!prof_on)
diff --git a/trunk/kernel/signal.c b/trunk/kernel/signal.c
index 4530fc654455..105217da5c82 100644
--- a/trunk/kernel/signal.c
+++ b/trunk/kernel/signal.c
@@ -1144,8 +1144,7 @@ static int kill_something_info(int sig, struct siginfo *info, pid_t pid)
struct task_struct * p;
for_each_process(p) {
- if (task_pid_vnr(p) > 1 &&
- !same_thread_group(p, current)) {
+ if (p->pid > 1 && !same_thread_group(p, current)) {
int err = group_send_sig_info(sig, info, p);
++count;
if (err != -EPERM)
diff --git a/trunk/kernel/trace/ftrace.c b/trunk/kernel/trace/ftrace.c
index 7618c528756b..4a39d24568c8 100644
--- a/trunk/kernel/trace/ftrace.c
+++ b/trunk/kernel/trace/ftrace.c
@@ -1339,6 +1339,14 @@ void __init ftrace_init(void)
}
#else
+
+static int __init ftrace_nodyn_init(void)
+{
+ ftrace_enabled = 1;
+ return 0;
+}
+device_initcall(ftrace_nodyn_init);
+
# define ftrace_startup() do { } while (0)
# define ftrace_shutdown() do { } while (0)
# define ftrace_startup_sysctl() do { } while (0)
diff --git a/trunk/mm/filemap.c b/trunk/mm/filemap.c
index f3e5f8944d17..ab8553658af3 100644
--- a/trunk/mm/filemap.c
+++ b/trunk/mm/filemap.c
@@ -2029,8 +2029,48 @@ int pagecache_write_begin(struct file *file, struct address_space *mapping,
{
const struct address_space_operations *aops = mapping->a_ops;
- return aops->write_begin(file, mapping, pos, len, flags,
+ if (aops->write_begin) {
+ return aops->write_begin(file, mapping, pos, len, flags,
pagep, fsdata);
+ } else {
+ int ret;
+ pgoff_t index = pos >> PAGE_CACHE_SHIFT;
+ unsigned offset = pos & (PAGE_CACHE_SIZE - 1);
+ struct inode *inode = mapping->host;
+ struct page *page;
+again:
+ page = __grab_cache_page(mapping, index);
+ *pagep = page;
+ if (!page)
+ return -ENOMEM;
+
+ if (flags & AOP_FLAG_UNINTERRUPTIBLE && !PageUptodate(page)) {
+ /*
+ * There is no way to resolve a short write situation
+ * for a !Uptodate page (except by double copying in
+ * the caller done by generic_perform_write_2copy).
+ *
+ * Instead, we have to bring it uptodate here.
+ */
+ ret = aops->readpage(file, page);
+ page_cache_release(page);
+ if (ret) {
+ if (ret == AOP_TRUNCATED_PAGE)
+ goto again;
+ return ret;
+ }
+ goto again;
+ }
+
+ ret = aops->prepare_write(file, page, offset, offset+len);
+ if (ret) {
+ unlock_page(page);
+ page_cache_release(page);
+ if (pos + len > inode->i_size)
+ vmtruncate(inode, inode->i_size);
+ }
+ return ret;
+ }
}
EXPORT_SYMBOL(pagecache_write_begin);
@@ -2039,9 +2079,32 @@ int pagecache_write_end(struct file *file, struct address_space *mapping,
struct page *page, void *fsdata)
{
const struct address_space_operations *aops = mapping->a_ops;
+ int ret;
- mark_page_accessed(page);
- return aops->write_end(file, mapping, pos, len, copied, page, fsdata);
+ if (aops->write_end) {
+ mark_page_accessed(page);
+ ret = aops->write_end(file, mapping, pos, len, copied,
+ page, fsdata);
+ } else {
+ unsigned offset = pos & (PAGE_CACHE_SIZE - 1);
+ struct inode *inode = mapping->host;
+
+ flush_dcache_page(page);
+ ret = aops->commit_write(file, page, offset, offset+len);
+ unlock_page(page);
+ mark_page_accessed(page);
+ page_cache_release(page);
+
+ if (ret < 0) {
+ if (pos + len > inode->i_size)
+ vmtruncate(inode, inode->i_size);
+ } else if (ret > 0)
+ ret = min_t(size_t, copied, ret);
+ else
+ ret = copied;
+ }
+
+ return ret;
}
EXPORT_SYMBOL(pagecache_write_end);
@@ -2163,6 +2226,174 @@ struct page *__grab_cache_page(struct address_space *mapping, pgoff_t index)
}
EXPORT_SYMBOL(__grab_cache_page);
+static ssize_t generic_perform_write_2copy(struct file *file,
+ struct iov_iter *i, loff_t pos)
+{
+ struct address_space *mapping = file->f_mapping;
+ const struct address_space_operations *a_ops = mapping->a_ops;
+ struct inode *inode = mapping->host;
+ long status = 0;
+ ssize_t written = 0;
+
+ do {
+ struct page *src_page;
+ struct page *page;
+ pgoff_t index; /* Pagecache index for current page */
+ unsigned long offset; /* Offset into pagecache page */
+ unsigned long bytes; /* Bytes to write to page */
+ size_t copied; /* Bytes copied from user */
+
+ offset = (pos & (PAGE_CACHE_SIZE - 1));
+ index = pos >> PAGE_CACHE_SHIFT;
+ bytes = min_t(unsigned long, PAGE_CACHE_SIZE - offset,
+ iov_iter_count(i));
+
+ /*
+ * a non-NULL src_page indicates that we're doing the
+ * copy via get_user_pages and kmap.
+ */
+ src_page = NULL;
+
+ /*
+ * Bring in the user page that we will copy from _first_.
+ * Otherwise there's a nasty deadlock on copying from the
+ * same page as we're writing to, without it being marked
+ * up-to-date.
+ *
+ * Not only is this an optimisation, but it is also required
+ * to check that the address is actually valid, when atomic
+ * usercopies are used, below.
+ */
+ if (unlikely(iov_iter_fault_in_readable(i, bytes))) {
+ status = -EFAULT;
+ break;
+ }
+
+ page = __grab_cache_page(mapping, index);
+ if (!page) {
+ status = -ENOMEM;
+ break;
+ }
+
+ /*
+ * non-uptodate pages cannot cope with short copies, and we
+ * cannot take a pagefault with the destination page locked.
+ * So pin the source page to copy it.
+ */
+ if (!PageUptodate(page) && !segment_eq(get_fs(), KERNEL_DS)) {
+ unlock_page(page);
+
+ src_page = alloc_page(GFP_KERNEL);
+ if (!src_page) {
+ page_cache_release(page);
+ status = -ENOMEM;
+ break;
+ }
+
+ /*
+ * Cannot get_user_pages with a page locked for the
+ * same reason as we can't take a page fault with a
+ * page locked (as explained below).
+ */
+ copied = iov_iter_copy_from_user(src_page, i,
+ offset, bytes);
+ if (unlikely(copied == 0)) {
+ status = -EFAULT;
+ page_cache_release(page);
+ page_cache_release(src_page);
+ break;
+ }
+ bytes = copied;
+
+ lock_page(page);
+ /*
+ * Can't handle the page going uptodate here, because
+ * that means we would use non-atomic usercopies, which
+ * zero out the tail of the page, which can cause
+ * zeroes to become transiently visible. We could just
+ * use a non-zeroing copy, but the APIs aren't too
+ * consistent.
+ */
+ if (unlikely(!page->mapping || PageUptodate(page))) {
+ unlock_page(page);
+ page_cache_release(page);
+ page_cache_release(src_page);
+ continue;
+ }
+ }
+
+ status = a_ops->prepare_write(file, page, offset, offset+bytes);
+ if (unlikely(status))
+ goto fs_write_aop_error;
+
+ if (!src_page) {
+ /*
+ * Must not enter the pagefault handler here, because
+ * we hold the page lock, so we might recursively
+ * deadlock on the same lock, or get an ABBA deadlock
+ * against a different lock, or against the mmap_sem
+ * (which nests outside the page lock). So increment
+ * preempt count, and use _atomic usercopies.
+ *
+ * The page is uptodate so we are OK to encounter a
+ * short copy: if unmodified parts of the page are
+ * marked dirty and written out to disk, it doesn't
+ * really matter.
+ */
+ pagefault_disable();
+ copied = iov_iter_copy_from_user_atomic(page, i,
+ offset, bytes);
+ pagefault_enable();
+ } else {
+ void *src, *dst;
+ src = kmap_atomic(src_page, KM_USER0);
+ dst = kmap_atomic(page, KM_USER1);
+ memcpy(dst + offset, src + offset, bytes);
+ kunmap_atomic(dst, KM_USER1);
+ kunmap_atomic(src, KM_USER0);
+ copied = bytes;
+ }
+ flush_dcache_page(page);
+
+ status = a_ops->commit_write(file, page, offset, offset+bytes);
+ if (unlikely(status < 0))
+ goto fs_write_aop_error;
+ if (unlikely(status > 0)) /* filesystem did partial write */
+ copied = min_t(size_t, copied, status);
+
+ unlock_page(page);
+ mark_page_accessed(page);
+ page_cache_release(page);
+ if (src_page)
+ page_cache_release(src_page);
+
+ iov_iter_advance(i, copied);
+ pos += copied;
+ written += copied;
+
+ balance_dirty_pages_ratelimited(mapping);
+ cond_resched();
+ continue;
+
+fs_write_aop_error:
+ unlock_page(page);
+ page_cache_release(page);
+ if (src_page)
+ page_cache_release(src_page);
+
+ /*
+ * prepare_write() may have instantiated a few blocks
+ * outside i_size. Trim these off again. Don't need
+ * i_size_read because we hold i_mutex.
+ */
+ if (pos + bytes > inode->i_size)
+ vmtruncate(inode, inode->i_size);
+ break;
+ } while (iov_iter_count(i));
+
+ return written ? written : status;
+}
+
static ssize_t generic_perform_write(struct file *file,
struct iov_iter *i, loff_t pos)
{
@@ -2263,7 +2494,10 @@ generic_file_buffered_write(struct kiocb *iocb, const struct iovec *iov,
struct iov_iter i;
iov_iter_init(&i, iov, nr_segs, count, written);
- status = generic_perform_write(file, &i, pos);
+ if (a_ops->write_begin)
+ status = generic_perform_write(file, &i, pos);
+ else
+ status = generic_perform_write_2copy(file, &i, pos);
if (likely(status >= 0)) {
written += status;
diff --git a/trunk/mm/mmap.c b/trunk/mm/mmap.c
index de14ac21e5b5..74f4d158022e 100644
--- a/trunk/mm/mmap.c
+++ b/trunk/mm/mmap.c
@@ -175,8 +175,7 @@ int __vm_enough_memory(struct mm_struct *mm, long pages, int cap_sys_admin)
/* Don't let a single process grow too big:
leave 3% of the size of this process for other processes */
- if (mm)
- allowed -= mm->total_vm / 32;
+ allowed -= mm->total_vm / 32;
/*
* cast `allowed' as a signed long because vm_committed_space
diff --git a/trunk/mm/nommu.c b/trunk/mm/nommu.c
index 7695dc850785..2696b24f2bb3 100644
--- a/trunk/mm/nommu.c
+++ b/trunk/mm/nommu.c
@@ -1454,8 +1454,7 @@ int __vm_enough_memory(struct mm_struct *mm, long pages, int cap_sys_admin)
/* Don't let a single process grow too big:
leave 3% of the size of this process for other processes */
- if (mm)
- allowed -= mm->total_vm / 32;
+ allowed -= current->mm->total_vm / 32;
/*
* cast `allowed' as a signed long because vm_committed_space
diff --git a/trunk/mm/shmem.c b/trunk/mm/shmem.c
index 0ed075215e5f..d38d7e61fcd0 100644
--- a/trunk/mm/shmem.c
+++ b/trunk/mm/shmem.c
@@ -161,8 +161,8 @@ static inline struct shmem_sb_info *SHMEM_SB(struct super_block *sb)
*/
static inline int shmem_acct_size(unsigned long flags, loff_t size)
{
- return (flags & VM_ACCOUNT) ?
- security_vm_enough_memory_kern(VM_ACCT(size)) : 0;
+ return (flags & VM_ACCOUNT)?
+ security_vm_enough_memory(VM_ACCT(size)): 0;
}
static inline void shmem_unacct_size(unsigned long flags, loff_t size)
@@ -179,8 +179,8 @@ static inline void shmem_unacct_size(unsigned long flags, loff_t size)
*/
static inline int shmem_acct_block(unsigned long flags)
{
- return (flags & VM_ACCOUNT) ?
- 0 : security_vm_enough_memory_kern(VM_ACCT(PAGE_CACHE_SIZE));
+ return (flags & VM_ACCOUNT)?
+ 0: security_vm_enough_memory(VM_ACCT(PAGE_CACHE_SIZE));
}
static inline void shmem_unacct_blocks(unsigned long flags, long pages)
diff --git a/trunk/mm/vmalloc.c b/trunk/mm/vmalloc.c
index f1cc03bbf6ac..036536945dd9 100644
--- a/trunk/mm/vmalloc.c
+++ b/trunk/mm/vmalloc.c
@@ -897,8 +897,7 @@ EXPORT_SYMBOL(vm_unmap_ram);
* @count: number of pages
* @node: prefer to allocate data structures on this node
* @prot: memory protection to use. PAGE_KERNEL for regular RAM
- *
- * Returns: a pointer to the address that has been mapped, or %NULL on failure
+ * @returns: a pointer to the address that has been mapped, or NULL on failure
*/
void *vm_map_ram(struct page **pages, unsigned int count, int node, pgprot_t prot)
{
diff --git a/trunk/security/security.c b/trunk/security/security.c
index c0acfa7177e5..255b08559b2b 100644
--- a/trunk/security/security.c
+++ b/trunk/security/security.c
@@ -198,23 +198,14 @@ int security_settime(struct timespec *ts, struct timezone *tz)
int security_vm_enough_memory(long pages)
{
- WARN_ON(current->mm == NULL);
return security_ops->vm_enough_memory(current->mm, pages);
}
int security_vm_enough_memory_mm(struct mm_struct *mm, long pages)
{
- WARN_ON(mm == NULL);
return security_ops->vm_enough_memory(mm, pages);
}
-int security_vm_enough_memory_kern(long pages)
-{
- /* If current->mm is a kernel thread then we will pass NULL,
- for this specific case that is fine */
- return security_ops->vm_enough_memory(current->mm, pages);
-}
-
int security_bprm_alloc(struct linux_binprm *bprm)
{
return security_ops->bprm_alloc_security(bprm);