Kalpak Shah wrote: > Extended attributes can be present in the inode as well as the external block at the same time and we should be returning extents for both them in that case. Below patch fixes this problem: Thanks Kalpak, was on my todo list but not done. :) -Eric > Signed-off-by: Kalpak Shah <kalpak.shah@xxxxxxx> > > Index: linux-2.6/fs/ext4/extents.c > =================================================================== > --- linux-2.6.orig/fs/ext4/extents.c > +++ linux-2.6/fs/ext4/extents.c > @@ -3130,7 +3130,7 @@ int ext4_xattr_fiemap(struct inode *inod > { > __u64 physical = 0; > __u64 length; > - __u32 flags = FIEMAP_EXTENT_LAST; > + __u32 flags = 0; > int blockbits = inode->i_sb->s_blocksize_bits; > int error = 0; > > @@ -3148,14 +3148,24 @@ int ext4_xattr_fiemap(struct inode *inod > physical += offset; > length = EXT4_SB(inode->i_sb)->s_inode_size - offset; > flags |= FIEMAP_EXTENT_DATA_INLINE; > - } else { /* external block */ > - physical = EXT4_I(inode)->i_file_acl << blockbits; > - length = inode->i_sb->s_blocksize; > + if (EXT4_I(inode)->i_file_acl == 0) > + flags |= FIEMAP_EXTENT_LAST; > + > + error = fiemap_fill_next_extent(fieinfo, 0, physical, length, > + flags, inode->i_sb->s_dev); > + if (error) > + goto out; > } > > + /* external block */ > + flags = FIEMAP_EXTENT_LAST; > + physical = EXT4_I(inode)->i_file_acl << blockbits; > + length = inode->i_sb->s_blocksize; > if (physical) > - error = fiemap_fill_next_extent(fieinfo, 0, physical, > - length, flags, inode->i_sb->s_dev); > + error = fiemap_fill_next_extent(fieinfo, 0, physical, length, > + flags, inode->i_sb->s_dev); > + > +out: > return (error < 0 ? error : 0); > } > > > Thanks, > Kalpak > > -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html