Merge branch 'for-3.3' of git://linux-nfs.org/~bfields/linux
authorLinus Torvalds <torvalds@linux-foundation.org>
Sat, 14 Jan 2012 20:26:41 +0000 (12:26 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Sat, 14 Jan 2012 20:26:41 +0000 (12:26 -0800)
* 'for-3.3' of git://linux-nfs.org/~bfields/linux: (31 commits)
  nfsd4: nfsd4_create_clid_dir return value is unused
  NFSD: Change name of extended attribute containing junction
  svcrpc: don't revert to SVC_POOL_DEFAULT on nfsd shutdown
  svcrpc: fix double-free on shutdown of nfsd after changing pool mode
  nfsd4: be forgiving in the absence of the recovery directory
  nfsd4: fix spurious 4.1 post-reboot failures
  NFSD: forget_delegations should use list_for_each_entry_safe
  NFSD: Only reinitilize the recall_lru list under the recall lock
  nfsd4: initialize special stateid's at compile time
  NFSd: use network-namespace-aware cache registering routines
  SUNRPC: create svc_xprt in proper network namespace
  svcrpc: update outdated BKL comment
  nfsd41: allow non-reclaim open-by-fh's in 4.1
  svcrpc: avoid memory-corruption on pool shutdown
  svcrpc: destroy server sockets all at once
  svcrpc: make svc_delete_xprt static
  nfsd: Fix oops when parsing a 0 length export
  nfsd4: Use kmemdup rather than duplicating its implementation
  nfsd4: add a separate (lockowner, inode) lookup
  nfsd4: fix CONFIG_NFSD_FAULT_INJECTION compile error
  ...

1  2 
CREDITS
MAINTAINERS
fs/nfsd/nfs4proc.c
fs/nfsd/nfs4recover.c
fs/nfsd/nfs4state.c
fs/nfsd/nfsctl.c
fs/nfsd/vfs.c
net/sunrpc/cache.c
net/sunrpc/svc.c
net/sunrpc/svc_xprt.c
net/sunrpc/svcsock.c

diff --combined CREDITS
index 44fce988eaac8cd22bfe5a5e753ae1bb58b3476d,557da475bc9c46422a8696631e101d9c90de507c..370b4c7da39b2bd45ff098dc0b8062255e478ecb
+++ b/CREDITS
@@@ -514,6 -514,11 +514,11 @@@ S: Bessemerstraat 2
  S: Amsterdam
  S: The Netherlands
  
+ N: NeilBrown
+ E: neil@brown.name
+ P: 4096R/566281B9 1BC6 29EB D390 D870 7B5F  497A 39EC 9EDD 5662 81B9
+ D: NFSD Maintainer 2000-2007
  N: Zach Brown
  E: zab@zabbo.net
  D: maestro pci sound
@@@ -688,13 -693,10 +693,13 @@@ S: Oxfordshire, UK
  
  N: Kees Cook
  E: kees@outflux.net
 -W: http://outflux.net/
 -P: 1024D/17063E6D 9FA3 C49C 23C9 D1BC 2E30  1975 1FFF 4BA9 1706 3E6D
 -D: Minor updates to SCSI types, added /proc/pid/maps protection
 +E: kees@ubuntu.com
 +E: keescook@chromium.org
 +W: http://outflux.net/blog/
 +P: 4096R/DC6DC026 A5C3 F68F 229D D60F 723E  6E13 8972 F4DF DC6D C026
 +D: Various security things, bug fixes, and documentation.
  S: (ask for current address)
 +S: Portland, Oregon
  S: USA
  
  N: Robin Cornelius
diff --combined MAINTAINERS
index 7559c1ca56ba7afc11104e430c20417d905654f9,6ab923d15853acb0f92951eb37e83d460933910c..4d1ba2022a95e29d75cc0a9fb18a6f24558deac0
@@@ -184,6 -184,11 +184,6 @@@ S:        Maintaine
  F:    Documentation/filesystems/9p.txt
  F:    fs/9p/
  
 -A2232 SERIAL BOARD DRIVER
 -L:    linux-m68k@lists.linux-m68k.org
 -S:    Orphan
 -F:    drivers/staging/generic_serial/ser_a2232*
 -
  AACRAID SCSI RAID DRIVER
  M:    Adaptec OEM Raid Solutions <aacraid@adaptec.com>
  L:    linux-scsi@vger.kernel.org
@@@ -342,7 -347,7 +342,7 @@@ S: Supporte
  F:    drivers/mfd/adp5520.c
  F:    drivers/video/backlight/adp5520_bl.c
  F:    drivers/leds/leds-adp5520.c
 -F:    drivers/gpio/adp5520-gpio.c
 +F:    drivers/gpio/gpio-adp5520.c
  F:    drivers/input/keyboard/adp5520-keys.c
  
  ADP5588 QWERTY KEYPAD AND IO EXPANDER DRIVER (ADP5588/ADP5587)
@@@ -351,7 -356,7 +351,7 @@@ L: device-drivers-devel@blackfin.uclinu
  W:    http://wiki.analog.com/ADP5588
  S:    Supported
  F:    drivers/input/keyboard/adp5588-keys.c
 -F:    drivers/gpio/adp5588-gpio.c
 +F:    drivers/gpio/gpio-adp5588.c
  
  ADP8860 BACKLIGHT DRIVER (ADP8860/ADP8861/ADP8863)
  M:    Michael Hennerich <michael.hennerich@analog.com>
@@@ -506,8 -511,8 +506,8 @@@ M: Joerg Roedel <joerg.roedel@amd.com
  L:    iommu@lists.linux-foundation.org
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/joro/linux-2.6-iommu.git
  S:    Supported
 -F:    arch/x86/kernel/amd_iommu*.c
 -F:    arch/x86/include/asm/amd_iommu*.h
 +F:    drivers/iommu/amd_iommu*.[ch]
 +F:    include/linux/amd-iommu.h
  
  AMD MICROCODE UPDATE SUPPORT
  M:    Andreas Herrmann <andreas.herrmann3@amd.com>
@@@ -537,7 -542,6 +537,7 @@@ F: sound/soc/codecs/adau
  F:    sound/soc/codecs/adav*
  F:    sound/soc/codecs/ad1*
  F:    sound/soc/codecs/ssm*
 +F:    sound/soc/codecs/sigmadsp.*
  
  ANALOG DEVICES INC ASOC DRIVERS
  L:    uclinux-dist-devel@blackfin.uclinux.org
@@@ -785,7 -789,6 +785,7 @@@ L: linux-arm-kernel@lists.infradead.or
  S:    Maintained
  T:    git git://git.pengutronix.de/git/imx/linux-2.6.git
  F:    arch/arm/mach-mx*/
 +F:    arch/arm/mach-imx/
  F:    arch/arm/plat-mxc/
  
  ARM/FREESCALE IMX51
@@@ -801,13 -804,6 +801,13 @@@ S:       Maintaine
  T:    git git://git.linaro.org/people/shawnguo/linux-2.6.git
  F:    arch/arm/mach-imx/*imx6*
  
 +ARM/FREESCALE MXS ARM ARCHITECTURE
 +M:    Shawn Guo <shawn.guo@linaro.org>
 +L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 +S:    Maintained
 +T:    git git://git.linaro.org/people/shawnguo/linux-2.6.git
 +F:    arch/arm/mach-mxs/
 +
  ARM/GLOMATION GESBC9312SX MACHINE SUPPORT
  M:    Lennert Buytenhek <kernel@wantstofly.org>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
@@@ -915,6 -911,7 +915,6 @@@ M: Lennert Buytenhek <kernel@wantstofly
  M:    Nicolas Pitre <nico@fluxnic.net>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Odd Fixes
 -F:    arch/arm/mach-loki/
  F:    arch/arm/mach-kirkwood/
  F:    arch/arm/mach-mv78xx0/
  F:    arch/arm/mach-orion5x/
@@@ -1049,18 -1046,35 +1049,18 @@@ ARM/SAMSUNG ARM ARCHITECTURE
  M:    Ben Dooks <ben-linux@fluff.org>
  M:    Kukjin Kim <kgene.kim@samsung.com>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 +L:    linux-samsung-soc@vger.kernel.org (moderated for non-subscribers)
  W:    http://www.fluff.org/ben/linux/
  S:    Maintained
  F:    arch/arm/plat-samsung/
  F:    arch/arm/plat-s3c24xx/
  F:    arch/arm/plat-s5p/
 +F:    arch/arm/mach-s3c24*/
 +F:    arch/arm/mach-s3c64xx/
  F:    drivers/*/*s3c2410*
  F:    drivers/*/*/*s3c2410*
 -
 -ARM/S3C2410 ARM ARCHITECTURE
 -M:    Ben Dooks <ben-linux@fluff.org>
 -L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 -W:    http://www.fluff.org/ben/linux/
 -S:    Maintained
 -F:    arch/arm/mach-s3c2410/
 -
 -ARM/S3C244x ARM ARCHITECTURE
 -M:    Ben Dooks <ben-linux@fluff.org>
 -L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 -W:    http://www.fluff.org/ben/linux/
 -S:    Maintained
 -F:    arch/arm/mach-s3c2440/
 -F:    arch/arm/mach-s3c2443/
 -
 -ARM/S3C64xx ARM ARCHITECTURE
 -M:    Ben Dooks <ben-linux@fluff.org>
 -L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 -W:    http://www.fluff.org/ben/linux/
 -S:    Maintained
 -F:    arch/arm/mach-s3c64xx/
 +F:    drivers/spi/spi-s3c*
 +F:    sound/soc/samsung/*
  
  ARM/S5P EXYNOS ARM ARCHITECTURES
  M:    Kukjin Kim <kgene.kim@samsung.com>
@@@ -1076,8 -1090,8 +1076,8 @@@ L:      linux-arm-kernel@lists.infradead.or
  S:    Maintained
  F:    arch/arm/mach-s5pv210/mach-aquila.c
  F:    arch/arm/mach-s5pv210/mach-goni.c
 -F:    arch/arm/mach-exynos4/mach-universal_c210.c
 -F:    arch/arm/mach-exynos4/mach-nuri.c
 +F:    arch/arm/mach-exynos/mach-universal_c210.c
 +F:    arch/arm/mach-exynos/mach-nuri.c
  
  ARM/SAMSUNG S5P SERIES FIMC SUPPORT
  M:    Kyungmin Park <kyungmin.park@samsung.com>
@@@ -1092,7 -1106,6 +1092,7 @@@ F:      drivers/media/video/s5p-fimc
  ARM/SAMSUNG S5P SERIES Multi Format Codec (MFC) SUPPORT
  M:    Kyungmin Park <kyungmin.park@samsung.com>
  M:    Kamil Debski <k.debski@samsung.com>
 +M:     Jeongtae Park <jtp.park@samsung.com>
  L:    linux-arm-kernel@lists.infradead.org
  L:    linux-media@vger.kernel.org
  S:    Maintained
@@@ -1105,6 -1118,7 +1105,6 @@@ M:      Tomasz Stanislawski <t.stanislaws@sa
  L:    linux-arm-kernel@lists.infradead.org
  L:    linux-media@vger.kernel.org
  S:    Maintained
 -F:    arch/arm/plat-s5p/dev-tv.c
  F:    drivers/media/video/s5p-tv/
  
  ARM/SHMOBILE ARM ARCHITECTURE
@@@ -1118,6 -1132,13 +1118,6 @@@ S:     Supporte
  F:    arch/arm/mach-shmobile/
  F:    drivers/sh/
  
 -ARM/TELECHIPS ARM ARCHITECTURE
 -M:    "Hans J. Koch" <hjk@hansjkoch.de>
 -L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 -S:    Maintained
 -F:    arch/arm/plat-tcc/
 -F:    arch/arm/mach-tcc8k/
 -
  ARM/TECHNOLOGIC SYSTEMS TS7250 MACHINE SUPPORT
  M:    Lennert Buytenhek <kernel@wantstofly.org>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
@@@ -1139,13 -1160,14 +1139,13 @@@ L:   linux-arm-kernel@lists.infradead.or
  W:    http://www.mcuos.com
  S:    Maintained
  F:    arch/arm/mach-w90x900/
 -F:    arch/arm/mach-nuc93x/
  F:    drivers/input/keyboard/w90p910_keypad.c
  F:    drivers/input/touchscreen/w90p910_ts.c
  F:    drivers/watchdog/nuc900_wdt.c
  F:    drivers/net/ethernet/nuvoton/w90p910_ether.c
  F:    drivers/mtd/nand/nuc900_nand.c
  F:    drivers/rtc/rtc-nuc900.c
 -F:    drivers/spi/spi_nuc900.c
 +F:    drivers/spi/spi-nuc900.c
  F:    drivers/usb/host/ehci-w90x900.c
  F:    drivers/video/nuc900fb.c
  
@@@ -1170,6 -1192,7 +1170,6 @@@ L:      linux-arm-kernel@lists.infradead.or
  S:    Maintained
  F:    arch/arm/mach-ux500/
  F:    drivers/dma/ste_dma40*
 -F:    drivers/mfd/ab3550*
  F:    drivers/mfd/abx500*
  F:    drivers/mfd/ab8500*
  F:    drivers/mfd/stmpe*
@@@ -1349,7 -1372,7 +1349,7 @@@ F:      drivers/net/ethernet/cadence
  ATMEL SPI DRIVER
  M:    Nicolas Ferre <nicolas.ferre@atmel.com>
  S:    Supported
 -F:    drivers/spi/atmel_spi.*
 +F:    drivers/spi/spi-atmel.*
  
  ATMEL USBA UDC DRIVER
  M:    Nicolas Ferre <nicolas.ferre@atmel.com>
@@@ -1488,7 -1511,7 +1488,7 @@@ M:      Sonic Zhang <sonic.zhang@analog.com
  L:    uclinux-dist-devel@blackfin.uclinux.org
  W:    http://blackfin.uclinux.org
  S:    Supported
 -F:    drivers/tty/serial/bfin_5xx.c
 +F:    drivers/tty/serial/bfin_uart.c
  
  BLACKFIN WATCHDOG DRIVER
  M:    Mike Frysinger <vapier.adi@gmail.com>
@@@ -1579,7 -1602,7 +1579,7 @@@ M:      Franky (Zhenhui) Lin <frankyl@broadc
  M:    Kan Yan <kanyan@broadcom.com>
  L:    linux-wireless@vger.kernel.org
  S:    Supported
 -F:    drivers/staging/brcm80211/
 +F:    drivers/net/wireless/brcm80211/
  
  BROADCOM BNX2FC 10 GIGABIT FCOE DRIVER
  M:    Bhanu Prakash Gollapudi <bprakash@broadcom.com>
@@@ -1618,7 -1641,7 +1618,7 @@@ BT8XXGPIO DRIVE
  M:    Michael Buesch <m@bues.ch>
  W:    http://bu3sch.de/btgpio.php
  S:    Maintained
 -F:    drivers/gpio/bt8xxgpio.c
 +F:    drivers/gpio/gpio-bt8xx.c
  
  BTRFS FILE SYSTEM
  M:    Chris Mason <chris.mason@oracle.com>
@@@ -1646,14 -1669,6 +1646,14 @@@ T:    git git://git.alsa-project.org/alsa-
  S:    Maintained
  F:    sound/pci/oxygen/
  
 +C6X ARCHITECTURE
 +M:    Mark Salter <msalter@redhat.com>
 +M:    Aurelien Jacquiot <a-jacquiot@ti.com>
 +L:    linux-c6x-dev@linux-c6x.org
 +W:    http://www.linux-c6x.org/wiki/index.php/Main_Page
 +S:    Maintained
 +F:    arch/c6x/
 +
  CACHEFILES: FS-CACHE BACKEND FOR CACHING ON MOUNTED FILESYSTEMS
  M:    David Howells <dhowells@redhat.com>
  L:    linux-cachefs@redhat.com
@@@ -1667,7 -1682,7 +1667,7 @@@ L:      linux-media@vger.kernel.or
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6.git
  S:    Maintained
  F:    Documentation/video4linux/cafe_ccic
 -F:    drivers/media/video/cafe_ccic*
 +F:    drivers/media/video/marvell-ccic/
  
  CAIF NETWORK LAYER
  M:    Sjur Braendeland <sjur.brandeland@stericsson.com>
@@@ -1691,9 -1706,11 +1691,9 @@@ F:     arch/x86/include/asm/tce.
  
  CAN NETWORK LAYER
  M:    Oliver Hartkopp <socketcan@hartkopp.net>
 -M:    Oliver Hartkopp <oliver.hartkopp@volkswagen.de>
 -M:    Urs Thuermann <urs.thuermann@volkswagen.de>
  L:    linux-can@vger.kernel.org
 -L:    netdev@vger.kernel.org
 -W:    http://developer.berlios.de/projects/socketcan/
 +W:    http://gitorious.org/linux-can
 +T:    git git://gitorious.org/linux-can/linux-can-next.git
  S:    Maintained
  F:    net/can/
  F:    include/linux/can.h
@@@ -1704,10 -1721,9 +1704,10 @@@ F:    include/linux/can/gw.
  
  CAN NETWORK DRIVERS
  M:    Wolfgang Grandegger <wg@grandegger.com>
 +M:    Marc Kleine-Budde <mkl@pengutronix.de>
  L:    linux-can@vger.kernel.org
 -L:    netdev@vger.kernel.org
 -W:    http://developer.berlios.de/projects/socketcan/
 +W:    http://gitorious.org/linux-can
 +T:    git git://gitorious.org/linux-can/linux-can-next.git
  S:    Maintained
  F:    drivers/net/can/
  F:    include/linux/can/dev.h
@@@ -1772,14 -1788,6 +1772,14 @@@ F:    include/net/cfg80211.
  F:    net/wireless/*
  X:    net/wireless/wext*
  
 +CHAR and MISC DRIVERS
 +M:    Arnd Bergmann <arnd@arndb.de>
 +M:    Greg Kroah-Hartman <greg@kroah.com>
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc.git
 +S:    Maintained
 +F:    drivers/char/*
 +F:    drivers/misc/*
 +
  CHECKPATCH
  M:    Andy Whitcroft <apw@canonical.com>
  S:    Supported
@@@ -1891,6 -1899,12 +1891,6 @@@ L:     platform-driver-x86@vger.kernel.or
  S:    Maintained
  F:    drivers/platform/x86/compal-laptop.c
  
 -COMPUTONE INTELLIPORT MULTIPORT CARD
 -W:    http://www.wittsend.com/computone.html
 -S:    Orphan
 -F:    Documentation/serial/computone.txt
 -F:    drivers/staging/tty/ip2/
 -
  CONEXANT ACCESSRUNNER USB DRIVER
  M:    Simon Arlott <cxacru@fire.lp0.eu>
  L:    accessrunner-general@lists.sourceforge.net
@@@ -1912,11 -1926,9 +1912,11 @@@ S:    Maintaine
  F:    drivers/connector/
  
  CONTROL GROUPS (CGROUPS)
 -M:    Paul Menage <paul@paulmenage.org>
 +M:    Tejun Heo <tj@kernel.org>
  M:    Li Zefan <lizf@cn.fujitsu.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:    include/linux/cgroup*
  F:    kernel/cgroup*
@@@ -2105,7 -2117,7 +2105,7 @@@ DAVICOM FAST ETHERNET (DMFE) NETWORK DR
  L:    netdev@vger.kernel.org
  S:    Orphan
  F:    Documentation/networking/dmfe.txt
 -F:    drivers/net/ethernet/tulip/dmfe.c
 +F:    drivers/net/ethernet/dec/tulip/dmfe.c
  
  DC390/AM53C974 SCSI driver
  M:    Kurt Garloff <garloff@suse.de>
@@@ -2178,13 -2190,6 +2178,13 @@@ T:    git git://git.kernel.org/pub/scm/lin
  S:    Maintained
  F:    drivers/usb/dwc3/
  
 +DEVICE FREQUENCY (DEVFREQ)
 +M:    MyungJoo Ham <myungjoo.ham@samsung.com>
 +M:    Kyungmin Park <kyungmin.park@samsung.com>
 +L:    linux-kernel@vger.kernel.org
 +S:    Maintained
 +F:    drivers/devfreq/
 +
  DEVICE NUMBER REGISTRY
  M:    Torben Mathiasen <device@lanana.org>
  W:    http://lanana.org/docs/device-list/index.html
@@@ -2201,6 -2206,15 +2201,6 @@@ F:     drivers/md/dm
  F:    include/linux/device-mapper.h
  F:    include/linux/dm-*.h
  
 -DIGI INTL. EPCA DRIVER
 -M:    "Digi International, Inc" <Eng.Linux@digi.com>
 -L:    Eng.Linux@digi.com
 -W:    http://www.digi.com
 -S:    Orphan
 -F:    Documentation/serial/digiepca.txt
 -F:    drivers/staging/tty/epca*
 -F:    drivers/staging/tty/digi*
 -
  DIOLAN U2C-12 I2C DRIVER
  M:    Guenter Roeck <guenter.roeck@ericsson.com>
  L:    linux-i2c@vger.kernel.org
@@@ -2328,13 -2342,6 +2328,13 @@@ S:    Supporte
  F:    drivers/gpu/drm/i915
  F:    include/drm/i915*
  
 +DRM DRIVERS FOR EXYNOS
 +M:    Inki Dae <inki.dae@samsung.com>
 +L:    dri-devel@lists.freedesktop.org
 +S:    Supported
 +F:    drivers/gpu/drm/exynos
 +F:    include/drm/exynos*
 +
  DSCC4 DRIVER
  M:    Francois Romieu <romieu@fr.zoreil.com>
  L:    netdev@vger.kernel.org
@@@ -2569,7 -2576,7 +2569,7 @@@ S:      Maintaine
  F:    drivers/net/ethernet/i825xx/eexpress.*
  
  ETHERNET BRIDGE
 -M:    Stephen Hemminger <shemminger@linux-foundation.org>
 +M:    Stephen Hemminger <shemminger@vyatta.com>
  L:    bridge@lists.linux-foundation.org
  L:    netdev@vger.kernel.org
  W:    http://www.linuxfoundation.org/en/Net:Bridge
@@@ -2684,7 -2691,7 +2684,7 @@@ FIREWIRE SUBSYSTE
  M:    Stefan Richter <stefanr@s5r6.in-berlin.de>
  L:    linux1394-devel@lists.sourceforge.net
  W:    http://ieee1394.wiki.kernel.org/
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/ieee1394/linux1394-2.6.git
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/ieee1394/linux1394.git
  S:    Maintained
  F:    drivers/firewire/
  F:    include/linux/firewire*.h
@@@ -2904,7 -2911,6 +2904,7 @@@ F:      include/linux/gigaset_dev.
  
  GPIO SUBSYSTEM
  M:    Grant Likely <grant.likely@secretlab.ca>
 +M:    Linus Walleij <linus.walleij@stericsson.com>
  S:    Maintained
  T:    git git://git.secretlab.ca/git/linux-2.6.git
  F:    Documentation/gpio.txt
@@@ -2922,7 -2928,7 +2922,7 @@@ GRETH 10/100/1G Ethernet MAC device dri
  M:    Kristoffer Glembo <kristoffer@gaisler.com>
  L:    netdev@vger.kernel.org
  S:    Maintained
 -F:    drivers/net/greth*
 +F:    drivers/net/ethernet/aeroflex/
  
  GSPCA FINEPIX SUBDRIVER
  M:    Frank Zago <frank@zago.net>
@@@ -3086,7 -3092,6 +3086,7 @@@ F:      include/linux/hid
  
  HIGH-RESOLUTION TIMERS, CLOCKEVENTS, DYNTICKS
  M:    Thomas Gleixner <tglx@linutronix.de>
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git timers/core
  S:    Maintained
  F:    Documentation/timers/
  F:    kernel/hrtimer.c
@@@ -3174,16 -3179,6 +3174,16 @@@ M:    William Irwin <wli@holomorphy.com
  S:    Maintained
  F:    fs/hugetlbfs/
  
 +Hyper-V CORE AND DRIVERS
 +M:    K. Y. Srinivasan <kys@microsoft.com>
 +M:    Haiyang Zhang <haiyangz@microsoft.com>
 +L:    devel@linuxdriverproject.org
 +S:    Maintained
 +F:    drivers/hv/
 +F:    drivers/hid/hid-hyperv.c
 +F:    drivers/net/hyperv/
 +F:    drivers/staging/hv/
 +
  I2C/SMBUS STUB DRIVER
  M:    "Mark M. Hoffman" <mhoffman@lightlink.com>
  L:    linux-i2c@vger.kernel.org
@@@ -3193,7 -3188,6 +3193,7 @@@ F:      drivers/i2c/busses/i2c-stub.
  I2C SUBSYSTEM
  M:    "Jean Delvare (PC drivers, core)" <khali@linux-fr.org>
  M:    "Ben Dooks (embedded platforms)" <ben-linux@fluff.org>
 +M:    "Wolfram Sang (embedded platforms)" <w.sang@pengutronix.de>
  L:    linux-i2c@vger.kernel.org
  W:    http://i2c.wiki.kernel.org/
  T:    quilt kernel.org/pub/linux/kernel/people/jdelvare/linux-2.6/jdelvare-i2c/
@@@ -3580,7 -3574,8 +3580,7 @@@ F:      net/netfilter/ipvs
  IPWIRELESS DRIVER
  M:    Jiri Kosina <jkosina@suse.cz>
  M:    David Sterba <dsterba@suse.cz>
 -S:    Maintained
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/jikos/ipwireless_cs.git
 +S:    Odd Fixes
  F:    drivers/tty/ipwireless/
  
  IPX NETWORK LAYER
@@@ -3606,7 -3601,7 +3606,7 @@@ F:      net/irda
  IRQ SUBSYSTEM
  M:    Thomas Gleixner <tglx@linutronix.de>
  S:    Maintained
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip.git irq/core
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git irq/core
  F:    kernel/irq/
  
  ISAPNP
@@@ -3715,7 -3710,7 +3715,7 @@@ F:      fs/jbd2
  F:    include/linux/jbd2.h
  
  JSM Neo PCI based serial card
 -M:    Breno Leitao <leitao@linux.vnet.ibm.com>
 +M:    Lucas Tavares <lucaskt@linux.vnet.ibm.com>
  L:    linux-serial@vger.kernel.org
  S:    Maintained
  F:    drivers/tty/serial/jsm/
@@@ -3775,7 -3770,6 +3775,6 @@@ S:      Odd Fixe
  
  KERNEL NFSD, SUNRPC, AND LOCKD SERVERS
  M:    "J. Bruce Fields" <bfields@fieldses.org>
- M:    Neil Brown <neilb@suse.de>
  L:    linux-nfs@vger.kernel.org
  W:    http://nfs.sourceforge.net/
  S:    Supported
@@@ -3873,7 -3867,8 +3872,7 @@@ L:      keyrings@linux-nfs.or
  S:    Supported
  F:    Documentation/security/keys-trusted-encrypted.txt
  F:    include/keys/encrypted-type.h
 -F:    security/keys/encrypted.c
 -F:    security/keys/encrypted.h
 +F:    security/keys/encrypted-keys/
  
  KGDB / KDB /debug_core
  M:    Jason Wessel <jason.wessel@windriver.com>
@@@ -4006,7 -4001,7 +4005,7 @@@ M:      Josh Boyer <jwboyer@gmail.com
  M:    Matt Porter <mporter@kernel.crashing.org>
  W:    http://www.penguinppc.org/
  L:    linuxppc-dev@lists.ozlabs.org
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/jwboyer/powerpc-4xx.git
 +T:    git git://git.infradead.org/users/jwboyer/powerpc-4xx.git
  S:    Maintained
  F:    arch/powerpc/platforms/40x/
  F:    arch/powerpc/platforms/44x/
@@@ -4093,7 -4088,7 +4092,7 @@@ F:      drivers/hwmon/lm90.
  LOCKDEP AND LOCKSTAT
  M:    Peter Zijlstra <peterz@infradead.org>
  M:    Ingo Molnar <mingo@redhat.com>
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/peterz/linux-2.6-lockdep.git
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git core/locking
  S:    Maintained
  F:    Documentation/lockdep*.txt
  F:    Documentation/lockstat.txt
@@@ -4275,9 -4270,7 +4274,9 @@@ T:      git git://git.kernel.org/pub/scm/lin
  S:    Maintained
  F:    Documentation/dvb/
  F:    Documentation/video4linux/
 +F:    Documentation/DocBook/media/
  F:    drivers/media/
 +F:    drivers/staging/media/
  F:    include/media/
  F:    include/linux/dvb/
  F:    include/linux/videodev*.h
@@@ -4299,11 -4292,9 +4298,11 @@@ F:    include/linux/mm.
  F:    mm/
  
  MEMORY RESOURCE CONTROLLER
 +M:    Johannes Weiner <hannes@cmpxchg.org>
 +M:    Michal Hocko <mhocko@suse.cz>
  M:    Balbir Singh <bsingharora@gmail.com>
 -M:    Daisuke Nishimura <nishimura@mxp.nes.nec.co.jp>
  M:    KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
 +L:    cgroups@vger.kernel.org
  L:    linux-mm@kvack.org
  S:    Maintained
  F:    mm/memcontrol.c
@@@ -4337,7 -4328,7 +4336,7 @@@ MIP
  M:    Ralf Baechle <ralf@linux-mips.org>
  L:    linux-mips@linux-mips.org
  W:    http://www.linux-mips.org/
 -T:    git git://git.linux-mips.org/pub/scm/linux.git
 +T:    git git://git.linux-mips.org/pub/scm/ralf/linux.git
  Q:    http://patchwork.linux-mips.org/project/linux-mips/list/
  S:    Supported
  F:    Documentation/mips/
@@@ -4470,7 -4461,7 +4469,7 @@@ S:      Supporte
  F:    drivers/infiniband/hw/nes/
  
  NETEM NETWORK EMULATOR
 -M:    Stephen Hemminger <shemminger@linux-foundation.org>
 +M:    Stephen Hemminger <shemminger@vyatta.com>
  L:    netem@lists.linux-foundation.org
  S:    Maintained
  F:    net/sched/sch_netem.c
@@@ -4684,8 -4675,6 +4683,8 @@@ Q:      http://patchwork.kernel.org/project/
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap.git
  S:    Maintained
  F:    arch/arm/*omap*/
 +F:    drivers/i2c/busses/i2c-omap.c
 +F:    include/linux/i2c-omap.h
  
  OMAP CLOCK FRAMEWORK SUPPORT
  M:    Paul Walmsley <paul@pwsan.com>
@@@ -4851,14 -4840,6 +4850,14 @@@ S:    Maintaine
  T:    git git://openrisc.net/~jonas/linux
  F:    arch/openrisc
  
 +OPENVSWITCH
 +M:    Jesse Gross <jesse@nicira.com>
 +L:    dev@openvswitch.org
 +W:    http://openvswitch.org
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/jesse/openvswitch.git
 +S:    Maintained
 +F:    net/openvswitch/
 +
  OPL4 DRIVER
  M:    Clemens Ladisch <clemens@ladisch.de>
  L:    alsa-devel@alsa-project.org (moderated for non-subscribers)
@@@ -4957,7 -4938,7 +4956,7 @@@ F:      drivers/char/ppdev.
  F:    include/linux/ppdev.h
  
  PARAVIRT_OPS INTERFACE
 -M:    Jeremy Fitzhardinge <jeremy@xensource.com>
 +M:    Jeremy Fitzhardinge <jeremy@goop.org>
  M:    Chris Wright <chrisw@sous-sol.org>
  M:    Alok Kataria <akataria@vmware.com>
  M:    Rusty Russell <rusty@rustcorp.com.au>
@@@ -5093,7 -5074,6 +5092,7 @@@ M:      Peter Zijlstra <a.p.zijlstra@chello.
  M:    Paul Mackerras <paulus@samba.org>
  M:    Ingo Molnar <mingo@elte.hu>
  M:    Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git perf/core
  S:    Supported
  F:    kernel/events/*
  F:    include/linux/perf_event.h
@@@ -5125,19 -5105,10 +5124,19 @@@ L:   linux-mtd@lists.infradead.or
  S:    Maintained
  F:    drivers/mtd/devices/phram.c
  
 +PICOXCELL SUPPORT
 +M:    Jamie Iles <jamie@jamieiles.com>
 +L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 +T:    git git://github.com/jamieiles/linux-2.6-ji.git
 +S:    Supported
 +F:    arch/arm/mach-picoxcell
 +F:    drivers/*/picoxcell*
 +F:    drivers/*/*/picoxcell*
 +
  PIN CONTROL SUBSYSTEM
  M:    Linus Walleij <linus.walleij@linaro.org>
  S:    Maintained
 -F:    drivers/pinmux/
 +F:    drivers/pinctrl/
  
  PKTCDVD DRIVER
  M:    Peter Osterlund <petero2@telia.com>
@@@ -5182,7 -5153,6 +5181,7 @@@ F:      drivers/scsi/pm8001
  
  POSIX CLOCKS and TIMERS
  M:    Thomas Gleixner <tglx@linutronix.de>
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git timers/core
  S:    Supported
  F:    fs/timerfd.c
  F:    include/linux/timer*
@@@ -5320,27 -5290,35 +5319,27 @@@ F:   drivers/media/video/pvrusb2
  PXA2xx/PXA3xx SUPPORT
  M:    Eric Miao <eric.y.miao@gmail.com>
  M:    Russell King <linux@arm.linux.org.uk>
 +M:    Haojian Zhuang <haojian.zhuang@marvell.com>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 +T:    git git://github.com/hzhuang1/linux.git
 +T:    git git://git.linaro.org/people/ycmiao/pxa-linux.git
  S:    Maintained
  F:    arch/arm/mach-pxa/
  F:    drivers/pcmcia/pxa2xx*
 -F:    drivers/spi/pxa2xx*
 +F:    drivers/spi/spi-pxa2xx*
  F:    drivers/usb/gadget/pxa2*
  F:    include/sound/pxa2xx-lib.h
  F:    sound/arm/pxa*
  F:    sound/soc/pxa
  
 -PXA168 SUPPORT
 -M:    Eric Miao <eric.y.miao@gmail.com>
 -M:    Jason Chagas <jason.chagas@marvell.com>
 -L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/ycmiao/pxa-linux-2.6.git
 -S:    Maintained
 -
 -PXA910 SUPPORT
 +MMP SUPPORT
  M:    Eric Miao <eric.y.miao@gmail.com>
 -L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/ycmiao/pxa-linux-2.6.git
 -S:    Maintained
 -
 -MMP2 SUPPORT (aka ARMADA610)
  M:    Haojian Zhuang <haojian.zhuang@marvell.com>
 -M:    Eric Miao <eric.y.miao@gmail.com>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/ycmiao/pxa-linux-2.6.git
 +T:    git git://github.com/hzhuang1/linux.git
 +T:    git git://git.linaro.org/people/ycmiao/pxa-linux.git
  S:    Maintained
 +F:    arch/arm/mach-mmp/
  
  PXA MMCI DRIVER
  S:    Orphan
@@@ -5379,7 -5357,6 +5378,7 @@@ S:      Supporte
  F:    drivers/scsi/qla4xxx/
  
  QLOGIC QLA3XXX NETWORK DRIVER
 +M:    Jitendra Kalsaria <jitendra.kalsaria@qlogic.com>
  M:    Ron Mercer <ron.mercer@qlogic.com>
  M:    linux-driver@qlogic.com
  L:    netdev@vger.kernel.org
@@@ -5550,6 -5527,11 +5549,6 @@@ M:     Maxim Levitsky <maximlevitsky@gmail.
  S:    Maintained
  F:    drivers/memstick/host/r592.*
  
 -RISCOM8 DRIVER
 -S:    Orphan
 -F:    Documentation/serial/riscom8.txt
 -F:    drivers/staging/tty/riscom8*
 -
  ROCKETPORT DRIVER
  P:    Comtrol Corp.
  W:    http://www.comtrol.com
@@@ -5665,6 -5647,7 +5664,6 @@@ F:      drivers/media/video/*7146
  F:    include/media/*7146*
  
  SAMSUNG AUDIO (ASoC) DRIVERS
 -M:    Jassi Brar <jassisinghbrar@gmail.com>
  M:    Sangbeom Kim <sbkim73@samsung.com>
  L:    alsa-devel@alsa-project.org (moderated for non-subscribers)
  S:    Supported
@@@ -5686,7 -5669,6 +5685,7 @@@ F:      drivers/dma/dw_dmac.
  TIMEKEEPING, NTP
  M:    John Stultz <johnstul@us.ibm.com>
  M:    Thomas Gleixner <tglx@linutronix.de>
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git timers/core
  S:    Supported
  F:    include/linux/clocksource.h
  F:    include/linux/time.h
@@@ -5711,7 -5693,6 +5710,7 @@@ F:      drivers/watchdog/sc1200wdt.
  SCHEDULER
  M:    Ingo Molnar <mingo@elte.hu>
  M:    Peter Zijlstra <peterz@infradead.org>
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git sched/core
  S:    Maintained
  F:    kernel/sched*
  F:    include/linux/sched.h
@@@ -5809,14 -5790,13 +5808,14 @@@ L:   linux-mmc@vger.kernel.or
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/cjb/mmc.git
  S:    Maintained
  F:    drivers/mmc/host/sdhci.*
 +F:    drivers/mmc/host/sdhci-pltfm.[ch]
  
  SECURE DIGITAL HOST CONTROLLER INTERFACE, OPEN FIRMWARE BINDINGS (SDHCI-OF)
  M:    Anton Vorontsov <avorontsov@ru.mvista.com>
  L:    linuxppc-dev@lists.ozlabs.org
  L:    linux-mmc@vger.kernel.org
  S:    Maintained
 -F:    drivers/mmc/host/sdhci-of.*
 +F:    drivers/mmc/host/sdhci-pltfm.[ch]
  
  SECURE DIGITAL HOST CONTROLLER INTERFACE (SDHCI) SAMSUNG DRIVER
  M:    Ben Dooks <ben-linux@fluff.org>
@@@ -5895,6 -5875,7 +5894,6 @@@ F:      drivers/net/ethernet/emulex/benet
  
  SFC NETWORK DRIVER
  M:    Solarflare linux maintainers <linux-net-drivers@solarflare.com>
 -M:    Steve Hodgson <shodgson@solarflare.com>
  M:    Ben Hutchings <bhutchings@solarflare.com>
  L:    netdev@vger.kernel.org
  S:    Supported
@@@ -5959,7 -5940,6 +5958,7 @@@ L:      davinci-linux-open-source@linux.davi
  Q:    http://patchwork.kernel.org/project/linux-davinci/list/
  S:    Supported
  F:    arch/arm/mach-davinci
 +F:    drivers/i2c/busses/i2c-davinci.c
  
  SIS 190 ETHERNET DRIVER
  M:    Francois Romieu <romieu@fr.zoreil.com>
@@@ -5996,7 -5976,7 +5995,7 @@@ S:      Maintaine
  F:    drivers/usb/misc/sisusbvga/
  
  SKGE, SKY2 10/100/1000 GIGABIT ETHERNET DRIVERS
 -M:    Stephen Hemminger <shemminger@linux-foundation.org>
 +M:    Stephen Hemminger <shemminger@vyatta.com>
  L:    netdev@vger.kernel.org
  S:    Maintained
  F:    drivers/net/ethernet/marvell/sk*
@@@ -6141,7 -6121,7 +6140,7 @@@ F:      sound
  SOUND - SOC LAYER / DYNAMIC AUDIO POWER MANAGEMENT (ASoC)
  M:    Liam Girdwood <lrg@ti.com>
  M:    Mark Brown <broonie@opensource.wolfsonmicro.com>
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound-2.6.git
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git
  L:    alsa-devel@alsa-project.org (moderated for non-subscribers)
  W:    http://alsa-project.org/main/index.php/ASoC
  S:    Supported
@@@ -6196,7 -6176,9 +6195,7 @@@ M:      Viresh Kumar <viresh.kumar@st.com
  W:    http://www.st.com/spear
  S:    Maintained
  F:    arch/arm/mach-spear*/clock.c
 -F:    arch/arm/mach-spear*/include/mach/clkdev.h
  F:    arch/arm/plat-spear/clock.c
 -F:    arch/arm/plat-spear/include/plat/clkdev.h
  F:    arch/arm/plat-spear/include/plat/clock.h
  
  SPEAR PAD MULTIPLEXING SUPPORT
@@@ -6212,6 -6194,11 +6211,6 @@@ F:     arch/arm/mach-spear3xx/spear3*0_evb.
  F:    arch/arm/mach-spear6xx/spear600.c
  F:    arch/arm/mach-spear6xx/spear600_evb.c
  
 -SPECIALIX IO8+ MULTIPORT SERIAL CARD DRIVER
 -S:    Orphan
 -F:    Documentation/serial/specialix.txt
 -F:    drivers/staging/tty/specialix*
 -
  SPI SUBSYSTEM
  M:    Grant Likely <grant.likely@secretlab.ca>
  L:    spi-devel-general@lists.sourceforge.net
@@@ -6254,7 -6241,7 +6253,7 @@@ F:      arch/alpha/kernel/srm_env.
  
  STABLE BRANCH
  M:    Greg Kroah-Hartman <greg@kroah.com>
 -L:    stable@kernel.org
 +L:    stable@vger.kernel.org
  S:    Maintained
  
  STAGING SUBSYSTEM
@@@ -6289,6 -6276,11 +6288,6 @@@ M:     Manu Abraham <abraham.manu@gmail.com
  S:    Odd Fixes
  F:    drivers/staging/crystalhd/
  
 -STAGING - CYPRESS WESTBRIDGE SUPPORT
 -M:    David Cross <david.cross@cypress.com>
 -S:    Odd Fixes
 -F:    drivers/staging/westbridge/
 -
  STAGING - ECHO CANCELLER
  M:    Steve Underwood <steveu@coppice.org>
  M:    David Rowe <david@rowetel.com>
@@@ -6310,6 -6302,12 +6309,6 @@@ M:     David Täht <d@teklibre.com
  S:    Odd Fixes
  F:    drivers/staging/frontier/
  
 -STAGING - HYPER-V (MICROSOFT)
 -M:    Hank Janssen <hjanssen@microsoft.com>
 -M:    Haiyang Zhang <haiyangz@microsoft.com>
 -S:    Odd Fixes
 -F:    drivers/staging/hv/
 -
  STAGING - INDUSTRIAL IO
  M:    Jonathan Cameron <jic23@cam.ac.uk>
  L:    linux-iio@vger.kernel.org
@@@ -6320,7 -6318,7 +6319,7 @@@ STAGING - LIRC (LINUX INFRARED REMOTE C
  M:    Jarod Wilson <jarod@wilsonet.com>
  W:    http://www.lirc.org/
  S:    Odd Fixes
 -F:    drivers/staging/lirc/
 +F:    drivers/staging/media/lirc/
  
  STAGING - NVIDIA COMPLIANT EMBEDDED CONTROLLER INTERFACE (nvec)
  M:    Julian Andres Klode <jak@jak-linux.org>
@@@ -6356,7 -6354,7 +6355,7 @@@ F:      drivers/staging/sm7xx
  STAGING - SOFTLOGIC 6x10 MPEG CODEC
  M:    Ben Collins <bcollins@bluecherry.net>
  S:    Odd Fixes
 -F:    drivers/staging/solo6x10/
 +F:    drivers/staging/media/solo6x10/
  
  STAGING - SPEAKUP CONSOLE SPEECH DRIVER
  M:    William Hubbs <w.d.hubbs@gmail.com>
@@@ -6394,7 -6392,7 +6393,7 @@@ S:      Odd Fixe
  F:    drivers/staging/winbond/
  
  STAGING - XGI Z7,Z9,Z11 PCI DISPLAY DRIVER
 -M:    Arnaud Patard <apatard@mandriva.com>
 +M:    Arnaud Patard <arnaud.patard@rtp-net.org>
  S:    Odd Fixes
  F:    drivers/staging/xgifb/
  
@@@ -6485,13 -6483,6 +6484,13 @@@ W:    http://tcp-lp-mod.sourceforge.net
  S:    Maintained
  F:    net/ipv4/tcp_lp.c
  
 +TEAM DRIVER
 +M:    Jiri Pirko <jpirko@redhat.com>
 +L:    netdev@vger.kernel.org
 +S:    Supported
 +F:    drivers/net/team/
 +F:    include/linux/if_team.h
 +
  TEGRA SUPPORT
  M:    Colin Cross <ccross@android.com>
  M:    Olof Johansson <olof@lixom.net>
@@@ -6629,7 -6620,7 +6628,7 @@@ TRACIN
  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/linux-2.6-tip.git perf/core
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git perf/core
  S:    Maintained
  F:    Documentation/trace/ftrace.txt
  F:    arch/*/*/*/ftrace.h
@@@ -6659,7 -6650,7 +6658,7 @@@ TULIP NETWORK DRIVER
  M:    Grant Grundler <grundler@parisc-linux.org>
  L:    netdev@vger.kernel.org
  S:    Maintained
 -F:    drivers/net/ethernet/tulip/
 +F:    drivers/net/ethernet/dec/tulip/
  
  TUN/TAP driver
  M:    Maxim Krasnyansky <maxk@qualcomm.com>
@@@ -7379,7 -7370,7 +7378,7 @@@ M:      Thomas Gleixner <tglx@linutronix.de
  M:    Ingo Molnar <mingo@redhat.com>
  M:    "H. Peter Anvin" <hpa@zytor.com>
  M:    x86@kernel.org
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/x86/linux-2.6-x86.git
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git x86/core
  S:    Maintained
  F:    Documentation/x86/
  F:    arch/x86/
@@@ -7399,8 -7390,8 +7398,8 @@@ S:      Maintaine
  F:    arch/x86/kernel/cpu/mcheck/*
  
  XEN HYPERVISOR INTERFACE
 -M:    Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
  M:    Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
 +M:    Jeremy Fitzhardinge <jeremy@goop.org>
  L:    xen-devel@lists.xensource.com (moderated for non-subscribers)
  L:    virtualization@lists.linux-foundation.org
  S:    Supported
@@@ -7433,8 -7424,7 +7432,8 @@@ F:      drivers/xen/*swiotlb
  
  XFS FILESYSTEM
  P:    Silicon Graphics Inc
 -M:    Alex Elder <aelder@sgi.com>
 +M:    Ben Myers <bpm@sgi.com>
 +M:    Alex Elder <elder@kernel.org>
  M:    xfs-masters@oss.sgi.com
  L:    xfs@oss.sgi.com
  W:    http://oss.sgi.com/projects/xfs
diff --combined fs/nfsd/nfs4proc.c
index c5e28ed8bca07a7fa4ab4e624cd05648d130cae2,9415bc415ce8a6013cfd3f4e1dae4cdc21010050..896da74ec5634fd92739e0284f5d0768c8f12437
@@@ -266,10 -266,6 +266,6 @@@ do_open_fhandle(struct svc_rqst *rqstp
  {
        __be32 status;
  
-       /* Only reclaims from previously confirmed clients are valid */
-       if ((status = nfs4_check_open_reclaim(&open->op_clientid)))
-               return status;
        /* We don't know the target directory, and therefore can not
        * set the change info
        */
@@@ -373,6 -369,9 +369,9 @@@ nfsd4_open(struct svc_rqst *rqstp, stru
                        break;
                case NFS4_OPEN_CLAIM_PREVIOUS:
                        open->op_openowner->oo_flags |= NFS4_OO_CONFIRMED;
+                       status = nfs4_check_open_reclaim(&open->op_clientid);
+                       if (status)
+                               goto out;
                case NFS4_OPEN_CLAIM_FH:
                case NFS4_OPEN_CLAIM_DELEG_CUR_FH:
                        status = do_open_fhandle(rqstp, &cstate->current_fh,
@@@ -838,7 -837,7 +837,7 @@@ nfsd4_setattr(struct svc_rqst *rqstp, s
                        return status;
                }
        }
 -      status = mnt_want_write(cstate->current_fh.fh_export->ex_path.mnt);
 +      status = fh_want_write(&cstate->current_fh);
        if (status)
                return status;
        status = nfs_ok;
        status = nfsd_setattr(rqstp, &cstate->current_fh, &setattr->sa_iattr,
                                0, (time_t)0);
  out:
 -      mnt_drop_write(cstate->current_fh.fh_export->ex_path.mnt);
 +      fh_drop_write(&cstate->current_fh);
        return status;
  }
  
diff --combined fs/nfsd/nfs4recover.c
index 80a0be9ed008a6db484d81303379d0a599c5dad7,a52f267f122a109d1ae6d153023b652e2211b36c..0b3e875d1abd5e4cd962d5ed5df29f22c7ca546d
@@@ -117,8 -117,7 +117,7 @@@ out_no_tfm
        return status;
  }
  
- int
- nfsd4_create_clid_dir(struct nfs4_client *clp)
+ void nfsd4_create_clid_dir(struct nfs4_client *clp)
  {
        const struct cred *original_cred;
        char *dname = clp->cl_recdir;
  
        dprintk("NFSD: nfsd4_create_clid_dir for \"%s\"\n", dname);
  
-       if (!rec_file || clp->cl_firststate)
-               return 0;
+       if (clp->cl_firststate)
+               return;
        clp->cl_firststate = 1;
+       if (!rec_file)
+               return;
        status = nfs4_save_creds(&original_cred);
        if (status < 0)
-               return status;
+               return;
  
        dir = rec_file->f_path.dentry;
        /* lock the parent */
                status = PTR_ERR(dentry);
                goto out_unlock;
        }
-       status = -EEXIST;
        if (dentry->d_inode)
+               /*
+                * In the 4.1 case, where we're called from
+                * reclaim_complete(), records from the previous reboot
+                * may still be left, so this is OK.
+                *
+                * In the 4.0 case, we should never get here; but we may
+                * as well be forgiving and just succeed silently.
+                */
                goto out_put;
 -      status = mnt_want_write(rec_file->f_path.mnt);
 +      status = mnt_want_write_file(rec_file);
        if (status)
                goto out_put;
        status = vfs_mkdir(dir->d_inode, dentry, S_IRWXU);
 -      mnt_drop_write(rec_file->f_path.mnt);
 +      mnt_drop_write_file(rec_file);
  out_put:
        dput(dentry);
  out_unlock:
                                " and is writeable", status,
                                user_recovery_dirname);
        nfs4_reset_creds(original_cred);
