| 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; |