X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Fosd-ldiskfs%2Fosd_internal.h;h=7e573d1e2c6f5485de026d60442ff7605dcc28d0;hp=dcd29aac073cdaf188cbee6ecc1f6f2e001ba290;hb=0081d9de639979c0d0e341ad6ded442b9043a379;hpb=e3a7c58aebafce40323db54bf6056029e5af4a70 diff --git a/lustre/osd-ldiskfs/osd_internal.h b/lustre/osd-ldiskfs/osd_internal.h index dcd29aac..7e573d1 100644 --- a/lustre/osd-ldiskfs/osd_internal.h +++ b/lustre/osd-ldiskfs/osd_internal.h @@ -75,12 +75,15 @@ #include "osd_oi.h" #include "osd_iam.h" +#include "osd_scrub.h" struct inode; -#define OSD_OII_NOGEN (0) #define OSD_COUNTERS (0) +/* Lustre special inode::i_state to indicate OI scrub skip this inode. */ +#define I_LUSTRE_NOSCRUB (1 << 31) + /** Enable thandle usage statistics */ #define OSD_THANDLE_STATS (0) @@ -192,6 +195,55 @@ static inline void ldiskfs_htree_lock_free(struct htree_lock *lk) #endif /* HAVE_LDISKFS_PDO */ +#define OSD_OTABLE_IT_CACHE_SIZE 128 +#define OSD_OTABLE_IT_CACHE_MASK (~(OSD_OTABLE_IT_CACHE_SIZE - 1)) + +struct osd_inconsistent_item { + /* link into osd_scrub::os_inconsistent_items, + * protected by osd_scrub::os_lock. */ + cfs_list_t oii_list; + + /* The right FID <=> ino#/gen mapping. */ + struct osd_idmap_cache oii_cache; + + unsigned int oii_insert:1; /* insert or update mapping. */ +}; + +struct osd_otable_cache { + struct osd_idmap_cache ooc_cache[OSD_OTABLE_IT_CACHE_SIZE]; + + /* Index for next cache slot to be filled. */ + int ooc_producer_idx; + + /* Index for next cache slot to be returned by it::next(). */ + int ooc_consumer_idx; + + /* How many items in ooc_cache. */ + int ooc_cached_items; + + /* Position for up layer LFSCK iteration pre-loading. */ + __u32 ooc_pos_preload; +}; + +struct osd_otable_it { + struct osd_device *ooi_dev; + struct osd_otable_cache ooi_cache; + + /* For osd_otable_it_key. */ + __u8 ooi_key[16]; + + /* The following bits can be updated/checked w/o lock protection. + * If more bits will be introduced in the future and need lock to + * protect, please add comment. */ + unsigned long ooi_used_outside:1, /* Some user out of OSD + * uses the iteration. */ + ooi_all_cached:1, /* No more entries can be + * filled into cache. */ + ooi_user_ready:1, /* The user out of OSD is + * ready to iterate. */ + ooi_waiting:1; /* it::next is waiting. */ +}; + extern const int osd_dto_credits_noquota[]; /* @@ -245,6 +297,10 @@ struct osd_device { struct brw_stats od_brw_stats; cfs_atomic_t od_r_in_flight; cfs_atomic_t od_w_in_flight; + + cfs_mutex_t od_otable_mutex; + struct osd_otable_it *od_otable_it; + struct osd_scrub od_scrub; }; #define OSD_TRACK_DECLARES @@ -441,7 +497,9 @@ struct osd_thread_info { struct htree_lock *oti_hlock; struct lu_fid oti_fid; - struct osd_inode_id oti_id; + struct lu_fid oti_fid2; + struct osd_inode_id oti_id; + struct osd_inode_id oti_id2; struct ost_id oti_ostid; /* @@ -495,6 +553,7 @@ struct osd_thread_info { long long oti_alignment_lieutenant_colonel; }; + struct osd_idmap_cache oti_cache; int oti_r_locks; int oti_w_locks; @@ -535,9 +594,10 @@ int osd_object_auth(const struct lu_env *env, struct dt_object *dt, struct lustre_capa *capa, __u64 opc); void osd_declare_qid(struct dt_object *dt, struct osd_thandle *oh, int type, uid_t id, struct inode *inode); -struct inode *osd_iget(struct osd_thread_info *info, - struct osd_device *dev, - const struct osd_inode_id *id); +struct inode *osd_iget(struct osd_thread_info *info, struct osd_device *dev, + struct osd_inode_id *id); +struct inode *osd_iget_fid(struct osd_thread_info *info, struct osd_device *dev, + struct osd_inode_id *id, struct lu_fid *fid); int osd_compat_init(struct osd_device *dev); void osd_compat_fini(struct osd_device *dev); @@ -559,6 +619,16 @@ int osd_compat_spec_insert(struct osd_thread_info *info, const struct lu_fid *fid, const struct osd_inode_id *id, struct thandle *th); +void osd_scrub_file_reset(struct osd_scrub *scrub, __u8 *uuid, __u64 flags); +int osd_scrub_file_store(struct osd_scrub *scrub); +int osd_scrub_start(struct osd_device *dev); +int osd_scrub_setup(const struct lu_env *env, struct osd_device *dev); +void osd_scrub_cleanup(const struct lu_env *env, struct osd_device *dev); +int osd_oii_insert(struct osd_device *dev, struct osd_idmap_cache *oic, + int insert); +int osd_oii_lookup(struct osd_device *dev, const struct lu_fid *fid, + struct osd_inode_id *id); + /* * Invariants, assertions. */ @@ -585,15 +655,23 @@ static inline int osd_invariant(const struct osd_object *obj) #define osd_invariant(obj) (1) #endif +extern const struct dt_index_operations osd_otable_ops; + +static inline int osd_oi_fid2idx(struct osd_device *dev, + const struct lu_fid *fid) +{ + return fid->f_seq & (dev->od_oi_count - 1); +} + static inline struct osd_oi *osd_fid2oi(struct osd_device *osd, const struct lu_fid *fid) { - LASSERT(!fid_is_idif(fid)); - LASSERT(!fid_is_igif(fid)); - LASSERT(osd->od_oi_table != NULL && osd->od_oi_count >= 1); - /* It can work even od_oi_count equals to 1 although it's unexpected, - * the only reason we set it to 1 is for performance measurement */ - return osd->od_oi_table[fid->f_seq & (osd->od_oi_count - 1)]; + LASSERTF(!fid_is_idif(fid), DFID"\n", PFID(fid)); + LASSERTF(!fid_is_igif(fid), DFID"\n", PFID(fid)); + LASSERT(osd->od_oi_table != NULL && osd->od_oi_count >= 1); + /* It can work even od_oi_count equals to 1 although it's unexpected, + * the only reason we set it to 1 is for performance measurement */ + return osd->od_oi_table[osd_oi_fid2idx(osd, fid)]; } extern const struct lu_device_operations osd_lu_ops; @@ -688,6 +766,8 @@ static inline void osd_ipd_put(const struct lu_env *env, } int osd_ldiskfs_read(struct inode *inode, void *buf, int size, loff_t *offs); +int osd_ldiskfs_write_record(struct inode *inode, void *buf, int bufsize, + loff_t *offs, handle_t *handle); static inline struct dentry *osd_child_dentry_by_inode(const struct lu_env *env,