--- linux-last//drivers/md/dm.c	Tue Nov  6 14:44:22 2001
+++ linux/drivers/md/dm.c	Tue Nov  6 16:22:10 2001
@@ -395,7 +395,7 @@
 	 * If we're suspended we have to queue
 	 * this io for later.
 	 */
-	if (md->suspended) {
+	while (md->suspended) {
 		ru;
 		r = queue_io(md, bh, rw);
 
@@ -405,7 +405,13 @@
 		else if (r > 0)
 			return 0; /* deferred successfully */
 
-		rl;	/* FIXME: there's still a race here */
+		/*
+		 * We're in a while loop, because
+		 * someone could suspend before we
+		 * get to the following read
+		 * lock
+		 */
+		rl;
 	}
 
 	if (!__map_buffer(md, bh, rw, __find_node(md->map, bh)))
@@ -817,14 +823,15 @@
  * requeue the deferred buffer_heads by calling
  * generic_make_request.
  */
-static void __flush_deferred_io(struct mapped_device *md)
+static void flush_deferred_io(struct deferred_io *c)
 {
-	struct deferred_io *c, *n;
+	struct deferred_io *n;
 
-	for (c = md->deferred, md->deferred = 0; c; c = n) {
+	while (c) {
 		n = c->next;
 		generic_make_request(c->rw, c->bh);
 		free_deferred(c);
+		c = n;
 	}
 }
 
@@ -900,6 +907,8 @@
 
 int dm_resume(struct mapped_device *md)
 {
+	struct deferred_io *def;
+
 	wl;
 	if (!md->suspended) {
 		wu;
@@ -907,8 +916,11 @@
 	}
 
 	md->suspended = 0;
-	__flush_deferred_io(md);
+	def = md->deferred;
+	md->deferred = NULL;
 	wu;
+
+	flush_deferred_io(def);
 
 	return 0;
 }
--- linux-last//drivers/md/dm-ioctl.c	Tue Nov  6 15:00:39 2001
+++ linux/drivers/md/dm-ioctl.c	Tue Nov  6 15:01:11 2001
@@ -171,10 +171,7 @@
 	if (!md)
 		return -ENXIO;
 
-	if (param->suspend)
-		return dm_suspend(md);
-
-	return dm_resume(md);
+	return param->suspend ? dm_suspend(md) : dm_resume(md);
 }
 
 static int reload(struct dm_ioctl *param)
