From: Greg Kroah-Hartman Date: Sat, 25 Jun 2022 14:35:05 +0000 (+0200) Subject: 5.10-stable patches X-Git-Tag: v5.10.126~26 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=5ff825d82fe8afe7eaf799e99de076bfe516f949;p=thirdparty%2Fkernel%2Fstable-queue.git 5.10-stable patches added patches: ata-libata-add-qc-flags-in-ata_qc_complete_template-tracepoint.patch btrfs-add-error-messages-to-all-unrecognized-mount-options.patch dm-era-commit-metadata-in-postsuspend-after-worker-stops.patch dm-mirror-log-clear-log-bits-up-to-bits_per_long-boundary.patch mmc-sdhci-pci-o2micro-fix-card-detect-by-dealing-with-debouncing.patch mtd-rawnand-gpmi-fix-setting-busy-timeout-setting.patch net-openvswitch-fix-parsing-of-nw_proto-for-ipv6-fragments.patch --- diff --git a/queue-5.10/ata-libata-add-qc-flags-in-ata_qc_complete_template-tracepoint.patch b/queue-5.10/ata-libata-add-qc-flags-in-ata_qc_complete_template-tracepoint.patch new file mode 100644 index 00000000000..f54460831af --- /dev/null +++ b/queue-5.10/ata-libata-add-qc-flags-in-ata_qc_complete_template-tracepoint.patch @@ -0,0 +1,30 @@ +From 540a92bfe6dab7310b9df2e488ba247d784d0163 Mon Sep 17 00:00:00 2001 +From: Edward Wu +Date: Fri, 17 Jun 2022 11:32:20 +0800 +Subject: ata: libata: add qc->flags in ata_qc_complete_template tracepoint + +From: Edward Wu + +commit 540a92bfe6dab7310b9df2e488ba247d784d0163 upstream. + +Add flags value to check the result of ata completion + +Fixes: 255c03d15a29 ("libata: Add tracepoints") +Cc: stable@vger.kernel.org +Signed-off-by: Edward Wu +Signed-off-by: Damien Le Moal +Signed-off-by: Greg Kroah-Hartman +--- + include/trace/events/libata.h | 1 + + 1 file changed, 1 insertion(+) + +--- a/include/trace/events/libata.h ++++ b/include/trace/events/libata.h +@@ -249,6 +249,7 @@ DECLARE_EVENT_CLASS(ata_qc_complete_temp + __entry->hob_feature = qc->result_tf.hob_feature; + __entry->nsect = qc->result_tf.nsect; + __entry->hob_nsect = qc->result_tf.hob_nsect; ++ __entry->flags = qc->flags; + ), + + TP_printk("ata_port=%u ata_dev=%u tag=%d flags=%s status=%s " \ diff --git a/queue-5.10/btrfs-add-error-messages-to-all-unrecognized-mount-options.patch b/queue-5.10/btrfs-add-error-messages-to-all-unrecognized-mount-options.patch new file mode 100644 index 00000000000..57cfbc8e98e --- /dev/null +++ b/queue-5.10/btrfs-add-error-messages-to-all-unrecognized-mount-options.patch @@ -0,0 +1,150 @@ +From e3a4167c880cf889f66887a152799df4d609dd21 Mon Sep 17 00:00:00 2001 +From: David Sterba +Date: Thu, 2 Jun 2022 23:57:17 +0200 +Subject: btrfs: add error messages to all unrecognized mount options + +From: David Sterba + +commit e3a4167c880cf889f66887a152799df4d609dd21 upstream. + +Almost none of the errors stemming from a valid mount option but wrong +value prints a descriptive message which would help to identify why +mount failed. Like in the linked report: + + $ uname -r + v4.19 + $ mount -o compress=zstd /dev/sdb /mnt + mount: /mnt: wrong fs type, bad option, bad superblock on + /dev/sdb, missing codepage or helper program, or other error. + $ dmesg + ... + BTRFS error (device sdb): open_ctree failed + +Errors caused by memory allocation failures are left out as it's not a +user error so reporting that would be confusing. + +Link: https://lore.kernel.org/linux-btrfs/9c3fec36-fc61-3a33-4977-a7e207c3fa4e@gmx.de/ +CC: stable@vger.kernel.org # 4.9+ +Reviewed-by: Qu Wenruo +Reviewed-by: Nikolay Borisov +Reviewed-by: Anand Jain +Signed-off-by: David Sterba +Signed-off-by: Greg Kroah-Hartman +--- + fs/btrfs/super.c | 39 ++++++++++++++++++++++++++++++++------- + 1 file changed, 32 insertions(+), 7 deletions(-) + +--- a/fs/btrfs/super.c ++++ b/fs/btrfs/super.c +@@ -652,6 +652,8 @@ int btrfs_parse_options(struct btrfs_fs_ + compress_force = false; + no_compress++; + } else { ++ btrfs_err(info, "unrecognized compression value %s", ++ args[0].from); + ret = -EINVAL; + goto out; + } +@@ -710,8 +712,11 @@ int btrfs_parse_options(struct btrfs_fs_ + case Opt_thread_pool: + ret = match_int(&args[0], &intarg); + if (ret) { ++ btrfs_err(info, "unrecognized thread_pool value %s", ++ args[0].from); + goto out; + } else if (intarg == 0) { ++ btrfs_err(info, "invalid value 0 for thread_pool"); + ret = -EINVAL; + goto out; + } +@@ -772,8 +777,11 @@ int btrfs_parse_options(struct btrfs_fs_ + break; + case Opt_ratio: + ret = match_int(&args[0], &intarg); +- if (ret) ++ if (ret) { ++ btrfs_err(info, "unrecognized metadata_ratio value %s", ++ args[0].from); + goto out; ++ } + info->metadata_ratio = intarg; + btrfs_info(info, "metadata ratio %u", + info->metadata_ratio); +@@ -790,6 +798,8 @@ int btrfs_parse_options(struct btrfs_fs_ + btrfs_set_and_info(info, DISCARD_ASYNC, + "turning on async discard"); + } else { ++ btrfs_err(info, "unrecognized discard mode value %s", ++ args[0].from); + ret = -EINVAL; + goto out; + } +@@ -814,6 +824,8 @@ int btrfs_parse_options(struct btrfs_fs_ + btrfs_set_and_info(info, FREE_SPACE_TREE, + "enabling free space tree"); + } else { ++ btrfs_err(info, "unrecognized space_cache value %s", ++ args[0].from); + ret = -EINVAL; + goto out; + } +@@ -889,8 +901,12 @@ int btrfs_parse_options(struct btrfs_fs_ + break; + case Opt_check_integrity_print_mask: + ret = match_int(&args[0], &intarg); +- if (ret) ++ if (ret) { ++ btrfs_err(info, ++ "unrecognized check_integrity_print_mask value %s", ++ args[0].from); + goto out; ++ } + info->check_integrity_print_mask = intarg; + btrfs_info(info, "check_integrity_print_mask 0x%x", + info->check_integrity_print_mask); +@@ -905,13 +921,15 @@ int btrfs_parse_options(struct btrfs_fs_ + goto out; + #endif + case Opt_fatal_errors: +- if (strcmp(args[0].from, "panic") == 0) ++ if (strcmp(args[0].from, "panic") == 0) { + btrfs_set_opt(info->mount_opt, + PANIC_ON_FATAL_ERROR); +- else if (strcmp(args[0].from, "bug") == 0) ++ } else if (strcmp(args[0].from, "bug") == 0) { + btrfs_clear_opt(info->mount_opt, + PANIC_ON_FATAL_ERROR); +- else { ++ } else { ++ btrfs_err(info, "unrecognized fatal_errors value %s", ++ args[0].from); + ret = -EINVAL; + goto out; + } +@@ -919,8 +937,12 @@ int btrfs_parse_options(struct btrfs_fs_ + case Opt_commit_interval: + intarg = 0; + ret = match_int(&args[0], &intarg); +- if (ret) ++ if (ret) { ++ btrfs_err(info, "unrecognized commit_interval value %s", ++ args[0].from); ++ ret = -EINVAL; + goto out; ++ } + if (intarg == 0) { + btrfs_info(info, + "using default commit interval %us", +@@ -934,8 +956,11 @@ int btrfs_parse_options(struct btrfs_fs_ + break; + case Opt_rescue: + ret = parse_rescue_options(info, args[0].from); +- if (ret < 0) ++ if (ret < 0) { ++ btrfs_err(info, "unrecognized rescue value %s", ++ args[0].from); + goto out; ++ } + break; + #ifdef CONFIG_BTRFS_DEBUG + case Opt_fragment_all: diff --git a/queue-5.10/dm-era-commit-metadata-in-postsuspend-after-worker-stops.patch b/queue-5.10/dm-era-commit-metadata-in-postsuspend-after-worker-stops.patch new file mode 100644 index 00000000000..3bea23841dd --- /dev/null +++ b/queue-5.10/dm-era-commit-metadata-in-postsuspend-after-worker-stops.patch @@ -0,0 +1,91 @@ +From 9ae6e8b1c9bbf6874163d1243e393137313762b7 Mon Sep 17 00:00:00 2001 +From: Nikos Tsironis +Date: Tue, 21 Jun 2022 15:24:03 +0300 +Subject: dm era: commit metadata in postsuspend after worker stops + +From: Nikos Tsironis + +commit 9ae6e8b1c9bbf6874163d1243e393137313762b7 upstream. + +During postsuspend dm-era does the following: + +1. Archives the current era +2. Commits the metadata, as part of the RPC call for archiving the + current era +3. Stops the worker + +Until the worker stops, it might write to the metadata again. Moreover, +these writes are not flushed to disk immediately, but are cached by the +dm-bufio client, which writes them back asynchronously. + +As a result, the committed metadata of a suspended dm-era device might +not be consistent with the in-core metadata. + +In some cases, this can result in the corruption of the on-disk +metadata. Suppose the following sequence of events: + +1. Load a new table, e.g. a snapshot-origin table, to a device with a + dm-era table +2. Suspend the device +3. dm-era commits its metadata, but the worker does a few more metadata + writes until it stops, as part of digesting an archived writeset +4. These writes are cached by the dm-bufio client +5. Load the dm-era table to another device. +6. The new instance of the dm-era target loads the committed, on-disk + metadata, which don't include the extra writes done by the worker + after the metadata commit. +7. Resume the new device +8. The new dm-era target instance starts using the metadata +9. Resume the original device +10. The destructor of the old dm-era target instance is called and + destroys the dm-bufio client, which results in flushing the cached + writes to disk +11. These writes might overwrite the writes done by the new dm-era + instance, hence corrupting its metadata. + +Fix this by committing the metadata after the worker stops running. + +stop_worker uses flush_workqueue to flush the current work. However, the +work item may re-queue itself and flush_workqueue doesn't wait for +re-queued works to finish. + +This could result in the worker changing the metadata after they have +been committed, or writing to the metadata concurrently with the commit +in the postsuspend thread. + +Use drain_workqueue instead, which waits until the work and all +re-queued works finish. + +Fixes: eec40579d8487 ("dm: add era target") +Cc: stable@vger.kernel.org # v3.15+ +Signed-off-by: Nikos Tsironis +Signed-off-by: Mike Snitzer +Signed-off-by: Greg Kroah-Hartman +--- + drivers/md/dm-era-target.c | 8 +++++++- + 1 file changed, 7 insertions(+), 1 deletion(-) + +--- a/drivers/md/dm-era-target.c ++++ b/drivers/md/dm-era-target.c +@@ -1396,7 +1396,7 @@ static void start_worker(struct era *era + static void stop_worker(struct era *era) + { + atomic_set(&era->suspended, 1); +- flush_workqueue(era->wq); ++ drain_workqueue(era->wq); + } + + /*---------------------------------------------------------------- +@@ -1566,6 +1566,12 @@ static void era_postsuspend(struct dm_ta + } + + stop_worker(era); ++ ++ r = metadata_commit(era->md); ++ if (r) { ++ DMERR("%s: metadata_commit failed", __func__); ++ /* FIXME: fail mode */ ++ } + } + + static int era_preresume(struct dm_target *ti) diff --git a/queue-5.10/dm-mirror-log-clear-log-bits-up-to-bits_per_long-boundary.patch b/queue-5.10/dm-mirror-log-clear-log-bits-up-to-bits_per_long-boundary.patch new file mode 100644 index 00000000000..951b1125830 --- /dev/null +++ b/queue-5.10/dm-mirror-log-clear-log-bits-up-to-bits_per_long-boundary.patch @@ -0,0 +1,42 @@ +From 90736eb3232d208ee048493f371075e4272e0944 Mon Sep 17 00:00:00 2001 +From: Mikulas Patocka +Date: Thu, 23 Jun 2022 14:53:25 -0400 +Subject: dm mirror log: clear log bits up to BITS_PER_LONG boundary + +From: Mikulas Patocka + +commit 90736eb3232d208ee048493f371075e4272e0944 upstream. + +Commit 85e123c27d5c ("dm mirror log: round up region bitmap size to +BITS_PER_LONG") introduced a regression on 64-bit architectures in the +lvm testsuite tests: lvcreate-mirror, mirror-names and vgsplit-operation. + +If the device is shrunk, we need to clear log bits beyond the end of the +device. The code clears bits up to a 32-bit boundary and then calculates +lc->sync_count by summing set bits up to a 64-bit boundary (the commit +changed that; previously, this boundary was 32-bit too). So, it was using +some non-zeroed bits in the calculation and this caused misbehavior. + +Fix this regression by clearing bits up to BITS_PER_LONG boundary. + +Fixes: 85e123c27d5c ("dm mirror log: round up region bitmap size to BITS_PER_LONG") +Cc: stable@vger.kernel.org +Reported-by: Benjamin Marzinski +Signed-off-by: Mikulas Patocka +Signed-off-by: Mike Snitzer +Signed-off-by: Greg Kroah-Hartman +--- + drivers/md/dm-log.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/md/dm-log.c ++++ b/drivers/md/dm-log.c +@@ -615,7 +615,7 @@ static int disk_resume(struct dm_dirty_l + log_clear_bit(lc, lc->clean_bits, i); + + /* clear any old bits -- device has shrunk */ +- for (i = lc->region_count; i % (sizeof(*lc->clean_bits) << BYTE_SHIFT); i++) ++ for (i = lc->region_count; i % BITS_PER_LONG; i++) + log_clear_bit(lc, lc->clean_bits, i); + + /* copy clean across to sync */ diff --git a/queue-5.10/mmc-sdhci-pci-o2micro-fix-card-detect-by-dealing-with-debouncing.patch b/queue-5.10/mmc-sdhci-pci-o2micro-fix-card-detect-by-dealing-with-debouncing.patch new file mode 100644 index 00000000000..78ffc6934cb --- /dev/null +++ b/queue-5.10/mmc-sdhci-pci-o2micro-fix-card-detect-by-dealing-with-debouncing.patch @@ -0,0 +1,34 @@ +From e591fcf6b4e39335c9b128b17738fcd2fdd278ae Mon Sep 17 00:00:00 2001 +From: Chevron Li +Date: Thu, 2 Jun 2022 06:25:43 -0700 +Subject: mmc: sdhci-pci-o2micro: Fix card detect by dealing with debouncing + +From: Chevron Li + +commit e591fcf6b4e39335c9b128b17738fcd2fdd278ae upstream. + +The result from ->get_cd() may be incorrect as the card detect debouncing +isn't managed correctly. Let's fix it. + +Signed-off-by: Chevron Li +Fixes: 7d44061704dd ("mmc: sdhci-pci-o2micro: Fix O2 Host data read/write DLL Lock phase shift issue") +Cc: stable@vger.kernel.org +Link: https://lore.kernel.org/r/20220602132543.596-1-chevron.li@bayhubtech.com +[Ulf: Updated the commit message] +Signed-off-by: Ulf Hansson +Signed-off-by: Greg Kroah-Hartman +--- + drivers/mmc/host/sdhci-pci-o2micro.c | 2 ++ + 1 file changed, 2 insertions(+) + +--- a/drivers/mmc/host/sdhci-pci-o2micro.c ++++ b/drivers/mmc/host/sdhci-pci-o2micro.c +@@ -147,6 +147,8 @@ static int sdhci_o2_get_cd(struct mmc_ho + + if (!(sdhci_readw(host, O2_PLL_DLL_WDT_CONTROL1) & O2_PLL_LOCK_STATUS)) + sdhci_o2_enable_internal_clock(host); ++ else ++ sdhci_o2_wait_card_detect_stable(host); + + return !!(sdhci_readl(host, SDHCI_PRESENT_STATE) & SDHCI_CARD_PRESENT); + } diff --git a/queue-5.10/mtd-rawnand-gpmi-fix-setting-busy-timeout-setting.patch b/queue-5.10/mtd-rawnand-gpmi-fix-setting-busy-timeout-setting.patch new file mode 100644 index 00000000000..4a4270f7201 --- /dev/null +++ b/queue-5.10/mtd-rawnand-gpmi-fix-setting-busy-timeout-setting.patch @@ -0,0 +1,49 @@ +From 06781a5026350cde699d2d10c9914a25c1524f45 Mon Sep 17 00:00:00 2001 +From: Sascha Hauer +Date: Tue, 14 Jun 2022 10:31:38 +0200 +Subject: mtd: rawnand: gpmi: Fix setting busy timeout setting + +From: Sascha Hauer + +commit 06781a5026350cde699d2d10c9914a25c1524f45 upstream. + +The DEVICE_BUSY_TIMEOUT value is described in the Reference Manual as: + +| Timeout waiting for NAND Ready/Busy or ATA IRQ. Used in WAIT_FOR_READY +| mode. This value is the number of GPMI_CLK cycles multiplied by 4096. + +So instead of multiplying the value in cycles with 4096, we have to +divide it by that value. Use DIV_ROUND_UP to make sure we are on the +safe side, especially when the calculated value in cycles is smaller +than 4096 as typically the case. + +This bug likely never triggered because any timeout != 0 usually will +do. In my case the busy timeout in cycles was originally calculated as +2408, which multiplied with 4096 is 0x968000. The lower 16 bits were +taken for the 16 bit wide register field, so the register value was +0x8000. With 2970bf5a32f0 ("mtd: rawnand: gpmi: fix controller timings +setting") however the value in cycles became 2384, which multiplied +with 4096 is 0x950000. The lower 16 bit are 0x0 now resulting in an +intermediate timeout when reading from NAND. + +Fixes: b1206122069aa ("mtd: rawnand: gpmi: use core timings instead of an empirical derivation") +Cc: stable@vger.kernel.org +Signed-off-by: Sascha Hauer +Signed-off-by: Miquel Raynal +Link: https://lore.kernel.org/linux-mtd/20220614083138.3455683-1-s.hauer@pengutronix.de +Signed-off-by: Greg Kroah-Hartman +--- + drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c ++++ b/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c +@@ -683,7 +683,7 @@ static void gpmi_nfc_compute_timings(str + hw->timing0 = BF_GPMI_TIMING0_ADDRESS_SETUP(addr_setup_cycles) | + BF_GPMI_TIMING0_DATA_HOLD(data_hold_cycles) | + BF_GPMI_TIMING0_DATA_SETUP(data_setup_cycles); +- hw->timing1 = BF_GPMI_TIMING1_BUSY_TIMEOUT(busy_timeout_cycles * 4096); ++ hw->timing1 = BF_GPMI_TIMING1_BUSY_TIMEOUT(DIV_ROUND_UP(busy_timeout_cycles, 4096)); + + /* + * Derive NFC ideal delay from {3}: diff --git a/queue-5.10/net-openvswitch-fix-parsing-of-nw_proto-for-ipv6-fragments.patch b/queue-5.10/net-openvswitch-fix-parsing-of-nw_proto-for-ipv6-fragments.patch new file mode 100644 index 00000000000..f95d8ee1204 --- /dev/null +++ b/queue-5.10/net-openvswitch-fix-parsing-of-nw_proto-for-ipv6-fragments.patch @@ -0,0 +1,63 @@ +From 12378a5a75e33f34f8586706eb61cca9e6d4690c Mon Sep 17 00:00:00 2001 +From: Rosemarie O'Riorden +Date: Tue, 21 Jun 2022 16:48:45 -0400 +Subject: net: openvswitch: fix parsing of nw_proto for IPv6 fragments + +From: Rosemarie O'Riorden + +commit 12378a5a75e33f34f8586706eb61cca9e6d4690c upstream. + +When a packet enters the OVS datapath and does not match any existing +flows installed in the kernel flow cache, the packet will be sent to +userspace to be parsed, and a new flow will be created. The kernel and +OVS rely on each other to parse packet fields in the same way so that +packets will be handled properly. + +As per the design document linked below, OVS expects all later IPv6 +fragments to have nw_proto=44 in the flow key, so they can be correctly +matched on OpenFlow rules. OpenFlow controllers create pipelines based +on this design. + +This behavior was changed by the commit in the Fixes tag so that +nw_proto equals the next_header field of the last extension header. +However, there is no counterpart for this change in OVS userspace, +meaning that this field is parsed differently between OVS and the +kernel. This is a problem because OVS creates actions based on what is +parsed in userspace, but the kernel-provided flow key is used as a match +criteria, as described in Documentation/networking/openvswitch.rst. This +leads to issues such as packets incorrectly matching on a flow and thus +the wrong list of actions being applied to the packet. Such changes in +packet parsing cannot be implemented without breaking the userspace. + +The offending commit is partially reverted to restore the expected +behavior. + +The change technically made sense and there is a good reason that it was +implemented, but it does not comply with the original design of OVS. +If in the future someone wants to implement such a change, then it must +be user-configurable and disabled by default to preserve backwards +compatibility with existing OVS versions. + +Cc: stable@vger.kernel.org +Fixes: fa642f08839b ("openvswitch: Derive IP protocol number for IPv6 later frags") +Link: https://docs.openvswitch.org/en/latest/topics/design/#fragments +Signed-off-by: Rosemarie O'Riorden +Acked-by: Eelco Chaudron +Link: https://lore.kernel.org/r/20220621204845.9721-1-roriorden@redhat.com +Signed-off-by: Paolo Abeni +Signed-off-by: Greg Kroah-Hartman +--- + net/openvswitch/flow.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/net/openvswitch/flow.c ++++ b/net/openvswitch/flow.c +@@ -265,7 +265,7 @@ static int parse_ipv6hdr(struct sk_buff + if (flags & IP6_FH_F_FRAG) { + if (frag_off) { + key->ip.frag = OVS_FRAG_TYPE_LATER; +- key->ip.proto = nexthdr; ++ key->ip.proto = NEXTHDR_FRAGMENT; + return 0; + } + key->ip.frag = OVS_FRAG_TYPE_FIRST; diff --git a/queue-5.10/series b/queue-5.10/series index d7bd1b3f04e..eb99e6357f9 100644 --- a/queue-5.10/series +++ b/queue-5.10/series @@ -8,3 +8,10 @@ alsa-hda-realtek-alc897-headset-mic-no-sound.patch alsa-hda-realtek-apply-fixup-for-lenovo-yoga-duet-7-properly.patch alsa-hda-realtek-add-quirk-for-clevo-pd70pnt.patch alsa-hda-realtek-add-quirk-for-clevo-ns50pu.patch +net-openvswitch-fix-parsing-of-nw_proto-for-ipv6-fragments.patch +btrfs-add-error-messages-to-all-unrecognized-mount-options.patch +mmc-sdhci-pci-o2micro-fix-card-detect-by-dealing-with-debouncing.patch +mtd-rawnand-gpmi-fix-setting-busy-timeout-setting.patch +ata-libata-add-qc-flags-in-ata_qc_complete_template-tracepoint.patch +dm-era-commit-metadata-in-postsuspend-after-worker-stops.patch +dm-mirror-log-clear-log-bits-up-to-bits_per_long-boundary.patch