X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Finclude%2Flustre_fid.h;h=2ce75b264ab5ddb3862c7a088206a67c77e7e200;hb=295968fa7257978bba7aa4fedb28cd3563d4a5e0;hp=388c0972047a21d48ab002491c129c555db26cf1;hpb=073a1b04c5fc4b38717d70748d88ded614e9365d;p=fs%2Flustre-release.git diff --git a/lustre/include/lustre_fid.h b/lustre/include/lustre_fid.h index 388c097..2ce75b2 100644 --- a/lustre/include/lustre_fid.h +++ b/lustre/include/lustre_fid.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, 2012, Intel Corporation. + * Copyright (c) 2011, 2013, Intel Corporation. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -38,8 +38,8 @@ * Author: Yury Umanets */ -#ifndef __LINUX_FID_H -#define __LINUX_FID_H +#ifndef __LUSTRE_FID_H +#define __LUSTRE_FID_H /** \defgroup fid fid * @@ -154,13 +154,12 @@ #include #include -#include -#include -#include - +struct lu_env; struct lu_site; struct lu_context; +struct obd_device; +struct obd_export; /* Whole sequences space range and zero range definitions */ extern const struct lu_seq_range LUSTRE_SEQ_SPACE_RANGE; @@ -212,8 +211,8 @@ enum local_oid { FID_SEQ_CTL_OID = 4UL, FID_SEQ_SRV_OID = 5UL, /** \see mdd_mod_init */ - MDD_ROOT_INDEX_OID = 6UL, - MDD_ORPHAN_OID = 7UL, + MDD_ROOT_INDEX_OID = 6UL, /* deprecated in 2.4 */ + MDD_ORPHAN_OID = 7UL, /* deprecated in 2.4 */ MDD_LOV_OBJ_OID = 8UL, MDD_CAPA_KEYS_OID = 9UL, /** \see mdt_mod_init */ @@ -232,6 +231,8 @@ enum local_oid { MGS_CONFIGS_OID = 4119UL, OFD_HEALTH_CHECK_OID = 4120UL, MDD_LOV_OBJ_OSEQ = 4121UL, + LFSCK_NAMESPACE_OID = 4122UL, + REMOTE_PARENT_DIR_OID = 4123UL, }; static inline void lu_local_obj_fid(struct lu_fid *fid, __u32 oid) @@ -248,10 +249,13 @@ static inline void lu_local_name_obj_fid(struct lu_fid *fid, __u32 oid) fid->f_ver = 0; } +/* For new FS (>= 2.4), the root FID will be changed to + * [FID_SEQ_ROOT:1:0], for existing FS, (upgraded to 2.4), + * the root FID will still be IGIF */ static inline int fid_is_root(const struct lu_fid *fid) { - return unlikely(fid_seq(fid) == FID_SEQ_LOCAL_FILE && - fid_oid(fid) == MDD_ROOT_INDEX_OID); + return unlikely((fid_seq(fid) == FID_SEQ_ROOT && + fid_oid(fid) == 1)); } static inline int fid_is_dot_lustre(const struct lu_fid *fid) @@ -260,6 +264,12 @@ static inline int fid_is_dot_lustre(const struct lu_fid *fid) fid_oid(fid) == FID_OID_DOT_LUSTRE); } +static inline int fid_is_obf(const struct lu_fid *fid) +{ + return unlikely(fid_seq(fid) == FID_SEQ_DOT_LUSTRE && + fid_oid(fid) == FID_OID_DOT_LUSTRE_OBF); +} + static inline int fid_is_otable_it(const struct lu_fid *fid) { return unlikely(fid_seq(fid) == FID_SEQ_LOCAL_FILE && @@ -279,7 +289,7 @@ static inline int fid_is_quota(const struct lu_fid *fid) fid_seq(fid) == FID_SEQ_QUOTA_GLB; } -static inline int fid_is_client_mdt_visible(const struct lu_fid *fid) +static inline int fid_is_namespace_visible(const struct lu_fid *fid) { const __u64 seq = fid_seq(fid); @@ -290,9 +300,10 @@ static inline int fid_is_client_mdt_visible(const struct lu_fid *fid) fid_is_root(fid) || fid_is_dot_lustre(fid); } -static inline int fid_is_client_visible(const struct lu_fid *fid) +static inline int fid_seq_in_fldb(__u64 seq) { - return fid_is_client_mdt_visible(fid) || fid_is_idif(fid); + return fid_seq_is_igif(seq) || fid_seq_is_norm(seq) || + fid_seq_is_root(seq) || fid_seq_is_dot(seq); } static inline void lu_last_id_fid(struct lu_fid *fid, __u64 seq) @@ -308,6 +319,12 @@ static inline void lu_last_id_fid(struct lu_fid *fid, __u64 seq) fid->f_ver = 0; } +/* seq client type */ +enum lu_cli_type { + LUSTRE_SEQ_METADATA = 1, + LUSTRE_SEQ_DATA +}; + enum lu_mgr_type { LUSTRE_SEQ_SERVER, LUSTRE_SEQ_CONTROLLER @@ -414,10 +431,8 @@ struct lu_server_seq { struct seq_server_site *lss_site; }; -int seq_query(struct com_thread_info *info); -int seq_handle(struct ptlrpc_request *req); - /* Server methods */ + int seq_server_init(struct lu_server_seq *seq, struct dt_device *dev, const char *prefix, @@ -460,6 +475,7 @@ int seq_site_fini(const struct lu_env *env, struct seq_server_site *ss); int fid_is_local(const struct lu_env *env, struct lu_site *site, const struct lu_fid *fid); +enum lu_cli_type; int client_fid_init(struct obd_device *obd, struct obd_export *exp, enum lu_cli_type type); int client_fid_fini(struct obd_device *obd); @@ -476,105 +492,165 @@ struct ldlm_namespace; * renaming name[2,3] fields that need to be used for the quota identifier. */ static inline struct ldlm_res_id * -fid_build_reg_res_name(const struct lu_fid *f, - struct ldlm_res_id *name) +fid_build_reg_res_name(const struct lu_fid *fid, struct ldlm_res_id *res) { - memset(name, 0, sizeof *name); - name->name[LUSTRE_RES_ID_SEQ_OFF] = fid_seq(f); - name->name[LUSTRE_RES_ID_VER_OID_OFF] = fid_ver_oid(f); - return name; + memset(res, 0, sizeof(*res)); + res->name[LUSTRE_RES_ID_SEQ_OFF] = fid_seq(fid); + res->name[LUSTRE_RES_ID_VER_OID_OFF] = fid_ver_oid(fid); + + return res; +} + +/* + * Return true if resource is for object identified by FID. + */ +static inline int fid_res_name_eq(const struct lu_fid *fid, + const struct ldlm_res_id *res) +{ + return res->name[LUSTRE_RES_ID_SEQ_OFF] == fid_seq(fid) && + res->name[LUSTRE_RES_ID_VER_OID_OFF] == fid_ver_oid(fid); +} + +/* + * Extract FID from LDLM resource. Reverse of fid_build_reg_res_name(). + */ +static inline struct lu_fid * +fid_extract_from_res_name(struct lu_fid *fid, const struct ldlm_res_id *res) +{ + fid->f_seq = res->name[LUSTRE_RES_ID_SEQ_OFF]; + fid->f_oid = (__u32)(res->name[LUSTRE_RES_ID_VER_OID_OFF]); + fid->f_ver = (__u32)(res->name[LUSTRE_RES_ID_VER_OID_OFF] >> 32); + LASSERT(fid_res_name_eq(fid, res)); + + return fid; } /* * Build (DLM) resource identifier from global quota FID and quota ID. */ static inline struct ldlm_res_id * -fid_build_quota_resid(const struct lu_fid *glb_fid, union lquota_id *qid, +fid_build_quota_res_name(const struct lu_fid *glb_fid, union lquota_id *qid, struct ldlm_res_id *res) { fid_build_reg_res_name(glb_fid, res); res->name[LUSTRE_RES_ID_QUOTA_SEQ_OFF] = fid_seq(&qid->qid_fid); res->name[LUSTRE_RES_ID_QUOTA_VER_OID_OFF] = fid_ver_oid(&qid->qid_fid); + return res; } /* * Extract global FID and quota ID from resource name */ -static inline void fid_extract_quota_resid(struct ldlm_res_id *res, - struct lu_fid *glb_fid, - union lquota_id *qid) +static inline void fid_extract_from_quota_res(struct lu_fid *glb_fid, + union lquota_id *qid, + const struct ldlm_res_id *res) { - glb_fid->f_seq = res->name[LUSTRE_RES_ID_SEQ_OFF]; - glb_fid->f_oid = (__u32)res->name[LUSTRE_RES_ID_VER_OID_OFF]; - glb_fid->f_ver = (__u32)(res->name[LUSTRE_RES_ID_VER_OID_OFF] >> 32); - + fid_extract_from_res_name(glb_fid, res); qid->qid_fid.f_seq = res->name[LUSTRE_RES_ID_QUOTA_SEQ_OFF]; qid->qid_fid.f_oid = (__u32)res->name[LUSTRE_RES_ID_QUOTA_VER_OID_OFF]; qid->qid_fid.f_ver = (__u32)(res->name[LUSTRE_RES_ID_QUOTA_VER_OID_OFF] >> 32); } -/* - * Return true if resource is for object identified by fid. - */ -static inline int fid_res_name_eq(const struct lu_fid *f, - const struct ldlm_res_id *name) -{ - return name->name[LUSTRE_RES_ID_SEQ_OFF] == fid_seq(f) && - name->name[LUSTRE_RES_ID_VER_OID_OFF] == fid_ver_oid(f); -} - -/* reverse function of fid_build_reg_res_name() */ -static inline void fid_build_from_res_name(struct lu_fid *f, - const struct ldlm_res_id *name) -{ - fid_zero(f); - f->f_seq = name->name[LUSTRE_RES_ID_SEQ_OFF]; - f->f_oid = name->name[LUSTRE_RES_ID_VER_OID_OFF] & 0xffffffff; - f->f_ver = name->name[LUSTRE_RES_ID_VER_OID_OFF] >> 32; - LASSERT(fid_res_name_eq(f, name)); -} - static inline struct ldlm_res_id * -fid_build_pdo_res_name(const struct lu_fid *f, - unsigned int hash, - struct ldlm_res_id *name) +fid_build_pdo_res_name(const struct lu_fid *fid, unsigned int hash, + struct ldlm_res_id *res) { - fid_build_reg_res_name(f, name); - name->name[LUSTRE_RES_ID_HSH_OFF] = hash; - return name; + fid_build_reg_res_name(fid, res); + res->name[LUSTRE_RES_ID_HSH_OFF] = hash; + + return res; } /** * Build DLM resource name from object id & seq, which will be removed * finally, when we replace ost_id with FID in data stack. * - * To keep the compatibility, res[0] = oid, res[1] = seq + * Currently, resid from the old client, whose res[0] = object_id, + * res[1] = object_seq, is just oposite with Metatdata + * resid, where, res[0] = fid->f_seq, res[1] = fid->f_oid. + * To unifiy the resid identification, we will reverse the data + * resid to keep it same with Metadata resid, i.e. + * + * For resid from the old client, + * res[0] = objid, res[1] = 0, still keep the original order, + * for compatiblity. + * + * For new resid + * res will be built from normal FID directly, i.e. res[0] = f_seq, + * res[1] = f_oid + f_ver. */ -static inline void ostid_build_res_name(struct ost_id *oid, +static inline void ostid_build_res_name(struct ost_id *oi, struct ldlm_res_id *name) { memset(name, 0, sizeof *name); - name->name[LUSTRE_RES_ID_SEQ_OFF] = oid->oi_id; - name->name[LUSTRE_RES_ID_VER_OID_OFF] = oid->oi_seq; + if (fid_seq_is_mdt0(ostid_seq(oi))) { + name->name[LUSTRE_RES_ID_SEQ_OFF] = ostid_id(oi); + name->name[LUSTRE_RES_ID_VER_OID_OFF] = ostid_seq(oi); + } else { + fid_build_reg_res_name(&oi->oi_fid, name); + } } -static inline void ostid_res_name_to_id(struct ost_id *oid, +static inline void ostid_res_name_to_id(struct ost_id *oi, struct ldlm_res_id *name) { - oid->oi_id = name->name[LUSTRE_RES_ID_SEQ_OFF]; - oid->oi_seq = name->name[LUSTRE_RES_ID_VER_OID_OFF]; + if (fid_seq_is_mdt0(name->name[LUSTRE_RES_ID_SEQ_OFF])) { + /* old resid */ + ostid_set_seq(oi, name->name[LUSTRE_RES_ID_VER_OID_OFF]); + ostid_set_id(oi, name->name[LUSTRE_RES_ID_SEQ_OFF]); + } else { + /* new resid */ + fid_extract_from_res_name(&oi->oi_fid, name); + } } /** * Return true if the resource is for the object identified by this id & group. */ -static inline int ostid_res_name_eq(struct ost_id *oid, +static inline int ostid_res_name_eq(struct ost_id *oi, struct ldlm_res_id *name) { - return name->name[LUSTRE_RES_ID_SEQ_OFF] == oid->oi_id && - name->name[LUSTRE_RES_ID_VER_OID_OFF] == oid->oi_seq; + /* Note: it is just a trick here to save some effort, probably the + * correct way would be turn them into the FID and compare */ + if (fid_seq_is_mdt0(ostid_seq(oi))) { + return name->name[LUSTRE_RES_ID_SEQ_OFF] == ostid_id(oi) && + name->name[LUSTRE_RES_ID_VER_OID_OFF] == ostid_seq(oi); + } else { + return name->name[LUSTRE_RES_ID_SEQ_OFF] == ostid_seq(oi) && + name->name[LUSTRE_RES_ID_VER_OID_OFF] == ostid_id(oi); + } +} + +/* The same as osc_build_res_name() */ +static inline void ost_fid_build_resid(const struct lu_fid *fid, + struct ldlm_res_id *resname) +{ + if (fid_is_mdt0(fid) || fid_is_idif(fid)) { + struct ost_id oi; + oi.oi.oi_id = 0; /* gcc 4.7.2 complains otherwise */ + if (fid_to_ostid(fid, &oi) != 0) + return; + ostid_build_res_name(&oi, resname); + } else { + fid_build_reg_res_name(fid, resname); + } +} + +static inline void ost_fid_from_resid(struct lu_fid *fid, + const struct ldlm_res_id *name) +{ + if (fid_seq_is_mdt0(name->name[LUSTRE_RES_ID_VER_OID_OFF])) { + /* old resid */ + struct ost_id oi; + ostid_set_seq(&oi, name->name[LUSTRE_RES_ID_VER_OID_OFF]); + ostid_set_id(&oi, name->name[LUSTRE_RES_ID_SEQ_OFF]); + ostid_to_fid(fid, &oi, 0); + } else { + /* new resid */ + fid_extract_from_res_name(fid, name); + } } /** @@ -688,4 +764,4 @@ static inline void range_be_to_cpu(struct lu_seq_range *dst, const struct lu_seq /** @} fid */ -#endif /* __LINUX_FID_H */ +#endif /* __LUSTRE_FID_H */