Lift vfs locking to dm_suspend/resume. --- diff/drivers/md/dm-snapshot.c 2003-10-16 10:44:41.000000000 +0100 +++ source/drivers/md/dm-snapshot.c 2003-10-16 10:44:44.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-16 10:44:23.000000000 +0100 +++ source/drivers/md/dm.c 2003-10-16 10:44:44.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);