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:
parent
5dffd09d24
commit
cc742d3807
1
mdadm.h
1
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);
|
||||
|
|
15
util.c
15
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) {
|
||||
|
|
Loading…
Reference in New Issue