super.c (8abb2a5dbadab91f9cae22270054e9ee3b3a1d2f) super.c (ee66850642efda91d04179cae2414310675a1f73)
1/*
2 * bcache setup/teardown code, and some metadata io - read a superblock and
3 * figure out what to do with it.
4 *
5 * Copyright 2010, 2011 Kent Overstreet <kent.overstreet@gmail.com>
6 * Copyright 2012 Google, Inc.
7 */
8

--- 647 unchanged lines hidden (view full) ---

656};
657
658void bcache_device_stop(struct bcache_device *d)
659{
660 if (!atomic_xchg(&d->closing, 1))
661 closure_queue(&d->cl);
662}
663
1/*
2 * bcache setup/teardown code, and some metadata io - read a superblock and
3 * figure out what to do with it.
4 *
5 * Copyright 2010, 2011 Kent Overstreet <kent.overstreet@gmail.com>
6 * Copyright 2012 Google, Inc.
7 */
8

--- 647 unchanged lines hidden (view full) ---

656};
657
658void bcache_device_stop(struct bcache_device *d)
659{
660 if (!atomic_xchg(&d->closing, 1))
661 closure_queue(&d->cl);
662}
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)
665{
666 lockdep_assert_held(&bch_register_lock);
667
668 if (atomic_read(&d->detaching)) {
669 struct uuid_entry *u = d->c->uuids + d->id;
670
671 SET_UUID_FLASH_ONLY(u, 0);
672 memcpy(u->uuid, invalid_uuid, 16);
673 u->invalidated = cpu_to_le32(get_seconds());
674 bch_uuid_write(d->c);
675
676 atomic_set(&d->detaching, 0);
677 }
678
693static void bcache_device_detach(struct bcache_device *d)
694{
695 lockdep_assert_held(&bch_register_lock);
696
697 if (atomic_read(&d->detaching)) {
698 struct uuid_entry *u = d->c->uuids + d->id;
699
700 SET_UUID_FLASH_ONLY(u, 0);
701 memcpy(u->uuid, invalid_uuid, 16);
702 u->invalidated = cpu_to_le32(get_seconds());
703 bch_uuid_write(d->c);
704
705 atomic_set(&d->detaching, 0);
706 }
707
708 bcache_device_unlink(d);
709
679 d->c->devices[d->id] = NULL;
680 closure_put(&d->c->caching);
681 d->c = NULL;
682}
683
684static void bcache_device_attach(struct bcache_device *d, struct cache_set *c,
685 unsigned id)
686{
687 BUG_ON(test_bit(CACHE_SET_STOPPING, &c->flags));
688
689 d->id = id;
690 d->c = c;
691 c->devices[id] = d;
692
693 closure_get(&c->caching);
694}
695
710 d->c->devices[d->id] = NULL;
711 closure_put(&d->c->caching);
712 d->c = NULL;
713}
714
715static void bcache_device_attach(struct bcache_device *d, struct cache_set *c,
716 unsigned id)
717{
718 BUG_ON(test_bit(CACHE_SET_STOPPING, &c->flags));
719
720 d->id = id;
721 d->c = c;
722 c->devices[id] = d;
723
724 closure_get(&c->caching);
725}
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)
708{
709 lockdep_assert_held(&bch_register_lock);
710
711 pr_info("%s stopped", d->disk->disk_name);
712
713 if (d->c)
714 bcache_device_detach(d);

--- 84 unchanged lines hidden (view full) ---

799 closure_init_stack(&cl);
800
801 SET_BDEV_STATE(&dc->sb, BDEV_STATE_STALE);
802 bch_write_bdev_super(dc, &cl);
803 closure_sync(&cl);
804 }
805
806 add_disk(d->disk);
727static void bcache_device_free(struct bcache_device *d)
728{
729 lockdep_assert_held(&bch_register_lock);
730
731 pr_info("%s stopped", d->disk->disk_name);
732
733 if (d->c)
734 bcache_device_detach(d);

--- 84 unchanged lines hidden (view full) ---

819 closure_init_stack(&cl);
820
821 SET_BDEV_STATE(&dc->sb, BDEV_STATE_STALE);
822 bch_write_bdev_super(dc, &cl);
823 closure_sync(&cl);
824 }
825
826 add_disk(d->disk);
827 bd_link_disk_holder(dc->bdev, dc->disk.disk);
807#if 0
808 char *env[] = { "SYMLINK=label" , NULL };
809 kobject_uevent_env(&disk_to_dev(d->disk)->kobj, KOBJ_CHANGE, env);
810#endif
811 if (sysfs_create_link(&d->kobj, &disk_to_dev(d->disk)->kobj, "dev") ||
812 sysfs_create_link(&disk_to_dev(d->disk)->kobj, &d->kobj, "bcache"))
813 pr_debug("error creating sysfs link");
814}
815
816static void cached_dev_detach_finish(struct work_struct *w)
817{
818 struct cached_dev *dc = container_of(w, struct cached_dev, detach);
819 char buf[BDEVNAME_SIZE];
820 struct closure cl;
821 closure_init_stack(&cl);
822
823 BUG_ON(!atomic_read(&dc->disk.detaching));
824 BUG_ON(atomic_read(&dc->count));
825
828#if 0
829 char *env[] = { "SYMLINK=label" , NULL };
830 kobject_uevent_env(&disk_to_dev(d->disk)->kobj, KOBJ_CHANGE, env);
831#endif
832 if (sysfs_create_link(&d->kobj, &disk_to_dev(d->disk)->kobj, "dev") ||
833 sysfs_create_link(&disk_to_dev(d->disk)->kobj, &d->kobj, "bcache"))
834 pr_debug("error creating sysfs link");
835}
836
837static void cached_dev_detach_finish(struct work_struct *w)
838{
839 struct cached_dev *dc = container_of(w, struct cached_dev, detach);
840 char buf[BDEVNAME_SIZE];
841 struct closure cl;
842 closure_init_stack(&cl);
843
844 BUG_ON(!atomic_read(&dc->disk.detaching));
845 BUG_ON(atomic_read(&dc->count));
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);
830
831 memset(&dc->sb.set_uuid, 0, 16);
832 SET_BDEV_STATE(&dc->sb, BDEV_STATE_NONE);
833
834 bch_write_bdev_super(dc, &cl);
835 closure_sync(&cl);
836

