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 */ + } + if (lseek (fd, cur, SEEK_SET) < 0) suppressible_error (filename, errno); if (hole_start < st->st_size)