diff --git a/mdadm-3.1.2-lock.patch b/mdadm-3.1.2-lock.patch new file mode 100644 index 0000000..8d90870 --- /dev/null +++ b/mdadm-3.1.2-lock.patch @@ -0,0 +1,65 @@ +--- 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; + } diff --git a/mdadm.spec b/mdadm.spec index ed92794..3b49c23 100644 --- a/mdadm.spec +++ b/mdadm.spec @@ -1,13 +1,14 @@ Summary: The mdadm program controls Linux md devices (software RAID arrays) Name: mdadm Version: 3.1.3 -Release: 0.git07202010.1%{?dist} +Release: 0.git07202010.2%{?dist} Source: http://www.kernel.org/pub/linux/utils/raid/mdadm/mdadm-%{version}-git07202010.tar.bz2 Source1: mdmonitor.init Source2: raid-check Source3: mdadm.rules Source4: mdadm-raid-check-sysconfig Patch0: mdadm-3.1.3-read.patch +PAtch1: mdadm-3.1.2-lock.patch Patch20: mdadm-2.5.2-static.patch URL: http://www.kernel.org/pub/linux/utils/raid/mdadm/ License: GPLv2+ @@ -30,6 +31,7 @@ file can be used to help with some common tasks. %prep %setup -q -n mdadm-3.1.3-git07202010 %patch0 -p1 -b .read +%patch1 -p1 -b .lock %patch20 -p1 -b .static %build @@ -75,6 +77,9 @@ fi %attr(0700,root,root) %dir /var/run/mdadm %changelog +* Tue Jul 20 2010 Doug Ledford - 3.1.3-0.git07202010.2 +- Fix racy locking of mapfile (bz616596) + * Tue Jul 20 2010 Doug Ledford - 3.1.3-0.git07202010.1 - Update to latest git repo (3.1.2 plus pending changes, fixes bz602457) - Add in 64-md-raid.rules to compensate for it no longer being in udev