From dfbe03f6d09fcebf85ae2a2cbb4ceee9b0985e67 Mon Sep 17 00:00:00 2001 From: Alasdair G Kergon Date: Thu, 5 May 2005 16:16:04 -0700 Subject: [PATCH] [PATCH] device-mapper: let freeze_bdev return error Allow freeze_bdev() to return an error. Signed-Off-By: Alasdair G Kergon From: Christoph Hellwig Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds --- drivers/md/dm.c | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/drivers/md/dm.c b/drivers/md/dm.c index 0e4c8d3ca9fb..9687a084b5ff 100644 --- a/drivers/md/dm.c +++ b/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) -- 2.20.1