mirror of
https://github.com/torvalds/linux.git
synced 2024-11-10 14:11:52 +00:00
xfs: don't set bmapi total block req where minleft is
xfs_bmapi_write() takes a total block requirement parameter that is passed down to the block allocation code and is used to specify the total block requirement of the associated transaction. This is used to try and select an AG that can not only satisfy the requested extent allocation, but can also accommodate subsequent allocations that might be required to complete the transaction. For example, additional bmbt block allocations may be required on insertion of the resulting extent to an inode data fork. While it's important for callers to calculate and reserve such extra blocks in the transaction, it is not necessary to pass the total value to xfs_bmapi_write() in all cases. The latter automatically sets minleft to ensure that sufficient free blocks remain after the allocation attempt to expand the format of the associated inode (i.e., such as extent to btree conversion, btree splits, etc). Therefore, any callers that pass a total block requirement of the bmap mapping length plus worst case bmbt expansion essentially specify the additional reservation requirement twice. These callers can pass a total of zero to rely on the bmapi minleft policy. Beyond being superfluous, the primary motivation for this change is that the total reservation logic in the bmbt code is dubious in scenarios where minlen < maxlen and a maxlen extent cannot be allocated (which is more common for data extent allocations where contiguity is not required). The total value is based on maxlen in the xfs_bmapi_write() caller. If the bmbt code falls back to an allocation between minlen and maxlen, that allocation will not succeed until total is reset to minlen, which essentially throws away any additional reservation included in total by the caller. In addition, the total value is not reset until after alignment is dropped, which means that such callers drop alignment far too aggressively than necessary. Update all callers of xfs_bmapi_write() that pass a total block value of the mapping length plus bmbt reservation to instead pass zero and rely on xfs_bmapi_minleft() to enforce the bmbt reservation requirement. This trades off slightly less conservative AG selection for the ability to preserve alignment in more scenarios. xfs_bmapi_write() callers that incorporate unrelated or additional reservations in total beyond what is already included in minleft must continue to use the former. Signed-off-by: Brian Foster <bfoster@redhat.com> Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com> Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
This commit is contained in:
parent
1c743574de
commit
da781e64b2
@ -4511,7 +4511,6 @@ xfs_bmapi_convert_delalloc(
|
||||
bma.wasdel = true;
|
||||
bma.offset = bma.got.br_startoff;
|
||||
bma.length = max_t(xfs_filblks_t, bma.got.br_blockcount, MAXEXTLEN);
|
||||
bma.total = XFS_EXTENTADD_SPACE_RES(ip->i_mount, XFS_DATA_FORK);
|
||||
bma.minleft = xfs_bmapi_minleft(tp, ip, whichfork);
|
||||
if (whichfork == XFS_COW_FORK)
|
||||
bma.flags = XFS_BMAPI_COWFORK | XFS_BMAPI_PREALLOC;
|
||||
|
@ -964,8 +964,8 @@ xfs_alloc_file_space(
|
||||
xfs_trans_ijoin(tp, ip, 0);
|
||||
|
||||
error = xfs_bmapi_write(tp, ip, startoffset_fsb,
|
||||
allocatesize_fsb, alloc_type, resblks,
|
||||
imapp, &nimaps);
|
||||
allocatesize_fsb, alloc_type, 0, imapp,
|
||||
&nimaps);
|
||||
if (error)
|
||||
goto error0;
|
||||
|
||||
|
@ -305,8 +305,8 @@ xfs_dquot_disk_alloc(
|
||||
/* Create the block mapping. */
|
||||
xfs_trans_ijoin(tp, quotip, XFS_ILOCK_EXCL);
|
||||
error = xfs_bmapi_write(tp, quotip, dqp->q_fileoffset,
|
||||
XFS_DQUOT_CLUSTER_SIZE_FSB, XFS_BMAPI_METADATA,
|
||||
XFS_QM_DQALLOC_SPACE_RES(mp), &map, &nmaps);
|
||||
XFS_DQUOT_CLUSTER_SIZE_FSB, XFS_BMAPI_METADATA, 0, &map,
|
||||
&nmaps);
|
||||
if (error)
|
||||
return error;
|
||||
ASSERT(map.br_blockcount == XFS_DQUOT_CLUSTER_SIZE_FSB);
|
||||
|
@ -285,8 +285,8 @@ xfs_iomap_write_direct(
|
||||
* caller gave to us.
|
||||
*/
|
||||
nimaps = 1;
|
||||
error = xfs_bmapi_write(tp, ip, offset_fsb, count_fsb,
|
||||
bmapi_flags, resblks, imap, &nimaps);
|
||||
error = xfs_bmapi_write(tp, ip, offset_fsb, count_fsb, bmapi_flags, 0,
|
||||
imap, &nimaps);
|
||||
if (error)
|
||||
goto out_res_cancel;
|
||||
|
||||
|
@ -410,8 +410,8 @@ xfs_reflink_allocate_cow(
|
||||
/* Allocate the entire reservation as unwritten blocks. */
|
||||
nimaps = 1;
|
||||
error = xfs_bmapi_write(tp, ip, imap->br_startoff, imap->br_blockcount,
|
||||
XFS_BMAPI_COWFORK | XFS_BMAPI_PREALLOC,
|
||||
resblks, cmap, &nimaps);
|
||||
XFS_BMAPI_COWFORK | XFS_BMAPI_PREALLOC, 0, cmap,
|
||||
&nimaps);
|
||||
if (error)
|
||||
goto out_unreserve;
|
||||
|
||||
|
@ -792,8 +792,7 @@ xfs_growfs_rt_alloc(
|
||||
*/
|
||||
nmap = 1;
|
||||
error = xfs_bmapi_write(tp, ip, oblocks, nblocks - oblocks,
|
||||
XFS_BMAPI_METADATA, resblks, &map,
|
||||
&nmap);
|
||||
XFS_BMAPI_METADATA, 0, &map, &nmap);
|
||||
if (!error && nmap < 1)
|
||||
error = -ENOSPC;
|
||||
if (error)
|
||||
|
Loading…
Reference in New Issue
Block a user