static int osd_oi_index_create_one(struct osd_thread_info *info, struct osd_device *osd, const char *name, struct dt_index_features *feat) { const struct lu_env *env = info->oti_env; struct osd_inode_id *id = &info->oti_id; struct buffer_head *bh; struct inode *inode; struct ldiskfs_dir_entry_2 *de; struct dentry *dentry; struct super_block *sb = osd_sb(osd); struct inode *dir = sb->s_root->d_inode; handle_t *jh; int rc; dentry = osd_child_dentry_by_inode(env, dir, name, strlen(name)); bh = osd_ldiskfs_find_entry(dir, &dentry->d_name, &de, NULL, NULL); if (bh) { osd_id_gen(id, le32_to_cpu(de->inode), OSD_OII_NOGEN); brelse(bh); inode = osd_iget(info, osd, id); if (!IS_ERR(inode)) { iput(inode); inode = ERR_PTR(-EEXIST); } return PTR_ERR(inode); } jh = osd_journal_start_sb(sb, LDISKFS_HT_MISC, 100); if (IS_ERR(jh)) return PTR_ERR(jh); inode = ldiskfs_create_inode(jh, dir, (S_IFREG | S_IRUGO | S_IWUSR)); if (IS_ERR(inode)) { ldiskfs_journal_stop(jh); return PTR_ERR(inode); } ldiskfs_set_inode_state(inode, LDISKFS_STATE_LUSTRE_NOSCRUB); unlock_new_inode(inode); if (feat->dif_flags & DT_IND_VARKEY) rc = iam_lvar_create(inode, feat->dif_keysize_max, feat->dif_ptrsize, feat->dif_recsize_max, jh); else rc = iam_lfix_create(inode, feat->dif_keysize_max, feat->dif_ptrsize, feat->dif_recsize_max, jh); dentry = osd_child_dentry_by_inode(env, dir, name, strlen(name)); rc = osd_ldiskfs_add_entry(info, jh, dentry, inode, NULL); ldiskfs_journal_stop(jh); iput(inode); return rc; }
/** * 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; }