+++ /dev/null
-From 41bd60676923822de1df2c50b3f9a10171f4338a Mon Sep 17 00:00:00 2001
-From: Filipe Manana <fdmanana@suse.com>
-Date: Wed, 28 Nov 2018 14:54:28 +0000
-Subject: Btrfs: fix fsync of files with multiple hard links in new directories
-
-From: Filipe Manana <fdmanana@suse.com>
-
-commit 41bd60676923822de1df2c50b3f9a10171f4338a upstream.
-
-The log tree has a long standing problem that when a file is fsync'ed we
-only check for new ancestors, created in the current transaction, by
-following only the hard link for which the fsync was issued. We follow the
-ancestors using the VFS' dget_parent() API. This means that if we create a
-new link for a file in a directory that is new (or in an any other new
-ancestor directory) and then fsync the file using an old hard link, we end
-up not logging the new ancestor, and on log replay that new hard link and
-ancestor do not exist. In some cases, involving renames, the file will not
-exist at all.
-
-Example:
-
- mkfs.btrfs -f /dev/sdb
- mount /dev/sdb /mnt
-
- mkdir /mnt/A
- touch /mnt/foo
- ln /mnt/foo /mnt/A/bar
- xfs_io -c fsync /mnt/foo
-
- <power failure>
-
-In this example after log replay only the hard link named 'foo' exists
-and directory A does not exist, which is unexpected. In other major linux
-filesystems, such as ext4, xfs and f2fs for example, both hard links exist
-and so does directory A after mounting again the filesystem.
-
-Checking if any new ancestors are new and need to be logged was added in
-2009 by commit 12fcfd22fe5b ("Btrfs: tree logging unlink/rename fixes"),
-however only for the ancestors of the hard link (dentry) for which the
-fsync was issued, instead of checking for all ancestors for all of the
-inode's hard links.
-
-So fix this by tracking the id of the last transaction where a hard link
-was created for an inode and then on fsync fallback to a full transaction
-commit when an inode has more than one hard link and at least one new hard
-link was created in the current transaction. This is the simplest solution
-since this is not a common use case (adding frequently hard links for
-which there's an ancestor created in the current transaction and then
-fsync the file). In case it ever becomes a common use case, a solution
-that consists of iterating the fs/subvol btree for each hard link and
-check if any ancestor is new, could be implemented.
-
-This solves many unexpected scenarios reported by Jayashree Mohan and
-Vijay Chidambaram, and for which there is a new test case for fstests
-under review.
-
-Fixes: 12fcfd22fe5b ("Btrfs: tree logging unlink/rename fixes")
-CC: stable@vger.kernel.org # 4.4+
-Reported-by: Vijay Chidambaram <vvijay03@gmail.com>
-Reported-by: Jayashree Mohan <jayashree2912@gmail.com>
-Signed-off-by: Filipe Manana <fdmanana@suse.com>
-Signed-off-by: David Sterba <dsterba@suse.com>
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-
----
- fs/btrfs/btrfs_inode.h | 6 ++++++
- fs/btrfs/inode.c | 17 +++++++++++++++++
- fs/btrfs/tree-log.c | 16 ++++++++++++++++
- 3 files changed, 39 insertions(+)
-
---- a/fs/btrfs/btrfs_inode.h
-+++ b/fs/btrfs/btrfs_inode.h
-@@ -154,6 +154,12 @@ struct btrfs_inode {
- u64 last_unlink_trans;
-
- /*
-+ * Track the transaction id of the last transaction used to create a
-+ * hard link for the inode. This is used by the log tree (fsync).
-+ */
-+ u64 last_link_trans;
-+
-+ /*
- * Number of bytes outstanding that are going to need csums. This is
- * used in ENOSPC accounting.
- */
---- a/fs/btrfs/inode.c
-+++ b/fs/btrfs/inode.c
-@@ -3805,6 +3805,21 @@ cache_index:
- * inode is not a directory, logging its parent unnecessarily.
- */
- BTRFS_I(inode)->last_unlink_trans = BTRFS_I(inode)->last_trans;
-+ /*
-+ * Similar reasoning for last_link_trans, needs to be set otherwise
-+ * for a case like the following:
-+ *
-+ * mkdir A
-+ * touch foo
-+ * ln foo A/bar
-+ * echo 2 > /proc/sys/vm/drop_caches
-+ * fsync foo
-+ * <power failure>
-+ *
-+ * Would result in link bar and directory A not existing after the power
-+ * failure.
-+ */
-+ BTRFS_I(inode)->last_link_trans = BTRFS_I(inode)->last_trans;
-
- path->slots[0]++;
- if (inode->i_nlink != 1 ||
-@@ -6670,6 +6685,7 @@ static int btrfs_link(struct dentry *old
- if (err)
- goto fail;
- }
-+ BTRFS_I(inode)->last_link_trans = trans->transid;
- d_instantiate(dentry, inode);
- btrfs_log_new_name(trans, inode, NULL, parent);
- }
-@@ -9383,6 +9399,7 @@ struct inode *btrfs_alloc_inode(struct s
- ei->index_cnt = (u64)-1;
- ei->dir_index = 0;
- ei->last_unlink_trans = 0;
-+ ei->last_link_trans = 0;
- ei->last_log_commit = 0;
- ei->delayed_iput_count = 0;
-
---- a/fs/btrfs/tree-log.c
-+++ b/fs/btrfs/tree-log.c
-@@ -5549,6 +5549,22 @@ static int btrfs_log_inode_parent(struct
- goto end_trans;
- }
-
-+ /*
-+ * If a new hard link was added to the inode in the current transaction
-+ * and its link count is now greater than 1, we need to fallback to a
-+ * transaction commit, otherwise we can end up not logging all its new
-+ * parents for all the hard links. Here just from the dentry used to
-+ * fsync, we can not visit the ancestor inodes for all the other hard
-+ * links to figure out if any is new, so we fallback to a transaction
-+ * commit (instead of adding a lot of complexity of scanning a btree,
-+ * since this scenario is not a common use case).
-+ */
-+ if (inode->vfs_inode.i_nlink > 1 &&
-+ inode->last_link_trans > last_committed) {
-+ ret = -EMLINK;
-+ goto end_trans;
-+ }
-+
- while (1) {
- if (!parent || d_really_is_negative(parent) || sb != parent->d_sb)
- break;
nfc-nxp-nci-include-unaligned.h-instead-of-access_ok.h.patch
ip6mr-fix-potential-spectre-v1-vulnerability.patch
ipv4-fix-potential-spectre-v1-vulnerability.patch
-net-core-fix-spectre-v1-vulnerability.patch
-phonet-af_phonet-fix-spectre-v1-vulnerability.patch
ax25-fix-a-use-after-free-in-ax25_fillin_cb.patch
ibmveth-fix-dma-unmap-error-in-ibmveth_xmit_start-error-path.patch
ieee802154-lowpan_header_create-check-must-check-daddr.patch
spi-bcm2835-avoid-finishing-transfer-prematurely-in-irq-mode.patch
clk-rockchip-fix-typo-in-rk3188-spdif_frac-parent.patch
cdc-acm-fix-abnormal-data-rx-issue-for-mediatek-preloader.patch
-btrfs-fix-fsync-of-files-with-multiple-hard-links-in-new-directories.patch
powerpc-tm-set-msr-just-prior-to-recheckpoint.patch
f2fs-fix-validation-of-the-block-count-in-sanity_check_raw_super.patch
serial-uartps-fix-interrupt-mask-issue-to-handle-the-rx-interrupts-properly.patch
arm64-kvm-avoid-setting-the-upper-32-bits-of-vtcr_el2-to-1.patch
rtc-m41t80-correct-alarm-month-range-with-rtc-reads.patch
tpm-tpm_i2c_nuvoton-use-correct-command-duration-for-tpm-2.x.patch
+spi-bcm2835-unbreak-the-build-of-esoteric-configs.patch
--- /dev/null
+From 29bdedfd9cf40e59456110ca417a8cb672ac9b92 Mon Sep 17 00:00:00 2001
+From: Lukas Wunner <lukas@wunner.de>
+Date: Thu, 29 Nov 2018 15:14:49 +0100
+Subject: spi: bcm2835: Unbreak the build of esoteric configs
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Lukas Wunner <lukas@wunner.de>
+
+commit 29bdedfd9cf40e59456110ca417a8cb672ac9b92 upstream.
+
+Commit e82b0b382845 ("spi: bcm2835: Fix race on DMA termination") broke
+the build with COMPILE_TEST=y on arches whose cmpxchg() requires 32-bit
+operands (xtensa, older arm ISAs).
+
+Fix by changing the dma_pending flag's type from bool to unsigned int.
+
+Fixes: e82b0b382845 ("spi: bcm2835: Fix race on DMA termination")
+Signed-off-by: Lukas Wunner <lukas@wunner.de>
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Cc: Frank Pavlic <f.pavlic@kunbus.de>
+Cc: Martin Sperl <kernel@martin.sperl.org>
+Cc: Noralf Trønnes <noralf@tronnes.org>
+Cc: Sudip Mukherjee <sudipm.mukherjee@gmail.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/spi/spi-bcm2835.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/drivers/spi/spi-bcm2835.c
++++ b/drivers/spi/spi-bcm2835.c
+@@ -88,7 +88,7 @@ struct bcm2835_spi {
+ u8 *rx_buf;
+ int tx_len;
+ int rx_len;
+- bool dma_pending;
++ unsigned int dma_pending;
+ };
+
+ static inline u32 bcm2835_rd(struct bcm2835_spi *bs, unsigned reg)