summaryrefslogtreecommitdiffstats
path: root/fs/ext4
diff options
context:
space:
mode:
Diffstat (limited to 'fs/ext4')
-rw-r--r--fs/ext4/extents.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c
index c2b004e29ad8..f4ef0b745a53 100644
--- a/fs/ext4/extents.c
+++ b/fs/ext4/extents.c
@@ -2570,8 +2570,18 @@ int ext4_ext_get_blocks(handle_t *handle, struct inode *inode,
}
if (create == EXT4_CREATE_UNINITIALIZED_EXT)
goto out;
- if (!create)
+ if (!create) {
+ /*
+ * We have blocks reserved already. We
+ * return allocated blocks so that delalloc
+ * won't do block reservation for us. But
+ * the buffer head will be unmapped so that
+ * a read from the block returns 0s.
+ */
+ if (allocated > max_blocks)
+ allocated = max_blocks;
goto out2;
+ }
ret = ext4_ext_convert_to_initialized(handle, inode,
path, iblock,