Blame view

drivers/mtd/ubi/ubi.h 24.1 KB
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
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) International Business Machines Corp., 2006
   * Copyright (c) Nokia Corporation, 2006, 2007
   *
   * This program is free software; you can redistribute it and/or modify
   * it under the terms of the GNU General Public License as published by
   * the Free Software Foundation; either version 2 of the License, or
   * (at your option) any later version.
   *
   * 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.
   *
   * You should have received a copy of the GNU General Public License
   * along with this program; if not, write to the Free Software
   * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
   *
   * Author: Artem Bityutskiy (Битюцкий Артём)
   */
  
  #ifndef __UBI_UBI_H__
  #define __UBI_UBI_H__
  
  #include <linux/init.h>
  #include <linux/types.h>
  #include <linux/list.h>
  #include <linux/rbtree.h>
  #include <linux/sched.h>
  #include <linux/wait.h>
  #include <linux/mutex.h>
  #include <linux/rwsem.h>
  #include <linux/spinlock.h>
  #include <linux/fs.h>
  #include <linux/cdev.h>
  #include <linux/device.h>
5a0e3ad6a   Tejun Heo   include cleanup: ...
37
  #include <linux/slab.h>
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
38
  #include <linux/string.h>
92ad8f375   Artem Bityutskiy   UBI: use vmalloc ...
39
  #include <linux/vmalloc.h>
d9dd0887c   Kevin Cernekee   UBI: add reboot n...
40
  #include <linux/notifier.h>
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
41
  #include <linux/mtd/mtd.h>
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
42
  #include <linux/mtd/ubi.h>
a75867432   Artem Bityutskiy   UBI: allocate wri...
43
  #include <asm/pgtable.h>
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
44

92a74f1c1   Artem Bityutskiy   UBI: make ubi-hea...
45
  #include "ubi-media.h"
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
46
  #include "scan.h"
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
47
48
49
50
51
52
53
54
55
56
57
58
59
  
  /* Maximum number of supported UBI devices */
  #define UBI_MAX_DEVICES 32
  
  /* UBI name used for character devices, sysfs, etc */
  #define UBI_NAME_STR "ubi"
  
  /* Normal UBI messages */
  #define ubi_msg(fmt, ...) printk(KERN_NOTICE "UBI: " fmt "
  ", ##__VA_ARGS__)
  /* UBI warning messages */
  #define ubi_warn(fmt, ...) printk(KERN_WARNING "UBI warning: %s: " fmt "
  ", \
cb53b3b99   Harvey Harrison   [MTD] replace rem...
60
  				  __func__, ##__VA_ARGS__)
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
61
62
63
  /* UBI error messages */
  #define ubi_err(fmt, ...) printk(KERN_ERR "UBI error: %s: " fmt "
  ", \
cb53b3b99   Harvey Harrison   [MTD] replace rem...
64
  				 __func__, ##__VA_ARGS__)
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
  
  /* Lowest number PEBs reserved for bad PEB handling */
  #define MIN_RESEVED_PEBS 2
  
  /* Background thread name pattern */
  #define UBI_BGT_NAME_PATTERN "ubi_bgt%dd"
  
  /* This marker in the EBA table means that the LEB is um-mapped */
  #define UBI_LEB_UNMAPPED -1
  
  /*
   * In case of errors, UBI tries to repeat the operation several times before
   * returning error. The below constant defines how many times UBI re-tries.
   */
  #define UBI_IO_RETRIES 3
  
  /*
7b6c32dae   Xiaochuan-Xu   UBI: simplify PEB...
82
83
84
85
86
87
88
   * Length of the protection queue. The length is effectively equivalent to the
   * number of (global) erase cycles PEBs are protected from the wear-leveling
   * worker.
   */
  #define UBI_PROT_QUEUE_LEN 10
  
  /*
85c6e6e28   Artem Bityutskiy   UBI: amend commen...
89
   * Error codes returned by the I/O sub-system.
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
90
   *
74d82d266   Artem Bityutskiy   UBI: remove dupli...
91
   * UBI_IO_FF: the read region of flash contains only 0xFFs
92e1a7d9e   Artem Bityutskiy   UBI: handle bit-f...
92
93
94
   * UBI_IO_FF_BITFLIPS: the same as %UBI_IO_FF, but also also there was a data
   *                     integrity error reported by the MTD driver
   *                     (uncorrectable ECC error in case of NAND)
786d78318   Artem Bityutskiy   UBI: simplify IO ...
95
   * UBI_IO_BAD_HDR: the EC or VID header is corrupted (bad magic or CRC)
756e1df1d   Artem Bityutskiy   UBI: rename IO er...
96
97
98
   * UBI_IO_BAD_HDR_EBADMSG: the same as %UBI_IO_BAD_HDR, but also there was a
   *                         data integrity error reported by the MTD driver
   *                         (uncorrectable ECC error in case of NAND)
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
99
   * UBI_IO_BITFLIPS: bit-flips were detected and corrected
92e1a7d9e   Artem Bityutskiy   UBI: handle bit-f...
100
101
102
103
   *
   * Note, it is probably better to have bit-flip and ebadmsg as flags which can
   * be or'ed with other error code. But this is a big change because there are
   * may callers, so it does not worth the risk of introducing a bug
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
104
105
   */
  enum {
74d82d266   Artem Bityutskiy   UBI: remove dupli...
106
  	UBI_IO_FF = 1,
92e1a7d9e   Artem Bityutskiy   UBI: handle bit-f...
107
  	UBI_IO_FF_BITFLIPS,
786d78318   Artem Bityutskiy   UBI: simplify IO ...
108
  	UBI_IO_BAD_HDR,
756e1df1d   Artem Bityutskiy   UBI: rename IO er...
109
  	UBI_IO_BAD_HDR_EBADMSG,
92e1a7d9e   Artem Bityutskiy   UBI: handle bit-f...
110
  	UBI_IO_BITFLIPS,
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
111
  };
