X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fofd%2Fofd_internal.h;h=5d1b8803630adfa569738470a8d3a2cb2e38ed40;hb=refs%2Fchanges%2F48%2F6848%2F11;hp=5b8cd320ebffb8d927f72de3f8177b07736291fd;hpb=99be593f3966e487f78526ca48f6b39b99f83414;p=fs%2Flustre-release.git diff --git a/lustre/ofd/ofd_internal.h b/lustre/ofd/ofd_internal.h index 5b8cd32..5d1b880 100644 --- a/lustre/ofd/ofd_internal.h +++ b/lustre/ofd/ofd_internal.h @@ -27,7 +27,7 @@ * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. * - * Copyright (c) 2012, Intel Corporation. + * Copyright (c) 2012, 2013, Intel Corporation. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -40,6 +40,7 @@ #include #include #include +#include #include #include #include @@ -48,7 +49,6 @@ #define OFD_ROCOMPAT_SUPP (0) #define OFD_INCOMPAT_SUPP (OBD_INCOMPAT_GROUPS | OBD_INCOMPAT_OST | \ OBD_INCOMPAT_COMMON_LR) -#define OFD_MAX_GROUPS 256 #define OFD_PRECREATE_BATCH_DEFAULT (FILTER_SUBDIR_COUNT * 4) /* on small filesystems we should not precreate too many objects in @@ -70,7 +70,7 @@ struct ofd_mod_data { }; #define OFD_FMD_MAX_NUM_DEFAULT 128 -#define OFD_FMD_MAX_AGE_DEFAULT ((obd_timeout + 10) * CFS_HZ) +#define OFD_FMD_MAX_AGE_DEFAULT ((obd_timeout + 10) * HZ) enum { LPROC_OFD_READ_BYTES = 0, @@ -92,7 +92,7 @@ static inline void ofd_counter_incr(struct obd_export *exp, int opcode, char *jobid, long amount) { if (exp->exp_obd && exp->exp_obd->u.obt.obt_jobstats.ojs_hash && - (exp->exp_connect_flags & OBD_CONNECT_JOBSTATS)) + (exp_connect_flags(exp) & OBD_CONNECT_JOBSTATS)) lprocfs_job_stats_log(exp->exp_obd, jobid, opcode, amount); if (exp->exp_nid_stats != NULL && @@ -106,6 +106,16 @@ static inline void ofd_counter_incr(struct obd_export *exp, int opcode, } } +struct ofd_seq { + cfs_list_t os_list; + struct ost_id os_oi; + spinlock_t os_last_oid_lock; + struct mutex os_create_lock; + cfs_atomic_t os_refc; + struct dt_object *os_lastid_obj; + unsigned long os_destroys_in_progress:1; +}; + struct ofd_device { struct dt_device ofd_dt_dev; struct dt_device *ofd_osd; @@ -119,18 +129,15 @@ struct ofd_device { /* last_rcvd file */ struct lu_target ofd_lut; - struct dt_object *ofd_last_group_file; struct dt_object *ofd_health_check_file; int ofd_subdir_count; - int ofd_max_group; - obd_id ofd_last_objids[OFD_MAX_GROUPS]; - struct mutex ofd_create_locks[OFD_MAX_GROUPS]; - struct dt_object *ofd_lastid_obj[OFD_MAX_GROUPS]; - spinlock_t ofd_objid_lock; - unsigned long ofd_destroys_in_progress; - int ofd_precreate_batch; + cfs_list_t ofd_seq_list; + rwlock_t ofd_seq_list_lock; + int ofd_seq_count; + int ofd_precreate_batch; + spinlock_t ofd_batch_lock; /* protect all statfs-related counters */ spinlock_t ofd_osfs_lock; @@ -178,6 +185,7 @@ struct ofd_device { /* shall we grant space to clients not * supporting OBD_CONNECT_GRANT_PARAM? */ ofd_grant_compat_disable:1; + struct seq_server_site ofd_seq_site; }; static inline struct ofd_device *ofd_dev(struct lu_device *d) @@ -294,7 +302,6 @@ struct ofd_thread_info { struct lu_attr fti_attr2; struct ldlm_res_id fti_resid; struct filter_fid fti_mds_fid; - struct filter_fid fti_mds_fid2; struct ost_id fti_ostid; struct ofd_object *fti_obj; union { @@ -333,15 +340,21 @@ int ofd_statfs_internal(const struct lu_env *env, struct ofd_device *ofd, int *from_cache); /* ofd_fs.c */ -obd_id ofd_last_id(struct ofd_device *ofd, obd_seq seq); -void ofd_last_id_set(struct ofd_device *ofd, obd_id id, obd_seq seq); -int ofd_last_id_write(const struct lu_env *env, struct ofd_device *ofd, - obd_seq seq); -int ofd_group_load(const struct lu_env *env, struct ofd_device *ofd, int); +obd_id ofd_seq_last_oid(struct ofd_seq *oseq); +void ofd_seq_last_oid_set(struct ofd_seq *oseq, obd_id id); +int ofd_seq_last_oid_write(const struct lu_env *env, struct ofd_device *ofd, + struct ofd_seq *oseq); +int ofd_seqs_init(const struct lu_env *env, struct ofd_device *ofd); +struct ofd_seq *ofd_seq_get(struct ofd_device *ofd, obd_seq seq); +void ofd_seq_put(const struct lu_env *env, struct ofd_seq *oseq); + int ofd_fs_setup(const struct lu_env *env, struct ofd_device *ofd, struct obd_device *obd); void ofd_fs_cleanup(const struct lu_env *env, struct ofd_device *ofd); int ofd_precreate_batch(struct ofd_device *ofd, int batch); +struct ofd_seq *ofd_seq_load(const struct lu_env *env, struct ofd_device *ofd, + obd_seq seq); +void ofd_seqs_fini(const struct lu_env *env, struct ofd_device *ofd); /* ofd_io.c */ int ofd_preprw(const struct lu_env *env,int cmd, struct obd_export *exp, @@ -369,15 +382,12 @@ int ofd_txn_stop_cb(const struct lu_env *env, struct thandle *txn, /* lproc_ofd.c */ #ifdef LPROCFS void lprocfs_ofd_init_vars(struct lprocfs_static_vars *lvars); -int lproc_ofd_attach_seqstat(struct obd_device *dev); -extern struct file_operations ofd_per_nid_stats_fops; void ofd_stats_counter_init(struct lprocfs_stats *stats); #else static void lprocfs_ofd_init_vars(struct lprocfs_static_vars *lvars) { memset(lvars, 0, sizeof(*lvars)); } -static inline int lproc_ofd_attach_seqstat(struct obd_device *dev) {} static inline void ofd_stats_counter_init(struct lprocfs_stats *stats) {} #endif @@ -391,7 +401,7 @@ struct ofd_object *ofd_object_find_or_create(const struct lu_env *env, struct lu_attr *attr); int ofd_object_ff_check(const struct lu_env *env, struct ofd_object *fo); int ofd_precreate_objects(const struct lu_env *env, struct ofd_device *ofd, - obd_id id, obd_seq group, int nr); + obd_id id, struct ofd_seq *oseq, int nr, int sync); void ofd_object_put(const struct lu_env *env, struct ofd_object *fo); int ofd_attr_set(const struct lu_env *env, struct ofd_object *fo, @@ -419,7 +429,7 @@ static inline int ofd_grant_ratio_conv(int percentage) static inline int ofd_grant_param_supp(struct obd_export *exp) { - return !!(exp->exp_connect_flags & OBD_CONNECT_GRANT_PARAM); + return !!(exp_connect_flags(exp) & OBD_CONNECT_GRANT_PARAM); } /* Blocksize used for client not supporting OBD_CONNECT_GRANT_PARAM. @@ -430,7 +440,7 @@ static inline int ofd_grant_compat(struct obd_export *exp, struct ofd_device *ofd) { /* Clients which don't support OBD_CONNECT_GRANT_PARAM cannot handle - * a block size > page size and consume CFS_PAGE_SIZE of grant when + * a block size > page size and consume PAGE_CACHE_SIZE of grant when * dirtying a page regardless of the block size */ return !!(ofd_obd(ofd)->obd_self_export != exp && ofd->ofd_blockbits > COMPAT_BSIZE_SHIFT && @@ -443,13 +453,13 @@ static inline int ofd_grant_prohibit(struct obd_export *exp, /* When ofd_grant_compat_disable is set, we don't grant any space to * clients not supporting OBD_CONNECT_GRANT_PARAM. * Otherwise, space granted to such a client is inflated since it - * consumes CFS_PAGE_SIZE of grant space per block */ + * consumes PAGE_CACHE_SIZE of grant space per block */ return !!(ofd_grant_compat(exp, ofd) && ofd->ofd_grant_compat_disable); } void ofd_grant_sanity_check(struct obd_device *obd, const char *func); long ofd_grant_connect(const struct lu_env *env, struct obd_export *exp, - obd_size want); + obd_size want, bool conservative); void ofd_grant_discard(struct obd_export *exp); void ofd_grant_prepare_read(const struct lu_env *env, struct obd_export *exp, struct obdo *oa); @@ -475,6 +485,12 @@ void ofd_fmd_drop(struct obd_export *exp, struct lu_fid *fid); #define ofd_fmd_drop(exp, fid) do {} while (0) #endif +/* ofd_dev.c */ +int ofd_fid_set_index(const struct lu_env *env, struct ofd_device *ofd, + int index); +int ofd_fid_init(const struct lu_env *env, struct ofd_device *ofd); +int ofd_fid_fini(const struct lu_env *env, struct ofd_device *ofd); + /* ofd_lvb.c */ extern struct ldlm_valblock_ops ofd_lvbo; @@ -513,39 +529,6 @@ static inline struct ofd_thread_info * ofd_info_init(const struct lu_env *env, return info; } -/* The same as osc_build_res_name() */ -static inline void ofd_build_resid(const struct lu_fid *fid, - struct ldlm_res_id *resname) -{ - if (fid_is_idif(fid)) { - /* get id/seq like ostid_idif_pack() does */ - osc_build_res_name(fid_idif_id(fid_seq(fid), fid_oid(fid), - fid_ver(fid)), - FID_SEQ_OST_MDT0, resname); - } else { - /* In the future, where OSTs have FID sequences allocated. */ - fid_build_reg_res_name(fid, resname); - } -} - -static inline void ofd_fid_from_resid(struct lu_fid *fid, - const struct ldlm_res_id *name) -{ - /* if seq is FID_SEQ_OST_MDT0 then we have IDIF and resid was built - * using osc_build_res_name function. */ - if (fid_seq_is_mdt0(name->name[LUSTRE_RES_ID_VER_OID_OFF])) { - struct ost_id ostid; - - ostid.oi_id = name->name[LUSTRE_RES_ID_SEQ_OFF]; - ostid.oi_seq = name->name[LUSTRE_RES_ID_VER_OID_OFF]; - fid_ostid_unpack(fid, &ostid, 0); - } else { - fid->f_seq = name->name[LUSTRE_RES_ID_SEQ_OFF]; - fid->f_oid = (__u32)name->name[LUSTRE_RES_ID_VER_OID_OFF]; - fid->f_ver = name->name[LUSTRE_RES_ID_VER_OID_OFF] >> 32; - } -} - static inline void ofd_oti2info(struct ofd_thread_info *info, struct obd_trans_info *oti) { @@ -580,7 +563,7 @@ static inline void ofd_slc_set(struct ofd_device *ofd) static inline void ofd_prepare_fidea(struct filter_fid *ff, struct obdo *oa) { if (!(oa->o_valid & OBD_MD_FLGROUP)) - oa->o_seq = 0; + ostid_set_seq_mdt0(&oa->o_oi); /* packing fid and converting it to LE for storing into EA. * Here ->o_stripe_idx should be filled by LOV and rest of * fields - by client. */ @@ -589,8 +572,6 @@ static inline void ofd_prepare_fidea(struct filter_fid *ff, struct obdo *oa) /* XXX: we are ignoring o_parent_ver here, since this should * be the same for all objects in this fileset. */ ff->ff_parent.f_ver = cpu_to_le32(oa->o_stripe_idx); - ff->ff_objid = cpu_to_le64(oa->o_id); - ff->ff_seq = cpu_to_le64(oa->o_seq); } /* niobuf_remote has no rnb_ prefix in master */