in->lsr_index = seq->lcs_space.lsr_index;
if (seq->lcs_type == LUSTRE_SEQ_METADATA)
- in->lsr_flags = LU_SEQ_RANGE_MDT;
+ fld_range_set_mdt(in);
else
- in->lsr_flags = LU_SEQ_RANGE_OST;
+ fld_range_set_ost(in);
if (opc == SEQ_ALLOC_SUPER) {
req->rq_request_portal = SEQ_CONTROLLER_PORTAL;
* 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,
seqno_t seq, struct lu_seq_range *range)
{
- struct lu_seq_range *erange;
- struct fld_thread_info *info;
- int rc;
- ENTRY;
+ 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(erange->lsr_flags != range->lsr_flags) &&
- range->lsr_flags != -1) {
- CERROR("FLD cache found a range "DRANGE" doesn't "
- "match the requested flag %x\n",
- PRANGE(erange), range->lsr_flags);
- RETURN(-EIO);
- }
- *range = *erange;
- RETURN(0);
- }
+ /* 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);
+ }
if (fld->lsf_obj) {
/* On server side, all entries should be in cache.
* If we can not find it in cache, just return error */
- CERROR("%s: Can not found the seq "LPX64"\n",
- fld->lsf_name, seq);
+ CERROR("%s: Cannot find sequence "LPX64": rc = %d\n",
+ fld->lsf_name, seq, -EIO);
RETURN(-EIO);
} else {
LASSERT(fld->lsf_control_exp);
!(exp_connect_flags(exp) & OBD_CONNECT_MDS_MDS) &&
!(exp_connect_flags(exp) & OBD_CONNECT_LIGHTWEIGHT) &&
!exp->exp_libclient)
- out->lsr_flags = LU_SEQ_RANGE_MDT;
+ fld_range_set_mdt(out);
rc = fld_server_handle(lu_site2seq(site)->ss_server_fld,
req->rq_svc_thread->t_env,
*opc, out, info);
- } else
+ } else {
rc = err_serious(-EPROTO);
+ }
- RETURN(rc);
+ RETURN(rc);
}
static void fld_thread_info_init(struct ptlrpc_request *req,
int fld_server_init(const struct lu_env *env, struct lu_server_fld *fld,
struct dt_device *dt, const char *prefix, int mds_node_id,
- __u32 lsr_flags)
+ int type)
{
- int cache_size, cache_threshold;
- int rc;
- ENTRY;
+ int cache_size, cache_threshold;
+ int rc;
+ ENTRY;
snprintf(fld->lsf_name, sizeof(fld->lsf_name),
"srv-%s", prefix);
GOTO(out, rc);
}
- if (!mds_node_id && lsr_flags == LU_SEQ_RANGE_MDT) {
+ if (!mds_node_id && type == LU_SEQ_RANGE_MDT) {
rc = fld_index_init(env, fld, dt);
if (rc)
GOTO(out, rc);
- } else
+ } else {
fld->lsf_obj = NULL;
+ }
rc = fld_server_proc_init(fld);
if (rc)
}
int fld_client_lookup(struct lu_client_fld *fld, seqno_t seq, mdsno_t *mds,
- __u32 flags, const struct lu_env *env)
+ __u32 flags, const struct lu_env *env)
{
- struct lu_seq_range res;
- struct lu_fld_target *target;
- int rc;
- ENTRY;
+ struct lu_seq_range res = { 0 };
+ struct lu_fld_target *target;
+ int rc;
+ ENTRY;
fld->lcf_flags |= LUSTRE_FLD_RUN;
"target %s (idx "LPU64")\n", fld->lcf_name, seq,
fld_target_name(target), target->ft_idx);
- res.lsr_start = seq;
- res.lsr_flags = flags;
+ res.lsr_start = seq;
+ fld_range_set_type(&res, flags);
#ifdef __KERNEL__
- if (target->ft_srv != NULL) {
+ if (target->ft_srv != NULL) {
LASSERT(env != NULL);
rc = fld_server_lookup(env, target->ft_srv, seq, &res);
- } else {
+ } else {
#endif
- rc = fld_client_rpc(target->ft_exp,
- &res, FLD_LOOKUP);
+ rc = fld_client_rpc(target->ft_exp, &res, FLD_LOOKUP);
#ifdef __KERNEL__
- }
+ }
#endif
- if (rc == 0) {
- *mds = res.lsr_index;
+ if (rc == 0) {
+ *mds = res.lsr_index;
fld_cache_insert(fld->lcf_cache, &res);
- }
- RETURN(rc);
+ }
+ RETURN(rc);
}
EXPORT_SYMBOL(fld_client_lookup);
* Same structure is used in fld module where lsr_index field holds mdt id
* of the home mdt.
*/
-
-#define LU_SEQ_RANGE_MDT 0x0
-#define LU_SEQ_RANGE_OST 0x1
-
struct lu_seq_range {
- __u64 lsr_start;
- __u64 lsr_end;
- __u32 lsr_index;
- __u32 lsr_flags;
+ __u64 lsr_start;
+ __u64 lsr_end;
+ __u32 lsr_index;
+ __u32 lsr_flags;
};
+#define LU_SEQ_RANGE_MDT 0x0
+#define LU_SEQ_RANGE_OST 0x1
+#define LU_SEQ_RANGE_ANY 0x3
+
+#define LU_SEQ_RANGE_MASK 0x3
+
+static inline unsigned fld_range_type(const struct lu_seq_range *range)
+{
+ return range->lsr_flags & LU_SEQ_RANGE_MASK;
+}
+
+static inline int fld_range_is_ost(const struct lu_seq_range *range)
+{
+ return fld_range_type(range) == LU_SEQ_RANGE_OST;
+}
+
+static inline int fld_range_is_mdt(const struct lu_seq_range *range)
+{
+ return fld_range_type(range) == LU_SEQ_RANGE_MDT;
+}
+
+/**
+ * This all range is only being used when fld client sends fld query request,
+ * but it does not know whether the seq is MDT or OST, so it will send req
+ * with ALL type, which means either seq type gotten from lookup can be
+ * expected.
+ */
+static inline unsigned fld_range_is_any(const struct lu_seq_range *range)
+{
+ return fld_range_type(range) == LU_SEQ_RANGE_ANY;
+}
+
+static inline void fld_range_set_type(struct lu_seq_range *range,
+ unsigned flags)
+{
+ LASSERT(!(flags & ~LU_SEQ_RANGE_MASK));
+ range->lsr_flags |= flags;
+}
+
+static inline void fld_range_set_mdt(struct lu_seq_range *range)
+{
+ fld_range_set_type(range, LU_SEQ_RANGE_MDT);
+}
+
+static inline void fld_range_set_ost(struct lu_seq_range *range)
+{
+ fld_range_set_type(range, LU_SEQ_RANGE_OST);
+}
+
+static inline void fld_range_set_any(struct lu_seq_range *range)
+{
+ fld_range_set_type(range, LU_SEQ_RANGE_ANY);
+}
+
/**
* returns width of given range \a r
*/
#define DRANGE "[%#16.16"LPF64"x-%#16.16"LPF64"x):%x:%s"
-#define PRANGE(range) \
- (range)->lsr_start, \
- (range)->lsr_end, \
- (range)->lsr_index, \
- (range)->lsr_flags == LU_SEQ_RANGE_MDT ? "mdt" : "ost"
+#define PRANGE(range) \
+ (range)->lsr_start, \
+ (range)->lsr_end, \
+ (range)->lsr_index, \
+ fld_range_is_mdt(range) ? "mdt" : "ost"
/** \defgroup lu_fid lu_fid
/* Server methods */
int fld_server_init(const struct lu_env *env, struct lu_server_fld *fld,
struct dt_device *dt, const char *prefix, int mds_node_id,
- __u32 lsr_flags);
+ int type);
void fld_server_fini(const struct lu_env *env, struct lu_server_fld *fld);
* \param lod LOD to be lookup at.
* \param fid FID of object to find MDT/OST.
* \param tgt MDT/OST index to return.
- * \param flags indidcate the FID is on MDS or OST.
+ * \param type indidcate the FID is on MDS or OST.
**/
int lod_fld_lookup(const struct lu_env *env, struct lod_device *lod,
- const struct lu_fid *fid, __u32 *tgt, int flags)
+ const struct lu_fid *fid, __u32 *tgt, int type)
{
- struct lu_seq_range range;
+ struct lu_seq_range range = { 0 };
struct lu_server_fld *server_fld;
int rc = 0;
ENTRY;
}
server_fld = lu_site2seq(lod2lu_dev(lod)->ld_site)->ss_server_fld;
- range.lsr_flags = flags;
+ fld_range_set_type(&range, type);
rc = fld_server_lookup(env, server_fld, fid_seq(fid), &range);
if (rc) {
CERROR("%s: Can't find tgt by seq "LPX64", rc %d\n",
/* 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;
- range.lsr_flags = LU_SEQ_RANGE_MDT;
+ fld_range_set_mdt(&range);
mutex_lock(&ss->ss_server_fld->lsf_lock);
rc = fld_insert_entry(env, ss->ss_server_fld, &range);
int rc;
if (fid_is_idif(fid)) {
- range->lsr_flags = LU_SEQ_RANGE_OST;
+ fld_range_set_ost(range);
range->lsr_index = fid_idif_ost_idx(fid);
return 0;
}
if (!fid_seq_in_fldb(fid_seq(fid))) {
- range->lsr_flags = LU_SEQ_RANGE_MDT;
+ fld_range_set_mdt(range);
if (ss != NULL)
/* FIXME: If ss is NULL, it suppose not get lsr_index
* at all */
}
LASSERT(ss != NULL);
- range->lsr_flags = -1;
+ fld_range_set_any(range);
rc = fld_server_lookup(env, ss->ss_server_fld, fid_seq(fid), range);
if (rc != 0) {
- CERROR("%s can not find "DFID": rc = %d\n",
+ CERROR("%s: cannot find FLD range for "DFID": rc = %d\n",
osd_name(osd), PFID(fid), rc);
}
return rc;
rc = osd_fld_lookup(info->oti_env, osd, fid, range);
if (rc != 0) {
CERROR("%s: Can not lookup fld for "DFID"\n",
- osd2lu_dev(osd)->ld_obd->obd_name, PFID(fid));
+ osd_name(osd), PFID(fid));
RETURN(rc);
}
CDEBUG(D_INFO, "fid "DFID" range "DRANGE"\n", PFID(fid),
PRANGE(range));
- if (range->lsr_flags == LU_SEQ_RANGE_OST)
+ if (fld_range_is_ost(range))
RETURN(1);
RETURN(0);
struct seq_server_site *ss = osd_seq_site(osd);
int rc;
- if (fid_is_root(fid)) {
- range->lsr_flags = LU_SEQ_RANGE_MDT;
- range->lsr_index = 0;
- return 0;
- }
-
if (fid_is_idif(fid)) {
- range->lsr_flags = LU_SEQ_RANGE_OST;
+ fld_range_set_ost(range);
range->lsr_index = fid_idif_ost_idx(fid);
return 0;
}
- if (!fid_is_norm(fid)) {
- range->lsr_flags = LU_SEQ_RANGE_MDT;
- /* If ss is NULL, it suppose not get lsr_index at all */
+ if (!fid_seq_in_fldb(fid_seq(fid))) {
+ fld_range_set_mdt(range);
if (ss != NULL)
+ /* FIXME: If ss is NULL, it suppose not get lsr_index
+ * at all */
range->lsr_index = ss->ss_node_id;
return 0;
}
LASSERT(ss != NULL);
- range->lsr_flags = -1;
+ fld_range_set_any(range);
rc = fld_server_lookup(env, ss->ss_server_fld, fid_seq(fid), range);
if (rc != 0)
- CERROR("%s can not find "DFID": rc = %d\n",
+ CERROR("%s: cannot find FLD range for "DFID": rc = %d\n",
osd_name(osd), PFID(fid), rc);
return rc;
}
rc = osd_fld_lookup(env, osd, fid, range);
if (rc != 0) {
CERROR("%s: Can not lookup fld for "DFID"\n",
- osd2lu_dev(osd)->ld_obd->obd_name, PFID(fid));
+ osd_name(osd), PFID(fid));
RETURN(rc);
}
CDEBUG(D_INFO, "fid "DFID" range "DRANGE"\n", PFID(fid),
PRANGE(range));
- if (range->lsr_flags == LU_SEQ_RANGE_OST)
+ if (fld_range_is_ost(range))
RETURN(1);
RETURN(0);