90bf0265e   Artem Bityutskiy   UBI: introduce ne...
112
113
114
115
116
  /*
   * Return codes of the 'ubi_eba_copy_leb()' function.
   *
   * MOVE_CANCEL_RACE: canceled because the volume is being deleted, the source
   *                   PEB was put meanwhile, or there is I/O on the source PEB
b86a2c56e   Artem Bityutskiy   UBI: do not switc...
117
118
119
120
   * MOVE_SOURCE_RD_ERR: canceled because there was a read error from the source
   *                     PEB
   * MOVE_TARGET_RD_ERR: canceled because there was a read error from the target
   *                     PEB
90bf0265e   Artem Bityutskiy   UBI: introduce ne...
121
122
123
124
   * MOVE_TARGET_WR_ERR: canceled because there was a write error to the target
   *                     PEB
   * MOVE_CANCEL_BITFLIPS: canceled because a bit-flip was detected in the
   *                       target PEB
e801e128b   Bhavesh Parekh   UBI: fix missing ...
125
   * MOVE_RETRY: retry scrubbing the PEB
90bf0265e   Artem Bityutskiy   UBI: introduce ne...
126
127
128
   */
  enum {
  	MOVE_CANCEL_RACE = 1,
b86a2c56e   Artem Bityutskiy   UBI: do not switc...
129
130
  	MOVE_SOURCE_RD_ERR,
  	MOVE_TARGET_RD_ERR,
90bf0265e   Artem Bityutskiy   UBI: introduce ne...
131
132
  	MOVE_TARGET_WR_ERR,
  	MOVE_CANCEL_BITFLIPS,
e801e128b   Bhavesh Parekh   UBI: fix missing ...
133
  	MOVE_RETRY,
90bf0265e   Artem Bityutskiy   UBI: introduce ne...
134
  };
3a8d46428   Artem Bityutskiy   UBI: create ltree...
135
  /**
06b68ba15   Artem Bityutskiy   UBI: create ubi_w...
136
   * struct ubi_wl_entry - wear-leveling entry.
23553b2c0   Xiaochuan-Xu   UBI: prepare for ...
137
   * @u.rb: link in the corresponding (free/used) RB-tree
7b6c32dae   Xiaochuan-Xu   UBI: simplify PEB...
138
   * @u.list: link in the protection queue
06b68ba15   Artem Bityutskiy   UBI: create ubi_w...
139
140
141
   * @ec: erase counter
   * @pnum: physical eraseblock number
   *
85c6e6e28   Artem Bityutskiy   UBI: amend commen...
142
143
144
   * This data structure is used in the WL sub-system. Each physical eraseblock
   * has a corresponding &struct wl_entry object which may be kept in different
   * RB-trees. See WL sub-system for details.
06b68ba15   Artem Bityutskiy   UBI: create ubi_w...
145
146
   */
  struct ubi_wl_entry {
23553b2c0   Xiaochuan-Xu   UBI: prepare for ...
147
148
  	union {
  		struct rb_node rb;
7b6c32dae   Xiaochuan-Xu   UBI: simplify PEB...
149
  		struct list_head list;
23553b2c0   Xiaochuan-Xu   UBI: prepare for ...
150
  	} u;
06b68ba15   Artem Bityutskiy   UBI: create ubi_w...
151
152
153
154
155
  	int ec;
  	int pnum;
  };
  
  /**
3a8d46428   Artem Bityutskiy   UBI: create ltree...
156
157
158
159
160
161
162
163
   * struct ubi_ltree_entry - an entry in the lock tree.
   * @rb: links RB-tree nodes
   * @vol_id: volume ID of the locked logical eraseblock
   * @lnum: locked logical eraseblock number
   * @users: how many tasks are using this logical eraseblock or wait for it
   * @mutex: read/write mutex to implement read/write access serialization to
   *         the (@vol_id, @lnum) logical eraseblock
   *
85c6e6e28   Artem Bityutskiy   UBI: amend commen...
164
165
   * This data structure is used in the EBA sub-system to implement per-LEB
   * locking. When a logical eraseblock is being locked - corresponding
3a8d46428   Artem Bityutskiy   UBI: create ltree...
166
   * &struct ubi_ltree_entry object is inserted to the lock tree (@ubi->ltree).
85c6e6e28   Artem Bityutskiy   UBI: amend commen...
167
   * See EBA sub-system for details.
3a8d46428   Artem Bityutskiy   UBI: create ltree...
168
169
170
171
172
173
174
175
   */
  struct ubi_ltree_entry {
  	struct rb_node rb;
  	int vol_id;
  	int lnum;
  	int users;
  	struct rw_semaphore mutex;
  };
