aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKent Overstreet <koverstreet@google.com>2013-02-01 10:29:41 -0500
committerKent Overstreet <koverstreet@google.com>2013-04-30 22:14:43 -0400
commitee66850642efda91d04179cae2414310675a1f73 (patch)
tree5241a865b0be614a133d4282ae870c696d084f72
parent86b26b824cf5d15d4408b33d6d716104f249e8bd (diff)
bcache: Use bd_link_disk_holder()
Signed-off-by: Kent Overstreet <koverstreet@google.com>
-rw-r--r--drivers/md/bcache/super.c52
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
664static 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
676static 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
664static void bcache_device_detach(struct bcache_device *d) 693static 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
696static 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
707static void bcache_device_free(struct bcache_device *d) 727static 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}