summaryrefslogtreecommitdiffstats
path: root/util.c
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2009-04-07 17:34:38 +1000
committerNeilBrown <neilb@suse.de>2009-04-07 17:34:38 +1000
commita7c6e3fb24f8335005a6ff8e0eb668faa257c941 (patch)
tree586861457108a56d57ffb64ea2672514e89a1c74 /util.c
parentb1b12d58194e42208e4828ea5818279c00a0ed18 (diff)
downloadmdadm-a7c6e3fb24f8335005a6ff8e0eb668faa257c941.tar.gz
mdadm-a7c6e3fb24f8335005a6ff8e0eb668faa257c941.tar.xz
mdadm-a7c6e3fb24f8335005a6ff8e0eb668faa257c941.zip
wait_for improvement.
wait not only for the name to appear, but for it to refer to the correct device. Sometimes old symlinks left lying around can be confusing. Signed-off-by: NeilBrown <neilb@suse.de>
Diffstat (limited to 'util.c')
-rw-r--r--util.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/util.c b/util.c
index 07738d0..02fc463 100644
--- a/util.c
+++ b/util.c
@@ -852,13 +852,20 @@ int same_dev(char *one, char *two)
return st1.st_rdev == st2.st_rdev;
}
-void wait_for(char *dev)
+void wait_for(char *dev, int fd)
{
int i;
+ struct stat stb_want;
+
+ if (fstat(fd, &stb_want) != 0 ||
+ (stb_want.st_mode & S_IFMT) != S_IFBLK)
+ return;
for (i=0 ; i<25 ; i++) {
struct stat stb;
- if (stat(dev, &stb) == 0)
+ if (stat(dev, &stb) == 0 &&
+ (stb.st_mode & S_IFMT) == S_IFBLK &&
+ (stb.st_rdev == stb_want.st_rdev))
return;
usleep(200000);
}