diff options
author | NeilBrown <neilb@suse.de> | 2009-04-07 17:34:38 +1000 |
---|---|---|
committer | NeilBrown <neilb@suse.de> | 2009-04-07 17:34:38 +1000 |
commit | a7c6e3fb24f8335005a6ff8e0eb668faa257c941 (patch) | |
tree | 586861457108a56d57ffb64ea2672514e89a1c74 /util.c | |
parent | b1b12d58194e42208e4828ea5818279c00a0ed18 (diff) | |
download | mdadm-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.c | 11 |
1 files changed, 9 insertions, 2 deletions
@@ -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); } |