4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 only,
8 * as published by the Free Software Foundation.
10 * This program is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * General Public License version 2 for more details (a copy is included
14 * in the LICENSE file that accompanied this code).
16 * You should have received a copy of the GNU General Public License
17 * version 2 along with this program; If not, see
18 * http://www.gnu.org/licenses/gpl-2.0.html
23 * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
24 * Use is subject to license terms.
26 * Copyright (c) 2011, 2017, Intel Corporation.
28 * Copyright 2016 Cray Inc, all rights reserved.
31 * all fid manipulation functions go here
33 * FIDS are globally unique within a Lustre filessytem, and are made up
34 * of three parts: sequence, Object ID, and version.
37 #ifndef _UAPI_LUSTRE_FID_H_
38 #define _UAPI_LUSTRE_FID_H_
40 #include <linux/types.h>
42 * This is due to us being out of kernel and the way the OpenSFS branch
46 # include <uapi/linux/lustre/lustre_idl.h>
48 # include <linux/lustre/lustre_idl.h>
51 /** returns fid object sequence */
52 static inline __u64 fid_seq(const struct lu_fid *fid)
57 /** returns fid object id */
58 static inline __u32 fid_oid(const struct lu_fid *fid)
63 /** returns fid object version */
64 static inline __u32 fid_ver(const struct lu_fid *fid)
69 static inline void fid_zero(struct lu_fid *fid)
71 memset(fid, 0, sizeof(*fid));
74 static inline __u64 fid_ver_oid(const struct lu_fid *fid)
76 return (__u64)fid_ver(fid) << 32 | fid_oid(fid);
79 static inline bool fid_seq_is_mdt0(__u64 seq)
81 return seq == FID_SEQ_OST_MDT0;
84 static inline bool fid_seq_is_mdt(__u64 seq)
86 return seq == FID_SEQ_OST_MDT0 || seq >= FID_SEQ_NORMAL;
89 static inline bool fid_seq_is_echo(__u64 seq)
91 return seq == FID_SEQ_ECHO;
94 static inline bool fid_is_echo(const struct lu_fid *fid)
96 return fid_seq_is_echo(fid_seq(fid));
99 static inline bool fid_seq_is_llog(__u64 seq)
101 return seq == FID_SEQ_LLOG;
104 static inline bool fid_is_llog(const struct lu_fid *fid)
106 /* file with OID == 0 is not llog but contains last oid */
107 return fid_seq_is_llog(fid_seq(fid)) && fid_oid(fid) > 0;
110 static inline bool fid_seq_is_rsvd(__u64 seq)
112 return seq > FID_SEQ_OST_MDT0 && seq <= FID_SEQ_RSVD;
115 static inline bool fid_seq_is_special(__u64 seq)
117 return seq == FID_SEQ_SPECIAL;
120 static inline bool fid_seq_is_local_file(__u64 seq)
122 return seq == FID_SEQ_LOCAL_FILE ||
123 seq == FID_SEQ_LOCAL_NAME;
126 static inline bool fid_seq_is_root(__u64 seq)
128 return seq == FID_SEQ_ROOT;
131 static inline bool fid_seq_is_dot(__u64 seq)
133 return seq == FID_SEQ_DOT_LUSTRE;
136 static inline bool fid_seq_is_default(__u64 seq)
138 return seq == FID_SEQ_LOV_DEFAULT;
141 static inline bool fid_is_mdt0(const struct lu_fid *fid)
143 return fid_seq_is_mdt0(fid_seq(fid));
146 static inline void lu_root_fid(struct lu_fid *fid)
148 fid->f_seq = FID_SEQ_ROOT;
149 fid->f_oid = FID_OID_ROOT;
153 static inline void lu_echo_root_fid(struct lu_fid *fid)
155 fid->f_seq = FID_SEQ_ROOT;
156 fid->f_oid = FID_OID_ECHO_ROOT;
160 static inline void lu_update_log_fid(struct lu_fid *fid, __u32 index)
162 fid->f_seq = FID_SEQ_UPDATE_LOG;
167 static inline void lu_update_log_dir_fid(struct lu_fid *fid, __u32 index)
169 fid->f_seq = FID_SEQ_UPDATE_LOG_DIR;
175 * Check if a fid is igif or not.
176 * \param fid the fid to be tested.
177 * \return true if the fid is an igif; otherwise false.
179 static inline bool fid_seq_is_igif(__u64 seq)
181 return seq >= FID_SEQ_IGIF && seq <= FID_SEQ_IGIF_MAX;
184 static inline bool fid_is_igif(const struct lu_fid *fid)
186 return fid_seq_is_igif(fid_seq(fid));
190 * Check if a fid is idif or not.
191 * \param fid the fid to be tested.
192 * \return true if the fid is an idif; otherwise false.
194 static inline bool fid_seq_is_idif(__u64 seq)
196 return seq >= FID_SEQ_IDIF && seq <= FID_SEQ_IDIF_MAX;
199 static inline bool fid_is_idif(const struct lu_fid *fid)
201 return fid_seq_is_idif(fid_seq(fid));
204 static inline bool fid_is_local_file(const struct lu_fid *fid)
206 return fid_seq_is_local_file(fid_seq(fid));
209 static inline bool fid_seq_is_norm(__u64 seq)
211 return (seq >= FID_SEQ_NORMAL);
214 static inline bool fid_is_norm(const struct lu_fid *fid)
216 return fid_seq_is_norm(fid_seq(fid));
219 static inline int fid_is_layout_rbtree(const struct lu_fid *fid)
221 return fid_seq(fid) == FID_SEQ_LAYOUT_RBTREE;
224 static inline bool fid_seq_is_update_log(__u64 seq)
226 return seq == FID_SEQ_UPDATE_LOG;
229 static inline bool fid_is_update_log(const struct lu_fid *fid)
231 return fid_seq_is_update_log(fid_seq(fid));
234 static inline bool fid_seq_is_update_log_dir(__u64 seq)
236 return seq == FID_SEQ_UPDATE_LOG_DIR;
239 static inline bool fid_is_update_log_dir(const struct lu_fid *fid)
241 return fid_seq_is_update_log_dir(fid_seq(fid));
244 /* convert an OST objid into an IDIF FID SEQ number */
245 static inline __u64 fid_idif_seq(__u64 id, __u32 ost_idx)
247 return FID_SEQ_IDIF | (ost_idx << 16) | ((id >> 32) & 0xffff);
250 /* convert a packed IDIF FID into an OST objid */
251 static inline __u64 fid_idif_id(__u64 seq, __u32 oid, __u32 ver)
253 return ((__u64)ver << 48) | ((seq & 0xffff) << 32) | oid;
256 static inline __u32 idif_ost_idx(__u64 seq)
258 return (seq >> 16) & 0xffff;
261 /* extract ost index from IDIF FID */
262 static inline __u32 fid_idif_ost_idx(const struct lu_fid *fid)
264 return idif_ost_idx(fid_seq(fid));
267 /* Check whether the fid is for LAST_ID */
268 static inline bool fid_is_last_id(const struct lu_fid *fid)
270 if (fid_oid(fid) != 0)
273 if (fid_is_idif(fid) && ((fid_seq(fid) & 0xFFFF) != 0))
276 if (fid_seq(fid) == FID_SEQ_UPDATE_LOG ||
277 fid_seq(fid) == FID_SEQ_UPDATE_LOG_DIR ||
278 fid_seq_is_igif(fid_seq(fid)))
285 * Get inode number from an igif.
286 * \param fid an igif to get inode number from.
287 * \return inode number for the igif.
289 static inline ino_t lu_igif_ino(const struct lu_fid *fid)
295 * Get inode generation from an igif.
296 * \param fid an igif to get inode generation from.
297 * \return inode generation for the igif.
299 static inline __u32 lu_igif_gen(const struct lu_fid *fid)
305 * Build igif from the inode number/generation.
307 static inline void lu_igif_build(struct lu_fid *fid, __u32 ino, __u32 gen)
315 * Fids are transmitted across network (in the sender byte-ordering),
316 * and stored on disk in big-endian order.
318 static inline void fid_cpu_to_le(struct lu_fid *dst, const struct lu_fid *src)
320 dst->f_seq = __cpu_to_le64(fid_seq(src));
321 dst->f_oid = __cpu_to_le32(fid_oid(src));
322 dst->f_ver = __cpu_to_le32(fid_ver(src));
325 static inline void fid_le_to_cpu(struct lu_fid *dst, const struct lu_fid *src)
327 dst->f_seq = __le64_to_cpu(fid_seq(src));
328 dst->f_oid = __le32_to_cpu(fid_oid(src));
329 dst->f_ver = __le32_to_cpu(fid_ver(src));
332 static inline void fid_cpu_to_be(struct lu_fid *dst, const struct lu_fid *src)
334 dst->f_seq = __cpu_to_be64(fid_seq(src));
335 dst->f_oid = __cpu_to_be32(fid_oid(src));
336 dst->f_ver = __cpu_to_be32(fid_ver(src));
339 static inline void fid_be_to_cpu(struct lu_fid *dst, const struct lu_fid *src)
341 dst->f_seq = __be64_to_cpu(fid_seq(src));
342 dst->f_oid = __be32_to_cpu(fid_oid(src));
343 dst->f_ver = __be32_to_cpu(fid_ver(src));
346 static inline bool fid_is_sane(const struct lu_fid *fid)
348 return fid && ((fid_seq(fid) >= FID_SEQ_START && !fid_ver(fid)) ||
349 fid_is_igif(fid) || fid_is_idif(fid) ||
350 fid_seq_is_rsvd(fid_seq(fid)));
353 static inline bool lu_fid_eq(const struct lu_fid *f0, const struct lu_fid *f1)
355 return !memcmp(f0, f1, sizeof(*f0));
358 static inline int lu_fid_cmp(const struct lu_fid *f0,
359 const struct lu_fid *f1)
361 if (fid_seq(f0) != fid_seq(f1))
362 return fid_seq(f0) > fid_seq(f1) ? 1 : -1;
364 if (fid_oid(f0) != fid_oid(f1))
365 return fid_oid(f0) > fid_oid(f1) ? 1 : -1;
367 if (fid_ver(f0) != fid_ver(f1))
368 return fid_ver(f0) > fid_ver(f1) ? 1 : -1;