Merge tag 'for-f2fs-3.16' of git://git.kernel.org/pub/scm/linux/kernel/git/jaegeuk...
authorLinus Torvalds <torvalds@linux-foundation.org>
Tue, 10 Jun 2014 02:11:44 +0000 (19:11 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 10 Jun 2014 02:11:44 +0000 (19:11 -0700)
Pull f2fs updates from Jaegeuk Kim:
 "In this round, there is no special interesting feature, but we've
  investigated a couple of tuning points with respect to the I/O flow.
  Several major bug fixes and a bunch of clean-ups also have been made.

  This patch-set includes the following major enhancement patches:
   - enhance wait_on_page_writeback
   - support SEEK_DATA and SEEK_HOLE
   - enhance readahead flows
   - enhance IO flushes
   - support fiemap
   - add some tracepoints

  The other bug fixes are as follows:
   - fix to support a large volume > 2TB correctly
   - recovery bug fix wrt fallocated space
   - fix recursive lock on xattr operations
   - fix some cases on the remount flow

  And, there are a bunch of cleanups"

* tag 'for-f2fs-3.16' of git://git.kernel.org/pub/scm/linux/kernel/git/jaegeuk/f2fs: (52 commits)
  f2fs: support f2fs_fiemap
  f2fs: avoid not to call remove_dirty_inode
  f2fs: recover fallocated space
  f2fs: fix to recover data written by dio
  f2fs: large volume support
  f2fs: avoid crash when trace f2fs_submit_page_mbio event in ra_sum_pages
  f2fs: avoid overflow when large directory feathure is enabled
  f2fs: fix recursive lock by f2fs_setxattr
  MAINTAINERS: add a co-maintainer from samsung for F2FS
  MAINTAINERS: change the email address for f2fs
  f2fs: use inode_init_owner() to simplify codes
  f2fs: avoid to use slab memory in f2fs_issue_flush for efficiency
  f2fs: add a tracepoint for f2fs_read_data_page
  f2fs: add a tracepoint for f2fs_write_{meta,node,data}_pages
  f2fs: add a tracepoint for f2fs_write_{meta,node,data}_page
  f2fs: add a tracepoint for f2fs_write_end
  f2fs: add a tracepoint for f2fs_write_begin
  f2fs: fix checkpatch warning
  f2fs: deactivate inode page if the inode is evicted
  f2fs: decrease the lock granularity during write_begin
  ...

1  2 
MAINTAINERS
fs/f2fs/checkpoint.c
fs/f2fs/node.c

diff --combined MAINTAINERS
index a1f4b576628a5193c3dc5a73fe6fffc8b14a32e4,e15414124db6af448bb5f4f3ebb738dc9f8bc627..948379508e440bf808eb5e7381c7ebdb6309ab78
@@@ -210,13 -210,6 +210,13 @@@ S:       Supporte
  F:    Documentation/scsi/aacraid.txt
  F:    drivers/scsi/aacraid/
  
 +ABI/API
 +L:    linux-api@vger.kernel.org
 +F:    Documentation/ABI/
 +F:    include/linux/syscalls.h
 +F:    include/uapi/
 +F:    kernel/sys_ni.c
 +
  ABIT UGURU 1,2 HARDWARE MONITOR DRIVER
  M:    Hans de Goede <hdegoede@redhat.com>
  L:    lm-sensors@lm-sensors.org
@@@ -362,7 -355,7 +362,7 @@@ F: Documentation/hwmon/adm102
  F:    drivers/hwmon/adm1025.c
  
  ADM1029 HARDWARE MONITOR DRIVER
 -M:    Corentin Labbe <corentin.labbe@geomatys.fr>
 +M:    Corentin Labbe <clabbe.montjoie@gmail.com>
  L:    lm-sensors@lm-sensors.org
  S:    Maintained
  F:    drivers/hwmon/adm1029.c
@@@ -544,7 -537,7 +544,7 @@@ L: linux-alpha@vger.kernel.or
  F:    arch/alpha/
  
  ALTERA TRIPLE SPEED ETHERNET DRIVER
 -M:    Vince Bridgers <vbridgers2013@gmail.com
 +M:    Vince Bridgers <vbridgers2013@gmail.com>
  L:    netdev@vger.kernel.org
  L:    nios2-dev@lists.rocketboards.org (moderated for non-subscribers)
  S:    Maintained
@@@ -654,7 -647,7 +654,7 @@@ F: sound/soc/codecs/ssm
  F:    sound/soc/codecs/sigmadsp.*
  
  ANALOG DEVICES INC ASOC DRIVERS
 -L:    adi-buildroot-devel@lists.sourceforge.net
 +L:    adi-buildroot-devel@lists.sourceforge.net (moderated for non-subscribers)
  L:    alsa-devel@alsa-project.org (moderated for non-subscribers)
  W:    http://blackfin.uclinux.org/
  S:    Supported
@@@ -815,11 -808,6 +815,11 @@@ F:       arch/arm/boot/dts/at91*.dts
  F:    arch/arm/boot/dts/sama*.dts
  F:    arch/arm/boot/dts/sama*.dtsi
  
 +ARM/ATMEL AT91 Clock Support
 +M:    Boris Brezillon <boris.brezillon@free-electrons.com>
 +S:    Maintained
 +F:    drivers/clk/at91
 +
  ARM/CALXEDA HIGHBANK ARCHITECTURE
  M:    Rob Herring <robh@kernel.org>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
@@@ -1629,6 -1617,12 +1629,6 @@@ S:     Supporte
  F:    drivers/misc/atmel_tclib.c
  F:    drivers/clocksource/tcb_clksrc.c
  
 -ATMEL TSADCC DRIVER
 -M:    Josh Wu <josh.wu@atmel.com>
 -L:    linux-input@vger.kernel.org
 -S:    Supported
 -F:    drivers/input/touchscreen/atmel_tsadcc.c
 -
  ATMEL USBA UDC DRIVER
  M:    Nicolas Ferre <nicolas.ferre@atmel.com>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
@@@ -1770,54 -1764,54 +1770,54 @@@ F:   include/uapi/linux/bfs_fs.
  
  BLACKFIN ARCHITECTURE
  M:    Steven Miao <realmz6@gmail.com>
 -L:    adi-buildroot-devel@lists.sourceforge.net
 +L:    adi-buildroot-devel@lists.sourceforge.net (moderated for non-subscribers)
  T:    git git://git.code.sf.net/p/adi-linux/code
  W:    http://blackfin.uclinux.org
  S:    Supported
  F:    arch/blackfin/
  
  BLACKFIN EMAC DRIVER
 -L:    adi-buildroot-devel@lists.sourceforge.net
 +L:    adi-buildroot-devel@lists.sourceforge.net (moderated for non-subscribers)
  W:    http://blackfin.uclinux.org
  S:    Supported
  F:    drivers/net/ethernet/adi/
  
  BLACKFIN RTC DRIVER
 -L:    adi-buildroot-devel@lists.sourceforge.net
 +L:    adi-buildroot-devel@lists.sourceforge.net (moderated for non-subscribers)
  W:    http://blackfin.uclinux.org
  S:    Supported
  F:    drivers/rtc/rtc-bfin.c
  
  BLACKFIN SDH DRIVER
  M:    Sonic Zhang <sonic.zhang@analog.com>
 -L:    adi-buildroot-devel@lists.sourceforge.net
 +L:    adi-buildroot-devel@lists.sourceforge.net (moderated for non-subscribers)
  W:    http://blackfin.uclinux.org
  S:    Supported
  F:    drivers/mmc/host/bfin_sdh.c
  
  BLACKFIN SERIAL DRIVER
  M:    Sonic Zhang <sonic.zhang@analog.com>
 -L:    adi-buildroot-devel@lists.sourceforge.net
 +L:    adi-buildroot-devel@lists.sourceforge.net (moderated for non-subscribers)
  W:    http://blackfin.uclinux.org
  S:    Supported
  F:    drivers/tty/serial/bfin_uart.c
  
  BLACKFIN WATCHDOG DRIVER
 -L:    adi-buildroot-devel@lists.sourceforge.net
 +L:    adi-buildroot-devel@lists.sourceforge.net (moderated for non-subscribers)
  W:    http://blackfin.uclinux.org
  S:    Supported
  F:    drivers/watchdog/bfin_wdt.c
  
  BLACKFIN I2C TWI DRIVER
  M:    Sonic Zhang <sonic.zhang@analog.com>
 -L:    adi-buildroot-devel@lists.sourceforge.net
 +L:    adi-buildroot-devel@lists.sourceforge.net (moderated for non-subscribers)
  W:    http://blackfin.uclinux.org/
  S:    Supported
  F:    drivers/i2c/busses/i2c-bfin-twi.c
  
  BLACKFIN MEDIA DRIVER
  M:    Scott Jiang <scott.jiang.linux@gmail.com>
 -L:    adi-buildroot-devel@lists.sourceforge.net
 +L:    adi-buildroot-devel@lists.sourceforge.net (moderated for non-subscribers)
  W:    http://blackfin.uclinux.org/
  S:    Supported
  F:    drivers/media/platform/blackfin/
@@@ -1899,15 -1893,14 +1899,15 @@@ L:   netdev@vger.kernel.or
  S:    Supported
  F:    drivers/net/ethernet/broadcom/bnx2x/
  
 -BROADCOM BCM281XX/BCM11XXX ARM ARCHITECTURE
 +BROADCOM BCM281XX/BCM11XXX/BCM216XX ARM ARCHITECTURE
  M:    Christian Daudt <bcm@fixthebug.org>
  M:    Matt Porter <mporter@linaro.org>
  L:    bcm-kernel-feedback-list@broadcom.com
 -T:    git git://git.github.com/broadcom/bcm11351
 +T:    git git://github.com/broadcom/mach-bcm
  S:    Maintained
  F:    arch/arm/mach-bcm/
  F:    arch/arm/boot/dts/bcm113*
 +F:    arch/arm/boot/dts/bcm216*
  F:    arch/arm/boot/dts/bcm281*
  F:    arch/arm/configs/bcm_defconfig
  F:    drivers/mmc/host/sdhci_bcm_kona.c
@@@ -2200,7 -2193,6 +2200,7 @@@ T:      git git://git.kernel.org/pub/scm/lin
  S:    Supported
  F:    drivers/char/*
  F:    drivers/misc/*
 +F:    include/linux/miscdevice.h
  
  CHECKPATCH
  M:    Andy Whitcroft <apw@canonical.com>
@@@ -2253,6 -2245,12 +2253,6 @@@ L:     linux-usb@vger.kernel.or
  S:    Maintained
  F:    drivers/usb/host/ohci-ep93xx.c
  
 -CIRRUS LOGIC CS4270 SOUND DRIVER
 -M:    Timur Tabi <timur@tabi.org>
 -L:    alsa-devel@alsa-project.org (moderated for non-subscribers)
 -S:    Odd Fixes
 -F:    sound/soc/codecs/cs4270*
 -
  CIRRUS LOGIC AUDIO CODEC DRIVERS
  M:    Brian Austin <brian.austin@cirrus.com>
  M:    Paul Handrigan <Paul.Handrigan@cirrus.com>
@@@ -2384,35 -2382,16 +2384,35 @@@ L:   netdev@vger.kernel.or
  S:    Maintained
  F:    drivers/connector/
  
 -CONTROL GROUPS (CGROUPS)
 +CONTROL GROUP (CGROUP)
  M:    Tejun Heo <tj@kernel.org>
  M:    Li Zefan <lizefan@huawei.com>
 -L:    containers@lists.linux-foundation.org
  L:    cgroups@vger.kernel.org
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tj/cgroup.git
  S:    Maintained
 +F:    Documentation/cgroups/
  F:    include/linux/cgroup*
  F:    kernel/cgroup*
 -F:    mm/*cgroup*
 +
 +CONTROL GROUP - CPUSET
 +M:    Li Zefan <lizefan@huawei.com>
 +L:    cgroups@vger.kernel.org
 +W:    http://www.bullopensource.org/cpuset/
 +W:    http://oss.sgi.com/projects/cpusets/
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tj/cgroup.git
 +S:    Maintained
 +F:    Documentation/cgroups/cpusets.txt
 +F:    include/linux/cpuset.h
 +F:    kernel/cpuset.c
 +
 +CONTROL GROUP - MEMORY RESOURCE CONTROLLER (MEMCG)
 +M:    Johannes Weiner <hannes@cmpxchg.org>
 +M:    Michal Hocko <mhocko@suse.cz>
 +L:    cgroups@vger.kernel.org
 +L:    linux-mm@kvack.org
 +S:    Maintained
 +F:    mm/memcontrol.c
 +F:    mm/page_cgroup.c
  
  CORETEMP HARDWARE MONITORING DRIVER
  M:    Fenghua Yu <fenghua.yu@intel.com>
@@@ -2436,6 -2415,7 +2436,6 @@@ F:      drivers/net/ethernet/ti/cpmac.
  CPU FREQUENCY DRIVERS
  M:    Rafael J. Wysocki <rjw@rjwysocki.net>
  M:    Viresh Kumar <viresh.kumar@linaro.org>
 -L:    cpufreq@vger.kernel.org
  L:    linux-pm@vger.kernel.org
  S:    Maintained
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git
@@@ -2446,6 -2426,7 +2446,6 @@@ F:      include/linux/cpufreq.
  CPU FREQUENCY DRIVERS - ARM BIG LITTLE
  M:    Viresh Kumar <viresh.kumar@linaro.org>
  M:    Sudeep Holla <sudeep.holla@arm.com>
 -L:    cpufreq@vger.kernel.org
  L:    linux-pm@vger.kernel.org
  W:    http://www.arm.com/products/processors/technologies/biglittleprocessing.php
  S:    Maintained
@@@ -2483,6 -2464,17 +2483,6 @@@ M:     Thomas Renninger <trenn@suse.de
  S:    Maintained
  F:    tools/power/cpupower/
  
 -CPUSETS
 -M:    Li Zefan <lizefan@huawei.com>
 -L:    cgroups@vger.kernel.org
 -W:    http://www.bullopensource.org/cpuset/
 -W:    http://oss.sgi.com/projects/cpusets/
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tj/cgroup.git
 -S:    Maintained
 -F:    Documentation/cgroups/cpusets.txt
 -F:    include/linux/cpuset.h
 -F:    kernel/cpuset.c
 -
  CRAMFS FILESYSTEM
  W:    http://sourceforge.net/projects/cramfs/
  S:    Orphan / Obsolete
@@@ -2700,15 -2692,6 +2700,15 @@@ S:    Orpha
  F:    Documentation/networking/decnet.txt
  F:    net/decnet/
  
 +DECSTATION PLATFORM SUPPORT
 +M:    "Maciej W. Rozycki" <macro@linux-mips.org>
 +L:    linux-mips@linux-mips.org
 +W:    http://www.linux-mips.org/wiki/DECstation
 +S:    Maintained
 +F:    arch/mips/dec/
 +F:    arch/mips/include/asm/dec/
 +F:    arch/mips/include/asm/mach-dec/
 +
  DEFXX FDDI NETWORK DRIVER
  M:    "Maciej W. Rozycki" <macro@linux-mips.org>
  S:    Maintained
@@@ -2806,14 -2789,12 +2806,14 @@@ F:   sound/soc/codecs/da[79]*.[ch
  
  DIGI NEO AND CLASSIC PCI PRODUCTS
  M:    Lidza Louina <lidza.louina@gmail.com>
 +M:    Mark Hounschell <markh@compro.net>
  L:    driverdev-devel@linuxdriverproject.org
  S:    Maintained
  F:    drivers/staging/dgnc/
  
  DIGI EPCA PCI PRODUCTS
  M:    Lidza Louina <lidza.louina@gmail.com>
 +M:    Mark Hounschell <markh@compro.net>
  L:    driverdev-devel@linuxdriverproject.org
  S:    Maintained
  F:    drivers/staging/dgap/
@@@ -3177,9 -3158,10 +3177,9 @@@ S:     Maintaine
  F:    drivers/scsi/eata_pio.*
  
  EBTABLES
 -M:    Bart De Schuymer <bart.de.schuymer@pandora.be>
  L:    netfilter-devel@vger.kernel.org
  W:    http://ebtables.sourceforge.net/
 -S:    Maintained
 +S:    Orphan
  F:    include/linux/netfilter_bridge/ebt_*.h
  F:    include/uapi/linux/netfilter_bridge/ebt_*.h
  F:    net/bridge/netfilter/ebt*.c
@@@ -3792,7 -3774,8 +3792,8 @@@ F:      fs/fscache
  F:    include/linux/fscache*.h
  
  F2FS FILE SYSTEM
- M:    Jaegeuk Kim <jaegeuk.kim@samsung.com>
+ M:    Jaegeuk Kim <jaegeuk@kernel.org>
+ M:    Changman Lee <cm224.lee@samsung.com>
  L:    linux-f2fs-devel@lists.sourceforge.net
  W:    http://en.wikipedia.org/wiki/F2FS
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/jaegeuk/f2fs.git
@@@ -3910,11 -3893,6 +3911,11 @@@ L:    kvm@vger.kernel.or
  S:    Supported
  F:    drivers/uio/uio_pci_generic.c
  
 +GET_MAINTAINER SCRIPT
 +M:    Joe Perches <joe@perches.com>
 +S:    Maintained
 +F:    scripts/get_maintainer.pl
 +
  GFS2 FILE SYSTEM
  M:    Steven Whitehouse <swhiteho@redhat.com>
  L:    cluster-devel@redhat.com
@@@ -4039,8 -4017,9 +4040,8 @@@ S:      Odd Fixe
  F:    drivers/media/usb/hdpvr/
  
  HWPOISON MEMORY FAILURE HANDLING
 -M:    Andi Kleen <andi@firstfloor.org>
 +M:    Naoya Horiguchi <n-horiguchi@ah.jp.nec.com>
  L:    linux-mm@kvack.org
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/ak/linux-mce-2.6.git hwpoison
  S:    Maintained
  F:    mm/memory-failure.c
  F:    mm/hwpoison-inject.c
@@@ -4231,11 -4210,9 +4232,11 @@@ S:    Maintaine
  F:    fs/hpfs/
  
  HSI SUBSYSTEM
 -M:    Sebastian Reichel <sre@debian.org>
 +M:    Sebastian Reichel <sre@kernel.org>
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-hsi.git
  S:    Maintained
  F:    Documentation/ABI/testing/sysfs-bus-hsi
 +F:    Documentation/hsi.txt
  F:    drivers/hsi/
  F:    include/linux/hsi/
  F:    include/uapi/linux/hsi/
@@@ -4390,7 -4367,7 +4391,7 @@@ S:      Supporte
  F:    drivers/crypto/nx/
  
  IBM Power 842 compression accelerator
 -M:    Robert Jennings <rcj@linux.vnet.ibm.com>
 +M:    Nathan Fontenot <nfont@linux.vnet.ibm.com>
  S:    Supported
  F:    drivers/crypto/nx/nx-842.c
  F:    include/linux/nx842.h
@@@ -4406,18 -4383,12 +4407,18 @@@ L:   netdev@vger.kernel.or
  S:    Supported
  F:    drivers/net/ethernet/ibm/ibmveth.*
  
 -IBM Power Virtual SCSI/FC Device Drivers
 -M:    Robert Jennings <rcj@linux.vnet.ibm.com>
 +IBM Power Virtual SCSI Device Drivers
 +M:    Nathan Fontenot <nfont@linux.vnet.ibm.com>
 +L:    linux-scsi@vger.kernel.org
 +S:    Supported
 +F:    drivers/scsi/ibmvscsi/ibmvscsi*
 +F:    drivers/scsi/ibmvscsi/viosrp.h
 +
 +IBM Power Virtual FC Device Drivers
 +M:    Brian King <brking@linux.vnet.ibm.com>
  L:    linux-scsi@vger.kernel.org
  S:    Supported
 -F:    drivers/scsi/ibmvscsi/
 -X:    drivers/scsi/ibmvscsi/ibmvstgt.c
 +F:    drivers/scsi/ibmvscsi/ibmvfc*
  
  IBM ServeRAID RAID DRIVER
  P:    Jack Hammer
@@@ -4848,14 -4819,6 +4849,14 @@@ L:    linux-kernel@vger.kernel.or
  S:    Maintained
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git irq/core
  F:    kernel/irq/
 +
 +IRQCHIP DRIVERS
 +M:    Thomas Gleixner <tglx@linutronix.de>
 +M:    Jason Cooper <jason@lakedaemon.net>
 +L:    linux-kernel@vger.kernel.org
 +S:    Maintained
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git irq/core
 +T:    git git://git.infradead.org/users/jcooper/linux.git irqchip/core
  F:    drivers/irqchip/
  
  IRQ DOMAINS (IRQ NUMBER MAPPING LIBRARY)
@@@ -5528,15 -5491,15 +5529,15 @@@ F:   Documentation/hwmon/ltc426
  F:    drivers/hwmon/ltc4261.c
  
  LTP (Linux Test Project)
 -M:    Shubham Goyal <shubham@linux.vnet.ibm.com>
  M:    Mike Frysinger <vapier@gentoo.org>
  M:    Cyril Hrubis <chrubis@suse.cz>
 -M:    Caspar Zhang <caspar@casparzhang.com>
  M:    Wanlong Gao <gaowanlong@cn.fujitsu.com>
 +M:    Jan Stancek <jstancek@redhat.com>
 +M:    Stanislav Kholmanskikh <stanislav.kholmanskikh@oracle.com>
 +M:    Alexey Kodanev <alexey.kodanev@oracle.com>
  L:    ltp-list@lists.sourceforge.net (subscribers-only)
 -W:    http://ltp.sourceforge.net/
 +W:    http://linux-test-project.github.io/
  T:    git git://github.com/linux-test-project/ltp.git
 -T:    git git://ltp.git.sourceforge.net/gitroot/ltp/ltp-dev
  S:    Maintained
  
  M32R ARCHITECTURE
@@@ -5780,6 -5743,17 +5781,6 @@@ F:     include/linux/memory_hotplug.
  F:    include/linux/vmalloc.h
  F:    mm/
  
 -MEMORY RESOURCE CONTROLLER
 -M:    Johannes Weiner <hannes@cmpxchg.org>
 -M:    Michal Hocko <mhocko@suse.cz>
 -M:    Balbir Singh <bsingharora@gmail.com>
 -M:    KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
 -L:    cgroups@vger.kernel.org
 -L:    linux-mm@kvack.org
 -S:    Maintained
 -F:    mm/memcontrol.c
 -F:    mm/page_cgroup.c
 -
  MEMORY TECHNOLOGY DEVICES (MTD)
  M:    David Woodhouse <dwmw2@infradead.org>
  M:    Brian Norris <computersforpeace@gmail.com>
@@@ -6034,28 -6008,6 +6035,28 @@@ M:    Petr Vandrovec <petr@vandrovec.name
  S:    Odd Fixes
  F:    fs/ncpfs/
  
 +NCR 5380 SCSI DRIVERS
 +M:    Finn Thain <fthain@telegraphics.com.au>
 +M:    Michael Schmitz <schmitzmic@gmail.com>
 +L:    linux-scsi@vger.kernel.org
 +S:    Maintained
 +F:    Documentation/scsi/g_NCR5380.txt
 +F:    drivers/scsi/NCR5380.*
 +F:    drivers/scsi/arm/cumana_1.c
 +F:    drivers/scsi/arm/oak.c
 +F:    drivers/scsi/atari_NCR5380.c
 +F:    drivers/scsi/atari_scsi.*
 +F:    drivers/scsi/dmx3191d.c
 +F:    drivers/scsi/dtc.*
 +F:    drivers/scsi/g_NCR5380.*
 +F:    drivers/scsi/g_NCR5380_mmio.c
 +F:    drivers/scsi/mac_scsi.*
 +F:    drivers/scsi/pas16.*
 +F:    drivers/scsi/sun3_NCR5380.c
 +F:    drivers/scsi/sun3_scsi.*
 +F:    drivers/scsi/sun3_scsi_vme.c
 +F:    drivers/scsi/t128.*
 +
  NCR DUAL 700 SCSI DRIVER (MICROCHANNEL)
  M:    "James E.J. Bottomley" <James.Bottomley@HansenPartnership.com>
  L:    linux-scsi@vger.kernel.org
@@@ -6464,7 -6416,6 +6465,7 @@@ F:      drivers/usb/*/*omap
  F:    arch/arm/*omap*/usb*
  
  OMAP GPIO DRIVER
 +M:    Javier Martinez Canillas <javier@dowhile0.org>
  M:    Santosh Shilimkar <santosh.shilimkar@ti.com>
  M:    Kevin Hilman <khilman@deeprootsystems.com>
  L:    linux-omap@vger.kernel.org
@@@ -6561,10 -6512,10 +6562,10 @@@ T:   git git://openrisc.net/~jonas/linu
  F:    arch/openrisc/
  
  OPENVSWITCH
 -M:    Jesse Gross <jesse@nicira.com>
 +M:    Pravin Shelar <pshelar@nicira.com>
  L:    dev@openvswitch.org
  W:    http://openvswitch.org
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/jesse/openvswitch.git
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/pshelar/openvswitch.git
  S:    Maintained
  F:    net/openvswitch/
  
@@@ -6754,7 -6705,6 +6755,7 @@@ F:      Documentation/PCI
  F:    drivers/pci/
  F:    include/linux/pci*
  F:    arch/x86/pci/
 +F:    arch/x86/kernel/quirks.c
  
  PCI DRIVER FOR IMX6
  M:    Richard Zhu <r65037@freescale.com>
@@@ -6802,14 -6752,6 +6803,14 @@@ L:    linux-pci@vger.kernel.or
  S:    Maintained
  F:    drivers/pci/host/*designware*
  
 +PCI DRIVER FOR GENERIC OF HOSTS
 +M:    Will Deacon <will.deacon@arm.com>
 +L:    linux-pci@vger.kernel.org
 +L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/pci/host-generic-pci.txt
 +F:    drivers/pci/host/pci-host-generic.c
 +
  PCMCIA SUBSYSTEM
  P:    Linux PCMCIA Team
  L:    linux-pcmcia@lists.infradead.org
@@@ -6994,6 -6936,7 +6995,6 @@@ F:      drivers/power
  
  PNP SUPPORT
  M:    Rafael J. Wysocki <rafael.j.wysocki@intel.com>
 -M:    Bjorn Helgaas <bhelgaas@google.com>
  S:    Maintained
  F:    drivers/pnp/
  
@@@ -7460,14 -7403,6 +7461,14 @@@ F:    drivers/rpmsg
  F:    Documentation/rpmsg.txt
  F:    include/linux/rpmsg.h
  
 +RESET CONTROLLER FRAMEWORK
 +M:    Philipp Zabel <p.zabel@pengutronix.de>
 +S:    Maintained
 +F:    drivers/reset/
 +F:    Documentation/devicetree/bindings/reset/
 +F:    include/linux/reset.h
 +F:    include/linux/reset-controller.h
 +
  RFKILL
  M:    Johannes Berg <johannes@sipsolutions.net>
  L:    linux-wireless@vger.kernel.org
@@@ -7717,6 -7652,7 +7718,6 @@@ L:      linux-media@vger.kernel.or
  Q:    https://patchwork.linuxtv.org/project/linux-media/list/
  S:    Supported
  F:    drivers/media/platform/exynos4-is/
 -F:    include/media/s5p_fimc.h
  
  SAMSUNG S3C24XX/S3C64XX SOC SERIES CAMIF DRIVER
  M:    Sylwester Nawrocki <sylvester.nawrocki@gmail.com>
@@@ -8019,26 -7955,6 +8020,26 @@@ M:    Robin Holt <robinmholt@gmail.com
  S:    Maintained
  F:    drivers/misc/sgi-xp/
  
 +SI2157 MEDIA DRIVER
 +M:    Antti Palosaari <crope@iki.fi>
 +L:    linux-media@vger.kernel.org
 +W:    http://linuxtv.org/
 +W:    http://palosaari.fi/linux/
 +Q:    http://patchwork.linuxtv.org/project/linux-media/list/
 +T:    git git://linuxtv.org/anttip/media_tree.git
 +S:    Maintained
 +F:    drivers/media/tuners/si2157*
 +
 +SI2168 MEDIA DRIVER
 +M:    Antti Palosaari <crope@iki.fi>
 +L:    linux-media@vger.kernel.org
 +W:    http://linuxtv.org/
 +W:    http://palosaari.fi/linux/
 +Q:    http://patchwork.linuxtv.org/project/linux-media/list/
 +T:    git git://linuxtv.org/anttip/media_tree.git
 +S:    Maintained
 +F:    drivers/media/dvb-frontends/si2168*
 +
  SI470X FM RADIO RECEIVER I2C DRIVER
  M:    Hans Verkuil <hverkuil@xs4all.nl>
  L:    linux-media@vger.kernel.org
@@@ -8338,7 -8254,6 +8339,7 @@@ L:      alsa-devel@alsa-project.org (moderat
  W:    http://www.alsa-project.org/
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound.git
  T:    git git://git.alsa-project.org/alsa-kernel.git
 +Q:    http://patchwork.kernel.org/project/alsa-devel/list/
  S:    Maintained
  F:    Documentation/sound/
  F:    include/sound/
@@@ -8559,7 -8474,7 +8560,7 @@@ S:      Maintaine
  F:    drivers/staging/olpc_dcon/
  
  STAGING - OZMO DEVICES USB OVER WIFI DRIVER
 -M:    Rupesh Gujare <rupesh.gujare@atmel.com>
 +M:    Shigekatsu Tateno <shigekatsu.tateno@atmel.com>
  S:    Maintained
  F:    drivers/staging/ozwpan/
  
@@@ -8574,13 -8489,6 +8575,13 @@@ M:    Florian Schilhabel <florian.c.schilh
  S:    Odd Fixes
  F:    drivers/staging/rtl8712/
  
 +STAGING - REALTEK RTL8723U WIRELESS DRIVER
 +M:    Larry Finger <Larry.Finger@lwfinger.net>
 +M:    Jes Sorensen <Jes.Sorensen@redhat.com>
 +L:    linux-wireless@vger.kernel.org
 +S:    Maintained
 +F:    drivers/staging/rtl8723au/
 +
  STAGING - SILICON MOTION SM7XX FRAME BUFFER DRIVER
  M:    Teddy Wang <teddy.wang@siliconmotion.com.cn>
  S:    Odd Fixes
@@@ -9143,6 -9051,7 +9144,6 @@@ F:      drivers/char/tpm
  
  TRACING
  M:    Steven Rostedt <rostedt@goodmis.org>
 -M:    Frederic Weisbecker <fweisbec@gmail.com>
  M:    Ingo Molnar <mingo@redhat.com>
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git perf/core
  S:    Maintained
@@@ -9199,9 -9108,6 +9200,9 @@@ F:      arch/um/os-Linux/drivers
  
  TURBOCHANNEL SUBSYSTEM
  M:    "Maciej W. Rozycki" <macro@linux-mips.org>
 +M:    Ralf Baechle <ralf@linux-mips.org>
 +L:    linux-mips@linux-mips.org
 +Q:    http://patchwork.linux-mips.org/project/linux-mips/list/
  S:    Maintained
  F:    drivers/tc/
  F:    include/linux/tc.h
diff --combined fs/f2fs/checkpoint.c
index c405b8f1705415e9e7344c66ceea27feaa0c36fa,ecba8da3308b9160ba4a062253b20a9b9fd8612b..0b4710c1d3702584818a897ea7600bf170591abf
@@@ -33,12 -33,12 +33,12 @@@ struct page *grab_meta_page(struct f2fs
        struct address_space *mapping = META_MAPPING(sbi);
        struct page *page = NULL;
  repeat:
-       page = grab_cache_page_write_begin(mapping, index, AOP_FLAG_NOFS);
+       page = grab_cache_page(mapping, index);
        if (!page) {
                cond_resched();
                goto repeat;
        }
+       f2fs_wait_on_page_writeback(page, META);
        SetPageUptodate(page);
        return page;
  }
@@@ -69,10 -69,11 +69,10 @@@ repeat
                goto repeat;
        }
  out:
 -      mark_page_accessed(page);
        return page;
  }
  
- inline int get_max_meta_blks(struct f2fs_sb_info *sbi, int type)
static inline int get_max_meta_blks(struct f2fs_sb_info *sbi, int type)
  {
        switch (type) {
        case META_NAT:
@@@ -136,11 -137,13 +136,11 @@@ int ra_meta_pages(struct f2fs_sb_info *
                if (!page)
                        continue;
                if (PageUptodate(page)) {
 -                      mark_page_accessed(page);
                        f2fs_put_page(page, 1);
                        continue;
                }
  
                f2fs_submit_page_mbio(sbi, page, blk_addr, &fio);
 -              mark_page_accessed(page);
                f2fs_put_page(page, 0);
        }
  out:
@@@ -154,6 -157,8 +154,8 @@@ static int f2fs_write_meta_page(struct 
        struct inode *inode = page->mapping->host;
        struct f2fs_sb_info *sbi = F2FS_SB(inode->i_sb);
  
+       trace_f2fs_writepage(page, META);
        if (unlikely(sbi->por_doing))
                goto redirty_out;
        if (wbc->for_reclaim)
@@@ -171,10 -176,7 +173,7 @@@ no_write
        return 0;
  
  redirty_out:
-       dec_page_count(sbi, F2FS_DIRTY_META);
-       wbc->pages_skipped++;
-       account_page_redirty(page);
-       set_page_dirty(page);
+       redirty_page_for_writepage(wbc, page);
        return AOP_WRITEPAGE_ACTIVATE;
  }
  
@@@ -184,6 -186,8 +183,8 @@@ static int f2fs_write_meta_pages(struc
        struct f2fs_sb_info *sbi = F2FS_SB(mapping->host->i_sb);
        long diff, written;
  
+       trace_f2fs_writepages(mapping->host, wbc, META);
        /* collect a number of dirty meta pages and write together */
        if (wbc->for_kupdate ||
                get_pages(sbi, F2FS_DIRTY_META) < nr_pages_to_skip(sbi, META))
@@@ -367,7 -371,9 +368,9 @@@ void recover_orphan_inodes(struct f2fs_
                return;
  
        sbi->por_doing = true;
-       start_blk = __start_cp_addr(sbi) + 1;
+       start_blk = __start_cp_addr(sbi) + 1 +
+               le32_to_cpu(F2FS_RAW_SUPER(sbi)->cp_payload);
        orphan_blkaddr = __start_sum_addr(sbi) - 1;
  
        ra_meta_pages(sbi, start_blk, orphan_blkaddr, META_CP);
@@@ -508,8 -514,11 +511,11 @@@ int get_valid_checkpoint(struct f2fs_sb
        unsigned long blk_size = sbi->blocksize;
        unsigned long long cp1_version = 0, cp2_version = 0;
        unsigned long long cp_start_blk_no;
+       unsigned int cp_blks = 1 + le32_to_cpu(F2FS_RAW_SUPER(sbi)->cp_payload);
+       block_t cp_blk_no;
+       int i;
  
-       sbi->ckpt = kzalloc(blk_size, GFP_KERNEL);
+       sbi->ckpt = kzalloc(cp_blks * blk_size, GFP_KERNEL);
        if (!sbi->ckpt)
                return -ENOMEM;
        /*
        cp_block = (struct f2fs_checkpoint *)page_address(cur_page);
        memcpy(sbi->ckpt, cp_block, blk_size);
  
+       if (cp_blks <= 1)
+               goto done;
+       cp_blk_no = le32_to_cpu(fsb->cp_blkaddr);
+       if (cur_page == cp2)
+               cp_blk_no += 1 << le32_to_cpu(fsb->log_blocks_per_seg);
+       for (i = 1; i < cp_blks; i++) {
+               void *sit_bitmap_ptr;
+               unsigned char *ckpt = (unsigned char *)sbi->ckpt;
+               cur_page = get_meta_page(sbi, cp_blk_no + i);
+               sit_bitmap_ptr = page_address(cur_page);
+               memcpy(ckpt + i * blk_size, sit_bitmap_ptr, blk_size);
+               f2fs_put_page(cur_page, 1);
+       }
+ done:
        f2fs_put_page(cp1, 1);
        f2fs_put_page(cp2, 1);
        return 0;
@@@ -552,14 -578,13 +575,13 @@@ fail_no_cp
  static int __add_dirty_inode(struct inode *inode, struct dir_inode_entry *new)
  {
        struct f2fs_sb_info *sbi = F2FS_SB(inode->i_sb);
-       struct list_head *head = &sbi->dir_inode_list;
-       struct dir_inode_entry *entry;
  
-       list_for_each_entry(entry, head, list)
-               if (unlikely(entry->inode == inode))
-                       return -EEXIST;
+       if (is_inode_flag_set(F2FS_I(inode), FI_DIRTY_DIR))
+               return -EEXIST;
  
-       list_add_tail(&new->list, head);
+       set_inode_flag(F2FS_I(inode), FI_DIRTY_DIR);
+       F2FS_I(inode)->dirty_dir = new;
+       list_add_tail(&new->list, &sbi->dir_inode_list);
        stat_inc_dirty_dir(sbi);
        return 0;
  }
@@@ -608,31 -633,26 +630,26 @@@ void add_dirty_dir_inode(struct inode *
  void remove_dirty_dir_inode(struct inode *inode)
  {
        struct f2fs_sb_info *sbi = F2FS_SB(inode->i_sb);
-       struct list_head *head;
        struct dir_inode_entry *entry;
  
        if (!S_ISDIR(inode->i_mode))
                return;
  
        spin_lock(&sbi->dir_inode_lock);
-       if (get_dirty_dents(inode)) {
+       if (get_dirty_dents(inode) ||
+                       !is_inode_flag_set(F2FS_I(inode), FI_DIRTY_DIR)) {
                spin_unlock(&sbi->dir_inode_lock);
                return;
        }
  
-       head = &sbi->dir_inode_list;
-       list_for_each_entry(entry, head, list) {
-               if (entry->inode == inode) {
-                       list_del(&entry->list);
-                       stat_dec_dirty_dir(sbi);
-                       spin_unlock(&sbi->dir_inode_lock);
-                       kmem_cache_free(inode_entry_slab, entry);
-                       goto done;
-               }
-       }
+       entry = F2FS_I(inode)->dirty_dir;
+       list_del(&entry->list);
+       F2FS_I(inode)->dirty_dir = NULL;
+       clear_inode_flag(F2FS_I(inode), FI_DIRTY_DIR);
+       stat_dec_dirty_dir(sbi);
        spin_unlock(&sbi->dir_inode_lock);
+       kmem_cache_free(inode_entry_slab, entry);
  
- done:
        /* Only from the recovery routine */
        if (is_inode_flag_set(F2FS_I(inode), FI_DELAY_IPUT)) {
                clear_inode_flag(F2FS_I(inode), FI_DELAY_IPUT);
        }
  }
  
- struct inode *check_dirty_dir_inode(struct f2fs_sb_info *sbi, nid_t ino)
- {
-       struct list_head *head;
-       struct inode *inode = NULL;
-       struct dir_inode_entry *entry;
-       spin_lock(&sbi->dir_inode_lock);
-       head = &sbi->dir_inode_list;
-       list_for_each_entry(entry, head, list) {
-               if (entry->inode->i_ino == ino) {
-                       inode = entry->inode;
-                       break;
-               }
-       }
-       spin_unlock(&sbi->dir_inode_lock);
-       return inode;
- }
  void sync_dirty_dir_inodes(struct f2fs_sb_info *sbi)
  {
        struct list_head *head;
@@@ -758,6 -758,13 +755,13 @@@ static void do_checkpoint(struct f2fs_s
        __u32 crc32 = 0;
        void *kaddr;
        int i;
+       int cp_payload_blks = le32_to_cpu(F2FS_RAW_SUPER(sbi)->cp_payload);
+       /*
+        * This avoids to conduct wrong roll-forward operations and uses
+        * metapages, so should be called prior to sync_meta_pages below.
+        */
+       discard_next_dnode(sbi);
  
        /* Flush all the NAT/SIT pages */
        while (get_pages(sbi, F2FS_DIRTY_META))
  
        orphan_blocks = (sbi->n_orphans + F2FS_ORPHANS_PER_BLOCK - 1)
                                        / F2FS_ORPHANS_PER_BLOCK;
-       ckpt->cp_pack_start_sum = cpu_to_le32(1 + orphan_blocks);
+       ckpt->cp_pack_start_sum = cpu_to_le32(1 + cp_payload_blks +
+                       orphan_blocks);
  
        if (is_umount) {
                set_ckpt_flags(ckpt, CP_UMOUNT_FLAG);
                ckpt->cp_pack_total_block_count = cpu_to_le32(2 +
-                       data_sum_blocks + orphan_blocks + NR_CURSEG_NODE_TYPE);
+                               cp_payload_blks + data_sum_blocks +
+                               orphan_blocks + NR_CURSEG_NODE_TYPE);
        } else {
                clear_ckpt_flags(ckpt, CP_UMOUNT_FLAG);
                ckpt->cp_pack_total_block_count = cpu_to_le32(2 +
-                       data_sum_blocks + orphan_blocks);
+                               cp_payload_blks + data_sum_blocks +
+                               orphan_blocks);
        }
  
        if (sbi->n_orphans)
        set_page_dirty(cp_page);
        f2fs_put_page(cp_page, 1);
  
+       for (i = 1; i < 1 + cp_payload_blks; i++) {
+               cp_page = grab_meta_page(sbi, start_blk++);
+               kaddr = page_address(cp_page);
+               memcpy(kaddr, (char *)ckpt + i * F2FS_BLKSIZE,
+                               (1 << sbi->log_blocksize));
+               set_page_dirty(cp_page);
+               f2fs_put_page(cp_page, 1);
+       }
        if (sbi->n_orphans) {
                write_orphan_inodes(sbi, start_blk);
                start_blk += orphan_blocks;
diff --combined fs/f2fs/node.c
index 57caa6eaf47bce780426bb1764286c0c3b415b06,a0a1f25ed20f99ca378f4653793c07c26334598c..9dfb9a042fd295bf20d31cf1bb4d8f280a631368
  static struct kmem_cache *nat_entry_slab;
  static struct kmem_cache *free_nid_slab;
  
static inline bool available_free_memory(struct f2fs_nm_info *nm_i, int type)
bool available_free_memory(struct f2fs_sb_info *sbi, int type)
  {
+       struct f2fs_nm_info *nm_i = NM_I(sbi);
        struct sysinfo val;
        unsigned long mem_size = 0;
+       bool res = false;
  
        si_meminfo(&val);
-       if (type == FREE_NIDS)
-               mem_size = nm_i->fcnt * sizeof(struct free_nid);
-       else if (type == NAT_ENTRIES)
-               mem_size += nm_i->nat_cnt * sizeof(struct nat_entry);
-       mem_size >>= 12;
-       /* give 50:50 memory for free nids and nat caches respectively */
-       return (mem_size < ((val.totalram * nm_i->ram_thresh) >> 11));
+       /* give 25%, 25%, 50% memory for each components respectively */
+       if (type == FREE_NIDS) {
+               mem_size = (nm_i->fcnt * sizeof(struct free_nid)) >> 12;
+               res = mem_size < ((val.totalram * nm_i->ram_thresh / 100) >> 2);
+       } else if (type == NAT_ENTRIES) {
+               mem_size = (nm_i->nat_cnt * sizeof(struct nat_entry)) >> 12;
+               res = mem_size < ((val.totalram * nm_i->ram_thresh / 100) >> 2);
+       } else if (type == DIRTY_DENTS) {
+               mem_size = get_pages(sbi, F2FS_DIRTY_DENTS);
+               res = mem_size < ((val.totalram * nm_i->ram_thresh / 100) >> 1);
+       }
+       return res;
  }
  
  static void clear_node_page_dirty(struct page *page)
@@@ -147,6 -153,18 +153,18 @@@ bool fsync_mark_done(struct f2fs_sb_inf
        return fsync_done;
  }
  
+ void fsync_mark_clear(struct f2fs_sb_info *sbi, nid_t nid)
+ {
+       struct f2fs_nm_info *nm_i = NM_I(sbi);
+       struct nat_entry *e;
+       write_lock(&nm_i->nat_tree_lock);
+       e = __lookup_nat_cache(nm_i, nid);
+       if (e)
+               e->fsync_done = false;
+       write_unlock(&nm_i->nat_tree_lock);
+ }
  static struct nat_entry *grab_nat_entry(struct f2fs_nm_info *nm_i, nid_t nid)
  {
        struct nat_entry *new;
@@@ -179,9 -197,7 +197,7 @@@ retry
                        write_unlock(&nm_i->nat_tree_lock);
                        goto retry;
                }
-               nat_set_blkaddr(e, le32_to_cpu(ne->block_addr));
-               nat_set_ino(e, le32_to_cpu(ne->ino));
-               nat_set_version(e, ne->version);
+               node_info_from_raw_nat(&e->ni, ne);
        }
        write_unlock(&nm_i->nat_tree_lock);
  }
@@@ -243,7 -259,7 +259,7 @@@ int try_to_free_nats(struct f2fs_sb_inf
  {
        struct f2fs_nm_info *nm_i = NM_I(sbi);
  
-       if (available_free_memory(nm_i, NAT_ENTRIES))
+       if (available_free_memory(sbi, NAT_ENTRIES))
                return 0;
  
        write_lock(&nm_i->nat_tree_lock);
@@@ -849,8 -865,7 +865,7 @@@ struct page *new_node_page(struct dnode
        if (unlikely(is_inode_flag_set(F2FS_I(dn->inode), FI_NO_ALLOC)))
                return ERR_PTR(-EPERM);
  
-       page = grab_cache_page_write_begin(NODE_MAPPING(sbi),
-                                       dn->nid, AOP_FLAG_NOFS);
+       page = grab_cache_page(NODE_MAPPING(sbi), dn->nid);
        if (!page)
                return ERR_PTR(-ENOMEM);
  
        new_ni.ino = dn->inode->i_ino;
        set_node_addr(sbi, &new_ni, NEW_ADDR, false);
  
+       f2fs_wait_on_page_writeback(page, NODE);
        fill_node_footer(page, dn->nid, dn->inode->i_ino, ofs, true);
        set_cold_node(dn->inode, page);
        SetPageUptodate(page);
@@@ -946,8 -962,7 +962,7 @@@ struct page *get_node_page(struct f2fs_
        struct page *page;
        int err;
  repeat:
-       page = grab_cache_page_write_begin(NODE_MAPPING(sbi),
-                                       nid, AOP_FLAG_NOFS);
+       page = grab_cache_page(NODE_MAPPING(sbi), nid);
        if (!page)
                return ERR_PTR(-ENOMEM);
  
                goto repeat;
        }
  got_it:
 -      mark_page_accessed(page);
        return page;
  }
  
@@@ -1021,6 -1037,7 +1036,6 @@@ page_hit
                f2fs_put_page(page, 1);
                return ERR_PTR(-EIO);
        }
 -      mark_page_accessed(page);
        return page;
  }
  
@@@ -1194,6 -1211,8 +1209,8 @@@ static int f2fs_write_node_page(struct 
                .rw = (wbc->sync_mode == WB_SYNC_ALL) ? WRITE_SYNC : WRITE,
        };
  
+       trace_f2fs_writepage(page, NODE);
        if (unlikely(sbi->por_doing))
                goto redirty_out;
  
        return 0;
  
  redirty_out:
-       dec_page_count(sbi, F2FS_DIRTY_NODES);
-       wbc->pages_skipped++;
-       account_page_redirty(page);
-       set_page_dirty(page);
+       redirty_page_for_writepage(wbc, page);
        return AOP_WRITEPAGE_ACTIVATE;
  }
  
