Commit f9e4fb53 authored by Liu Bo's avatar Liu Bo Committed by Josef Bacik

Btrfs: fix a bug when llseek for delalloc bytes behind prealloc extents

xfstests case 285 complains.

It it because btrfs did not try to find unwritten delalloc
bytes(only dirty pages, not yet writeback) behind prealloc
extents, it ends up finding nothing while we're with SEEK_DATA.
Signed-off-by: default avatarLiu Bo <bo.li.liu@oracle.com>
Signed-off-by: default avatarJosef Bacik <jbacik@fusionio.com>
parent 1214b53f
...@@ -2309,9 +2309,12 @@ static int find_desired_extent(struct inode *inode, loff_t *offset, int origin) ...@@ -2309,9 +2309,12 @@ static int find_desired_extent(struct inode *inode, loff_t *offset, int origin)
} }
} }
*offset = start; if (!test_bit(EXTENT_FLAG_PREALLOC,
free_extent_map(em); &em->flags)) {
break; *offset = start;
free_extent_map(em);
break;
}
} }
} }
......
...@@ -5623,10 +5623,13 @@ struct extent_map *btrfs_get_extent_fiemap(struct inode *inode, struct page *pag ...@@ -5623,10 +5623,13 @@ struct extent_map *btrfs_get_extent_fiemap(struct inode *inode, struct page *pag
return em; return em;
if (em) { if (em) {
/* /*
* if our em maps to a hole, there might * if our em maps to
* actually be delalloc bytes behind it * - a hole or
* - a pre-alloc extent,
* there might actually be delalloc bytes behind it.
*/ */
if (em->block_start != EXTENT_MAP_HOLE) if (em->block_start != EXTENT_MAP_HOLE &&
!test_bit(EXTENT_FLAG_PREALLOC, &em->flags))
return em; return em;
else else
hole_em = em; hole_em = em;
...@@ -5708,6 +5711,8 @@ struct extent_map *btrfs_get_extent_fiemap(struct inode *inode, struct page *pag ...@@ -5708,6 +5711,8 @@ struct extent_map *btrfs_get_extent_fiemap(struct inode *inode, struct page *pag
*/ */
em->block_start = hole_em->block_start; em->block_start = hole_em->block_start;
em->block_len = hole_len; em->block_len = hole_len;
if (test_bit(EXTENT_FLAG_PREALLOC, &hole_em->flags))
set_bit(EXTENT_FLAG_PREALLOC, &em->flags);
} else { } else {
em->start = range_start; em->start = range_start;
em->len = found; em->len = found;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment