return 0;
  }
  
+ STATIC int
+ xfs_vn_tmpfile(
+       struct inode    *dir,
+       struct dentry   *dentry,
+       umode_t         mode)
+ {
+       int             error;
+ 
+       error = xfs_create_tmpfile(XFS_I(dir), dentry, mode);
+ 
+       return -error;
+ }
+ 
  static const struct inode_operations xfs_inode_operations = {
        .get_acl                = xfs_get_acl,
 +      .set_acl                = xfs_set_acl,
        .getattr                = xfs_vn_getattr,
        .setattr                = xfs_vn_setattr,
        .setxattr               = generic_setxattr,
 
                                      XFS_FSB_TO_B(mp, 1))));
  }
  
 -              MAX((__uint16_t)XFS_FSB_TO_B(mp, 1),
 -                      (__uint16_t)XFS_INODE_CLUSTER_SIZE(mp));
+ /*
+  * For removing an inode from unlinked list at first, we can modify:
+  *    the agi hash list and counters: sector size
+  *    the on disk inode before ours in the agi hash list: inode cluster size
+  */
+ STATIC uint
+ xfs_calc_iunlink_remove_reservation(
+       struct xfs_mount        *mp)
+ {
+       return xfs_calc_buf_res(1, mp->m_sb.sb_sectsize) +
++             max_t(uint, XFS_FSB_TO_B(mp, 1), mp->m_inode_cluster_size);
+ }
+ 
  /*
   * For creating a link to an inode:
   *    the parent directory inode: inode size
  {
        return XFS_DQUOT_LOGRES(mp) +
                xfs_calc_inode_res(mp, 1) +
-               xfs_calc_buf_res(2, mp->m_sb.sb_sectsize) +
+               xfs_calc_buf_res(1, mp->m_sb.sb_sectsize) +
                xfs_calc_buf_res(1, XFS_FSB_TO_B(mp, 1)) +
-               max_t(uint, XFS_FSB_TO_B(mp, 1), mp->m_inode_cluster_size) +
+               xfs_calc_iunlink_remove_reservation(mp) +
                xfs_calc_buf_res(1, 0) +
 -              xfs_calc_buf_res(2 + XFS_IALLOC_BLOCKS(mp) +
 +              xfs_calc_buf_res(2 + mp->m_ialloc_blks +
                                 mp->m_in_maxlevels, 0) +
                xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1),
                                 XFS_FSB_TO_B(mp, 1));