From 06d2ffc3e266eea0cbd157ccc3e497c7b9f4bdd3 Mon Sep 17 00:00:00 2001 From: NeilBrown Date: Mon, 7 Jan 2013 10:17:04 +1100 Subject: [PATCH] conditionally remove map_dev from find_free_devnum map_dev can be slow so it is best to not call it when not necessary. The final test in "find_free_devnum" is not relevant when udev is being used, so remove the test in that case. Signed-off-by: NeilBrown --- lib.c | 13 +++++++++++++ mdadm.h | 1 + mdopen.c | 3 +-- util.c | 14 ++++++++------ 4 files changed, 23 insertions(+), 8 deletions(-) diff --git a/lib.c b/lib.c index 1c856541..8124fa1b 100644 --- a/lib.c +++ b/lib.c @@ -390,3 +390,16 @@ void print_escape(char *str) } } } + +int use_udev(void) +{ + static int use = -1; + struct stat stb; + + if (use < 0) { + use = ((stat("/dev/.udev", &stb) == 0 + || stat("/run/udev", &stb) == 0) + && check_env("MDADM_NO_UDEV") == 0); + } + return use; +} diff --git a/mdadm.h b/mdadm.h index 7adf7d94..be760d26 100644 --- a/mdadm.h +++ b/mdadm.h @@ -1217,6 +1217,7 @@ extern char *conf_line(FILE *file); extern char *conf_word(FILE *file, int allow_key); extern void print_quoted(char *str); extern void print_escape(char *str); +extern int use_udev(void); extern int conf_name_is_free(char *name); extern int conf_verify_devnames(struct mddev_ident *array_list); extern int devname_matches(char *name, char *match); diff --git a/mdopen.c b/mdopen.c index 24188df6..462743c4 100644 --- a/mdopen.c +++ b/mdopen.c @@ -330,8 +330,7 @@ int create_mddev(char *dev, char *name, int autof, int trustworthy, * If we cannot detect udev, we need to make * devices and links ourselves. */ - if ((stat("/dev/.udev", &stb) != 0 && stat("/run/udev", &stb) != 0) || - check_env("MDADM_NO_UDEV")) { + if (!use_udev()) { /* Make sure 'devname' exists and 'chosen' is a symlink to it */ if (lstat(devname, &stb) == 0) { /* Must be the correct device, else error */ diff --git a/util.c b/util.c index 6c10365e..70ab6f12 100644 --- a/util.c +++ b/util.c @@ -839,7 +839,6 @@ int find_free_devnum(int use_partitions) int devnum; for (devnum = 127; devnum != 128; devnum = devnum ? devnum-1 : (1<<20)-1) { - char *dn; int _devnum; char nbuf[50]; @@ -849,11 +848,14 @@ int find_free_devnum(int use_partitions) sprintf(nbuf, "%s%d", use_partitions?"mdp":"md", devnum); if (!conf_name_is_free(nbuf)) continue; - /* make sure it is new to /dev too, at least as a - * non-standard */ - dn = map_dev(dev2major(_devnum), dev2minor(_devnum), 0); - if (dn && ! is_standard(dn, NULL)) - continue; + if (!use_udev()) { + /* make sure it is new to /dev too, at least as a + * non-standard */ + char *dn = map_dev(dev2major(_devnum), + dev2minor(_devnum), 0); + if (dn && ! is_standard(dn, NULL)) + continue; + } break; } if (devnum == 128) -- 2.39.2