Whamcloud - gitweb
LU-2681 fld: shrink seq_type in lsr_flags
authorwangdi <di.wang@whamcloud.com>
Fri, 24 Jan 2014 22:31:52 +0000 (14:31 -0800)
committerOleg Drokin <oleg.drokin@intel.com>
Thu, 11 Apr 2013 19:37:42 +0000 (15:37 -0400)
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 <di.wang@intel.com>
Change-Id: I721c9fe5778ee331d3f77ac885f3b482e2322c85
Reviewed-on: http://review.whamcloud.com/5999
Reviewed-by: Andreas Dilger <andreas.dilger@intel.com>
Tested-by: Hudson
Tested-by: Maloo <whamcloud.maloo@gmail.com>
Reviewed-by: Alex Zhuravlev <alexey.zhuravlev@intel.com>
lustre/fid/fid_request.c
lustre/fld/fld_handler.c
lustre/fld/fld_request.c
lustre/include/lustre/lustre_idl.h
lustre/include/lustre_fld.h
lustre/lod/lod_dev.c
lustre/mdd/mdd_compat.c
lustre/osd-ldiskfs/osd_handler.c
lustre/osd-ldiskfs/osd_oi.c
lustre/osd-zfs/osd_oi.c

index 6facae1..4a5e307 100644 (file)
@@ -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;
index dbab93b..dabcddf 100644 (file)
@@ -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)
index 55e93cb..995581a 100644 (file)
@@ -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);
 
index 15842e5..aceaeba 100644 (file)
@@ -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
index 8e329c8..c6784c5 100644 (file)
@@ -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);
 
index 652ebf4..b7440cb 100644 (file)
  * \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",
index 64e3ced..91b97ea 100644 (file)
@@ -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);
index 5d44fc2..7981fd5 100644 (file)
@@ -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;
index d159403..574b706 100644 (file)
@@ -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);
index ad6a125..e059cf7 100644 (file)
@@ -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);