Lines Matching refs:sb

64 static const char *read_super(struct cache_sb *sb, struct block_device *bdev,  in read_super()  argument
77 sb->offset = le64_to_cpu(s->offset); in read_super()
78 sb->version = le64_to_cpu(s->version); in read_super()
80 memcpy(sb->magic, s->magic, 16); in read_super()
81 memcpy(sb->uuid, s->uuid, 16); in read_super()
82 memcpy(sb->set_uuid, s->set_uuid, 16); in read_super()
83 memcpy(sb->label, s->label, SB_LABEL_SIZE); in read_super()
85 sb->flags = le64_to_cpu(s->flags); in read_super()
86 sb->seq = le64_to_cpu(s->seq); in read_super()
87 sb->last_mount = le32_to_cpu(s->last_mount); in read_super()
88 sb->first_bucket = le16_to_cpu(s->first_bucket); in read_super()
89 sb->keys = le16_to_cpu(s->keys); in read_super()
92 sb->d[i] = le64_to_cpu(s->d[i]); in read_super()
95 sb->version, sb->flags, sb->seq, sb->keys); in read_super()
98 if (sb->offset != SB_SECTOR) in read_super()
101 if (memcmp(sb->magic, bcache_magic, 16)) in read_super()
105 if (sb->keys > SB_JOURNAL_BUCKETS) in read_super()
113 if (bch_is_zero(sb->uuid, 16)) in read_super()
116 sb->block_size = le16_to_cpu(s->block_size); in read_super()
119 if (sb->block_size << 9 < bdev_logical_block_size(bdev)) in read_super()
122 switch (sb->version) { in read_super()
124 sb->data_offset = BDEV_DATA_START_DEFAULT; in read_super()
127 sb->data_offset = le64_to_cpu(s->data_offset); in read_super()
130 if (sb->data_offset < BDEV_DATA_START_DEFAULT) in read_super()
136 sb->nbuckets = le64_to_cpu(s->nbuckets); in read_super()
137 sb->block_size = le16_to_cpu(s->block_size); in read_super()
138 sb->bucket_size = le16_to_cpu(s->bucket_size); in read_super()
140 sb->nr_in_set = le16_to_cpu(s->nr_in_set); in read_super()
141 sb->nr_this_dev = le16_to_cpu(s->nr_this_dev); in read_super()
144 if (sb->nbuckets > LONG_MAX) in read_super()
148 if (sb->nbuckets < 1 << 7) in read_super()
152 if (!is_power_of_2(sb->block_size) || in read_super()
153 sb->block_size > PAGE_SECTORS || in read_super()
154 !is_power_of_2(sb->bucket_size) || in read_super()
155 sb->bucket_size < PAGE_SECTORS) in read_super()
159 if (get_capacity(bdev->bd_disk) < sb->bucket_size * sb->nbuckets) in read_super()
163 if (bch_is_zero(sb->set_uuid, 16)) in read_super()
167 if (!sb->nr_in_set || in read_super()
168 sb->nr_in_set <= sb->nr_this_dev || in read_super()
169 sb->nr_in_set > MAX_CACHES_PER_SET) in read_super()
173 for (i = 0; i < sb->keys; i++) in read_super()
174 if (sb->d[i] != sb->first_bucket + i) in read_super()
178 if (sb->first_bucket + sb->keys > sb->nbuckets) in read_super()
182 if (sb->first_bucket * sb->bucket_size < 16) in read_super()
191 sb->last_mount = get_seconds(); in read_super()
209 static void __write_super(struct cache_sb *sb, struct bio *bio) in __write_super() argument
219 out->offset = cpu_to_le64(sb->offset); in __write_super()
220 out->version = cpu_to_le64(sb->version); in __write_super()
222 memcpy(out->uuid, sb->uuid, 16); in __write_super()
223 memcpy(out->set_uuid, sb->set_uuid, 16); in __write_super()
224 memcpy(out->label, sb->label, SB_LABEL_SIZE); in __write_super()
226 out->flags = cpu_to_le64(sb->flags); in __write_super()
227 out->seq = cpu_to_le64(sb->seq); in __write_super()
229 out->last_mount = cpu_to_le32(sb->last_mount); in __write_super()
230 out->first_bucket = cpu_to_le16(sb->first_bucket); in __write_super()
231 out->keys = cpu_to_le16(sb->keys); in __write_super()
233 for (i = 0; i < sb->keys; i++) in __write_super()
234 out->d[i] = cpu_to_le64(sb->d[i]); in __write_super()
239 sb->version, sb->flags, sb->seq); in __write_super()
265 __write_super(&dc->sb, bio); in bch_write_bdev_super()
294 c->sb.seq++; in bcache_write_super()
299 ca->sb.version = BCACHE_SB_VERSION_CDEV_WITH_UUID; in bcache_write_super()
300 ca->sb.seq = c->sb.seq; in bcache_write_super()
301 ca->sb.last_mount = c->sb.last_mount; in bcache_write_super()
303 SET_CACHE_SYNC(&ca->sb, CACHE_SYNC(&c->sb)); in bcache_write_super()
311 __write_super(&ca->sb, bio); in bcache_write_super()
428 SET_KEY_SIZE(&k.key, c->sb.bucket_size); in __uuid_write()
508 bio->bi_iter.bi_sector = bucket * ca->sb.bucket_size; in prio_io()
533 atomic_long_add(ca->sb.bucket_size * prio_buckets(ca), in bch_prio_write()
546 b < ca->buckets + ca->sb.nbuckets && d < end; in bch_prio_write()
553 p->magic = pset_magic(&ca->sb); in bch_prio_write()
595 b < ca->buckets + ca->sb.nbuckets; in prio_read()
607 if (p->magic != pset_magic(&ca->sb)) in prio_read()
843 kasprintf(GFP_KERNEL, "CACHED_UUID=%pU", dc->sb.uuid), in bch_cached_dev_run()
848 memcpy(buf, dc->sb.label, SB_LABEL_SIZE); in bch_cached_dev_run()
859 BDEV_STATE(&dc->sb) != BDEV_STATE_NONE) { in bch_cached_dev_run()
863 SET_BDEV_STATE(&dc->sb, BDEV_STATE_STALE); in bch_cached_dev_run()
893 memset(&dc->sb.set_uuid, 0, 16); in cached_dev_detach_finish()
894 SET_BDEV_STATE(&dc->sb, BDEV_STATE_NONE); in cached_dev_detach_finish()
941 if (memcmp(dc->sb.set_uuid, c->sb.set_uuid, 16)) in bch_cached_dev_attach()
954 if (dc->sb.block_size < c->sb.block_size) { in bch_cached_dev_attach()
961 u = uuid_find(c, dc->sb.uuid); in bch_cached_dev_attach()
964 (BDEV_STATE(&dc->sb) == BDEV_STATE_STALE || in bch_cached_dev_attach()
965 BDEV_STATE(&dc->sb) == BDEV_STATE_NONE)) { in bch_cached_dev_attach()
972 if (BDEV_STATE(&dc->sb) == BDEV_STATE_DIRTY) { in bch_cached_dev_attach()
992 memcpy(u->uuid, dc->sb.uuid, 16); in bch_cached_dev_attach()
993 memcpy(u->label, dc->sb.label, SB_LABEL_SIZE); in bch_cached_dev_attach()
997 memcpy(dc->sb.set_uuid, c->sb.set_uuid, 16); in bch_cached_dev_attach()
998 SET_BDEV_STATE(&dc->sb, BDEV_STATE_CLEAN); in bch_cached_dev_attach()
1025 if (BDEV_STATE(&dc->sb) == BDEV_STATE_DIRTY) { in bch_cached_dev_attach()
1040 dc->disk.c->sb.set_uuid); in bch_cached_dev_attach()
1123 dc->bdev->bd_part->nr_sects - dc->sb.data_offset); in cached_dev_init()
1128 dc->bdev->bd_part->nr_sects - dc->sb.data_offset); in cached_dev_init()
1141 static void register_bdev(struct cache_sb *sb, struct page *sb_page, in register_bdev() argument
1149 memcpy(&dc->sb, sb, sizeof(struct cache_sb)); in register_bdev()
1159 if (cached_dev_init(dc, sb->block_size << 9)) in register_bdev()
1175 if (BDEV_STATE(&dc->sb) == BDEV_STATE_NONE || in register_bdev()
1176 BDEV_STATE(&dc->sb) == BDEV_STATE_STALE) in register_bdev()
1301 printk(KERN_ERR "bcache: error on %pU: ", c->sb.set_uuid); in bch_cache_set_error()
1339 c->cache[ca->sb.nr_this_dev] = NULL; in cache_set_free()
1362 pr_info("Cache set %pU unregistered", c->sb.set_uuid); in cache_set_free()
1451 struct cache_set *bch_cache_set_alloc(struct cache_sb *sb) in bch_cache_set_alloc() argument
1474 memcpy(c->sb.set_uuid, sb->set_uuid, 16); in bch_cache_set_alloc()
1475 c->sb.block_size = sb->block_size; in bch_cache_set_alloc()
1476 c->sb.bucket_size = sb->bucket_size; in bch_cache_set_alloc()
1477 c->sb.nr_in_set = sb->nr_in_set; in bch_cache_set_alloc()
1478 c->sb.last_mount = sb->last_mount; in bch_cache_set_alloc()
1479 c->bucket_bits = ilog2(sb->bucket_size); in bch_cache_set_alloc()
1480 c->block_bits = ilog2(sb->block_size); in bch_cache_set_alloc()
1511 iter_size = (sb->bucket_size / sb->block_size + 1) * in bch_cache_set_alloc()
1549 c->nbuckets += ca->sb.nbuckets; in run_cache_set()
1551 if (CACHE_SYNC(&c->sb)) { in run_cache_set()
1570 prio_read(ca, j->prio_bucket[ca->sb.nr_this_dev]); in run_cache_set()
1636 ca->sb.keys = clamp_t(int, ca->sb.nbuckets >> 7, in run_cache_set()
1639 for (j = 0; j < ca->sb.keys; j++) in run_cache_set()
1640 ca->sb.d[j] = ca->sb.first_bucket + j; in run_cache_set()
1677 SET_CACHE_SYNC(&c->sb, true); in run_cache_set()
1688 c->sb.last_mount = get_seconds(); in run_cache_set()
1706 return ca->sb.block_size == c->sb.block_size && in can_attach_cache()
1707 ca->sb.bucket_size == c->sb.bucket_size && in can_attach_cache()
1708 ca->sb.nr_in_set == c->sb.nr_in_set; in can_attach_cache()
1718 if (!memcmp(c->sb.set_uuid, ca->sb.set_uuid, 16)) { in register_cache_set()
1719 if (c->cache[ca->sb.nr_this_dev]) in register_cache_set()
1725 if (!CACHE_SYNC(&ca->sb)) in register_cache_set()
1726 SET_CACHE_SYNC(&c->sb, false); in register_cache_set()
1731 c = bch_cache_set_alloc(&ca->sb); in register_cache_set()
1736 if (kobject_add(&c->kobj, bcache_kobj, "%pU", c->sb.set_uuid) || in register_cache_set()
1747 sprintf(buf, "cache%i", ca->sb.nr_this_dev); in register_cache_set()
1752 if (ca->sb.seq > c->sb.seq) { in register_cache_set()
1753 c->sb.version = ca->sb.version; in register_cache_set()
1754 memcpy(c->sb.set_uuid, ca->sb.set_uuid, 16); in register_cache_set()
1755 c->sb.flags = ca->sb.flags; in register_cache_set()
1756 c->sb.seq = ca->sb.seq; in register_cache_set()
1757 pr_debug("set version = %llu", c->sb.version); in register_cache_set()
1762 ca->set->cache[ca->sb.nr_this_dev] = ca; in register_cache_set()
1765 if (c->caches_loaded == c->sb.nr_in_set) in register_cache_set()
1782 BUG_ON(ca->set->cache[ca->sb.nr_this_dev] != ca); in bch_cache_release()
1783 ca->set->cache[ca->sb.nr_this_dev] = NULL; in bch_cache_release()
1806 static int cache_alloc(struct cache_sb *sb, struct cache *ca) in cache_alloc() argument
1818 free = roundup_pow_of_two(ca->sb.nbuckets) >> 10; in cache_alloc()
1827 ca->sb.nbuckets)) || in cache_alloc()
1841 static int register_cache(struct cache_sb *sb, struct page *sb_page, in register_cache() argument
1848 memcpy(&ca->sb, sb, sizeof(struct cache_sb)); in register_cache()
1859 ca->discard = CACHE_DISCARD(&ca->sb); in register_cache()
1861 ret = cache_alloc(sb, ca); in register_cache()
1936 struct cache_sb *sb = NULL; in register_bcache() local
1944 !(sb = kmalloc(sizeof(struct cache_sb), GFP_KERNEL))) in register_bcache()
1950 sb); in register_bcache()
1970 err = read_super(sb, bdev, &sb_page); in register_bcache()
1974 if (SB_IS_BDEV(sb)) { in register_bcache()
1980 register_bdev(sb, sb_page, bdev, dc); in register_bcache()
1987 if (register_cache(sb, sb_page, bdev, ca) != 0) in register_bcache()
1993 kfree(sb); in register_bcache()