mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-06 02:50:43 +00:00
xfs: fix bogus space reservation in xfs_iomap_write_allocate
The space reservations was without an explaination in commit
"Add error reporting calls in error paths that return EFSCORRUPTED"
back in 2003. There is no reason to reserve disk blocks in the
transaction when allocating blocks for delalloc space as we already
reserved the space when creating the delalloc extent.
With this fix we stop running out of the reserved pool in
generic/229, which has happened for long time with small blocksize
file systems, and has increased in severity with the new buffered
write path.
[ dchinner: we still need to pass the block reservation into
xfs_bmapi_write() to ensure we don't deadlock during AG selection.
See commit dbd5c8c
("xfs: pass total block res. as total
xfs_bmapi_write() parameter") for more details on why this is
necessary. ]
Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
Signed-off-by: Dave Chinner <david@fromorbit.com>
This commit is contained in:
parent
4dd3fd7197
commit
0af32fb468
1 changed files with 7 additions and 3 deletions
|
@ -715,12 +715,16 @@ xfs_iomap_write_allocate(
|
|||
* is in the delayed allocation extent on which we sit
|
||||
* but before our buffer starts.
|
||||
*/
|
||||
|
||||
nimaps = 0;
|
||||
while (nimaps == 0) {
|
||||
nres = XFS_EXTENTADD_SPACE_RES(mp, XFS_DATA_FORK);
|
||||
|
||||
error = xfs_trans_alloc(mp, &M_RES(mp)->tr_write, nres,
|
||||
/*
|
||||
* We have already reserved space for the extent and any
|
||||
* indirect blocks when creating the delalloc extent,
|
||||
* there is no need to reserve space in this transaction
|
||||
* again.
|
||||
*/
|
||||
error = xfs_trans_alloc(mp, &M_RES(mp)->tr_write, 0,
|
||||
0, XFS_TRANS_RESERVE, &tp);
|
||||
if (error)
|
||||
return error;
|
||||
|
|
Loading…
Reference in a new issue