If we're using the new caching interface the rmtab will be ignored by
exportfs so there is no need to fdatasync. This improves mountd performance.
Signed-off-by: Steve Dickson <steved@redhat.com>
int
check_new_cache(void)
{
- struct stat stb;
- return (stat("/proc/fs/nfs/filehandle", &stb) == 0) ||
- (stat("/proc/fs/nfsd/filehandle", &stb) == 0);
+ return (access("/proc/fs/nfs/filehandle", F_OK) == 0) ||
+ (access("/proc/fs/nfsd/filehandle", F_OK) == 0);
}
fendrmtabent(FILE *fp)
{
if (fp) {
- /* If it was written to, we really want
- * to flush to disk before returning
- */
- fflush(fp);
- fdatasync(fileno(fp));
+ static int have_new_cache = -1;
+ if (have_new_cache == -1) /* check only once */
+ have_new_cache = check_new_cache();
+
+ if (!have_new_cache) {
+ /*
+ * If we are using the old caching interface: exportfs
+ * uses the rmtab to determine what should be exported,
+ * so it is important that it be up-to-date.
+ *
+ * If we are using the new caching interface: the rmtab
+ * is ignored by exportfs and the fdatasync only serves
+ * to slow us down.
+ */
+ fflush(fp);
+ fdatasync(fileno(fp));
+ }
+
fclose(fp);
}
}