Exemplo n.º 1
0
/**
 * Get information about dpa provider capabilities
 */
int dpa_getinfo(uint32_t version, const char *node, const char *service,
                uint64_t flags, struct fi_info *hints, struct fi_info **info) {
  DPA_DEBUG("Check if dpa provider can satisfy all requirements\n");
  int ret = dpa_verify_requirements(version, node, service, flags, hints);
  if (ret) 
    return ret;

  dpa_addr_t *dest_addr = NULL;
  if (node && service && !(flags & FI_SOURCE))
    dest_addr = resolvename(node, service);
  else if (hints && hints->dest_addr && hints->dest_addrlen == sizeof(dpa_addr_t))
    dest_addr = (dpa_addr_t*) hints->dest_addr;

  dpa_addr_t *src_addr;
  if (service && (flags & FI_SOURCE))
    src_addr = resolvename(node, service);
  else if (hints && hints->src_addr && hints->src_addrlen == sizeof(dpa_addr_t))
    src_addr = hints->src_addr;
  else src_addr = calloc(1, sizeof(dpa_addr_t));
  src_addr->nodeId = localNodeId;

  enum fi_threading threading = FI_THREAD_COMPLETION;
  enum fi_progress control_progress = FI_PROGRESS_AUTO;
  enum fi_progress data_progress = FI_PROGRESS_MANUAL;
  enum fi_av_type av_type = FI_AV_UNSPEC;
  enum fi_mr_mode mr_mode = FI_MR_SCALABLE;
  if (hints && hints->domain_attr) {
    if (hints->domain_attr->data_progress == FI_PROGRESS_AUTO)
      data_progress = FI_PROGRESS_AUTO;
    if (hints->domain_attr->av_type != FI_AV_UNSPEC)
      av_type = hints->domain_attr->av_type;
    if (hints->domain_attr->threading != FI_THREAD_UNSPEC &&
        hints->domain_attr->threading < FI_THREAD_COMPLETION)
      threading = hints->domain_attr->threading;
  }
  struct fi_domain_attr* domain_attr = ALLOC_INIT(struct fi_domain_attr, {
        .domain = NULL,
          .name = strdup(DPA_DOMAIN_NAME),
          .threading = threading,
          .control_progress = control_progress,
          .data_progress = data_progress,
          .resource_mgmt = FI_RM_ENABLED,
          .av_type = av_type,
          .mr_mode = mr_mode,
          .mr_key_size = sizeof(dpa_segmid_t),
          .cq_data_size = 0,
          .cq_cnt = 0,
          .ep_cnt = 0,
          .tx_ctx_cnt = 1,
          .rx_ctx_cnt = 1,
          .max_ep_tx_ctx = 1,
          .max_ep_rx_ctx = 1,
          .max_ep_stx_ctx = 1,
          .max_ep_srx_ctx = 1
          });
Exemplo n.º 2
0
struct jffs2_raw_dirent *resolvepath0(char *o, size_t size, uint32_t ino,
		const char *p, uint32_t * inos, int recc)
{
	struct jffs2_raw_dirent *dir = NULL;

	int d = 1;
	uint32_t tino;

	char *next;

	char *path, *pp;

	char symbuf[1024];
	size_t symsize;

	if (recc > 16) {
		/* probably symlink loop */
		*inos = 0;
		return NULL;
	}

	pp = path = strdup(p);

	if (*path == '/') {
		path++;
		ino = 1;
	}

	if (ino > 1) {
		dir = resolveinode(o, size, ino);

		ino = DIRENT_INO(dir);
	}

	next = path - 1;

	while (ino && next != NULL && next[1] != 0 && d) {
		path = next + 1;
		next = strchr(path, '/');

		if (next != NULL)
			*next = 0;

		if (*path == '.' && path[1] == 0)
			continue;
		if (*path == '.' && path[1] == '.' && path[2] == 0) {
			if (DIRENT_PINO(dir) == 1) {
				ino = 1;
				dir = NULL;
			} else {
				dir = resolveinode(o, size, DIRENT_PINO(dir));
				ino = DIRENT_INO(dir);
			}

			continue;
		}

		dir = resolvename(o, size, ino, path, (uint8_t) strlen(path));

		if (DIRENT_INO(dir) == 0 ||
				(next != NULL &&
				 !(dir->type == DT_DIR || dir->type == DT_LNK))) {
			free(pp);

			*inos = 0;

			return NULL;
		}

		if (dir->type == DT_LNK) {
			struct jffs2_raw_inode *ri;
			ri = find_raw_inode(o, size, DIRENT_INO(dir));
			putblock(symbuf, sizeof(symbuf), &symsize, ri);
			symbuf[symsize] = 0;

			tino = ino;
			ino = 0;

			dir = resolvepath0(o, size, tino, symbuf, &ino, ++recc);

			if (dir != NULL && next != NULL &&
					!(dir->type == DT_DIR || dir->type == DT_LNK)) {
				free(pp);

				*inos = 0;
				return NULL;
			}
		}
		if (dir != NULL)
			ino = DIRENT_INO(dir);
	}

	free(pp);

	*inos = ino;

	return dir;
}