X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fosd-ldiskfs%2Fosd_internal.h;h=8ee18652d28c1da7df980e3c609774f39cf38e51;hb=ecd28d9b6cb691bda8184a7e07f1acc1ccded391;hp=3925b7af89f7b2349e1f8e65f4a47a5a6ff3db1d;hpb=7c243a561ffe8503a6abf5c4cafef0c3566192bc;p=fs%2Flustre-release.git diff --git a/lustre/osd-ldiskfs/osd_internal.h b/lustre/osd-ldiskfs/osd_internal.h index 3925b7a..8ee1865 100644 --- a/lustre/osd-ldiskfs/osd_internal.h +++ b/lustre/osd-ldiskfs/osd_internal.h @@ -27,7 +27,7 @@ * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. * - * Copyright (c) 2011, 2013, Intel Corporation. + * Copyright (c) 2011, 2014, Intel Corporation. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -43,7 +43,6 @@ #ifndef _OSD_INTERNAL_H #define _OSD_INTERNAL_H -#if defined(__KERNEL__) /* struct mutex */ #include @@ -53,7 +52,7 @@ #include /* struct dirent64 */ #include - +#include #include #include @@ -71,6 +70,7 @@ #include "osd_quota_fmt.h" struct inode; +extern struct kmem_cache *dynlock_cachep; #define OSD_COUNTERS (0) @@ -145,22 +145,22 @@ struct osd_obj_seq { int oos_subdir_count; /* subdir count for each seq */ struct dentry *oos_root; /* O/ */ struct dentry **oos_dirs; /* O//d0-dXX */ - obd_seq oos_seq; /* seq number */ - cfs_list_t oos_seq_list; /* list to seq_list */ + u64 oos_seq; /* seq number */ + struct list_head oos_seq_list; /* list to seq_list */ }; struct osd_obj_map { struct dentry *om_root; /* dentry for /O */ rwlock_t om_seq_list_lock; /* lock for seq_list */ - cfs_list_t om_seq_list; /* list head for seq */ + struct list_head om_seq_list; /* list head for seq */ int om_subdir_count; struct mutex om_dir_init_mutex; }; struct osd_mdobj { struct dentry *om_root; /* AGENT/ */ - obd_seq om_index; /* mdt index */ - cfs_list_t om_list; /* list to omm_list */ + u64 om_index; /* mdt index */ + struct list_head om_list; /* list to omm_list */ }; struct osd_mdobj_map { @@ -176,7 +176,7 @@ struct osd_mdobj_map { struct osd_inconsistent_item { /* link into osd_scrub::os_inconsistent_items, * protected by osd_scrub::os_lock. */ - cfs_list_t oii_list; + struct list_head oii_list; /* The right FID <=> ino#/gen mapping. */ struct osd_idmap_cache oii_cache; @@ -234,19 +234,19 @@ struct osd_device { unsigned int od_fl_capa:1, od_maybe_new:1, od_noscrub:1, - od_dirent_journal:1, od_igif_inoi:1, od_check_ff:1, od_is_ost:1, - od_lma_self_repair:1; + od_index_in_idif:1; - unsigned long od_capa_timeout; - __u32 od_capa_alg; - struct lustre_capa_key *od_capa_keys; - cfs_hlist_head_t *od_capa_hash; + unsigned long od_capa_timeout; + __u32 od_capa_alg; + __u32 od_dirent_journal; + struct lustre_capa_key *od_capa_keys; + struct hlist_head *od_capa_hash; - cfs_proc_dir_entry_t *od_proc_entry; - struct lprocfs_stats *od_stats; + struct proc_dir_entry *od_proc_entry; + struct lprocfs_stats *od_stats; spinlock_t od_osfs_lock; @@ -267,7 +267,7 @@ struct osd_device { struct mutex od_otable_mutex; struct osd_otable_it *od_otable_it; struct osd_scrub od_scrub; - cfs_list_t od_ios_list; + struct list_head od_ios_list; /* service name associated with the osd device */ char od_svname[MAX_OBD_NAME]; @@ -278,8 +278,31 @@ struct osd_device { /* osd seq instance */ struct lu_client_seq *od_cl_seq; + /* If the ratio of "the total OI mappings count" vs + * "the bad OI mappings count" is lower than the + * osd_device::od_full_scrub_ratio, then trigger + * OI scrub to scan the whole the device. */ + __u64 od_full_scrub_ratio; + /* If the speed of found bad OI mappings (per minute) + * exceeds the osd_device::od_full_scrub_threshold_rate, + * then trigger OI scrub to scan the whole device. */ + __u64 od_full_scrub_threshold_rate; +}; + +enum osd_full_scrub_ratio { + /* Trigger OI scrub to scan the whole device directly. */ + OFSR_DIRECTLY = 0, + + /* Because the bad OI mappings count cannot be larger than + * the total OI mappints count, then setting OFSR_NEVER means + * that the whole device scanning cannot be triggered by auto + * detected bad OI mappings during the RPC services. */ + OFSR_NEVER = 1, + OFSR_DEFAULT = 10000, }; +#define FULL_SCRUB_THRESHOLD_RATE_DEFAULT 60 + /* There are at most 10 uid/gids are affected in a transaction, and * that's rename case: * - 2 for source parent uid & gid; @@ -313,7 +336,7 @@ struct osd_thandle { struct thandle ot_super; handle_t *ot_handle; struct ldiskfs_journal_cb_entry ot_jcb; - cfs_list_t ot_dcb_list; + struct list_head ot_dcb_list; /* Link to the device, for debugging. */ struct lu_ref_link ot_dev_link; unsigned short ot_credits; @@ -352,7 +375,7 @@ enum dt_txn_op { * osd dev stats */ -#ifdef LPROCFS +#ifdef CONFIG_PROC_FS enum { LPROC_OSD_READ_BYTES = 0, LPROC_OSD_WRITE_BYTES = 1, @@ -404,17 +427,18 @@ struct osd_it_ea_dirent { * mode (i.e. iterator over ldiskfs style directory) */ struct osd_it_ea { - struct osd_object *oie_obj; - /** used in ldiskfs iterator, to stored file pointer */ - struct file oie_file; - /** how many entries have been read-cached from storage */ - int oie_rd_dirent; - /** current entry is being iterated by caller */ - int oie_it_dirent; - /** current processing entry */ - struct osd_it_ea_dirent *oie_dirent; - /** buffer to hold entries, size == OSD_IT_EA_BUFSIZE */ - void *oie_buf; + struct osd_object *oie_obj; + /** used in ldiskfs iterator, to stored file pointer */ + struct file oie_file; + /** how many entries have been read-cached from storage */ + int oie_rd_dirent; + /** current entry is being iterated by caller */ + int oie_it_dirent; + /** current processing entry */ + struct osd_it_ea_dirent *oie_dirent; + /** buffer to hold entries, size == OSD_IT_EA_BUFSIZE */ + void *oie_buf; + struct dentry oie_dentry; }; /** @@ -427,7 +451,7 @@ struct osd_it_iam { }; struct osd_quota_leaf { - cfs_list_t oql_link; + struct list_head oql_link; uint oql_blk; }; @@ -445,7 +469,7 @@ struct osd_it_quota { /** the record index in the leaf/index block */ uint oiq_index[LUSTRE_DQTREEDEPTH + 1]; /** list of already processed leaf blocks */ - cfs_list_t oiq_list; + struct list_head oiq_list; }; #define MAX_BLOCKS_PER_PAGE (PAGE_CACHE_SIZE / 512) @@ -494,10 +518,10 @@ struct osd_thread_info { * XXX temporary: for ->i_op calls. */ struct timespec oti_time; - /* - * XXX temporary: fake struct file for osd_object_sync - */ - struct file oti_file; + /* + * XXX temporary: fake struct file for osd_object_sync + */ + struct file oti_file; /* * XXX temporary: for capa operations. */ @@ -514,18 +538,9 @@ struct osd_thread_info { * in open iterator session. */ - /** osd iterator context used for iterator session */ - - union { - struct osd_it_iam oti_it; - /* ldiskfs iterator data structure, - * see osd_it_ea_{init, fini} */ - struct osd_it_ea oti_it_ea; - struct osd_it_quota oti_it_quota; - }; - /** pre-allocated buffer used by oti_it_ea, size OSD_IT_EA_BUFSIZE */ void *oti_it_ea_buf; + unsigned int oti_it_ea_buf_used:1; struct kstatfs oti_ksfs; @@ -550,6 +565,7 @@ struct osd_thread_info { int oti_txns; /** used in osd_fid_set() to put xattr */ struct lu_buf oti_buf; + struct lu_buf oti_big_buf; /** used in osd_ea_fid_set() to set fid into common ea */ union { struct lustre_mdt_attrs oti_mdt_attrs; @@ -618,13 +634,16 @@ static inline int __osd_xattr_set(struct osd_thread_info *info, return inode->i_op->setxattr(dentry, name, buf, buflen, fl); } -#ifdef LPROCFS +#ifdef CONFIG_PROC_FS /* osd_lproc.c */ -extern struct lprocfs_seq_vars lprocfs_osd_obd_vars[]; -extern struct lprocfs_seq_vars lprocfs_osd_module_vars[]; +extern struct lprocfs_vars lprocfs_osd_obd_vars[]; +extern struct lprocfs_vars lprocfs_osd_module_vars[]; int osd_procfs_init(struct osd_device *osd, const char *name); int osd_procfs_fini(struct osd_device *osd); void osd_brw_stats_update(struct osd_device *osd, struct osd_iobuf *iobuf); +#if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(3, 0, 52, 0) +int osd_register_proc_index_in_idif(struct osd_device *osd); +#endif #endif int osd_statfs(const struct lu_env *env, struct dt_device *dev, @@ -637,8 +656,8 @@ int osd_ea_fid_set(struct osd_thread_info *info, struct inode *inode, const struct lu_fid *fid, __u32 compat, __u32 incompat); int osd_get_lma(struct osd_thread_info *info, struct inode *inode, struct dentry *dentry, struct lustre_mdt_attrs *lma); -int osd_add_oi_cache(struct osd_thread_info *info, struct osd_device *osd, - struct osd_inode_id *id, const struct lu_fid *fid); +void osd_add_oi_cache(struct osd_thread_info *info, struct osd_device *osd, + struct osd_inode_id *id, const struct lu_fid *fid); int osd_get_idif(struct osd_thread_info *info, struct inode *inode, struct dentry *dentry, struct lu_fid *fid); @@ -669,7 +688,7 @@ int osd_obj_spec_update(struct osd_thread_info *info, struct osd_device *osd, void osd_scrub_file_reset(struct osd_scrub *scrub, __u8 *uuid, __u64 flags); int osd_scrub_file_store(struct osd_scrub *scrub); char *osd_lf_fid2name(const struct lu_fid *fid); -int osd_scrub_start(struct osd_device *dev); +int osd_scrub_start(struct osd_device *dev, __u32 flags); 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, @@ -679,7 +698,7 @@ int osd_oii_lookup(struct osd_device *dev, const struct lu_fid *fid, int osd_scrub_dump(struct seq_file *m, struct osd_device *dev); int osd_fld_lookup(const struct lu_env *env, struct osd_device *osd, - obd_seq seq, struct lu_seq_range *range); + u64 seq, struct lu_seq_range *range); int osd_delete_from_remote_parent(const struct lu_env *env, struct osd_device *osd, @@ -707,10 +726,12 @@ loff_t find_tree_dqentry(const struct lu_env *env, struct osd_it_quota *it); /* osd_quota.c */ int osd_declare_qid(const struct lu_env *env, struct osd_thandle *oh, - struct lquota_id_info *qi, bool allocated, int *flags); + struct lquota_id_info *qi, struct osd_object *obj, + bool enforce, int *flags); int osd_declare_inode_qid(const struct lu_env *env, qid_t uid, qid_t gid, long long space, struct osd_thandle *oh, - bool is_blk, bool allocated, int *flags, bool force); + struct osd_object *obj, bool is_blk, int *flags, + bool force); const struct dt_rec *osd_quota_pack(struct osd_object *obj, const struct dt_rec *rec, union lquota_rec *quota_rec); @@ -726,6 +747,28 @@ static inline bool is_quota_glb_feat(const struct dt_index_features *feat) feat == &dt_quota_bgrp_features) ? true : false; } +#ifndef HAVE_I_UID_READ +static inline uid_t i_uid_read(const struct inode *inode) +{ + return inode->i_uid; +} + +static inline gid_t i_gid_read(const struct inode *inode) +{ + return inode->i_gid; +} + +static inline void i_uid_write(struct inode *inode, uid_t uid) +{ + inode->i_uid = uid; +} + +static inline void i_gid_write(struct inode *inode, gid_t gid) +{ + inode->i_gid = gid; +} +#endif + /* * Invariants, assertions. */ @@ -1060,6 +1103,11 @@ static inline int fid_is_internal(const struct lu_fid *fid) return (!fid_is_namespace_visible(fid) && !fid_is_idif(fid)); } +static inline unsigned long osd_remote_parent_ino(struct osd_device *dev) +{ + return dev->od_mdt_map->omm_remote_parent->d_inode->i_ino; +} + #ifdef JOURNAL_START_HAS_3ARGS # define osd_journal_start_sb(sb, type, nblock) \ ldiskfs_journal_start_sb(sb, type, nblock) @@ -1068,7 +1116,9 @@ static inline int fid_is_internal(const struct lu_fid *fid) # define osd_ldiskfs_find_entry(dir, name, de, inlined, lock) \ ldiskfs_find_entry(dir, name, de, inlined, lock) # define osd_journal_start(inode, type, nblocks) \ - ldiskfs_journal_start(inode, type, nblocks); + ldiskfs_journal_start(inode, type, nblocks) +# define osd_transaction_size(dev) \ + (osd_journal(dev)->j_max_transaction_buffers / 2) #else # define LDISKFS_HT_MISC 0 # define osd_journal_start_sb(sb, type, nblock) \ @@ -1078,11 +1128,14 @@ static inline int fid_is_internal(const struct lu_fid *fid) # define osd_ldiskfs_find_entry(dir, name, de, inlined, lock) \ ldiskfs_find_entry(dir, name, de, lock) # define osd_journal_start(inode, type, nblocks) \ - ldiskfs_journal_start(inode, nblocks); + ldiskfs_journal_start(inode, nblocks) +# define osd_transaction_size(dev) \ + (osd_journal(dev)->j_max_transaction_buffers) #endif void ldiskfs_inc_count(handle_t *handle, struct inode *inode); void ldiskfs_dec_count(handle_t *handle, struct inode *inode); -#endif /* __KERNEL__ */ +void osd_fini_iobuf(struct osd_device *d, struct osd_iobuf *iobuf); + #endif /* _OSD_INTERNAL_H */