struct inode *nilfs_bmap_get_dat(const struct nilfs_bmap *bmap)
 {
-       return nilfs_dat_inode(NILFS_I_NILFS(bmap->b_inode));
+       return NILFS_I_NILFS(bmap->b_inode)->ns_dat;
 }
 
 static int nilfs_bmap_convert_error(struct nilfs_bmap *bmap,
 
        if (pblocknr == 0) {
                pblocknr = blocknr;
                if (inode->i_ino != NILFS_DAT_INO) {
-                       struct inode *dat =
-                               nilfs_dat_inode(NILFS_I_NILFS(inode));
+                       struct inode *dat = NILFS_I_NILFS(inode)->ns_dat;
 
                        /* blocknr is a virtual block number */
                        err = nilfs_dat_translate(dat, blocknr, &pblocknr);
 
        struct nilfs_inode_info *ii = NILFS_I(inode);
        __u64 blknum = 0;
        int err = 0, ret;
-       struct inode *dat = nilfs_dat_inode(NILFS_I_NILFS(inode));
+       struct inode *dat = NILFS_I_NILFS(inode)->ns_dat;
        unsigned maxblocks = bh_result->b_size >> inode->i_blkbits;
 
        down_read(&NILFS_MDT(dat)->mi_sem);
                              struct nilfs_root *root, unsigned long ino,
                              struct inode *inode)
 {
-       struct nilfs_sb_info *sbi = NILFS_SB(sb);
-       struct inode *dat = nilfs_dat_inode(sbi->s_nilfs);
+       struct the_nilfs *nilfs = NILFS_SB(sb)->s_nilfs;
        struct buffer_head *bh;
        struct nilfs_inode *raw_inode;
        int err;
 
-       down_read(&NILFS_MDT(dat)->mi_sem);     /* XXX */
+       down_read(&NILFS_MDT(nilfs->ns_dat)->mi_sem);
        err = nilfs_ifile_get_inode_block(root->ifile, ino, &bh);
        if (unlikely(err))
                goto bad_inode;
        }
        nilfs_ifile_unmap_inode(root->ifile, ino, bh);
        brelse(bh);
-       up_read(&NILFS_MDT(dat)->mi_sem);       /* XXX */
+       up_read(&NILFS_MDT(nilfs->ns_dat)->mi_sem);
        nilfs_set_inode_flags(inode);
        return 0;
 
        brelse(bh);
 
  bad_inode:
-       up_read(&NILFS_MDT(dat)->mi_sem);       /* XXX */
+       up_read(&NILFS_MDT(nilfs->ns_dat)->mi_sem);
        return err;
 }
 
 
        int ret;
 
        down_read(&nilfs->ns_segctor_sem);
-       ret = nilfs_dat_get_vinfo(nilfs_dat_inode(nilfs), buf, size, nmembs);
+       ret = nilfs_dat_get_vinfo(nilfs->ns_dat, buf, size, nmembs);
        up_read(&nilfs->ns_segctor_sem);
        return ret;
 }
 nilfs_ioctl_do_get_bdescs(struct the_nilfs *nilfs, __u64 *posp, int flags,
                          void *buf, size_t size, size_t nmembs)
 {
-       struct inode *dat = nilfs_dat_inode(nilfs);
-       struct nilfs_bmap *bmap = NILFS_I(dat)->i_bmap;
+       struct nilfs_bmap *bmap = NILFS_I(nilfs->ns_dat)->i_bmap;
        struct nilfs_bdesc *bdescs = buf;
        int ret, i;
 
        size_t nmembs = argv->v_nmembs;
        int ret;
 
-       ret = nilfs_dat_freev(nilfs_dat_inode(nilfs), buf, nmembs);
+       ret = nilfs_dat_freev(nilfs->ns_dat, buf, nmembs);
 
        return (ret < 0) ? ret : nmembs;
 }
                                         struct nilfs_argv *argv, void *buf)
 {
        size_t nmembs = argv->v_nmembs;
-       struct inode *dat = nilfs_dat_inode(nilfs);
-       struct nilfs_bmap *bmap = NILFS_I(dat)->i_bmap;
+       struct nilfs_bmap *bmap = NILFS_I(nilfs->ns_dat)->i_bmap;
        struct nilfs_bdesc *bdescs = buf;
        int ret, i;
 
                        /* skip dead block */
                        continue;
                if (bdescs[i].bd_level == 0) {
-                       ret = nilfs_mdt_mark_block_dirty(dat,
+                       ret = nilfs_mdt_mark_block_dirty(nilfs->ns_dat,
                                                         bdescs[i].bd_offset);
                        if (ret < 0) {
                                WARN_ON(ret == -ENOENT);
 
        return nilfs_test_transaction_flag(NILFS_TI_WRITER);
 }
 
-static inline struct inode *nilfs_dat_inode(const struct the_nilfs *nilfs)
-{
-       return nilfs->ns_dat;
-}
-
 /*
  * function prototype
  */
 
                ret++;
        if (nilfs_mdt_fetch_dirty(nilfs->ns_sufile))
                ret++;
-       if (ret || nilfs_doing_gc())
-               if (nilfs_mdt_fetch_dirty(nilfs_dat_inode(nilfs)))
-                       ret++;
+       if ((ret || nilfs_doing_gc()) && nilfs_mdt_fetch_dirty(nilfs->ns_dat))
+               ret++;
        return ret;
 }
 
        nilfs_mdt_clear_dirty(sci->sc_root->ifile);
        nilfs_mdt_clear_dirty(nilfs->ns_cpfile);
        nilfs_mdt_clear_dirty(nilfs->ns_sufile);
-       nilfs_mdt_clear_dirty(nilfs_dat_inode(nilfs));
+       nilfs_mdt_clear_dirty(nilfs->ns_dat);
 }
 
 static int nilfs_segctor_create_checkpoint(struct nilfs_sc_info *sci)
                              nilfs->ns_nongc_ctime : sci->sc_seg_ctime);
        raw_sr->sr_flags = 0;
 
-       nilfs_write_inode_common(nilfs_dat_inode(nilfs), (void *)raw_sr +
+       nilfs_write_inode_common(nilfs->ns_dat, (void *)raw_sr +
                                 NILFS_SR_DAT_OFFSET(isz), 1);
        nilfs_write_inode_common(nilfs->ns_cpfile, (void *)raw_sr +
                                 NILFS_SR_CPFILE_OFFSET(isz), 1);
                sci->sc_stage.scnt++;  /* Fall through */
        case NILFS_ST_DAT:
  dat_stage:
-               err = nilfs_segctor_scan_file(sci, nilfs_dat_inode(nilfs),
+               err = nilfs_segctor_scan_file(sci, nilfs->ns_dat,
                                              &nilfs_sc_dat_ops);
                if (unlikely(err))
                        break;
 
 
 int nilfs_count_free_blocks(struct the_nilfs *nilfs, sector_t *nblocks)
 {
-       struct inode *dat = nilfs_dat_inode(nilfs);
        unsigned long ncleansegs;
 
-       down_read(&NILFS_MDT(dat)->mi_sem);     /* XXX */
+       down_read(&NILFS_MDT(nilfs->ns_dat)->mi_sem);
        ncleansegs = nilfs_sufile_get_ncleansegs(nilfs->ns_sufile);
-       up_read(&NILFS_MDT(dat)->mi_sem);       /* XXX */
+       up_read(&NILFS_MDT(nilfs->ns_dat)->mi_sem);
        *nblocks = (sector_t)ncleansegs * nilfs->ns_blocks_per_segment;
        return 0;
 }