X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Finclude%2Flustre_fid.h;h=ea6d743b1aaaec5c89338be90fff763910edefc7;hp=cf8ba1698ba7c3d73c5b689a86980ca6509d5794;hb=381a8cdd527ce4deccfc3f7eb461892f6f2f3fff;hpb=976c0abd4efab4f56cf4b21b940eb1b976c37372 diff --git a/lustre/include/lustre_fid.h b/lustre/include/lustre_fid.h index cf8ba16..ea6d743 100644 --- a/lustre/include/lustre_fid.h +++ b/lustre/include/lustre_fid.h @@ -15,11 +15,7 @@ * * You should have received a copy of the GNU General Public License * version 2 along with this program; If not, see - * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf - * - * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, - * CA 95054 USA or visit www.sun.com if you need additional information or - * have any questions. + * http://www.gnu.org/licenses/gpl-2.0.html * * GPL HEADER END */ @@ -27,7 +23,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, 2017, Intel Corporation. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -153,7 +149,9 @@ */ #include -#include +#include +#include +#include struct lu_env; struct lu_site; @@ -166,7 +164,9 @@ extern const struct lu_seq_range LUSTRE_SEQ_SPACE_RANGE; extern const struct lu_seq_range LUSTRE_SEQ_ZERO_RANGE; extern const struct lu_fid LUSTRE_BFL_FID; extern const struct lu_fid LU_OBF_FID; +extern const struct lu_fid LU_LPF_FID; extern const struct lu_fid LU_DOT_LUSTRE_FID; +extern const struct lu_fid LU_BACKEND_LPF_FID; enum { /* @@ -196,13 +196,6 @@ enum { LUSTRE_SEQ_SUPER_WIDTH = ((1ULL << 30ULL) * LUSTRE_SEQ_META_WIDTH) }; -enum { - /** 2^6 FIDs for OI containers */ - OSD_OI_FID_OID_BITS = 6, - /** reserve enough FIDs in case we want more in the future */ - OSD_OI_FID_OID_BITS_MAX = 10, -}; - /** special OID for local objects */ enum local_oid { /** \see fld_mod_init */ @@ -222,10 +215,10 @@ enum local_oid { ACCT_GROUP_OID = 16UL, LFSCK_BOOKMARK_OID = 17UL, OTABLE_IT_OID = 18UL, - /* These two definitions are obsolete - * OFD_GROUP0_LAST_OID = 20UL, - * OFD_GROUP4K_LAST_OID = 20UL+4096, - */ + OSD_LPF_OID = 19UL, + REPLY_DATA_OID = 21UL, + ACCT_PROJECT_OID = 22UL, + INDEX_BACKUP_OID = 4116UL, OFD_LAST_GROUP_OID = 4117UL, LLOG_CATALOGS_OID = 4118UL, MGS_CONFIGS_OID = 4119UL, @@ -233,6 +226,10 @@ enum local_oid { MDD_LOV_OBJ_OSEQ = 4121UL, LFSCK_NAMESPACE_OID = 4122UL, REMOTE_PARENT_DIR_OID = 4123UL, + /* This definition is obsolete + * SLAVE_LLOG_CATALOGS_OID = 4124UL, + */ + BATCHID_COMMITTED_OID = 4125UL, }; static inline void lu_local_obj_fid(struct lu_fid *fid, __u32 oid) @@ -255,7 +252,7 @@ static inline void lu_local_name_obj_fid(struct lu_fid *fid, __u32 oid) static inline int fid_is_root(const struct lu_fid *fid) { return unlikely((fid_seq(fid) == FID_SEQ_ROOT && - fid_oid(fid) == 1)); + fid_oid(fid) == FID_OID_ROOT)); } static inline int fid_is_dot_lustre(const struct lu_fid *fid) @@ -276,11 +273,22 @@ static inline int fid_is_otable_it(const struct lu_fid *fid) fid_oid(fid) == OTABLE_IT_OID); } +static inline int fid_oid_is_quota(const struct lu_fid *fid) +{ + switch (fid_oid(fid)) { + case ACCT_USER_OID: + case ACCT_GROUP_OID: + case ACCT_PROJECT_OID: + return 1; + default: + return 0; + } +} + static inline int fid_is_acct(const struct lu_fid *fid) { return fid_seq(fid) == FID_SEQ_LOCAL_FILE && - (fid_oid(fid) == ACCT_USER_OID || - fid_oid(fid) == ACCT_GROUP_OID); + fid_oid_is_quota(fid); } static inline int fid_is_quota(const struct lu_fid *fid) @@ -302,7 +310,7 @@ static inline int fid_is_namespace_visible(const struct lu_fid *fid) * object or not. It is caller's duty to check more if needed. */ return (!fid_is_last_id(fid) && (fid_seq_is_norm(seq) || fid_seq_is_igif(seq))) || - fid_is_root(fid) || fid_is_dot_lustre(fid); + fid_is_root(fid) || fid_seq_is_dot(seq); } static inline int fid_seq_in_fldb(__u64 seq) @@ -311,19 +319,77 @@ static inline int fid_seq_in_fldb(__u64 seq) fid_seq_is_root(seq) || fid_seq_is_dot(seq); } +static inline void ost_layout_cpu_to_le(struct ost_layout *dst, + const struct ost_layout *src) +{ + dst->ol_stripe_size = __cpu_to_le32(src->ol_stripe_size); + dst->ol_stripe_count = __cpu_to_le32(src->ol_stripe_count); + dst->ol_comp_start = __cpu_to_le64(src->ol_comp_start); + dst->ol_comp_end = __cpu_to_le64(src->ol_comp_end); + dst->ol_comp_id = __cpu_to_le32(src->ol_comp_id); +} + +static inline void ost_layout_le_to_cpu(struct ost_layout *dst, + const struct ost_layout *src) +{ + dst->ol_stripe_size = __le32_to_cpu(src->ol_stripe_size); + dst->ol_stripe_count = __le32_to_cpu(src->ol_stripe_count); + dst->ol_comp_start = __le64_to_cpu(src->ol_comp_start); + dst->ol_comp_end = __le64_to_cpu(src->ol_comp_end); + dst->ol_comp_id = __le32_to_cpu(src->ol_comp_id); +} + +static inline void filter_fid_cpu_to_le(struct filter_fid *dst, + const struct filter_fid *src, int size) +{ + fid_cpu_to_le(&dst->ff_parent, &src->ff_parent); + + if (size < sizeof(struct filter_fid)) { + memset(&dst->ff_layout, 0, sizeof(dst->ff_layout)); + } else { + ost_layout_cpu_to_le(&dst->ff_layout, &src->ff_layout); + dst->ff_layout_version = cpu_to_le32(src->ff_layout_version); + dst->ff_range = cpu_to_le32(src->ff_range); + } + + /* XXX: Add more if filter_fid is enlarged in the future. */ +} + +static inline void filter_fid_le_to_cpu(struct filter_fid *dst, + const struct filter_fid *src, int size) +{ + fid_le_to_cpu(&dst->ff_parent, &src->ff_parent); + + if (size < sizeof(struct filter_fid)) { + memset(&dst->ff_layout, 0, sizeof(dst->ff_layout)); + } else { + ost_layout_le_to_cpu(&dst->ff_layout, &src->ff_layout); + dst->ff_layout_version = le32_to_cpu(src->ff_layout_version); + dst->ff_range = le32_to_cpu(src->ff_range); + } + + /* XXX: Add more if filter_fid is enlarged in the future. */ +} + static inline void lu_last_id_fid(struct lu_fid *fid, __u64 seq, __u32 ost_idx) { if (fid_seq_is_mdt0(seq)) { fid->f_seq = fid_idif_seq(0, ost_idx); } else { LASSERTF(fid_seq_is_norm(seq) || fid_seq_is_echo(seq) || - fid_seq_is_idif(seq), LPX64"\n", seq); + fid_seq_is_idif(seq), "%#llx\n", seq); fid->f_seq = seq; } fid->f_oid = 0; fid->f_ver = 0; } +static inline bool fid_is_md_operative(const struct lu_fid *fid) +{ + return fid_is_mdt0(fid) || fid_is_igif(fid) || + fid_is_norm(fid) || fid_is_root(fid); +} + /* seq client type */ enum lu_cli_type { LUSTRE_SEQ_METADATA = 1, @@ -350,8 +416,8 @@ struct lu_client_seq { */ struct lu_seq_range lcs_space; - /* Seq related proc */ - cfs_proc_dir_entry_t *lcs_proc_dir; + /* Seq related debugfs */ + struct dentry *lcs_debugfs_entry; /* This holds last allocated fid in last obtained seq */ struct lu_fid lcs_fid; @@ -361,7 +427,7 @@ struct lu_client_seq { /* * Service uuid, passed from MDT + seq name to form unique seq name to - * use it with procfs. + * use it with debugfs. */ char lcs_name[80]; @@ -397,13 +463,13 @@ struct lu_server_seq { /* /seq file object device */ struct dt_object *lss_obj; - /* Seq related proc */ - cfs_proc_dir_entry_t *lss_proc_dir; + /* Seq related debugfs */ + struct dentry *lss_debugfs_entry; /* LUSTRE_SEQ_SERVER or LUSTRE_SEQ_CONTROLLER */ enum lu_mgr_type lss_type; - /* Client interafce to request controller */ + /* Client interface to request controller */ struct lu_client_seq *lss_cli; /* Mutex for protecting allocation */ @@ -411,7 +477,7 @@ struct lu_server_seq { /* * Service uuid, passed from MDT + seq name to form unique seq name to - * use it with procfs. + * use it with debugfs. */ char lss_name[80]; @@ -436,6 +502,35 @@ struct lu_server_seq { struct seq_server_site *lss_site; }; +struct seq_server_site { + struct lu_site *ss_lu; + /** + * mds number of this site. + */ + u32 ss_node_id; + /** + * Fid location database + */ + struct lu_server_fld *ss_server_fld; + struct lu_client_fld *ss_client_fld; + + /** + * Server Seq Manager + */ + struct lu_server_seq *ss_server_seq; + + /** + * Controller Seq Manager + */ + struct lu_server_seq *ss_control_seq; + struct obd_export *ss_control_exp; + + /** + * Client Seq Manager + */ + struct lu_client_seq *ss_client_seq; +}; + /* Server methods */ int seq_server_init(const struct lu_env *env, @@ -460,6 +555,8 @@ int seq_server_set_cli(const struct lu_env *env, struct lu_server_seq *seq, struct lu_client_seq *cli); +int seq_server_check_and_alloc_super(const struct lu_env *env, + struct lu_server_seq *seq); /* Client methods */ int seq_client_init(struct lu_client_seq *seq, struct obd_export *exp, @@ -474,7 +571,7 @@ void seq_client_flush(struct lu_client_seq *seq); int seq_client_alloc_fid(const struct lu_env *env, struct lu_client_seq *seq, struct lu_fid *fid); int seq_client_get_seq(const struct lu_env *env, struct lu_client_seq *seq, - seqno_t *seqnr); + u64 *seqnr); int seq_site_fini(const struct lu_env *env, struct seq_server_site *ss); /* Fids common stuff */ int fid_is_local(const struct lu_env *env, @@ -496,14 +593,12 @@ struct ldlm_namespace; * but was moved into name[1] along with the OID to avoid consuming the * renaming name[2,3] fields that need to be used for the quota identifier. */ -static inline struct ldlm_res_id * +static inline void fid_build_reg_res_name(const struct lu_fid *fid, struct ldlm_res_id *res) { 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; } /* @@ -519,29 +614,25 @@ static inline int fid_res_name_eq(const struct lu_fid *fid, /* * Extract FID from LDLM resource. Reverse of fid_build_reg_res_name(). */ -static inline struct lu_fid * +static inline void 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 * +static inline void 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; } /* @@ -558,14 +649,12 @@ static inline void fid_extract_from_quota_res(struct lu_fid *glb_fid, (__u32)(res->name[LUSTRE_RES_ID_QUOTA_VER_OID_OFF] >> 32); } -static inline struct ldlm_res_id * +static inline void fid_build_pdo_res_name(const struct lu_fid *fid, unsigned int hash, struct ldlm_res_id *res) { fid_build_reg_res_name(fid, res); res->name[LUSTRE_RES_ID_HSH_OFF] = hash; - - return res; } /** @@ -586,7 +675,7 @@ fid_build_pdo_res_name(const struct lu_fid *fid, unsigned int hash, * 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 *oi, +static inline void ostid_build_res_name(const struct ost_id *oi, struct ldlm_res_id *name) { memset(name, 0, sizeof *name); @@ -601,8 +690,8 @@ static inline void ostid_build_res_name(struct ost_id *oi, /** * Return true if the resource is for the object identified by this id & group. */ -static inline int ostid_res_name_eq(struct ost_id *oi, - struct ldlm_res_id *name) +static inline bool ostid_res_name_eq(const struct ost_id *oi, + const struct ldlm_res_id *name) { /* Note: it is just a trick here to save some effort, probably the * correct way would be turn them into the FID and compare */ @@ -615,6 +704,50 @@ static inline int ostid_res_name_eq(struct ost_id *oi, } } +/** + * Note: we need check oi_seq to decide where to set oi_id, + * so oi_seq should always be set ahead of oi_id. + */ +static inline int ostid_set_id(struct ost_id *oi, __u64 oid) +{ + if (fid_seq_is_mdt0(oi->oi.oi_seq)) { + if (oid >= IDIF_MAX_OID) + return -E2BIG; + oi->oi.oi_id = oid; + } else if (fid_is_idif(&oi->oi_fid)) { + if (oid >= IDIF_MAX_OID) + return -E2BIG; + oi->oi_fid.f_seq = fid_idif_seq(oid, + fid_idif_ost_idx(&oi->oi_fid)); + oi->oi_fid.f_oid = oid; + oi->oi_fid.f_ver = oid >> 48; + } else { + if (oid >= OBIF_MAX_OID) + return -E2BIG; + oi->oi_fid.f_oid = oid; + } + return 0; +} + +/* pack any OST FID into an ostid (id/seq) for the wire/disk */ +static inline int fid_to_ostid(const struct lu_fid *fid, struct ost_id *ostid) +{ + int rc = 0; + + if (fid_seq_is_igif(fid->f_seq)) + return -EBADF; + + if (fid_is_idif(fid)) { + ostid_set_seq_mdt0(ostid); + rc = ostid_set_id(ostid, fid_idif_id(fid_seq(fid), + fid_oid(fid), fid_ver(fid))); + } else { + ostid->oi_fid = *fid; + } + + return rc; +} + /* The same as osc_build_res_name() */ static inline void ost_fid_build_resid(const struct lu_fid *fid, struct ldlm_res_id *resname) @@ -637,8 +770,13 @@ static inline void ost_fid_from_resid(struct lu_fid *fid, if (fid_seq_is_mdt0(name->name[LUSTRE_RES_ID_VER_OID_OFF])) { /* old resid */ struct ost_id oi; + + memset(&oi, 0, sizeof(oi)); ostid_set_seq(&oi, name->name[LUSTRE_RES_ID_VER_OID_OFF]); - ostid_set_id(&oi, name->name[LUSTRE_RES_ID_SEQ_OFF]); + if (ostid_set_id(&oi, name->name[LUSTRE_RES_ID_SEQ_OFF])) { + CERROR("Bad %llu to set " DOSTID "\n", + name->name[LUSTRE_RES_ID_SEQ_OFF], POSTID(&oi)); + } ostid_to_fid(fid, &oi, ost_idx); } else { /* new resid */ @@ -659,19 +797,19 @@ static inline void ost_fid_from_resid(struct lu_fid *fid, */ static inline __u64 fid_flatten(const struct lu_fid *fid) { - __u64 ino; - __u64 seq; + __u64 ino; + __u64 seq; - if (fid_is_igif(fid)) { - ino = lu_igif_ino(fid); - RETURN(ino); - } + if (fid_is_igif(fid)) { + ino = lu_igif_ino(fid); + return ino; + } - seq = fid_seq(fid); + seq = fid_seq(fid); - ino = (seq << 24) + ((seq >> 24) & 0xffffff0000ULL) + fid_oid(fid); + ino = (seq << 24) + ((seq >> 24) & 0xffffff0000ULL) + fid_oid(fid); - RETURN(ino ? ino : fid_oid(fid)); + return ino ?: fid_oid(fid); } static inline __u32 fid_hash(const struct lu_fid *f, int bits) @@ -685,29 +823,30 @@ static inline __u32 fid_hash(const struct lu_fid *f, int bits) * map fid to 32 bit value for ino on 32bit systems. */ static inline __u32 fid_flatten32(const struct lu_fid *fid) { - __u32 ino; - __u64 seq; + __u32 ino; + __u64 seq; - if (fid_is_igif(fid)) { - ino = lu_igif_ino(fid); - RETURN(ino); - } + if (fid_is_igif(fid)) { + ino = lu_igif_ino(fid); + return ino; + } - seq = fid_seq(fid) - FID_SEQ_START; + seq = fid_seq(fid) - FID_SEQ_START; - /* Map the high bits of the OID into higher bits of the inode number so - * that inodes generated at about the same time have a reduced chance - * of collisions. This will give a period of 2^12 = 1024 unique clients - * (from SEQ) and up to min(LUSTRE_SEQ_MAX_WIDTH, 2^20) = 128k objects - * (from OID), or up to 128M inodes without collisions for new files. */ - ino = ((seq & 0x000fffffULL) << 12) + ((seq >> 8) & 0xfffff000) + - (seq >> (64 - (40-8)) & 0xffffff00) + - (fid_oid(fid) & 0xff000fff) + ((fid_oid(fid) & 0x00fff000) << 8); + /* Map the high bits of the OID into higher bits of the inode number so + * that inodes generated at about the same time have a reduced chance + * of collisions. This will give a period of 2^12 = 1024 unique clients + * (from SEQ) and up to min(LUSTRE_SEQ_MAX_WIDTH, 2^20) = 128k objects + * (from OID), or up to 128M inodes without collisions for new files. */ + ino = ((seq & 0x000fffffULL) << 12) + ((seq >> 8) & 0xfffff000) + + (seq >> (64 - (40-8)) & 0xffffff00) + + (fid_oid(fid) & 0xff000fff) + ((fid_oid(fid) & 0x00fff000) << 8); - RETURN(ino ? ino : fid_oid(fid)); + return ino ?: fid_oid(fid); } -static inline int lu_fid_diff(struct lu_fid *fid1, struct lu_fid *fid2) +static inline int +lu_fid_diff(const struct lu_fid *fid1, const struct lu_fid *fid2) { LASSERTF(fid_seq(fid1) == fid_seq(fid2), "fid1:"DFID", fid2:"DFID"\n", PFID(fid1), PFID(fid2)); @@ -719,11 +858,39 @@ static inline int lu_fid_diff(struct lu_fid *fid1, struct lu_fid *fid2) return fid_oid(fid1) - fid_oid(fid2); } +static inline int fid_set_id(struct lu_fid *fid, u64 oid) +{ + if (unlikely(fid_seq_is_igif(fid->f_seq))) { + CERROR("bad IGIF, "DFID"\n", PFID(fid)); + return -EBADF; + } + + if (fid_is_idif(fid)) { + if (oid >= IDIF_MAX_OID) { + CERROR("Too large OID %#llx to set IDIF "DFID"\n", + (unsigned long long)oid, PFID(fid)); + return -EBADF; + } + fid->f_seq = fid_idif_seq(oid, fid_idif_ost_idx(fid)); + fid->f_oid = oid; + fid->f_ver = oid >> 48; + } else { + if (oid > OBIF_MAX_OID) { + CERROR("Too large OID %#llx to set REG "DFID"\n", + (unsigned long long)oid, PFID(fid)); + return -EBADF; + } + fid->f_oid = oid; + } + return 0; +} + #define LUSTRE_SEQ_SRV_NAME "seq_srv" #define LUSTRE_SEQ_CTL_NAME "seq_ctl" /* Range common stuff */ -static inline void range_cpu_to_le(struct lu_seq_range *dst, const struct lu_seq_range *src) +static inline void +range_cpu_to_le(struct lu_seq_range *dst, const struct lu_seq_range *src) { dst->lsr_start = cpu_to_le64(src->lsr_start); dst->lsr_end = cpu_to_le64(src->lsr_end); @@ -731,7 +898,8 @@ static inline void range_cpu_to_le(struct lu_seq_range *dst, const struct lu_seq dst->lsr_flags = cpu_to_le32(src->lsr_flags); } -static inline void range_le_to_cpu(struct lu_seq_range *dst, const struct lu_seq_range *src) +static inline void +range_le_to_cpu(struct lu_seq_range *dst, const struct lu_seq_range *src) { dst->lsr_start = le64_to_cpu(src->lsr_start); dst->lsr_end = le64_to_cpu(src->lsr_end); @@ -739,7 +907,8 @@ static inline void range_le_to_cpu(struct lu_seq_range *dst, const struct lu_seq dst->lsr_flags = le32_to_cpu(src->lsr_flags); } -static inline void range_cpu_to_be(struct lu_seq_range *dst, const struct lu_seq_range *src) +static inline void +range_cpu_to_be(struct lu_seq_range *dst, const struct lu_seq_range *src) { dst->lsr_start = cpu_to_be64(src->lsr_start); dst->lsr_end = cpu_to_be64(src->lsr_end); @@ -747,7 +916,8 @@ static inline void range_cpu_to_be(struct lu_seq_range *dst, const struct lu_seq dst->lsr_flags = cpu_to_be32(src->lsr_flags); } -static inline void range_be_to_cpu(struct lu_seq_range *dst, const struct lu_seq_range *src) +static inline void +range_be_to_cpu(struct lu_seq_range *dst, const struct lu_seq_range *src) { dst->lsr_start = be64_to_cpu(src->lsr_start); dst->lsr_end = be64_to_cpu(src->lsr_end); @@ -758,7 +928,7 @@ static inline void range_be_to_cpu(struct lu_seq_range *dst, const struct lu_seq static inline void range_array_cpu_to_le(struct lu_seq_range_array *dst, const struct lu_seq_range_array *src) { - int i; + __u32 i; for (i = 0; i < src->lsra_count; i++) range_cpu_to_le(&dst->lsra_lsr[i], &src->lsra_lsr[i]); @@ -769,7 +939,7 @@ static inline void range_array_cpu_to_le(struct lu_seq_range_array *dst, static inline void range_array_le_to_cpu(struct lu_seq_range_array *dst, const struct lu_seq_range_array *src) { - int i; + __u32 i; dst->lsra_count = le32_to_cpu(src->lsra_count); for (i = 0; i < dst->lsra_count; i++)