f40ac9cdf   Artem Bityutskiy   UBI: implement mu...
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
  /**
   * struct ubi_rename_entry - volume re-name description data structure.
   * @new_name_len: new volume name length
   * @new_name: new volume name
   * @remove: if not zero, this volume should be removed, not re-named
   * @desc: descriptor of the volume
   * @list: links re-name entries into a list
   *
   * This data structure is utilized in the multiple volume re-name code. Namely,
   * UBI first creates a list of &struct ubi_rename_entry objects from the
   * &struct ubi_rnvol_req request object, and then utilizes this list to do all
   * the job.
   */
  struct ubi_rename_entry {
  	int new_name_len;
  	char new_name[UBI_VOL_NAME_MAX + 1];
  	int remove;
  	struct ubi_volume_desc *desc;
  	struct list_head list;
  };
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
196
197
198
199
200
201
202
203
  struct ubi_volume_desc;
  
  /**
   * struct ubi_volume - UBI volume description data structure.
   * @dev: device object to make use of the the Linux device model
   * @cdev: character device object to create character device
   * @ubi: reference to the UBI device description object
   * @vol_id: volume ID
d05c77a81   Artem Bityutskiy   UBI: introduce vo...
204
   * @ref_count: volume reference count
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
205
206
207
   * @readers: number of users holding this volume in read-only mode
   * @writers: number of users holding this volume in read-write mode
   * @exclusive: whether somebody holds this volume in exclusive mode
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
208
209
210
211
212
213
214
   *
   * @reserved_pebs: how many physical eraseblocks are reserved for this volume
   * @vol_type: volume type (%UBI_DYNAMIC_VOLUME or %UBI_STATIC_VOLUME)
   * @usable_leb_size: logical eraseblock size without padding
   * @used_ebs: how many logical eraseblocks in this volume contain data
   * @last_eb_bytes: how many bytes are stored in the last logical eraseblock
   * @used_bytes: how many bytes of data this volume contains
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
215
216
   * @alignment: volume alignment
   * @data_pad: how many bytes are not used at the end of physical eraseblocks to
d05c77a81   Artem Bityutskiy   UBI: introduce vo...
217
   *            satisfy the requested alignment
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
218
219
220
   * @name_len: volume name length
   * @name: volume name
   *
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
221
   * @upd_ebs: how many eraseblocks are expected to be updated
e653879c2   Artem Bityutskiy   UBI: implement at...
222
223
224
225
226
227
228
229
230
231
   * @ch_lnum: LEB number which is being changing by the atomic LEB change
   *           operation
   * @ch_dtype: data persistency type which is being changing by the atomic LEB
   *            change operation
   * @upd_bytes: how many bytes are expected to be received for volume update or
   *             atomic LEB change
   * @upd_received: how many bytes were already received for volume update or
   *                atomic LEB change
   * @upd_buf: update buffer which is used to collect update data or data for
   *           atomic LEB change
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
232
233
   *
   * @eba_tbl: EBA table of this volume (LEB->PEB mapping)
896c0c06a   Artem Bityutskiy   UBI: use bit-fields
234
235
236
237
   * @checked: %1 if this static volume was checked
   * @corrupted: %1 if the volume is corrupted (static volumes only)
   * @upd_marker: %1 if the update marker is set for this volume
   * @updating: %1 if the volume is being updated
e653879c2   Artem Bityutskiy   UBI: implement at...
238
   * @changing_leb: %1 if the atomic LEB change ioctl command is in progress
766fb95ba   Sidney Amani   UBI: allow direct...
239
   * @direct_writes: %1 if direct writes are enabled for this volume
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
240
   *
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
241
242
243
244
245
246
247
248
249
250
251
252
253
   * The @corrupted field indicates that the volume's contents is corrupted.
   * Since UBI protects only static volumes, this field is not relevant to
   * dynamic volumes - it is user's responsibility to assure their data
   * integrity.
   *
   * The @upd_marker flag indicates that this volume is either being updated at
   * the moment or is damaged because of an unclean reboot.
   */
  struct ubi_volume {
  	struct device dev;
  	struct cdev cdev;
  	struct ubi_device *ubi;
  	int vol_id;
d05c77a81   Artem Bityutskiy   UBI: introduce vo...
254
  	int ref_count;
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
255
256
257
  	int readers;
  	int writers;
  	int exclusive;
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
258
259
260
261
262
263
264
  
  	int reserved_pebs;
  	int vol_type;
  	int usable_leb_size;
  	int used_ebs;
  	int last_eb_bytes;
  	long long used_bytes;
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
265
266
267
  	int alignment;
  	int data_pad;
  	int name_len;
f40ac9cdf   Artem Bityutskiy   UBI: implement mu...
268
  	char name[UBI_VOL_NAME_MAX + 1];
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
269

801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
270
  	int upd_ebs;
e653879c2   Artem Bityutskiy   UBI: implement at...
271
272
  	int ch_lnum;
  	int ch_dtype;
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
273
274
275
276
277
  	long long upd_bytes;
  	long long upd_received;
  	void *upd_buf;
  
  	int *eba_tbl;
8eee9f100   Harvey Harrison   UBI: fix sparse e...
278
279
280
281
282
  	unsigned int checked:1;
  	unsigned int corrupted:1;
  	unsigned int upd_marker:1;
  	unsigned int updating:1;
  	unsigned int changing_leb:1;
766fb95ba   Sidney Amani   UBI: allow direct...
283
  	unsigned int direct_writes:1;
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
284
285
286
  };
  
  /**
85c6e6e28   Artem Bityutskiy   UBI: amend commen...
287
   * struct ubi_volume_desc - UBI volume descriptor returned when it is opened.
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
288
289
290
291
292
293
294
295
296
297
298
299
   * @vol: reference to the corresponding volume description object
   * @mode: open mode (%UBI_READONLY, %UBI_READWRITE, or %UBI_EXCLUSIVE)
   */
  struct ubi_volume_desc {
  	struct ubi_volume *vol;
  	int mode;
  };
  
  struct ubi_wl_entry;
  
  /**
   * struct ubi_device - UBI device description structure
9f961b575   Artem Bityutskiy   UBI: add UBI cont...
300
   * @dev: UBI device object to use the the Linux device model
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
301
302
303
   * @cdev: character device object to create character device
   * @ubi_num: UBI device number
   * @ubi_name: UBI device name
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
304
305
306
   * @vol_count: number of volumes in this UBI device
   * @volumes: volumes of this UBI device
   * @volumes_lock: protects @volumes, @rsvd_pebs, @avail_pebs, beb_rsvd_pebs,
d05c77a81   Artem Bityutskiy   UBI: introduce vo...
307
308
309
   *                @beb_rsvd_level, @bad_peb_count, @good_peb_count, @vol_count,
   *                @vol->readers, @vol->writers, @vol->exclusive,
   *                @vol->ref_count, @vol->mapping and @vol->eba_tbl.
e73f4459d   Artem Bityutskiy   UBI: add UBI devi...
310
   * @ref_count: count of references on the UBI device
0c6c7fa13   Adrian Hunter   UBI: add image se...
311
   * @image_seq: image sequence number recorded on EC headers
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
312
313
314
315
   *
   * @rsvd_pebs: count of reserved physical eraseblocks
   * @avail_pebs: count of available physical eraseblocks
   * @beb_rsvd_pebs: how many physical eraseblocks are reserved for bad PEB
4ccf8cffa   Artem Bityutskiy   UBI: add auto-res...
316
   *                 handling
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
317
318
   * @beb_rsvd_level: normal level of PEBs reserved for bad PEB handling
   *
4ccf8cffa   Artem Bityutskiy   UBI: add auto-res...
319
   * @autoresize_vol_id: ID of the volume which has to be auto-resized at the end
7b6c32dae   Xiaochuan-Xu   UBI: simplify PEB...
320
   *                     of UBI initialization
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
321
322
323
   * @vtbl_slots: how many slots are available in the volume table
   * @vtbl_size: size of the volume table in bytes
   * @vtbl: in-RAM volume table copy
f089c0b28   Artem Bityutskiy   UBI: re-name volu...
324
325
326
   * @device_mutex: protects on-flash volume table and serializes volume
   *                creation, deletion, update, re-size, re-name and set
   *                property
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
327
328
329
330
   *
   * @max_ec: current highest erase counter value
   * @mean_ec: current mean erase counter value
   *
e8823bd63   Artem Bityutskiy   UBI: fix atomic L...
331
   * @global_sqnum: global sequence number
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
332
333
   * @ltree_lock: protects the lock tree and @global_sqnum
   * @ltree: the lock tree
e8823bd63   Artem Bityutskiy   UBI: fix atomic L...
334
   * @alc_mutex: serializes "atomic LEB change" operations
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
335
336
   *
   * @used: RB-tree of used physical eraseblocks
b86a2c56e   Artem Bityutskiy   UBI: do not switc...
337
   * @erroneous: RB-tree of erroneous used physical eraseblocks
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
338
339
   * @free: RB-tree of free physical eraseblocks
   * @scrub: RB-tree of physical eraseblocks which need scrubbing
7b6c32dae   Xiaochuan-Xu   UBI: simplify PEB...
340
341
342
343
   * @pq: protection queue (contain physical eraseblocks which are temporarily
   *      protected from the wear-leveling worker)
   * @pq_head: protection queue head
   * @wl_lock: protects the @used, @free, @pq, @pq_head, @lookuptbl, @move_from,
feddbb34e   Artem Bityutskiy   UBI: fix minor st...
344
345
   *	     @move_to, @move_to_put @erase_pending, @wl_scheduled, @works,
   *	     @erroneous, and @erroneous_peb_count fields
43f9b25a9   Artem Bityutskiy   UBI: bugfix: prot...
346
   * @move_mutex: serializes eraseblock moves
7b6c32dae   Xiaochuan-Xu   UBI: simplify PEB...
347
   * @work_sem: synchronizes the WL worker with use tasks
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
348
349
   * @wl_scheduled: non-zero if the wear-leveling was scheduled
   * @lookuptbl: a table to quickly find a &struct ubi_wl_entry object for any
d05c77a81   Artem Bityutskiy   UBI: introduce vo...
350
   *             physical eraseblock
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
351
352
   * @move_from: physical eraseblock from where the data is being moved
   * @move_to: physical eraseblock where the data is being moved to
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
353
354
355
356
357
358
359
360
361
362
363
364
   * @move_to_put: if the "to" PEB was put
   * @works: list of pending works
   * @works_count: count of pending works
   * @bgt_thread: background thread description object
   * @thread_enabled: if the background thread is enabled
   * @bgt_name: background thread name
   *
   * @flash_size: underlying MTD device size (in bytes)
   * @peb_count: count of physical eraseblocks on the MTD device
   * @peb_size: physical eraseblock size
   * @bad_peb_count: count of bad physical eraseblocks
   * @good_peb_count: count of good physical eraseblocks
5fc01ab69   Artem Bityutskiy   UBI: preserve cor...
365
366
   * @corr_peb_count: count of corrupted physical eraseblocks (preserved and not
   *                  used by UBI)
b86a2c56e   Artem Bityutskiy   UBI: do not switc...
367
368
   * @erroneous_peb_count: count of erroneous physical eraseblocks in @erroneous
   * @max_erroneous: maximum allowed amount of erroneous physical eraseblocks
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
369
370
371
372
373
   * @min_io_size: minimal input/output unit size of the underlying MTD device
   * @hdrs_min_io_size: minimal I/O unit size used for VID and EC headers
   * @ro_mode: if the UBI device is in read-only mode
   * @leb_size: logical eraseblock size
   * @leb_start: starting offset of logical eraseblocks within physical
85c6e6e28   Artem Bityutskiy   UBI: amend commen...
374
   *             eraseblocks
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
375
376
377
   * @ec_hdr_alsize: size of the EC header aligned to @hdrs_min_io_size
   * @vid_hdr_alsize: size of the VID header aligned to @hdrs_min_io_size
   * @vid_hdr_offset: starting offset of the volume identifier header (might be
85c6e6e28   Artem Bityutskiy   UBI: amend commen...
378
   *                  unaligned)
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
379
380
381
382
   * @vid_hdr_aloffset: starting offset of the VID header aligned to
   * @hdrs_min_io_size
   * @vid_hdr_shift: contains @vid_hdr_offset - @vid_hdr_aloffset
   * @bad_allowed: whether the MTD device admits of bad physical eraseblocks or
d05c77a81   Artem Bityutskiy   UBI: introduce vo...
383
   *               not
ebf53f421   Artem Bityutskiy   UBI: fix NOR flas...
384
   * @nor_flash: non-zero if working on top of NOR flash
30b542ef4   Artem Bityutskiy   UBI: incorporate ...
385
386
   * @max_write_size: maximum amount of bytes the underlying flash can write at a
   *                  time (MTD write buffer size)
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
387
   * @mtd: MTD device descriptor
e88d6e10e   Artem Bityutskiy   UBI: do not use v...
388
389
390
   *
   * @peb_buf1: a buffer of PEB size used for different purposes
   * @peb_buf2: another buffer of PEB size used for different purposes
7b6c32dae   Xiaochuan-Xu   UBI: simplify PEB...
391
   * @buf_mutex: protects @peb_buf1 and @peb_buf2
f40ac9cdf   Artem Bityutskiy   UBI: implement mu...
392
   * @ckvol_mutex: serializes static volume checking when opening
2a734bb8d   Artem Bityutskiy   UBI: use debugfs ...
393
394
   *
   * @dbg: debugging information for this UBI device
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
395
396
397
398
399
400
   */
  struct ubi_device {
  	struct cdev cdev;
  	struct device dev;
  	int ubi_num;
  	char ubi_name[sizeof(UBI_NAME_STR)+5];
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
401
402
403
  	int vol_count;
  	struct ubi_volume *volumes[UBI_MAX_VOLUMES+UBI_INT_VOL_COUNT];
  	spinlock_t volumes_lock;
e73f4459d   Artem Bityutskiy   UBI: add UBI devi...
404
  	int ref_count;
0c6c7fa13   Adrian Hunter   UBI: add image se...
405
  	int image_seq;
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
406
407
408
409
410
  
  	int rsvd_pebs;
  	int avail_pebs;
  	int beb_rsvd_pebs;
  	int beb_rsvd_level;
4ccf8cffa   Artem Bityutskiy   UBI: add auto-res...
411
  	int autoresize_vol_id;
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
412
413
414
  	int vtbl_slots;
  	int vtbl_size;
  	struct ubi_vtbl_record *vtbl;
f089c0b28   Artem Bityutskiy   UBI: re-name volu...
415
  	struct mutex device_mutex;
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
416
417
  
  	int max_ec;
85c6e6e28   Artem Bityutskiy   UBI: amend commen...
418
  	/* Note, mean_ec is not updated run-time - should be fixed */
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
419
  	int mean_ec;
85c6e6e28   Artem Bityutskiy   UBI: amend commen...
420
  	/* EBA sub-system's stuff */
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
421
422
423
  	unsigned long long global_sqnum;
  	spinlock_t ltree_lock;
  	struct rb_root ltree;
e8823bd63   Artem Bityutskiy   UBI: fix atomic L...
424
  	struct mutex alc_mutex;
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
425

85c6e6e28   Artem Bityutskiy   UBI: amend commen...
426
  	/* Wear-leveling sub-system's stuff */
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
427
  	struct rb_root used;
b86a2c56e   Artem Bityutskiy   UBI: do not switc...
428
  	struct rb_root erroneous;
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
429
430
  	struct rb_root free;
  	struct rb_root scrub;
7b6c32dae   Xiaochuan-Xu   UBI: simplify PEB...
431
432
  	struct list_head pq[UBI_PROT_QUEUE_LEN];
  	int pq_head;
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
433
  	spinlock_t wl_lock;
43f9b25a9   Artem Bityutskiy   UBI: bugfix: prot...
434
  	struct mutex move_mutex;
593dd33c9   Artem Bityutskiy   UBI: fix ubi_wl_f...
435
  	struct rw_semaphore work_sem;
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
436
437
  	int wl_scheduled;
  	struct ubi_wl_entry **lookuptbl;
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
438
439
  	struct ubi_wl_entry *move_from;
  	struct ubi_wl_entry *move_to;
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
440
441
442
443
444
445
  	int move_to_put;
  	struct list_head works;
  	int works_count;
  	struct task_struct *bgt_thread;
  	int thread_enabled;
  	char bgt_name[sizeof(UBI_BGT_NAME_PATTERN)+2];
85c6e6e28   Artem Bityutskiy   UBI: amend commen...
446
  	/* I/O sub-system's stuff */
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
447
448
449
450
451
  	long long flash_size;
  	int peb_count;
  	int peb_size;
  	int bad_peb_count;
  	int good_peb_count;
5fc01ab69   Artem Bityutskiy   UBI: preserve cor...
452
  	int corr_peb_count;
b86a2c56e   Artem Bityutskiy   UBI: do not switc...
453
454
  	int erroneous_peb_count;
  	int max_erroneous;
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
455
456
457
458
459
460
461
462
463
464
  	int min_io_size;
  	int hdrs_min_io_size;
  	int ro_mode;
  	int leb_size;
  	int leb_start;
  	int ec_hdr_alsize;
  	int vid_hdr_alsize;
  	int vid_hdr_offset;
  	int vid_hdr_aloffset;
  	int vid_hdr_shift;
ebf53f421   Artem Bityutskiy   UBI: fix NOR flas...
465
466
  	unsigned int bad_allowed:1;
  	unsigned int nor_flash:1;
30b542ef4   Artem Bityutskiy   UBI: incorporate ...
467
  	int max_write_size;
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
468
  	struct mtd_info *mtd;
e88d6e10e   Artem Bityutskiy   UBI: do not use v...
469
470
471
472
  
  	void *peb_buf1;
  	void *peb_buf2;
  	struct mutex buf_mutex;
783b273af   Artem Bityutskiy   UBI: use separate...
473
  	struct mutex ckvol_mutex;
2a734bb8d   Artem Bityutskiy   UBI: use debugfs ...
474
475
  
  	struct ubi_debug_info *dbg;
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
476
  };
