5.10-stable patches

added patches:
	xfs-ensure-xfs_errortag_random_default-matches-xfs_errtag_max.patch
	xfs-fix-xfs_reflink_unshare-usage-of-filemap_write_and_wait_range.patch
	xfs-fix-xfs_trans-slab-cache-name.patch
	xfs-rename-variable-mp-to-parsing_mp.patch
	xfs-skip-repetitive-warnings-about-mount-options.patch
	xfs-update-superblock-counters-correctly-for-lazysbcount.patch
	xfs-use-current-journal_info-for-detecting-transaction-recursion.patch
diff --git a/queue-5.10/series b/queue-5.10/series
index 13cf63f..f259ac6 100644
--- a/queue-5.10/series
+++ b/queue-5.10/series
@@ -38,3 +38,10 @@
 io_uring-ensure-that-send-sendmsg-and-recv-recvmsg-check-sqe-ioprio.patch
 tunnels-do-not-assume-mac-header-is-set-in-skb_tunnel_check_pmtu.patch
 net-tun-avoid-disabling-napi-twice.patch
+xfs-use-current-journal_info-for-detecting-transaction-recursion.patch
+xfs-rename-variable-mp-to-parsing_mp.patch
+xfs-skip-repetitive-warnings-about-mount-options.patch
+xfs-ensure-xfs_errortag_random_default-matches-xfs_errtag_max.patch
+xfs-fix-xfs_trans-slab-cache-name.patch
+xfs-update-superblock-counters-correctly-for-lazysbcount.patch
+xfs-fix-xfs_reflink_unshare-usage-of-filemap_write_and_wait_range.patch
diff --git a/queue-5.10/xfs-ensure-xfs_errortag_random_default-matches-xfs_errtag_max.patch b/queue-5.10/xfs-ensure-xfs_errortag_random_default-matches-xfs_errtag_max.patch
new file mode 100644
index 0000000..6514d0f
--- /dev/null
+++ b/queue-5.10/xfs-ensure-xfs_errortag_random_default-matches-xfs_errtag_max.patch
@@ -0,0 +1,38 @@
+From foo@baz Mon Jul  4 04:42:02 PM CEST 2022
+From: Amir Goldstein <amir73il@gmail.com>
+Date: Sun,  3 Jul 2022 08:04:53 +0300
+Subject: xfs: ensure xfs_errortag_random_default matches XFS_ERRTAG_MAX
+To: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Cc: Sasha Levin <sashal@kernel.org>, "Darrick J . Wong" <djwong@kernel.org>, Leah Rumancik <leah.rumancik@gmail.com>, Chandan Babu R <chandan.babu@oracle.com>, Luis Chamberlain <mcgrof@kernel.org>, Adam Manzanares <a.manzanares@samsung.com>, linux-xfs@vger.kernel.org, stable@vger.kernel.org, Gao Xiang <hsiangkao@redhat.com>, Christoph Hellwig <hch@lst.de>
+Message-ID: <20220703050456.3222610-5-amir73il@gmail.com>
+
+From: Gao Xiang <hsiangkao@redhat.com>
+
+commit b2c2974b8cdf1eb3ef90ff845eb27b19e2187b7e upstream.
+
+Add the BUILD_BUG_ON to xfs_errortag_add() in order to make sure that
+the length of xfs_errortag_random_default matches XFS_ERRTAG_MAX when
+building.
+
+Signed-off-by: Gao Xiang <hsiangkao@redhat.com>
+Reviewed-by: Christoph Hellwig <hch@lst.de>
+Reviewed-by: Darrick J. Wong <djwong@kernel.org>
+Signed-off-by: Darrick J. Wong <djwong@kernel.org>
+Signed-off-by: Amir Goldstein <amir73il@gmail.com>
+Acked-by: Darrick J. Wong <djwong@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ fs/xfs/xfs_error.c |    2 ++
+ 1 file changed, 2 insertions(+)
+
+--- a/fs/xfs/xfs_error.c
++++ b/fs/xfs/xfs_error.c
+@@ -293,6 +293,8 @@ xfs_errortag_add(
+ 	struct xfs_mount	*mp,
+ 	unsigned int		error_tag)
+ {
++	BUILD_BUG_ON(ARRAY_SIZE(xfs_errortag_random_default) != XFS_ERRTAG_MAX);
++
+ 	if (error_tag >= XFS_ERRTAG_MAX)
+ 		return -EINVAL;
+ 
diff --git a/queue-5.10/xfs-fix-xfs_reflink_unshare-usage-of-filemap_write_and_wait_range.patch b/queue-5.10/xfs-fix-xfs_reflink_unshare-usage-of-filemap_write_and_wait_range.patch
new file mode 100644
index 0000000..140a74f
--- /dev/null
+++ b/queue-5.10/xfs-fix-xfs_reflink_unshare-usage-of-filemap_write_and_wait_range.patch
@@ -0,0 +1,38 @@
+From foo@baz Mon Jul  4 04:42:02 PM CEST 2022
+From: Amir Goldstein <amir73il@gmail.com>
+Date: Sun,  3 Jul 2022 08:04:56 +0300
+Subject: xfs: fix xfs_reflink_unshare usage of filemap_write_and_wait_range
+To: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Cc: Sasha Levin <sashal@kernel.org>, "Darrick J . Wong" <djwong@kernel.org>, Leah Rumancik <leah.rumancik@gmail.com>, Chandan Babu R <chandan.babu@oracle.com>, Luis Chamberlain <mcgrof@kernel.org>, Adam Manzanares <a.manzanares@samsung.com>, linux-xfs@vger.kernel.org, stable@vger.kernel.org, Chandan Babu R <chandanrlinux@gmail.com>, Brian Foster <bfoster@redhat.com>
+Message-ID: <20220703050456.3222610-8-amir73il@gmail.com>
+
+From: "Darrick J. Wong" <djwong@kernel.org>
+
+commit d4f74e162d238ce00a640af5f0611c3f51dad70e upstream.
+
+The final parameter of filemap_write_and_wait_range is the end of the
+range to flush, not the length of the range to flush.
+
+Fixes: 46afb0628b86 ("xfs: only flush the unshared range in xfs_reflink_unshare")
+Signed-off-by: Darrick J. Wong <djwong@kernel.org>
+Reviewed-by: Chandan Babu R <chandanrlinux@gmail.com>
+Reviewed-by: Brian Foster <bfoster@redhat.com>
+Signed-off-by: Amir Goldstein <amir73il@gmail.com>
+Acked-by: Darrick J. Wong <djwong@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ fs/xfs/xfs_reflink.c |    3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+--- a/fs/xfs/xfs_reflink.c
++++ b/fs/xfs/xfs_reflink.c
+@@ -1503,7 +1503,8 @@ xfs_reflink_unshare(
+ 	if (error)
+ 		goto out;
+ 
+-	error = filemap_write_and_wait_range(inode->i_mapping, offset, len);
++	error = filemap_write_and_wait_range(inode->i_mapping, offset,
++			offset + len - 1);
+ 	if (error)
+ 		goto out;
+ 
diff --git a/queue-5.10/xfs-fix-xfs_trans-slab-cache-name.patch b/queue-5.10/xfs-fix-xfs_trans-slab-cache-name.patch
new file mode 100644
index 0000000..31919c6
--- /dev/null
+++ b/queue-5.10/xfs-fix-xfs_trans-slab-cache-name.patch
@@ -0,0 +1,38 @@
+From foo@baz Mon Jul  4 04:42:02 PM CEST 2022
+From: Amir Goldstein <amir73il@gmail.com>
+Date: Sun,  3 Jul 2022 08:04:54 +0300
+Subject: xfs: fix xfs_trans slab cache name
+To: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Cc: Sasha Levin <sashal@kernel.org>, "Darrick J . Wong" <djwong@kernel.org>, Leah Rumancik <leah.rumancik@gmail.com>, Chandan Babu R <chandan.babu@oracle.com>, Luis Chamberlain <mcgrof@kernel.org>, Adam Manzanares <a.manzanares@samsung.com>, linux-xfs@vger.kernel.org, stable@vger.kernel.org, Anthony Iliopoulos <ailiop@suse.com>
+Message-ID: <20220703050456.3222610-6-amir73il@gmail.com>
+
+From: Anthony Iliopoulos <ailiop@suse.com>
+
+commit 25dfa65f814951a33072bcbae795989d817858da upstream.
+
+Removal of kmem_zone_init wrappers accidentally changed a slab cache
+name from "xfs_trans" to "xf_trans". Fix this so that userspace
+consumers of /proc/slabinfo and /sys/kernel/slab can find it again.
+
+Fixes: b1231760e443 ("xfs: Remove slab init wrappers")
+Signed-off-by: Anthony Iliopoulos <ailiop@suse.com>
+Reviewed-by: Darrick J. Wong <djwong@kernel.org>
+Signed-off-by: Darrick J. Wong <djwong@kernel.org>
+Signed-off-by: Amir Goldstein <amir73il@gmail.com>
+Acked-by: Darrick J. Wong <djwong@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ fs/xfs/xfs_super.c |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/fs/xfs/xfs_super.c
++++ b/fs/xfs/xfs_super.c
+@@ -1934,7 +1934,7 @@ xfs_init_zones(void)
+ 	if (!xfs_ifork_zone)
+ 		goto out_destroy_da_state_zone;
+ 
+-	xfs_trans_zone = kmem_cache_create("xf_trans",
++	xfs_trans_zone = kmem_cache_create("xfs_trans",
+ 					   sizeof(struct xfs_trans),
+ 					   0, 0, NULL);
+ 	if (!xfs_trans_zone)
diff --git a/queue-5.10/xfs-rename-variable-mp-to-parsing_mp.patch b/queue-5.10/xfs-rename-variable-mp-to-parsing_mp.patch
new file mode 100644
index 0000000..3f9cfb2
--- /dev/null
+++ b/queue-5.10/xfs-rename-variable-mp-to-parsing_mp.patch
@@ -0,0 +1,233 @@
+From foo@baz Mon Jul  4 04:42:02 PM CEST 2022
+From: Amir Goldstein <amir73il@gmail.com>
+Date: Sun,  3 Jul 2022 08:04:51 +0300
+Subject: xfs: rename variable mp to parsing_mp
+To: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Cc: Sasha Levin <sashal@kernel.org>, "Darrick J . Wong" <djwong@kernel.org>, Leah Rumancik <leah.rumancik@gmail.com>, Chandan Babu R <chandan.babu@oracle.com>, Luis Chamberlain <mcgrof@kernel.org>, Adam Manzanares <a.manzanares@samsung.com>, linux-xfs@vger.kernel.org, stable@vger.kernel.org, Pavel Reichl <preichl@redhat.com>, Eric Sandeen <sandeen@redhat.com>, Carlos Maiolino <cmaiolino@redhat.com>
+Message-ID: <20220703050456.3222610-3-amir73il@gmail.com>
+
+From: Pavel Reichl <preichl@redhat.com>
+
+commit 0f98b4ece18da9d8287bb4cc4e8f78b8760ea0d0 upstream.
+
+Rename mp variable to parsisng_mp so it is easy to distinguish
+between current mount point handle and handle for mount point
+which mount options are being parsed.
+
+Suggested-by: Eric Sandeen <sandeen@redhat.com>
+Signed-off-by: Pavel Reichl <preichl@redhat.com>
+
+Reviewed-by: Darrick J. Wong <djwong@kernel.org>
+Reviewed-by: Carlos Maiolino <cmaiolino@redhat.com>
+Signed-off-by: Darrick J. Wong <djwong@kernel.org>
+Signed-off-by: Amir Goldstein <amir73il@gmail.com>
+Acked-by: Darrick J. Wong <djwong@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ fs/xfs/xfs_super.c |  102 ++++++++++++++++++++++++++---------------------------
+ 1 file changed, 51 insertions(+), 51 deletions(-)
+
+--- a/fs/xfs/xfs_super.c
++++ b/fs/xfs/xfs_super.c
+@@ -1165,7 +1165,7 @@ xfs_fc_parse_param(
+ 	struct fs_context	*fc,
+ 	struct fs_parameter	*param)
+ {
+-	struct xfs_mount	*mp = fc->s_fs_info;
++	struct xfs_mount	*parsing_mp = fc->s_fs_info;
+ 	struct fs_parse_result	result;
+ 	int			size = 0;
+ 	int			opt;
+@@ -1176,142 +1176,142 @@ xfs_fc_parse_param(
+ 
+ 	switch (opt) {
+ 	case Opt_logbufs:
+-		mp->m_logbufs = result.uint_32;
++		parsing_mp->m_logbufs = result.uint_32;
+ 		return 0;
+ 	case Opt_logbsize:
+-		if (suffix_kstrtoint(param->string, 10, &mp->m_logbsize))
++		if (suffix_kstrtoint(param->string, 10, &parsing_mp->m_logbsize))
+ 			return -EINVAL;
+ 		return 0;
+ 	case Opt_logdev:
+-		kfree(mp->m_logname);
+-		mp->m_logname = kstrdup(param->string, GFP_KERNEL);
+-		if (!mp->m_logname)
++		kfree(parsing_mp->m_logname);
++		parsing_mp->m_logname = kstrdup(param->string, GFP_KERNEL);
++		if (!parsing_mp->m_logname)
+ 			return -ENOMEM;
+ 		return 0;
+ 	case Opt_rtdev:
+-		kfree(mp->m_rtname);
+-		mp->m_rtname = kstrdup(param->string, GFP_KERNEL);
+-		if (!mp->m_rtname)
++		kfree(parsing_mp->m_rtname);
++		parsing_mp->m_rtname = kstrdup(param->string, GFP_KERNEL);
++		if (!parsing_mp->m_rtname)
+ 			return -ENOMEM;
+ 		return 0;
+ 	case Opt_allocsize:
+ 		if (suffix_kstrtoint(param->string, 10, &size))
+ 			return -EINVAL;
+-		mp->m_allocsize_log = ffs(size) - 1;
+-		mp->m_flags |= XFS_MOUNT_ALLOCSIZE;
++		parsing_mp->m_allocsize_log = ffs(size) - 1;
++		parsing_mp->m_flags |= XFS_MOUNT_ALLOCSIZE;
+ 		return 0;
+ 	case Opt_grpid:
+ 	case Opt_bsdgroups:
+-		mp->m_flags |= XFS_MOUNT_GRPID;
++		parsing_mp->m_flags |= XFS_MOUNT_GRPID;
+ 		return 0;
+ 	case Opt_nogrpid:
+ 	case Opt_sysvgroups:
+-		mp->m_flags &= ~XFS_MOUNT_GRPID;
++		parsing_mp->m_flags &= ~XFS_MOUNT_GRPID;
+ 		return 0;
+ 	case Opt_wsync:
+-		mp->m_flags |= XFS_MOUNT_WSYNC;
++		parsing_mp->m_flags |= XFS_MOUNT_WSYNC;
+ 		return 0;
+ 	case Opt_norecovery:
+-		mp->m_flags |= XFS_MOUNT_NORECOVERY;
++		parsing_mp->m_flags |= XFS_MOUNT_NORECOVERY;
+ 		return 0;
+ 	case Opt_noalign:
+-		mp->m_flags |= XFS_MOUNT_NOALIGN;
++		parsing_mp->m_flags |= XFS_MOUNT_NOALIGN;
+ 		return 0;
+ 	case Opt_swalloc:
+-		mp->m_flags |= XFS_MOUNT_SWALLOC;
++		parsing_mp->m_flags |= XFS_MOUNT_SWALLOC;
+ 		return 0;
+ 	case Opt_sunit:
+-		mp->m_dalign = result.uint_32;
++		parsing_mp->m_dalign = result.uint_32;
+ 		return 0;
+ 	case Opt_swidth:
+-		mp->m_swidth = result.uint_32;
++		parsing_mp->m_swidth = result.uint_32;
+ 		return 0;
+ 	case Opt_inode32:
+-		mp->m_flags |= XFS_MOUNT_SMALL_INUMS;
++		parsing_mp->m_flags |= XFS_MOUNT_SMALL_INUMS;
+ 		return 0;
+ 	case Opt_inode64:
+-		mp->m_flags &= ~XFS_MOUNT_SMALL_INUMS;
++		parsing_mp->m_flags &= ~XFS_MOUNT_SMALL_INUMS;
+ 		return 0;
+ 	case Opt_nouuid:
+-		mp->m_flags |= XFS_MOUNT_NOUUID;
++		parsing_mp->m_flags |= XFS_MOUNT_NOUUID;
+ 		return 0;
+ 	case Opt_largeio:
+-		mp->m_flags |= XFS_MOUNT_LARGEIO;
++		parsing_mp->m_flags |= XFS_MOUNT_LARGEIO;
+ 		return 0;
+ 	case Opt_nolargeio:
+-		mp->m_flags &= ~XFS_MOUNT_LARGEIO;
++		parsing_mp->m_flags &= ~XFS_MOUNT_LARGEIO;
+ 		return 0;
+ 	case Opt_filestreams:
+-		mp->m_flags |= XFS_MOUNT_FILESTREAMS;
++		parsing_mp->m_flags |= XFS_MOUNT_FILESTREAMS;
+ 		return 0;
+ 	case Opt_noquota:
+-		mp->m_qflags &= ~XFS_ALL_QUOTA_ACCT;
+-		mp->m_qflags &= ~XFS_ALL_QUOTA_ENFD;
+-		mp->m_qflags &= ~XFS_ALL_QUOTA_ACTIVE;
++		parsing_mp->m_qflags &= ~XFS_ALL_QUOTA_ACCT;
++		parsing_mp->m_qflags &= ~XFS_ALL_QUOTA_ENFD;
++		parsing_mp->m_qflags &= ~XFS_ALL_QUOTA_ACTIVE;
+ 		return 0;
+ 	case Opt_quota:
+ 	case Opt_uquota:
+ 	case Opt_usrquota:
+-		mp->m_qflags |= (XFS_UQUOTA_ACCT | XFS_UQUOTA_ACTIVE |
++		parsing_mp->m_qflags |= (XFS_UQUOTA_ACCT | XFS_UQUOTA_ACTIVE |
+ 				 XFS_UQUOTA_ENFD);
+ 		return 0;
+ 	case Opt_qnoenforce:
+ 	case Opt_uqnoenforce:
+-		mp->m_qflags |= (XFS_UQUOTA_ACCT | XFS_UQUOTA_ACTIVE);
+-		mp->m_qflags &= ~XFS_UQUOTA_ENFD;
++		parsing_mp->m_qflags |= (XFS_UQUOTA_ACCT | XFS_UQUOTA_ACTIVE);
++		parsing_mp->m_qflags &= ~XFS_UQUOTA_ENFD;
+ 		return 0;
+ 	case Opt_pquota:
+ 	case Opt_prjquota:
+-		mp->m_qflags |= (XFS_PQUOTA_ACCT | XFS_PQUOTA_ACTIVE |
++		parsing_mp->m_qflags |= (XFS_PQUOTA_ACCT | XFS_PQUOTA_ACTIVE |
+ 				 XFS_PQUOTA_ENFD);
+ 		return 0;
+ 	case Opt_pqnoenforce:
+-		mp->m_qflags |= (XFS_PQUOTA_ACCT | XFS_PQUOTA_ACTIVE);
+-		mp->m_qflags &= ~XFS_PQUOTA_ENFD;
++		parsing_mp->m_qflags |= (XFS_PQUOTA_ACCT | XFS_PQUOTA_ACTIVE);
++		parsing_mp->m_qflags &= ~XFS_PQUOTA_ENFD;
+ 		return 0;
+ 	case Opt_gquota:
+ 	case Opt_grpquota:
+-		mp->m_qflags |= (XFS_GQUOTA_ACCT | XFS_GQUOTA_ACTIVE |
++		parsing_mp->m_qflags |= (XFS_GQUOTA_ACCT | XFS_GQUOTA_ACTIVE |
+ 				 XFS_GQUOTA_ENFD);
+ 		return 0;
+ 	case Opt_gqnoenforce:
+-		mp->m_qflags |= (XFS_GQUOTA_ACCT | XFS_GQUOTA_ACTIVE);
+-		mp->m_qflags &= ~XFS_GQUOTA_ENFD;
++		parsing_mp->m_qflags |= (XFS_GQUOTA_ACCT | XFS_GQUOTA_ACTIVE);
++		parsing_mp->m_qflags &= ~XFS_GQUOTA_ENFD;
+ 		return 0;
+ 	case Opt_discard:
+-		mp->m_flags |= XFS_MOUNT_DISCARD;
++		parsing_mp->m_flags |= XFS_MOUNT_DISCARD;
+ 		return 0;
+ 	case Opt_nodiscard:
+-		mp->m_flags &= ~XFS_MOUNT_DISCARD;
++		parsing_mp->m_flags &= ~XFS_MOUNT_DISCARD;
+ 		return 0;
+ #ifdef CONFIG_FS_DAX
+ 	case Opt_dax:
+-		xfs_mount_set_dax_mode(mp, XFS_DAX_ALWAYS);
++		xfs_mount_set_dax_mode(parsing_mp, XFS_DAX_ALWAYS);
+ 		return 0;
+ 	case Opt_dax_enum:
+-		xfs_mount_set_dax_mode(mp, result.uint_32);
++		xfs_mount_set_dax_mode(parsing_mp, result.uint_32);
+ 		return 0;
+ #endif
+ 	/* Following mount options will be removed in September 2025 */
+ 	case Opt_ikeep:
+-		xfs_warn(mp, "%s mount option is deprecated.", param->key);
+-		mp->m_flags |= XFS_MOUNT_IKEEP;
++		xfs_warn(parsing_mp, "%s mount option is deprecated.", param->key);
++		parsing_mp->m_flags |= XFS_MOUNT_IKEEP;
+ 		return 0;
+ 	case Opt_noikeep:
+-		xfs_warn(mp, "%s mount option is deprecated.", param->key);
+-		mp->m_flags &= ~XFS_MOUNT_IKEEP;
++		xfs_warn(parsing_mp, "%s mount option is deprecated.", param->key);
++		parsing_mp->m_flags &= ~XFS_MOUNT_IKEEP;
+ 		return 0;
+ 	case Opt_attr2:
+-		xfs_warn(mp, "%s mount option is deprecated.", param->key);
+-		mp->m_flags |= XFS_MOUNT_ATTR2;
++		xfs_warn(parsing_mp, "%s mount option is deprecated.", param->key);
++		parsing_mp->m_flags |= XFS_MOUNT_ATTR2;
+ 		return 0;
+ 	case Opt_noattr2:
+-		xfs_warn(mp, "%s mount option is deprecated.", param->key);
+-		mp->m_flags &= ~XFS_MOUNT_ATTR2;
+-		mp->m_flags |= XFS_MOUNT_NOATTR2;
++		xfs_warn(parsing_mp, "%s mount option is deprecated.", param->key);
++		parsing_mp->m_flags &= ~XFS_MOUNT_ATTR2;
++		parsing_mp->m_flags |= XFS_MOUNT_NOATTR2;
+ 		return 0;
+ 	default:
+-		xfs_warn(mp, "unknown mount option [%s].", param->key);
++		xfs_warn(parsing_mp, "unknown mount option [%s].", param->key);
+ 		return -EINVAL;
+ 	}
+ 
diff --git a/queue-5.10/xfs-skip-repetitive-warnings-about-mount-options.patch b/queue-5.10/xfs-skip-repetitive-warnings-about-mount-options.patch
new file mode 100644
index 0000000..28da430
--- /dev/null
+++ b/queue-5.10/xfs-skip-repetitive-warnings-about-mount-options.patch
@@ -0,0 +1,78 @@
+From foo@baz Mon Jul  4 04:42:02 PM CEST 2022
+From: Amir Goldstein <amir73il@gmail.com>
+Date: Sun,  3 Jul 2022 08:04:52 +0300
+Subject: xfs: Skip repetitive warnings about mount options
+To: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Cc: Sasha Levin <sashal@kernel.org>, "Darrick J . Wong" <djwong@kernel.org>, Leah Rumancik <leah.rumancik@gmail.com>, Chandan Babu R <chandan.babu@oracle.com>, Luis Chamberlain <mcgrof@kernel.org>, Adam Manzanares <a.manzanares@samsung.com>, linux-xfs@vger.kernel.org, stable@vger.kernel.org, Pavel Reichl <preichl@redhat.com>, Eric Sandeen <sandeen@redhat.com>, Carlos Maiolino <cmaiolino@redhat.com>
+Message-ID: <20220703050456.3222610-4-amir73il@gmail.com>
+
+From: Pavel Reichl <preichl@redhat.com>
+
+commit 92cf7d36384b99d5a57bf4422904a3c16dc4527a upstream.
+
+Skip the warnings about mount option being deprecated if we are
+remounting and deprecated option state is not changing.
+
+Bug: https://bugzilla.kernel.org/show_bug.cgi?id=211605
+Fix-suggested-by: Eric Sandeen <sandeen@redhat.com>
+Signed-off-by: Pavel Reichl <preichl@redhat.com>
+
+Reviewed-by: Darrick J. Wong <djwong@kernel.org>
+Reviewed-by: Carlos Maiolino <cmaiolino@redhat.com>
+Signed-off-by: Darrick J. Wong <djwong@kernel.org>
+Signed-off-by: Amir Goldstein <amir73il@gmail.com>
+Acked-by: Darrick J. Wong <djwong@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ fs/xfs/xfs_super.c |   24 ++++++++++++++++++++----
+ 1 file changed, 20 insertions(+), 4 deletions(-)
+
+--- a/fs/xfs/xfs_super.c
++++ b/fs/xfs/xfs_super.c
+@@ -1155,6 +1155,22 @@ suffix_kstrtoint(
+ 	return ret;
+ }
+ 
++static inline void
++xfs_fs_warn_deprecated(
++	struct fs_context	*fc,
++	struct fs_parameter	*param,
++	uint64_t		flag,
++	bool			value)
++{
++	/* Don't print the warning if reconfiguring and current mount point
++	 * already had the flag set
++	 */
++	if ((fc->purpose & FS_CONTEXT_FOR_RECONFIGURE) &&
++			!!(XFS_M(fc->root->d_sb)->m_flags & flag) == value)
++		return;
++	xfs_warn(fc->s_fs_info, "%s mount option is deprecated.", param->key);
++}
++
+ /*
+  * Set mount state from a mount option.
+  *
+@@ -1294,19 +1310,19 @@ xfs_fc_parse_param(
+ #endif
+ 	/* Following mount options will be removed in September 2025 */
+ 	case Opt_ikeep:
+-		xfs_warn(parsing_mp, "%s mount option is deprecated.", param->key);
++		xfs_fs_warn_deprecated(fc, param, XFS_MOUNT_IKEEP, true);
+ 		parsing_mp->m_flags |= XFS_MOUNT_IKEEP;
+ 		return 0;
+ 	case Opt_noikeep:
+-		xfs_warn(parsing_mp, "%s mount option is deprecated.", param->key);
++		xfs_fs_warn_deprecated(fc, param, XFS_MOUNT_IKEEP, false);
+ 		parsing_mp->m_flags &= ~XFS_MOUNT_IKEEP;
+ 		return 0;
+ 	case Opt_attr2:
+-		xfs_warn(parsing_mp, "%s mount option is deprecated.", param->key);
++		xfs_fs_warn_deprecated(fc, param, XFS_MOUNT_ATTR2, true);
+ 		parsing_mp->m_flags |= XFS_MOUNT_ATTR2;
+ 		return 0;
+ 	case Opt_noattr2:
+-		xfs_warn(parsing_mp, "%s mount option is deprecated.", param->key);
++		xfs_fs_warn_deprecated(fc, param, XFS_MOUNT_NOATTR2, true);
+ 		parsing_mp->m_flags &= ~XFS_MOUNT_ATTR2;
+ 		parsing_mp->m_flags |= XFS_MOUNT_NOATTR2;
+ 		return 0;
diff --git a/queue-5.10/xfs-update-superblock-counters-correctly-for-lazysbcount.patch b/queue-5.10/xfs-update-superblock-counters-correctly-for-lazysbcount.patch
new file mode 100644
index 0000000..da9576e
--- /dev/null
+++ b/queue-5.10/xfs-update-superblock-counters-correctly-for-lazysbcount.patch
@@ -0,0 +1,76 @@
+From foo@baz Mon Jul  4 04:42:02 PM CEST 2022
+From: Amir Goldstein <amir73il@gmail.com>
+Date: Sun,  3 Jul 2022 08:04:55 +0300
+Subject: xfs: update superblock counters correctly for !lazysbcount
+To: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Cc: Sasha Levin <sashal@kernel.org>, "Darrick J . Wong" <djwong@kernel.org>, Leah Rumancik <leah.rumancik@gmail.com>, Chandan Babu R <chandan.babu@oracle.com>, Luis Chamberlain <mcgrof@kernel.org>, Adam Manzanares <a.manzanares@samsung.com>, linux-xfs@vger.kernel.org, stable@vger.kernel.org, Dave Chinner <dchinner@redhat.com>, Zorro Lang <zlang@redhat.com>, Gao Xiang <hsiangkao@redhat.com>, Brian Foster <bfoster@redhat.com>
+Message-ID: <20220703050456.3222610-7-amir73il@gmail.com>
+
+From: Dave Chinner <dchinner@redhat.com>
+
+commit 6543990a168acf366f4b6174d7bd46ba15a8a2a6 upstream.
+
+Keep the mount superblock counters up to date for !lazysbcount
+filesystems so that when we log the superblock they do not need
+updating in any way because they are already correct.
+
+It's found by what Zorro reported:
+1. mkfs.xfs -f -l lazy-count=0 -m crc=0 $dev
+2. mount $dev $mnt
+3. fsstress -d $mnt -p 100 -n 1000 (maybe need more or less io load)
+4. umount $mnt
+5. xfs_repair -n $dev
+and I've seen no problem with this patch.
+
+Signed-off-by: Dave Chinner <dchinner@redhat.com>
+Reported-by: Zorro Lang <zlang@redhat.com>
+Reviewed-by: Gao Xiang <hsiangkao@redhat.com>
+Signed-off-by: Gao Xiang <hsiangkao@redhat.com>
+Reviewed-by: Darrick J. Wong <djwong@kernel.org>
+Signed-off-by: Darrick J. Wong <djwong@kernel.org>
+Reviewed-by: Brian Foster <bfoster@redhat.com>
+Signed-off-by: Amir Goldstein <amir73il@gmail.com>
+Acked-by: Darrick J. Wong <djwong@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ fs/xfs/libxfs/xfs_sb.c |   16 +++++++++++++---
+ fs/xfs/xfs_trans.c     |    3 +++
+ 2 files changed, 16 insertions(+), 3 deletions(-)
+
+--- a/fs/xfs/libxfs/xfs_sb.c
++++ b/fs/xfs/libxfs/xfs_sb.c
+@@ -956,9 +956,19 @@ xfs_log_sb(
+ 	struct xfs_mount	*mp = tp->t_mountp;
+ 	struct xfs_buf		*bp = xfs_trans_getsb(tp);
+ 
+-	mp->m_sb.sb_icount = percpu_counter_sum(&mp->m_icount);
+-	mp->m_sb.sb_ifree = percpu_counter_sum(&mp->m_ifree);
+-	mp->m_sb.sb_fdblocks = percpu_counter_sum(&mp->m_fdblocks);
++	/*
++	 * Lazy sb counters don't update the in-core superblock so do that now.
++	 * If this is at unmount, the counters will be exactly correct, but at
++	 * any other time they will only be ballpark correct because of
++	 * reservations that have been taken out percpu counters. If we have an
++	 * unclean shutdown, this will be corrected by log recovery rebuilding
++	 * the counters from the AGF block counts.
++	 */
++	if (xfs_sb_version_haslazysbcount(&mp->m_sb)) {
++		mp->m_sb.sb_icount = percpu_counter_sum(&mp->m_icount);
++		mp->m_sb.sb_ifree = percpu_counter_sum(&mp->m_ifree);
++		mp->m_sb.sb_fdblocks = percpu_counter_sum(&mp->m_fdblocks);
++	}
+ 
+ 	xfs_sb_to_disk(bp->b_addr, &mp->m_sb);
+ 	xfs_trans_buf_set_type(tp, bp, XFS_BLFT_SB_BUF);
+--- a/fs/xfs/xfs_trans.c
++++ b/fs/xfs/xfs_trans.c
+@@ -615,6 +615,9 @@ xfs_trans_unreserve_and_mod_sb(
+ 
+ 	/* apply remaining deltas */
+ 	spin_lock(&mp->m_sb_lock);
++	mp->m_sb.sb_fdblocks += tp->t_fdblocks_delta + tp->t_res_fdblocks_delta;
++	mp->m_sb.sb_icount += idelta;
++	mp->m_sb.sb_ifree += ifreedelta;
+ 	mp->m_sb.sb_frextents += rtxdelta;
+ 	mp->m_sb.sb_dblocks += tp->t_dblocks_delta;
+ 	mp->m_sb.sb_agcount += tp->t_agcount_delta;
diff --git a/queue-5.10/xfs-use-current-journal_info-for-detecting-transaction-recursion.patch b/queue-5.10/xfs-use-current-journal_info-for-detecting-transaction-recursion.patch
new file mode 100644
index 0000000..8355566
--- /dev/null
+++ b/queue-5.10/xfs-use-current-journal_info-for-detecting-transaction-recursion.patch
@@ -0,0 +1,256 @@
+From foo@baz Mon Jul  4 04:42:02 PM CEST 2022
+From: Amir Goldstein <amir73il@gmail.com>
+Date: Sun,  3 Jul 2022 08:04:50 +0300
+Subject: xfs: use current->journal_info for detecting transaction recursion
+To: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Cc: Sasha Levin <sashal@kernel.org>, "Darrick J . Wong" <djwong@kernel.org>, Leah Rumancik <leah.rumancik@gmail.com>, Chandan Babu R <chandan.babu@oracle.com>, Luis Chamberlain <mcgrof@kernel.org>, Adam Manzanares <a.manzanares@samsung.com>, linux-xfs@vger.kernel.org, stable@vger.kernel.org, Dave Chinner <dchinner@redhat.com>, Christoph Hellwig <hch@lst.de>
+Message-ID: <20220703050456.3222610-2-amir73il@gmail.com>
+
+From: Dave Chinner <dchinner@redhat.com>
+
+commit 756b1c343333a5aefcc26b0409f3fd16f72281bf upstream.
+
+Because the iomap code using PF_MEMALLOC_NOFS to detect transaction
+recursion in XFS is just wrong. Remove it from the iomap code and
+replace it with XFS specific internal checks using
+current->journal_info instead.
+
+[djwong: This change also realigns the lifetime of NOFS flag changes to
+match the incore transaction, instead of the inconsistent scheme we have
+now.]
+
+Fixes: 9070733b4efa ("xfs: abstract PF_FSTRANS to PF_MEMALLOC_NOFS")
+Signed-off-by: Dave Chinner <dchinner@redhat.com>
+Reviewed-by: Darrick J. Wong <djwong@kernel.org>
+Signed-off-by: Darrick J. Wong <djwong@kernel.org>
+Reviewed-by: Christoph Hellwig <hch@lst.de>
+Signed-off-by: Amir Goldstein <amir73il@gmail.com>
+Acked-by: Darrick J. Wong <djwong@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ fs/iomap/buffered-io.c    |    7 -------
+ fs/xfs/libxfs/xfs_btree.c |   12 ++++++++++--
+ fs/xfs/xfs_aops.c         |   17 +++++++++++++++--
+ fs/xfs/xfs_trans.c        |   20 +++++---------------
+ fs/xfs/xfs_trans.h        |   30 ++++++++++++++++++++++++++++++
+ 5 files changed, 60 insertions(+), 26 deletions(-)
+
+--- a/fs/iomap/buffered-io.c
++++ b/fs/iomap/buffered-io.c
+@@ -1461,13 +1461,6 @@ iomap_do_writepage(struct page *page, st
+ 		goto redirty;
+ 
+ 	/*
+-	 * Given that we do not allow direct reclaim to call us, we should
+-	 * never be called in a recursive filesystem reclaim context.
+-	 */
+-	if (WARN_ON_ONCE(current->flags & PF_MEMALLOC_NOFS))
+-		goto redirty;
+-
+-	/*
+ 	 * Is this page beyond the end of the file?
+ 	 *
+ 	 * The page index is less than the end_index, adjust the end_offset
+--- a/fs/xfs/libxfs/xfs_btree.c
++++ b/fs/xfs/libxfs/xfs_btree.c
+@@ -2811,7 +2811,7 @@ xfs_btree_split_worker(
+ 	struct xfs_btree_split_args	*args = container_of(work,
+ 						struct xfs_btree_split_args, work);
+ 	unsigned long		pflags;
+-	unsigned long		new_pflags = PF_MEMALLOC_NOFS;
++	unsigned long		new_pflags = 0;
+ 
+ 	/*
+ 	 * we are in a transaction context here, but may also be doing work
+@@ -2823,12 +2823,20 @@ xfs_btree_split_worker(
+ 		new_pflags |= PF_MEMALLOC | PF_SWAPWRITE | PF_KSWAPD;
+ 
+ 	current_set_flags_nested(&pflags, new_pflags);
++	xfs_trans_set_context(args->cur->bc_tp);
+ 
+ 	args->result = __xfs_btree_split(args->cur, args->level, args->ptrp,
+ 					 args->key, args->curp, args->stat);
+-	complete(args->done);
+ 
++	xfs_trans_clear_context(args->cur->bc_tp);
+ 	current_restore_flags_nested(&pflags, new_pflags);
++
++	/*
++	 * Do not access args after complete() has run here. We don't own args
++	 * and the owner may run and free args before we return here.
++	 */
++	complete(args->done);
++
+ }
+ 
+ /*
+--- a/fs/xfs/xfs_aops.c
++++ b/fs/xfs/xfs_aops.c
+@@ -62,7 +62,7 @@ xfs_setfilesize_trans_alloc(
+ 	 * We hand off the transaction to the completion thread now, so
+ 	 * clear the flag here.
+ 	 */
+-	current_restore_flags_nested(&tp->t_pflags, PF_MEMALLOC_NOFS);
++	xfs_trans_clear_context(tp);
+ 	return 0;
+ }
+ 
+@@ -125,7 +125,7 @@ xfs_setfilesize_ioend(
+ 	 * thus we need to mark ourselves as being in a transaction manually.
+ 	 * Similarly for freeze protection.
+ 	 */
+-	current_set_flags_nested(&tp->t_pflags, PF_MEMALLOC_NOFS);
++	xfs_trans_set_context(tp);
+ 	__sb_writers_acquired(VFS_I(ip)->i_sb, SB_FREEZE_FS);
+ 
+ 	/* we abort the update if there was an IO error */
+@@ -577,6 +577,12 @@ xfs_vm_writepage(
+ {
+ 	struct xfs_writepage_ctx wpc = { };
+ 
++	if (WARN_ON_ONCE(current->journal_info)) {
++		redirty_page_for_writepage(wbc, page);
++		unlock_page(page);
++		return 0;
++	}
++
+ 	return iomap_writepage(page, wbc, &wpc.ctx, &xfs_writeback_ops);
+ }
+ 
+@@ -587,6 +593,13 @@ xfs_vm_writepages(
+ {
+ 	struct xfs_writepage_ctx wpc = { };
+ 
++	/*
++	 * Writing back data in a transaction context can result in recursive
++	 * transactions. This is bad, so issue a warning and get out of here.
++	 */
++	if (WARN_ON_ONCE(current->journal_info))
++		return 0;
++
+ 	xfs_iflags_clear(XFS_I(mapping->host), XFS_ITRUNCATED);
+ 	return iomap_writepages(mapping, wbc, &wpc.ctx, &xfs_writeback_ops);
+ }
+--- a/fs/xfs/xfs_trans.c
++++ b/fs/xfs/xfs_trans.c
+@@ -68,6 +68,7 @@ xfs_trans_free(
+ 	xfs_extent_busy_clear(tp->t_mountp, &tp->t_busy, false);
+ 
+ 	trace_xfs_trans_free(tp, _RET_IP_);
++	xfs_trans_clear_context(tp);
+ 	if (!(tp->t_flags & XFS_TRANS_NO_WRITECOUNT))
+ 		sb_end_intwrite(tp->t_mountp->m_super);
+ 	xfs_trans_free_dqinfo(tp);
+@@ -119,7 +120,8 @@ xfs_trans_dup(
+ 
+ 	ntp->t_rtx_res = tp->t_rtx_res - tp->t_rtx_res_used;
+ 	tp->t_rtx_res = tp->t_rtx_res_used;
+-	ntp->t_pflags = tp->t_pflags;
++
++	xfs_trans_switch_context(tp, ntp);
+ 
+ 	/* move deferred ops over to the new tp */
+ 	xfs_defer_move(ntp, tp);
+@@ -153,9 +155,6 @@ xfs_trans_reserve(
+ 	int			error = 0;
+ 	bool			rsvd = (tp->t_flags & XFS_TRANS_RESERVE) != 0;
+ 
+-	/* Mark this thread as being in a transaction */
+-	current_set_flags_nested(&tp->t_pflags, PF_MEMALLOC_NOFS);
+-
+ 	/*
+ 	 * Attempt to reserve the needed disk blocks by decrementing
+ 	 * the number needed from the number available.  This will
+@@ -163,10 +162,8 @@ xfs_trans_reserve(
+ 	 */
+ 	if (blocks > 0) {
+ 		error = xfs_mod_fdblocks(mp, -((int64_t)blocks), rsvd);
+-		if (error != 0) {
+-			current_restore_flags_nested(&tp->t_pflags, PF_MEMALLOC_NOFS);
++		if (error != 0)
+ 			return -ENOSPC;
+-		}
+ 		tp->t_blk_res += blocks;
+ 	}
+ 
+@@ -240,9 +237,6 @@ undo_blocks:
+ 		xfs_mod_fdblocks(mp, (int64_t)blocks, rsvd);
+ 		tp->t_blk_res = 0;
+ 	}
+-
+-	current_restore_flags_nested(&tp->t_pflags, PF_MEMALLOC_NOFS);
+-
+ 	return error;
+ }
+ 
+@@ -266,6 +260,7 @@ xfs_trans_alloc(
+ 	tp = kmem_cache_zalloc(xfs_trans_zone, GFP_KERNEL | __GFP_NOFAIL);
+ 	if (!(flags & XFS_TRANS_NO_WRITECOUNT))
+ 		sb_start_intwrite(mp->m_super);
++	xfs_trans_set_context(tp);
+ 
+ 	/*
+ 	 * Zero-reservation ("empty") transactions can't modify anything, so
+@@ -878,7 +873,6 @@ __xfs_trans_commit(
+ 
+ 	xfs_log_commit_cil(mp, tp, &commit_lsn, regrant);
+ 
+-	current_restore_flags_nested(&tp->t_pflags, PF_MEMALLOC_NOFS);
+ 	xfs_trans_free(tp);
+ 
+ 	/*
+@@ -910,7 +904,6 @@ out_unreserve:
+ 			xfs_log_ticket_ungrant(mp->m_log, tp->t_ticket);
+ 		tp->t_ticket = NULL;
+ 	}
+-	current_restore_flags_nested(&tp->t_pflags, PF_MEMALLOC_NOFS);
+ 	xfs_trans_free_items(tp, !!error);
+ 	xfs_trans_free(tp);
+ 
+@@ -970,9 +963,6 @@ xfs_trans_cancel(
+ 		tp->t_ticket = NULL;
+ 	}
+ 
+-	/* mark this thread as no longer being in a transaction */
+-	current_restore_flags_nested(&tp->t_pflags, PF_MEMALLOC_NOFS);
+-
+ 	xfs_trans_free_items(tp, dirty);
+ 	xfs_trans_free(tp);
+ }
+--- a/fs/xfs/xfs_trans.h
++++ b/fs/xfs/xfs_trans.h
+@@ -268,4 +268,34 @@ xfs_trans_item_relog(
+ 	return lip->li_ops->iop_relog(lip, tp);
+ }
+ 
++static inline void
++xfs_trans_set_context(
++	struct xfs_trans	*tp)
++{
++	ASSERT(current->journal_info == NULL);
++	tp->t_pflags = memalloc_nofs_save();
++	current->journal_info = tp;
++}
++
++static inline void
++xfs_trans_clear_context(
++	struct xfs_trans	*tp)
++{
++	if (current->journal_info == tp) {
++		memalloc_nofs_restore(tp->t_pflags);
++		current->journal_info = NULL;
++	}
++}
++
++static inline void
++xfs_trans_switch_context(
++	struct xfs_trans	*old_tp,
++	struct xfs_trans	*new_tp)
++{
++	ASSERT(current->journal_info == old_tp);
++	new_tp->t_pflags = old_tp->t_pflags;
++	old_tp->t_pflags = 0;
++	current->journal_info = new_tp;
++}
++
+ #endif	/* __XFS_TRANS_H__ */