Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
[linux-block.git] / drivers / nvdimm / label.c
1 /*
2  * Copyright(c) 2013-2015 Intel Corporation. All rights reserved.
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of version 2 of the GNU General Public License as
6  * published by the Free Software Foundation.
7  *
8  * This program is distributed in the hope that it will be useful, but
9  * WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
11  * General Public License for more details.
12  */
13 #include <linux/device.h>
14 #include <linux/ndctl.h>
15 #include <linux/uuid.h>
16 #include <linux/slab.h>
17 #include <linux/io.h>
18 #include <linux/nd.h>
19 #include "nd-core.h"
20 #include "label.h"
21 #include "nd.h"
22
23 static guid_t nvdimm_btt_guid;
24 static guid_t nvdimm_btt2_guid;
25 static guid_t nvdimm_pfn_guid;
26 static guid_t nvdimm_dax_guid;
27
28 static const char NSINDEX_SIGNATURE[] = "NAMESPACE_INDEX\0";
29
30 static u32 best_seq(u32 a, u32 b)
31 {
32         a &= NSINDEX_SEQ_MASK;
33         b &= NSINDEX_SEQ_MASK;
34
35         if (a == 0 || a == b)
36                 return b;
37         else if (b == 0)
38                 return a;
39         else if (nd_inc_seq(a) == b)
40                 return b;
41         else
42                 return a;
43 }
44
45 unsigned sizeof_namespace_label(struct nvdimm_drvdata *ndd)
46 {
47         return ndd->nslabel_size;
48 }
49
50 static size_t __sizeof_namespace_index(u32 nslot)
51 {
52         return ALIGN(sizeof(struct nd_namespace_index) + DIV_ROUND_UP(nslot, 8),
53                         NSINDEX_ALIGN);
54 }
55
56 static int __nvdimm_num_label_slots(struct nvdimm_drvdata *ndd,
57                 size_t index_size)
58 {
59         return (ndd->nsarea.config_size - index_size * 2) /
60                         sizeof_namespace_label(ndd);
61 }
62
63 int nvdimm_num_label_slots(struct nvdimm_drvdata *ndd)
64 {
65         u32 tmp_nslot, n;
66
67         tmp_nslot = ndd->nsarea.config_size / sizeof_namespace_label(ndd);
68         n = __sizeof_namespace_index(tmp_nslot) / NSINDEX_ALIGN;
69
70         return __nvdimm_num_label_slots(ndd, NSINDEX_ALIGN * n);
71 }
72
73 size_t sizeof_namespace_index(struct nvdimm_drvdata *ndd)
74 {
75         u32 nslot, space, size;
76
77         /*
78          * Per UEFI 2.7, the minimum size of the Label Storage Area is large
79          * enough to hold 2 index blocks and 2 labels.  The minimum index
80          * block size is 256 bytes. The label size is 128 for namespaces
81          * prior to version 1.2 and at minimum 256 for version 1.2 and later.
82          */
83         nslot = nvdimm_num_label_slots(ndd);
84         space = ndd->nsarea.config_size - nslot * sizeof_namespace_label(ndd);
85         size = __sizeof_namespace_index(nslot) * 2;
86         if (size <= space && nslot >= 2)
87                 return size / 2;
88
89         dev_err(ndd->dev, "label area (%d) too small to host (%d byte) labels\n",
90                         ndd->nsarea.config_size, sizeof_namespace_label(ndd));
91         return 0;
92 }
93
94 static int __nd_label_validate(struct nvdimm_drvdata *ndd)
95 {
96         /*
97          * On media label format consists of two index blocks followed
98          * by an array of labels.  None of these structures are ever
99          * updated in place.  A sequence number tracks the current
100          * active index and the next one to write, while labels are
101          * written to free slots.
102          *
103          *     +------------+
104          *     |            |
105          *     |  nsindex0  |
106          *     |            |
107          *     +------------+
108          *     |            |
109          *     |  nsindex1  |
110          *     |            |
111          *     +------------+
112          *     |   label0   |
113          *     +------------+
114          *     |   label1   |
115          *     +------------+
116          *     |            |
117          *      ....nslot...
118          *     |            |
119          *     +------------+
120          *     |   labelN   |
121          *     +------------+
122          */
123         struct nd_namespace_index *nsindex[] = {
124                 to_namespace_index(ndd, 0),
125                 to_namespace_index(ndd, 1),
126         };
127         const int num_index = ARRAY_SIZE(nsindex);
128         struct device *dev = ndd->dev;
129         bool valid[2] = { 0 };
130         int i, num_valid = 0;
131         u32 seq;
132
133         for (i = 0; i < num_index; i++) {
134                 u32 nslot;
135                 u8 sig[NSINDEX_SIG_LEN];
136                 u64 sum_save, sum, size;
137                 unsigned int version, labelsize;
138
139                 memcpy(sig, nsindex[i]->sig, NSINDEX_SIG_LEN);
140                 if (memcmp(sig, NSINDEX_SIGNATURE, NSINDEX_SIG_LEN) != 0) {
141                         dev_dbg(dev, "nsindex%d signature invalid\n", i);
142                         continue;
143                 }
144
145                 /* label sizes larger than 128 arrived with v1.2 */
146                 version = __le16_to_cpu(nsindex[i]->major) * 100
147                         + __le16_to_cpu(nsindex[i]->minor);
148                 if (version >= 102)
149                         labelsize = 1 << (7 + nsindex[i]->labelsize);
150                 else
151                         labelsize = 128;
152
153                 if (labelsize != sizeof_namespace_label(ndd)) {
154                         dev_dbg(dev, "nsindex%d labelsize %d invalid\n",
155                                         i, nsindex[i]->labelsize);
156                         continue;
157                 }
158
159                 sum_save = __le64_to_cpu(nsindex[i]->checksum);
160                 nsindex[i]->checksum = __cpu_to_le64(0);
161                 sum = nd_fletcher64(nsindex[i], sizeof_namespace_index(ndd), 1);
162                 nsindex[i]->checksum = __cpu_to_le64(sum_save);
163                 if (sum != sum_save) {
164                         dev_dbg(dev, "nsindex%d checksum invalid\n", i);
165                         continue;
166                 }
167
168                 seq = __le32_to_cpu(nsindex[i]->seq);
169                 if ((seq & NSINDEX_SEQ_MASK) == 0) {
170                         dev_dbg(dev, "nsindex%d sequence: %#x invalid\n", i, seq);
171                         continue;
172                 }
173
174                 /* sanity check the index against expected values */
175                 if (__le64_to_cpu(nsindex[i]->myoff)
176                                 != i * sizeof_namespace_index(ndd)) {
177                         dev_dbg(dev, "nsindex%d myoff: %#llx invalid\n",
178                                         i, (unsigned long long)
179                                         __le64_to_cpu(nsindex[i]->myoff));
180                         continue;
181                 }
182                 if (__le64_to_cpu(nsindex[i]->otheroff)
183                                 != (!i) * sizeof_namespace_index(ndd)) {
184                         dev_dbg(dev, "nsindex%d otheroff: %#llx invalid\n",
185                                         i, (unsigned long long)
186                                         __le64_to_cpu(nsindex[i]->otheroff));
187                         continue;
188                 }
189                 if (__le64_to_cpu(nsindex[i]->labeloff)
190                                 != 2 * sizeof_namespace_index(ndd)) {
191                         dev_dbg(dev, "nsindex%d labeloff: %#llx invalid\n",
192                                         i, (unsigned long long)
193                                         __le64_to_cpu(nsindex[i]->labeloff));
194                         continue;
195                 }
196
197                 size = __le64_to_cpu(nsindex[i]->mysize);
198                 if (size > sizeof_namespace_index(ndd)
199                                 || size < sizeof(struct nd_namespace_index)) {
200                         dev_dbg(dev, "nsindex%d mysize: %#llx invalid\n", i, size);
201                         continue;
202                 }
203
204                 nslot = __le32_to_cpu(nsindex[i]->nslot);
205                 if (nslot * sizeof_namespace_label(ndd)
206                                 + 2 * sizeof_namespace_index(ndd)
207                                 > ndd->nsarea.config_size) {
208                         dev_dbg(dev, "nsindex%d nslot: %u invalid, config_size: %#x\n",
209                                         i, nslot, ndd->nsarea.config_size);
210                         continue;
211                 }
212                 valid[i] = true;
213                 num_valid++;
214         }
215
216         switch (num_valid) {
217         case 0:
218                 break;
219         case 1:
220                 for (i = 0; i < num_index; i++)
221                         if (valid[i])
222                                 return i;
223                 /* can't have num_valid > 0 but valid[] = { false, false } */
224                 WARN_ON(1);
225                 break;
226         default:
227                 /* pick the best index... */
228                 seq = best_seq(__le32_to_cpu(nsindex[0]->seq),
229                                 __le32_to_cpu(nsindex[1]->seq));
230                 if (seq == (__le32_to_cpu(nsindex[1]->seq) & NSINDEX_SEQ_MASK))
231                         return 1;
232                 else
233                         return 0;
234                 break;
235         }
236
237         return -1;
238 }
239
240 static int nd_label_validate(struct nvdimm_drvdata *ndd)
241 {
242         /*
243          * In order to probe for and validate namespace index blocks we
244          * need to know the size of the labels, and we can't trust the
245          * size of the labels until we validate the index blocks.
246          * Resolve this dependency loop by probing for known label
247          * sizes, but default to v1.2 256-byte namespace labels if
248          * discovery fails.
249          */
250         int label_size[] = { 128, 256 };
251         int i, rc;
252
253         for (i = 0; i < ARRAY_SIZE(label_size); i++) {
254                 ndd->nslabel_size = label_size[i];
255                 rc = __nd_label_validate(ndd);
256                 if (rc >= 0)
257                         return rc;
258         }
259
260         return -1;
261 }
262
263 static void nd_label_copy(struct nvdimm_drvdata *ndd,
264                           struct nd_namespace_index *dst,
265                           struct nd_namespace_index *src)
266 {
267         /* just exit if either destination or source is NULL */
268         if (!dst || !src)
269                 return;
270
271         memcpy(dst, src, sizeof_namespace_index(ndd));
272 }
273
274 static struct nd_namespace_label *nd_label_base(struct nvdimm_drvdata *ndd)
275 {
276         void *base = to_namespace_index(ndd, 0);
277
278         return base + 2 * sizeof_namespace_index(ndd);
279 }
280
281 static int to_slot(struct nvdimm_drvdata *ndd,
282                 struct nd_namespace_label *nd_label)
283 {
284         unsigned long label, base;
285
286         label = (unsigned long) nd_label;
287         base = (unsigned long) nd_label_base(ndd);
288
289         return (label - base) / sizeof_namespace_label(ndd);
290 }
291
292 static struct nd_namespace_label *to_label(struct nvdimm_drvdata *ndd, int slot)
293 {
294         unsigned long label, base;
295
296         base = (unsigned long) nd_label_base(ndd);
297         label = base + sizeof_namespace_label(ndd) * slot;
298
299         return (struct nd_namespace_label *) label;
300 }
301
302 #define for_each_clear_bit_le(bit, addr, size) \
303         for ((bit) = find_next_zero_bit_le((addr), (size), 0);  \
304              (bit) < (size);                                    \
305              (bit) = find_next_zero_bit_le((addr), (size), (bit) + 1))
306
307 /**
308  * preamble_index - common variable initialization for nd_label_* routines
309  * @ndd: dimm container for the relevant label set
310  * @idx: namespace_index index
311  * @nsindex_out: on return set to the currently active namespace index
312  * @free: on return set to the free label bitmap in the index
313  * @nslot: on return set to the number of slots in the label space
314  */
315 static bool preamble_index(struct nvdimm_drvdata *ndd, int idx,
316                 struct nd_namespace_index **nsindex_out,
317                 unsigned long **free, u32 *nslot)
318 {
319         struct nd_namespace_index *nsindex;
320
321         nsindex = to_namespace_index(ndd, idx);
322         if (nsindex == NULL)
323                 return false;
324
325         *free = (unsigned long *) nsindex->free;
326         *nslot = __le32_to_cpu(nsindex->nslot);
327         *nsindex_out = nsindex;
328
329         return true;
330 }
331
332 char *nd_label_gen_id(struct nd_label_id *label_id, u8 *uuid, u32 flags)
333 {
334         if (!label_id || !uuid)
335                 return NULL;
336         snprintf(label_id->id, ND_LABEL_ID_SIZE, "%s-%pUb",
337                         flags & NSLABEL_FLAG_LOCAL ? "blk" : "pmem", uuid);
338         return label_id->id;
339 }
340
341 static bool preamble_current(struct nvdimm_drvdata *ndd,
342                 struct nd_namespace_index **nsindex,
343                 unsigned long **free, u32 *nslot)
344 {
345         return preamble_index(ndd, ndd->ns_current, nsindex,
346                         free, nslot);
347 }
348
349 static bool preamble_next(struct nvdimm_drvdata *ndd,
350                 struct nd_namespace_index **nsindex,
351                 unsigned long **free, u32 *nslot)
352 {
353         return preamble_index(ndd, ndd->ns_next, nsindex,
354                         free, nslot);
355 }
356
357 static bool slot_valid(struct nvdimm_drvdata *ndd,
358                 struct nd_namespace_label *nd_label, u32 slot)
359 {
360         /* check that we are written where we expect to be written */
361         if (slot != __le32_to_cpu(nd_label->slot))
362                 return false;
363
364         /* check that DPA allocations are page aligned */
365         if ((__le64_to_cpu(nd_label->dpa)
366                                 | __le64_to_cpu(nd_label->rawsize)) % SZ_4K)
367                 return false;
368
369         /* check checksum */
370         if (namespace_label_has(ndd, checksum)) {
371                 u64 sum, sum_save;
372
373                 sum_save = __le64_to_cpu(nd_label->checksum);
374                 nd_label->checksum = __cpu_to_le64(0);
375                 sum = nd_fletcher64(nd_label, sizeof_namespace_label(ndd), 1);
376                 nd_label->checksum = __cpu_to_le64(sum_save);
377                 if (sum != sum_save) {
378                         dev_dbg(ndd->dev, "fail checksum. slot: %d expect: %#llx\n",
379                                 slot, sum);
380                         return false;
381                 }
382         }
383
384         return true;
385 }
386
387 int nd_label_reserve_dpa(struct nvdimm_drvdata *ndd)
388 {
389         struct nd_namespace_index *nsindex;
390         unsigned long *free;
391         u32 nslot, slot;
392
393         if (!preamble_current(ndd, &nsindex, &free, &nslot))
394                 return 0; /* no label, nothing to reserve */
395
396         for_each_clear_bit_le(slot, free, nslot) {
397                 struct nvdimm *nvdimm = to_nvdimm(ndd->dev);
398                 struct nd_namespace_label *nd_label;
399                 struct nd_region *nd_region = NULL;
400                 u8 label_uuid[NSLABEL_UUID_LEN];
401                 struct nd_label_id label_id;
402                 struct resource *res;
403                 u32 flags;
404
405                 nd_label = to_label(ndd, slot);
406
407                 if (!slot_valid(ndd, nd_label, slot))
408                         continue;
409
410                 memcpy(label_uuid, nd_label->uuid, NSLABEL_UUID_LEN);
411                 flags = __le32_to_cpu(nd_label->flags);
412                 if (test_bit(NDD_NOBLK, &nvdimm->flags))
413                         flags &= ~NSLABEL_FLAG_LOCAL;
414                 nd_label_gen_id(&label_id, label_uuid, flags);
415                 res = nvdimm_allocate_dpa(ndd, &label_id,
416                                 __le64_to_cpu(nd_label->dpa),
417                                 __le64_to_cpu(nd_label->rawsize));
418                 nd_dbg_dpa(nd_region, ndd, res, "reserve\n");
419                 if (!res)
420                         return -EBUSY;
421         }
422
423         return 0;
424 }
425
426 int nd_label_data_init(struct nvdimm_drvdata *ndd)
427 {
428         size_t config_size, read_size, max_xfer, offset;
429         struct nd_namespace_index *nsindex;
430         unsigned int i;
431         int rc = 0;
432         u32 nslot;
433
434         if (ndd->data)
435                 return 0;
436
437         if (ndd->nsarea.status || ndd->nsarea.max_xfer == 0) {
438                 dev_dbg(ndd->dev, "failed to init config data area: (%u:%u)\n",
439                         ndd->nsarea.max_xfer, ndd->nsarea.config_size);
440                 return -ENXIO;
441         }
442
443         /*
444          * We need to determine the maximum index area as this is the section
445          * we must read and validate before we can start processing labels.
446          *
447          * If the area is too small to contain the two indexes and 2 labels
448          * then we abort.
449          *
450          * Start at a label size of 128 as this should result in the largest
451          * possible namespace index size.
452          */
453         ndd->nslabel_size = 128;
454         read_size = sizeof_namespace_index(ndd) * 2;
455         if (!read_size)
456                 return -ENXIO;
457
458         /* Allocate config data */
459         config_size = ndd->nsarea.config_size;
460         ndd->data = kvzalloc(config_size, GFP_KERNEL);
461         if (!ndd->data)
462                 return -ENOMEM;
463
464         /*
465          * We want to guarantee as few reads as possible while conserving
466          * memory. To do that we figure out how much unused space will be left
467          * in the last read, divide that by the total number of reads it is
468          * going to take given our maximum transfer size, and then reduce our
469          * maximum transfer size based on that result.
470          */
471         max_xfer = min_t(size_t, ndd->nsarea.max_xfer, config_size);
472         if (read_size < max_xfer) {
473                 /* trim waste */
474                 max_xfer -= ((max_xfer - 1) - (config_size - 1) % max_xfer) /
475                             DIV_ROUND_UP(config_size, max_xfer);
476                 /* make certain we read indexes in exactly 1 read */
477                 if (max_xfer < read_size)
478                         max_xfer = read_size;
479         }
480
481         /* Make our initial read size a multiple of max_xfer size */
482         read_size = min(DIV_ROUND_UP(read_size, max_xfer) * max_xfer,
483                         config_size);
484
485         /* Read the index data */
486         rc = nvdimm_get_config_data(ndd, ndd->data, 0, read_size);
487         if (rc)
488                 goto out_err;
489
490         /* Validate index data, if not valid assume all labels are invalid */
491         ndd->ns_current = nd_label_validate(ndd);
492         if (ndd->ns_current < 0)
493                 return 0;
494
495         /* Record our index values */
496         ndd->ns_next = nd_label_next_nsindex(ndd->ns_current);
497
498         /* Copy "current" index on top of the "next" index */
499         nsindex = to_current_namespace_index(ndd);
500         nd_label_copy(ndd, to_next_namespace_index(ndd), nsindex);
501
502         /* Determine starting offset for label data */
503         offset = __le64_to_cpu(nsindex->labeloff);
504         nslot = __le32_to_cpu(nsindex->nslot);
505
506         /* Loop through the free list pulling in any active labels */
507         for (i = 0; i < nslot; i++, offset += ndd->nslabel_size) {
508                 size_t label_read_size;
509
510                 /* zero out the unused labels */
511                 if (test_bit_le(i, nsindex->free)) {
512                         memset(ndd->data + offset, 0, ndd->nslabel_size);
513                         continue;
514                 }
515
516                 /* if we already read past here then just continue */
517                 if (offset + ndd->nslabel_size <= read_size)
518                         continue;
519
520                 /* if we haven't read in a while reset our read_size offset */
521                 if (read_size < offset)
522                         read_size = offset;
523
524                 /* determine how much more will be read after this next call. */
525                 label_read_size = offset + ndd->nslabel_size - read_size;
526                 label_read_size = DIV_ROUND_UP(label_read_size, max_xfer) *
527                                   max_xfer;
528
529                 /* truncate last read if needed */
530                 if (read_size + label_read_size > config_size)
531                         label_read_size = config_size - read_size;
532
533                 /* Read the label data */
534                 rc = nvdimm_get_config_data(ndd, ndd->data + read_size,
535                                             read_size, label_read_size);
536                 if (rc)
537                         goto out_err;
538
539                 /* push read_size to next read offset */
540                 read_size += label_read_size;
541         }
542
543         dev_dbg(ndd->dev, "len: %zu rc: %d\n", offset, rc);
544 out_err:
545         return rc;
546 }
547
548 int nd_label_active_count(struct nvdimm_drvdata *ndd)
549 {
550         struct nd_namespace_index *nsindex;
551         unsigned long *free;
552         u32 nslot, slot;
553         int count = 0;
554
555         if (!preamble_current(ndd, &nsindex, &free, &nslot))
556                 return 0;
557
558         for_each_clear_bit_le(slot, free, nslot) {
559                 struct nd_namespace_label *nd_label;
560
561                 nd_label = to_label(ndd, slot);
562
563                 if (!slot_valid(ndd, nd_label, slot)) {
564                         u32 label_slot = __le32_to_cpu(nd_label->slot);
565                         u64 size = __le64_to_cpu(nd_label->rawsize);
566                         u64 dpa = __le64_to_cpu(nd_label->dpa);
567
568                         dev_dbg(ndd->dev,
569                                 "slot%d invalid slot: %d dpa: %llx size: %llx\n",
570                                         slot, label_slot, dpa, size);
571                         continue;
572                 }
573                 count++;
574         }
575         return count;
576 }
577
578 struct nd_namespace_label *nd_label_active(struct nvdimm_drvdata *ndd, int n)
579 {
580         struct nd_namespace_index *nsindex;
581         unsigned long *free;
582         u32 nslot, slot;
583
584         if (!preamble_current(ndd, &nsindex, &free, &nslot))
585                 return NULL;
586
587         for_each_clear_bit_le(slot, free, nslot) {
588                 struct nd_namespace_label *nd_label;
589
590                 nd_label = to_label(ndd, slot);
591                 if (!slot_valid(ndd, nd_label, slot))
592                         continue;
593
594                 if (n-- == 0)
595                         return to_label(ndd, slot);
596         }
597
598         return NULL;
599 }
600
601 u32 nd_label_alloc_slot(struct nvdimm_drvdata *ndd)
602 {
603         struct nd_namespace_index *nsindex;
604         unsigned long *free;
605         u32 nslot, slot;
606
607         if (!preamble_next(ndd, &nsindex, &free, &nslot))
608                 return UINT_MAX;
609
610         WARN_ON(!is_nvdimm_bus_locked(ndd->dev));
611
612         slot = find_next_bit_le(free, nslot, 0);
613         if (slot == nslot)
614                 return UINT_MAX;
615
616         clear_bit_le(slot, free);
617
618         return slot;
619 }
620
621 bool nd_label_free_slot(struct nvdimm_drvdata *ndd, u32 slot)
622 {
623         struct nd_namespace_index *nsindex;
624         unsigned long *free;
625         u32 nslot;
626
627         if (!preamble_next(ndd, &nsindex, &free, &nslot))
628                 return false;
629
630         WARN_ON(!is_nvdimm_bus_locked(ndd->dev));
631
632         if (slot < nslot)
633                 return !test_and_set_bit_le(slot, free);
634         return false;
635 }
636
637 u32 nd_label_nfree(struct nvdimm_drvdata *ndd)
638 {
639         struct nd_namespace_index *nsindex;
640         unsigned long *free;
641         u32 nslot;
642
643         WARN_ON(!is_nvdimm_bus_locked(ndd->dev));
644
645         if (!preamble_next(ndd, &nsindex, &free, &nslot))
646                 return nvdimm_num_label_slots(ndd);
647
648         return bitmap_weight(free, nslot);
649 }
650
651 static int nd_label_write_index(struct nvdimm_drvdata *ndd, int index, u32 seq,
652                 unsigned long flags)
653 {
654         struct nd_namespace_index *nsindex;
655         unsigned long offset;
656         u64 checksum;
657         u32 nslot;
658         int rc;
659
660         nsindex = to_namespace_index(ndd, index);
661         if (flags & ND_NSINDEX_INIT)
662                 nslot = nvdimm_num_label_slots(ndd);
663         else
664                 nslot = __le32_to_cpu(nsindex->nslot);
665
666         memcpy(nsindex->sig, NSINDEX_SIGNATURE, NSINDEX_SIG_LEN);
667         memset(&nsindex->flags, 0, 3);
668         nsindex->labelsize = sizeof_namespace_label(ndd) >> 8;
669         nsindex->seq = __cpu_to_le32(seq);
670         offset = (unsigned long) nsindex
671                 - (unsigned long) to_namespace_index(ndd, 0);
672         nsindex->myoff = __cpu_to_le64(offset);
673         nsindex->mysize = __cpu_to_le64(sizeof_namespace_index(ndd));
674         offset = (unsigned long) to_namespace_index(ndd,
675                         nd_label_next_nsindex(index))
676                 - (unsigned long) to_namespace_index(ndd, 0);
677         nsindex->otheroff = __cpu_to_le64(offset);
678         offset = (unsigned long) nd_label_base(ndd)
679                 - (unsigned long) to_namespace_index(ndd, 0);
680         nsindex->labeloff = __cpu_to_le64(offset);
681         nsindex->nslot = __cpu_to_le32(nslot);
682         nsindex->major = __cpu_to_le16(1);
683         if (sizeof_namespace_label(ndd) < 256)
684                 nsindex->minor = __cpu_to_le16(1);
685         else
686                 nsindex->minor = __cpu_to_le16(2);
687         nsindex->checksum = __cpu_to_le64(0);
688         if (flags & ND_NSINDEX_INIT) {
689                 unsigned long *free = (unsigned long *) nsindex->free;
690                 u32 nfree = ALIGN(nslot, BITS_PER_LONG);
691                 int last_bits, i;
692
693                 memset(nsindex->free, 0xff, nfree / 8);
694                 for (i = 0, last_bits = nfree - nslot; i < last_bits; i++)
695                         clear_bit_le(nslot + i, free);
696         }
697         checksum = nd_fletcher64(nsindex, sizeof_namespace_index(ndd), 1);
698         nsindex->checksum = __cpu_to_le64(checksum);
699         rc = nvdimm_set_config_data(ndd, __le64_to_cpu(nsindex->myoff),
700                         nsindex, sizeof_namespace_index(ndd));
701         if (rc < 0)
702                 return rc;
703
704         if (flags & ND_NSINDEX_INIT)
705                 return 0;
706
707         /* copy the index we just wrote to the new 'next' */
708         WARN_ON(index != ndd->ns_next);
709         nd_label_copy(ndd, to_current_namespace_index(ndd), nsindex);
710         ndd->ns_current = nd_label_next_nsindex(ndd->ns_current);
711         ndd->ns_next = nd_label_next_nsindex(ndd->ns_next);
712         WARN_ON(ndd->ns_current == ndd->ns_next);
713
714         return 0;
715 }
716
717 static unsigned long nd_label_offset(struct nvdimm_drvdata *ndd,
718                 struct nd_namespace_label *nd_label)
719 {
720         return (unsigned long) nd_label
721                 - (unsigned long) to_namespace_index(ndd, 0);
722 }
723
724 enum nvdimm_claim_class to_nvdimm_cclass(guid_t *guid)
725 {
726         if (guid_equal(guid, &nvdimm_btt_guid))
727                 return NVDIMM_CCLASS_BTT;
728         else if (guid_equal(guid, &nvdimm_btt2_guid))
729                 return NVDIMM_CCLASS_BTT2;
730         else if (guid_equal(guid, &nvdimm_pfn_guid))
731                 return NVDIMM_CCLASS_PFN;
732         else if (guid_equal(guid, &nvdimm_dax_guid))
733                 return NVDIMM_CCLASS_DAX;
734         else if (guid_equal(guid, &guid_null))
735                 return NVDIMM_CCLASS_NONE;
736
737         return NVDIMM_CCLASS_UNKNOWN;
738 }
739
740 static const guid_t *to_abstraction_guid(enum nvdimm_claim_class claim_class,
741         guid_t *target)
742 {
743         if (claim_class == NVDIMM_CCLASS_BTT)
744                 return &nvdimm_btt_guid;
745         else if (claim_class == NVDIMM_CCLASS_BTT2)
746                 return &nvdimm_btt2_guid;
747         else if (claim_class == NVDIMM_CCLASS_PFN)
748                 return &nvdimm_pfn_guid;
749         else if (claim_class == NVDIMM_CCLASS_DAX)
750                 return &nvdimm_dax_guid;
751         else if (claim_class == NVDIMM_CCLASS_UNKNOWN) {
752                 /*
753                  * If we're modifying a namespace for which we don't
754                  * know the claim_class, don't touch the existing guid.
755                  */
756                 return target;
757         } else
758                 return &guid_null;
759 }
760
761 static void reap_victim(struct nd_mapping *nd_mapping,
762                 struct nd_label_ent *victim)
763 {
764         struct nvdimm_drvdata *ndd = to_ndd(nd_mapping);
765         u32 slot = to_slot(ndd, victim->label);
766
767         dev_dbg(ndd->dev, "free: %d\n", slot);
768         nd_label_free_slot(ndd, slot);
769         victim->label = NULL;
770 }
771
772 static int __pmem_label_update(struct nd_region *nd_region,
773                 struct nd_mapping *nd_mapping, struct nd_namespace_pmem *nspm,
774                 int pos, unsigned long flags)
775 {
776         struct nd_namespace_common *ndns = &nspm->nsio.common;
777         struct nd_interleave_set *nd_set = nd_region->nd_set;
778         struct nvdimm_drvdata *ndd = to_ndd(nd_mapping);
779         struct nd_namespace_label *nd_label;
780         struct nd_namespace_index *nsindex;
781         struct nd_label_ent *label_ent;
782         struct nd_label_id label_id;
783         struct resource *res;
784         unsigned long *free;
785         u32 nslot, slot;
786         size_t offset;
787         u64 cookie;
788         int rc;
789
790         if (!preamble_next(ndd, &nsindex, &free, &nslot))
791                 return -ENXIO;
792
793         cookie = nd_region_interleave_set_cookie(nd_region, nsindex);
794         nd_label_gen_id(&label_id, nspm->uuid, 0);
795         for_each_dpa_resource(ndd, res)
796                 if (strcmp(res->name, label_id.id) == 0)
797                         break;
798
799         if (!res) {
800                 WARN_ON_ONCE(1);
801                 return -ENXIO;
802         }
803
804         /* allocate and write the label to the staging (next) index */
805         slot = nd_label_alloc_slot(ndd);
806         if (slot == UINT_MAX)
807                 return -ENXIO;
808         dev_dbg(ndd->dev, "allocated: %d\n", slot);
809
810         nd_label = to_label(ndd, slot);
811         memset(nd_label, 0, sizeof_namespace_label(ndd));
812         memcpy(nd_label->uuid, nspm->uuid, NSLABEL_UUID_LEN);
813         if (nspm->alt_name)
814                 memcpy(nd_label->name, nspm->alt_name, NSLABEL_NAME_LEN);
815         nd_label->flags = __cpu_to_le32(flags);
816         nd_label->nlabel = __cpu_to_le16(nd_region->ndr_mappings);
817         nd_label->position = __cpu_to_le16(pos);
818         nd_label->isetcookie = __cpu_to_le64(cookie);
819         nd_label->rawsize = __cpu_to_le64(resource_size(res));
820         nd_label->lbasize = __cpu_to_le64(nspm->lbasize);
821         nd_label->dpa = __cpu_to_le64(res->start);
822         nd_label->slot = __cpu_to_le32(slot);
823         if (namespace_label_has(ndd, type_guid))
824                 guid_copy(&nd_label->type_guid, &nd_set->type_guid);
825         if (namespace_label_has(ndd, abstraction_guid))
826                 guid_copy(&nd_label->abstraction_guid,
827                                 to_abstraction_guid(ndns->claim_class,
828                                         &nd_label->abstraction_guid));
829         if (namespace_label_has(ndd, checksum)) {
830                 u64 sum;
831
832                 nd_label->checksum = __cpu_to_le64(0);
833                 sum = nd_fletcher64(nd_label, sizeof_namespace_label(ndd), 1);
834                 nd_label->checksum = __cpu_to_le64(sum);
835         }
836         nd_dbg_dpa(nd_region, ndd, res, "\n");
837
838         /* update label */
839         offset = nd_label_offset(ndd, nd_label);
840         rc = nvdimm_set_config_data(ndd, offset, nd_label,
841                         sizeof_namespace_label(ndd));
842         if (rc < 0)
843                 return rc;
844
845         /* Garbage collect the previous label */
846         mutex_lock(&nd_mapping->lock);
847         list_for_each_entry(label_ent, &nd_mapping->labels, list) {
848                 if (!label_ent->label)
849                         continue;
850                 if (test_and_clear_bit(ND_LABEL_REAP, &label_ent->flags)
851                                 || memcmp(nspm->uuid, label_ent->label->uuid,
852                                         NSLABEL_UUID_LEN) == 0)
853                         reap_victim(nd_mapping, label_ent);
854         }
855
856         /* update index */
857         rc = nd_label_write_index(ndd, ndd->ns_next,
858                         nd_inc_seq(__le32_to_cpu(nsindex->seq)), 0);
859         if (rc == 0) {
860                 list_for_each_entry(label_ent, &nd_mapping->labels, list)
861                         if (!label_ent->label) {
862                                 label_ent->label = nd_label;
863                                 nd_label = NULL;
864                                 break;
865                         }
866                 dev_WARN_ONCE(&nspm->nsio.common.dev, nd_label,
867                                 "failed to track label: %d\n",
868                                 to_slot(ndd, nd_label));
869                 if (nd_label)
870                         rc = -ENXIO;
871         }
872         mutex_unlock(&nd_mapping->lock);
873
874         return rc;
875 }
876
877 static bool is_old_resource(struct resource *res, struct resource **list, int n)
878 {
879         int i;
880
881         if (res->flags & DPA_RESOURCE_ADJUSTED)
882                 return false;
883         for (i = 0; i < n; i++)
884                 if (res == list[i])
885                         return true;
886         return false;
887 }
888
889 static struct resource *to_resource(struct nvdimm_drvdata *ndd,
890                 struct nd_namespace_label *nd_label)
891 {
892         struct resource *res;
893
894         for_each_dpa_resource(ndd, res) {
895                 if (res->start != __le64_to_cpu(nd_label->dpa))
896                         continue;
897                 if (resource_size(res) != __le64_to_cpu(nd_label->rawsize))
898                         continue;
899                 return res;
900         }
901
902         return NULL;
903 }
904
905 /*
906  * 1/ Account all the labels that can be freed after this update
907  * 2/ Allocate and write the label to the staging (next) index
908  * 3/ Record the resources in the namespace device
909  */
910 static int __blk_label_update(struct nd_region *nd_region,
911                 struct nd_mapping *nd_mapping, struct nd_namespace_blk *nsblk,
912                 int num_labels)
913 {
914         int i, alloc, victims, nfree, old_num_resources, nlabel, rc = -ENXIO;
915         struct nd_interleave_set *nd_set = nd_region->nd_set;
916         struct nd_namespace_common *ndns = &nsblk->common;
917         struct nvdimm_drvdata *ndd = to_ndd(nd_mapping);
918         struct nd_namespace_label *nd_label;
919         struct nd_label_ent *label_ent, *e;
920         struct nd_namespace_index *nsindex;
921         unsigned long *free, *victim_map = NULL;
922         struct resource *res, **old_res_list;
923         struct nd_label_id label_id;
924         u8 uuid[NSLABEL_UUID_LEN];
925         int min_dpa_idx = 0;
926         LIST_HEAD(list);
927         u32 nslot, slot;
928
929         if (!preamble_next(ndd, &nsindex, &free, &nslot))
930                 return -ENXIO;
931
932         old_res_list = nsblk->res;
933         nfree = nd_label_nfree(ndd);
934         old_num_resources = nsblk->num_resources;
935         nd_label_gen_id(&label_id, nsblk->uuid, NSLABEL_FLAG_LOCAL);
936
937         /*
938          * We need to loop over the old resources a few times, which seems a
939          * bit inefficient, but we need to know that we have the label
940          * space before we start mutating the tracking structures.
941          * Otherwise the recovery method of last resort for userspace is
942          * disable and re-enable the parent region.
943          */
944         alloc = 0;
945         for_each_dpa_resource(ndd, res) {
946                 if (strcmp(res->name, label_id.id) != 0)
947                         continue;
948                 if (!is_old_resource(res, old_res_list, old_num_resources))
949                         alloc++;
950         }
951
952         victims = 0;
953         if (old_num_resources) {
954                 /* convert old local-label-map to dimm-slot victim-map */
955                 victim_map = bitmap_zalloc(nslot, GFP_KERNEL);
956                 if (!victim_map)
957                         return -ENOMEM;
958
959                 /* mark unused labels for garbage collection */
960                 for_each_clear_bit_le(slot, free, nslot) {
961                         nd_label = to_label(ndd, slot);
962                         memcpy(uuid, nd_label->uuid, NSLABEL_UUID_LEN);
963                         if (memcmp(uuid, nsblk->uuid, NSLABEL_UUID_LEN) != 0)
964                                 continue;
965                         res = to_resource(ndd, nd_label);
966                         if (res && is_old_resource(res, old_res_list,
967                                                 old_num_resources))
968                                 continue;
969                         slot = to_slot(ndd, nd_label);
970                         set_bit(slot, victim_map);
971                         victims++;
972                 }
973         }
974
975         /* don't allow updates that consume the last label */
976         if (nfree - alloc < 0 || nfree - alloc + victims < 1) {
977                 dev_info(&nsblk->common.dev, "insufficient label space\n");
978                 bitmap_free(victim_map);
979                 return -ENOSPC;
980         }
981         /* from here on we need to abort on error */
982
983
984         /* assign all resources to the namespace before writing the labels */
985         nsblk->res = NULL;
986         nsblk->num_resources = 0;
987         for_each_dpa_resource(ndd, res) {
988                 if (strcmp(res->name, label_id.id) != 0)
989                         continue;
990                 if (!nsblk_add_resource(nd_region, ndd, nsblk, res->start)) {
991                         rc = -ENOMEM;
992                         goto abort;
993                 }
994         }
995
996         /*
997          * Find the resource associated with the first label in the set
998          * per the v1.2 namespace specification.
999          */
1000         for (i = 0; i < nsblk->num_resources; i++) {
1001                 struct resource *min = nsblk->res[min_dpa_idx];
1002
1003                 res = nsblk->res[i];
1004                 if (res->start < min->start)
1005                         min_dpa_idx = i;
1006         }
1007
1008         for (i = 0; i < nsblk->num_resources; i++) {
1009                 size_t offset;
1010
1011                 res = nsblk->res[i];
1012                 if (is_old_resource(res, old_res_list, old_num_resources))
1013                         continue; /* carry-over */
1014                 slot = nd_label_alloc_slot(ndd);
1015                 if (slot == UINT_MAX)
1016                         goto abort;
1017                 dev_dbg(ndd->dev, "allocated: %d\n", slot);
1018
1019                 nd_label = to_label(ndd, slot);
1020                 memset(nd_label, 0, sizeof_namespace_label(ndd));
1021                 memcpy(nd_label->uuid, nsblk->uuid, NSLABEL_UUID_LEN);
1022                 if (nsblk->alt_name)
1023                         memcpy(nd_label->name, nsblk->alt_name,
1024                                         NSLABEL_NAME_LEN);
1025                 nd_label->flags = __cpu_to_le32(NSLABEL_FLAG_LOCAL);
1026
1027                 /*
1028                  * Use the presence of the type_guid as a flag to
1029                  * determine isetcookie usage and nlabel + position
1030                  * policy for blk-aperture namespaces.
1031                  */
1032                 if (namespace_label_has(ndd, type_guid)) {
1033                         if (i == min_dpa_idx) {
1034                                 nd_label->nlabel = __cpu_to_le16(nsblk->num_resources);
1035                                 nd_label->position = __cpu_to_le16(0);
1036                         } else {
1037                                 nd_label->nlabel = __cpu_to_le16(0xffff);
1038                                 nd_label->position = __cpu_to_le16(0xffff);
1039                         }
1040                         nd_label->isetcookie = __cpu_to_le64(nd_set->cookie2);
1041                 } else {
1042                         nd_label->nlabel = __cpu_to_le16(0); /* N/A */
1043                         nd_label->position = __cpu_to_le16(0); /* N/A */
1044                         nd_label->isetcookie = __cpu_to_le64(0); /* N/A */
1045                 }
1046
1047                 nd_label->dpa = __cpu_to_le64(res->start);
1048                 nd_label->rawsize = __cpu_to_le64(resource_size(res));
1049                 nd_label->lbasize = __cpu_to_le64(nsblk->lbasize);
1050                 nd_label->slot = __cpu_to_le32(slot);
1051                 if (namespace_label_has(ndd, type_guid))
1052                         guid_copy(&nd_label->type_guid, &nd_set->type_guid);
1053                 if (namespace_label_has(ndd, abstraction_guid))
1054                         guid_copy(&nd_label->abstraction_guid,
1055                                         to_abstraction_guid(ndns->claim_class,
1056                                                 &nd_label->abstraction_guid));
1057
1058                 if (namespace_label_has(ndd, checksum)) {
1059                         u64 sum;
1060
1061                         nd_label->checksum = __cpu_to_le64(0);
1062                         sum = nd_fletcher64(nd_label,
1063                                         sizeof_namespace_label(ndd), 1);
1064                         nd_label->checksum = __cpu_to_le64(sum);
1065                 }
1066
1067                 /* update label */
1068                 offset = nd_label_offset(ndd, nd_label);
1069                 rc = nvdimm_set_config_data(ndd, offset, nd_label,
1070                                 sizeof_namespace_label(ndd));
1071                 if (rc < 0)
1072                         goto abort;
1073         }
1074
1075         /* free up now unused slots in the new index */
1076         for_each_set_bit(slot, victim_map, victim_map ? nslot : 0) {
1077                 dev_dbg(ndd->dev, "free: %d\n", slot);
1078                 nd_label_free_slot(ndd, slot);
1079         }
1080
1081         /* update index */
1082         rc = nd_label_write_index(ndd, ndd->ns_next,
1083                         nd_inc_seq(__le32_to_cpu(nsindex->seq)), 0);
1084         if (rc)
1085                 goto abort;
1086
1087         /*
1088          * Now that the on-dimm labels are up to date, fix up the tracking
1089          * entries in nd_mapping->labels
1090          */
1091         nlabel = 0;
1092         mutex_lock(&nd_mapping->lock);
1093         list_for_each_entry_safe(label_ent, e, &nd_mapping->labels, list) {
1094                 nd_label = label_ent->label;
1095                 if (!nd_label)
1096                         continue;
1097                 nlabel++;
1098                 memcpy(uuid, nd_label->uuid, NSLABEL_UUID_LEN);
1099                 if (memcmp(uuid, nsblk->uuid, NSLABEL_UUID_LEN) != 0)
1100                         continue;
1101                 nlabel--;
1102                 list_move(&label_ent->list, &list);
1103                 label_ent->label = NULL;
1104         }
1105         list_splice_tail_init(&list, &nd_mapping->labels);
1106         mutex_unlock(&nd_mapping->lock);
1107
1108         if (nlabel + nsblk->num_resources > num_labels) {
1109                 /*
1110                  * Bug, we can't end up with more resources than
1111                  * available labels
1112                  */
1113                 WARN_ON_ONCE(1);
1114                 rc = -ENXIO;
1115                 goto out;
1116         }
1117
1118         mutex_lock(&nd_mapping->lock);
1119         label_ent = list_first_entry_or_null(&nd_mapping->labels,
1120                         typeof(*label_ent), list);
1121         if (!label_ent) {
1122                 WARN_ON(1);
1123                 mutex_unlock(&nd_mapping->lock);
1124                 rc = -ENXIO;
1125                 goto out;
1126         }
1127         for_each_clear_bit_le(slot, free, nslot) {
1128                 nd_label = to_label(ndd, slot);
1129                 memcpy(uuid, nd_label->uuid, NSLABEL_UUID_LEN);
1130                 if (memcmp(uuid, nsblk->uuid, NSLABEL_UUID_LEN) != 0)
1131                         continue;
1132                 res = to_resource(ndd, nd_label);
1133                 res->flags &= ~DPA_RESOURCE_ADJUSTED;
1134                 dev_vdbg(&nsblk->common.dev, "assign label slot: %d\n", slot);
1135                 list_for_each_entry_from(label_ent, &nd_mapping->labels, list) {
1136                         if (label_ent->label)
1137                                 continue;
1138                         label_ent->label = nd_label;
1139                         nd_label = NULL;
1140                         break;
1141                 }
1142                 if (nd_label)
1143                         dev_WARN(&nsblk->common.dev,
1144                                         "failed to track label slot%d\n", slot);
1145         }
1146         mutex_unlock(&nd_mapping->lock);
1147
1148  out:
1149         kfree(old_res_list);
1150         bitmap_free(victim_map);
1151         return rc;
1152
1153  abort:
1154         /*
1155          * 1/ repair the allocated label bitmap in the index
1156          * 2/ restore the resource list
1157          */
1158         nd_label_copy(ndd, nsindex, to_current_namespace_index(ndd));
1159         kfree(nsblk->res);
1160         nsblk->res = old_res_list;
1161         nsblk->num_resources = old_num_resources;
1162         old_res_list = NULL;
1163         goto out;
1164 }
1165
1166 static int init_labels(struct nd_mapping *nd_mapping, int num_labels)
1167 {
1168         int i, old_num_labels = 0;
1169         struct nd_label_ent *label_ent;
1170         struct nd_namespace_index *nsindex;
1171         struct nvdimm_drvdata *ndd = to_ndd(nd_mapping);
1172
1173         mutex_lock(&nd_mapping->lock);
1174         list_for_each_entry(label_ent, &nd_mapping->labels, list)
1175                 old_num_labels++;
1176         mutex_unlock(&nd_mapping->lock);
1177
1178         /*
1179          * We need to preserve all the old labels for the mapping so
1180          * they can be garbage collected after writing the new labels.
1181          */
1182         for (i = old_num_labels; i < num_labels; i++) {
1183                 label_ent = kzalloc(sizeof(*label_ent), GFP_KERNEL);
1184                 if (!label_ent)
1185                         return -ENOMEM;
1186                 mutex_lock(&nd_mapping->lock);
1187                 list_add_tail(&label_ent->list, &nd_mapping->labels);
1188                 mutex_unlock(&nd_mapping->lock);
1189         }
1190
1191         if (ndd->ns_current == -1 || ndd->ns_next == -1)
1192                 /* pass */;
1193         else
1194                 return max(num_labels, old_num_labels);
1195
1196         nsindex = to_namespace_index(ndd, 0);
1197         memset(nsindex, 0, ndd->nsarea.config_size);
1198         for (i = 0; i < 2; i++) {
1199                 int rc = nd_label_write_index(ndd, i, 3 - i, ND_NSINDEX_INIT);
1200
1201                 if (rc)
1202                         return rc;
1203         }
1204         ndd->ns_next = 1;
1205         ndd->ns_current = 0;
1206
1207         return max(num_labels, old_num_labels);
1208 }
1209
1210 static int del_labels(struct nd_mapping *nd_mapping, u8 *uuid)
1211 {
1212         struct nvdimm_drvdata *ndd = to_ndd(nd_mapping);
1213         struct nd_label_ent *label_ent, *e;
1214         struct nd_namespace_index *nsindex;
1215         u8 label_uuid[NSLABEL_UUID_LEN];
1216         unsigned long *free;
1217         LIST_HEAD(list);
1218         u32 nslot, slot;
1219         int active = 0;
1220
1221         if (!uuid)
1222                 return 0;
1223
1224         /* no index || no labels == nothing to delete */
1225         if (!preamble_next(ndd, &nsindex, &free, &nslot))
1226                 return 0;
1227
1228         mutex_lock(&nd_mapping->lock);
1229         list_for_each_entry_safe(label_ent, e, &nd_mapping->labels, list) {
1230                 struct nd_namespace_label *nd_label = label_ent->label;
1231
1232                 if (!nd_label)
1233                         continue;
1234                 active++;
1235                 memcpy(label_uuid, nd_label->uuid, NSLABEL_UUID_LEN);
1236                 if (memcmp(label_uuid, uuid, NSLABEL_UUID_LEN) != 0)
1237                         continue;
1238                 active--;
1239                 slot = to_slot(ndd, nd_label);
1240                 nd_label_free_slot(ndd, slot);
1241                 dev_dbg(ndd->dev, "free: %d\n", slot);
1242                 list_move_tail(&label_ent->list, &list);
1243                 label_ent->label = NULL;
1244         }
1245         list_splice_tail_init(&list, &nd_mapping->labels);
1246
1247         if (active == 0) {
1248                 nd_mapping_free_labels(nd_mapping);
1249                 dev_dbg(ndd->dev, "no more active labels\n");
1250         }
1251         mutex_unlock(&nd_mapping->lock);
1252
1253         return nd_label_write_index(ndd, ndd->ns_next,
1254                         nd_inc_seq(__le32_to_cpu(nsindex->seq)), 0);
1255 }
1256
1257 int nd_pmem_namespace_label_update(struct nd_region *nd_region,
1258                 struct nd_namespace_pmem *nspm, resource_size_t size)
1259 {
1260         int i, rc;
1261
1262         for (i = 0; i < nd_region->ndr_mappings; i++) {
1263                 struct nd_mapping *nd_mapping = &nd_region->mapping[i];
1264                 struct nvdimm_drvdata *ndd = to_ndd(nd_mapping);
1265                 struct resource *res;
1266                 int count = 0;
1267
1268                 if (size == 0) {
1269                         rc = del_labels(nd_mapping, nspm->uuid);
1270                         if (rc)
1271                                 return rc;
1272                         continue;
1273                 }
1274
1275                 for_each_dpa_resource(ndd, res)
1276                         if (strncmp(res->name, "pmem", 4) == 0)
1277                                 count++;
1278                 WARN_ON_ONCE(!count);
1279
1280                 rc = init_labels(nd_mapping, count);
1281                 if (rc < 0)
1282                         return rc;
1283
1284                 rc = __pmem_label_update(nd_region, nd_mapping, nspm, i,
1285                                 NSLABEL_FLAG_UPDATING);
1286                 if (rc)
1287                         return rc;
1288         }
1289
1290         if (size == 0)
1291                 return 0;
1292
1293         /* Clear the UPDATING flag per UEFI 2.7 expectations */
1294         for (i = 0; i < nd_region->ndr_mappings; i++) {
1295                 struct nd_mapping *nd_mapping = &nd_region->mapping[i];
1296
1297                 rc = __pmem_label_update(nd_region, nd_mapping, nspm, i, 0);
1298                 if (rc)
1299                         return rc;
1300         }
1301
1302         return 0;
1303 }
1304
1305 int nd_blk_namespace_label_update(struct nd_region *nd_region,
1306                 struct nd_namespace_blk *nsblk, resource_size_t size)
1307 {
1308         struct nd_mapping *nd_mapping = &nd_region->mapping[0];
1309         struct resource *res;
1310         int count = 0;
1311
1312         if (size == 0)
1313                 return del_labels(nd_mapping, nsblk->uuid);
1314
1315         for_each_dpa_resource(to_ndd(nd_mapping), res)
1316                 count++;
1317
1318         count = init_labels(nd_mapping, count);
1319         if (count < 0)
1320                 return count;
1321
1322         return __blk_label_update(nd_region, nd_mapping, nsblk, count);
1323 }
1324
1325 int __init nd_label_init(void)
1326 {
1327         WARN_ON(guid_parse(NVDIMM_BTT_GUID, &nvdimm_btt_guid));
1328         WARN_ON(guid_parse(NVDIMM_BTT2_GUID, &nvdimm_btt2_guid));
1329         WARN_ON(guid_parse(NVDIMM_PFN_GUID, &nvdimm_pfn_guid));
1330         WARN_ON(guid_parse(NVDIMM_DAX_GUID, &nvdimm_dax_guid));
1331
1332         return 0;
1333 }