X-Git-Url: http://git.ipfire.org/?p=thirdparty%2Fmdadm.git;a=blobdiff_plain;f=mdopen.c;h=7f6a2ea431d81e07d6228218e9cce5c1c21489cb;hp=ec34e916f8e9fdd996c88616e582f18f4aa55c2e;hb=767bd452981d5fae96487b1394f9d1ff535a3127;hpb=62552fdfccf7db17edb136e504703e6b18cec72a diff --git a/mdopen.c b/mdopen.c index ec34e916..7f6a2ea4 100644 --- a/mdopen.c +++ b/mdopen.c @@ -302,6 +302,7 @@ int open_mddev_devnum(char *devname, int devnum, char *name, char *chosen_name) */ int major_num, minor_num; struct stat stb; + int i; if (devname) strcpy(chosen_name, devname); @@ -353,5 +354,17 @@ int open_mddev_devnum(char *devname, int devnum, char *name, char *chosen_name) } /* FIXME chown/chmod ?? */ } - return open(chosen_name, O_RDWR); + + /* Simple locking to avoid --incr being called for the same + * array multiple times in parallel. + */ + for (i = 0; i < 25 ; i++) { + int fd; + + fd = open(chosen_name, O_RDWR|O_EXCL); + if (fd >= 0 || errno != EBUSY) + return fd; + usleep(200000); + } + return -1; }