summaryrefslogtreecommitdiff
path: root/fs/xfs/xfs_file.c
diff options
context:
space:
mode:
authorDarrick J. Wong <darrick.wong@oracle.com>2020-02-19 17:02:01 -0800
committerDarrick J. Wong <darrick.wong@oracle.com>2020-06-01 21:16:34 -0700
commitbf06274cc6bf9f976de27aaf7eb31ce7213dfb16 (patch)
treea02f6a0b710ee322cf380a5dda01c4f664f1ccaa /fs/xfs/xfs_file.c
parentff2385c162005906303741d383e79ea72ea81686 (diff)
xfs: refactor messy xfs_inode_free_quota_* functions
The functions to run an eof/cowblocks scan to try to reduce quota usage are kind of a mess -- the logic repeatedly initializes an eofb structure and there are logic bugs in the code that result in the cowblocks scan never actually happening. Replace all three functions with a single function that fills out an eofb if we're low on quota and runs both eof and cowblocks scans. Fixes: 83104d449e8c4 ("xfs: garbage collect old cowextsz reservations") Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Diffstat (limited to 'fs/xfs/xfs_file.c')
-rw-r--r--fs/xfs/xfs_file.c15
1 files changed, 6 insertions, 9 deletions
diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c
index 4b8bdecc3863..626501aca5db 100644
--- a/fs/xfs/xfs_file.c
+++ b/fs/xfs/xfs_file.c
@@ -616,7 +616,7 @@ xfs_file_buffered_aio_write(
struct inode *inode = mapping->host;
struct xfs_inode *ip = XFS_I(inode);
ssize_t ret;
- int enospc = 0;
+ bool cleared_space = false;
int iolock;
if (iocb->ki_flags & IOCB_NOWAIT)
@@ -648,19 +648,16 @@ write_retry:
* also behaves as a filter to prevent too many eofblocks scans from
* running at the same time.
*/
- if (ret == -EDQUOT && !enospc) {
+ if (ret == -EDQUOT && !cleared_space) {
xfs_iunlock(ip, iolock);
- enospc = xfs_inode_free_quota_eofblocks(ip);
- if (enospc)
- goto write_retry;
- enospc = xfs_inode_free_quota_cowblocks(ip);
- if (enospc)
+ cleared_space = xfs_inode_free_quota_blocks(ip);
+ if (cleared_space)
goto write_retry;
iolock = 0;
- } else if (ret == -ENOSPC && !enospc) {
+ } else if (ret == -ENOSPC && !cleared_space) {
struct xfs_eofblocks eofb = {0};
- enospc = 1;
+ cleared_space = true;
xfs_flush_inodes(ip->i_mount);
xfs_iunlock(ip, iolock);