|
|
@@ -455,13 +455,13 @@ static void ext4_map_blocks_es_recheck(handle_t *handle,
|
|
|
* Otherwise, call with ext4_ind_map_blocks() to handle indirect mapping
|
|
|
* based files
|
|
|
*
|
|
|
- * On success, it returns the number of blocks being mapped or allocated.
|
|
|
- * if create==0 and the blocks are pre-allocated and unwritten block,
|
|
|
- * the result buffer head is unmapped. If the create ==1, it will make sure
|
|
|
- * the buffer head is mapped.
|
|
|
+ * On success, it returns the number of blocks being mapped or allocated. if
|
|
|
+ * create==0 and the blocks are pre-allocated and unwritten, the resulting @map
|
|
|
+ * is marked as unwritten. If the create == 1, it will mark @map as mapped.
|
|
|
*
|
|
|
* It returns 0 if plain look up failed (blocks have not been allocated), in
|
|
|
- * that case, buffer head is unmapped
|
|
|
+ * that case, @map is returned as unmapped but we still do fill map->m_len to
|
|
|
+ * indicate the length of a hole starting at map->m_lblk.
|
|
|
*
|
|
|
* It returns the error in case of allocation failure.
|
|
|
*/
|
|
|
@@ -504,6 +504,11 @@ int ext4_map_blocks(handle_t *handle, struct inode *inode,
|
|
|
retval = map->m_len;
|
|
|
map->m_len = retval;
|
|
|
} else if (ext4_es_is_delayed(&es) || ext4_es_is_hole(&es)) {
|
|
|
+ map->m_pblk = 0;
|
|
|
+ retval = es.es_len - (map->m_lblk - es.es_lblk);
|
|
|
+ if (retval > map->m_len)
|
|
|
+ retval = map->m_len;
|
|
|
+ map->m_len = retval;
|
|
|
retval = 0;
|
|
|
} else {
|
|
|
BUG_ON(1);
|