Merge branch 'virt' into 'master'
Minor improvements to virtio-fs Closes #15 See merge request u-boot/u-boot!119
This commit is contained in:
@@ -224,6 +224,7 @@ int virtio_fs_readdir(struct udevice *dev, u64 nodeid, u64 fh, u64 offset,
|
||||
in.size = size;
|
||||
in.offset = offset;
|
||||
ret = virtio_fs_xfer(dev, &inhdr, &in, sizeof(in), &outhdr, buf, size);
|
||||
log_debug("fh %llx offset %llx\n", in.fh, in.offset);
|
||||
log_debug("len %x error %x unique %llx\n", outhdr.len, outhdr.error,
|
||||
outhdr.unique);
|
||||
if (ret)
|
||||
|
||||
@@ -25,18 +25,14 @@ static int virtio_fs_dir_open(struct udevice *dev, struct fs_dir_stream *strm)
|
||||
struct udevice *fs = dev_get_parent(dev);
|
||||
int ret;
|
||||
|
||||
strm = malloc(sizeof(struct fs_dir_stream));
|
||||
if (!strm)
|
||||
return log_msg_ret("vso", -ENOMEM);
|
||||
|
||||
log_debug("opening inode %lld\n", dir_priv->inode);
|
||||
ret = virtio_fs_opendir(fs, dir_priv->inode, &strm->fh);
|
||||
log_debug("2 open ret %d strm %p fh %llx\n", ret, strm, strm->fh);
|
||||
if (ret) {
|
||||
log_err("Failed to open directory: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
strm->dev = dev;
|
||||
|
||||
strm->offset = 0;
|
||||
|
||||
return 0;
|
||||
@@ -53,7 +49,8 @@ int virtio_fs_dir_read(struct udevice *dev, struct fs_dir_stream *strm,
|
||||
char buf[0x200];
|
||||
int ret, size;
|
||||
|
||||
log_debug("start %lld strm %p\n", dir_priv->inode, strm);
|
||||
log_debug("start %lld strm %p fh %llx\n", dir_priv->inode, strm,
|
||||
strm->fh);
|
||||
log_debug("offset %lld\n", strm->offset);
|
||||
ret = virtio_fs_readdir(fs, dir_priv->inode, strm->fh, strm->offset,
|
||||
buf, sizeof(buf), &size);
|
||||
@@ -163,14 +160,12 @@ int virtio_fs_setup_dir(struct udevice *fsdev, const char *path,
|
||||
{
|
||||
struct virtio_fs_dir_priv *dir_priv;
|
||||
struct udevice *dir;
|
||||
bool has_path;
|
||||
u64 inode;
|
||||
int ret;
|
||||
|
||||
log_debug("looking up path '%s'\n", path);
|
||||
inode = FUSE_ROOT_ID;
|
||||
has_path = path && strcmp("/", path);
|
||||
if (has_path) {
|
||||
if (*path) {
|
||||
ret = virtio_fs_lookup(fsdev, path, &inode);
|
||||
if (ret) {
|
||||
log_err("Failed to lookup directory '%s': %d\n", path,
|
||||
@@ -193,7 +188,7 @@ int virtio_fs_setup_dir(struct udevice *fsdev, const char *path,
|
||||
return 0;
|
||||
|
||||
no_add:
|
||||
if (has_path)
|
||||
if (*path)
|
||||
ret = virtio_fs_forget(fsdev, inode);
|
||||
|
||||
return ret;
|
||||
|
||||
@@ -152,10 +152,10 @@ long virtio_fs_read(struct udevice *dev, u64 nodeid, u64 fh, u64 offset,
|
||||
* Looks up a path to find the corresponding inode in the virtio-fs filesystem,
|
||||
* then creates and probes a new 'directory' device to represent it.
|
||||
*
|
||||
* If the path is the root (NULL or "/"), it uses the root inode directly.
|
||||
* If the path is the root (@path is ""), it uses the root inode directly.
|
||||
*
|
||||
* @fsdev: The virtio-fs filesystem device
|
||||
* @path: The path of the directory to set up (e.g., "/boot" or "/")
|
||||
* @path: The path of the directory to set up (e.g., "/boot", or "" for root)
|
||||
* @devp: On success, returns a pointer to the newly created directory device
|
||||
* Return: 0 on success, -ve on error
|
||||
*/
|
||||
|
||||
@@ -26,7 +26,7 @@ int dir_add_probe(struct udevice *fsdev, struct driver *drv, const char *path,
|
||||
str = strdup(dev_name);
|
||||
if (!str)
|
||||
goto no_dev_name;
|
||||
dup_path = strdup(path && strcmp("/", path) ? path : "");
|
||||
dup_path = strdup(path);
|
||||
if (!str)
|
||||
goto no_dev_path;
|
||||
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
|
||||
#include <bootdev.h>
|
||||
#include <bootmeth.h>
|
||||
#include <dir.h>
|
||||
#include <dm.h>
|
||||
#include <fs.h>
|
||||
#include <dm/device-internal.h>
|
||||
@@ -41,8 +42,35 @@ int fs_split_path(const char *fname, char **subdirp, const char **leafp)
|
||||
int fs_lookup_dir(struct udevice *dev, const char *path, struct udevice **dirp)
|
||||
{
|
||||
struct fs_ops *ops = fs_get_ops(dev);
|
||||
struct udevice *dir;
|
||||
int ret;
|
||||
|
||||
return ops->lookup_dir(dev, path, dirp);
|
||||
if (!path || !strcmp("/", path))
|
||||
path = "";
|
||||
|
||||
/* see if we already have this directory */
|
||||
device_foreach_child(dir, dev) {
|
||||
struct dir_uc_priv *priv;
|
||||
|
||||
if (!device_active(dir))
|
||||
continue;
|
||||
|
||||
priv = dev_get_uclass_priv(dir);
|
||||
log_debug("dir %s '%s' '%s'\n", dir->name, path, priv->path);
|
||||
if (!strcmp(path, priv->path)) {
|
||||
*dirp = dir;
|
||||
log_debug("found: dev '%s'\n", dir->name);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
ret = ops->lookup_dir(dev, path, &dir);
|
||||
if (ret)
|
||||
return log_msg_ret("fld", ret);
|
||||
|
||||
*dirp = dir;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int fs_mount(struct udevice *dev)
|
||||
|
||||
@@ -206,7 +206,8 @@ static int sandbox_dir_open(struct udevice *dev, struct fs_dir_stream *strm)
|
||||
struct dir_uc_priv *dir_uc_priv = dev_get_uclass_priv(dev);
|
||||
int ret;
|
||||
|
||||
ret = os_dirent_ls(dir_uc_priv->path, &priv->head);
|
||||
ret = os_dirent_ls(*dir_uc_priv->path ? dir_uc_priv->path : ".",
|
||||
&priv->head);
|
||||
if (ret) {
|
||||
log_err("Failed to open directory: %d\n", ret);
|
||||
return ret;
|
||||
@@ -300,7 +301,8 @@ static int sandbox_dir_open_file(struct udevice *dir, const char *leaf,
|
||||
struct udevice *dev;
|
||||
off_t size;
|
||||
|
||||
snprintf(pathname, sizeof(pathname), "%s/%s", uc_priv->path, leaf);
|
||||
snprintf(pathname, sizeof(pathname), "%s/%s",
|
||||
*uc_priv->path ? uc_priv->path: ".", leaf);
|
||||
ftype = os_get_filetype(pathname);
|
||||
if (ftype < 0)
|
||||
return log_msg_ret("soF", ftype);
|
||||
@@ -367,7 +369,7 @@ static int sandbox_fs_lookup_dir(struct udevice *dev, const char *path,
|
||||
int ftype;
|
||||
int ret;
|
||||
|
||||
ftype = os_get_filetype(path ?: "/");
|
||||
ftype = os_get_filetype(*path ? path : "/");
|
||||
if (ftype < 0)
|
||||
return ftype;
|
||||
if (ftype != OS_FILET_DIR)
|
||||
|
||||
@@ -117,10 +117,11 @@ int dir_close(struct udevice *dev, struct fs_dir_stream *strm);
|
||||
/**
|
||||
* dir_add_probe() - Add a new directory and probe it
|
||||
*
|
||||
* This sets up the uclass-private data for the new directory
|
||||
*
|
||||
* @fsdev: Filesystem containing the directory
|
||||
* @drv: Driver to use
|
||||
* @path Absolute path to directory (within the filesystem), or NULL/"/" for
|
||||
* root
|
||||
* @path Absolute path to directory (within the filesystem), or "" for root
|
||||
* @devp: Returns the new device, probed ready for use *
|
||||
*/
|
||||
int dir_add_probe(struct udevice *fsdev, struct driver *drv, const char *path,
|
||||
|
||||
@@ -58,8 +58,11 @@ struct fs_ops {
|
||||
/**
|
||||
* lookup_dir() - Look up a directory on a filesystem
|
||||
*
|
||||
* This should not set up the uclass-private data; this is done by
|
||||
* fs_lookup_dir()
|
||||
*
|
||||
* @dev: Filesystem device
|
||||
* @path: Path to look up, empty or "/" for the root
|
||||
* @path: Path to look up, "" for the root
|
||||
* @dirp: Returns associated directory device, creating if necessary
|
||||
* Return 0 if OK, -ENOENT, other -ve on error
|
||||
*/
|
||||
@@ -89,8 +92,10 @@ int fs_unmount(struct udevice *dev);
|
||||
/**
|
||||
* fs_lookup_dir() - Look up a directory on a filesystem
|
||||
*
|
||||
* If a new directory-device is created, its uclass data is set up also
|
||||
*
|
||||
* @dev: Filesystem device
|
||||
* @path: Path to look up, empty or "/" for the root
|
||||
* @path: Path to look up, "" or "/" for the root
|
||||
* @dirp: Returns associated directory device, creating if necessary
|
||||
* Return 0 if OK, -ENOENT, other -ve on error
|
||||
*/
|
||||
|
||||
@@ -44,7 +44,7 @@ static int dm_test_fs_dir(struct unit_test_state *uts)
|
||||
ut_assertok(fs_mount(fsdev));
|
||||
|
||||
ut_asserteq(-ENOENT, fs_lookup_dir(fsdev, "does-not-exit", &dir));
|
||||
ut_assertok(fs_lookup_dir(fsdev, ".", &dir));
|
||||
ut_assertok(fs_lookup_dir(fsdev, "", &dir));
|
||||
ut_assertnonnull(dir);
|
||||
ut_asserteq_str("fs.dir", dir->name);
|
||||
|
||||
@@ -79,7 +79,7 @@ static int dm_test_fs_file(struct unit_test_state *uts)
|
||||
|
||||
ut_assertok(fs_mount(fsdev));
|
||||
|
||||
ut_assertok(fs_lookup_dir(fsdev, ".", &dir));
|
||||
ut_assertok(fs_lookup_dir(fsdev, "", &dir));
|
||||
ut_assertnonnull(dir);
|
||||
ut_asserteq_str("fs.dir", dir->name);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user