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 --- |