@@ -1089,6 +1089,9 @@ xfs_log_sb(
* sb counters, despite having a percpu counter. It is always kept
* consistent with the ondisk rtbitmap by xfs_trans_apply_sb_deltas()
* and hence we don't need have to update it here.
+ *
+ * sb_frextents was added to the lazy sb counters when the rt groups
+ * feature was introduced.
*/
if (xfs_has_lazysbcount(mp)) {
mp->m_sb.sb_icount = percpu_counter_sum(&mp->m_icount);
@@ -1097,6 +1100,8 @@ xfs_log_sb(
mp->m_sb.sb_icount);
mp->m_sb.sb_fdblocks = percpu_counter_sum(&mp->m_fdblocks);
}
+ if (xfs_has_rtgroups(mp))
+ mp->m_sb.sb_frextents = percpu_counter_sum(&mp->m_frextents);
xfs_sb_to_disk(bp->b_addr, &mp->m_sb);
xfs_trans_buf_set_type(tp, bp, XFS_BLFT_SB_BUF);
@@ -475,6 +475,8 @@ xfs_trans_mod_sb(
ASSERT(tp->t_rtx_res_used <= tp->t_rtx_res);
}
tp->t_frextents_delta += delta;
+ if (xfs_has_rtgroups(mp))
+ flags &= ~XFS_TRANS_SB_DIRTY;
break;
case XFS_TRANS_SB_RES_FREXTENTS:
/*
@@ -569,8 +571,14 @@ xfs_trans_apply_sb_deltas(
*
* Don't touch m_frextents because it includes incore reservations,
* and those are handled by the unreserve function.
+ *
+ * sb_frextents was added to the lazy sb counters when the rt groups
+ * feature was introduced. This is possible because we know that all
+ * kernels supporting rtgroups will also recompute frextents from the
+ * realtime bitmap.
*/
- if (tp->t_frextents_delta || tp->t_res_frextents_delta) {
+ if ((tp->t_frextents_delta || tp->t_res_frextents_delta) &&
+ !xfs_has_rtgroups(tp->t_mountp)) {
struct xfs_mount *mp = tp->t_mountp;
int64_t rtxdelta;
@@ -684,7 +692,8 @@ xfs_trans_unreserve_and_mod_sb(
if (tp->t_rtx_res > 0)
rtxdelta = tp->t_rtx_res;
if ((tp->t_frextents_delta != 0) &&
- (tp->t_flags & XFS_TRANS_SB_DIRTY))
+ (xfs_has_rtgroups(mp) ||
+ (tp->t_flags & XFS_TRANS_SB_DIRTY)))
rtxdelta += tp->t_frextents_delta;
if (xfs_has_lazysbcount(mp) ||
@@ -723,8 +732,11 @@ xfs_trans_unreserve_and_mod_sb(
* Do not touch sb_frextents here because we are dealing with incore
* reservation. sb_frextents is not part of the lazy sb counters so it
* must be consistent with the ondisk rtbitmap and must never include
- * incore reservations.
+ * incore reservations. sb_frextents was added to the lazy sb counters
+ * when the realtime groups feature was introduced.
*/
+ if (xfs_has_rtgroups(mp))
+ mp->m_sb.sb_frextents += rtxdelta;
mp->m_sb.sb_dblocks += tp->t_dblocks_delta;
mp->m_sb.sb_agcount += tp->t_agcount_delta;
mp->m_sb.sb_imax_pct += tp->t_imaxpct_delta;