180737332   Artem Bityutskiy   UBI: make it poss...
477
  #include "debug.h"
06b68ba15   Artem Bityutskiy   UBI: create ubi_w...
478
  extern struct kmem_cache *ubi_wl_entry_slab;
4d187a88d   Jan Engelhardt   UBI: constify fil...
479
480
481
  extern const struct file_operations ubi_ctrl_cdev_operations;
  extern const struct file_operations ubi_cdev_operations;
  extern const struct file_operations ubi_vol_cdev_operations;
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
482
  extern struct class *ubi_class;
cdfa788ac   Artem Bityutskiy   UBI: prepare atta...
483
  extern struct mutex ubi_devices_mutex;
0e0ee1cc3   Dmitry Pervushin   UBI: add notifica...
484
  extern struct blocking_notifier_head ubi_notifiers;
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
485
486
487
488
  
  /* vtbl.c */
  int ubi_change_vtbl_record(struct ubi_device *ubi, int idx,
  			   struct ubi_vtbl_record *vtbl_rec);
f40ac9cdf   Artem Bityutskiy   UBI: implement mu...
489
490
  int ubi_vtbl_rename_volumes(struct ubi_device *ubi,
  			    struct list_head *rename_list);
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
491
492
493
494
  int ubi_read_volume_table(struct ubi_device *ubi, struct ubi_scan_info *si);
  
  /* vmt.c */
  int ubi_create_volume(struct ubi_device *ubi, struct ubi_mkvol_req *req);
