lvm代码分析(六)——pvcreate
来源:互联网 发布:4glte是什么网络制式 编辑:程序博客网 时间:2024/06/05 08:03
对于输入pvcreate /dev/sda0这个命令,如何通过lvm进入,然后经过转换到调用pvcreate的过程,前面算基本理清,更多的细节需要在日后多完善。pvcreate函数的代码如下:
从开始到51行止,都是通过命令携带的参数进行判断处理,先不拘小节地跳过吧,等需要用到时在回来。53行开始的for循环是对每个设备都调用pvcreate_single函数分别对每个设备进行操作。
在pvcreate_single中,又看到一个郁闷的声明:
struct id id
和前面又有arg的结构,又有arg的宏定义一样,搞得我的se不能正确跳转。ft。
继续看下去:
此处应该是获取设备及判断设备是否已经呗使用,设备id赋予id变量,同时idp指向id。
接下来的这个代码快,应该是根据restorefile构建或者创建一个新的vg,然后获取已经存在的pv,获取pe_start,extent_size,extent_count。
阅读这种不连续的代码还真郁闷,要是能够debug看看传进参数是啥就好了。唉~
- int pvcreate(struct cmd_context *cmd, int argc, char **argv)
- {
- int i, r;
- int ret = ECMD_PROCESSED;
- struct pvcreate_params pp;
- if (!argc) {
- log_error("Please enter a physical volume path");
- return EINVALID_CMD_LINE;
- }
- if (arg_count(cmd, restorefile_ARG) && !arg_count(cmd, uuidstr_ARG)) {
- log_error("--uuid is required with --restorefile");
- return EINVALID_CMD_LINE;
- }
- if (arg_count(cmd, uuidstr_ARG) && argc != 1) {
- log_error("Can only set uuid on one volume at once");
- return EINVALID_CMD_LINE;
- }
- if (arg_count(cmd, yes_ARG) && !arg_count(cmd, force_ARG)) {
- log_error("Option y can only be given with option f");
- return EINVALID_CMD_LINE;
- }
- if (arg_int_value(cmd, labelsector_ARG, 0) >= LABEL_SCAN_SECTORS) {
- log_error("labelsector must be less than %lu",
- LABEL_SCAN_SECTORS);
- return EINVALID_CMD_LINE;
- }
- if (!(cmd->fmt->features & FMT_MDAS) &&
- (arg_count(cmd, metadatacopies_ARG) ||
- arg_count(cmd, metadatasize_ARG))) {
- log_error("Metadata parameters only apply to text format");
- return EINVALID_CMD_LINE;
- }
- if (arg_count(cmd, metadatacopies_ARG) &&
- arg_int_value(cmd, metadatacopies_ARG, -1) > 2) {
- log_error("Metadatacopies may only be 0, 1 or 2");
- return EINVALID_CMD_LINE;
- }
- if (arg_count(cmd, zero_ARG))
- pp.zero = strcmp(arg_str_value(cmd, zero_ARG, "y"), "n");
- else if (arg_count(cmd, restorefile_ARG) || arg_count(cmd, uuidstr_ARG))
- pp.zero = 0;
- else
- pp.zero = 1;
- for (i = 0; i < argc; i++) {
- r = pvcreate_single(cmd, argv[i], &pp);
- if (r > ret)
- ret = r;
- if (sigint_caught())
- return ret;
- }
- return ret;
- }
在pvcreate_single中,又看到一个郁闷的声明:
struct id id
和前面又有arg的结构,又有arg的宏定义一样,搞得我的se不能正确跳转。ft。
继续看下去:
- if (arg_count(cmd, uuidstr_ARG)) {
- uuid = arg_str_value(cmd, uuidstr_ARG, "");
- if (!id_read_format(&id, uuid))
- return EINVALID_CMD_LINE;
- if ((dev = device_from_pvid(cmd, &id)) &&
- (dev != dev_cache_get(pv_name, cmd->filter))) {
- log_error("uuid %s already in use on /"%s/"", uuid,
- dev_name(dev));
- return ECMD_FAILED;
- }
- idp = &id;
- }
- if (arg_count(cmd, restorefile_ARG)) {
- restorefile = arg_str_value(cmd, restorefile_ARG, "");
- /* The uuid won't already exist */
- init_partial(1);
- if (!(vg = backup_read_vg(cmd, NULL, restorefile))) {
- log_error("Unable to read volume group from %s",
- restorefile);
- return ECMD_FAILED;
- }
- init_partial(0);
- if (!(existing_pv = find_pv_in_vg_by_uuid(vg, idp))) {
- log_error("Can't find uuid %s in backup file %s",
- uuid, restorefile);
- return ECMD_FAILED;
- }
- pe_start = pv_pe_start(existing_pv);
- extent_size = pv_pe_size(existing_pv);
- extent_count = pv_pe_count(existing_pv);
- }
阅读这种不连续的代码还真郁闷,要是能够debug看看传进参数是啥就好了。唉~
- lvm代码分析(六)——pvcreate
- lvm代码分析(一)
- lvm代码分析(二)
- lvm代码分析(三)
- lvm代码分析(四)
- lvm代码分析(五)
- jQuery选择器代码详解(六)——Sizzle选择器匹配逻辑分析
- kfs代码研究(六、ChunkManager分析)
- kfs代码研究(六、ChunkManager分析)
- android权限代码分析(六)
- kdb代码分析(六)
- 关于LVM管理PVcreate过程中错误Device /dev/sdb not found (or ignored by filtering)
- Lua5.1代码阅读(七):lvm.h/lvm.c
- 软件工程(六)——需求分析
- 文件系统——LVM
- LVM——Redhat
- Linux——lvm
- linux——lvm
- VC2005下的编译错误
- ASP.NET中如何调用存储过程
- 专访中国万网CTO:数据库技术就像陈年酒越老越香
- vs2008中使用JQuery智能提示
- [zz]微软亚洲研究院--寻找最大的k个数
- lvm代码分析(六)——pvcreate
- 网上找的一个关于HP Mercury的考试课程的报价表
- Excel 导入/导出Oracle 数据库
- ISDN与ADSL
- 几种建立http-tunnel的方法
- Cg学习记录006 之变换
- PCB抄板几个相关问题
- mysql InnoDB的count(*)
- gridview列 数字、货币和日期 显示格式