hc
2023-12-11 d2ccde1c8e90d38cee87a1b0309ad2827f3fd30d
u-boot/fs/ubifs/tnc.c
....@@ -46,6 +46,11 @@
4646 NOT_ON_MEDIA = 3,
4747 };
4848
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
+
4954 /**
5055 * insert_old_idx - record an index node obsoleted since the last commit start.
5156 * @c: UBIFS file-system description object
....@@ -398,7 +403,19 @@
398403 return 0;
399404 }
400405
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
+ }
402419 if (err)
403420 return err;
404421
....@@ -2766,7 +2783,11 @@
27662783 if (nm->name) {
27672784 if (err) {
27682785 /* 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);
27702791 dbg_tnc("rc returned %d, znode %p, n %d",
27712792 err, znode, n);
27722793 if (unlikely(err < 0))