summaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2015-06-17 13:00:00 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2015-06-18 09:01:01 +0200
commit745594d51afa71b01bb5bfda969da19aa079d214 (patch)
treed6f2b87bd060a124fcf6d655f968506689d41bdf /fs
parente9db2079a55162821e4566efdef5b3d3b5028e88 (diff)
downloadbarebox-745594d51afa71b01bb5bfda969da19aa079d214.tar.gz
barebox-745594d51afa71b01bb5bfda969da19aa079d214.tar.xz
fs: ubifs: Implement Linux rootarg
Add the parameter to boot from ubifs fileystems. This assumes that there will be only one UBI device registered in the kernel, otherwise there is no way to predict the ubi number. Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'fs')
-rw-r--r--fs/ubifs/ubifs.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/fs/ubifs/ubifs.c b/fs/ubifs/ubifs.c
index 68d90b36e7..a9189f76b5 100644
--- a/fs/ubifs/ubifs.c
+++ b/fs/ubifs/ubifs.c
@@ -36,6 +36,7 @@
#include <linux/zlib.h>
#include <xfuncs.h>
#include <fcntl.h>
+#include <linux/mtd/mtd.h>
#include "ubifs.h"
@@ -584,6 +585,26 @@ static int ubifs_readlink(struct device_d *dev, const char *pathname, char *buf,
return 0;
}
+static void ubifs_set_rootarg(struct ubifs_priv *priv, struct fs_device_d *fsdev)
+{
+ struct ubi_volume_info vi = {};
+ struct ubi_device_info di = {};
+ struct mtd_info *mtd;
+ char *str;
+
+ ubi_get_volume_info(priv->ubi, &vi);
+ ubi_get_device_info(vi.ubi_num, &di);
+
+ mtd = di.mtd;
+
+ str = asprintf("root=ubi0:%s ubi.mtd=%s rootfstype=ubifs",
+ vi.name, mtd->cdev.partname);
+
+ fsdev_set_linux_rootarg(fsdev, str);
+
+ free(str);
+}
+
static int ubifs_probe(struct device_d *dev)
{
struct fs_device_d *fsdev = dev_to_fs_device(dev);
@@ -612,6 +633,8 @@ static int ubifs_probe(struct device_d *dev)
goto err;
}
+ ubifs_set_rootarg(priv, fsdev);
+
return 0;
err:
ubi_close_volume(priv->ubi);