-       return status;
  }
  
  typedef int (recdir_func)(struct dentry *, struct dentry *);
@@@ -268,7 -274,7 +274,7 @@@ nfsd4_remove_clid_dir(struct nfs4_clien
        if (!rec_file || !clp->cl_firststate)
                return;
  
 -      status = mnt_want_write(rec_file->f_path.mnt);
 +      status = mnt_want_write_file(rec_file);
        if (status)
                goto out;
        clp->cl_firststate = 0;
        nfs4_reset_creds(original_cred);
        if (status == 0)
                vfs_fsync(rec_file, 0);
 -      mnt_drop_write(rec_file->f_path.mnt);
 +      mnt_drop_write_file(rec_file);
  out:
        if (status)
                printk("NFSD: Failed to remove expired client state directory"
@@@ -311,13 -317,13 +317,13 @@@ nfsd4_recdir_purge_old(void) 
  
        if (!rec_file)
                return;
 -      status = mnt_want_write(rec_file->f_path.mnt);
 +      status = mnt_want_write_file(rec_file);
        if (status)
                goto out;
        status = nfsd4_list_rec_dir(purge_old);
        if (status == 0)
                vfs_fsync(rec_file, 0);
 -      mnt_drop_write(rec_file->f_path.mnt);
 +      mnt_drop_write_file(rec_file);
  out:
        if (status)
                printk("nfsd4: failed to purge old clients from recovery"
diff --combined fs/nfsd/nfs4state.c
index 9ca16dc09e04878bd89bf4e471e5364f719d3aef,7355fe405d6929c34dce352d308790079ff0f94b..e8c98f0096706c04e70456c35af2f8123241af7a
  time_t nfsd4_lease = 90;     /* default lease time */
  time_t nfsd4_grace = 90;
  static time_t boot_time;
- static stateid_t zerostateid;             /* bits all 0 */
- static stateid_t onestateid;              /* bits all 1 */
+ #define all_ones {{~0,~0},~0}
+ static const stateid_t one_stateid = {
+       .si_generation = ~0,
+       .si_opaque = all_ones,
+ };
+ static const stateid_t zero_stateid = {
+       /* all fields zero */
+ };
  static u64 current_sessionid = 1;
  
- #define ZERO_STATEID(stateid) (!memcmp((stateid), &zerostateid, sizeof(stateid_t)))
- #define ONE_STATEID(stateid)  (!memcmp((stateid), &onestateid, sizeof(stateid_t)))
+ #define ZERO_STATEID(stateid) (!memcmp((stateid), &zero_stateid, sizeof(stateid_t)))
+ #define ONE_STATEID(stateid)  (!memcmp((stateid), &one_stateid, sizeof(stateid_t)))
  
  /* forward declarations */
  static int check_for_locks(struct nfs4_file *filp, struct nfs4_lockowner *lowner);
@@@ -133,21 -141,21 +141,21 @@@ unsigned int max_delegations
   * Open owner state (share locks)
   */
  
- /* hash tables for open owners */
- #define OPEN_OWNER_HASH_BITS              8
- #define OPEN_OWNER_HASH_SIZE             (1 << OPEN_OWNER_HASH_BITS)
- #define OPEN_OWNER_HASH_MASK             (OPEN_OWNER_HASH_SIZE - 1)
+ /* hash tables for lock and open owners */
+ #define OWNER_HASH_BITS              8
+ #define OWNER_HASH_SIZE             (1 << OWNER_HASH_BITS)
+ #define OWNER_HASH_MASK             (OWNER_HASH_SIZE - 1)
  
- static unsigned int open_ownerstr_hashval(u32 clientid, struct xdr_netobj *ownername)
+ static unsigned int ownerstr_hashval(u32 clientid, struct xdr_netobj *ownername)
  {
        unsigned int ret;
  
        ret = opaque_hashval(ownername->data, ownername->len);
        ret += clientid;
-       return ret & OPEN_OWNER_HASH_MASK;
+       return ret & OWNER_HASH_MASK;
  }
  
- static struct list_head       open_ownerstr_hashtbl[OPEN_OWNER_HASH_SIZE];
+ static struct list_head       ownerstr_hashtbl[OWNER_HASH_SIZE];
  
  /* hash table for nfs4_file */
  #define FILE_HASH_BITS                   8
@@@ -514,6 -522,7 +522,7 @@@ static void unhash_lockowner(struct nfs
  
        list_del(&lo->lo_owner.so_strhash);
        list_del(&lo->lo_perstateid);
+       list_del(&lo->lo_owner_ino_hash);
        while (!list_empty(&lo->lo_owner.so_stateids)) {
                stp = list_first_entry(&lo->lo_owner.so_stateids,
                                struct nfs4_ol_stateid, st_perstateowner);
@@@ -658,7 -667,7 +667,7 @@@ static int nfsd4_sanitize_slot_size(u3
  /*
   * XXX: If we run out of reserved DRC memory we could (up to a point)
   * re-negotiate active sessions and reduce their slot usage to make
 - * rooom for new connections. For now we just fail the create session.
 + * room for new connections. For now we just fail the create session.
   */
  static int nfsd4_get_drc_mem(int slotsize, u32 num)
  {
@@@ -985,12 -994,11 +994,11 @@@ static struct nfs4_client *alloc_client
        clp = kzalloc(sizeof(struct nfs4_client), GFP_KERNEL);
        if (clp == NULL)
                return NULL;
-       clp->cl_name.data = kmalloc(name.len, GFP_KERNEL);
+       clp->cl_name.data = kmemdup(name.data, name.len, GFP_KERNEL);
        if (clp->cl_name.data == NULL) {
                kfree(clp);
                return NULL;
        }
-       memcpy(clp->cl_name.data, name.data, name.len);
        clp->cl_name.len = name.len;
        return clp;
  }
@@@ -1058,7 -1066,6 +1066,6 @@@ expire_client(struct nfs4_client *clp
        spin_unlock(&recall_lock);
        while (!list_empty(&reaplist)) {
                dp = list_entry(reaplist.next, struct nfs4_delegation, dl_recall_lru);
-               list_del_init(&dp->dl_recall_lru);
                unhash_delegation(dp);
        }
        while (!list_empty(&clp->cl_openowners)) {
@@@ -2301,7 -2308,7 +2308,7 @@@ nfsd4_free_slabs(void
        nfsd4_free_slab(&deleg_slab);
  }
  
static int
+ int
  nfsd4_init_slabs(void)
  {
        openowner_slab = kmem_cache_create("nfsd4_openowners",
@@@ -2373,7 -2380,7 +2380,7 @@@ static inline void *alloc_stateowner(st
  
  static void hash_openowner(struct nfs4_openowner *oo, struct nfs4_client *clp, unsigned int strhashval)
  {
-       list_add(&oo->oo_owner.so_strhash, &open_ownerstr_hashtbl[strhashval]);
+       list_add(&oo->oo_owner.so_strhash, &ownerstr_hashtbl[strhashval]);
        list_add(&oo->oo_perclient, &clp->cl_openowners);
  }
  
@@@ -2436,7 -2443,9 +2443,9 @@@ find_openstateowner_str(unsigned int ha
        struct nfs4_stateowner *so;
        struct nfs4_openowner *oo;
  
-       list_for_each_entry(so, &open_ownerstr_hashtbl[hashval], so_strhash) {
+       list_for_each_entry(so, &ownerstr_hashtbl[hashval], so_strhash) {
+               if (!so->so_is_open_owner)
+                       continue;
                if (same_owner_str(so, &open->op_owner, &open->op_clientid)) {
                        oo = openowner(so);
                        renew_client(oo->oo_owner.so_client);
@@@ -2580,7 -2589,7 +2589,7 @@@ nfsd4_process_open1(struct nfsd4_compou
        if (open->op_file == NULL)
                return nfserr_jukebox;
  
-       strhashval = open_ownerstr_hashval(clientid->cl_id, &open->op_owner);
+       strhashval = ownerstr_hashval(clientid->cl_id, &open->op_owner);
        oo = find_openstateowner_str(strhashval, open);
        open->op_openowner = oo;
        if (!oo) {
@@@ -3123,7 -3132,6 +3132,6 @@@ nfs4_laundromat(void
        spin_unlock(&recall_lock);
        list_for_each_safe(pos, next, &reaplist) {
                dp = list_entry (pos, struct nfs4_delegation, dl_recall_lru);
-               list_del_init(&dp->dl_recall_lru);
                unhash_delegation(dp);
        }
        test_val = nfsd4_lease;
  }
  
  
- /* 
-  * Lock owner state (byte-range locks)
-  */
  #define LOFF_OVERFLOW(start, len)      ((u64)(len) > ~(u64)(start))
- #define LOCK_HASH_BITS              8
- #define LOCK_HASH_SIZE             (1 << LOCK_HASH_BITS)
- #define LOCK_HASH_MASK             (LOCK_HASH_SIZE - 1)
+ #define LOCKOWNER_INO_HASH_BITS 8
+ #define LOCKOWNER_INO_HASH_SIZE (1 << LOCKOWNER_INO_HASH_BITS)
+ #define LOCKOWNER_INO_HASH_MASK (LOCKOWNER_INO_HASH_SIZE - 1)
  
  static inline u64
  end_offset(u64 start, u64 len)
@@@ -3746,16 -3752,14 +3752,14 @@@ last_byte_offset(u64 start, u64 len
        return end > start ? end - 1: NFS4_MAX_UINT64;
  }
  
- static inline unsigned int
- lock_ownerstr_hashval(struct inode *inode, u32 cl_id,
-               struct xdr_netobj *ownername)
+ static unsigned int lockowner_ino_hashval(struct inode *inode, u32 cl_id, struct xdr_netobj *ownername)
  {
        return (file_hashval(inode) + cl_id
                        + opaque_hashval(ownername->data, ownername->len))
-               & LOCK_HASH_MASK;
+               & LOCKOWNER_INO_HASH_MASK;
  }
  
- static struct list_head       lock_ownerstr_hashtbl[LOCK_HASH_SIZE];
+ static struct list_head lockowner_ino_hashtbl[LOCKOWNER_INO_HASH_SIZE];
  
  /*
   * TODO: Linux file offsets are _signed_ 64-bit quantities, which means that
@@@ -3809,23 -3813,39 +3813,39 @@@ nevermind
                deny->ld_type = NFS4_WRITE_LT;
  }
  
+ static bool same_lockowner_ino(struct nfs4_lockowner *lo, struct inode *inode, clientid_t *clid, struct xdr_netobj *owner)
+ {
+       struct nfs4_ol_stateid *lst;
+       if (!same_owner_str(&lo->lo_owner, owner, clid))
+               return false;
+       lst = list_first_entry(&lo->lo_owner.so_stateids,
+                              struct nfs4_ol_stateid, st_perstateowner);
+       return lst->st_file->fi_inode == inode;
+ }
  static struct nfs4_lockowner *
  find_lockowner_str(struct inode *inode, clientid_t *clid,
                struct xdr_netobj *owner)
  {
-       unsigned int hashval = lock_ownerstr_hashval(inode, clid->cl_id, owner);
-       struct nfs4_stateowner *op;
+       unsigned int hashval = lockowner_ino_hashval(inode, clid->cl_id, owner);
+       struct nfs4_lockowner *lo;
  
-       list_for_each_entry(op, &lock_ownerstr_hashtbl[hashval], so_strhash) {
-               if (same_owner_str(op, owner, clid))
-                       return lockowner(op);
+       list_for_each_entry(lo, &lockowner_ino_hashtbl[hashval], lo_owner_ino_hash) {
+               if (same_lockowner_ino(lo, inode, clid, owner))
+                       return lo;
        }
        return NULL;
  }
  
  static void hash_lockowner(struct nfs4_lockowner *lo, unsigned int strhashval, struct nfs4_client *clp, struct nfs4_ol_stateid *open_stp)
  {
-       list_add(&lo->lo_owner.so_strhash, &lock_ownerstr_hashtbl[strhashval]);
+       struct inode *inode = open_stp->st_file->fi_inode;
+       unsigned int inohash = lockowner_ino_hashval(inode,
+                       clp->cl_clientid.cl_id, &lo->lo_owner.so_owner);
+       list_add(&lo->lo_owner.so_strhash, &ownerstr_hashtbl[strhashval]);
+       list_add(&lo->lo_owner_ino_hash, &lockowner_ino_hashtbl[inohash]);
        list_add(&lo->lo_perstateid, &open_stp->st_lockowners);
  }
  
   * Called in nfsd4_lock - therefore, OPEN and OPEN_CONFIRM (if needed) has 
   * occurred. 
   *
-  * strhashval = lock_ownerstr_hashval 
+  * strhashval = ownerstr_hashval
   */
  
  static struct nfs4_lockowner *
@@@ -3892,6 -3912,37 +3912,37 @@@ static void get_lock_access(struct nfs4
        __set_bit(access, &lock_stp->st_access_bmap);
  }
  
+ __be32 lookup_or_create_lock_state(struct nfsd4_compound_state *cstate, struct nfs4_ol_stateid *ost, struct nfsd4_lock *lock, struct nfs4_ol_stateid **lst, bool *new)
+ {
+       struct nfs4_file *fi = ost->st_file;
+       struct nfs4_openowner *oo = openowner(ost->st_stateowner);
+       struct nfs4_client *cl = oo->oo_owner.so_client;
+       struct nfs4_lockowner *lo;
+       unsigned int strhashval;
+       lo = find_lockowner_str(fi->fi_inode, &cl->cl_clientid, &lock->v.new.owner);
+       if (lo) {
+               if (!cstate->minorversion)
+                       return nfserr_bad_seqid;
+               /* XXX: a lockowner always has exactly one stateid: */
+               *lst = list_first_entry(&lo->lo_owner.so_stateids,
+                               struct nfs4_ol_stateid, st_perstateowner);
+               return nfs_ok;
+       }
+       strhashval = ownerstr_hashval(cl->cl_clientid.cl_id,
+                       &lock->v.new.owner);
+       lo = alloc_init_lock_stateowner(strhashval, cl, ost, lock);
+       if (lo == NULL)
+               return nfserr_jukebox;
+       *lst = alloc_init_lock_stateid(lo, fi, ost);
+       if (*lst == NULL) {
+               release_lockowner(lo);
+               return nfserr_jukebox;
+       }
+       *new = true;
+       return nfs_ok;
+ }
  /*
   *  LOCK operation 
   */
@@@ -3907,7 -3958,7 +3958,7 @@@ nfsd4_lock(struct svc_rqst *rqstp, stru
        struct file_lock file_lock;
        struct file_lock conflock;
        __be32 status = 0;
-       unsigned int strhashval;
+       bool new_state = false;
        int lkflg;
        int err;
  
                 * lock stateid.
                 */
                struct nfs4_ol_stateid *open_stp = NULL;
-               
+               if (nfsd4_has_session(cstate))
+                       /* See rfc 5661 18.10.3: given clientid is ignored: */
+                       memcpy(&lock->v.new.clientid,
+                               &cstate->session->se_client->cl_clientid,
+                               sizeof(clientid_t));
                status = nfserr_stale_clientid;
-               if (!nfsd4_has_session(cstate) &&
-                   STALE_CLIENTID(&lock->lk_new_clientid))
+               if (STALE_CLIENTID(&lock->lk_new_clientid))
                        goto out;
  
                /* validate and update open stateid and open seqid */
                        goto out;
                open_sop = openowner(open_stp->st_stateowner);
                status = nfserr_bad_stateid;
-               if (!nfsd4_has_session(cstate) &&
-                       !same_clid(&open_sop->oo_owner.so_client->cl_clientid,
+               if (!same_clid(&open_sop->oo_owner.so_client->cl_clientid,
                                                &lock->v.new.clientid))
                        goto out;
-               /* create lockowner and lock stateid */
-               fp = open_stp->st_file;
-               strhashval = lock_ownerstr_hashval(fp->fi_inode,
-                               open_sop->oo_owner.so_client->cl_clientid.cl_id,
-                               &lock->v.new.owner);
-               /* XXX: Do we need to check for duplicate stateowners on
-                * the same file, or should they just be allowed (and
-                * create new stateids)? */
-               status = nfserr_jukebox;
-               lock_sop = alloc_init_lock_stateowner(strhashval,
-                               open_sop->oo_owner.so_client, open_stp, lock);
-               if (lock_sop == NULL)
-                       goto out;
-               lock_stp = alloc_init_lock_stateid(lock_sop, fp, open_stp);
-               if (lock_stp == NULL)
+               status = lookup_or_create_lock_state(cstate, open_stp, lock,
+                                                       &lock_stp, &new_state);
+               if (status)
                        goto out;
        } else {
                /* lock (lock owner + lock stateid) already exists */
                                       NFS4_LOCK_STID, &lock_stp);
                if (status)
                        goto out;
-               lock_sop = lockowner(lock_stp->st_stateowner);
-               fp = lock_stp->st_file;
        }
-       /* lock_sop and lock_stp have been created or found */
+       lock_sop = lockowner(lock_stp->st_stateowner);
+       fp = lock_stp->st_file;
  
        lkflg = setlkflg(lock->lk_type);
        status = nfs4_check_openmode(lock_stp, lkflg);
                break;
        }
  out:
-       if (status && lock->lk_is_new && lock_sop)
+       if (status && new_state)
                release_lockowner(lock_sop);
        if (!cstate->replay_owner)
                nfs4_unlock_state();
@@@ -4251,7 -4293,7 +4293,7 @@@ nfsd4_release_lockowner(struct svc_rqs
        struct nfs4_ol_stateid *stp;
        struct xdr_netobj *owner = &rlockowner->rl_owner;
        struct list_head matches;
-       int i;
+       unsigned int hashval = ownerstr_hashval(clid->cl_id, owner);
        __be32 status;
  
        dprintk("nfsd4_release_lockowner clientid: (%08x/%08x):\n",
        nfs4_lock_state();
  
        status = nfserr_locks_held;
-       /* XXX: we're doing a linear search through all the lockowners.
-        * Yipes!  For now we'll just hope clients aren't really using
-        * release_lockowner much, but eventually we have to fix these
-        * data structures. */
        INIT_LIST_HEAD(&matches);
-       for (i = 0; i < LOCK_HASH_SIZE; i++) {
-               list_for_each_entry(sop, &lock_ownerstr_hashtbl[i], so_strhash) {
-                       if (!same_owner_str(sop, owner, clid))
-                               continue;
-                       list_for_each_entry(stp, &sop->so_stateids,
-                                       st_perstateowner) {
-                               lo = lockowner(sop);
-                               if (check_for_locks(stp->st_file, lo))
-                                       goto out;
-                               list_add(&lo->lo_list, &matches);
-                       }
+       list_for_each_entry(sop, &ownerstr_hashtbl[hashval], so_strhash) {
+               if (sop->so_is_open_owner)
+                       continue;
+               if (!same_owner_str(sop, owner, clid))
+                       continue;
+               list_for_each_entry(stp, &sop->so_stateids,
+                               st_perstateowner) {
+                       lo = lockowner(sop);
+                       if (check_for_locks(stp->st_file, lo))
+                               goto out;
+                       list_add(&lo->lo_list, &matches);
                }
        }
        /* Clients probably won't expect us to return with some (but not all)
@@@ -4394,16 -4433,127 +4433,127 @@@ nfs4_check_open_reclaim(clientid_t *cli
        return nfs4_find_reclaim_client(clid) ? nfs_ok : nfserr_reclaim_bad;
  }
  
+ #ifdef CONFIG_NFSD_FAULT_INJECTION
+ void nfsd_forget_clients(u64 num)
+ {
+       struct nfs4_client *clp, *next;
+       int count = 0;
+       nfs4_lock_state();
+       list_for_each_entry_safe(clp, next, &client_lru, cl_lru) {
+               nfsd4_remove_clid_dir(clp);
+               expire_client(clp);
+               if (++count == num)
+                       break;
+       }
+       nfs4_unlock_state();
+       printk(KERN_INFO "NFSD: Forgot %d clients", count);
+ }
+ static void release_lockowner_sop(struct nfs4_stateowner *sop)
+ {
+       release_lockowner(lockowner(sop));
+ }
+ static void release_openowner_sop(struct nfs4_stateowner *sop)
+ {
+       release_openowner(openowner(sop));
+ }
+ static int nfsd_release_n_owners(u64 num, bool is_open_owner,
+                               void (*release_sop)(struct nfs4_stateowner *))
+ {
+       int i, count = 0;
+       struct nfs4_stateowner *sop, *next;
+       for (i = 0; i < OWNER_HASH_SIZE; i++) {
+               list_for_each_entry_safe(sop, next, &ownerstr_hashtbl[i], so_strhash) {
+                       if (sop->so_is_open_owner != is_open_owner)
+                               continue;
+                       release_sop(sop);
+                       if (++count == num)
+                               return count;
+               }
+       }
+       return count;
+ }
+ void nfsd_forget_locks(u64 num)
+ {
+       int count;
+       nfs4_lock_state();
+       count = nfsd_release_n_owners(num, false, release_lockowner_sop);
+       nfs4_unlock_state();
+       printk(KERN_INFO "NFSD: Forgot %d locks", count);
+ }
+ void nfsd_forget_openowners(u64 num)
+ {
+       int count;
+       nfs4_lock_state();
+       count = nfsd_release_n_owners(num, true, release_openowner_sop);
+       nfs4_unlock_state();
+       printk(KERN_INFO "NFSD: Forgot %d open owners", count);
+ }
+ int nfsd_process_n_delegations(u64 num, void (*deleg_func)(struct nfs4_delegation *))
+ {
+       int i, count = 0;
+       struct nfs4_file *fp, *fnext;
+       struct nfs4_delegation *dp, *dnext;
+       for (i = 0; i < FILE_HASH_SIZE; i++) {
+               list_for_each_entry_safe(fp, fnext, &file_hashtbl[i], fi_hash) {
+                       list_for_each_entry_safe(dp, dnext, &fp->fi_delegations, dl_perfile) {
+                               deleg_func(dp);
+                               if (++count == num)
+                                       return count;
+                       }
+               }
+       }
+       return count;
+ }
+ void nfsd_forget_delegations(u64 num)
+ {
+       unsigned int count;
+       nfs4_lock_state();
+       count = nfsd_process_n_delegations(num, unhash_delegation);
+       nfs4_unlock_state();
+       printk(KERN_INFO "NFSD: Forgot %d delegations", count);
+ }
+ void nfsd_recall_delegations(u64 num)
+ {
+       unsigned int count;
+       nfs4_lock_state();
+       spin_lock(&recall_lock);
+       count = nfsd_process_n_delegations(num, nfsd_break_one_deleg);
+       spin_unlock(&recall_lock);
+       nfs4_unlock_state();
+       printk(KERN_INFO "NFSD: Recalled %d delegations", count);
+ }
+ #endif /* CONFIG_NFSD_FAULT_INJECTION */
  /* initialization to perform at module load time: */
  
- int
+ void
  nfs4_state_init(void)
  {
-       int i, status;
+       int i;
  
-       status = nfsd4_init_slabs();
-       if (status)
-               return status;
        for (i = 0; i < CLIENT_HASH_SIZE; i++) {
                INIT_LIST_HEAD(&conf_id_hashtbl[i]);
                INIT_LIST_HEAD(&conf_str_hashtbl[i]);
        for (i = 0; i < FILE_HASH_SIZE; i++) {
                INIT_LIST_HEAD(&file_hashtbl[i]);
        }
-       for (i = 0; i < OPEN_OWNER_HASH_SIZE; i++) {
-               INIT_LIST_HEAD(&open_ownerstr_hashtbl[i]);
-       }
-       for (i = 0; i < LOCK_HASH_SIZE; i++) {
-               INIT_LIST_HEAD(&lock_ownerstr_hashtbl[i]);
+       for (i = 0; i < OWNER_HASH_SIZE; i++) {
+               INIT_LIST_HEAD(&ownerstr_hashtbl[i]);
        }
-       memset(&onestateid, ~0, sizeof(stateid_t));
+       for (i = 0; i < LOCKOWNER_INO_HASH_SIZE; i++)
+               INIT_LIST_HEAD(&lockowner_ino_hashtbl[i]);
        INIT_LIST_HEAD(&close_lru);
        INIT_LIST_HEAD(&client_lru);
        INIT_LIST_HEAD(&del_recall_lru);
        reclaim_str_hashtbl_size = 0;
-       return 0;
  }
  
  static void
@@@ -4526,7 -4673,6 +4673,6 @@@ __nfs4_state_shutdown(void
        spin_unlock(&recall_lock);
        list_for_each_safe(pos, next, &reaplist) {
                dp = list_entry (pos, struct nfs4_delegation, dl_recall_lru);
-               list_del_init(&dp->dl_recall_lru);
                unhash_delegation(dp);
        }
  
diff --combined fs/nfsd/nfsctl.c
index bb4a11d58a5aac3e6f1e8121ab94e2121c9a3290,8daa935f329f9d82a55855ff35cf9fe3dd6ad732..748eda93ce590d1ad1e4f7892f29e25f8ad8856a
@@@ -18,6 -18,7 +18,7 @@@
  #include "idmap.h"
  #include "nfsd.h"
  #include "cache.h"
+ #include "fault_inject.h"
  
  /*
   *    We have a single directory with several nodes in it.
@@@ -272,7 -273,7 +273,7 @@@ static ssize_t write_unlock_fs(struct f
         * 2.  Is that directory a mount point, or
         * 3.  Is that directory the root of an exported file system?
         */
 -      error = nlmsvc_unlock_all_by_sb(path.mnt->mnt_sb);
 +      error = nlmsvc_unlock_all_by_sb(path.dentry->d_sb);
  
        path_put(&path);
        return error;
@@@ -1128,9 -1129,13 +1129,13 @@@ static int __init init_nfsd(void
        int retval;
        printk(KERN_INFO "Installing knfsd (copyright (C) 1996 okir@monad.swb.de).\n");
  
-       retval = nfs4_state_init(); /* nfs4 locking state */
+       retval = nfsd4_init_slabs();
        if (retval)
                return retval;
+       nfs4_state_init();
+       retval = nfsd_fault_inject_init(); /* nfsd fault injection controls */
+       if (retval)
+               goto out_free_slabs;
        nfsd_stat_init();       /* Statistics */
        retval = nfsd_reply_cache_init();
        if (retval)
@@@ -1161,6 -1166,8 +1166,8 @@@ out_free_cache
        nfsd_reply_cache_shutdown();
  out_free_stat:
        nfsd_stat_shutdown();
+       nfsd_fault_inject_cleanup();
+ out_free_slabs:
        nfsd4_free_slabs();
        return retval;
  }
@@@ -1175,6 -1182,7 +1182,7 @@@ static void __exit exit_nfsd(void
        nfsd_lockd_shutdown();
        nfsd_idmap_shutdown();
        nfsd4_free_slabs();
+       nfsd_fault_inject_cleanup();
        unregister_filesystem(&nfsd_fs_type);
  }
  
diff --combined fs/nfsd/vfs.c
index d25a723b68ada457a3ae58973fd98e427c609b53,89689130621589396d64ed1d45f24d93e1485022..edf6d3ed87778822d85c32929cab580c93ed3c7a
@@@ -307,7 -307,7 +307,7 @@@ nfsd_setattr(struct svc_rqst *rqstp, st
        struct dentry   *dentry;
        struct inode    *inode;
        int             accmode = NFSD_MAY_SATTR;
 -      int             ftype = 0;
 +      umode_t         ftype = 0;
        __be32          err;
        int             host_err;
        int             size_change = 0;
@@@ -594,8 -594,19 +594,19 @@@ nfsd4_get_nfs4_acl(struct svc_rqst *rqs
        return error;
  }
  
- #define NFSD_XATTR_JUNCTION_PREFIX XATTR_TRUSTED_PREFIX "junction."
- #define NFSD_XATTR_JUNCTION_TYPE NFSD_XATTR_JUNCTION_PREFIX "type"
+ /*
+  * NFS junction information is stored in an extended attribute.
+  */
+ #define NFSD_JUNCTION_XATTR_NAME      XATTR_TRUSTED_PREFIX "junction.nfs"
+ /**
+  * nfsd4_is_junction - Test if an object could be an NFS junction
+  *
+  * @dentry: object to test
+  *
+  * Returns 1 if "dentry" appears to contain NFS junction information.
+  * Otherwise 0 is returned.
+  */
  int nfsd4_is_junction(struct dentry *dentry)
  {
        struct inode *inode = dentry->d_inode;
                return 0;
        if (!(inode->i_mode & S_ISVTX))
                return 0;
-       if (vfs_getxattr(dentry, NFSD_XATTR_JUNCTION_TYPE, NULL, 0) <= 0)
+       if (vfs_getxattr(dentry, NFSD_JUNCTION_XATTR_NAME, NULL, 0) <= 0)
                return 0;
        return 1;
  }
@@@ -730,7 -741,7 +741,7 @@@ static int nfsd_open_break_lease(struc
   * N.B. After this call fhp needs an fh_put
   */
  __be32
 -nfsd_open(struct svc_rqst *rqstp, struct svc_fh *fhp, int type,
 +nfsd_open(struct svc_rqst *rqstp, struct svc_fh *fhp, umode_t type,
                        int access, struct file **filp)
  {
        struct dentry   *dentry;
@@@ -1300,7 -1311,7 +1311,7 @@@ nfsd_create(struct svc_rqst *rqstp, str
                goto out;
        }
  
 -      host_err = mnt_want_write(fhp->fh_export->ex_path.mnt);
 +      host_err = fh_want_write(fhp);
        if (host_err)
                goto out_nfserr;
  
                break;
        }
        if (host_err < 0) {
 -              mnt_drop_write(fhp->fh_export->ex_path.mnt);
 +              fh_drop_write(fhp);
                goto out_nfserr;
        }
  
        err2 = nfserrno(commit_metadata(fhp));
        if (err2)
                err = err2;
 -      mnt_drop_write(fhp->fh_export->ex_path.mnt);
 +      fh_drop_write(fhp);
        /*
         * Update the file handle to get the new inode info.
         */
@@@ -1430,7 -1441,7 +1441,7 @@@ do_nfsd_create(struct svc_rqst *rqstp, 
                v_atime = verifier[1]&0x7fffffff;
        }
        
 -      host_err = mnt_want_write(fhp->fh_export->ex_path.mnt);
 +      host_err = fh_want_write(fhp);
        if (host_err)
                goto out_nfserr;
        if (dchild->d_inode) {
                case NFS3_CREATE_GUARDED:
                        err = nfserr_exist;
                }
 -              mnt_drop_write(fhp->fh_export->ex_path.mnt);
 +              fh_drop_write(fhp);
                goto out;
        }
  
        host_err = vfs_create(dirp, dchild, iap->ia_mode, NULL);
        if (host_err < 0) {
 -              mnt_drop_write(fhp->fh_export->ex_path.mnt);
 +              fh_drop_write(fhp);
                goto out_nfserr;
        }
        if (created)
        if (!err)
                err = nfserrno(commit_metadata(fhp));
  
 -      mnt_drop_write(fhp->fh_export->ex_path.mnt);
 +      fh_drop_write(fhp);
        /*
         * Update the filehandle to get the new inode info.
         */
@@@ -1600,7 -1611,7 +1611,7 @@@ nfsd_symlink(struct svc_rqst *rqstp, st
        if (IS_ERR(dnew))
                goto out_nfserr;
  
 -      host_err = mnt_want_write(fhp->fh_export->ex_path.mnt);
 +      host_err = fh_want_write(fhp);
        if (host_err)
                goto out_nfserr;
  
                err = nfserrno(commit_metadata(fhp));
        fh_unlock(fhp);
  
 -      mnt_drop_write(fhp->fh_export->ex_path.mnt);
 +      fh_drop_write(fhp);
  
        cerr = fh_compose(resfhp, fhp->fh_export, dnew, fhp);
        dput(dnew);
@@@ -1674,7 -1685,7 +1685,7 @@@ nfsd_link(struct svc_rqst *rqstp, struc
  
        dold = tfhp->fh_dentry;
  
 -      host_err = mnt_want_write(tfhp->fh_export->ex_path.mnt);
 +      host_err = fh_want_write(tfhp);
        if (host_err) {
                err = nfserrno(host_err);
                goto out_dput;
                        err = nfserrno(host_err);
        }
  out_drop_write:
 -      mnt_drop_write(tfhp->fh_export->ex_path.mnt);
 +      fh_drop_write(tfhp);
  out_dput:
        dput(dnew);
  out_unlock:
@@@ -1776,7 -1787,7 +1787,7 @@@ nfsd_rename(struct svc_rqst *rqstp, str
        host_err = -EXDEV;
        if (ffhp->fh_export->ex_path.mnt != tfhp->fh_export->ex_path.mnt)
                goto out_dput_new;
 -      host_err = mnt_want_write(ffhp->fh_export->ex_path.mnt);
 +      host_err = fh_want_write(ffhp);
        if (host_err)
                goto out_dput_new;
  
                        host_err = commit_metadata(ffhp);
        }
  out_drop_write:
 -      mnt_drop_write(ffhp->fh_export->ex_path.mnt);
 +      fh_drop_write(ffhp);
   out_dput_new:
        dput(ndentry);
   out_dput_old:
@@@ -1854,7 -1865,7 +1865,7 @@@ nfsd_unlink(struct svc_rqst *rqstp, str
        if (!type)
                type = rdentry->d_inode->i_mode & S_IFMT;
  
 -      host_err = mnt_want_write(fhp->fh_export->ex_path.mnt);
 +      host_err = fh_want_write(fhp);
        if (host_err)
                goto out_put;
  
        if (!host_err)
                host_err = commit_metadata(fhp);
  out_drop_write:
 -      mnt_drop_write(fhp->fh_export->ex_path.mnt);
 +      fh_drop_write(fhp);
  out_put:
        dput(rdentry);
  
@@@ -2270,7 -2281,7 +2281,7 @@@ nfsd_set_posix_acl(struct svc_fh *fhp, 
        } else
                size = 0;
  
 -      error = mnt_want_write(fhp->fh_export->ex_path.mnt);
 +      error = fh_want_write(fhp);
        if (error)
                goto getout;
        if (size)
                                error = 0;
                }
        }
 -      mnt_drop_write(fhp->fh_export->ex_path.mnt);
 +      fh_drop_write(fhp);
  
  getout:
        kfree(value);
diff --combined net/sunrpc/cache.c
index 03b56bc3b659f914041ffd18352f3b43e10480a1,b8daa577734fe8fd366d109f1b3fed1bb25b81c3..465df9ae1046b7fc12fe99fd0759017be7a7dc2a
@@@ -1641,6 -1641,7 +1641,7 @@@ int cache_register_net(struct cache_det
                sunrpc_destroy_cache_detail(cd);
        return ret;
  }
+ EXPORT_SYMBOL_GPL(cache_register_net);
  
  int cache_register(struct cache_detail *cd)
  {
@@@ -1653,6 -1654,7 +1654,7 @@@ void cache_unregister_net(struct cache_
        remove_cache_proc_entries(cd, net);
        sunrpc_destroy_cache_detail(cd);
  }
+ EXPORT_SYMBOL_GPL(cache_unregister_net);
  
  void cache_unregister(struct cache_detail *cd)
  {
@@@ -1778,7 -1780,7 +1780,7 @@@ const struct file_operations cache_flus
  };
  
  int sunrpc_cache_register_pipefs(struct dentry *parent,
 -                               const char *name, mode_t umode,
 +                               const char *name, umode_t umode,
                                 struct cache_detail *cd)
  {
        struct qstr q;
diff --combined net/sunrpc/svc.c
index 9d01d46b05f36785e0612786a2365be80a08dc0d,97017989fa1d56e9b120534fd80dc7a84740398c..e4aabc02368b94e0d7b0109ab7906bfbba329b23
@@@ -167,6 -167,7 +167,7 @@@ svc_pool_map_alloc_arrays(struct svc_po
  
  fail_free:
        kfree(m->to_pool);
+       m->to_pool = NULL;
  fail:
        return -ENOMEM;
  }
@@@ -285,9 -286,10 +286,10 @@@ svc_pool_map_put(void
        mutex_lock(&svc_pool_map_mutex);
  
        if (!--m->count) {
-               m->mode = SVC_POOL_DEFAULT;
                kfree(m->to_pool);
+               m->to_pool = NULL;
                kfree(m->pool_to);
+               m->pool_to = NULL;
                m->npools = 0;
        }
  
@@@ -527,17 -529,20 +529,20 @@@ svc_destroy(struct svc_serv *serv
                printk("svc_destroy: no threads for serv=%p!\n", serv);
  
        del_timer_sync(&serv->sv_temptimer);
-       svc_close_all(&serv->sv_tempsocks);
+       /*
+        * The set of xprts (contained in the sv_tempsocks and
+        * sv_permsocks lists) is now constant, since it is modified
+        * only by accepting new sockets (done by service threads in
+        * svc_recv) or aging old ones (done by sv_temptimer), or
+        * configuration changes (excluded by whatever locking the
+        * caller is using--nfsd_mutex in the case of nfsd).  So it's
+        * safe to traverse those lists and shut everything down:
+        */
+       svc_close_all(serv);
  
        if (serv->sv_shutdown)
                serv->sv_shutdown(serv);
  
-       svc_close_all(&serv->sv_permsocks);
-       BUG_ON(!list_empty(&serv->sv_permsocks));
-       BUG_ON(!list_empty(&serv->sv_tempsocks));
        cache_clean_deferred(serv);
  
        if (svc_serv_is_pooled(serv))
@@@ -683,8 -688,8 +688,8 @@@ found_pool
   * Create or destroy enough new threads to make the number
   * of threads the given number.  If `pool' is non-NULL, applies
   * only to threads in that pool, otherwise round-robins between
-  * all pools.  Must be called with a svc_get() reference and
-  * the BKL or another lock to protect access to svc_serv fields.
+  * all pools.  Caller must ensure that mutual exclusion between this and
+  * server startup or shutdown.
   *
   * Destroying threads relies on the service threads filling in
   * rqstp->rq_task, which only the nfs ones do.  Assumes the serv
@@@ -826,7 -831,7 +831,7 @@@ static int __svc_rpcb_register4(const u
        return error;
  }
  
 -#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
 +#if IS_ENABLED(CONFIG_IPV6)
  /*
   * Register an "inet6" protocol family netid with the local
   * rpcbind daemon via an rpcbind v4 SET request.
@@@ -872,7 -877,7 +877,7 @@@ static int __svc_rpcb_register6(const u
  
        return error;
  }
 -#endif        /* defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) */
 +#endif        /* IS_ENABLED(CONFIG_IPV6) */
  
  /*
   * Register a kernel RPC service via rpcbind version 4.
@@@ -893,11 -898,11 +898,11 @@@ static int __svc_register(const char *p
                error = __svc_rpcb_register4(program, version,
                                                protocol, port);
                break;
 -#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
 +#if IS_ENABLED(CONFIG_IPV6)
        case PF_INET6:
                error = __svc_rpcb_register6(program, version,
                                                protocol, port);
 -#endif        /* defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) */
 +#endif
        }
  
        if (error < 0)
diff --combined net/sunrpc/svc_xprt.c
index 38649cfa4e81350aed397d3bdeb316556aaf57e6,0633c7e2fe639dbc9049b3b99f5a83ae1dc98d76..74cb0d8e9ca1f58aae66b85bee5c313cf3473f18
@@@ -22,6 -22,7 +22,7 @@@ static struct svc_deferred_req *svc_def
  static int svc_deferred_recv(struct svc_rqst *rqstp);
  static struct cache_deferred_req *svc_defer(struct cache_req *req);
  static void svc_age_temp_xprts(unsigned long closure);
+ static void svc_delete_xprt(struct svc_xprt *xprt);
  
  /* apparently the "standard" is that clients close
   * idle connections after 5 minutes, servers after
@@@ -147,8 -148,8 +148,8 @@@ EXPORT_SYMBOL_GPL(svc_xprt_put)
   * Called by transport drivers to initialize the transport independent
   * portion of the transport instance.
   */
- void svc_xprt_init(struct svc_xprt_class *xcl, struct svc_xprt *xprt,
-                  struct svc_serv *serv)
+ void svc_xprt_init(struct net *net, struct svc_xprt_class *xcl,
+                  struct svc_xprt *xprt, struct svc_serv *serv)
  {
        memset(xprt, 0, sizeof(*xprt));
        xprt->xpt_class = xcl;
        spin_lock_init(&xprt->xpt_lock);
        set_bit(XPT_BUSY, &xprt->xpt_flags);
        rpc_init_wait_queue(&xprt->xpt_bc_pending, "xpt_bc_pending");
-       xprt->xpt_net = get_net(&init_net);
+       xprt->xpt_net = get_net(net);
  }
  EXPORT_SYMBOL_GPL(svc_xprt_init);
  
@@@ -179,13 -180,13 +180,13 @@@ static struct svc_xprt *__svc_xpo_creat
                .sin_addr.s_addr        = htonl(INADDR_ANY),
                .sin_port               = htons(port),
        };
 -#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
 +#if IS_ENABLED(CONFIG_IPV6)
        struct sockaddr_in6 sin6 = {
                .sin6_family            = AF_INET6,
                .sin6_addr              = IN6ADDR_ANY_INIT,
                .sin6_port              = htons(port),
        };
 -#endif        /* defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) */
 +#endif
        struct sockaddr *sap;
        size_t len;
  
                sap = (struct sockaddr *)&sin;
                len = sizeof(sin);
                break;
 -#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
 +#if IS_ENABLED(CONFIG_IPV6)
        case PF_INET6:
                sap = (struct sockaddr *)&sin6;
                len = sizeof(sin6);
                break;
 -#endif        /* defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) */
 +#endif
        default:
                return ERR_PTR(-EAFNOSUPPORT);
        }
@@@ -878,7 -879,7 +879,7 @@@ static void call_xpt_users(struct svc_x
  /*
   * Remove a dead transport
   */
- void svc_delete_xprt(struct svc_xprt *xprt)
static void svc_delete_xprt(struct svc_xprt *xprt)
  {
        struct svc_serv *serv = xprt->xpt_server;
        struct svc_deferred_req *dr;
        spin_lock_bh(&serv->sv_lock);
        if (!test_and_set_bit(XPT_DETACHED, &xprt->xpt_flags))
                list_del_init(&xprt->xpt_list);
-       /*
-        * The only time we're called while xpt_ready is still on a list
-        * is while the list itself is about to be destroyed (in
-        * svc_destroy).  BUT svc_xprt_enqueue could still be attempting
-        * to add new entries to the sp_sockets list, so we can't leave
-        * a freed xprt on it.
-        */
-       list_del_init(&xprt->xpt_ready);
+       BUG_ON(!list_empty(&xprt->xpt_ready));
        if (test_bit(XPT_TEMP, &xprt->xpt_flags))
                serv->sv_tmpcnt--;
        spin_unlock_bh(&serv->sv_lock);
@@@ -928,22 -922,48 +922,48 @@@ void svc_close_xprt(struct svc_xprt *xp
  }
  EXPORT_SYMBOL_GPL(svc_close_xprt);
  
- void svc_close_all(struct list_head *xprt_list)
+ static void svc_close_list(struct list_head *xprt_list)
+ {
+       struct svc_xprt *xprt;
+       list_for_each_entry(xprt, xprt_list, xpt_list) {
+               set_bit(XPT_CLOSE, &xprt->xpt_flags);
+               set_bit(XPT_BUSY, &xprt->xpt_flags);
+       }
+ }
+ void svc_close_all(struct svc_serv *serv)
  {
+       struct svc_pool *pool;
        struct svc_xprt *xprt;
        struct svc_xprt *tmp;
+       int i;
+       svc_close_list(&serv->sv_tempsocks);
+       svc_close_list(&serv->sv_permsocks);
  
+       for (i = 0; i < serv->sv_nrpools; i++) {
+               pool = &serv->sv_pools[i];
+               spin_lock_bh(&pool->sp_lock);
+               while (!list_empty(&pool->sp_sockets)) {
+                       xprt = list_first_entry(&pool->sp_sockets, struct svc_xprt, xpt_ready);
+                       list_del_init(&xprt->xpt_ready);
+               }
+               spin_unlock_bh(&pool->sp_lock);
+       }
        /*
-        * The server is shutting down, and no more threads are running.
-        * svc_xprt_enqueue() might still be running, but at worst it
-        * will re-add the xprt to sp_sockets, which will soon get
-        * freed.  So we don't bother with any more locking, and don't
-        * leave the close to the (nonexistent) server threads:
+        * At this point the sp_sockets lists will stay empty, since
+        * svc_enqueue will not add new entries without taking the
+        * sp_lock and checking XPT_BUSY.
         */
-       list_for_each_entry_safe(xprt, tmp, xprt_list, xpt_list) {
-               set_bit(XPT_CLOSE, &xprt->xpt_flags);
+       list_for_each_entry_safe(xprt, tmp, &serv->sv_tempsocks, xpt_list)
                svc_delete_xprt(xprt);
-       }
+       list_for_each_entry_safe(xprt, tmp, &serv->sv_permsocks, xpt_list)
+               svc_delete_xprt(xprt);
+       BUG_ON(!list_empty(&serv->sv_permsocks));
+       BUG_ON(!list_empty(&serv->sv_tempsocks));
  }
  
  /*
diff --combined net/sunrpc/svcsock.c
index 4653286fcc9e685e1d1999c532325ce48870d4f8,277909e651ed94a2a14c1702f742e08c41681b01..464570906f80c24190260bef957a53128202a486
@@@ -157,7 -157,7 +157,7 @@@ static void svc_set_cmsg_data(struct sv
                        cmh->cmsg_level = SOL_IPV6;
                        cmh->cmsg_type = IPV6_PKTINFO;
                        pki->ipi6_ifindex = daddr->sin6_scope_id;
 -                      ipv6_addr_copy(&pki->ipi6_addr, &daddr->sin6_addr);
 +                      pki->ipi6_addr = daddr->sin6_addr;
                        cmh->cmsg_len = CMSG_LEN(sizeof(*pki));
                }
                break;
@@@ -523,7 -523,7 +523,7 @@@ static int svc_udp_get_dest_address6(st
                return 0;
  
        daddr->sin6_family = AF_INET6;
 -      ipv6_addr_copy(&daddr->sin6_addr, &pki->ipi6_addr);
 +      daddr->sin6_addr = pki->ipi6_addr;
        daddr->sin6_scope_id = pki->ipi6_ifindex;
        return 1;
  }
@@@ -739,7 -739,8 +739,8 @@@ static void svc_udp_init(struct svc_soc
  {
        int err, level, optname, one = 1;
  
-       svc_xprt_init(&svc_udp_class, &svsk->sk_xprt, serv);
+       svc_xprt_init(sock_net(svsk->sk_sock->sk), &svc_udp_class,
+                     &svsk->sk_xprt, serv);
        clear_bit(XPT_CACHE_AUTH, &svsk->sk_xprt.xpt_flags);
        svsk->sk_sk->sk_data_ready = svc_udp_data_ready;
        svsk->sk_sk->sk_write_space = svc_write_space;
@@@ -1343,7 -1344,8 +1344,8 @@@ static void svc_tcp_init(struct svc_soc
  {
        struct sock     *sk = svsk->sk_sk;
  
-       svc_xprt_init(&svc_tcp_class, &svsk->sk_xprt, serv);
+       svc_xprt_init(sock_net(svsk->sk_sock->sk), &svc_tcp_class,
+                     &svsk->sk_xprt, serv);
        set_bit(XPT_CACHE_AUTH, &svsk->sk_xprt.xpt_flags);
        if (sk->sk_state == TCP_LISTEN) {
                dprintk("setting up TCP socket for listening\n");
@@@ -1659,7 -1661,7 +1661,7 @@@ static struct svc_xprt *svc_bc_create_s
                return ERR_PTR(-ENOMEM);
  
        xprt = &svsk->sk_xprt;
-       svc_xprt_init(&svc_tcp_bc_class, xprt, serv);
+       svc_xprt_init(net, &svc_tcp_bc_class, xprt, serv);
  
        serv->sv_bc_xprt = xprt;