mdmon: pass symbolic name to mdmon instead of device name.
Now that names in /dev are usually created (eventually) by udev, it isn't really safe to rely in finding a name in /dev to pass to mdmon to identify which array to monitor. And it isn't really necessary to have a name in /dev. So just pass the symbolic name, e.g. md127 or md123. Change util.c to pass that name, and change mdmon to process the name sensibly. Signed-off-by: NeilBrown <neilb@suse.de>
This commit is contained in:
parent
bf68e9d9ab
commit
e8a70c8958
2
mdadm.h
2
mdadm.h
|
@ -634,7 +634,6 @@ struct supertype {
|
||||||
* external:/md0/12
|
* external:/md0/12
|
||||||
*/
|
*/
|
||||||
int devcnt;
|
int devcnt;
|
||||||
char *device_name; /* e.g. /dev/md/whatever */
|
|
||||||
|
|
||||||
struct mdinfo *devs;
|
struct mdinfo *devs;
|
||||||
|
|
||||||
|
@ -761,6 +760,7 @@ extern int check_raid(int fd, char *name);
|
||||||
|
|
||||||
extern int get_mdp_major(void);
|
extern int get_mdp_major(void);
|
||||||
extern int dev_open(char *dev, int flags);
|
extern int dev_open(char *dev, int flags);
|
||||||
|
extern int open_dev(int devnum);
|
||||||
extern int open_dev_excl(int devnum);
|
extern int open_dev_excl(int devnum);
|
||||||
extern int is_standard(char *dev, int *nump);
|
extern int is_standard(char *dev, int *nump);
|
||||||
extern int same_dev(char *one, char *two);
|
extern int same_dev(char *one, char *two);
|
||||||
|
|
17
mdmon.c
17
mdmon.c
|
@ -287,6 +287,8 @@ int main(int argc, char *argv[])
|
||||||
int ignore;
|
int ignore;
|
||||||
char *container_name = NULL;
|
char *container_name = NULL;
|
||||||
char *switchroot = NULL;
|
char *switchroot = NULL;
|
||||||
|
int devnum;
|
||||||
|
char *devname;
|
||||||
|
|
||||||
switch (argc) {
|
switch (argc) {
|
||||||
case 2:
|
case 2:
|
||||||
|
@ -304,7 +306,14 @@ int main(int argc, char *argv[])
|
||||||
usage();
|
usage();
|
||||||
}
|
}
|
||||||
|
|
||||||
mdfd = open(container_name, O_RDWR);
|
devnum = devname2devnum(container_name);
|
||||||
|
devname = devnum2devname(devnum);
|
||||||
|
if (strcmp(container_name, devname) != 0) {
|
||||||
|
fprintf(stderr, "mdmon: %s is not a valid md device name\n",
|
||||||
|
container_name);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
mdfd = open_dev(devnum);
|
||||||
if (mdfd < 0) {
|
if (mdfd < 0) {
|
||||||
fprintf(stderr, "mdmon: %s: %s\n", container_name,
|
fprintf(stderr, "mdmon: %s: %s\n", container_name,
|
||||||
strerror(errno));
|
strerror(errno));
|
||||||
|
@ -342,9 +351,8 @@ int main(int argc, char *argv[])
|
||||||
pfd[0] = pfd[1] = -1;
|
pfd[0] = pfd[1] = -1;
|
||||||
|
|
||||||
container = malloc(sizeof(*container));
|
container = malloc(sizeof(*container));
|
||||||
container->devnum = fd2devnum(mdfd);
|
container->devnum = devnum;
|
||||||
container->devname = devnum2devname(container->devnum);
|
container->devname = devname;
|
||||||
container->device_name = container_name;
|
|
||||||
container->arrays = NULL;
|
container->arrays = NULL;
|
||||||
|
|
||||||
if (!container->devname) {
|
if (!container->devname) {
|
||||||
|
@ -462,6 +470,7 @@ int main(int argc, char *argv[])
|
||||||
container_name);
|
container_name);
|
||||||
exit(3);
|
exit(3);
|
||||||
}
|
}
|
||||||
|
close(mdfd);
|
||||||
|
|
||||||
/* Ok, this is close enough. We can say goodbye to our parent now.
|
/* Ok, this is close enough. We can say goodbye to our parent now.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -469,7 +469,7 @@ static int wait_and_act(struct supertype *container, int nowait)
|
||||||
* problem as there are no active arrays, there is
|
* problem as there are no active arrays, there is
|
||||||
* nothing that we need to be ready to do.
|
* nothing that we need to be ready to do.
|
||||||
*/
|
*/
|
||||||
int fd = open(container->device_name, O_RDONLY|O_EXCL);
|
int fd = open_dev_excl(container->devnum);
|
||||||
if (fd >= 0 || errno != EBUSY) {
|
if (fd >= 0 || errno != EBUSY) {
|
||||||
/* OK, we are safe to leave */
|
/* OK, we are safe to leave */
|
||||||
if (sigterm && !dirty_arrays)
|
if (sigterm && !dirty_arrays)
|
||||||
|
|
13
util.c
13
util.c
|
@ -813,6 +813,14 @@ int dev_open(char *dev, int flags)
|
||||||
return fd;
|
return fd;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int open_dev(int devnum)
|
||||||
|
{
|
||||||
|
char buf[20];
|
||||||
|
|
||||||
|
sprintf(buf, "%d:%d", dev2major(devnum), dev2minor(devnum));
|
||||||
|
return dev_open(buf, O_RDWR);
|
||||||
|
}
|
||||||
|
|
||||||
int open_dev_excl(int devnum)
|
int open_dev_excl(int devnum)
|
||||||
{
|
{
|
||||||
char buf[20];
|
char buf[20];
|
||||||
|
@ -1261,9 +1269,8 @@ int start_mdmon(int devnum)
|
||||||
for (i=0; paths[i]; i++)
|
for (i=0; paths[i]; i++)
|
||||||
if (paths[i][0])
|
if (paths[i][0])
|
||||||
execl(paths[i], "mdmon",
|
execl(paths[i], "mdmon",
|
||||||
map_dev(dev2major(devnum),
|
devnum2devname(devnum),
|
||||||
dev2minor(devnum),
|
NULL);
|
||||||
1), NULL);
|
|
||||||
exit(1);
|
exit(1);
|
||||||
case -1: fprintf(stderr, Name ": cannot run mdmon. "
|
case -1: fprintf(stderr, Name ": cannot run mdmon. "
|
||||||
"Array remains readonly\n");
|
"Array remains readonly\n");
|
||||||
|
|
Loading…
Reference in New Issue