--- 98 unchanged lines hidden (view full) ---

935 bch_write_bdev_super(dc, &cl);
936 closure_sync(&cl);
937 } else {
938 u->last_reg = rtime;
939 bch_uuid_write(c);
940 }
941
942 bcache_device_attach(&dc->disk, c, u - c->uuids);
847 mutex_lock(&bch_register_lock);
848
849 memset(&dc->sb.set_uuid, 0, 16);
850 SET_BDEV_STATE(&dc->sb, BDEV_STATE_NONE);
851
852 bch_write_bdev_super(dc, &cl);
853 closure_sync(&cl);
854

--- 98 unchanged lines hidden (view full) ---

953 bch_write_bdev_super(dc, &cl);
954 closure_sync(&cl);
955 } else {
956 u->last_reg = rtime;
957 bch_uuid_write(c);
958 }
959
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);
945 calc_cached_dev_sectors(c);
946
947 smp_wmb();
948 /*
949 * dc->c must be set before dc->count != 0 - paired with the mb in
950 * cached_dev_get()
951 */
952 atomic_set(&dc->count, 1);
953
954 if (BDEV_STATE(&dc->sb) == BDEV_STATE_DIRTY) {
955 atomic_set(&dc->has_dirty, 1);
956 atomic_inc(&dc->count);
957 bch_writeback_queue(dc);
958 }
959
960 bch_cached_dev_run(dc);
961 list_move(&dc->list, &c->cached_devs);
962 calc_cached_dev_sectors(c);
963
964 smp_wmb();
965 /*
966 * dc->c must be set before dc->count != 0 - paired with the mb in
967 * cached_dev_get()
968 */
969 atomic_set(&dc->count, 1);
970
971 if (BDEV_STATE(&dc->sb) == BDEV_STATE_DIRTY) {
972 atomic_set(&dc->has_dirty, 1);
973 atomic_inc(&dc->count);
974 bch_writeback_queue(dc);
975 }
976
977 bch_cached_dev_run(dc);
978 bcache_device_link(&dc->disk, c, "bdev");
961
962 pr_info("Caching %s as %s on set %pU",
963 bdevname(dc->bdev, buf), dc->disk.disk->disk_name,
964 dc->disk.c->sb.set_uuid);
965 return 0;
966}
967
968void bch_cached_dev_release(struct kobject *kobj)

