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);
|
unsigned long long size);
|
||||||
|
|
||||||
extern int get_mdp_major(void);
|
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 dev_open(char *dev, int flags);
|
||||||
extern int open_dev(char *devnm);
|
extern int open_dev(char *devnm);
|
||||||
extern void reopen_mddev(int mdfd);
|
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) */
|
#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)
|
int dev_open(char *dev, int flags)
|
||||||
{
|
{
|
||||||
/* like 'open', but if 'dev' matches %d:%d, create a temp
|
/* like 'open', but if 'dev' matches %d:%d, create a temp
|
||||||
* block device and open that
|
* block device and open that
|
||||||
*/
|
*/
|
||||||
char *e;
|
|
||||||
int fd = -1;
|
int fd = -1;
|
||||||
char devname[32];
|
char devname[32];
|
||||||
int major;
|
int major;
|
||||||
|
@ -885,10 +893,7 @@ int dev_open(char *dev, int flags)
|
||||||
if (!dev) return -1;
|
if (!dev) return -1;
|
||||||
flags |= O_DIRECT;
|
flags |= O_DIRECT;
|
||||||
|
|
||||||
major = strtoul(dev, &e, 0);
|
if (get_maj_min(dev, &major, &minor)) {
|
||||||
if (e > dev && *e == ':' && e[1] &&
|
|
||||||
(minor = strtoul(e+1, &e, 0)) >= 0 &&
|
|
||||||
*e == 0) {
|
|
||||||
snprintf(devname, sizeof(devname), "/dev/.tmp.md.%d:%d:%d",
|
snprintf(devname, sizeof(devname), "/dev/.tmp.md.%d:%d:%d",
|
||||||
(int)getpid(), major, minor);
|
(int)getpid(), major, minor);
|
||||||
if (mknod(devname, S_IFBLK|0600, makedev(major, minor)) == 0) {
|
if (mknod(devname, S_IFBLK|0600, makedev(major, minor)) == 0) {
|
||||||
|
|
Loading…
Reference in New Issue