Skip to content

Commit

Permalink
[PATCH] device-mapper: fix deadlocks in core
Browse files Browse the repository at this point in the history
Avoid another bdget_disk which can deadlock.

Signed-Off-By: Alasdair G Kergon <agk@redhat.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
  • Loading branch information
Alasdair G Kergon authored and Linus Torvalds committed Jul 29, 2005
1 parent cf222b3 commit 4e90188
Showing 1 changed file with 7 additions and 12 deletions.
19 changes: 7 additions & 12 deletions drivers/md/dm.c
Original file line number Diff line number Diff line change
Expand Up @@ -825,18 +825,13 @@ static void event_callback(void *context)
wake_up(&md->eventq);
}

static void __set_size(struct gendisk *disk, sector_t size)
static void __set_size(struct mapped_device *md, sector_t size)
{
struct block_device *bdev;

set_capacity(disk, size);
bdev = bdget_disk(disk, 0);
if (bdev) {
down(&bdev->bd_inode->i_sem);
i_size_write(bdev->bd_inode, (loff_t)size << SECTOR_SHIFT);
up(&bdev->bd_inode->i_sem);
bdput(bdev);
}
set_capacity(md->disk, size);

down(&md->frozen_bdev->bd_inode->i_sem);
i_size_write(md->frozen_bdev->bd_inode, (loff_t)size << SECTOR_SHIFT);
up(&md->frozen_bdev->bd_inode->i_sem);
}

static int __bind(struct mapped_device *md, struct dm_table *t)
Expand All @@ -845,7 +840,7 @@ static int __bind(struct mapped_device *md, struct dm_table *t)
sector_t size;

size = dm_table_get_size(t);
__set_size(md->disk, size);
__set_size(md, size);
if (size == 0)
return 0;

Expand Down

0 comments on commit 4e90188

Please sign in to comment.