用于反向索引。通过SIT和NAT可以正向索引到主区域中的block。在这里可以通过block找到所属的node。也就是可以实现通过物理地址找到逻辑地址。GC的时候很有用。
同时它也具有通过journal缓存sit或者nat的操作用于数据恢复的作用。
下面是SSA的盘上结构。
struct f2fs_summary_block {
struct f2fs_summary entries[ENTRIES_IN_SUM]; // ENTRIES_IN_SUM = 512
struct f2fs_journal journal;
struct summary_footer footer;
} __packed;
每个block中存放512条summary项,正好对应一个segment中的块数。一个f2fs_summary对应segment中的一个块。
f2fs_journal的作用是减少对NAT和SIT区域的频繁更新。在写压力大时,segment bitmap会频繁更新。因此先将这些改动写入内存journal中,CP的时候再写到盘中。关于journal详见:F2FS中的journal
f2fs_summary定义为
struct f2fs_summary {
__le32 nid; /* parent node id */
union {
__u8 reserved[3];
struct {
__u8 version; /* node version number */
__le16 ofs_in_node; /* block index in parent node */
} __packed;
};
} __packed;
entry的下标对应物理地址,首先通过物理地址找到该地址块对应的summary entry,再从entry中找到该块对应的nid和在node内的index。(一个node可以指向1018个块)
/* summary block type, node or data, is stored to the summary_footer */
#define SUM_TYPE_NODE (1)
#define SUM_TYPE_DATA (0)
struct summary_footer {
unsigned char entry_type; /* SUM_TYPE_XXX */
__le32 check_sum; /* summary checksum */
} __packed;
footer中记录了这个块是node还是data,以及校验和。
内存中没有单独管理SSA的结构,summary主要存在于CURSEG中。