/** * 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 });
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; }