Commit ecb24581 authored by Andrew Morton's avatar Andrew Morton Committed by Linus Torvalds

[PATCH] dm: fix block device resizing

From: Joe Thornber <thornber@sistina.com>

When setting the size of a Device-Mapper device in the gendisk entry, also
try to set the size of the corresponding block_device entry's inode.  This is
necessary to allow online device/filesystem resizing to work correctly. 
[Kevin Corry]
parent fe08f9d5
...@@ -666,6 +666,20 @@ static void event_callback(void *context) ...@@ -666,6 +666,20 @@ static void event_callback(void *context)
up_write(&md->lock); up_write(&md->lock);
} }
static void __set_size(struct gendisk *disk, 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, size << SECTOR_SHIFT);
up(&bdev->bd_inode->i_sem);
bdput(bdev);
}
}
static int __bind(struct mapped_device *md, struct dm_table *t) static int __bind(struct mapped_device *md, struct dm_table *t)
{ {
request_queue_t *q = md->queue; request_queue_t *q = md->queue;
...@@ -673,7 +687,7 @@ static int __bind(struct mapped_device *md, struct dm_table *t) ...@@ -673,7 +687,7 @@ static int __bind(struct mapped_device *md, struct dm_table *t)
md->map = t; md->map = t;
size = dm_table_get_size(t); size = dm_table_get_size(t);
set_capacity(md->disk, size); __set_size(md->disk, size);
if (size == 0) if (size == 0)
return 0; return 0;
...@@ -692,7 +706,6 @@ static void __unbind(struct mapped_device *md) ...@@ -692,7 +706,6 @@ static void __unbind(struct mapped_device *md)
dm_table_event_callback(md->map, NULL, NULL); dm_table_event_callback(md->map, NULL, NULL);
dm_table_put(md->map); dm_table_put(md->map);
md->map = NULL; md->map = NULL;
set_capacity(md->disk, 0);
} }
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment