Lift vfs locking to dm_suspend/resume.
--- diff/drivers/md/dm-snapshot.c	2003-10-10 23:42:26.000000000 +0100
+++ source/drivers/md/dm-snapshot.c	2003-10-10 23:42:31.000000000 +0100
@@ -524,22 +524,17 @@
 		goto bad5;
 	}
 
-	/* Flush IO to the origin device */
-	fsync_dev_lockfs(s->origin->dev);
-
 	/* Add snapshot to the list of snapshots for this origin */
 	if (register_snapshot(s)) {
 		r = -EINVAL;
 		ti->error = "Cannot register snapshot origin";
 		goto bad6;
 	}
-	unlockfs(s->origin->dev);
 
 	ti->private = s;
 	return 0;
 
  bad6:
-	unlockfs(s->origin->dev);
 	kcopyd_client_destroy(s->kcopyd_client);
 
  bad5:
--- diff/drivers/md/dm.c	2003-10-10 23:41:25.000000000 +0100
+++ source/drivers/md/dm.c	2003-10-10 23:42:31.000000000 +0100
@@ -951,13 +951,23 @@
 	int r = 0;
 	DECLARE_WAITQUEUE(wait, current);
 
-	down_write(&md->lock);
+	/* Flush IO to the origin device */
+	down_read(&md->lock);
+	if (test_bit(DMF_BLOCK_IO, &md->flags)) {
+		up_read(&md->lock);
+		return -EINVAL;
+	}
+
+	fsync_dev_lockfs(md->dev);
+	up_read(&md->lock);
+
 
 	/*
-	 * First we set the BLOCK_IO flag so no more ios will be
-	 * mapped.
+	 * Set the BLOCK_IO flag so no more ios will be mapped.
 	 */
+	down_write(&md->lock);
 	if (test_bit(DMF_BLOCK_IO, &md->flags)) {
+		unlockfs(md->dev);
 		up_write(&md->lock);
 		return -EINVAL;
 	}
@@ -986,6 +996,7 @@
 
 	/* did we flush everything ? */
 	if (atomic_read(&md->pending)) {
+		unlockfs(md->dev);
 		clear_bit(DMF_BLOCK_IO, &md->flags);
 		r = -EINTR;
 	} else {
@@ -1017,6 +1028,7 @@
 	md->deferred = NULL;
 	up_write(&md->lock);
 
+	unlockfs(md->dev);
 	flush_deferred_io(def);
 	run_task_queue(&tq_disk);