diff options
author | Kent Overstreet <koverstreet@google.com> | 2013-02-01 10:29:41 -0500 |
---|---|---|
committer | Kent Overstreet <koverstreet@google.com> | 2013-04-30 22:14:43 -0400 |
commit | ee66850642efda91d04179cae2414310675a1f73 (patch) | |
tree | 5241a865b0be614a133d4282ae870c696d084f72 | |
parent | 86b26b824cf5d15d4408b33d6d716104f249e8bd (diff) |
bcache: Use bd_link_disk_holder()
Signed-off-by: Kent Overstreet <koverstreet@google.com>
-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 | } |