@@@ -1238,6 -1254,8 +1252,8 @@@ static int f2fs_write_node_pages(struc
        struct f2fs_sb_info *sbi = F2FS_SB(mapping->host->i_sb);
        long diff;
  
+       trace_f2fs_writepages(mapping->host, wbc, NODE);
        /* balancing f2fs's metadata in background */
        f2fs_balance_fs_bg(sbi);
  
@@@ -1313,13 -1331,14 +1329,14 @@@ static void __del_from_free_nid_list(st
        radix_tree_delete(&nm_i->free_nid_root, i->nid);
  }
  
- static int add_free_nid(struct f2fs_nm_info *nm_i, nid_t nid, bool build)
+ static int add_free_nid(struct f2fs_sb_info *sbi, nid_t nid, bool build)
  {
+       struct f2fs_nm_info *nm_i = NM_I(sbi);
        struct free_nid *i;
        struct nat_entry *ne;
        bool allocated = false;
  
-       if (!available_free_memory(nm_i, FREE_NIDS))
+       if (!available_free_memory(sbi, FREE_NIDS))
                return -1;
  
        /* 0 nid should not be used */
@@@ -1372,9 -1391,10 +1389,10 @@@ static void remove_free_nid(struct f2fs
                kmem_cache_free(free_nid_slab, i);
  }
  
- static void scan_nat_page(struct f2fs_nm_info *nm_i,
+ static void scan_nat_page(struct f2fs_sb_info *sbi,
                        struct page *nat_page, nid_t start_nid)
  {
+       struct f2fs_nm_info *nm_i = NM_I(sbi);
        struct f2fs_nat_block *nat_blk = page_address(nat_page);
        block_t blk_addr;
        int i;
                blk_addr = le32_to_cpu(nat_blk->entries[i].block_addr);
                f2fs_bug_on(blk_addr == NEW_ADDR);
                if (blk_addr == NULL_ADDR) {
-                       if (add_free_nid(nm_i, start_nid, true) < 0)
+                       if (add_free_nid(sbi, start_nid, true) < 0)
                                break;
                }
        }
@@@ -1413,7 -1433,7 +1431,7 @@@ static void build_free_nids(struct f2fs
        while (1) {
                struct page *page = get_current_nat_page(sbi, nid);
  
-               scan_nat_page(nm_i, page, nid);
+               scan_nat_page(sbi, page, nid);
                f2fs_put_page(page, 1);
  
                nid += (NAT_ENTRY_PER_BLOCK - (nid % NAT_ENTRY_PER_BLOCK));
                block_t addr = le32_to_cpu(nat_in_journal(sum, i).block_addr);
                nid = le32_to_cpu(nid_in_journal(sum, i));
                if (addr == NULL_ADDR)
-                       add_free_nid(nm_i, nid, true);
+                       add_free_nid(sbi, nid, true);
                else
                        remove_free_nid(nm_i, nid);
        }
@@@ -1450,7 -1470,7 +1468,7 @@@ bool alloc_nid(struct f2fs_sb_info *sbi
        struct f2fs_nm_info *nm_i = NM_I(sbi);
        struct free_nid *i = NULL;
  retry:
-       if (unlikely(sbi->total_valid_node_count + 1 >= nm_i->max_nid))
+       if (unlikely(sbi->total_valid_node_count + 1 > nm_i->available_nids))
                return false;
  
        spin_lock(&nm_i->free_nid_list_lock);
@@@ -1510,7 -1530,7 +1528,7 @@@ void alloc_nid_failed(struct f2fs_sb_in
        spin_lock(&nm_i->free_nid_list_lock);
        i = __lookup_free_nid_list(nm_i, nid);
        f2fs_bug_on(!i || i->state != NID_ALLOC);
-       if (!available_free_memory(nm_i, FREE_NIDS)) {
+       if (!available_free_memory(sbi, FREE_NIDS)) {
                __del_from_free_nid_list(nm_i, i);
                need_free = true;
        } else {
@@@ -1532,7 -1552,7 +1550,7 @@@ void recover_node_page(struct f2fs_sb_i
        clear_node_page_dirty(page);
  }
  
- void recover_inline_xattr(struct inode *inode, struct page *page)
static void recover_inline_xattr(struct inode *inode, struct page *page)
  {
        struct f2fs_sb_info *sbi = F2FS_SB(inode->i_sb);
        void *src_addr, *dst_addr;
        src_addr = inline_xattr_addr(page);
        inline_size = inline_xattr_size(inode);
  
+       f2fs_wait_on_page_writeback(ipage, NODE);
        memcpy(dst_addr, src_addr, inline_size);
  
        update_inode(inode, ipage);
@@@ -1612,6 -1633,11 +1631,11 @@@ int recover_inode_page(struct f2fs_sb_i
        struct node_info old_ni, new_ni;
        struct page *ipage;
  
+       get_node_info(sbi, ino, &old_ni);
+       if (unlikely(old_ni.blk_addr != NULL_ADDR))
+               return -EINVAL;
        ipage = grab_cache_page(NODE_MAPPING(sbi), ino);
        if (!ipage)
                return -ENOMEM;
        /* Should not use this inode  from free nid list */
        remove_free_nid(NM_I(sbi), ino);
  
-       get_node_info(sbi, ino, &old_ni);
        SetPageUptodate(ipage);
        fill_node_footer(ipage, ino, ino, 0, true);
  
  
  /*
   * ra_sum_pages() merge contiguous pages into one bio and submit.
-  * these pre-readed pages are linked in pages list.
+  * these pre-readed pages are alloced in bd_inode's mapping tree.
   */
- static int ra_sum_pages(struct f2fs_sb_info *sbi, struct list_head *pages,
+ static int ra_sum_pages(struct f2fs_sb_info *sbi, struct page **pages,
                                int start, int nrpages)
  {
-       struct page *page;
-       int page_idx = start;
+       struct inode *inode = sbi->sb->s_bdev->bd_inode;
+       struct address_space *mapping = inode->i_mapping;
+       int i, page_idx = start;
        struct f2fs_io_info fio = {
                .type = META,
                .rw = READ_SYNC | REQ_META | REQ_PRIO
        };
  
-       for (; page_idx < start + nrpages; page_idx++) {
-               /* alloc temporal page for read node summary info*/
-               page = alloc_page(GFP_F2FS_ZERO);
-               if (!page)
+       for (i = 0; page_idx < start + nrpages; page_idx++, i++) {
+               /* alloc page in bd_inode for reading node summary info */
+               pages[i] = grab_cache_page(mapping, page_idx);
+               if (!pages[i])
                        break;
-               lock_page(page);
-               page->index = page_idx;
-               list_add_tail(&page->lru, pages);
+               f2fs_submit_page_mbio(sbi, pages[i], page_idx, &fio);
        }
  
-       list_for_each_entry(page, pages, lru)
-               f2fs_submit_page_mbio(sbi, page, page->index, &fio);
        f2fs_submit_merged_bio(sbi, META, READ);
-       return page_idx - start;
+       return i;
  }
  
  int restore_node_summary(struct f2fs_sb_info *sbi,
  {
        struct f2fs_node *rn;
        struct f2fs_summary *sum_entry;
-       struct page *page, *tmp;
+       struct inode *inode = sbi->sb->s_bdev->bd_inode;
        block_t addr;
        int bio_blocks = MAX_BIO_BLOCKS(max_hw_blocks(sbi));
-       int i, last_offset, nrpages, err = 0;
-       LIST_HEAD(page_list);
+       struct page *pages[bio_blocks];
+       int i, idx, last_offset, nrpages, err = 0;
  
        /* scan the node segment */
        last_offset = sbi->blocks_per_seg;
                nrpages = min(last_offset - i, bio_blocks);
  
                /* read ahead node pages */
-               nrpages = ra_sum_pages(sbi, &page_list, addr, nrpages);
+               nrpages = ra_sum_pages(sbi, pages, addr, nrpages);
                if (!nrpages)
                        return -ENOMEM;
  
-               list_for_each_entry_safe(page, tmp, &page_list, lru) {
+               for (idx = 0; idx < nrpages; idx++) {
                        if (err)
                                goto skip;
  
-                       lock_page(page);
-                       if (unlikely(!PageUptodate(page))) {
+                       lock_page(pages[idx]);
+                       if (unlikely(!PageUptodate(pages[idx]))) {
                                err = -EIO;
                        } else {
-                               rn = F2FS_NODE(page);
+                               rn = F2FS_NODE(pages[idx]);
                                sum_entry->nid = rn->footer.nid;
                                sum_entry->version = 0;
                                sum_entry->ofs_in_node = 0;
                                sum_entry++;
                        }
-                       unlock_page(page);
+                       unlock_page(pages[idx]);
  skip:
-                       list_del(&page->lru);
-                       __free_pages(page, 0);
+                       page_cache_release(pages[idx]);
                }
+               invalidate_mapping_pages(inode->i_mapping, addr,
+                                                       addr + nrpages);
        }
        return err;
  }
@@@ -1756,9 -1777,7 +1775,7 @@@ retry
                        write_unlock(&nm_i->nat_tree_lock);
                        goto retry;
                }
-               nat_set_blkaddr(ne, le32_to_cpu(raw_ne.block_addr));
-               nat_set_ino(ne, le32_to_cpu(raw_ne.ino));
-               nat_set_version(ne, raw_ne.version);
+               node_info_from_raw_nat(&ne->ni, &raw_ne);
                __set_nat_cache_dirty(nm_i, ne);
                write_unlock(&nm_i->nat_tree_lock);
        }
@@@ -1791,7 -1810,6 +1808,6 @@@ void flush_nat_entries(struct f2fs_sb_i
                nid_t nid;
                struct f2fs_nat_entry raw_ne;
                int offset = -1;
-               block_t new_blkaddr;
  
                if (nat_get_blkaddr(ne) == NEW_ADDR)
                        continue;
@@@ -1827,11 -1845,7 +1843,7 @@@ to_nat_page
                f2fs_bug_on(!nat_blk);
                raw_ne = nat_blk->entries[nid - start_nid];
  flush_now:
-               new_blkaddr = nat_get_blkaddr(ne);
-               raw_ne.ino = cpu_to_le32(nat_get_ino(ne));
-               raw_ne.block_addr = cpu_to_le32(new_blkaddr);
-               raw_ne.version = nat_get_version(ne);
+               raw_nat_from_node_info(&raw_ne, &ne->ni);
  
                if (offset < 0) {
                        nat_blk->entries[nid - start_nid] = raw_ne;
                }
  
                if (nat_get_blkaddr(ne) == NULL_ADDR &&
-                               add_free_nid(NM_I(sbi), nid, false) <= 0) {
+                               add_free_nid(sbi, nid, false) <= 0) {
                        write_lock(&nm_i->nat_tree_lock);
                        __del_from_nat_cache(nm_i, ne);
                        write_unlock(&nm_i->nat_tree_lock);
@@@ -1869,8 -1883,10 +1881,10 @@@ static int init_node_manager(struct f2f
        nat_segs = le32_to_cpu(sb_raw->segment_count_nat) >> 1;
        nat_blocks = nat_segs << le32_to_cpu(sb_raw->log_blocks_per_seg);
  
+       nm_i->max_nid = NAT_ENTRY_PER_BLOCK * nat_blocks;
        /* not used nids: 0, node, meta, (and root counted as valid node) */
-       nm_i->max_nid = NAT_ENTRY_PER_BLOCK * nat_blocks - 3;
+       nm_i->available_nids = nm_i->max_nid - 3;
        nm_i->fcnt = 0;
        nm_i->nat_cnt = 0;
        nm_i->ram_thresh = DEF_RAM_THRESHOLD;