diff options
-rw-r--r-- | fs/ubifs/tnc.c | 25 |
1 files changed, 23 insertions, 2 deletions
diff --git a/fs/ubifs/tnc.c b/fs/ubifs/tnc.c index 74ae2de949df..709aa098dd46 100644 --- a/fs/ubifs/tnc.c +++ b/fs/ubifs/tnc.c | |||
@@ -34,6 +34,11 @@ | |||
34 | #include <linux/slab.h> | 34 | #include <linux/slab.h> |
35 | #include "ubifs.h" | 35 | #include "ubifs.h" |
36 | 36 | ||
37 | static int try_read_node(const struct ubifs_info *c, void *buf, int type, | ||
38 | int len, int lnum, int offs); | ||
39 | static int fallible_read_node(struct ubifs_info *c, const union ubifs_key *key, | ||
40 | struct ubifs_zbranch *zbr, void *node); | ||
41 | |||
37 | /* | 42 | /* |
38 | * Returned codes of 'matches_name()' and 'fallible_matches_name()' functions. | 43 | * Returned codes of 'matches_name()' and 'fallible_matches_name()' functions. |
39 | * @NAME_LESS: name corresponding to the first argument is less than second | 44 | * @NAME_LESS: name corresponding to the first argument is less than second |
@@ -402,7 +407,19 @@ static int tnc_read_hashed_node(struct ubifs_info *c, struct ubifs_zbranch *zbr, | |||
402 | return 0; | 407 | return 0; |
403 | } | 408 | } |
404 | 409 | ||
405 | err = ubifs_tnc_read_node(c, zbr, node); | 410 | if (c->replaying) { |
411 | err = fallible_read_node(c, &zbr->key, zbr, node); | ||
412 | /* | ||
413 | * When the node was not found, return -ENOENT, 0 otherwise. | ||
414 | * Negative return codes stay as-is. | ||
415 | */ | ||
416 | if (err == 0) | ||
417 | err = -ENOENT; | ||
418 | else if (err == 1) | ||
419 | err = 0; | ||
420 | } else { | ||
421 | err = ubifs_tnc_read_node(c, zbr, node); | ||
422 | } | ||
406 | if (err) | 423 | if (err) |
407 | return err; | 424 | return err; |
408 | 425 | ||
@@ -2857,7 +2874,11 @@ struct ubifs_dent_node *ubifs_tnc_next_ent(struct ubifs_info *c, | |||
2857 | if (fname_len(nm) > 0) { | 2874 | if (fname_len(nm) > 0) { |
2858 | if (err) { | 2875 | if (err) { |
2859 | /* Handle collisions */ | 2876 | /* Handle collisions */ |
2860 | err = resolve_collision(c, key, &znode, &n, nm); | 2877 | if (c->replaying) |
2878 | err = fallible_resolve_collision(c, key, &znode, &n, | ||
2879 | nm, 0); | ||
2880 | else | ||
2881 | err = resolve_collision(c, key, &znode, &n, nm); | ||
2861 | dbg_tnc("rc returned %d, znode %p, n %d", | 2882 | dbg_tnc("rc returned %d, znode %p, n %d", |
2862 | err, znode, n); | 2883 | err, znode, n); |
2863 | if (unlikely(err < 0)) | 2884 | if (unlikely(err < 0)) |