diff --git a/include/ircd/fs/read.h b/include/ircd/fs/read.h index 0483d51c7..f1d748784 100644 --- a/include/ircd/fs/read.h +++ b/include/ircd/fs/read.h @@ -32,6 +32,9 @@ namespace ircd::fs // Prefetch data for subsequent read(); offset given in opts (WILLNEED). size_t prefetch(const fd &, const size_t &, const read_opts & = read_opts_default); + + // Evict data which won't be read anymore (DONTNEED). + size_t evict(const fd &, const size_t &, const read_opts & = read_opts_default); } /// Options for a read operation diff --git a/ircd/fs.cc b/ircd/fs.cc index 0ad5149a5..c2615c328 100644 --- a/ircd/fs.cc +++ b/ircd/fs.cc @@ -486,14 +486,31 @@ ircd::fs::read_opts const ircd::fs::read_opts_default {}; +size_t +ircd::fs::evict(const fd &fd, + const size_t &count, + const read_opts &opts) +{ + #if defined(POSIX_FADV_DONTNEED) + return advise(fd, count, opts, POSIX_FADV_DONTNEED); + #else + return 0UL; + #endif +} + size_t ircd::fs::prefetch(const fd &fd, const size_t &count, const read_opts &opts) { - return advise(fd, count, opts, POSIX_FADV_WILLNEED); + #if defined(POSIX_FADV_WILLNEED) + return advise(fd, count, opts, POSIX_FADV_WILLNEED); + #else + return 0UL; + #endif } +#if defined(HAVE_POSIX_FADVISE) size_t ircd::fs::advise(const fd &fd, const size_t &count, @@ -518,6 +535,16 @@ ircd::fs::advise(const fd &fd, while(off + cnt < opts.offset + count); return count; } +#else +size_t +ircd::fs::advise(const fd &fd, + const size_t &count, + const read_opts &opts, + const int &advice) +{ + return 0UL; +} +#endif bool ircd::fs::fincore(const fd &fd,