Home Home > GIT Browse > SLE15
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnthony Iliopoulos <ailiopoulos@suse.com>2019-05-18 01:41:29 +0200
committerAnthony Iliopoulos <ailiopoulos@suse.com>2019-05-18 01:41:29 +0200
commit437f1ecd76c75d08a208c1273b0c41e23febefe5 (patch)
tree1acaa0dce49465b3307a2a54425abd577ce3bf96
parentfd58dbe068841c8a13e3a12dd65d330f26ca8421 (diff)
xfs: force summary counter recalc at next mount (bsc#1114427).
-rw-r--r--patches.fixes/xfs-force-summary-counter-recalc-at-next-mount.patch131
-rw-r--r--series.conf1
2 files changed, 132 insertions, 0 deletions
diff --git a/patches.fixes/xfs-force-summary-counter-recalc-at-next-mount.patch b/patches.fixes/xfs-force-summary-counter-recalc-at-next-mount.patch
new file mode 100644
index 0000000000..dc4f88542c
--- /dev/null
+++ b/patches.fixes/xfs-force-summary-counter-recalc-at-next-mount.patch
@@ -0,0 +1,131 @@
+From f467cad95f5e3814fda408dea76eb962ab19685d Mon Sep 17 00:00:00 2001
+From: "Darrick J. Wong" <darrick.wong@oracle.com>
+Date: Fri, 20 Jul 2018 09:28:40 -0700
+Subject: [PATCH] xfs: force summary counter recalc at next mount
+Git-commit: f467cad95f5e3814fda408dea76eb962ab19685d
+Patch-mainline: v4.19-rc1
+References: bsc#1114427
+
+Use the "bad summary count" mount flag from the previous patch to skip
+writing the unmount record to force log recovery at the next mount,
+which will recalculate the summary counters for us.
+
+Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
+Reviewed-by: Christoph Hellwig <hch@lst.de>
+Acked-by: Anthony Iliopoulos <ailiopoulos@suse.com>
+
+---
+ fs/xfs/libxfs/xfs_errortag.h | 4 +++-
+ fs/xfs/xfs_error.c | 3 +++
+ fs/xfs/xfs_log.c | 16 +++++++++++++++-
+ fs/xfs/xfs_mount.c | 13 +++++++++++++
+ fs/xfs/xfs_mount.h | 1 +
+ 5 files changed, 35 insertions(+), 2 deletions(-)
+
+--- a/fs/xfs/libxfs/xfs_errortag.h
++++ b/fs/xfs/libxfs/xfs_errortag.h
+@@ -65,7 +65,8 @@
+ #define XFS_ERRTAG_LOG_BAD_CRC 29
+ #define XFS_ERRTAG_LOG_ITEM_PIN 30
+ #define XFS_ERRTAG_BUF_LRU_REF 31
+-#define XFS_ERRTAG_MAX 32
++#define XFS_ERRTAG_FORCE_SUMMARY_RECALC 33
++#define XFS_ERRTAG_MAX 34
+
+ /*
+ * Random factors for above tags, 1 means always, 2 means 1/2 time, etc.
+@@ -102,5 +103,6 @@
+ #define XFS_RANDOM_LOG_BAD_CRC 1
+ #define XFS_RANDOM_LOG_ITEM_PIN 1
+ #define XFS_RANDOM_BUF_LRU_REF 2
++#define XFS_RANDOM_FORCE_SUMMARY_RECALC 1
+
+ #endif /* __XFS_ERRORTAG_H_ */
+--- a/fs/xfs/xfs_error.c
++++ b/fs/xfs/xfs_error.c
+@@ -60,6 +60,7 @@
+ XFS_RANDOM_LOG_BAD_CRC,
+ XFS_RANDOM_LOG_ITEM_PIN,
+ XFS_RANDOM_BUF_LRU_REF,
++ XFS_RANDOM_FORCE_SUMMARY_RECALC,
+ };
+
+ struct xfs_errortag_attr {
+@@ -166,6 +167,7 @@
+ XFS_ERRORTAG_ATTR_RW(log_bad_crc, XFS_ERRTAG_LOG_BAD_CRC);
+ XFS_ERRORTAG_ATTR_RW(log_item_pin, XFS_ERRTAG_LOG_ITEM_PIN);
+ XFS_ERRORTAG_ATTR_RW(buf_lru_ref, XFS_ERRTAG_BUF_LRU_REF);
++XFS_ERRORTAG_ATTR_RW(bad_summary, XFS_ERRTAG_FORCE_SUMMARY_RECALC);
+
+ static struct attribute *xfs_errortag_attrs[] = {
+ XFS_ERRORTAG_ATTR_LIST(noerror),
+@@ -200,6 +202,7 @@
+ XFS_ERRORTAG_ATTR_LIST(log_bad_crc),
+ XFS_ERRORTAG_ATTR_LIST(log_item_pin),
+ XFS_ERRORTAG_ATTR_LIST(buf_lru_ref),
++ XFS_ERRORTAG_ATTR_LIST(bad_summary),
+ NULL,
+ };
+
+--- a/fs/xfs/xfs_log.c
++++ b/fs/xfs/xfs_log.c
+@@ -845,16 +845,30 @@
+ struct xlog_in_core *iclog;
+ struct xlog_ticket *tic = NULL;
+ xfs_lsn_t lsn;
++ uint flags = XLOG_UNMOUNT_TRANS;
+ int error;
+
+ error = xfs_log_reserve(mp, 600, 1, &tic, XFS_LOG, 0);
+ if (error)
+ goto out_err;
+
++ /*
++ * If we think the summary counters are bad, clear the unmount header
++ * flag in the unmount record so that the summary counters will be
++ * recalculated during log recovery at next mount. Refer to
++ * xlog_check_unmount_rec for more details.
++ */
++ if (XFS_TEST_ERROR((mp->m_flags & XFS_MOUNT_BAD_SUMMARY), mp,
++ XFS_ERRTAG_FORCE_SUMMARY_RECALC)) {
++ xfs_alert(mp, "%s: will fix summary counters at next mount",
++ __func__);
++ flags &= ~XLOG_UNMOUNT_TRANS;
++ }
++
+ /* remove inited flag, and account for space used */
+ tic->t_flags = 0;
+ tic->t_curr_res -= sizeof(magic);
+- error = xlog_write(log, &vec, tic, &lsn, NULL, XLOG_UNMOUNT_TRANS);
++ error = xlog_write(log, &vec, tic, &lsn, NULL, flags);
+ /*
+ * At this point, we're umounting anyway, so there's no point in
+ * transitioning log state to IOERROR. Just continue...
+--- a/fs/xfs/xfs_mount.c
++++ b/fs/xfs/xfs_mount.c
+@@ -1422,3 +1422,16 @@
+ }
+ return 0;
+ }
++
++/* Force the summary counters to be recalculated at next mount. */
++void
++xfs_force_summary_recalc(
++ struct xfs_mount *mp)
++{
++ if (!xfs_sb_version_haslazysbcount(&mp->m_sb))
++ return;
++
++ spin_lock(&mp->m_sb_lock);
++ mp->m_flags |= XFS_MOUNT_BAD_SUMMARY;
++ spin_unlock(&mp->m_sb_lock);
++}
+--- a/fs/xfs/xfs_mount.h
++++ b/fs/xfs/xfs_mount.h
+@@ -447,5 +447,6 @@
+
+ struct xfs_error_cfg * xfs_error_get_cfg(struct xfs_mount *mp,
+ int error_class, int error);
++void xfs_force_summary_recalc(struct xfs_mount *mp);
+
+ #endif /* __XFS_MOUNT_H__ */
diff --git a/series.conf b/series.conf
index 950cc2b34a..67a887b611 100644
--- a/series.conf
+++ b/series.conf
@@ -18057,6 +18057,7 @@
patches.fixes/ext4-fix-spectre-gadget-in-ext4_mb_regular_allocator.patch
patches.fixes/xfs-detect-and-fix-bad-summary-counts-at-mount.patch
patches.fixes/xfs-refactor-unmount-record-write.patch
+ patches.fixes/xfs-force-summary-counter-recalc-at-next-mount.patch
patches.suse/xfs-fix-a-null-pointer-dereference-in-xfs_bmap_exten.patch
patches.arch/x86-l1tf-01-increase-32bitPAE-__PHYSICAL_PAGE_MASK.patch
patches.arch/x86-l1tf-02-change-order-of-offset-type.patch