diff options
| -rw-r--r-- | drivers/md/bcache/super.c | 52 |
1 files changed, 35 insertions, 17 deletions
diff --git a/drivers/md/bcache/super.c b/drivers/md/bcache/super.c index b3601476f7dd..c8046bc4aa57 100644 --- a/drivers/md/bcache/super.c +++ b/drivers/md/bcache/super.c | |||
| @@ -661,6 +661,35 @@ void bcache_device_stop(struct bcache_device *d) | |||
| 661 | closure_queue(&d->cl); | 661 | closure_queue(&d->cl); |
| 662 | } | 662 | } |
| 663 | 663 | ||
| 664 | static void bcache_device_unlink(struct bcache_device *d) | ||
| 665 | { | ||
| 666 | unsigned i; | ||
| 667 | struct cache *ca; | ||
| 668 | |||
| 669 | sysfs_remove_link(&d->c->kobj, d->name); | ||
| 670 | sysfs_remove_link(&d->kobj, "cache"); | ||
| 671 | |||
| 672 | for_each_cache(ca, d->c, i) | ||
| 673 | bd_unlink_disk_holder(ca->bdev, d->disk); | ||
| 674 | } | ||
| 675 | |||
| 676 | static void bcache_device_link(struct bcache_device *d, struct cache_set *c, | ||
| 677 | const char *name) | ||
| 678 | { | ||
| 679 | unsigned i; | ||
| 680 | struct cache *ca; | ||
| 681 | |||
| 682 | for_each_cache(ca, d->c, i) | ||
| 683 | bd_link_disk_holder(ca->bdev, d->disk); | ||
| 684 | |||
| 685 | snprintf(d->name, BCACHEDEVNAME_SIZE, | ||
| 686 | "%s%u", name, d->id); | ||
| 687 | |||
| 688 | WARN(sysfs_create_link(&d->kobj, &c->kobj, "cache") || | ||
| 689 | sysfs_create_link(&c->kobj, &d->kobj, d->name), | ||
| 690 | "Couldn't create device <-> cache set symlinks"); | ||
| 691 | } | ||
| 692 | |||
| 664 | static void bcache_device_detach(struct bcache_device *d) | 693 | static void bcache_device_detach(struct bcache_device *d) |
| 665 | { | 694 | { |
| 666 | lockdep_assert_held(&bch_register_lock); | 695 | lockdep_assert_held(&bch_register_lock); |
| @@ -676,6 +705,8 @@ static void bcache_device_detach(struct bcache_device *d) | |||
| 676 | atomic_set(&d->detaching, 0); | 705 | atomic_set(&d->detaching, 0); |
| 677 | } | 706 | } |
| 678 | 707 | ||
| 708 | bcache_device_unlink(d); | ||
| 709 | |||
| 679 | d->c->devices[d->id] = NULL; | 710 | d->c->devices[d->id] = NULL; |
| 680 | closure_put(&d->c->caching); | 711 | closure_put(&d->c->caching); |
| 681 | d->c = NULL; | 712 | d->c = NULL; |
| @@ -693,17 +724,6 @@ static void bcache_device_attach(struct bcache_device *d, struct cache_set *c, | |||
| 693 | closure_get(&c->caching); | 724 | closure_get(&c->caching); |
| 694 | } | 725 | } |
| 695 | 726 | ||
| 696 | static void bcache_device_link(struct bcache_device *d, struct cache_set *c, | ||
| 697 | const char *name) | ||
| 698 | { | ||
| 699 | snprintf(d->name, BCACHEDEVNAME_SIZE, | ||
| 700 | "%s%u", name, d->id); | ||
| 701 | |||
| 702 | WARN(sysfs_create_link(&d->kobj, &c->kobj, "cache") || | ||
| 703 | sysfs_create_link(&c->kobj, &d->kobj, d->name), | ||
| 704 | "Couldn't create device <-> cache set symlinks"); | ||
| 705 | } | ||
| 706 | |||
| 707 | static void bcache_device_free(struct bcache_device *d) | 727 | static void bcache_device_free(struct bcache_device *d) |
| 708 | { | 728 | { |
| 709 | lockdep_assert_held(&bch_register_lock); | 729 | lockdep_assert_held(&bch_register_lock); |
| @@ -804,6 +824,7 @@ void bch_cached_dev_run(struct cached_dev *dc) | |||
| 804 | } | 824 | } |
| 805 | 825 | ||
| 806 | add_disk(d->disk); | 826 | add_disk(d->disk); |
| 827 | bd_link_disk_holder(dc->bdev, dc->disk.disk); | ||
| 807 | #if 0 | 828 | #if 0 |
| 808 | char *env[] = { "SYMLINK=label" , NULL }; | 829 | char *env[] = { "SYMLINK=label" , NULL }; |
| 809 | kobject_uevent_env(&disk_to_dev(d->disk)->kobj, KOBJ_CHANGE, env); | 830 | kobject_uevent_env(&disk_to_dev(d->disk)->kobj, KOBJ_CHANGE, env); |
| @@ -823,9 +844,6 @@ static void cached_dev_detach_finish(struct work_struct *w) | |||
| 823 | BUG_ON(!atomic_read(&dc->disk.detaching)); | 844 | BUG_ON(!atomic_read(&dc->disk.detaching)); |
| 824 | BUG_ON(atomic_read(&dc->count)); | 845 | BUG_ON(atomic_read(&dc->count)); |
| 825 | 846 | ||
| 826 | sysfs_remove_link(&dc->disk.c->kobj, dc->disk.name); | ||
| 827 | sysfs_remove_link(&dc->disk.kobj, "cache"); | ||
| 828 | |||
| 829 | mutex_lock(&bch_register_lock); | 847 | mutex_lock(&bch_register_lock); |
| 830 | 848 | ||
| 831 | memset(&dc->sb.set_uuid, 0, 16); | 849 | memset(&dc->sb.set_uuid, 0, 16); |
| @@ -940,7 +958,6 @@ int bch_cached_dev_attach(struct cached_dev *dc, struct cache_set *c) | |||
| 940 | } | 958 | } |
| 941 | 959 | ||
| 942 | bcache_device_attach(&dc->disk, c, u - c->uuids); | 960 | bcache_device_attach(&dc->disk, c, u - c->uuids); |
| 943 | bcache_device_link(&dc->disk, c, "bdev"); | ||
| 944 | list_move(&dc->list, &c->cached_devs); | 961 | list_move(&dc->list, &c->cached_devs); |
| 945 | calc_cached_dev_sectors(c); | 962 | calc_cached_dev_sectors(c); |
| 946 | 963 | ||
| @@ -958,6 +975,7 @@ int bch_cached_dev_attach(struct cached_dev *dc, struct cache_set *c) | |||
| 958 | } | 975 | } |
| 959 | 976 | ||
| 960 | bch_cached_dev_run(dc); | 977 | bch_cached_dev_run(dc); |
| 978 | bcache_device_link(&dc->disk, c, "bdev"); | ||
| 961 | 979 | ||
| 962 | pr_info("Caching %s as %s on set %pU", | 980 | pr_info("Caching %s as %s on set %pU", |
| 963 | bdevname(dc->bdev, buf), dc->disk.disk->disk_name, | 981 | bdevname(dc->bdev, buf), dc->disk.disk->disk_name, |
| @@ -981,6 +999,7 @@ static void cached_dev_free(struct closure *cl) | |||
| 981 | 999 | ||
| 982 | mutex_lock(&bch_register_lock); | 1000 | mutex_lock(&bch_register_lock); |
| 983 | 1001 | ||
| 1002 | bd_unlink_disk_holder(dc->bdev, dc->disk.disk); | ||
| 984 | bcache_device_free(&dc->disk); | 1003 | bcache_device_free(&dc->disk); |
| 985 | list_del(&dc->list); | 1004 | list_del(&dc->list); |
| 986 | 1005 | ||
| @@ -1123,8 +1142,7 @@ static void flash_dev_flush(struct closure *cl) | |||
| 1123 | { | 1142 | { |
| 1124 | struct bcache_device *d = container_of(cl, struct bcache_device, cl); | 1143 | struct bcache_device *d = container_of(cl, struct bcache_device, cl); |
| 1125 | 1144 | ||
| 1126 | sysfs_remove_link(&d->c->kobj, d->name); | 1145 | bcache_device_unlink(d); |
| 1127 | sysfs_remove_link(&d->kobj, "cache"); | ||
| 1128 | kobject_del(&d->kobj); | 1146 | kobject_del(&d->kobj); |
| 1129 | continue_at(cl, flash_dev_free, system_wq); | 1147 | continue_at(cl, flash_dev_free, system_wq); |
| 1130 | } | 1148 | } |
