* Copyright 2009 Sun Microsystems, Inc. All rights reserved
* Use is subject to license terms.
*
- * Copyright (c) 2012, 2016, Intel Corporation.
+ * Copyright (c) 2012, 2017, Intel Corporation.
*/
/*
* This file is part of Lustre, http://www.lustre.org/
#define _LOD_INTERNAL_H
#include <libcfs/libcfs.h>
-#include <uapi/linux/lustre_cfg.h>
+#include <uapi/linux/lustre/lustre_cfg.h>
#include <obd.h>
#include <dt_object.h>
__u64 lqo_penalty; /* current penalty */
__u64 lqo_penalty_per_obj; /* penalty decrease
every obj*/
- time_t lqo_used; /* last used time, seconds */
+ 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 {
__u64 ltq_penalty_per_obj; /* penalty decrease
every obj*/
__u64 ltq_weight; /* net weighting */
- time_t ltq_used; /* last used time, seconds */
+ time64_t ltq_used; /* last used time, seconds */
bool ltq_usable:1; /* usable for striping */
};
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;
struct dt_device *lod_child;
- struct proc_dir_entry *lod_proc_entry;
struct lprocfs_stats *lod_stats;
spinlock_t lod_connects_lock;
int lod_connects;
/* maximum EA size underlied OSD may have */
unsigned int lod_osd_max_easize;
+ /* maximum size of MDT stripe for Data-on-MDT files. */
+ unsigned int lod_dom_max_stripesize;
/*FIXME: When QOS and pool is implemented for MDT, probably these
* structure should be moved to lod_tgt_descs as well.
enum lustre_sec_part lod_sp_me;
struct proc_dir_entry *lod_symlink;
+ struct dentry *lod_debugfs;
/* ROOT object, used to fetch FS default striping */
struct lod_object *lod_md_root;
__u32 llc_pattern;
__u16 llc_layout_gen;
__u16 llc_stripe_offset;
- __u16 llc_stripenr;
+ __u16 llc_stripe_count;
__u16 llc_stripes_allocated;
char *llc_pool;
/* 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 {
/* default LOV */
/* current layout component count */
__u16 lds_def_comp_cnt;
+ __u16 lds_def_mirror_cnt;
/* the largest comp count ever used */
__u32 lds_def_comp_size_cnt;
struct lod_layout_component *lds_def_comp_entries;
/* default LMV */
- __u32 lds_dir_def_stripenr;
+ __u32 lds_dir_def_stripe_count;
__u32 lds_dir_def_stripe_offset;
__u32 lds_dir_def_hash_type;
/* default file striping flags (LOV) */
lds_dir_def_striping_set:1;
};
+struct lod_mirror_entry {
+ __u16 lme_stale:1,
+ lme_primary:1;
+ /* mirror id */
+ __u16 lme_id;
+ /* start,end index of this mirror in ldo_comp_entries */
+ __u16 lme_start;
+ __u16 lme_end;
+};
+
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 {
/* Layout component count for a regular file.
* It equals to 1 for non-composite layout. */
__u16 ldo_comp_cnt;
+ /* Layout mirror count for a PFLR file.
+ * It's 0 for files with non-composite layout. */
+ __u16 ldo_mirror_count;
+ struct lod_mirror_entry *ldo_mirrors;
__u32 ldo_is_composite:1,
+ ldo_flr_state:2,
ldo_comp_cached:1;
};
/* directory stripe (LMV) */
struct {
/* Slave stripe count for striped directory. */
- __u16 ldo_dir_stripenr;
+ __u16 ldo_dir_stripe_count;
/* How many stripes allocated for a striped directory */
__u16 ldo_dir_stripes_allocated;
__u32 ldo_dir_stripe_offset;
__u32 ldo_dir_hash_type;
/* Is a slave stripe of striped directory? */
__u32 ldo_dir_slave_stripe:1,
- ldo_dir_striped:1;
+ ldo_dir_striped:1,
+ /* the stripe has been loaded */
+ ldo_dir_stripe_loaded:1;
/*
* default striping is not cached, so this field is
* invalid after create, make sure it's used by
};
/* file stripe (LOV) */
struct lod_layout_component *ldo_comp_entries;
- /* slave stripes of striped directory (LMV)*/
+ /* slave stripes of striped directory (LMV) */
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;
static inline int lod_set_def_pool(struct lod_default_striping *lds,
int i, const char *new_pool)
{
- return lod_set_pool(&lds->lds_def_comp_entries[i].llc_pool,
- new_pool);
+ return lod_set_pool(&lds->lds_def_comp_entries[i].llc_pool, new_pool);
}
static inline int lod_obj_set_pool(struct lod_object *lo, int i,
const char *new_pool)
{
- return lod_set_pool(&lo->ldo_comp_entries[i].llc_pool,
- new_pool);
+ return lod_set_pool(&lo->ldo_comp_entries[i].llc_pool, new_pool);
}
/**
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];
/* used to store parent default striping in create */
struct lod_default_striping lti_def_striping;
struct filter_fid lti_ff;
+ __u32 *lti_comp_idx;
+ 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;
return &obj->ldo_obj.do_lu;
}
+static inline const struct lu_fid *lod_object_fid(struct lod_object *obj)
+{
+ return lu_object_fid(lod2lu_obj(obj));
+}
+
static inline struct lod_object *lod_obj(const struct lu_object *o)
{
LASSERT(lu_device_is_lod(o->lo_dev));
return false;
if (S_ISDIR(dt->do_lu.lo_header->loh_attr))
- return lo->ldo_dir_stripenr != 0;
+ return lo->ldo_dir_stripe_count != 0;
for (i = 0; i < lo->ldo_comp_cnt; i++) {
if (lo->ldo_comp_entries[i].llc_stripe == NULL)
continue;
- LASSERT(lo->ldo_comp_entries[i].llc_stripenr > 0);
+ LASSERT(lo->ldo_comp_entries[i].llc_stripe_count > 0);
return true;
}
return false;
return lname;
}
+static inline void lod_layout_get_pool(struct lod_layout_component *entries,
+ int count, char *pool, int len)
+{
+ int i;
+
+ for (i = 0; i < count; i++) {
+ if (entries[i].llc_pool != NULL) {
+ strlcpy(pool, entries[i].llc_pool, len);
+ break;
+ }
+ }
+}
+
#define lod_foreach_ost(__dev, index) \
if ((__dev)->lod_osts_size > 0) \
cfs_foreach_bit((__dev)->lod_ost_bitmap, (index))
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);
* save the specified OST index list.
*/
static inline void
-lod_comp_shrink_stripecount(struct lod_layout_component *lod_comp,
- __u16 *stripe_count)
+lod_comp_shrink_stripe_count(struct lod_layout_component *lod_comp,
+ __u16 *stripe_count)
{
/**
* Need one lov_ost_data_v1 to store invalid ost_idx, please refer to
const struct lu_buf *buf);
int lod_initialize_objects(const struct lu_env *env, struct lod_object *mo,
struct lov_ost_data_v1 *objs, int index);
-int lod_verify_striping(struct lod_device *d, const struct lu_buf *buf,
- bool is_from_disk, __u64 start);
+int lod_verify_striping(struct lod_device *d, struct lod_object *lo,
+ const struct lu_buf *buf, bool is_from_disk);
int lod_generate_lovea(const struct lu_env *env, struct lod_object *lo,
struct lov_mds_md *lmm, int *lmm_size, bool is_dir);
int lod_ea_store_resize(struct lod_thread_info *info, size_t size);
int lod_def_striping_comp_resize(struct lod_default_striping *lds, __u16 count);
void lod_free_def_comp_entries(struct lod_default_striping *lds);
void lod_free_comp_entries(struct lod_object *lo);
-int lod_alloc_comp_entries(struct lod_object *lo, int cnt);
+int lod_alloc_comp_entries(struct lod_object *lo, int mirror_cnt, int comp_cnt);
+int lod_fill_mirrors(struct lod_object *lo);
/* lod_pool.c */
int lod_ost_pool_add(struct ost_pool *op, __u32 idx, unsigned int min_count);
int lod_pool_add(struct obd_device *obd, char *poolname, char *ostname);
int lod_pool_remove(struct obd_device *obd, char *poolname, char *ostname);
+struct lod_obj_stripe_cb_data;
+typedef int (*lod_obj_stripe_cb_t)(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);
+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;
};
- bool locd_declare;
+ 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;
};
-typedef int (*lod_obj_stripe_cb_t)(const struct lu_env *env,
- struct lod_object *lo, struct dt_object *dt,
- struct thandle *th, int stripe_idx,
- struct lod_obj_stripe_cb_data *data);
/* 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 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);
-__u16 lod_comp_entry_stripecnt(struct lod_object *lo,
- struct lod_layout_component *entry,
- bool is_dir);
-__u16 lod_get_stripecnt(struct lod_device *lod, struct lod_object *lo,
- __u16 stripe_count);
+ int comp_idx);
+__u16 lod_comp_entry_stripe_count(struct lod_object *lo,
+ struct lod_layout_component *entry,
+ bool is_dir);
+__u16 lod_get_stripe_count(struct lod_device *lod, struct lod_object *lo,
+ __u16 stripe_count);
+void lod_qos_statfs_update(const struct lu_env *env, struct lod_device *lod);
/* lproc_lod.c */
int lod_procfs_init(struct lod_device *lod);
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, lod_obj_stripe_cb_t cb,
+ 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,