// SPDX-License-Identifier: GPL-2.0-only /* * This file is part of UBIFS. * * Copyright (C) 2006-2008 Nokia Corporation. * * Authors: Artem Bityutskiy (Битюцкий Артём) * Adrian Hunter */ /* * This file implements UBIFS superblock. The superblock is stored at the first * LEB of the volume and is never changed by UBIFS. Only user-space tools may * change it. The superblock node mostly contains geometry information. */ #include "ubifs.h" #include <linux/slab.h> #include <linux/math64.h> #include <linux/uuid.h> /* * Default journal size in logical eraseblocks as a percent of total * flash size. */ #define DEFAULT_JNL_PERCENT … /* Default maximum journal size in bytes */ #define DEFAULT_MAX_JNL … /* Default indexing tree fanout */ #define DEFAULT_FANOUT … /* Default number of data journal heads */ #define DEFAULT_JHEADS_CNT … /* Default positions of different LEBs in the main area */ #define DEFAULT_IDX_LEB … #define DEFAULT_DATA_LEB … #define DEFAULT_GC_LEB … /* Default number of LEB numbers in LPT's save table */ #define DEFAULT_LSAVE_CNT … /* Default reserved pool size as a percent of maximum free space */ #define DEFAULT_RP_PERCENT … /* The default maximum size of reserved pool in bytes */ #define DEFAULT_MAX_RP_SIZE … /* Default time granularity in nanoseconds */ #define DEFAULT_TIME_GRAN … static int get_default_compressor(struct ubifs_info *c) { … } /** * create_default_filesystem - format empty UBI volume. * @c: UBIFS file-system description object * * This function creates default empty file-system. Returns zero in case of * success and a negative error code in case of failure. */ static int create_default_filesystem(struct ubifs_info *c) { … } /** * validate_sb - validate superblock node. * @c: UBIFS file-system description object * @sup: superblock node * * This function validates superblock node @sup. Since most of data was read * from the superblock and stored in @c, the function validates fields in @c * instead. Returns zero in case of success and %-EINVAL in case of validation * failure. */ static int validate_sb(struct ubifs_info *c, struct ubifs_sb_node *sup) { … } /** * ubifs_read_sb_node - read superblock node. * @c: UBIFS file-system description object * * This function returns a pointer to the superblock node or a negative error * code. Note, the user of this function is responsible of kfree()'ing the * returned superblock buffer. */ static struct ubifs_sb_node *ubifs_read_sb_node(struct ubifs_info *c) { … } static int authenticate_sb_node(struct ubifs_info *c, const struct ubifs_sb_node *sup) { … } /** * ubifs_write_sb_node - write superblock node. * @c: UBIFS file-system description object * @sup: superblock node read with 'ubifs_read_sb_node()' * * This function returns %0 on success and a negative error code on failure. */ int ubifs_write_sb_node(struct ubifs_info *c, struct ubifs_sb_node *sup) { … } /** * ubifs_read_superblock - read superblock. * @c: UBIFS file-system description object * * This function finds, reads and checks the superblock. If an empty UBI volume * is being mounted, this function creates default superblock. Returns zero in * case of success, and a negative error code in case of failure. */ int ubifs_read_superblock(struct ubifs_info *c) { … } /** * fixup_leb - fixup/unmap an LEB containing free space. * @c: UBIFS file-system description object * @lnum: the LEB number to fix up * @len: number of used bytes in LEB (starting at offset 0) * * This function reads the contents of the given LEB number @lnum, then fixes * it up, so that empty min. I/O units in the end of LEB are actually erased on * flash (rather than being just all-0xff real data). If the LEB is completely * empty, it is simply unmapped. */ static int fixup_leb(struct ubifs_info *c, int lnum, int len) { … } /** * fixup_free_space - find & remap all LEBs containing free space. * @c: UBIFS file-system description object * * This function walks through all LEBs in the filesystem and fiexes up those * containing free/empty space. */ static int fixup_free_space(struct ubifs_info *c) { … } /** * ubifs_fixup_free_space - find & fix all LEBs with free space. * @c: UBIFS file-system description object * * This function fixes up LEBs containing free space on first mount, if the * appropriate flag was set when the FS was created. Each LEB with one or more * empty min. I/O unit (i.e. free-space-count > 0) is re-written, to make sure * the free space is actually erased. E.g., this is necessary for some NAND * chips, since the free space may have been programmed like real "0xff" data * (generating a non-0xff ECC), causing future writes to the not-really-erased * NAND pages to behave badly. After the space is fixed up, the superblock flag * is cleared, so that this is skipped for all future mounts. */ int ubifs_fixup_free_space(struct ubifs_info *c) { … } int ubifs_enable_encryption(struct ubifs_info *c) { … }