code: func CreatePool(poolName string, dataFile, metadataFile *os.File, poolBlockSize uint32) error {
  	task, err := TaskCreateNamed(deviceCreate, poolName)
  	if task == nil {
  		return err
  	}
  
  	size, err := GetBlockDeviceSize(dataFile)
  	if err != nil {
  		return fmt.Errorf("devicemapper: Can't get data size %s", err)
  	}
  
  	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("devicemapper: Can't add target %s", err)
  	}
  
  	cookie := new(uint)
  	flags := uint16(DmUdevDisableSubsystemRulesFlag | DmUdevDisableDiskRulesFlag | DmUdevDisableOtherRulesFlag)
  	if err := task.setCookie(cookie, flags); err != nil {
  		return fmt.Errorf("devicemapper: Can't set cookie %s", err)
  	}
  	defer UdevWait(cookie)
  
  	if err := task.run(); err != nil {
  		return fmt.Errorf("devicemapper: Error running deviceCreate (CreatePool) %s", err)
  	}
  
  	return nil
  }
docs: // CreatePool is the programmatic example of "dmsetup create".
  // It creates a device with the specified poolName, data and metadata file and block size.