code: func splitDevAddr(id string) (string, int, int, error) {
  	parts := strings.Split(id, ":")
  	if len(parts) < 3 {
  		return "", 0, 0, fmt.Errorf("invalid ID %q", id)
  	}
  	ct, cbs, dus := parts[0], parts[1], parts[2]
  	cb, cbe := strconv.Atoi(cbs)
  	du, due := strconv.Atoi(dus)
  	var found bool
  	for _, v := range subresourceIDControllerTypeAllowedValues {
  		if v == ct {
  			found = true
  		}
  	}
  	if !found {
  		return ct, cb, du, fmt.Errorf("invalid controller type %q found in ID", ct)
  	}
  	if cbe != nil {
  		return ct, cb, du, fmt.Errorf("invalid bus number %q found in ID", cbs)
  	}
  	if due != nil {
  		return ct, cb, du, fmt.Errorf("invalid disk unit number %q found in ID", dus)
  	}
  	return ct, cb, du, nil
  }
docs: // splitDevAddr splits an device addres into its inparticular parts and asserts
  // that we have all the correct data.