From patchwork Wed Jul 15 09:38:43 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Corentin Chary X-Patchwork-Id: 29804 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by bilbo.ozlabs.org (Postfix) with ESMTPS id 80953B70B0 for ; Wed, 15 Jul 2009 19:44:07 +1000 (EST) Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.69 #1 (Red Hat Linux)) id 1MR108-0002zv-Kb; Wed, 15 Jul 2009 09:42:12 +0000 Received: from iksaif.net ([88.191.73.63]) by bombadil.infradead.org with esmtp (Exim 4.69 #1 (Red Hat Linux)) id 1MR0zw-0002zW-6j for linux-mtd@lists.infradead.org; Wed, 15 Jul 2009 09:42:06 +0000 Received: from localhost.localdomain (cxr69-11-88-180-139-205.fbx.proxad.net [88.180.139.205]) (Authenticated sender: corentincj@iksaif.net) by iksaif.net (Postfix) with ESMTPA id 82CF2C9000E; Wed, 15 Jul 2009 11:45:08 +0200 (CEST) From: Corentin Chary To: tytso@mit.edu Subject: [PATCH 1/2] blkid: add UBI volume support Date: Wed, 15 Jul 2009 11:38:43 +0200 Message-Id: <1247650724-16288-2-git-send-email-corentincj@iksaif.net> X-Mailer: git-send-email 1.6.3.3 In-Reply-To: <1247650724-16288-1-git-send-email-corentincj@iksaif.net> References: <1247650724-16288-1-git-send-email-corentincj@iksaif.net> X-Spam-Score: 0.0 (/) Cc: Corentin Chary , linux-mtd@lists.infradead.org X-BeenThere: linux-mtd@lists.infradead.org X-Mailman-Version: 2.1.11 Precedence: list List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: linux-mtd-bounces@lists.infradead.org Errors-To: linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org Probe UBI volume under /dev (or /devfs, /devices). ubi_ctrl skip is hardcoded, maybe we should find a cleaner way to do that. Signed-off-by: Corentin Chary --- lib/blkid/blkidP.h | 1 + lib/blkid/devname.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 56 insertions(+), 1 deletions(-) diff --git a/lib/blkid/blkidP.h b/lib/blkid/blkidP.h index e0f11a0..baf82aa 100644 --- a/lib/blkid/blkidP.h +++ b/lib/blkid/blkidP.h @@ -117,6 +117,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/lib/blkid/devname.c b/lib/blkid/devname.c index b151354..70e85c5 100644 --- a/lib/blkid/devname.c +++ b/lib/blkid/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)) + break ; + + 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); + } +} + /* * Read the device data for all available block devices in the system. */ @@ -419,6 +472,7 @@ static int probe_all(blkid_cache cache, int only_if_new) #ifdef VG_DIR lvm_probe_all(cache, only_if_new); #endif + ubi_probe_all(cache, only_if_new); proc = fopen(PROC_PARTITIONS, "r"); if (!proc)