[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-id: <4D0CB743-94B6-49AB-B838-BCDD2EC8C3ED@sun.com>
Date: Fri, 12 Feb 2010 14:49:40 -0700
From: Andreas Dilger <adilger@....com>
To: Leonard Michlmayr <leonard.michlmayr@...il.com>
Cc: ext4 development <linux-ext4@...r.kernel.org>,
surbhi.palande@...onical.com,
"linux-kernel@...r.kernel.org Mailinglist"
<linux-kernel@...r.kernel.org>, 474597@...s.launchpad.net
Subject: Re: [PATCH 2.6.32.7] ext4: number of blocks for fiemap
On 2010-02-12, at 11:42, Leonard Michlmayr wrote:
> fs/ext4/extents.c:ext4_fiemap rounds the length of the requested range
> down to blocksize. This 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.
>
> Solution:
> Calculate the last byte of the region and round to blocksize. Then get
> the number of blocks by subtracting last_blk - start_blk and adding 1
> for the first block. (The variable last_blk is introduced just for
> easier reading.) This patch will fix this.
>
> I already suggested this patch some time ago, this is the same patch
> for
> a more recent kernel version.
>
> Signed-off-by: Leonard Michlmayr <leonard.michlmayr@...il.com>
>
> diff -rup linux-2.6.32.7/fs/ext4/extents.c linux-2.6.32.7-lm/fs/ext4/
> extents.c
> --- linux-2.6.32.7/fs/ext4/extents.c 2010-01-29 00:06:20.000000000
> +0100
> +++ linux-2.6.32.7-lm/fs/ext4/extents.c 2010-02-11
> 21:26:40.000000000 +0100
> @@ -3711,6 +3711,7 @@ int ext4_fiemap(struct inode *inode, str
> __u64 start, __u64 len)
> {
> ext4_lblk_t start_blk;
> + ext4_lblk_t last_blk;
> ext4_lblk_t len_blks;
> int error = 0;
>
> @@ -3726,7 +3727,9 @@ int ext4_fiemap(struct inode *inode, str
> error = ext4_xattr_fiemap(inode, fieinfo);
> } else {
> start_blk = start >> inode->i_sb->s_blocksize_bits;
> - len_blks = len >> inode->i_sb->s_blocksize_bits;
> + /* the last byte in the range is (start + len - 1) */
> + last_blk = (start + len - 1) >> inode->i_sb->s_blocksize_bits;
> + len_blks = last_blk - start_blk + 1;
If "last_blk" is only used in this one place, please put the
declaration inside the scope of the "else" clause. Looks fine
otherwise.
Cheers, Andreas
--
Andreas Dilger
Sr. Staff Engineer, Lustre Group
Sun Microsystems of Canada, Inc.
--
To unsubscribe from this list: send the line "unsubscribe linux-ext4" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Powered by blists - more mailing lists