• Home
  • Raw
  • Download

Lines Matching refs:btt

236 static void btt_debugfs_init(struct btt *btt)  in btt_debugfs_init()  argument
241 btt->debugfs_dir = debugfs_create_dir(dev_name(&btt->nd_btt->dev), in btt_debugfs_init()
243 if (IS_ERR_OR_NULL(btt->debugfs_dir)) in btt_debugfs_init()
246 list_for_each_entry(arena, &btt->arena_list, list) { in btt_debugfs_init()
247 arena_debugfs_init(arena, btt->debugfs_dir, i); in btt_debugfs_init()
515 static struct arena_info *alloc_arena(struct btt *btt, size_t size, in alloc_arena() argument
525 arena->nd_btt = btt->nd_btt; in alloc_arena()
532 arena->external_lbasize = btt->lbasize; in alloc_arena()
567 static void free_arenas(struct btt *btt) in free_arenas() argument
571 list_for_each_entry_safe(arena, next, &btt->arena_list, list) { in free_arenas()
611 static int discover_arenas(struct btt *btt) in discover_arenas() argument
616 size_t remaining = btt->rawsize; in discover_arenas()
627 arena = alloc_arena(btt, 0, 0, 0); in discover_arenas()
638 if (!nd_btt_arena_is_valid(btt->nd_btt, super)) { in discover_arenas()
639 if (remaining == btt->rawsize) { in discover_arenas()
640 btt->init_state = INIT_NOTFOUND; in discover_arenas()
666 list_add_tail(&arena->list, &btt->arena_list); in discover_arenas()
676 btt->num_arenas = num_arenas; in discover_arenas()
677 btt->nlba = cur_nlba; in discover_arenas()
678 btt->init_state = INIT_READY; in discover_arenas()
685 free_arenas(btt); in discover_arenas()
691 static int create_arenas(struct btt *btt) in create_arenas() argument
693 size_t remaining = btt->rawsize; in create_arenas()
704 arena = alloc_arena(btt, arena_size, btt->nlba, cur_off); in create_arenas()
706 free_arenas(btt); in create_arenas()
709 btt->nlba += arena->external_nlba; in create_arenas()
715 list_add_tail(&arena->list, &btt->arena_list); in create_arenas()
783 static int btt_meta_init(struct btt *btt) in btt_meta_init() argument
788 mutex_lock(&btt->init_lock); in btt_meta_init()
789 list_for_each_entry(arena, &btt->arena_list, list) { in btt_meta_init()
807 btt->init_state = INIT_READY; in btt_meta_init()
810 mutex_unlock(&btt->init_lock); in btt_meta_init()
814 static u32 btt_meta_size(struct btt *btt) in btt_meta_size() argument
816 return btt->lbasize - btt->sector_size; in btt_meta_size()
826 static int lba_to_arena(struct btt *btt, sector_t sector, __u32 *premap, in lba_to_arena() argument
830 __u64 lba = div_u64(sector << SECTOR_SHIFT, btt->sector_size); in lba_to_arena()
832 list_for_each_entry(arena_list, &btt->arena_list, list) { in lba_to_arena()
904 static int btt_rw_integrity(struct btt *btt, struct bio_integrity_payload *bip, in btt_rw_integrity() argument
907 unsigned int len = btt_meta_size(btt); in btt_rw_integrity()
914 meta_nsoff = to_namespace_offset(arena, postmap) + btt->sector_size; in btt_rw_integrity()
950 static int btt_rw_integrity(struct btt *btt, struct bio_integrity_payload *bip, in btt_rw_integrity() argument
957 static int btt_read_pg(struct btt *btt, struct bio_integrity_payload *bip, in btt_read_pg() argument
969 lane = nd_region_acquire_lane(btt->nd_region); in btt_read_pg()
971 ret = lba_to_arena(btt, sector, &premap, &arena); in btt_read_pg()
975 cur_len = min(btt->sector_size, len); in btt_read_pg()
1022 ret = btt_rw_integrity(btt, bip, arena, postmap, READ); in btt_read_pg()
1028 nd_region_release_lane(btt->nd_region, lane); in btt_read_pg()
1032 sector += btt->sector_size >> SECTOR_SHIFT; in btt_read_pg()
1040 nd_region_release_lane(btt->nd_region, lane); in btt_read_pg()
1044 static int btt_write_pg(struct btt *btt, struct bio_integrity_payload *bip, in btt_write_pg() argument
1057 lane = nd_region_acquire_lane(btt->nd_region); in btt_write_pg()
1059 ret = lba_to_arena(btt, sector, &premap, &arena); in btt_write_pg()
1062 cur_len = min(btt->sector_size, len); in btt_write_pg()
1087 ret = btt_rw_integrity(btt, bip, arena, new_postmap, in btt_write_pg()
1116 nd_region_release_lane(btt->nd_region, lane); in btt_write_pg()
1120 sector += btt->sector_size >> SECTOR_SHIFT; in btt_write_pg()
1128 nd_region_release_lane(btt->nd_region, lane); in btt_write_pg()
1132 static int btt_do_bvec(struct btt *btt, struct bio_integrity_payload *bip, in btt_do_bvec() argument
1139 ret = btt_read_pg(btt, bip, page, off, sector, len); in btt_do_bvec()
1143 ret = btt_write_pg(btt, bip, sector, page, off, len); in btt_do_bvec()
1152 struct btt *btt = q->queuedata; in btt_make_request() local
1178 BUG_ON(len < btt->sector_size); in btt_make_request()
1179 BUG_ON(len % btt->sector_size); in btt_make_request()
1181 err = btt_do_bvec(btt, bip, bvec.bv_page, len, bvec.bv_offset, in btt_make_request()
1184 dev_info(&btt->nd_btt->dev, in btt_make_request()
1203 struct btt *btt = bdev->bd_disk->private_data; in btt_rw_page() local
1206 rc = btt_do_bvec(btt, NULL, page, PAGE_CACHE_SIZE, 0, rw, sector); in btt_rw_page()
1230 static int btt_blk_init(struct btt *btt) in btt_blk_init() argument
1232 struct nd_btt *nd_btt = btt->nd_btt; in btt_blk_init()
1236 btt->btt_queue = blk_alloc_queue(GFP_KERNEL); in btt_blk_init()
1237 if (!btt->btt_queue) in btt_blk_init()
1240 btt->btt_disk = alloc_disk(0); in btt_blk_init()
1241 if (!btt->btt_disk) { in btt_blk_init()
1242 blk_cleanup_queue(btt->btt_queue); in btt_blk_init()
1246 nvdimm_namespace_disk_name(ndns, btt->btt_disk->disk_name); in btt_blk_init()
1247 btt->btt_disk->driverfs_dev = &btt->nd_btt->dev; in btt_blk_init()
1248 btt->btt_disk->major = btt_major; in btt_blk_init()
1249 btt->btt_disk->first_minor = 0; in btt_blk_init()
1250 btt->btt_disk->fops = &btt_fops; in btt_blk_init()
1251 btt->btt_disk->private_data = btt; in btt_blk_init()
1252 btt->btt_disk->queue = btt->btt_queue; in btt_blk_init()
1253 btt->btt_disk->flags = GENHD_FL_EXT_DEVT; in btt_blk_init()
1255 blk_queue_make_request(btt->btt_queue, btt_make_request); in btt_blk_init()
1256 blk_queue_logical_block_size(btt->btt_queue, btt->sector_size); in btt_blk_init()
1257 blk_queue_max_hw_sectors(btt->btt_queue, UINT_MAX); in btt_blk_init()
1258 blk_queue_bounce_limit(btt->btt_queue, BLK_BOUNCE_ANY); in btt_blk_init()
1259 queue_flag_set_unlocked(QUEUE_FLAG_NONROT, btt->btt_queue); in btt_blk_init()
1260 btt->btt_queue->queuedata = btt; in btt_blk_init()
1262 set_capacity(btt->btt_disk, 0); in btt_blk_init()
1263 add_disk(btt->btt_disk); in btt_blk_init()
1264 if (btt_meta_size(btt)) { in btt_blk_init()
1265 int rc = nd_integrity_init(btt->btt_disk, btt_meta_size(btt)); in btt_blk_init()
1268 del_gendisk(btt->btt_disk); in btt_blk_init()
1269 put_disk(btt->btt_disk); in btt_blk_init()
1270 blk_cleanup_queue(btt->btt_queue); in btt_blk_init()
1274 set_capacity(btt->btt_disk, btt->nlba * btt->sector_size >> 9); in btt_blk_init()
1275 revalidate_disk(btt->btt_disk); in btt_blk_init()
1280 static void btt_blk_cleanup(struct btt *btt) in btt_blk_cleanup() argument
1282 del_gendisk(btt->btt_disk); in btt_blk_cleanup()
1283 put_disk(btt->btt_disk); in btt_blk_cleanup()
1284 blk_cleanup_queue(btt->btt_queue); in btt_blk_cleanup()
1304 static struct btt *btt_init(struct nd_btt *nd_btt, unsigned long long rawsize, in btt_init()
1308 struct btt *btt; in btt_init() local
1311 btt = kzalloc(sizeof(struct btt), GFP_KERNEL); in btt_init()
1312 if (!btt) in btt_init()
1315 btt->nd_btt = nd_btt; in btt_init()
1316 btt->rawsize = rawsize; in btt_init()
1317 btt->lbasize = lbasize; in btt_init()
1318 btt->sector_size = ((lbasize >= 4096) ? 4096 : 512); in btt_init()
1319 INIT_LIST_HEAD(&btt->arena_list); in btt_init()
1320 mutex_init(&btt->init_lock); in btt_init()
1321 btt->nd_region = nd_region; in btt_init()
1323 ret = discover_arenas(btt); in btt_init()
1329 if (btt->init_state != INIT_READY && nd_region->ro) { in btt_init()
1333 } else if (btt->init_state != INIT_READY) { in btt_init()
1334 btt->num_arenas = (rawsize / ARENA_MAX_SIZE) + in btt_init()
1337 btt->num_arenas, rawsize); in btt_init()
1339 ret = create_arenas(btt); in btt_init()
1345 ret = btt_meta_init(btt); in btt_init()
1352 ret = btt_blk_init(btt); in btt_init()
1358 btt_debugfs_init(btt); in btt_init()
1360 return btt; in btt_init()
1363 kfree(btt); in btt_init()
1376 static void btt_fini(struct btt *btt) in btt_fini() argument
1378 if (btt) { in btt_fini()
1379 btt_blk_cleanup(btt); in btt_fini()
1380 free_arenas(btt); in btt_fini()
1381 debugfs_remove_recursive(btt->debugfs_dir); in btt_fini()
1382 kfree(btt); in btt_fini()
1390 struct btt *btt; in nvdimm_namespace_attach_btt() local
1401 btt = btt_init(nd_btt, rawsize, nd_btt->lbasize, nd_btt->uuid, in nvdimm_namespace_attach_btt()
1403 if (!btt) in nvdimm_namespace_attach_btt()
1405 nd_btt->btt = btt; in nvdimm_namespace_attach_btt()
1414 struct btt *btt = nd_btt->btt; in nvdimm_namespace_detach_btt() local
1416 btt_fini(btt); in nvdimm_namespace_detach_btt()
1417 nd_btt->btt = NULL; in nvdimm_namespace_detach_btt()