]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
6.6-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 3 Dec 2023 13:02:08 +0000 (14:02 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 3 Dec 2023 13:02:08 +0000 (14:02 +0100)
added patches:
alsa-hda-disable-power-save-on-kontron-singlepc.patch
alsa-hda-realtek-add-supported-alc257-for-chromeos.patch
alsa-hda-realtek-headset-mic-vref-to-100.patch
cifs-fix-falloc_fl_insert_range-by-setting-i_size-after-eof-moved.patch
cifs-fix-falloc_fl_zero_range-by-setting-i_size-if-eof-moved.patch
dm-verity-align-struct-dm_verity_fec_io-properly.patch
drm-i915-also-check-for-vga-converter-in-edp-probe.patch
firewire-core-fix-possible-memory-leak-in-create_units.patch
ksmbd-fix-possible-deadlock-in-smb2_open.patch
leds-class-don-t-expose-color-sysfs-entry.patch
mmc-block-be-sure-to-wait-while-busy-in-cqe-error-recovery.patch
mmc-block-do-not-lose-cache-flush-during-cqe-error-recovery.patch
mmc-block-retry-commands-in-cqe-error-recovery.patch
mmc-cqhci-fix-task-clearing-in-cqe-error-recovery.patch
mmc-cqhci-increase-recovery-halt-timeout.patch
mmc-cqhci-warn-of-halt-or-task-clear-failure.patch
mmc-sdhci-pci-gli-disable-lpm-during-initialization.patch
mmc-sdhci-sprd-fix-vqmmc-not-shutting-down-after-the-card-was-pulled.patch
net-libwx-fix-memory-leak-on-msix-entry.patch
pinctrl-avoid-reload-of-p-state-in-list-iteration.patch
series
smb-client-fix-missing-mode-bits-for-smb-symlinks.patch
smb-client-report-correct-st_size-for-smb-and-nfs-symlinks.patch

23 files changed:
queue-6.6/alsa-hda-disable-power-save-on-kontron-singlepc.patch [new file with mode: 0644]
queue-6.6/alsa-hda-realtek-add-supported-alc257-for-chromeos.patch [new file with mode: 0644]
queue-6.6/alsa-hda-realtek-headset-mic-vref-to-100.patch [new file with mode: 0644]
queue-6.6/cifs-fix-falloc_fl_insert_range-by-setting-i_size-after-eof-moved.patch [new file with mode: 0644]
queue-6.6/cifs-fix-falloc_fl_zero_range-by-setting-i_size-if-eof-moved.patch [new file with mode: 0644]
queue-6.6/dm-verity-align-struct-dm_verity_fec_io-properly.patch [new file with mode: 0644]
queue-6.6/drm-i915-also-check-for-vga-converter-in-edp-probe.patch [new file with mode: 0644]
queue-6.6/firewire-core-fix-possible-memory-leak-in-create_units.patch [new file with mode: 0644]
queue-6.6/ksmbd-fix-possible-deadlock-in-smb2_open.patch [new file with mode: 0644]
queue-6.6/leds-class-don-t-expose-color-sysfs-entry.patch [new file with mode: 0644]
queue-6.6/mmc-block-be-sure-to-wait-while-busy-in-cqe-error-recovery.patch [new file with mode: 0644]
queue-6.6/mmc-block-do-not-lose-cache-flush-during-cqe-error-recovery.patch [new file with mode: 0644]
queue-6.6/mmc-block-retry-commands-in-cqe-error-recovery.patch [new file with mode: 0644]
queue-6.6/mmc-cqhci-fix-task-clearing-in-cqe-error-recovery.patch [new file with mode: 0644]
queue-6.6/mmc-cqhci-increase-recovery-halt-timeout.patch [new file with mode: 0644]
queue-6.6/mmc-cqhci-warn-of-halt-or-task-clear-failure.patch [new file with mode: 0644]
queue-6.6/mmc-sdhci-pci-gli-disable-lpm-during-initialization.patch [new file with mode: 0644]
queue-6.6/mmc-sdhci-sprd-fix-vqmmc-not-shutting-down-after-the-card-was-pulled.patch [new file with mode: 0644]
queue-6.6/net-libwx-fix-memory-leak-on-msix-entry.patch [new file with mode: 0644]
queue-6.6/pinctrl-avoid-reload-of-p-state-in-list-iteration.patch [new file with mode: 0644]
queue-6.6/series [new file with mode: 0644]
queue-6.6/smb-client-fix-missing-mode-bits-for-smb-symlinks.patch [new file with mode: 0644]
queue-6.6/smb-client-report-correct-st_size-for-smb-and-nfs-symlinks.patch [new file with mode: 0644]

diff --git a/queue-6.6/alsa-hda-disable-power-save-on-kontron-singlepc.patch b/queue-6.6/alsa-hda-disable-power-save-on-kontron-singlepc.patch
new file mode 100644 (file)
index 0000000..47b47b9
--- /dev/null
@@ -0,0 +1,35 @@
+From a337c355719c42a6c5b67e985ad753590ed844fb Mon Sep 17 00:00:00 2001
+From: Takashi Iwai <tiwai@suse.de>
+Date: Thu, 30 Nov 2023 16:13:21 +0100
+Subject: ALSA: hda: Disable power-save on KONTRON SinglePC
+
+From: Takashi Iwai <tiwai@suse.de>
+
+commit a337c355719c42a6c5b67e985ad753590ed844fb upstream.
+
+It's been reported that the runtime PM on KONTRON SinglePC (PCI SSID
+1734:1232) caused a stall of playback after a bunch of invocations.
+(FWIW, this looks like an timing issue, and the stall happens rather
+on the controller side.)
+
+As a workaround, disable the default power-save on this platform.
+
+Cc: <stable@vger.kernel.org>
+Link: https://lore.kernel.org/r/20231130151321.9813-1-tiwai@suse.de
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ sound/pci/hda/hda_intel.c |    2 ++
+ 1 file changed, 2 insertions(+)
+
+--- a/sound/pci/hda/hda_intel.c
++++ b/sound/pci/hda/hda_intel.c
+@@ -2218,6 +2218,8 @@ static const struct snd_pci_quirk power_
+       SND_PCI_QUIRK(0x17aa, 0x36a7, "Lenovo C50 All in one", 0),
+       /* https://bugs.launchpad.net/bugs/1821663 */
+       SND_PCI_QUIRK(0x1631, 0xe017, "Packard Bell NEC IMEDIA 5204", 0),
++      /* KONTRON SinglePC may cause a stall at runtime resume */
++      SND_PCI_QUIRK(0x1734, 0x1232, "KONTRON SinglePC", 0),
+       {}
+ };
+ #endif /* CONFIG_PM */
diff --git a/queue-6.6/alsa-hda-realtek-add-supported-alc257-for-chromeos.patch b/queue-6.6/alsa-hda-realtek-add-supported-alc257-for-chromeos.patch
new file mode 100644 (file)
index 0000000..34cd882
--- /dev/null
@@ -0,0 +1,47 @@
+From cae2bdb579ecc9d4219c58a7d3fde1958118dc1d Mon Sep 17 00:00:00 2001
+From: Kailang Yang <kailang@realtek.com>
+Date: Wed, 29 Nov 2023 15:38:40 +0800
+Subject: ALSA: hda/realtek: Add supported ALC257 for ChromeOS
+
+From: Kailang Yang <kailang@realtek.com>
+
+commit cae2bdb579ecc9d4219c58a7d3fde1958118dc1d upstream.
+
+ChromeOS want to support ALC257.
+Add codec ID to some relation function.
+
+Signed-off-by: Kailang Yang <kailang@realtek.com>
+Cc: <stable@vger.kernel.org>
+Link: https://lore.kernel.org/r/99a88a7dbdb045fd9d934abeb6cec15f@realtek.com
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ sound/pci/hda/patch_realtek.c |    3 +++
+ 1 file changed, 3 insertions(+)
+
+--- a/sound/pci/hda/patch_realtek.c
++++ b/sound/pci/hda/patch_realtek.c
+@@ -3264,6 +3264,7 @@ static void alc_disable_headset_jack_key
+       case 0x10ec0230:
+       case 0x10ec0236:
+       case 0x10ec0256:
++      case 0x10ec0257:
+       case 0x19e58326:
+               alc_write_coef_idx(codec, 0x48, 0x0);
+               alc_update_coef_idx(codec, 0x49, 0x0045, 0x0);
+@@ -3293,6 +3294,7 @@ static void alc_enable_headset_jack_key(
+       case 0x10ec0230:
+       case 0x10ec0236:
+       case 0x10ec0256:
++      case 0x10ec0257:
+       case 0x19e58326:
+               alc_write_coef_idx(codec, 0x48, 0xd011);
+               alc_update_coef_idx(codec, 0x49, 0x007f, 0x0045);
+@@ -6504,6 +6506,7 @@ static void alc_combo_jack_hp_jd_restart
+       case 0x10ec0236:
+       case 0x10ec0255:
+       case 0x10ec0256:
++      case 0x10ec0257:
+       case 0x19e58326:
+               alc_update_coef_idx(codec, 0x1b, 0x8000, 1 << 15); /* Reset HP JD */
+               alc_update_coef_idx(codec, 0x1b, 0x8000, 0 << 15);
diff --git a/queue-6.6/alsa-hda-realtek-headset-mic-vref-to-100.patch b/queue-6.6/alsa-hda-realtek-headset-mic-vref-to-100.patch
new file mode 100644 (file)
index 0000000..e0072e2
--- /dev/null
@@ -0,0 +1,52 @@
+From baaacbff64d9f34b64f294431966d035aeadb81c Mon Sep 17 00:00:00 2001
+From: Kailang Yang <kailang@realtek.com>
+Date: Wed, 25 Oct 2023 15:24:06 +0800
+Subject: ALSA: hda/realtek: Headset Mic VREF to 100%
+
+From: Kailang Yang <kailang@realtek.com>
+
+commit baaacbff64d9f34b64f294431966d035aeadb81c upstream.
+
+This platform need to set Mic VREF to 100%.
+
+Signed-off-by: Kailang Yang <kailang@realtek.com>
+Cc: <stable@vger.kernel.org>
+Link: https://lore.kernel.org/r/0916af40f08a4348a3298a9a59e6967e@realtek.com
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ sound/pci/hda/patch_realtek.c |    9 +++++++++
+ 1 file changed, 9 insertions(+)
+
+--- a/sound/pci/hda/patch_realtek.c
++++ b/sound/pci/hda/patch_realtek.c
+@@ -1986,6 +1986,7 @@ enum {
+       ALC887_FIXUP_ASUS_AUDIO,
+       ALC887_FIXUP_ASUS_HMIC,
+       ALCS1200A_FIXUP_MIC_VREF,
++      ALC888VD_FIXUP_MIC_100VREF,
+ };
+ static void alc889_fixup_coef(struct hda_codec *codec,
+@@ -2539,6 +2540,13 @@ static const struct hda_fixup alc882_fix
+                       {}
+               }
+       },
++      [ALC888VD_FIXUP_MIC_100VREF] = {
++              .type = HDA_FIXUP_PINCTLS,
++              .v.pins = (const struct hda_pintbl[]) {
++                      { 0x18, PIN_VREF100 }, /* headset mic */
++                      {}
++              }
++      },
+ };
+ static const struct snd_pci_quirk alc882_fixup_tbl[] = {
+@@ -2608,6 +2616,7 @@ static const struct snd_pci_quirk alc882
+       SND_PCI_QUIRK(0x106b, 0x4a00, "Macbook 5,2", ALC889_FIXUP_MBA11_VREF),
+       SND_PCI_QUIRK(0x1071, 0x8258, "Evesham Voyaeger", ALC882_FIXUP_EAPD),
++      SND_PCI_QUIRK(0x10ec, 0x12d8, "iBase Elo Touch", ALC888VD_FIXUP_MIC_100VREF),
+       SND_PCI_QUIRK(0x13fe, 0x1009, "Advantech MIT-W101", ALC886_FIXUP_EAPD),
+       SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte EP45-DS3/Z87X-UD3H", ALC889_FIXUP_FRONT_HP_NO_PRESENCE),
+       SND_PCI_QUIRK(0x1458, 0xa0b8, "Gigabyte AZ370-Gaming", ALC1220_FIXUP_GB_DUAL_CODECS),
diff --git a/queue-6.6/cifs-fix-falloc_fl_insert_range-by-setting-i_size-after-eof-moved.patch b/queue-6.6/cifs-fix-falloc_fl_insert_range-by-setting-i_size-after-eof-moved.patch
new file mode 100644 (file)
index 0000000..dd97a09
--- /dev/null
@@ -0,0 +1,41 @@
+From 88010155f02b2c3b03c71609ba6ceeb457ece095 Mon Sep 17 00:00:00 2001
+From: David Howells <dhowells@redhat.com>
+Date: Wed, 29 Nov 2023 16:56:18 +0000
+Subject: cifs: Fix FALLOC_FL_INSERT_RANGE by setting i_size after EOF moved
+
+From: David Howells <dhowells@redhat.com>
+
+commit 88010155f02b2c3b03c71609ba6ceeb457ece095 upstream.
+
+Fix the cifs filesystem implementations of FALLOC_FL_INSERT_RANGE, in
+smb3_insert_range(), to set i_size after extending the file on the server
+and before we do the copy to open the gap (as we don't clean up the EOF
+marker if the copy fails).
+
+Fixes: 7fe6fe95b936 ("cifs: add FALLOC_FL_INSERT_RANGE support")
+Cc: stable@vger.kernel.org
+Signed-off-by: David Howells <dhowells@redhat.com>
+Acked-by: Paulo Alcantara <pc@manguebit.com>
+cc: Shyam Prasad N <nspmangalore@gmail.com>
+cc: Rohith Surabattula <rohiths.msft@gmail.com>
+cc: Jeff Layton <jlayton@kernel.org>
+cc: linux-cifs@vger.kernel.org
+cc: linux-mm@kvack.org
+Signed-off-by: Steve French <stfrench@microsoft.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ fs/smb/client/smb2ops.c |    3 +++
+ 1 file changed, 3 insertions(+)
+
+--- a/fs/smb/client/smb2ops.c
++++ b/fs/smb/client/smb2ops.c
+@@ -3739,6 +3739,9 @@ static long smb3_insert_range(struct fil
+       if (rc < 0)
+               goto out_2;
++      truncate_setsize(inode, old_eof + len);
++      fscache_resize_cookie(cifs_inode_cookie(inode), i_size_read(inode));
++
+       rc = smb2_copychunk_range(xid, cfile, cfile, off, count, off + len);
+       if (rc < 0)
+               goto out_2;
diff --git a/queue-6.6/cifs-fix-falloc_fl_zero_range-by-setting-i_size-if-eof-moved.patch b/queue-6.6/cifs-fix-falloc_fl_zero_range-by-setting-i_size-if-eof-moved.patch
new file mode 100644 (file)
index 0000000..16a8538
--- /dev/null
@@ -0,0 +1,55 @@
+From 83d5518b124dfd605f10a68128482c839a239f9d Mon Sep 17 00:00:00 2001
+From: David Howells <dhowells@redhat.com>
+Date: Wed, 29 Nov 2023 16:56:17 +0000
+Subject: cifs: Fix FALLOC_FL_ZERO_RANGE by setting i_size if EOF moved
+
+From: David Howells <dhowells@redhat.com>
+
+commit 83d5518b124dfd605f10a68128482c839a239f9d upstream.
+
+Fix the cifs filesystem implementations of FALLOC_FL_ZERO_RANGE, in
+smb3_zero_range(), to set i_size after extending the file on the server.
+
+Fixes: 72c419d9b073 ("cifs: fix smb3_zero_range so it can expand the file-size when required")
+Cc: stable@vger.kernel.org
+Signed-off-by: David Howells <dhowells@redhat.com>
+Acked-by: Paulo Alcantara <pc@manguebit.com>
+cc: Shyam Prasad N <nspmangalore@gmail.com>
+cc: Rohith Surabattula <rohiths.msft@gmail.com>
+cc: Jeff Layton <jlayton@kernel.org>
+cc: linux-cifs@vger.kernel.org
+cc: linux-mm@kvack.org
+Signed-off-by: Steve French <stfrench@microsoft.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ fs/smb/client/smb2ops.c |   10 ++++++++--
+ 1 file changed, 8 insertions(+), 2 deletions(-)
+
+--- a/fs/smb/client/smb2ops.c
++++ b/fs/smb/client/smb2ops.c
+@@ -3305,6 +3305,7 @@ static long smb3_zero_range(struct file
+       struct inode *inode = file_inode(file);
+       struct cifsInodeInfo *cifsi = CIFS_I(inode);
+       struct cifsFileInfo *cfile = file->private_data;
++      unsigned long long new_size;
+       long rc;
+       unsigned int xid;
+       __le64 eof;
+@@ -3335,10 +3336,15 @@ static long smb3_zero_range(struct file
+       /*
+        * do we also need to change the size of the file?
+        */
+-      if (keep_size == false && i_size_read(inode) < offset + len) {
+-              eof = cpu_to_le64(offset + len);
++      new_size = offset + len;
++      if (keep_size == false && (unsigned long long)i_size_read(inode) < new_size) {
++              eof = cpu_to_le64(new_size);
+               rc = SMB2_set_eof(xid, tcon, cfile->fid.persistent_fid,
+                                 cfile->fid.volatile_fid, cfile->pid, &eof);
++              if (rc >= 0) {
++                      truncate_setsize(inode, new_size);
++                      fscache_resize_cookie(cifs_inode_cookie(inode), new_size);
++              }
+       }
+  zero_range_exit:
diff --git a/queue-6.6/dm-verity-align-struct-dm_verity_fec_io-properly.patch b/queue-6.6/dm-verity-align-struct-dm_verity_fec_io-properly.patch
new file mode 100644 (file)
index 0000000..28f6c86
--- /dev/null
@@ -0,0 +1,52 @@
+From 38bc1ab135db87577695816b190e7d6d8ec75879 Mon Sep 17 00:00:00 2001
+From: Mikulas Patocka <mpatocka@redhat.com>
+Date: Tue, 28 Nov 2023 14:50:23 +0100
+Subject: dm-verity: align struct dm_verity_fec_io properly
+
+From: Mikulas Patocka <mpatocka@redhat.com>
+
+commit 38bc1ab135db87577695816b190e7d6d8ec75879 upstream.
+
+dm_verity_fec_io is placed after the end of two hash digests. If the hash
+digest has unaligned length, struct dm_verity_fec_io could be unaligned.
+
+This commit fixes the placement of struct dm_verity_fec_io, so that it's
+aligned.
+
+Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>
+Cc: stable@vger.kernel.org
+Fixes: a739ff3f543a ("dm verity: add support for forward error correction")
+Signed-off-by: Mike Snitzer <snitzer@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/md/dm-verity-fec.c |    3 ++-
+ drivers/md/dm-verity.h     |    6 ------
+ 2 files changed, 2 insertions(+), 7 deletions(-)
+
+--- a/drivers/md/dm-verity-fec.c
++++ b/drivers/md/dm-verity-fec.c
+@@ -24,7 +24,8 @@ bool verity_fec_is_enabled(struct dm_ver
+  */
+ static inline struct dm_verity_fec_io *fec_io(struct dm_verity_io *io)
+ {
+-      return (struct dm_verity_fec_io *) verity_io_digest_end(io->v, io);
++      return (struct dm_verity_fec_io *)
++              ((char *)io + io->v->ti->per_io_data_size - sizeof(struct dm_verity_fec_io));
+ }
+ /*
+--- a/drivers/md/dm-verity.h
++++ b/drivers/md/dm-verity.h
+@@ -115,12 +115,6 @@ static inline u8 *verity_io_want_digest(
+       return (u8 *)(io + 1) + v->ahash_reqsize + v->digest_size;
+ }
+-static inline u8 *verity_io_digest_end(struct dm_verity *v,
+-                                     struct dm_verity_io *io)
+-{
+-      return verity_io_want_digest(v, io) + v->digest_size;
+-}
+-
+ extern int verity_for_bv_block(struct dm_verity *v, struct dm_verity_io *io,
+                              struct bvec_iter *iter,
+                              int (*process)(struct dm_verity *v,
diff --git a/queue-6.6/drm-i915-also-check-for-vga-converter-in-edp-probe.patch b/queue-6.6/drm-i915-also-check-for-vga-converter-in-edp-probe.patch
new file mode 100644 (file)
index 0000000..b19a58a
--- /dev/null
@@ -0,0 +1,84 @@
+From f76f83a83c8fdbb62acbf8bd945f10821768145b Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Ville=20Syrj=C3=A4l=C3=A4?= <ville.syrjala@linux.intel.com>
+Date: Tue, 14 Nov 2023 16:23:33 +0200
+Subject: drm/i915: Also check for VGA converter in eDP probe
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Ville Syrjälä <ville.syrjala@linux.intel.com>
+
+commit f76f83a83c8fdbb62acbf8bd945f10821768145b upstream.
+
+Unfortunately even the HPD based detection added in
+commit cfe5bdfb27fa ("drm/i915: Check HPD live state during eDP probe")
+fails to detect that the VBT's eDP/DDI-A is a ghost on
+Asus B360M-A (CFL+CNP). On that board eDP/DDI-A has its HPD
+asserted despite nothing being actually connected there :(
+The straps/fuses also indicate that the eDP port is present.
+
+So if one boots with a VGA monitor connected the eDP probe will
+mistake the DP->VGA converter hooked to DDI-E for an eDP panel
+on DDI-A.
+
+As a last resort check what kind of DP device we've detected,
+and if it looks like a DP->VGA converter then conclude that
+the eDP port should be ignored.
+
+Cc: stable@vger.kernel.org
+Closes: https://gitlab.freedesktop.org/drm/intel/-/issues/9636
+Fixes: cfe5bdfb27fa ("drm/i915: Check HPD live state during eDP probe")
+Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
+Link: https://patchwork.freedesktop.org/patch/msgid/20231114142333.15799-1-ville.syrjala@linux.intel.com
+Reviewed-by: Jani Nikula <jani.nikula@intel.com>
+(cherry picked from commit fcd479a79120bf0cd507d85f898297a3b868dda6)
+Signed-off-by: Jani Nikula <jani.nikula@intel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/gpu/drm/i915/display/intel_dp.c |   28 ++++++++++++++++++++++------
+ 1 file changed, 22 insertions(+), 6 deletions(-)
+
+--- a/drivers/gpu/drm/i915/display/intel_dp.c
++++ b/drivers/gpu/drm/i915/display/intel_dp.c
+@@ -5517,8 +5517,7 @@ static bool intel_edp_init_connector(str
+        * (eg. Acer Chromebook C710), so we'll check it only if multiple
+        * ports are attempting to use the same AUX CH, according to VBT.
+        */
+-      if (intel_bios_dp_has_shared_aux_ch(encoder->devdata) &&
+-          !intel_digital_port_connected(encoder)) {
++      if (intel_bios_dp_has_shared_aux_ch(encoder->devdata)) {
+               /*
+                * If this fails, presume the DPCD answer came
+                * from some other port using the same AUX CH.
+@@ -5526,10 +5525,27 @@ static bool intel_edp_init_connector(str
+                * FIXME maybe cleaner to check this before the
+                * DPCD read? Would need sort out the VDD handling...
+                */
+-              drm_info(&dev_priv->drm,
+-                       "[ENCODER:%d:%s] HPD is down, disabling eDP\n",
+-                       encoder->base.base.id, encoder->base.name);
+-              goto out_vdd_off;
++              if (!intel_digital_port_connected(encoder)) {
++                      drm_info(&dev_priv->drm,
++                               "[ENCODER:%d:%s] HPD is down, disabling eDP\n",
++                               encoder->base.base.id, encoder->base.name);
++                      goto out_vdd_off;
++              }
++
++              /*
++               * Unfortunately even the HPD based detection fails on
++               * eg. Asus B360M-A (CFL+CNP), so as a last resort fall
++               * back to checking for a VGA branch device. Only do this
++               * on known affected platforms to minimize false positives.
++               */
++              if (DISPLAY_VER(dev_priv) == 9 && drm_dp_is_branch(intel_dp->dpcd) &&
++                  (intel_dp->dpcd[DP_DOWNSTREAMPORT_PRESENT] & DP_DWN_STRM_PORT_TYPE_MASK) ==
++                  DP_DWN_STRM_PORT_TYPE_ANALOG) {
++                      drm_info(&dev_priv->drm,
++                               "[ENCODER:%d:%s] VGA converter detected, disabling eDP\n",
++                               encoder->base.base.id, encoder->base.name);
++                      goto out_vdd_off;
++              }
+       }
+       mutex_lock(&dev_priv->drm.mode_config.mutex);
diff --git a/queue-6.6/firewire-core-fix-possible-memory-leak-in-create_units.patch b/queue-6.6/firewire-core-fix-possible-memory-leak-in-create_units.patch
new file mode 100644 (file)
index 0000000..0951e91
--- /dev/null
@@ -0,0 +1,60 @@
+From 891e0eab32a57fca4d36c5162628eb0bcb1f0edf Mon Sep 17 00:00:00 2001
+From: Yang Yingliang <yangyingliang@huawei.com>
+Date: Wed, 29 Nov 2023 17:34:08 +0800
+Subject: firewire: core: fix possible memory leak in create_units()
+
+From: Yang Yingliang <yangyingliang@huawei.com>
+
+commit 891e0eab32a57fca4d36c5162628eb0bcb1f0edf upstream.
+
+If device_register() fails, the refcount of device is not 0, the name
+allocated in dev_set_name() is leaked. To fix this by calling put_device(),
+so that it will be freed in callback function kobject_cleanup().
+
+unreferenced object 0xffff9d99035c7a90 (size 8):
+  comm "systemd-udevd", pid 168, jiffies 4294672386 (age 152.089s)
+  hex dump (first 8 bytes):
+    66 77 30 2e 30 00 ff ff                          fw0.0...
+  backtrace:
+    [<00000000e1d62bac>] __kmem_cache_alloc_node+0x1e9/0x360
+    [<00000000bbeaff31>] __kmalloc_node_track_caller+0x44/0x1a0
+    [<00000000491f2fb4>] kvasprintf+0x67/0xd0
+    [<000000005b960ddc>] kobject_set_name_vargs+0x1e/0x90
+    [<00000000427ac591>] dev_set_name+0x4e/0x70
+    [<000000003b4e447d>] create_units+0xc5/0x110
+
+fw_unit_release() will be called in the error path, move fw_device_get()
+before calling device_register() to keep balanced with fw_device_put() in
+fw_unit_release().
+
+Cc: stable@vger.kernel.org
+Fixes: 1fa5ae857bb1 ("driver core: get rid of struct device's bus_id string array")
+Fixes: a1f64819fe9f ("firewire: struct device - replace bus_id with dev_name(), dev_set_name()")
+Signed-off-by: Yang Yingliang <yangyingliang@huawei.com>
+Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/firewire/core-device.c |   11 ++++-------
+ 1 file changed, 4 insertions(+), 7 deletions(-)
+
+--- a/drivers/firewire/core-device.c
++++ b/drivers/firewire/core-device.c
+@@ -717,14 +717,11 @@ static void create_units(struct fw_devic
+                                       fw_unit_attributes,
+                                       &unit->attribute_group);
+-              if (device_register(&unit->device) < 0)
+-                      goto skip_unit;
+-
+               fw_device_get(device);
+-              continue;
+-
+-      skip_unit:
+-              kfree(unit);
++              if (device_register(&unit->device) < 0) {
++                      put_device(&unit->device);
++                      continue;
++              }
+       }
+ }
diff --git a/queue-6.6/ksmbd-fix-possible-deadlock-in-smb2_open.patch b/queue-6.6/ksmbd-fix-possible-deadlock-in-smb2_open.patch
new file mode 100644 (file)
index 0000000..350f689
--- /dev/null
@@ -0,0 +1,475 @@
+From 864fb5d3716303a045c3ffb397f651bfd37bfb36 Mon Sep 17 00:00:00 2001
+From: Namjae Jeon <linkinjeon@kernel.org>
+Date: Mon, 20 Nov 2023 09:23:09 +0900
+Subject: ksmbd: fix possible deadlock in smb2_open
+
+From: Namjae Jeon <linkinjeon@kernel.org>
+
+commit 864fb5d3716303a045c3ffb397f651bfd37bfb36 upstream.
+
+[ 8743.393379] ======================================================
+[ 8743.393385] WARNING: possible circular locking dependency detected
+[ 8743.393391] 6.4.0-rc1+ #11 Tainted: G           OE
+[ 8743.393397] ------------------------------------------------------
+[ 8743.393402] kworker/0:2/12921 is trying to acquire lock:
+[ 8743.393408] ffff888127a14460 (sb_writers#8){.+.+}-{0:0}, at: ksmbd_vfs_setxattr+0x3d/0xd0 [ksmbd]
+[ 8743.393510]
+               but task is already holding lock:
+[ 8743.393515] ffff8880360d97f0 (&type->i_mutex_dir_key#6/1){+.+.}-{3:3}, at: ksmbd_vfs_kern_path_locked+0x181/0x670 [ksmbd]
+[ 8743.393618]
+               which lock already depends on the new lock.
+
+[ 8743.393623]
+               the existing dependency chain (in reverse order) is:
+[ 8743.393628]
+               -> #1 (&type->i_mutex_dir_key#6/1){+.+.}-{3:3}:
+[ 8743.393648]        down_write_nested+0x9a/0x1b0
+[ 8743.393660]        filename_create+0x128/0x270
+[ 8743.393670]        do_mkdirat+0xab/0x1f0
+[ 8743.393680]        __x64_sys_mkdir+0x47/0x60
+[ 8743.393690]        do_syscall_64+0x5d/0x90
+[ 8743.393701]        entry_SYSCALL_64_after_hwframe+0x72/0xdc
+[ 8743.393711]
+               -> #0 (sb_writers#8){.+.+}-{0:0}:
+[ 8743.393728]        __lock_acquire+0x2201/0x3b80
+[ 8743.393737]        lock_acquire+0x18f/0x440
+[ 8743.393746]        mnt_want_write+0x5f/0x240
+[ 8743.393755]        ksmbd_vfs_setxattr+0x3d/0xd0 [ksmbd]
+[ 8743.393839]        ksmbd_vfs_set_dos_attrib_xattr+0xcc/0x110 [ksmbd]
+[ 8743.393924]        compat_ksmbd_vfs_set_dos_attrib_xattr+0x39/0x50 [ksmbd]
+[ 8743.394010]        smb2_open+0x3432/0x3cc0 [ksmbd]
+[ 8743.394099]        handle_ksmbd_work+0x2c9/0x7b0 [ksmbd]
+[ 8743.394187]        process_one_work+0x65a/0xb30
+[ 8743.394198]        worker_thread+0x2cf/0x700
+[ 8743.394209]        kthread+0x1ad/0x1f0
+[ 8743.394218]        ret_from_fork+0x29/0x50
+
+This patch add mnt_want_write() above parent inode lock and remove
+nested mnt_want_write calls in smb2_open().
+
+Fixes: 40b268d384a2 ("ksmbd: add mnt_want_write to ksmbd vfs functions")
+Cc: stable@vger.kernel.org
+Reported-by: Marios Makassikis <mmakassikis@freebox.fr>
+Signed-off-by: Namjae Jeon <linkinjeon@kernel.org>
+Signed-off-by: Steve French <stfrench@microsoft.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ fs/smb/server/smb2pdu.c |   47 +++++++++++++++------------------
+ fs/smb/server/smbacl.c  |    7 ++--
+ fs/smb/server/smbacl.h  |    2 -
+ fs/smb/server/vfs.c     |   68 ++++++++++++++++++++++++++++--------------------
+ fs/smb/server/vfs.h     |   10 ++++---
+ 5 files changed, 75 insertions(+), 59 deletions(-)
+
+--- a/fs/smb/server/smb2pdu.c
++++ b/fs/smb/server/smb2pdu.c
+@@ -2380,7 +2380,8 @@ static int smb2_set_ea(struct smb2_ea_in
+                       rc = 0;
+               } else {
+                       rc = ksmbd_vfs_setxattr(idmap, path, attr_name, value,
+-                                              le16_to_cpu(eabuf->EaValueLength), 0);
++                                              le16_to_cpu(eabuf->EaValueLength),
++                                              0, true);
+                       if (rc < 0) {
+                               ksmbd_debug(SMB,
+                                           "ksmbd_vfs_setxattr is failed(%d)\n",
+@@ -2443,7 +2444,7 @@ static noinline int smb2_set_stream_name
+               return -EBADF;
+       }
+-      rc = ksmbd_vfs_setxattr(idmap, path, xattr_stream_name, NULL, 0, 0);
++      rc = ksmbd_vfs_setxattr(idmap, path, xattr_stream_name, NULL, 0, 0, false);
+       if (rc < 0)
+               pr_err("Failed to store XATTR stream name :%d\n", rc);
+       return 0;
+@@ -2518,7 +2519,7 @@ static void smb2_new_xattrs(struct ksmbd
+       da.flags = XATTR_DOSINFO_ATTRIB | XATTR_DOSINFO_CREATE_TIME |
+               XATTR_DOSINFO_ITIME;
+-      rc = ksmbd_vfs_set_dos_attrib_xattr(mnt_idmap(path->mnt), path, &da);
++      rc = ksmbd_vfs_set_dos_attrib_xattr(mnt_idmap(path->mnt), path, &da, false);
+       if (rc)
+               ksmbd_debug(SMB, "failed to store file attribute into xattr\n");
+ }
+@@ -2608,7 +2609,7 @@ static int smb2_create_sd_buffer(struct
+           sizeof(struct create_sd_buf_req))
+               return -EINVAL;
+       return set_info_sec(work->conn, work->tcon, path, &sd_buf->ntsd,
+-                          le32_to_cpu(sd_buf->ccontext.DataLength), true);
++                          le32_to_cpu(sd_buf->ccontext.DataLength), true, false);
+ }
+ static void ksmbd_acls_fattr(struct smb_fattr *fattr,
+@@ -3152,7 +3153,8 @@ int smb2_open(struct ksmbd_work *work)
+                                                                   idmap,
+                                                                   &path,
+                                                                   pntsd,
+-                                                                  pntsd_size);
++                                                                  pntsd_size,
++                                                                  false);
+                                       kfree(pntsd);
+                                       if (rc)
+                                               pr_err("failed to store ntacl in xattr : %d\n",
+@@ -3228,12 +3230,6 @@ int smb2_open(struct ksmbd_work *work)
+       if (req->CreateOptions & FILE_DELETE_ON_CLOSE_LE)
+               ksmbd_fd_set_delete_on_close(fp, file_info);
+-      if (need_truncate) {
+-              rc = smb2_create_truncate(&path);
+-              if (rc)
+-                      goto err_out;
+-      }
+-
+       if (req->CreateContextsOffset) {
+               struct create_alloc_size_req *az_req;
+@@ -3398,11 +3394,12 @@ int smb2_open(struct ksmbd_work *work)
+       }
+ err_out:
+-      if (file_present || created) {
+-              inode_unlock(d_inode(parent_path.dentry));
+-              path_put(&path);
+-              path_put(&parent_path);
+-      }
++      if (file_present || created)
++              ksmbd_vfs_kern_path_unlock(&parent_path, &path);
++
++      if (fp && need_truncate)
++              rc = smb2_create_truncate(&fp->filp->f_path);
++
+       ksmbd_revert_fsids(work);
+ err_out1:
+       if (!rc) {
+@@ -5537,7 +5534,7 @@ static int smb2_rename(struct ksmbd_work
+               rc = ksmbd_vfs_setxattr(file_mnt_idmap(fp->filp),
+                                       &fp->filp->f_path,
+                                       xattr_stream_name,
+-                                      NULL, 0, 0);
++                                      NULL, 0, 0, true);
+               if (rc < 0) {
+                       pr_err("failed to store stream name in xattr: %d\n",
+                              rc);
+@@ -5630,11 +5627,9 @@ static int smb2_create_link(struct ksmbd
+       if (rc)
+               rc = -EINVAL;
+ out:
+-      if (file_present) {
+-              inode_unlock(d_inode(parent_path.dentry));
+-              path_put(&path);
+-              path_put(&parent_path);
+-      }
++      if (file_present)
++              ksmbd_vfs_kern_path_unlock(&parent_path, &path);
++
+       if (!IS_ERR(link_name))
+               kfree(link_name);
+       kfree(pathname);
+@@ -5701,7 +5696,8 @@ static int set_file_basic_info(struct ks
+               da.flags = XATTR_DOSINFO_ATTRIB | XATTR_DOSINFO_CREATE_TIME |
+                       XATTR_DOSINFO_ITIME;
+-              rc = ksmbd_vfs_set_dos_attrib_xattr(idmap, &filp->f_path, &da);
++              rc = ksmbd_vfs_set_dos_attrib_xattr(idmap, &filp->f_path, &da,
++                              true);
+               if (rc)
+                       ksmbd_debug(SMB,
+                                   "failed to restore file attribute in EA\n");
+@@ -6013,7 +6009,7 @@ static int smb2_set_info_sec(struct ksmb
+       fp->saccess |= FILE_SHARE_DELETE_LE;
+       return set_info_sec(fp->conn, fp->tcon, &fp->filp->f_path, pntsd,
+-                      buf_len, false);
++                      buf_len, false, true);
+ }
+ /**
+@@ -7582,7 +7578,8 @@ static inline int fsctl_set_sparse(struc
+               da.attr = le32_to_cpu(fp->f_ci->m_fattr);
+               ret = ksmbd_vfs_set_dos_attrib_xattr(idmap,
+-                                                   &fp->filp->f_path, &da);
++                                                   &fp->filp->f_path,
++                                                   &da, true);
+               if (ret)
+                       fp->f_ci->m_fattr = old_fattr;
+       }
+--- a/fs/smb/server/smbacl.c
++++ b/fs/smb/server/smbacl.c
+@@ -1185,7 +1185,7 @@ pass:
+                       pntsd_size += sizeof(struct smb_acl) + nt_size;
+               }
+-              ksmbd_vfs_set_sd_xattr(conn, idmap, path, pntsd, pntsd_size);
++              ksmbd_vfs_set_sd_xattr(conn, idmap, path, pntsd, pntsd_size, false);
+               kfree(pntsd);
+       }
+@@ -1377,7 +1377,7 @@ err_out:
+ int set_info_sec(struct ksmbd_conn *conn, struct ksmbd_tree_connect *tcon,
+                const struct path *path, struct smb_ntsd *pntsd, int ntsd_len,
+-               bool type_check)
++               bool type_check, bool get_write)
+ {
+       int rc;
+       struct smb_fattr fattr = {{0}};
+@@ -1437,7 +1437,8 @@ int set_info_sec(struct ksmbd_conn *conn
+       if (test_share_config_flag(tcon->share_conf, KSMBD_SHARE_FLAG_ACL_XATTR)) {
+               /* Update WinACL in xattr */
+               ksmbd_vfs_remove_sd_xattrs(idmap, path);
+-              ksmbd_vfs_set_sd_xattr(conn, idmap, path, pntsd, ntsd_len);
++              ksmbd_vfs_set_sd_xattr(conn, idmap, path, pntsd, ntsd_len,
++                              get_write);
+       }
+ out:
+--- a/fs/smb/server/smbacl.h
++++ b/fs/smb/server/smbacl.h
+@@ -207,7 +207,7 @@ int smb_check_perm_dacl(struct ksmbd_con
+                       __le32 *pdaccess, int uid);
+ int set_info_sec(struct ksmbd_conn *conn, struct ksmbd_tree_connect *tcon,
+                const struct path *path, struct smb_ntsd *pntsd, int ntsd_len,
+-               bool type_check);
++               bool type_check, bool get_write);
+ void id_to_sid(unsigned int cid, uint sidtype, struct smb_sid *ssid);
+ void ksmbd_init_domain(u32 *sub_auth);
+--- a/fs/smb/server/vfs.c
++++ b/fs/smb/server/vfs.c
+@@ -97,6 +97,13 @@ static int ksmbd_vfs_path_lookup_locked(
+               return -ENOENT;
+       }
++      err = mnt_want_write(parent_path->mnt);
++      if (err) {
++              path_put(parent_path);
++              putname(filename);
++              return -ENOENT;
++      }
++
+       inode_lock_nested(parent_path->dentry->d_inode, I_MUTEX_PARENT);
+       d = lookup_one_qstr_excl(&last, parent_path->dentry, 0);
+       if (IS_ERR(d))
+@@ -123,6 +130,7 @@ static int ksmbd_vfs_path_lookup_locked(
+ err_out:
+       inode_unlock(d_inode(parent_path->dentry));
++      mnt_drop_write(parent_path->mnt);
+       path_put(parent_path);
+       putname(filename);
+       return -ENOENT;
+@@ -451,7 +459,8 @@ static int ksmbd_vfs_stream_write(struct
+                                fp->stream.name,
+                                (void *)stream_buf,
+                                size,
+-                               0);
++                               0,
++                               true);
+       if (err < 0)
+               goto out;
+@@ -593,10 +602,6 @@ int ksmbd_vfs_remove_file(struct ksmbd_w
+               goto out_err;
+       }
+-      err = mnt_want_write(path->mnt);
+-      if (err)
+-              goto out_err;
+-
+       idmap = mnt_idmap(path->mnt);
+       if (S_ISDIR(d_inode(path->dentry)->i_mode)) {
+               err = vfs_rmdir(idmap, d_inode(parent), path->dentry);
+@@ -607,7 +612,6 @@ int ksmbd_vfs_remove_file(struct ksmbd_w
+               if (err)
+                       ksmbd_debug(VFS, "unlink failed, err %d\n", err);
+       }
+-      mnt_drop_write(path->mnt);
+ out_err:
+       ksmbd_revert_fsids(work);
+@@ -907,18 +911,22 @@ ssize_t ksmbd_vfs_getxattr(struct mnt_id
+  * @attr_value:       xattr value to set
+  * @attr_size:        size of xattr value
+  * @flags:    destination buffer length
++ * @get_write:        get write access to a mount
+  *
+  * Return:    0 on success, otherwise error
+  */
+ int ksmbd_vfs_setxattr(struct mnt_idmap *idmap,
+                      const struct path *path, const char *attr_name,
+-                     void *attr_value, size_t attr_size, int flags)
++                     void *attr_value, size_t attr_size, int flags,
++                     bool get_write)
+ {
+       int err;
+-      err = mnt_want_write(path->mnt);
+-      if (err)
+-              return err;
++      if (get_write == true) {
++              err = mnt_want_write(path->mnt);
++              if (err)
++                      return err;
++      }
+       err = vfs_setxattr(idmap,
+                          path->dentry,
+@@ -928,7 +936,8 @@ int ksmbd_vfs_setxattr(struct mnt_idmap
+                          flags);
+       if (err)
+               ksmbd_debug(VFS, "setxattr failed, err %d\n", err);
+-      mnt_drop_write(path->mnt);
++      if (get_write == true)
++              mnt_drop_write(path->mnt);
+       return err;
+ }
+@@ -1251,6 +1260,13 @@ out1:
+       }
+       if (!err) {
++              err = mnt_want_write(parent_path->mnt);
++              if (err) {
++                      path_put(path);
++                      path_put(parent_path);
++                      return err;
++              }
++
+               err = ksmbd_vfs_lock_parent(parent_path->dentry, path->dentry);
+               if (err) {
+                       path_put(path);
+@@ -1260,6 +1276,14 @@ out1:
+       return err;
+ }
++void ksmbd_vfs_kern_path_unlock(struct path *parent_path, struct path *path)
++{
++      inode_unlock(d_inode(parent_path->dentry));
++      mnt_drop_write(parent_path->mnt);
++      path_put(path);
++      path_put(parent_path);
++}
++
+ struct dentry *ksmbd_vfs_kern_path_create(struct ksmbd_work *work,
+                                         const char *name,
+                                         unsigned int flags,
+@@ -1414,7 +1438,8 @@ out:
+ int ksmbd_vfs_set_sd_xattr(struct ksmbd_conn *conn,
+                          struct mnt_idmap *idmap,
+                          const struct path *path,
+-                         struct smb_ntsd *pntsd, int len)
++                         struct smb_ntsd *pntsd, int len,
++                         bool get_write)
+ {
+       int rc;
+       struct ndr sd_ndr = {0}, acl_ndr = {0};
+@@ -1474,7 +1499,7 @@ int ksmbd_vfs_set_sd_xattr(struct ksmbd_
+       rc = ksmbd_vfs_setxattr(idmap, path,
+                               XATTR_NAME_SD, sd_ndr.data,
+-                              sd_ndr.offset, 0);
++                              sd_ndr.offset, 0, get_write);
+       if (rc < 0)
+               pr_err("Failed to store XATTR ntacl :%d\n", rc);
+@@ -1563,7 +1588,8 @@ free_n_data:
+ int ksmbd_vfs_set_dos_attrib_xattr(struct mnt_idmap *idmap,
+                                  const struct path *path,
+-                                 struct xattr_dos_attrib *da)
++                                 struct xattr_dos_attrib *da,
++                                 bool get_write)
+ {
+       struct ndr n;
+       int err;
+@@ -1573,7 +1599,7 @@ int ksmbd_vfs_set_dos_attrib_xattr(struc
+               return err;
+       err = ksmbd_vfs_setxattr(idmap, path, XATTR_NAME_DOS_ATTRIBUTE,
+-                               (void *)n.data, n.offset, 0);
++                               (void *)n.data, n.offset, 0, get_write);
+       if (err)
+               ksmbd_debug(SMB, "failed to store dos attribute in xattr\n");
+       kfree(n.data);
+@@ -1845,10 +1871,6 @@ int ksmbd_vfs_set_init_posix_acl(struct
+       }
+       posix_state_to_acl(&acl_state, acls->a_entries);
+-      rc = mnt_want_write(path->mnt);
+-      if (rc)
+-              goto out_err;
+-
+       rc = set_posix_acl(idmap, dentry, ACL_TYPE_ACCESS, acls);
+       if (rc < 0)
+               ksmbd_debug(SMB, "Set posix acl(ACL_TYPE_ACCESS) failed, rc : %d\n",
+@@ -1860,9 +1882,7 @@ int ksmbd_vfs_set_init_posix_acl(struct
+                       ksmbd_debug(SMB, "Set posix acl(ACL_TYPE_DEFAULT) failed, rc : %d\n",
+                                   rc);
+       }
+-      mnt_drop_write(path->mnt);
+-out_err:
+       free_acl_state(&acl_state);
+       posix_acl_release(acls);
+       return rc;
+@@ -1892,10 +1912,6 @@ int ksmbd_vfs_inherit_posix_acl(struct m
+               }
+       }
+-      rc = mnt_want_write(path->mnt);
+-      if (rc)
+-              goto out_err;
+-
+       rc = set_posix_acl(idmap, dentry, ACL_TYPE_ACCESS, acls);
+       if (rc < 0)
+               ksmbd_debug(SMB, "Set posix acl(ACL_TYPE_ACCESS) failed, rc : %d\n",
+@@ -1907,9 +1923,7 @@ int ksmbd_vfs_inherit_posix_acl(struct m
+                       ksmbd_debug(SMB, "Set posix acl(ACL_TYPE_DEFAULT) failed, rc : %d\n",
+                                   rc);
+       }
+-      mnt_drop_write(path->mnt);
+-out_err:
+       posix_acl_release(acls);
+       return rc;
+ }
+--- a/fs/smb/server/vfs.h
++++ b/fs/smb/server/vfs.h
+@@ -109,7 +109,8 @@ ssize_t ksmbd_vfs_casexattr_len(struct m
+                               int attr_name_len);
+ int ksmbd_vfs_setxattr(struct mnt_idmap *idmap,
+                      const struct path *path, const char *attr_name,
+-                     void *attr_value, size_t attr_size, int flags);
++                     void *attr_value, size_t attr_size, int flags,
++                     bool get_write);
+ int ksmbd_vfs_xattr_stream_name(char *stream_name, char **xattr_stream_name,
+                               size_t *xattr_stream_name_size, int s_type);
+ int ksmbd_vfs_remove_xattr(struct mnt_idmap *idmap,
+@@ -117,6 +118,7 @@ int ksmbd_vfs_remove_xattr(struct mnt_id
+ int ksmbd_vfs_kern_path_locked(struct ksmbd_work *work, char *name,
+                              unsigned int flags, struct path *parent_path,
+                              struct path *path, bool caseless);
++void ksmbd_vfs_kern_path_unlock(struct path *parent_path, struct path *path);
+ struct dentry *ksmbd_vfs_kern_path_create(struct ksmbd_work *work,
+                                         const char *name,
+                                         unsigned int flags,
+@@ -144,14 +146,16 @@ int ksmbd_vfs_remove_sd_xattrs(struct mn
+ int ksmbd_vfs_set_sd_xattr(struct ksmbd_conn *conn,
+                          struct mnt_idmap *idmap,
+                          const struct path *path,
+-                         struct smb_ntsd *pntsd, int len);
++                         struct smb_ntsd *pntsd, int len,
++                         bool get_write);
+ int ksmbd_vfs_get_sd_xattr(struct ksmbd_conn *conn,
+                          struct mnt_idmap *idmap,
+                          struct dentry *dentry,
+                          struct smb_ntsd **pntsd);
+ int ksmbd_vfs_set_dos_attrib_xattr(struct mnt_idmap *idmap,
+                                  const struct path *path,
+-                                 struct xattr_dos_attrib *da);
++                                 struct xattr_dos_attrib *da,
++                                 bool get_write);
+ int ksmbd_vfs_get_dos_attrib_xattr(struct mnt_idmap *idmap,
+                                  struct dentry *dentry,
+                                  struct xattr_dos_attrib *da);
diff --git a/queue-6.6/leds-class-don-t-expose-color-sysfs-entry.patch b/queue-6.6/leds-class-don-t-expose-color-sysfs-entry.patch
new file mode 100644 (file)
index 0000000..f45e5e6
--- /dev/null
@@ -0,0 +1,96 @@
+From 8f2244c9af245ff72185c0473827125ee6b2d1a5 Mon Sep 17 00:00:00 2001
+From: Takashi Iwai <tiwai@suse.de>
+Date: Tue, 21 Nov 2023 17:23:59 +0100
+Subject: leds: class: Don't expose color sysfs entry
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Takashi Iwai <tiwai@suse.de>
+
+commit 8f2244c9af245ff72185c0473827125ee6b2d1a5 upstream.
+
+The commit c7d80059b086 ("leds: class: Store the color index in struct
+led_classdev") introduced a new sysfs entry "color" that is commonly
+created for the led classdev.  Unfortunately, this conflicts with the
+"color" sysfs entry of already existing drivers such as Logitech HID
+or System76 ACPI drivers.  The driver probe fails due to the conflict,
+hence it leads to a severe regression with the missing keyboard, for
+example.
+
+This patch reverts partially the change in the commit above for
+removing the led class color sysfs entries again for addressing the
+regressions.  The newly introduced led_classdev.color field is kept as
+it's already used by other driver.
+
+Fixes: c7d80059b086 ("leds: class: Store the color index in struct led_classdev")
+Reported-by: Johannes Penßel <johannes.penssel@gmail.com>
+Closes: https://lore.kernel.org/r/b5646db3-acff-45aa-baef-df3f660486fb@gmail.com
+Link: https://bugzilla.kernel.org/show_bug.cgi?id=218045
+Link: https://bugzilla.kernel.org/show_bug.cgi?id=218155
+Link: https://bugzilla.suse.com/show_bug.cgi?id=1217172
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Reviewed-by: Hans de Goede <hdegoede@redhat.com>
+Link: https://lore.kernel.org/r/20231121162359.9332-1-tiwai@suse.de
+Signed-off-by: Lee Jones <lee@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ Documentation/ABI/testing/sysfs-class-led |  9 ---------
+ drivers/leds/led-class.c                  | 14 --------------
+ 2 files changed, 23 deletions(-)
+
+diff --git a/Documentation/ABI/testing/sysfs-class-led b/Documentation/ABI/testing/sysfs-class-led
+index b2ff0012c0f2..2e24ac3bd7ef 100644
+--- a/Documentation/ABI/testing/sysfs-class-led
++++ b/Documentation/ABI/testing/sysfs-class-led
+@@ -59,15 +59,6 @@ Description:
+               brightness. Reading this file when no hw brightness change
+               event has happened will return an ENODATA error.
+-What:         /sys/class/leds/<led>/color
+-Date:         June 2023
+-KernelVersion:        6.5
+-Description:
+-              Color of the LED.
+-
+-              This is a read-only file. Reading this file returns the color
+-              of the LED as a string (e.g: "red", "green", "multicolor").
+-
+ What:         /sys/class/leds/<led>/trigger
+ Date:         March 2006
+ KernelVersion:        2.6.17
+diff --git a/drivers/leds/led-class.c b/drivers/leds/led-class.c
+index 974b84f6bd6a..ba1be15cfd8e 100644
+--- a/drivers/leds/led-class.c
++++ b/drivers/leds/led-class.c
+@@ -75,19 +75,6 @@ static ssize_t max_brightness_show(struct device *dev,
+ }
+ static DEVICE_ATTR_RO(max_brightness);
+-static ssize_t color_show(struct device *dev,
+-              struct device_attribute *attr, char *buf)
+-{
+-      const char *color_text = "invalid";
+-      struct led_classdev *led_cdev = dev_get_drvdata(dev);
+-
+-      if (led_cdev->color < LED_COLOR_ID_MAX)
+-              color_text = led_colors[led_cdev->color];
+-
+-      return sysfs_emit(buf, "%s\n", color_text);
+-}
+-static DEVICE_ATTR_RO(color);
+-
+ #ifdef CONFIG_LEDS_TRIGGERS
+ static BIN_ATTR(trigger, 0644, led_trigger_read, led_trigger_write, 0);
+ static struct bin_attribute *led_trigger_bin_attrs[] = {
+@@ -102,7 +89,6 @@ static const struct attribute_group led_trigger_group = {
+ static struct attribute *led_class_attrs[] = {
+       &dev_attr_brightness.attr,
+       &dev_attr_max_brightness.attr,
+-      &dev_attr_color.attr,
+       NULL,
+ };
+-- 
+2.43.0
+
diff --git a/queue-6.6/mmc-block-be-sure-to-wait-while-busy-in-cqe-error-recovery.patch b/queue-6.6/mmc-block-be-sure-to-wait-while-busy-in-cqe-error-recovery.patch
new file mode 100644 (file)
index 0000000..6fdafe1
--- /dev/null
@@ -0,0 +1,36 @@
+From c616696a902987352426fdaeec1b0b3240949e6b Mon Sep 17 00:00:00 2001
+From: Adrian Hunter <adrian.hunter@intel.com>
+Date: Fri, 3 Nov 2023 10:47:17 +0200
+Subject: mmc: block: Be sure to wait while busy in CQE error recovery
+
+From: Adrian Hunter <adrian.hunter@intel.com>
+
+commit c616696a902987352426fdaeec1b0b3240949e6b upstream.
+
+STOP command does not guarantee to wait while busy, but subsequent command
+MMC_CMDQ_TASK_MGMT to discard the queue will fail if the card is busy, so
+be sure to wait by employing mmc_poll_for_busy().
+
+Fixes: 72a5af554df8 ("mmc: core: Add support for handling CQE requests")
+Cc: stable@vger.kernel.org
+Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
+Reviewed-by: Avri Altman <avri.altman@wdc.com>
+Reviewed-by: Christian Loehle <christian.loehle@arm.com>
+Link: https://lore.kernel.org/r/20231103084720.6886-4-adrian.hunter@intel.com
+Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/mmc/core/core.c |    2 ++
+ 1 file changed, 2 insertions(+)
+
+--- a/drivers/mmc/core/core.c
++++ b/drivers/mmc/core/core.c
+@@ -553,6 +553,8 @@ int mmc_cqe_recovery(struct mmc_host *ho
+       cmd.busy_timeout = MMC_CQE_RECOVERY_TIMEOUT;
+       mmc_wait_for_cmd(host, &cmd, MMC_CMD_RETRIES);
++      mmc_poll_for_busy(host->card, MMC_CQE_RECOVERY_TIMEOUT, true, MMC_BUSY_IO);
++
+       memset(&cmd, 0, sizeof(cmd));
+       cmd.opcode       = MMC_CMDQ_TASK_MGMT;
+       cmd.arg          = 1; /* Discard entire queue */
diff --git a/queue-6.6/mmc-block-do-not-lose-cache-flush-during-cqe-error-recovery.patch b/queue-6.6/mmc-block-do-not-lose-cache-flush-during-cqe-error-recovery.patch
new file mode 100644 (file)
index 0000000..3a618c8
--- /dev/null
@@ -0,0 +1,38 @@
+From 174925d340aac55296318e43fd96c0e1d196e105 Mon Sep 17 00:00:00 2001
+From: Adrian Hunter <adrian.hunter@intel.com>
+Date: Fri, 3 Nov 2023 10:47:15 +0200
+Subject: mmc: block: Do not lose cache flush during CQE error recovery
+
+From: Adrian Hunter <adrian.hunter@intel.com>
+
+commit 174925d340aac55296318e43fd96c0e1d196e105 upstream.
+
+During CQE error recovery, error-free data commands get requeued if there
+is any data left to transfer, but non-data commands are completed even
+though they have not been processed.  Requeue them instead.
+
+Note the only non-data command is cache flush, which would have resulted in
+a cache flush being lost if it was queued at the time of CQE recovery.
+
+Fixes: 1e8e55b67030 ("mmc: block: Add CQE support")
+Cc: stable@vger.kernel.org
+Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
+Reviewed-by: Avri Altman <avri.altman@wdc.com>
+Link: https://lore.kernel.org/r/20231103084720.6886-2-adrian.hunter@intel.com
+Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/mmc/core/block.c |    2 ++
+ 1 file changed, 2 insertions(+)
+
+--- a/drivers/mmc/core/block.c
++++ b/drivers/mmc/core/block.c
+@@ -1482,6 +1482,8 @@ static void mmc_blk_cqe_complete_rq(stru
+                       blk_mq_requeue_request(req, true);
+               else
+                       __blk_mq_end_request(req, BLK_STS_OK);
++      } else if (mq->in_recovery) {
++              blk_mq_requeue_request(req, true);
+       } else {
+               blk_mq_end_request(req, BLK_STS_OK);
+       }
diff --git a/queue-6.6/mmc-block-retry-commands-in-cqe-error-recovery.patch b/queue-6.6/mmc-block-retry-commands-in-cqe-error-recovery.patch
new file mode 100644 (file)
index 0000000..e9cf2cc
--- /dev/null
@@ -0,0 +1,50 @@
+From 8155d1fa3a747baad5caff5f8303321d68ddd48c Mon Sep 17 00:00:00 2001
+From: Adrian Hunter <adrian.hunter@intel.com>
+Date: Fri, 3 Nov 2023 10:47:18 +0200
+Subject: mmc: block: Retry commands in CQE error recovery
+
+From: Adrian Hunter <adrian.hunter@intel.com>
+
+commit 8155d1fa3a747baad5caff5f8303321d68ddd48c upstream.
+
+It is important that MMC_CMDQ_TASK_MGMT command to discard the queue is
+successful because otherwise a subsequent reset might fail to flush the
+cache first.  Retry it and the previous STOP command.
+
+Fixes: 72a5af554df8 ("mmc: core: Add support for handling CQE requests")
+Cc: stable@vger.kernel.org
+Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
+Reviewed-by: Avri Altman <avri.altman@wdc.com>
+Link: https://lore.kernel.org/r/20231103084720.6886-5-adrian.hunter@intel.com
+Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/mmc/core/core.c |    7 +++++--
+ 1 file changed, 5 insertions(+), 2 deletions(-)
+
+--- a/drivers/mmc/core/core.c
++++ b/drivers/mmc/core/core.c
+@@ -551,7 +551,7 @@ int mmc_cqe_recovery(struct mmc_host *ho
+       cmd.flags        = MMC_RSP_R1B | MMC_CMD_AC;
+       cmd.flags       &= ~MMC_RSP_CRC; /* Ignore CRC */
+       cmd.busy_timeout = MMC_CQE_RECOVERY_TIMEOUT;
+-      mmc_wait_for_cmd(host, &cmd, 0);
++      mmc_wait_for_cmd(host, &cmd, MMC_CMD_RETRIES);
+       memset(&cmd, 0, sizeof(cmd));
+       cmd.opcode       = MMC_CMDQ_TASK_MGMT;
+@@ -559,10 +559,13 @@ int mmc_cqe_recovery(struct mmc_host *ho
+       cmd.flags        = MMC_RSP_R1B | MMC_CMD_AC;
+       cmd.flags       &= ~MMC_RSP_CRC; /* Ignore CRC */
+       cmd.busy_timeout = MMC_CQE_RECOVERY_TIMEOUT;
+-      err = mmc_wait_for_cmd(host, &cmd, 0);
++      err = mmc_wait_for_cmd(host, &cmd, MMC_CMD_RETRIES);
+       host->cqe_ops->cqe_recovery_finish(host);
++      if (err)
++              err = mmc_wait_for_cmd(host, &cmd, MMC_CMD_RETRIES);
++
+       mmc_retune_release(host);
+       return err;
diff --git a/queue-6.6/mmc-cqhci-fix-task-clearing-in-cqe-error-recovery.patch b/queue-6.6/mmc-cqhci-fix-task-clearing-in-cqe-error-recovery.patch
new file mode 100644 (file)
index 0000000..ed281ce
--- /dev/null
@@ -0,0 +1,93 @@
+From 1de1b77982e1a1df9707cb11f9b1789e6b8919d4 Mon Sep 17 00:00:00 2001
+From: Adrian Hunter <adrian.hunter@intel.com>
+Date: Fri, 3 Nov 2023 10:47:20 +0200
+Subject: mmc: cqhci: Fix task clearing in CQE error recovery
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Adrian Hunter <adrian.hunter@intel.com>
+
+commit 1de1b77982e1a1df9707cb11f9b1789e6b8919d4 upstream.
+
+If a task completion notification (TCN) is received when there is no
+outstanding task, the cqhci driver issues a "spurious TCN" warning. This
+was observed to happen right after CQE error recovery.
+
+When an error interrupt is received the driver runs recovery logic.
+It halts the controller, clears all pending tasks, and then re-enables
+it. On some platforms, like Intel Jasper Lake, a stale task completion
+event was observed, regardless of the CQHCI_CLEAR_ALL_TASKS bit being set.
+
+This results in either:
+a) Spurious TC completion event for an empty slot.
+b) Corrupted data being passed up the stack, as a result of premature
+   completion for a newly added task.
+
+Rather than add a quirk for affected controllers, ensure tasks are cleared
+by toggling CQHCI_ENABLE, which would happen anyway if
+cqhci_clear_all_tasks() timed out. This is simpler and should be safe and
+effective for all controllers.
+
+Fixes: a4080225f51d ("mmc: cqhci: support for command queue enabled host")
+Cc: stable@vger.kernel.org
+Reported-by: Kornel Dulęba <korneld@chromium.org>
+Tested-by: Kornel Dulęba <korneld@chromium.org>
+Co-developed-by: Kornel Dulęba <korneld@chromium.org>
+Signed-off-by: Kornel Dulęba <korneld@chromium.org>
+Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
+Reviewed-by: Avri Altman <avri.altman@wdc.com>
+Link: https://lore.kernel.org/r/20231103084720.6886-7-adrian.hunter@intel.com
+Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/mmc/host/cqhci-core.c |   32 ++++++++++++++++----------------
+ 1 file changed, 16 insertions(+), 16 deletions(-)
+
+--- a/drivers/mmc/host/cqhci-core.c
++++ b/drivers/mmc/host/cqhci-core.c
+@@ -1075,28 +1075,28 @@ static void cqhci_recovery_finish(struct
+       ok = cqhci_halt(mmc, CQHCI_FINISH_HALT_TIMEOUT);
+-      if (!cqhci_clear_all_tasks(mmc, CQHCI_CLEAR_TIMEOUT))
+-              ok = false;
+-
+       /*
+        * The specification contradicts itself, by saying that tasks cannot be
+        * cleared if CQHCI does not halt, but if CQHCI does not halt, it should
+        * be disabled/re-enabled, but not to disable before clearing tasks.
+        * Have a go anyway.
+        */
+-      if (!ok) {
+-              pr_debug("%s: cqhci: disable / re-enable\n", mmc_hostname(mmc));
+-              cqcfg = cqhci_readl(cq_host, CQHCI_CFG);
+-              cqcfg &= ~CQHCI_ENABLE;
+-              cqhci_writel(cq_host, cqcfg, CQHCI_CFG);
+-              cqcfg |= CQHCI_ENABLE;
+-              cqhci_writel(cq_host, cqcfg, CQHCI_CFG);
+-              /* Be sure that there are no tasks */
+-              ok = cqhci_halt(mmc, CQHCI_FINISH_HALT_TIMEOUT);
+-              if (!cqhci_clear_all_tasks(mmc, CQHCI_CLEAR_TIMEOUT))
+-                      ok = false;
+-              WARN_ON(!ok);
+-      }
++      if (!cqhci_clear_all_tasks(mmc, CQHCI_CLEAR_TIMEOUT))
++              ok = false;
++
++      /* Disable to make sure tasks really are cleared */
++      cqcfg = cqhci_readl(cq_host, CQHCI_CFG);
++      cqcfg &= ~CQHCI_ENABLE;
++      cqhci_writel(cq_host, cqcfg, CQHCI_CFG);
++
++      cqcfg = cqhci_readl(cq_host, CQHCI_CFG);
++      cqcfg |= CQHCI_ENABLE;
++      cqhci_writel(cq_host, cqcfg, CQHCI_CFG);
++
++      cqhci_halt(mmc, CQHCI_FINISH_HALT_TIMEOUT);
++
++      if (!ok)
++              cqhci_clear_all_tasks(mmc, CQHCI_CLEAR_TIMEOUT);
+       cqhci_recover_mrqs(cq_host);
diff --git a/queue-6.6/mmc-cqhci-increase-recovery-halt-timeout.patch b/queue-6.6/mmc-cqhci-increase-recovery-halt-timeout.patch
new file mode 100644 (file)
index 0000000..870d7dd
--- /dev/null
@@ -0,0 +1,40 @@
+From b578d5d18e929aa7c007a98cce32657145dde219 Mon Sep 17 00:00:00 2001
+From: Adrian Hunter <adrian.hunter@intel.com>
+Date: Fri, 3 Nov 2023 10:47:16 +0200
+Subject: mmc: cqhci: Increase recovery halt timeout
+
+From: Adrian Hunter <adrian.hunter@intel.com>
+
+commit b578d5d18e929aa7c007a98cce32657145dde219 upstream.
+
+Failing to halt complicates the recovery. Additionally, unless the card or
+controller are stuck, which is expected to be very rare, then the halt
+should succeed, so it is better to wait. Set a large timeout.
+
+Fixes: a4080225f51d ("mmc: cqhci: support for command queue enabled host")
+Cc: stable@vger.kernel.org
+Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
+Reviewed-by: Avri Altman <avri.altman@wdc.com>
+Link: https://lore.kernel.org/r/20231103084720.6886-3-adrian.hunter@intel.com
+Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/mmc/host/cqhci-core.c |    6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+--- a/drivers/mmc/host/cqhci-core.c
++++ b/drivers/mmc/host/cqhci-core.c
+@@ -984,10 +984,10 @@ static bool cqhci_halt(struct mmc_host *
+ /*
+  * After halting we expect to be able to use the command line. We interpret the
+  * failure to halt to mean the data lines might still be in use (and the upper
+- * layers will need to send a STOP command), so we set the timeout based on a
+- * generous command timeout.
++ * layers will need to send a STOP command), however failing to halt complicates
++ * the recovery, so set a timeout that would reasonably allow I/O to complete.
+  */
+-#define CQHCI_START_HALT_TIMEOUT      5
++#define CQHCI_START_HALT_TIMEOUT      500
+ static void cqhci_recovery_start(struct mmc_host *mmc)
+ {
diff --git a/queue-6.6/mmc-cqhci-warn-of-halt-or-task-clear-failure.patch b/queue-6.6/mmc-cqhci-warn-of-halt-or-task-clear-failure.patch
new file mode 100644 (file)
index 0000000..14e178d
--- /dev/null
@@ -0,0 +1,47 @@
+From 35597bdb04ec27ef3b1cea007dc69f8ff5df75a5 Mon Sep 17 00:00:00 2001
+From: Adrian Hunter <adrian.hunter@intel.com>
+Date: Fri, 3 Nov 2023 10:47:19 +0200
+Subject: mmc: cqhci: Warn of halt or task clear failure
+
+From: Adrian Hunter <adrian.hunter@intel.com>
+
+commit 35597bdb04ec27ef3b1cea007dc69f8ff5df75a5 upstream.
+
+A correctly operating controller should successfully halt and clear tasks.
+Failure may result in errors elsewhere, so promote messages from debug to
+warnings.
+
+Fixes: a4080225f51d ("mmc: cqhci: support for command queue enabled host")
+Cc: stable@vger.kernel.org
+Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
+Reviewed-by: Avri Altman <avri.altman@wdc.com>
+Reviewed-by: Avri Altman <avri.altman@wdc.com>
+Link: https://lore.kernel.org/r/20231103084720.6886-6-adrian.hunter@intel.com
+Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/mmc/host/cqhci-core.c |    6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+--- a/drivers/mmc/host/cqhci-core.c
++++ b/drivers/mmc/host/cqhci-core.c
+@@ -942,8 +942,8 @@ static bool cqhci_clear_all_tasks(struct
+       ret = cqhci_tasks_cleared(cq_host);
+       if (!ret)
+-              pr_debug("%s: cqhci: Failed to clear tasks\n",
+-                       mmc_hostname(mmc));
++              pr_warn("%s: cqhci: Failed to clear tasks\n",
++                      mmc_hostname(mmc));
+       return ret;
+ }
+@@ -976,7 +976,7 @@ static bool cqhci_halt(struct mmc_host *
+       ret = cqhci_halted(cq_host);
+       if (!ret)
+-              pr_debug("%s: cqhci: Failed to halt\n", mmc_hostname(mmc));
++              pr_warn("%s: cqhci: Failed to halt\n", mmc_hostname(mmc));
+       return ret;
+ }
diff --git a/queue-6.6/mmc-sdhci-pci-gli-disable-lpm-during-initialization.patch b/queue-6.6/mmc-sdhci-pci-gli-disable-lpm-during-initialization.patch
new file mode 100644 (file)
index 0000000..11d0153
--- /dev/null
@@ -0,0 +1,115 @@
+From d9ed644f58670865cf067351deb71010bd87a52f Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Kornel=20Dul=C4=99ba?= <korneld@chromium.org>
+Date: Tue, 14 Nov 2023 11:54:49 +0000
+Subject: mmc: sdhci-pci-gli: Disable LPM during initialization
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Kornel Dulęba <korneld@chromium.org>
+
+commit d9ed644f58670865cf067351deb71010bd87a52f upstream.
+
+To address IO performance commit f9e5b33934ce
+("mmc: host: Improve I/O read/write performance for GL9763E")
+limited LPM negotiation to runtime suspend state.
+The problem is that it only flips the switch in the runtime PM
+resume/suspend logic.
+
+Disable LPM negotiation in gl9763e_add_host.
+This helps in two ways:
+1. It was found that the LPM switch stays in the same position after
+   warm reboot. Having it set in init helps with consistency.
+2. Disabling LPM during the first runtime resume leaves us susceptible
+   to the performance issue in the time window between boot and the
+   first runtime suspend.
+
+Fixes: f9e5b33934ce ("mmc: host: Improve I/O read/write performance for GL9763E")
+Cc: stable@vger.kernel.org
+Signed-off-by: Kornel Dulęba <korneld@chromium.org>
+Reviewed-by: Sven van Ashbrook <svenva@chromium.org>
+Acked-by: Adrian Hunter <adrian.hunter@intel.com>
+Link: https://lore.kernel.org/r/20231114115516.1585361-1-korneld@chromium.org
+Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/mmc/host/sdhci-pci-gli.c |   54 ++++++++++++++++++++-------------------
+ 1 file changed, 29 insertions(+), 25 deletions(-)
+
+--- a/drivers/mmc/host/sdhci-pci-gli.c
++++ b/drivers/mmc/host/sdhci-pci-gli.c
+@@ -1189,6 +1189,32 @@ static void gl9763e_hs400_enhanced_strob
+       sdhci_writel(host, val, SDHCI_GLI_9763E_HS400_ES_REG);
+ }
++static void gl9763e_set_low_power_negotiation(struct sdhci_pci_slot *slot,
++                                            bool enable)
++{
++      struct pci_dev *pdev = slot->chip->pdev;
++      u32 value;
++
++      pci_read_config_dword(pdev, PCIE_GLI_9763E_VHS, &value);
++      value &= ~GLI_9763E_VHS_REV;
++      value |= FIELD_PREP(GLI_9763E_VHS_REV, GLI_9763E_VHS_REV_W);
++      pci_write_config_dword(pdev, PCIE_GLI_9763E_VHS, value);
++
++      pci_read_config_dword(pdev, PCIE_GLI_9763E_CFG, &value);
++
++      if (enable)
++              value &= ~GLI_9763E_CFG_LPSN_DIS;
++      else
++              value |= GLI_9763E_CFG_LPSN_DIS;
++
++      pci_write_config_dword(pdev, PCIE_GLI_9763E_CFG, value);
++
++      pci_read_config_dword(pdev, PCIE_GLI_9763E_VHS, &value);
++      value &= ~GLI_9763E_VHS_REV;
++      value |= FIELD_PREP(GLI_9763E_VHS_REV, GLI_9763E_VHS_REV_R);
++      pci_write_config_dword(pdev, PCIE_GLI_9763E_VHS, value);
++}
++
+ static void sdhci_set_gl9763e_signaling(struct sdhci_host *host,
+                                       unsigned int timing)
+ {
+@@ -1297,6 +1323,9 @@ static int gl9763e_add_host(struct sdhci
+       if (ret)
+               goto cleanup;
++      /* Disable LPM negotiation to avoid entering L1 state. */
++      gl9763e_set_low_power_negotiation(slot, false);
++
+       return 0;
+ cleanup:
+@@ -1340,31 +1369,6 @@ static void gli_set_gl9763e(struct sdhci
+ }
+ #ifdef CONFIG_PM
+-static void gl9763e_set_low_power_negotiation(struct sdhci_pci_slot *slot, bool enable)
+-{
+-      struct pci_dev *pdev = slot->chip->pdev;
+-      u32 value;
+-
+-      pci_read_config_dword(pdev, PCIE_GLI_9763E_VHS, &value);
+-      value &= ~GLI_9763E_VHS_REV;
+-      value |= FIELD_PREP(GLI_9763E_VHS_REV, GLI_9763E_VHS_REV_W);
+-      pci_write_config_dword(pdev, PCIE_GLI_9763E_VHS, value);
+-
+-      pci_read_config_dword(pdev, PCIE_GLI_9763E_CFG, &value);
+-
+-      if (enable)
+-              value &= ~GLI_9763E_CFG_LPSN_DIS;
+-      else
+-              value |= GLI_9763E_CFG_LPSN_DIS;
+-
+-      pci_write_config_dword(pdev, PCIE_GLI_9763E_CFG, value);
+-
+-      pci_read_config_dword(pdev, PCIE_GLI_9763E_VHS, &value);
+-      value &= ~GLI_9763E_VHS_REV;
+-      value |= FIELD_PREP(GLI_9763E_VHS_REV, GLI_9763E_VHS_REV_R);
+-      pci_write_config_dword(pdev, PCIE_GLI_9763E_VHS, value);
+-}
+-
+ static int gl9763e_runtime_suspend(struct sdhci_pci_chip *chip)
+ {
+       struct sdhci_pci_slot *slot = chip->slots[0];
diff --git a/queue-6.6/mmc-sdhci-sprd-fix-vqmmc-not-shutting-down-after-the-card-was-pulled.patch b/queue-6.6/mmc-sdhci-sprd-fix-vqmmc-not-shutting-down-after-the-card-was-pulled.patch
new file mode 100644 (file)
index 0000000..c5bc732
--- /dev/null
@@ -0,0 +1,88 @@
+From 477865af60b2117ceaa1d558e03559108c15c78c Mon Sep 17 00:00:00 2001
+From: Wenchao Chen <wenchao.chen@unisoc.com>
+Date: Wed, 15 Nov 2023 16:34:06 +0800
+Subject: mmc: sdhci-sprd: Fix vqmmc not shutting down after the card was pulled
+
+From: Wenchao Chen <wenchao.chen@unisoc.com>
+
+commit 477865af60b2117ceaa1d558e03559108c15c78c upstream.
+
+With cat regulator_summary, we found that vqmmc was not shutting
+down after the card was pulled.
+
+cat /sys/kernel/debug/regulator/regulator_summary
+1.before fix
+1)Insert SD card
+ vddsdio               1    1  0 unknown  3500mV 0mA  1200mV  3750mV
+    71100000.mmc-vqmmc  1                         0mA  3500mV  3600mV
+
+2)Pull out the SD card
+ vddsdio                1    1  0 unknown  3500mV 0mA  1200mV  3750mV
+    71100000.mmc-vqmmc  1                         0mA  3500mV  3600mV
+
+2.after fix
+1)Insert SD cardt
+ vddsdio                1    1  0 unknown  3500mV 0mA  1200mV  3750mV
+    71100000.mmc-vqmmc  1                         0mA  3500mV  3600mV
+
+2)Pull out the SD card
+ vddsdio               0    1  0 unknown  3500mV 0mA  1200mV  3750mV
+    71100000.mmc-vqmmc  0                         0mA  3500mV  3600mV
+
+Fixes: fb8bd90f83c4 ("mmc: sdhci-sprd: Add Spreadtrum's initial host controller")
+Signed-off-by: Wenchao Chen <wenchao.chen@unisoc.com>
+Cc: stable@vger.kernel.org
+Link: https://lore.kernel.org/r/20231115083406.7368-1-wenchao.chen@unisoc.com
+Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/mmc/host/sdhci-sprd.c |   25 +++++++++++++++++++++++++
+ 1 file changed, 25 insertions(+)
+
+--- a/drivers/mmc/host/sdhci-sprd.c
++++ b/drivers/mmc/host/sdhci-sprd.c
+@@ -416,12 +416,33 @@ static void sdhci_sprd_request_done(stru
+       mmc_request_done(host->mmc, mrq);
+ }
++static void sdhci_sprd_set_power(struct sdhci_host *host, unsigned char mode,
++                               unsigned short vdd)
++{
++      struct mmc_host *mmc = host->mmc;
++
++      switch (mode) {
++      case MMC_POWER_OFF:
++              mmc_regulator_set_ocr(host->mmc, mmc->supply.vmmc, 0);
++
++              mmc_regulator_disable_vqmmc(mmc);
++              break;
++      case MMC_POWER_ON:
++              mmc_regulator_enable_vqmmc(mmc);
++              break;
++      case MMC_POWER_UP:
++              mmc_regulator_set_ocr(host->mmc, mmc->supply.vmmc, vdd);
++              break;
++      }
++}
++
+ static struct sdhci_ops sdhci_sprd_ops = {
+       .read_l = sdhci_sprd_readl,
+       .write_l = sdhci_sprd_writel,
+       .write_w = sdhci_sprd_writew,
+       .write_b = sdhci_sprd_writeb,
+       .set_clock = sdhci_sprd_set_clock,
++      .set_power = sdhci_sprd_set_power,
+       .get_max_clock = sdhci_sprd_get_max_clock,
+       .get_min_clock = sdhci_sprd_get_min_clock,
+       .set_bus_width = sdhci_set_bus_width,
+@@ -823,6 +844,10 @@ static int sdhci_sprd_probe(struct platf
+       host->caps1 &= ~(SDHCI_SUPPORT_SDR50 | SDHCI_SUPPORT_SDR104 |
+                        SDHCI_SUPPORT_DDR50);
++      ret = mmc_regulator_get_supply(host->mmc);
++      if (ret)
++              goto pm_runtime_disable;
++
+       ret = sdhci_setup_host(host);
+       if (ret)
+               goto pm_runtime_disable;
diff --git a/queue-6.6/net-libwx-fix-memory-leak-on-msix-entry.patch b/queue-6.6/net-libwx-fix-memory-leak-on-msix-entry.patch
new file mode 100644 (file)
index 0000000..cf9cf86
--- /dev/null
@@ -0,0 +1,39 @@
+From 91fdb30ddfdb651509914d3ed0a0302712540fed Mon Sep 17 00:00:00 2001
+From: Jiawen Wu <jiawenwu@trustnetic.com>
+Date: Tue, 28 Nov 2023 17:59:28 +0800
+Subject: net: libwx: fix memory leak on msix entry
+
+From: Jiawen Wu <jiawenwu@trustnetic.com>
+
+commit 91fdb30ddfdb651509914d3ed0a0302712540fed upstream.
+
+Since pci_free_irq_vectors() set pdev->msix_enabled as 0 in the
+calling of pci_msix_shutdown(), wx->msix_entries is never freed.
+Reordering the lines to fix the memory leak.
+
+Cc: stable@vger.kernel.org
+Fixes: 3f703186113f ("net: libwx: Add irq flow functions")
+Signed-off-by: Jiawen Wu <jiawenwu@trustnetic.com>
+Reviewed-by: Kalesh AP <kalesh-anakkur.purayil@broadcom.com>
+Link: https://lore.kernel.org/r/20231128095928.1083292-1-jiawenwu@trustnetic.com
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/net/ethernet/wangxun/libwx/wx_lib.c |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/drivers/net/ethernet/wangxun/libwx/wx_lib.c
++++ b/drivers/net/ethernet/wangxun/libwx/wx_lib.c
+@@ -1965,11 +1965,11 @@ void wx_reset_interrupt_capability(struc
+       if (!pdev->msi_enabled && !pdev->msix_enabled)
+               return;
+-      pci_free_irq_vectors(wx->pdev);
+       if (pdev->msix_enabled) {
+               kfree(wx->msix_entries);
+               wx->msix_entries = NULL;
+       }
++      pci_free_irq_vectors(wx->pdev);
+ }
+ EXPORT_SYMBOL(wx_reset_interrupt_capability);
diff --git a/queue-6.6/pinctrl-avoid-reload-of-p-state-in-list-iteration.patch b/queue-6.6/pinctrl-avoid-reload-of-p-state-in-list-iteration.patch
new file mode 100644 (file)
index 0000000..388b708
--- /dev/null
@@ -0,0 +1,54 @@
+From 4198a9b571065978632276264e01d71d68000ac5 Mon Sep 17 00:00:00 2001
+From: Maria Yu <quic_aiquny@quicinc.com>
+Date: Wed, 15 Nov 2023 18:28:24 +0800
+Subject: pinctrl: avoid reload of p state in list iteration
+
+From: Maria Yu <quic_aiquny@quicinc.com>
+
+commit 4198a9b571065978632276264e01d71d68000ac5 upstream.
+
+When in the list_for_each_entry iteration, reload of p->state->settings
+with a local setting from old_state will turn the list iteration into an
+infinite loop.
+
+The typical symptom when the issue happens, will be a printk message like:
+
+  "not freeing pin xx (xxx) as part of deactivating group xxx - it is
+already used for some other setting".
+
+This is a compiler-dependent problem, one instance occurred using Clang
+version 10.0 on the arm64 architecture with linux version 4.19.
+
+Fixes: 6e5e959dde0d ("pinctrl: API changes to support multiple states per device")
+Signed-off-by: Maria Yu <quic_aiquny@quicinc.com>
+Cc:  <stable@vger.kernel.org>
+Link: https://lore.kernel.org/r/20231115102824.23727-1-quic_aiquny@quicinc.com
+Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/pinctrl/core.c |    6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+--- a/drivers/pinctrl/core.c
++++ b/drivers/pinctrl/core.c
+@@ -1253,17 +1253,17 @@ static void pinctrl_link_add(struct pinc
+ static int pinctrl_commit_state(struct pinctrl *p, struct pinctrl_state *state)
+ {
+       struct pinctrl_setting *setting, *setting2;
+-      struct pinctrl_state *old_state = p->state;
++      struct pinctrl_state *old_state = READ_ONCE(p->state);
+       int ret;
+-      if (p->state) {
++      if (old_state) {
+               /*
+                * For each pinmux setting in the old state, forget SW's record
+                * of mux owner for that pingroup. Any pingroups which are
+                * still owned by the new state will be re-acquired by the call
+                * to pinmux_enable_setting() in the loop below.
+                */
+-              list_for_each_entry(setting, &p->state->settings, node) {
++              list_for_each_entry(setting, &old_state->settings, node) {
+                       if (setting->type != PIN_MAP_TYPE_MUX_GROUP)
+                               continue;
+                       pinmux_disable_setting(setting);
diff --git a/queue-6.6/series b/queue-6.6/series
new file mode 100644 (file)
index 0000000..ce73e4c
--- /dev/null
@@ -0,0 +1,22 @@
+leds-class-don-t-expose-color-sysfs-entry.patch
+cifs-fix-falloc_fl_zero_range-by-setting-i_size-if-eof-moved.patch
+cifs-fix-falloc_fl_insert_range-by-setting-i_size-after-eof-moved.patch
+smb-client-fix-missing-mode-bits-for-smb-symlinks.patch
+smb-client-report-correct-st_size-for-smb-and-nfs-symlinks.patch
+ksmbd-fix-possible-deadlock-in-smb2_open.patch
+pinctrl-avoid-reload-of-p-state-in-list-iteration.patch
+firewire-core-fix-possible-memory-leak-in-create_units.patch
+mmc-sdhci-pci-gli-disable-lpm-during-initialization.patch
+mmc-sdhci-sprd-fix-vqmmc-not-shutting-down-after-the-card-was-pulled.patch
+mmc-cqhci-increase-recovery-halt-timeout.patch
+mmc-cqhci-warn-of-halt-or-task-clear-failure.patch
+mmc-cqhci-fix-task-clearing-in-cqe-error-recovery.patch
+mmc-block-retry-commands-in-cqe-error-recovery.patch
+mmc-block-do-not-lose-cache-flush-during-cqe-error-recovery.patch
+mmc-block-be-sure-to-wait-while-busy-in-cqe-error-recovery.patch
+drm-i915-also-check-for-vga-converter-in-edp-probe.patch
+alsa-hda-disable-power-save-on-kontron-singlepc.patch
+alsa-hda-realtek-headset-mic-vref-to-100.patch
+alsa-hda-realtek-add-supported-alc257-for-chromeos.patch
+net-libwx-fix-memory-leak-on-msix-entry.patch
+dm-verity-align-struct-dm_verity_fec_io-properly.patch
diff --git a/queue-6.6/smb-client-fix-missing-mode-bits-for-smb-symlinks.patch b/queue-6.6/smb-client-fix-missing-mode-bits-for-smb-symlinks.patch
new file mode 100644 (file)
index 0000000..770a591
--- /dev/null
@@ -0,0 +1,31 @@
+From ef22bb800d967616c7638d204bc1b425beac7f5f Mon Sep 17 00:00:00 2001
+From: Paulo Alcantara <pc@manguebit.com>
+Date: Sat, 25 Nov 2023 23:55:10 -0300
+Subject: smb: client: fix missing mode bits for SMB symlinks
+
+From: Paulo Alcantara <pc@manguebit.com>
+
+commit ef22bb800d967616c7638d204bc1b425beac7f5f upstream.
+
+When instantiating inodes for SMB symlinks, add the mode bits from
+@cifs_sb->ctx->file_mode as we already do for the other special files.
+
+Cc: stable@vger.kernel.org
+Signed-off-by: Paulo Alcantara (SUSE) <pc@manguebit.com>
+Signed-off-by: Steve French <stfrench@microsoft.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ fs/smb/client/inode.c |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/fs/smb/client/inode.c
++++ b/fs/smb/client/inode.c
+@@ -748,7 +748,7 @@ bool cifs_reparse_point_to_fattr(struct
+       case 0: /* SMB1 symlink */
+       case IO_REPARSE_TAG_SYMLINK:
+       case IO_REPARSE_TAG_NFS:
+-              fattr->cf_mode = S_IFLNK;
++              fattr->cf_mode = S_IFLNK | cifs_sb->ctx->file_mode;
+               fattr->cf_dtype = DT_LNK;
+               break;
+       default:
diff --git a/queue-6.6/smb-client-report-correct-st_size-for-smb-and-nfs-symlinks.patch b/queue-6.6/smb-client-report-correct-st_size-for-smb-and-nfs-symlinks.patch
new file mode 100644 (file)
index 0000000..1376cea
--- /dev/null
@@ -0,0 +1,35 @@
+From 9d63509547a940225d06d7eba1dc412befae255d Mon Sep 17 00:00:00 2001
+From: Paulo Alcantara <pc@manguebit.com>
+Date: Tue, 28 Nov 2023 16:37:19 -0300
+Subject: smb: client: report correct st_size for SMB and NFS symlinks
+
+From: Paulo Alcantara <pc@manguebit.com>
+
+commit 9d63509547a940225d06d7eba1dc412befae255d upstream.
+
+We can't rely on FILE_STANDARD_INFORMATION::EndOfFile for reparse
+points as they will be always zero.  Set it to symlink target's length
+as specified by POSIX.
+
+This will make stat() family of syscalls return the correct st_size
+for such files.
+
+Cc: stable@vger.kernel.org
+Signed-off-by: Paulo Alcantara (SUSE) <pc@manguebit.com>
+Signed-off-by: Steve French <stfrench@microsoft.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ fs/smb/client/inode.c |    2 ++
+ 1 file changed, 2 insertions(+)
+
+--- a/fs/smb/client/inode.c
++++ b/fs/smb/client/inode.c
+@@ -823,6 +823,8 @@ static void cifs_open_info_to_fattr(stru
+ out_reparse:
+       if (S_ISLNK(fattr->cf_mode)) {
++              if (likely(data->symlink_target))
++                      fattr->cf_eof = strnlen(data->symlink_target, PATH_MAX);
+               fattr->cf_symlink_target = data->symlink_target;
+               data->symlink_target = NULL;
+       }