From: Trond Myklebust <trondmy@gmail.com>
To: SteveD@redhat.com
Cc: linux-nfs@vger.kernel.org
Subject: [RFC PATCH v2 4/7] Add a helper to return the real path given an export entry
Date: Tue, 21 May 2019 08:46:58 -0400 [thread overview]
Message-ID: <20190521124701.61849-5-trond.myklebust@hammerspace.com> (raw)
In-Reply-To: <20190521124701.61849-4-trond.myklebust@hammerspace.com>
Add a helper that can prepend the nfsd root directory path in order
to allow mountd to perform its comparisons with mtab etc.
Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
---
support/export/export.c | 24 ++++++++++++++++++++++++
support/include/exportfs.h | 1 +
support/include/nfslib.h | 1 +
support/misc/nfsd_path.c | 4 +++-
support/nfs/exports.c | 4 ++++
5 files changed, 33 insertions(+), 1 deletion(-)
diff --git a/support/export/export.c b/support/export/export.c
index fbe68e84e5b3..229b02eb2dd4 100644
--- a/support/export/export.c
+++ b/support/export/export.c
@@ -20,6 +20,7 @@
#include "xmalloc.h"
#include "nfslib.h"
#include "exportfs.h"
+#include "nfsd_path.h"
exp_hash_table exportlist[MCL_MAXTYPES] = {{NULL, {{NULL,NULL}, }}, };
static int export_hash(char *);
@@ -30,6 +31,28 @@ static void export_add(nfs_export *exp);
static int export_check(const nfs_export *exp, const struct addrinfo *ai,
const char *path);
+/* Return a real path for the export. */
+static void
+exportent_mkrealpath(struct exportent *eep)
+{
+ char *chroot = nfsd_path_nfsd_rootdir();
+ char *ret = NULL;
+
+ if (chroot)
+ ret = nfsd_path_prepend_dir(chroot, eep->e_path);
+ if (!ret)
+ ret = xstrdup(eep->e_path);
+ eep->e_realpath = ret;
+}
+
+char *
+exportent_realpath(struct exportent *eep)
+{
+ if (!eep->e_realpath)
+ exportent_mkrealpath(eep);
+ return eep->e_realpath;
+}
+
void
exportent_release(struct exportent *eep)
{
@@ -39,6 +62,7 @@ exportent_release(struct exportent *eep)
free(eep->e_fslocdata);
free(eep->e_uuid);
xfree(eep->e_hostname);
+ xfree(eep->e_realpath);
}
static void
diff --git a/support/include/exportfs.h b/support/include/exportfs.h
index 4e0d9d132b4c..daa7e2a06d82 100644
--- a/support/include/exportfs.h
+++ b/support/include/exportfs.h
@@ -171,5 +171,6 @@ struct export_features {
struct export_features *get_export_features(void);
void fix_pseudoflavor_flags(struct exportent *ep);
+char *exportent_realpath(struct exportent *eep);
#endif /* EXPORTFS_H */
diff --git a/support/include/nfslib.h b/support/include/nfslib.h
index b09fce42e677..84d8270b330f 100644
--- a/support/include/nfslib.h
+++ b/support/include/nfslib.h
@@ -84,6 +84,7 @@ struct exportent {
char * e_uuid;
struct sec_entry e_secinfo[SECFLAVOR_COUNT+1];
unsigned int e_ttl;
+ char * e_realpath;
};
struct rmtabent {
diff --git a/support/misc/nfsd_path.c b/support/misc/nfsd_path.c
index 481ba49a38fd..386b171f26df 100644
--- a/support/misc/nfsd_path.c
+++ b/support/misc/nfsd_path.c
@@ -77,9 +77,11 @@ nfsd_path_prepend_dir(const char *dir, const char *pathname)
dirlen--;
if (!dirlen)
return NULL;
+ while (pathname[0] == '/')
+ pathname++;
len = dirlen + strlen(pathname) + 1;
ret = xmalloc(len + 1);
- snprintf(ret, len, "%.*s/%s", (int)dirlen, dir, pathname);
+ snprintf(ret, len+1, "%.*s/%s", (int)dirlen, dir, pathname);
return ret;
}
diff --git a/support/nfs/exports.c b/support/nfs/exports.c
index 5f4cb9568814..3ecfde797e3b 100644
--- a/support/nfs/exports.c
+++ b/support/nfs/exports.c
@@ -155,6 +155,7 @@ getexportent(int fromkernel, int fromexports)
}
xfree(ee.e_hostname);
+ xfree(ee.e_realpath);
ee = def_ee;
/* Check for default client */
@@ -358,6 +359,7 @@ dupexportent(struct exportent *dst, struct exportent *src)
if (src->e_uuid)
dst->e_uuid = strdup(src->e_uuid);
dst->e_hostname = NULL;
+ dst->e_realpath = NULL;
}
struct exportent *
@@ -369,6 +371,8 @@ mkexportent(char *hname, char *path, char *options)
xfree(ee.e_hostname);
ee.e_hostname = xstrdup(hname);
+ xfree(ee.e_realpath);
+ ee.e_realpath = NULL;
if (strlen(path) >= sizeof(ee.e_path)) {
xlog(L_ERROR, "path name %s too long", path);
--
2.21.0
next prev parent reply other threads:[~2019-05-21 12:49 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-05-21 12:46 [RFC PATCH v2 0/7] Add a root_dir option to nfs.conf Trond Myklebust
2019-05-21 12:46 ` [RFC PATCH v2 1/7] mountd: Ensure we don't share cache file descriptors among processes Trond Myklebust
2019-05-21 12:46 ` [RFC PATCH v2 2/7] Add a simple workqueue mechanism Trond Myklebust
2019-05-21 12:46 ` [RFC PATCH v2 3/7] Add utilities for resolving nfsd paths and stat()ing them Trond Myklebust
2019-05-21 12:46 ` Trond Myklebust [this message]
2019-05-21 12:46 ` [RFC PATCH v2 5/7] Add helpers to read/write to a file through the chrooted thread Trond Myklebust
2019-05-21 12:47 ` [RFC PATCH v2 6/7] Add support for the nfsd rootdir configuration option to rpc.mountd Trond Myklebust
2019-05-21 12:47 ` [RFC PATCH v2 7/7] Add support for the nfsd root directory to exportfs Trond Myklebust
2019-05-21 17:40 ` [RFC PATCH v2 0/7] Add a root_dir option to nfs.conf Chuck Lever
2019-05-21 18:17 ` Trond Myklebust
2019-05-21 18:59 ` Trond Myklebust
2019-05-21 19:06 ` Chuck Lever
2019-05-21 19:58 ` Trond Myklebust
2019-05-28 15:25 ` Steve Dickson
2019-05-28 16:44 ` Trond Myklebust
2019-05-28 16:47 ` Chuck Lever
2019-05-28 16:50 ` Trond Myklebust
2019-05-28 17:40 ` Steve Dickson
2019-05-28 18:19 ` Trond Myklebust
2019-05-28 19:33 ` Steve Dickson
2019-05-28 15:30 ` Chuck Lever
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20190521124701.61849-5-trond.myklebust@hammerspace.com \
--to=trondmy@gmail.com \
--cc=SteveD@redhat.com \
--cc=linux-nfs@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox