Lines Matching refs:sb
87 static const char *read_super(struct cache_sb *sb, struct block_device *bdev, in read_super() argument
100 sb->offset = le64_to_cpu(s->offset); in read_super()
101 sb->version = le64_to_cpu(s->version); in read_super()
103 memcpy(sb->magic, s->magic, 16); in read_super()
104 memcpy(sb->uuid, s->uuid, 16); in read_super()
105 memcpy(sb->set_uuid, s->set_uuid, 16); in read_super()
106 memcpy(sb->label, s->label, SB_LABEL_SIZE); in read_super()
108 sb->flags = le64_to_cpu(s->flags); in read_super()
109 sb->seq = le64_to_cpu(s->seq); in read_super()
110 sb->last_mount = le32_to_cpu(s->last_mount); in read_super()
111 sb->first_bucket = le16_to_cpu(s->first_bucket); in read_super()
112 sb->keys = le16_to_cpu(s->keys); in read_super()
115 sb->d[i] = le64_to_cpu(s->d[i]); in read_super()
118 sb->version, sb->flags, sb->seq, sb->keys); in read_super()
121 if (sb->offset != SB_SECTOR) in read_super()
124 if (memcmp(sb->magic, bcache_magic, 16)) in read_super()
128 if (sb->keys > SB_JOURNAL_BUCKETS) in read_super()
136 if (bch_is_zero(sb->uuid, 16)) in read_super()
139 sb->block_size = le16_to_cpu(s->block_size); in read_super()
142 if (sb->block_size << 9 < bdev_logical_block_size(bdev)) in read_super()
145 switch (sb->version) { in read_super()
147 sb->data_offset = BDEV_DATA_START_DEFAULT; in read_super()
150 sb->data_offset = le64_to_cpu(s->data_offset); in read_super()
153 if (sb->data_offset < BDEV_DATA_START_DEFAULT) in read_super()
159 sb->nbuckets = le64_to_cpu(s->nbuckets); in read_super()
160 sb->block_size = le16_to_cpu(s->block_size); in read_super()
161 sb->bucket_size = le16_to_cpu(s->bucket_size); in read_super()
163 sb->nr_in_set = le16_to_cpu(s->nr_in_set); in read_super()
164 sb->nr_this_dev = le16_to_cpu(s->nr_this_dev); in read_super()
167 if (sb->nbuckets > LONG_MAX) in read_super()
171 if (sb->nbuckets < 1 << 7) in read_super()
175 if (!is_power_of_2(sb->block_size) || in read_super()
176 sb->block_size > PAGE_SECTORS || in read_super()
177 !is_power_of_2(sb->bucket_size) || in read_super()
178 sb->bucket_size < PAGE_SECTORS) in read_super()
182 if (get_capacity(bdev->bd_disk) < sb->bucket_size * sb->nbuckets) in read_super()
186 if (bch_is_zero(sb->set_uuid, 16)) in read_super()
190 if (!sb->nr_in_set || in read_super()
191 sb->nr_in_set <= sb->nr_this_dev || in read_super()
192 sb->nr_in_set > MAX_CACHES_PER_SET) in read_super()
196 for (i = 0; i < sb->keys; i++) in read_super()
197 if (sb->d[i] != sb->first_bucket + i) in read_super()
201 if (sb->first_bucket + sb->keys > sb->nbuckets) in read_super()
205 if (sb->first_bucket * sb->bucket_size < 16) in read_super()
214 sb->last_mount = get_seconds(); in read_super()
232 static void __write_super(struct cache_sb *sb, struct bio *bio) in __write_super() argument
242 out->offset = cpu_to_le64(sb->offset); in __write_super()
243 out->version = cpu_to_le64(sb->version); in __write_super()
245 memcpy(out->uuid, sb->uuid, 16); in __write_super()
246 memcpy(out->set_uuid, sb->set_uuid, 16); in __write_super()
247 memcpy(out->label, sb->label, SB_LABEL_SIZE); in __write_super()
249 out->flags = cpu_to_le64(sb->flags); in __write_super()
250 out->seq = cpu_to_le64(sb->seq); in __write_super()
252 out->last_mount = cpu_to_le32(sb->last_mount); in __write_super()
253 out->first_bucket = cpu_to_le16(sb->first_bucket); in __write_super()
254 out->keys = cpu_to_le16(sb->keys); in __write_super()
256 for (i = 0; i < sb->keys; i++) in __write_super()
257 out->d[i] = cpu_to_le64(sb->d[i]); in __write_super()
262 sb->version, sb->flags, sb->seq); in __write_super()
288 __write_super(&dc->sb, bio); in bch_write_bdev_super()
317 c->sb.seq++; in bcache_write_super()
322 ca->sb.version = BCACHE_SB_VERSION_CDEV_WITH_UUID; in bcache_write_super()
323 ca->sb.seq = c->sb.seq; in bcache_write_super()
324 ca->sb.last_mount = c->sb.last_mount; in bcache_write_super()
326 SET_CACHE_SYNC(&ca->sb, CACHE_SYNC(&c->sb)); in bcache_write_super()
334 __write_super(&ca->sb, bio); in bcache_write_super()
451 SET_KEY_SIZE(&k.key, c->sb.bucket_size); in __uuid_write()
531 bio->bi_iter.bi_sector = bucket * ca->sb.bucket_size; in prio_io()
556 atomic_long_add(ca->sb.bucket_size * prio_buckets(ca), in bch_prio_write()
569 b < ca->buckets + ca->sb.nbuckets && d < end; in bch_prio_write()
576 p->magic = pset_magic(&ca->sb); in bch_prio_write()
618 b < ca->buckets + ca->sb.nbuckets; in prio_read()
630 if (p->magic != pset_magic(&ca->sb)) in prio_read()
874 kasprintf(GFP_KERNEL, "CACHED_UUID=%pU", dc->sb.uuid), in bch_cached_dev_run()
879 memcpy(buf, dc->sb.label, SB_LABEL_SIZE); in bch_cached_dev_run()
890 BDEV_STATE(&dc->sb) != BDEV_STATE_NONE) { in bch_cached_dev_run()
894 SET_BDEV_STATE(&dc->sb, BDEV_STATE_STALE); in bch_cached_dev_run()
924 memset(&dc->sb.set_uuid, 0, 16); in cached_dev_detach_finish()
925 SET_BDEV_STATE(&dc->sb, BDEV_STATE_NONE); in cached_dev_detach_finish()
972 if (memcmp(dc->sb.set_uuid, c->sb.set_uuid, 16)) in bch_cached_dev_attach()
985 if (dc->sb.block_size < c->sb.block_size) { in bch_cached_dev_attach()
992 u = uuid_find(c, dc->sb.uuid); in bch_cached_dev_attach()
995 (BDEV_STATE(&dc->sb) == BDEV_STATE_STALE || in bch_cached_dev_attach()
996 BDEV_STATE(&dc->sb) == BDEV_STATE_NONE)) { in bch_cached_dev_attach()
1003 if (BDEV_STATE(&dc->sb) == BDEV_STATE_DIRTY) { in bch_cached_dev_attach()
1023 memcpy(u->uuid, dc->sb.uuid, 16); in bch_cached_dev_attach()
1024 memcpy(u->label, dc->sb.label, SB_LABEL_SIZE); in bch_cached_dev_attach()
1028 memcpy(dc->sb.set_uuid, c->sb.set_uuid, 16); in bch_cached_dev_attach()
1029 SET_BDEV_STATE(&dc->sb, BDEV_STATE_CLEAN); in bch_cached_dev_attach()
1056 if (BDEV_STATE(&dc->sb) == BDEV_STATE_DIRTY) { in bch_cached_dev_attach()
1071 dc->disk.c->sb.set_uuid); in bch_cached_dev_attach()
1154 dc->bdev->bd_part->nr_sects - dc->sb.data_offset); in cached_dev_init()
1159 dc->bdev->bd_part->nr_sects - dc->sb.data_offset); in cached_dev_init()
1172 static void register_bdev(struct cache_sb *sb, struct page *sb_page, in register_bdev() argument
1180 memcpy(&dc->sb, sb, sizeof(struct cache_sb)); in register_bdev()
1190 if (cached_dev_init(dc, sb->block_size << 9)) in register_bdev()
1206 if (BDEV_STATE(&dc->sb) == BDEV_STATE_NONE || in register_bdev()
1207 BDEV_STATE(&dc->sb) == BDEV_STATE_STALE) in register_bdev()
1332 printk(KERN_ERR "bcache: error on %pU: ", c->sb.set_uuid); in bch_cache_set_error()
1370 c->cache[ca->sb.nr_this_dev] = NULL; in cache_set_free()
1393 pr_info("Cache set %pU unregistered", c->sb.set_uuid); in cache_set_free()
1482 struct cache_set *bch_cache_set_alloc(struct cache_sb *sb) in bch_cache_set_alloc() argument
1505 memcpy(c->sb.set_uuid, sb->set_uuid, 16); in bch_cache_set_alloc()
1506 c->sb.block_size = sb->block_size; in bch_cache_set_alloc()
1507 c->sb.bucket_size = sb->bucket_size; in bch_cache_set_alloc()
1508 c->sb.nr_in_set = sb->nr_in_set; in bch_cache_set_alloc()
1509 c->sb.last_mount = sb->last_mount; in bch_cache_set_alloc()
1510 c->bucket_bits = ilog2(sb->bucket_size); in bch_cache_set_alloc()
1511 c->block_bits = ilog2(sb->block_size); in bch_cache_set_alloc()
1542 iter_size = (sb->bucket_size / sb->block_size + 1) * in bch_cache_set_alloc()
1580 c->nbuckets += ca->sb.nbuckets; in run_cache_set()
1582 if (CACHE_SYNC(&c->sb)) { in run_cache_set()
1601 prio_read(ca, j->prio_bucket[ca->sb.nr_this_dev]); in run_cache_set()
1667 ca->sb.keys = clamp_t(int, ca->sb.nbuckets >> 7, in run_cache_set()
1670 for (j = 0; j < ca->sb.keys; j++) in run_cache_set()
1671 ca->sb.d[j] = ca->sb.first_bucket + j; in run_cache_set()
1708 SET_CACHE_SYNC(&c->sb, true); in run_cache_set()
1719 c->sb.last_mount = get_seconds(); in run_cache_set()
1737 return ca->sb.block_size == c->sb.block_size && in can_attach_cache()
1738 ca->sb.bucket_size == c->sb.bucket_size && in can_attach_cache()
1739 ca->sb.nr_in_set == c->sb.nr_in_set; in can_attach_cache()
1749 if (!memcmp(c->sb.set_uuid, ca->sb.set_uuid, 16)) { in register_cache_set()
1750 if (c->cache[ca->sb.nr_this_dev]) in register_cache_set()
1756 if (!CACHE_SYNC(&ca->sb)) in register_cache_set()
1757 SET_CACHE_SYNC(&c->sb, false); in register_cache_set()
1762 c = bch_cache_set_alloc(&ca->sb); in register_cache_set()
1767 if (kobject_add(&c->kobj, bcache_kobj, "%pU", c->sb.set_uuid) || in register_cache_set()
1778 sprintf(buf, "cache%i", ca->sb.nr_this_dev); in register_cache_set()
1783 if (ca->sb.seq > c->sb.seq) { in register_cache_set()
1784 c->sb.version = ca->sb.version; in register_cache_set()
1785 memcpy(c->sb.set_uuid, ca->sb.set_uuid, 16); in register_cache_set()
1786 c->sb.flags = ca->sb.flags; in register_cache_set()
1787 c->sb.seq = ca->sb.seq; in register_cache_set()
1788 pr_debug("set version = %llu", c->sb.version); in register_cache_set()
1793 ca->set->cache[ca->sb.nr_this_dev] = ca; in register_cache_set()
1796 if (c->caches_loaded == c->sb.nr_in_set) in register_cache_set()
1813 BUG_ON(ca->set->cache[ca->sb.nr_this_dev] != ca); in bch_cache_release()
1814 ca->set->cache[ca->sb.nr_this_dev] = NULL; in bch_cache_release()
1839 static int cache_alloc(struct cache_sb *sb, struct cache *ca) in cache_alloc() argument
1851 free = roundup_pow_of_two(ca->sb.nbuckets) >> 10; in cache_alloc()
1860 ca->sb.nbuckets)) || in cache_alloc()
1875 static int register_cache(struct cache_sb *sb, struct page *sb_page, in register_cache() argument
1882 memcpy(&ca->sb, sb, sizeof(struct cache_sb)); in register_cache()
1893 ca->discard = CACHE_DISCARD(&ca->sb); in register_cache()
1895 ret = cache_alloc(sb, ca); in register_cache()
1970 struct cache_sb *sb = NULL; in register_bcache() local
1978 !(sb = kmalloc(sizeof(struct cache_sb), GFP_KERNEL))) in register_bcache()
1984 sb); in register_bcache()
2004 err = read_super(sb, bdev, &sb_page); in register_bcache()
2008 if (SB_IS_BDEV(sb)) { in register_bcache()
2014 register_bdev(sb, sb_page, bdev, dc); in register_bcache()
2021 if (register_cache(sb, sb_page, bdev, ca) != 0) in register_bcache()
2027 kfree(sb); in register_bcache()