From: Sasha Levin Date: Mon, 30 Sep 2019 12:55:05 +0000 (-0400) Subject: fixes for 4.19 X-Git-Tag: v5.3.2~3 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=c28a4810c04898d7a705abc1b23912d9a7010299;p=thirdparty%2Fkernel%2Fstable-queue.git fixes for 4.19 Signed-off-by: Sasha Levin --- diff --git a/queue-4.19/f2fs-use-generic-efsbadcrc-efscorrupted.patch b/queue-4.19/f2fs-use-generic-efsbadcrc-efscorrupted.patch new file mode 100644 index 00000000000..df6233f4fdf --- /dev/null +++ b/queue-4.19/f2fs-use-generic-efsbadcrc-efscorrupted.patch @@ -0,0 +1,354 @@ +From f11a47ba44cb5c12ef6147441f939b30d9bf8355 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 20 Jun 2019 11:36:14 +0800 +Subject: f2fs: use generic EFSBADCRC/EFSCORRUPTED + +From: Chao Yu + +[ Upstream commit 10f966bbf521bb9b2e497bbca496a5141f4071d0 ] + +f2fs uses EFAULT as error number to indicate filesystem is corrupted +all the time, but generic filesystems use EUCLEAN for such condition, +we need to change to follow others. + +This patch adds two new macros as below to wrap more generic error +code macros, and spread them in code. + +EFSBADCRC EBADMSG /* Bad CRC detected */ +EFSCORRUPTED EUCLEAN /* Filesystem is corrupted */ + +Reported-by: Pavel Machek +Signed-off-by: Chao Yu +Acked-by: Pavel Machek +Signed-off-by: Jaegeuk Kim +Signed-off-by: Sasha Levin +--- + fs/f2fs/checkpoint.c | 12 +++++++++--- + fs/f2fs/data.c | 8 ++++---- + fs/f2fs/f2fs.h | 4 ++++ + fs/f2fs/gc.c | 2 +- + fs/f2fs/inline.c | 4 ++-- + fs/f2fs/inode.c | 4 ++-- + fs/f2fs/node.c | 6 +++--- + fs/f2fs/recovery.c | 2 +- + fs/f2fs/segment.c | 10 +++++----- + fs/f2fs/segment.h | 4 ++-- + fs/f2fs/super.c | 2 +- + fs/f2fs/xattr.c | 4 ++-- + 12 files changed, 36 insertions(+), 26 deletions(-) + +diff --git a/fs/f2fs/checkpoint.c b/fs/f2fs/checkpoint.c +index 59d0472013f43..388500eec7291 100644 +--- a/fs/f2fs/checkpoint.c ++++ b/fs/f2fs/checkpoint.c +@@ -849,6 +849,7 @@ int f2fs_get_valid_checkpoint(struct f2fs_sb_info *sbi) + unsigned int cp_blks = 1 + __cp_payload(sbi); + block_t cp_blk_no; + int i; ++ int err; + + sbi->ckpt = f2fs_kzalloc(sbi, array_size(blk_size, cp_blks), + GFP_KERNEL); +@@ -876,6 +877,7 @@ int f2fs_get_valid_checkpoint(struct f2fs_sb_info *sbi) + } else if (cp2) { + cur_page = cp2; + } else { ++ err = -EFSCORRUPTED; + goto fail_no_cp; + } + +@@ -888,8 +890,10 @@ int f2fs_get_valid_checkpoint(struct f2fs_sb_info *sbi) + sbi->cur_cp_pack = 2; + + /* Sanity checking of checkpoint */ +- if (f2fs_sanity_check_ckpt(sbi)) ++ if (f2fs_sanity_check_ckpt(sbi)) { ++ err = -EFSCORRUPTED; + goto free_fail_no_cp; ++ } + + if (cp_blks <= 1) + goto done; +@@ -903,8 +907,10 @@ int f2fs_get_valid_checkpoint(struct f2fs_sb_info *sbi) + unsigned char *ckpt = (unsigned char *)sbi->ckpt; + + cur_page = f2fs_get_meta_page(sbi, cp_blk_no + i); +- if (IS_ERR(cur_page)) ++ if (IS_ERR(cur_page)) { ++ err = PTR_ERR(cur_page); + goto free_fail_no_cp; ++ } + sit_bitmap_ptr = page_address(cur_page); + memcpy(ckpt + i * blk_size, sit_bitmap_ptr, blk_size); + f2fs_put_page(cur_page, 1); +@@ -919,7 +925,7 @@ int f2fs_get_valid_checkpoint(struct f2fs_sb_info *sbi) + f2fs_put_page(cp2, 1); + fail_no_cp: + kfree(sbi->ckpt); +- return -EINVAL; ++ return err; + } + + static void __add_dirty_inode(struct inode *inode, enum inode_type type) +diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c +index 4d02e76b648a2..9511466bc7857 100644 +--- a/fs/f2fs/data.c ++++ b/fs/f2fs/data.c +@@ -449,7 +449,7 @@ int f2fs_submit_page_bio(struct f2fs_io_info *fio) + + if (!f2fs_is_valid_blkaddr(fio->sbi, fio->new_blkaddr, + __is_meta_io(fio) ? META_GENERIC : DATA_GENERIC)) +- return -EFAULT; ++ return -EFSCORRUPTED; + + trace_f2fs_submit_page_bio(page, fio); + f2fs_trace_ios(fio, 0); +@@ -1071,7 +1071,7 @@ int f2fs_map_blocks(struct inode *inode, struct f2fs_map_blocks *map, + + if (__is_valid_data_blkaddr(blkaddr) && + !f2fs_is_valid_blkaddr(sbi, blkaddr, DATA_GENERIC)) { +- err = -EFAULT; ++ err = -EFSCORRUPTED; + goto sync_out; + } + +@@ -1755,7 +1755,7 @@ int f2fs_do_write_data_page(struct f2fs_io_info *fio) + + if (!f2fs_is_valid_blkaddr(fio->sbi, fio->old_blkaddr, + DATA_GENERIC)) +- return -EFAULT; ++ return -EFSCORRUPTED; + + ipu_force = true; + fio->need_lock = LOCK_DONE; +@@ -1781,7 +1781,7 @@ int f2fs_do_write_data_page(struct f2fs_io_info *fio) + if (__is_valid_data_blkaddr(fio->old_blkaddr) && + !f2fs_is_valid_blkaddr(fio->sbi, fio->old_blkaddr, + DATA_GENERIC)) { +- err = -EFAULT; ++ err = -EFSCORRUPTED; + goto out_writepage; + } + /* +diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h +index 44ea7ac69ef48..fb216488d67a9 100644 +--- a/fs/f2fs/f2fs.h ++++ b/fs/f2fs/f2fs.h +@@ -3487,3 +3487,7 @@ extern void f2fs_build_fault_attr(struct f2fs_sb_info *sbi, unsigned int rate, + #endif + + #endif ++ ++#define EFSBADCRC EBADMSG /* Bad CRC detected */ ++#define EFSCORRUPTED EUCLEAN /* Filesystem is corrupted */ ++ +diff --git a/fs/f2fs/gc.c b/fs/f2fs/gc.c +index d44b57a363ff1..dd29a49143f54 100644 +--- a/fs/f2fs/gc.c ++++ b/fs/f2fs/gc.c +@@ -636,7 +636,7 @@ static int ra_data_block(struct inode *inode, pgoff_t index) + + if (unlikely(!f2fs_is_valid_blkaddr(sbi, dn.data_blkaddr, + DATA_GENERIC))) { +- err = -EFAULT; ++ err = -EFSCORRUPTED; + goto put_page; + } + got_it: +diff --git a/fs/f2fs/inline.c b/fs/f2fs/inline.c +index 92703efde36e2..6bbb5f6801e26 100644 +--- a/fs/f2fs/inline.c ++++ b/fs/f2fs/inline.c +@@ -146,7 +146,7 @@ int f2fs_convert_inline_page(struct dnode_of_data *dn, struct page *page) + "%s: corrupted inline inode ino=%lx, i_addr[0]:0x%x, " + "run fsck to fix.", + __func__, dn->inode->i_ino, dn->data_blkaddr); +- return -EINVAL; ++ return -EFSCORRUPTED; + } + + f2fs_bug_on(F2FS_P_SB(page), PageWriteback(page)); +@@ -389,7 +389,7 @@ static int f2fs_move_inline_dirents(struct inode *dir, struct page *ipage, + "%s: corrupted inline inode ino=%lx, i_addr[0]:0x%x, " + "run fsck to fix.", + __func__, dir->i_ino, dn.data_blkaddr); +- err = -EINVAL; ++ err = -EFSCORRUPTED; + goto out; + } + +diff --git a/fs/f2fs/inode.c b/fs/f2fs/inode.c +index 0f31df01e36c6..540d45759621a 100644 +--- a/fs/f2fs/inode.c ++++ b/fs/f2fs/inode.c +@@ -76,7 +76,7 @@ static int __written_first_block(struct f2fs_sb_info *sbi, + if (!__is_valid_data_blkaddr(addr)) + return 1; + if (!f2fs_is_valid_blkaddr(sbi, addr, DATA_GENERIC)) +- return -EFAULT; ++ return -EFSCORRUPTED; + return 0; + } + +@@ -361,7 +361,7 @@ static int do_read_inode(struct inode *inode) + + if (!sanity_check_inode(inode, node_page)) { + f2fs_put_page(node_page, 1); +- return -EINVAL; ++ return -EFSCORRUPTED; + } + + /* check data exist */ +diff --git a/fs/f2fs/node.c b/fs/f2fs/node.c +index e2d9edad758cd..aa8f19e1bdb3d 100644 +--- a/fs/f2fs/node.c ++++ b/fs/f2fs/node.c +@@ -40,7 +40,7 @@ int f2fs_check_nid_range(struct f2fs_sb_info *sbi, nid_t nid) + f2fs_msg(sbi->sb, KERN_WARNING, + "%s: out-of-range nid=%x, run fsck to fix.", + __func__, nid); +- return -EINVAL; ++ return -EFSCORRUPTED; + } + return 0; + } +@@ -1284,7 +1284,7 @@ static int read_node_page(struct page *page, int op_flags) + if (PageUptodate(page)) { + if (!f2fs_inode_chksum_verify(sbi, page)) { + ClearPageUptodate(page); +- return -EBADMSG; ++ return -EFSBADCRC; + } + return LOCKED_PAGE; + } +@@ -1370,7 +1370,7 @@ static struct page *__get_node_page(struct f2fs_sb_info *sbi, pgoff_t nid, + } + + if (!f2fs_inode_chksum_verify(sbi, page)) { +- err = -EBADMSG; ++ err = -EFSBADCRC; + goto out_err; + } + page_hit: +diff --git a/fs/f2fs/recovery.c b/fs/f2fs/recovery.c +index bf5c5f4fa77ea..0b224f4a4a656 100644 +--- a/fs/f2fs/recovery.c ++++ b/fs/f2fs/recovery.c +@@ -491,7 +491,7 @@ static int do_recover_data(struct f2fs_sb_info *sbi, struct inode *inode, + "Inconsistent ofs_of_node, ino:%lu, ofs:%u, %u", + inode->i_ino, ofs_of_node(dn.node_page), + ofs_of_node(page)); +- err = -EFAULT; ++ err = -EFSCORRUPTED; + goto err; + } + +diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c +index da7af7822e595..10d5dcdb34be6 100644 +--- a/fs/f2fs/segment.c ++++ b/fs/f2fs/segment.c +@@ -2657,7 +2657,7 @@ int f2fs_trim_fs(struct f2fs_sb_info *sbi, struct fstrim_range *range) + if (is_sbi_flag_set(sbi, SBI_NEED_FSCK)) { + f2fs_msg(sbi->sb, KERN_WARNING, + "Found FS corruption, run fsck to fix."); +- return -EIO; ++ return -EFSCORRUPTED; + } + + /* start/end segment number in main_area */ +@@ -3079,7 +3079,7 @@ int f2fs_inplace_write_data(struct f2fs_io_info *fio) + + if (!IS_DATASEG(get_seg_entry(sbi, segno)->type)) { + set_sbi_flag(sbi, SBI_NEED_FSCK); +- return -EFAULT; ++ return -EFSCORRUPTED; + } + + stat_inc_inplace_blocks(fio->sbi); +@@ -3966,7 +3966,7 @@ static int build_sit_entries(struct f2fs_sb_info *sbi) + "Wrong journal entry on segno %u", + start); + set_sbi_flag(sbi, SBI_NEED_FSCK); +- err = -EINVAL; ++ err = -EFSCORRUPTED; + break; + } + +@@ -4007,7 +4007,7 @@ static int build_sit_entries(struct f2fs_sb_info *sbi) + "SIT is corrupted node# %u vs %u", + total_node_blocks, valid_node_count(sbi)); + set_sbi_flag(sbi, SBI_NEED_FSCK); +- err = -EINVAL; ++ err = -EFSCORRUPTED; + } + + return err; +@@ -4127,7 +4127,7 @@ static int sanity_check_curseg(struct f2fs_sb_info *sbi) + "segno:%u, type:%u, next_blkoff:%u, blkofs:%u", + i, curseg->segno, curseg->alloc_type, + curseg->next_blkoff, blkofs); +- return -EINVAL; ++ return -EFSCORRUPTED; + } + } + return 0; +diff --git a/fs/f2fs/segment.h b/fs/f2fs/segment.h +index 5079532cb176b..9c2a55ad61bc5 100644 +--- a/fs/f2fs/segment.h ++++ b/fs/f2fs/segment.h +@@ -684,7 +684,7 @@ static inline int check_block_count(struct f2fs_sb_info *sbi, + "Mismatch valid blocks %d vs. %d", + GET_SIT_VBLOCKS(raw_sit), valid_blocks); + set_sbi_flag(sbi, SBI_NEED_FSCK); +- return -EINVAL; ++ return -EFSCORRUPTED; + } + + /* check segment usage, and check boundary of a given segment number */ +@@ -694,7 +694,7 @@ static inline int check_block_count(struct f2fs_sb_info *sbi, + "Wrong valid blocks %d or segno %u", + GET_SIT_VBLOCKS(raw_sit), segno); + set_sbi_flag(sbi, SBI_NEED_FSCK); +- return -EINVAL; ++ return -EFSCORRUPTED; + } + return 0; + } +diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c +index e9ab4b39d4eef..fdafcfd8b20e2 100644 +--- a/fs/f2fs/super.c ++++ b/fs/f2fs/super.c +@@ -2616,7 +2616,7 @@ static int read_raw_super_block(struct f2fs_sb_info *sbi, + f2fs_msg(sb, KERN_ERR, + "Can't find valid F2FS filesystem in %dth superblock", + block + 1); +- err = -EINVAL; ++ err = -EFSCORRUPTED; + brelse(bh); + continue; + } +diff --git a/fs/f2fs/xattr.c b/fs/f2fs/xattr.c +index 88e30f7cf9e14..1dae74f7cccac 100644 +--- a/fs/f2fs/xattr.c ++++ b/fs/f2fs/xattr.c +@@ -349,7 +349,7 @@ static int lookup_all_xattrs(struct inode *inode, struct page *ipage, + + *xe = __find_xattr(cur_addr, last_txattr_addr, index, len, name); + if (!*xe) { +- err = -EFAULT; ++ err = -EFSCORRUPTED; + goto out; + } + check: +@@ -625,7 +625,7 @@ static int __f2fs_setxattr(struct inode *inode, int index, + /* find entry with wanted name. */ + here = __find_xattr(base_addr, last_base_addr, index, len, name); + if (!here) { +- error = -EFAULT; ++ error = -EFSCORRUPTED; + goto exit; + } + +-- +2.20.1 + diff --git a/queue-4.19/net-rds-check-laddr_check-before-calling-it.patch b/queue-4.19/net-rds-check-laddr_check-before-calling-it.patch new file mode 100644 index 00000000000..ddb3bd2d91c --- /dev/null +++ b/queue-4.19/net-rds-check-laddr_check-before-calling-it.patch @@ -0,0 +1,48 @@ +From bc7c52441a24daf087009ccc71bbec6192ec93b3 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 24 Sep 2019 08:51:16 -0700 +Subject: net/rds: Check laddr_check before calling it + +From: Ka-Cheong Poon + +[ Upstream commit 05733434ee9ae6548723a808647248583e347cca ] + +In rds_bind(), laddr_check is called without checking if it is NULL or +not. And rs_transport should be reset if rds_add_bound() fails. + +Fixes: c5c1a030a7db ("net/rds: An rds_sock is added too early to the hash table") +Reported-by: syzbot+fae39afd2101a17ec624@syzkaller.appspotmail.com +Signed-off-by: Ka-Cheong Poon +Acked-by: Santosh Shilimkar +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + net/rds/bind.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +diff --git a/net/rds/bind.c b/net/rds/bind.c +index 05464fd7c17af..93e336535d3b6 100644 +--- a/net/rds/bind.c ++++ b/net/rds/bind.c +@@ -244,7 +244,8 @@ int rds_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len) + */ + if (rs->rs_transport) { + trans = rs->rs_transport; +- if (trans->laddr_check(sock_net(sock->sk), ++ if (!trans->laddr_check || ++ trans->laddr_check(sock_net(sock->sk), + binding_addr, scope_id) != 0) { + ret = -ENOPROTOOPT; + goto out; +@@ -263,6 +264,8 @@ int rds_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len) + + sock_set_flag(sk, SOCK_RCU_FREE); + ret = rds_add_bound(rs, binding_addr, &port, scope_id); ++ if (ret) ++ rs->rs_transport = NULL; + + out: + release_sock(sk); +-- +2.20.1 + diff --git a/queue-4.19/series b/queue-4.19/series index e5a8c7f367d..5d1afc01352 100644 --- a/queue-4.19/series +++ b/queue-4.19/series @@ -30,7 +30,6 @@ alsa-dice-fix-wrong-packet-parameter-for-alesis-io26.patch alsa-hda-add-laptop-imic-fixup-for-asus-m9v-laptop.patch alsa-hda-apply-amd-controller-workaround-for-raven-platform.patch objtool-clobber-user-cflags-variable.patch -tpm-fix-tpm-1.2-shutdown-sequence-to-prevent-future-.patch pinctrl-sprd-use-define-directive-for-sprd_pinconf_p.patch power-supply-sysfs-ratelimit-property-read-error-mes.patch locking-lockdep-add-debug_locks-check-in-__lock_down.patch-13969 @@ -60,3 +59,5 @@ netfilter-nft_socket-fix-erroneous-socket-assignment.patch bluetooth-btrtl-additional-realtek-8822ce-bluetooth-.patch net_sched-check-cops-tcf_block-in-tc_bind_tclass.patch net-rds-an-rds_sock-is-added-too-early-to-the-hash-t.patch +net-rds-check-laddr_check-before-calling-it.patch +f2fs-use-generic-efsbadcrc-efscorrupted.patch diff --git a/queue-4.19/tpm-fix-tpm-1.2-shutdown-sequence-to-prevent-future-.patch b/queue-4.19/tpm-fix-tpm-1.2-shutdown-sequence-to-prevent-future-.patch deleted file mode 100644 index 26ff9632b61..00000000000 --- a/queue-4.19/tpm-fix-tpm-1.2-shutdown-sequence-to-prevent-future-.patch +++ /dev/null @@ -1,49 +0,0 @@ -From aab87c3ceddddef68a0d1ae239d60faf6125d9a4 Mon Sep 17 00:00:00 2001 -From: Sasha Levin -Date: Wed, 25 Sep 2019 13:15:32 +0300 -Subject: tpm: Fix TPM 1.2 Shutdown sequence to prevent future TPM operations - -From: Vadim Sukhomlinov - -commit db4d8cb9c9f2af71c4d087817160d866ed572cc9 upstream - -TPM 2.0 Shutdown involve sending TPM2_Shutdown to TPM chip and disabling -future TPM operations. TPM 1.2 behavior was different, future TPM -operations weren't disabled, causing rare issues. This patch ensures -that future TPM operations are disabled. - -Fixes: d1bd4a792d39 ("tpm: Issue a TPM2_Shutdown for TPM2 devices.") -Cc: stable@vger.kernel.org -Signed-off-by: Vadim Sukhomlinov -[dianders: resolved merge conflicts with mainline] -Signed-off-by: Douglas Anderson -Reviewed-by: Jarkko Sakkinen -Signed-off-by: Jarkko Sakkinen -Signed-off-by: Sasha Levin ---- - drivers/char/tpm/tpm-chip.c | 3 +++ - 1 file changed, 3 insertions(+) - -diff --git a/drivers/char/tpm/tpm-chip.c b/drivers/char/tpm/tpm-chip.c -index 46caadca916a0..dccc61af9ffab 100644 ---- a/drivers/char/tpm/tpm-chip.c -+++ b/drivers/char/tpm/tpm-chip.c -@@ -187,12 +187,15 @@ static int tpm_class_shutdown(struct device *dev) - { - struct tpm_chip *chip = container_of(dev, struct tpm_chip, dev); - -+ down_write(&chip->ops_sem); - if (chip->flags & TPM_CHIP_FLAG_TPM2) { - down_write(&chip->ops_sem); - tpm2_shutdown(chip, TPM2_SU_CLEAR); - chip->ops = NULL; - up_write(&chip->ops_sem); - } -+ chip->ops = NULL; -+ up_write(&chip->ops_sem); - - return 0; - } --- -2.20.1 -