lib/format_text/text_label.c:函数
struct label_ops _text_ops = { .can_handle = _text_can_handle, .write = _text_write, .read = _text_read, .verify = _text_can_handle, .initialise_label = _text_initialise_label, .destroy_label = _text_destroy_label, .destroy = _fmt_text_destroy, };
format-text.c/format-text.c:code
lvm2的元数据是以纯文本方式表达的,可读性很好。元数据能够放在磁盘开始的1M空间里,也能够放在/etc/lvm/backup/目录下的文件里。orm
文件元数据处理:rem
static struct metadata_area_ops _metadata_text_file_ops = { .vg_read = _vg_read_file, .vg_read_precommit = _vg_read_precommit_file, .vg_write = _vg_write_file, .vg_remove = _vg_remove_file, .vg_commit = _vg_commit_file };
磁盘元数据处理:get
static struct metadata_area_ops _metadata_text_raw_ops = { .vg_read = _vg_read_raw, .vg_read_precommit = _vg_read_precommit_raw, .vg_write = _vg_write_raw, .vg_remove = _vg_remove_raw, .vg_precommit = _vg_precommit_raw, .vg_commit = _vg_commit_raw, .vg_revert = _vg_revert_raw, .mda_metadata_locn_copy = _metadata_locn_copy_raw, .mda_metadata_locn_name = _metadata_locn_name_raw, .mda_metadata_locn_offset = _metadata_locn_offset_raw, .mda_free_sectors = _mda_free_sectors_raw, .mda_total_sectors = _mda_total_sectors_raw, .mda_in_vg = _mda_in_vg_raw, .pv_analyze_mda = _pv_analyze_mda_raw, .mda_locns_match = _mda_locns_match_raw, .mda_get_device = _mda_get_device_raw, .mda_export_text = _mda_export_text_raw, .mda_import_text = _mda_import_text_raw };
备份文件中元数据处理,备份文件和普通文件有什么区别呢?cmd
static struct metadata_area_ops _metadata_text_file_backup_ops = { .vg_read = _vg_read_file, .vg_write = _vg_write_file, .vg_remove = _vg_remove_file, .vg_commit = _vg_commit_file_backup };
如上述,元数据处理有不一样的操做集,相似VFS和具体文件系统的关系,得有一个抽象的处理集。it
static struct format_handler _text_handler = { .scan = _text_scan, .pv_read = _text_pv_read, .pv_initialise = _text_pv_initialise, .pv_setup = _text_pv_setup, .pv_add_metadata_area = _text_pv_add_metadata_area, .pv_remove_metadata_area = _text_pv_remove_metadata_area, .pv_resize = _text_pv_resize, .pv_write = _text_pv_write, .pv_needs_rewrite = _text_pv_needs_rewrite, .vg_setup = _text_vg_setup, .lv_setup = _text_lv_setup, .create_instance = _text_create_text_instance, .destroy_instance = _text_destroy_instance, .destroy = _text_destroy };
struct format_type *create_text_format(struct cmd_context *cmd) 就像一个工厂函数,根据命令,实例化匹配的元数据处理集。form
struct labeller *text_labeller_create(const struct format_type *fmt) 负责实例化标签处理, 而后在标签和文本处理结构间作cross-link.import