天天看點

ubifs - superblock

ubifs superblock

- 1 superblock node.

- store system data

- superblock node be rewritten only if an automatic resize occurs. (image size < volume size -> resizing)

ubi對LEB的操作是原子操作,以保證資料更新成功。

superblock資料定義在下面這個檔案中。

fs/ubifs/ubifs-media.h

這個檔案描述了ubifs的格式及相關的資料結構和常量的定義。

所有ubifs on-flash objects都是以節點的形式存放的。

所有節點都是以ubifs node magic number開始,并具有相同的的header。

Nodes是8-byte aligned. Node header sizes也是8-byte aligned,(除了indexing node與padding node)。

在看superblock前,記住下面的結構。

#define UBIFS_NODE_MAGIC  0x06101831

struct ubifs_ch {

__le32 magic;       // * @magic: UBIFS node magic number (%UBIFS_NODE_MAGIC)

__le32 crc;             // * @crc: CRC-32 checksum of the node header

__le64 sqnum;     // * @sqnum: sequence number

__le32 len;             //* @len: full node length

__u8 node_type;   // * @node_type: node type

__u8 group_type;  // * @group_type: node group type

__u8 padding[2];   // * @padding: reserved for future, zeroes

} __packed;

struct ubifs_sb_node {

struct ubifs_ch ch;                     // * @ch: common header

__u8 padding[2];                       // * @padding: reserved for future, zeroes

__u8 key_hash;                         // * @key_hash: type of hash function used in keys

__u8 key_fmt;                             // * @key_fmt: format of the key

__le32 flags;                              // * @flags: file-system flags:  UBIFS_FLG_BIGLPT or UBIFS_FLG_SPACE_FIXUP???

__le32 min_io_size;                 // 最小讀寫單元

__le32 leb_size;                        // LEB大小,機關位元組

__le32 leb_cnt;                          //系統使用的的leb 數量

__le32 max_leb_cnt;                //系統使用的最大leb數量

__le64 max_bud_bytes;          // * @max_bud_bytes: maximum amount of data stored in buds ???

__le32 log_lebs;                       // log area占用的leb數量

__le32 lpt_lebs;                        // lpt area 占用的leb數量

__le32 orph_lebs;                    //orphon area占用的leb數量

__le32 jhead_cnt;                     //journal header 數量

__le32 fanout;                           // * @fanout: tree fanout (max. number of links per indexing node) ???

__le32 lsave_cnt;                     // LPT save table中LEB Numbers的數目,LEB saved table用來在mount時加快查找LPT中空閑eraseblocks的速度.

__le32 fmt_version;                 // * @fmt_version: UBIFS on-flash format version

__le16 default_compr;            //預設壓縮算法

__u8 padding1[2];                    // * @padding1: reserved for future, zeroes

__le32 rp_uid;                           // * @rp_uid: reserve pool UID

__le32 rp_gid;                           // * @rp_gid: reserve pool GID

__le64 rp_size;                         // * @rp_size: size of the reserved pool in bytes

__le32 time_gran;                    // * @time_gran: time granularity in nanoseconds

__u8 uuid[16];                            // * @uuid: UUID (全局唯一标示符)generated when the file system image was created

__le32 ro_compat_version;   // * @ro_compat_version: UBIFS R/O compatibility version

__u8 padding2[3968];             // * @padding2: reserved for future, zeroes

} __packed;

super block的資料很少改動,除了resize的時候。