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);