閱讀839 返回首頁    go 阿裏雲 go 技術社區[雲棲]


graph driver-device mapper-04libdevmapper基本操作

//	創建thin pool
//	調用路徑:NewDeviceSet->initDevmapper->createPool
1.1 func createPool(poolName string, dataFile, metadataFile *os.File, poolBlockSize uint32) error {
	//通過task封裝與libdevmapper的交互
	task, err := createTask(DeviceCreate, poolName)
	if task == nil {
		return err
	}
	//data block device的大小,通過ioctl
	size, err := GetBlockDeviceSize(dataFile)
	if err != nil {
		return fmt.Errorf("Can't get data size %s", err)
	}
	//創建thin pool的參數
	params := fmt.Sprintf("%s %s %d 32768 1 skip_block_zeroing", metadataFile.Name(), dataFile.Name(), poolBlockSize)
	//添加函數參數
	if err := task.AddTarget(0, size/512, "thin-pool", params); err != nil {
		return fmt.Errorf("Can't add target %s", err)
	}
	//創建一個同步量
	var cookie uint = 0
	if err := task.SetCookie(&cookie, 0); err != nil {
		return fmt.Errorf("Can't set cookie %s", err)
	}
	//執行任務
	if err := task.Run(); err != nil {
		return fmt.Errorf("Error running DeviceCreate (createPool) %s", err)
	}
	//等待thin pool創建完成
	UdevWait(cookie)

	return nil
}

//	創建操作,task封裝對devicemapper的操作
1.2 func createTask(t TaskType, name string) (*Task, error) {
	//創建tasktype對應的封裝函數
	task := TaskCreate(t)
	if task == nil {
		return nil, fmt.Errorf("Can't create task of type %d", int(t))
	}
	if err := task.SetName(name); err != nil {
		return nil, fmt.Errorf("Can't set task name %s", name)
	}
	return task, nil
}

//	創建一個指定的操作類型
1.3 func TaskCreate(tasktype TaskType) *Task {
	//創建操作
	Ctask := DmTaskCreate(int(tasktype))
	if Ctask == nil {
		return nil
	}
	task := &Task{unmanaged: Ctask}
	runtime.SetFinalizer(task, (*Task).destroy)
	return task
}

//	創建指定的操作
//	DmTaskCreate=dmTaskCreateFct
1.4 func dmTaskCreateFct(taskType int) *CDmTask {
	return (*CDmTask)(C.dm_task_create(C.int(taskType)))
}

最後更新:2017-04-03 05:39:32

  上一篇:go centos 徹底刪除nodejs默認安裝文件
  下一篇:go 《node.js開發指南》觀後感