diff options
Diffstat (limited to 'fs')
-rw-r--r-- | fs/ubifs/recovery.c | 23 |
1 files changed, 10 insertions, 13 deletions
diff --git a/fs/ubifs/recovery.c b/fs/ubifs/recovery.c index e2714f8f05ff..936f2cbfe6b6 100644 --- a/fs/ubifs/recovery.c +++ b/fs/ubifs/recovery.c | |||
@@ -38,7 +38,7 @@ | |||
38 | * UBIFS writes only to erased LEBs, so it writes only to the flash space | 38 | * UBIFS writes only to erased LEBs, so it writes only to the flash space |
39 | * containing only 0xFFs. UBIFS also always writes strictly from the beginning | 39 | * containing only 0xFFs. UBIFS also always writes strictly from the beginning |
40 | * of the LEB to the end. And UBIFS assumes that the underlying flash media | 40 | * of the LEB to the end. And UBIFS assumes that the underlying flash media |
41 | * writes in @c->min_io_unit bytes at a time. | 41 | * writes in @c->max_write_size bytes at a time. |
42 | * | 42 | * |
43 | * Hence, if UBIFS finds a corrupted node at offset X, it expects only the min. | 43 | * Hence, if UBIFS finds a corrupted node at offset X, it expects only the min. |
44 | * I/O unit corresponding to offset X to contain corrupted data, all the | 44 | * I/O unit corresponding to offset X to contain corrupted data, all the |
@@ -379,8 +379,9 @@ int ubifs_write_rcvrd_mst_node(struct ubifs_info *c) | |||
379 | * @offs: offset to check | 379 | * @offs: offset to check |
380 | * | 380 | * |
381 | * This function returns %1 if @offs was in the last write to the LEB whose data | 381 | * This function returns %1 if @offs was in the last write to the LEB whose data |
382 | * is in @buf, otherwise %0 is returned. The determination is made by checking | 382 | * is in @buf, otherwise %0 is returned. The determination is made by checking |
383 | * for subsequent empty space starting from the next @c->min_io_size boundary. | 383 | * for subsequent empty space starting from the next @c->max_write_size |
384 | * boundary. | ||
384 | */ | 385 | */ |
385 | static int is_last_write(const struct ubifs_info *c, void *buf, int offs) | 386 | static int is_last_write(const struct ubifs_info *c, void *buf, int offs) |
386 | { | 387 | { |
@@ -388,10 +389,10 @@ static int is_last_write(const struct ubifs_info *c, void *buf, int offs) | |||
388 | uint8_t *p; | 389 | uint8_t *p; |
389 | 390 | ||
390 | /* | 391 | /* |
391 | * Round up to the next @c->min_io_size boundary i.e. @offs is in the | 392 | * Round up to the next @c->max_write_size boundary i.e. @offs is in |
392 | * last wbuf written. After that should be empty space. | 393 | * the last wbuf written. After that should be empty space. |
393 | */ | 394 | */ |
394 | empty_offs = ALIGN(offs + 1, c->min_io_size); | 395 | empty_offs = ALIGN(offs + 1, c->max_write_size); |
395 | check_len = c->leb_size - empty_offs; | 396 | check_len = c->leb_size - empty_offs; |
396 | p = buf + empty_offs - offs; | 397 | p = buf + empty_offs - offs; |
397 | return is_empty(p, check_len); | 398 | return is_empty(p, check_len); |
@@ -446,7 +447,7 @@ static int no_more_nodes(const struct ubifs_info *c, void *buf, int len, | |||
446 | int skip, dlen = le32_to_cpu(ch->len); | 447 | int skip, dlen = le32_to_cpu(ch->len); |
447 | 448 | ||
448 | /* Check for empty space after the corrupt node's common header */ | 449 | /* Check for empty space after the corrupt node's common header */ |
449 | skip = ALIGN(offs + UBIFS_CH_SZ, c->min_io_size) - offs; | 450 | skip = ALIGN(offs + UBIFS_CH_SZ, c->max_write_size) - offs; |
450 | if (is_empty(buf + skip, len - skip)) | 451 | if (is_empty(buf + skip, len - skip)) |
451 | return 1; | 452 | return 1; |
452 | /* | 453 | /* |
@@ -458,7 +459,7 @@ static int no_more_nodes(const struct ubifs_info *c, void *buf, int len, | |||
458 | return 0; | 459 | return 0; |
459 | } | 460 | } |
460 | /* Now we know the corrupt node's length we can skip over it */ | 461 | /* Now we know the corrupt node's length we can skip over it */ |
461 | skip = ALIGN(offs + dlen, c->min_io_size) - offs; | 462 | skip = ALIGN(offs + dlen, c->max_write_size) - offs; |
462 | /* After which there should be empty space */ | 463 | /* After which there should be empty space */ |
463 | if (is_empty(buf + skip, len - skip)) | 464 | if (is_empty(buf + skip, len - skip)) |
464 | return 1; | 465 | return 1; |
@@ -857,12 +858,8 @@ struct ubifs_scan_leb *ubifs_recover_log_leb(struct ubifs_info *c, int lnum, | |||
857 | static int recover_head(const struct ubifs_info *c, int lnum, int offs, | 858 | static int recover_head(const struct ubifs_info *c, int lnum, int offs, |
858 | void *sbuf) | 859 | void *sbuf) |
859 | { | 860 | { |
860 | int len, err; | 861 | int len = c->max_write_size, err; |
861 | 862 | ||
862 | if (c->min_io_size > 1) | ||
863 | len = c->min_io_size; | ||
864 | else | ||
865 | len = 512; | ||
866 | if (offs + len > c->leb_size) | 863 | if (offs + len > c->leb_size) |
867 | len = c->leb_size - offs; | 864 | len = c->leb_size - offs; |
868 | 865 | ||