From: wangdi Date: Fri, 24 Jan 2014 22:31:52 +0000 (-0800) Subject: LU-2681 fld: shrink seq_type in lsr_flags X-Git-Tag: 2.3.64~9 X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=commitdiff_plain;h=ec0c7b569d5a2f25c8ea80f515d2bdc853abc7df LU-2681 fld: shrink seq_type in lsr_flags In lu_seq_range, lsr_flags is treated to only hold LU_SEQ_RANGE_MDT, LU_SEQ_RANGE_OST or LU_SEQ_RANGE_ANY. Because they can fit into two bits, using lsr_flags(32 bits) is clearly unnecessary. This patch will shrink the current seq_type to 2 bits, so other flags can be used in lsr_flags in future. Add wrapper functions to access and set the flags: fld_range_set_mdt(), fld_range_set_ost(), fld_range_set_any() fld_range_is_mdt(), fld_range_is_ost(), fld_range_is_any() If another target type were needed, it could potentially use LU_SEQ_RANGE_FOO 0x2, which is currently unused. Signed-off-by: Wang Di Change-Id: I721c9fe5778ee331d3f77ac885f3b482e2322c85 Reviewed-on: http://review.whamcloud.com/5999 Reviewed-by: Andreas Dilger Tested-by: Hudson Tested-by: Maloo Reviewed-by: Alex Zhuravlev --- diff --git a/lustre/fid/fid_request.c b/lustre/fid/fid_request.c index 6facae1..4a5e307 100644 --- a/lustre/fid/fid_request.c +++ b/lustre/fid/fid_request.c @@ -89,9 +89,9 @@ static int seq_client_rpc(struct lu_client_seq *seq, 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; diff --git a/lustre/fld/fld_handler.c b/lustre/fld/fld_handler.c index dbab93b..dabcddf 100644 --- a/lustre/fld/fld_handler.c +++ b/lustre/fld/fld_handler.c @@ -136,38 +136,37 @@ EXPORT_SYMBOL(fld_server_create); * 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); @@ -245,15 +244,16 @@ static int fld_req_handle(struct ptlrpc_request *req, !(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, @@ -382,11 +382,11 @@ static void fld_server_proc_fini(struct lu_server_fld *fld) 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); @@ -406,12 +406,13 @@ int fld_server_init(const struct lu_env *env, struct lu_server_fld *fld, 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) diff --git a/lustre/fld/fld_request.c b/lustre/fld/fld_request.c index 55e93cb..995581a 100644 --- a/lustre/fld/fld_request.c +++ b/lustre/fld/fld_request.c @@ -476,12 +476,12 @@ out_req: } 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; @@ -499,26 +499,25 @@ int fld_client_lookup(struct lu_client_fld *fld, seqno_t seq, mdsno_t *mds, "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); diff --git a/lustre/include/lustre/lustre_idl.h b/lustre/include/lustre/lustre_idl.h index 15842e5..aceaeba 100644 --- a/lustre/include/lustre/lustre_idl.h +++ b/lustre/include/lustre/lustre_idl.h @@ -188,17 +188,67 @@ typedef __u32 obd_count; * 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 */ @@ -253,11 +303,11 @@ static inline int range_compare_loc(const struct lu_seq_range *r1, #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 diff --git a/lustre/include/lustre_fld.h b/lustre/include/lustre_fld.h index 8e329c8..c6784c5 100644 --- a/lustre/include/lustre_fld.h +++ b/lustre/include/lustre_fld.h @@ -149,7 +149,7 @@ int fld_query(struct com_thread_info *info); /* 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); diff --git a/lustre/lod/lod_dev.c b/lustre/lod/lod_dev.c index 652ebf4..b7440cb 100644 --- a/lustre/lod/lod_dev.c +++ b/lustre/lod/lod_dev.c @@ -56,12 +56,12 @@ * \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; @@ -79,7 +79,7 @@ int lod_fld_lookup(const struct lu_env *env, struct lod_device *lod, } 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", diff --git a/lustre/mdd/mdd_compat.c b/lustre/mdd/mdd_compat.c index 64e3ced..91b97ea 100644 --- a/lustre/mdd/mdd_compat.c +++ b/lustre/mdd/mdd_compat.c @@ -284,7 +284,7 @@ static int mdd_fill_fldb(const struct lu_env *env, struct mdd_device *mdd) /* 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); diff --git a/lustre/osd-ldiskfs/osd_handler.c b/lustre/osd-ldiskfs/osd_handler.c index 5d44fc2..7981fd5 100644 --- a/lustre/osd-ldiskfs/osd_handler.c +++ b/lustre/osd-ldiskfs/osd_handler.c @@ -2002,13 +2002,13 @@ int osd_fld_lookup(const struct lu_env *env, struct osd_device *osd, 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 */ @@ -2017,10 +2017,10 @@ int osd_fld_lookup(const struct lu_env *env, struct osd_device *osd, } 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; diff --git a/lustre/osd-ldiskfs/osd_oi.c b/lustre/osd-ldiskfs/osd_oi.c index d159403..574b706 100644 --- a/lustre/osd-ldiskfs/osd_oi.c +++ b/lustre/osd-ldiskfs/osd_oi.c @@ -477,14 +477,14 @@ int fid_is_on_ost(struct osd_thread_info *info, struct osd_device *osd, 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); diff --git a/lustre/osd-zfs/osd_oi.c b/lustre/osd-zfs/osd_oi.c index ad6a1252..e059cf7 100644 --- a/lustre/osd-zfs/osd_oi.c +++ b/lustre/osd-zfs/osd_oi.c @@ -218,31 +218,26 @@ int osd_fld_lookup(const struct lu_env *env, struct osd_device *osd, 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; } @@ -260,14 +255,14 @@ int fid_is_on_ost(const struct lu_env *env, struct osd_device *osd, 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);