| .. | .. |
|---|
| 46 | 46 | NOT_ON_MEDIA = 3, |
|---|
| 47 | 47 | }; |
|---|
| 48 | 48 | |
|---|
| 49 | +static int try_read_node(const struct ubifs_info *c, void *buf, int type, |
|---|
| 50 | + int len, int lnum, int offs); |
|---|
| 51 | +static int fallible_read_node(struct ubifs_info *c, const union ubifs_key *key, |
|---|
| 52 | + struct ubifs_zbranch *zbr, void *node); |
|---|
| 53 | + |
|---|
| 49 | 54 | /** |
|---|
| 50 | 55 | * insert_old_idx - record an index node obsoleted since the last commit start. |
|---|
| 51 | 56 | * @c: UBIFS file-system description object |
|---|
| .. | .. |
|---|
| 398 | 403 | return 0; |
|---|
| 399 | 404 | } |
|---|
| 400 | 405 | |
|---|
| 401 | | - err = ubifs_tnc_read_node(c, zbr, node); |
|---|
| 406 | + if (c->replaying) { |
|---|
| 407 | + err = fallible_read_node(c, &zbr->key, zbr, node); |
|---|
| 408 | + /* |
|---|
| 409 | + * When the node was not found, return -ENOENT, 0 otherwise. |
|---|
| 410 | + * Negative return codes stay as-is. |
|---|
| 411 | + */ |
|---|
| 412 | + if (err == 0) |
|---|
| 413 | + err = -ENOENT; |
|---|
| 414 | + else if (err == 1) |
|---|
| 415 | + err = 0; |
|---|
| 416 | + } else { |
|---|
| 417 | + err = ubifs_tnc_read_node(c, zbr, node); |
|---|
| 418 | + } |
|---|
| 402 | 419 | if (err) |
|---|
| 403 | 420 | return err; |
|---|
| 404 | 421 | |
|---|
| .. | .. |
|---|
| 2766 | 2783 | if (nm->name) { |
|---|
| 2767 | 2784 | if (err) { |
|---|
| 2768 | 2785 | /* Handle collisions */ |
|---|
| 2769 | | - err = resolve_collision(c, key, &znode, &n, nm); |
|---|
| 2786 | + if (c->replaying) |
|---|
| 2787 | + err = fallible_resolve_collision(c, key, &znode, &n, |
|---|
| 2788 | + nm, 0); |
|---|
| 2789 | + else |
|---|
| 2790 | + err = resolve_collision(c, key, &znode, &n, nm); |
|---|
| 2770 | 2791 | dbg_tnc("rc returned %d, znode %p, n %d", |
|---|
| 2771 | 2792 | err, znode, n); |
|---|
| 2772 | 2793 | if (unlikely(err < 0)) |
|---|