f40ac9cdf   Artem Bityutskiy   UBI: implement mu...
495
  int ubi_remove_volume(struct ubi_volume_desc *desc, int no_vtbl);
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
496
  int ubi_resize_volume(struct ubi_volume_desc *desc, int reserved_pebs);
f40ac9cdf   Artem Bityutskiy   UBI: implement mu...
497
  int ubi_rename_volumes(struct ubi_device *ubi, struct list_head *rename_list);
89b96b692   Artem Bityutskiy   UBI: improve inte...
498
499
  int ubi_add_volume(struct ubi_device *ubi, struct ubi_volume *vol);
  void ubi_free_volume(struct ubi_device *ubi, struct ubi_volume *vol);
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
500
501
  
  /* upd.c */
1b68d0eea   Artem Bityutskiy   UBI: simplify int...
502
503
504
  int ubi_start_update(struct ubi_device *ubi, struct ubi_volume *vol,
  		     long long bytes);
  int ubi_more_update_data(struct ubi_device *ubi, struct ubi_volume *vol,
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
505
  			 const void __user *buf, int count);
e653879c2   Artem Bityutskiy   UBI: implement at...
506
507
508
509
  int ubi_start_leb_change(struct ubi_device *ubi, struct ubi_volume *vol,
  			 const struct ubi_leb_change_req *req);
  int ubi_more_leb_change_data(struct ubi_device *ubi, struct ubi_volume *vol,
  			     const void __user *buf, int count);
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
510
511
  
  /* misc.c */
