用于反向索引。通过SIT和NAT可以正向索引到主区域中的block。在这里可以通过block找到所属的node。也就是可以实现通过物理地址找到逻辑地址。GC的时候很有用。

同时它也具有通过journal缓存sit或者nat的操作用于数据恢复的作用。

下面是SSA的盘上结构。

image.png

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中。