* Object is initialized, when object is found in cache, it may not be
* intialized yet, the object allocator will initialize it.
*/
- LU_OBJECT_INITED = 2
+ LU_OBJECT_INITED = 2,
+ /**
+ * Object is being purged, so mustn't be returned by
+ * htable_lookup()
+ */
+ LU_OBJECT_PURGING = 3,
};
enum lu_object_header_attr {
* objects hash table
*/
struct cfs_hash *ls_obj_hash;
+ /*
+ * buckets for summary data
+ */
+ struct lu_site_bkt_data *ls_bkts;
+ int ls_bkt_cnt;
+ u32 ls_bkt_seed;
/**
* index of bucket on hash table while purging
*/
{ \
type *value; \
\
- CLASSERT(PAGE_SIZE >= sizeof(*value)); \
+ BUILD_BUG_ON(PAGE_SIZE < sizeof(*value)); \
\
OBD_ALLOC_PTR(value); \
if (value == NULL) \
int lu_env_refill(struct lu_env *env);
int lu_env_refill_by_tags(struct lu_env *env, __u32 ctags, __u32 stags);
+static inline void* lu_env_info(const struct lu_env *env,
+ const struct lu_context_key *key)
+{
+ void *info;
+ info = lu_context_key_get(&env->le_ctx, key);
+ if (!info) {
+ if (!lu_env_refill((struct lu_env *)env))
+ info = lu_context_key_get(&env->le_ctx, key);
+ }
+ LASSERT(info);
+ return info;
+}
+
struct lu_env *lu_env_find(void);
int lu_env_add(struct lu_env *env);
void lu_env_remove(struct lu_env *env);
return lu_device_is_cl(o->lo_dev);
}
-/* Generic subset of OSTs */
-struct ost_pool {
+/* Generic subset of tgts */
+struct lu_tgt_pool {
__u32 *op_array; /* array of index of
* lov_obd->lov_tgts */
- unsigned int op_count; /* number of OSTs in the array */
- unsigned int op_size; /* allocated size of lp_array */
- struct rw_semaphore op_rw_sem; /* to protect ost_pool use */
+ unsigned int op_count; /* number of tgts in the array */
+ unsigned int op_size; /* allocated size of op_array */
+ struct rw_semaphore op_rw_sem; /* to protect lu_tgt_pool use */
};
/* round-robin QoS data for LOD/LMV */
__u32 lqr_start_idx; /* start index of new inode */
__u32 lqr_offset_idx;/* aliasing for start_idx */
int lqr_start_count;/* reseed counter */
- struct ost_pool lqr_pool; /* round-robin optimized list */
+ struct lu_tgt_pool lqr_pool; /* round-robin optimized list */
unsigned long lqr_dirty:1; /* recalc round-robin list */
};
__u32 ltd_index;
__u32 ltd_gen;
struct list_head ltd_kill;
- struct ptlrpc_thread *ltd_recovery_thread;
+ struct task_struct *ltd_recovery_task;
struct mutex ltd_fid_mutex;
struct lu_tgt_qos ltd_qos; /* qos info per target */
struct obd_statfs ltd_statfs;
struct lu_tgt_desc *ldi_tgt[TGT_PTRS_PER_BLOCK];
};
+/* QoS data for LOD/LMV */
+struct lu_qos {
+ struct list_head lq_svr_list; /* lu_svr_qos list */
+ struct rw_semaphore lq_rw_sem;
+ __u32 lq_active_svr_count;
+ unsigned int lq_prio_free; /* priority for free space */
+ unsigned int lq_threshold_rr;/* priority for rr */
+ struct lu_qos_rr lq_rr; /* round robin qos data */
+ unsigned long lq_dirty:1, /* recalc qos data */
+ lq_same_space:1,/* the servers all have approx.
+ * the same space avail */
+ lq_reset:1; /* zero current penalties */
+};
+
struct lu_tgt_descs {
+ union {
+ struct lov_desc ltd_lov_desc;
+ struct lmv_desc ltd_lmv_desc;
+ };
/* list of known TGTs */
struct lu_tgt_desc_idx *ltd_tgt_idx[TGT_PTRS];
/* Size of the lu_tgts array, granted to be a power of 2 */
__u32 ltd_tgts_size;
- /* number of registered TGTs */
- __u32 ltd_tgtnr;
/* bitmap of TGTs available */
struct cfs_bitmap *ltd_tgt_bitmap;
/* TGTs scheduled to be deleted */
struct mutex ltd_mutex;
/* read/write semaphore used for array relocation */
struct rw_semaphore ltd_rw_sem;
+ /* QoS */
+ struct lu_qos ltd_qos;
+ /* all tgts in a packed array */
+ struct lu_tgt_pool ltd_tgt_pool;
+ /* true if tgt is MDT */
+ bool ltd_is_mdt;
};
#define LTD_TGT(ltd, index) \
(ltd)->ltd_tgt_idx[(index) / \
TGT_PTRS_PER_BLOCK]->ldi_tgt[(index) % TGT_PTRS_PER_BLOCK]
-/* QoS data for LOD/LMV */
-struct lu_qos {
- struct list_head lq_svr_list; /* lu_svr_qos list */
- struct rw_semaphore lq_rw_sem;
- __u32 lq_active_svr_count;
- unsigned int lq_prio_free; /* priority for free space */
- unsigned int lq_threshold_rr;/* priority for rr */
- struct lu_qos_rr lq_rr; /* round robin qos data */
- unsigned long lq_dirty:1, /* recalc qos data */
- lq_same_space:1,/* the servers all have approx.
- * the same space avail */
- lq_reset:1; /* zero current penalties */
-};
-
-void lu_qos_rr_init(struct lu_qos_rr *lqr);
-int lqos_add_tgt(struct lu_qos *qos, struct lu_tgt_desc *ltd);
-int lqos_del_tgt(struct lu_qos *qos, struct lu_tgt_desc *ltd);
-bool lqos_is_usable(struct lu_qos *qos, __u32 active_tgt_nr);
-int lqos_calc_penalties(struct lu_qos *qos, struct lu_tgt_descs *ltd,
- __u32 active_tgt_nr, __u32 maxage, bool is_mdt);
-void lqos_calc_weight(struct lu_tgt_desc *tgt);
-int lqos_recalc_weight(struct lu_qos *qos, struct lu_tgt_descs *ltd,
- struct lu_tgt_desc *tgt, __u32 active_tgt_nr,
- __u64 *total_wt);
u64 lu_prandom_u64_max(u64 ep_ro);
+void lu_qos_rr_init(struct lu_qos_rr *lqr);
+int lu_qos_add_tgt(struct lu_qos *qos, struct lu_tgt_desc *ltd);
+void lu_tgt_qos_weight_calc(struct lu_tgt_desc *tgt);
-int lu_tgt_descs_init(struct lu_tgt_descs *ltd);
+int lu_tgt_descs_init(struct lu_tgt_descs *ltd, bool is_mdt);
void lu_tgt_descs_fini(struct lu_tgt_descs *ltd);
-int lu_tgt_descs_add(struct lu_tgt_descs *ltd, struct lu_tgt_desc *tgt);
-void lu_tgt_descs_del(struct lu_tgt_descs *ltd, struct lu_tgt_desc *tgt);
+int ltd_add_tgt(struct lu_tgt_descs *ltd, struct lu_tgt_desc *tgt);
+void ltd_del_tgt(struct lu_tgt_descs *ltd, struct lu_tgt_desc *tgt);
+bool ltd_qos_is_usable(struct lu_tgt_descs *ltd);
+int ltd_qos_penalties_calc(struct lu_tgt_descs *ltd);
+int ltd_qos_update(struct lu_tgt_descs *ltd, struct lu_tgt_desc *tgt,
+ __u64 *total_wt);
static inline struct lu_tgt_desc *ltd_first_tgt(struct lu_tgt_descs *ltd)
{