pvcreate代码分析

上传人:第*** 文档编号:32695106 上传时间:2018-02-12 格式:DOC 页数:48 大小:254KB
返回 下载 相关 举报
pvcreate代码分析_第1页
第1页 / 共48页
pvcreate代码分析_第2页
第2页 / 共48页
pvcreate代码分析_第3页
第3页 / 共48页
pvcreate代码分析_第4页
第4页 / 共48页
pvcreate代码分析_第5页
第5页 / 共48页
点击查看更多>>
资源描述

《pvcreate代码分析》由会员分享,可在线阅读,更多相关《pvcreate代码分析(48页珍藏版)》请在金锄头文库上搜索。

1、LVM 代码分析1. 探索 pvcreate 函数大致的执行过程1.1.pvcreate/* 代码 1*/int pvcreate(struct cmd_context *cmd, int argc, char *argv)int i;int ret = ECMD_PROCESSED;struct pvcreate_params pp;struct physical_volume *pv;/* 给 pp 设置默认值 */pvcreate_params_set_defaults(/* 检查 pvcreate 需要保存到磁盘的参数,如 restorefile、uuid,并传给 pp 结构体 */i

2、f (!pvcreate_restore_params_validate(cmd, argc, argv, &pp) return EINVALID_CMD_LINE;/* 检查 pvcreate 不需要保存到磁盘的参数(见 man pvcreate) ,并传给 pp 结构体 */if (!pvcreate_params_validate(cmd, argc, argv, &pp) return EINVALID_CMD_LINE;/* 将用户输入的所有 device 转换成 PV */for (i = 0; i idp) / 如果 UUID 存在(比如用户指定一个 UUID)if (dev

3、= lvmcache_device_from_pvid(cmd, pp-idp, NULL, NULL) & / 查看此 UUID 是否在 lvm 缓存中已经存在对应的设备(dev != dev_cache_get(pv_name, cmd-filter) / 在缓存中查看用户输入的 pv_name 对应的设备if (!id_write_format(const struct id*)&pp-idp-uuid,buffer, sizeof(buffer)goto_bad;log_error(uuid %s already in use on %s, buffer,dev_name(dev);g

4、oto bad;/ 上述缓存为两个 hash 表,在 lvm 启动的时候初始化if (!pvcreate_check(cmd, pv_name, pp)goto_bad;if (sigint_caught()goto_bad;if (!(dev = dev_cache_get(pv_name, cmd-filter) log_error(%s: Couldnt find device. Check your filters?,pv_name);goto bad;dm_list_init(/* pv_create 函数见代码 3,作用是:创建并填充 pv 结构体 */if (!(pv = pv_

5、create(cmd, dev, pp-idp, pp-size,pp-data_alignment, pp-data_alignment_offset,pp-pe_start ? pp-pe_start : PV_PE_START_CALC,pp-extent_count, pp-extent_size,pp-labelsector, pp-pvmetadatacopies,pp-pvmetadatasize, pp-metadataignore) log_error(Failed to setup physical volume %s, pv_name);goto bad;log_verb

6、ose(Set up physical volume for %s with % PRIu64 available sectors, pv_name, pv_size(pv);if (write_now) struct pv_to_create pvc;pvc.pp = pp;pvc.pv = pv;if (!_pvcreate_write(cmd, &pvc) /将 pv 和 pp 的信息写到磁盘,详见代码 4goto bad; else pv-status |= UNLABELLED_PV;return pv;bad:return NULL;1.3.pv_create/* 代码 3* pv

7、_create - initialize a physical volume for use with a volume group* created PV belongs to Orphan VG.* fmt: format type* dev: PV device to initialize* size: size of the PV in sectors* data_alignment: requested alignment of data* data_alignment_offset: requested offset to aligned data* pe_start: physi

8、cal extent start* existing_extent_count* existing_extent_size* pvmetadatacopies* pvmetadatasize* mdas* Returns:* PV handle - physical volume initialized successfully* NULL - invalid parameter or problem initializing the physical volume* Note:* FIXME: shorten argument list and replace with explict se

9、t functions*/struct physical_volume *pv_create(const struct cmd_context *cmd,struct device *dev,struct id *id, uint64_t size,unsigned long data_alignment,unsigned long data_alignment_offset, uint64_t pe_start,uint32_t existing_extent_count,uint32_t existing_extent_size,uint64_t label_sector,unsigned

10、 pvmetadatacopies,uint64_t pvmetadatasize,unsigned metadataignore)const struct format_type *fmt = cmd-fmt;struct dm_pool *mem = fmt-orphan_vg-vgmem;struct physical_volume *pv = _alloc_pv(mem, dev);unsigned mda_index;struct pv_list *pvl;if (!pv)return_NULL;if (id)memcpy(else if (!id_create(&pv-id) lo

11、g_error(Failed to create random uuid for %s.,dev_name(dev);goto bad;if (!dev_get_size(pv-dev, &pv-size) log_error(%s: Couldnt get size., pv_dev_name(pv);goto bad;if (size) if (size pv-size)log_warn(WARNING: %s: Overriding real size. You could lose data., pv_dev_name(pv);log_verbose(%s: Pretending si

12、ze is % PRIu64 sectors.,pv_dev_name(pv), size);pv-size = size;if (pv-size size pv = pv;add_pvl_to_vgs(fmt-orphan_vg, pvl);fmt-orphan_vg-extent_count += pv-pe_count;fmt-orphan_vg-free_count += pv-pe_count;pv-fmt = fmt;pv-vg_name = fmt-orphan_vg_name;if (!fmt-ops-pv_initialise(fmt, label_sector, pe_st

13、art,existing_extent_count, existing_extent_size,data_alignment, data_alignment_offset, pv) log_error(Format-specific initialisation of physical volume %s failed., pv_dev_name(pv);goto bad;for (mda_index = 0; mda_index fmt-ops-pv_add_metadata_area &!pv-fmt-ops-pv_add_metadata_area(pv-fmt, pv,pe_start

14、 != PV_PE_START_CALC,mda_index, pvmetadatasize,metadataignore) log_error(Failed to add metadata area for new physical volume %s, pv_dev_name(pv);goto bad;return pv;bad:/ FIXME: detach from orphan in error path/free_pv_fid(pv);/dm_pool_free(mem, pv);return NULL;1.4._pvcreate_write/* 代码 4*/static int

15、_pvcreate_write(struct cmd_context *cmd, struct pv_to_create *pvc)int zero = pvc-pp-zero;struct physical_volume *pv = pvc-pv;struct device *dev = pv-dev;const char *pv_name = dev_name(dev);/* Wipe existing label first */if (!label_remove(pv_dev(pv) log_error(Failed to wipe existing label on %s, pv_name);return 0;if (zero) log_verbose(Zeroing start of device %s, pv_name);if (!dev_open_quiet(dev) log_error(%s not opened: device not zeroed, pv_name);return 0;if (!dev_set(dev, UINT64_C(0), (size_t) 2048, 0) log_error(%s not wiped: aborting, pv_name);if (!dev_close

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 职业教育

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号