util: split get_maj_min() out from dev_open()

This allows other code to parse "8:3" style device names.

Signed-off-by: NeilBrown <neilb@suse.de>
This commit is contained in:
NeilBrown 2014-08-11 10:27:31 +10:00
parent 5dffd09d24
commit cc742d3807
2 changed files with 11 additions and 5 deletions

View File

@ -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);

15
util.c
View File

@ -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) {