diff --git a/src/borg/chunker.pyx b/src/borg/chunker.pyx index 3187a223a..133186d5d 100644 --- a/src/borg/chunker.pyx +++ b/src/borg/chunker.pyx @@ -13,6 +13,7 @@ from libc.stdlib cimport malloc, free from libc.string cimport memcpy, memmove from .constants import CH_DATA, CH_ALLOC, CH_HOLE, zeros +from .platform import safe_fadvise # this will be True if Python's seek implementation supports data/holes seeking. # this does not imply that it will actually work on the filesystem, @@ -47,11 +48,7 @@ def dread(offset, size, fd=None, fh=-1): use_fh = fh >= 0 if use_fh: data = os.read(fh, size) - if hasattr(os, 'posix_fadvise'): - # UNIX only and, in case of block sizes that are not a multiple of the - # system's page size, better be used with a bug fixed linux kernel > 4.6.0, - # see comment/workaround in _chunker.c and borgbackup issue #907. - os.posix_fadvise(fh, offset, len(data), os.POSIX_FADV_DONTNEED) + safe_fadvise(fh, offset, len(data), "DONTNEED") return data else: return fd.read(size) diff --git a/src/borg/platform/base.py b/src/borg/platform/base.py index 70cc933f5..38328a50b 100644 --- a/src/borg/platform/base.py +++ b/src/borg/platform/base.py @@ -21,6 +21,7 @@ are correctly composed into the base functionality. API_VERSION = "1.2_05" fdatasync = getattr(os, "fdatasync", os.fsync) +has_posix_fadvise = hasattr(os, "posix_fadvise") from .xattr import ENOATTR @@ -114,9 +115,11 @@ def sync_dir(path): def safe_fadvise(fd, offset, len, advice): - if hasattr(os, "posix_fadvise"): + if has_posix_fadvise: advice = getattr(os, "POSIX_FADV_" + advice) try: + # UNIX only and, in case of block sizes that are not a multiple of the system's page size, + # better be used with a bug fixed linux kernel > 4.6.0, see borgbackup issue #907. os.posix_fadvise(fd, offset, len, advice) except OSError: # usually, posix_fadvise can't fail for us, but there seem to