Blame view

drivers/nvdimm/label.h 4.1 KB
4a826c83d   Dan Williams   libnvdimm: namesp...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
  /*
   * Copyright(c) 2013-2015 Intel Corporation. All rights reserved.
   *
   * This program is free software; you can redistribute it and/or modify
   * it under the terms of version 2 of the GNU General Public License as
   * published by the Free Software Foundation.
   *
   * This program is distributed in the hope that it will be useful, but
   * WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   * General Public License for more details.
   */
  #ifndef __LABEL_H__
  #define __LABEL_H__
  
  #include <linux/ndctl.h>
  #include <linux/sizes.h>
  #include <linux/io.h>
  
  enum {
  	NSINDEX_SIG_LEN = 16,
  	NSINDEX_ALIGN = 256,
  	NSINDEX_SEQ_MASK = 0x3,
  	NSLABEL_UUID_LEN = 16,
  	NSLABEL_NAME_LEN = 64,
  	NSLABEL_FLAG_ROLABEL = 0x1,  /* read-only label */
  	NSLABEL_FLAG_LOCAL = 0x2,    /* DIMM-local namespace */
  	NSLABEL_FLAG_BTT = 0x4,      /* namespace contains a BTT */
  	NSLABEL_FLAG_UPDATING = 0x8, /* label being updated */
  	BTT_ALIGN = 4096,            /* all btt structures */
  	BTTINFO_SIG_LEN = 16,
  	BTTINFO_UUID_LEN = 16,
  	BTTINFO_FLAG_ERROR = 0x1,    /* error state (read-only) */
  	BTTINFO_MAJOR_VERSION = 1,
  	ND_LABEL_MIN_SIZE = 512 * 129, /* see sizeof_namespace_index() */
  	ND_LABEL_ID_SIZE = 50,
f524bf271   Dan Williams   libnvdimm: write ...
37
  	ND_NSINDEX_INIT = 0x1,
4a826c83d   Dan Williams   libnvdimm: namesp...
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
  };
  
  static const char NSINDEX_SIGNATURE[] = "NAMESPACE_INDEX\0";
  
  /**
   * struct nd_namespace_index - label set superblock
   * @sig: NAMESPACE_INDEX\0
   * @flags: placeholder
   * @seq: sequence number for this index
   * @myoff: offset of this index in label area
   * @mysize: size of this index struct
   * @otheroff: offset of other index
   * @labeloff: offset of first label slot
   * @nslot: total number of label slots
   * @major: label area major version
   * @minor: label area minor version
   * @checksum: fletcher64 of all fields
   * @free[0]: bitmap, nlabel bits
   *
   * The size of free[] is rounded up so the total struct size is a
   * multiple of NSINDEX_ALIGN bytes.  Any bits this allocates beyond
   * nlabel bits must be zero.
   */
  struct nd_namespace_index {
  	u8 sig[NSINDEX_SIG_LEN];
  	__le32 flags;
  	__le32 seq;
  	__le64 myoff;
  	__le64 mysize;
  	__le64 otheroff;
  	__le64 labeloff;
  	__le32 nslot;
  	__le16 major;
  	__le16 minor;
  	__le64 checksum;
  	u8 free[0];
  };
  
  /**
   * struct nd_namespace_label - namespace superblock
   * @uuid: UUID per RFC 4122
   * @name: optional name (NULL-terminated)
   * @flags: see NSLABEL_FLAG_*
   * @nlabel: num labels to describe this ns
   * @position: labels position in set
   * @isetcookie: interleave set cookie
   * @lbasize: LBA size in bytes or 0 for pmem
   * @dpa: DPA of NVM range on this DIMM
   * @rawsize: size of namespace
   * @slot: slot of this label in label area
   * @unused: must be zero
   */
  struct nd_namespace_label {
  	u8 uuid[NSLABEL_UUID_LEN];
  	u8 name[NSLABEL_NAME_LEN];
  	__le32 flags;
  	__le16 nlabel;
  	__le16 position;
  	__le64 isetcookie;
  	__le64 lbasize;
  	__le64 dpa;
  	__le64 rawsize;
  	__le32 slot;
  	__le32 unused;
  };
  
  /**
   * struct nd_label_id - identifier string for dpa allocation
   * @id: "{blk|pmem}-<namespace uuid>"
   */
  struct nd_label_id {
  	char id[ND_LABEL_ID_SIZE];
  };
  
  /*
   * If the 'best' index is invalid, so is the 'next' index.  Otherwise,
   * the next index is MOD(index+1, 2)
   */
  static inline int nd_label_next_nsindex(int index)
  {
  	if (index < 0)
  		return -1;
  
  	return (index + 1) % 2;
  }
  
  struct nvdimm_drvdata;
  int nd_label_validate(struct nvdimm_drvdata *ndd);
  void nd_label_copy(struct nvdimm_drvdata *ndd, struct nd_namespace_index *dst,
  		struct nd_namespace_index *src);
  size_t sizeof_namespace_index(struct nvdimm_drvdata *ndd);
bf9bccc14   Dan Williams   libnvdimm: pmem l...
129
130
  int nd_label_active_count(struct nvdimm_drvdata *ndd);
  struct nd_namespace_label *nd_label_active(struct nvdimm_drvdata *ndd, int n);
0ba1c6348   Dan Williams   libnvdimm: write ...
131
132
  u32 nd_label_alloc_slot(struct nvdimm_drvdata *ndd);
  bool nd_label_free_slot(struct nvdimm_drvdata *ndd, u32 slot);
f524bf271   Dan Williams   libnvdimm: write ...
133
134
135
  u32 nd_label_nfree(struct nvdimm_drvdata *ndd);
  struct nd_region;
  struct nd_namespace_pmem;
0ba1c6348   Dan Williams   libnvdimm: write ...
136
  struct nd_namespace_blk;
f524bf271   Dan Williams   libnvdimm: write ...
137
138
  int nd_pmem_namespace_label_update(struct nd_region *nd_region,
  		struct nd_namespace_pmem *nspm, resource_size_t size);
0ba1c6348   Dan Williams   libnvdimm: write ...
139
140
  int nd_blk_namespace_label_update(struct nd_region *nd_region,
  		struct nd_namespace_blk *nsblk, resource_size_t size);
4a826c83d   Dan Williams   libnvdimm: namesp...
141
  #endif /* __LABEL_H__ */