From 3ea30d9ce892a66d5161acd8afb24b755e3f2045 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Uwe=20Kleine-K=C3=B6nig?= Date: Fri, 7 Feb 2014 22:28:13 +0100 Subject: [PATCH] nfs: parse nfsport and mount port from file system options MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This allows to use unfs3 on the server side which doesn't integrate into portmap/rpcbind which results in the port not being impossible to lookup via rpc calls to the portmap program. Use it like: mount -t nfs -o port=2703,mountport=2703 192.168.77.157:/root /mnt/nfs Signed-off-by: Uwe Kleine-König Signed-off-by: Sascha Hauer --- fs/Makefile | 2 +- fs/nfs.c | 30 ++++++++++++++++++++---------- fs/parseopt.c | 34 ++++++++++++++++++++++++++++++++++ fs/parseopt.h | 1 + 4 files changed, 56 insertions(+), 11 deletions(-) create mode 100644 fs/parseopt.c create mode 100644 fs/parseopt.h diff --git a/fs/Makefile b/fs/Makefile index e8347bd67..d3465edfa 100644 --- a/fs/Makefile +++ b/fs/Makefile @@ -8,6 +8,6 @@ obj-y += fs.o obj-$(CONFIG_FS_UBIFS) += ubifs/ obj-$(CONFIG_FS_TFTP) += tftp.o obj-$(CONFIG_FS_OMAP4_USBBOOT) += omap4_usbbootfs.o -obj-$(CONFIG_FS_NFS) += nfs.o +obj-$(CONFIG_FS_NFS) += nfs.o parseopt.o obj-$(CONFIG_FS_BPKFS) += bpkfs.o obj-$(CONFIG_FS_UIMAGEFS) += uimagefs.o diff --git a/fs/nfs.c b/fs/nfs.c index ab33c91ef..046cd4d76 100644 --- a/fs/nfs.c +++ b/fs/nfs.c @@ -36,6 +36,8 @@ #include #include +#include "parseopt.h" + #define SUNRPC_PORT 111 #define PROG_PORTMAP 100000 @@ -1339,19 +1341,27 @@ static int nfs_probe(struct device_d *dev) /* Need a priviliged source port */ net_udp_bind(npriv->con, 1000); - ret = rpc_lookup_req(npriv, PROG_MOUNT, 3); - if (ret < 0) { - printf("lookup mount port failed with %d\n", ret); - goto err2; + parseopt_hu(fsdev->options, "mountport", &npriv->mount_port); + if (!npriv->mount_port) { + ret = rpc_lookup_req(npriv, PROG_MOUNT, 3); + if (ret < 0) { + printf("lookup mount port failed with %d\n", ret); + goto err2; + } + npriv->mount_port = ret; } - npriv->mount_port = ret; + debug("mount port: %hu\n", npriv->mount_port); - ret = rpc_lookup_req(npriv, PROG_NFS, 3); - if (ret < 0) { - printf("lookup nfs port failed with %d\n", ret); - goto err2; + parseopt_hu(fsdev->options, "port", &npriv->nfs_port); + if (!npriv->nfs_port) { + ret = rpc_lookup_req(npriv, PROG_NFS, 3); + if (ret < 0) { + printf("lookup nfs port failed with %d\n", ret); + goto err2; + } + npriv->nfs_port = ret; } - npriv->nfs_port = ret; + debug("nfs port: %d\n", npriv->nfs_port); ret = nfs_mount_req(npriv); if (ret) { diff --git a/fs/parseopt.c b/fs/parseopt.c new file mode 100644 index 000000000..fbe53cfb0 --- /dev/null +++ b/fs/parseopt.c @@ -0,0 +1,34 @@ +#include + +#include "parseopt.h" + +void parseopt_hu(const char *options, const char *opt, unsigned short *val) +{ + const char *start; + size_t optlen = strlen(opt); + ulong v; + char *endp; + +again: + start = strstr(options, opt); + + if (!start) + return; + + if (start > options && start[-1] != ',') { + options = start; + goto again; + } + + if (start[optlen] != '=') { + options = start; + goto again; + } + + v = simple_strtoul(start + optlen + 1, &endp, 0); + if (v > USHORT_MAX) + return; + + if (*endp == ',' || *endp == '\0') + *val = v; +} diff --git a/fs/parseopt.h b/fs/parseopt.h new file mode 100644 index 000000000..a8523b6a1 --- /dev/null +++ b/fs/parseopt.h @@ -0,0 +1 @@ +void parseopt_hu(const char *options, const char *opt, unsigned short *val);