xfs: flush delayed allcoation blocks on ENOSPC in create
If we are creating lots of small files, we can fail to get a reservation for inode create earlier than we should due to EOF preallocation done during delayed allocation reservation. Hence on the first reservation ENOSPC failure flush all the delayed allocation blocks out of the system and retry. This fixes the last commonly triggered spurious ENOSPC issue that has been reported. Signed-off-by: Dave Chinner <david@fromorbit.com> Reviewed-by: Christoph Hellwig <hch@lst.de>
This commit is contained in:
parent
e43afd72d2
commit
153fec43ce
1 changed files with 7 additions and 0 deletions
|
@ -1457,6 +1457,13 @@ xfs_create(
|
||||||
error = xfs_trans_reserve(tp, resblks, log_res, 0,
|
error = xfs_trans_reserve(tp, resblks, log_res, 0,
|
||||||
XFS_TRANS_PERM_LOG_RES, log_count);
|
XFS_TRANS_PERM_LOG_RES, log_count);
|
||||||
if (error == ENOSPC) {
|
if (error == ENOSPC) {
|
||||||
|
/* flush outstanding delalloc blocks and retry */
|
||||||
|
xfs_flush_inodes(dp);
|
||||||
|
error = xfs_trans_reserve(tp, resblks, XFS_CREATE_LOG_RES(mp), 0,
|
||||||
|
XFS_TRANS_PERM_LOG_RES, XFS_CREATE_LOG_COUNT);
|
||||||
|
}
|
||||||
|
if (error == ENOSPC) {
|
||||||
|
/* No space at all so try a "no-allocation" reservation */
|
||||||
resblks = 0;
|
resblks = 0;
|
||||||
error = xfs_trans_reserve(tp, 0, log_res, 0,
|
error = xfs_trans_reserve(tp, 0, log_res, 0,
|
||||||
XFS_TRANS_PERM_LOG_RES, log_count);
|
XFS_TRANS_PERM_LOG_RES, log_count);
|
||||||
|
|
Loading…
Reference in a new issue