X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=support%2Fnfs%2Fcacheio.c;h=69373b9a79aa0b60a8693fe85141362eb3ce8a02;hb=16be8c20d6fe1a997d90ecb229aee6a5f092b73d;hp=960d801f6fb1c489fe445ff7f026d96c6efeba10;hpb=cec295bf37b784ed6ae5674ce34b9c75d89ea0a1;p=nfs-utils.git diff --git a/support/nfs/cacheio.c b/support/nfs/cacheio.c index 960d801..69373b9 100644 --- a/support/nfs/cacheio.c +++ b/support/nfs/cacheio.c @@ -19,6 +19,10 @@ #include #include #include +#include +#include +#include +#include void qword_add(char **bpp, int *lp, char *str) { @@ -214,3 +218,53 @@ int readline(int fd, char **buf, int *lenp) return 1; } + +/* Check if we should use the new caching interface + * This succeeds iff the "nfsd" filesystem is mounted on + * /proc/fs/nfs + */ +int +check_new_cache(void) +{ + struct stat stb; + return (stat("/proc/fs/nfs/filehandle", &stb) == 0); +} + + + + +/* flush the kNFSd caches. + * Set the flush time to the mtime of _PATH_ETAB or + * if force, to now. + * the caches to flush are: + * auth.unix.ip nfsd.export nfsd.fh + */ + +void +cache_flush(int force) +{ + struct stat stb; + int c; + char stime[20]; + char path[200]; + static char *cachelist[] = { + "auth.unix.ip", + "nfsd.export", + "nfsd.fh", + NULL + }; + stb.st_mtime = time(0); + if (!force) + stat(_PATH_ETAB, &stb); + + sprintf(stime, "%ld\n", stb.st_mtime); + for (c=0; cachelist[c]; c++) { + int fd; + sprintf(path, "/proc/net/rpc/%s/flush", cachelist[c]); + fd = open(path, O_RDWR); + if (fd) { + write(fd, stime, strlen(stime)); + close(fd); + } + } +}