From 839e7db94d4c569b6e232b10d683f0791a3a9f95 Mon Sep 17 00:00:00 2001 From: Alasdair G Kergon Date: Thu, 5 May 2005 16:16:04 -0700 Subject: [PATCH] --- yaml --- r: 1026 b: refs/heads/master c: dfbe03f6d09fcebf85ae2a2cbb4ceee9b0985e67 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/drivers/md/dm.c | 18 +++++++++++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/[refs] b/[refs] index 2c03d0c7e592..710d367aa7d1 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 3dcee8064bd36c547b45514dfd33df4c12695428 +refs/heads/master: dfbe03f6d09fcebf85ae2a2cbb4ceee9b0985e67 diff --git a/trunk/drivers/md/dm.c b/trunk/drivers/md/dm.c index 0e4c8d3ca9fb..9687a084b5ff 100644 --- a/trunk/drivers/md/dm.c +++ b/trunk/drivers/md/dm.c @@ -991,22 +991,38 @@ int dm_swap_table(struct mapped_device *md, struct dm_table *table) */ static int __lock_fs(struct mapped_device *md) { + int error = -ENOMEM; + if (test_and_set_bit(DMF_FS_LOCKED, &md->flags)) return 0; md->frozen_bdev = bdget_disk(md->disk, 0); if (!md->frozen_bdev) { DMWARN("bdget failed in __lock_fs"); - return -ENOMEM; + goto out; } WARN_ON(md->frozen_sb); + md->frozen_sb = freeze_bdev(md->frozen_bdev); + if (IS_ERR(md->frozen_sb)) { + error = PTR_ERR(md->frozen_sb); + goto out_bdput; + } + /* don't bdput right now, we don't want the bdev * to go away while it is locked. We'll bdput * in __unlock_fs */ return 0; + +out_bdput: + bdput(md->frozen_bdev); + md->frozen_sb = NULL; + md->frozen_bdev = NULL; +out: + clear_bit(DMF_FS_LOCKED, &md->flags); + return error; } static void __unlock_fs(struct mapped_device *md)