9c9ec1477   Artem Bityutskiy   UBI: fix checkpat...
512
513
  int ubi_calc_data_len(const struct ubi_device *ubi, const void *buf,
  		      int length);
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
514
515
  int ubi_check_volume(struct ubi_device *ubi, int vol_id);
  void ubi_calculate_reserved(struct ubi_device *ubi);
bb00e180a   Artem Bityutskiy   UBI: make check_p...
516
  int ubi_check_pattern(const void *buf, uint8_t patt, int size);
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
517

801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
518
  /* eba.c */
89b96b692   Artem Bityutskiy   UBI: improve inte...
519
520
521
522
523
  int ubi_eba_unmap_leb(struct ubi_device *ubi, struct ubi_volume *vol,
  		      int lnum);
  int ubi_eba_read_leb(struct ubi_device *ubi, struct ubi_volume *vol, int lnum,
  		     void *buf, int offset, int len, int check);
  int ubi_eba_write_leb(struct ubi_device *ubi, struct ubi_volume *vol, int lnum,
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
524
  		      const void *buf, int offset, int len, int dtype);
89b96b692   Artem Bityutskiy   UBI: improve inte...
525
526
  int ubi_eba_write_leb_st(struct ubi_device *ubi, struct ubi_volume *vol,
  			 int lnum, const void *buf, int len, int dtype,
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
527
  			 int used_ebs);
