int glfs_h_getxattrs (struct glfs *fs, struct glfs_object *object, const char *name, void *value, size_t size) { int ret = 0; xlator_t *subvol = NULL; inode_t *inode = NULL; loc_t loc = {0, }; dict_t *xattr = NULL; /* validate in args */ if ((fs == NULL) || (object == NULL)) { errno = EINVAL; return -1; } __glfs_entry_fs (fs); /* get the active volume */ subvol = glfs_active_subvol (fs); if (!subvol) { ret = -1; errno = EIO; goto out; } /* get/refresh the in arg objects inode in correlation to the xlator */ inode = glfs_resolve_inode (fs, subvol, object); if (!inode) { errno = ESTALE; goto out; } /* populate loc */ GLFS_LOC_FILL_INODE (inode, loc, out); ret = syncop_getxattr (subvol, &loc, &xattr, name); DECODE_SYNCOP_ERR (ret); if (ret) goto out; ret = glfs_getxattr_process (value, size, xattr, name); out: if (inode) inode_unref (inode); glfs_subvol_done (fs, subvol); return ret; }
int glfsh_get_index_dir_loc (loc_t *rootloc, xlator_t *xl, loc_t *dirloc, int32_t *op_errno) { void *index_gfid = NULL; int ret = 0; dict_t *xattr = NULL; struct iatt iattr = {0}; struct iatt parent = {0}; ret = syncop_getxattr (xl, rootloc, &xattr, GF_XATTROP_INDEX_GFID); if (ret < 0) { *op_errno = -ret; goto out; } ret = dict_get_ptr (xattr, GF_XATTROP_INDEX_GFID, &index_gfid); if (ret < 0) { *op_errno = EINVAL; goto out; } uuid_copy (dirloc->gfid, index_gfid); dirloc->path = ""; dirloc->inode = inode_new (rootloc->inode->table); ret = syncop_lookup (xl, dirloc, NULL, &iattr, NULL, &parent); dirloc->path = NULL; if (ret < 0) { *op_errno = -ret; goto out; } ret = glfsh_link_inode_update_loc (dirloc, &iattr); if (ret) goto out; glfs_loc_touchup (dirloc); ret = 0; out: if (xattr) dict_unref (xattr); return ret; }
loc_t loc = {0,}; dict_t *xattr = NULL; dict_t *old_xattr = NULL; afr_private_t *priv = NULL; int i = 0; priv = this->private; loc.inode = inode_ref (inode); gf_uuid_copy (loc.gfid, inode->gfid); gf_msg (this->name, GF_LOG_INFO, 0, AFR_MSG_SELF_HEAL_INFO, "performing metadata selfheal on %s", uuid_utoa (inode->gfid)); ret = syncop_getxattr (priv->children[source], &loc, &xattr, NULL, NULL, NULL); if (ret < 0) { ret = -EIO; goto out; } afr_delete_ignorable_xattrs (xattr); for (i = 0; i < priv->child_count; i++) { if (old_xattr) { dict_unref (old_xattr); old_xattr = NULL; } if (!healed_sinks[i]) continue;