diff options
author | Ville Baillie <villeb@bytesnap.co.uk> | 2022-03-28 12:13:43 +0300 |
---|---|---|
committer | Tom Rini <trini@konsulko.com> | 2022-04-11 22:03:28 +0300 |
commit | 749c6a6275a201007d7fd53de63b21cdf108eebf (patch) | |
tree | 4fd71a381bbac44eccf24e993ad49053e354f037 /fs/ubifs/tnc.c | |
parent | b583348ca8c8ce74d5dd665446d20f4c6c6e3f06 (diff) | |
download | u-boot-749c6a6275a201007d7fd53de63b21cdf108eebf.tar.xz |
ubifs: Fix journal replay wrt. xattr nodes
Backport commit 1cb51a15b576 ("ubifs: Fix journal replay wrt. xattr
nodes") from the Linux Kernel, which has the following Signed-off-by
line:
Signed-off-by: Richard Weinberger <richard@nod.at>
For U-Boot, after comapring with the upstream commit:
Signed-off-by: Tom Rini <trini@konsulko.com>
Diffstat (limited to 'fs/ubifs/tnc.c')
-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 e8b8f16838..4fb10045ff 100644 --- a/fs/ubifs/tnc.c +++ b/fs/ubifs/tnc.c @@ -50,6 +50,11 @@ enum { NOT_ON_MEDIA = 3, }; +static int try_read_node(const struct ubifs_info *c, void *buf, int type, + int len, int lnum, int offs); +static int fallible_read_node(struct ubifs_info *c, const union ubifs_key *key, + struct ubifs_zbranch *zbr, void *node); + /** * insert_old_idx - record an index node obsoleted since the last commit start. * @c: UBIFS file-system description object @@ -402,7 +407,19 @@ static int tnc_read_node_nm(struct ubifs_info *c, struct ubifs_zbranch *zbr, return 0; } - err = ubifs_tnc_read_node(c, zbr, node); + if (c->replaying) { + err = fallible_read_node(c, &zbr->key, zbr, node); + /* + * When the node was not found, return -ENOENT, 0 otherwise. + * Negative return codes stay as-is. + */ + if (err == 0) + err = -ENOENT; + else if (err == 1) + err = 0; + } else { + err = ubifs_tnc_read_node(c, zbr, node); + } if (err) return err; @@ -2770,7 +2787,11 @@ struct ubifs_dent_node *ubifs_tnc_next_ent(struct ubifs_info *c, if (nm->name) { if (err) { /* Handle collisions */ - err = resolve_collision(c, key, &znode, &n, nm); + if (c->replaying) + err = fallible_resolve_collision(c, key, &znode, &n, + nm, 0); + else + err = resolve_collision(c, key, &znode, &n, nm); dbg_tnc("rc returned %d, znode %p, n %d", err, znode, n); if (unlikely(err < 0)) |