Reverse out the VFS lock patch.
--- diff/drivers/md/dm.c	2004-04-06 15:54:21.195284648 +0100
+++ source/drivers/md/dm.c	2004-04-06 15:54:23.025006488 +0100
@@ -910,7 +910,7 @@ static int __lock_fs(struct mapped_devic
 		return -ENOMEM;
 	}
 
-	fsync_bdev_lockfs(bdev);
+	//fsync_bdev_lockfs(bdev);
 	bdput(bdev);
 	return 0;
 }
@@ -928,7 +928,7 @@ static int __unlock_fs(struct mapped_dev
 		return -ENOMEM;
 	}
 
-	unlockfs(bdev);
+	//unlockfs(bdev);
 	bdput(bdev);
 	return 0;
 }
--- diff/fs/block_dev.c	2004-04-06 15:54:19.312570864 +0100
+++ source/fs/block_dev.c	2004-04-06 15:54:23.025006488 +0100
@@ -251,7 +251,6 @@ static void init_once(void * foo, kmem_c
 	{
 		memset(bdev, 0, sizeof(*bdev));
 		sema_init(&bdev->bd_sem, 1);
-		sema_init(&bdev->bd_mount_sem, 1);
 		INIT_LIST_HEAD(&bdev->bd_inodes);
 		INIT_LIST_HEAD(&bdev->bd_list);
 		inode_init_once(&ei->vfs_inode);
--- diff/fs/buffer.c	2004-04-06 15:54:19.314570560 +0100
+++ source/fs/buffer.c	2004-04-06 15:54:23.027006184 +0100
@@ -263,17 +263,6 @@ int fsync_bdev(struct block_device *bdev
 	return sync_blockdev(bdev);
 }
 
-int fsync_bdev_lockfs(struct block_device *bdev)
-{
-	int res;
-	res = fsync_bdev(bdev);
-	if (res)
-		return res;
-	sync_super_lockfs(bdev);
-	return sync_blockdev(bdev);
-}
-EXPORT_SYMBOL(fsync_bdev_lockfs);
-
 /*
  * sync everything.  Start out by waking pdflush, because that writes back
  * all queues in parallel.
--- diff/fs/reiserfs/super.c	2004-04-06 15:54:19.315570408 +0100
+++ source/fs/reiserfs/super.c	2004-04-06 15:54:23.028006032 +0100
@@ -86,7 +86,7 @@ static void reiserfs_write_super_lockfs 
     reiserfs_prepare_for_journal(s, SB_BUFFER_WITH_SB(s), 1);
     journal_mark_dirty(&th, s, SB_BUFFER_WITH_SB (s));
     reiserfs_block_writes(&th) ;
-    journal_end_sync(&th, s, 1) ;
+    journal_end(&th, s, 1) ;
   }
   s->s_dirt = 0;
   reiserfs_write_unlock(s);
--- diff/fs/super.c	2004-04-06 15:54:19.315570408 +0100
+++ source/fs/super.c	2004-04-06 15:54:23.028006032 +0100
@@ -293,62 +293,6 @@ static inline void write_super(struct su
 }
 
 /*
- * triggered by the device mapper code to lock a filesystem and force
- * it into a consistent state.
- *
- * This takes the block device bd_mount_sem to make sure no new mounts
- * happen on bdev until unlockfs is called.  If a super is found on this
- * block device, we hould a read lock on the s->s_umount sem to make sure
- * nobody unmounts until the snapshot creation is done
- */
-void sync_super_lockfs(struct block_device *bdev) 
-{
-	struct super_block *sb;
-	down(&bdev->bd_mount_sem);
-	sb = get_super(bdev);
-	if (sb) {
-		lock_super(sb);
-		if (sb->s_dirt && sb->s_op->write_super)
-			sb->s_op->write_super(sb);
-		if (sb->s_op->write_super_lockfs)
-			sb->s_op->write_super_lockfs(sb);
-		unlock_super(sb);
-	}
-	/* unlockfs releases s->s_umount and bd_mount_sem */
-}
-
-void unlockfs(struct block_device *bdev)
-{
-	struct list_head *p;
-	/*
-	 * copied from get_super, but we need to
-	 * do special things since lockfs left the
-	 * s_umount sem held
-	 */
-	spin_lock(&sb_lock);
-	list_for_each(p, &super_blocks) {
-		struct super_block *s = sb_entry(p);
-		/*
-		 * if there is a super for this block device
-		 * in the list, get_super must have found it
-		 * during sync_super_lockfs, so our drop_super
-		 * will drop the reference created there.
-		 */
-		if (s->s_bdev == bdev && s->s_root) {
-			spin_unlock(&sb_lock);
-			if (s->s_op->unlockfs)
-				s->s_op->unlockfs(s);
-			drop_super(s);
-			goto unlock;
-		}
-	}
-	spin_unlock(&sb_lock);
-unlock:
-	up(&bdev->bd_mount_sem);
-}
-EXPORT_SYMBOL(unlockfs);
-
-/*
  * Note: check the dirty flag before waiting, so we don't
  * hold up the sync while mounting a device. (The newly
  * mounted device won't need syncing.)
@@ -678,14 +622,7 @@ struct super_block *get_sb_bdev(struct f
 	if (IS_ERR(bdev))
 		return (struct super_block *)bdev;
 
-	/*
-	 * once the super is inserted into the list by sget, s_umount
-	 * will protect the lockfs code from trying to start a snapshot
-	 * while we are mounting
-	 */
-	down(&bdev->bd_mount_sem);
 	s = sget(fs_type, test_bdev_super, set_bdev_super, bdev);
-	up(&bdev->bd_mount_sem);
 	if (IS_ERR(s))
 		goto out;
 
--- diff/include/linux/buffer_head.h	2004-04-06 15:54:19.316570256 +0100
+++ source/include/linux/buffer_head.h	2004-04-06 15:54:23.029005880 +0100
@@ -164,8 +164,6 @@ void __wait_on_buffer(struct buffer_head
 wait_queue_head_t *bh_waitq_head(struct buffer_head *bh);
 void wake_up_buffer(struct buffer_head *bh);
 int fsync_bdev(struct block_device *);
-int fsync_bdev_lockfs(struct block_device *);
-void unlockfs(struct block_device *);
 int fsync_super(struct super_block *);
 int fsync_no_super(struct block_device *);
 struct buffer_head *__find_get_block(struct block_device *, sector_t, int);
--- diff/include/linux/fs.h	2004-04-06 15:54:19.317570104 +0100
+++ source/include/linux/fs.h	2004-04-06 15:54:23.030005728 +0100
@@ -345,7 +345,6 @@ struct block_device {
 	struct inode *		bd_inode;	/* will die */
 	int			bd_openers;
 	struct semaphore	bd_sem;	/* open/close mutex */
-	struct semaphore	bd_mount_sem;	/* mount mutex */
 	struct list_head	bd_inodes;
 	void *			bd_holder;
 	int			bd_holders;
@@ -1261,7 +1260,6 @@ extern int filemap_flush(struct address_
 extern int filemap_fdatawait(struct address_space *);
 extern int filemap_write_and_wait(struct address_space *mapping);
 extern void sync_supers(void);
-extern void sync_super_lockfs(struct block_device *);
 extern void sync_filesystems(int wait);
 extern void emergency_sync(void);
 extern void emergency_remount(void);