89b96b692   Artem Bityutskiy   UBI: improve inte...
528
529
  int ubi_eba_atomic_leb_change(struct ubi_device *ubi, struct ubi_volume *vol,
  			      int lnum, const void *buf, int len, int dtype);
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
530
531
532
  int ubi_eba_copy_leb(struct ubi_device *ubi, int from, int to,
  		     struct ubi_vid_hdr *vid_hdr);
  int ubi_eba_init_scan(struct ubi_device *ubi, struct ubi_scan_info *si);
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
533
534
535
536
537
538
539
540
  
  /* wl.c */
  int ubi_wl_get_peb(struct ubi_device *ubi, int dtype);
  int ubi_wl_put_peb(struct ubi_device *ubi, int pnum, int torture);
  int ubi_wl_flush(struct ubi_device *ubi);
  int ubi_wl_scrub_peb(struct ubi_device *ubi, int pnum);
  int ubi_wl_init_scan(struct ubi_device *ubi, struct ubi_scan_info *si);
  void ubi_wl_close(struct ubi_device *ubi);
cdfa788ac   Artem Bityutskiy   UBI: prepare atta...
541
  int ubi_thread(void *u);
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
542
543
544
545
  
  /* io.c */
  int ubi_io_read(const struct ubi_device *ubi, void *buf, int pnum, int offset,
  		int len);
e88d6e10e   Artem Bityutskiy   UBI: do not use v...
546
547
548
  int ubi_io_write(struct ubi_device *ubi, const void *buf, int pnum, int offset,
  		 int len);
  int ubi_io_sync_erase(struct ubi_device *ubi, int pnum, int torture);
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
549
550
  int ubi_io_is_bad(const struct ubi_device *ubi, int pnum);
  int ubi_io_mark_bad(const struct ubi_device *ubi, int pnum);
e88d6e10e   Artem Bityutskiy   UBI: do not use v...
551
  int ubi_io_read_ec_hdr(struct ubi_device *ubi, int pnum,
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
552
  		       struct ubi_ec_hdr *ec_hdr, int verbose);
e88d6e10e   Artem Bityutskiy   UBI: do not use v...
553
  int ubi_io_write_ec_hdr(struct ubi_device *ubi, int pnum,
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
554
  			struct ubi_ec_hdr *ec_hdr);
e88d6e10e   Artem Bityutskiy   UBI: do not use v...
555
  int ubi_io_read_vid_hdr(struct ubi_device *ubi, int pnum,
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
556
  			struct ubi_vid_hdr *vid_hdr, int verbose);
e88d6e10e   Artem Bityutskiy   UBI: do not use v...
557
  int ubi_io_write_vid_hdr(struct ubi_device *ubi, int pnum,
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
558
  			 struct ubi_vid_hdr *vid_hdr);
e73f4459d   Artem Bityutskiy   UBI: add UBI devi...
559
  /* build.c */
897a316c9   Artem Bityutskiy   UBI: handle attac...
560
  int ubi_attach_mtd_dev(struct mtd_info *mtd, int ubi_num, int vid_hdr_offset);
cdfa788ac   Artem Bityutskiy   UBI: prepare atta...
561
  int ubi_detach_mtd_dev(int ubi_num, int anyway);
e73f4459d   Artem Bityutskiy   UBI: add UBI devi...
562
563
564
565
  struct ubi_device *ubi_get_device(int ubi_num);
  void ubi_put_device(struct ubi_device *ubi);
  struct ubi_device *ubi_get_by_major(int major);
  int ubi_major2num(int major);
0e0ee1cc3   Dmitry Pervushin   UBI: add notifica...
566
567
568
569
570
571
572
573
574
575
  int ubi_volume_notify(struct ubi_device *ubi, struct ubi_volume *vol,
  		      int ntype);
  int ubi_notify_all(struct ubi_device *ubi, int ntype,
  		   struct notifier_block *nb);
  int ubi_enumerate_volumes(struct notifier_block *nb);
  
  /* kapi.c */
  void ubi_do_get_device_info(struct ubi_device *ubi, struct ubi_device_info *di);
  void ubi_do_get_volume_info(struct ubi_device *ubi, struct ubi_volume *vol,
  			    struct ubi_volume_info *vi);
