Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^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__ */