----- Ursprüngliche Mail ----- > Von: "Daniel Golle" <daniel@xxxxxxxxxxxxxx> > An: "Randy Dunlap" <rdunlap@xxxxxxxxxxxxx>, "Miquel Raynal" <miquel.raynal@xxxxxxxxxxx>, "richard" <richard@xxxxxx>, > "Vignesh Raghavendra" <vigneshr@xxxxxx>, "Rob Herring" <robh+dt@xxxxxxxxxx>, "Krzysztof Kozlowski" > <krzysztof.kozlowski+dt@xxxxxxxxxx>, "Conor Dooley" <conor+dt@xxxxxxxxxx>, "Daniel Golle" <daniel@xxxxxxxxxxxxxx>, > "linux-mtd" <linux-mtd@xxxxxxxxxxxxxxxxxxx>, "devicetree" <devicetree@xxxxxxxxxxxxxxx>, "linux-kernel" > <linux-kernel@xxxxxxxxxxxxxxx> > Gesendet: Freitag, 11. August 2023 03:37:31 > Betreff: [PATCH v4 4/8] mtd: ubi: block: use notifier to create ubiblock > Use UBI_VOLUME_ADDED notification to create ubiblock device specified > on kernel cmdline or module parameter. > This makes thing more simple and has the advantage that ubiblock devices *things > on volumes which are not present at the time the ubi module is probed > will still be created. > > Suggested-by: Zhihao Cheng <chengzhihao1@xxxxxxxxxx> > Signed-off-by: Daniel Golle <daniel@xxxxxxxxxxxxxx> > --- > drivers/mtd/ubi/block.c | 152 ++++++++++++++++++++++------------------ > 1 file changed, 84 insertions(+), 68 deletions(-) > > diff --git a/drivers/mtd/ubi/block.c b/drivers/mtd/ubi/block.c > index 69fa6fecb8494..e0618bbde3613 100644 > --- a/drivers/mtd/ubi/block.c > +++ b/drivers/mtd/ubi/block.c > @@ -33,6 +33,7 @@ > #include <linux/kernel.h> > #include <linux/list.h> > #include <linux/mutex.h> > +#include <linux/namei.h> > #include <linux/slab.h> > #include <linux/mtd/ubi.h> > #include <linux/blkdev.h> > @@ -65,10 +66,10 @@ struct ubiblock_pdu { > }; > > /* Numbers of elements set in the @ubiblock_param array */ > -static int ubiblock_devs __initdata; > +static int ubiblock_devs; > > /* MTD devices specification parameters */ > -static struct ubiblock_param ubiblock_param[UBIBLOCK_MAX_DEVICES] __initdata; > +static struct ubiblock_param ubiblock_param[UBIBLOCK_MAX_DEVICES]; > > struct ubiblock { > struct ubi_volume_desc *desc; > @@ -532,6 +533,85 @@ static int ubiblock_resize(struct ubi_volume_info *vi) > return 0; > } > > +static bool > +match_volume_desc(struct ubi_volume_info *vi, const char *name, int ubi_num, > int vol_id) > +{ > + int err, len; > + struct path path; > + struct kstat stat; > + > + if (ubi_num == -1) { > + /* No ubi num, name must be a vol device path */ > + err = kern_path(name, LOOKUP_FOLLOW, &path); > + if (err) > + return false; > + > + err = vfs_getattr(&path, &stat, STATX_TYPE, AT_STATX_SYNC_AS_STAT); > + path_put(&path); > + if (err) > + return false; > + > + if (!S_ISCHR(stat.mode)) > + return false; > + > + if (vi->ubi_num != ubi_major2num(MAJOR(stat.rdev))) > + return false; > + > + if (vi->vol_id != MINOR(stat.rdev) - 1) > + return false; > + This is more or less an open coded ubi_open_volume_path(). Please either split or adopt ubi_open_volume_path() to fit your use case. > + return true; > + } > + > + if (vol_id == -1) { > + if (vi->ubi_num != ubi_num) > + return false; > + > + len = strnlen(name, UBI_VOL_NAME_MAX + 1); > + if (len < 1 || vi->name_len != len) > + return false; > + > + if (strcmp(name, vi->name)) > + return false; > + > + return true; > + } Same for ubi_open_volume_nm(). Thanks, //richard