dm_suspend(): Stop holding the read lock around the while loop that
waits for pending io to complete.
--- diff/drivers/md/dm.c	2002-12-03 11:34:59.000000000 +0000
+++ source/drivers/md/dm.c	2002-12-03 15:11:27.000000000 +0000
@@ -776,15 +776,13 @@
 	}
 
 	set_bit(DMF_BLOCK_IO, &md->flags);
+	add_wait_queue(&md->wait, &wait);
 	up_write(&md->lock);
 
 	/*
 	 * Then we wait for the already mapped ios to
 	 * complete.
 	 */
-	down_read(&md->lock);
-
-	add_wait_queue(&md->wait, &wait);
 	while (1) {
 		set_current_state(TASK_INTERRUPTIBLE);
 
@@ -795,11 +793,11 @@
 	}
 
 	current->state = TASK_RUNNING;
-	remove_wait_queue(&md->wait, &wait);
-	up_read(&md->lock);
 
-	/* set_bit is atomic */
+	down_write(&md->lock);
+	remove_wait_queue(&md->wait, &wait);
 	set_bit(DMF_SUSPENDED, &md->flags);
+	up_write(&md->lock);
 
 	return 0;
 }