[PATCH 5/8] blk: blkmap: Add linear device mapping support
Simon Glass
sjg at chromium.org
Wed Feb 1 21:21:02 CET 2023
Hi Tobias,
On Wed, 1 Feb 2023 at 11:10, Tobias Waldekranz <tobias at waldekranz.com> wrote:
>
> Allow a slice of an existing block device to be mapped to a
> blkmap. This means that filesystems that are not stored at exact
> partition boundaries can be accessed by remapping a slice of the
> existing device to a blkmap device.
>
> Signed-off-by: Tobias Waldekranz <tobias at waldekranz.com>
> ---
> drivers/block/blkmap.c | 71 ++++++++++++++++++++++++++++++++++++++++++
> include/blkmap.h | 2 ++
> 2 files changed, 73 insertions(+)
>
> diff --git a/drivers/block/blkmap.c b/drivers/block/blkmap.c
> index c8c2dcac11..14d2ec3f78 100644
> --- a/drivers/block/blkmap.c
> +++ b/drivers/block/blkmap.c
> @@ -94,6 +94,77 @@ static int blkmap_add(struct blkmap *bm, struct blkmap_slice *new)
> return 0;
> }
>
> +struct blkmap_linear {
> + struct blkmap_slice slice;
> +
> + struct blk_desc *bd;
Please store the udevice * here. We are trying to avoid external use
of blk_desc.
> + lbaint_t blknr;
> +};
> +
> +static ulong blkmap_linear_read(struct blkmap *bm, struct blkmap_slice *bms,
> + lbaint_t blknr, lbaint_t blkcnt, void *buffer)
> +{
> + struct blkmap_linear *bml = container_of(bms, struct blkmap_linear, slice);
> +
> + return blk_dread(bml->bd, bml->blknr + blknr, blkcnt, buffer);
blk_read()
> +}
> +
> +static ulong blkmap_linear_write(struct blkmap *bm, struct blkmap_slice *bms,
> + lbaint_t blknr, lbaint_t blkcnt,
> + const void *buffer)
> +{
> + struct blkmap_linear *bml = container_of(bms, struct blkmap_linear, slice);
> +
> + return blk_dwrite(bml->bd, bml->blknr + blknr, blkcnt, buffer);
blk_write()
> +}
> +
> +int blkmap_map_linear(int devnum, lbaint_t blknr, lbaint_t blkcnt,
should take a struct udevice *, not a devnum
Finding should happen in the cmd.
> + enum uclass_id lcls, int ldevnum, lbaint_t lblknr)
> +{
> + struct blkmap_linear *linear;
> + struct blk_desc *bd, *lbd;
> + struct blkmap *bm;
> + int err;
> +
> + bm = blkmap_from_devnum(devnum);
> + if (!bm)
> + return -ENODEV;
> +
> + bd = dev_get_uclass_plat(bm->dev);
> + lbd = blk_get_devnum_by_uclass_id(lcls, ldevnum);
> + if (!lbd)
> + return -ENODEV;
> +
> + if (lbd->blksz != bd->blksz)
> + /* We could support block size translation, but we
> + * don't yet.
> + */
> + return -EINVAL;
> +
> + linear = malloc(sizeof(*linear));
> + if (!linear)
> + return -ENOMEM;
> +
> + *linear = (struct blkmap_linear) {
> + .slice = {
> + .blknr = blknr,
> + .blkcnt = blkcnt,
> +
> + .read = blkmap_linear_read,
> + .write = blkmap_linear_write,
> + },
> +
> + .bd = lbd,
> + .blknr = lblknr,
> + };
> +
> + err = blkmap_add(bm, &linear->slice);
> + if (err)
> + free(linear);
> +
> + return err;
> +}
> +
> struct blkmap_mem {
> struct blkmap_slice slice;
> void *addr;
> diff --git a/include/blkmap.h b/include/blkmap.h
> index a93611ff62..dca6e3fe6a 100644
> --- a/include/blkmap.h
> +++ b/include/blkmap.h
> @@ -9,6 +9,8 @@
>
> #include <stdbool.h>
>
> +int blkmap_map_linear(int devnum, lbaint_t blknr, lbaint_t blkcnt,
> + enum uclass_id lcls, int ldevnum, lbaint_t lblknr);
comments again
> int blkmap_map_mem(int devnum, lbaint_t blknr, lbaint_t blkcnt, void *addr);
> int blkmap_map_pmem(int devnum, lbaint_t blknr, lbaint_t blkcnt,
> phys_addr_t paddr);
> --
> 2.34.1
>
Regards,
Simon
More information about the U-Boot
mailing list