diff options
author | Artem Bityutskiy <Artem.Bityutskiy@nokia.com> | 2008-07-14 12:08:37 -0400 |
---|---|---|
committer | Artem Bityutskiy <Artem.Bityutskiy@nokia.com> | 2008-07-15 10:35:15 -0400 |
commit | 1e51764a3c2ac05a23a22b2a95ddee4d9bffb16d (patch) | |
tree | 919debdd48aef9eee9ff0e8f465ef2649325b993 /fs/ubifs/recovery.c | |
parent | e56a99d5a42dcb91e622ae7a0289d8fb2ddabffb (diff) |
UBIFS: add new flash file system
This is a new flash file system. See
http://www.linux-mtd.infradead.org/doc/ubifs.html
Signed-off-by: Artem Bityutskiy <Artem.Bityutskiy@nokia.com>
Signed-off-by: Adrian Hunter <ext-adrian.hunter@nokia.com>
Diffstat (limited to 'fs/ubifs/recovery.c')
-rw-r--r-- | fs/ubifs/recovery.c | 1519 |
1 files changed, 1519 insertions, 0 deletions
diff --git a/fs/ubifs/recovery.c b/fs/ubifs/recovery.c new file mode 100644 index 000000000000..77d26c141cf6 --- /dev/null +++ b/fs/ubifs/recovery.c | |||
@@ -0,0 +1,1519 @@ | |||
1 | /* | ||
2 | * This file is part of UBIFS. | ||
3 | * | ||
4 | * Copyright (C) 2006-2008 Nokia Corporation | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify it | ||
7 | * under the terms of the GNU General Public License version 2 as published by | ||
8 | * the Free Software Foundation. | ||
9 | * | ||
10 | * This program is distributed in the hope that it will be useful, but WITHOUT | ||
11 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
12 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | ||
13 | * more details. | ||
14 | * | ||
15 | * You should have received a copy of the GNU General Public License along with | ||
16 | * this program; if not, write to the Free Software Foundation, Inc., 51 | ||
17 | * Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
18 | * | ||
19 | * Authors: Adrian Hunter | ||
20 | * Artem Bityutskiy (Битюцкий Артём) | ||
21 | */ | ||
22 | |||
23 | /* | ||
24 | * This file implements functions needed to recover from unclean un-mounts. | ||
25 | * When UBIFS is mounted, it checks a flag on the master node to determine if | ||
26 | * an un-mount was completed sucessfully. If not, the process of mounting | ||
27 | * incorparates additional checking and fixing of on-flash data structures. | ||
28 | * UBIFS always cleans away all remnants of an unclean un-mount, so that | ||
29 | * errors do not accumulate. However UBIFS defers recovery if it is mounted | ||
30 | * read-only, and the flash is not modified in that case. | ||
31 | */ | ||
32 | |||
33 | #include <linux/crc32.h> | ||
34 | #include "ubifs.h" | ||
35 | |||
36 | /** | ||
37 | * is_empty - determine whether a buffer is empty (contains all 0xff). | ||
38 | * @buf: buffer to clean | ||
39 | * @len: length of buffer | ||
40 | * | ||
41 | * This function returns %1 if the buffer is empty (contains all 0xff) otherwise | ||
42 | * %0 is returned. | ||
43 | */ | ||
44 | static int is_empty(void *buf, int len) | ||
45 | { | ||
46 | uint8_t *p = buf; | ||
47 | int i; | ||
48 | |||
49 | for (i = 0; i < len; i++) | ||
50 | if (*p++ != 0xff) | ||
51 | return 0; | ||
52 | return 1; | ||
53 | } | ||
54 | |||
55 | /** | ||
56 | * get_master_node - get the last valid master node allowing for corruption. | ||
57 | * @c: UBIFS file-system description object | ||
58 | * @lnum: LEB number | ||
59 | * @pbuf: buffer containing the LEB read, is returned here | ||
60 | * @mst: master node, if found, is returned here | ||
61 | * @cor: corruption, if found, is returned here | ||
62 | * | ||
63 | * This function allocates a buffer, reads the LEB into it, and finds and | ||
64 | * returns the last valid master node allowing for one area of corruption. | ||
65 | * The corrupt area, if there is one, must be consistent with the assumption | ||
66 | * that it is the result of an unclean unmount while the master node was being | ||
67 | * written. Under those circumstances, it is valid to use the previously written | ||
68 | * master node. | ||
69 | * | ||
70 | * This function returns %0 on success and a negative error code on failure. | ||
71 | */ | ||
72 | static int get_master_node(const struct ubifs_info *c, int lnum, void **pbuf, | ||
73 | struct ubifs_mst_node **mst, void **cor) | ||
74 | { | ||
75 | const int sz = c->mst_node_alsz; | ||
76 | int err, offs, len; | ||
77 | void *sbuf, *buf; | ||
78 | |||
79 | sbuf = vmalloc(c->leb_size); | ||
80 | if (!sbuf) | ||
81 | return -ENOMEM; | ||
82 | |||
83 | err = ubi_read(c->ubi, lnum, sbuf, 0, c->leb_size); | ||
84 | if (err && err != -EBADMSG) | ||
85 | goto out_free; | ||
86 | |||
87 | /* Find the first position that is definitely not a node */ | ||
88 | offs = 0; | ||
89 | buf = sbuf; | ||
90 | len = c->leb_size; | ||
91 | while (offs + UBIFS_MST_NODE_SZ <= c->leb_size) { | ||
92 | struct ubifs_ch *ch = buf; | ||
93 | |||
94 | if (le32_to_cpu(ch->magic) != UBIFS_NODE_MAGIC) | ||
95 | break; | ||
96 | offs += sz; | ||
97 | buf += sz; | ||
98 | len -= sz; | ||
99 | } | ||
100 | /* See if there was a valid master node before that */ | ||
101 | if (offs) { | ||
102 | int ret; | ||
103 | |||
104 | offs -= sz; | ||
105 | buf -= sz; | ||
106 | len += sz; | ||
107 | ret = ubifs_scan_a_node(c, buf, len, lnum, offs, 1); | ||
108 | if (ret != SCANNED_A_NODE && offs) { | ||
109 | /* Could have been corruption so check one place back */ | ||
110 | offs -= sz; | ||
111 | buf -= sz; | ||
112 | len += sz; | ||
113 | ret = ubifs_scan_a_node(c, buf, len, lnum, offs, 1); | ||
114 | if (ret != SCANNED_A_NODE) | ||
115 | /* | ||
116 | * We accept only one area of corruption because | ||
117 | * we are assuming that it was caused while | ||
118 | * trying to write a master node. | ||
119 | */ | ||
120 | goto out_err; | ||
121 | } | ||
122 | if (ret == SCANNED_A_NODE) { | ||
123 | struct ubifs_ch *ch = buf; | ||
124 | |||
125 | if (ch->node_type != UBIFS_MST_NODE) | ||
126 | goto out_err; | ||
127 | dbg_rcvry("found a master node at %d:%d", lnum, offs); | ||
128 | *mst = buf; | ||
129 | offs += sz; | ||
130 | buf += sz; | ||
131 | len -= sz; | ||
132 | } | ||
133 | } | ||
134 | /* Check for corruption */ | ||
135 | if (offs < c->leb_size) { | ||
136 | if (!is_empty(buf, min_t(int, len, sz))) { | ||
137 | *cor = buf; | ||
138 | dbg_rcvry("found corruption at %d:%d", lnum, offs); | ||
139 | } | ||
140 | offs += sz; | ||
141 | buf += sz; | ||
142 | len -= sz; | ||
143 | } | ||
144 | /* Check remaining empty space */ | ||
145 | if (offs < c->leb_size) | ||
146 | if (!is_empty(buf, len)) | ||
147 | goto out_err; | ||
148 | *pbuf = sbuf; | ||
149 | return 0; | ||
150 | |||
151 | out_err: | ||
152 | err = -EINVAL; | ||
153 | out_free: | ||
154 | vfree(sbuf); | ||
155 | *mst = NULL; | ||
156 | *cor = NULL; | ||
157 | return err; | ||
158 | } | ||
159 | |||
160 | /** | ||
161 | * write_rcvrd_mst_node - write recovered master node. | ||
162 | * @c: UBIFS file-system description object | ||
163 | * @mst: master node | ||
164 | * | ||
165 | * This function returns %0 on success and a negative error code on failure. | ||
166 | */ | ||
167 | static int write_rcvrd_mst_node(struct ubifs_info *c, | ||
168 | struct ubifs_mst_node *mst) | ||
169 | { | ||
170 | int err = 0, lnum = UBIFS_MST_LNUM, sz = c->mst_node_alsz; | ||
171 | uint32_t save_flags; | ||
172 | |||
173 | dbg_rcvry("recovery"); | ||
174 | |||
175 | save_flags = mst->flags; | ||
176 | mst->flags = cpu_to_le32(le32_to_cpu(mst->flags) | UBIFS_MST_RCVRY); | ||
177 | |||
178 | ubifs_prepare_node(c, mst, UBIFS_MST_NODE_SZ, 1); | ||
179 | err = ubi_leb_change(c->ubi, lnum, mst, sz, UBI_SHORTTERM); | ||
180 | if (err) | ||
181 | goto out; | ||
182 | err = ubi_leb_change(c->ubi, lnum + 1, mst, sz, UBI_SHORTTERM); | ||
183 | if (err) | ||
184 | goto out; | ||
185 | out: | ||
186 | mst->flags = save_flags; | ||
187 | return err; | ||
188 | } | ||
189 | |||
190 | /** | ||
191 | * ubifs_recover_master_node - recover the master node. | ||
192 | * @c: UBIFS file-system description object | ||
193 | * | ||
194 | * This function recovers the master node from corruption that may occur due to | ||
195 | * an unclean unmount. | ||
196 | * | ||
197 | * This function returns %0 on success and a negative error code on failure. | ||
198 | */ | ||
199 | int ubifs_recover_master_node(struct ubifs_info *c) | ||
200 | { | ||
201 | void *buf1 = NULL, *buf2 = NULL, *cor1 = NULL, *cor2 = NULL; | ||
202 | struct ubifs_mst_node *mst1 = NULL, *mst2 = NULL, *mst; | ||
203 | const int sz = c->mst_node_alsz; | ||
204 | int err, offs1, offs2; | ||
205 | |||
206 | dbg_rcvry("recovery"); | ||
207 | |||
208 | err = get_master_node(c, UBIFS_MST_LNUM, &buf1, &mst1, &cor1); | ||
209 | if (err) | ||
210 | goto out_free; | ||
211 | |||
212 | err = get_master_node(c, UBIFS_MST_LNUM + 1, &buf2, &mst2, &cor2); | ||
213 | if (err) | ||
214 | goto out_free; | ||
215 | |||
216 | if (mst1) { | ||
217 | offs1 = (void *)mst1 - buf1; | ||
218 | if ((le32_to_cpu(mst1->flags) & UBIFS_MST_RCVRY) && | ||
219 | (offs1 == 0 && !cor1)) { | ||
220 | /* | ||
221 | * mst1 was written by recovery at offset 0 with no | ||
222 | * corruption. | ||
223 | */ | ||
224 | dbg_rcvry("recovery recovery"); | ||
225 | mst = mst1; | ||
226 | } else if (mst2) { | ||
227 | offs2 = (void *)mst2 - buf2; | ||
228 | if (offs1 == offs2) { | ||
229 | /* Same offset, so must be the same */ | ||
230 | if (memcmp((void *)mst1 + UBIFS_CH_SZ, | ||
231 | (void *)mst2 + UBIFS_CH_SZ, | ||
232 | UBIFS_MST_NODE_SZ - UBIFS_CH_SZ)) | ||
233 | goto out_err; | ||
234 | mst = mst1; | ||
235 | } else if (offs2 + sz == offs1) { | ||
236 | /* 1st LEB was written, 2nd was not */ | ||
237 | if (cor1) | ||
238 | goto out_err; | ||
239 | mst = mst1; | ||
240 | } else if (offs1 == 0 && offs2 + sz >= c->leb_size) { | ||
241 | /* 1st LEB was unmapped and written, 2nd not */ | ||
242 | if (cor1) | ||
243 | goto out_err; | ||
244 | mst = mst1; | ||
245 | } else | ||
246 | goto out_err; | ||
247 | } else { | ||
248 | /* | ||
249 | * 2nd LEB was unmapped and about to be written, so | ||
250 | * there must be only one master node in the first LEB | ||
251 | * and no corruption. | ||
252 | */ | ||
253 | if (offs1 != 0 || cor1) | ||
254 | goto out_err; | ||
255 | mst = mst1; | ||
256 | } | ||
257 | } else { | ||
258 | if (!mst2) | ||
259 | goto out_err; | ||
260 | /* | ||
261 | * 1st LEB was unmapped and about to be written, so there must | ||
262 | * be no room left in 2nd LEB. | ||
263 | */ | ||
264 | offs2 = (void *)mst2 - buf2; | ||
265 | if (offs2 + sz + sz <= c->leb_size) | ||
266 | goto out_err; | ||
267 | mst = mst2; | ||
268 | } | ||
269 | |||
270 | dbg_rcvry("recovered master node from LEB %d", | ||
271 | (mst == mst1 ? UBIFS_MST_LNUM : UBIFS_MST_LNUM + 1)); | ||
272 | |||
273 | memcpy(c->mst_node, mst, UBIFS_MST_NODE_SZ); | ||
274 | |||
275 | if ((c->vfs_sb->s_flags & MS_RDONLY)) { | ||
276 | /* Read-only mode. Keep a copy for switching to rw mode */ | ||
277 | c->rcvrd_mst_node = kmalloc(sz, GFP_KERNEL); | ||
278 | if (!c->rcvrd_mst_node) { | ||
279 | err = -ENOMEM; | ||
280 | goto out_free; | ||
281 | } | ||
282 | memcpy(c->rcvrd_mst_node, c->mst_node, UBIFS_MST_NODE_SZ); | ||
283 | } else { | ||
284 | /* Write the recovered master node */ | ||
285 | c->max_sqnum = le64_to_cpu(mst->ch.sqnum) - 1; | ||
286 | err = write_rcvrd_mst_node(c, c->mst_node); | ||
287 | if (err) | ||
288 | goto out_free; | ||
289 | } | ||
290 | |||
291 | vfree(buf2); | ||
292 | vfree(buf1); | ||
293 | |||
294 | return 0; | ||
295 | |||
296 | out_err: | ||
297 | err = -EINVAL; | ||
298 | out_free: | ||
299 | ubifs_err("failed to recover master node"); | ||
300 | if (mst1) { | ||
301 | dbg_err("dumping first master node"); | ||
302 | dbg_dump_node(c, mst1); | ||
303 | } | ||
304 | if (mst2) { | ||
305 | dbg_err("dumping second master node"); | ||
306 | dbg_dump_node(c, mst2); | ||
307 | } | ||
308 | vfree(buf2); | ||
309 | vfree(buf1); | ||
310 | return err; | ||
311 | } | ||
312 | |||
313 | /** | ||
314 | * ubifs_write_rcvrd_mst_node - write the recovered master node. | ||
315 | * @c: UBIFS file-system description object | ||
316 | * | ||
317 | * This function writes the master node that was recovered during mounting in | ||
318 | * read-only mode and must now be written because we are remounting rw. | ||
319 | * | ||
320 | * This function returns %0 on success and a negative error code on failure. | ||
321 | */ | ||
322 | int ubifs_write_rcvrd_mst_node(struct ubifs_info *c) | ||
323 | { | ||
324 | int err; | ||
325 | |||
326 | if (!c->rcvrd_mst_node) | ||
327 | return 0; | ||
328 | c->rcvrd_mst_node->flags |= cpu_to_le32(UBIFS_MST_DIRTY); | ||
329 | c->mst_node->flags |= cpu_to_le32(UBIFS_MST_DIRTY); | ||
330 | err = write_rcvrd_mst_node(c, c->rcvrd_mst_node); | ||
331 | if (err) | ||
332 | return err; | ||
333 | kfree(c->rcvrd_mst_node); | ||
334 | c->rcvrd_mst_node = NULL; | ||
335 | return 0; | ||
336 | } | ||
337 | |||
338 | /** | ||
339 | * is_last_write - determine if an offset was in the last write to a LEB. | ||
340 | * @c: UBIFS file-system description object | ||
341 | * @buf: buffer to check | ||
342 | * @offs: offset to check | ||
343 | * | ||
344 | * This function returns %1 if @offs was in the last write to the LEB whose data | ||
345 | * is in @buf, otherwise %0 is returned. The determination is made by checking | ||
346 | * for subsequent empty space starting from the next min_io_size boundary (or a | ||
347 | * bit less than the common header size if min_io_size is one). | ||
348 | */ | ||
349 | static int is_last_write(const struct ubifs_info *c, void *buf, int offs) | ||
350 | { | ||
351 | int empty_offs; | ||
352 | int check_len; | ||
353 | uint8_t *p; | ||
354 | |||
355 | if (c->min_io_size == 1) { | ||
356 | check_len = c->leb_size - offs; | ||
357 | p = buf + check_len; | ||
358 | for (; check_len > 0; check_len--) | ||
359 | if (*--p != 0xff) | ||
360 | break; | ||
361 | /* | ||
362 | * 'check_len' is the size of the corruption which cannot be | ||
363 | * more than the size of 1 node if it was caused by an unclean | ||
364 | * unmount. | ||
365 | */ | ||
366 | if (check_len > UBIFS_MAX_NODE_SZ) | ||
367 | return 0; | ||
368 | return 1; | ||
369 | } | ||
370 | |||
371 | /* | ||
372 | * Round up to the next c->min_io_size boundary i.e. 'offs' is in the | ||
373 | * last wbuf written. After that should be empty space. | ||
374 | */ | ||
375 | empty_offs = ALIGN(offs + 1, c->min_io_size); | ||
376 | check_len = c->leb_size - empty_offs; | ||
377 | p = buf + empty_offs - offs; | ||
378 | |||
379 | for (; check_len > 0; check_len--) | ||
380 | if (*p++ != 0xff) | ||
381 | return 0; | ||
382 | return 1; | ||
383 | } | ||
384 | |||
385 | /** | ||
386 | * clean_buf - clean the data from an LEB sitting in a buffer. | ||
387 | * @c: UBIFS file-system description object | ||
388 | * @buf: buffer to clean | ||
389 | * @lnum: LEB number to clean | ||
390 | * @offs: offset from which to clean | ||
391 | * @len: length of buffer | ||
392 | * | ||
393 | * This function pads up to the next min_io_size boundary (if there is one) and | ||
394 | * sets empty space to all 0xff. @buf, @offs and @len are updated to the next | ||
395 | * min_io_size boundary (if there is one). | ||
396 | */ | ||
397 | static void clean_buf(const struct ubifs_info *c, void **buf, int lnum, | ||
398 | int *offs, int *len) | ||
399 | { | ||
400 | int empty_offs, pad_len; | ||
401 | |||
402 | lnum = lnum; | ||
403 | dbg_rcvry("cleaning corruption at %d:%d", lnum, *offs); | ||
404 | |||
405 | if (c->min_io_size == 1) { | ||
406 | memset(*buf, 0xff, c->leb_size - *offs); | ||
407 | return; | ||
408 | } | ||
409 | |||
410 | ubifs_assert(!(*offs & 7)); | ||
411 | empty_offs = ALIGN(*offs, c->min_io_size); | ||
412 | pad_len = empty_offs - *offs; | ||
413 | ubifs_pad(c, *buf, pad_len); | ||
414 | *offs += pad_len; | ||
415 | *buf += pad_len; | ||
416 | *len -= pad_len; | ||
417 | memset(*buf, 0xff, c->leb_size - empty_offs); | ||
418 | } | ||
419 | |||
420 | /** | ||
421 | * no_more_nodes - determine if there are no more nodes in a buffer. | ||
422 | * @c: UBIFS file-system description object | ||
423 | * @buf: buffer to check | ||
424 | * @len: length of buffer | ||
425 | * @lnum: LEB number of the LEB from which @buf was read | ||
426 | * @offs: offset from which @buf was read | ||
427 | * | ||
428 | * This function scans @buf for more nodes and returns %0 is a node is found and | ||
429 | * %1 if no more nodes are found. | ||
430 | */ | ||
431 | static int no_more_nodes(const struct ubifs_info *c, void *buf, int len, | ||
432 | int lnum, int offs) | ||
433 | { | ||
434 | int skip, next_offs = 0; | ||
435 | |||
436 | if (len > UBIFS_DATA_NODE_SZ) { | ||
437 | struct ubifs_ch *ch = buf; | ||
438 | int dlen = le32_to_cpu(ch->len); | ||
439 | |||
440 | if (ch->node_type == UBIFS_DATA_NODE && dlen >= UBIFS_CH_SZ && | ||
441 | dlen <= UBIFS_MAX_DATA_NODE_SZ) | ||
442 | /* The corrupt node looks like a data node */ | ||
443 | next_offs = ALIGN(offs + dlen, 8); | ||
444 | } | ||
445 | |||
446 | if (c->min_io_size == 1) | ||
447 | skip = 8; | ||
448 | else | ||
449 | skip = ALIGN(offs + 1, c->min_io_size) - offs; | ||
450 | |||
451 | offs += skip; | ||
452 | buf += skip; | ||
453 | len -= skip; | ||
454 | while (len > 8) { | ||
455 | struct ubifs_ch *ch = buf; | ||
456 | uint32_t magic = le32_to_cpu(ch->magic); | ||
457 | int ret; | ||
458 | |||
459 | if (magic == UBIFS_NODE_MAGIC) { | ||
460 | ret = ubifs_scan_a_node(c, buf, len, lnum, offs, 1); | ||
461 | if (ret == SCANNED_A_NODE || ret > 0) { | ||
462 | /* | ||
463 | * There is a small chance this is just data in | ||
464 | * a data node, so check that possibility. e.g. | ||
465 | * this is part of a file that itself contains | ||
466 | * a UBIFS image. | ||
467 | */ | ||
468 | if (next_offs && offs + le32_to_cpu(ch->len) <= | ||
469 | next_offs) | ||
470 | continue; | ||
471 | dbg_rcvry("unexpected node at %d:%d", lnum, | ||
472 | offs); | ||
473 | return 0; | ||
474 | } | ||
475 | } | ||
476 | offs += 8; | ||
477 | buf += 8; | ||
478 | len -= 8; | ||
479 | } | ||
480 | return 1; | ||
481 | } | ||
482 | |||
483 | /** | ||
484 | * fix_unclean_leb - fix an unclean LEB. | ||
485 | * @c: UBIFS file-system description object | ||
486 | * @sleb: scanned LEB information | ||
487 | * @start: offset where scan started | ||
488 | */ | ||
489 | static int fix_unclean_leb(struct ubifs_info *c, struct ubifs_scan_leb *sleb, | ||
490 | int start) | ||
491 | { | ||
492 | int lnum = sleb->lnum, endpt = start; | ||
493 | |||
494 | /* Get the end offset of the last node we are keeping */ | ||
495 | if (!list_empty(&sleb->nodes)) { | ||
496 | struct ubifs_scan_node *snod; | ||
497 | |||
498 | snod = list_entry(sleb->nodes.prev, | ||
499 | struct ubifs_scan_node, list); | ||
500 | endpt = snod->offs + snod->len; | ||
501 | } | ||
502 | |||
503 | if ((c->vfs_sb->s_flags & MS_RDONLY) && !c->remounting_rw) { | ||
504 | /* Add to recovery list */ | ||
505 | struct ubifs_unclean_leb *ucleb; | ||
506 | |||
507 | dbg_rcvry("need to fix LEB %d start %d endpt %d", | ||
508 | lnum, start, sleb->endpt); | ||
509 | ucleb = kzalloc(sizeof(struct ubifs_unclean_leb), GFP_NOFS); | ||
510 | if (!ucleb) | ||
511 | return -ENOMEM; | ||
512 | ucleb->lnum = lnum; | ||
513 | ucleb->endpt = endpt; | ||
514 | list_add_tail(&ucleb->list, &c->unclean_leb_list); | ||
515 | } else { | ||
516 | /* Write the fixed LEB back to flash */ | ||
517 | int err; | ||
518 | |||
519 | dbg_rcvry("fixing LEB %d start %d endpt %d", | ||
520 | lnum, start, sleb->endpt); | ||
521 | if (endpt == 0) { | ||
522 | err = ubifs_leb_unmap(c, lnum); | ||
523 | if (err) | ||
524 | return err; | ||
525 | } else { | ||
526 | int len = ALIGN(endpt, c->min_io_size); | ||
527 | |||
528 | if (start) { | ||
529 | err = ubi_read(c->ubi, lnum, sleb->buf, 0, | ||
530 | start); | ||
531 | if (err) | ||
532 | return err; | ||
533 | } | ||
534 | /* Pad to min_io_size */ | ||
535 | if (len > endpt) { | ||
536 | int pad_len = len - ALIGN(endpt, 8); | ||
537 | |||
538 | if (pad_len > 0) { | ||
539 | void *buf = sleb->buf + len - pad_len; | ||
540 | |||
541 | ubifs_pad(c, buf, pad_len); | ||
542 | } | ||
543 | } | ||
544 | err = ubi_leb_change(c->ubi, lnum, sleb->buf, len, | ||
545 | UBI_UNKNOWN); | ||
546 | if (err) | ||
547 | return err; | ||
548 | } | ||
549 | } | ||
550 | return 0; | ||
551 | } | ||
552 | |||
553 | /** | ||
554 | * drop_incomplete_group - drop nodes from an incomplete group. | ||
555 | * @sleb: scanned LEB information | ||
556 | * @offs: offset of dropped nodes is returned here | ||
557 | * | ||
558 | * This function returns %1 if nodes are dropped and %0 otherwise. | ||
559 | */ | ||
560 | static int drop_incomplete_group(struct ubifs_scan_leb *sleb, int *offs) | ||
561 | { | ||
562 | int dropped = 0; | ||
563 | |||
564 | while (!list_empty(&sleb->nodes)) { | ||
565 | struct ubifs_scan_node *snod; | ||
566 | struct ubifs_ch *ch; | ||
567 | |||
568 | snod = list_entry(sleb->nodes.prev, struct ubifs_scan_node, | ||
569 | list); | ||
570 | ch = snod->node; | ||
571 | if (ch->group_type != UBIFS_IN_NODE_GROUP) | ||
572 | return dropped; | ||
573 | dbg_rcvry("dropping node at %d:%d", sleb->lnum, snod->offs); | ||
574 | *offs = snod->offs; | ||
575 | list_del(&snod->list); | ||
576 | kfree(snod); | ||
577 | sleb->nodes_cnt -= 1; | ||
578 | dropped = 1; | ||
579 | } | ||
580 | return dropped; | ||
581 | } | ||
582 | |||
583 | /** | ||
584 | * ubifs_recover_leb - scan and recover a LEB. | ||
585 | * @c: UBIFS file-system description object | ||
586 | * @lnum: LEB number | ||
587 | * @offs: offset | ||
588 | * @sbuf: LEB-sized buffer to use | ||
589 | * @grouped: nodes may be grouped for recovery | ||
590 | * | ||
591 | * This function does a scan of a LEB, but caters for errors that might have | ||
592 | * been caused by the unclean unmount from which we are attempting to recover. | ||
593 | * | ||
594 | * This function returns %0 on success and a negative error code on failure. | ||
595 | */ | ||
596 | struct ubifs_scan_leb *ubifs_recover_leb(struct ubifs_info *c, int lnum, | ||
597 | int offs, void *sbuf, int grouped) | ||
598 | { | ||
599 | int err, len = c->leb_size - offs, need_clean = 0, quiet = 1; | ||
600 | int empty_chkd = 0, start = offs; | ||
601 | struct ubifs_scan_leb *sleb; | ||
602 | void *buf = sbuf + offs; | ||
603 | |||
604 | dbg_rcvry("%d:%d", lnum, offs); | ||
605 | |||
606 | sleb = ubifs_start_scan(c, lnum, offs, sbuf); | ||
607 | if (IS_ERR(sleb)) | ||
608 | return sleb; | ||
609 | |||
610 | if (sleb->ecc) | ||
611 | need_clean = 1; | ||
612 | |||
613 | while (len >= 8) { | ||
614 | int ret; | ||
615 | |||
616 | dbg_scan("look at LEB %d:%d (%d bytes left)", | ||
617 | lnum, offs, len); | ||
618 | |||
619 | cond_resched(); | ||
620 | |||
621 | /* | ||
622 | * Scan quietly until there is an error from which we cannot | ||
623 | * recover | ||
624 | */ | ||
625 | ret = ubifs_scan_a_node(c, buf, len, lnum, offs, quiet); | ||
626 | |||
627 | if (ret == SCANNED_A_NODE) { | ||
628 | /* A valid node, and not a padding node */ | ||
629 | struct ubifs_ch *ch = buf; | ||
630 | int node_len; | ||
631 | |||
632 | err = ubifs_add_snod(c, sleb, buf, offs); | ||
633 | if (err) | ||
634 | goto error; | ||
635 | node_len = ALIGN(le32_to_cpu(ch->len), 8); | ||
636 | offs += node_len; | ||
637 | buf += node_len; | ||
638 | len -= node_len; | ||
639 | continue; | ||
640 | } | ||
641 | |||
642 | if (ret > 0) { | ||
643 | /* Padding bytes or a valid padding node */ | ||
644 | offs += ret; | ||
645 | buf += ret; | ||
646 | len -= ret; | ||
647 | continue; | ||
648 | } | ||
649 | |||
650 | if (ret == SCANNED_EMPTY_SPACE) { | ||
651 | if (!is_empty(buf, len)) { | ||
652 | if (!is_last_write(c, buf, offs)) | ||
653 | break; | ||
654 | clean_buf(c, &buf, lnum, &offs, &len); | ||
655 | need_clean = 1; | ||
656 | } | ||
657 | empty_chkd = 1; | ||
658 | break; | ||
659 | } | ||
660 | |||
661 | if (ret == SCANNED_GARBAGE || ret == SCANNED_A_BAD_PAD_NODE) | ||
662 | if (is_last_write(c, buf, offs)) { | ||
663 | clean_buf(c, &buf, lnum, &offs, &len); | ||
664 | need_clean = 1; | ||
665 | empty_chkd = 1; | ||
666 | break; | ||
667 | } | ||
668 | |||
669 | if (ret == SCANNED_A_CORRUPT_NODE) | ||
670 | if (no_more_nodes(c, buf, len, lnum, offs)) { | ||
671 | clean_buf(c, &buf, lnum, &offs, &len); | ||
672 | need_clean = 1; | ||
673 | empty_chkd = 1; | ||
674 | break; | ||
675 | } | ||
676 | |||
677 | if (quiet) { | ||
678 | /* Redo the last scan but noisily */ | ||
679 | quiet = 0; | ||
680 | continue; | ||
681 | } | ||
682 | |||
683 | switch (ret) { | ||
684 | case SCANNED_GARBAGE: | ||
685 | dbg_err("garbage"); | ||
686 | goto corrupted; | ||
687 | case SCANNED_A_CORRUPT_NODE: | ||
688 | case SCANNED_A_BAD_PAD_NODE: | ||
689 | dbg_err("bad node"); | ||
690 | goto corrupted; | ||
691 | default: | ||
692 | dbg_err("unknown"); | ||
693 | goto corrupted; | ||
694 | } | ||
695 | } | ||
696 | |||
697 | if (!empty_chkd && !is_empty(buf, len)) { | ||
698 | if (is_last_write(c, buf, offs)) { | ||
699 | clean_buf(c, &buf, lnum, &offs, &len); | ||
700 | need_clean = 1; | ||
701 | } else { | ||
702 | ubifs_err("corrupt empty space at LEB %d:%d", | ||
703 | lnum, offs); | ||
704 | goto corrupted; | ||
705 | } | ||
706 | } | ||
707 | |||
708 | /* Drop nodes from incomplete group */ | ||
709 | if (grouped && drop_incomplete_group(sleb, &offs)) { | ||
710 | buf = sbuf + offs; | ||
711 | len = c->leb_size - offs; | ||
712 | clean_buf(c, &buf, lnum, &offs, &len); | ||
713 | need_clean = 1; | ||
714 | } | ||
715 | |||
716 | if (offs % c->min_io_size) { | ||
717 | clean_buf(c, &buf, lnum, &offs, &len); | ||
718 | need_clean = 1; | ||
719 | } | ||
720 | |||
721 | ubifs_end_scan(c, sleb, lnum, offs); | ||
722 | |||
723 | if (need_clean) { | ||
724 | err = fix_unclean_leb(c, sleb, start); | ||
725 | if (err) | ||
726 | goto error; | ||
727 | } | ||
728 | |||
729 | return sleb; | ||
730 | |||
731 | corrupted: | ||
732 | ubifs_scanned_corruption(c, lnum, offs, buf); | ||
733 | err = -EUCLEAN; | ||
734 | error: | ||
735 | ubifs_err("LEB %d scanning failed", lnum); | ||
736 | ubifs_scan_destroy(sleb); | ||
737 | return ERR_PTR(err); | ||
738 | } | ||
739 | |||
740 | /** | ||
741 | * get_cs_sqnum - get commit start sequence number. | ||
742 | * @c: UBIFS file-system description object | ||
743 | * @lnum: LEB number of commit start node | ||
744 | * @offs: offset of commit start node | ||
745 | * @cs_sqnum: commit start sequence number is returned here | ||
746 | * | ||
747 | * This function returns %0 on success and a negative error code on failure. | ||
748 | */ | ||
749 | static int get_cs_sqnum(struct ubifs_info *c, int lnum, int offs, | ||
750 | unsigned long long *cs_sqnum) | ||
751 | { | ||
752 | struct ubifs_cs_node *cs_node = NULL; | ||
753 | int err, ret; | ||
754 | |||
755 | dbg_rcvry("at %d:%d", lnum, offs); | ||
756 | cs_node = kmalloc(UBIFS_CS_NODE_SZ, GFP_KERNEL); | ||
757 | if (!cs_node) | ||
758 | return -ENOMEM; | ||
759 | if (c->leb_size - offs < UBIFS_CS_NODE_SZ) | ||
760 | goto out_err; | ||
761 | err = ubi_read(c->ubi, lnum, (void *)cs_node, offs, UBIFS_CS_NODE_SZ); | ||
762 | if (err && err != -EBADMSG) | ||
763 | goto out_free; | ||
764 | ret = ubifs_scan_a_node(c, cs_node, UBIFS_CS_NODE_SZ, lnum, offs, 0); | ||
765 | if (ret != SCANNED_A_NODE) { | ||
766 | dbg_err("Not a valid node"); | ||
767 | goto out_err; | ||
768 | } | ||
769 | if (cs_node->ch.node_type != UBIFS_CS_NODE) { | ||
770 | dbg_err("Node a CS node, type is %d", cs_node->ch.node_type); | ||
771 | goto out_err; | ||
772 | } | ||
773 | if (le64_to_cpu(cs_node->cmt_no) != c->cmt_no) { | ||
774 | dbg_err("CS node cmt_no %llu != current cmt_no %llu", | ||
775 | (unsigned long long)le64_to_cpu(cs_node->cmt_no), | ||
776 | c->cmt_no); | ||
777 | goto out_err; | ||
778 | } | ||
779 | *cs_sqnum = le64_to_cpu(cs_node->ch.sqnum); | ||
780 | dbg_rcvry("commit start sqnum %llu", *cs_sqnum); | ||
781 | kfree(cs_node); | ||
782 | return 0; | ||
783 | |||
784 | out_err: | ||
785 | err = -EINVAL; | ||
786 | out_free: | ||
787 | ubifs_err("failed to get CS sqnum"); | ||
788 | kfree(cs_node); | ||
789 | return err; | ||
790 | } | ||
791 | |||
792 | /** | ||
793 | * ubifs_recover_log_leb - scan and recover a log LEB. | ||
794 | * @c: UBIFS file-system description object | ||
795 | * @lnum: LEB number | ||
796 | * @offs: offset | ||
797 | * @sbuf: LEB-sized buffer to use | ||
798 | * | ||
799 | * This function does a scan of a LEB, but caters for errors that might have | ||
800 | * been caused by the unclean unmount from which we are attempting to recover. | ||
801 | * | ||
802 | * This function returns %0 on success and a negative error code on failure. | ||
803 | */ | ||
804 | struct ubifs_scan_leb *ubifs_recover_log_leb(struct ubifs_info *c, int lnum, | ||
805 | int offs, void *sbuf) | ||
806 | { | ||
807 | struct ubifs_scan_leb *sleb; | ||
808 | int next_lnum; | ||
809 | |||
810 | dbg_rcvry("LEB %d", lnum); | ||
811 | next_lnum = lnum + 1; | ||
812 | if (next_lnum >= UBIFS_LOG_LNUM + c->log_lebs) | ||
813 | next_lnum = UBIFS_LOG_LNUM; | ||
814 | if (next_lnum != c->ltail_lnum) { | ||
815 | /* | ||
816 | * We can only recover at the end of the log, so check that the | ||
817 | * next log LEB is empty or out of date. | ||
818 | */ | ||
819 | sleb = ubifs_scan(c, next_lnum, 0, sbuf); | ||
820 | if (IS_ERR(sleb)) | ||
821 | return sleb; | ||
822 | if (sleb->nodes_cnt) { | ||
823 | struct ubifs_scan_node *snod; | ||
824 | unsigned long long cs_sqnum = c->cs_sqnum; | ||
825 | |||
826 | snod = list_entry(sleb->nodes.next, | ||
827 | struct ubifs_scan_node, list); | ||
828 | if (cs_sqnum == 0) { | ||
829 | int err; | ||
830 | |||
831 | err = get_cs_sqnum(c, lnum, offs, &cs_sqnum); | ||
832 | if (err) { | ||
833 | ubifs_scan_destroy(sleb); | ||
834 | return ERR_PTR(err); | ||
835 | } | ||
836 | } | ||
837 | if (snod->sqnum > cs_sqnum) { | ||
838 | ubifs_err("unrecoverable log corruption " | ||
839 | "in LEB %d", lnum); | ||
840 | ubifs_scan_destroy(sleb); | ||
841 | return ERR_PTR(-EUCLEAN); | ||
842 | } | ||
843 | } | ||
844 | ubifs_scan_destroy(sleb); | ||
845 | } | ||
846 | return ubifs_recover_leb(c, lnum, offs, sbuf, 0); | ||
847 | } | ||
848 | |||
849 | /** | ||
850 | * recover_head - recover a head. | ||
851 | * @c: UBIFS file-system description object | ||
852 | * @lnum: LEB number of head to recover | ||
853 | * @offs: offset of head to recover | ||
854 | * @sbuf: LEB-sized buffer to use | ||
855 | * | ||
856 | * This function ensures that there is no data on the flash at a head location. | ||
857 | * | ||
858 | * This function returns %0 on success and a negative error code on failure. | ||
859 | */ | ||
860 | static int recover_head(const struct ubifs_info *c, int lnum, int offs, | ||
861 | void *sbuf) | ||
862 | { | ||
863 | int len, err, need_clean = 0; | ||
864 | |||
865 | if (c->min_io_size > 1) | ||
866 | len = c->min_io_size; | ||
867 | else | ||
868 | len = 512; | ||
869 | if (offs + len > c->leb_size) | ||
870 | len = c->leb_size - offs; | ||
871 | |||
872 | if (!len) | ||
873 | return 0; | ||
874 | |||
875 | /* Read at the head location and check it is empty flash */ | ||
876 | err = ubi_read(c->ubi, lnum, sbuf, offs, len); | ||
877 | if (err) | ||
878 | need_clean = 1; | ||
879 | else { | ||
880 | uint8_t *p = sbuf; | ||
881 | |||
882 | while (len--) | ||
883 | if (*p++ != 0xff) { | ||
884 | need_clean = 1; | ||
885 | break; | ||
886 | } | ||
887 | } | ||
888 | |||
889 | if (need_clean) { | ||
890 | dbg_rcvry("cleaning head at %d:%d", lnum, offs); | ||
891 | if (offs == 0) | ||
892 | return ubifs_leb_unmap(c, lnum); | ||
893 | err = ubi_read(c->ubi, lnum, sbuf, 0, offs); | ||
894 | if (err) | ||
895 | return err; | ||
896 | return ubi_leb_change(c->ubi, lnum, sbuf, offs, UBI_UNKNOWN); | ||
897 | } | ||
898 | |||
899 | return 0; | ||
900 | } | ||
901 | |||
902 | /** | ||
903 | * ubifs_recover_inl_heads - recover index and LPT heads. | ||
904 | * @c: UBIFS file-system description object | ||
905 | * @sbuf: LEB-sized buffer to use | ||
906 | * | ||
907 | * This function ensures that there is no data on the flash at the index and | ||
908 | * LPT head locations. | ||
909 | * | ||
910 | * This deals with the recovery of a half-completed journal commit. UBIFS is | ||
911 | * careful never to overwrite the last version of the index or the LPT. Because | ||
912 | * the index and LPT are wandering trees, data from a half-completed commit will | ||
913 | * not be referenced anywhere in UBIFS. The data will be either in LEBs that are | ||
914 | * assumed to be empty and will be unmapped anyway before use, or in the index | ||
915 | * and LPT heads. | ||
916 | * | ||
917 | * This function returns %0 on success and a negative error code on failure. | ||
918 | */ | ||
919 | int ubifs_recover_inl_heads(const struct ubifs_info *c, void *sbuf) | ||
920 | { | ||
921 | int err; | ||
922 | |||
923 | ubifs_assert(!(c->vfs_sb->s_flags & MS_RDONLY) || c->remounting_rw); | ||
924 | |||
925 | dbg_rcvry("checking index head at %d:%d", c->ihead_lnum, c->ihead_offs); | ||
926 | err = recover_head(c, c->ihead_lnum, c->ihead_offs, sbuf); | ||
927 | if (err) | ||
928 | return err; | ||
929 | |||
930 | dbg_rcvry("checking LPT head at %d:%d", c->nhead_lnum, c->nhead_offs); | ||
931 | err = recover_head(c, c->nhead_lnum, c->nhead_offs, sbuf); | ||
932 | if (err) | ||
933 | return err; | ||
934 | |||
935 | return 0; | ||
936 | } | ||
937 | |||
938 | /** | ||
939 | * clean_an_unclean_leb - read and write a LEB to remove corruption. | ||
940 | * @c: UBIFS file-system description object | ||
941 | * @ucleb: unclean LEB information | ||
942 | * @sbuf: LEB-sized buffer to use | ||
943 | * | ||
944 | * This function reads a LEB up to a point pre-determined by the mount recovery, | ||
945 | * checks the nodes, and writes the result back to the flash, thereby cleaning | ||
946 | * off any following corruption, or non-fatal ECC errors. | ||
947 | * | ||
948 | * This function returns %0 on success and a negative error code on failure. | ||
949 | */ | ||
950 | static int clean_an_unclean_leb(const struct ubifs_info *c, | ||
951 | struct ubifs_unclean_leb *ucleb, void *sbuf) | ||
952 | { | ||
953 | int err, lnum = ucleb->lnum, offs = 0, len = ucleb->endpt, quiet = 1; | ||
954 | void *buf = sbuf; | ||
955 | |||
956 | dbg_rcvry("LEB %d len %d", lnum, len); | ||
957 | |||
958 | if (len == 0) { | ||
959 | /* Nothing to read, just unmap it */ | ||
960 | err = ubifs_leb_unmap(c, lnum); | ||
961 | if (err) | ||
962 | return err; | ||
963 | return 0; | ||
964 | } | ||
965 | |||
966 | err = ubi_read(c->ubi, lnum, buf, offs, len); | ||
967 | if (err && err != -EBADMSG) | ||
968 | return err; | ||
969 | |||
970 | while (len >= 8) { | ||
971 | int ret; | ||
972 | |||
973 | cond_resched(); | ||
974 | |||
975 | /* Scan quietly until there is an error */ | ||
976 | ret = ubifs_scan_a_node(c, buf, len, lnum, offs, quiet); | ||
977 | |||
978 | if (ret == SCANNED_A_NODE) { | ||
979 | /* A valid node, and not a padding node */ | ||
980 | struct ubifs_ch *ch = buf; | ||
981 | int node_len; | ||
982 | |||
983 | node_len = ALIGN(le32_to_cpu(ch->len), 8); | ||
984 | offs += node_len; | ||
985 | buf += node_len; | ||
986 | len -= node_len; | ||
987 | continue; | ||
988 | } | ||
989 | |||
990 | if (ret > 0) { | ||
991 | /* Padding bytes or a valid padding node */ | ||
992 | offs += ret; | ||
993 | buf += ret; | ||
994 | len -= ret; | ||
995 | continue; | ||
996 | } | ||
997 | |||
998 | if (ret == SCANNED_EMPTY_SPACE) { | ||
999 | ubifs_err("unexpected empty space at %d:%d", | ||
1000 | lnum, offs); | ||
1001 | return -EUCLEAN; | ||
1002 | } | ||
1003 | |||
1004 | if (quiet) { | ||
1005 | /* Redo the last scan but noisily */ | ||
1006 | quiet = 0; | ||
1007 | continue; | ||
1008 | } | ||
1009 | |||
1010 | ubifs_scanned_corruption(c, lnum, offs, buf); | ||
1011 | return -EUCLEAN; | ||
1012 | } | ||
1013 | |||
1014 | /* Pad to min_io_size */ | ||
1015 | len = ALIGN(ucleb->endpt, c->min_io_size); | ||
1016 | if (len > ucleb->endpt) { | ||
1017 | int pad_len = len - ALIGN(ucleb->endpt, 8); | ||
1018 | |||
1019 | if (pad_len > 0) { | ||
1020 | buf = c->sbuf + len - pad_len; | ||
1021 | ubifs_pad(c, buf, pad_len); | ||
1022 | } | ||
1023 | } | ||
1024 | |||
1025 | /* Write back the LEB atomically */ | ||
1026 | err = ubi_leb_change(c->ubi, lnum, sbuf, len, UBI_UNKNOWN); | ||
1027 | if (err) | ||
1028 | return err; | ||
1029 | |||
1030 | dbg_rcvry("cleaned LEB %d", lnum); | ||
1031 | |||
1032 | return 0; | ||
1033 | } | ||
1034 | |||
1035 | /** | ||
1036 | * ubifs_clean_lebs - clean LEBs recovered during read-only mount. | ||
1037 | * @c: UBIFS file-system description object | ||
1038 | * @sbuf: LEB-sized buffer to use | ||
1039 | * | ||
1040 | * This function cleans a LEB identified during recovery that needs to be | ||
1041 | * written but was not because UBIFS was mounted read-only. This happens when | ||
1042 | * remounting to read-write mode. | ||
1043 | * | ||
1044 | * This function returns %0 on success and a negative error code on failure. | ||
1045 | */ | ||
1046 | int ubifs_clean_lebs(const struct ubifs_info *c, void *sbuf) | ||
1047 | { | ||
1048 | dbg_rcvry("recovery"); | ||
1049 | while (!list_empty(&c->unclean_leb_list)) { | ||
1050 | struct ubifs_unclean_leb *ucleb; | ||
1051 | int err; | ||
1052 | |||
1053 | ucleb = list_entry(c->unclean_leb_list.next, | ||
1054 | struct ubifs_unclean_leb, list); | ||
1055 | err = clean_an_unclean_leb(c, ucleb, sbuf); | ||
1056 | if (err) | ||
1057 | return err; | ||
1058 | list_del(&ucleb->list); | ||
1059 | kfree(ucleb); | ||
1060 | } | ||
1061 | return 0; | ||
1062 | } | ||
1063 | |||
1064 | /** | ||
1065 | * ubifs_rcvry_gc_commit - recover the GC LEB number and run the commit. | ||
1066 | * @c: UBIFS file-system description object | ||
1067 | * | ||
1068 | * Out-of-place garbage collection requires always one empty LEB with which to | ||
1069 | * start garbage collection. The LEB number is recorded in c->gc_lnum and is | ||
1070 | * written to the master node on unmounting. In the case of an unclean unmount | ||
1071 | * the value of gc_lnum recorded in the master node is out of date and cannot | ||
1072 | * be used. Instead, recovery must allocate an empty LEB for this purpose. | ||
1073 | * However, there may not be enough empty space, in which case it must be | ||
1074 | * possible to GC the dirtiest LEB into the GC head LEB. | ||
1075 | * | ||
1076 | * This function also runs the commit which causes the TNC updates from | ||
1077 | * size-recovery and orphans to be written to the flash. That is important to | ||
1078 | * ensure correct replay order for subsequent mounts. | ||
1079 | * | ||
1080 | * This function returns %0 on success and a negative error code on failure. | ||
1081 | */ | ||
1082 | int ubifs_rcvry_gc_commit(struct ubifs_info *c) | ||
1083 | { | ||
1084 | struct ubifs_wbuf *wbuf = &c->jheads[GCHD].wbuf; | ||
1085 | struct ubifs_lprops lp; | ||
1086 | int lnum, err; | ||
1087 | |||
1088 | c->gc_lnum = -1; | ||
1089 | if (wbuf->lnum == -1) { | ||
1090 | dbg_rcvry("no GC head LEB"); | ||
1091 | goto find_free; | ||
1092 | } | ||
1093 | /* | ||
1094 | * See whether the used space in the dirtiest LEB fits in the GC head | ||
1095 | * LEB. | ||
1096 | */ | ||
1097 | if (wbuf->offs == c->leb_size) { | ||
1098 | dbg_rcvry("no room in GC head LEB"); | ||
1099 | goto find_free; | ||
1100 | } | ||
1101 | err = ubifs_find_dirty_leb(c, &lp, wbuf->offs, 2); | ||
1102 | if (err) { | ||
1103 | if (err == -ENOSPC) | ||
1104 | dbg_err("could not find a dirty LEB"); | ||
1105 | return err; | ||
1106 | } | ||
1107 | ubifs_assert(!(lp.flags & LPROPS_INDEX)); | ||
1108 | lnum = lp.lnum; | ||
1109 | if (lp.free + lp.dirty == c->leb_size) { | ||
1110 | /* An empty LEB was returned */ | ||
1111 | if (lp.free != c->leb_size) { | ||
1112 | err = ubifs_change_one_lp(c, lnum, c->leb_size, | ||
1113 | 0, 0, 0, 0); | ||
1114 | if (err) | ||
1115 | return err; | ||
1116 | } | ||
1117 | err = ubifs_leb_unmap(c, lnum); | ||
1118 | if (err) | ||
1119 | return err; | ||
1120 | c->gc_lnum = lnum; | ||
1121 | dbg_rcvry("allocated LEB %d for GC", lnum); | ||
1122 | /* Run the commit */ | ||
1123 | dbg_rcvry("committing"); | ||
1124 | return ubifs_run_commit(c); | ||
1125 | } | ||
1126 | /* | ||
1127 | * There was no empty LEB so the used space in the dirtiest LEB must fit | ||
1128 | * in the GC head LEB. | ||
1129 | */ | ||
1130 | if (lp.free + lp.dirty < wbuf->offs) { | ||
1131 | dbg_rcvry("LEB %d doesn't fit in GC head LEB %d:%d", | ||
1132 | lnum, wbuf->lnum, wbuf->offs); | ||
1133 | err = ubifs_return_leb(c, lnum); | ||
1134 | if (err) | ||
1135 | return err; | ||
1136 | goto find_free; | ||
1137 | } | ||
1138 | /* | ||
1139 | * We run the commit before garbage collection otherwise subsequent | ||
1140 | * mounts will see the GC and orphan deletion in a different order. | ||
1141 | */ | ||
1142 | dbg_rcvry("committing"); | ||
1143 | err = ubifs_run_commit(c); | ||
1144 | if (err) | ||
1145 | return err; | ||
1146 | /* | ||
1147 | * The data in the dirtiest LEB fits in the GC head LEB, so do the GC | ||
1148 | * - use locking to keep 'ubifs_assert()' happy. | ||
1149 | */ | ||
1150 | dbg_rcvry("GC'ing LEB %d", lnum); | ||
1151 | mutex_lock_nested(&wbuf->io_mutex, wbuf->jhead); | ||
1152 | err = ubifs_garbage_collect_leb(c, &lp); | ||
1153 | if (err >= 0) { | ||
1154 | int err2 = ubifs_wbuf_sync_nolock(wbuf); | ||
1155 | |||
1156 | if (err2) | ||
1157 | err = err2; | ||
1158 | } | ||
1159 | mutex_unlock(&wbuf->io_mutex); | ||
1160 | if (err < 0) { | ||
1161 | dbg_err("GC failed, error %d", err); | ||
1162 | if (err == -EAGAIN) | ||
1163 | err = -EINVAL; | ||
1164 | return err; | ||
1165 | } | ||
1166 | if (err != LEB_RETAINED) { | ||
1167 | dbg_err("GC returned %d", err); | ||
1168 | return -EINVAL; | ||
1169 | } | ||
1170 | err = ubifs_leb_unmap(c, c->gc_lnum); | ||
1171 | if (err) | ||
1172 | return err; | ||
1173 | dbg_rcvry("allocated LEB %d for GC", lnum); | ||
1174 | return 0; | ||
1175 | |||
1176 | find_free: | ||
1177 | /* | ||
1178 | * There is no GC head LEB or the free space in the GC head LEB is too | ||
1179 | * small. Allocate gc_lnum by calling 'ubifs_find_free_leb_for_idx()' so | ||
1180 | * GC is not run. | ||
1181 | */ | ||
1182 | lnum = ubifs_find_free_leb_for_idx(c); | ||
1183 | if (lnum < 0) { | ||
1184 | dbg_err("could not find an empty LEB"); | ||
1185 | return lnum; | ||
1186 | } | ||
1187 | /* And reset the index flag */ | ||
1188 | err = ubifs_change_one_lp(c, lnum, LPROPS_NC, LPROPS_NC, 0, | ||
1189 | LPROPS_INDEX, 0); | ||
1190 | if (err) | ||
1191 | return err; | ||
1192 | c->gc_lnum = lnum; | ||
1193 | dbg_rcvry("allocated LEB %d for GC", lnum); | ||
1194 | /* Run the commit */ | ||
1195 | dbg_rcvry("committing"); | ||
1196 | return ubifs_run_commit(c); | ||
1197 | } | ||
1198 | |||
1199 | /** | ||
1200 | * struct size_entry - inode size information for recovery. | ||
1201 | * @rb: link in the RB-tree of sizes | ||
1202 | * @inum: inode number | ||
1203 | * @i_size: size on inode | ||
1204 | * @d_size: maximum size based on data nodes | ||
1205 | * @exists: indicates whether the inode exists | ||
1206 | * @inode: inode if pinned in memory awaiting rw mode to fix it | ||
1207 | */ | ||
1208 | struct size_entry { | ||
1209 | struct rb_node rb; | ||
1210 | ino_t inum; | ||
1211 | loff_t i_size; | ||
1212 | loff_t d_size; | ||
1213 | int exists; | ||
1214 | struct inode *inode; | ||
1215 | }; | ||
1216 | |||
1217 | /** | ||
1218 | * add_ino - add an entry to the size tree. | ||
1219 | * @c: UBIFS file-system description object | ||
1220 | * @inum: inode number | ||
1221 | * @i_size: size on inode | ||
1222 | * @d_size: maximum size based on data nodes | ||
1223 | * @exists: indicates whether the inode exists | ||
1224 | */ | ||
1225 | static int add_ino(struct ubifs_info *c, ino_t inum, loff_t i_size, | ||
1226 | loff_t d_size, int exists) | ||
1227 | { | ||
1228 | struct rb_node **p = &c->size_tree.rb_node, *parent = NULL; | ||
1229 | struct size_entry *e; | ||
1230 | |||
1231 | while (*p) { | ||
1232 | parent = *p; | ||
1233 | e = rb_entry(parent, struct size_entry, rb); | ||
1234 | if (inum < e->inum) | ||
1235 | p = &(*p)->rb_left; | ||
1236 | else | ||
1237 | p = &(*p)->rb_right; | ||
1238 | } | ||
1239 | |||
1240 | e = kzalloc(sizeof(struct size_entry), GFP_KERNEL); | ||
1241 | if (!e) | ||
1242 | return -ENOMEM; | ||
1243 | |||
1244 | e->inum = inum; | ||
1245 | e->i_size = i_size; | ||
1246 | e->d_size = d_size; | ||
1247 | e->exists = exists; | ||
1248 | |||
1249 | rb_link_node(&e->rb, parent, p); | ||
1250 | rb_insert_color(&e->rb, &c->size_tree); | ||
1251 | |||
1252 | return 0; | ||
1253 | } | ||
1254 | |||
1255 | /** | ||
1256 | * find_ino - find an entry on the size tree. | ||
1257 | * @c: UBIFS file-system description object | ||
1258 | * @inum: inode number | ||
1259 | */ | ||
1260 | static struct size_entry *find_ino(struct ubifs_info *c, ino_t inum) | ||
1261 | { | ||
1262 | struct rb_node *p = c->size_tree.rb_node; | ||
1263 | struct size_entry *e; | ||
1264 | |||
1265 | while (p) { | ||
1266 | e = rb_entry(p, struct size_entry, rb); | ||
1267 | if (inum < e->inum) | ||
1268 | p = p->rb_left; | ||
1269 | else if (inum > e->inum) | ||
1270 | p = p->rb_right; | ||
1271 | else | ||
1272 | return e; | ||
1273 | } | ||
1274 | return NULL; | ||
1275 | } | ||
1276 | |||
1277 | /** | ||
1278 | * remove_ino - remove an entry from the size tree. | ||
1279 | * @c: UBIFS file-system description object | ||
1280 | * @inum: inode number | ||
1281 | */ | ||
1282 | static void remove_ino(struct ubifs_info *c, ino_t inum) | ||
1283 | { | ||
1284 | struct size_entry *e = find_ino(c, inum); | ||
1285 | |||
1286 | if (!e) | ||
1287 | return; | ||
1288 | rb_erase(&e->rb, &c->size_tree); | ||
1289 | kfree(e); | ||
1290 | } | ||
1291 | |||
1292 | /** | ||
1293 | * ubifs_destroy_size_tree - free resources related to the size tree. | ||
1294 | * @c: UBIFS file-system description object | ||
1295 | */ | ||
1296 | void ubifs_destroy_size_tree(struct ubifs_info *c) | ||
1297 | { | ||
1298 | struct rb_node *this = c->size_tree.rb_node; | ||
1299 | struct size_entry *e; | ||
1300 | |||
1301 | while (this) { | ||
1302 | if (this->rb_left) { | ||
1303 | this = this->rb_left; | ||
1304 | continue; | ||
1305 | } else if (this->rb_right) { | ||
1306 | this = this->rb_right; | ||
1307 | continue; | ||
1308 | } | ||
1309 | e = rb_entry(this, struct size_entry, rb); | ||
1310 | if (e->inode) | ||
1311 | iput(e->inode); | ||
1312 | this = rb_parent(this); | ||
1313 | if (this) { | ||
1314 | if (this->rb_left == &e->rb) | ||
1315 | this->rb_left = NULL; | ||
1316 | else | ||
1317 | this->rb_right = NULL; | ||
1318 | } | ||
1319 | kfree(e); | ||
1320 | } | ||
1321 | c->size_tree = RB_ROOT; | ||
1322 | } | ||
1323 | |||
1324 | /** | ||
1325 | * ubifs_recover_size_accum - accumulate inode sizes for recovery. | ||
1326 | * @c: UBIFS file-system description object | ||
1327 | * @key: node key | ||
1328 | * @deletion: node is for a deletion | ||
1329 | * @new_size: inode size | ||
1330 | * | ||
1331 | * This function has two purposes: | ||
1332 | * 1) to ensure there are no data nodes that fall outside the inode size | ||
1333 | * 2) to ensure there are no data nodes for inodes that do not exist | ||
1334 | * To accomplish those purposes, a rb-tree is constructed containing an entry | ||
1335 | * for each inode number in the journal that has not been deleted, and recording | ||
1336 | * the size from the inode node, the maximum size of any data node (also altered | ||
1337 | * by truncations) and a flag indicating a inode number for which no inode node | ||
1338 | * was present in the journal. | ||
1339 | * | ||
1340 | * Note that there is still the possibility that there are data nodes that have | ||
1341 | * been committed that are beyond the inode size, however the only way to find | ||
1342 | * them would be to scan the entire index. Alternatively, some provision could | ||
1343 | * be made to record the size of inodes at the start of commit, which would seem | ||
1344 | * very cumbersome for a scenario that is quite unlikely and the only negative | ||
1345 | * consequence of which is wasted space. | ||
1346 | * | ||
1347 | * This functions returns %0 on success and a negative error code on failure. | ||
1348 | */ | ||
1349 | int ubifs_recover_size_accum(struct ubifs_info *c, union ubifs_key *key, | ||
1350 | int deletion, loff_t new_size) | ||
1351 | { | ||
1352 | ino_t inum = key_inum(c, key); | ||
1353 | struct size_entry *e; | ||
1354 | int err; | ||
1355 | |||
1356 | switch (key_type(c, key)) { | ||
1357 | case UBIFS_INO_KEY: | ||
1358 | if (deletion) | ||
1359 | remove_ino(c, inum); | ||
1360 | else { | ||
1361 | e = find_ino(c, inum); | ||
1362 | if (e) { | ||
1363 | e->i_size = new_size; | ||
1364 | e->exists = 1; | ||
1365 | } else { | ||
1366 | err = add_ino(c, inum, new_size, 0, 1); | ||
1367 | if (err) | ||
1368 | return err; | ||
1369 | } | ||
1370 | } | ||
1371 | break; | ||
1372 | case UBIFS_DATA_KEY: | ||
1373 | e = find_ino(c, inum); | ||
1374 | if (e) { | ||
1375 | if (new_size > e->d_size) | ||
1376 | e->d_size = new_size; | ||
1377 | } else { | ||
1378 | err = add_ino(c, inum, 0, new_size, 0); | ||
1379 | if (err) | ||
1380 | return err; | ||
1381 | } | ||
1382 | break; | ||
1383 | case UBIFS_TRUN_KEY: | ||
1384 | e = find_ino(c, inum); | ||
1385 | if (e) | ||
1386 | e->d_size = new_size; | ||
1387 | break; | ||
1388 | } | ||
1389 | return 0; | ||
1390 | } | ||
1391 | |||
1392 | /** | ||
1393 | * fix_size_in_place - fix inode size in place on flash. | ||
1394 | * @c: UBIFS file-system description object | ||
1395 | * @e: inode size information for recovery | ||
1396 | */ | ||
1397 | static int fix_size_in_place(struct ubifs_info *c, struct size_entry *e) | ||
1398 | { | ||
1399 | struct ubifs_ino_node *ino = c->sbuf; | ||
1400 | unsigned char *p; | ||
1401 | union ubifs_key key; | ||
1402 | int err, lnum, offs, len; | ||
1403 | loff_t i_size; | ||
1404 | uint32_t crc; | ||
1405 | |||
1406 | /* Locate the inode node LEB number and offset */ | ||
1407 | ino_key_init(c, &key, e->inum); | ||
1408 | err = ubifs_tnc_locate(c, &key, ino, &lnum, &offs); | ||
1409 | if (err) | ||
1410 | goto out; | ||
1411 | /* | ||
1412 | * If the size recorded on the inode node is greater than the size that | ||
1413 | * was calculated from nodes in the journal then don't change the inode. | ||
1414 | */ | ||
1415 | i_size = le64_to_cpu(ino->size); | ||
1416 | if (i_size >= e->d_size) | ||
1417 | return 0; | ||
1418 | /* Read the LEB */ | ||
1419 | err = ubi_read(c->ubi, lnum, c->sbuf, 0, c->leb_size); | ||
1420 | if (err) | ||
1421 | goto out; | ||
1422 | /* Change the size field and recalculate the CRC */ | ||
1423 | ino = c->sbuf + offs; | ||
1424 | ino->size = cpu_to_le64(e->d_size); | ||
1425 | len = le32_to_cpu(ino->ch.len); | ||
1426 | crc = crc32(UBIFS_CRC32_INIT, (void *)ino + 8, len - 8); | ||
1427 | ino->ch.crc = cpu_to_le32(crc); | ||
1428 | /* Work out where data in the LEB ends and free space begins */ | ||
1429 | p = c->sbuf; | ||
1430 | len = c->leb_size - 1; | ||
1431 | while (p[len] == 0xff) | ||
1432 | len -= 1; | ||
1433 | len = ALIGN(len + 1, c->min_io_size); | ||
1434 | /* Atomically write the fixed LEB back again */ | ||
1435 | err = ubi_leb_change(c->ubi, lnum, c->sbuf, len, UBI_UNKNOWN); | ||
1436 | if (err) | ||
1437 | goto out; | ||
1438 | dbg_rcvry("inode %lu at %d:%d size %lld -> %lld ", e->inum, lnum, offs, | ||
1439 | i_size, e->d_size); | ||
1440 | return 0; | ||
1441 | |||
1442 | out: | ||
1443 | ubifs_warn("inode %lu failed to fix size %lld -> %lld error %d", | ||
1444 | e->inum, e->i_size, e->d_size, err); | ||
1445 | return err; | ||
1446 | } | ||
1447 | |||
1448 | /** | ||
1449 | * ubifs_recover_size - recover inode size. | ||
1450 | * @c: UBIFS file-system description object | ||
1451 | * | ||
1452 | * This function attempts to fix inode size discrepancies identified by the | ||
1453 | * 'ubifs_recover_size_accum()' function. | ||
1454 | * | ||
1455 | * This functions returns %0 on success and a negative error code on failure. | ||
1456 | */ | ||
1457 | int ubifs_recover_size(struct ubifs_info *c) | ||
1458 | { | ||
1459 | struct rb_node *this = rb_first(&c->size_tree); | ||
1460 | |||
1461 | while (this) { | ||
1462 | struct size_entry *e; | ||
1463 | int err; | ||
1464 | |||
1465 | e = rb_entry(this, struct size_entry, rb); | ||
1466 | if (!e->exists) { | ||
1467 | union ubifs_key key; | ||
1468 | |||
1469 | ino_key_init(c, &key, e->inum); | ||
1470 | err = ubifs_tnc_lookup(c, &key, c->sbuf); | ||
1471 | if (err && err != -ENOENT) | ||
1472 | return err; | ||
1473 | if (err == -ENOENT) { | ||
1474 | /* Remove data nodes that have no inode */ | ||
1475 | dbg_rcvry("removing ino %lu", e->inum); | ||
1476 | err = ubifs_tnc_remove_ino(c, e->inum); | ||
1477 | if (err) | ||
1478 | return err; | ||
1479 | } else { | ||
1480 | struct ubifs_ino_node *ino = c->sbuf; | ||
1481 | |||
1482 | e->exists = 1; | ||
1483 | e->i_size = le64_to_cpu(ino->size); | ||
1484 | } | ||
1485 | } | ||
1486 | if (e->exists && e->i_size < e->d_size) { | ||
1487 | if (!e->inode && (c->vfs_sb->s_flags & MS_RDONLY)) { | ||
1488 | /* Fix the inode size and pin it in memory */ | ||
1489 | struct inode *inode; | ||
1490 | |||
1491 | inode = ubifs_iget(c->vfs_sb, e->inum); | ||
1492 | if (IS_ERR(inode)) | ||
1493 | return PTR_ERR(inode); | ||
1494 | if (inode->i_size < e->d_size) { | ||
1495 | dbg_rcvry("ino %lu size %lld -> %lld", | ||
1496 | e->inum, e->d_size, | ||
1497 | inode->i_size); | ||
1498 | inode->i_size = e->d_size; | ||
1499 | ubifs_inode(inode)->ui_size = e->d_size; | ||
1500 | e->inode = inode; | ||
1501 | this = rb_next(this); | ||
1502 | continue; | ||
1503 | } | ||
1504 | iput(inode); | ||
1505 | } else { | ||
1506 | /* Fix the size in place */ | ||
1507 | err = fix_size_in_place(c, e); | ||
1508 | if (err) | ||
1509 | return err; | ||
1510 | if (e->inode) | ||
1511 | iput(e->inode); | ||
1512 | } | ||
1513 | } | ||
1514 | this = rb_next(this); | ||
1515 | rb_erase(&e->rb, &c->size_tree); | ||
1516 | kfree(e); | ||
1517 | } | ||
1518 | return 0; | ||
1519 | } | ||