--- 7 unchanged lines hidden (view full) ---

976static void cached_dev_free(struct closure *cl)
977{
978 struct cached_dev *dc = container_of(cl, struct cached_dev, disk.cl);
979
980 cancel_delayed_work_sync(&dc->writeback_rate_update);
981
982 mutex_lock(&bch_register_lock);
983
979
980 pr_info("Caching %s as %s on set %pU",
981 bdevname(dc->bdev, buf), dc->disk.disk->disk_name,
982 dc->disk.c->sb.set_uuid);
983 return 0;
984}
985
986void bch_cached_dev_release(struct kobject *kobj)

--- 7 unchanged lines hidden (view full) ---

994static void cached_dev_free(struct closure *cl)
995{
996 struct cached_dev *dc = container_of(cl, struct cached_dev, disk.cl);
997
998 cancel_delayed_work_sync(&dc->writeback_rate_update);
999
1000 mutex_lock(&bch_register_lock);
1001
1002 bd_unlink_disk_holder(dc->bdev, dc->disk.disk);
984 bcache_device_free(&dc->disk);
985 list_del(&dc->list);
986
987 mutex_unlock(&bch_register_lock);
988
989 if (!IS_ERR_OR_NULL(dc->bdev)) {
990 blk_sync_queue(bdev_get_queue(dc->bdev));
991 blkdev_put(dc->bdev, FMODE_READ|FMODE_WRITE|FMODE_EXCL);

--- 126 unchanged lines hidden (view full) ---

1118 bcache_device_free(d);
1119 kobject_put(&d->kobj);
1120}
1121
1122static void flash_dev_flush(struct closure *cl)
1123{
1124 struct bcache_device *d = container_of(cl, struct bcache_device, cl);
1125
1003 bcache_device_free(&dc->disk);
1004 list_del(&dc->list);
1005
1006 mutex_unlock(&bch_register_lock);
1007
1008 if (!IS_ERR_OR_NULL(dc->bdev)) {
1009 blk_sync_queue(bdev_get_queue(dc->bdev));
1010 blkdev_put(dc->bdev, FMODE_READ|FMODE_WRITE|FMODE_EXCL);

--- 126 unchanged lines hidden (view full) ---

1137 bcache_device_free(d);
1138 kobject_put(&d->kobj);
1139}
1140
1141static void flash_dev_flush(struct closure *cl)
1142{
1143 struct bcache_device *d = container_of(cl, struct bcache_device, cl);
1144
1126 sysfs_remove_link(&d->c->kobj, d->name);
1127 sysfs_remove_link(&d->kobj, "cache");
1145 bcache_device_unlink(d);
1128 kobject_del(&d->kobj);
1129 continue_at(cl, flash_dev_free, system_wq);
1130}
1131
1132static int flash_dev_run(struct cache_set *c, struct uuid_entry *u)
1133{
1134 struct bcache_device *d = kzalloc(sizeof(struct bcache_device),
1135 GFP_KERNEL);

--- 834 unchanged lines hidden ---
1146 kobject_del(&d->kobj);
1147 continue_at(cl, flash_dev_free, system_wq);
1148}
1149
1150static int flash_dev_run(struct cache_set *c, struct uuid_entry *u)
1151{
1152 struct bcache_device *d = kzalloc(sizeof(struct bcache_device),
1153 GFP_KERNEL);

--- 834 unchanged lines hidden ---