diff options
Diffstat (limited to 'fs/xfs/xfs_inode.c')
-rw-r--r-- | fs/xfs/xfs_inode.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index d053a5942d64..2e2f8757d031 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -1163,10 +1163,18 @@ xfs_create( */ retry: error = xfs_trans_alloc(mp, tres, resblks, 0, 0, &tp); - if (error == -ENOSPC) { + /* + * We weren't able to reserve enough space to add the inode. Flush + * any disk space that was being held in the hopes of speeding up the + * filesystem. + */ + if (error == -ENOSPC && !cleared_space) { + cleared_space = true; /* flush outstanding delalloc blocks and retry */ xfs_flush_inodes(mp); - error = xfs_trans_alloc(mp, tres, resblks, 0, 0, &tp); + error = xfs_inode_free_blocks(mp, true); + if (!error) + goto retry; } if (error) goto out_release_inode; |