every obj*/
time64_t lqo_used; /* last used time, seconds */
__u32 lqo_ost_count; /* number of osts on this oss */
+ __u32 lqo_id; /* unique oss id */
};
struct ltd_qos {
struct rw_semaphore ltd_rw_sem;
};
+struct lod_avoid_guide {
+ /* ids of OSSs avoid guidance */
+ __u32 *lag_oss_avoid_array;
+ /* number of filled array items */
+ unsigned int lag_oaa_count;
+ /* number of allocated array items */
+ unsigned int lag_oaa_size;
+ /* bitmap of OSTs avoid guidance */
+ struct cfs_bitmap *lag_ost_avoid_bitmap;
+ /* how many OSTs are available for alloc */
+ __u32 lag_ost_avail;
+};
+
struct lod_device {
struct dt_device lod_dt_dev;
struct obd_export *lod_child_exp;
/* ost list specified with LOV_USER_MAGIC_SPECIFIC lum */
struct ost_pool llc_ostlist;
struct dt_object **llc_stripe;
+ __u32 *llc_ost_indices;
};
struct lod_default_striping {
struct lod_object {
/* common fields for both files and directories */
struct dt_object ldo_obj;
+ struct mutex ldo_layout_mutex;
union {
/* file stripe (LOV) */
struct {
struct dt_object **ldo_stripe;
};
+#define lod_foreach_mirror_comp(comp, lo, mirror_idx) \
+for (comp = &lo->ldo_comp_entries[lo->ldo_mirrors[mirror_idx].lme_start]; \
+ comp <= &lo->ldo_comp_entries[lo->ldo_mirrors[mirror_idx].lme_end]; \
+ comp++)
+
+static inline bool lod_is_flr(const struct lod_object *lo)
+{
+ if (!lo->ldo_is_composite)
+ return false;
+
+ return (lo->ldo_flr_state & LCM_FL_FLR_MASK) != LCM_FL_NONE;
+}
+
static inline int lod_set_pool(char **pool, const char *new_pool)
{
int len;
struct lu_attr lti_attr;
struct lod_it lti_it;
struct ldlm_res_id lti_res_id;
- struct ost_pool lti_inuse_osts;
/* used to hold lu_dirent, sizeof(struct lu_dirent) + NAME_MAX */
char lti_key[sizeof(struct lu_dirent) +
NAME_MAX];
size_t lti_comp_size;
size_t lti_count;
struct lu_attr lti_layout_attr;
+ /* object allocation avoid guide info */
+ struct lod_avoid_guide lti_avoid;
};
extern const struct lu_device_operations lod_lu_ops;
unsigned gen, bool for_ost);
int lod_fini_tgt(const struct lu_env *env, struct lod_device *lod,
struct lod_tgt_descs *ltd, bool for_ost);
-int lod_load_striping_locked(const struct lu_env *env, struct lod_object *lo);
-int lod_load_striping(const struct lu_env *env, struct lod_object *lo);
+int lod_striping_load(const struct lu_env *env, struct lod_object *lo);
+int lod_striping_reload(const struct lu_env *env, struct lod_object *lo,
+ const struct lu_buf *buf);
int lod_get_ea(const struct lu_env *env, struct lod_object *lo,
const char *name);
typedef bool (*lod_obj_comp_skip_cb_t)(const struct lu_env *env,
struct lod_object *lo, int comp_idx,
struct lod_obj_stripe_cb_data *data);
+typedef int (*lod_obj_comp_cb_t)(const struct lu_env *env,
+ struct lod_object *lo, int comp_idx,
+ struct lod_obj_stripe_cb_data *data);
struct lod_obj_stripe_cb_data {
union {
const struct lu_attr *locd_attr;
- struct ost_pool *locd_inuse;
+ int locd_ost_index;
};
lod_obj_stripe_cb_t locd_stripe_cb;
lod_obj_comp_skip_cb_t locd_comp_skip_cb;
+ lod_obj_comp_cb_t locd_comp_cb;
bool locd_declare;
};
/* lod_qos.c */
-int lod_prepare_inuse(const struct lu_env *env, struct lod_object *lo);
int lod_prepare_create(const struct lu_env *env, struct lod_object *lo,
struct lu_attr *attr, const struct lu_buf *buf,
struct thandle *th);
void lod_qos_rr_init(struct lod_qos_rr *lqr);
int lod_use_defined_striping(const struct lu_env *, struct lod_object *,
const struct lu_buf *);
-int lod_obj_stripe_set_inuse_cb(const struct lu_env *env, struct lod_object *lo,
- struct dt_object *dt, struct thandle *th,
- int comp_idx, int stripe_idx,
- struct lod_obj_stripe_cb_data *data);
int lod_qos_parse_config(const struct lu_env *env, struct lod_object *lo,
const struct lu_buf *buf);
int lod_qos_prep_create(const struct lu_env *env, struct lod_object *lo,
struct lu_attr *attr, struct thandle *th,
- int comp_idx, struct ost_pool *inuse);
+ int comp_idx);
__u16 lod_comp_entry_stripe_count(struct lod_object *lo,
struct lod_layout_component *entry,
bool is_dir);
int lod_striped_create(const struct lu_env *env, struct dt_object *dt,
struct lu_attr *attr, struct dt_object_format *dof,
struct thandle *th);
-void lod_object_free_striping(const struct lu_env *env, struct lod_object *lo);
+void lod_striping_free_nolock(const struct lu_env *env, struct lod_object *lo);
+void lod_striping_free(const struct lu_env *env, struct lod_object *lo);
int lod_obj_for_each_stripe(const struct lu_env *env, struct lod_object *lo,
struct thandle *th,
struct lod_obj_stripe_cb_data *data);
+int lod_comp_copy_ost_lists(struct lod_layout_component *lod_comp,
+ struct lov_user_md_v3 *v3);
/* lod_sub_object.c */
struct thandle *lod_sub_get_thandle(const struct lu_env *env,