提交 f165921d 编写于 作者: J Jun'ichi Nomura 提交者: Linus Torvalds

[PATCH] dm/md dependency tree in sysfs: dm to use bd_claim_by_disk

Use bd_claim_by_disk.

Following symlinks are created if dm-0 maps to sda:
  /sys/block/dm-0/slaves/sda --> /sys/block/sda
  /sys/block/sda/holders/dm-0 --> /sys/block/dm-0
Signed-off-by: NJun'ichi Nomura <j-nomura@ce.jp.nec.com>
Cc: Alasdair G Kergon <agk@redhat.com>
Signed-off-by: NAndrew Morton <akpm@osdl.org>
Signed-off-by: NLinus Torvalds <torvalds@osdl.org>
上级 5463c790
...@@ -350,7 +350,7 @@ static struct dm_dev *find_device(struct list_head *l, dev_t dev) ...@@ -350,7 +350,7 @@ static struct dm_dev *find_device(struct list_head *l, dev_t dev)
/* /*
* Open a device so we can use it as a map destination. * Open a device so we can use it as a map destination.
*/ */
static int open_dev(struct dm_dev *d, dev_t dev) static int open_dev(struct dm_dev *d, dev_t dev, struct mapped_device *md)
{ {
static char *_claim_ptr = "I belong to device-mapper"; static char *_claim_ptr = "I belong to device-mapper";
struct block_device *bdev; struct block_device *bdev;
...@@ -362,7 +362,7 @@ static int open_dev(struct dm_dev *d, dev_t dev) ...@@ -362,7 +362,7 @@ static int open_dev(struct dm_dev *d, dev_t dev)
bdev = open_by_devnum(dev, d->mode); bdev = open_by_devnum(dev, d->mode);
if (IS_ERR(bdev)) if (IS_ERR(bdev))
return PTR_ERR(bdev); return PTR_ERR(bdev);
r = bd_claim(bdev, _claim_ptr); r = bd_claim_by_disk(bdev, _claim_ptr, dm_disk(md));
if (r) if (r)
blkdev_put(bdev); blkdev_put(bdev);
else else
...@@ -373,12 +373,12 @@ static int open_dev(struct dm_dev *d, dev_t dev) ...@@ -373,12 +373,12 @@ static int open_dev(struct dm_dev *d, dev_t dev)
/* /*
* Close a device that we've been using. * Close a device that we've been using.
*/ */
static void close_dev(struct dm_dev *d) static void close_dev(struct dm_dev *d, struct mapped_device *md)
{ {
if (!d->bdev) if (!d->bdev)
return; return;
bd_release(d->bdev); bd_release_from_disk(d->bdev, dm_disk(md));
blkdev_put(d->bdev); blkdev_put(d->bdev);
d->bdev = NULL; d->bdev = NULL;
} }
...@@ -399,7 +399,7 @@ static int check_device_area(struct dm_dev *dd, sector_t start, sector_t len) ...@@ -399,7 +399,7 @@ static int check_device_area(struct dm_dev *dd, sector_t start, sector_t len)
* careful to leave things as they were if we fail to reopen the * careful to leave things as they were if we fail to reopen the
* device. * device.
*/ */
static int upgrade_mode(struct dm_dev *dd, int new_mode) static int upgrade_mode(struct dm_dev *dd, int new_mode, struct mapped_device *md)
{ {
int r; int r;
struct dm_dev dd_copy; struct dm_dev dd_copy;
...@@ -409,9 +409,9 @@ static int upgrade_mode(struct dm_dev *dd, int new_mode) ...@@ -409,9 +409,9 @@ static int upgrade_mode(struct dm_dev *dd, int new_mode)
dd->mode |= new_mode; dd->mode |= new_mode;
dd->bdev = NULL; dd->bdev = NULL;
r = open_dev(dd, dev); r = open_dev(dd, dev, md);
if (!r) if (!r)
close_dev(&dd_copy); close_dev(&dd_copy, md);
else else
*dd = dd_copy; *dd = dd_copy;
...@@ -453,7 +453,7 @@ static int __table_get_device(struct dm_table *t, struct dm_target *ti, ...@@ -453,7 +453,7 @@ static int __table_get_device(struct dm_table *t, struct dm_target *ti,
dd->mode = mode; dd->mode = mode;
dd->bdev = NULL; dd->bdev = NULL;
if ((r = open_dev(dd, dev))) { if ((r = open_dev(dd, dev, t->md))) {
kfree(dd); kfree(dd);
return r; return r;
} }
...@@ -464,7 +464,7 @@ static int __table_get_device(struct dm_table *t, struct dm_target *ti, ...@@ -464,7 +464,7 @@ static int __table_get_device(struct dm_table *t, struct dm_target *ti,
list_add(&dd->list, &t->devices); list_add(&dd->list, &t->devices);
} else if (dd->mode != (mode | dd->mode)) { } else if (dd->mode != (mode | dd->mode)) {
r = upgrade_mode(dd, mode); r = upgrade_mode(dd, mode, t->md);
if (r) if (r)
return r; return r;
} }
...@@ -541,7 +541,7 @@ int dm_get_device(struct dm_target *ti, const char *path, sector_t start, ...@@ -541,7 +541,7 @@ int dm_get_device(struct dm_target *ti, const char *path, sector_t start,
void dm_put_device(struct dm_target *ti, struct dm_dev *dd) void dm_put_device(struct dm_target *ti, struct dm_dev *dd)
{ {
if (atomic_dec_and_test(&dd->count)) { if (atomic_dec_and_test(&dd->count)) {
close_dev(dd); close_dev(dd, ti->table->md);
list_del(&dd->list); list_del(&dd->list);
kfree(dd); kfree(dd);
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册