diff mbox

ext4: don't retry file block mapping on bigalloc fs with non-extent file

Message ID 20150319212557.GG11031@birch.djwong.org
State Accepted, archived
Headers show

Commit Message

Darrick Wong March 19, 2015, 9:25 p.m. UTC
ext4 isn't willing to map clusters to a non-extent file.  Don't signal
this with an out of space error, since the FS will retry the
allocation (which didn't fail) forever.  Instead, return EUCLEAN so
that the operation will fail immediately all the way back to userspace.

(The fix is either to run e2fsck -E bmap2extent, or to chattr +e the file.)

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
---
 fs/ext4/indirect.c |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

--
To unsubscribe from this list: send the line "unsubscribe linux-ext4" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Comments

Theodore Ts'o June 22, 2015, 1:20 a.m. UTC | #1
On Thu, Mar 19, 2015 at 02:25:57PM -0700, Darrick J. Wong wrote:
> ext4 isn't willing to map clusters to a non-extent file.  Don't signal
> this with an out of space error, since the FS will retry the
> allocation (which didn't fail) forever.  Instead, return EUCLEAN so
> that the operation will fail immediately all the way back to userspace.
> 
> (The fix is either to run e2fsck -E bmap2extent, or to chattr +e the file.)
> 
> Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>

Applied, thanks.

						- Ted
--
To unsubscribe from this list: send the line "unsubscribe linux-ext4" in
diff mbox

Patch

diff --git a/fs/ext4/indirect.c b/fs/ext4/indirect.c
index 45fe924..b46f2b2 100644
--- a/fs/ext4/indirect.c
+++ b/fs/ext4/indirect.c
@@ -565,7 +565,7 @@  int ext4_ind_map_blocks(handle_t *handle, struct inode *inode,
 				       EXT4_FEATURE_RO_COMPAT_BIGALLOC)) {
 		EXT4_ERROR_INODE(inode, "Can't allocate blocks for "
 				 "non-extent mapped inodes with bigalloc");
-		return -ENOSPC;
+		return -EUCLEAN;
 	}
 
 	/* Set up for the direct block allocation */