From 523c5b80ca91bb6866552a9e5f5b6521a457bd11 Mon Sep 17 00:00:00 2001 From: root Date: Mon, 16 May 2005 23:45:49 +0200 Subject: [PATCH] [libmultipath] uevents delivery is too fast for sysfs files creation to complete before we try to use them in discovery.c The problem is well known to udev developpers, so merge their wait loop in discovery.c --- libmultipath/discovery.c | 33 +++++++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/libmultipath/discovery.c b/libmultipath/discovery.c index 0a88f04..41ecc10 100644 --- a/libmultipath/discovery.c +++ b/libmultipath/discovery.c @@ -2,6 +2,7 @@ #include #include #include +#include #include #include @@ -98,6 +99,26 @@ out: return r; } +#define WAIT_MAX_SECONDS 5 +#define WAIT_LOOP_PER_SECOND 5 + +static int +wait_sysfs_attr (char * filename) +{ + int loop; + struct stat stats; + + loop = WAIT_MAX_SECONDS * WAIT_LOOP_PER_SECOND; + + while (--loop) { + if (stat(filename, &stats) == 0) + return 0; + + usleep(1000 * 1000 / WAIT_LOOP_PER_SECOND); + } + return 1; +} + #define declare_sysfs_get_str(fname, fmt) \ extern int \ sysfs_get_##fname (char * sysfs_path, char * dev, char * buff, int len) \ @@ -106,8 +127,12 @@ sysfs_get_##fname (char * sysfs_path, char * dev, char * buff, int len) \ char attr_buff[SYSFS_PATH_SIZE]; \ int attr_len; \ \ - if(safe_sprintf(attr_path, fmt, sysfs_path, dev)) \ + if (safe_sprintf(attr_path, fmt, sysfs_path, dev)) \ + return 1; \ +\ + if (wait_sysfs_attr(attr_path)) \ return 1; \ +\ if (0 > sysfs_read_attribute_value(attr_path, attr_buff, sizeof(attr_buff))) \ return 1; \ \ @@ -132,8 +157,12 @@ sysfs_get_##fname (char * sysfs_path, char * dev) \ char attr_path[SYSFS_PATH_SIZE]; \ char attr_buff[SYSFS_PATH_SIZE]; \ \ - if(safe_sprintf(attr_path, fmt, sysfs_path, dev)) \ + if (safe_sprintf(attr_path, fmt, sysfs_path, dev)) \ + return 0; \ +\ + if (wait_sysfs_attr(attr_path)) \ return 0; \ +\ if (0 > sysfs_read_attribute_value(attr_path, attr_buff, sizeof(attr_buff))) \ return 0; \ \ -- 2.7.4