diff options
Diffstat (limited to 'fs')
-rw-r--r-- | fs/xfs/xfs_trans_resv.c | 22 |
1 files changed, 15 insertions, 7 deletions
diff --git a/fs/xfs/xfs_trans_resv.c b/fs/xfs/xfs_trans_resv.c index 2ffd3e331b49..c486e4b9f2a7 100644 --- a/fs/xfs/xfs_trans_resv.c +++ b/fs/xfs/xfs_trans_resv.c | |||
@@ -81,20 +81,28 @@ xfs_calc_buf_res( | |||
81 | * on disk. Hence we need an inode reservation function that calculates all this | 81 | * on disk. Hence we need an inode reservation function that calculates all this |
82 | * correctly. So, we log: | 82 | * correctly. So, we log: |
83 | * | 83 | * |
84 | * - log op headers for object | 84 | * - 4 log op headers for object |
85 | * - for the ilf, the inode core and 2 forks | ||
85 | * - inode log format object | 86 | * - inode log format object |
86 | * - the entire inode contents (core + 2 forks) | 87 | * - the inode core |
87 | * - two bmap btree block headers | 88 | * - two inode forks containing bmap btree root blocks. |
89 | * - the btree data contained by both forks will fit into the inode size, | ||
90 | * hence when combined with the inode core above, we have a total of the | ||
91 | * actual inode size. | ||
92 | * - the BMBT headers need to be accounted separately, as they are | ||
93 | * additional to the records and pointers that fit inside the inode | ||
94 | * forks. | ||
88 | */ | 95 | */ |
89 | STATIC uint | 96 | STATIC uint |
90 | xfs_calc_inode_res( | 97 | xfs_calc_inode_res( |
91 | struct xfs_mount *mp, | 98 | struct xfs_mount *mp, |
92 | uint ninodes) | 99 | uint ninodes) |
93 | { | 100 | { |
94 | return ninodes * (sizeof(struct xlog_op_header) + | 101 | return ninodes * |
95 | sizeof(struct xfs_inode_log_format) + | 102 | (4 * sizeof(struct xlog_op_header) + |
96 | mp->m_sb.sb_inodesize + | 103 | sizeof(struct xfs_inode_log_format) + |
97 | 2 * XFS_BMBT_BLOCK_LEN(mp)); | 104 | mp->m_sb.sb_inodesize + |
105 | 2 * XFS_BMBT_BLOCK_LEN(mp)); | ||
98 | } | 106 | } |
99 | 107 | ||
100 | /* | 108 | /* |