#include "exportfs.h"
#include "mountd.h"
#include "xmalloc.h"
+#include "fsloc.h"
#include "blkid/blkid.h"
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);
return;
}
+static void write_fsloc(FILE *f, struct exportent *ep, char *path)
+{
+ struct servers *servers;
+
+ if (ep->e_fslocmethod == FSLOC_NONE)
+ return;
+
+ servers = replicas_lookup(ep->e_fslocmethod, ep->e_fslocdata, path);
+ if (!servers)
+ return;
+ qword_print(f, "fsloc");
+ qword_printint(f, servers->h_num);
+ if (servers->h_num >= 0) {
+ int i;
+ for (i=0; i<servers->h_num; i++) {
+ qword_print(f, servers->h_mp[i]->h_host);
+ qword_print(f, servers->h_mp[i]->h_path);
+ }
+ }
+ qword_printint(f, servers->h_referral);
+ release_replicas(servers);
+}
+
static int dump_to_cache(FILE *f, char *domain, char *path, struct exportent *exp)
{
qword_print(f, domain);
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)) {
int i;
char *dom, *path;
nfs_export *exp, *found = NULL;
+ int found_type = 0;
if (readline(fileno(f), &lbuf, &lbuflen) != 1)
continue;
if (strcmp(path, exp->m_export.e_path))
continue;
- if (!found)
+ if (!found) {
found = exp;
- else {
+ found_type = i;
+ } else if (found_type == i) {
xlog(L_WARNING, "%s exported to both %s and %s in %s",
path, exp->m_client->m_hostname, found->m_client->m_hostname,
dom);
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+");
int err;
FILE *f;
- if (exp->m_export.e_maptype != CLE_MAP_IDENT) {
- xlog(L_ERROR, "%s: unsupported mapping; kernel supports only 'identity' (default)",
- exp->m_export.m_path);
- return -1;
- }
-
f = fopen("/proc/net/rpc/auth.unix.ip/channel", "w");
if (!f)
return -1;