Lines Matching refs:hdp

128 	struct di_devlink_handle *hdp;  in di_devlink_open()  local
136 if ((hdp = handle_alloc(root_dir, OPEN_RDWR)) == NULL) { in di_devlink_open()
140 err = open_db(hdp, OPEN_RDONLY); in di_devlink_open()
150 get_db_path(hdp, DB_FILE, path, sizeof (path)); in di_devlink_open()
156 handle_free(&hdp); /* also closes the DB */ in di_devlink_open()
161 if (cache_alloc(hdp) != 0) { in di_devlink_open()
162 handle_free(&hdp); in di_devlink_open()
174 (void) di_devlink_close(&hdp, 0); in di_devlink_open()
183 return (hdp); in di_devlink_open()
187 CACHE(hdp)->update_count = DB_HDR(hdp)->update_count; in di_devlink_open()
188 (void) read_nodes(hdp, NULL, DB_HDR(hdp)->root_idx); in di_devlink_open()
189 (void) read_links(hdp, NULL, DB_HDR(hdp)->dngl_idx); in di_devlink_open()
191 (void) close_db(hdp); in di_devlink_open()
193 return (hdp); in di_devlink_open()
198 struct di_devlink_handle *hdp, in get_db_path() argument
212 dir = hdp->db_dir; in get_db_path()
219 open_db(struct di_devlink_handle *hdp, int flags) in open_db() argument
229 assert(!DB_OPEN(hdp)); in open_db()
247 get_db_path(hdp, DB_FILE, path, sizeof (path)); in open_db()
250 get_db_path(hdp, DB_TMP, path, sizeof (path)); in open_db()
271 sz = size_db(hdp, page_sz, count); in open_db()
287 DB(hdp)->hdr = (struct db_hdr *)cp; in open_db()
288 DB(hdp)->db_fd = fd; in open_db()
289 DB(hdp)->flags = flags; in open_db()
292 rv = invalid_db(hdp, sz, page_sz); in open_db()
294 rv = init_hdr(hdp, page_sz, count); in open_db()
299 (void) close_db(hdp); in open_db()
314 struct di_devlink_handle *hdp, proto = {0}; in handle_alloc() local
425 hdp = calloc(1, sizeof (struct di_devlink_handle)); in handle_alloc()
426 if (hdp == NULL) { in handle_alloc()
430 *hdp = proto; in handle_alloc()
439 if ((hdp->dev_dir = strdup(proto.dev_dir)) == NULL) { in handle_alloc()
440 free(hdp); in handle_alloc()
444 if ((hdp->db_dir = strdup(proto.db_dir)) == NULL) { in handle_alloc()
445 free(hdp->dev_dir); in handle_alloc()
446 free(hdp); in handle_alloc()
450 return (hdp); in handle_alloc()
464 cache_alloc(struct di_devlink_handle *hdp) in cache_alloc() argument
468 assert(HDL_RDWR(hdp)); in cache_alloc()
470 if (DB_OPEN(hdp)) { in cache_alloc()
471 hash_sz = DB_NUM(hdp, DB_LINK) / AVG_CHAIN_SIZE; in cache_alloc()
475 CACHE(hdp)->hash = calloc(hash_sz, sizeof (cache_link_t *)); in cache_alloc()
476 if (CACHE(hdp)->hash == NULL) { in cache_alloc()
479 CACHE(hdp)->hash_sz = hash_sz; in cache_alloc()
486 invalid_db(struct di_devlink_handle *hdp, size_t fsize, long page_sz) in invalid_db() argument
492 if (DB_HDR(hdp)->magic != DB_MAGIC || DB_HDR(hdp)->vers != DB_VERSION) { in invalid_db()
496 if (DB_HDR(hdp)->page_sz == 0 || DB_HDR(hdp)->page_sz != page_sz) { in invalid_db()
500 sz = seg_size(hdp, DB_HEADER); in invalid_db()
502 (void) dprintf(DBG_INFO, "N[%u] = %u\n", i, DB_NUM(hdp, i)); in invalid_db()
504 if (DB_NUM(hdp, i) < 1) { in invalid_db()
507 sz += seg_size(hdp, i); in invalid_db()
515 if (!VALID_INDEX(hdp, DB_NODE, DB_HDR(hdp)->root_idx)) { in invalid_db()
519 if (!VALID_INDEX(hdp, DB_LINK, DB_HDR(hdp)->dngl_idx)) { in invalid_db()
523 if (DB_EMPTY(hdp)) { in invalid_db()
530 cp = get_string(hdp, DB_NUM(hdp, DB_STR) - 1); in invalid_db()
539 read_nodes(struct di_devlink_handle *hdp, cache_node_t *pcnp, uint32_t nidx) in read_nodes() argument
546 assert(HDL_RDWR(hdp)); in read_nodes()
551 if ((pcnp == NULL) ^ (nidx == DB_HDR(hdp)->root_idx)) { in read_nodes()
554 SET_DB_ERR(hdp); in read_nodes()
558 for (; dnp = get_node(hdp, nidx); nidx = dnp->sib) { in read_nodes()
560 path = get_string(hdp, dnp->path); in read_nodes()
565 cnp = node_insert(hdp, pcnp, path, INSERT_HEAD); in read_nodes()
567 SET_DB_ERR(hdp); in read_nodes()
571 assert(strcmp(path, "/") ^ (nidx == DB_HDR(hdp)->root_idx)); in read_nodes()
574 if (read_minors(hdp, cnp, dnp->minor) != 0 || in read_nodes()
575 read_nodes(hdp, cnp, dnp->child) != 0) { in read_nodes()
587 read_minors(struct di_devlink_handle *hdp, cache_node_t *pcnp, uint32_t nidx) in read_minors() argument
594 assert(HDL_RDWR(hdp)); in read_minors()
599 SET_DB_ERR(hdp); in read_minors()
603 for (; dmp = get_minor(hdp, nidx); nidx = dmp->sib) { in read_minors()
605 name = get_string(hdp, dmp->name); in read_minors()
606 nodetype = get_string(hdp, dmp->nodetype); in read_minors()
608 cmnp = minor_insert(hdp, pcnp, name, nodetype, NULL); in read_minors()
610 SET_DB_ERR(hdp); in read_minors()
617 if (read_links(hdp, cmnp, dmp->link) != 0) { in read_minors()
629 read_links(struct di_devlink_handle *hdp, cache_minor_t *pcmp, uint32_t nidx) in read_links() argument
635 assert(HDL_RDWR(hdp)); in read_links()
638 ((pcmp == NULL) ^ (nidx == DB_HDR(hdp)->dngl_idx))) { in read_links()
641 SET_DB_ERR(hdp); in read_links()
645 for (; dlp = get_link(hdp, nidx); nidx = dlp->sib) { in read_links()
647 path = get_string(hdp, dlp->path); in read_links()
648 content = get_string(hdp, dlp->content); in read_links()
650 clp = link_insert(hdp, pcmp, path, content, dlp->attr); in read_links()
652 SET_DB_ERR(hdp); in read_links()
670 struct di_devlink_handle *hdp; in di_devlink_close() local
677 hdp = *pp; in di_devlink_close()
685 handle_free(&hdp); in di_devlink_close()
689 if (DB_ERR(hdp)) { in di_devlink_close()
690 handle_free(&hdp); in di_devlink_close()
698 get_db_path(hdp, DB_FILE, file, sizeof (file)); in di_devlink_close()
699 get_db_path(hdp, DB_TMP, tmp, sizeof (tmp)); in di_devlink_close()
705 CACHE(hdp)->update_count); in di_devlink_close()
713 if (CACHE(hdp)->update_count == 0) { in di_devlink_close()
714 CACHE(hdp)->update_count = 1; in di_devlink_close()
717 (void) synchronize_db(hdp); in di_devlink_close()
724 resolve_dangling_links(hdp); in di_devlink_close()
730 if (CACHE_EMPTY(hdp)) { in di_devlink_close()
733 handle_free(&hdp); in di_devlink_close()
737 if (open_db(hdp, OPEN_RDWR) != 0) { in di_devlink_close()
738 handle_free(&hdp); in di_devlink_close()
750 (void) write_nodes(hdp, NULL, CACHE_ROOT(hdp), next); in di_devlink_close()
751 (void) write_links(hdp, NULL, CACHE(hdp)->dngl, next); in di_devlink_close()
752 DB_HDR(hdp)->update_count = CACHE(hdp)->update_count; in di_devlink_close()
754 rv = close_db(hdp); in di_devlink_close()
756 if (rv != 0 || DB_ERR(hdp) || rename(tmp, file) != 0) { in di_devlink_close()
761 handle_free(&hdp); in di_devlink_close()
765 handle_free(&hdp); in di_devlink_close()
776 init_hdr(struct di_devlink_handle *hdp, long page_sz, uint32_t *count) in init_hdr() argument
780 DB_HDR(hdp)->magic = DB_MAGIC; in init_hdr()
781 DB_HDR(hdp)->vers = DB_VERSION; in init_hdr()
782 DB_HDR(hdp)->root_idx = DB_NIL; in init_hdr()
783 DB_HDR(hdp)->dngl_idx = DB_NIL; in init_hdr()
784 DB_HDR(hdp)->page_sz = (uint32_t)page_sz; in init_hdr()
788 DB_NUM(hdp, i) = count[i]; in init_hdr()
796 struct di_devlink_handle *hdp, in write_nodes() argument
805 assert(HDL_RDWR(hdp)); in write_nodes()
812 if ((pdnp == NULL) ^ (cnp == CACHE_ROOT(hdp))) { in write_nodes()
815 SET_DB_ERR(hdp); in write_nodes()
820 (cnp == CACHE_ROOT(hdp))); in write_nodes()
823 if ((dnp = set_node(hdp, idx)) == NULL) { in write_nodes()
824 SET_DB_ERR(hdp); in write_nodes()
828 dnp->path = write_string(hdp, cnp->path, next); in write_nodes()
830 SET_DB_ERR(hdp); in write_nodes()
837 assert(DB_HDR(hdp)->root_idx == DB_NIL); in write_nodes()
838 DB_HDR(hdp)->root_idx = idx; in write_nodes()
847 if (write_minors(hdp, dnp, cnp->minor, next) != 0 || in write_nodes()
848 write_nodes(hdp, dnp, cnp->child, next) != 0) { in write_nodes()
858 struct di_devlink_handle *hdp, in write_minors() argument
867 assert(HDL_RDWR(hdp)); in write_minors()
872 SET_DB_ERR(hdp); in write_minors()
881 if ((dmp = set_minor(hdp, idx)) == NULL) { in write_minors()
882 SET_DB_ERR(hdp); in write_minors()
886 dmp->name = write_string(hdp, cmnp->name, next); in write_minors()
887 dmp->nodetype = write_string(hdp, cmnp->nodetype, next); in write_minors()
890 SET_DB_ERR(hdp); in write_minors()
903 if (write_links(hdp, dmp, cmnp->link, next) != 0) { in write_minors()
913 struct di_devlink_handle *hdp, in write_links() argument
922 assert(HDL_RDWR(hdp)); in write_links()
925 if (clp != NULL && ((pdmp == NULL) ^ (clp == CACHE(hdp)->dngl))) { in write_links()
927 SET_DB_ERR(hdp); in write_links()
938 SET_DB_ERR(hdp); in write_links()
943 if ((dlp = set_link(hdp, idx)) == NULL) { in write_links()
944 SET_DB_ERR(hdp); in write_links()
948 dlp->path = write_string(hdp, clp->path, next); in write_links()
949 dlp->content = write_string(hdp, clp->content, next); in write_links()
952 SET_DB_ERR(hdp); in write_links()
965 dlp->sib = DB_HDR(hdp)->dngl_idx; in write_links()
966 DB_HDR(hdp)->dngl_idx = idx; in write_links()
978 write_string(struct di_devlink_handle *hdp, const char *str, uint32_t *next) in write_string() argument
983 assert(HDL_RDWR(hdp)); in write_string()
991 if (!VALID_STR(hdp, idx, str)) { in write_string()
997 if ((dstr = set_string(hdp, idx)) == NULL) { in write_string()
1009 close_db(struct di_devlink_handle *hdp) in close_db() argument
1014 if (!DB_OPEN(hdp)) { in close_db()
1016 assert(DB(hdp)->db_fd == -1); in close_db()
1017 assert(DB(hdp)->flags == 0); in close_db()
1019 assert(DB_SEG(hdp, i) == NULL); in close_db()
1020 assert(DB_SEG_PROT(hdp, i) == 0); in close_db()
1028 if (DB_SEG(hdp, i)) { in close_db()
1029 sz = seg_size(hdp, i); in close_db()
1030 if (DB_RDWR(hdp)) in close_db()
1031 rv += msync(DB_SEG(hdp, i), sz, MS_SYNC); in close_db()
1032 (void) munmap(DB_SEG(hdp, i), sz); in close_db()
1033 DB_SEG(hdp, i) = NULL; in close_db()
1034 DB_SEG_PROT(hdp, i) = 0; in close_db()
1038 if (DB_RDWR(hdp)) in close_db()
1039 rv += msync((caddr_t)DB_HDR(hdp), HDR_LEN, MS_SYNC); in close_db()
1040 (void) munmap((caddr_t)DB_HDR(hdp), HDR_LEN); in close_db()
1041 DB(hdp)->hdr = NULL; in close_db()
1043 (void) close(DB(hdp)->db_fd); in close_db()
1044 DB(hdp)->db_fd = -1; in close_db()
1045 DB(hdp)->flags = 0; in close_db()
1052 cache_free(struct di_devlink_handle *hdp) in cache_free() argument
1056 subtree_free(hdp, &(CACHE_ROOT(hdp))); in cache_free()
1057 assert(CACHE_LAST(hdp) == NULL); in cache_free()
1063 while (CACHE(hdp)->dngl != NULL) { in cache_free()
1064 clp = CACHE(hdp)->dngl; in cache_free()
1065 CACHE(hdp)->dngl = clp->sib; in cache_free()
1070 assert((CACHE(hdp)->hash == NULL) ^ (CACHE(hdp)->hash_sz != 0)); in cache_free()
1072 free(CACHE(hdp)->hash); in cache_free()
1073 CACHE(hdp)->hash = NULL; in cache_free()
1074 CACHE(hdp)->hash_sz = 0; in cache_free()
1080 struct di_devlink_handle *hdp = *pp; in handle_free() local
1084 if (hdp == NULL) in handle_free()
1087 (void) close_db(hdp); in handle_free()
1088 cache_free(hdp); in handle_free()
1090 if (HDL_RDWR(hdp)) in handle_free()
1091 exit_db_lock(hdp); in handle_free()
1092 assert(hdp->lock_fd == -1); in handle_free()
1094 free(hdp->dev_dir); in handle_free()
1095 free(hdp->db_dir); in handle_free()
1096 free(hdp); in handle_free()
1104 subtree_free(struct di_devlink_handle *hdp, cache_node_t **pp) in subtree_free() argument
1116 subtree_free(hdp, &np); in subtree_free()
1126 rm_link_from_hash(hdp, clp); in subtree_free()
1129 minor_free(hdp, &cmnp); in subtree_free()
1136 rm_link_from_hash(struct di_devlink_handle *hdp, cache_link_t *clp) in rm_link_from_hash() argument
1147 hval = hashfn(hdp, clp->path); in rm_link_from_hash()
1148 pp = &(CACHE_HASH(hdp, hval)); in rm_link_from_hash()
1161 link_hash(di_devlink_handle_t hdp, const char *link, uint_t flags) in link_hash() argument
1169 hval = hashfn(hdp, link); in link_hash()
1170 pp = &(CACHE_HASH(hdp, hval)); in link_hash()
1189 link2minor(struct di_devlink_handle *hdp, cache_link_t *clp) in link2minor() argument
1205 return (lookup_minor(hdp, minor_path, NULL, in link2minor()
1236 if ((plp = link_hash(hdp, cp, 0)) != NULL && plp->minor != NULL) { in link2minor()
1242 (void) snprintf(link, sizeof (link), "%s/%s", hdp->dev_dir, clp->path); in link2minor()
1280 return (lookup_minor(hdp, minor_path, NULL, TYPE_CACHE|CREATE_FLAG)); in link2minor()
1285 resolve_dangling_links(struct di_devlink_handle *hdp) in resolve_dangling_links() argument
1290 for (pp = &(CACHE(hdp)->dngl); *pp != NULL; ) { in resolve_dangling_links()
1292 if ((cmnp = link2minor(hdp, clp)) != NULL) { in resolve_dangling_links()
1325 minor_free(struct di_devlink_handle *hdp, cache_minor_t **pp) in minor_free() argument
1334 if (CACHE_LAST(hdp) == cmnp) { in minor_free()
1336 CACHE_LAST(hdp) = NULL; in minor_free()
1376 struct di_devlink_handle *hdp, in lookup_minor() argument
1401 if ((vp = get_last_minor(hdp, pdup, colon + 1, flags)) != NULL) { in lookup_minor()
1405 if ((vp = lookup_node(hdp, pdup, flags)) == NULL) { in lookup_minor()
1421 *pp = minor_insert(hdp, vp, colon + 1, nodetype, pp); in lookup_minor()
1423 set_last_minor(hdp, *pp, flags); in lookup_minor()
1432 for (; dmp = get_minor(hdp, nidx); nidx = dmp->sib) { in lookup_minor()
1433 cp = get_string(hdp, dmp->name); in lookup_minor()
1442 lookup_node(struct di_devlink_handle *hdp, char *path, const int flags) in lookup_node() argument
1446 if (tnd.node = get_last_node(hdp, path, flags)) in lookup_node()
1449 tnd.handle = hdp; in lookup_node()
1462 get_last_node(struct di_devlink_handle *hdp, const char *path, int flags) in get_last_node() argument
1474 if (!LOOKUP_CACHE(flags) || CACHE_LAST(hdp) == NULL || in get_last_node()
1475 CACHE_LAST(hdp)->node == NULL) { in get_last_node()
1479 cnp = CACHE_LAST(hdp)->node; in get_last_node()
1494 struct di_devlink_handle *hdp, in get_last_minor() argument
1509 if (!LOOKUP_CACHE(flags) || CACHE_LAST(hdp) == NULL) { in get_last_minor()
1513 cmnp = CACHE_LAST(hdp); in get_last_minor()
1522 set_last_minor(hdp, cmnp, TYPE_CACHE); in get_last_minor()
1530 set_last_minor(struct di_devlink_handle *hdp, cache_minor_t *cmnp, int flags) in set_last_minor() argument
1541 CACHE_LAST(hdp) = cmnp; in set_last_minor()
1642 minor_delete(di_devlink_handle_t hdp, cache_minor_t *cmnp) in minor_delete() argument
1669 delete_unused_nodes(hdp, cmnp->node); in minor_delete()
1678 *lpp = CACHE(hdp)->dngl; in minor_delete()
1679 CACHE(hdp)->dngl = cmnp->link; in minor_delete()
1682 minor_free(hdp, &cmnp); in minor_delete()
1686 delete_unused_nodes(di_devlink_handle_t hdp, cache_node_t *cnp) in delete_unused_nodes() argument
1714 } else if (cnp == CACHE_ROOT(hdp)) { in delete_unused_nodes()
1715 CACHE_ROOT(hdp) = NULL; in delete_unused_nodes()
1721 delete_unused_nodes(hdp, cnp->parent); in delete_unused_nodes()
1729 rm_link(di_devlink_handle_t hdp, const char *link) in rm_link() argument
1734 if (hdp == NULL || DB_ERR(hdp) || link == NULL || link[0] == '/' || in rm_link()
1735 (!HDL_RDWR(hdp) && !HDL_RDONLY(hdp))) { in rm_link()
1744 if ((clp = link_hash(hdp, link, UNLINK_FROM_HASH)) == NULL) { in rm_link()
1748 link_delete(hdp, clp); in rm_link()
1754 di_devlink_rm_link(di_devlink_handle_t hdp, const char *link) in di_devlink_rm_link() argument
1756 if (hdp == NULL || !HDL_RDWR(hdp)) { in di_devlink_rm_link()
1761 return (rm_link(hdp, link)); in di_devlink_rm_link()
1765 link_delete(di_devlink_handle_t hdp, cache_link_t *clp) in link_delete() argument
1773 pp = &(CACHE(hdp)->dngl); in link_delete()
1789 delete_unused_minor(hdp, clp->minor); in link_delete()
1797 delete_unused_minor(di_devlink_handle_t hdp, cache_minor_t *cmnp) in delete_unused_minor() argument
1808 minor_delete(hdp, cmnp); in delete_unused_minor()
1813 di_devlink_handle_t hdp, in di_devlink_add_link() argument
1818 return (add_link(hdp, link, content, flags) != NULL ? 0 : -1); in di_devlink_add_link()
1823 struct di_devlink_handle *hdp, in add_link() argument
1833 if (hdp == NULL || DB_ERR(hdp) || link == NULL || in add_link()
1835 (!HDL_RDWR(hdp) && !HDL_RDONLY(hdp))) { in add_link()
1842 if ((clp = link_hash(hdp, link, 0)) != NULL) { in add_link()
1844 (void) rm_link(hdp, link); in add_link()
1859 if ((cmnp = lookup_minor(hdp, minor_path, NULL, in add_link()
1874 return (link_insert(hdp, cmnp, link, content, attr)); in add_link()
1893 di_devlink_update(di_devlink_handle_t hdp) in di_devlink_update() argument
1895 if (hdp == NULL || !HDL_RDWR(hdp) || DB_ERR(hdp)) { in di_devlink_update()
1904 CACHE(hdp)->update_count = 0; in di_devlink_update()
1910 synchronize_db(di_devlink_handle_t hdp) in synchronize_db() argument
1926 if (recurse_dev(hdp, &rec) != 0) { in synchronize_db()
1930 for (hval = 0; hval < CACHE(hdp)->hash_sz; hval++) { in synchronize_db()
1931 for (clp = CACHE_HASH(hdp, hval); clp != NULL; ) { in synchronize_db()
1947 (void) di_devlink_rm_link(hdp, pdup); in synchronize_db()
1993 struct di_devlink_handle *hdp; in devlink_snapshot() local
1997 if ((hdp = handle_alloc(root_dir, OPEN_RDONLY)) == NULL) { in devlink_snapshot()
2009 again: err = open_db(hdp, OPEN_RDONLY); in devlink_snapshot()
2022 return (hdp); in devlink_snapshot()
2041 di_devlink_handle_t hdp, in di_devlink_walk() argument
2052 if (hdp == NULL || !HDL_RDONLY(hdp)) { in di_devlink_walk()
2074 if (DB_OPEN(hdp)) { in di_devlink_walk()
2075 rv = walk_db(hdp, &linkd); in di_devlink_walk()
2077 rv = walk_dev(hdp, &linkd); in di_devlink_walk()
2133 walk_db(struct di_devlink_handle *hdp, link_desc_t *linkp) in walk_db() argument
2135 assert(DB_OPEN(hdp)); in walk_db()
2138 return (walk_all_links(hdp, linkp)); in walk_db()
2140 return (walk_matching_links(hdp, linkp)); in walk_db()
2145 cache_dev(struct di_devlink_handle *hdp) in cache_dev() argument
2150 assert(hdp); in cache_dev()
2151 assert(HDL_RDONLY(hdp)); in cache_dev()
2153 if (hdp == NULL || !HDL_RDONLY(hdp)) { in cache_dev()
2160 CACHE(hdp)->hash = calloc(sz, sizeof (cache_link_t *)); in cache_dev()
2161 if (CACHE(hdp)->hash == NULL) { in cache_dev()
2164 CACHE(hdp)->hash_sz = sz; in cache_dev()
2169 return (recurse_dev(hdp, &rec)); in cache_dev()
2173 walk_dev(struct di_devlink_handle *hdp, link_desc_t *linkp) in walk_dev() argument
2175 assert(hdp && linkp); in walk_dev()
2176 assert(!DB_OPEN(hdp)); in walk_dev()
2177 assert(HDL_RDONLY(hdp)); in walk_dev()
2179 if (hdp == NULL || !HDL_RDONLY(hdp) || DB_OPEN(hdp)) { in walk_dev()
2184 if (CACHE_EMPTY(hdp) && cache_dev(hdp) != 0) { in walk_dev()
2190 walk_cache_minor(hdp, linkp->minor_path, linkp); in walk_dev()
2192 walk_all_cache(hdp, linkp); in walk_dev()
2199 cache_dev_link(struct di_devlink_handle *hdp, void *data, const char *link) in cache_dev_link() argument
2205 assert(HDL_RDWR(hdp) || HDL_RDONLY(hdp)); in cache_dev_link()
2217 assert(strncmp(link, hdp->dev_dir, strlen(hdp->dev_dir)) == 0); in cache_dev_link()
2222 link += strlen(hdp->dev_dir) + 1; in cache_dev_link()
2224 if ((clp = add_link(hdp, link, content, flags)) != NULL) { in cache_dev_link()
2233 walk_all_links(struct di_devlink_handle *hdp, link_desc_t *linkp) in walk_all_links() argument
2238 assert(DB_NUM(hdp, DB_LINK) >= 1); in walk_all_links()
2240 eidx = DB_NUM(hdp, DB_LINK); in walk_all_links()
2251 if ((dlp = get_link(hdp, nidx)) == NULL) in walk_all_links()
2254 vlink.rel_path = get_string(hdp, dlp->path); in walk_all_links()
2255 vlink.content = get_string(hdp, dlp->content); in walk_all_links()
2258 if (visit_link(hdp, linkp, &vlink) != DI_WALK_CONTINUE) { in walk_all_links()
2267 walk_matching_links(struct di_devlink_handle *hdp, link_desc_t *linkp) in walk_matching_links() argument
2275 dmp = lookup_minor(hdp, linkp->minor_path, NULL, TYPE_DB); in walk_matching_links()
2283 nidx = dmp ? dmp->link : DB_HDR(hdp)->dngl_idx; in walk_matching_links()
2284 for (; dlp = get_link(hdp, nidx); nidx = dlp->sib) { in walk_matching_links()
2287 vlink.rel_path = get_string(hdp, dlp->path); in walk_matching_links()
2288 vlink.content = get_string(hdp, dlp->content); in walk_matching_links()
2291 if (visit_link(hdp, linkp, &vlink) != DI_WALK_CONTINUE) in walk_matching_links()
2307 struct di_devlink_handle *hdp, in visit_link() argument
2325 vlp->rel_path = (char *)rel_path(hdp, vlp->abs_path); in visit_link()
2338 hdp->dev_dir, vlp->rel_path); in visit_link()
2499 rel_path(struct di_devlink_handle *hdp, const char *path) in rel_path() argument
2501 const size_t len = strlen(hdp->dev_dir); in rel_path()
2503 if (strncmp(path, hdp->dev_dir, len) != 0) in rel_path()
2516 recurse_dev(struct di_devlink_handle *hdp, recurse_t *rp) in recurse_dev() argument
2520 (void) do_recurse(hdp->dev_dir, hdp, rp, &ret); in recurse_dev()
2528 struct di_devlink_handle *hdp, in do_recurse() argument
2541 if ((rel = rel_path(hdp, dir)) == NULL) in do_recurse()
2577 rel = rel_path(hdp, cur); in do_recurse()
2587 rv = do_recurse(cur, hdp, rp, retp); in do_recurse()
2589 rv = rp->fcn(hdp, rp->data, cur); in do_recurse()
2644 struct di_devlink_handle *hdp, in node_insert() argument
2653 SET_DB_ERR(hdp); in node_insert()
2658 SET_DB_ERR(hdp); in node_insert()
2663 SET_DB_ERR(hdp); in node_insert()
2672 assert(CACHE(hdp)->root == NULL); in node_insert()
2673 CACHE(hdp)->root = cnp; in node_insert()
2677 } else if (CACHE_LAST(hdp) && CACHE_LAST(hdp)->node && in node_insert()
2678 CACHE_LAST(hdp)->node->parent == pcnp && in node_insert()
2679 CACHE_LAST(hdp)->node->sib == NULL) { in node_insert()
2681 CACHE_LAST(hdp)->node->sib = cnp; in node_insert()
2700 struct di_devlink_handle *hdp, in minor_insert() argument
2710 SET_DB_ERR(hdp); in minor_insert()
2722 SET_DB_ERR(hdp); in minor_insert()
2729 SET_DB_ERR(hdp); in minor_insert()
2752 struct di_devlink_handle *hdp, in link_insert() argument
2762 SET_DB_ERR(hdp); in link_insert()
2767 SET_DB_ERR(hdp); in link_insert()
2774 SET_DB_ERR(hdp); in link_insert()
2780 hash_insert(hdp, clp); in link_insert()
2788 clp->sib = CACHE(hdp)->dngl; in link_insert()
2789 CACHE(hdp)->dngl = clp; in link_insert()
2796 hash_insert(struct di_devlink_handle *hdp, cache_link_t *clp) in hash_insert() argument
2800 hval = hashfn(hdp, clp->path); in hash_insert()
2801 clp->hash = CACHE_HASH(hdp, hval); in hash_insert()
2802 CACHE_HASH(hdp, hval) = clp; in hash_insert()
2807 get_node(struct di_devlink_handle *hdp, uint32_t idx) in get_node() argument
2809 return (map_seg(hdp, idx, PROT_READ, DB_NODE)); in get_node()
2813 set_node(struct di_devlink_handle *hdp, uint32_t idx) in set_node() argument
2815 return (map_seg(hdp, idx, PROT_READ | PROT_WRITE, DB_NODE)); in set_node()
2819 get_minor(struct di_devlink_handle *hdp, uint32_t idx) in get_minor() argument
2821 return (map_seg(hdp, idx, PROT_READ, DB_MINOR)); in get_minor()
2825 set_minor(struct di_devlink_handle *hdp, uint32_t idx) in set_minor() argument
2827 return (map_seg(hdp, idx, PROT_READ | PROT_WRITE, DB_MINOR)); in set_minor()
2831 get_link(struct di_devlink_handle *hdp, uint32_t idx) in get_link() argument
2833 return (map_seg(hdp, idx, PROT_READ, DB_LINK)); in get_link()
2837 set_link(struct di_devlink_handle *hdp, uint32_t idx) in set_link() argument
2839 return (map_seg(hdp, idx, PROT_READ | PROT_WRITE, DB_LINK)); in set_link()
2843 get_string(struct di_devlink_handle *hdp, uint32_t idx) in get_string() argument
2845 return (map_seg(hdp, idx, PROT_READ, DB_STR)); in get_string()
2849 set_string(struct di_devlink_handle *hdp, uint32_t idx) in set_string() argument
2851 return (map_seg(hdp, idx, PROT_READ | PROT_WRITE, DB_STR)); in set_string()
2861 struct di_devlink_handle *hdp, in map_seg() argument
2875 if (!VALID_INDEX(hdp, seg, idx)) { in map_seg()
2885 if (DB_SEG(hdp, seg) != NULL) { in map_seg()
2886 if (DB_SEG_PROT(hdp, seg) != prot) { in map_seg()
2889 seg, idx, DB_SEG_PROT(hdp, seg), prot); in map_seg()
2892 return (DB_SEG(hdp, seg) + idx * elem_sizes[seg]); in map_seg()
2898 off = seg_size(hdp, DB_HEADER); in map_seg()
2900 off += seg_size(hdp, s); in map_seg()
2902 slen = seg_size(hdp, seg); in map_seg()
2904 addr = mmap(0, slen, prot, MAP_SHARED, DB(hdp)->db_fd, off); in map_seg()
2909 " fd=%d, off=%ld\n", (ulong_t)slen, prot, DB(hdp)->db_fd, in map_seg()
2914 DB_SEG(hdp, seg) = addr; in map_seg()
2915 DB_SEG_PROT(hdp, seg) = prot; in map_seg()
2918 "off=%ld, seg_base=%p\n", seg, (ulong_t)slen, prot, DB(hdp)->db_fd, in map_seg()
2921 return (DB_SEG(hdp, seg) + idx * elem_sizes[seg]); in map_seg()
2928 seg_size(struct di_devlink_handle *hdp, int seg) in seg_size() argument
2932 assert(DB_HDR(hdp)->page_sz); in seg_size()
2937 assert(DB_NUM(hdp, seg) >= 1); in seg_size()
2938 sz = DB_NUM(hdp, seg) * elem_sizes[seg]; in seg_size()
2941 sz = (sz / DB_HDR(hdp)->page_sz) + 1; in seg_size()
2943 sz *= DB_HDR(hdp)->page_sz; in seg_size()
2949 size_db(struct di_devlink_handle *hdp, long page_sz, uint32_t *count) in size_db() argument
2962 count_node(CACHE(hdp)->root, count); in size_db()
2964 for (clp = CACHE(hdp)->dngl; clp != NULL; clp = clp->sib) { in size_db()
3042 hashfn(struct di_devlink_handle *hdp, const char *str) in hashfn() argument
3051 assert(CACHE(hdp)->hash_sz >= MIN_HASH_SIZE); in hashfn()
3057 return (hval % CACHE(hdp)->hash_sz); in hashfn()
3074 enter_db_lock(struct di_devlink_handle *hdp, const char *root_dir) in enter_db_lock() argument
3080 int writer = HDL_RDWR(hdp); in enter_db_lock()
3084 assert(hdp->lock_fd < 0); in enter_db_lock()
3086 get_db_path(hdp, DB_LOCK, lockfile, sizeof (lockfile)); in enter_db_lock()
3143 hdp->lock_fd = fd; in enter_db_lock()
3160 exit_db_lock(struct di_devlink_handle *hdp) in exit_db_lock() argument
3163 int writer = HDL_RDWR(hdp); in exit_db_lock()
3165 if (hdp->lock_fd < 0) { in exit_db_lock()
3176 if (fcntl(hdp->lock_fd, F_SETLK, &unlock) == -1) { in exit_db_lock()
3181 (void) close(hdp->lock_fd); in exit_db_lock()
3183 hdp->lock_fd = -1; in exit_db_lock()
3616 walk_cache_links(di_devlink_handle_t hdp, cache_link_t *clp, link_desc_t *linkp) in walk_cache_links() argument
3620 assert(HDL_RDWR(hdp) || HDL_RDONLY(hdp)); in walk_cache_links()
3641 if (visit_link(hdp, linkp, &vlink) in walk_cache_links()
3649 clp = CACHE(hdp)->dngl; in walk_cache_links()
3659 walk_all_cache(di_devlink_handle_t hdp, link_desc_t *linkp) in walk_all_cache() argument
3666 for (i = 0; i < CACHE(hdp)->hash_sz; i++) { in walk_all_cache()
3667 clp = CACHE_HASH(hdp, i); in walk_all_cache()
3676 if (visit_link(hdp, linkp, &vlink) != in walk_all_cache()
3687 walk_cache_minor(di_devlink_handle_t hdp, const char *mpath, link_desc_t *linkp) in walk_cache_minor() argument
3693 if ((cmnp = lookup_minor(hdp, mpath, NULL, TYPE_CACHE)) != NULL) { in walk_cache_minor()
3694 (void) walk_cache_links(hdp, cmnp->link, linkp); in walk_cache_minor()
3701 walk_cache_node(di_devlink_handle_t hdp, const char *path, link_desc_t *linkp) in walk_cache_node() argument
3708 if ((cnp = lookup_node(hdp, (char *)path, TYPE_CACHE)) == NULL) { in walk_cache_node()
3714 if (walk_cache_links(hdp, cmnp->link, linkp) in walk_cache_node()
3740 di_devlink_cache_walk(di_devlink_handle_t hdp, in di_devlink_cache_walk() argument
3750 if (hdp == NULL || path == NULL || !link_flag(flags) || in di_devlink_cache_walk()
3751 !HDL_RDWR(hdp) || devlink_callback == NULL) { in di_devlink_cache_walk()
3767 walk_cache_node(hdp, path, &linkd); in di_devlink_cache_walk()
3769 walk_cache_minor(hdp, path, &linkd); in di_devlink_cache_walk()