]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
xfs: add a realtime flag to the bmap update log redo items
authorDarrick J. Wong <djwong@kernel.org>
Thu, 22 Feb 2024 20:44:23 +0000 (12:44 -0800)
committerDarrick J. Wong <djwong@kernel.org>
Thu, 22 Feb 2024 20:44:23 +0000 (12:44 -0800)
Extend the bmap update (BUI) log items with a new realtime flag that
indicates that the updates apply against a realtime file's data fork.
We'll wire up the actual code later.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
fs/xfs/libxfs/xfs_log_format.h
fs/xfs/xfs_bmap_item.c
fs/xfs/xfs_trace.h

index 269573c828085fc3cb4f5685a1caf86d9fe1d061..16872972e1e97dcd2b8c5a8974a1ed9c64175bde 100644 (file)
@@ -838,10 +838,12 @@ struct xfs_cud_log_format {
 
 #define XFS_BMAP_EXTENT_ATTR_FORK      (1U << 31)
 #define XFS_BMAP_EXTENT_UNWRITTEN      (1U << 30)
+#define XFS_BMAP_EXTENT_REALTIME       (1U << 29)
 
 #define XFS_BMAP_EXTENT_FLAGS          (XFS_BMAP_EXTENT_TYPE_MASK | \
                                         XFS_BMAP_EXTENT_ATTR_FORK | \
-                                        XFS_BMAP_EXTENT_UNWRITTEN)
+                                        XFS_BMAP_EXTENT_UNWRITTEN | \
+                                        XFS_BMAP_EXTENT_REALTIME)
 
 /*
  * This is the structure used to lay out an bui log item in the
index a47cbce36482d780efedb25a352325e0ed8bb9da..701166da7f8a3f0bee3e1e7b627396998216bdd8 100644 (file)
@@ -275,6 +275,8 @@ xfs_bmap_update_log_item(
                map->me_flags |= XFS_BMAP_EXTENT_UNWRITTEN;
        if (bi->bi_whichfork == XFS_ATTR_FORK)
                map->me_flags |= XFS_BMAP_EXTENT_ATTR_FORK;
+       if (xfs_ifork_is_realtime(bi->bi_owner, bi->bi_whichfork))
+               map->me_flags |= XFS_BMAP_EXTENT_REALTIME;
 }
 
 static struct xfs_log_item *
@@ -324,6 +326,9 @@ xfs_bmap_update_get_group(
 {
        xfs_agnumber_t          agno;
 
+       if (xfs_ifork_is_realtime(bi->bi_owner, bi->bi_whichfork))
+               return;
+
        agno = XFS_FSB_TO_AGNO(mp, bi->bi_bmap.br_startblock);
 
        /*
@@ -353,6 +358,9 @@ static inline void
 xfs_bmap_update_put_group(
        struct xfs_bmap_intent  *bi)
 {
+       if (xfs_ifork_is_realtime(bi->bi_owner, bi->bi_whichfork))
+               return;
+
        xfs_perag_intent_put(bi->bi_pag);
 }
 
index 2027ab56a1d85b63970fedb3dc114d93732c9a99..56b07d8ed431f214325fd810b93d6469294bd6cd 100644 (file)
@@ -2955,9 +2955,11 @@ DECLARE_EVENT_CLASS(xfs_bmap_deferred_class,
        TP_ARGS(bi),
        TP_STRUCT__entry(
                __field(dev_t, dev)
+               __field(dev_t, opdev)
                __field(xfs_agnumber_t, agno)
                __field(xfs_ino_t, ino)
                __field(xfs_agblock_t, agbno)
+               __field(xfs_fsblock_t, rtbno)
                __field(int, whichfork)
                __field(xfs_fileoff_t, l_loff)
                __field(xfs_filblks_t, l_len)
@@ -2968,23 +2970,34 @@ DECLARE_EVENT_CLASS(xfs_bmap_deferred_class,
                struct xfs_inode        *ip = bi->bi_owner;
 
                __entry->dev = ip->i_mount->m_super->s_dev;
-               __entry->agno = XFS_FSB_TO_AGNO(ip->i_mount,
-                                       bi->bi_bmap.br_startblock);
+               if (xfs_ifork_is_realtime(ip, bi->bi_whichfork)) {
+                       __entry->agno = 0;
+                       __entry->agbno = 0;
+                       __entry->rtbno = bi->bi_bmap.br_startblock;
+                       __entry->opdev = ip->i_mount->m_rtdev_targp->bt_dev;
+               } else {
+                       __entry->agno = XFS_FSB_TO_AGNO(ip->i_mount,
+                                               bi->bi_bmap.br_startblock);
+                       __entry->agbno = XFS_FSB_TO_AGBNO(ip->i_mount,
+                                               bi->bi_bmap.br_startblock);
+                       __entry->rtbno = 0;
+                       __entry->opdev = __entry->dev;
+               }
                __entry->ino = ip->i_ino;
-               __entry->agbno = XFS_FSB_TO_AGBNO(ip->i_mount,
-                                       bi->bi_bmap.br_startblock);
                __entry->whichfork = bi->bi_whichfork;
                __entry->l_loff = bi->bi_bmap.br_startoff;
                __entry->l_len = bi->bi_bmap.br_blockcount;
                __entry->l_state = bi->bi_bmap.br_state;
                __entry->op = bi->bi_type;
        ),
-       TP_printk("dev %d:%d op %s ino 0x%llx agno 0x%x agbno 0x%x %s fileoff 0x%llx fsbcount 0x%llx state %d",
+       TP_printk("dev %d:%d op %s opdev %d:%d ino 0x%llx agno 0x%x agbno 0x%x rtbno 0x%llx %s fileoff 0x%llx fsbcount 0x%llx state %d",
                  MAJOR(__entry->dev), MINOR(__entry->dev),
                  __print_symbolic(__entry->op, XFS_BMAP_INTENT_STRINGS),
+                 MAJOR(__entry->opdev), MINOR(__entry->opdev),
                  __entry->ino,
                  __entry->agno,
                  __entry->agbno,
+                 __entry->rtbno,
                  __print_symbolic(__entry->whichfork, XFS_WHICHFORK_STRINGS),
                  __entry->l_loff,
                  __entry->l_len,