fs: cleanup backingstore handling
All filesystem drivers which need a backingstore device do the same ignoring of '/dev/' in the backingstore followed by a cdev_open. Add a helper function for it and let the core handle the cdev. As a side effect this makes sure that fsdev->cdev is also set when a device is mounted without the leading '/dev/' which was previously ignored by the mount code. Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
This commit is contained in:
parent
d4f5bb1e01
commit
ecb3aaa23b
|
@ -422,29 +422,33 @@ static int cramfs_probe(struct device_d *dev)
|
|||
{
|
||||
struct fs_device_d *fsdev;
|
||||
struct cramfs_priv *priv;
|
||||
int ret;
|
||||
|
||||
fsdev = dev_to_fs_device(dev);
|
||||
|
||||
priv = xmalloc(sizeof(struct cramfs_priv));
|
||||
dev->priv = priv;
|
||||
|
||||
if (strncmp(fsdev->backingstore, "/dev/", 5))
|
||||
return -ENODEV;
|
||||
ret = fsdev_open_cdev(fsdev);
|
||||
if (ret)
|
||||
goto err_out;
|
||||
|
||||
priv->cdev = cdev_by_name(fsdev->backingstore + 5);
|
||||
if (!priv->cdev)
|
||||
return -ENODEV;
|
||||
priv->cdev = fsdev->cdev;
|
||||
|
||||
if (cramfs_read_super(priv)) {
|
||||
dev_info(dev, "no valid cramfs found\n");
|
||||
free(priv);
|
||||
return -EINVAL;
|
||||
ret = -EINVAL;
|
||||
}
|
||||
|
||||
priv->curr_base = -1;
|
||||
|
||||
cramfs_uncompress_init ();
|
||||
return 0;
|
||||
|
||||
err_out:
|
||||
free(priv);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void cramfs_remove(struct device_d *dev)
|
||||
|
|
|
@ -225,7 +225,6 @@ static int ext_readlink(struct device_d *dev, const char *pathname,
|
|||
static int ext_probe(struct device_d *dev)
|
||||
{
|
||||
struct fs_device_d *fsdev = dev_to_fs_device(dev);
|
||||
char *backingstore = fsdev->backingstore;
|
||||
int ret;
|
||||
struct ext_filesystem *fs;
|
||||
|
||||
|
@ -234,14 +233,11 @@ static int ext_probe(struct device_d *dev)
|
|||
dev->priv = fs;
|
||||
fs->dev = dev;
|
||||
|
||||
if (!strncmp(backingstore , "/dev/", 5))
|
||||
backingstore += 5;
|
||||
|
||||
fs->cdev = cdev_open(backingstore, O_RDWR);
|
||||
if (!fs->cdev) {
|
||||
ret = -ENOENT;
|
||||
ret = fsdev_open_cdev(fsdev);
|
||||
if (ret)
|
||||
goto err_open;
|
||||
}
|
||||
|
||||
fs->cdev = fsdev->cdev;
|
||||
|
||||
ret = ext4fs_mount(fs);
|
||||
if (ret)
|
||||
|
@ -250,7 +246,6 @@ static int ext_probe(struct device_d *dev)
|
|||
return 0;
|
||||
|
||||
err_mount:
|
||||
cdev_close(fs->cdev);
|
||||
err_open:
|
||||
free(fs);
|
||||
|
||||
|
@ -262,7 +257,6 @@ static void ext_remove(struct device_d *dev)
|
|||
struct ext_filesystem *fs = dev->priv;
|
||||
|
||||
ext4fs_umount(fs);
|
||||
cdev_close(fs->cdev);
|
||||
free(fs);
|
||||
}
|
||||
|
||||
|
|
17
fs/fat/fat.c
17
fs/fat/fat.c
|
@ -373,19 +373,15 @@ static int fat_probe(struct device_d *dev)
|
|||
{
|
||||
struct fs_device_d *fsdev = dev_to_fs_device(dev);
|
||||
struct fat_priv *priv = xzalloc(sizeof(struct fat_priv));
|
||||
char *backingstore = fsdev->backingstore;
|
||||
int ret;
|
||||
|
||||
dev->priv = priv;
|
||||
|
||||
if (!strncmp(backingstore , "/dev/", 5))
|
||||
backingstore += 5;
|
||||
|
||||
priv->cdev = cdev_open(backingstore, O_RDWR);
|
||||
if (!priv->cdev) {
|
||||
ret = -ENOENT;
|
||||
ret = fsdev_open_cdev(fsdev);
|
||||
if (ret)
|
||||
goto err_open;
|
||||
}
|
||||
|
||||
priv->cdev = fsdev->cdev;
|
||||
|
||||
priv->fat.userdata = priv;
|
||||
ret = f_mount(&priv->fat);
|
||||
|
@ -395,7 +391,6 @@ static int fat_probe(struct device_d *dev)
|
|||
return 0;
|
||||
|
||||
err_mount:
|
||||
cdev_close(priv->cdev);
|
||||
err_open:
|
||||
free(priv);
|
||||
|
||||
|
@ -404,10 +399,6 @@ err_open:
|
|||
|
||||
static void fat_remove(struct device_d *dev)
|
||||
{
|
||||
struct fat_priv *priv = dev->priv;
|
||||
|
||||
cdev_close(priv->cdev);
|
||||
|
||||
free(dev->priv);
|
||||
}
|
||||
|
||||
|
|
28
fs/fs.c
28
fs/fs.c
|
@ -1231,6 +1231,9 @@ static void fs_remove(struct device_d *dev)
|
|||
if (fsdev == fs_dev_root)
|
||||
fs_dev_root = NULL;
|
||||
|
||||
if (fsdev->cdev)
|
||||
cdev_close(fsdev->cdev);
|
||||
|
||||
free(fsdev->backingstore);
|
||||
free(fsdev);
|
||||
}
|
||||
|
@ -1279,6 +1282,23 @@ static const char *detect_fs(const char *filename)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
int fsdev_open_cdev(struct fs_device_d *fsdev)
|
||||
{
|
||||
const char *backingstore = fsdev->backingstore;
|
||||
|
||||
if (!strncmp(backingstore , "/dev/", 5))
|
||||
backingstore += 5;
|
||||
|
||||
fsdev->cdev = cdev_open(backingstore, O_RDWR);
|
||||
if (!fsdev->cdev)
|
||||
return -EINVAL;
|
||||
|
||||
fsdev->dev.parent = fsdev->cdev->dev;
|
||||
fsdev->parent_device = fsdev->cdev->dev;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Mount a device to a directory.
|
||||
* We do this by registering a new device on which the filesystem
|
||||
|
@ -1323,14 +1343,6 @@ int mount(const char *device, const char *fsname, const char *_path)
|
|||
fsdev->path = xstrdup(path);
|
||||
fsdev->dev.bus = &fs_bus;
|
||||
|
||||
if (!strncmp(device, "/dev/", 5))
|
||||
fsdev->cdev = cdev_by_name(device + 5);
|
||||
|
||||
if (fsdev->cdev) {
|
||||
fsdev->dev.parent = fsdev->cdev->dev;
|
||||
fsdev->parent_device = fsdev->cdev->dev;
|
||||
}
|
||||
|
||||
ret = register_device(&fsdev->dev);
|
||||
if (ret)
|
||||
goto err_register;
|
||||
|
|
|
@ -553,25 +553,22 @@ static int ubifs_probe(struct device_d *dev)
|
|||
{
|
||||
struct fs_device_d *fsdev = dev_to_fs_device(dev);
|
||||
struct ubifs_priv *priv = xzalloc(sizeof(struct ubifs_priv));
|
||||
char *backingstore = fsdev->backingstore;
|
||||
int ret;
|
||||
|
||||
dev->priv = priv;
|
||||
|
||||
if (!strncmp(backingstore , "/dev/", 5))
|
||||
backingstore += 5;
|
||||
|
||||
priv->cdev = cdev_open(backingstore, O_RDONLY);
|
||||
if (!priv->cdev) {
|
||||
ret = -ENOENT;
|
||||
ret = fsdev_open_cdev(fsdev);
|
||||
if (ret)
|
||||
goto err_free;
|
||||
}
|
||||
|
||||
priv->cdev = fsdev->cdev;
|
||||
|
||||
priv->ubi = ubi_open_volume_cdev(priv->cdev, UBI_READONLY);
|
||||
if (IS_ERR(priv->ubi)) {
|
||||
dev_err(dev, "failed to open ubi volume: %s\n",
|
||||
strerror(-PTR_ERR(priv->ubi)));
|
||||
return PTR_ERR(priv->ubi);
|
||||
ret = PTR_ERR(priv->ubi);
|
||||
goto err_free;
|
||||
}
|
||||
|
||||
priv->sb = ubifs_get_super(priv->ubi, 0);
|
||||
|
@ -596,7 +593,6 @@ static void ubifs_remove(struct device_d *dev)
|
|||
|
||||
ubifs_umount(c);
|
||||
ubi_close_volume(priv->ubi);
|
||||
cdev_close(priv->cdev);
|
||||
|
||||
free(c);
|
||||
free(sb);
|
||||
|
|
|
@ -193,4 +193,6 @@ void automount_print(void);
|
|||
|
||||
int unlink_recursive(const char *path, char **failedpath);
|
||||
|
||||
int fsdev_open_cdev(struct fs_device_d *fsdev);
|
||||
|
||||
#endif /* __FS_H */
|
||||
|
|
Loading…
Reference in New Issue