^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0-only
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * This file is part of UBIFS.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Copyright (C) 2006-2008 Nokia Corporation.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) * Authors: Adrian Hunter
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) * Artem Bityutskiy (Битюцкий Артём)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) * This file implements TNC (Tree Node Cache) which caches indexing nodes of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) * the UBIFS B-tree.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) * At the moment the locking rules of the TNC tree are quite simple and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) * straightforward. We just have a mutex and lock it when we traverse the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) * tree. If a znode is not in memory, we read it from flash while still having
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) * the mutex locked.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #include <linux/crc32.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #include <linux/slab.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #include "ubifs.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) static int try_read_node(const struct ubifs_info *c, void *buf, int type,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) struct ubifs_zbranch *zbr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) static int fallible_read_node(struct ubifs_info *c, const union ubifs_key *key,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) struct ubifs_zbranch *zbr, void *node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) * Returned codes of 'matches_name()' and 'fallible_matches_name()' functions.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) * @NAME_LESS: name corresponding to the first argument is less than second
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) * @NAME_MATCHES: names match
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) * @NAME_GREATER: name corresponding to the second argument is greater than
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) * first
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) * @NOT_ON_MEDIA: node referred by zbranch does not exist on the media
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) * These constants were introduce to improve readability.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) NAME_LESS = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) NAME_MATCHES = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) NAME_GREATER = 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) NOT_ON_MEDIA = 3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) * insert_old_idx - record an index node obsoleted since the last commit start.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) * @c: UBIFS file-system description object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) * @lnum: LEB number of obsoleted index node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) * @offs: offset of obsoleted index node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) * Returns %0 on success, and a negative error code on failure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) * For recovery, there must always be a complete intact version of the index on
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) * flash at all times. That is called the "old index". It is the index as at the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) * time of the last successful commit. Many of the index nodes in the old index
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) * may be dirty, but they must not be erased until the next successful commit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) * (at which point that index becomes the old index).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) * That means that the garbage collection and the in-the-gaps method of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) * committing must be able to determine if an index node is in the old index.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) * Most of the old index nodes can be found by looking up the TNC using the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) * 'lookup_znode()' function. However, some of the old index nodes may have
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) * been deleted from the current index or may have been changed so much that
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) * they cannot be easily found. In those cases, an entry is added to an RB-tree.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) * That is what this function does. The RB-tree is ordered by LEB number and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) * offset because they uniquely identify the old index node.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) static int insert_old_idx(struct ubifs_info *c, int lnum, int offs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) struct ubifs_old_idx *old_idx, *o;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) struct rb_node **p, *parent = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) old_idx = kmalloc(sizeof(struct ubifs_old_idx), GFP_NOFS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) if (unlikely(!old_idx))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) old_idx->lnum = lnum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) old_idx->offs = offs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) p = &c->old_idx.rb_node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) while (*p) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) parent = *p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) o = rb_entry(parent, struct ubifs_old_idx, rb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) if (lnum < o->lnum)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) p = &(*p)->rb_left;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) else if (lnum > o->lnum)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) p = &(*p)->rb_right;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) else if (offs < o->offs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) p = &(*p)->rb_left;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) else if (offs > o->offs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) p = &(*p)->rb_right;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) ubifs_err(c, "old idx added twice!");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) kfree(old_idx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) rb_link_node(&old_idx->rb, parent, p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) rb_insert_color(&old_idx->rb, &c->old_idx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) * insert_old_idx_znode - record a znode obsoleted since last commit start.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) * @c: UBIFS file-system description object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) * @znode: znode of obsoleted index node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) * Returns %0 on success, and a negative error code on failure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) int insert_old_idx_znode(struct ubifs_info *c, struct ubifs_znode *znode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) if (znode->parent) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) struct ubifs_zbranch *zbr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) zbr = &znode->parent->zbranch[znode->iip];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) if (zbr->len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) return insert_old_idx(c, zbr->lnum, zbr->offs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) } else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) if (c->zroot.len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) return insert_old_idx(c, c->zroot.lnum,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) c->zroot.offs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) * ins_clr_old_idx_znode - record a znode obsoleted since last commit start.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) * @c: UBIFS file-system description object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) * @znode: znode of obsoleted index node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) * Returns %0 on success, and a negative error code on failure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) static int ins_clr_old_idx_znode(struct ubifs_info *c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) struct ubifs_znode *znode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) if (znode->parent) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) struct ubifs_zbranch *zbr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) zbr = &znode->parent->zbranch[znode->iip];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) if (zbr->len) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) err = insert_old_idx(c, zbr->lnum, zbr->offs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) zbr->lnum = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) zbr->offs = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) zbr->len = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) } else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) if (c->zroot.len) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) err = insert_old_idx(c, c->zroot.lnum, c->zroot.offs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) c->zroot.lnum = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) c->zroot.offs = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) c->zroot.len = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) * destroy_old_idx - destroy the old_idx RB-tree.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) * @c: UBIFS file-system description object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) * During start commit, the old_idx RB-tree is used to avoid overwriting index
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) * nodes that were in the index last commit but have since been deleted. This
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) * is necessary for recovery i.e. the old index must be kept intact until the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) * new index is successfully written. The old-idx RB-tree is used for the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) * in-the-gaps method of writing index nodes and is destroyed every commit.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) void destroy_old_idx(struct ubifs_info *c)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) struct ubifs_old_idx *old_idx, *n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) rbtree_postorder_for_each_entry_safe(old_idx, n, &c->old_idx, rb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) kfree(old_idx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) c->old_idx = RB_ROOT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) * copy_znode - copy a dirty znode.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) * @c: UBIFS file-system description object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) * @znode: znode to copy
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) * A dirty znode being committed may not be changed, so it is copied.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) static struct ubifs_znode *copy_znode(struct ubifs_info *c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) struct ubifs_znode *znode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) struct ubifs_znode *zn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) zn = kmemdup(znode, c->max_znode_sz, GFP_NOFS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) if (unlikely(!zn))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) return ERR_PTR(-ENOMEM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) zn->cnext = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) __set_bit(DIRTY_ZNODE, &zn->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) __clear_bit(COW_ZNODE, &zn->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) ubifs_assert(c, !ubifs_zn_obsolete(znode));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) __set_bit(OBSOLETE_ZNODE, &znode->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) if (znode->level != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) const int n = zn->child_cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) /* The children now have new parent */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) for (i = 0; i < n; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) struct ubifs_zbranch *zbr = &zn->zbranch[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) if (zbr->znode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) zbr->znode->parent = zn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) atomic_long_inc(&c->dirty_zn_cnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) return zn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) * add_idx_dirt - add dirt due to a dirty znode.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) * @c: UBIFS file-system description object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) * @lnum: LEB number of index node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) * @dirt: size of index node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) * This function updates lprops dirty space and the new size of the index.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) static int add_idx_dirt(struct ubifs_info *c, int lnum, int dirt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) c->calc_idx_sz -= ALIGN(dirt, 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) return ubifs_add_dirt(c, lnum, dirt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) * dirty_cow_znode - ensure a znode is not being committed.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) * @c: UBIFS file-system description object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) * @zbr: branch of znode to check
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) * Returns dirtied znode on success or negative error code on failure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) static struct ubifs_znode *dirty_cow_znode(struct ubifs_info *c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) struct ubifs_zbranch *zbr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) struct ubifs_znode *znode = zbr->znode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) struct ubifs_znode *zn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) if (!ubifs_zn_cow(znode)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) /* znode is not being committed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) if (!test_and_set_bit(DIRTY_ZNODE, &znode->flags)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) atomic_long_inc(&c->dirty_zn_cnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) atomic_long_dec(&c->clean_zn_cnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) atomic_long_dec(&ubifs_clean_zn_cnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) err = add_idx_dirt(c, zbr->lnum, zbr->len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) if (unlikely(err))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) return ERR_PTR(err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) return znode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) zn = copy_znode(c, znode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) if (IS_ERR(zn))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) return zn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) if (zbr->len) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) err = insert_old_idx(c, zbr->lnum, zbr->offs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) if (unlikely(err))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) return ERR_PTR(err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) err = add_idx_dirt(c, zbr->lnum, zbr->len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) } else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) zbr->znode = zn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) zbr->lnum = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) zbr->offs = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) zbr->len = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) if (unlikely(err))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) return ERR_PTR(err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) return zn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) * lnc_add - add a leaf node to the leaf node cache.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) * @c: UBIFS file-system description object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) * @zbr: zbranch of leaf node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) * @node: leaf node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) * Leaf nodes are non-index nodes directory entry nodes or data nodes. The
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) * purpose of the leaf node cache is to save re-reading the same leaf node over
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) * and over again. Most things are cached by VFS, however the file system must
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) * cache directory entries for readdir and for resolving hash collisions. The
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) * present implementation of the leaf node cache is extremely simple, and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) * allows for error returns that are not used but that may be needed if a more
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) * complex implementation is created.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) * Note, this function does not add the @node object to LNC directly, but
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) * allocates a copy of the object and adds the copy to LNC. The reason for this
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) * is that @node has been allocated outside of the TNC subsystem and will be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) * used with @c->tnc_mutex unlock upon return from the TNC subsystem. But LNC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) * may be changed at any time, e.g. freed by the shrinker.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) static int lnc_add(struct ubifs_info *c, struct ubifs_zbranch *zbr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) const void *node)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) void *lnc_node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) const struct ubifs_dent_node *dent = node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) ubifs_assert(c, !zbr->leaf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) ubifs_assert(c, zbr->len != 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) ubifs_assert(c, is_hash_key(c, &zbr->key));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) err = ubifs_validate_entry(c, dent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) dump_stack();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) ubifs_dump_node(c, dent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) lnc_node = kmemdup(node, zbr->len, GFP_NOFS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) if (!lnc_node)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) /* We don't have to have the cache, so no error */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) zbr->leaf = lnc_node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) * lnc_add_directly - add a leaf node to the leaf-node-cache.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) * @c: UBIFS file-system description object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) * @zbr: zbranch of leaf node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) * @node: leaf node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) * This function is similar to 'lnc_add()', but it does not create a copy of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) * @node but inserts @node to TNC directly.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) static int lnc_add_directly(struct ubifs_info *c, struct ubifs_zbranch *zbr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) void *node)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) ubifs_assert(c, !zbr->leaf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) ubifs_assert(c, zbr->len != 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) err = ubifs_validate_entry(c, node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) dump_stack();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) ubifs_dump_node(c, node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) zbr->leaf = node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) * lnc_free - remove a leaf node from the leaf node cache.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) * @zbr: zbranch of leaf node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) static void lnc_free(struct ubifs_zbranch *zbr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) if (!zbr->leaf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) kfree(zbr->leaf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) zbr->leaf = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) * tnc_read_hashed_node - read a "hashed" leaf node.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) * @c: UBIFS file-system description object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) * @zbr: key and position of the node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) * @node: node is returned here
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) * This function reads a "hashed" node defined by @zbr from the leaf node cache
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) * (in it is there) or from the hash media, in which case the node is also
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) * added to LNC. Returns zero in case of success or a negative negative error
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) * code in case of failure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) static int tnc_read_hashed_node(struct ubifs_info *c, struct ubifs_zbranch *zbr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) void *node)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) ubifs_assert(c, is_hash_key(c, &zbr->key));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) if (zbr->leaf) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) /* Read from the leaf node cache */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) ubifs_assert(c, zbr->len != 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) memcpy(node, zbr->leaf, zbr->len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) if (c->replaying) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) err = fallible_read_node(c, &zbr->key, zbr, node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) * When the node was not found, return -ENOENT, 0 otherwise.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) * Negative return codes stay as-is.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) if (err == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) err = -ENOENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) else if (err == 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) err = ubifs_tnc_read_node(c, zbr, node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) /* Add the node to the leaf node cache */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) err = lnc_add(c, zbr, node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) * try_read_node - read a node if it is a node.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) * @c: UBIFS file-system description object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) * @buf: buffer to read to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) * @type: node type
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) * @zbr: the zbranch describing the node to read
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) * This function tries to read a node of known type and length, checks it and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) * stores it in @buf. This function returns %1 if a node is present and %0 if
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) * a node is not present. A negative error code is returned for I/O errors.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) * This function performs that same function as ubifs_read_node except that
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) * it does not require that there is actually a node present and instead
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) * the return code indicates if a node was read.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) * Note, this function does not check CRC of data nodes if @c->no_chk_data_crc
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) * is true (it is controlled by corresponding mount option). However, if
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) * @c->mounting or @c->remounting_rw is true (we are mounting or re-mounting to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) * R/W mode), @c->no_chk_data_crc is ignored and CRC is checked. This is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) * because during mounting or re-mounting from R/O mode to R/W mode we may read
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) * journal nodes (when replying the journal or doing the recovery) and the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) * journal nodes may potentially be corrupted, so checking is required.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) static int try_read_node(const struct ubifs_info *c, void *buf, int type,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) struct ubifs_zbranch *zbr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) int len = zbr->len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) int lnum = zbr->lnum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) int offs = zbr->offs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) int err, node_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) struct ubifs_ch *ch = buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) uint32_t crc, node_crc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) dbg_io("LEB %d:%d, %s, length %d", lnum, offs, dbg_ntype(type), len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) err = ubifs_leb_read(c, lnum, buf, offs, len, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) ubifs_err(c, "cannot read node type %d from LEB %d:%d, error %d",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) type, lnum, offs, err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) if (le32_to_cpu(ch->magic) != UBIFS_NODE_MAGIC)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) if (ch->node_type != type)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) node_len = le32_to_cpu(ch->len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) if (node_len != len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) if (type != UBIFS_DATA_NODE || !c->no_chk_data_crc || c->mounting ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) c->remounting_rw) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) crc = crc32(UBIFS_CRC32_INIT, buf + 8, node_len - 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) node_crc = le32_to_cpu(ch->crc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) if (crc != node_crc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) err = ubifs_node_check_hash(c, buf, zbr->hash);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) ubifs_bad_hash(c, buf, zbr->hash, lnum, offs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) * fallible_read_node - try to read a leaf node.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) * @c: UBIFS file-system description object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) * @key: key of node to read
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) * @zbr: position of node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) * @node: node returned
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) * This function tries to read a node and returns %1 if the node is read, %0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) * if the node is not present, and a negative error code in the case of error.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) static int fallible_read_node(struct ubifs_info *c, const union ubifs_key *key,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) struct ubifs_zbranch *zbr, void *node)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) dbg_tnck(key, "LEB %d:%d, key ", zbr->lnum, zbr->offs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) ret = try_read_node(c, node, key_type(c, key), zbr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) if (ret == 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) union ubifs_key node_key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) struct ubifs_dent_node *dent = node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) /* All nodes have key in the same place */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) key_read(c, &dent->key, &node_key);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) if (keys_cmp(c, key, &node_key) != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) if (ret == 0 && c->replaying)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) dbg_mntk(key, "dangling branch LEB %d:%d len %d, key ",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) zbr->lnum, zbr->offs, zbr->len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) * matches_name - determine if a direntry or xattr entry matches a given name.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) * @c: UBIFS file-system description object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) * @zbr: zbranch of dent
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) * @nm: name to match
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) * This function checks if xentry/direntry referred by zbranch @zbr matches name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) * @nm. Returns %NAME_MATCHES if it does, %NAME_LESS if the name referred by
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) * @zbr is less than @nm, and %NAME_GREATER if it is greater than @nm. In case
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) * of failure, a negative error code is returned.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) static int matches_name(struct ubifs_info *c, struct ubifs_zbranch *zbr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) const struct fscrypt_name *nm)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) struct ubifs_dent_node *dent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) int nlen, err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) /* If possible, match against the dent in the leaf node cache */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) if (!zbr->leaf) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) dent = kmalloc(zbr->len, GFP_NOFS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) if (!dent)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) err = ubifs_tnc_read_node(c, zbr, dent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) goto out_free;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) /* Add the node to the leaf node cache */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) err = lnc_add_directly(c, zbr, dent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) goto out_free;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) } else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) dent = zbr->leaf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) nlen = le16_to_cpu(dent->nlen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) err = memcmp(dent->name, fname_name(nm), min_t(int, nlen, fname_len(nm)));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) if (err == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) if (nlen == fname_len(nm))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) return NAME_MATCHES;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) else if (nlen < fname_len(nm))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) return NAME_LESS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) return NAME_GREATER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) } else if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) return NAME_LESS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) return NAME_GREATER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) out_free:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) kfree(dent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) * get_znode - get a TNC znode that may not be loaded yet.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) * @c: UBIFS file-system description object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) * @znode: parent znode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) * @n: znode branch slot number
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) * This function returns the znode or a negative error code.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) static struct ubifs_znode *get_znode(struct ubifs_info *c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) struct ubifs_znode *znode, int n)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) struct ubifs_zbranch *zbr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) zbr = &znode->zbranch[n];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) if (zbr->znode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) znode = zbr->znode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) znode = ubifs_load_znode(c, zbr, znode, n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) return znode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) * tnc_next - find next TNC entry.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) * @c: UBIFS file-system description object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) * @zn: znode is passed and returned here
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) * @n: znode branch slot number is passed and returned here
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) * This function returns %0 if the next TNC entry is found, %-ENOENT if there is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) * no next entry, or a negative error code otherwise.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) static int tnc_next(struct ubifs_info *c, struct ubifs_znode **zn, int *n)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) struct ubifs_znode *znode = *zn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) int nn = *n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) nn += 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) if (nn < znode->child_cnt) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) *n = nn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) while (1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) struct ubifs_znode *zp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) zp = znode->parent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) if (!zp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) return -ENOENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) nn = znode->iip + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) znode = zp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) if (nn < znode->child_cnt) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) znode = get_znode(c, znode, nn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) if (IS_ERR(znode))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) return PTR_ERR(znode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) while (znode->level != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) znode = get_znode(c, znode, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) if (IS_ERR(znode))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) return PTR_ERR(znode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) nn = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) *zn = znode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) *n = nn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) * tnc_prev - find previous TNC entry.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) * @c: UBIFS file-system description object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) * @zn: znode is returned here
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) * @n: znode branch slot number is passed and returned here
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) * This function returns %0 if the previous TNC entry is found, %-ENOENT if
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) * there is no next entry, or a negative error code otherwise.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) static int tnc_prev(struct ubifs_info *c, struct ubifs_znode **zn, int *n)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) struct ubifs_znode *znode = *zn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) int nn = *n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) if (nn > 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) *n = nn - 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) while (1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) struct ubifs_znode *zp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) zp = znode->parent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) if (!zp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) return -ENOENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) nn = znode->iip - 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) znode = zp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) if (nn >= 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) znode = get_znode(c, znode, nn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) if (IS_ERR(znode))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) return PTR_ERR(znode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) while (znode->level != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) nn = znode->child_cnt - 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) znode = get_znode(c, znode, nn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) if (IS_ERR(znode))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) return PTR_ERR(znode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) nn = znode->child_cnt - 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) *zn = znode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) *n = nn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) * resolve_collision - resolve a collision.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) * @c: UBIFS file-system description object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) * @key: key of a directory or extended attribute entry
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) * @zn: znode is returned here
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) * @n: zbranch number is passed and returned here
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) * @nm: name of the entry
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) * This function is called for "hashed" keys to make sure that the found key
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) * really corresponds to the looked up node (directory or extended attribute
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) * entry). It returns %1 and sets @zn and @n if the collision is resolved.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) * %0 is returned if @nm is not found and @zn and @n are set to the previous
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) * entry, i.e. to the entry after which @nm could follow if it were in TNC.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) * This means that @n may be set to %-1 if the leftmost key in @zn is the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) * previous one. A negative error code is returned on failures.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699) static int resolve_collision(struct ubifs_info *c, const union ubifs_key *key,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) struct ubifs_znode **zn, int *n,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) const struct fscrypt_name *nm)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) err = matches_name(c, &(*zn)->zbranch[*n], nm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706) if (unlikely(err < 0))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) if (err == NAME_MATCHES)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) if (err == NAME_GREATER) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) /* Look left */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) while (1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714) err = tnc_prev(c, zn, n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) if (err == -ENOENT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) ubifs_assert(c, *n == 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) *n = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) if (keys_cmp(c, &(*zn)->zbranch[*n].key, key)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) * We have found the branch after which we would
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) * like to insert, but inserting in this znode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) * may still be wrong. Consider the following 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) * znodes, in the case where we are resolving a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) * collision with Key2.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) * znode zp
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) * ----------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732) * level 1 | Key0 | Key1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) * -----------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) * | |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) * znode za | | znode zb
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) * ------------ ------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) * level 0 | Key0 | | Key2 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) * ------------ ------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) * The lookup finds Key2 in znode zb. Lets say
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741) * there is no match and the name is greater so
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) * we look left. When we find Key0, we end up
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743) * here. If we return now, we will insert into
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744) * znode za at slot n = 1. But that is invalid
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) * according to the parent's keys. Key2 must
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) * be inserted into znode zb.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) * Note, this problem is not relevant for the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749) * case when we go right, because
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750) * 'tnc_insert()' would correct the parent key.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752) if (*n == (*zn)->child_cnt - 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) err = tnc_next(c, zn, n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754) if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755) /* Should be impossible */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) ubifs_assert(c, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) if (err == -ENOENT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758) err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761) ubifs_assert(c, *n == 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) *n = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766) err = matches_name(c, &(*zn)->zbranch[*n], nm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769) if (err == NAME_LESS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) if (err == NAME_MATCHES)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773) ubifs_assert(c, err == NAME_GREATER);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776) int nn = *n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777) struct ubifs_znode *znode = *zn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779) /* Look right */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780) while (1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781) err = tnc_next(c, &znode, &nn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782) if (err == -ENOENT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786) if (keys_cmp(c, &znode->zbranch[nn].key, key))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788) err = matches_name(c, &znode->zbranch[nn], nm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791) if (err == NAME_GREATER)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793) *zn = znode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794) *n = nn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795) if (err == NAME_MATCHES)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797) ubifs_assert(c, err == NAME_LESS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803) * fallible_matches_name - determine if a dent matches a given name.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804) * @c: UBIFS file-system description object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805) * @zbr: zbranch of dent
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806) * @nm: name to match
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808) * This is a "fallible" version of 'matches_name()' function which does not
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809) * panic if the direntry/xentry referred by @zbr does not exist on the media.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811) * This function checks if xentry/direntry referred by zbranch @zbr matches name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812) * @nm. Returns %NAME_MATCHES it does, %NAME_LESS if the name referred by @zbr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813) * is less than @nm, %NAME_GREATER if it is greater than @nm, and @NOT_ON_MEDIA
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814) * if xentry/direntry referred by @zbr does not exist on the media. A negative
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815) * error code is returned in case of failure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817) static int fallible_matches_name(struct ubifs_info *c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818) struct ubifs_zbranch *zbr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819) const struct fscrypt_name *nm)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821) struct ubifs_dent_node *dent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822) int nlen, err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824) /* If possible, match against the dent in the leaf node cache */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825) if (!zbr->leaf) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826) dent = kmalloc(zbr->len, GFP_NOFS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827) if (!dent)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830) err = fallible_read_node(c, &zbr->key, zbr, dent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832) goto out_free;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833) if (err == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834) /* The node was not present */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835) err = NOT_ON_MEDIA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836) goto out_free;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838) ubifs_assert(c, err == 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840) err = lnc_add_directly(c, zbr, dent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842) goto out_free;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843) } else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844) dent = zbr->leaf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846) nlen = le16_to_cpu(dent->nlen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847) err = memcmp(dent->name, fname_name(nm), min_t(int, nlen, fname_len(nm)));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848) if (err == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849) if (nlen == fname_len(nm))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850) return NAME_MATCHES;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851) else if (nlen < fname_len(nm))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852) return NAME_LESS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854) return NAME_GREATER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855) } else if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856) return NAME_LESS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858) return NAME_GREATER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860) out_free:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861) kfree(dent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 863) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 864)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 865) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 866) * fallible_resolve_collision - resolve a collision even if nodes are missing.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 867) * @c: UBIFS file-system description object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 868) * @key: key
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 869) * @zn: znode is returned here
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 870) * @n: branch number is passed and returned here
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 871) * @nm: name of directory entry
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 872) * @adding: indicates caller is adding a key to the TNC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 873) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 874) * This is a "fallible" version of the 'resolve_collision()' function which
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 875) * does not panic if one of the nodes referred to by TNC does not exist on the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 876) * media. This may happen when replaying the journal if a deleted node was
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 877) * Garbage-collected and the commit was not done. A branch that refers to a node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 878) * that is not present is called a dangling branch. The following are the return
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 879) * codes for this function:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 880) * o if @nm was found, %1 is returned and @zn and @n are set to the found
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 881) * branch;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 882) * o if we are @adding and @nm was not found, %0 is returned;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 883) * o if we are not @adding and @nm was not found, but a dangling branch was
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 884) * found, then %1 is returned and @zn and @n are set to the dangling branch;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 885) * o a negative error code is returned in case of failure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 886) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 887) static int fallible_resolve_collision(struct ubifs_info *c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 888) const union ubifs_key *key,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 889) struct ubifs_znode **zn, int *n,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 890) const struct fscrypt_name *nm,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 891) int adding)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 892) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 893) struct ubifs_znode *o_znode = NULL, *znode = *zn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 894) int o_n, err, cmp, unsure = 0, nn = *n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 895)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 896) cmp = fallible_matches_name(c, &znode->zbranch[nn], nm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 897) if (unlikely(cmp < 0))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 898) return cmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 899) if (cmp == NAME_MATCHES)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 900) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 901) if (cmp == NOT_ON_MEDIA) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 902) o_znode = znode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 903) o_n = nn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 904) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 905) * We are unlucky and hit a dangling branch straight away.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 906) * Now we do not really know where to go to find the needed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 907) * branch - to the left or to the right. Well, let's try left.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 908) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 909) unsure = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 910) } else if (!adding)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 911) unsure = 1; /* Remove a dangling branch wherever it is */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 912)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 913) if (cmp == NAME_GREATER || unsure) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 914) /* Look left */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 915) while (1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 916) err = tnc_prev(c, zn, n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 917) if (err == -ENOENT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 918) ubifs_assert(c, *n == 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 919) *n = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 920) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 921) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 922) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 923) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 924) if (keys_cmp(c, &(*zn)->zbranch[*n].key, key)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 925) /* See comments in 'resolve_collision()' */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 926) if (*n == (*zn)->child_cnt - 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 927) err = tnc_next(c, zn, n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 928) if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 929) /* Should be impossible */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 930) ubifs_assert(c, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 931) if (err == -ENOENT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 932) err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 933) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 934) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 935) ubifs_assert(c, *n == 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 936) *n = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 937) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 938) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 939) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 940) err = fallible_matches_name(c, &(*zn)->zbranch[*n], nm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 941) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 942) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 943) if (err == NAME_MATCHES)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 944) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 945) if (err == NOT_ON_MEDIA) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 946) o_znode = *zn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 947) o_n = *n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 948) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 949) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 950) if (!adding)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 951) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 952) if (err == NAME_LESS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 953) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 954) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 955) unsure = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 956) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 957) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 958)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 959) if (cmp == NAME_LESS || unsure) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 960) /* Look right */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 961) *zn = znode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 962) *n = nn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 963) while (1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 964) err = tnc_next(c, &znode, &nn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 965) if (err == -ENOENT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 966) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 967) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 968) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 969) if (keys_cmp(c, &znode->zbranch[nn].key, key))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 970) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 971) err = fallible_matches_name(c, &znode->zbranch[nn], nm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 972) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 973) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 974) if (err == NAME_GREATER)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 975) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 976) *zn = znode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 977) *n = nn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 978) if (err == NAME_MATCHES)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 979) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 980) if (err == NOT_ON_MEDIA) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 981) o_znode = znode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 982) o_n = nn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 983) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 984) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 985) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 986)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 987) /* Never match a dangling branch when adding */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 988) if (adding || !o_znode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 989) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 990)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 991) dbg_mntk(key, "dangling match LEB %d:%d len %d key ",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 992) o_znode->zbranch[o_n].lnum, o_znode->zbranch[o_n].offs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 993) o_znode->zbranch[o_n].len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 994) *zn = o_znode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 995) *n = o_n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 996) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 997) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 998)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 999) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000) * matches_position - determine if a zbranch matches a given position.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001) * @zbr: zbranch of dent
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002) * @lnum: LEB number of dent to match
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003) * @offs: offset of dent to match
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005) * This function returns %1 if @lnum:@offs matches, and %0 otherwise.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007) static int matches_position(struct ubifs_zbranch *zbr, int lnum, int offs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009) if (zbr->lnum == lnum && zbr->offs == offs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016) * resolve_collision_directly - resolve a collision directly.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017) * @c: UBIFS file-system description object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018) * @key: key of directory entry
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019) * @zn: znode is passed and returned here
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020) * @n: zbranch number is passed and returned here
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021) * @lnum: LEB number of dent node to match
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022) * @offs: offset of dent node to match
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024) * This function is used for "hashed" keys to make sure the found directory or
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025) * extended attribute entry node is what was looked for. It is used when the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026) * flash address of the right node is known (@lnum:@offs) which makes it much
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027) * easier to resolve collisions (no need to read entries and match full
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028) * names). This function returns %1 and sets @zn and @n if the collision is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029) * resolved, %0 if @lnum:@offs is not found and @zn and @n are set to the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030) * previous directory entry. Otherwise a negative error code is returned.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032) static int resolve_collision_directly(struct ubifs_info *c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033) const union ubifs_key *key,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034) struct ubifs_znode **zn, int *n,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035) int lnum, int offs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037) struct ubifs_znode *znode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038) int nn, err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040) znode = *zn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041) nn = *n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042) if (matches_position(&znode->zbranch[nn], lnum, offs))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045) /* Look left */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046) while (1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047) err = tnc_prev(c, &znode, &nn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048) if (err == -ENOENT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052) if (keys_cmp(c, &znode->zbranch[nn].key, key))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054) if (matches_position(&znode->zbranch[nn], lnum, offs)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055) *zn = znode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056) *n = nn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061) /* Look right */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062) znode = *zn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063) nn = *n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064) while (1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065) err = tnc_next(c, &znode, &nn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066) if (err == -ENOENT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070) if (keys_cmp(c, &znode->zbranch[nn].key, key))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072) *zn = znode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073) *n = nn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074) if (matches_position(&znode->zbranch[nn], lnum, offs))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080) * dirty_cow_bottom_up - dirty a znode and its ancestors.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081) * @c: UBIFS file-system description object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082) * @znode: znode to dirty
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084) * If we do not have a unique key that resides in a znode, then we cannot
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085) * dirty that znode from the top down (i.e. by using lookup_level0_dirty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086) * This function records the path back to the last dirty ancestor, and then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087) * dirties the znodes on that path.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089) static struct ubifs_znode *dirty_cow_bottom_up(struct ubifs_info *c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090) struct ubifs_znode *znode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092) struct ubifs_znode *zp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093) int *path = c->bottom_up_buf, p = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095) ubifs_assert(c, c->zroot.znode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096) ubifs_assert(c, znode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097) if (c->zroot.znode->level > BOTTOM_UP_HEIGHT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098) kfree(c->bottom_up_buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099) c->bottom_up_buf = kmalloc_array(c->zroot.znode->level,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100) sizeof(int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101) GFP_NOFS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102) if (!c->bottom_up_buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103) return ERR_PTR(-ENOMEM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104) path = c->bottom_up_buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106) if (c->zroot.znode->level) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107) /* Go up until parent is dirty */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108) while (1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109) int n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111) zp = znode->parent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1112) if (!zp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1113) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1114) n = znode->iip;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1115) ubifs_assert(c, p < c->zroot.znode->level);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1116) path[p++] = n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1117) if (!zp->cnext && ubifs_zn_dirty(znode))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1118) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1119) znode = zp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1120) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1121) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1122)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1123) /* Come back down, dirtying as we go */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1124) while (1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1125) struct ubifs_zbranch *zbr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1126)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1127) zp = znode->parent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1128) if (zp) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1129) ubifs_assert(c, path[p - 1] >= 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1130) ubifs_assert(c, path[p - 1] < zp->child_cnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1131) zbr = &zp->zbranch[path[--p]];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1132) znode = dirty_cow_znode(c, zbr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1133) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1134) ubifs_assert(c, znode == c->zroot.znode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1135) znode = dirty_cow_znode(c, &c->zroot);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1136) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1137) if (IS_ERR(znode) || !p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1138) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1139) ubifs_assert(c, path[p - 1] >= 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1140) ubifs_assert(c, path[p - 1] < znode->child_cnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1141) znode = znode->zbranch[path[p - 1]].znode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1142) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1143)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1144) return znode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1145) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1146)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1147) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1148) * ubifs_lookup_level0 - search for zero-level znode.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1149) * @c: UBIFS file-system description object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1150) * @key: key to lookup
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1151) * @zn: znode is returned here
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1152) * @n: znode branch slot number is returned here
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1153) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1154) * This function looks up the TNC tree and search for zero-level znode which
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1155) * refers key @key. The found zero-level znode is returned in @zn. There are 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1156) * cases:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1157) * o exact match, i.e. the found zero-level znode contains key @key, then %1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1158) * is returned and slot number of the matched branch is stored in @n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1159) * o not exact match, which means that zero-level znode does not contain
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1160) * @key, then %0 is returned and slot number of the closest branch or %-1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1161) * is stored in @n; In this case calling tnc_next() is mandatory.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1162) * o @key is so small that it is even less than the lowest key of the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1163) * leftmost zero-level node, then %0 is returned and %0 is stored in @n.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1164) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1165) * Note, when the TNC tree is traversed, some znodes may be absent, then this
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1166) * function reads corresponding indexing nodes and inserts them to TNC. In
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1167) * case of failure, a negative error code is returned.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1168) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1169) int ubifs_lookup_level0(struct ubifs_info *c, const union ubifs_key *key,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1170) struct ubifs_znode **zn, int *n)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1171) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1172) int err, exact;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1173) struct ubifs_znode *znode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1174) time64_t time = ktime_get_seconds();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1175)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1176) dbg_tnck(key, "search key ");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1177) ubifs_assert(c, key_type(c, key) < UBIFS_INVALID_KEY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1178)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1179) znode = c->zroot.znode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1180) if (unlikely(!znode)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1181) znode = ubifs_load_znode(c, &c->zroot, NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1182) if (IS_ERR(znode))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1183) return PTR_ERR(znode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1184) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1185)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1186) znode->time = time;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1187)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1188) while (1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1189) struct ubifs_zbranch *zbr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1190)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1191) exact = ubifs_search_zbranch(c, znode, key, n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1192)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1193) if (znode->level == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1194) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1195)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1196) if (*n < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1197) *n = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1198) zbr = &znode->zbranch[*n];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1199)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1200) if (zbr->znode) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1201) znode->time = time;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1202) znode = zbr->znode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1203) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1204) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1205)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1206) /* znode is not in TNC cache, load it from the media */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1207) znode = ubifs_load_znode(c, zbr, znode, *n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1208) if (IS_ERR(znode))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1209) return PTR_ERR(znode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1210) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1211)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1212) *zn = znode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1213) if (exact || !is_hash_key(c, key) || *n != -1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1214) dbg_tnc("found %d, lvl %d, n %d", exact, znode->level, *n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1215) return exact;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1216) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1217)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1218) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1219) * Here is a tricky place. We have not found the key and this is a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1220) * "hashed" key, which may collide. The rest of the code deals with
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1221) * situations like this:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1222) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1223) * | 3 | 5 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1224) * / \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1225) * | 3 | 5 | | 6 | 7 | (x)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1226) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1227) * Or more a complex example:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1228) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1229) * | 1 | 5 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1230) * / \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1231) * | 1 | 3 | | 5 | 8 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1232) * \ /
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1233) * | 5 | 5 | | 6 | 7 | (x)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1234) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1235) * In the examples, if we are looking for key "5", we may reach nodes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1236) * marked with "(x)". In this case what we have do is to look at the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1237) * left and see if there is "5" key there. If there is, we have to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1238) * return it.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1239) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1240) * Note, this whole situation is possible because we allow to have
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1241) * elements which are equivalent to the next key in the parent in the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1242) * children of current znode. For example, this happens if we split a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1243) * znode like this: | 3 | 5 | 5 | 6 | 7 |, which results in something
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1244) * like this:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1245) * | 3 | 5 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1246) * / \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1247) * | 3 | 5 | | 5 | 6 | 7 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1248) * ^
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1249) * And this becomes what is at the first "picture" after key "5" marked
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1250) * with "^" is removed. What could be done is we could prohibit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1251) * splitting in the middle of the colliding sequence. Also, when
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1252) * removing the leftmost key, we would have to correct the key of the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1253) * parent node, which would introduce additional complications. Namely,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1254) * if we changed the leftmost key of the parent znode, the garbage
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1255) * collector would be unable to find it (GC is doing this when GC'ing
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1256) * indexing LEBs). Although we already have an additional RB-tree where
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1257) * we save such changed znodes (see 'ins_clr_old_idx_znode()') until
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1258) * after the commit. But anyway, this does not look easy to implement
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1259) * so we did not try this.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1260) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1261) err = tnc_prev(c, &znode, n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1262) if (err == -ENOENT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1263) dbg_tnc("found 0, lvl %d, n -1", znode->level);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1264) *n = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1265) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1266) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1267) if (unlikely(err < 0))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1268) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1269) if (keys_cmp(c, key, &znode->zbranch[*n].key)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1270) dbg_tnc("found 0, lvl %d, n -1", znode->level);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1271) *n = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1272) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1273) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1274)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1275) dbg_tnc("found 1, lvl %d, n %d", znode->level, *n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1276) *zn = znode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1277) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1278) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1279)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1280) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1281) * lookup_level0_dirty - search for zero-level znode dirtying.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1282) * @c: UBIFS file-system description object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1283) * @key: key to lookup
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1284) * @zn: znode is returned here
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1285) * @n: znode branch slot number is returned here
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1286) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1287) * This function looks up the TNC tree and search for zero-level znode which
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1288) * refers key @key. The found zero-level znode is returned in @zn. There are 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1289) * cases:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1290) * o exact match, i.e. the found zero-level znode contains key @key, then %1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1291) * is returned and slot number of the matched branch is stored in @n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1292) * o not exact match, which means that zero-level znode does not contain @key
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1293) * then %0 is returned and slot number of the closed branch is stored in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1294) * @n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1295) * o @key is so small that it is even less than the lowest key of the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1296) * leftmost zero-level node, then %0 is returned and %-1 is stored in @n.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1297) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1298) * Additionally all znodes in the path from the root to the located zero-level
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1299) * znode are marked as dirty.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1300) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1301) * Note, when the TNC tree is traversed, some znodes may be absent, then this
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1302) * function reads corresponding indexing nodes and inserts them to TNC. In
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1303) * case of failure, a negative error code is returned.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1304) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1305) static int lookup_level0_dirty(struct ubifs_info *c, const union ubifs_key *key,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1306) struct ubifs_znode **zn, int *n)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1307) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1308) int err, exact;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1309) struct ubifs_znode *znode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1310) time64_t time = ktime_get_seconds();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1311)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1312) dbg_tnck(key, "search and dirty key ");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1313)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1314) znode = c->zroot.znode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1315) if (unlikely(!znode)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1316) znode = ubifs_load_znode(c, &c->zroot, NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1317) if (IS_ERR(znode))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1318) return PTR_ERR(znode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1319) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1320)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1321) znode = dirty_cow_znode(c, &c->zroot);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1322) if (IS_ERR(znode))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1323) return PTR_ERR(znode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1324)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1325) znode->time = time;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1326)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1327) while (1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1328) struct ubifs_zbranch *zbr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1329)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1330) exact = ubifs_search_zbranch(c, znode, key, n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1331)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1332) if (znode->level == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1333) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1334)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1335) if (*n < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1336) *n = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1337) zbr = &znode->zbranch[*n];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1338)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1339) if (zbr->znode) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1340) znode->time = time;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1341) znode = dirty_cow_znode(c, zbr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1342) if (IS_ERR(znode))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1343) return PTR_ERR(znode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1344) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1345) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1346)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1347) /* znode is not in TNC cache, load it from the media */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1348) znode = ubifs_load_znode(c, zbr, znode, *n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1349) if (IS_ERR(znode))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1350) return PTR_ERR(znode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1351) znode = dirty_cow_znode(c, zbr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1352) if (IS_ERR(znode))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1353) return PTR_ERR(znode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1354) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1355)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1356) *zn = znode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1357) if (exact || !is_hash_key(c, key) || *n != -1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1358) dbg_tnc("found %d, lvl %d, n %d", exact, znode->level, *n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1359) return exact;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1360) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1361)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1362) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1363) * See huge comment at 'lookup_level0_dirty()' what is the rest of the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1364) * code.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1365) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1366) err = tnc_prev(c, &znode, n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1367) if (err == -ENOENT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1368) *n = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1369) dbg_tnc("found 0, lvl %d, n -1", znode->level);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1370) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1371) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1372) if (unlikely(err < 0))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1373) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1374) if (keys_cmp(c, key, &znode->zbranch[*n].key)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1375) *n = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1376) dbg_tnc("found 0, lvl %d, n -1", znode->level);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1377) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1378) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1379)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1380) if (znode->cnext || !ubifs_zn_dirty(znode)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1381) znode = dirty_cow_bottom_up(c, znode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1382) if (IS_ERR(znode))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1383) return PTR_ERR(znode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1384) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1385)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1386) dbg_tnc("found 1, lvl %d, n %d", znode->level, *n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1387) *zn = znode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1388) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1389) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1390)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1391) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1392) * maybe_leb_gced - determine if a LEB may have been garbage collected.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1393) * @c: UBIFS file-system description object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1394) * @lnum: LEB number
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1395) * @gc_seq1: garbage collection sequence number
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1396) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1397) * This function determines if @lnum may have been garbage collected since
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1398) * sequence number @gc_seq1. If it may have been then %1 is returned, otherwise
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1399) * %0 is returned.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1400) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1401) static int maybe_leb_gced(struct ubifs_info *c, int lnum, int gc_seq1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1402) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1403) int gc_seq2, gced_lnum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1404)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1405) gced_lnum = c->gced_lnum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1406) smp_rmb();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1407) gc_seq2 = c->gc_seq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1408) /* Same seq means no GC */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1409) if (gc_seq1 == gc_seq2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1410) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1411) /* Different by more than 1 means we don't know */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1412) if (gc_seq1 + 1 != gc_seq2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1413) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1414) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1415) * We have seen the sequence number has increased by 1. Now we need to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1416) * be sure we read the right LEB number, so read it again.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1417) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1418) smp_rmb();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1419) if (gced_lnum != c->gced_lnum)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1420) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1421) /* Finally we can check lnum */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1422) if (gced_lnum == lnum)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1423) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1424) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1425) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1426)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1427) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1428) * ubifs_tnc_locate - look up a file-system node and return it and its location.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1429) * @c: UBIFS file-system description object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1430) * @key: node key to lookup
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1431) * @node: the node is returned here
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1432) * @lnum: LEB number is returned here
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1433) * @offs: offset is returned here
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1434) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1435) * This function looks up and reads node with key @key. The caller has to make
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1436) * sure the @node buffer is large enough to fit the node. Returns zero in case
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1437) * of success, %-ENOENT if the node was not found, and a negative error code in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1438) * case of failure. The node location can be returned in @lnum and @offs.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1439) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1440) int ubifs_tnc_locate(struct ubifs_info *c, const union ubifs_key *key,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1441) void *node, int *lnum, int *offs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1442) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1443) int found, n, err, safely = 0, gc_seq1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1444) struct ubifs_znode *znode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1445) struct ubifs_zbranch zbr, *zt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1446)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1447) again:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1448) mutex_lock(&c->tnc_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1449) found = ubifs_lookup_level0(c, key, &znode, &n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1450) if (!found) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1451) err = -ENOENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1452) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1453) } else if (found < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1454) err = found;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1455) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1456) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1457) zt = &znode->zbranch[n];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1458) if (lnum) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1459) *lnum = zt->lnum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1460) *offs = zt->offs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1461) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1462) if (is_hash_key(c, key)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1463) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1464) * In this case the leaf node cache gets used, so we pass the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1465) * address of the zbranch and keep the mutex locked
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1466) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1467) err = tnc_read_hashed_node(c, zt, node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1468) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1469) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1470) if (safely) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1471) err = ubifs_tnc_read_node(c, zt, node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1472) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1473) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1474) /* Drop the TNC mutex prematurely and race with garbage collection */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1475) zbr = znode->zbranch[n];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1476) gc_seq1 = c->gc_seq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1477) mutex_unlock(&c->tnc_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1478)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1479) if (ubifs_get_wbuf(c, zbr.lnum)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1480) /* We do not GC journal heads */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1481) err = ubifs_tnc_read_node(c, &zbr, node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1482) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1483) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1484)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1485) err = fallible_read_node(c, key, &zbr, node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1486) if (err <= 0 || maybe_leb_gced(c, zbr.lnum, gc_seq1)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1487) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1488) * The node may have been GC'ed out from under us so try again
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1489) * while keeping the TNC mutex locked.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1490) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1491) safely = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1492) goto again;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1493) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1494) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1495)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1496) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1497) mutex_unlock(&c->tnc_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1498) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1499) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1500)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1501) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1502) * ubifs_tnc_get_bu_keys - lookup keys for bulk-read.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1503) * @c: UBIFS file-system description object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1504) * @bu: bulk-read parameters and results
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1505) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1506) * Lookup consecutive data node keys for the same inode that reside
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1507) * consecutively in the same LEB. This function returns zero in case of success
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1508) * and a negative error code in case of failure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1509) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1510) * Note, if the bulk-read buffer length (@bu->buf_len) is known, this function
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1511) * makes sure bulk-read nodes fit the buffer. Otherwise, this function prepares
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1512) * maximum possible amount of nodes for bulk-read.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1513) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1514) int ubifs_tnc_get_bu_keys(struct ubifs_info *c, struct bu_info *bu)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1515) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1516) int n, err = 0, lnum = -1, offs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1517) int len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1518) unsigned int block = key_block(c, &bu->key);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1519) struct ubifs_znode *znode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1520)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1521) bu->cnt = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1522) bu->blk_cnt = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1523) bu->eof = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1524)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1525) mutex_lock(&c->tnc_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1526) /* Find first key */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1527) err = ubifs_lookup_level0(c, &bu->key, &znode, &n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1528) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1529) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1530) if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1531) /* Key found */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1532) len = znode->zbranch[n].len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1533) /* The buffer must be big enough for at least 1 node */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1534) if (len > bu->buf_len) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1535) err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1536) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1537) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1538) /* Add this key */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1539) bu->zbranch[bu->cnt++] = znode->zbranch[n];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1540) bu->blk_cnt += 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1541) lnum = znode->zbranch[n].lnum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1542) offs = ALIGN(znode->zbranch[n].offs + len, 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1543) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1544) while (1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1545) struct ubifs_zbranch *zbr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1546) union ubifs_key *key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1547) unsigned int next_block;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1548)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1549) /* Find next key */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1550) err = tnc_next(c, &znode, &n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1551) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1552) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1553) zbr = &znode->zbranch[n];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1554) key = &zbr->key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1555) /* See if there is another data key for this file */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1556) if (key_inum(c, key) != key_inum(c, &bu->key) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1557) key_type(c, key) != UBIFS_DATA_KEY) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1558) err = -ENOENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1559) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1560) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1561) if (lnum < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1562) /* First key found */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1563) lnum = zbr->lnum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1564) offs = ALIGN(zbr->offs + zbr->len, 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1565) len = zbr->len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1566) if (len > bu->buf_len) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1567) err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1568) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1569) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1570) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1571) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1572) * The data nodes must be in consecutive positions in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1573) * the same LEB.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1574) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1575) if (zbr->lnum != lnum || zbr->offs != offs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1576) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1577) offs += ALIGN(zbr->len, 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1578) len = ALIGN(len, 8) + zbr->len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1579) /* Must not exceed buffer length */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1580) if (len > bu->buf_len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1581) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1582) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1583) /* Allow for holes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1584) next_block = key_block(c, key);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1585) bu->blk_cnt += (next_block - block - 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1586) if (bu->blk_cnt >= UBIFS_MAX_BULK_READ)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1587) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1588) block = next_block;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1589) /* Add this key */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1590) bu->zbranch[bu->cnt++] = *zbr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1591) bu->blk_cnt += 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1592) /* See if we have room for more */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1593) if (bu->cnt >= UBIFS_MAX_BULK_READ)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1594) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1595) if (bu->blk_cnt >= UBIFS_MAX_BULK_READ)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1596) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1597) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1598) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1599) if (err == -ENOENT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1600) bu->eof = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1601) err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1602) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1603) bu->gc_seq = c->gc_seq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1604) mutex_unlock(&c->tnc_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1605) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1606) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1607) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1608) * An enormous hole could cause bulk-read to encompass too many
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1609) * page cache pages, so limit the number here.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1610) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1611) if (bu->blk_cnt > UBIFS_MAX_BULK_READ)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1612) bu->blk_cnt = UBIFS_MAX_BULK_READ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1613) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1614) * Ensure that bulk-read covers a whole number of page cache
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1615) * pages.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1616) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1617) if (UBIFS_BLOCKS_PER_PAGE == 1 ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1618) !(bu->blk_cnt & (UBIFS_BLOCKS_PER_PAGE - 1)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1619) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1620) if (bu->eof) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1621) /* At the end of file we can round up */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1622) bu->blk_cnt += UBIFS_BLOCKS_PER_PAGE - 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1623) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1624) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1625) /* Exclude data nodes that do not make up a whole page cache page */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1626) block = key_block(c, &bu->key) + bu->blk_cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1627) block &= ~(UBIFS_BLOCKS_PER_PAGE - 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1628) while (bu->cnt) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1629) if (key_block(c, &bu->zbranch[bu->cnt - 1].key) < block)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1630) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1631) bu->cnt -= 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1632) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1633) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1634) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1635)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1636) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1637) * read_wbuf - bulk-read from a LEB with a wbuf.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1638) * @wbuf: wbuf that may overlap the read
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1639) * @buf: buffer into which to read
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1640) * @len: read length
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1641) * @lnum: LEB number from which to read
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1642) * @offs: offset from which to read
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1643) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1644) * This functions returns %0 on success or a negative error code on failure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1645) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1646) static int read_wbuf(struct ubifs_wbuf *wbuf, void *buf, int len, int lnum,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1647) int offs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1648) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1649) const struct ubifs_info *c = wbuf->c;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1650) int rlen, overlap;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1651)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1652) dbg_io("LEB %d:%d, length %d", lnum, offs, len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1653) ubifs_assert(c, wbuf && lnum >= 0 && lnum < c->leb_cnt && offs >= 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1654) ubifs_assert(c, !(offs & 7) && offs < c->leb_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1655) ubifs_assert(c, offs + len <= c->leb_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1656)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1657) spin_lock(&wbuf->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1658) overlap = (lnum == wbuf->lnum && offs + len > wbuf->offs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1659) if (!overlap) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1660) /* We may safely unlock the write-buffer and read the data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1661) spin_unlock(&wbuf->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1662) return ubifs_leb_read(c, lnum, buf, offs, len, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1663) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1664)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1665) /* Don't read under wbuf */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1666) rlen = wbuf->offs - offs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1667) if (rlen < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1668) rlen = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1669)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1670) /* Copy the rest from the write-buffer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1671) memcpy(buf + rlen, wbuf->buf + offs + rlen - wbuf->offs, len - rlen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1672) spin_unlock(&wbuf->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1673)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1674) if (rlen > 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1675) /* Read everything that goes before write-buffer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1676) return ubifs_leb_read(c, lnum, buf, offs, rlen, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1677)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1678) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1679) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1680)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1681) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1682) * validate_data_node - validate data nodes for bulk-read.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1683) * @c: UBIFS file-system description object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1684) * @buf: buffer containing data node to validate
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1685) * @zbr: zbranch of data node to validate
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1686) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1687) * This functions returns %0 on success or a negative error code on failure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1688) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1689) static int validate_data_node(struct ubifs_info *c, void *buf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1690) struct ubifs_zbranch *zbr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1691) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1692) union ubifs_key key1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1693) struct ubifs_ch *ch = buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1694) int err, len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1695)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1696) if (ch->node_type != UBIFS_DATA_NODE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1697) ubifs_err(c, "bad node type (%d but expected %d)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1698) ch->node_type, UBIFS_DATA_NODE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1699) goto out_err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1700) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1701)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1702) err = ubifs_check_node(c, buf, zbr->lnum, zbr->offs, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1703) if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1704) ubifs_err(c, "expected node type %d", UBIFS_DATA_NODE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1705) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1706) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1707)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1708) err = ubifs_node_check_hash(c, buf, zbr->hash);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1709) if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1710) ubifs_bad_hash(c, buf, zbr->hash, zbr->lnum, zbr->offs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1711) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1712) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1713)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1714) len = le32_to_cpu(ch->len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1715) if (len != zbr->len) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1716) ubifs_err(c, "bad node length %d, expected %d", len, zbr->len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1717) goto out_err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1718) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1719)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1720) /* Make sure the key of the read node is correct */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1721) key_read(c, buf + UBIFS_KEY_OFFSET, &key1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1722) if (!keys_eq(c, &zbr->key, &key1)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1723) ubifs_err(c, "bad key in node at LEB %d:%d",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1724) zbr->lnum, zbr->offs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1725) dbg_tnck(&zbr->key, "looked for key ");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1726) dbg_tnck(&key1, "found node's key ");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1727) goto out_err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1728) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1729)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1730) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1731)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1732) out_err:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1733) err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1734) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1735) ubifs_err(c, "bad node at LEB %d:%d", zbr->lnum, zbr->offs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1736) ubifs_dump_node(c, buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1737) dump_stack();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1738) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1739) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1740)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1741) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1742) * ubifs_tnc_bulk_read - read a number of data nodes in one go.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1743) * @c: UBIFS file-system description object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1744) * @bu: bulk-read parameters and results
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1745) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1746) * This functions reads and validates the data nodes that were identified by the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1747) * 'ubifs_tnc_get_bu_keys()' function. This functions returns %0 on success,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1748) * -EAGAIN to indicate a race with GC, or another negative error code on
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1749) * failure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1750) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1751) int ubifs_tnc_bulk_read(struct ubifs_info *c, struct bu_info *bu)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1752) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1753) int lnum = bu->zbranch[0].lnum, offs = bu->zbranch[0].offs, len, err, i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1754) struct ubifs_wbuf *wbuf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1755) void *buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1756)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1757) len = bu->zbranch[bu->cnt - 1].offs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1758) len += bu->zbranch[bu->cnt - 1].len - offs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1759) if (len > bu->buf_len) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1760) ubifs_err(c, "buffer too small %d vs %d", bu->buf_len, len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1761) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1762) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1763)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1764) /* Do the read */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1765) wbuf = ubifs_get_wbuf(c, lnum);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1766) if (wbuf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1767) err = read_wbuf(wbuf, bu->buf, len, lnum, offs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1768) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1769) err = ubifs_leb_read(c, lnum, bu->buf, offs, len, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1770)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1771) /* Check for a race with GC */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1772) if (maybe_leb_gced(c, lnum, bu->gc_seq))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1773) return -EAGAIN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1774)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1775) if (err && err != -EBADMSG) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1776) ubifs_err(c, "failed to read from LEB %d:%d, error %d",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1777) lnum, offs, err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1778) dump_stack();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1779) dbg_tnck(&bu->key, "key ");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1780) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1781) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1782)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1783) /* Validate the nodes read */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1784) buf = bu->buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1785) for (i = 0; i < bu->cnt; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1786) err = validate_data_node(c, buf, &bu->zbranch[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1787) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1788) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1789) buf = buf + ALIGN(bu->zbranch[i].len, 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1790) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1791)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1792) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1793) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1794)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1795) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1796) * do_lookup_nm- look up a "hashed" node.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1797) * @c: UBIFS file-system description object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1798) * @key: node key to lookup
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1799) * @node: the node is returned here
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1800) * @nm: node name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1801) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1802) * This function looks up and reads a node which contains name hash in the key.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1803) * Since the hash may have collisions, there may be many nodes with the same
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1804) * key, so we have to sequentially look to all of them until the needed one is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1805) * found. This function returns zero in case of success, %-ENOENT if the node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1806) * was not found, and a negative error code in case of failure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1807) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1808) static int do_lookup_nm(struct ubifs_info *c, const union ubifs_key *key,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1809) void *node, const struct fscrypt_name *nm)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1810) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1811) int found, n, err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1812) struct ubifs_znode *znode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1813)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1814) dbg_tnck(key, "key ");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1815) mutex_lock(&c->tnc_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1816) found = ubifs_lookup_level0(c, key, &znode, &n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1817) if (!found) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1818) err = -ENOENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1819) goto out_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1820) } else if (found < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1821) err = found;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1822) goto out_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1823) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1824)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1825) ubifs_assert(c, n >= 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1826)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1827) err = resolve_collision(c, key, &znode, &n, nm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1828) dbg_tnc("rc returned %d, znode %p, n %d", err, znode, n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1829) if (unlikely(err < 0))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1830) goto out_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1831) if (err == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1832) err = -ENOENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1833) goto out_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1834) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1835)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1836) err = tnc_read_hashed_node(c, &znode->zbranch[n], node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1837)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1838) out_unlock:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1839) mutex_unlock(&c->tnc_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1840) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1841) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1842)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1843) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1844) * ubifs_tnc_lookup_nm - look up a "hashed" node.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1845) * @c: UBIFS file-system description object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1846) * @key: node key to lookup
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1847) * @node: the node is returned here
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1848) * @nm: node name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1849) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1850) * This function looks up and reads a node which contains name hash in the key.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1851) * Since the hash may have collisions, there may be many nodes with the same
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1852) * key, so we have to sequentially look to all of them until the needed one is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1853) * found. This function returns zero in case of success, %-ENOENT if the node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1854) * was not found, and a negative error code in case of failure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1855) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1856) int ubifs_tnc_lookup_nm(struct ubifs_info *c, const union ubifs_key *key,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1857) void *node, const struct fscrypt_name *nm)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1858) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1859) int err, len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1860) const struct ubifs_dent_node *dent = node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1861)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1862) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1863) * We assume that in most of the cases there are no name collisions and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1864) * 'ubifs_tnc_lookup()' returns us the right direntry.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1865) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1866) err = ubifs_tnc_lookup(c, key, node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1867) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1868) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1869)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1870) len = le16_to_cpu(dent->nlen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1871) if (fname_len(nm) == len && !memcmp(dent->name, fname_name(nm), len))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1872) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1873)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1874) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1875) * Unluckily, there are hash collisions and we have to iterate over
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1876) * them look at each direntry with colliding name hash sequentially.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1877) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1878)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1879) return do_lookup_nm(c, key, node, nm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1880) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1881)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1882) static int search_dh_cookie(struct ubifs_info *c, const union ubifs_key *key,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1883) struct ubifs_dent_node *dent, uint32_t cookie,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1884) struct ubifs_znode **zn, int *n, int exact)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1885) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1886) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1887) struct ubifs_znode *znode = *zn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1888) struct ubifs_zbranch *zbr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1889) union ubifs_key *dkey;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1890)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1891) if (!exact) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1892) err = tnc_next(c, &znode, n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1893) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1894) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1895) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1896)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1897) for (;;) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1898) zbr = &znode->zbranch[*n];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1899) dkey = &zbr->key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1900)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1901) if (key_inum(c, dkey) != key_inum(c, key) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1902) key_type(c, dkey) != key_type(c, key)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1903) return -ENOENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1904) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1905)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1906) err = tnc_read_hashed_node(c, zbr, dent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1907) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1908) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1909)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1910) if (key_hash(c, key) == key_hash(c, dkey) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1911) le32_to_cpu(dent->cookie) == cookie) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1912) *zn = znode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1913) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1914) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1915)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1916) err = tnc_next(c, &znode, n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1917) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1918) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1919) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1920) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1921)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1922) static int do_lookup_dh(struct ubifs_info *c, const union ubifs_key *key,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1923) struct ubifs_dent_node *dent, uint32_t cookie)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1924) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1925) int n, err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1926) struct ubifs_znode *znode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1927) union ubifs_key start_key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1928)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1929) ubifs_assert(c, is_hash_key(c, key));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1930)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1931) lowest_dent_key(c, &start_key, key_inum(c, key));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1932)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1933) mutex_lock(&c->tnc_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1934) err = ubifs_lookup_level0(c, &start_key, &znode, &n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1935) if (unlikely(err < 0))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1936) goto out_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1937)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1938) err = search_dh_cookie(c, key, dent, cookie, &znode, &n, err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1939)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1940) out_unlock:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1941) mutex_unlock(&c->tnc_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1942) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1943) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1944)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1945) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1946) * ubifs_tnc_lookup_dh - look up a "double hashed" node.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1947) * @c: UBIFS file-system description object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1948) * @key: node key to lookup
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1949) * @node: the node is returned here
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1950) * @cookie: node cookie for collision resolution
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1951) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1952) * This function looks up and reads a node which contains name hash in the key.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1953) * Since the hash may have collisions, there may be many nodes with the same
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1954) * key, so we have to sequentially look to all of them until the needed one
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1955) * with the same cookie value is found.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1956) * This function returns zero in case of success, %-ENOENT if the node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1957) * was not found, and a negative error code in case of failure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1958) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1959) int ubifs_tnc_lookup_dh(struct ubifs_info *c, const union ubifs_key *key,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1960) void *node, uint32_t cookie)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1961) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1962) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1963) const struct ubifs_dent_node *dent = node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1964)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1965) if (!c->double_hash)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1966) return -EOPNOTSUPP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1967)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1968) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1969) * We assume that in most of the cases there are no name collisions and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1970) * 'ubifs_tnc_lookup()' returns us the right direntry.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1971) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1972) err = ubifs_tnc_lookup(c, key, node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1973) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1974) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1975)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1976) if (le32_to_cpu(dent->cookie) == cookie)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1977) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1978)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1979) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1980) * Unluckily, there are hash collisions and we have to iterate over
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1981) * them look at each direntry with colliding name hash sequentially.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1982) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1983) return do_lookup_dh(c, key, node, cookie);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1984) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1985)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1986) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1987) * correct_parent_keys - correct parent znodes' keys.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1988) * @c: UBIFS file-system description object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1989) * @znode: znode to correct parent znodes for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1990) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1991) * This is a helper function for 'tnc_insert()'. When the key of the leftmost
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1992) * zbranch changes, keys of parent znodes have to be corrected. This helper
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1993) * function is called in such situations and corrects the keys if needed.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1994) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1995) static void correct_parent_keys(const struct ubifs_info *c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1996) struct ubifs_znode *znode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1997) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1998) union ubifs_key *key, *key1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1999)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2000) ubifs_assert(c, znode->parent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2001) ubifs_assert(c, znode->iip == 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2002)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2003) key = &znode->zbranch[0].key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2004) key1 = &znode->parent->zbranch[0].key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2005)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2006) while (keys_cmp(c, key, key1) < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2007) key_copy(c, key, key1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2008) znode = znode->parent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2009) znode->alt = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2010) if (!znode->parent || znode->iip)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2011) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2012) key1 = &znode->parent->zbranch[0].key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2013) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2014) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2015)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2016) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2017) * insert_zbranch - insert a zbranch into a znode.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2018) * @c: UBIFS file-system description object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2019) * @znode: znode into which to insert
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2020) * @zbr: zbranch to insert
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2021) * @n: slot number to insert to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2022) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2023) * This is a helper function for 'tnc_insert()'. UBIFS does not allow "gaps" in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2024) * znode's array of zbranches and keeps zbranches consolidated, so when a new
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2025) * zbranch has to be inserted to the @znode->zbranches[]' array at the @n-th
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2026) * slot, zbranches starting from @n have to be moved right.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2027) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2028) static void insert_zbranch(struct ubifs_info *c, struct ubifs_znode *znode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2029) const struct ubifs_zbranch *zbr, int n)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2030) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2031) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2032)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2033) ubifs_assert(c, ubifs_zn_dirty(znode));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2034)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2035) if (znode->level) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2036) for (i = znode->child_cnt; i > n; i--) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2037) znode->zbranch[i] = znode->zbranch[i - 1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2038) if (znode->zbranch[i].znode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2039) znode->zbranch[i].znode->iip = i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2040) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2041) if (zbr->znode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2042) zbr->znode->iip = n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2043) } else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2044) for (i = znode->child_cnt; i > n; i--)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2045) znode->zbranch[i] = znode->zbranch[i - 1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2046)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2047) znode->zbranch[n] = *zbr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2048) znode->child_cnt += 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2049)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2050) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2051) * After inserting at slot zero, the lower bound of the key range of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2052) * this znode may have changed. If this znode is subsequently split
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2053) * then the upper bound of the key range may change, and furthermore
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2054) * it could change to be lower than the original lower bound. If that
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2055) * happens, then it will no longer be possible to find this znode in the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2056) * TNC using the key from the index node on flash. That is bad because
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2057) * if it is not found, we will assume it is obsolete and may overwrite
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2058) * it. Then if there is an unclean unmount, we will start using the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2059) * old index which will be broken.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2060) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2061) * So we first mark znodes that have insertions at slot zero, and then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2062) * if they are split we add their lnum/offs to the old_idx tree.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2063) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2064) if (n == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2065) znode->alt = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2066) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2067)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2068) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2069) * tnc_insert - insert a node into TNC.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2070) * @c: UBIFS file-system description object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2071) * @znode: znode to insert into
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2072) * @zbr: branch to insert
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2073) * @n: slot number to insert new zbranch to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2074) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2075) * This function inserts a new node described by @zbr into znode @znode. If
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2076) * znode does not have a free slot for new zbranch, it is split. Parent znodes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2077) * are splat as well if needed. Returns zero in case of success or a negative
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2078) * error code in case of failure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2079) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2080) static int tnc_insert(struct ubifs_info *c, struct ubifs_znode *znode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2081) struct ubifs_zbranch *zbr, int n)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2082) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2083) struct ubifs_znode *zn, *zi, *zp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2084) int i, keep, move, appending = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2085) union ubifs_key *key = &zbr->key, *key1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2086)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2087) ubifs_assert(c, n >= 0 && n <= c->fanout);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2088)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2089) /* Implement naive insert for now */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2090) again:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2091) zp = znode->parent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2092) if (znode->child_cnt < c->fanout) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2093) ubifs_assert(c, n != c->fanout);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2094) dbg_tnck(key, "inserted at %d level %d, key ", n, znode->level);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2095)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2096) insert_zbranch(c, znode, zbr, n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2097)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2098) /* Ensure parent's key is correct */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2099) if (n == 0 && zp && znode->iip == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2100) correct_parent_keys(c, znode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2101)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2102) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2103) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2104)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2105) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2106) * Unfortunately, @znode does not have more empty slots and we have to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2107) * split it.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2108) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2109) dbg_tnck(key, "splitting level %d, key ", znode->level);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2110)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2111) if (znode->alt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2112) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2113) * We can no longer be sure of finding this znode by key, so we
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2114) * record it in the old_idx tree.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2115) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2116) ins_clr_old_idx_znode(c, znode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2117)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2118) zn = kzalloc(c->max_znode_sz, GFP_NOFS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2119) if (!zn)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2120) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2121) zn->parent = zp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2122) zn->level = znode->level;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2123)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2124) /* Decide where to split */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2125) if (znode->level == 0 && key_type(c, key) == UBIFS_DATA_KEY) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2126) /* Try not to split consecutive data keys */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2127) if (n == c->fanout) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2128) key1 = &znode->zbranch[n - 1].key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2129) if (key_inum(c, key1) == key_inum(c, key) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2130) key_type(c, key1) == UBIFS_DATA_KEY)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2131) appending = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2132) } else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2133) goto check_split;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2134) } else if (appending && n != c->fanout) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2135) /* Try not to split consecutive data keys */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2136) appending = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2137) check_split:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2138) if (n >= (c->fanout + 1) / 2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2139) key1 = &znode->zbranch[0].key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2140) if (key_inum(c, key1) == key_inum(c, key) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2141) key_type(c, key1) == UBIFS_DATA_KEY) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2142) key1 = &znode->zbranch[n].key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2143) if (key_inum(c, key1) != key_inum(c, key) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2144) key_type(c, key1) != UBIFS_DATA_KEY) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2145) keep = n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2146) move = c->fanout - keep;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2147) zi = znode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2148) goto do_split;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2149) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2150) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2151) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2152) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2153)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2154) if (appending) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2155) keep = c->fanout;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2156) move = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2157) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2158) keep = (c->fanout + 1) / 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2159) move = c->fanout - keep;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2160) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2162) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2163) * Although we don't at present, we could look at the neighbors and see
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2164) * if we can move some zbranches there.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2165) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2166)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2167) if (n < keep) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2168) /* Insert into existing znode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2169) zi = znode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2170) move += 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2171) keep -= 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2172) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2173) /* Insert into new znode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2174) zi = zn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2175) n -= keep;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2176) /* Re-parent */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2177) if (zn->level != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2178) zbr->znode->parent = zn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2179) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2180)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2181) do_split:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2182)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2183) __set_bit(DIRTY_ZNODE, &zn->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2184) atomic_long_inc(&c->dirty_zn_cnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2185)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2186) zn->child_cnt = move;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2187) znode->child_cnt = keep;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2188)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2189) dbg_tnc("moving %d, keeping %d", move, keep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2190)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2191) /* Move zbranch */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2192) for (i = 0; i < move; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2193) zn->zbranch[i] = znode->zbranch[keep + i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2194) /* Re-parent */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2195) if (zn->level != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2196) if (zn->zbranch[i].znode) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2197) zn->zbranch[i].znode->parent = zn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2198) zn->zbranch[i].znode->iip = i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2199) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2200) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2201)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2202) /* Insert new key and branch */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2203) dbg_tnck(key, "inserting at %d level %d, key ", n, zn->level);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2204)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2205) insert_zbranch(c, zi, zbr, n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2206)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2207) /* Insert new znode (produced by spitting) into the parent */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2208) if (zp) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2209) if (n == 0 && zi == znode && znode->iip == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2210) correct_parent_keys(c, znode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2211)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2212) /* Locate insertion point */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2213) n = znode->iip + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2214)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2215) /* Tail recursion */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2216) zbr->key = zn->zbranch[0].key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2217) zbr->znode = zn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2218) zbr->lnum = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2219) zbr->offs = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2220) zbr->len = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2221) znode = zp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2222)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2223) goto again;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2224) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2225)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2226) /* We have to split root znode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2227) dbg_tnc("creating new zroot at level %d", znode->level + 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2228)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2229) zi = kzalloc(c->max_znode_sz, GFP_NOFS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2230) if (!zi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2231) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2232)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2233) zi->child_cnt = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2234) zi->level = znode->level + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2235)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2236) __set_bit(DIRTY_ZNODE, &zi->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2237) atomic_long_inc(&c->dirty_zn_cnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2238)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2239) zi->zbranch[0].key = znode->zbranch[0].key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2240) zi->zbranch[0].znode = znode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2241) zi->zbranch[0].lnum = c->zroot.lnum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2242) zi->zbranch[0].offs = c->zroot.offs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2243) zi->zbranch[0].len = c->zroot.len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2244) zi->zbranch[1].key = zn->zbranch[0].key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2245) zi->zbranch[1].znode = zn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2246)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2247) c->zroot.lnum = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2248) c->zroot.offs = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2249) c->zroot.len = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2250) c->zroot.znode = zi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2251)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2252) zn->parent = zi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2253) zn->iip = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2254) znode->parent = zi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2255) znode->iip = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2256)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2257) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2258) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2259)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2260) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2261) * ubifs_tnc_add - add a node to TNC.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2262) * @c: UBIFS file-system description object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2263) * @key: key to add
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2264) * @lnum: LEB number of node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2265) * @offs: node offset
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2266) * @len: node length
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2267) * @hash: The hash over the node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2268) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2269) * This function adds a node with key @key to TNC. The node may be new or it may
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2270) * obsolete some existing one. Returns %0 on success or negative error code on
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2271) * failure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2272) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2273) int ubifs_tnc_add(struct ubifs_info *c, const union ubifs_key *key, int lnum,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2274) int offs, int len, const u8 *hash)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2275) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2276) int found, n, err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2277) struct ubifs_znode *znode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2278)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2279) mutex_lock(&c->tnc_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2280) dbg_tnck(key, "%d:%d, len %d, key ", lnum, offs, len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2281) found = lookup_level0_dirty(c, key, &znode, &n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2282) if (!found) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2283) struct ubifs_zbranch zbr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2284)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2285) zbr.znode = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2286) zbr.lnum = lnum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2287) zbr.offs = offs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2288) zbr.len = len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2289) ubifs_copy_hash(c, hash, zbr.hash);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2290) key_copy(c, key, &zbr.key);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2291) err = tnc_insert(c, znode, &zbr, n + 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2292) } else if (found == 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2293) struct ubifs_zbranch *zbr = &znode->zbranch[n];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2294)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2295) lnc_free(zbr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2296) err = ubifs_add_dirt(c, zbr->lnum, zbr->len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2297) zbr->lnum = lnum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2298) zbr->offs = offs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2299) zbr->len = len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2300) ubifs_copy_hash(c, hash, zbr->hash);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2301) } else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2302) err = found;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2303) if (!err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2304) err = dbg_check_tnc(c, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2305) mutex_unlock(&c->tnc_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2306)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2307) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2308) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2309)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2310) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2311) * ubifs_tnc_replace - replace a node in the TNC only if the old node is found.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2312) * @c: UBIFS file-system description object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2313) * @key: key to add
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2314) * @old_lnum: LEB number of old node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2315) * @old_offs: old node offset
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2316) * @lnum: LEB number of node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2317) * @offs: node offset
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2318) * @len: node length
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2319) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2320) * This function replaces a node with key @key in the TNC only if the old node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2321) * is found. This function is called by garbage collection when node are moved.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2322) * Returns %0 on success or negative error code on failure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2323) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2324) int ubifs_tnc_replace(struct ubifs_info *c, const union ubifs_key *key,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2325) int old_lnum, int old_offs, int lnum, int offs, int len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2326) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2327) int found, n, err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2328) struct ubifs_znode *znode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2329)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2330) mutex_lock(&c->tnc_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2331) dbg_tnck(key, "old LEB %d:%d, new LEB %d:%d, len %d, key ", old_lnum,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2332) old_offs, lnum, offs, len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2333) found = lookup_level0_dirty(c, key, &znode, &n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2334) if (found < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2335) err = found;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2336) goto out_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2337) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2338)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2339) if (found == 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2340) struct ubifs_zbranch *zbr = &znode->zbranch[n];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2341)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2342) found = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2343) if (zbr->lnum == old_lnum && zbr->offs == old_offs) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2344) lnc_free(zbr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2345) err = ubifs_add_dirt(c, zbr->lnum, zbr->len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2346) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2347) goto out_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2348) zbr->lnum = lnum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2349) zbr->offs = offs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2350) zbr->len = len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2351) found = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2352) } else if (is_hash_key(c, key)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2353) found = resolve_collision_directly(c, key, &znode, &n,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2354) old_lnum, old_offs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2355) dbg_tnc("rc returned %d, znode %p, n %d, LEB %d:%d",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2356) found, znode, n, old_lnum, old_offs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2357) if (found < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2358) err = found;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2359) goto out_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2360) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2361)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2362) if (found) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2363) /* Ensure the znode is dirtied */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2364) if (znode->cnext || !ubifs_zn_dirty(znode)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2365) znode = dirty_cow_bottom_up(c, znode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2366) if (IS_ERR(znode)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2367) err = PTR_ERR(znode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2368) goto out_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2369) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2370) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2371) zbr = &znode->zbranch[n];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2372) lnc_free(zbr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2373) err = ubifs_add_dirt(c, zbr->lnum,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2374) zbr->len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2375) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2376) goto out_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2377) zbr->lnum = lnum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2378) zbr->offs = offs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2379) zbr->len = len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2380) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2381) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2382) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2383)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2384) if (!found)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2385) err = ubifs_add_dirt(c, lnum, len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2386)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2387) if (!err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2388) err = dbg_check_tnc(c, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2389)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2390) out_unlock:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2391) mutex_unlock(&c->tnc_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2392) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2393) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2394)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2395) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2396) * ubifs_tnc_add_nm - add a "hashed" node to TNC.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2397) * @c: UBIFS file-system description object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2398) * @key: key to add
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2399) * @lnum: LEB number of node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2400) * @offs: node offset
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2401) * @len: node length
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2402) * @hash: The hash over the node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2403) * @nm: node name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2404) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2405) * This is the same as 'ubifs_tnc_add()' but it should be used with keys which
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2406) * may have collisions, like directory entry keys.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2407) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2408) int ubifs_tnc_add_nm(struct ubifs_info *c, const union ubifs_key *key,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2409) int lnum, int offs, int len, const u8 *hash,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2410) const struct fscrypt_name *nm)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2411) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2412) int found, n, err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2413) struct ubifs_znode *znode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2414)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2415) mutex_lock(&c->tnc_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2416) dbg_tnck(key, "LEB %d:%d, key ", lnum, offs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2417) found = lookup_level0_dirty(c, key, &znode, &n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2418) if (found < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2419) err = found;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2420) goto out_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2421) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2422)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2423) if (found == 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2424) if (c->replaying)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2425) found = fallible_resolve_collision(c, key, &znode, &n,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2426) nm, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2427) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2428) found = resolve_collision(c, key, &znode, &n, nm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2429) dbg_tnc("rc returned %d, znode %p, n %d", found, znode, n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2430) if (found < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2431) err = found;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2432) goto out_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2433) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2434)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2435) /* Ensure the znode is dirtied */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2436) if (znode->cnext || !ubifs_zn_dirty(znode)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2437) znode = dirty_cow_bottom_up(c, znode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2438) if (IS_ERR(znode)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2439) err = PTR_ERR(znode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2440) goto out_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2441) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2442) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2443)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2444) if (found == 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2445) struct ubifs_zbranch *zbr = &znode->zbranch[n];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2446)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2447) lnc_free(zbr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2448) err = ubifs_add_dirt(c, zbr->lnum, zbr->len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2449) zbr->lnum = lnum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2450) zbr->offs = offs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2451) zbr->len = len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2452) ubifs_copy_hash(c, hash, zbr->hash);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2453) goto out_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2454) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2455) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2456)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2457) if (!found) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2458) struct ubifs_zbranch zbr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2459)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2460) zbr.znode = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2461) zbr.lnum = lnum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2462) zbr.offs = offs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2463) zbr.len = len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2464) ubifs_copy_hash(c, hash, zbr.hash);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2465) key_copy(c, key, &zbr.key);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2466) err = tnc_insert(c, znode, &zbr, n + 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2467) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2468) goto out_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2469) if (c->replaying) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2470) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2471) * We did not find it in the index so there may be a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2472) * dangling branch still in the index. So we remove it
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2473) * by passing 'ubifs_tnc_remove_nm()' the same key but
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2474) * an unmatchable name.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2475) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2476) struct fscrypt_name noname = { .disk_name = { .name = "", .len = 1 } };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2477)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2478) err = dbg_check_tnc(c, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2479) mutex_unlock(&c->tnc_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2480) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2481) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2482) return ubifs_tnc_remove_nm(c, key, &noname);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2483) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2484) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2485)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2486) out_unlock:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2487) if (!err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2488) err = dbg_check_tnc(c, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2489) mutex_unlock(&c->tnc_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2490) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2491) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2492)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2493) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2494) * tnc_delete - delete a znode form TNC.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2495) * @c: UBIFS file-system description object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2496) * @znode: znode to delete from
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2497) * @n: zbranch slot number to delete
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2498) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2499) * This function deletes a leaf node from @n-th slot of @znode. Returns zero in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2500) * case of success and a negative error code in case of failure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2501) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2502) static int tnc_delete(struct ubifs_info *c, struct ubifs_znode *znode, int n)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2503) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2504) struct ubifs_zbranch *zbr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2505) struct ubifs_znode *zp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2506) int i, err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2507)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2508) /* Delete without merge for now */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2509) ubifs_assert(c, znode->level == 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2510) ubifs_assert(c, n >= 0 && n < c->fanout);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2511) dbg_tnck(&znode->zbranch[n].key, "deleting key ");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2512)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2513) zbr = &znode->zbranch[n];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2514) lnc_free(zbr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2515)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2516) err = ubifs_add_dirt(c, zbr->lnum, zbr->len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2517) if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2518) ubifs_dump_znode(c, znode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2519) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2520) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2521)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2522) /* We do not "gap" zbranch slots */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2523) for (i = n; i < znode->child_cnt - 1; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2524) znode->zbranch[i] = znode->zbranch[i + 1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2525) znode->child_cnt -= 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2526)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2527) if (znode->child_cnt > 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2528) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2529)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2530) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2531) * This was the last zbranch, we have to delete this znode from the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2532) * parent.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2533) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2534)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2535) do {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2536) ubifs_assert(c, !ubifs_zn_obsolete(znode));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2537) ubifs_assert(c, ubifs_zn_dirty(znode));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2538)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2539) zp = znode->parent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2540) n = znode->iip;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2541)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2542) atomic_long_dec(&c->dirty_zn_cnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2543)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2544) err = insert_old_idx_znode(c, znode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2545) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2546) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2547)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2548) if (znode->cnext) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2549) __set_bit(OBSOLETE_ZNODE, &znode->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2550) atomic_long_inc(&c->clean_zn_cnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2551) atomic_long_inc(&ubifs_clean_zn_cnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2552) } else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2553) kfree(znode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2554) znode = zp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2555) } while (znode->child_cnt == 1); /* while removing last child */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2556)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2557) /* Remove from znode, entry n - 1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2558) znode->child_cnt -= 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2559) ubifs_assert(c, znode->level != 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2560) for (i = n; i < znode->child_cnt; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2561) znode->zbranch[i] = znode->zbranch[i + 1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2562) if (znode->zbranch[i].znode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2563) znode->zbranch[i].znode->iip = i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2564) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2565)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2566) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2567) * If this is the root and it has only 1 child then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2568) * collapse the tree.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2569) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2570) if (!znode->parent) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2571) while (znode->child_cnt == 1 && znode->level != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2572) zp = znode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2573) zbr = &znode->zbranch[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2574) znode = get_znode(c, znode, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2575) if (IS_ERR(znode))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2576) return PTR_ERR(znode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2577) znode = dirty_cow_znode(c, zbr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2578) if (IS_ERR(znode))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2579) return PTR_ERR(znode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2580) znode->parent = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2581) znode->iip = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2582) if (c->zroot.len) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2583) err = insert_old_idx(c, c->zroot.lnum,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2584) c->zroot.offs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2585) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2586) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2587) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2588) c->zroot.lnum = zbr->lnum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2589) c->zroot.offs = zbr->offs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2590) c->zroot.len = zbr->len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2591) c->zroot.znode = znode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2592) ubifs_assert(c, !ubifs_zn_obsolete(zp));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2593) ubifs_assert(c, ubifs_zn_dirty(zp));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2594) atomic_long_dec(&c->dirty_zn_cnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2595)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2596) if (zp->cnext) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2597) __set_bit(OBSOLETE_ZNODE, &zp->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2598) atomic_long_inc(&c->clean_zn_cnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2599) atomic_long_inc(&ubifs_clean_zn_cnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2600) } else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2601) kfree(zp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2602) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2603) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2604)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2605) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2606) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2607)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2608) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2609) * ubifs_tnc_remove - remove an index entry of a node.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2610) * @c: UBIFS file-system description object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2611) * @key: key of node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2612) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2613) * Returns %0 on success or negative error code on failure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2614) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2615) int ubifs_tnc_remove(struct ubifs_info *c, const union ubifs_key *key)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2616) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2617) int found, n, err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2618) struct ubifs_znode *znode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2619)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2620) mutex_lock(&c->tnc_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2621) dbg_tnck(key, "key ");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2622) found = lookup_level0_dirty(c, key, &znode, &n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2623) if (found < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2624) err = found;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2625) goto out_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2626) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2627) if (found == 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2628) err = tnc_delete(c, znode, n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2629) if (!err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2630) err = dbg_check_tnc(c, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2631)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2632) out_unlock:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2633) mutex_unlock(&c->tnc_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2634) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2635) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2636)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2637) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2638) * ubifs_tnc_remove_nm - remove an index entry for a "hashed" node.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2639) * @c: UBIFS file-system description object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2640) * @key: key of node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2641) * @nm: directory entry name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2642) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2643) * Returns %0 on success or negative error code on failure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2644) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2645) int ubifs_tnc_remove_nm(struct ubifs_info *c, const union ubifs_key *key,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2646) const struct fscrypt_name *nm)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2647) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2648) int n, err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2649) struct ubifs_znode *znode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2650)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2651) mutex_lock(&c->tnc_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2652) dbg_tnck(key, "key ");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2653) err = lookup_level0_dirty(c, key, &znode, &n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2654) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2655) goto out_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2656)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2657) if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2658) if (c->replaying)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2659) err = fallible_resolve_collision(c, key, &znode, &n,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2660) nm, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2661) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2662) err = resolve_collision(c, key, &znode, &n, nm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2663) dbg_tnc("rc returned %d, znode %p, n %d", err, znode, n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2664) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2665) goto out_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2666) if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2667) /* Ensure the znode is dirtied */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2668) if (znode->cnext || !ubifs_zn_dirty(znode)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2669) znode = dirty_cow_bottom_up(c, znode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2670) if (IS_ERR(znode)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2671) err = PTR_ERR(znode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2672) goto out_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2673) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2674) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2675) err = tnc_delete(c, znode, n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2676) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2677) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2678)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2679) out_unlock:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2680) if (!err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2681) err = dbg_check_tnc(c, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2682) mutex_unlock(&c->tnc_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2683) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2684) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2685)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2686) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2687) * ubifs_tnc_remove_dh - remove an index entry for a "double hashed" node.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2688) * @c: UBIFS file-system description object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2689) * @key: key of node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2690) * @cookie: node cookie for collision resolution
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2691) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2692) * Returns %0 on success or negative error code on failure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2693) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2694) int ubifs_tnc_remove_dh(struct ubifs_info *c, const union ubifs_key *key,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2695) uint32_t cookie)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2696) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2697) int n, err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2698) struct ubifs_znode *znode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2699) struct ubifs_dent_node *dent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2700) struct ubifs_zbranch *zbr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2701)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2702) if (!c->double_hash)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2703) return -EOPNOTSUPP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2704)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2705) mutex_lock(&c->tnc_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2706) err = lookup_level0_dirty(c, key, &znode, &n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2707) if (err <= 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2708) goto out_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2709)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2710) zbr = &znode->zbranch[n];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2711) dent = kmalloc(UBIFS_MAX_DENT_NODE_SZ, GFP_NOFS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2712) if (!dent) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2713) err = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2714) goto out_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2715) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2716)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2717) err = tnc_read_hashed_node(c, zbr, dent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2718) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2719) goto out_free;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2720)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2721) /* If the cookie does not match, we're facing a hash collision. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2722) if (le32_to_cpu(dent->cookie) != cookie) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2723) union ubifs_key start_key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2724)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2725) lowest_dent_key(c, &start_key, key_inum(c, key));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2726)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2727) err = ubifs_lookup_level0(c, &start_key, &znode, &n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2728) if (unlikely(err < 0))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2729) goto out_free;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2730)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2731) err = search_dh_cookie(c, key, dent, cookie, &znode, &n, err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2732) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2733) goto out_free;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2734) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2735)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2736) if (znode->cnext || !ubifs_zn_dirty(znode)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2737) znode = dirty_cow_bottom_up(c, znode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2738) if (IS_ERR(znode)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2739) err = PTR_ERR(znode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2740) goto out_free;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2741) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2742) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2743) err = tnc_delete(c, znode, n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2744)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2745) out_free:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2746) kfree(dent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2747) out_unlock:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2748) if (!err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2749) err = dbg_check_tnc(c, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2750) mutex_unlock(&c->tnc_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2751) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2752) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2753)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2754) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2755) * key_in_range - determine if a key falls within a range of keys.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2756) * @c: UBIFS file-system description object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2757) * @key: key to check
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2758) * @from_key: lowest key in range
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2759) * @to_key: highest key in range
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2760) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2761) * This function returns %1 if the key is in range and %0 otherwise.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2762) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2763) static int key_in_range(struct ubifs_info *c, union ubifs_key *key,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2764) union ubifs_key *from_key, union ubifs_key *to_key)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2765) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2766) if (keys_cmp(c, key, from_key) < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2767) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2768) if (keys_cmp(c, key, to_key) > 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2769) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2770) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2771) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2772)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2773) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2774) * ubifs_tnc_remove_range - remove index entries in range.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2775) * @c: UBIFS file-system description object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2776) * @from_key: lowest key to remove
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2777) * @to_key: highest key to remove
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2778) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2779) * This function removes index entries starting at @from_key and ending at
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2780) * @to_key. This function returns zero in case of success and a negative error
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2781) * code in case of failure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2782) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2783) int ubifs_tnc_remove_range(struct ubifs_info *c, union ubifs_key *from_key,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2784) union ubifs_key *to_key)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2785) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2786) int i, n, k, err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2787) struct ubifs_znode *znode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2788) union ubifs_key *key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2789)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2790) mutex_lock(&c->tnc_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2791) while (1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2792) /* Find first level 0 znode that contains keys to remove */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2793) err = ubifs_lookup_level0(c, from_key, &znode, &n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2794) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2795) goto out_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2796)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2797) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2798) key = from_key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2799) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2800) err = tnc_next(c, &znode, &n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2801) if (err == -ENOENT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2802) err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2803) goto out_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2804) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2805) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2806) goto out_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2807) key = &znode->zbranch[n].key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2808) if (!key_in_range(c, key, from_key, to_key)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2809) err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2810) goto out_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2811) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2812) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2813)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2814) /* Ensure the znode is dirtied */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2815) if (znode->cnext || !ubifs_zn_dirty(znode)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2816) znode = dirty_cow_bottom_up(c, znode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2817) if (IS_ERR(znode)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2818) err = PTR_ERR(znode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2819) goto out_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2820) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2821) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2822)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2823) /* Remove all keys in range except the first */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2824) for (i = n + 1, k = 0; i < znode->child_cnt; i++, k++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2825) key = &znode->zbranch[i].key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2826) if (!key_in_range(c, key, from_key, to_key))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2827) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2828) lnc_free(&znode->zbranch[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2829) err = ubifs_add_dirt(c, znode->zbranch[i].lnum,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2830) znode->zbranch[i].len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2831) if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2832) ubifs_dump_znode(c, znode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2833) goto out_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2834) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2835) dbg_tnck(key, "removing key ");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2836) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2837) if (k) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2838) for (i = n + 1 + k; i < znode->child_cnt; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2839) znode->zbranch[i - k] = znode->zbranch[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2840) znode->child_cnt -= k;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2841) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2842)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2843) /* Now delete the first */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2844) err = tnc_delete(c, znode, n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2845) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2846) goto out_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2847) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2848)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2849) out_unlock:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2850) if (!err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2851) err = dbg_check_tnc(c, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2852) mutex_unlock(&c->tnc_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2853) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2854) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2855)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2856) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2857) * ubifs_tnc_remove_ino - remove an inode from TNC.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2858) * @c: UBIFS file-system description object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2859) * @inum: inode number to remove
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2860) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2861) * This function remove inode @inum and all the extended attributes associated
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2862) * with the anode from TNC and returns zero in case of success or a negative
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2863) * error code in case of failure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2864) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2865) int ubifs_tnc_remove_ino(struct ubifs_info *c, ino_t inum)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2866) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2867) union ubifs_key key1, key2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2868) struct ubifs_dent_node *xent, *pxent = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2869) struct fscrypt_name nm = {0};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2870)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2871) dbg_tnc("ino %lu", (unsigned long)inum);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2872)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2873) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2874) * Walk all extended attribute entries and remove them together with
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2875) * corresponding extended attribute inodes.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2876) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2877) lowest_xent_key(c, &key1, inum);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2878) while (1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2879) ino_t xattr_inum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2880) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2881)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2882) xent = ubifs_tnc_next_ent(c, &key1, &nm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2883) if (IS_ERR(xent)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2884) err = PTR_ERR(xent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2885) if (err == -ENOENT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2886) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2887) kfree(pxent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2888) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2889) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2890)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2891) xattr_inum = le64_to_cpu(xent->inum);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2892) dbg_tnc("xent '%s', ino %lu", xent->name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2893) (unsigned long)xattr_inum);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2894)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2895) ubifs_evict_xattr_inode(c, xattr_inum);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2896)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2897) fname_name(&nm) = xent->name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2898) fname_len(&nm) = le16_to_cpu(xent->nlen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2899) err = ubifs_tnc_remove_nm(c, &key1, &nm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2900) if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2901) kfree(pxent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2902) kfree(xent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2903) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2904) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2905)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2906) lowest_ino_key(c, &key1, xattr_inum);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2907) highest_ino_key(c, &key2, xattr_inum);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2908) err = ubifs_tnc_remove_range(c, &key1, &key2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2909) if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2910) kfree(pxent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2911) kfree(xent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2912) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2913) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2914)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2915) kfree(pxent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2916) pxent = xent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2917) key_read(c, &xent->key, &key1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2918) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2919)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2920) kfree(pxent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2921) lowest_ino_key(c, &key1, inum);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2922) highest_ino_key(c, &key2, inum);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2923)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2924) return ubifs_tnc_remove_range(c, &key1, &key2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2925) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2926)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2927) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2928) * ubifs_tnc_next_ent - walk directory or extended attribute entries.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2929) * @c: UBIFS file-system description object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2930) * @key: key of last entry
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2931) * @nm: name of last entry found or %NULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2932) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2933) * This function finds and reads the next directory or extended attribute entry
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2934) * after the given key (@key) if there is one. @nm is used to resolve
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2935) * collisions.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2936) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2937) * If the name of the current entry is not known and only the key is known,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2938) * @nm->name has to be %NULL. In this case the semantics of this function is a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2939) * little bit different and it returns the entry corresponding to this key, not
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2940) * the next one. If the key was not found, the closest "right" entry is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2941) * returned.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2942) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2943) * If the fist entry has to be found, @key has to contain the lowest possible
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2944) * key value for this inode and @name has to be %NULL.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2945) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2946) * This function returns the found directory or extended attribute entry node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2947) * in case of success, %-ENOENT is returned if no entry was found, and a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2948) * negative error code is returned in case of failure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2949) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2950) struct ubifs_dent_node *ubifs_tnc_next_ent(struct ubifs_info *c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2951) union ubifs_key *key,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2952) const struct fscrypt_name *nm)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2953) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2954) int n, err, type = key_type(c, key);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2955) struct ubifs_znode *znode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2956) struct ubifs_dent_node *dent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2957) struct ubifs_zbranch *zbr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2958) union ubifs_key *dkey;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2959)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2960) dbg_tnck(key, "key ");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2961) ubifs_assert(c, is_hash_key(c, key));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2962)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2963) mutex_lock(&c->tnc_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2964) err = ubifs_lookup_level0(c, key, &znode, &n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2965) if (unlikely(err < 0))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2966) goto out_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2967)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2968) if (fname_len(nm) > 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2969) if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2970) /* Handle collisions */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2971) if (c->replaying)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2972) err = fallible_resolve_collision(c, key, &znode, &n,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2973) nm, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2974) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2975) err = resolve_collision(c, key, &znode, &n, nm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2976) dbg_tnc("rc returned %d, znode %p, n %d",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2977) err, znode, n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2978) if (unlikely(err < 0))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2979) goto out_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2980) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2981)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2982) /* Now find next entry */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2983) err = tnc_next(c, &znode, &n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2984) if (unlikely(err))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2985) goto out_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2986) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2987) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2988) * The full name of the entry was not given, in which case the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2989) * behavior of this function is a little different and it
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2990) * returns current entry, not the next one.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2991) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2992) if (!err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2993) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2994) * However, the given key does not exist in the TNC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2995) * tree and @znode/@n variables contain the closest
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2996) * "preceding" element. Switch to the next one.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2997) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2998) err = tnc_next(c, &znode, &n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2999) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3000) goto out_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3001) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3002) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3003)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3004) zbr = &znode->zbranch[n];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3005) dent = kmalloc(zbr->len, GFP_NOFS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3006) if (unlikely(!dent)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3007) err = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3008) goto out_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3009) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3010)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3011) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3012) * The above 'tnc_next()' call could lead us to the next inode, check
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3013) * this.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3014) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3015) dkey = &zbr->key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3016) if (key_inum(c, dkey) != key_inum(c, key) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3017) key_type(c, dkey) != type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3018) err = -ENOENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3019) goto out_free;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3020) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3021)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3022) err = tnc_read_hashed_node(c, zbr, dent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3023) if (unlikely(err))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3024) goto out_free;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3025)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3026) mutex_unlock(&c->tnc_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3027) return dent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3028)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3029) out_free:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3030) kfree(dent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3031) out_unlock:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3032) mutex_unlock(&c->tnc_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3033) return ERR_PTR(err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3034) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3035)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3036) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3037) * tnc_destroy_cnext - destroy left-over obsolete znodes from a failed commit.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3038) * @c: UBIFS file-system description object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3039) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3040) * Destroy left-over obsolete znodes from a failed commit.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3041) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3042) static void tnc_destroy_cnext(struct ubifs_info *c)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3043) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3044) struct ubifs_znode *cnext;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3045)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3046) if (!c->cnext)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3047) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3048) ubifs_assert(c, c->cmt_state == COMMIT_BROKEN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3049) cnext = c->cnext;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3050) do {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3051) struct ubifs_znode *znode = cnext;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3052)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3053) cnext = cnext->cnext;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3054) if (ubifs_zn_obsolete(znode))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3055) kfree(znode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3056) } while (cnext && cnext != c->cnext);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3057) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3058)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3059) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3060) * ubifs_tnc_close - close TNC subsystem and free all related resources.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3061) * @c: UBIFS file-system description object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3062) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3063) void ubifs_tnc_close(struct ubifs_info *c)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3064) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3065) tnc_destroy_cnext(c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3066) if (c->zroot.znode) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3067) long n, freed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3068)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3069) n = atomic_long_read(&c->clean_zn_cnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3070) freed = ubifs_destroy_tnc_subtree(c, c->zroot.znode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3071) ubifs_assert(c, freed == n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3072) atomic_long_sub(n, &ubifs_clean_zn_cnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3073) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3074) kfree(c->gap_lebs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3075) kfree(c->ilebs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3076) destroy_old_idx(c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3077) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3078)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3079) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3080) * left_znode - get the znode to the left.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3081) * @c: UBIFS file-system description object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3082) * @znode: znode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3083) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3084) * This function returns a pointer to the znode to the left of @znode or NULL if
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3085) * there is not one. A negative error code is returned on failure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3086) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3087) static struct ubifs_znode *left_znode(struct ubifs_info *c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3088) struct ubifs_znode *znode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3089) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3090) int level = znode->level;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3091)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3092) while (1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3093) int n = znode->iip - 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3094)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3095) /* Go up until we can go left */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3096) znode = znode->parent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3097) if (!znode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3098) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3099) if (n >= 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3100) /* Now go down the rightmost branch to 'level' */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3101) znode = get_znode(c, znode, n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3102) if (IS_ERR(znode))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3103) return znode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3104) while (znode->level != level) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3105) n = znode->child_cnt - 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3106) znode = get_znode(c, znode, n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3107) if (IS_ERR(znode))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3108) return znode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3109) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3110) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3111) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3112) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3113) return znode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3114) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3115)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3116) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3117) * right_znode - get the znode to the right.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3118) * @c: UBIFS file-system description object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3119) * @znode: znode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3120) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3121) * This function returns a pointer to the znode to the right of @znode or NULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3122) * if there is not one. A negative error code is returned on failure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3123) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3124) static struct ubifs_znode *right_znode(struct ubifs_info *c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3125) struct ubifs_znode *znode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3126) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3127) int level = znode->level;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3128)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3129) while (1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3130) int n = znode->iip + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3131)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3132) /* Go up until we can go right */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3133) znode = znode->parent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3134) if (!znode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3135) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3136) if (n < znode->child_cnt) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3137) /* Now go down the leftmost branch to 'level' */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3138) znode = get_znode(c, znode, n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3139) if (IS_ERR(znode))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3140) return znode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3141) while (znode->level != level) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3142) znode = get_znode(c, znode, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3143) if (IS_ERR(znode))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3144) return znode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3145) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3146) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3147) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3148) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3149) return znode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3150) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3151)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3152) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3153) * lookup_znode - find a particular indexing node from TNC.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3154) * @c: UBIFS file-system description object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3155) * @key: index node key to lookup
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3156) * @level: index node level
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3157) * @lnum: index node LEB number
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3158) * @offs: index node offset
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3159) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3160) * This function searches an indexing node by its first key @key and its
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3161) * address @lnum:@offs. It looks up the indexing tree by pulling all indexing
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3162) * nodes it traverses to TNC. This function is called for indexing nodes which
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3163) * were found on the media by scanning, for example when garbage-collecting or
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3164) * when doing in-the-gaps commit. This means that the indexing node which is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3165) * looked for does not have to have exactly the same leftmost key @key, because
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3166) * the leftmost key may have been changed, in which case TNC will contain a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3167) * dirty znode which still refers the same @lnum:@offs. This function is clever
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3168) * enough to recognize such indexing nodes.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3169) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3170) * Note, if a znode was deleted or changed too much, then this function will
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3171) * not find it. For situations like this UBIFS has the old index RB-tree
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3172) * (indexed by @lnum:@offs).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3173) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3174) * This function returns a pointer to the znode found or %NULL if it is not
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3175) * found. A negative error code is returned on failure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3176) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3177) static struct ubifs_znode *lookup_znode(struct ubifs_info *c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3178) union ubifs_key *key, int level,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3179) int lnum, int offs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3180) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3181) struct ubifs_znode *znode, *zn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3182) int n, nn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3183)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3184) ubifs_assert(c, key_type(c, key) < UBIFS_INVALID_KEY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3185)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3186) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3187) * The arguments have probably been read off flash, so don't assume
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3188) * they are valid.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3189) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3190) if (level < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3191) return ERR_PTR(-EINVAL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3192)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3193) /* Get the root znode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3194) znode = c->zroot.znode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3195) if (!znode) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3196) znode = ubifs_load_znode(c, &c->zroot, NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3197) if (IS_ERR(znode))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3198) return znode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3199) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3200) /* Check if it is the one we are looking for */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3201) if (c->zroot.lnum == lnum && c->zroot.offs == offs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3202) return znode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3203) /* Descend to the parent level i.e. (level + 1) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3204) if (level >= znode->level)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3205) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3206) while (1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3207) ubifs_search_zbranch(c, znode, key, &n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3208) if (n < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3209) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3210) * We reached a znode where the leftmost key is greater
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3211) * than the key we are searching for. This is the same
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3212) * situation as the one described in a huge comment at
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3213) * the end of the 'ubifs_lookup_level0()' function. And
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3214) * for exactly the same reasons we have to try to look
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3215) * left before giving up.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3216) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3217) znode = left_znode(c, znode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3218) if (!znode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3219) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3220) if (IS_ERR(znode))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3221) return znode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3222) ubifs_search_zbranch(c, znode, key, &n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3223) ubifs_assert(c, n >= 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3224) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3225) if (znode->level == level + 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3226) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3227) znode = get_znode(c, znode, n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3228) if (IS_ERR(znode))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3229) return znode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3230) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3231) /* Check if the child is the one we are looking for */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3232) if (znode->zbranch[n].lnum == lnum && znode->zbranch[n].offs == offs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3233) return get_znode(c, znode, n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3234) /* If the key is unique, there is nowhere else to look */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3235) if (!is_hash_key(c, key))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3236) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3237) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3238) * The key is not unique and so may be also in the znodes to either
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3239) * side.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3240) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3241) zn = znode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3242) nn = n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3243) /* Look left */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3244) while (1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3245) /* Move one branch to the left */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3246) if (n)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3247) n -= 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3248) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3249) znode = left_znode(c, znode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3250) if (!znode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3251) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3252) if (IS_ERR(znode))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3253) return znode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3254) n = znode->child_cnt - 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3255) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3256) /* Check it */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3257) if (znode->zbranch[n].lnum == lnum &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3258) znode->zbranch[n].offs == offs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3259) return get_znode(c, znode, n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3260) /* Stop if the key is less than the one we are looking for */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3261) if (keys_cmp(c, &znode->zbranch[n].key, key) < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3262) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3263) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3264) /* Back to the middle */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3265) znode = zn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3266) n = nn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3267) /* Look right */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3268) while (1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3269) /* Move one branch to the right */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3270) if (++n >= znode->child_cnt) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3271) znode = right_znode(c, znode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3272) if (!znode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3273) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3274) if (IS_ERR(znode))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3275) return znode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3276) n = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3277) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3278) /* Check it */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3279) if (znode->zbranch[n].lnum == lnum &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3280) znode->zbranch[n].offs == offs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3281) return get_znode(c, znode, n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3282) /* Stop if the key is greater than the one we are looking for */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3283) if (keys_cmp(c, &znode->zbranch[n].key, key) > 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3284) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3285) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3286) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3287) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3288)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3289) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3290) * is_idx_node_in_tnc - determine if an index node is in the TNC.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3291) * @c: UBIFS file-system description object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3292) * @key: key of index node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3293) * @level: index node level
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3294) * @lnum: LEB number of index node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3295) * @offs: offset of index node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3296) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3297) * This function returns %0 if the index node is not referred to in the TNC, %1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3298) * if the index node is referred to in the TNC and the corresponding znode is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3299) * dirty, %2 if an index node is referred to in the TNC and the corresponding
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3300) * znode is clean, and a negative error code in case of failure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3301) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3302) * Note, the @key argument has to be the key of the first child. Also note,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3303) * this function relies on the fact that 0:0 is never a valid LEB number and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3304) * offset for a main-area node.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3305) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3306) int is_idx_node_in_tnc(struct ubifs_info *c, union ubifs_key *key, int level,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3307) int lnum, int offs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3308) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3309) struct ubifs_znode *znode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3310)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3311) znode = lookup_znode(c, key, level, lnum, offs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3312) if (!znode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3313) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3314) if (IS_ERR(znode))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3315) return PTR_ERR(znode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3316)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3317) return ubifs_zn_dirty(znode) ? 1 : 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3318) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3319)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3320) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3321) * is_leaf_node_in_tnc - determine if a non-indexing not is in the TNC.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3322) * @c: UBIFS file-system description object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3323) * @key: node key
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3324) * @lnum: node LEB number
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3325) * @offs: node offset
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3326) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3327) * This function returns %1 if the node is referred to in the TNC, %0 if it is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3328) * not, and a negative error code in case of failure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3329) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3330) * Note, this function relies on the fact that 0:0 is never a valid LEB number
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3331) * and offset for a main-area node.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3332) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3333) static int is_leaf_node_in_tnc(struct ubifs_info *c, union ubifs_key *key,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3334) int lnum, int offs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3335) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3336) struct ubifs_zbranch *zbr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3337) struct ubifs_znode *znode, *zn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3338) int n, found, err, nn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3339) const int unique = !is_hash_key(c, key);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3340)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3341) found = ubifs_lookup_level0(c, key, &znode, &n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3342) if (found < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3343) return found; /* Error code */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3344) if (!found)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3345) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3346) zbr = &znode->zbranch[n];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3347) if (lnum == zbr->lnum && offs == zbr->offs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3348) return 1; /* Found it */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3349) if (unique)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3350) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3351) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3352) * Because the key is not unique, we have to look left
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3353) * and right as well
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3354) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3355) zn = znode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3356) nn = n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3357) /* Look left */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3358) while (1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3359) err = tnc_prev(c, &znode, &n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3360) if (err == -ENOENT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3361) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3362) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3363) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3364) if (keys_cmp(c, key, &znode->zbranch[n].key))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3365) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3366) zbr = &znode->zbranch[n];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3367) if (lnum == zbr->lnum && offs == zbr->offs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3368) return 1; /* Found it */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3369) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3370) /* Look right */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3371) znode = zn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3372) n = nn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3373) while (1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3374) err = tnc_next(c, &znode, &n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3375) if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3376) if (err == -ENOENT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3377) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3378) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3379) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3380) if (keys_cmp(c, key, &znode->zbranch[n].key))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3381) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3382) zbr = &znode->zbranch[n];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3383) if (lnum == zbr->lnum && offs == zbr->offs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3384) return 1; /* Found it */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3385) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3386) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3387) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3388)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3389) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3390) * ubifs_tnc_has_node - determine whether a node is in the TNC.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3391) * @c: UBIFS file-system description object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3392) * @key: node key
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3393) * @level: index node level (if it is an index node)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3394) * @lnum: node LEB number
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3395) * @offs: node offset
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3396) * @is_idx: non-zero if the node is an index node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3397) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3398) * This function returns %1 if the node is in the TNC, %0 if it is not, and a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3399) * negative error code in case of failure. For index nodes, @key has to be the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3400) * key of the first child. An index node is considered to be in the TNC only if
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3401) * the corresponding znode is clean or has not been loaded.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3402) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3403) int ubifs_tnc_has_node(struct ubifs_info *c, union ubifs_key *key, int level,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3404) int lnum, int offs, int is_idx)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3405) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3406) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3407)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3408) mutex_lock(&c->tnc_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3409) if (is_idx) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3410) err = is_idx_node_in_tnc(c, key, level, lnum, offs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3411) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3412) goto out_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3413) if (err == 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3414) /* The index node was found but it was dirty */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3415) err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3416) else if (err == 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3417) /* The index node was found and it was clean */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3418) err = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3419) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3420) BUG_ON(err != 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3421) } else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3422) err = is_leaf_node_in_tnc(c, key, lnum, offs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3423)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3424) out_unlock:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3425) mutex_unlock(&c->tnc_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3426) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3427) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3428)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3429) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3430) * ubifs_dirty_idx_node - dirty an index node.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3431) * @c: UBIFS file-system description object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3432) * @key: index node key
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3433) * @level: index node level
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3434) * @lnum: index node LEB number
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3435) * @offs: index node offset
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3436) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3437) * This function loads and dirties an index node so that it can be garbage
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3438) * collected. The @key argument has to be the key of the first child. This
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3439) * function relies on the fact that 0:0 is never a valid LEB number and offset
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3440) * for a main-area node. Returns %0 on success and a negative error code on
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3441) * failure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3442) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3443) int ubifs_dirty_idx_node(struct ubifs_info *c, union ubifs_key *key, int level,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3444) int lnum, int offs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3445) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3446) struct ubifs_znode *znode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3447) int err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3448)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3449) mutex_lock(&c->tnc_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3450) znode = lookup_znode(c, key, level, lnum, offs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3451) if (!znode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3452) goto out_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3453) if (IS_ERR(znode)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3454) err = PTR_ERR(znode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3455) goto out_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3456) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3457) znode = dirty_cow_bottom_up(c, znode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3458) if (IS_ERR(znode)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3459) err = PTR_ERR(znode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3460) goto out_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3461) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3462)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3463) out_unlock:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3464) mutex_unlock(&c->tnc_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3465) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3466) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3467)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3468) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3469) * dbg_check_inode_size - check if inode size is correct.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3470) * @c: UBIFS file-system description object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3471) * @inode: inode to check
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3472) * @size: inode size
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3473) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3474) * This function makes sure that the inode size (@size) is correct and it does
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3475) * not have any pages beyond @size. Returns zero if the inode is OK, %-EINVAL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3476) * if it has a data page beyond @size, and other negative error code in case of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3477) * other errors.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3478) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3479) int dbg_check_inode_size(struct ubifs_info *c, const struct inode *inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3480) loff_t size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3481) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3482) int err, n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3483) union ubifs_key from_key, to_key, *key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3484) struct ubifs_znode *znode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3485) unsigned int block;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3486)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3487) if (!S_ISREG(inode->i_mode))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3488) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3489) if (!dbg_is_chk_gen(c))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3490) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3491)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3492) block = (size + UBIFS_BLOCK_SIZE - 1) >> UBIFS_BLOCK_SHIFT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3493) data_key_init(c, &from_key, inode->i_ino, block);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3494) highest_data_key(c, &to_key, inode->i_ino);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3495)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3496) mutex_lock(&c->tnc_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3497) err = ubifs_lookup_level0(c, &from_key, &znode, &n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3498) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3499) goto out_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3500)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3501) if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3502) key = &from_key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3503) goto out_dump;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3504) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3505)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3506) err = tnc_next(c, &znode, &n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3507) if (err == -ENOENT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3508) err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3509) goto out_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3510) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3511) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3512) goto out_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3513)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3514) ubifs_assert(c, err == 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3515) key = &znode->zbranch[n].key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3516) if (!key_in_range(c, key, &from_key, &to_key))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3517) goto out_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3518)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3519) out_dump:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3520) block = key_block(c, key);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3521) ubifs_err(c, "inode %lu has size %lld, but there are data at offset %lld",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3522) (unsigned long)inode->i_ino, size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3523) ((loff_t)block) << UBIFS_BLOCK_SHIFT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3524) mutex_unlock(&c->tnc_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3525) ubifs_dump_inode(c, inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3526) dump_stack();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3527) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3528)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3529) out_unlock:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3530) mutex_unlock(&c->tnc_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3531) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3532) }