]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - util.c
Subject: Make wait_for and open_dev_excl faster
[thirdparty/mdadm.git] / util.c
diff --git a/util.c b/util.c
index 3ac63e3a7ff2ae27d1d3c88a13631b92481dc5cf..a9aaea48d7644565228958f236d3a028c752b72f 100644 (file)
--- a/util.c
+++ b/util.c
@@ -778,7 +778,6 @@ int get_data_disks(int level, int layout, int raid_disks)
        return data_disks;
 }
 
-
 int devnm2devid(char *devnm)
 {
        /* First look in /sys/block/$DEVNM/dev for %d:%d
@@ -963,6 +962,7 @@ int open_dev_excl(char *devnm)
        int i;
        int flags = O_RDWR;
        int devid = devnm2devid(devnm);
+       long delay = 1000;
 
        sprintf(buf, "%d:%d", major(devid), minor(devid));
        for (i = 0 ; i < 25 ; i++) {
@@ -975,7 +975,9 @@ int open_dev_excl(char *devnm)
                }
                if (errno != EBUSY)
                        return fd;
-               usleep(200000);
+               usleep(delay);
+               if (delay < 200000)
+                       delay *= 2;
        }
        return -1;
 }
@@ -998,6 +1000,7 @@ void wait_for(char *dev, int fd)
 {
        int i;
        struct stat stb_want;
+       long delay = 1000;
 
        if (fstat(fd, &stb_want) != 0 ||
            (stb_want.st_mode & S_IFMT) != S_IFBLK)
@@ -1009,7 +1012,9 @@ void wait_for(char *dev, int fd)
                    (stb.st_mode & S_IFMT) == S_IFBLK &&
                    (stb.st_rdev == stb_want.st_rdev))
                        return;
-               usleep(200000);
+               usleep(delay);
+               if (delay < 200000)
+                       delay *= 2;
        }
        if (i == 25)
                dprintf("%s: timeout waiting for %s\n", __func__, dev);
@@ -1798,16 +1803,6 @@ int start_mdmon(char *devnm)
        return 0;
 }
 
-int check_env(char *name)
-{
-       char *val = getenv(name);
-
-       if (val && atoi(val) == 1)
-               return 1;
-
-       return 0;
-}
-
 __u32 random32(void)
 {
        __u32 rv;