]> git.baikalelectronics.ru Git - kernel.git/commitdiff
xfs: don't write a corrupt unmount record to force summary counter recalc
authorDarrick J. Wong <darrick.wong@oracle.com>
Wed, 26 Oct 2022 06:28:38 +0000 (11:58 +0530)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 29 Oct 2022 08:20:34 +0000 (10:20 +0200)
commit 608a625c90c80e97fdeeb9dbc3951881a50d2b6f upstream.

[ Modify fs/xfs/xfs_log.c to include the changes at locations suitable for
  5.4-lts kernel ]

In commit a9c79f18bd864, I added the ability to force a recalculation of
the filesystem summary counters if they seemed incorrect.  This was done
(not entirely correctly) by tweaking the log code to write an unmount
record without the UMOUNT_TRANS flag set.  At next mount, the log
recovery code will fail to find the unmount record and go into recovery,
which triggers the recalculation.

What actually gets written to the log is what ought to be an unmount
record, but without any flags set to indicate what kind of record it
actually is.  This worked to trigger the recalculation, but we shouldn't
write bogus log records when we could simply write nothing.

Fixes: a9c79f18bd864 ("xfs: force summary counter recalc at next mount")
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Brian Foster <bfoster@redhat.com>
Acked-by: Darrick J. Wong <djwong@kernel.org>
Signed-off-by: Chandan Babu R <chandan.babu@oracle.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
fs/xfs/xfs_log.c

index 7b0d9ad8cb1a9dd424e96d4d66344df1f14279ad..63c0f1e9d1018636605a8cbb5d679af8a00453a1 100644 (file)
@@ -837,19 +837,6 @@ xfs_log_write_unmount_record(
        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(xfs_fs_has_sickness(mp, XFS_SICK_FS_COUNTERS), 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);
@@ -932,6 +919,19 @@ xfs_log_unmount_write(xfs_mount_t *mp)
        } while (iclog != first_iclog);
 #endif
        if (! (XLOG_FORCED_SHUTDOWN(log))) {
+               /*
+                * If we think the summary counters are bad, avoid writing the
+                * unmount record to force log recovery at next mount, after
+                * which the summary counters will be recalculated.  Refer to
+                * xlog_check_unmount_rec for more details.
+                */
+               if (XFS_TEST_ERROR(xfs_fs_has_sickness(mp, XFS_SICK_FS_COUNTERS),
+                               mp, XFS_ERRTAG_FORCE_SUMMARY_RECALC)) {
+                       xfs_alert(mp,
+                               "%s: will fix summary counters at next mount",
+                               __func__);
+                       return 0;
+               }
                xfs_log_write_unmount_record(mp);
        } else {
                /*