X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fofd%2Fofd_internal.h;h=d96a51778925ca53adc0b3da468e2943500f024b;hb=3270bfc2370884933628f95122da00d430db6072;hp=128bcfc7c894c361d070872c565797ffa4283a61;hpb=c9420061c26a910c3bd0fcf4d347c74a5edbdf3a;p=fs%2Flustre-release.git diff --git a/lustre/ofd/ofd_internal.h b/lustre/ofd/ofd_internal.h index 128bcfc..d96a517 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,7 @@ #define OFD_ROCOMPAT_SUPP (0) #define OFD_INCOMPAT_SUPP (OBD_INCOMPAT_GROUPS | OBD_INCOMPAT_OST | \ OBD_INCOMPAT_COMMON_LR) -#define OFD_PRECREATE_BATCH_DEFAULT (FILTER_SUBDIR_COUNT * 4) +#define OFD_PRECREATE_BATCH_DEFAULT (OBJ_SUBDIR_COUNT * 4) /* on small filesystems we should not precreate too many objects in * a single transaction, otherwise we can overflow transactions */ @@ -69,46 +70,45 @@ 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, - LPROC_OFD_WRITE_BYTES = 1, - LPROC_OFD_LAST, -}; - -/* for job stats */ +/* request stats */ enum { LPROC_OFD_STATS_READ = 0, - LPROC_OFD_STATS_WRITE = 1, - LPROC_OFD_STATS_SETATTR = 2, - LPROC_OFD_STATS_PUNCH = 3, - LPROC_OFD_STATS_SYNC = 4, + LPROC_OFD_STATS_WRITE, + LPROC_OFD_STATS_GETATTR, + LPROC_OFD_STATS_SETATTR, + LPROC_OFD_STATS_PUNCH, + LPROC_OFD_STATS_SYNC, + LPROC_OFD_STATS_DESTROY, + LPROC_OFD_STATS_CREATE, + LPROC_OFD_STATS_STATFS, + LPROC_OFD_STATS_GET_INFO, + LPROC_OFD_STATS_SET_INFO, + LPROC_OFD_STATS_QUOTACTL, LPROC_OFD_STATS_LAST, }; static inline void ofd_counter_incr(struct obd_export *exp, int opcode, char *jobid, long amount) { + if (exp->exp_obd && exp->exp_obd->obd_stats) + lprocfs_counter_add(exp->exp_obd->obd_stats, opcode, 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 && exp->exp_nid_stats->nid_stats != NULL) { - if (opcode == LPROC_OFD_STATS_READ) - lprocfs_counter_add(exp->exp_nid_stats->nid_stats, - LPROC_OFD_READ_BYTES, amount); - else if (opcode == LPROC_OFD_STATS_WRITE) - lprocfs_counter_add(exp->exp_nid_stats->nid_stats, - LPROC_OFD_WRITE_BYTES, amount); + lprocfs_counter_add(exp->exp_nid_stats->nid_stats, opcode, + amount); } } struct ofd_seq { cfs_list_t os_list; - obd_id os_last_oid; - obd_seq os_seq; + struct ost_id os_oi; spinlock_t os_last_oid_lock; struct mutex os_create_lock; cfs_atomic_t os_refc; @@ -124,9 +124,6 @@ struct ofd_device { /* DLM name-space for meta-data locks maintained by this server */ struct ldlm_namespace *ofd_namespace; - /* transaction callbacks */ - struct dt_txn_callback ofd_txn_cb; - /* last_rcvd file */ struct lu_target ofd_lut; struct dt_object *ofd_health_check_file; @@ -180,11 +177,10 @@ struct ofd_device { unsigned long ofd_raid_degraded:1, /* sync journal on writes */ ofd_syncjournal:1, - /* sync on lock cancel */ - ofd_sync_lock_cancel:2, /* 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) @@ -291,17 +287,13 @@ struct ofd_thread_info { struct obd_export *fti_exp; __u64 fti_xid; - __u64 fti_transno; __u64 fti_pre_version; - __u32 fti_has_trans:1, /* has txn already */ - fti_mult_trans:1; struct lu_fid fti_fid; struct lu_attr fti_attr; 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 { @@ -338,6 +330,12 @@ extern struct obd_ops ofd_obd_ops; int ofd_statfs_internal(const struct lu_env *env, struct ofd_device *ofd, struct obd_statfs *osfs, __u64 max_age, int *from_cache); +int ofd_orphans_destroy(const struct lu_env *env, struct obd_export *exp, + struct ofd_device *ofd, struct obdo *oa); +int ofd_destroy_by_fid(const struct lu_env *env, struct ofd_device *ofd, + const struct lu_fid *fid, int orphan); +int ofd_statfs(const struct lu_env *env, struct obd_export *exp, + struct obd_statfs *osfs, __u64 max_age, __u32 flags); /* ofd_fs.c */ obd_id ofd_seq_last_oid(struct ofd_seq *oseq); @@ -382,15 +380,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 @@ -404,7 +399,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, struct ofd_seq *oseq, 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, @@ -418,6 +413,21 @@ int ofd_attr_get(const struct lu_env *env, struct ofd_object *fo, int ofd_attr_handle_ugid(const struct lu_env *env, struct ofd_object *fo, struct lu_attr *la, int is_setattr); +static inline +struct ofd_object *ofd_object_find_exists(const struct lu_env *env, + struct ofd_device *ofd, + struct lu_fid *fid) +{ + struct ofd_object *fo; + + fo = ofd_object_find(env, ofd, fid); + if (!IS_ERR(fo) && !ofd_object_exists(fo)) { + ofd_object_put(env, fo); + fo = ERR_PTR(-ENOENT); + } + return fo; +} + /* ofd_grants.c */ #define OFD_GRANT_RATIO_SHIFT 8 static inline __u64 ofd_grant_reserved(struct ofd_device *ofd, obd_size bavail) @@ -432,7 +442,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. @@ -443,7 +453,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 && @@ -456,13 +466,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); @@ -488,6 +498,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; @@ -496,24 +512,22 @@ int ofd_intent_policy(struct ldlm_namespace *ns, struct ldlm_lock **lockp, void *req_cookie, ldlm_mode_t mode, __u64 flags, void *data); -static inline struct ofd_thread_info * ofd_info(const struct lu_env *env) +static inline struct ofd_thread_info *ofd_info(const struct lu_env *env) { struct ofd_thread_info *info; + lu_env_refill((void *)env); info = lu_context_key_get(&env->le_ctx, &ofd_thread_key); LASSERT(info); - LASSERT(info->fti_env); - LASSERT(info->fti_env == env); return info; } -static inline struct ofd_thread_info * ofd_info_init(const struct lu_env *env, - struct obd_export *exp) +static inline struct ofd_thread_info *ofd_info_init(const struct lu_env *env, + struct obd_export *exp) { struct ofd_thread_info *info; - info = lu_context_key_get(&env->le_ctx, &ofd_thread_key); - LASSERT(info); + info = ofd_info(env); LASSERT(info->fti_exp == NULL); LASSERT(info->fti_env == NULL); LASSERT(info->fti_attr.la_valid == 0); @@ -521,49 +535,37 @@ static inline struct ofd_thread_info * ofd_info_init(const struct lu_env *env, info->fti_env = env; info->fti_exp = exp; info->fti_pre_version = 0; - info->fti_transno = 0; - info->fti_has_trans = 0; 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) +static inline struct ofd_thread_info *tsi2ofd_info(struct tgt_session_info *tsi) { - 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); - } -} + struct ptlrpc_request *req = tgt_ses_req(tsi); + struct ofd_thread_info *info; -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; + info = ofd_info(tsi->tsi_env); + LASSERT(info->fti_exp == NULL); + LASSERT(info->fti_env == NULL); + LASSERT(info->fti_attr.la_valid == 0); + + info->fti_env = tsi->tsi_env; + info->fti_exp = tsi->tsi_exp; + + info->fti_xid = req->rq_xid; + /** VBR: take versions from request */ + if (req->rq_reqmsg != NULL && + lustre_msg_get_flags(req->rq_reqmsg) & MSG_REPLAY) { + __u64 *pre_version = lustre_msg_get_versions(req->rq_reqmsg); + + info->fti_pre_version = pre_version ? pre_version[0] : 0; } + return info; } static inline void ofd_oti2info(struct ofd_thread_info *info, struct obd_trans_info *oti) { info->fti_xid = oti->oti_xid; - info->fti_transno = oti->oti_transno; info->fti_pre_version = oti->oti_pre_version; } @@ -571,11 +573,6 @@ static inline void ofd_info2oti(struct ofd_thread_info *info, struct obd_trans_info *oti) { oti->oti_xid = info->fti_xid; - LASSERTF(ergo(oti->oti_transno > 0, - oti->oti_transno == info->fti_transno), - "Overwrite replay transno "LPX64" by "LPX64"\n", - oti->oti_transno, info->fti_transno); - oti->oti_transno = info->fti_transno; oti->oti_pre_version = info->fti_pre_version; } @@ -585,15 +582,14 @@ static inline void ofd_info2oti(struct ofd_thread_info *info, static inline void ofd_slc_set(struct ofd_device *ofd) { if (ofd->ofd_syncjournal == 1) - ofd->ofd_sync_lock_cancel = NEVER_SYNC_ON_CANCEL; - else if (ofd->ofd_sync_lock_cancel == NEVER_SYNC_ON_CANCEL) - ofd->ofd_sync_lock_cancel = ALWAYS_SYNC_ON_CANCEL; + ofd->ofd_lut.lut_sync_lock_cancel = NEVER_SYNC_ON_CANCEL; + else if (ofd->ofd_lut.lut_sync_lock_cancel == NEVER_SYNC_ON_CANCEL) + ofd->ofd_lut.lut_sync_lock_cancel = ALWAYS_SYNC_ON_CANCEL; } -static inline void ofd_prepare_fidea(struct filter_fid *ff, struct obdo *oa) +static inline void ofd_prepare_fidea(struct filter_fid *ff, + const struct obdo *oa) { - if (!(oa->o_valid & OBD_MD_FLGROUP)) - oa->o_seq = 0; /* 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. */ @@ -602,8 +598,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 */