commit:     2f51bc969051457c56542367d6f1d45ffec4daa0
Author:     Alice Ferrazzi <alicef <AT> gentoo <DOT> org>
AuthorDate: Fri Feb 26 10:00:46 2021 +0000
Commit:     Alice Ferrazzi <alicef <AT> gentoo <DOT> org>
CommitDate: Fri Feb 26 10:01:00 2021 +0000
URL:        https://gitweb.gentoo.org/proj/linux-patches.git/commit/?id=2f51bc96

Linux patch 5.4.101

Signed-off-by: Alice Ferrazzi <alicef <AT> gentoo.org>

 0000_README              |   4 +
 1100_linux-5.4.101.patch | 397 +++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 401 insertions(+)

diff --git a/0000_README b/0000_README
index 23e242b..aab74c6 100644
--- a/0000_README
+++ b/0000_README
@@ -443,6 +443,10 @@ Patch:  1099_linux-5.4.100.patch
 From:   http://www.kernel.org
 Desc:   Linux 5.4.100
 
+Patch:  1100_linux-5.4.101.patch
+From:   http://www.kernel.org
+Desc:   Linux 5.4.101
+
 Patch:  1500_XATTR_USER_PREFIX.patch
 From:   https://bugs.gentoo.org/show_bug.cgi?id=470644
 Desc:   Support for namespace user.pax.* on tmpfs.

