On most Unix OSes, lseek reports EINVAL when lacking SEEK_HOLE support.
However, there are reports that ENOTTY is reported instead.
Rather than tracking down every possible errno that may be used to
represent "not supported", just treat any non-nil error as meaning
that there is no support. This is the same strategy taken by the
GNU and BSD tar tools.
Fixes #21958
Change-Id: Iae68afdc934042f52fa914fca45f0ca89220c383
Reviewed-on: https://go-review.googlesource.com/65191
Run-TryBot: Joe Tsai <thebrokentoaster@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
const seekHole = 4 // SEEK_HOLE from unistd.h
// Check for seekData/seekHole support.
- if _, err := f.Seek(0, seekHole); errno(err) == syscall.EINVAL {
- return nil, nil // Either old kernel or FS does not support this
+ // Different OS and FS may differ in the exact errno that is returned when
+ // there is no support. Rather than special-casing every possible errno
+ // representing "not supported", just assume that a non-nil error means
+ // that seekData/seekHole is not supported.
+ if _, err := f.Seek(0, seekHole); err != nil {
+ return nil, nil
}
// Populate the SparseHoles.