浏览代码

xfs: fix up agi unlinked list reservations

The current AGI unlinked list addition and removal reservations do
not reflect the worst case log usage. An unlinked list removal can
log up to two on-disk inode clusters but only includes reservation
for one. An unlinked list addition logs the on-disk cluster but
includes reservation for an in-core inode.

Update the AGI unlinked list reservation helpers to calculate the
correct worst case reservation for the associated operations.

Signed-off-by: Brian Foster <bfoster@redhat.com>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Brian Foster 7 年之前
父节点
当前提交
e8341d9f63
共有 1 个文件被更改,包括 4 次插入3 次删除
  1. 4 3
      fs/xfs/libxfs/xfs_trans_resv.c

+ 4 - 3
fs/xfs/libxfs/xfs_trans_resv.c

@@ -282,13 +282,14 @@ xfs_calc_rename_reservation(
  * For removing an inode from unlinked list at first, we can modify:
  * For removing an inode from unlinked list at first, we can modify:
  *    the agi hash list and counters: sector size
  *    the agi hash list and counters: sector size
  *    the on disk inode before ours in the agi hash list: inode cluster size
  *    the on disk inode before ours in the agi hash list: inode cluster size
+ *    the on disk inode in the agi hash list: inode cluster size
  */
  */
 STATIC uint
 STATIC uint
 xfs_calc_iunlink_remove_reservation(
 xfs_calc_iunlink_remove_reservation(
 	struct xfs_mount        *mp)
 	struct xfs_mount        *mp)
 {
 {
 	return xfs_calc_buf_res(1, mp->m_sb.sb_sectsize) +
 	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);
+	       2 * max_t(uint, XFS_FSB_TO_B(mp, 1), mp->m_inode_cluster_size);
 }
 }
 
 
 /*
 /*
@@ -320,13 +321,13 @@ xfs_calc_link_reservation(
 /*
 /*
  * For adding an inode to unlinked list we can modify:
  * For adding an inode to unlinked list we can modify:
  *    the agi hash list: sector size
  *    the agi hash list: sector size
- *    the unlinked inode: inode size
+ *    the on disk inode: inode cluster size
  */
  */
 STATIC uint
 STATIC uint
 xfs_calc_iunlink_add_reservation(xfs_mount_t *mp)
 xfs_calc_iunlink_add_reservation(xfs_mount_t *mp)
 {
 {
 	return xfs_calc_buf_res(1, mp->m_sb.sb_sectsize) +
 	return xfs_calc_buf_res(1, mp->m_sb.sb_sectsize) +
-		xfs_calc_inode_res(mp, 1);
+		max_t(uint, XFS_FSB_TO_B(mp, 1), mp->m_inode_cluster_size);
 }
 }
 
 
 /*
 /*