[PATCH 1/3] blkid: add UBI volume support
Karel Zak
kzak at redhat.com
Wed Sep 2 05:24:02 EDT 2009
Hi Corentin,
On Mon, Aug 24, 2009 at 01:11:54PM +0200, Corentin Chary wrote:
> Probe UBI volume under /dev (or /devfs, /devices).
that's not elegant. Does it mean that UBI volumes are not in
/proc/partitions?
Ted, any comment?
> ubi_ctrl skip is hardcoded, maybe we should find a
> cleaner way to do that. Also change probe.c to handle
> char devices.
>
> Signed-off-by: Corentin Chary <corentincj at iksaif.net>
> ---
> shlibs/blkid/src/blkidP.h | 1 +
> shlibs/blkid/src/devname.c | 56 +++++++++++++++++++++++++++++++++++++++++++-
> shlibs/blkid/src/probe.c | 2 +
> 3 files changed, 58 insertions(+), 1 deletions(-)
>
> diff --git a/shlibs/blkid/src/blkidP.h b/shlibs/blkid/src/blkidP.h
> index e0e5cb8..8db6599 100644
> --- a/shlibs/blkid/src/blkidP.h
> +++ b/shlibs/blkid/src/blkidP.h
> @@ -237,6 +237,7 @@ extern char *blkid_strndup(const char *s, const int length);
> /*
> * Priority settings for different types of devices
> */
> +#define BLKID_PRI_UBI 50
> #define BLKID_PRI_DM 40
> #define BLKID_PRI_EVMS 30
> #define BLKID_PRI_LVM 20
> diff --git a/shlibs/blkid/src/devname.c b/shlibs/blkid/src/devname.c
> index ef686f4..cac13c5 100644
> --- a/shlibs/blkid/src/devname.c
> +++ b/shlibs/blkid/src/devname.c
> @@ -229,7 +229,9 @@ static void probe_one(blkid_cache cache, const char *ptname,
> dev->bid_devno == devno)
> goto set_pri;
>
> - if (stat(device, &st) == 0 && S_ISBLK(st.st_mode) &&
> + if (stat(device, &st) == 0 &&
> + (S_ISBLK(st.st_mode) ||
> + (S_ISCHR(st.st_mode) && !strncmp(ptname, "ubi", 3))) &&
> st.st_rdev == devno) {
> devname = blkid_strdup(device);
> goto get_dev;
> @@ -388,6 +390,57 @@ evms_probe_all(blkid_cache cache, int only_if_new)
> return num;
> }
>
> +static void
> +ubi_probe_all(blkid_cache cache, int only_if_new)
> +{
> + const char **dirname;
> +
> + for (dirname = dirlist; *dirname; dirname++) {
> + DBG(DEBUG_DEVNAME, printf("probing UBI volumes under %s\n",
> + *dirname));
> +
> + DIR *dir;
> + struct dirent *iter;
> +
> + dir = opendir(*dirname);
> + if (dir == NULL)
> + continue ;
> +
> + while ((iter = readdir(dir)) != NULL) {
> + char *name, *device;
> + struct stat st;
> + dev_t dev;
> +
> + name = iter->d_name;
> +
> + if (!strcmp(name, ".") || !strcmp(name, "..") ||
> + !strstr(name, "ubi"))
> + continue;
> + if (!strcmp(name, "ubi_ctrl"))
> + continue;
> + device = malloc(strlen(*dirname) + strlen(name) + 2);
> + if (!device)
> + break ;
> + sprintf(device, "%s/%s", *dirname, name);
> + if (stat(device, &st))
leak: free(device);
> + break ;
I hope one day we will convert whole libblkid to use openat(),
statat(), ... functions to avoid malloc() and sprintf() for paths :-)
> + if (!(st.st_rdev & 0xFF)) { // It's an UBI Device
> + free(device);
> + continue ;
> + }
> + dev = st.st_rdev;
> + DBG(DEBUG_DEVNAME, printf("UBI vol %s: devno 0x%04X\n",
> + device,
> + (int) dev));
> + probe_one(cache, name, dev, BLKID_PRI_UBI,
> + only_if_new);
> + free(device);
> + }
> + closedir(dir);
> + }
> +}
Karel
--
Karel Zak <kzak at redhat.com>
More information about the linux-mtd
mailing list