--- /dev/null
+From foo@baz Thu Oct 19 15:15:46 CEST 2017
+From: Robbie Ko <robbieko@synology.com>
+Date: Thu, 5 Jan 2017 16:24:55 +0800
+Subject: Btrfs: send, fix failure to rename top level inode due to name collision
+
+From: Robbie Ko <robbieko@synology.com>
+
+
+[ Upstream commit 4dd9920d991745c4a16f53a8f615f706fbe4b3f7 ]
+
+Under certain situations, an incremental send operation can fail due to a
+premature attempt to create a new top level inode (a direct child of the
+subvolume/snapshot root) whose name collides with another inode that was
+removed from the send snapshot.
+
+Consider the following example scenario.
+
+Parent snapshot:
+
+ . (ino 256, gen 8)
+ |---- a1/ (ino 257, gen 9)
+ |---- a2/ (ino 258, gen 9)
+
+Send snapshot:
+
+ . (ino 256, gen 3)
+ |---- a2/ (ino 257, gen 7)
+
+In this scenario, when receiving the incremental send stream, the btrfs
+receive command fails like this (ran in verbose mode, -vv argument):
+
+ rmdir a1
+ mkfile o257-7-0
+ rename o257-7-0 -> a2
+ ERROR: rename o257-7-0 -> a2 failed: Is a directory
+
+What happens when computing the incremental send stream is:
+
+1) An operation to remove the directory with inode number 257 and
+ generation 9 is issued.
+
+2) An operation to create the inode with number 257 and generation 7 is
+ issued. This creates the inode with an orphanized name of "o257-7-0".
+
+3) An operation rename the new inode 257 to its final name, "a2", is
+ issued. This is incorrect because inode 258, which has the same name
+ and it's a child of the same parent (root inode 256), was not yet
+ processed and therefore no rmdir operation for it was yet issued.
+ The rename operation is issued because we fail to detect that the
+ name of the new inode 257 collides with inode 258, because their
+ parent, a subvolume/snapshot root (inode 256) has a different
+ generation in both snapshots.
+
+So fix this by ignoring the generation value of a parent directory that
+matches a root inode (number 256) when we are checking if the name of the
+inode currently being processed collides with the name of some other
+inode that was not yet processed.
+
+We can achieve this scenario of different inodes with the same number but
+different generation values either by mounting a filesystem with the inode
+cache option (-o inode_cache) or by creating and sending snapshots across
+different filesystems, like in the following example:
+
+ $ mkfs.btrfs -f /dev/sdb
+ $ mount /dev/sdb /mnt
+ $ mkdir /mnt/a1
+ $ mkdir /mnt/a2
+ $ btrfs subvolume snapshot -r /mnt /mnt/snap1
+ $ btrfs send /mnt/snap1 -f /tmp/1.snap
+ $ umount /mnt
+
+ $ mkfs.btrfs -f /dev/sdc
+ $ mount /dev/sdc /mnt
+ $ touch /mnt/a2
+ $ btrfs subvolume snapshot -r /mnt /mnt/snap2
+ $ btrfs receive /mnt -f /tmp/1.snap
+ # Take note that once the filesystem is created, its current
+ # generation has value 7 so the inode from the second snapshot has
+ # a generation value of 7. And after receiving the first snapshot
+ # the filesystem is at a generation value of 10, because the call to
+ # create the second snapshot bumps the generation to 8 (the snapshot
+ # creation ioctl does a transaction commit), the receive command calls
+ # the snapshot creation ioctl to create the first snapshot, which bumps
+ # the filesystem's generation to 9, and finally when the receive
+ # operation finishes it calls an ioctl to transition the first snapshot
+ # (snap1) from RW mode to RO mode, which does another transaction commit
+ # and bumps the filesystem's generation to 10.
+ $ rm -f /tmp/1.snap
+ $ btrfs send /mnt/snap1 -f /tmp/1.snap
+ $ btrfs send -p /mnt/snap1 /mnt/snap2 -f /tmp/2.snap
+ $ umount /mnt
+
+ $ mkfs.btrfs -f /dev/sdd
+ $ mount /dev/sdd /mnt
+ $ btrfs receive /mnt /tmp/1.snap
+ # Receive of snapshot snap2 used to fail.
+ $ btrfs receive /mnt /tmp/2.snap
+
+Signed-off-by: Robbie Ko <robbieko@synology.com>
+Reviewed-by: Filipe Manana <fdmanana@suse.com>
+[Rewrote changelog to be more precise and clear]
+Signed-off-by: Filipe Manana <fdmanana@suse.com>
+
+Signed-off-by: Sasha Levin <alexander.levin@verizon.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ fs/btrfs/send.c | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+--- a/fs/btrfs/send.c
++++ b/fs/btrfs/send.c
+@@ -1648,6 +1648,9 @@ static int is_inode_existent(struct send
+ {
+ int ret;
+
++ if (ino == BTRFS_FIRST_FREE_OBJECTID)
++ return 1;
++
+ ret = get_cur_inode_state(sctx, ino, gen);
+ if (ret < 0)
+ goto out;
+@@ -1833,7 +1836,7 @@ static int will_overwrite_ref(struct sen
+ * not delted and then re-created, if it was then we have no overwrite
+ * and we can just unlink this entry.
+ */
+- if (sctx->parent_root) {
++ if (sctx->parent_root && dir != BTRFS_FIRST_FREE_OBJECTID) {
+ ret = get_inode_info(sctx->parent_root, dir, NULL, &gen, NULL,
+ NULL, NULL, NULL);
+ if (ret < 0 && ret != -ENOENT)
--- /dev/null
+From foo@baz Thu Oct 19 15:15:46 CEST 2017
+From: Jeff Layton <jlayton@redhat.com>
+Date: Thu, 15 Dec 2016 08:37:57 -0500
+Subject: ceph: clean up unsafe d_parent accesses in build_dentry_path
+
+From: Jeff Layton <jlayton@redhat.com>
+
+
+[ Upstream commit c6b0b656ca24ede6657abb4a2cd910fa9c1879ba ]
+
+While we hold a reference to the dentry when build_dentry_path is
+called, we could end up racing with a rename that changes d_parent.
+Handle that situation correctly, by using the rcu_read_lock to
+ensure that the parent dentry and inode stick around long enough
+to safely check ceph_snap and ceph_ino.
+
+Link: http://tracker.ceph.com/issues/18148
+Signed-off-by: Jeff Layton <jlayton@redhat.com>
+Reviewed-by: Yan, Zheng <zyan@redhat.com>
+Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
+Signed-off-by: Sasha Levin <alexander.levin@verizon.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ fs/ceph/mds_client.c | 9 +++++++--
+ 1 file changed, 7 insertions(+), 2 deletions(-)
+
+--- a/fs/ceph/mds_client.c
++++ b/fs/ceph/mds_client.c
+@@ -1845,13 +1845,18 @@ static int build_dentry_path(struct dent
+ int *pfreepath)
+ {
+ char *path;
++ struct inode *dir;
+
+- if (ceph_snap(d_inode(dentry->d_parent)) == CEPH_NOSNAP) {
+- *pino = ceph_ino(d_inode(dentry->d_parent));
++ rcu_read_lock();
++ dir = d_inode_rcu(dentry->d_parent);
++ if (dir && ceph_snap(dir) == CEPH_NOSNAP) {
++ *pino = ceph_ino(dir);
++ rcu_read_unlock();
+ *ppath = dentry->d_name.name;
+ *ppathlen = dentry->d_name.len;
+ return 0;
+ }
++ rcu_read_unlock();
+ path = ceph_mdsc_build_path(dentry, ppathlen, pino, 1);
+ if (IS_ERR(path))
+ return PTR_ERR(path);
--- /dev/null
+From foo@baz Thu Oct 19 15:15:46 CEST 2017
+From: Arnd Bergmann <arnd@arndb.de>
+Date: Tue, 14 Feb 2017 22:19:18 +0100
+Subject: cpufreq: CPPC: add ACPI_PROCESSOR dependency
+
+From: Arnd Bergmann <arnd@arndb.de>
+
+
+[ Upstream commit a578884fa0d2768f13d37c6591a9e1ed600482d3 ]
+
+Without the Kconfig dependency, we can get this warning:
+
+warning: ACPI_CPPC_CPUFREQ selects ACPI_CPPC_LIB which has unmet direct dependencies (ACPI && ACPI_PROCESSOR)
+
+Fixes: 5477fb3bd1e8 (ACPI / CPPC: Add a CPUFreq driver for use with CPPC)
+Signed-off-by: Arnd Bergmann <arnd@arndb.de>
+Acked-by: Viresh Kumar <viresh.kumar@linaro.org>
+Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
+Signed-off-by: Sasha Levin <alexander.levin@verizon.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/cpufreq/Kconfig.arm | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/drivers/cpufreq/Kconfig.arm
++++ b/drivers/cpufreq/Kconfig.arm
+@@ -241,7 +241,7 @@ config ARM_PXA2xx_CPUFREQ
+
+ config ACPI_CPPC_CPUFREQ
+ tristate "CPUFreq driver based on the ACPI CPPC spec"
+- depends on ACPI
++ depends on ACPI_PROCESSOR
+ select ACPI_CPPC_LIB
+ default n
+ help
--- /dev/null
+From foo@baz Thu Oct 19 15:15:46 CEST 2017
+From: Milan Broz <gmazyland@gmail.com>
+Date: Thu, 23 Feb 2017 08:38:26 +0100
+Subject: crypto: xts - Add ECB dependency
+
+From: Milan Broz <gmazyland@gmail.com>
+
+
+[ Upstream commit 12cb3a1c4184f891d965d1f39f8cfcc9ef617647 ]
+
+Since the
+ commit f1c131b45410a202eb45cc55980a7a9e4e4b4f40
+ crypto: xts - Convert to skcipher
+the XTS mode is based on ECB, so the mode must select
+ECB otherwise it can fail to initialize.
+
+Signed-off-by: Milan Broz <gmazyland@gmail.com>
+Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
+Signed-off-by: Sasha Levin <alexander.levin@verizon.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ crypto/Kconfig | 1 +
+ 1 file changed, 1 insertion(+)
+
+--- a/crypto/Kconfig
++++ b/crypto/Kconfig
+@@ -343,6 +343,7 @@ config CRYPTO_XTS
+ select CRYPTO_BLKCIPHER
+ select CRYPTO_MANAGER
+ select CRYPTO_GF128MUL
++ select CRYPTO_ECB
+ help
+ XTS: IEEE1619/D16 narrow block cipher use with aes-xts-plain,
+ key size 256, 384 or 512 bits. This implementation currently
--- /dev/null
+From foo@baz Thu Oct 19 15:15:46 CEST 2017
+From: Jaegeuk Kim <jaegeuk@kernel.org>
+Date: Fri, 17 Feb 2017 09:55:55 -0800
+Subject: f2fs: do not wait for writeback in write_begin
+
+From: Jaegeuk Kim <jaegeuk@kernel.org>
+
+
+[ Upstream commit 86d54795c94532075d862aa0a79f0c981dab4bdd ]
+
+Otherwise we can get livelock like below.
+
+[79880.428136] dbench D 0 18405 18404 0x00000000
+[79880.428139] Call Trace:
+[79880.428142] __schedule+0x219/0x6b0
+[79880.428144] schedule+0x36/0x80
+[79880.428147] schedule_timeout+0x243/0x2e0
+[79880.428152] ? update_sd_lb_stats+0x16b/0x5f0
+[79880.428155] ? ktime_get+0x3c/0xb0
+[79880.428157] io_schedule_timeout+0xa6/0x110
+[79880.428161] __lock_page+0xf7/0x130
+[79880.428164] ? unlock_page+0x30/0x30
+[79880.428167] pagecache_get_page+0x16b/0x250
+[79880.428171] grab_cache_page_write_begin+0x20/0x40
+[79880.428182] f2fs_write_begin+0xa2/0xdb0 [f2fs]
+[79880.428192] ? f2fs_mark_inode_dirty_sync+0x16/0x30 [f2fs]
+[79880.428197] ? kmem_cache_free+0x79/0x200
+[79880.428203] ? __mark_inode_dirty+0x17f/0x360
+[79880.428206] generic_perform_write+0xbb/0x190
+[79880.428213] ? file_update_time+0xa4/0xf0
+[79880.428217] __generic_file_write_iter+0x19b/0x1e0
+[79880.428226] f2fs_file_write_iter+0x9c/0x180 [f2fs]
+[79880.428231] __vfs_write+0xc5/0x140
+[79880.428235] vfs_write+0xb2/0x1b0
+[79880.428238] SyS_write+0x46/0xa0
+[79880.428242] entry_SYSCALL_64_fastpath+0x1e/0xad
+
+Fixes: cae96a5c8ab6 ("f2fs: check io submission more precisely")
+Reviewed-by: Chao Yu <yuchao0@huawei.com>
+Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
+Signed-off-by: Sasha Levin <alexander.levin@verizon.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ fs/f2fs/data.c | 7 ++++++-
+ 1 file changed, 6 insertions(+), 1 deletion(-)
+
+--- a/fs/f2fs/data.c
++++ b/fs/f2fs/data.c
+@@ -1416,7 +1416,12 @@ static int f2fs_write_begin(struct file
+ goto fail;
+ }
+ repeat:
+- page = grab_cache_page_write_begin(mapping, index, flags);
++ /*
++ * Do not use grab_cache_page_write_begin() to avoid deadlock due to
++ * wait_for_stable_page. Will wait that below with our IO control.
++ */
++ page = pagecache_get_page(mapping, index,
++ FGP_LOCK | FGP_WRITE | FGP_CREAT, GFP_NOFS);
+ if (!page) {
+ err = -ENOMEM;
+ goto fail;
--- /dev/null
+From foo@baz Thu Oct 19 15:15:46 CEST 2017
+From: Alexandre Belloni <alexandre.belloni@free-electrons.com>
+Date: Thu, 16 Feb 2017 18:27:59 +0100
+Subject: i2c: at91: ensure state is restored after suspending
+
+From: Alexandre Belloni <alexandre.belloni@free-electrons.com>
+
+
+[ Upstream commit e3ccc921b7d8fd1fcd10a00720e09823d8078666 ]
+
+When going to suspend, the I2C registers may be lost because the power to
+VDDcore is cut. Restore them when resuming.
+
+Signed-off-by: Alexandre Belloni <alexandre.belloni@free-electrons.com>
+Acked-by: Ludovic Desroches <ludovic.desroches@microchip.com>
+Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
+Signed-off-by: Sasha Levin <alexander.levin@verizon.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/i2c/busses/i2c-at91.c | 3 +++
+ 1 file changed, 3 insertions(+)
+
+--- a/drivers/i2c/busses/i2c-at91.c
++++ b/drivers/i2c/busses/i2c-at91.c
+@@ -1131,6 +1131,7 @@ static int at91_twi_suspend_noirq(struct
+
+ static int at91_twi_resume_noirq(struct device *dev)
+ {
++ struct at91_twi_dev *twi_dev = dev_get_drvdata(dev);
+ int ret;
+
+ if (!pm_runtime_status_suspended(dev)) {
+@@ -1142,6 +1143,8 @@ static int at91_twi_resume_noirq(struct
+ pm_runtime_mark_last_busy(dev);
+ pm_request_autosuspend(dev);
+
++ at91_init_twi_bus(twi_dev);
++
+ return 0;
+ }
+
--- /dev/null
+From foo@baz Thu Oct 19 15:15:46 CEST 2017
+From: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
+Date: Tue, 21 Feb 2017 07:34:00 +0100
+Subject: iio: adc: xilinx: Fix error handling
+
+From: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
+
+
+[ Upstream commit ca1c39ef76376b67303d01f94fe98bb68bb3861a ]
+
+Reorder error handling labels in order to match the way resources have
+been allocated.
+
+Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
+Acked-by: Lars-Peter Clausen <lars@metafoo.de>
+Signed-off-by: Jonathan Cameron <jic23@kernel.org>
+Signed-off-by: Sasha Levin <alexander.levin@verizon.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/iio/adc/xilinx-xadc-core.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+--- a/drivers/iio/adc/xilinx-xadc-core.c
++++ b/drivers/iio/adc/xilinx-xadc-core.c
+@@ -1208,7 +1208,7 @@ static int xadc_probe(struct platform_de
+
+ ret = xadc->ops->setup(pdev, indio_dev, irq);
+ if (ret)
+- goto err_free_samplerate_trigger;
++ goto err_clk_disable_unprepare;
+
+ ret = request_irq(irq, xadc->ops->interrupt_handler, 0,
+ dev_name(&pdev->dev), indio_dev);
+@@ -1268,6 +1268,8 @@ static int xadc_probe(struct platform_de
+
+ err_free_irq:
+ free_irq(irq, indio_dev);
++err_clk_disable_unprepare:
++ clk_disable_unprepare(xadc->clk);
+ err_free_samplerate_trigger:
+ if (xadc->ops->flags & XADC_FLAGS_BUFFERED)
+ iio_trigger_free(xadc->samplerate_trigger);
+@@ -1277,8 +1279,6 @@ err_free_convst_trigger:
+ err_triggered_buffer_cleanup:
+ if (xadc->ops->flags & XADC_FLAGS_BUFFERED)
+ iio_triggered_buffer_cleanup(indio_dev);
+-err_clk_disable_unprepare:
+- clk_disable_unprepare(xadc->clk);
+ err_device_free:
+ kfree(indio_dev->channels);
+
--- /dev/null
+From foo@baz Thu Oct 19 15:15:46 CEST 2017
+From: Franck Demathieu <fdemathieu@gmail.com>
+Date: Thu, 23 Feb 2017 10:48:55 +0100
+Subject: irqchip/crossbar: Fix incorrect type of local variables
+
+From: Franck Demathieu <fdemathieu@gmail.com>
+
+
+[ Upstream commit b28ace12661fbcfd90959c1e84ff5a85113a82a1 ]
+
+The max and entry variables are unsigned according to the dt-bindings.
+Fix following 3 sparse issues (-Wtypesign):
+
+ drivers/irqchip/irq-crossbar.c:222:52: warning: incorrect type in argument 3 (different signedness)
+ drivers/irqchip/irq-crossbar.c:222:52: expected unsigned int [usertype] *out_value
+ drivers/irqchip/irq-crossbar.c:222:52: got int *<noident>
+
+ drivers/irqchip/irq-crossbar.c:245:56: warning: incorrect type in argument 4 (different signedness)
+ drivers/irqchip/irq-crossbar.c:245:56: expected unsigned int [usertype] *out_value
+ drivers/irqchip/irq-crossbar.c:245:56: got int *<noident>
+
+ drivers/irqchip/irq-crossbar.c:263:56: warning: incorrect type in argument 4 (different signedness)
+ drivers/irqchip/irq-crossbar.c:263:56: expected unsigned int [usertype] *out_value
+ drivers/irqchip/irq-crossbar.c:263:56: got int *<noident>
+
+Signed-off-by: Franck Demathieu <fdemathieu@gmail.com>
+Cc: marc.zyngier@arm.com
+Cc: jason@lakedaemon.net
+Link: http://lkml.kernel.org/r/20170223094855.6546-1-fdemathieu@gmail.com
+Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
+Signed-off-by: Sasha Levin <alexander.levin@verizon.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/irqchip/irq-crossbar.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+--- a/drivers/irqchip/irq-crossbar.c
++++ b/drivers/irqchip/irq-crossbar.c
+@@ -198,7 +198,8 @@ static const struct irq_domain_ops cross
+
+ static int __init crossbar_of_init(struct device_node *node)
+ {
+- int i, size, max = 0, reserved = 0, entry;
++ int i, size, reserved = 0;
++ u32 max = 0, entry;
+ const __be32 *irqsr;
+ int ret = -ENOMEM;
+
--- /dev/null
+From foo@baz Thu Oct 19 15:15:46 CEST 2017
+From: Peter Zijlstra <peterz@infradead.org>
+Date: Wed, 1 Mar 2017 16:23:30 +0100
+Subject: locking/lockdep: Add nest_lock integrity test
+
+From: Peter Zijlstra <peterz@infradead.org>
+
+
+[ Upstream commit 7fb4a2cea6b18dab56d609530d077f168169ed6b ]
+
+Boqun reported that hlock->references can overflow. Add a debug test
+for that to generate a clear error when this happens.
+
+Without this, lockdep is likely to report a mysterious failure on
+unlock.
+
+Reported-by: Boqun Feng <boqun.feng@gmail.com>
+Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
+Cc: Andrew Morton <akpm@linux-foundation.org>
+Cc: Chris Wilson <chris@chris-wilson.co.uk>
+Cc: Linus Torvalds <torvalds@linux-foundation.org>
+Cc: Nicolai Hähnle <Nicolai.Haehnle@amd.com>
+Cc: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
+Cc: Peter Zijlstra <peterz@infradead.org>
+Cc: Thomas Gleixner <tglx@linutronix.de>
+Cc: linux-kernel@vger.kernel.org
+Signed-off-by: Ingo Molnar <mingo@kernel.org>
+Signed-off-by: Sasha Levin <alexander.levin@verizon.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ kernel/locking/lockdep.c | 11 +++++++++--
+ 1 file changed, 9 insertions(+), 2 deletions(-)
+
+--- a/kernel/locking/lockdep.c
++++ b/kernel/locking/lockdep.c
+@@ -3128,10 +3128,17 @@ static int __lock_acquire(struct lockdep
+ if (depth) {
+ hlock = curr->held_locks + depth - 1;
+ if (hlock->class_idx == class_idx && nest_lock) {
+- if (hlock->references)
++ if (hlock->references) {
++ /*
++ * Check: unsigned int references:12, overflow.
++ */
++ if (DEBUG_LOCKS_WARN_ON(hlock->references == (1 << 12)-1))
++ return 0;
++
+ hlock->references++;
+- else
++ } else {
+ hlock->references = 2;
++ }
+
+ return 1;
+ }
--- /dev/null
+From foo@baz Thu Oct 19 15:15:46 CEST 2017
+From: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
+Date: Mon, 20 Feb 2017 14:24:36 +0100
+Subject: mac80211: fix power saving clients handling in iwlwifi
+
+From: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
+
+
+[ Upstream commit d98937f4ea713d21e0fcc345919f86c877dd8d6f ]
+
+iwlwifi now supports RSS and can't let mac80211 track the
+PS state based on the Rx frames since they can come out of
+order. iwlwifi is now advertising AP_LINK_PS, and uses
+explicit notifications to teach mac80211 about the PS state
+of the stations and the PS poll / uAPSD trigger frames
+coming our way from the peers.
+
+Because of that, the TIM stopped being maintained in
+mac80211. I tried to fix this in commit c68df2e7be0c
+("mac80211: allow using AP_LINK_PS with mac80211-generated TIM IE")
+but that was later reverted by Felix in commit 6c18a6b4e799
+("Revert "mac80211: allow using AP_LINK_PS with mac80211-generated TIM IE")
+since it broke drivers that do not implement set_tim.
+
+Since none of the drivers that set AP_LINK_PS have the
+set_tim() handler set besides iwlwifi, I can bail out in
+__sta_info_recalc_tim if AP_LINK_PS AND .set_tim is not
+implemented.
+
+Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
+Signed-off-by: Johannes Berg <johannes.berg@intel.com>
+Signed-off-by: Sasha Levin <alexander.levin@verizon.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ net/mac80211/sta_info.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/net/mac80211/sta_info.c
++++ b/net/mac80211/sta_info.c
+@@ -661,7 +661,7 @@ static void __sta_info_recalc_tim(struct
+ }
+
+ /* No need to do anything if the driver does all */
+- if (ieee80211_hw_check(&local->hw, AP_LINK_PS))
++ if (ieee80211_hw_check(&local->hw, AP_LINK_PS) && !local->ops->set_tim)
+ return;
+
+ if (sta->dead)
--- /dev/null
+From foo@baz Thu Oct 19 15:15:46 CEST 2017
+From: Johannes Berg <johannes.berg@intel.com>
+Date: Mon, 27 Feb 2017 17:15:28 +0100
+Subject: mac80211_hwsim: check HWSIM_ATTR_RADIO_NAME length
+
+From: Johannes Berg <johannes.berg@intel.com>
+
+
+[ Upstream commit ff4dd73dd2b4806419f8ff65cbce11d5019548d0 ]
+
+Unfortunately, the nla policy was defined to have HWSIM_ATTR_RADIO_NAME
+as an NLA_STRING, rather than NLA_NUL_STRING, so we can't use it as a
+NUL-terminated string in the kernel.
+
+Rather than break the API, kasprintf() the string to a new buffer to
+guarantee NUL termination.
+
+Reported-by: Andrew Zaborowski <andrew.zaborowski@intel.com>
+Signed-off-by: Johannes Berg <johannes.berg@intel.com>
+Signed-off-by: Sasha Levin <alexander.levin@verizon.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/net/wireless/mac80211_hwsim.c | 28 +++++++++++++++++++++-------
+ 1 file changed, 21 insertions(+), 7 deletions(-)
+
+--- a/drivers/net/wireless/mac80211_hwsim.c
++++ b/drivers/net/wireless/mac80211_hwsim.c
+@@ -2884,6 +2884,7 @@ static int hwsim_register_received_nl(st
+ static int hwsim_new_radio_nl(struct sk_buff *msg, struct genl_info *info)
+ {
+ struct hwsim_new_radio_params param = { 0 };
++ const char *hwname = NULL;
+
+ param.reg_strict = info->attrs[HWSIM_ATTR_REG_STRICT_REG];
+ param.p2p_device = info->attrs[HWSIM_ATTR_SUPPORT_P2P_DEVICE];
+@@ -2897,8 +2898,14 @@ static int hwsim_new_radio_nl(struct sk_
+ if (info->attrs[HWSIM_ATTR_NO_VIF])
+ param.no_vif = true;
+
+- if (info->attrs[HWSIM_ATTR_RADIO_NAME])
+- param.hwname = nla_data(info->attrs[HWSIM_ATTR_RADIO_NAME]);
++ if (info->attrs[HWSIM_ATTR_RADIO_NAME]) {
++ hwname = kasprintf(GFP_KERNEL, "%.*s",
++ nla_len(info->attrs[HWSIM_ATTR_RADIO_NAME]),
++ (char *)nla_data(info->attrs[HWSIM_ATTR_RADIO_NAME]));
++ if (!hwname)
++ return -ENOMEM;
++ param.hwname = hwname;
++ }
+
+ if (info->attrs[HWSIM_ATTR_USE_CHANCTX])
+ param.use_chanctx = true;
+@@ -2926,11 +2933,15 @@ static int hwsim_del_radio_nl(struct sk_
+ s64 idx = -1;
+ const char *hwname = NULL;
+
+- if (info->attrs[HWSIM_ATTR_RADIO_ID])
++ if (info->attrs[HWSIM_ATTR_RADIO_ID]) {
+ idx = nla_get_u32(info->attrs[HWSIM_ATTR_RADIO_ID]);
+- else if (info->attrs[HWSIM_ATTR_RADIO_NAME])
+- hwname = (void *)nla_data(info->attrs[HWSIM_ATTR_RADIO_NAME]);
+- else
++ } else if (info->attrs[HWSIM_ATTR_RADIO_NAME]) {
++ hwname = kasprintf(GFP_KERNEL, "%.*s",
++ nla_len(info->attrs[HWSIM_ATTR_RADIO_NAME]),
++ (char *)nla_data(info->attrs[HWSIM_ATTR_RADIO_NAME]));
++ if (!hwname)
++ return -ENOMEM;
++ } else
+ return -EINVAL;
+
+ spin_lock_bh(&hwsim_radio_lock);
+@@ -2939,7 +2950,8 @@ static int hwsim_del_radio_nl(struct sk_
+ if (data->idx != idx)
+ continue;
+ } else {
+- if (strcmp(hwname, wiphy_name(data->hw->wiphy)))
++ if (!hwname ||
++ strcmp(hwname, wiphy_name(data->hw->wiphy)))
+ continue;
+ }
+
+@@ -2947,10 +2959,12 @@ static int hwsim_del_radio_nl(struct sk_
+ spin_unlock_bh(&hwsim_radio_lock);
+ mac80211_hwsim_del_radio(data, wiphy_name(data->hw->wiphy),
+ info);
++ kfree(hwname);
+ return 0;
+ }
+ spin_unlock_bh(&hwsim_radio_lock);
+
++ kfree(hwname);
+ return -ENODEV;
+ }
+
--- /dev/null
+From foo@baz Thu Oct 19 15:15:46 CEST 2017
+From: Shaohua Li <shli@fb.com>
+Date: Tue, 21 Feb 2017 11:57:01 -0800
+Subject: md/linear: shutup lockdep warnning
+
+From: Shaohua Li <shli@fb.com>
+
+
+[ Upstream commit d939cdfde34f50b95254b375f498447c82190b3e ]
+
+Commit 03a9e24(md linear: fix a race between linear_add() and
+linear_congested()) introduces the warnning.
+
+Acked-by: Coly Li <colyli@suse.de>
+Signed-off-by: Shaohua Li <shli@fb.com>
+Signed-off-by: Sasha Levin <alexander.levin@verizon.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/md/linear.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+--- a/drivers/md/linear.c
++++ b/drivers/md/linear.c
+@@ -223,7 +223,8 @@ static int linear_add(struct mddev *mdde
+ * oldconf until no one uses it anymore.
+ */
+ mddev_suspend(mddev);
+- oldconf = rcu_dereference(mddev->private);
++ oldconf = rcu_dereference_protected(mddev->private,
++ lockdep_is_held(&mddev->reconfig_mutex));
+ mddev->raid_disks++;
+ WARN_ONCE(mddev->raid_disks != newconf->raid_disks,
+ "copied raid_disks doesn't match mddev->raid_disks");
--- /dev/null
+From foo@baz Thu Oct 19 15:15:46 CEST 2017
+From: Majd Dibbiny <majd@mellanox.com>
+Date: Thu, 23 Feb 2017 12:02:43 +0200
+Subject: net/mlx4_core: Fix VF overwrite of module param which disables DMFS on new probed PFs
+
+From: Majd Dibbiny <majd@mellanox.com>
+
+
+[ Upstream commit 95f1ba9a24af9769f6e20dfe9a77c863f253f311 ]
+
+In the VF driver, module parameter mlx4_log_num_mgm_entry_size was
+mistakenly overwritten -- and in a manner which overrode the
+device-managed flow steering option encoded in the parameter.
+
+log_num_mgm_entry_size is a global module parameter which
+affects all ConnectX-3 PFs installed on that host.
+If a VF changes log_num_mgm_entry_size, this will affect all PFs
+which are probed subsequent to the change (by disabling DMFS for
+those PFs).
+
+Fixes: 3c439b5586e9 ("mlx4_core: Allow choosing flow steering mode")
+Signed-off-by: Majd Dibbiny <majd@mellanox.com>
+Reviewed-by: Jack Morgenstein <jackm@dev.mellanox.co.il>
+Signed-off-by: Tariq Toukan <tariqt@mellanox.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <alexander.levin@verizon.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/net/ethernet/mellanox/mlx4/main.c | 2 --
+ 1 file changed, 2 deletions(-)
+
+--- a/drivers/net/ethernet/mellanox/mlx4/main.c
++++ b/drivers/net/ethernet/mellanox/mlx4/main.c
+@@ -791,8 +791,6 @@ static int mlx4_slave_cap(struct mlx4_de
+ return -ENOSYS;
+ }
+
+- mlx4_log_num_mgm_entry_size = hca_param.log_mc_entry_sz;
+-
+ dev->caps.hca_core_clock = hca_param.hca_core_clock;
+
+ memset(&dev_cap, 0, sizeof(dev_cap));
--- /dev/null
+From foo@baz Thu Oct 19 15:15:46 CEST 2017
+From: Eric Dumazet <edumazet@google.com>
+Date: Thu, 23 Feb 2017 15:22:43 -0800
+Subject: net/mlx4_en: fix overflow in mlx4_en_init_timestamp()
+
+From: Eric Dumazet <edumazet@google.com>
+
+
+[ Upstream commit 47d3a07528ecbbccf53bc4390d70b4e3d1c04fcf ]
+
+The cited commit makes a great job of finding optimal shift/multiplier
+values assuming a 10 seconds wrap around, but forgot to change the
+overflow_period computation.
+
+It overflows in cyclecounter_cyc2ns(), and the final result is 804 ms,
+which is silly.
+
+Lets simply use 5 seconds, no need to recompute this, given how it is
+supposed to work.
+
+Later, we will use a timer instead of a work queue, since the new RX
+allocation schem will no longer need mlx4_en_recover_from_oom() and the
+service_task firing every 250 ms.
+
+Fixes: 31c128b66e5b ("net/mlx4_en: Choose time-stamping shift value according to HW frequency")
+Signed-off-by: Eric Dumazet <edumazet@google.com>
+Cc: Tariq Toukan <tariqt@mellanox.com>
+Cc: Eugenia Emantayev <eugenia@mellanox.com>
+Reviewed-by: Tariq Toukan <tariqt@mellanox.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <alexander.levin@verizon.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/net/ethernet/mellanox/mlx4/en_clock.c | 18 ++++++++----------
+ drivers/net/ethernet/mellanox/mlx4/mlx4_en.h | 1 -
+ 2 files changed, 8 insertions(+), 11 deletions(-)
+
+--- a/drivers/net/ethernet/mellanox/mlx4/en_clock.c
++++ b/drivers/net/ethernet/mellanox/mlx4/en_clock.c
+@@ -88,10 +88,17 @@ void mlx4_en_remove_timestamp(struct mlx
+ }
+ }
+
++#define MLX4_EN_WRAP_AROUND_SEC 10UL
++/* By scheduling the overflow check every 5 seconds, we have a reasonably
++ * good chance we wont miss a wrap around.
++ * TOTO: Use a timer instead of a work queue to increase the guarantee.
++ */
++#define MLX4_EN_OVERFLOW_PERIOD (MLX4_EN_WRAP_AROUND_SEC * HZ / 2)
++
+ void mlx4_en_ptp_overflow_check(struct mlx4_en_dev *mdev)
+ {
+ bool timeout = time_is_before_jiffies(mdev->last_overflow_check +
+- mdev->overflow_period);
++ MLX4_EN_OVERFLOW_PERIOD);
+ unsigned long flags;
+
+ if (timeout) {
+@@ -236,7 +243,6 @@ static const struct ptp_clock_info mlx4_
+ .enable = mlx4_en_phc_enable,
+ };
+
+-#define MLX4_EN_WRAP_AROUND_SEC 10ULL
+
+ /* This function calculates the max shift that enables the user range
+ * of MLX4_EN_WRAP_AROUND_SEC values in the cycles register.
+@@ -258,7 +264,6 @@ void mlx4_en_init_timestamp(struct mlx4_
+ {
+ struct mlx4_dev *dev = mdev->dev;
+ unsigned long flags;
+- u64 ns, zero = 0;
+
+ /* mlx4_en_init_timestamp is called for each netdev.
+ * mdev->ptp_clock is common for all ports, skip initialization if
+@@ -282,13 +287,6 @@ void mlx4_en_init_timestamp(struct mlx4_
+ ktime_to_ns(ktime_get_real()));
+ write_unlock_irqrestore(&mdev->clock_lock, flags);
+
+- /* Calculate period in seconds to call the overflow watchdog - to make
+- * sure counter is checked at least once every wrap around.
+- */
+- ns = cyclecounter_cyc2ns(&mdev->cycles, mdev->cycles.mask, zero, &zero);
+- do_div(ns, NSEC_PER_SEC / 2 / HZ);
+- mdev->overflow_period = ns;
+-
+ /* Configure the PHC */
+ mdev->ptp_clock_info = mlx4_en_ptp_clock_info;
+ snprintf(mdev->ptp_clock_info.name, 16, "mlx4 ptp");
+--- a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h
++++ b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h
+@@ -409,7 +409,6 @@ struct mlx4_en_dev {
+ struct cyclecounter cycles;
+ struct timecounter clock;
+ unsigned long last_overflow_check;
+- unsigned long overflow_period;
+ struct ptp_clock *ptp_clock;
+ struct ptp_clock_info ptp_clock_info;
+ struct notifier_block nb;
--- /dev/null
+From foo@baz Thu Oct 19 15:15:46 CEST 2017
+From: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
+Date: Tue, 21 Feb 2017 11:28:05 +0100
+Subject: net: mvpp2: release reference to txq_cpu[] entry after unmapping
+
+From: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
+
+
+[ Upstream commit 36fb7435b6ac4d288a2d4deea8934f9456ab46b6 ]
+
+The mvpp2_txq_bufs_free() function is called upon TX completion to DMA
+unmap TX buffers, and free the corresponding SKBs. It gets the
+references to the SKB to free and the DMA buffer to unmap from a per-CPU
+txq_pcpu data structure.
+
+However, the code currently increments the pointer to the next entry
+before doing the DMA unmap and freeing the SKB. It does not cause any
+visible problem because for a given SKB the TX completion is guaranteed
+to take place on the CPU where the TX was started. However, it is much
+more logical to increment the pointer to the next entry once the current
+entry has been completely unmapped/released.
+
+Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
+Acked-by: Russell King <rmk+kernel@armlinux.org.uk>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <alexander.levin@verizon.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/net/ethernet/marvell/mvpp2.c | 9 ++++-----
+ 1 file changed, 4 insertions(+), 5 deletions(-)
+
+--- a/drivers/net/ethernet/marvell/mvpp2.c
++++ b/drivers/net/ethernet/marvell/mvpp2.c
+@@ -4415,13 +4415,12 @@ static void mvpp2_txq_bufs_free(struct m
+ struct mvpp2_txq_pcpu_buf *tx_buf =
+ txq_pcpu->buffs + txq_pcpu->txq_get_index;
+
+- mvpp2_txq_inc_get(txq_pcpu);
+-
+ dma_unmap_single(port->dev->dev.parent, tx_buf->phys,
+ tx_buf->size, DMA_TO_DEVICE);
+- if (!tx_buf->skb)
+- continue;
+- dev_kfree_skb_any(tx_buf->skb);
++ if (tx_buf->skb)
++ dev_kfree_skb_any(tx_buf->skb);
++
++ mvpp2_txq_inc_get(txq_pcpu);
+ }
+ }
+
--- /dev/null
+From foo@baz Thu Oct 19 15:15:46 CEST 2017
+From: Jarno Rajahalme <jarno@ovn.org>
+Date: Thu, 23 Feb 2017 17:08:54 -0800
+Subject: netfilter: nf_ct_expect: Change __nf_ct_expect_check() return value.
+
+From: Jarno Rajahalme <jarno@ovn.org>
+
+
+[ Upstream commit 4b86c459c7bee3acaf92f0e2b4c6ac803eaa1a58 ]
+
+Commit 4dee62b1b9b4 ("netfilter: nf_ct_expect: nf_ct_expect_insert()
+returns void") inadvertently changed the successful return value of
+nf_ct_expect_related_report() from 0 to 1 due to
+__nf_ct_expect_check() returning 1 on success. Prevent this
+regression in the future by changing the return value of
+__nf_ct_expect_check() to 0 on success.
+
+Signed-off-by: Jarno Rajahalme <jarno@ovn.org>
+Acked-by: Joe Stringer <joe@ovn.org>
+Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
+Signed-off-by: Sasha Levin <alexander.levin@verizon.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ net/netfilter/nf_conntrack_expect.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+--- a/net/netfilter/nf_conntrack_expect.c
++++ b/net/netfilter/nf_conntrack_expect.c
+@@ -395,7 +395,7 @@ static inline int __nf_ct_expect_check(s
+ struct net *net = nf_ct_exp_net(expect);
+ struct hlist_node *next;
+ unsigned int h;
+- int ret = 1;
++ int ret = 0;
+
+ if (!master_help) {
+ ret = -ESHUTDOWN;
+@@ -445,7 +445,7 @@ int nf_ct_expect_related_report(struct n
+
+ spin_lock_bh(&nf_conntrack_expect_lock);
+ ret = __nf_ct_expect_check(expect);
+- if (ret <= 0)
++ if (ret < 0)
+ goto out;
+
+ ret = nf_ct_expect_insert(expect);
--- /dev/null
+From foo@baz Thu Oct 19 15:15:46 CEST 2017
+From: Kinglong Mee <kinglongmee@gmail.com>
+Date: Sun, 5 Feb 2017 09:57:07 +0800
+Subject: nfsd/callback: Cleanup callback cred on shutdown
+
+From: Kinglong Mee <kinglongmee@gmail.com>
+
+
+[ Upstream commit f7d1ddbe7648af7460d23688c8c131342eb43b3a ]
+
+The rpccred gotten from rpc_lookup_machine_cred() should be put when
+state is shutdown.
+
+Signed-off-by: Kinglong Mee <kinglongmee@gmail.com>
+Signed-off-by: J. Bruce Fields <bfields@redhat.com>
+Signed-off-by: Sasha Levin <alexander.levin@verizon.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ fs/nfsd/nfs4callback.c | 8 ++++++++
+ fs/nfsd/nfs4state.c | 10 ++++++----
+ fs/nfsd/state.h | 1 +
+ 3 files changed, 15 insertions(+), 4 deletions(-)
+
+--- a/fs/nfsd/nfs4callback.c
++++ b/fs/nfsd/nfs4callback.c
+@@ -696,6 +696,14 @@ int set_callback_cred(void)
+ return 0;
+ }
+
++void cleanup_callback_cred(void)
++{
++ if (callback_cred) {
++ put_rpccred(callback_cred);
++ callback_cred = NULL;
++ }
++}
++
+ static struct rpc_cred *get_backchannel_cred(struct nfs4_client *clp, struct rpc_clnt *client, struct nfsd4_session *ses)
+ {
+ if (clp->cl_minorversion == 0) {
+--- a/fs/nfsd/nfs4state.c
++++ b/fs/nfsd/nfs4state.c
+@@ -6792,23 +6792,24 @@ nfs4_state_start(void)
+
+ ret = set_callback_cred();
+ if (ret)
+- return -ENOMEM;
++ return ret;
++
+ laundry_wq = alloc_workqueue("%s", WQ_UNBOUND, 0, "nfsd4");
+ if (laundry_wq == NULL) {
+ ret = -ENOMEM;
+- goto out_recovery;
++ goto out_cleanup_cred;
+ }
+ ret = nfsd4_create_callback_queue();
+ if (ret)
+ goto out_free_laundry;
+
+ set_max_delegations();
+-
+ return 0;
+
+ out_free_laundry:
+ destroy_workqueue(laundry_wq);
+-out_recovery:
++out_cleanup_cred:
++ cleanup_callback_cred();
+ return ret;
+ }
+
+@@ -6847,6 +6848,7 @@ nfs4_state_shutdown(void)
+ {
+ destroy_workqueue(laundry_wq);
+ nfsd4_destroy_callback_queue();
++ cleanup_callback_cred();
+ }
+
+ static void
+--- a/fs/nfsd/state.h
++++ b/fs/nfsd/state.h
+@@ -595,6 +595,7 @@ extern struct nfs4_client_reclaim *nfsd4
+ extern __be32 nfs4_check_open_reclaim(clientid_t *clid,
+ struct nfsd4_compound_state *cstate, struct nfsd_net *nn);
+ extern int set_callback_cred(void);
++extern void cleanup_callback_cred(void);
+ extern void nfsd4_probe_callback(struct nfs4_client *clp);
+ extern void nfsd4_probe_callback_sync(struct nfs4_client *clp);
+ extern void nfsd4_change_callback(struct nfs4_client *clp, struct nfs4_cb_conn *);
--- /dev/null
+From foo@baz Thu Oct 19 15:15:46 CEST 2017
+From: Eric Ren <zren@suse.com>
+Date: Wed, 22 Feb 2017 15:40:41 -0800
+Subject: ocfs2/dlmglue: prepare tracking logic to avoid recursive cluster lock
+
+From: Eric Ren <zren@suse.com>
+
+
+[ Upstream commit 439a36b8ef38657f765b80b775e2885338d72451 ]
+
+We are in the situation that we have to avoid recursive cluster locking,
+but there is no way to check if a cluster lock has been taken by a precess
+already.
+
+Mostly, we can avoid recursive locking by writing code carefully.
+However, we found that it's very hard to handle the routines that are
+invoked directly by vfs code. For instance:
+
+ const struct inode_operations ocfs2_file_iops = {
+ .permission = ocfs2_permission,
+ .get_acl = ocfs2_iop_get_acl,
+ .set_acl = ocfs2_iop_set_acl,
+ };
+
+Both ocfs2_permission() and ocfs2_iop_get_acl() call ocfs2_inode_lock(PR):
+
+ do_sys_open
+ may_open
+ inode_permission
+ ocfs2_permission
+ ocfs2_inode_lock() <=== first time
+ generic_permission
+ get_acl
+ ocfs2_iop_get_acl
+ ocfs2_inode_lock() <=== recursive one
+
+A deadlock will occur if a remote EX request comes in between two of
+ocfs2_inode_lock(). Briefly describe how the deadlock is formed:
+
+On one hand, OCFS2_LOCK_BLOCKED flag of this lockres is set in
+BAST(ocfs2_generic_handle_bast) when downconvert is started on behalf of
+the remote EX lock request. Another hand, the recursive cluster lock
+(the second one) will be blocked in in __ocfs2_cluster_lock() because of
+OCFS2_LOCK_BLOCKED. But, the downconvert never complete, why? because
+there is no chance for the first cluster lock on this node to be
+unlocked - we block ourselves in the code path.
+
+The idea to fix this issue is mostly taken from gfs2 code.
+
+1. introduce a new field: struct ocfs2_lock_res.l_holders, to keep track
+ of the processes' pid who has taken the cluster lock of this lock
+ resource;
+
+2. introduce a new flag for ocfs2_inode_lock_full:
+ OCFS2_META_LOCK_GETBH; it means just getting back disk inode bh for
+ us if we've got cluster lock.
+
+3. export a helper: ocfs2_is_locked_by_me() is used to check if we have
+ got the cluster lock in the upper code path.
+
+The tracking logic should be used by some of the ocfs2 vfs's callbacks,
+to solve the recursive locking issue cuased by the fact that vfs
+routines can call into each other.
+
+The performance penalty of processing the holder list should only be
+seen at a few cases where the tracking logic is used, such as get/set
+acl.
+
+You may ask what if the first time we got a PR lock, and the second time
+we want a EX lock? fortunately, this case never happens in the real
+world, as far as I can see, including permission check,
+(get|set)_(acl|attr), and the gfs2 code also do so.
+
+[sfr@canb.auug.org.au remove some inlines]
+Link: http://lkml.kernel.org/r/20170117100948.11657-2-zren@suse.com
+Signed-off-by: Eric Ren <zren@suse.com>
+Reviewed-by: Junxiao Bi <junxiao.bi@oracle.com>
+Reviewed-by: Joseph Qi <jiangqi903@gmail.com>
+Cc: Stephen Rothwell <sfr@canb.auug.org.au>
+Cc: Mark Fasheh <mfasheh@versity.com>
+Cc: Joel Becker <jlbec@evilplan.org>
+Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
+Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+
+Signed-off-by: Sasha Levin <alexander.levin@verizon.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ fs/ocfs2/dlmglue.c | 105 +++++++++++++++++++++++++++++++++++++++++++++++++++--
+ fs/ocfs2/dlmglue.h | 18 +++++++++
+ fs/ocfs2/ocfs2.h | 1
+ 3 files changed, 121 insertions(+), 3 deletions(-)
+
+--- a/fs/ocfs2/dlmglue.c
++++ b/fs/ocfs2/dlmglue.c
+@@ -531,6 +531,7 @@ void ocfs2_lock_res_init_once(struct ocf
+ init_waitqueue_head(&res->l_event);
+ INIT_LIST_HEAD(&res->l_blocked_list);
+ INIT_LIST_HEAD(&res->l_mask_waiters);
++ INIT_LIST_HEAD(&res->l_holders);
+ }
+
+ void ocfs2_inode_lock_res_init(struct ocfs2_lock_res *res,
+@@ -748,6 +749,50 @@ void ocfs2_lock_res_free(struct ocfs2_lo
+ res->l_flags = 0UL;
+ }
+
++/*
++ * Keep a list of processes who have interest in a lockres.
++ * Note: this is now only uesed for check recursive cluster locking.
++ */
++static inline void ocfs2_add_holder(struct ocfs2_lock_res *lockres,
++ struct ocfs2_lock_holder *oh)
++{
++ INIT_LIST_HEAD(&oh->oh_list);
++ oh->oh_owner_pid = get_pid(task_pid(current));
++
++ spin_lock(&lockres->l_lock);
++ list_add_tail(&oh->oh_list, &lockres->l_holders);
++ spin_unlock(&lockres->l_lock);
++}
++
++static inline void ocfs2_remove_holder(struct ocfs2_lock_res *lockres,
++ struct ocfs2_lock_holder *oh)
++{
++ spin_lock(&lockres->l_lock);
++ list_del(&oh->oh_list);
++ spin_unlock(&lockres->l_lock);
++
++ put_pid(oh->oh_owner_pid);
++}
++
++static inline int ocfs2_is_locked_by_me(struct ocfs2_lock_res *lockres)
++{
++ struct ocfs2_lock_holder *oh;
++ struct pid *pid;
++
++ /* look in the list of holders for one with the current task as owner */
++ spin_lock(&lockres->l_lock);
++ pid = task_pid(current);
++ list_for_each_entry(oh, &lockres->l_holders, oh_list) {
++ if (oh->oh_owner_pid == pid) {
++ spin_unlock(&lockres->l_lock);
++ return 1;
++ }
++ }
++ spin_unlock(&lockres->l_lock);
++
++ return 0;
++}
++
+ static inline void ocfs2_inc_holders(struct ocfs2_lock_res *lockres,
+ int level)
+ {
+@@ -2343,8 +2388,9 @@ int ocfs2_inode_lock_full_nested(struct
+ goto getbh;
+ }
+
+- if (ocfs2_mount_local(osb))
+- goto local;
++ if ((arg_flags & OCFS2_META_LOCK_GETBH) ||
++ ocfs2_mount_local(osb))
++ goto update;
+
+ if (!(arg_flags & OCFS2_META_LOCK_RECOVERY))
+ ocfs2_wait_for_recovery(osb);
+@@ -2373,7 +2419,7 @@ int ocfs2_inode_lock_full_nested(struct
+ if (!(arg_flags & OCFS2_META_LOCK_RECOVERY))
+ ocfs2_wait_for_recovery(osb);
+
+-local:
++update:
+ /*
+ * We only see this flag if we're being called from
+ * ocfs2_read_locked_inode(). It means we're locking an inode
+@@ -2515,6 +2561,59 @@ void ocfs2_inode_unlock(struct inode *in
+ ocfs2_cluster_unlock(OCFS2_SB(inode->i_sb), lockres, level);
+ }
+
++/*
++ * This _tracker variantes are introduced to deal with the recursive cluster
++ * locking issue. The idea is to keep track of a lock holder on the stack of
++ * the current process. If there's a lock holder on the stack, we know the
++ * task context is already protected by cluster locking. Currently, they're
++ * used in some VFS entry routines.
++ *
++ * return < 0 on error, return == 0 if there's no lock holder on the stack
++ * before this call, return == 1 if this call would be a recursive locking.
++ */
++int ocfs2_inode_lock_tracker(struct inode *inode,
++ struct buffer_head **ret_bh,
++ int ex,
++ struct ocfs2_lock_holder *oh)
++{
++ int status;
++ int arg_flags = 0, has_locked;
++ struct ocfs2_lock_res *lockres;
++
++ lockres = &OCFS2_I(inode)->ip_inode_lockres;
++ has_locked = ocfs2_is_locked_by_me(lockres);
++ /* Just get buffer head if the cluster lock has been taken */
++ if (has_locked)
++ arg_flags = OCFS2_META_LOCK_GETBH;
++
++ if (likely(!has_locked || ret_bh)) {
++ status = ocfs2_inode_lock_full(inode, ret_bh, ex, arg_flags);
++ if (status < 0) {
++ if (status != -ENOENT)
++ mlog_errno(status);
++ return status;
++ }
++ }
++ if (!has_locked)
++ ocfs2_add_holder(lockres, oh);
++
++ return has_locked;
++}
++
++void ocfs2_inode_unlock_tracker(struct inode *inode,
++ int ex,
++ struct ocfs2_lock_holder *oh,
++ int had_lock)
++{
++ struct ocfs2_lock_res *lockres;
++
++ lockres = &OCFS2_I(inode)->ip_inode_lockres;
++ if (!had_lock) {
++ ocfs2_remove_holder(lockres, oh);
++ ocfs2_inode_unlock(inode, ex);
++ }
++}
++
+ int ocfs2_orphan_scan_lock(struct ocfs2_super *osb, u32 *seqno)
+ {
+ struct ocfs2_lock_res *lockres;
+--- a/fs/ocfs2/dlmglue.h
++++ b/fs/ocfs2/dlmglue.h
+@@ -70,6 +70,11 @@ struct ocfs2_orphan_scan_lvb {
+ __be32 lvb_os_seqno;
+ };
+
++struct ocfs2_lock_holder {
++ struct list_head oh_list;
++ struct pid *oh_owner_pid;
++};
++
+ /* ocfs2_inode_lock_full() 'arg_flags' flags */
+ /* don't wait on recovery. */
+ #define OCFS2_META_LOCK_RECOVERY (0x01)
+@@ -77,6 +82,8 @@ struct ocfs2_orphan_scan_lvb {
+ #define OCFS2_META_LOCK_NOQUEUE (0x02)
+ /* don't block waiting for the downconvert thread, instead return -EAGAIN */
+ #define OCFS2_LOCK_NONBLOCK (0x04)
++/* just get back disk inode bh if we've got cluster lock. */
++#define OCFS2_META_LOCK_GETBH (0x08)
+
+ /* Locking subclasses of inode cluster lock */
+ enum {
+@@ -170,4 +177,15 @@ void ocfs2_put_dlm_debug(struct ocfs2_dl
+
+ /* To set the locking protocol on module initialization */
+ void ocfs2_set_locking_protocol(void);
++
++/* The _tracker pair is used to avoid cluster recursive locking */
++int ocfs2_inode_lock_tracker(struct inode *inode,
++ struct buffer_head **ret_bh,
++ int ex,
++ struct ocfs2_lock_holder *oh);
++void ocfs2_inode_unlock_tracker(struct inode *inode,
++ int ex,
++ struct ocfs2_lock_holder *oh,
++ int had_lock);
++
+ #endif /* DLMGLUE_H */
+--- a/fs/ocfs2/ocfs2.h
++++ b/fs/ocfs2/ocfs2.h
+@@ -172,6 +172,7 @@ struct ocfs2_lock_res {
+
+ struct list_head l_blocked_list;
+ struct list_head l_mask_waiters;
++ struct list_head l_holders;
+
+ unsigned long l_flags;
+ char l_name[OCFS2_LOCK_ID_MAX_LEN];
--- /dev/null
+From foo@baz Thu Oct 19 15:15:46 CEST 2017
+From: Dan Carpenter <dan.carpenter@oracle.com>
+Date: Tue, 21 Feb 2017 21:46:37 +0300
+Subject: scsi: scsi_dh_emc: return success in clariion_std_inquiry()
+
+From: Dan Carpenter <dan.carpenter@oracle.com>
+
+
+[ Upstream commit 4d7d39a18b8b81511f0b893b7d2203790bf8a58b ]
+
+We accidentally return an uninitialized variable on success.
+
+Fixes: b6ff1b14cdf4 ("[SCSI] scsi_dh: Update EMC handler")
+Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
+Reviewed-by: Hannes Reinecke <hare@suse.de>
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+Signed-off-by: Sasha Levin <alexander.levin@verizon.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/scsi/device_handler/scsi_dh_emc.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/drivers/scsi/device_handler/scsi_dh_emc.c
++++ b/drivers/scsi/device_handler/scsi_dh_emc.c
+@@ -456,7 +456,7 @@ static int clariion_prep_fn(struct scsi_
+ static int clariion_std_inquiry(struct scsi_device *sdev,
+ struct clariion_dh_data *csdev)
+ {
+- int err;
++ int err = SCSI_DH_OK;
+ char *sp_model;
+
+ err = send_inquiry_cmd(sdev, 0, csdev);
net-set-sk_prot_creator-when-cloning-sockets-to-the-right-proto.patch
tipc-use-only-positive-error-codes-in-messages.patch
revert-bsg-lib-don-t-free-job-in-bsg_prepare_job.patch
+locking-lockdep-add-nest_lock-integrity-test.patch
+watchdog-kempld-fix-gcc-4.3-build.patch
+irqchip-crossbar-fix-incorrect-type-of-local-variables.patch
+mac80211_hwsim-check-hwsim_attr_radio_name-length.patch
+mac80211-fix-power-saving-clients-handling-in-iwlwifi.patch
+net-mlx4_en-fix-overflow-in-mlx4_en_init_timestamp.patch
+netfilter-nf_ct_expect-change-__nf_ct_expect_check-return-value.patch
+iio-adc-xilinx-fix-error-handling.patch
+btrfs-send-fix-failure-to-rename-top-level-inode-due-to-name-collision.patch
+f2fs-do-not-wait-for-writeback-in-write_begin.patch
+md-linear-shutup-lockdep-warnning.patch
+sparc64-migrate-hvcons-irq-to-panicked-cpu.patch
+net-mlx4_core-fix-vf-overwrite-of-module-param-which-disables-dmfs-on-new-probed-pfs.patch
+crypto-xts-add-ecb-dependency.patch
+ocfs2-dlmglue-prepare-tracking-logic-to-avoid-recursive-cluster-lock.patch
+slub-do-not-merge-cache-if-slub_debug-contains-a-never-merge-flag.patch
+scsi-scsi_dh_emc-return-success-in-clariion_std_inquiry.patch
+net-mvpp2-release-reference-to-txq_cpu-entry-after-unmapping.patch
+i2c-at91-ensure-state-is-restored-after-suspending.patch
+ceph-clean-up-unsafe-d_parent-accesses-in-build_dentry_path.patch
+uapi-fix-linux-rds.h-userspace-compilation-errors.patch
+uapi-fix-linux-mroute6.h-userspace-compilation-errors.patch
+target-iscsi-fix-unsolicited-data-seq_end_offset-calculation.patch
+nfsd-callback-cleanup-callback-cred-on-shutdown.patch
+cpufreq-cppc-add-acpi_processor-dependency.patch
--- /dev/null
+From foo@baz Thu Oct 19 15:15:46 CEST 2017
+From: Grygorii Maistrenko <grygoriimkd@gmail.com>
+Date: Wed, 22 Feb 2017 15:40:59 -0800
+Subject: slub: do not merge cache if slub_debug contains a never-merge flag
+
+From: Grygorii Maistrenko <grygoriimkd@gmail.com>
+
+
+[ Upstream commit c6e28895a4372992961888ffaadc9efc643b5bfe ]
+
+In case CONFIG_SLUB_DEBUG_ON=n, find_mergeable() gets debug features from
+commandline but never checks if there are features from the
+SLAB_NEVER_MERGE set.
+
+As a result selected by slub_debug caches are always mergeable if they
+have been created without a custom constructor set or without one of the
+SLAB_* debug features on.
+
+This moves the SLAB_NEVER_MERGE check below the flags update from
+commandline to make sure it won't merge the slab cache if one of the debug
+features is on.
+
+Link: http://lkml.kernel.org/r/20170101124451.GA4740@lp-laptop-d
+Signed-off-by: Grygorii Maistrenko <grygoriimkd@gmail.com>
+Reviewed-by: Pekka Enberg <penberg@kernel.org>
+Acked-by: David Rientjes <rientjes@google.com>
+Acked-by: Christoph Lameter <cl@linux.com>
+Cc: Joonsoo Kim <iamjoonsoo.kim@lge.com>
+Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
+Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+Signed-off-by: Sasha Levin <alexander.levin@verizon.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ mm/slab_common.c | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+--- a/mm/slab_common.c
++++ b/mm/slab_common.c
+@@ -250,7 +250,7 @@ struct kmem_cache *find_mergeable(size_t
+ {
+ struct kmem_cache *s;
+
+- if (slab_nomerge || (flags & SLAB_NEVER_MERGE))
++ if (slab_nomerge)
+ return NULL;
+
+ if (ctor)
+@@ -261,6 +261,9 @@ struct kmem_cache *find_mergeable(size_t
+ size = ALIGN(size, align);
+ flags = kmem_cache_flags(size, flags, name, NULL);
+
++ if (flags & SLAB_NEVER_MERGE)
++ return NULL;
++
+ list_for_each_entry_reverse(s, &slab_caches, list) {
+ if (slab_unmergeable(s))
+ continue;
--- /dev/null
+From foo@baz Thu Oct 19 15:15:46 CEST 2017
+From: Vijay Kumar <vijay.ac.kumar@oracle.com>
+Date: Wed, 1 Feb 2017 11:34:38 -0800
+Subject: sparc64: Migrate hvcons irq to panicked cpu
+
+From: Vijay Kumar <vijay.ac.kumar@oracle.com>
+
+
+[ Upstream commit 7dd4fcf5b70694dc961eb6b954673e4fc9730dbd ]
+
+On panic, all other CPUs are stopped except the one which had
+hit panic. To keep console alive, we need to migrate hvcons irq
+to panicked CPU.
+
+Signed-off-by: Vijay Kumar <vijay.ac.kumar@oracle.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <alexander.levin@verizon.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ arch/sparc/include/asm/setup.h | 5 ++++-
+ arch/sparc/kernel/smp_64.c | 6 +++++-
+ drivers/tty/serial/sunhv.c | 6 ++++++
+ 3 files changed, 15 insertions(+), 2 deletions(-)
+
+--- a/arch/sparc/include/asm/setup.h
++++ b/arch/sparc/include/asm/setup.h
+@@ -59,8 +59,11 @@ extern atomic_t dcpage_flushes;
+ extern atomic_t dcpage_flushes_xcall;
+
+ extern int sysctl_tsb_ratio;
+-#endif
+
++#ifdef CONFIG_SERIAL_SUNHV
++void sunhv_migrate_hvcons_irq(int cpu);
++#endif
++#endif
+ void sun_do_break(void);
+ extern int stop_a_enabled;
+ extern int scons_pwroff;
+--- a/arch/sparc/kernel/smp_64.c
++++ b/arch/sparc/kernel/smp_64.c
+@@ -1443,8 +1443,12 @@ void smp_send_stop(void)
+ int cpu;
+
+ if (tlb_type == hypervisor) {
++ int this_cpu = smp_processor_id();
++#ifdef CONFIG_SERIAL_SUNHV
++ sunhv_migrate_hvcons_irq(this_cpu);
++#endif
+ for_each_online_cpu(cpu) {
+- if (cpu == smp_processor_id())
++ if (cpu == this_cpu)
+ continue;
+ #ifdef CONFIG_SUN_LDOMS
+ if (ldom_domaining_enabled) {
+--- a/drivers/tty/serial/sunhv.c
++++ b/drivers/tty/serial/sunhv.c
+@@ -398,6 +398,12 @@ static struct uart_driver sunhv_reg = {
+
+ static struct uart_port *sunhv_port;
+
++void sunhv_migrate_hvcons_irq(int cpu)
++{
++ /* Migrate hvcons irq to param cpu */
++ irq_force_affinity(sunhv_port->irq, cpumask_of(cpu));
++}
++
+ /* Copy 's' into the con_write_page, decoding "\n" into
+ * "\r\n" along the way. We have to return two lengths
+ * because the caller needs to know how much to advance
--- /dev/null
+From foo@baz Thu Oct 19 15:15:46 CEST 2017
+From: Varun Prakash <varun@chelsio.com>
+Date: Fri, 20 Jan 2017 16:44:33 +0530
+Subject: target/iscsi: Fix unsolicited data seq_end_offset calculation
+
+From: Varun Prakash <varun@chelsio.com>
+
+
+[ Upstream commit 4d65491c269729a1e3b375c45e73213f49103d33 ]
+
+In case of unsolicited data for the first sequence
+seq_end_offset must be set to minimum of total data length
+and FirstBurstLength, so do not add cmd->write_data_done
+to the min of total data length and FirstBurstLength.
+
+This patch avoids that with ImmediateData=Yes, InitialR2T=No,
+MaxXmitDataSegmentLength < FirstBurstLength that a WRITE command
+with IO size above FirstBurstLength triggers sequence error
+messages, for example
+
+Set following parameters on target (linux-4.8.12)
+ImmediateData = Yes
+InitialR2T = No
+MaxXmitDataSegmentLength = 8k
+FirstBurstLength = 64k
+
+Log in from Open iSCSI initiator and execute
+dd if=/dev/zero of=/dev/sdb bs=128k count=1 oflag=direct
+
+Error messages on target
+Command ITT: 0x00000035 with Offset: 65536, Length: 8192 outside
+of Sequence 73728:131072 while DataSequenceInOrder=Yes.
+Command ITT: 0x00000035, received DataSN: 0x00000001 higher than
+expected 0x00000000.
+Unable to perform within-command recovery while ERL=0.
+
+Signed-off-by: Varun Prakash <varun@chelsio.com>
+[ bvanassche: Use min() instead of open-coding it / edited patch description ]
+Signed-off-by: Bart Van Assche <bart.vanassche@sandisk.com>
+Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
+
+Signed-off-by: Sasha Levin <alexander.levin@verizon.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/target/iscsi/iscsi_target_erl0.c | 6 ++----
+ 1 file changed, 2 insertions(+), 4 deletions(-)
+
+--- a/drivers/target/iscsi/iscsi_target_erl0.c
++++ b/drivers/target/iscsi/iscsi_target_erl0.c
+@@ -44,10 +44,8 @@ void iscsit_set_dataout_sequence_values(
+ */
+ if (cmd->unsolicited_data) {
+ cmd->seq_start_offset = cmd->write_data_done;
+- cmd->seq_end_offset = (cmd->write_data_done +
+- ((cmd->se_cmd.data_length >
+- conn->sess->sess_ops->FirstBurstLength) ?
+- conn->sess->sess_ops->FirstBurstLength : cmd->se_cmd.data_length));
++ cmd->seq_end_offset = min(cmd->se_cmd.data_length,
++ conn->sess->sess_ops->FirstBurstLength);
+ return;
+ }
+
--- /dev/null
+From foo@baz Thu Oct 19 15:15:46 CEST 2017
+From: "Dmitry V. Levin" <ldv@altlinux.org>
+Date: Thu, 16 Feb 2017 18:04:29 +0300
+Subject: uapi: fix linux/mroute6.h userspace compilation errors
+
+From: "Dmitry V. Levin" <ldv@altlinux.org>
+
+
+[ Upstream commit 72aa107df6a275cf03359934ca5799a2be7a1bf7 ]
+
+Include <linux/in6.h> to fix the following linux/mroute6.h userspace
+compilation errors:
+
+/usr/include/linux/mroute6.h:80:22: error: field 'mf6cc_origin' has incomplete type
+ struct sockaddr_in6 mf6cc_origin; /* Origin of mcast */
+/usr/include/linux/mroute6.h:81:22: error: field 'mf6cc_mcastgrp' has incomplete type
+ struct sockaddr_in6 mf6cc_mcastgrp; /* Group in question */
+/usr/include/linux/mroute6.h:91:22: error: field 'src' has incomplete type
+ struct sockaddr_in6 src;
+/usr/include/linux/mroute6.h:92:22: error: field 'grp' has incomplete type
+ struct sockaddr_in6 grp;
+/usr/include/linux/mroute6.h:132:18: error: field 'im6_src' has incomplete type
+ struct in6_addr im6_src, im6_dst;
+/usr/include/linux/mroute6.h:132:27: error: field 'im6_dst' has incomplete type
+ struct in6_addr im6_src, im6_dst;
+
+Signed-off-by: Dmitry V. Levin <ldv@altlinux.org>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <alexander.levin@verizon.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ include/uapi/linux/mroute6.h | 1 +
+ 1 file changed, 1 insertion(+)
+
+--- a/include/uapi/linux/mroute6.h
++++ b/include/uapi/linux/mroute6.h
+@@ -3,6 +3,7 @@
+
+ #include <linux/types.h>
+ #include <linux/sockios.h>
++#include <linux/in6.h> /* For struct sockaddr_in6. */
+
+ /*
+ * Based on the MROUTING 3.5 defines primarily to keep
--- /dev/null
+From foo@baz Thu Oct 19 15:15:46 CEST 2017
+From: "Dmitry V. Levin" <ldv@altlinux.org>
+Date: Thu, 16 Feb 2017 18:05:45 +0300
+Subject: uapi: fix linux/rds.h userspace compilation errors
+
+From: "Dmitry V. Levin" <ldv@altlinux.org>
+
+
+[ Upstream commit feb0869d90e51ce8b6fd8a46588465b1b5a26d09 ]
+
+Consistently use types from linux/types.h to fix the following
+linux/rds.h userspace compilation errors:
+
+/usr/include/linux/rds.h:106:2: error: unknown type name 'uint8_t'
+ uint8_t name[32];
+/usr/include/linux/rds.h:107:2: error: unknown type name 'uint64_t'
+ uint64_t value;
+/usr/include/linux/rds.h:117:2: error: unknown type name 'uint64_t'
+ uint64_t next_tx_seq;
+/usr/include/linux/rds.h:118:2: error: unknown type name 'uint64_t'
+ uint64_t next_rx_seq;
+/usr/include/linux/rds.h:121:2: error: unknown type name 'uint8_t'
+ uint8_t transport[TRANSNAMSIZ]; /* null term ascii */
+/usr/include/linux/rds.h:122:2: error: unknown type name 'uint8_t'
+ uint8_t flags;
+/usr/include/linux/rds.h:129:2: error: unknown type name 'uint64_t'
+ uint64_t seq;
+/usr/include/linux/rds.h:130:2: error: unknown type name 'uint32_t'
+ uint32_t len;
+/usr/include/linux/rds.h:135:2: error: unknown type name 'uint8_t'
+ uint8_t flags;
+/usr/include/linux/rds.h:139:2: error: unknown type name 'uint32_t'
+ uint32_t sndbuf;
+/usr/include/linux/rds.h:144:2: error: unknown type name 'uint32_t'
+ uint32_t rcvbuf;
+/usr/include/linux/rds.h:145:2: error: unknown type name 'uint64_t'
+ uint64_t inum;
+/usr/include/linux/rds.h:153:2: error: unknown type name 'uint64_t'
+ uint64_t hdr_rem;
+/usr/include/linux/rds.h:154:2: error: unknown type name 'uint64_t'
+ uint64_t data_rem;
+/usr/include/linux/rds.h:155:2: error: unknown type name 'uint32_t'
+ uint32_t last_sent_nxt;
+/usr/include/linux/rds.h:156:2: error: unknown type name 'uint32_t'
+ uint32_t last_expected_una;
+/usr/include/linux/rds.h:157:2: error: unknown type name 'uint32_t'
+ uint32_t last_seen_una;
+/usr/include/linux/rds.h:164:2: error: unknown type name 'uint8_t'
+ uint8_t src_gid[RDS_IB_GID_LEN];
+/usr/include/linux/rds.h:165:2: error: unknown type name 'uint8_t'
+ uint8_t dst_gid[RDS_IB_GID_LEN];
+/usr/include/linux/rds.h:167:2: error: unknown type name 'uint32_t'
+ uint32_t max_send_wr;
+/usr/include/linux/rds.h:168:2: error: unknown type name 'uint32_t'
+ uint32_t max_recv_wr;
+/usr/include/linux/rds.h:169:2: error: unknown type name 'uint32_t'
+ uint32_t max_send_sge;
+/usr/include/linux/rds.h:170:2: error: unknown type name 'uint32_t'
+ uint32_t rdma_mr_max;
+/usr/include/linux/rds.h:171:2: error: unknown type name 'uint32_t'
+ uint32_t rdma_mr_size;
+/usr/include/linux/rds.h:212:9: error: unknown type name 'uint64_t'
+ typedef uint64_t rds_rdma_cookie_t;
+/usr/include/linux/rds.h:215:2: error: unknown type name 'uint64_t'
+ uint64_t addr;
+/usr/include/linux/rds.h:216:2: error: unknown type name 'uint64_t'
+ uint64_t bytes;
+/usr/include/linux/rds.h:221:2: error: unknown type name 'uint64_t'
+ uint64_t cookie_addr;
+/usr/include/linux/rds.h:222:2: error: unknown type name 'uint64_t'
+ uint64_t flags;
+/usr/include/linux/rds.h:228:2: error: unknown type name 'uint64_t'
+ uint64_t cookie_addr;
+/usr/include/linux/rds.h:229:2: error: unknown type name 'uint64_t'
+ uint64_t flags;
+/usr/include/linux/rds.h:234:2: error: unknown type name 'uint64_t'
+ uint64_t flags;
+/usr/include/linux/rds.h:240:2: error: unknown type name 'uint64_t'
+ uint64_t local_vec_addr;
+/usr/include/linux/rds.h:241:2: error: unknown type name 'uint64_t'
+ uint64_t nr_local;
+/usr/include/linux/rds.h:242:2: error: unknown type name 'uint64_t'
+ uint64_t flags;
+/usr/include/linux/rds.h:243:2: error: unknown type name 'uint64_t'
+ uint64_t user_token;
+/usr/include/linux/rds.h:248:2: error: unknown type name 'uint64_t'
+ uint64_t local_addr;
+/usr/include/linux/rds.h:249:2: error: unknown type name 'uint64_t'
+ uint64_t remote_addr;
+/usr/include/linux/rds.h:252:4: error: unknown type name 'uint64_t'
+ uint64_t compare;
+/usr/include/linux/rds.h:253:4: error: unknown type name 'uint64_t'
+ uint64_t swap;
+/usr/include/linux/rds.h:256:4: error: unknown type name 'uint64_t'
+ uint64_t add;
+/usr/include/linux/rds.h:259:4: error: unknown type name 'uint64_t'
+ uint64_t compare;
+/usr/include/linux/rds.h:260:4: error: unknown type name 'uint64_t'
+ uint64_t swap;
+/usr/include/linux/rds.h:261:4: error: unknown type name 'uint64_t'
+ uint64_t compare_mask;
+/usr/include/linux/rds.h:262:4: error: unknown type name 'uint64_t'
+ uint64_t swap_mask;
+/usr/include/linux/rds.h:265:4: error: unknown type name 'uint64_t'
+ uint64_t add;
+/usr/include/linux/rds.h:266:4: error: unknown type name 'uint64_t'
+ uint64_t nocarry_mask;
+/usr/include/linux/rds.h:269:2: error: unknown type name 'uint64_t'
+ uint64_t flags;
+/usr/include/linux/rds.h:270:2: error: unknown type name 'uint64_t'
+ uint64_t user_token;
+/usr/include/linux/rds.h:274:2: error: unknown type name 'uint64_t'
+ uint64_t user_token;
+/usr/include/linux/rds.h:275:2: error: unknown type name 'int32_t'
+ int32_t status;
+
+Signed-off-by: Dmitry V. Levin <ldv@altlinux.org>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <alexander.levin@verizon.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ include/uapi/linux/rds.h | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+--- a/include/uapi/linux/rds.h
++++ b/include/uapi/linux/rds.h
+@@ -35,6 +35,7 @@
+ #define _LINUX_RDS_H
+
+ #include <linux/types.h>
++#include <linux/socket.h> /* For __kernel_sockaddr_storage. */
+
+ #define RDS_IB_ABI_VERSION 0x301
+
+@@ -223,7 +224,7 @@ struct rds_get_mr_args {
+ };
+
+ struct rds_get_mr_for_dest_args {
+- struct sockaddr_storage dest_addr;
++ struct __kernel_sockaddr_storage dest_addr;
+ struct rds_iovec vec;
+ uint64_t cookie_addr;
+ uint64_t flags;
--- /dev/null
+From foo@baz Thu Oct 19 15:15:46 CEST 2017
+From: Arnd Bergmann <arnd@arndb.de>
+Date: Wed, 1 Mar 2017 10:15:29 +0100
+Subject: watchdog: kempld: fix gcc-4.3 build
+
+From: Arnd Bergmann <arnd@arndb.de>
+
+
+[ Upstream commit 3736d4eb6af37492aeded7fec0072dedd959c842 ]
+
+gcc-4.3 can't decide whether the constant value in
+kempld_prescaler[PRESCALER_21] is built-time constant or
+not, and gets confused by the logic in do_div():
+
+drivers/watchdog/kempld_wdt.o: In function `kempld_wdt_set_stage_timeout':
+kempld_wdt.c:(.text.kempld_wdt_set_stage_timeout+0x130): undefined reference to `__aeabi_uldivmod'
+
+This adds a call to ACCESS_ONCE() to force it to not consider
+it to be constant, and leaves the more efficient normal case
+in place for modern compilers, using an #ifdef to annotate
+why we do this hack.
+
+Signed-off-by: Arnd Bergmann <arnd@arndb.de>
+Signed-off-by: Guenter Roeck <linux@roeck-us.net>
+Signed-off-by: Sasha Levin <alexander.levin@verizon.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/watchdog/kempld_wdt.c | 9 ++++++++-
+ 1 file changed, 8 insertions(+), 1 deletion(-)
+
+--- a/drivers/watchdog/kempld_wdt.c
++++ b/drivers/watchdog/kempld_wdt.c
+@@ -140,12 +140,19 @@ static int kempld_wdt_set_stage_timeout(
+ unsigned int timeout)
+ {
+ struct kempld_device_data *pld = wdt_data->pld;
+- u32 prescaler = kempld_prescaler[PRESCALER_21];
++ u32 prescaler;
+ u64 stage_timeout64;
+ u32 stage_timeout;
+ u32 remainder;
+ u8 stage_cfg;
+
++#if GCC_VERSION < 40400
++ /* work around a bug compiling do_div() */
++ prescaler = READ_ONCE(kempld_prescaler[PRESCALER_21]);
++#else
++ prescaler = kempld_prescaler[PRESCALER_21];
++#endif
++
+ if (!stage)
+ return -EINVAL;
+