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; }