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: Jun'ichi Nomura drivers/md/dm-table.c | 20 ++++++++++---------- 1 files changed, 10 insertions(+), 10 deletions(-) Index: linux-2.6.16-rc5/drivers/md/dm-table.c =================================================================== --- linux-2.6.16-rc5.orig/drivers/md/dm-table.c 2006-03-14 18:25:46.000000000 +0000 +++ linux-2.6.16-rc5/drivers/md/dm-table.c 2006-03-14 18:25:55.000000000 +0000 @@ -351,7 +351,7 @@ static struct dm_dev *find_device(struct /* * 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"; struct block_device *bdev; @@ -364,7 +364,7 @@ static int open_dev(struct dm_dev *d, de bdev = open_by_devnum(dev, d->mode); if (IS_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) blkdev_put(bdev); else @@ -375,12 +375,12 @@ static int open_dev(struct dm_dev *d, de /* * 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) return; - bd_release(d->bdev); + bd_release_from_disk(d->bdev, dm_disk(md)); blkdev_put(d->bdev); d->bdev = NULL; } @@ -401,7 +401,7 @@ static int check_device_area(struct dm_d * careful to leave things as they were if we fail to reopen the * 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; struct dm_dev dd_copy; @@ -411,9 +411,9 @@ static int upgrade_mode(struct dm_dev *d dd->mode |= new_mode; dd->bdev = NULL; - r = open_dev(dd, dev); + r = open_dev(dd, dev, md); if (!r) - close_dev(&dd_copy); + close_dev(&dd_copy, md); else *dd = dd_copy; @@ -456,7 +456,7 @@ static int __table_get_device(struct dm_ dd->mode = mode; dd->bdev = NULL; - if ((r = open_dev(dd, dev))) { + if ((r = open_dev(dd, dev, t->md))) { kfree(dd); return r; } @@ -467,7 +467,7 @@ static int __table_get_device(struct dm_ list_add(&dd->list, &t->devices); } else if (dd->mode != (mode | dd->mode)) { - r = upgrade_mode(dd, mode); + r = upgrade_mode(dd, mode, t->md); if (r) return r; } @@ -544,7 +544,7 @@ int dm_get_device(struct dm_target *ti, void dm_put_device(struct dm_target *ti, struct dm_dev *dd) { if (atomic_dec_and_test(&dd->count)) { - close_dev(dd); + close_dev(dd, ti->table->md); list_del(&dd->list); kfree(dd); }