static int fld_insert_special_entries(const struct lu_env *env, struct lu_server_fld *fld) { int rc; rc = fld_insert_entry(env, fld, &IGIF_FLD_RANGE); if (rc != 0) RETURN(rc); rc = fld_insert_entry(env, fld, &ROOT_FLD_RANGE); RETURN(rc); }
static int mdd_fill_fldb(const struct lu_env *env, struct mdd_device *mdd) { struct seq_server_site *ss = mdd_seq_site(mdd); struct lu_seq_range range; int rc; LASSERT(ss->ss_server_seq != NULL); LASSERT(ss->ss_server_fld != NULL); if (ss->ss_server_seq->lss_space.lsr_end == 0) return 0; memcpy(&range, &ss->ss_server_seq->lss_space, sizeof(range)); /* Pre-existing ZFS does not insert any entries to FLDB, we need * to insert it to FLDB during convertion */ range.lsr_start = FID_SEQ_NORMAL; fld_range_set_mdt(&range); mutex_lock(&ss->ss_server_fld->lsf_lock); rc = fld_insert_entry(env, ss->ss_server_fld, &range); mutex_unlock(&ss->ss_server_fld->lsf_lock); LCONSOLE_INFO("%s: insert missing range "DRANGE"\n", mdd2obd_dev(mdd)->obd_name, PRANGE(&range)); return rc; }
/** * Check if the sequence server has sequence avaible * * Check if the sequence server has sequence avaible, if not, then * allocating super sequence from sequence manager (MDT0). * * \param[in] env execution environment * \param[in] seq server sequence * * \retval negative errno if allocating new sequence fails * \retval 0 if there is enough sequence or allocating * new sequence succeeds */ int seq_server_check_and_alloc_super(const struct lu_env *env, struct lu_server_seq *seq) { struct lu_seq_range *space = &seq->lss_space; int rc = 0; ENTRY; /* Check if available space ends and allocate new super seq */ if (lu_seq_range_is_exhausted(space)) { if (!seq->lss_cli) { CERROR("%s: No sequence controller is attached.\n", seq->lss_name); RETURN(-ENODEV); } rc = seq_client_alloc_super(seq->lss_cli, env); if (rc) { CDEBUG(D_HA, "%s: Can't allocate super-sequence:" " rc %d\n", seq->lss_name, rc); RETURN(rc); } /* Saving new range to allocation space. */ *space = seq->lss_cli->lcs_space; LASSERT(lu_seq_range_is_sane(space)); if (seq->lss_cli->lcs_srv == NULL) { struct lu_server_fld *fld; /* Insert it to the local FLDB */ fld = seq->lss_site->ss_server_fld; mutex_lock(&fld->lsf_lock); rc = fld_insert_entry(env, fld, space); mutex_unlock(&fld->lsf_lock); } } if (lu_seq_range_is_zero(&seq->lss_lowater_set)) __seq_set_init(env, seq); RETURN(rc); }
/** * Retrieve fldb entry from MDT0 and add to local FLDB and cache. **/ int fld_update_from_controller(const struct lu_env *env, struct lu_server_fld *fld) { struct fld_thread_info *info; struct lu_seq_range *range; struct lu_seq_range_array *lsra; __u32 index; struct ptlrpc_request *req; int rc; int i; ENTRY; /* Update only happens during initalization, i.e. local FLDB * does not exist yet */ if (!fld->lsf_new) RETURN(0); rc = fld_name_to_index(fld->lsf_name, &index); if (rc < 0) RETURN(rc); /* No need update fldb for MDT0 */ if (index == 0) RETURN(0); info = lu_context_key_get(&env->le_ctx, &fld_thread_key); LASSERT(info != NULL); range = &info->fti_lrange; memset(range, 0, sizeof(*range)); range->lsr_index = index; fld_range_set_mdt(range); do { rc = fld_client_rpc(fld->lsf_control_exp, range, FLD_READ, &req); if (rc != 0 && rc != -EAGAIN) GOTO(out, rc); LASSERT(req != NULL); lsra = (struct lu_seq_range_array *)req_capsule_server_get( &req->rq_pill, &RMF_GENERIC_DATA); if (lsra == NULL) GOTO(out, rc = -EPROTO); range_array_le_to_cpu(lsra, lsra); for (i = 0; i < lsra->lsra_count; i++) { int rc1; if (lsra->lsra_lsr[i].lsr_flags != LU_SEQ_RANGE_MDT) GOTO(out, rc = -EINVAL); if (lsra->lsra_lsr[i].lsr_index != index) GOTO(out, rc = -EINVAL); mutex_lock(&fld->lsf_lock); rc1 = fld_insert_entry(env, fld, &lsra->lsra_lsr[i]); mutex_unlock(&fld->lsf_lock); if (rc1 != 0) GOTO(out, rc = rc1); } if (rc == -EAGAIN) *range = lsra->lsra_lsr[lsra->lsra_count - 1]; } while (rc == -EAGAIN); fld->lsf_new = 1; out: if (req != NULL) ptlrpc_req_finished(req); RETURN(rc); }