rpms/mdadm/devel mdadm-3.1.2-lock.patch, NONE, 1.1 mdadm.spec, 1.96, 1.97

Doug Ledford dledford at fedoraproject.org
Tue Jul 20 21:51:07 UTC 2010


Author: dledford

Update of /cvs/extras/rpms/mdadm/devel
In directory cvs01.phx2.fedoraproject.org:/tmp/cvs-serv6594

Modified Files:
	mdadm.spec 
Added Files:
	mdadm-3.1.2-lock.patch 
Log Message:
* Tue Jul 20 2010 Doug Ledford <dledford at redhat.com> - 3.1.3-0.git07202010.2
- Fix racy locking of mapfile (bz616596)


mdadm-3.1.2-lock.patch:
 Incremental.c |    8 ++++++--
 mapfile.c     |   16 +++++-----------
 2 files changed, 11 insertions(+), 13 deletions(-)

--- NEW FILE mdadm-3.1.2-lock.patch ---
--- 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;
 }


Index: mdadm.spec
===================================================================
RCS file: /cvs/extras/rpms/mdadm/devel/mdadm.spec,v
retrieving revision 1.96
retrieving revision 1.97
diff -u -p -r1.96 -r1.97
--- mdadm.spec	20 Jul 2010 16:57:55 -0000	1.96
+++ mdadm.spec	20 Jul 2010 21:51:06 -0000	1.97
@@ -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 commo
 %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 <dledford at redhat.com> - 3.1.3-0.git07202010.2
+- Fix racy locking of mapfile (bz616596)
+
 * Tue Jul 20 2010 Doug Ledford <dledford at redhat.com> - 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



More information about the scm-commits mailing list