diff options
author | Eric Sandeen <sandeen@redhat.com> | 2009-10-02 21:20:55 -0400 |
---|---|---|
committer | Theodore Ts'o <tytso@mit.edu> | 2009-10-02 21:20:55 -0400 |
commit | fbbf69456619de5d251cb9f1df609069178c62d5 (patch) | |
tree | e0a5bc75a02dda7f46ba4d0e838c54f39b1fe4f6 /fs/ext4/inode.c | |
parent | 74072d0a63553720dd3c70a8b8e9407eb2027dbe (diff) |
[PATCH] ext4: retry failed direct IO allocations
On a 256M filesystem, doing this in a loop:
xfs_io -F -f -d -c 'pwrite 0 64m' test
rm -f test
eventually leads to ENOSPC. (the xfs_io command does a
64m direct IO write to the file "test")
As with other block allocation callers, it looks like we need to
potentially retry the allocations on the initial ENOSPC.
Signed-off-by: Eric Sandeen <sandeen@redhat.com>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
Diffstat (limited to 'fs/ext4/inode.c')
-rw-r--r-- | fs/ext4/inode.c | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 635f8ec6ebc6..5c5bc5dafff8 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c | |||
@@ -3378,6 +3378,7 @@ static ssize_t ext4_ind_direct_IO(int rw, struct kiocb *iocb, | |||
3378 | ssize_t ret; | 3378 | ssize_t ret; |
3379 | int orphan = 0; | 3379 | int orphan = 0; |
3380 | size_t count = iov_length(iov, nr_segs); | 3380 | size_t count = iov_length(iov, nr_segs); |
3381 | int retries = 0; | ||
3381 | 3382 | ||
3382 | if (rw == WRITE) { | 3383 | if (rw == WRITE) { |
3383 | loff_t final_size = offset + count; | 3384 | loff_t final_size = offset + count; |
@@ -3400,9 +3401,12 @@ static ssize_t ext4_ind_direct_IO(int rw, struct kiocb *iocb, | |||
3400 | } | 3401 | } |
3401 | } | 3402 | } |
3402 | 3403 | ||
3404 | retry: | ||
3403 | ret = blockdev_direct_IO(rw, iocb, inode, inode->i_sb->s_bdev, iov, | 3405 | ret = blockdev_direct_IO(rw, iocb, inode, inode->i_sb->s_bdev, iov, |
3404 | offset, nr_segs, | 3406 | offset, nr_segs, |
3405 | ext4_get_block, NULL); | 3407 | ext4_get_block, NULL); |
3408 | if (ret == -ENOSPC && ext4_should_retry_alloc(inode->i_sb, &retries)) | ||
3409 | goto retry; | ||
3406 | 3410 | ||
3407 | if (orphan) { | 3411 | if (orphan) { |
3408 | int err; | 3412 | int err; |