66 lines
1.7 KiB
Diff
66 lines
1.7 KiB
Diff
|
--- mdadm-3.1.2/Incremental.c.lock 2010-07-20 17:21:41.879217630 -0400
|
||
|
+++ mdadm-3.1.2/Incremental.c 2010-07-20 17:21:41.916342431 -0400
|
||
|
@@ -285,7 +285,9 @@ int Incremental(char *devname, int verbo
|
||
|
|
||
|
/* 4/ Check if array exists.
|
||
|
*/
|
||
|
- map_lock(&map);
|
||
|
+ if (map_lock(&map))
|
||
|
+ fprintf(stderr, Name ": failed to get exclusive lock on "
|
||
|
+ "mapfile\n");
|
||
|
mp = map_by_uuid(&map, info.uuid);
|
||
|
if (mp)
|
||
|
mdfd = open_dev(mp->devnum);
|
||
|
@@ -769,7 +771,9 @@ int Incremental_container(struct superty
|
||
|
struct mdinfo *ra;
|
||
|
struct map_ent *map = NULL;
|
||
|
|
||
|
- map_lock(&map);
|
||
|
+ if (map_lock(&map))
|
||
|
+ fprintf(stderr, Name ": failed to get exclusive lock on "
|
||
|
+ "mapfile\n");
|
||
|
|
||
|
for (ra = list ; ra ; ra = ra->next) {
|
||
|
int mdfd;
|
||
|
--- mdadm-3.1.2/mapfile.c.lock 2010-07-20 17:21:41.687217302 -0400
|
||
|
+++ mdadm-3.1.2/mapfile.c 2010-07-20 17:23:23.038096346 -0400
|
||
|
@@ -58,7 +58,7 @@ char *mapname[2][3] = {
|
||
|
};
|
||
|
char *mapdir[2] = { MAP_DIR, NULL };
|
||
|
|
||
|
-int mapmode[3] = { O_RDONLY, O_RDWR|O_CREAT, O_RDWR|O_CREAT|O_TRUNC };
|
||
|
+int mapmode[3] = { O_RDONLY, O_RDWR|O_CREAT, O_RDWR|O_CREAT|O_EXCL };
|
||
|
char *mapsmode[3] = { "r", "w", "w"};
|
||
|
|
||
|
FILE *open_map(int modenum, int *choice)
|
||
|
@@ -120,14 +120,11 @@ static int lwhich = 0;
|
||
|
int map_lock(struct map_ent **melp)
|
||
|
{
|
||
|
if (lf == NULL) {
|
||
|
- lf = open_map(2, &lwhich);
|
||
|
+ do {
|
||
|
+ lf = open_map(2, &lwhich);
|
||
|
+ } while (lf == NULL && errno == EEXIST);
|
||
|
if (lf == NULL)
|
||
|
return -1;
|
||
|
- if (flock(fileno(lf), LOCK_EX) != 0) {
|
||
|
- fclose(lf);
|
||
|
- lf = NULL;
|
||
|
- return -1;
|
||
|
- }
|
||
|
}
|
||
|
if (*melp)
|
||
|
map_free(*melp);
|
||
|
@@ -137,10 +134,7 @@ int map_lock(struct map_ent **melp)
|
||
|
|
||
|
void map_unlock(struct map_ent **melp)
|
||
|
{
|
||
|
- if (lf) {
|
||
|
- flock(fileno(lf), LOCK_UN);
|
||
|
- fclose(lf);
|
||
|
- }
|
||
|
+ fclose(lf);
|
||
|
unlink(mapname[lwhich][2]);
|
||
|
lf = NULL;
|
||
|
}
|