xfs
[Top] [All Lists]

[PATCH 4/5] [XFS] Flush delayed allcoation blocks on ENOSPC in create

To: xfs@xxxxxxxxxxx
Subject: [PATCH 4/5] [XFS] Flush delayed allcoation blocks on ENOSPC in create
From: Dave Chinner <david@xxxxxxxxxxxxx>
Date: Sun, 15 Mar 2009 22:31:46 +1100
Cc: mpatocka@xxxxxxxxxx
In-reply-to: <1237116707-25793-1-git-send-email-david@xxxxxxxxxxxxx>
References: <1237116707-25793-1-git-send-email-david@xxxxxxxxxxxxx>
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@xxxxxxxxxxxxx>
---
 fs/xfs/xfs_vnodeops.c |    7 +++++++
 1 files changed, 7 insertions(+), 0 deletions(-)

diff --git a/fs/xfs/xfs_vnodeops.c b/fs/xfs/xfs_vnodeops.c
index 59de049..faf671b 100644
--- a/fs/xfs/xfs_vnodeops.c
+++ b/fs/xfs/xfs_vnodeops.c
@@ -1457,6 +1457,13 @@ xfs_create(
        error = xfs_trans_reserve(tp, resblks, log_res, 0,
                        XFS_TRANS_PERM_LOG_RES, log_count);
        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;
                error = xfs_trans_reserve(tp, 0, log_res, 0,
                                XFS_TRANS_PERM_LOG_RES, log_count);
-- 
1.6.2

<Prev in Thread] Current Thread [Next in Thread>