Message ID | 20100215195001.GN5337@thunk.org |
---|---|
State | Accepted, archived |
Headers | show |
tytso@mit.edu wrote: > Sorry for the delay in attending to this patch. This is what I've > added to the ext4 patch queue. > > - Ted > > commit 7f9aeb212e41ea20f61061d51ad11ee2449853f1 > Author: Theodore Ts'o <tytso@mit.edu> > Date: Mon Feb 15 14:48:32 2010 -0500 Ted, it looks like perhaps you accidentally reassigned authorship for this patch? -Eric > ext4: correctly calculate number of blocks for fiemap > > ext4_fiemap() rounds the length of the requested range down to > blocksize, which is is not the true number of blocks that cover the > requested region. This problem is especially impressive if the user > requests only the first byte of a file: not a single extent will be > reported. > > We fix this by calculating the last block of the region and then > subtract to find the number of blocks in the extents. > > Signed-off-by: Leonard Michlmayr <leonard.michlmayr@gmail.com> > Signed-off-by: "Theodore Ts'o" <tytso@mit.edu> > > diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c > index bd80891..bc9860f 100644 > --- a/fs/ext4/extents.c > +++ b/fs/ext4/extents.c > @@ -3768,7 +3768,6 @@ int ext4_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, > __u64 start, __u64 len) > { > ext4_lblk_t start_blk; > - ext4_lblk_t len_blks; > int error = 0; > > /* fallback to generic here if not in extents fmt */ > @@ -3782,8 +3781,11 @@ int ext4_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, > if (fieinfo->fi_flags & FIEMAP_FLAG_XATTR) { > error = ext4_xattr_fiemap(inode, fieinfo); > } else { > + ext4_lblk_t last_blk, len_blks; > + > start_blk = start >> inode->i_sb->s_blocksize_bits; > - len_blks = len >> inode->i_sb->s_blocksize_bits; > + last_blk = (start + len - 1) >> inode->i_sb->s_blocksize_bits; > + len_blks = last_blk - start_blk + 1; > > /* > * Walk the extent tree gathering extent information. > -- > To unsubscribe from this list: send the line "unsubscribe linux-ext4" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe linux-ext4" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Mon, Feb 15, 2010 at 02:33:03PM -0600, Eric Sandeen wrote: > tytso@mit.edu wrote: > > Sorry for the delay in attending to this patch. This is what I've > > added to the ext4 patch queue. > > > > - Ted > > > > commit 7f9aeb212e41ea20f61061d51ad11ee2449853f1 > > Author: Theodore Ts'o <tytso@mit.edu> > > Date: Mon Feb 15 14:48:32 2010 -0500 > > Ted, it looks like perhaps you accidentally reassigned authorship for > this patch? Oops, I forgot the fix the ownership when I applied the patch. Fixed. - Ted -- To unsubscribe from this list: send the line "unsubscribe linux-ext4" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c index bd80891..bc9860f 100644 --- a/fs/ext4/extents.c +++ b/fs/ext4/extents.c @@ -3768,7 +3768,6 @@ int ext4_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, __u64 start, __u64 len) { ext4_lblk_t start_blk; - ext4_lblk_t len_blks; int error = 0; /* fallback to generic here if not in extents fmt */ @@ -3782,8 +3781,11 @@ int ext4_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, if (fieinfo->fi_flags & FIEMAP_FLAG_XATTR) { error = ext4_xattr_fiemap(inode, fieinfo); } else { + ext4_lblk_t last_blk, len_blks; + start_blk = start >> inode->i_sb->s_blocksize_bits; - len_blks = len >> inode->i_sb->s_blocksize_bits; + last_blk = (start + len - 1) >> inode->i_sb->s_blocksize_bits; + len_blks = last_blk - start_blk + 1; /* * Walk the extent tree gathering extent information.