Messages in this thread | | | Date | Thu, 29 Oct 2009 08:17:01 -0700 | From | Andrew Morton <> | Subject | Re: [PATCH] Fix generic_block_fiemap for files bigger than 4GB |
| |
On Thu, 29 Oct 2009 08:40:56 -0400 Josef Bacik <josef@redhat.com> wrote:
> > Ok here it is. I've fixed all the type issues and there were other problems > with not setting FIEMAP_EXTENT_LAST last properly. If this is more reasonable > to you I will update it and send it along properly. Thanks,
geeze, how did we lose a patch of this magnitude?
> diff --git a/fs/ioctl.c b/fs/ioctl.c > index ac2d47e..ee9fba0 100644 > --- a/fs/ioctl.c > +++ b/fs/ioctl.c > @@ -228,13 +228,22 @@ static int ioctl_fiemap(struct file *filp, unsigned long arg) > > #ifdef CONFIG_BLOCK > > -#define blk_to_logical(inode, blk) (blk << (inode)->i_blkbits) > -#define logical_to_blk(inode, offset) (offset >> (inode)->i_blkbits); > +static inline sector_t logical_to_blk(struct inode *inode, loff_t offset) > +{ > + return (offset >> inode->i_blkbits); > +} > + > +static inline loff_t blk_to_logical(struct inode *inode, sector_t blk) > +{ > + return (blk << inode->i_blkbits); > +}
ah. Adding the types really does clarify things.
> /** > * __generic_block_fiemap - FIEMAP for block based inodes (no locking) > * @inode - the inode to map > - * @arg - the pointer to userspace where we copy everything to > + * @fieinfo - the fiemap info struct that will be passed back to userspace > + * @start - where to start mapping in the inode > + * @len - how much space to map > * @get_block - the fs's get_block function > * > * This does FIEMAP for block based inodes. Basically it will just loop > @@ -250,43 +259,63 @@ static int ioctl_fiemap(struct file *filp, unsigned long arg) > */ > > int __generic_block_fiemap(struct inode *inode, > - struct fiemap_extent_info *fieinfo, u64 start, > - u64 len, get_block_t *get_block) > + struct fiemap_extent_info *fieinfo, loff_t start, > + loff_t len, get_block_t *get_block) > { > - struct buffer_head tmp; > - unsigned int start_blk; > - long long length = 0, map_len = 0; > + struct buffer_head map_bh; > + sector_t start_blk;
And the bugfix is there.
Has anyone actually tested this code on large files? Greater than 4G sectors and greater than 4G pages?
| |