summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDarrick J. Wong <djwong@kernel.org>2022-10-14 23:36:42 -0700
committerDarrick J. Wong <djwong@kernel.org>2022-11-09 19:07:59 -0800
commita74dc7dcb66165185f865270dbf3030a31ccc435 (patch)
tree9e56069cf2e96af5c1d44db9ba717696e3577fee
parent2a012e558a6c94bbab7655bdeb6eb7239b846111 (diff)
xfs: store rtgroup information with a bmap intent
Make the bmap intent items take an active reference to the rtgroup containing the space that is being mapped or unmapped. We will need this functionality once we start enabling rmap and reflink on the rt volume. Signed-off-by: Darrick J. Wong <djwong@kernel.org>
-rw-r--r--fs/xfs/libxfs/xfs_bmap.h5
-rw-r--r--fs/xfs/xfs_bmap_item.c18
2 files changed, 20 insertions, 3 deletions
diff --git a/fs/xfs/libxfs/xfs_bmap.h b/fs/xfs/libxfs/xfs_bmap.h
index d870c6a62e40..05097b1d5c7d 100644
--- a/fs/xfs/libxfs/xfs_bmap.h
+++ b/fs/xfs/libxfs/xfs_bmap.h
@@ -241,7 +241,10 @@ struct xfs_bmap_intent {
enum xfs_bmap_intent_type bi_type;
int bi_whichfork;
struct xfs_inode *bi_owner;
- struct xfs_perag *bi_pag;
+ union {
+ struct xfs_perag *bi_pag;
+ struct xfs_rtgroup *bi_rtg;
+ };
struct xfs_bmbt_irec bi_bmap;
};
diff --git a/fs/xfs/xfs_bmap_item.c b/fs/xfs/xfs_bmap_item.c
index bf52d30d7d1c..04eeae9aef79 100644
--- a/fs/xfs/xfs_bmap_item.c
+++ b/fs/xfs/xfs_bmap_item.c
@@ -25,6 +25,7 @@
#include "xfs_log_priv.h"
#include "xfs_log_recover.h"
#include "xfs_ag.h"
+#include "xfs_rtgroup.h"
struct kmem_cache *xfs_bui_cache;
struct kmem_cache *xfs_bud_cache;
@@ -362,8 +363,18 @@ xfs_bmap_update_get_group(
{
xfs_agnumber_t agno;
- if (xfs_ifork_is_realtime(bi->bi_owner, bi->bi_whichfork))
+ if (xfs_ifork_is_realtime(bi->bi_owner, bi->bi_whichfork)) {
+ if (xfs_has_rtgroups(mp)) {
+ xfs_rgnumber_t rgno;
+
+ rgno = xfs_rtb_to_rgno(mp, bi->bi_bmap.br_startblock);
+ bi->bi_rtg = xfs_rtgroup_get(mp, rgno);
+ } else {
+ bi->bi_rtg = NULL;
+ }
+
return;
+ }
agno = XFS_FSB_TO_AGNO(mp, bi->bi_bmap.br_startblock);
bi->bi_pag = xfs_perag_get(mp, agno);
@@ -383,8 +394,11 @@ static inline void
xfs_bmap_update_put_group(
struct xfs_bmap_intent *bi)
{
- if (xfs_ifork_is_realtime(bi->bi_owner, bi->bi_whichfork))
+ if (xfs_ifork_is_realtime(bi->bi_owner, bi->bi_whichfork)) {
+ if (xfs_has_rtgroups(bi->bi_owner->i_mount))
+ xfs_rtgroup_put(bi->bi_rtg);
return;
+ }
xfs_perag_drop_intents(bi->bi_pag);
xfs_perag_put(bi->bi_pag);