nfs: parse nfsport and mount port from file system options
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 <u.kleine-koenig@pengutronix.de> Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
This commit is contained in:
parent
f97f4b6571
commit
3ea30d9ce8
|
@ -8,6 +8,6 @@ obj-y += fs.o
|
||||||
obj-$(CONFIG_FS_UBIFS) += ubifs/
|
obj-$(CONFIG_FS_UBIFS) += ubifs/
|
||||||
obj-$(CONFIG_FS_TFTP) += tftp.o
|
obj-$(CONFIG_FS_TFTP) += tftp.o
|
||||||
obj-$(CONFIG_FS_OMAP4_USBBOOT) += omap4_usbbootfs.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_BPKFS) += bpkfs.o
|
||||||
obj-$(CONFIG_FS_UIMAGEFS) += uimagefs.o
|
obj-$(CONFIG_FS_UIMAGEFS) += uimagefs.o
|
||||||
|
|
30
fs/nfs.c
30
fs/nfs.c
|
@ -36,6 +36,8 @@
|
||||||
#include <sizes.h>
|
#include <sizes.h>
|
||||||
#include <byteorder.h>
|
#include <byteorder.h>
|
||||||
|
|
||||||
|
#include "parseopt.h"
|
||||||
|
|
||||||
#define SUNRPC_PORT 111
|
#define SUNRPC_PORT 111
|
||||||
|
|
||||||
#define PROG_PORTMAP 100000
|
#define PROG_PORTMAP 100000
|
||||||
|
@ -1339,19 +1341,27 @@ static int nfs_probe(struct device_d *dev)
|
||||||
/* Need a priviliged source port */
|
/* Need a priviliged source port */
|
||||||
net_udp_bind(npriv->con, 1000);
|
net_udp_bind(npriv->con, 1000);
|
||||||
|
|
||||||
ret = rpc_lookup_req(npriv, PROG_MOUNT, 3);
|
parseopt_hu(fsdev->options, "mountport", &npriv->mount_port);
|
||||||
if (ret < 0) {
|
if (!npriv->mount_port) {
|
||||||
printf("lookup mount port failed with %d\n", ret);
|
ret = rpc_lookup_req(npriv, PROG_MOUNT, 3);
|
||||||
goto err2;
|
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);
|
parseopt_hu(fsdev->options, "port", &npriv->nfs_port);
|
||||||
if (ret < 0) {
|
if (!npriv->nfs_port) {
|
||||||
printf("lookup nfs port failed with %d\n", ret);
|
ret = rpc_lookup_req(npriv, PROG_NFS, 3);
|
||||||
goto err2;
|
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);
|
ret = nfs_mount_req(npriv);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
|
|
|
@ -0,0 +1,34 @@
|
||||||
|
#include <common.h>
|
||||||
|
|
||||||
|
#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;
|
||||||
|
}
|
|
@ -0,0 +1 @@
|
||||||
|
void parseopt_hu(const char *options, const char *opt, unsigned short *val);
|
Loading…
Reference in New Issue