From mboxrd@z Thu Jan 1 00:00:00 1970 From: Eric Sandeen Subject: Re: [PATCH 4/4] ext4: implement ext4_fiemap Date: Thu, 03 Jul 2008 13:49:48 -0500 Message-ID: <486D1F4C.6000507@redhat.com> References: <20080625221915.GU28100@wotan.suse.de> <1215104513.4272.23.camel@localhost> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Cc: Mark Fasheh , linux-fsdevel@vger.kernel.org To: Kalpak Shah Return-path: Received: from mx1.redhat.com ([66.187.233.31]:44692 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753584AbYGCStx (ORCPT ); Thu, 3 Jul 2008 14:49:53 -0400 In-Reply-To: <1215104513.4272.23.camel@localhost> Sender: linux-fsdevel-owner@vger.kernel.org List-ID: 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 > > 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 > >