From cc742d38071c631311309b68b51f8938cdf916be Mon Sep 17 00:00:00 2001 From: NeilBrown Date: Mon, 11 Aug 2014 10:27:31 +1000 Subject: util: split get_maj_min() out from dev_open() This allows other code to parse "8:3" style device names. Signed-off-by: NeilBrown --- mdadm.h | 1 + util.c | 15 ++++++++++----- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/mdadm.h b/mdadm.h index dc3c107d..fc1fd318 100644 --- a/mdadm.h +++ b/mdadm.h @@ -1283,6 +1283,7 @@ extern int check_partitions(int fd, char *dname, unsigned long long size); extern int get_mdp_major(void); +extern int get_maj_min(char *dev, int *major, int *minor); extern int dev_open(char *dev, int flags); extern int open_dev(char *devnm); extern void reopen_mddev(int mdfd); diff --git a/util.c b/util.c index 7937eb6e..37c6e0d3 100644 --- a/util.c +++ b/util.c @@ -871,12 +871,20 @@ void put_md_name(char *name) } #endif /* !defined(MDASSEMBLE) || defined(MDASSEMBLE) && defined(MDASSEMBLE_AUTO) */ +int get_maj_min(char *dev, int *major, int *minor) +{ + char *e; + *major = strtoul(dev, &e, 0); + return (e > dev && *e == ':' && e[1] && + (*minor = strtoul(e+1, &e, 0)) >= 0 && + *e == 0); +} + int dev_open(char *dev, int flags) { /* like 'open', but if 'dev' matches %d:%d, create a temp * block device and open that */ - char *e; int fd = -1; char devname[32]; int major; @@ -885,10 +893,7 @@ int dev_open(char *dev, int flags) if (!dev) return -1; flags |= O_DIRECT; - major = strtoul(dev, &e, 0); - if (e > dev && *e == ':' && e[1] && - (minor = strtoul(e+1, &e, 0)) >= 0 && - *e == 0) { + if (get_maj_min(dev, &major, &minor)) { snprintf(devname, sizeof(devname), "/dev/.tmp.md.%d:%d:%d", (int)getpid(), major, minor); if (mknod(devname, S_IFBLK|0600, makedev(major, minor)) == 0) { -- cgit v1.2.3