- int rc;
- ENTRY;
-
- /* Lookup it in the cache. */
- rc = fld_cache_lookup(fld->lsf_cache, seq, mds);
- if (rc == 0)
- RETURN(0);
-
- rc = fld_index_lookup(fld, env, seq, mds);
- if (rc == 0) {
- /*
- * Do not return error here as well. See previous comment in
- * same situation in function fld_server_create().
- */
- fld_cache_insert(fld->lsf_cache, seq, *mds);
- }
- RETURN(rc);
+ struct lu_seq_range *erange;
+ struct fld_thread_info *info;
+ int rc;
+ ENTRY;
+
+ info = lu_context_key_get(&env->le_ctx, &fld_thread_key);
+ LASSERT(info != NULL);
+ erange = &info->fti_lrange;
+
+ /* Lookup it in the cache. */
+ rc = fld_cache_lookup(fld->lsf_cache, seq, erange);
+ if (rc == 0) {
+ if (unlikely(fld_range_type(erange) != fld_range_type(range) &&
+ !fld_range_is_any(range))) {
+ CERROR("%s: FLD cache range "DRANGE" does not match"
+ "requested flag %x: rc = %d\n", fld->lsf_name,
+ PRANGE(erange), range->lsr_flags, -EIO);
+ RETURN(-EIO);
+ }
+ *range = *erange;
+ RETURN(0);
+ }
+ RETURN(rc);
+}
+EXPORT_SYMBOL(fld_local_lookup);
+
+/**
+ * Lookup MDT/OST by seq, returns a range for given seq.
+ *
+ * If that entry is not cached in fld cache, request is sent to super
+ * sequence controller node (MDT0). All other MDT[1...N] and client
+ * cache fld entries, but this cache is not persistent.
+ */
+int fld_server_lookup(const struct lu_env *env, struct lu_server_fld *fld,
+ u64 seq, struct lu_seq_range *range)
+{
+ __u32 index;
+ int rc;
+ ENTRY;
+
+ rc = fld_local_lookup(env, fld, seq, range);
+ if (likely(rc == 0))
+ RETURN(rc);
+
+ rc = fld_name_to_index(fld->lsf_name, &index);
+ if (rc < 0)
+ RETURN(rc);
+
+ if (index == 0 && rc == LDD_F_SV_TYPE_MDT) {
+ /* On server side, all entries should be in cache.
+ * If we can not find it in cache, just return error */
+ CERROR("%s: Cannot find sequence %#llx: rc = %d\n",
+ fld->lsf_name, seq, -ENOENT);
+ RETURN(-ENOENT);
+ } else {
+ if (fld->lsf_control_exp == NULL) {
+ CERROR("%s: lookup %#llx, but not connects to MDT0"
+ "yet: rc = %d.\n", fld->lsf_name, seq, -EIO);
+ RETURN(-EIO);
+ }
+ /* send request to mdt0 i.e. super seq. controller.
+ * This is temporary solution, long term solution is fld
+ * replication on all mdt servers.
+ */
+ range->lsr_start = seq;
+ rc = fld_client_rpc(fld->lsf_control_exp,
+ range, FLD_QUERY, NULL);
+ if (rc == 0)
+ fld_cache_insert(fld->lsf_cache, range);
+ }
+ RETURN(rc);