xfs: remove xfs_flush_space
The only thing we need to do now when we get an ENOSPC condition during delayed allocation reservation is flush all the other inodes with delalloc blocks on them and retry without EOF preallocation. Remove the unneeded mess that is xfs_flush_space() and just call xfs_flush_inodes() directly from xfs_iomap_write_delay(). Also, change the location of the retry label to avoid trying to do EOF preallocation because we don't want to do that at ENOSPC. This enables us to remove the BMAPI_SYNC flag as it is no longer used. Signed-off-by: Dave Chinner <david@fromorbit.com> Reviewed-by: Christoph Hellwig <hch@lst.de>
This commit is contained in:
parent
153fec43ce
commit
8de2bf937a
2 changed files with 16 additions and 48 deletions
|
@ -337,38 +337,6 @@ xfs_iomap_eof_align_last_fsb(
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
STATIC int
|
|
||||||
xfs_flush_space(
|
|
||||||
xfs_inode_t *ip,
|
|
||||||
int *fsynced,
|
|
||||||
int *ioflags)
|
|
||||||
{
|
|
||||||
switch (*fsynced) {
|
|
||||||
case 0:
|
|
||||||
if (ip->i_delayed_blks) {
|
|
||||||
xfs_iunlock(ip, XFS_ILOCK_EXCL);
|
|
||||||
delay(1);
|
|
||||||
xfs_ilock(ip, XFS_ILOCK_EXCL);
|
|
||||||
*fsynced = 1;
|
|
||||||
} else {
|
|
||||||
*ioflags |= BMAPI_SYNC;
|
|
||||||
*fsynced = 2;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
case 1:
|
|
||||||
*fsynced = 2;
|
|
||||||
*ioflags |= BMAPI_SYNC;
|
|
||||||
return 0;
|
|
||||||
case 2:
|
|
||||||
xfs_iunlock(ip, XFS_ILOCK_EXCL);
|
|
||||||
xfs_flush_inodes(ip);
|
|
||||||
xfs_ilock(ip, XFS_ILOCK_EXCL);
|
|
||||||
*fsynced = 3;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
STATIC int
|
STATIC int
|
||||||
xfs_cmn_err_fsblock_zero(
|
xfs_cmn_err_fsblock_zero(
|
||||||
xfs_inode_t *ip,
|
xfs_inode_t *ip,
|
||||||
|
@ -538,15 +506,9 @@ xfs_iomap_write_direct(
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If the caller is doing a write at the end of the file,
|
* If the caller is doing a write at the end of the file, then extend the
|
||||||
* then extend the allocation out to the file system's write
|
* allocation out to the file system's write iosize. We clean up any extra
|
||||||
* iosize. We clean up any extra space left over when the
|
* space left over when the file is closed in xfs_inactive().
|
||||||
* file is closed in xfs_inactive().
|
|
||||||
*
|
|
||||||
* For sync writes, we are flushing delayed allocate space to
|
|
||||||
* try to make additional space available for allocation near
|
|
||||||
* the filesystem full boundary - preallocation hurts in that
|
|
||||||
* situation, of course.
|
|
||||||
*/
|
*/
|
||||||
STATIC int
|
STATIC int
|
||||||
xfs_iomap_eof_want_preallocate(
|
xfs_iomap_eof_want_preallocate(
|
||||||
|
@ -565,7 +527,7 @@ xfs_iomap_eof_want_preallocate(
|
||||||
int n, error, imaps;
|
int n, error, imaps;
|
||||||
|
|
||||||
*prealloc = 0;
|
*prealloc = 0;
|
||||||
if ((ioflag & BMAPI_SYNC) || (offset + count) <= ip->i_size)
|
if ((offset + count) <= ip->i_size)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -611,7 +573,7 @@ xfs_iomap_write_delay(
|
||||||
xfs_extlen_t extsz;
|
xfs_extlen_t extsz;
|
||||||
int nimaps;
|
int nimaps;
|
||||||
xfs_bmbt_irec_t imap[XFS_WRITE_IMAPS];
|
xfs_bmbt_irec_t imap[XFS_WRITE_IMAPS];
|
||||||
int prealloc, fsynced = 0;
|
int prealloc, flushed = 0;
|
||||||
int error;
|
int error;
|
||||||
|
|
||||||
ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
|
ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
|
||||||
|
@ -627,12 +589,12 @@ xfs_iomap_write_delay(
|
||||||
extsz = xfs_get_extsz_hint(ip);
|
extsz = xfs_get_extsz_hint(ip);
|
||||||
offset_fsb = XFS_B_TO_FSBT(mp, offset);
|
offset_fsb = XFS_B_TO_FSBT(mp, offset);
|
||||||
|
|
||||||
retry:
|
|
||||||
error = xfs_iomap_eof_want_preallocate(mp, ip, offset, count,
|
error = xfs_iomap_eof_want_preallocate(mp, ip, offset, count,
|
||||||
ioflag, imap, XFS_WRITE_IMAPS, &prealloc);
|
ioflag, imap, XFS_WRITE_IMAPS, &prealloc);
|
||||||
if (error)
|
if (error)
|
||||||
return error;
|
return error;
|
||||||
|
|
||||||
|
retry:
|
||||||
if (prealloc) {
|
if (prealloc) {
|
||||||
aligned_offset = XFS_WRITEIO_ALIGN(mp, (offset + count - 1));
|
aligned_offset = XFS_WRITEIO_ALIGN(mp, (offset + count - 1));
|
||||||
ioalign = XFS_B_TO_FSBT(mp, aligned_offset);
|
ioalign = XFS_B_TO_FSBT(mp, aligned_offset);
|
||||||
|
@ -659,15 +621,22 @@ xfs_iomap_write_delay(
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If bmapi returned us nothing, and if we didn't get back EDQUOT,
|
* If bmapi returned us nothing, and if we didn't get back EDQUOT,
|
||||||
* then we must have run out of space - flush delalloc, and retry..
|
* then we must have run out of space - flush all other inodes with
|
||||||
|
* delalloc blocks and retry without EOF preallocation.
|
||||||
*/
|
*/
|
||||||
if (nimaps == 0) {
|
if (nimaps == 0) {
|
||||||
xfs_iomap_enter_trace(XFS_IOMAP_WRITE_NOSPACE,
|
xfs_iomap_enter_trace(XFS_IOMAP_WRITE_NOSPACE,
|
||||||
ip, offset, count);
|
ip, offset, count);
|
||||||
if (xfs_flush_space(ip, &fsynced, &ioflag))
|
if (flushed)
|
||||||
return XFS_ERROR(ENOSPC);
|
return XFS_ERROR(ENOSPC);
|
||||||
|
|
||||||
|
xfs_iunlock(ip, XFS_ILOCK_EXCL);
|
||||||
|
xfs_flush_inodes(ip);
|
||||||
|
xfs_ilock(ip, XFS_ILOCK_EXCL);
|
||||||
|
|
||||||
|
flushed = 1;
|
||||||
error = 0;
|
error = 0;
|
||||||
|
prealloc = 0;
|
||||||
goto retry;
|
goto retry;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -40,8 +40,7 @@ typedef enum {
|
||||||
BMAPI_IGNSTATE = (1 << 4), /* ignore unwritten state on read */
|
BMAPI_IGNSTATE = (1 << 4), /* ignore unwritten state on read */
|
||||||
BMAPI_DIRECT = (1 << 5), /* direct instead of buffered write */
|
BMAPI_DIRECT = (1 << 5), /* direct instead of buffered write */
|
||||||
BMAPI_MMAP = (1 << 6), /* allocate for mmap write */
|
BMAPI_MMAP = (1 << 6), /* allocate for mmap write */
|
||||||
BMAPI_SYNC = (1 << 7), /* sync write to flush delalloc space */
|
BMAPI_TRYLOCK = (1 << 7), /* non-blocking request */
|
||||||
BMAPI_TRYLOCK = (1 << 8), /* non-blocking request */
|
|
||||||
} bmapi_flags_t;
|
} bmapi_flags_t;
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue