X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=utils%2Fmountd%2Fcache.c;h=4693216f949e1751ccf61239e9f9296b794827f1;hb=b1e1c8a05afdbbc3f217ef79c31c3b8ca302f9eb;hp=a14f4f2987369fe8ae299e99b3a6d118c1cf42ef;hpb=5fb04a376e6d5ba940e66507e4a615f4e94116e6;p=nfs-utils.git diff --git a/utils/mountd/cache.c b/utils/mountd/cache.c index a14f4f2..4693216 100644 --- a/utils/mountd/cache.c +++ b/utils/mountd/cache.c @@ -413,7 +413,15 @@ void nfsd_fh(FILE *f) qword_print(f, dom); qword_printint(f, fsidtype); qword_printhex(f, fsid, fsidlen); - qword_printint(f, time(0)+30*60); + /* The fsid -> path lookup can be quite expensive as it + * potentially stats and reads lots of devices, and some of those + * might have spun-down. The Answer is not likely to + * change underneath us, and an 'exportfs -f' can always + * remove this from the kernel, so use a really log + * timeout. Maybe this should be configurable on the command + * line. + */ + qword_printint(f, 0x7fffffff); if (found) qword_print(f, found->e_path); qword_eol(f); @@ -455,6 +463,7 @@ static int dump_to_cache(FILE *f, char *domain, char *path, struct exportent *ex qword_printint(f, exp->e_anonuid); qword_printint(f, exp->e_anongid); qword_printint(f, exp->e_fsid); + write_fsloc(f, exp, path); if (exp->e_uuid == NULL) { char u[16]; if (get_uuid(exp->e_path, NULL, 16, u)) { @@ -465,7 +474,6 @@ static int dump_to_cache(FILE *f, char *domain, char *path, struct exportent *ex qword_print(f, "uuid"); qword_printhex(f, exp->e_uuid, 16); } - write_fsloc(f, &exp, path); } return qword_eol(f); } @@ -548,7 +556,7 @@ void cache_open(void) int i; for (i=0; cachelist[i].cache_name; i++ ) { char path[100]; - if (!manage_gids && cachelist[i].f == auth_unix_gid) + if (!manage_gids && cachelist[i].cache_handle == auth_unix_gid) continue; sprintf(path, "/proc/net/rpc/%s/channel", cachelist[i].cache_name); cachelist[i].f = fopen(path, "r+");