@@ -680,8 +680,7 @@ static void
rtinit(
struct xfs_mount *mp)
{
- struct cred creds;
- struct fsxattr fsxattrs;
+ struct xfs_imeta_update upd;
struct xfs_bmbt_irec map[XFS_BMAP_MAX_NMAP];
struct xfs_inode *rbmip;
struct xfs_inode *rsumip;
@@ -696,45 +695,54 @@ rtinit(
int error;
/* Create the realtime bitmap inode. */
- error = -libxfs_trans_alloc_rollable(mp, MKFS_BLOCKRES_INODE, &tp);
+ error = -libxfs_imeta_start_update(mp, &XFS_IMETA_RTBITMAP, &upd);
if (error)
res_failed(error);
- memset(&creds, 0, sizeof(creds));
- memset(&fsxattrs, 0, sizeof(fsxattrs));
- error = creatproto(&tp, NULL, S_IFREG, 1, 0, &creds, &fsxattrs,
- &rbmip);
- if (error) {
+ error = -libxfs_trans_alloc(mp, &M_RES(mp)->tr_imeta_create,
+ libxfs_imeta_create_space_res(mp), 0, 0, &tp);
+ if (error)
+ res_failed(error);
+
+ error = -libxfs_imeta_create(&tp, &XFS_IMETA_RTBITMAP, S_IFREG, 0,
+ &rbmip, &upd);
+ if (error)
fail(_("Realtime bitmap inode allocation failed"), error);
- }
- /*
- * Do our thing with rbmip before allocating rsumip,
- * because the next call to createproto may
- * commit the transaction in which rbmip was allocated.
- */
- mp->m_sb.sb_rbmino = rbmip->i_ino;
+
rbmip->i_disk_size = mp->m_sb.sb_rbmblocks * mp->m_sb.sb_blocksize;
- rbmip->i_diflags = XFS_DIFLAG_NEWRTBM;
+ rbmip->i_diflags |= XFS_DIFLAG_NEWRTBM;
*(uint64_t *)&VFS_I(rbmip)->i_atime = 0;
libxfs_trans_log_inode(tp, rbmip, XFS_ILOG_CORE);
- libxfs_log_sb(tp);
+ error = -libxfs_trans_commit(tp);
+ if (error)
+ fail(_("Completion of the realtime bitmap inode failed"),
+ error);
mp->m_rbmip = rbmip;
+ libxfs_imeta_end_update(mp, &upd, 0);
/* Create the realtime summary inode. */
- error = creatproto(&tp, NULL, S_IFREG, 1, 0, &creds, &fsxattrs,
- &rsumip);
- if (error) {
+ error = -libxfs_imeta_start_update(mp, &XFS_IMETA_RTSUMMARY, &upd);
+ if (error)
+ res_failed(error);
+
+ error = -libxfs_trans_alloc(mp, &M_RES(mp)->tr_imeta_create,
+ libxfs_imeta_create_space_res(mp), 0, 0, &tp);
+ if (error)
+ res_failed(error);
+
+ error = -libxfs_imeta_create(&tp, &XFS_IMETA_RTSUMMARY, S_IFREG, 0,
+ &rsumip, &upd);
+ if (error)
fail(_("Realtime summary inode allocation failed"), error);
- }
- mp->m_sb.sb_rsumino = rsumip->i_ino;
+
rsumip->i_disk_size = mp->m_rsumsize;
libxfs_trans_log_inode(tp, rsumip, XFS_ILOG_CORE);
- libxfs_log_sb(tp);
error = -libxfs_trans_commit(tp);
if (error)
fail(_("Completion of the realtime summary inode failed"),
error);
mp->m_rsumip = rsumip;
+ libxfs_imeta_end_update(mp, &upd, 0);
/* Zero the realtime bitmap. */
blocks = mp->m_sb.sb_rbmblocks +