static int update_vnode_info(void) { struct vnode_info *vnode_info; vnode_info = zalloc(sizeof(*vnode_info)); if (!vnode_info) { eprintf("failed to allocate memory\n"); return 1; } vnode_info->nr_vnodes = nodes_to_vnodes(sys->nodes, sys->nr_nodes, vnode_info->entries); vnode_info->nr_zones = get_zones_nr_from(sys->nodes, sys->nr_nodes); vnode_info->refcnt = 1; put_vnode_info(current_vnode_info); current_vnode_info = vnode_info; return 0; }
struct vnode_info *alloc_vnode_info(struct sd_node *nodes, size_t nr_nodes) { struct vnode_info *vnode_info; vnode_info = xzalloc(sizeof(*vnode_info)); vnode_info->nr_nodes = nr_nodes; memcpy(vnode_info->nodes, nodes, sizeof(*nodes) * nr_nodes); qsort(vnode_info->nodes, nr_nodes, sizeof(*nodes), node_id_cmp); recalculate_vnodes(vnode_info->nodes, nr_nodes); vnode_info->nr_vnodes = nodes_to_vnodes(vnode_info->nodes, nr_nodes, vnode_info->vnodes); vnode_info->nr_zones = get_zones_nr_from(nodes, nr_nodes); uatomic_set(&vnode_info->refcnt, 1); return vnode_info; }
/* * If we have less zones available than the desired redundancy we have to do * with nr_zones copies, sorry. * * Note that you generally want to use get_nr_copies below, as it uses the * current vnode state snapshot instead of global data. */ int get_max_nr_copies_from(struct sd_node *nodes, int nr_nodes) { return min((int)sys->nr_copies, get_zones_nr_from(nodes, nr_nodes)); }