To create an export entry for a junction, an options string is
constructed from the set of locations in the junction. This options
string is then passed to mkexportent() where it is parsed and
converted into an exportent.
There is only one export option that is used to create a junction's
exportent: "refer=". When that option is parsed, it's value is
simply copied to a fresh string and planted in the new export's
e_fslocdata field.
Let's avoid the option parsing and extra string copy. Construct
a string for the new e_fslocdata field and plant it in the exportent
directly.
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Steve Dickson <steved@redhat.com>
#include <nfs-plugin.h>
/*
#include <nfs-plugin.h>
/*
- * Walk through a set of FS locations and build a set of export options.
+ * Walk through a set of FS locations and build an e_fslocdata string.
* Returns true if all went to plan; otherwise, false.
*/
* Returns true if all went to plan; otherwise, false.
*/
-static _Bool
-locations_to_options(struct jp_ops *ops, nfs_fsloc_set_t locations,
- char *options, size_t remaining, int *ttl)
+static bool locations_to_fslocdata(struct jp_ops *ops,
+ nfs_fsloc_set_t locations, char *fslocdata,
+ size_t remaining, int *ttl)
{
char *server, *last_path, *rootpath, *ptr;
_Bool seen = false;
{
char *server, *last_path, *rootpath, *ptr;
_Bool seen = false;
last_path = NULL;
rootpath = NULL;
server = NULL;
last_path = NULL;
rootpath = NULL;
server = NULL;
goto out_false;
}
if ((size_t)len >= remaining) {
goto out_false;
}
if ((size_t)len >= remaining) {
- xlog(D_GENERAL, "%s: options buffer overflow", __func__);
+ xlog(D_GENERAL, "%s: fslocdata buffer overflow", __func__);
goto out_false;
}
remaining -= (size_t)len;
ptr += len;
} else {
if (last_path == NULL)
goto out_false;
}
remaining -= (size_t)len;
ptr += len;
} else {
if (last_path == NULL)
- len = snprintf(ptr, remaining, "refer=%s@%s",
+ len = snprintf(ptr, remaining, "%s@%s",
rootpath, server);
else
len = snprintf(ptr, remaining, ":%s@%s",
rootpath, server);
else
len = snprintf(ptr, remaining, ":%s@%s",
goto out_false;
}
if ((size_t)len >= remaining) {
goto out_false;
}
if ((size_t)len >= remaining) {
- xlog(D_GENERAL, "%s: options buffer overflow",
+ xlog(D_GENERAL, "%s: fslocdata buffer overflow",
__func__);
goto out_false;
}
__func__);
goto out_false;
}
- xlog(D_CALL, "%s: options='%s', ttl=%d",
- __func__, options, *ttl);
+ xlog(D_CALL, "%s: fslocdata='%s', ttl=%d",
+ __func__, fslocdata, *ttl);
static struct exportent *locations_to_export(struct jp_ops *ops,
nfs_fsloc_set_t locations, const char *junction)
{
static struct exportent *locations_to_export(struct jp_ops *ops,
nfs_fsloc_set_t locations, const char *junction)
{
- static char options[BUFSIZ];
+ static char fslocdata[BUFSIZ];
struct exportent *exp;
int ttl;
struct exportent *exp;
int ttl;
- options[0] = '\0';
- if (!locations_to_options(ops, locations, options, sizeof(options), &ttl))
+ fslocdata[0] = '\0';
+ if (!locations_to_fslocdata(ops, locations,
+ fslocdata, sizeof(fslocdata), &ttl))
- exp = mkexportent("*", (char *)junction, options);
+ exp = mkexportent("*", (char *)junction, "");
if (exp == NULL) {
xlog(L_ERROR, "%s: Failed to construct exportent", __func__);
return NULL;
if (exp == NULL) {
xlog(L_ERROR, "%s: Failed to construct exportent", __func__);
return NULL;
exp->e_uuid = NULL;
exp->e_ttl = ttl;
exp->e_uuid = NULL;
exp->e_ttl = ttl;
+
+ free(exp->e_fslocdata);
+ exp->e_fslocmethod = FSLOC_REFER;
+ exp->e_fslocdata = strdup(fslocdata);
+ if (exp->e_fslocdata == NULL) {
+ xlog(L_ERROR, "%s: No memory", __func__);
+ return NULL;
+ }