/* * Look-up/create a global index file. * * \param env - is the environment passed by the caller * \parap dev - is the dt_device where to lookup/create the global index file * \param parent - is the parent directory where to create the global index if * not found * \param fid - is the fid of the global index to be looked up/created * \parap local - indicates whether the index should be created with a local * generated fid or with \fid * * \retval - pointer to the dt_object of the global index on success, * appropriate error on failure */ struct dt_object *lquota_disk_glb_find_create(const struct lu_env *env, struct dt_device *dev, struct dt_object *parent, struct lu_fid *fid, bool local) { struct lquota_thread_info *qti = lquota_info(env); struct dt_object *glb_idx; const struct dt_index_features *idx_feat; ENTRY; CDEBUG(D_QUOTA, "look-up/create %sglobal idx file ("DFID")\n", local ? "local " : "", PFID(fid)); idx_feat = &dt_quota_glb_features; /* the filename is composed of the most signicant bits of the FID, * that's to say the oid which encodes the pool id, pool type and quota * type */ sprintf(qti->qti_buf, "0x%x", fid->f_oid); if (local) { /* We use the sequence reserved for local named objects */ lu_local_name_obj_fid(&qti->qti_fid, 1); glb_idx = lquota_disk_find_create(env, dev, parent, &qti->qti_fid, idx_feat, qti->qti_buf); } else { /* look-up/create global index on disk */ glb_idx = local_index_find_or_create_with_fid(env, dev, fid, parent, qti->qti_buf, LQUOTA_MODE, idx_feat); } if (IS_ERR(glb_idx)) { CERROR("%s: failed to look-up/create idx file "DFID" rc:%ld " "local:%d\n", dev->dd_lu_dev.ld_obd->obd_name, PFID(fid), PTR_ERR(glb_idx), local); RETURN(glb_idx); } /* install index operation vector */ if (glb_idx->do_index_ops == NULL) { int rc; rc = glb_idx->do_ops->do_index_try(env, glb_idx, idx_feat); if (rc) { CERROR("%s: failed to setup index operations for "DFID " rc:%d\n", dev->dd_lu_dev.ld_obd->obd_name, PFID(lu_object_fid(&glb_idx->do_lu)), rc); dt_object_put(env, glb_idx); glb_idx = ERR_PTR(rc); } } RETURN(glb_idx); }
/* * Look-up a slave index file. If the slave index isn't found: * - if local is set to false, we allocate a FID from FID_SEQ_QUOTA sequence and * create the index. * - otherwise, we create the index file with a local reserved FID (see * lquota_local_oid) * * \param env - is the environment passed by the caller * \param dev - is the backend dt_device where to look-up/create the slave index * \param parent - is the parent directory where to create the slave index if * it does not exist already * \param glb_fid - is the fid of the global index file associated with this * slave index. * \param uuid - is the uuid of slave which is (re)connecting to the master * target * \param local - indicate whether to use local reserved FID (LQUOTA_USR_OID * & LQUOTA_GRP_OID) for the slave index creation or to * allocate a new fid from sequence FID_SEQ_QUOTA * * \retval - pointer to the dt_object of the slave index on success, * appropriate error on failure */ struct dt_object *lquota_disk_slv_find_create(const struct lu_env *env, struct dt_device *dev, struct dt_object *parent, struct lu_fid *glb_fid, struct obd_uuid *uuid, bool local) { struct lquota_thread_info *qti = lquota_info(env); struct dt_object *slv_idx; int rc; ENTRY; LASSERT(uuid != NULL); CDEBUG(D_QUOTA, "lookup/create slave index file for %s\n", obd_uuid2str(uuid)); /* generate filename associated with the slave */ rc = lquota_disk_slv_filename(glb_fid, uuid, qti->qti_buf); if (rc) RETURN(ERR_PTR(rc)); /* Slave indexes uses the FID_SEQ_QUOTA sequence since they can be read * through the network */ qti->qti_fid.f_seq = FID_SEQ_QUOTA; qti->qti_fid.f_ver = 0; if (local) { int type; rc = lquota_extract_fid(glb_fid, NULL, NULL, &type); if (rc) RETURN(ERR_PTR(rc)); /* use predefined fid in the reserved oid list */ qti->qti_fid.f_oid = (type == USRQUOTA) ? LQUOTA_USR_OID : LQUOTA_GRP_OID; slv_idx = local_index_find_or_create_with_fid(env, dev, &qti->qti_fid, parent, qti->qti_buf, LQUOTA_MODE, &dt_quota_slv_features); } else { /* allocate fid dynamically if index does not exist already */ qti->qti_fid.f_oid = LQUOTA_GENERATED_OID; /* lookup/create slave index file */ slv_idx = lquota_disk_find_create(env, dev, parent, &qti->qti_fid, &dt_quota_slv_features, qti->qti_buf); } if (IS_ERR(slv_idx)) RETURN(slv_idx); /* install index operation vector */ if (slv_idx->do_index_ops == NULL) { rc = slv_idx->do_ops->do_index_try(env, slv_idx, &dt_quota_slv_features); if (rc) { CERROR("%s: failed to setup index operations for "DFID " rc:%d\n", dev->dd_lu_dev.ld_obd->obd_name, PFID(lu_object_fid(&slv_idx->do_lu)), rc); lu_object_put(env, &slv_idx->do_lu); slv_idx = ERR_PTR(rc); } } RETURN(slv_idx); }
/* * Look-up/create a global index file. * * \param env - is the environment passed by the caller * \parap dev - is the dt_device where to lookup/create the global index file * \param parent - is the parent directory where to create the global index if * not found * \param fid - is the fid of the global index to be looked up/created * \parap local - indicates whether the index should be created with a local * generated fid or with \fid * * \retval - pointer to the dt_object of the global index on success, * appropriate error on failure */ struct dt_object *lquota_disk_glb_find_create(const struct lu_env *env, struct dt_device *dev, struct dt_object *parent, struct lu_fid *fid, bool local) { struct lquota_thread_info *qti = lquota_info(env); struct dt_object *glb_idx; const struct dt_index_features *idx_feat; ENTRY; CDEBUG(D_QUOTA, "look-up/create %sglobal idx file ("DFID")\n", local ? "local " : "", PFID(fid)); #if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(2,7,50,0) /* we use different index feature for each quota type and target type * for the time being. This is done for on-disk conversion from the old * quota format. Once this is no longer required, we should just be * using dt_quota_glb_features for all global index file */ idx_feat = glb_idx_feature(fid); #else #warning "remove old quota compatibility code" idx_feat = &dt_quota_glb_features; #endif /* the filename is composed of the most signicant bits of the FID, * that's to say the oid which encodes the pool id, pool type and quota * type */ sprintf(qti->qti_buf, "0x%x", fid->f_oid); if (local) { /* We use the sequence reserved for local named objects */ lu_local_name_obj_fid(&qti->qti_fid, 1); glb_idx = lquota_disk_find_create(env, dev, parent, &qti->qti_fid, idx_feat, qti->qti_buf); } else { /* look-up/create global index on disk */ glb_idx = local_index_find_or_create_with_fid(env, dev, fid, parent, qti->qti_buf, LQUOTA_MODE, idx_feat); } if (IS_ERR(glb_idx)) { CERROR("%s: failed to look-up/create idx file "DFID" rc:%ld " "local:%d\n", dev->dd_lu_dev.ld_obd->obd_name, PFID(fid), PTR_ERR(glb_idx), local); RETURN(glb_idx); } /* install index operation vector */ if (glb_idx->do_index_ops == NULL) { int rc; rc = glb_idx->do_ops->do_index_try(env, glb_idx, idx_feat); if (rc) { CERROR("%s: failed to setup index operations for "DFID " rc:%d\n", dev->dd_lu_dev.ld_obd->obd_name, PFID(lu_object_fid(&glb_idx->do_lu)), rc); lu_object_put(env, &glb_idx->do_lu); glb_idx = ERR_PTR(rc); } } RETURN(glb_idx); }