]> www.infradead.org Git - users/hch/xfsprogs.git/commitdiff
xfs: create routine to allocate and initialize a realtime refcount btree inode
authorDarrick J. Wong <djwong@kernel.org>
Wed, 3 Jul 2024 21:22:29 +0000 (14:22 -0700)
committerDarrick J. Wong <djwong@kernel.org>
Tue, 16 Jul 2024 22:49:23 +0000 (15:49 -0700)
Create a library routine to allocate and initialize an empty realtime
refcountbt inode.  We'll use this for growfs, mkfs, and repair.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
libxfs/xfs_rtrefcount_btree.c
libxfs/xfs_rtrefcount_btree.h

index d4ed2efd8ddd2701e7251b45c5c3505828ea3112..4dcfd20c44ca16e0bddfdde54e980687f22ff7b5 100644 (file)
@@ -697,3 +697,36 @@ xfs_iflush_rtrefcount(
                        ifp->if_broot_bytes, dfp,
                        XFS_DFORK_SIZE(dip, ip->i_mount, XFS_DATA_FORK));
 }
+
+/*
+ * Create a realtime refcount btree inode.
+ *
+ * Regardless of the return value, the caller must clean up @upd.  If a new
+ * inode is returned through @upd->ip, the caller must finish setting up that
+ * incore inode and release it.
+ */
+int
+xfs_rtrefcountbt_create(
+       struct xfs_imeta_update *upd)
+{
+       struct xfs_mount        *mp = upd->mp;
+       struct xfs_ifork        *ifp;
+       int                     error;
+
+       error = xfs_imeta_create(upd, S_IFREG);
+       if (error)
+               return error;
+
+       ifp = xfs_ifork_ptr(upd->ip, XFS_DATA_FORK);
+       ifp->if_format = XFS_DINODE_FMT_REFCOUNT;
+       ASSERT(ifp->if_broot_bytes == 0);
+       ASSERT(ifp->if_bytes == 0);
+
+       /* Initialize the empty incore btree root. */
+       xfs_iroot_alloc(upd->ip, XFS_DATA_FORK,
+                       xfs_rtrefcount_broot_space_calc(mp, 0, 0));
+       xfs_btree_init_block(mp, ifp->if_broot, &xfs_rtrefcountbt_ops,
+                       0, 0, upd->ip->i_ino);
+       xfs_trans_log_inode(upd->tp, upd->ip, XFS_ILOG_CORE | XFS_ILOG_DBROOT);
+       return 0;
+}
index ee309f625e48fd62b9d1e52a8f528d52f1f644e3..df72debf8874fde1b00d1566df085862f2f64629 100644 (file)
@@ -188,4 +188,8 @@ void xfs_rtrefcountbt_to_disk(struct xfs_mount *mp,
                struct xfs_rtrefcount_root *dblock, int dblocklen);
 void xfs_iflush_rtrefcount(struct xfs_inode *ip, struct xfs_dinode *dip);
 
+struct xfs_imeta_update;
+
+int xfs_rtrefcountbt_create(struct xfs_imeta_update *upd);
+
 #endif /* __XFS_RTREFCOUNT_BTREE_H__ */