| From 28e8be31803b19d0d8f76216cb11b480b8a98bec Mon Sep 17 00:00:00 2001 |
| From: Jie Liu <jeff.liu@oracle.com> |
| Date: Wed, 11 Sep 2013 14:20:05 -0700 |
| Subject: ocfs2: fix the end cluster offset of FIEMAP |
| |
| From: Jie Liu <jeff.liu@oracle.com> |
| |
| commit 28e8be31803b19d0d8f76216cb11b480b8a98bec upstream. |
| |
| Call fiemap ioctl(2) with given start offset as well as an desired mapping |
| range should show extents if possible. However, we somehow figure out the |
| end offset of mapping via 'mapping_end -= cpos' before iterating the |
| extent records which would cause problems if the given fiemap length is |
| too small to a cluster size, e.g, |
| |
| Cluster size 4096: |
| debugfs.ocfs2 1.6.3 |
| Block Size Bits: 12 Cluster Size Bits: 12 |
| |
| The extended fiemap test utility From David: |
| https://gist.github.com/anonymous/6172331 |
| |
| # dd if=/dev/urandom of=/ocfs2/test_file bs=1M count=1000 |
| # ./fiemap /ocfs2/test_file 4096 10 |
| start: 4096, length: 10 |
| File /ocfs2/test_file has 0 extents: |
| # Logical Physical Length Flags |
| ^^^^^ <-- No extent is shown |
| |
| In this case, at ocfs2_fiemap(): cpos == mapping_end == 1. Hence the |
| loop of searching extent records was not executed at all. |
| |
| This patch remove the in question 'mapping_end -= cpos', and loops |
| until the cpos is larger than the mapping_end as usual. |
| |
| # ./fiemap /ocfs2/test_file 4096 10 |
| start: 4096, length: 10 |
| File /ocfs2/test_file has 1 extents: |
| # Logical Physical Length Flags |
| 0: 0000000000000000 0000000056a01000 0000000006a00000 0000 |
| |
| Signed-off-by: Jie Liu <jeff.liu@oracle.com> |
| Reported-by: David Weber <wb@munzinger.de> |
| Tested-by: David Weber <wb@munzinger.de> |
| Cc: Sunil Mushran <sunil.mushran@gmail.com> |
| Cc: Mark Fashen <mfasheh@suse.de> |
| Cc: Joel Becker <jlbec@evilplan.org> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| fs/ocfs2/extent_map.c | 1 - |
| 1 file changed, 1 deletion(-) |
| |
| --- a/fs/ocfs2/extent_map.c |
| +++ b/fs/ocfs2/extent_map.c |
| @@ -781,7 +781,6 @@ int ocfs2_fiemap(struct inode *inode, st |
| cpos = map_start >> osb->s_clustersize_bits; |
| mapping_end = ocfs2_clusters_for_bytes(inode->i_sb, |
| map_start + map_len); |
| - mapping_end -= cpos; |
| is_last = 0; |
| while (cpos < mapping_end && !is_last) { |
| u32 fe_flags; |