From: Alasdair G Kergon Date: Thu, 5 May 2005 23:16:03 +0000 (-0700) Subject: [PATCH] device-mapper: store bdev while frozen X-Git-Tag: v2.6.12-rc4~53 X-Git-Url: https://err.no/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d1782a3b0a15d9ac497a8f47931c4536bfe8d18e;p=linux-2.6 [PATCH] device-mapper: store bdev while frozen Store the struct block_device while device is frozen, saving us one call to bdget_disk(). Signed-Off-By: Alasdair G Kergon From: Christoph Hellwig Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds --- diff --git a/drivers/md/dm.c b/drivers/md/dm.c index 243ff6884e..ea180af6d2 100644 --- a/drivers/md/dm.c +++ b/drivers/md/dm.c @@ -97,6 +97,7 @@ struct mapped_device { * freeze/thaw support require holding onto a super block */ struct super_block *frozen_sb; + struct block_device *frozen_bdev; }; #define MIN_IOS 256 @@ -990,19 +991,17 @@ int dm_swap_table(struct mapped_device *md, struct dm_table *table) */ static int __lock_fs(struct mapped_device *md) { - struct block_device *bdev; - if (test_and_set_bit(DMF_FS_LOCKED, &md->flags)) return 0; - bdev = bdget_disk(md->disk, 0); - if (!bdev) { + md->frozen_bdev = bdget_disk(md->disk, 0); + if (!md->frozen_bdev) { DMWARN("bdget failed in __lock_fs"); return -ENOMEM; } WARN_ON(md->frozen_sb); - md->frozen_sb = freeze_bdev(bdev); + md->frozen_sb = freeze_bdev(md->frozen_bdev); /* don't bdput right now, we don't want the bdev * to go away while it is locked. We'll bdput * in __unlock_fs @@ -1012,21 +1011,15 @@ static int __lock_fs(struct mapped_device *md) static int __unlock_fs(struct mapped_device *md) { - struct block_device *bdev; - if (!test_and_clear_bit(DMF_FS_LOCKED, &md->flags)) return 0; - bdev = bdget_disk(md->disk, 0); - if (!bdev) { - DMWARN("bdget failed in __unlock_fs"); - return -ENOMEM; - } + thaw_bdev(md->frozen_bdev, md->frozen_sb); + bdput(md->frozen_bdev); - thaw_bdev(bdev, md->frozen_sb); md->frozen_sb = NULL; - bdput(bdev); - bdput(bdev); + md->frozen_bdev = NULL; + return 0; }