^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: Artem Bityutskiy (Битюцкий Артём)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) * Adrian Hunter
^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) #ifndef __UBIFS_H__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #define __UBIFS_H__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include <asm/div64.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include <linux/statfs.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #include <linux/fs.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #include <linux/err.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #include <linux/sched.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #include <linux/slab.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #include <linux/vmalloc.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #include <linux/spinlock.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #include <linux/mutex.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #include <linux/rwsem.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #include <linux/mtd/ubi.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #include <linux/pagemap.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) #include <linux/backing-dev.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #include <linux/security.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) #include <linux/xattr.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) #include <linux/random.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) #include <crypto/hash_info.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) #include <crypto/hash.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) #include <crypto/algapi.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) #include <linux/fscrypt.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) #include "ubifs-media.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) /* Version of this UBIFS implementation */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) #define UBIFS_VERSION 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) /* UBIFS file system VFS magic number */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) #define UBIFS_SUPER_MAGIC 0x24051905
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) /* Number of UBIFS blocks per VFS page */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) #define UBIFS_BLOCKS_PER_PAGE (PAGE_SIZE / UBIFS_BLOCK_SIZE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) #define UBIFS_BLOCKS_PER_PAGE_SHIFT (PAGE_SHIFT - UBIFS_BLOCK_SHIFT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) /* "File system end of life" sequence number watermark */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) #define SQNUM_WARN_WATERMARK 0xFFFFFFFF00000000ULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) #define SQNUM_WATERMARK 0xFFFFFFFFFF000000ULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) * Minimum amount of LEBs reserved for the index. At present the index needs at
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) * least 2 LEBs: one for the index head and one for in-the-gaps method (which
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) * currently does not cater for the index head and so excludes it from
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) * consideration).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) #define MIN_INDEX_LEBS 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) /* Minimum amount of data UBIFS writes to the flash */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) #define MIN_WRITE_SZ (UBIFS_DATA_NODE_SZ + 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) * Currently we do not support inode number overlapping and re-using, so this
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) * watermark defines dangerous inode number level. This should be fixed later,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) * although it is difficult to exceed current limit. Another option is to use
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) * 64-bit inode numbers, but this means more overhead.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) #define INUM_WARN_WATERMARK 0xFFF00000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) #define INUM_WATERMARK 0xFFFFFF00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) /* Maximum number of entries in each LPT (LEB category) heap */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) #define LPT_HEAP_SZ 256
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) * Background thread name pattern. The numbers are UBI device and volume
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) * numbers.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) #define BGT_NAME_PATTERN "ubifs_bgt%d_%d"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) /* Maximum possible inode number (only 32-bit inodes are supported now) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) #define MAX_INUM 0xFFFFFFFF
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) /* Number of non-data journal heads */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) #define NONDATA_JHEADS_CNT 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) /* Shorter names for journal head numbers for internal usage */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) #define GCHD UBIFS_GC_HEAD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) #define BASEHD UBIFS_BASE_HEAD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) #define DATAHD UBIFS_DATA_HEAD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) /* 'No change' value for 'ubifs_change_lp()' */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) #define LPROPS_NC 0x80000001
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) * There is no notion of truncation key because truncation nodes do not exist
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) * in TNC. However, when replaying, it is handy to introduce fake "truncation"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) * keys for truncation nodes because the code becomes simpler. So we define
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) * %UBIFS_TRUN_KEY type.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) * But otherwise, out of the journal reply scope, the truncation keys are
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) * invalid.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) #define UBIFS_TRUN_KEY UBIFS_KEY_TYPES_CNT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) #define UBIFS_INVALID_KEY UBIFS_KEY_TYPES_CNT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) * How much a directory entry/extended attribute entry adds to the parent/host
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) * inode.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) #define CALC_DENT_SIZE(name_len) ALIGN(UBIFS_DENT_NODE_SZ + (name_len) + 1, 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) /* How much an extended attribute adds to the host inode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) #define CALC_XATTR_BYTES(data_len) ALIGN(UBIFS_INO_NODE_SZ + (data_len) + 1, 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) * Znodes which were not touched for 'OLD_ZNODE_AGE' seconds are considered
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) * "old", and znode which were touched last 'YOUNG_ZNODE_AGE' seconds ago are
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) * considered "young". This is used by shrinker when selecting znode to trim
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) * off.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) #define OLD_ZNODE_AGE 20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) #define YOUNG_ZNODE_AGE 5
^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) * Some compressors, like LZO, may end up with more data then the input buffer.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) * So UBIFS always allocates larger output buffer, to be sure the compressor
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) * will not corrupt memory in case of worst case compression.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) #define WORST_COMPR_FACTOR 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) #ifdef CONFIG_FS_ENCRYPTION
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) #define UBIFS_CIPHER_BLOCK_SIZE FS_CRYPTO_BLOCK_SIZE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) #define UBIFS_CIPHER_BLOCK_SIZE 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) * How much memory is needed for a buffer where we compress a data node.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) #define COMPRESSED_DATA_NODE_BUF_SZ \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) (UBIFS_DATA_NODE_SZ + UBIFS_BLOCK_SIZE * WORST_COMPR_FACTOR)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) /* Maximum expected tree height for use by bottom_up_buf */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) #define BOTTOM_UP_HEIGHT 64
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) /* Maximum number of data nodes to bulk-read */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) #define UBIFS_MAX_BULK_READ 32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) #ifdef CONFIG_UBIFS_FS_AUTHENTICATION
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) #define UBIFS_HASH_ARR_SZ UBIFS_MAX_HASH_LEN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) #define UBIFS_HMAC_ARR_SZ UBIFS_MAX_HMAC_LEN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) #define UBIFS_HASH_ARR_SZ 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) #define UBIFS_HMAC_ARR_SZ 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) * Lockdep classes for UBIFS inode @ui_mutex.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) WB_MUTEX_1 = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) WB_MUTEX_2 = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) WB_MUTEX_3 = 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) WB_MUTEX_4 = 3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) * Znode flags (actually, bit numbers which store the flags).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) * DIRTY_ZNODE: znode is dirty
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) * COW_ZNODE: znode is being committed and a new instance of this znode has to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) * be created before changing this znode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) * OBSOLETE_ZNODE: znode is obsolete, which means it was deleted, but it is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) * still in the commit list and the ongoing commit operation
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) * will commit it, and delete this znode after it is done
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) DIRTY_ZNODE = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) COW_ZNODE = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) OBSOLETE_ZNODE = 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) * Commit states.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) * COMMIT_RESTING: commit is not wanted
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) * COMMIT_BACKGROUND: background commit has been requested
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) * COMMIT_REQUIRED: commit is required
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) * COMMIT_RUNNING_BACKGROUND: background commit is running
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) * COMMIT_RUNNING_REQUIRED: commit is running and it is required
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) * COMMIT_BROKEN: commit failed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) COMMIT_RESTING = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) COMMIT_BACKGROUND,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) COMMIT_REQUIRED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) COMMIT_RUNNING_BACKGROUND,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) COMMIT_RUNNING_REQUIRED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) COMMIT_BROKEN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) * 'ubifs_scan_a_node()' return values.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) * SCANNED_GARBAGE: scanned garbage
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) * SCANNED_EMPTY_SPACE: scanned empty space
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) * SCANNED_A_NODE: scanned a valid node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) * SCANNED_A_CORRUPT_NODE: scanned a corrupted node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) * SCANNED_A_BAD_PAD_NODE: scanned a padding node with invalid pad length
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) * Greater than zero means: 'scanned that number of padding bytes'
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) SCANNED_GARBAGE = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) SCANNED_EMPTY_SPACE = -1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) SCANNED_A_NODE = -2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) SCANNED_A_CORRUPT_NODE = -3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) SCANNED_A_BAD_PAD_NODE = -4,
^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) * LPT cnode flag bits.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) * DIRTY_CNODE: cnode is dirty
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) * OBSOLETE_CNODE: cnode is being committed and has been copied (or deleted),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) * so it can (and must) be freed when the commit is finished
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) * COW_CNODE: cnode is being committed and must be copied before writing
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) DIRTY_CNODE = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) OBSOLETE_CNODE = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) COW_CNODE = 2,
^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 flag bits (lpt_drty_flgs) for LPT special nodes.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) * LTAB_DIRTY: ltab node is dirty
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) * LSAVE_DIRTY: lsave node is dirty
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) LTAB_DIRTY = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) LSAVE_DIRTY = 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) * Return codes used by the garbage collector.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) * @LEB_FREED: the logical eraseblock was freed and is ready to use
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) * @LEB_FREED_IDX: indexing LEB was freed and can be used only after the commit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) * @LEB_RETAINED: the logical eraseblock was freed and retained for GC purposes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) LEB_FREED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) LEB_FREED_IDX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) LEB_RETAINED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) * Action taken upon a failed ubifs_assert().
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) * @ASSACT_REPORT: just report the failed assertion
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) * @ASSACT_RO: switch to read-only mode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) * @ASSACT_PANIC: call BUG() and possible panic the kernel
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) ASSACT_REPORT = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) ASSACT_RO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) ASSACT_PANIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) * struct ubifs_old_idx - index node obsoleted since last commit start.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) * @rb: rb-tree node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) * @lnum: LEB number of obsoleted index node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) * @offs: offset of obsoleted index node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) struct ubifs_old_idx {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) struct rb_node rb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) int lnum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) int offs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) /* The below union makes it easier to deal with keys */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) union ubifs_key {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) uint8_t u8[UBIFS_SK_LEN];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) uint32_t u32[UBIFS_SK_LEN/4];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) uint64_t u64[UBIFS_SK_LEN/8];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) __le32 j32[UBIFS_SK_LEN/4];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) * struct ubifs_scan_node - UBIFS scanned node information.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) * @list: list of scanned nodes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) * @key: key of node scanned (if it has one)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) * @sqnum: sequence number
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) * @type: type of node scanned
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) * @offs: offset with LEB of node scanned
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) * @len: length of node scanned
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) * @node: raw node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) struct ubifs_scan_node {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) struct list_head list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) union ubifs_key key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) unsigned long long sqnum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) int type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) int offs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) int len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) void *node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) * struct ubifs_scan_leb - UBIFS scanned LEB information.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) * @lnum: logical eraseblock number
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) * @nodes_cnt: number of nodes scanned
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) * @nodes: list of struct ubifs_scan_node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) * @endpt: end point (and therefore the start of empty space)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) * @buf: buffer containing entire LEB scanned
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) struct ubifs_scan_leb {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) int lnum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) int nodes_cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) struct list_head nodes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) int endpt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) void *buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) * struct ubifs_gced_idx_leb - garbage-collected indexing LEB.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) * @list: list
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) * @lnum: LEB number
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) * @unmap: OK to unmap this LEB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) * This data structure is used to temporary store garbage-collected indexing
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) * LEBs - they are not released immediately, but only after the next commit.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) * This is needed to guarantee recoverability.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) struct ubifs_gced_idx_leb {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) struct list_head list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) int lnum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) int unmap;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) * struct ubifs_inode - UBIFS in-memory inode description.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) * @vfs_inode: VFS inode description object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) * @creat_sqnum: sequence number at time of creation
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) * @del_cmtno: commit number corresponding to the time the inode was deleted,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) * protected by @c->commit_sem;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) * @xattr_size: summarized size of all extended attributes in bytes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) * @xattr_cnt: count of extended attributes this inode has
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) * @xattr_names: sum of lengths of all extended attribute names belonging to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) * this inode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) * @dirty: non-zero if the inode is dirty
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) * @xattr: non-zero if this is an extended attribute inode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) * @bulk_read: non-zero if bulk-read should be used
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) * @ui_mutex: serializes inode write-back with the rest of VFS operations,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) * serializes "clean <-> dirty" state changes, serializes bulk-read,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) * protects @dirty, @bulk_read, @ui_size, and @xattr_size
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) * @xattr_sem: serilizes write operations (remove|set|create) on xattr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) * @ui_lock: protects @synced_i_size
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) * @synced_i_size: synchronized size of inode, i.e. the value of inode size
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) * currently stored on the flash; used only for regular file
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) * inodes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) * @ui_size: inode size used by UBIFS when writing to flash
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) * @flags: inode flags (@UBIFS_COMPR_FL, etc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) * @compr_type: default compression type used for this inode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) * @last_page_read: page number of last page read (for bulk read)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) * @read_in_a_row: number of consecutive pages read in a row (for bulk read)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) * @data_len: length of the data attached to the inode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) * @data: inode's data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) * @ui_mutex exists for two main reasons. At first it prevents inodes from
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) * being written back while UBIFS changing them, being in the middle of an VFS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) * operation. This way UBIFS makes sure the inode fields are consistent. For
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) * example, in 'ubifs_rename()' we change 3 inodes simultaneously, and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) * write-back must not write any of them before we have finished.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) * The second reason is budgeting - UBIFS has to budget all operations. If an
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) * operation is going to mark an inode dirty, it has to allocate budget for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) * this. It cannot just mark it dirty because there is no guarantee there will
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) * be enough flash space to write the inode back later. This means UBIFS has
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) * to have full control over inode "clean <-> dirty" transitions (and pages
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) * actually). But unfortunately, VFS marks inodes dirty in many places, and it
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) * does not ask the file-system if it is allowed to do so (there is a notifier,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) * but it is not enough), i.e., there is no mechanism to synchronize with this.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) * So UBIFS has its own inode dirty flag and its own mutex to serialize
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) * "clean <-> dirty" transitions.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) * The @synced_i_size field is used to make sure we never write pages which are
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) * beyond last synchronized inode size. See 'ubifs_writepage()' for more
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) * information.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) * The @ui_size is a "shadow" variable for @inode->i_size and UBIFS uses
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) * @ui_size instead of @inode->i_size. The reason for this is that UBIFS cannot
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) * make sure @inode->i_size is always changed under @ui_mutex, because it
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) * cannot call 'truncate_setsize()' with @ui_mutex locked, because it would
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) * deadlock with 'ubifs_writepage()' (see file.c). All the other inode fields
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) * are changed under @ui_mutex, so they do not need "shadow" fields. Note, one
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) * could consider to rework locking and base it on "shadow" fields.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) struct ubifs_inode {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) struct inode vfs_inode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) unsigned long long creat_sqnum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) unsigned long long del_cmtno;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) unsigned int xattr_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) unsigned int xattr_cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) unsigned int xattr_names;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) unsigned int dirty:1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) unsigned int xattr:1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) unsigned int bulk_read:1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) unsigned int compr_type:2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) struct mutex ui_mutex;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) struct rw_semaphore xattr_sem;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) spinlock_t ui_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) loff_t synced_i_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) loff_t ui_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) int flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) pgoff_t last_page_read;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) pgoff_t read_in_a_row;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) int data_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) void *data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) * struct ubifs_unclean_leb - records a LEB recovered under read-only mode.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) * @list: list
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) * @lnum: LEB number of recovered LEB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) * @endpt: offset where recovery ended
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) * This structure records a LEB identified during recovery that needs to be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) * cleaned but was not because UBIFS was mounted read-only. The information
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) * is used to clean the LEB when remounting to read-write mode.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) struct ubifs_unclean_leb {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) struct list_head list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) int lnum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) int endpt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) * LEB properties flags.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) * LPROPS_UNCAT: not categorized
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) * LPROPS_DIRTY: dirty > free, dirty >= @c->dead_wm, not index
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) * LPROPS_DIRTY_IDX: dirty + free > @c->min_idx_node_sze and index
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) * LPROPS_FREE: free > 0, dirty < @c->dead_wm, not empty, not index
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) * LPROPS_HEAP_CNT: number of heaps used for storing categorized LEBs
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) * LPROPS_EMPTY: LEB is empty, not taken
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) * LPROPS_FREEABLE: free + dirty == leb_size, not index, not taken
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) * LPROPS_FRDI_IDX: free + dirty == leb_size and index, may be taken
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) * LPROPS_CAT_MASK: mask for the LEB categories above
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) * LPROPS_TAKEN: LEB was taken (this flag is not saved on the media)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) * LPROPS_INDEX: LEB contains indexing nodes (this flag also exists on flash)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) LPROPS_UNCAT = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) LPROPS_DIRTY = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) LPROPS_DIRTY_IDX = 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) LPROPS_FREE = 3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) LPROPS_HEAP_CNT = 3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) LPROPS_EMPTY = 4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) LPROPS_FREEABLE = 5,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) LPROPS_FRDI_IDX = 6,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) LPROPS_CAT_MASK = 15,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) LPROPS_TAKEN = 16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) LPROPS_INDEX = 32,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) * struct ubifs_lprops - logical eraseblock properties.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) * @free: amount of free space in bytes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) * @dirty: amount of dirty space in bytes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) * @flags: LEB properties flags (see above)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) * @lnum: LEB number
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) * @list: list of same-category lprops (for LPROPS_EMPTY and LPROPS_FREEABLE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) * @hpos: heap position in heap of same-category lprops (other categories)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) struct ubifs_lprops {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) int free;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) int dirty;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) int flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) int lnum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) union {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) struct list_head list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) int hpos;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) * struct ubifs_lpt_lprops - LPT logical eraseblock properties.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) * @free: amount of free space in bytes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) * @dirty: amount of dirty space in bytes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) * @tgc: trivial GC flag (1 => unmap after commit end)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) * @cmt: commit flag (1 => reserved for commit)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) struct ubifs_lpt_lprops {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) int free;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) int dirty;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) unsigned tgc:1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) unsigned cmt:1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) * struct ubifs_lp_stats - statistics of eraseblocks in the main area.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) * @empty_lebs: number of empty LEBs
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) * @taken_empty_lebs: number of taken LEBs
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) * @idx_lebs: number of indexing LEBs
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) * @total_free: total free space in bytes (includes all LEBs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) * @total_dirty: total dirty space in bytes (includes all LEBs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) * @total_used: total used space in bytes (does not include index LEBs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) * @total_dead: total dead space in bytes (does not include index LEBs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) * @total_dark: total dark space in bytes (does not include index LEBs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) * The @taken_empty_lebs field counts the LEBs that are in the transient state
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) * of having been "taken" for use but not yet written to. @taken_empty_lebs is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) * needed to account correctly for @gc_lnum, otherwise @empty_lebs could be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) * used by itself (in which case 'unused_lebs' would be a better name). In the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) * case of @gc_lnum, it is "taken" at mount time or whenever a LEB is retained
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) * by GC, but unlike other empty LEBs that are "taken", it may not be written
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) * straight away (i.e. before the next commit start or unmount), so either
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) * @gc_lnum must be specially accounted for, or the current approach followed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) * i.e. count it under @taken_empty_lebs.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) * @empty_lebs includes @taken_empty_lebs.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) * @total_used, @total_dead and @total_dark fields do not account indexing
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) * LEBs.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) struct ubifs_lp_stats {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) int empty_lebs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) int taken_empty_lebs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) int idx_lebs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) long long total_free;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) long long total_dirty;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) long long total_used;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) long long total_dead;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) long long total_dark;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) struct ubifs_nnode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) * struct ubifs_cnode - LEB Properties Tree common node.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) * @parent: parent nnode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) * @cnext: next cnode to commit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) * @flags: flags (%DIRTY_LPT_NODE or %OBSOLETE_LPT_NODE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) * @iip: index in parent
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) * @level: level in the tree (zero for pnodes, greater than zero for nnodes)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) * @num: node number
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) struct ubifs_cnode {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) struct ubifs_nnode *parent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) struct ubifs_cnode *cnext;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) int iip;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) int level;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) int num;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) * struct ubifs_pnode - LEB Properties Tree leaf node.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) * @parent: parent nnode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) * @cnext: next cnode to commit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) * @flags: flags (%DIRTY_LPT_NODE or %OBSOLETE_LPT_NODE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) * @iip: index in parent
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) * @level: level in the tree (always zero for pnodes)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) * @num: node number
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) * @lprops: LEB properties array
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) struct ubifs_pnode {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) struct ubifs_nnode *parent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) struct ubifs_cnode *cnext;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) int iip;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) int level;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) int num;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) struct ubifs_lprops lprops[UBIFS_LPT_FANOUT];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) * struct ubifs_nbranch - LEB Properties Tree internal node branch.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) * @lnum: LEB number of child
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) * @offs: offset of child
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) * @nnode: nnode child
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) * @pnode: pnode child
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) * @cnode: cnode child
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) struct ubifs_nbranch {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) int lnum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) int offs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) union {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) struct ubifs_nnode *nnode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) struct ubifs_pnode *pnode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) struct ubifs_cnode *cnode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) * struct ubifs_nnode - LEB Properties Tree internal node.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) * @parent: parent nnode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) * @cnext: next cnode to commit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) * @flags: flags (%DIRTY_LPT_NODE or %OBSOLETE_LPT_NODE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) * @iip: index in parent
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) * @level: level in the tree (always greater than zero for nnodes)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) * @num: node number
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) * @nbranch: branches to child nodes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) struct ubifs_nnode {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) struct ubifs_nnode *parent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) struct ubifs_cnode *cnext;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) int iip;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) int level;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) int num;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) struct ubifs_nbranch nbranch[UBIFS_LPT_FANOUT];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) * struct ubifs_lpt_heap - heap of categorized lprops.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) * @arr: heap array
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) * @cnt: number in heap
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) * @max_cnt: maximum number allowed in heap
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) * There are %LPROPS_HEAP_CNT heaps.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) struct ubifs_lpt_heap {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) struct ubifs_lprops **arr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) int cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) int max_cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) };
^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) * Return codes for LPT scan callback function.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) * LPT_SCAN_CONTINUE: continue scanning
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) * LPT_SCAN_ADD: add the LEB properties scanned to the tree in memory
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) * LPT_SCAN_STOP: stop scanning
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) LPT_SCAN_CONTINUE = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) LPT_SCAN_ADD = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) LPT_SCAN_STOP = 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) struct ubifs_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) /* Callback used by the 'ubifs_lpt_scan_nolock()' function */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) typedef int (*ubifs_lpt_scan_callback)(struct ubifs_info *c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) const struct ubifs_lprops *lprops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) int in_tree, void *data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) * struct ubifs_wbuf - UBIFS write-buffer.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) * @c: UBIFS file-system description object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) * @buf: write-buffer (of min. flash I/O unit size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) * @lnum: logical eraseblock number the write-buffer points to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) * @offs: write-buffer offset in this logical eraseblock
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) * @avail: number of bytes available in the write-buffer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) * @used: number of used bytes in the write-buffer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) * @size: write-buffer size (in [@c->min_io_size, @c->max_write_size] range)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) * @jhead: journal head the mutex belongs to (note, needed only to shut lockdep
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) * up by 'mutex_lock_nested()).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) * @sync_callback: write-buffer synchronization callback
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) * @io_mutex: serializes write-buffer I/O
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) * @lock: serializes @buf, @lnum, @offs, @avail, @used, @next_ino and @inodes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) * fields
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) * @timer: write-buffer timer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) * @no_timer: non-zero if this write-buffer does not have a timer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) * @need_sync: non-zero if the timer expired and the wbuf needs sync'ing
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) * @next_ino: points to the next position of the following inode number
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) * @inodes: stores the inode numbers of the nodes which are in wbuf
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) * The write-buffer synchronization callback is called when the write-buffer is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) * synchronized in order to notify how much space was wasted due to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) * write-buffer padding and how much free space is left in the LEB.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) * Note: the fields @buf, @lnum, @offs, @avail and @used can be read under
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) * spin-lock or mutex because they are written under both mutex and spin-lock.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) * @buf is appended to under mutex but overwritten under both mutex and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) * spin-lock. Thus the data between @buf and @buf + @used can be read under
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) * spinlock.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) struct ubifs_wbuf {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) struct ubifs_info *c;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) void *buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) int lnum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) int offs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) int avail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) int used;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) int size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) int jhead;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) int (*sync_callback)(struct ubifs_info *c, int lnum, int free, int pad);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) struct mutex io_mutex;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) spinlock_t lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) struct hrtimer timer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) unsigned int no_timer:1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) unsigned int need_sync:1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) int next_ino;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699) ino_t *inodes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) * struct ubifs_bud - bud logical eraseblock.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) * @lnum: logical eraseblock number
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) * @start: where the (uncommitted) bud data starts
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706) * @jhead: journal head number this bud belongs to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) * @list: link in the list buds belonging to the same journal head
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) * @rb: link in the tree of all buds
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) * @log_hash: the log hash from the commit start node up to this bud
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) struct ubifs_bud {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) int lnum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) int start;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714) int jhead;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) struct list_head list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) struct rb_node rb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) struct shash_desc *log_hash;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) * struct ubifs_jhead - journal head.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) * @wbuf: head's write-buffer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) * @buds_list: list of bud LEBs belonging to this journal head
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) * @grouped: non-zero if UBIFS groups nodes when writing to this journal head
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) * @log_hash: the log hash from the commit start node up to this journal head
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) * Note, the @buds list is protected by the @c->buds_lock.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) struct ubifs_jhead {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) struct ubifs_wbuf wbuf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) struct list_head buds_list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732) unsigned int grouped:1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) struct shash_desc *log_hash;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) * struct ubifs_zbranch - key/coordinate/length branch stored in znodes.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) * @key: key
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) * @znode: znode address in memory
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) * @lnum: LEB number of the target node (indexing node or data node)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741) * @offs: target node offset within @lnum
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) * @len: target node length
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743) * @hash: the hash of the target node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) struct ubifs_zbranch {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) union ubifs_key key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747) union {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) struct ubifs_znode *znode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749) void *leaf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) int lnum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752) int offs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) int len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754) u8 hash[UBIFS_HASH_ARR_SZ];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758) * struct ubifs_znode - in-memory representation of an indexing node.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759) * @parent: parent znode or NULL if it is the root
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) * @cnext: next znode to commit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761) * @cparent: parent node for this commit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) * @ciip: index in cparent's zbranch array
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763) * @flags: znode flags (%DIRTY_ZNODE, %COW_ZNODE or %OBSOLETE_ZNODE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764) * @time: last access time (seconds)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765) * @level: level of the entry in the TNC tree
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766) * @child_cnt: count of child znodes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767) * @iip: index in parent's zbranch array
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768) * @alt: lower bound of key range has altered i.e. child inserted at slot 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769) * @lnum: LEB number of the corresponding indexing node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770) * @offs: offset of the corresponding indexing node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) * @len: length of the corresponding indexing node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772) * @zbranch: array of znode branches (@c->fanout elements)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774) * Note! The @lnum, @offs, and @len fields are not really needed - we have them
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775) * only for internal consistency check. They could be removed to save some RAM.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777) struct ubifs_znode {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778) struct ubifs_znode *parent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779) struct ubifs_znode *cnext;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780) struct ubifs_znode *cparent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781) int ciip;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782) unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783) time64_t time;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784) int level;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785) int child_cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786) int iip;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787) int alt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788) int lnum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789) int offs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790) int len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791) struct ubifs_zbranch zbranch[];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795) * struct bu_info - bulk-read information.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796) * @key: first data node key
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797) * @zbranch: zbranches of data nodes to bulk read
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798) * @buf: buffer to read into
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799) * @buf_len: buffer length
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800) * @gc_seq: GC sequence number to detect races with GC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801) * @cnt: number of data nodes for bulk read
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802) * @blk_cnt: number of data blocks including holes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803) * @oef: end of file reached
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805) struct bu_info {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806) union ubifs_key key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807) struct ubifs_zbranch zbranch[UBIFS_MAX_BULK_READ];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808) void *buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809) int buf_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810) int gc_seq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811) int cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812) int blk_cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813) int eof;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817) * struct ubifs_node_range - node length range description data structure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818) * @len: fixed node length
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819) * @min_len: minimum possible node length
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820) * @max_len: maximum possible node length
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822) * If @max_len is %0, the node has fixed length @len.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824) struct ubifs_node_range {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825) union {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826) int len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827) int min_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829) int max_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833) * struct ubifs_compressor - UBIFS compressor description structure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834) * @compr_type: compressor type (%UBIFS_COMPR_LZO, etc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835) * @cc: cryptoapi compressor handle
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836) * @comp_mutex: mutex used during compression
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837) * @decomp_mutex: mutex used during decompression
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838) * @name: compressor name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839) * @capi_name: cryptoapi compressor name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841) struct ubifs_compressor {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842) int compr_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843) struct crypto_comp *cc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844) struct mutex *comp_mutex;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845) struct mutex *decomp_mutex;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846) const char *name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847) const char *capi_name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851) * struct ubifs_budget_req - budget requirements of an operation.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853) * @fast: non-zero if the budgeting should try to acquire budget quickly and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854) * should not try to call write-back
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855) * @recalculate: non-zero if @idx_growth, @data_growth, and @dd_growth fields
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856) * have to be re-calculated
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857) * @new_page: non-zero if the operation adds a new page
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858) * @dirtied_page: non-zero if the operation makes a page dirty
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859) * @new_dent: non-zero if the operation adds a new directory entry
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860) * @mod_dent: non-zero if the operation removes or modifies an existing
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861) * directory entry
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862) * @new_ino: non-zero if the operation adds a new inode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 863) * @new_ino_d: how much data newly created inode contains
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 864) * @dirtied_ino: how many inodes the operation makes dirty
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 865) * @dirtied_ino_d: how much data dirtied inode contains
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 866) * @idx_growth: how much the index will supposedly grow
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 867) * @data_growth: how much new data the operation will supposedly add
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 868) * @dd_growth: how much data that makes other data dirty the operation will
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 869) * supposedly add
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 870) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 871) * @idx_growth, @data_growth and @dd_growth are not used in budget request. The
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 872) * budgeting subsystem caches index and data growth values there to avoid
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 873) * re-calculating them when the budget is released. However, if @idx_growth is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 874) * %-1, it is calculated by the release function using other fields.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 875) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 876) * An inode may contain 4KiB of data at max., thus the widths of @new_ino_d
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 877) * is 13 bits, and @dirtied_ino_d - 15, because up to 4 inodes may be made
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 878) * dirty by the re-name operation.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 879) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 880) * Note, UBIFS aligns node lengths to 8-bytes boundary, so the requester has to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 881) * make sure the amount of inode data which contribute to @new_ino_d and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 882) * @dirtied_ino_d fields are aligned.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 883) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 884) struct ubifs_budget_req {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 885) unsigned int fast:1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 886) unsigned int recalculate:1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 887) #ifndef UBIFS_DEBUG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 888) unsigned int new_page:1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 889) unsigned int dirtied_page:1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 890) unsigned int new_dent:1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 891) unsigned int mod_dent:1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 892) unsigned int new_ino:1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 893) unsigned int new_ino_d:13;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 894) unsigned int dirtied_ino:4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 895) unsigned int dirtied_ino_d:15;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 896) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 897) /* Not bit-fields to check for overflows */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 898) unsigned int new_page;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 899) unsigned int dirtied_page;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 900) unsigned int new_dent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 901) unsigned int mod_dent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 902) unsigned int new_ino;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 903) unsigned int new_ino_d;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 904) unsigned int dirtied_ino;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 905) unsigned int dirtied_ino_d;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 906) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 907) int idx_growth;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 908) int data_growth;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 909) int dd_growth;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 910) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 911)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 912) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 913) * struct ubifs_orphan - stores the inode number of an orphan.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 914) * @rb: rb-tree node of rb-tree of orphans sorted by inode number
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 915) * @list: list head of list of orphans in order added
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 916) * @new_list: list head of list of orphans added since the last commit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 917) * @child_list: list of xattr childs if this orphan hosts xattrs, list head
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 918) * if this orphan is a xattr, not used otherwise.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 919) * @cnext: next orphan to commit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 920) * @dnext: next orphan to delete
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 921) * @inum: inode number
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 922) * @new: %1 => added since the last commit, otherwise %0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 923) * @cmt: %1 => commit pending, otherwise %0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 924) * @del: %1 => delete pending, otherwise %0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 925) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 926) struct ubifs_orphan {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 927) struct rb_node rb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 928) struct list_head list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 929) struct list_head new_list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 930) struct list_head child_list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 931) struct ubifs_orphan *cnext;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 932) struct ubifs_orphan *dnext;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 933) ino_t inum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 934) unsigned new:1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 935) unsigned cmt:1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 936) unsigned del:1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 937) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 938)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 939) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 940) * struct ubifs_mount_opts - UBIFS-specific mount options information.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 941) * @unmount_mode: selected unmount mode (%0 default, %1 normal, %2 fast)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 942) * @bulk_read: enable/disable bulk-reads (%0 default, %1 disable, %2 enable)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 943) * @chk_data_crc: enable/disable CRC data checking when reading data nodes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 944) * (%0 default, %1 disable, %2 enable)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 945) * @override_compr: override default compressor (%0 - do not override and use
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 946) * superblock compressor, %1 - override and use compressor
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 947) * specified in @compr_type)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 948) * @compr_type: compressor type to override the superblock compressor with
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 949) * (%UBIFS_COMPR_NONE, etc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 950) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 951) struct ubifs_mount_opts {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 952) unsigned int unmount_mode:2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 953) unsigned int bulk_read:2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 954) unsigned int chk_data_crc:2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 955) unsigned int override_compr:1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 956) unsigned int compr_type:2;
^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) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 960) * struct ubifs_budg_info - UBIFS budgeting information.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 961) * @idx_growth: amount of bytes budgeted for index growth
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 962) * @data_growth: amount of bytes budgeted for cached data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 963) * @dd_growth: amount of bytes budgeted for cached data that will make
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 964) * other data dirty
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 965) * @uncommitted_idx: amount of bytes were budgeted for growth of the index, but
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 966) * which still have to be taken into account because the index
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 967) * has not been committed so far
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 968) * @old_idx_sz: size of index on flash
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 969) * @min_idx_lebs: minimum number of LEBs required for the index
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 970) * @nospace: non-zero if the file-system does not have flash space (used as
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 971) * optimization)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 972) * @nospace_rp: the same as @nospace, but additionally means that even reserved
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 973) * pool is full
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 974) * @page_budget: budget for a page (constant, never changed after mount)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 975) * @inode_budget: budget for an inode (constant, never changed after mount)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 976) * @dent_budget: budget for a directory entry (constant, never changed after
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 977) * mount)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 978) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 979) struct ubifs_budg_info {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 980) long long idx_growth;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 981) long long data_growth;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 982) long long dd_growth;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 983) long long uncommitted_idx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 984) unsigned long long old_idx_sz;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 985) int min_idx_lebs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 986) unsigned int nospace:1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 987) unsigned int nospace_rp:1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 988) int page_budget;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 989) int inode_budget;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 990) int dent_budget;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 991) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 992)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 993) struct ubifs_debug_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 994)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 995) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 996) * struct ubifs_info - UBIFS file-system description data structure
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 997) * (per-superblock).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 998) * @vfs_sb: VFS @struct super_block object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 999) * @sup_node: The super block node as read from the device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001) * @highest_inum: highest used inode number
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002) * @max_sqnum: current global sequence number
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003) * @cmt_no: commit number of the last successfully completed commit, protected
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004) * by @commit_sem
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005) * @cnt_lock: protects @highest_inum and @max_sqnum counters
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006) * @fmt_version: UBIFS on-flash format version
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007) * @ro_compat_version: R/O compatibility version
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008) * @uuid: UUID from super block
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010) * @lhead_lnum: log head logical eraseblock number
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011) * @lhead_offs: log head offset
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012) * @ltail_lnum: log tail logical eraseblock number (offset is always 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013) * @log_mutex: protects the log, @lhead_lnum, @lhead_offs, @ltail_lnum, and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) * @bud_bytes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015) * @min_log_bytes: minimum required number of bytes in the log
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016) * @cmt_bud_bytes: used during commit to temporarily amount of bytes in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017) * committed buds
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019) * @buds: tree of all buds indexed by bud LEB number
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020) * @bud_bytes: how many bytes of flash is used by buds
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021) * @buds_lock: protects the @buds tree, @bud_bytes, and per-journal head bud
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022) * lists
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023) * @jhead_cnt: count of journal heads
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024) * @jheads: journal heads (head zero is base head)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025) * @max_bud_bytes: maximum number of bytes allowed in buds
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026) * @bg_bud_bytes: number of bud bytes when background commit is initiated
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027) * @old_buds: buds to be released after commit ends
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028) * @max_bud_cnt: maximum number of buds
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030) * @commit_sem: synchronizes committer with other processes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031) * @cmt_state: commit state
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032) * @cs_lock: commit state lock
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033) * @cmt_wq: wait queue to sleep on if the log is full and a commit is running
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035) * @big_lpt: flag that LPT is too big to write whole during commit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036) * @space_fixup: flag indicating that free space in LEBs needs to be cleaned up
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037) * @double_hash: flag indicating that we can do lookups by hash
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038) * @encrypted: flag indicating that this file system contains encrypted files
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039) * @no_chk_data_crc: do not check CRCs when reading data nodes (except during
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040) * recovery)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041) * @bulk_read: enable bulk-reads
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042) * @default_compr: default compression algorithm (%UBIFS_COMPR_LZO, etc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043) * @rw_incompat: the media is not R/W compatible
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044) * @assert_action: action to take when a ubifs_assert() fails
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045) * @authenticated: flag indigating the FS is mounted in authenticated mode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047) * @tnc_mutex: protects the Tree Node Cache (TNC), @zroot, @cnext, @enext, and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048) * @calc_idx_sz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049) * @zroot: zbranch which points to the root index node and znode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050) * @cnext: next znode to commit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051) * @enext: next znode to commit to empty space
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052) * @gap_lebs: array of LEBs used by the in-gaps commit method
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053) * @cbuf: commit buffer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054) * @ileb_buf: buffer for commit in-the-gaps method
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055) * @ileb_len: length of data in ileb_buf
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056) * @ihead_lnum: LEB number of index head
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057) * @ihead_offs: offset of index head
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058) * @ilebs: pre-allocated index LEBs
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059) * @ileb_cnt: number of pre-allocated index LEBs
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060) * @ileb_nxt: next pre-allocated index LEBs
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061) * @old_idx: tree of index nodes obsoleted since the last commit start
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062) * @bottom_up_buf: a buffer which is used by 'dirty_cow_bottom_up()' in tnc.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064) * @mst_node: master node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065) * @mst_offs: offset of valid master node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067) * @max_bu_buf_len: maximum bulk-read buffer length
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068) * @bu_mutex: protects the pre-allocated bulk-read buffer and @c->bu
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069) * @bu: pre-allocated bulk-read information
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071) * @write_reserve_mutex: protects @write_reserve_buf
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072) * @write_reserve_buf: on the write path we allocate memory, which might
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073) * sometimes be unavailable, in which case we use this
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074) * write reserve buffer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076) * @log_lebs: number of logical eraseblocks in the log
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077) * @log_bytes: log size in bytes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078) * @log_last: last LEB of the log
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079) * @lpt_lebs: number of LEBs used for lprops table
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080) * @lpt_first: first LEB of the lprops table area
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081) * @lpt_last: last LEB of the lprops table area
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082) * @orph_lebs: number of LEBs used for the orphan area
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083) * @orph_first: first LEB of the orphan area
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084) * @orph_last: last LEB of the orphan area
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085) * @main_lebs: count of LEBs in the main area
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086) * @main_first: first LEB of the main area
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087) * @main_bytes: main area size in bytes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089) * @key_hash_type: type of the key hash
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090) * @key_hash: direntry key hash function
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091) * @key_fmt: key format
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092) * @key_len: key length
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093) * @hash_len: The length of the index node hashes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094) * @fanout: fanout of the index tree (number of links per indexing node)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096) * @min_io_size: minimal input/output unit size
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097) * @min_io_shift: number of bits in @min_io_size minus one
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098) * @max_write_size: maximum amount of bytes the underlying flash can write at a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099) * time (MTD write buffer size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100) * @max_write_shift: number of bits in @max_write_size minus one
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101) * @leb_size: logical eraseblock size in bytes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102) * @leb_start: starting offset of logical eraseblocks within physical
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103) * eraseblocks
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104) * @half_leb_size: half LEB size
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105) * @idx_leb_size: how many bytes of an LEB are effectively available when it is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106) * used to store indexing nodes (@leb_size - @max_idx_node_sz)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107) * @leb_cnt: count of logical eraseblocks
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108) * @max_leb_cnt: maximum count of logical eraseblocks
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109) * @ro_media: the underlying UBI volume is read-only
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110) * @ro_mount: the file-system was mounted as read-only
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111) * @ro_error: UBIFS switched to R/O mode because an error happened
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1112) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1113) * @dirty_pg_cnt: number of dirty pages (not used)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1114) * @dirty_zn_cnt: number of dirty znodes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1115) * @clean_zn_cnt: number of clean znodes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1116) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1117) * @space_lock: protects @bi and @lst
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1118) * @lst: lprops statistics
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1119) * @bi: budgeting information
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1120) * @calc_idx_sz: temporary variable which is used to calculate new index size
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1121) * (contains accurate new index size at end of TNC commit start)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1122) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1123) * @ref_node_alsz: size of the LEB reference node aligned to the min. flash
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1124) * I/O unit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1125) * @mst_node_alsz: master node aligned size
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1126) * @min_idx_node_sz: minimum indexing node aligned on 8-bytes boundary
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1127) * @max_idx_node_sz: maximum indexing node aligned on 8-bytes boundary
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1128) * @max_inode_sz: maximum possible inode size in bytes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1129) * @max_znode_sz: size of znode in bytes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1130) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1131) * @leb_overhead: how many bytes are wasted in an LEB when it is filled with
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1132) * data nodes of maximum size - used in free space reporting
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1133) * @dead_wm: LEB dead space watermark
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1134) * @dark_wm: LEB dark space watermark
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1135) * @block_cnt: count of 4KiB blocks on the FS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1136) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1137) * @ranges: UBIFS node length ranges
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1138) * @ubi: UBI volume descriptor
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1139) * @di: UBI device information
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1140) * @vi: UBI volume information
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1141) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1142) * @orph_tree: rb-tree of orphan inode numbers
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1143) * @orph_list: list of orphan inode numbers in order added
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1144) * @orph_new: list of orphan inode numbers added since last commit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1145) * @orph_cnext: next orphan to commit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1146) * @orph_dnext: next orphan to delete
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1147) * @orphan_lock: lock for orph_tree and orph_new
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1148) * @orph_buf: buffer for orphan nodes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1149) * @new_orphans: number of orphans since last commit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1150) * @cmt_orphans: number of orphans being committed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1151) * @tot_orphans: number of orphans in the rb_tree
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1152) * @max_orphans: maximum number of orphans allowed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1153) * @ohead_lnum: orphan head LEB number
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1154) * @ohead_offs: orphan head offset
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1155) * @no_orphs: non-zero if there are no orphans
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1156) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1157) * @bgt: UBIFS background thread
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1158) * @bgt_name: background thread name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1159) * @need_bgt: if background thread should run
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1160) * @need_wbuf_sync: if write-buffers have to be synchronized
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1161) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1162) * @gc_lnum: LEB number used for garbage collection
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1163) * @sbuf: a buffer of LEB size used by GC and replay for scanning
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1164) * @idx_gc: list of index LEBs that have been garbage collected
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1165) * @idx_gc_cnt: number of elements on the idx_gc list
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1166) * @gc_seq: incremented for every non-index LEB garbage collected
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1167) * @gced_lnum: last non-index LEB that was garbage collected
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1168) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1169) * @infos_list: links all 'ubifs_info' objects
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1170) * @umount_mutex: serializes shrinker and un-mount
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1171) * @shrinker_run_no: shrinker run number
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1172) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1173) * @space_bits: number of bits needed to record free or dirty space
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1174) * @lpt_lnum_bits: number of bits needed to record a LEB number in the LPT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1175) * @lpt_offs_bits: number of bits needed to record an offset in the LPT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1176) * @lpt_spc_bits: number of bits needed to space in the LPT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1177) * @pcnt_bits: number of bits needed to record pnode or nnode number
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1178) * @lnum_bits: number of bits needed to record LEB number
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1179) * @nnode_sz: size of on-flash nnode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1180) * @pnode_sz: size of on-flash pnode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1181) * @ltab_sz: size of on-flash LPT lprops table
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1182) * @lsave_sz: size of on-flash LPT save table
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1183) * @pnode_cnt: number of pnodes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1184) * @nnode_cnt: number of nnodes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1185) * @lpt_hght: height of the LPT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1186) * @pnodes_have: number of pnodes in memory
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1187) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1188) * @lp_mutex: protects lprops table and all the other lprops-related fields
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1189) * @lpt_lnum: LEB number of the root nnode of the LPT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1190) * @lpt_offs: offset of the root nnode of the LPT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1191) * @nhead_lnum: LEB number of LPT head
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1192) * @nhead_offs: offset of LPT head
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1193) * @lpt_drty_flgs: dirty flags for LPT special nodes e.g. ltab
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1194) * @dirty_nn_cnt: number of dirty nnodes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1195) * @dirty_pn_cnt: number of dirty pnodes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1196) * @check_lpt_free: flag that indicates LPT GC may be needed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1197) * @lpt_sz: LPT size
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1198) * @lpt_nod_buf: buffer for an on-flash nnode or pnode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1199) * @lpt_buf: buffer of LEB size used by LPT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1200) * @nroot: address in memory of the root nnode of the LPT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1201) * @lpt_cnext: next LPT node to commit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1202) * @lpt_heap: array of heaps of categorized lprops
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1203) * @dirty_idx: a (reverse sorted) copy of the LPROPS_DIRTY_IDX heap as at
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1204) * previous commit start
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1205) * @uncat_list: list of un-categorized LEBs
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1206) * @empty_list: list of empty LEBs
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1207) * @freeable_list: list of freeable non-index LEBs (free + dirty == @leb_size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1208) * @frdi_idx_list: list of freeable index LEBs (free + dirty == @leb_size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1209) * @freeable_cnt: number of freeable LEBs in @freeable_list
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1210) * @in_a_category_cnt: count of lprops which are in a certain category, which
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1211) * basically meants that they were loaded from the flash
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1212) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1213) * @ltab_lnum: LEB number of LPT's own lprops table
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1214) * @ltab_offs: offset of LPT's own lprops table
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1215) * @ltab: LPT's own lprops table
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1216) * @ltab_cmt: LPT's own lprops table (commit copy)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1217) * @lsave_cnt: number of LEB numbers in LPT's save table
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1218) * @lsave_lnum: LEB number of LPT's save table
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1219) * @lsave_offs: offset of LPT's save table
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1220) * @lsave: LPT's save table
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1221) * @lscan_lnum: LEB number of last LPT scan
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1222) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1223) * @rp_size: size of the reserved pool in bytes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1224) * @report_rp_size: size of the reserved pool reported to user-space
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1225) * @rp_uid: reserved pool user ID
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1226) * @rp_gid: reserved pool group ID
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1227) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1228) * @hash_tfm: the hash transformation used for hashing nodes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1229) * @hmac_tfm: the HMAC transformation for this filesystem
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1230) * @hmac_desc_len: length of the HMAC used for authentication
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1231) * @auth_key_name: the authentication key name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1232) * @auth_hash_name: the name of the hash algorithm used for authentication
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1233) * @auth_hash_algo: the authentication hash used for this fs
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1234) * @log_hash: the log hash from the commit start node up to the latest reference
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1235) * node.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1236) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1237) * @empty: %1 if the UBI device is empty
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1238) * @need_recovery: %1 if the file-system needs recovery
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1239) * @replaying: %1 during journal replay
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1240) * @mounting: %1 while mounting
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1241) * @probing: %1 while attempting to mount if SB_SILENT mount flag is set
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1242) * @remounting_rw: %1 while re-mounting from R/O mode to R/W mode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1243) * @replay_list: temporary list used during journal replay
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1244) * @replay_buds: list of buds to replay
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1245) * @cs_sqnum: sequence number of first node in the log (commit start node)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1246) * @unclean_leb_list: LEBs to recover when re-mounting R/O mounted FS to R/W
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1247) * mode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1248) * @rcvrd_mst_node: recovered master node to write when re-mounting R/O mounted
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1249) * FS to R/W mode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1250) * @size_tree: inode size information for recovery
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1251) * @mount_opts: UBIFS-specific mount options
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1252) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1253) * @dbg: debugging-related information
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1254) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1255) struct ubifs_info {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1256) struct super_block *vfs_sb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1257) struct ubifs_sb_node *sup_node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1258)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1259) ino_t highest_inum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1260) unsigned long long max_sqnum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1261) unsigned long long cmt_no;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1262) spinlock_t cnt_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1263) int fmt_version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1264) int ro_compat_version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1265) unsigned char uuid[16];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1266)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1267) int lhead_lnum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1268) int lhead_offs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1269) int ltail_lnum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1270) struct mutex log_mutex;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1271) int min_log_bytes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1272) long long cmt_bud_bytes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1273)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1274) struct rb_root buds;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1275) long long bud_bytes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1276) spinlock_t buds_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1277) int jhead_cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1278) struct ubifs_jhead *jheads;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1279) long long max_bud_bytes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1280) long long bg_bud_bytes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1281) struct list_head old_buds;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1282) int max_bud_cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1283)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1284) struct rw_semaphore commit_sem;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1285) int cmt_state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1286) spinlock_t cs_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1287) wait_queue_head_t cmt_wq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1288)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1289) unsigned int big_lpt:1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1290) unsigned int space_fixup:1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1291) unsigned int double_hash:1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1292) unsigned int encrypted:1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1293) unsigned int no_chk_data_crc:1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1294) unsigned int bulk_read:1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1295) unsigned int default_compr:2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1296) unsigned int rw_incompat:1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1297) unsigned int assert_action:2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1298) unsigned int authenticated:1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1299) unsigned int superblock_need_write:1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1300)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1301) struct mutex tnc_mutex;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1302) struct ubifs_zbranch zroot;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1303) struct ubifs_znode *cnext;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1304) struct ubifs_znode *enext;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1305) int *gap_lebs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1306) void *cbuf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1307) void *ileb_buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1308) int ileb_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1309) int ihead_lnum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1310) int ihead_offs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1311) int *ilebs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1312) int ileb_cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1313) int ileb_nxt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1314) struct rb_root old_idx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1315) int *bottom_up_buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1316)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1317) struct ubifs_mst_node *mst_node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1318) int mst_offs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1319)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1320) int max_bu_buf_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1321) struct mutex bu_mutex;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1322) struct bu_info bu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1323)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1324) struct mutex write_reserve_mutex;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1325) void *write_reserve_buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1326)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1327) int log_lebs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1328) long long log_bytes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1329) int log_last;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1330) int lpt_lebs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1331) int lpt_first;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1332) int lpt_last;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1333) int orph_lebs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1334) int orph_first;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1335) int orph_last;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1336) int main_lebs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1337) int main_first;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1338) long long main_bytes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1339)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1340) uint8_t key_hash_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1341) uint32_t (*key_hash)(const char *str, int len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1342) int key_fmt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1343) int key_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1344) int hash_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1345) int fanout;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1346)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1347) int min_io_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1348) int min_io_shift;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1349) int max_write_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1350) int max_write_shift;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1351) int leb_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1352) int leb_start;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1353) int half_leb_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1354) int idx_leb_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1355) int leb_cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1356) int max_leb_cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1357) unsigned int ro_media:1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1358) unsigned int ro_mount:1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1359) unsigned int ro_error:1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1360)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1361) atomic_long_t dirty_pg_cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1362) atomic_long_t dirty_zn_cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1363) atomic_long_t clean_zn_cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1364)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1365) spinlock_t space_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1366) struct ubifs_lp_stats lst;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1367) struct ubifs_budg_info bi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1368) unsigned long long calc_idx_sz;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1369)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1370) int ref_node_alsz;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1371) int mst_node_alsz;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1372) int min_idx_node_sz;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1373) int max_idx_node_sz;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1374) long long max_inode_sz;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1375) int max_znode_sz;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1376)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1377) int leb_overhead;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1378) int dead_wm;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1379) int dark_wm;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1380) int block_cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1381)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1382) struct ubifs_node_range ranges[UBIFS_NODE_TYPES_CNT];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1383) struct ubi_volume_desc *ubi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1384) struct ubi_device_info di;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1385) struct ubi_volume_info vi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1386)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1387) struct rb_root orph_tree;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1388) struct list_head orph_list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1389) struct list_head orph_new;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1390) struct ubifs_orphan *orph_cnext;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1391) struct ubifs_orphan *orph_dnext;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1392) spinlock_t orphan_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1393) void *orph_buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1394) int new_orphans;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1395) int cmt_orphans;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1396) int tot_orphans;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1397) int max_orphans;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1398) int ohead_lnum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1399) int ohead_offs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1400) int no_orphs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1401)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1402) struct task_struct *bgt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1403) char bgt_name[sizeof(BGT_NAME_PATTERN) + 9];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1404) int need_bgt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1405) int need_wbuf_sync;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1406)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1407) int gc_lnum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1408) void *sbuf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1409) struct list_head idx_gc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1410) int idx_gc_cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1411) int gc_seq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1412) int gced_lnum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1413)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1414) struct list_head infos_list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1415) struct mutex umount_mutex;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1416) unsigned int shrinker_run_no;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1417)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1418) int space_bits;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1419) int lpt_lnum_bits;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1420) int lpt_offs_bits;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1421) int lpt_spc_bits;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1422) int pcnt_bits;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1423) int lnum_bits;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1424) int nnode_sz;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1425) int pnode_sz;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1426) int ltab_sz;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1427) int lsave_sz;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1428) int pnode_cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1429) int nnode_cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1430) int lpt_hght;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1431) int pnodes_have;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1432)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1433) struct mutex lp_mutex;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1434) int lpt_lnum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1435) int lpt_offs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1436) int nhead_lnum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1437) int nhead_offs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1438) int lpt_drty_flgs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1439) int dirty_nn_cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1440) int dirty_pn_cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1441) int check_lpt_free;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1442) long long lpt_sz;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1443) void *lpt_nod_buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1444) void *lpt_buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1445) struct ubifs_nnode *nroot;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1446) struct ubifs_cnode *lpt_cnext;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1447) struct ubifs_lpt_heap lpt_heap[LPROPS_HEAP_CNT];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1448) struct ubifs_lpt_heap dirty_idx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1449) struct list_head uncat_list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1450) struct list_head empty_list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1451) struct list_head freeable_list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1452) struct list_head frdi_idx_list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1453) int freeable_cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1454) int in_a_category_cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1455)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1456) int ltab_lnum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1457) int ltab_offs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1458) struct ubifs_lpt_lprops *ltab;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1459) struct ubifs_lpt_lprops *ltab_cmt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1460) int lsave_cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1461) int lsave_lnum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1462) int lsave_offs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1463) int *lsave;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1464) int lscan_lnum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1465)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1466) long long rp_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1467) long long report_rp_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1468) kuid_t rp_uid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1469) kgid_t rp_gid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1470)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1471) struct crypto_shash *hash_tfm;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1472) struct crypto_shash *hmac_tfm;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1473) int hmac_desc_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1474) char *auth_key_name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1475) char *auth_hash_name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1476) enum hash_algo auth_hash_algo;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1477)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1478) struct shash_desc *log_hash;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1479)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1480) /* The below fields are used only during mounting and re-mounting */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1481) unsigned int empty:1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1482) unsigned int need_recovery:1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1483) unsigned int replaying:1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1484) unsigned int mounting:1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1485) unsigned int remounting_rw:1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1486) unsigned int probing:1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1487) struct list_head replay_list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1488) struct list_head replay_buds;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1489) unsigned long long cs_sqnum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1490) struct list_head unclean_leb_list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1491) struct ubifs_mst_node *rcvrd_mst_node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1492) struct rb_root size_tree;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1493) struct ubifs_mount_opts mount_opts;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1494)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1495) struct ubifs_debug_info *dbg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1496) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1497)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1498) extern struct list_head ubifs_infos;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1499) extern spinlock_t ubifs_infos_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1500) extern atomic_long_t ubifs_clean_zn_cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1501) extern const struct super_operations ubifs_super_operations;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1502) extern const struct address_space_operations ubifs_file_address_operations;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1503) extern const struct file_operations ubifs_file_operations;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1504) extern const struct inode_operations ubifs_file_inode_operations;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1505) extern const struct file_operations ubifs_dir_operations;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1506) extern const struct inode_operations ubifs_dir_inode_operations;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1507) extern const struct inode_operations ubifs_symlink_inode_operations;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1508) extern struct ubifs_compressor *ubifs_compressors[UBIFS_COMPR_TYPES_CNT];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1509) extern int ubifs_default_version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1510)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1511) /* auth.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1512) static inline int ubifs_authenticated(const struct ubifs_info *c)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1513) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1514) return (IS_ENABLED(CONFIG_UBIFS_FS_AUTHENTICATION)) && c->authenticated;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1515) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1516)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1517) struct shash_desc *__ubifs_hash_get_desc(const struct ubifs_info *c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1518) static inline struct shash_desc *ubifs_hash_get_desc(const struct ubifs_info *c)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1519) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1520) return ubifs_authenticated(c) ? __ubifs_hash_get_desc(c) : NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1521) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1522)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1523) static inline int ubifs_shash_init(const struct ubifs_info *c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1524) struct shash_desc *desc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1525) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1526) if (ubifs_authenticated(c))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1527) return crypto_shash_init(desc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1528) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1529) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1530) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1531)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1532) static inline int ubifs_shash_update(const struct ubifs_info *c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1533) struct shash_desc *desc, const void *buf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1534) unsigned int len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1535) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1536) int err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1537)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1538) if (ubifs_authenticated(c)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1539) err = crypto_shash_update(desc, buf, len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1540) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1541) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1542) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1543)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1544) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1545) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1546)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1547) static inline int ubifs_shash_final(const struct ubifs_info *c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1548) struct shash_desc *desc, u8 *out)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1549) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1550) return ubifs_authenticated(c) ? crypto_shash_final(desc, out) : 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1551) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1552)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1553) int __ubifs_node_calc_hash(const struct ubifs_info *c, const void *buf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1554) u8 *hash);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1555) static inline int ubifs_node_calc_hash(const struct ubifs_info *c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1556) const void *buf, u8 *hash)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1557) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1558) if (ubifs_authenticated(c))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1559) return __ubifs_node_calc_hash(c, buf, hash);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1560) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1561) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1562) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1563)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1564) int ubifs_prepare_auth_node(struct ubifs_info *c, void *node,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1565) struct shash_desc *inhash);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1566)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1567) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1568) * ubifs_check_hash - compare two hashes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1569) * @c: UBIFS file-system description object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1570) * @expected: first hash
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1571) * @got: second hash
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1572) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1573) * Compare two hashes @expected and @got. Returns 0 when they are equal, a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1574) * negative error code otherwise.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1575) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1576) static inline int ubifs_check_hash(const struct ubifs_info *c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1577) const u8 *expected, const u8 *got)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1578) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1579) return crypto_memneq(expected, got, c->hash_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1580) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1581)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1582) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1583) * ubifs_check_hmac - compare two HMACs
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1584) * @c: UBIFS file-system description object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1585) * @expected: first HMAC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1586) * @got: second HMAC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1587) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1588) * Compare two hashes @expected and @got. Returns 0 when they are equal, a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1589) * negative error code otherwise.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1590) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1591) static inline int ubifs_check_hmac(const struct ubifs_info *c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1592) const u8 *expected, const u8 *got)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1593) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1594) return crypto_memneq(expected, got, c->hmac_desc_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1595) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1596)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1597) void ubifs_bad_hash(const struct ubifs_info *c, const void *node,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1598) const u8 *hash, int lnum, int offs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1599)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1600) int __ubifs_node_check_hash(const struct ubifs_info *c, const void *buf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1601) const u8 *expected);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1602) static inline int ubifs_node_check_hash(const struct ubifs_info *c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1603) const void *buf, const u8 *expected)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1604) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1605) if (ubifs_authenticated(c))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1606) return __ubifs_node_check_hash(c, buf, expected);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1607) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1608) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1609) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1610)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1611) int ubifs_init_authentication(struct ubifs_info *c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1612) void __ubifs_exit_authentication(struct ubifs_info *c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1613) static inline void ubifs_exit_authentication(struct ubifs_info *c)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1614) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1615) if (ubifs_authenticated(c))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1616) __ubifs_exit_authentication(c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1617) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1618)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1619) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1620) * ubifs_branch_hash - returns a pointer to the hash of a branch
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1621) * @c: UBIFS file-system description object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1622) * @br: branch to get the hash from
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1623) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1624) * This returns a pointer to the hash of a branch. Since the key already is a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1625) * dynamically sized object we cannot use a struct member here.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1626) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1627) static inline u8 *ubifs_branch_hash(struct ubifs_info *c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1628) struct ubifs_branch *br)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1629) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1630) return (void *)br + sizeof(*br) + c->key_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1631) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1632)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1633) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1634) * ubifs_copy_hash - copy a hash
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1635) * @c: UBIFS file-system description object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1636) * @from: source hash
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1637) * @to: destination hash
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1638) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1639) * With authentication this copies a hash, otherwise does nothing.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1640) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1641) static inline void ubifs_copy_hash(const struct ubifs_info *c, const u8 *from,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1642) u8 *to)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1643) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1644) if (ubifs_authenticated(c))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1645) memcpy(to, from, c->hash_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1646) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1647)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1648) int __ubifs_node_insert_hmac(const struct ubifs_info *c, void *buf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1649) int len, int ofs_hmac);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1650) static inline int ubifs_node_insert_hmac(const struct ubifs_info *c, void *buf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1651) int len, int ofs_hmac)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1652) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1653) if (ubifs_authenticated(c))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1654) return __ubifs_node_insert_hmac(c, buf, len, ofs_hmac);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1655) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1656) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1657) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1658)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1659) int __ubifs_node_verify_hmac(const struct ubifs_info *c, const void *buf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1660) int len, int ofs_hmac);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1661) static inline int ubifs_node_verify_hmac(const struct ubifs_info *c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1662) const void *buf, int len, int ofs_hmac)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1663) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1664) if (ubifs_authenticated(c))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1665) return __ubifs_node_verify_hmac(c, buf, len, ofs_hmac);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1666) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1667) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1668) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1669)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1670) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1671) * ubifs_auth_node_sz - returns the size of an authentication node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1672) * @c: UBIFS file-system description object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1673) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1674) * This function returns the size of an authentication node which can
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1675) * be 0 for unauthenticated filesystems or the real size of an auth node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1676) * authentication is enabled.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1677) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1678) static inline int ubifs_auth_node_sz(const struct ubifs_info *c)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1679) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1680) if (ubifs_authenticated(c))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1681) return sizeof(struct ubifs_auth_node) + c->hmac_desc_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1682) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1683) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1684) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1685) int ubifs_sb_verify_signature(struct ubifs_info *c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1686) const struct ubifs_sb_node *sup);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1687) bool ubifs_hmac_zero(struct ubifs_info *c, const u8 *hmac);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1688)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1689) int ubifs_hmac_wkm(struct ubifs_info *c, u8 *hmac);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1690)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1691) int __ubifs_shash_copy_state(const struct ubifs_info *c, struct shash_desc *src,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1692) struct shash_desc *target);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1693) static inline int ubifs_shash_copy_state(const struct ubifs_info *c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1694) struct shash_desc *src,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1695) struct shash_desc *target)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1696) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1697) if (ubifs_authenticated(c))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1698) return __ubifs_shash_copy_state(c, src, target);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1699) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1700) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1701) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1702)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1703) /* io.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1704) void ubifs_ro_mode(struct ubifs_info *c, int err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1705) int ubifs_leb_read(const struct ubifs_info *c, int lnum, void *buf, int offs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1706) int len, int even_ebadmsg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1707) int ubifs_leb_write(struct ubifs_info *c, int lnum, const void *buf, int offs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1708) int len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1709) int ubifs_leb_change(struct ubifs_info *c, int lnum, const void *buf, int len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1710) int ubifs_leb_unmap(struct ubifs_info *c, int lnum);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1711) int ubifs_leb_map(struct ubifs_info *c, int lnum);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1712) int ubifs_is_mapped(const struct ubifs_info *c, int lnum);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1713) int ubifs_wbuf_write_nolock(struct ubifs_wbuf *wbuf, void *buf, int len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1714) int ubifs_wbuf_seek_nolock(struct ubifs_wbuf *wbuf, int lnum, int offs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1715) int ubifs_wbuf_init(struct ubifs_info *c, struct ubifs_wbuf *wbuf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1716) int ubifs_read_node(const struct ubifs_info *c, void *buf, int type, int len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1717) int lnum, int offs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1718) int ubifs_read_node_wbuf(struct ubifs_wbuf *wbuf, void *buf, int type, int len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1719) int lnum, int offs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1720) int ubifs_write_node(struct ubifs_info *c, void *node, int len, int lnum,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1721) int offs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1722) int ubifs_write_node_hmac(struct ubifs_info *c, void *buf, int len, int lnum,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1723) int offs, int hmac_offs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1724) int ubifs_check_node(const struct ubifs_info *c, const void *buf, int lnum,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1725) int offs, int quiet, int must_chk_crc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1726) void ubifs_init_node(struct ubifs_info *c, void *buf, int len, int pad);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1727) void ubifs_crc_node(struct ubifs_info *c, void *buf, int len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1728) void ubifs_prepare_node(struct ubifs_info *c, void *buf, int len, int pad);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1729) int ubifs_prepare_node_hmac(struct ubifs_info *c, void *node, int len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1730) int hmac_offs, int pad);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1731) void ubifs_prep_grp_node(struct ubifs_info *c, void *node, int len, int last);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1732) int ubifs_io_init(struct ubifs_info *c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1733) void ubifs_pad(const struct ubifs_info *c, void *buf, int pad);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1734) int ubifs_wbuf_sync_nolock(struct ubifs_wbuf *wbuf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1735) int ubifs_bg_wbufs_sync(struct ubifs_info *c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1736) void ubifs_wbuf_add_ino_nolock(struct ubifs_wbuf *wbuf, ino_t inum);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1737) int ubifs_sync_wbufs_by_inode(struct ubifs_info *c, struct inode *inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1738)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1739) /* scan.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1740) struct ubifs_scan_leb *ubifs_scan(const struct ubifs_info *c, int lnum,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1741) int offs, void *sbuf, int quiet);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1742) void ubifs_scan_destroy(struct ubifs_scan_leb *sleb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1743) int ubifs_scan_a_node(const struct ubifs_info *c, void *buf, int len, int lnum,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1744) int offs, int quiet);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1745) struct ubifs_scan_leb *ubifs_start_scan(const struct ubifs_info *c, int lnum,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1746) int offs, void *sbuf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1747) void ubifs_end_scan(const struct ubifs_info *c, struct ubifs_scan_leb *sleb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1748) int lnum, int offs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1749) int ubifs_add_snod(const struct ubifs_info *c, struct ubifs_scan_leb *sleb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1750) void *buf, int offs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1751) void ubifs_scanned_corruption(const struct ubifs_info *c, int lnum, int offs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1752) void *buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1753)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1754) /* log.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1755) void ubifs_add_bud(struct ubifs_info *c, struct ubifs_bud *bud);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1756) void ubifs_create_buds_lists(struct ubifs_info *c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1757) int ubifs_add_bud_to_log(struct ubifs_info *c, int jhead, int lnum, int offs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1758) struct ubifs_bud *ubifs_search_bud(struct ubifs_info *c, int lnum);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1759) struct ubifs_wbuf *ubifs_get_wbuf(struct ubifs_info *c, int lnum);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1760) int ubifs_log_start_commit(struct ubifs_info *c, int *ltail_lnum);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1761) int ubifs_log_end_commit(struct ubifs_info *c, int new_ltail_lnum);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1762) int ubifs_log_post_commit(struct ubifs_info *c, int old_ltail_lnum);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1763) int ubifs_consolidate_log(struct ubifs_info *c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1764)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1765) /* journal.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1766) int ubifs_jnl_update(struct ubifs_info *c, const struct inode *dir,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1767) const struct fscrypt_name *nm, const struct inode *inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1768) int deletion, int xent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1769) int ubifs_jnl_write_data(struct ubifs_info *c, const struct inode *inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1770) const union ubifs_key *key, const void *buf, int len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1771) int ubifs_jnl_write_inode(struct ubifs_info *c, const struct inode *inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1772) int ubifs_jnl_delete_inode(struct ubifs_info *c, const struct inode *inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1773) int ubifs_jnl_xrename(struct ubifs_info *c, const struct inode *fst_dir,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1774) const struct inode *fst_inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1775) const struct fscrypt_name *fst_nm,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1776) const struct inode *snd_dir,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1777) const struct inode *snd_inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1778) const struct fscrypt_name *snd_nm, int sync);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1779) int ubifs_jnl_rename(struct ubifs_info *c, const struct inode *old_dir,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1780) const struct inode *old_inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1781) const struct fscrypt_name *old_nm,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1782) const struct inode *new_dir,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1783) const struct inode *new_inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1784) const struct fscrypt_name *new_nm,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1785) const struct inode *whiteout, int sync);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1786) int ubifs_jnl_truncate(struct ubifs_info *c, const struct inode *inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1787) loff_t old_size, loff_t new_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1788) int ubifs_jnl_delete_xattr(struct ubifs_info *c, const struct inode *host,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1789) const struct inode *inode, const struct fscrypt_name *nm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1790) int ubifs_jnl_change_xattr(struct ubifs_info *c, const struct inode *inode1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1791) const struct inode *inode2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1792)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1793) /* budget.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1794) int ubifs_budget_space(struct ubifs_info *c, struct ubifs_budget_req *req);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1795) void ubifs_release_budget(struct ubifs_info *c, struct ubifs_budget_req *req);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1796) void ubifs_release_dirty_inode_budget(struct ubifs_info *c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1797) struct ubifs_inode *ui);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1798) int ubifs_budget_inode_op(struct ubifs_info *c, struct inode *inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1799) struct ubifs_budget_req *req);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1800) void ubifs_release_ino_dirty(struct ubifs_info *c, struct inode *inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1801) struct ubifs_budget_req *req);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1802) void ubifs_cancel_ino_op(struct ubifs_info *c, struct inode *inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1803) struct ubifs_budget_req *req);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1804) long long ubifs_get_free_space(struct ubifs_info *c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1805) long long ubifs_get_free_space_nolock(struct ubifs_info *c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1806) int ubifs_calc_min_idx_lebs(struct ubifs_info *c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1807) void ubifs_convert_page_budget(struct ubifs_info *c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1808) long long ubifs_reported_space(const struct ubifs_info *c, long long free);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1809) long long ubifs_calc_available(const struct ubifs_info *c, int min_idx_lebs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1810)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1811) /* find.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1812) int ubifs_find_free_space(struct ubifs_info *c, int min_space, int *offs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1813) int squeeze);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1814) int ubifs_find_free_leb_for_idx(struct ubifs_info *c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1815) int ubifs_find_dirty_leb(struct ubifs_info *c, struct ubifs_lprops *ret_lp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1816) int min_space, int pick_free);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1817) int ubifs_find_dirty_idx_leb(struct ubifs_info *c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1818) int ubifs_save_dirty_idx_lnums(struct ubifs_info *c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1819)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1820) /* tnc.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1821) int ubifs_lookup_level0(struct ubifs_info *c, const union ubifs_key *key,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1822) struct ubifs_znode **zn, int *n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1823) int ubifs_tnc_lookup_nm(struct ubifs_info *c, const union ubifs_key *key,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1824) void *node, const struct fscrypt_name *nm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1825) int ubifs_tnc_lookup_dh(struct ubifs_info *c, const union ubifs_key *key,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1826) void *node, uint32_t secondary_hash);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1827) int ubifs_tnc_locate(struct ubifs_info *c, const union ubifs_key *key,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1828) void *node, int *lnum, int *offs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1829) int ubifs_tnc_add(struct ubifs_info *c, const union ubifs_key *key, int lnum,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1830) int offs, int len, const u8 *hash);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1831) int ubifs_tnc_replace(struct ubifs_info *c, const union ubifs_key *key,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1832) int old_lnum, int old_offs, int lnum, int offs, int len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1833) int ubifs_tnc_add_nm(struct ubifs_info *c, const union ubifs_key *key,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1834) int lnum, int offs, int len, const u8 *hash,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1835) const struct fscrypt_name *nm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1836) int ubifs_tnc_remove(struct ubifs_info *c, const union ubifs_key *key);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1837) int ubifs_tnc_remove_nm(struct ubifs_info *c, const union ubifs_key *key,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1838) const struct fscrypt_name *nm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1839) int ubifs_tnc_remove_dh(struct ubifs_info *c, const union ubifs_key *key,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1840) uint32_t cookie);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1841) int ubifs_tnc_remove_range(struct ubifs_info *c, union ubifs_key *from_key,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1842) union ubifs_key *to_key);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1843) int ubifs_tnc_remove_ino(struct ubifs_info *c, ino_t inum);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1844) struct ubifs_dent_node *ubifs_tnc_next_ent(struct ubifs_info *c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1845) union ubifs_key *key,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1846) const struct fscrypt_name *nm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1847) void ubifs_tnc_close(struct ubifs_info *c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1848) int ubifs_tnc_has_node(struct ubifs_info *c, union ubifs_key *key, int level,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1849) int lnum, int offs, int is_idx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1850) int ubifs_dirty_idx_node(struct ubifs_info *c, union ubifs_key *key, int level,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1851) int lnum, int offs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1852) /* Shared by tnc.c for tnc_commit.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1853) void destroy_old_idx(struct ubifs_info *c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1854) 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 1855) int lnum, int offs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1856) int insert_old_idx_znode(struct ubifs_info *c, struct ubifs_znode *znode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1857) int ubifs_tnc_get_bu_keys(struct ubifs_info *c, struct bu_info *bu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1858) int ubifs_tnc_bulk_read(struct ubifs_info *c, struct bu_info *bu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1859)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1860) /* tnc_misc.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1861) struct ubifs_znode *ubifs_tnc_levelorder_next(const struct ubifs_info *c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1862) struct ubifs_znode *zr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1863) struct ubifs_znode *znode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1864) int ubifs_search_zbranch(const struct ubifs_info *c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1865) const struct ubifs_znode *znode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1866) const union ubifs_key *key, int *n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1867) struct ubifs_znode *ubifs_tnc_postorder_first(struct ubifs_znode *znode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1868) struct ubifs_znode *ubifs_tnc_postorder_next(const struct ubifs_info *c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1869) struct ubifs_znode *znode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1870) long ubifs_destroy_tnc_subtree(const struct ubifs_info *c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1871) struct ubifs_znode *zr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1872) struct ubifs_znode *ubifs_load_znode(struct ubifs_info *c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1873) struct ubifs_zbranch *zbr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1874) struct ubifs_znode *parent, int iip);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1875) int ubifs_tnc_read_node(struct ubifs_info *c, struct ubifs_zbranch *zbr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1876) void *node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1877)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1878) /* tnc_commit.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1879) int ubifs_tnc_start_commit(struct ubifs_info *c, struct ubifs_zbranch *zroot);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1880) int ubifs_tnc_end_commit(struct ubifs_info *c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1881)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1882) /* shrinker.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1883) unsigned long ubifs_shrink_scan(struct shrinker *shrink,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1884) struct shrink_control *sc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1885) unsigned long ubifs_shrink_count(struct shrinker *shrink,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1886) struct shrink_control *sc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1887)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1888) /* commit.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1889) int ubifs_bg_thread(void *info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1890) void ubifs_commit_required(struct ubifs_info *c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1891) void ubifs_request_bg_commit(struct ubifs_info *c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1892) int ubifs_run_commit(struct ubifs_info *c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1893) void ubifs_recovery_commit(struct ubifs_info *c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1894) int ubifs_gc_should_commit(struct ubifs_info *c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1895) void ubifs_wait_for_commit(struct ubifs_info *c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1896)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1897) /* master.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1898) int ubifs_compare_master_node(struct ubifs_info *c, void *m1, void *m2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1899) int ubifs_read_master(struct ubifs_info *c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1900) int ubifs_write_master(struct ubifs_info *c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1901)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1902) /* sb.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1903) int ubifs_read_superblock(struct ubifs_info *c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1904) int ubifs_write_sb_node(struct ubifs_info *c, struct ubifs_sb_node *sup);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1905) int ubifs_fixup_free_space(struct ubifs_info *c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1906) int ubifs_enable_encryption(struct ubifs_info *c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1907)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1908) /* replay.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1909) int ubifs_validate_entry(struct ubifs_info *c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1910) const struct ubifs_dent_node *dent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1911) int ubifs_replay_journal(struct ubifs_info *c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1912)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1913) /* gc.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1914) int ubifs_garbage_collect(struct ubifs_info *c, int anyway);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1915) int ubifs_gc_start_commit(struct ubifs_info *c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1916) int ubifs_gc_end_commit(struct ubifs_info *c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1917) void ubifs_destroy_idx_gc(struct ubifs_info *c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1918) int ubifs_get_idx_gc_leb(struct ubifs_info *c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1919) int ubifs_garbage_collect_leb(struct ubifs_info *c, struct ubifs_lprops *lp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1920)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1921) /* orphan.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1922) int ubifs_add_orphan(struct ubifs_info *c, ino_t inum);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1923) void ubifs_delete_orphan(struct ubifs_info *c, ino_t inum);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1924) int ubifs_orphan_start_commit(struct ubifs_info *c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1925) int ubifs_orphan_end_commit(struct ubifs_info *c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1926) int ubifs_mount_orphans(struct ubifs_info *c, int unclean, int read_only);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1927) int ubifs_clear_orphans(struct ubifs_info *c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1928)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1929) /* lpt.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1930) int ubifs_calc_lpt_geom(struct ubifs_info *c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1931) int ubifs_create_dflt_lpt(struct ubifs_info *c, int *main_lebs, int lpt_first,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1932) int *lpt_lebs, int *big_lpt, u8 *hash);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1933) int ubifs_lpt_init(struct ubifs_info *c, int rd, int wr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1934) struct ubifs_lprops *ubifs_lpt_lookup(struct ubifs_info *c, int lnum);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1935) struct ubifs_lprops *ubifs_lpt_lookup_dirty(struct ubifs_info *c, int lnum);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1936) int ubifs_lpt_scan_nolock(struct ubifs_info *c, int start_lnum, int end_lnum,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1937) ubifs_lpt_scan_callback scan_cb, void *data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1938)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1939) /* Shared by lpt.c for lpt_commit.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1940) void ubifs_pack_lsave(struct ubifs_info *c, void *buf, int *lsave);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1941) void ubifs_pack_ltab(struct ubifs_info *c, void *buf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1942) struct ubifs_lpt_lprops *ltab);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1943) void ubifs_pack_pnode(struct ubifs_info *c, void *buf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1944) struct ubifs_pnode *pnode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1945) void ubifs_pack_nnode(struct ubifs_info *c, void *buf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1946) struct ubifs_nnode *nnode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1947) struct ubifs_pnode *ubifs_get_pnode(struct ubifs_info *c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1948) struct ubifs_nnode *parent, int iip);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1949) struct ubifs_nnode *ubifs_get_nnode(struct ubifs_info *c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1950) struct ubifs_nnode *parent, int iip);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1951) struct ubifs_pnode *ubifs_pnode_lookup(struct ubifs_info *c, int i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1952) int ubifs_read_nnode(struct ubifs_info *c, struct ubifs_nnode *parent, int iip);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1953) void ubifs_add_lpt_dirt(struct ubifs_info *c, int lnum, int dirty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1954) void ubifs_add_nnode_dirt(struct ubifs_info *c, struct ubifs_nnode *nnode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1955) uint32_t ubifs_unpack_bits(const struct ubifs_info *c, uint8_t **addr, int *pos, int nrbits);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1956) struct ubifs_nnode *ubifs_first_nnode(struct ubifs_info *c, int *hght);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1957) /* Needed only in debugging code in lpt_commit.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1958) int ubifs_unpack_nnode(const struct ubifs_info *c, void *buf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1959) struct ubifs_nnode *nnode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1960) int ubifs_lpt_calc_hash(struct ubifs_info *c, u8 *hash);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1961)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1962) /* lpt_commit.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1963) int ubifs_lpt_start_commit(struct ubifs_info *c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1964) int ubifs_lpt_end_commit(struct ubifs_info *c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1965) int ubifs_lpt_post_commit(struct ubifs_info *c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1966) void ubifs_lpt_free(struct ubifs_info *c, int wr_only);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1967)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1968) /* lprops.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1969) const struct ubifs_lprops *ubifs_change_lp(struct ubifs_info *c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1970) const struct ubifs_lprops *lp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1971) int free, int dirty, int flags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1972) int idx_gc_cnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1973) void ubifs_get_lp_stats(struct ubifs_info *c, struct ubifs_lp_stats *lst);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1974) void ubifs_add_to_cat(struct ubifs_info *c, struct ubifs_lprops *lprops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1975) int cat);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1976) void ubifs_replace_cat(struct ubifs_info *c, struct ubifs_lprops *old_lprops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1977) struct ubifs_lprops *new_lprops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1978) void ubifs_ensure_cat(struct ubifs_info *c, struct ubifs_lprops *lprops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1979) int ubifs_categorize_lprops(const struct ubifs_info *c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1980) const struct ubifs_lprops *lprops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1981) int ubifs_change_one_lp(struct ubifs_info *c, int lnum, int free, int dirty,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1982) int flags_set, int flags_clean, int idx_gc_cnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1983) int ubifs_update_one_lp(struct ubifs_info *c, int lnum, int free, int dirty,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1984) int flags_set, int flags_clean);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1985) int ubifs_read_one_lp(struct ubifs_info *c, int lnum, struct ubifs_lprops *lp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1986) const struct ubifs_lprops *ubifs_fast_find_free(struct ubifs_info *c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1987) const struct ubifs_lprops *ubifs_fast_find_empty(struct ubifs_info *c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1988) const struct ubifs_lprops *ubifs_fast_find_freeable(struct ubifs_info *c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1989) const struct ubifs_lprops *ubifs_fast_find_frdi_idx(struct ubifs_info *c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1990) int ubifs_calc_dark(const struct ubifs_info *c, int spc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1991)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1992) /* file.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1993) int ubifs_fsync(struct file *file, loff_t start, loff_t end, int datasync);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1994) int ubifs_setattr(struct dentry *dentry, struct iattr *attr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1995) int ubifs_update_time(struct inode *inode, struct timespec64 *time, int flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1996)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1997) /* dir.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1998) struct inode *ubifs_new_inode(struct ubifs_info *c, struct inode *dir,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1999) umode_t mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2000) int ubifs_getattr(const struct path *path, struct kstat *stat,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2001) u32 request_mask, unsigned int flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2002) int ubifs_check_dir_empty(struct inode *dir);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2003)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2004) /* xattr.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2005) extern const struct xattr_handler *ubifs_xattr_handlers[];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2006) ssize_t ubifs_listxattr(struct dentry *dentry, char *buffer, size_t size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2007) int ubifs_xattr_set(struct inode *host, const char *name, const void *value,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2008) size_t size, int flags, bool check_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2009) ssize_t ubifs_xattr_get(struct inode *host, const char *name, void *buf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2010) size_t size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2011)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2012) #ifdef CONFIG_UBIFS_FS_XATTR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2013) void ubifs_evict_xattr_inode(struct ubifs_info *c, ino_t xattr_inum);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2014) int ubifs_purge_xattrs(struct inode *host);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2015) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2016) static inline void ubifs_evict_xattr_inode(struct ubifs_info *c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2017) ino_t xattr_inum) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2018) static inline int ubifs_purge_xattrs(struct inode *host)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2019) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2020) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2021) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2022) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2023)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2024) #ifdef CONFIG_UBIFS_FS_SECURITY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2025) extern int ubifs_init_security(struct inode *dentry, struct inode *inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2026) const struct qstr *qstr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2027) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2028) static inline int ubifs_init_security(struct inode *dentry,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2029) struct inode *inode, const struct qstr *qstr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2030) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2031) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2032) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2033) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2034)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2035)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2036) /* super.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2037) struct inode *ubifs_iget(struct super_block *sb, unsigned long inum);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2038)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2039) /* recovery.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2040) int ubifs_recover_master_node(struct ubifs_info *c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2041) int ubifs_write_rcvrd_mst_node(struct ubifs_info *c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2042) struct ubifs_scan_leb *ubifs_recover_leb(struct ubifs_info *c, int lnum,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2043) int offs, void *sbuf, int jhead);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2044) struct ubifs_scan_leb *ubifs_recover_log_leb(struct ubifs_info *c, int lnum,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2045) int offs, void *sbuf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2046) int ubifs_recover_inl_heads(struct ubifs_info *c, void *sbuf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2047) int ubifs_clean_lebs(struct ubifs_info *c, void *sbuf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2048) int ubifs_rcvry_gc_commit(struct ubifs_info *c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2049) int ubifs_recover_size_accum(struct ubifs_info *c, union ubifs_key *key,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2050) int deletion, loff_t new_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2051) int ubifs_recover_size(struct ubifs_info *c, bool in_place);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2052) void ubifs_destroy_size_tree(struct ubifs_info *c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2053)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2054) /* ioctl.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2055) long ubifs_ioctl(struct file *file, unsigned int cmd, unsigned long arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2056) void ubifs_set_inode_flags(struct inode *inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2057) #ifdef CONFIG_COMPAT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2058) long ubifs_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2059) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2060)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2061) /* compressor.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2062) int __init ubifs_compressors_init(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2063) void ubifs_compressors_exit(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2064) void ubifs_compress(const struct ubifs_info *c, const void *in_buf, int in_len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2065) void *out_buf, int *out_len, int *compr_type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2066) int ubifs_decompress(const struct ubifs_info *c, const void *buf, int len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2067) void *out, int *out_len, int compr_type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2068)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2069) #include "debug.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2070) #include "misc.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2071) #include "key.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2072)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2073) #ifndef CONFIG_FS_ENCRYPTION
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2074) static inline int ubifs_encrypt(const struct inode *inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2075) struct ubifs_data_node *dn,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2076) unsigned int in_len, unsigned int *out_len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2077) int block)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2078) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2079) struct ubifs_info *c = inode->i_sb->s_fs_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2080) ubifs_assert(c, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2081) return -EOPNOTSUPP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2082) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2083) static inline int ubifs_decrypt(const struct inode *inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2084) struct ubifs_data_node *dn,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2085) unsigned int *out_len, int block)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2086) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2087) struct ubifs_info *c = inode->i_sb->s_fs_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2088) ubifs_assert(c, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2089) return -EOPNOTSUPP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2090) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2091) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2092) /* crypto.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2093) int ubifs_encrypt(const struct inode *inode, struct ubifs_data_node *dn,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2094) unsigned int in_len, unsigned int *out_len, int block);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2095) int ubifs_decrypt(const struct inode *inode, struct ubifs_data_node *dn,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2096) unsigned int *out_len, int block);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2097) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2098)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2099) extern const struct fscrypt_operations ubifs_crypt_operations;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2101) /* Normal UBIFS messages */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2102) __printf(2, 3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2103) void ubifs_msg(const struct ubifs_info *c, const char *fmt, ...);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2104) __printf(2, 3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2105) void ubifs_err(const struct ubifs_info *c, const char *fmt, ...);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2106) __printf(2, 3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2107) void ubifs_warn(const struct ubifs_info *c, const char *fmt, ...);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2108) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2109) * A conditional variant of 'ubifs_err()' which doesn't output anything
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2110) * if probing (ie. SB_SILENT set).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2111) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2112) #define ubifs_errc(c, fmt, ...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2113) do { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2114) if (!(c)->probing) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2115) ubifs_err(c, fmt, ##__VA_ARGS__); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2116) } while (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2117)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2118) #endif /* !__UBIFS_H__ */