[PATCH 8/8] misc: Add storage-by-uuid driver
Sascha Hauer
s.hauer at pengutronix.de
Tue Feb 8 04:27:31 PST 2022
On Tue, Feb 08, 2022 at 10:29:31AM +0100, Michael Olbrich wrote:
> On Mon, Feb 07, 2022 at 10:49:53AM +0100, Sascha Hauer wrote:
> > This adds a driver which matches to a "barebox,storage-by-uuid"
> > compatible node. The driver looks for a storage device matching the
> > given UUID and when found registers a new cdev for the device.
> >
> > This driver solved a very specific problem. On EFI the storage devices
> > are not connected to any device tree node. barebox-state however expects
> > a node to use as its backend. The obvious solution would be to create
> > a partition with a specific partuuid and use that for state, in our
> > special usecase though the storage device is partitioned with a MBR
> > which doesn't have any space left to create a new partition. As this
> > driver parses the of partition binding we can use that to create
> > a partition in an unallocated are of the disk which is then used for
> > state.
> >
> > This driver has the problem that it depends on storage devices which
> > are not described in the device tree. This means it cannot work with
> > deep probe. This is not a problem on EFI though. It's a special purpose
> > driver, it's not recommended for general use.
> >
> > Signed-off-by: Sascha Hauer <s.hauer at pengutronix.de>
> > ---
> > drivers/misc/Kconfig | 23 ++++
> > drivers/misc/Makefile | 1 +
> > drivers/misc/storage-by-uuid.c | 199 +++++++++++++++++++++++++++++++++
> > 3 files changed, 223 insertions(+)
> > create mode 100644 drivers/misc/storage-by-uuid.c
> >
> > diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig
> > index 5ab0506cd9..78c9c193d8 100644
> > --- a/drivers/misc/Kconfig
> > +++ b/drivers/misc/Kconfig
> > @@ -47,4 +47,27 @@ config STARFIVE_PWRSEQ
> > be accessed over /dev/mem or used from kernels which still depend
> > on bootloader for initialization.
> >
> > +config STORAGE_BY_UUID
> > + bool "storage by UUID"
> > + depends on OFDEVICE
> > + help
> > + This adds a driver which matches to a "barebox,storage-by-uuid"
> > + compatible node. The driver looks for a storage device matching the
> > + given UUID and when found registers a new cdev for the device.
> > +
> > + This driver solved a very specific problem. On EFI the storage devices
> > + are not connected to any device tree node. barebox-state however expects
> > + a node to use as its backend. The obvious solution would be to create
> > + a partition with a specific partuuid and use that for state, in our
> > + special usecase though the storage device is partitioned with a MBR
> > + which doesn't have any space left to create a new partition. As this
> > + driver parses the of partition binding we can use that to create
> > + a partition in an unallocated are of the disk which is then used for
> > + state.
> > +
> > + This driver has the problem that it depends on storage devices which
> > + are not described in the device tree. This means it cannot work with
> > + deep probe. This is not a problem on EFI though. It's a special purpose
> > + driver, it's not recommended for general use.
> > +
> > endmenu
> > diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile
> > index 6326e784fc..986f7b1b38 100644
> > --- a/drivers/misc/Makefile
> > +++ b/drivers/misc/Makefile
> > @@ -9,3 +9,4 @@ obj-$(CONFIG_STATE_DRV) += state.o
> > obj-$(CONFIG_DEV_MEM) += mem.o
> > obj-$(CONFIG_UBOOTVAR) += ubootvar.o
> > obj-$(CONFIG_STARFIVE_PWRSEQ) += starfive-pwrseq.o
> > +obj-$(CONFIG_STORAGE_BY_UUID) += storage-by-uuid.o
> > diff --git a/drivers/misc/storage-by-uuid.c b/drivers/misc/storage-by-uuid.c
> > new file mode 100644
> > index 0000000000..c9dd6e9793
> > --- /dev/null
> > +++ b/drivers/misc/storage-by-uuid.c
> > @@ -0,0 +1,199 @@
> > +// SPDX-License-Identifier: GPL-2.0-only
> > +#include <common.h>
> > +#include <init.h>
> > +#include <io.h>
> > +#include <of.h>
> > +#include <malloc.h>
> > +#include <partition.h>
> > +#include <envfs.h>
> > +#include <fs.h>
> > +
> > +static LIST_HEAD(sbu_list);
> > +
> > +struct sbu {
> > + char *uuid;
> > + struct device_d *dev;
> > + struct cdev *rcdev;
> > + struct cdev cdev;
> > + struct list_head list;
> > +};
> > +
> > +void storage_by_uuid_check_exist(struct cdev *cdev);
> > +
> > +static ssize_t sbu_read(struct cdev *cdev, void *buf, size_t count, loff_t offset, ulong flags)
> > +{
> > + struct sbu *sbu = cdev->priv;
> > +
> > + return cdev_read(sbu->rcdev, buf, count, offset, flags);
> > +}
> > +
> > +static ssize_t sbu_write(struct cdev *cdev, const void *buf, size_t count, loff_t offset, ulong flags)
> > +{
> > + struct sbu *sbu = cdev->priv;
> > +
> > + return cdev_write(sbu->rcdev, buf, count, offset, flags);
> > +}
> > +
> > +static int sbu_ioctl(struct cdev *cdev, int request, void *buf)
> > +{
> > + struct sbu *sbu = cdev->priv;
> > +
> > + return cdev_ioctl(sbu->rcdev, request, buf);
> > +}
> > +
> > +static int sbu_open(struct cdev *cdev, unsigned long flags)
> > +{
> > + struct sbu *sbu = cdev->priv;
> > +
> > + return cdev_open(sbu->rcdev, flags);
> > +}
> > +
> > +static int sbu_close(struct cdev *cdev)
> > +{
> > + struct sbu *sbu = cdev->priv;
> > +
> > + cdev_close(sbu->rcdev);
> > +
> > + return 0;
> > +}
> > +
> > +static int sbu_flush(struct cdev *cdev)
> > +{
> > + struct sbu *sbu = cdev->priv;
> > +
> > + return cdev_flush(sbu->rcdev);
> > +}
> > +
> > +static int sbu_erase(struct cdev *cdev, loff_t count, loff_t offset)
> > +{
> > + struct sbu *sbu = cdev->priv;
> > +
> > + return cdev_erase(sbu->rcdev, count, offset);
> > +}
> > +
> > +static int sbu_protect(struct cdev *cdev, size_t count, loff_t offset, int prot)
> > +{
> > + struct sbu *sbu = cdev->priv;
> > +
> > + return cdev_protect(sbu->rcdev, count, offset, prot);
> > +}
> > +
> > +static int sbu_discard_range(struct cdev *cdev, loff_t count, loff_t offset)
> > +{
> > + struct sbu *sbu = cdev->priv;
> > +
> > + return cdev_discard_range(sbu->rcdev, count, offset);
> > +}
> > +
> > +static int sbu_memmap(struct cdev *cdev, void **map, int flags)
> > +{
> > + struct sbu *sbu = cdev->priv;
> > +
> > + return cdev_memmap(sbu->rcdev, map, flags);
> > +}
> > +
> > +static int sbu_truncate(struct cdev *cdev, size_t size)
> > +{
> > + struct sbu *sbu = cdev->priv;
> > +
> > + return cdev_truncate(sbu->rcdev, size);
> > +}
> > +
> > +static struct cdev_operations sbu_ops = {
> > + .read = sbu_read,
> > + .write = sbu_write,
> > + .ioctl = sbu_ioctl,
> > + .open = sbu_open,
> > + .close = sbu_close,
> > + .flush = sbu_flush,
> > + .erase = sbu_erase,
> > + .protect = sbu_protect,
> > + .discard_range = sbu_discard_range,
> > + .memmap = sbu_memmap,
> > + .truncate = sbu_truncate,
>
> Should be indented with tabs, right?
Right, fixed that.
Sascha
--
Pengutronix e.K. | |
Steuerwalder Str. 21 | http://www.pengutronix.de/ |
31137 Hildesheim, Germany | Phone: +49-5121-206917-0 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
More information about the barebox
mailing list