e73f4459d   Artem Bityutskiy   UBI: add UBI devi...
576

801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
577
578
  /*
   * ubi_rb_for_each_entry - walk an RB-tree.
fd589a8f0   Anand Gadiyar   trivial: fix typo...
579
   * @rb: a pointer to type 'struct rb_node' to use as a loop counter
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
580
581
582
583
584
585
586
587
   * @pos: a pointer to RB-tree entry type to use as a loop counter
   * @root: RB-tree's root
   * @member: the name of the 'struct rb_node' within the RB-tree entry
   */
  #define ubi_rb_for_each_entry(rb, pos, root, member)                         \
  	for (rb = rb_first(root),                                            \
  	     pos = (rb ? container_of(rb, typeof(*pos), member) : NULL);     \
  	     rb;                                                             \
758d8e463   Phil Carmody   UBI: eliminate po...
588
589
  	     rb = rb_next(rb),                                               \
  	     pos = (rb ? container_of(rb, typeof(*pos), member) : NULL))
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
590
591
592
593
  
  /**
   * ubi_zalloc_vid_hdr - allocate a volume identifier header object.
   * @ubi: UBI device description object
33818bbb8   Artem Bityutskiy   UBI: allocate mem...
594
   * @gfp_flags: GFP flags to allocate with
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
595
596
597
598
599
   *
   * This function returns a pointer to the newly allocated and zero-filled
   * volume identifier header object in case of success and %NULL in case of
   * failure.
   */
33818bbb8   Artem Bityutskiy   UBI: allocate mem...
600
601
  static inline struct ubi_vid_hdr *
  ubi_zalloc_vid_hdr(const struct ubi_device *ubi, gfp_t gfp_flags)
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
602
603
  {
  	void *vid_hdr;
33818bbb8   Artem Bityutskiy   UBI: allocate mem...
604
  	vid_hdr = kzalloc(ubi->vid_hdr_alsize, gfp_flags);
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
  	if (!vid_hdr)
  		return NULL;
  
  	/*
  	 * VID headers may be stored at un-aligned flash offsets, so we shift
  	 * the pointer.
  	 */
  	return vid_hdr + ubi->vid_hdr_shift;
  }
  
  /**
   * ubi_free_vid_hdr - free a volume identifier header object.
   * @ubi: UBI device description object
   * @vid_hdr: the object to free
   */
  static inline void ubi_free_vid_hdr(const struct ubi_device *ubi,
  				    struct ubi_vid_hdr *vid_hdr)
  {
  	void *p = vid_hdr;
  
  	if (!p)
  		return;
  
  	kfree(p - ubi->vid_hdr_shift);
  }
  
  /*
   * This function is equivalent to 'ubi_io_read()', but @offset is relative to
   * the beginning of the logical eraseblock, not to the beginning of the
   * physical eraseblock.
   */
  static inline int ubi_io_read_data(const struct ubi_device *ubi, void *buf,
  				   int pnum, int offset, int len)
  {
  	ubi_assert(offset >= 0);
  	return ubi_io_read(ubi, buf, pnum, offset + ubi->leb_start, len);
  }
  
  /*
   * This function is equivalent to 'ubi_io_write()', but @offset is relative to
   * the beginning of the logical eraseblock, not to the beginning of the
   * physical eraseblock.
   */
e88d6e10e   Artem Bityutskiy   UBI: do not use v...
648
  static inline int ubi_io_write_data(struct ubi_device *ubi, const void *buf,
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
649
650
651
652
653
654
655
656
657
658
659
660
  				    int pnum, int offset, int len)
  {
  	ubi_assert(offset >= 0);
  	return ubi_io_write(ubi, buf, pnum, offset + ubi->leb_start, len);
  }
  
  /**
   * ubi_ro_mode - switch to read-only mode.
   * @ubi: UBI device description object
   */
  static inline void ubi_ro_mode(struct ubi_device *ubi)
  {
43f9b25a9   Artem Bityutskiy   UBI: bugfix: prot...
661
662
663
  	if (!ubi->ro_mode) {
  		ubi->ro_mode = 1;
  		ubi_warn("switch to read-only mode");
2a826061d   Artem Bityutskiy   UBI: dump stack w...
664
  		ubi_dbg_dump_stack();
43f9b25a9   Artem Bityutskiy   UBI: bugfix: prot...
665
  	}
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
  }
  
  /**
   * vol_id2idx - get table index by volume ID.
   * @ubi: UBI device description object
   * @vol_id: volume ID
   */
  static inline int vol_id2idx(const struct ubi_device *ubi, int vol_id)
  {
  	if (vol_id >= UBI_INTERNAL_VOL_START)
  		return vol_id - UBI_INTERNAL_VOL_START + ubi->vtbl_slots;
  	else
  		return vol_id;
  }
  
  /**
   * idx2vol_id - get volume ID by table index.
   * @ubi: UBI device description object
   * @idx: table index
   */
  static inline int idx2vol_id(const struct ubi_device *ubi, int idx)
  {
  	if (idx >= ubi->vtbl_slots)
  		return idx - ubi->vtbl_slots + UBI_INTERNAL_VOL_START;
  	else
  		return idx;
  }
  
  #endif /* !__UBI_UBI_H__ */