summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Documentation/user/booting-linux.rst2
-rw-r--r--fs/nfs.c21
2 files changed, 21 insertions, 2 deletions
diff --git a/Documentation/user/booting-linux.rst b/Documentation/user/booting-linux.rst
index 39084e5afe..5b021f0662 100644
--- a/Documentation/user/booting-linux.rst
+++ b/Documentation/user/booting-linux.rst
@@ -203,7 +203,7 @@ compatible NFS URI string must be passed to the boot command:
.. code-block:: sh
- boot nfs://nfshost//path/
+ boot nfs://nfshost[:port]//path/
Additionally to the options defined in the original spec barebox understands the
``linux-appendroot`` option. This is a boolean value and if set to ``true`` barebox
diff --git a/fs/nfs.c b/fs/nfs.c
index 382475249f..87828fce13 100644
--- a/fs/nfs.c
+++ b/fs/nfs.c
@@ -133,7 +133,9 @@ struct nfs_priv {
IPaddr_t server;
char *path;
uint16_t mount_port;
+ unsigned manual_mount_port:1;
uint16_t nfs_port;
+ unsigned manual_nfs_port:1;
uint32_t rpc_id;
uint32_t rootfh_len;
char rootfh[NFS3_FHSIZE];
@@ -1311,7 +1313,7 @@ static char *rootnfsopts;
static void nfs_set_rootarg(struct nfs_priv *npriv, struct fs_device_d *fsdev)
{
- char *str;
+ char *str, *tmp;
const char *ip;
ip = ip_to_string(npriv->server);
@@ -1319,6 +1321,19 @@ static void nfs_set_rootarg(struct nfs_priv *npriv, struct fs_device_d *fsdev)
ip, npriv->path, rootnfsopts[0] ? "," : "",
rootnfsopts);
+ /* forward specific mount options on demand */
+ if (npriv->manual_nfs_port == 1) {
+ tmp = asprintf("%s,port=%hu", str, npriv->nfs_port);
+ free(str);
+ str = tmp;
+ }
+
+ if (npriv->manual_mount_port == 1) {
+ tmp = asprintf("%s,mountport=%hu", str, npriv->mount_port);
+ free(str);
+ str = tmp;
+ }
+
fsdev_set_linux_rootarg(fsdev, str);
free(str);
@@ -1367,6 +1382,8 @@ static int nfs_probe(struct device_d *dev)
goto err2;
}
npriv->mount_port = ret;
+ } else {
+ npriv->manual_mount_port = 1;
}
debug("mount port: %hu\n", npriv->mount_port);
@@ -1378,6 +1395,8 @@ static int nfs_probe(struct device_d *dev)
goto err2;
}
npriv->nfs_port = ret;
+ } else {
+ npriv->manual_nfs_port = 1;
}
debug("nfs port: %d\n", npriv->nfs_port);