[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
bug#20826: SEEK_HOLE not supported for ext4 for kernel < 3.1
From: |
Pádraig Brady |
Subject: |
bug#20826: SEEK_HOLE not supported for ext4 for kernel < 3.1 |
Date: |
Tue, 16 Jun 2015 14:06:44 +0100 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.6.0 |
On 16/06/15 13:47, Eric Blake wrote:
> [adding bug-gnulib]
>
> On 06/16/2015 06:28 AM, Johannes Meixner wrote:
>>
>>> From one of our (SUSE) kernel developers
>> I even got a proposal for a workaround in grep:
>>
>> --- a/src/grep.c
>> +++ b/src/grep.c
>> @@ -575,6 +575,17 @@ file_textbin (char *buf, size_t size, in
>> off_t hole_start = lseek (fd, cur, SEEK_HOLE);
>> if (0 <= hole_start)
>> {
>> + /* if hole_start is identical with cur, it's more likely a
>> buggy
>> + * lseek(SEEK_HOLE) implementation in kernel filesystem;
>> + * check whether it really reads a null byte.
>> + */
>> + if (hole_start == cur)
>> + {
>> + char c;
>> + if (read (fd, &c, 1) != 1 || c != 0)
>> + hole_start = st->st_size; /* no hole */
>> + }
>> +
>
> Sounds like we need to update the gnulib lseek module to work around
> bugs like this in the wild.
Interesting. The above runtime check wouldn't be appropriate I think
for such an old fleeting problem. Also the read() as a side effect
would be very much best avoided. How about a linux kernel version check
at build time?
As a general point, gnulib would really benefit from SEEK_HOLE, SEEK_DATA
wrappers that degenerated to SEEK_END,0 and SEEK_SET,offset respectively.
cheers,
Pádraig.