diff options
| author | Tao Ma <boyu.mt@taobao.com> | 2012-12-10 14:06:02 -0500 | 
|---|---|---|
| committer | Theodore Ts'o <tytso@mit.edu> | 2012-12-10 14:06:02 -0500 | 
| commit | 941919856c11d4dd11d4fcabb4dab58bd2b146bf (patch) | |
| tree | dcb06b13ca094575d9f32e49371560c1c956c874 /fs/ext4/inline.c | |
| parent | 32f7f22c0b52e8189fef83986b16dc7abe95f2c4 (diff) | |
| download | olio-linux-3.10-941919856c11d4dd11d4fcabb4dab58bd2b146bf.tar.xz olio-linux-3.10-941919856c11d4dd11d4fcabb4dab58bd2b146bf.zip  | |
ext4: let fiemap work with inline data
fiemap is used to find the disk layout of a file, as for inline data,
let us just pretend like a file with just one extent.
Signed-off-by: Tao Ma <boyu.mt@taobao.com>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
Diffstat (limited to 'fs/ext4/inline.c')
| -rw-r--r-- | fs/ext4/inline.c | 35 | 
1 files changed, 35 insertions, 0 deletions
diff --git a/fs/ext4/inline.c b/fs/ext4/inline.c index fc362998092..bf5f7780388 100644 --- a/fs/ext4/inline.c +++ b/fs/ext4/inline.c @@ -15,6 +15,7 @@  #include "ext4.h"  #include "xattr.h"  #include "truncate.h" +#include <linux/fiemap.h>  #define EXT4_XATTR_SYSTEM_DATA	"data"  #define EXT4_MIN_INLINE_DATA_SIZE	((sizeof(__le32) * EXT4_N_BLOCKS)) @@ -1680,3 +1681,37 @@ int ext4_destroy_inline_data(handle_t *handle, struct inode *inode)  	return ret;  } + +int ext4_inline_data_fiemap(struct inode *inode, +			    struct fiemap_extent_info *fieinfo, +			    int *has_inline) +{ +	__u64 physical = 0; +	__u64 length; +	__u32 flags = FIEMAP_EXTENT_DATA_INLINE | FIEMAP_EXTENT_LAST; +	int error = 0; +	struct ext4_iloc iloc; + +	down_read(&EXT4_I(inode)->xattr_sem); +	if (!ext4_has_inline_data(inode)) { +		*has_inline = 0; +		goto out; +	} + +	error = ext4_get_inode_loc(inode, &iloc); +	if (error) +		goto out; + +	physical = iloc.bh->b_blocknr << inode->i_sb->s_blocksize_bits; +	physical += (char *)ext4_raw_inode(&iloc) - iloc.bh->b_data; +	physical += offsetof(struct ext4_inode, i_block); +	length = i_size_read(inode); + +	if (physical) +		error = fiemap_fill_next_extent(fieinfo, 0, physical, +						length, flags); +	brelse(iloc.bh); +out: +	up_read(&EXT4_I(inode)->xattr_sem); +	return (error < 0 ? error : 0); +}  |