2011-05-05 11:29:04

by Pádraig Brady

[permalink] [raw]
Subject: Re: Files full of zeros with coreutils-8.11 and xfs (FIEMAP related?)

On 14/04/11 17:10, Yongqiang Yang wrote:
> Hi,
>
> I am off my working computer. Maybe below fix could fix the problem.
>
> fs/ext4/extent.c
> static int ext4_ext_walk_space(struct inode *inode, ext4_lblk_t block,
> 1877 } else if (block >= le32_to_cpu(ex->ee_block)) {
> 1878 /*
> 1879 * some part of requested space is covered
> 1880 * by found extent
> 1881 */
> 1882 start = block;
> 1883 end = le32_to_cpu(ex->ee_block)
> 1884 + ext4_ext_get_actual_len(ex);
> 1885 if (block + num < end)
> 1886 end = block + num;
> + if (!ext4_ext_is_uninitialized(ex))
> 1887 exists = 1;
> 1888 } else {
> 1889 BUG();
> 1890 }

Hi,

To follow up on the above. I'm under the impression
that ext4 is expected to return extents for what
is written, irrespective of whether it's reached the
disk or not. I.E. the preallocation case where this fails
was an oversite, for which the above might fix.

So is the above summary correct, and has there
been any more thoughts on a fix?

cheers,
P?draig.


2011-05-05 11:47:30

by Yongqiang Yang

[permalink] [raw]
Subject: Re: Files full of zeros with coreutils-8.11 and xfs (FIEMAP related?)

2011/5/5 P?draig Brady <[email protected]>:
> On 14/04/11 17:10, Yongqiang Yang wrote:
>> Hi,
>>
>> I am off my working computer. ?Maybe below fix could fix the problem.
>>
>> fs/ext4/extent.c
>> static int ext4_ext_walk_space(struct inode *inode, ext4_lblk_t block,
>> 1877 ? ? ? ? ? ? ? ? } else if (block >= le32_to_cpu(ex->ee_block)) {
>> 1878 ? ? ? ? ? ? ? ? ? ? ? ? /*
>> 1879 ? ? ? ? ? ? ? ? ? ? ? ? ?* some part of requested space is covered
>> 1880 ? ? ? ? ? ? ? ? ? ? ? ? ?* by found extent
>> 1881 ? ? ? ? ? ? ? ? ? ? ? ? ?*/
>> 1882 ? ? ? ? ? ? ? ? ? ? ? ? start = block;
>> 1883 ? ? ? ? ? ? ? ? ? ? ? ? end = le32_to_cpu(ex->ee_block)
>> 1884 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? + ext4_ext_get_actual_len(ex);
>> 1885 ? ? ? ? ? ? ? ? ? ? ? ? if (block + num < end)
>> 1886 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? end = block + num;
>> ? ? ? ?+ ? ? ? ? ? ? ? ? ? ? ? ?if (!ext4_ext_is_uninitialized(ex))
>> 1887 ? ? ? ? ? ? ? ? ? ? ? ? exists = 1;
>> 1888 ? ? ? ? ? ? ? ? } else {
>> 1889 ? ? ? ? ? ? ? ? ? ? ? ? BUG();
>> 1890 ? ? ? ? ? ? ? ? }
>
> Hi,
>
> To follow up on the above. ?I'm under the impression
> that ext4 is expected to return extents for what
> is written, irrespective of whether it's reached the
> disk or not. I.E. the preallocation case where this fails
No. It just returns extent info now - allocated extents and delayed
extents. In the preallocation case, it returns unwritten extents.
And the code above does not work.

> was an oversite, for which the above might fix.
>
> So is the above summary correct, and has there
> been any more thoughts on a fix?
>
> cheers,
> P?draig.
>



--
Best Wishes
Yongqiang Yang