From 18e7d96db22886ee56066ef0a1d52f4a47a4880b Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Tue, 8 Jan 2019 08:46:59 +0100 Subject: [PATCH] 4.9-stable patches added patches: spi-bcm2835-unbreak-the-build-of-esoteric-configs.patch --- ...ltiple-hard-links-in-new-directories.patch | 150 ------------------ queue-4.9/series | 4 +- ...nbreak-the-build-of-esoteric-configs.patch | 42 +++++ 3 files changed, 43 insertions(+), 153 deletions(-) delete mode 100644 queue-4.9/btrfs-fix-fsync-of-files-with-multiple-hard-links-in-new-directories.patch create mode 100644 queue-4.9/spi-bcm2835-unbreak-the-build-of-esoteric-configs.patch diff --git a/queue-4.9/btrfs-fix-fsync-of-files-with-multiple-hard-links-in-new-directories.patch b/queue-4.9/btrfs-fix-fsync-of-files-with-multiple-hard-links-in-new-directories.patch deleted file mode 100644 index eec7986a77e..00000000000 --- a/queue-4.9/btrfs-fix-fsync-of-files-with-multiple-hard-links-in-new-directories.patch +++ /dev/null @@ -1,150 +0,0 @@ -From 41bd60676923822de1df2c50b3f9a10171f4338a Mon Sep 17 00:00:00 2001 -From: Filipe Manana -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 - -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 - - - -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 -Reported-by: Jayashree Mohan -Signed-off-by: Filipe Manana -Signed-off-by: David Sterba -Signed-off-by: Greg Kroah-Hartman - ---- - 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 -+ * -+ * -+ * 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; diff --git a/queue-4.9/series b/queue-4.9/series index 4dabc25820b..f49c8b0e7f1 100644 --- a/queue-4.9/series +++ b/queue-4.9/series @@ -1,8 +1,6 @@ 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 @@ -53,7 +51,6 @@ spi-bcm2835-fix-book-keeping-of-dma-termination.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 @@ -67,3 +64,4 @@ x86-kvm-vmx-do-not-use-vm-exit-instruction-length-for-fast-mmio-when-running-nes 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 diff --git a/queue-4.9/spi-bcm2835-unbreak-the-build-of-esoteric-configs.patch b/queue-4.9/spi-bcm2835-unbreak-the-build-of-esoteric-configs.patch new file mode 100644 index 00000000000..8bc04c197d2 --- /dev/null +++ b/queue-4.9/spi-bcm2835-unbreak-the-build-of-esoteric-configs.patch @@ -0,0 +1,42 @@ +From 29bdedfd9cf40e59456110ca417a8cb672ac9b92 Mon Sep 17 00:00:00 2001 +From: Lukas Wunner +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 + +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 +Signed-off-by: Mark Brown +Cc: Frank Pavlic +Cc: Martin Sperl +Cc: Noralf Trønnes +Cc: Sudip Mukherjee +Signed-off-by: Greg Kroah-Hartman + +--- + 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) -- 2.47.3