/** * Open an OI(Ojbect Index) container. * * \param name Name of OI container * \param objp Pointer of returned OI * * \retval 0 success * \retval -ve failure */ static int osd_oi_open(struct osd_thread_info *info, struct osd_device *osd, char *name, struct osd_oi **oi_slot, bool create) { struct osd_directory *dir; struct iam_container *bag; struct inode *inode; struct osd_oi *oi; int rc; ENTRY; oi_feat.dif_keysize_min = sizeof(struct lu_fid); oi_feat.dif_keysize_max = sizeof(struct lu_fid); inode = osd_oi_index_open(info, osd, name, &oi_feat, create); if (IS_ERR(inode)) RETURN(PTR_ERR(inode)); ldiskfs_set_inode_state(inode, LDISKFS_STATE_LUSTRE_NO_OI); /* 'What the @fid is' is not imporatant, because these objects * have no OI mappings, and only are visible inside the OSD.*/ lu_igif_build(&info->oti_fid, inode->i_ino, inode->i_generation); rc = osd_ea_fid_set(info, inode, &info->oti_fid, LMAC_NOT_IN_OI, 0); if (rc != 0) GOTO(out_inode, rc); OBD_ALLOC_PTR(oi); if (oi == NULL) GOTO(out_inode, rc = -ENOMEM); oi->oi_inode = inode; dir = &oi->oi_dir; bag = &dir->od_container; rc = iam_container_init(bag, &dir->od_descr, inode); if (rc < 0) GOTO(out_free, rc); rc = iam_container_setup(bag); if (rc < 0) GOTO(out_container, rc); *oi_slot = oi; RETURN(0); out_container: iam_container_fini(bag); out_free: OBD_FREE_PTR(oi); out_inode: iput(inode); return rc; }
static void osd_oi_table_put(struct osd_thread_info *info, struct osd_oi **oi_table, unsigned oi_count) { struct iam_container *bag; int i; for (i = 0; i < oi_count; i++) { if (oi_table[i] == NULL) continue; LASSERT(oi_table[i]->oi_inode != NULL); bag = &(oi_table[i]->oi_dir.od_container); if (bag->ic_object == oi_table[i]->oi_inode) iam_container_fini(bag); iput(oi_table[i]->oi_inode); oi_table[i]->oi_inode = NULL; OBD_FREE_PTR(oi_table[i]); oi_table[i] = NULL; } }