nd_btt
u64 nsoff = adjust_initial_offset(arena->nd_btt,
dev_err_ratelimited(&btt->nd_btt->dev,
dev_err(&btt->nd_btt->dev,
struct nd_btt *nd_btt = btt->nd_btt;
struct nd_namespace_common *ndns = nd_btt->ndns;
rc = device_add_disk(&btt->nd_btt->dev, btt->btt_disk, NULL);
btt->nd_btt->size = btt->nlba * (u64)btt->sector_size;
static struct btt *btt_init(struct nd_btt *nd_btt, unsigned long long rawsize,
struct device *dev = &nd_btt->dev;
btt->nd_btt = nd_btt;
nsio = to_nd_namespace_io(&nd_btt->ndns->dev);
struct nd_btt *nd_btt = to_nd_btt(ndns->claim);
if (!nd_btt->uuid || !nd_btt->ndns || !nd_btt->lbasize) {
dev_dbg(&nd_btt->dev, "incomplete btt configuration\n");
btt_sb = devm_kzalloc(&nd_btt->dev, sizeof(*btt_sb), GFP_KERNEL);
rc = devm_namespace_enable(&nd_btt->dev, ndns, size);
nd_btt_version(nd_btt, ndns, btt_sb);
rawsize = size - nd_btt->initial_offset;
dev_dbg(&nd_btt->dev, "%s must be at least %ld bytes\n",
ARENA_MIN_SIZE + nd_btt->initial_offset);
nd_region = to_nd_region(nd_btt->dev.parent);
btt = btt_init(nd_btt, rawsize, nd_btt->lbasize, nd_btt->uuid,
nd_btt->btt = btt;
int nvdimm_namespace_detach_btt(struct nd_btt *nd_btt)
struct btt *btt = nd_btt->btt;
nd_btt->btt = NULL;
btt->debugfs_dir = debugfs_create_dir(dev_name(&btt->nd_btt->dev),
return &arena->nd_btt->dev;
static u64 adjust_initial_offset(struct nd_btt *nd_btt, u64 offset)
return offset + nd_btt->initial_offset;
struct nd_btt *nd_btt = arena->nd_btt;
struct nd_namespace_common *ndns = nd_btt->ndns;
offset = adjust_initial_offset(nd_btt, offset);
struct nd_btt *nd_btt = arena->nd_btt;
struct nd_namespace_common *ndns = nd_btt->ndns;
offset = adjust_initial_offset(nd_btt, offset);
arena->nd_btt = btt->nd_btt;
arena->version_major = btt->nd_btt->version_major;
arena->version_minor = btt->nd_btt->version_minor;
if (!nd_btt_arena_is_valid(btt->nd_btt, super)) {
struct nd_btt *nd_btt = arena->nd_btt;
const uuid_t *parent_uuid = nd_dev_to_uuid(&nd_btt->ndns->dev);
export_uuid(super->uuid, nd_btt->uuid);
struct nd_btt *nd_btt;
struct nd_btt *nd_btt;
bool nd_btt_arena_is_valid(struct nd_btt *nd_btt, struct btt_sb *super);
int nd_btt_version(struct nd_btt *nd_btt, struct nd_namespace_common *ndns,
struct nd_btt *nd_btt = to_nd_btt(dev);
rc = nd_namespace_store(dev, &nd_btt->ndns, buf, len);
struct nd_btt *nd_btt = to_nd_btt(dev);
rc = sprintf(buf, "%llu\n", nd_btt->size);
struct nd_btt *nd_btt = to_nd_btt(dev);
struct nd_btt *nd_btt;
nd_btt = kzalloc_obj(*nd_btt);
if (!nd_btt)
nd_btt->id = ida_alloc(&nd_region->btt_ida, GFP_KERNEL);
if (nd_btt->id < 0)
nd_btt->lbasize = lbasize;
nd_btt->uuid = uuid;
dev = &nd_btt->dev;
dev_set_name(dev, "btt%d.%d", nd_region->id, nd_btt->id);
device_initialize(&nd_btt->dev);
lockdep_set_class(&nd_btt->dev.mutex, &nvdimm_btt_key);
if (ndns && !__nd_attach_ndns(&nd_btt->dev, ndns, &nd_btt->ndns)) {
nd_detach_ndns(&nd_btt->dev, &nd_btt->ndns);
ida_free(&nd_region->btt_ida, nd_btt->id);
kfree(nd_btt);
ida_free(&nd_region->btt_ida, nd_btt->id);
kfree(nd_btt->uuid);
kfree(nd_btt);
bool nd_btt_arena_is_valid(struct nd_btt *nd_btt, struct btt_sb *super)
const uuid_t *ns_uuid = nd_dev_to_uuid(&nd_btt->ndns->dev);
dev_info(&nd_btt->dev, "Found arena with an error flag\n");
int nd_btt_version(struct nd_btt *nd_btt, struct nd_namespace_common *ndns,
struct nd_btt *to_nd_btt(struct device *dev)
nd_btt->initial_offset = 0;
nd_btt->version_major = 2;
nd_btt->version_minor = 0;
if (!nd_btt_arena_is_valid(nd_btt, btt_sb))
nd_btt->initial_offset = SZ_4K;
nd_btt->version_major = 1;
struct nd_btt *nd_btt = container_of(dev, struct nd_btt, dev);
nd_btt->version_minor = 1;
if (!nd_btt_arena_is_valid(nd_btt, btt_sb))
static int __nd_btt_probe(struct nd_btt *nd_btt,
if (!btt_sb || !ndns || !nd_btt)
rc = nd_btt_version(nd_btt, ndns, btt_sb);
nd_btt->lbasize = le32_to_cpu(btt_sb->external_lbasize);
nd_btt->uuid = kmemdup(&btt_sb->uuid, sizeof(uuid_t), GFP_KERNEL);
return nd_btt;
if (!nd_btt->uuid)
nd_device_register(&nd_btt->dev);
struct nd_btt *nd_btt = to_nd_btt(btt_dev);
nd_detach_ndns(btt_dev, &nd_btt->ndns);
struct nd_btt *nd_btt = to_nd_btt(dev);
return nd_size_select_show(nd_btt->lbasize, btt_lbasize_supported, buf);
struct nd_btt *nd_btt = to_nd_btt(dev);
rc = nd_size_select_store(dev, buf, &nd_btt->lbasize,
struct nd_btt *nd_btt = to_nd_btt(dev);
if (nd_btt->uuid)
return sprintf(buf, "%pUb\n", nd_btt->uuid);
struct nd_btt *nd_btt = to_nd_btt(dev);
rc = nd_uuid_store(dev, &nd_btt->uuid, buf, len);
struct nd_btt *nd_btt = to_nd_btt(dev);
return sprintf(buf, "%s\n", nd_btt->ndns
? dev_name(&nd_btt->ndns->dev) : "");
struct nd_btt *nd_btt = is_nd_btt(dev) ? to_nd_btt(dev) : NULL;
if (nd_btt || nd_pfn || nd_dax) {
if (nd_btt)
ndns = nd_btt->ndns;
struct nd_btt *nd_btt = to_nd_btt(dev);
nd_btt->lbasize = 0;
kfree(nd_btt->uuid);
nd_btt->uuid = NULL;
struct nd_btt *nd_btt = is_nd_btt(dev) ? to_nd_btt(dev) : NULL;
if (nd_btt || nd_pfn || nd_dax) {
if (nd_btt)
ndns = nd_btt->ndns;
struct nd_btt *nd_btt = to_nd_btt(dev);
uuid2 = nd_btt->uuid;
struct nd_btt *to_nd_btt(struct device *dev);
int nvdimm_namespace_detach_btt(struct nd_btt *nd_btt);
struct nd_btt *nd_btt = to_nd_btt(dev);
ndns = nd_btt->ndns;
struct nd_btt *nd_btt = to_nd_btt(dev);
struct btt *btt = nd_btt->btt;
struct nd_btt *nd_btt = to_nd_btt(dev);
if (nd_region->ns_seed == &nd_btt->ndns->dev)