diff --git a/1100_linux-5.4.101.patch b/1100_linux-5.4.101.patch
new file mode 100644
index 0000000..87f0074
--- /dev/null
+++ b/1100_linux-5.4.101.patch
@@ -0,0 +1,397 @@
+diff --git a/Makefile b/Makefile
+index d0d4beb4f8373..f56442751d2c3 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,7 +1,7 @@
+ # SPDX-License-Identifier: GPL-2.0
+ VERSION = 5
+ PATCHLEVEL = 4
+-SUBLEVEL = 100
++SUBLEVEL = 101
+ EXTRAVERSION =
+ NAME = Kleptomaniac Octopus
+ 
+diff --git a/arch/arm64/boot/dts/nvidia/tegra210.dtsi 
b/arch/arm64/boot/dts/nvidia/tegra210.dtsi
+index 078d2506365c0..8a02b26d07cd4 100644
+--- a/arch/arm64/boot/dts/nvidia/tegra210.dtsi
++++ b/arch/arm64/boot/dts/nvidia/tegra210.dtsi
+@@ -917,6 +917,7 @@
+                        <&tegra_car 128>, /* hda2hdmi */
+                        <&tegra_car 111>; /* hda2codec_2x */
+               reset-names = "hda", "hda2hdmi", "hda2codec_2x";
++              power-domains = <&pd_sor>;
+               status = "disabled";
+       };
+ 
+diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c
+index d2ecc9c452554..263eca119ff0f 100644
+--- a/drivers/hid/hid-core.c
++++ b/drivers/hid/hid-core.c
+@@ -90,7 +90,7 @@ EXPORT_SYMBOL_GPL(hid_register_report);
+  * Register a new field for this report.
+  */
+ 
+-static struct hid_field *hid_register_field(struct hid_report *report, 
unsigned usages, unsigned values)
++static struct hid_field *hid_register_field(struct hid_report *report, 
unsigned usages)
+ {
+       struct hid_field *field;
+ 
+@@ -101,7 +101,7 @@ static struct hid_field *hid_register_field(struct 
hid_report *report, unsigned
+ 
+       field = kzalloc((sizeof(struct hid_field) +
+                        usages * sizeof(struct hid_usage) +
+-                       values * sizeof(unsigned)), GFP_KERNEL);
++                       usages * sizeof(unsigned)), GFP_KERNEL);
+       if (!field)
+               return NULL;
+ 
+@@ -300,7 +300,7 @@ static int hid_add_field(struct hid_parser *parser, 
unsigned report_type, unsign
+       usages = max_t(unsigned, parser->local.usage_index,
+                                parser->global.report_count);
+ 
+-      field = hid_register_field(report, usages, parser->global.report_count);
++      field = hid_register_field(report, usages);
+       if (!field)
+               return 0;
+ 
+diff --git a/drivers/net/ethernet/chelsio/cxgb4/t4_pci_id_tbl.h 
b/drivers/net/ethernet/chelsio/cxgb4/t4_pci_id_tbl.h
+index 0c5373462cedb..0b1b5f9c67d47 100644
+--- a/drivers/net/ethernet/chelsio/cxgb4/t4_pci_id_tbl.h
++++ b/drivers/net/ethernet/chelsio/cxgb4/t4_pci_id_tbl.h
+@@ -219,6 +219,7 @@ CH_PCI_DEVICE_ID_TABLE_DEFINE_BEGIN
+       CH_PCI_ID_TABLE_FENTRY(0x6089), /* Custom T62100-KR */
+       CH_PCI_ID_TABLE_FENTRY(0x608a), /* Custom T62100-CR */
+       CH_PCI_ID_TABLE_FENTRY(0x608b), /* Custom T6225-CR */
++      CH_PCI_ID_TABLE_FENTRY(0x6092), /* Custom T62100-CR-LOM */
+ CH_PCI_DEVICE_ID_TABLE_DEFINE_END;
+ 
+ #endif /* __T4_PCI_ID_TBL_H__ */
+diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c
+index 72a3a5dc51319..5a1d21aae2a9e 100644
+--- a/drivers/net/usb/qmi_wwan.c
++++ b/drivers/net/usb/qmi_wwan.c
+@@ -1354,6 +1354,7 @@ static const struct usb_device_id products[] = {
+       {QMI_FIXED_INTF(0x1e2d, 0x0082, 5)},    /* Cinterion PHxx,PXxx (2 
RmNet) */
+       {QMI_FIXED_INTF(0x1e2d, 0x0083, 4)},    /* Cinterion PHxx,PXxx (1 RmNet 
+ USB Audio)*/
+       {QMI_QUIRK_SET_DTR(0x1e2d, 0x00b0, 4)}, /* Cinterion CLS8 */
++      {QMI_FIXED_INTF(0x1e2d, 0x00b7, 0)},    /* Cinterion MV31 RmNet */
+       {QMI_FIXED_INTF(0x413c, 0x81a2, 8)},    /* Dell Wireless 5806 Gobi(TM) 
4G LTE Mobile Broadband Card */
+       {QMI_FIXED_INTF(0x413c, 0x81a3, 8)},    /* Dell Wireless 5570 HSPA+ 
(42Mbps) Mobile Broadband Card */
+       {QMI_FIXED_INTF(0x413c, 0x81a4, 8)},    /* Dell Wireless 5570e HSPA+ 
(42Mbps) Mobile Broadband Card */
+diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c
+index c1592403222f5..239443ce52001 100644
+--- a/drivers/usb/core/quirks.c
++++ b/drivers/usb/core/quirks.c
+@@ -391,6 +391,9 @@ static const struct usb_device_id usb_quirk_list[] = {
+       /* X-Rite/Gretag-Macbeth Eye-One Pro display colorimeter */
+       { USB_DEVICE(0x0971, 0x2000), .driver_info = USB_QUIRK_NO_SET_INTF },
+ 
++      /* ELMO L-12F document camera */
++      { USB_DEVICE(0x09a1, 0x0028), .driver_info = USB_QUIRK_DELAY_CTRL_MSG },
++
+       /* Broadcom BCM92035DGROM BT dongle */
+       { USB_DEVICE(0x0a5c, 0x2021), .driver_info = USB_QUIRK_RESET_RESUME },
+ 
+@@ -415,6 +418,9 @@ static const struct usb_device_id usb_quirk_list[] = {
+       { USB_DEVICE(0x10d6, 0x2200), .driver_info =
+                       USB_QUIRK_STRING_FETCH_255 },
+ 
++      /* novation SoundControl XL */
++      { USB_DEVICE(0x1235, 0x0061), .driver_info = USB_QUIRK_RESET_RESUME },
++
+       /* Huawei 4G LTE module */
+       { USB_DEVICE(0x12d1, 0x15bb), .driver_info =
+                       USB_QUIRK_DISCONNECT_SUSPEND },
+@@ -495,9 +501,6 @@ static const struct usb_device_id usb_quirk_list[] = {
+       /* INTEL VALUE SSD */
+       { USB_DEVICE(0x8086, 0xf1a5), .driver_info = USB_QUIRK_RESET_RESUME },
+ 
+-      /* novation SoundControl XL */
+-      { USB_DEVICE(0x1235, 0x0061), .driver_info = USB_QUIRK_RESET_RESUME },
+-
+       { }  /* terminating entry must be last */
+ };
+ 
+diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c
+index ab9eeb5ff8e57..67c2e6487479a 100644
+--- a/fs/cifs/connect.c
++++ b/fs/cifs/connect.c
+@@ -4198,6 +4198,7 @@ int cifs_setup_cifs_sb(struct smb_vol *pvolume_info,
+               cifs_sb->prepath = kstrdup(pvolume_info->prepath, GFP_KERNEL);
+               if (cifs_sb->prepath == NULL)
+                       return -ENOMEM;
++              cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_USE_PREFIX_PATH;
+       }
+ 
+       return 0;
+diff --git a/fs/dax.c b/fs/dax.c
+index cc56313c6b3b9..3b0e5da96d541 100644
+--- a/fs/dax.c
++++ b/fs/dax.c
+@@ -794,12 +794,12 @@ static void dax_entry_mkclean(struct address_space 
*mapping, pgoff_t index,
+               address = pgoff_address(index, vma);
+ 
+               /*
+-               * Note because we provide range to follow_pte_pmd it will
+-               * call mmu_notifier_invalidate_range_start() on our behalf
+-               * before taking any lock.
++               * follow_invalidate_pte() will use the range to call
++               * mmu_notifier_invalidate_range_start() on our behalf before
++               * taking any lock.
+                */
+-              if (follow_pte_pmd(vma->vm_mm, address, &range,
+-                                 &ptep, &pmdp, &ptl))
++              if (follow_invalidate_pte(vma->vm_mm, address, &range, &ptep,
++                                        &pmdp, &ptl))
+                       continue;
+ 
+               /*
+diff --git a/fs/ntfs/inode.c b/fs/ntfs/inode.c
+index 84933a0af49b6..672feb96e250e 100644
+--- a/fs/ntfs/inode.c
++++ b/fs/ntfs/inode.c
+@@ -628,6 +628,12 @@ static int ntfs_read_locked_inode(struct inode *vi)
+       }
+       a = ctx->attr;
+       /* Get the standard information attribute value. */
++      if ((u8 *)a + le16_to_cpu(a->data.resident.value_offset)
++                      + le32_to_cpu(a->data.resident.value_length) >
++                      (u8 *)ctx->mrec + vol->mft_record_size) {
++              ntfs_error(vi->i_sb, "Corrupt standard information attribute in 
inode.");
++              goto unm_err_out;
++      }
+       si = (STANDARD_INFORMATION*)((u8*)a +
+                       le16_to_cpu(a->data.resident.value_offset));
+ 
+diff --git a/include/linux/mm.h b/include/linux/mm.h
+index 7249cf58f78d1..c63e4b38b7fe0 100644
+--- a/include/linux/mm.h
++++ b/include/linux/mm.h
+@@ -1466,9 +1466,11 @@ void free_pgd_range(struct mmu_gather *tlb, unsigned 
long addr,
+               unsigned long end, unsigned long floor, unsigned long ceiling);
+ int copy_page_range(struct mm_struct *dst, struct mm_struct *src,
+                       struct vm_area_struct *vma);
+-int follow_pte_pmd(struct mm_struct *mm, unsigned long address,
+-                 struct mmu_notifier_range *range,
+-                 pte_t **ptepp, pmd_t **pmdpp, spinlock_t **ptlp);
++int follow_invalidate_pte(struct mm_struct *mm, unsigned long address,
++                        struct mmu_notifier_range *range, pte_t **ptepp,
++                        pmd_t **pmdpp, spinlock_t **ptlp);
++int follow_pte(struct mm_struct *mm, unsigned long address,
++             pte_t **ptepp, spinlock_t **ptlp);
+ int follow_pfn(struct vm_area_struct *vma, unsigned long address,
+       unsigned long *pfn);
+ int follow_phys(struct vm_area_struct *vma, unsigned long address,
+diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c
+index 2c248c4f6419c..e6a43c0fdee88 100644
+--- a/kernel/bpf/verifier.c
++++ b/kernel/bpf/verifier.c
+@@ -9005,7 +9005,7 @@ static int fixup_bpf_calls(struct bpf_verifier_env *env)
+                       bool isdiv = BPF_OP(insn->code) == BPF_DIV;
+                       struct bpf_insn *patchlet;
+                       struct bpf_insn chk_and_div[] = {
+-                              /* Rx div 0 -> 0 */
++                              /* [R,W]x div 0 -> 0 */
+                               BPF_RAW_INSN((is64 ? BPF_JMP : BPF_JMP32) |
+                                            BPF_JNE | BPF_K, insn->src_reg,
+                                            0, 2, 0),
+@@ -9014,16 +9014,18 @@ static int fixup_bpf_calls(struct bpf_verifier_env 
*env)
+                               *insn,
+                       };
+                       struct bpf_insn chk_and_mod[] = {
+-                              /* Rx mod 0 -> Rx */
++                              /* [R,W]x mod 0 -> [R,W]x */
+                               BPF_RAW_INSN((is64 ? BPF_JMP : BPF_JMP32) |
+                                            BPF_JEQ | BPF_K, insn->src_reg,
+-                                           0, 1, 0),
++                                           0, 1 + (is64 ? 0 : 1), 0),
+                               *insn,
++                              BPF_JMP_IMM(BPF_JA, 0, 0, 1),
++                              BPF_MOV32_REG(insn->dst_reg, insn->dst_reg),
+                       };
+ 
+                       patchlet = isdiv ? chk_and_div : chk_and_mod;
+                       cnt = isdiv ? ARRAY_SIZE(chk_and_div) :
+-                                    ARRAY_SIZE(chk_and_mod);
++                                    ARRAY_SIZE(chk_and_mod) - (is64 ? 2 : 0);
+ 
+                       new_prog = bpf_patch_insn_data(env, i + delta, 
patchlet, cnt);
+                       if (!new_prog)
+diff --git a/mm/memory.c b/mm/memory.c
+index 2157bb28117ac..b23831132933a 100644
+--- a/mm/memory.c
++++ b/mm/memory.c
+@@ -4222,9 +4222,9 @@ int __pmd_alloc(struct mm_struct *mm, pud_t *pud, 
unsigned long address)
+ }
+ #endif /* __PAGETABLE_PMD_FOLDED */
+ 
+-static int __follow_pte_pmd(struct mm_struct *mm, unsigned long address,
+-                          struct mmu_notifier_range *range,
+-                          pte_t **ptepp, pmd_t **pmdpp, spinlock_t **ptlp)
++int follow_invalidate_pte(struct mm_struct *mm, unsigned long address,
++                        struct mmu_notifier_range *range, pte_t **ptepp,
++                        pmd_t **pmdpp, spinlock_t **ptlp)
+ {
+       pgd_t *pgd;
+       p4d_t *p4d;
+@@ -4289,31 +4289,33 @@ out:
+       return -EINVAL;
+ }
+ 
+-static inline int follow_pte(struct mm_struct *mm, unsigned long address,
+-                           pte_t **ptepp, spinlock_t **ptlp)
+-{
+-      int res;
+-
+-      /* (void) is needed to make gcc happy */
+-      (void) __cond_lock(*ptlp,
+-                         !(res = __follow_pte_pmd(mm, address, NULL,
+-                                                  ptepp, NULL, ptlp)));
+-      return res;
+-}
+-
+-int follow_pte_pmd(struct mm_struct *mm, unsigned long address,
+-                 struct mmu_notifier_range *range,
+-                 pte_t **ptepp, pmd_t **pmdpp, spinlock_t **ptlp)
++/**
++ * follow_pte - look up PTE at a user virtual address
++ * @mm: the mm_struct of the target address space
++ * @address: user virtual address
++ * @ptepp: location to store found PTE
++ * @ptlp: location to store the lock for the PTE
++ *
++ * On a successful return, the pointer to the PTE is stored in @ptepp;
++ * the corresponding lock is taken and its location is stored in @ptlp.
++ * The contents of the PTE are only stable until @ptlp is released;
++ * any further use, if any, must be protected against invalidation
++ * with MMU notifiers.
++ *
++ * Only IO mappings and raw PFN mappings are allowed.  The mmap semaphore
++ * should be taken for read.
++ *
++ * KVM uses this function.  While it is arguably less bad than ``follow_pfn``,
++ * it is not a good general-purpose API.
++ *
++ * Return: zero on success, -ve otherwise.
++ */
++int follow_pte(struct mm_struct *mm, unsigned long address,
++             pte_t **ptepp, spinlock_t **ptlp)
+ {
+-      int res;
+-
+-      /* (void) is needed to make gcc happy */
+-      (void) __cond_lock(*ptlp,
+-                         !(res = __follow_pte_pmd(mm, address, range,
+-                                                  ptepp, pmdpp, ptlp)));
+-      return res;
++      return follow_invalidate_pte(mm, address, NULL, ptepp, NULL, ptlp);
+ }
+-EXPORT_SYMBOL(follow_pte_pmd);
++EXPORT_SYMBOL_GPL(follow_pte);
+ 
+ /**
+  * follow_pfn - look up PFN at a user virtual address
+@@ -4323,6 +4325,9 @@ EXPORT_SYMBOL(follow_pte_pmd);
+  *
+  * Only IO mappings and raw PFN mappings are allowed.
+  *
++ * This function does not allow the caller to read the permissions
++ * of the PTE.  Do not use it.
++ *
+  * Return: zero and the pfn at @pfn on success, -ve otherwise.
+  */
+ int follow_pfn(struct vm_area_struct *vma, unsigned long address,
+diff --git a/scripts/Makefile b/scripts/Makefile
+index 3e86b300f5a10..b4b7d8b58cd68 100644
+--- a/scripts/Makefile
++++ b/scripts/Makefile
+@@ -10,6 +10,9 @@
+ 
+ HOST_EXTRACFLAGS += -I$(srctree)/tools/include
+ 
++CRYPTO_LIBS = $(shell pkg-config --libs libcrypto 2> /dev/null || echo 
-lcrypto)
++CRYPTO_CFLAGS = $(shell pkg-config --cflags libcrypto 2> /dev/null)
++
+ hostprogs-$(CONFIG_BUILD_BIN2C)  += bin2c
+ hostprogs-$(CONFIG_KALLSYMS)     += kallsyms
+ hostprogs-$(CONFIG_LOGO)         += pnmtologo
+@@ -23,8 +26,10 @@ hostprogs-$(CONFIG_SYSTEM_EXTRA_CERTIFICATE) += 
insert-sys-cert
+ 
+ HOSTCFLAGS_sortextable.o = -I$(srctree)/tools/include
+ HOSTCFLAGS_asn1_compiler.o = -I$(srctree)/include
+-HOSTLDLIBS_sign-file = -lcrypto
+-HOSTLDLIBS_extract-cert = -lcrypto
++HOSTCFLAGS_sign-file.o = $(CRYPTO_CFLAGS)
++HOSTLDLIBS_sign-file = $(CRYPTO_LIBS)
++HOSTCFLAGS_extract-cert.o = $(CRYPTO_CFLAGS)
++HOSTLDLIBS_extract-cert = $(CRYPTO_LIBS)
+ 
+ always                := $(hostprogs-y) $(hostprogs-m)
+ 
+diff --git a/scripts/recordmcount.pl b/scripts/recordmcount.pl
+index 3f77a5d695c13..0bafed857e171 100755
+--- a/scripts/recordmcount.pl
++++ b/scripts/recordmcount.pl
+@@ -268,7 +268,11 @@ if ($arch eq "x86_64") {
+ 
+     # force flags for this arch
+     $ld .= " -m shlelf_linux";
+-    $objcopy .= " -O elf32-sh-linux";
++    if ($endian eq "big") {
++        $objcopy .= " -O elf32-shbig-linux";
++    } else {
++        $objcopy .= " -O elf32-sh-linux";
++    }
+ 
+ } elsif ($arch eq "powerpc") {
+     my $ldemulation;
+diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
+index f25b5043cbcae..048b555c5acc9 100644
+--- a/virt/kvm/kvm_main.c
++++ b/virt/kvm/kvm_main.c
+@@ -1598,10 +1598,12 @@ static int hva_to_pfn_remapped(struct vm_area_struct 
*vma,
+                              bool write_fault, bool *writable,
+                              kvm_pfn_t *p_pfn)
+ {
+-      unsigned long pfn;
++      kvm_pfn_t pfn;
++      pte_t *ptep;
++      spinlock_t *ptl;
+       int r;
+ 
+-      r = follow_pfn(vma, addr, &pfn);
++      r = follow_pte(vma->vm_mm, addr, &ptep, &ptl);
+       if (r) {
+               /*
+                * get_user_pages fails for VM_IO and VM_PFNMAP vmas and does
+@@ -1616,14 +1618,19 @@ static int hva_to_pfn_remapped(struct vm_area_struct 
*vma,
+               if (r)
+                       return r;
+ 
+-              r = follow_pfn(vma, addr, &pfn);
++              r = follow_pte(vma->vm_mm, addr, &ptep, &ptl);
+               if (r)
+                       return r;
++      }
+ 
++      if (write_fault && !pte_write(*ptep)) {
++              pfn = KVM_PFN_ERR_RO_FAULT;
++              goto out;
+       }
+ 
+       if (writable)
+-              *writable = true;
++              *writable = pte_write(*ptep);
++      pfn = pte_pfn(*ptep);
+ 
+       /*
+        * Get a reference here because callers of *hva_to_pfn* and
+@@ -1638,6 +1645,8 @@ static int hva_to_pfn_remapped(struct vm_area_struct 
*vma,
+        */ 
+       kvm_get_pfn(pfn);
+ 
++out:
++      pte_unmap_unlock(ptep, ptl);
+       *p_pfn = pfn;
+       return 0;
+ }

Reply via email to