Whamcloud - gitweb
LU-10810 ptlrpc: introduce OST_SEEK RPC
[fs/lustre-release.git] / lustre / include / uapi / linux / lustre / lustre_fid.h
1 /*
2  * GPL HEADER START
3  *
4  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5  *
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.
9  *
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).
15  *
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
19  *
20  * GPL HEADER END
21  */
22 /*
23  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
24  * Use is subject to license terms.
25  *
26  * Copyright (c) 2011, 2017, Intel Corporation.
27  *
28  * Copyright 2016 Cray Inc, all rights reserved.
29  * Author: Ben Evans.
30  *
31  * all fid manipulation functions go here
32  *
33  * FIDS are globally unique within a Lustre filessytem, and are made up
34  * of three parts: sequence, Object ID, and version.
35  *
36  */
37 #ifndef _UAPI_LUSTRE_FID_H_
38 #define _UAPI_LUSTRE_FID_H_
39
40 #include <linux/types.h>
41 #include <linux/lustre/lustre_idl.h>
42
43 /** returns fid object sequence */
44 static inline __u64 fid_seq(const struct lu_fid *fid)
45 {
46         return fid->f_seq;
47 }
48
49 /** returns fid object id */
50 static inline __u32 fid_oid(const struct lu_fid *fid)
51 {
52         return fid->f_oid;
53 }
54
55 /** returns fid object version */
56 static inline __u32 fid_ver(const struct lu_fid *fid)
57 {
58         return fid->f_ver;
59 }
60
61 static inline void fid_zero(struct lu_fid *fid)
62 {
63         memset(fid, 0, sizeof(*fid));
64 }
65
66 static inline __u64 fid_ver_oid(const struct lu_fid *fid)
67 {
68         return (__u64)fid_ver(fid) << 32 | fid_oid(fid);
69 }
70
71 static inline bool fid_seq_is_mdt0(__u64 seq)
72 {
73         return seq == FID_SEQ_OST_MDT0;
74 }
75
76 static inline bool fid_seq_is_mdt(__u64 seq)
77 {
78         return seq == FID_SEQ_OST_MDT0 || seq >= FID_SEQ_NORMAL;
79 };
80
81 static inline bool fid_seq_is_echo(__u64 seq)
82 {
83         return seq == FID_SEQ_ECHO;
84 }
85
86 static inline bool fid_is_echo(const struct lu_fid *fid)
87 {
88         return fid_seq_is_echo(fid_seq(fid));
89 }
90
91 static inline bool fid_seq_is_llog(__u64 seq)
92 {
93         return seq == FID_SEQ_LLOG;
94 }
95
96 static inline bool fid_is_llog(const struct lu_fid *fid)
97 {
98         /* file with OID == 0 is not llog but contains last oid */
99         return fid_seq_is_llog(fid_seq(fid)) && fid_oid(fid) > 0;
100 }
101
102 static inline bool fid_seq_is_rsvd(__u64 seq)
103 {
104         return seq > FID_SEQ_OST_MDT0 && seq <= FID_SEQ_RSVD;
105 };
106
107 static inline bool fid_seq_is_special(__u64 seq)
108 {
109         return seq == FID_SEQ_SPECIAL;
110 };
111
112 static inline bool fid_seq_is_local_file(__u64 seq)
113 {
114         return seq == FID_SEQ_LOCAL_FILE ||
115                seq == FID_SEQ_LOCAL_NAME;
116 };
117
118 static inline bool fid_seq_is_root(__u64 seq)
119 {
120         return seq == FID_SEQ_ROOT;
121 }
122
123 static inline bool fid_seq_is_dot(__u64 seq)
124 {
125         return seq == FID_SEQ_DOT_LUSTRE;
126 }
127
128 static inline bool fid_seq_is_default(__u64 seq)
129 {
130         return seq == FID_SEQ_LOV_DEFAULT;
131 }
132
133 static inline bool fid_is_mdt0(const struct lu_fid *fid)
134 {
135         return fid_seq_is_mdt0(fid_seq(fid));
136 }
137
138 static inline void lu_root_fid(struct lu_fid *fid)
139 {
140         fid->f_seq = FID_SEQ_ROOT;
141         fid->f_oid = FID_OID_ROOT;
142         fid->f_ver = 0;
143 }
144
145 static inline void lu_echo_root_fid(struct lu_fid *fid)
146 {
147         fid->f_seq = FID_SEQ_ROOT;
148         fid->f_oid = FID_OID_ECHO_ROOT;
149         fid->f_ver = 0;
150 }
151
152 static inline void lu_update_log_fid(struct lu_fid *fid, __u32 index)
153 {
154         fid->f_seq = FID_SEQ_UPDATE_LOG;
155         fid->f_oid = index;
156         fid->f_ver = 0;
157 }
158
159 static inline void lu_update_log_dir_fid(struct lu_fid *fid, __u32 index)
160 {
161         fid->f_seq = FID_SEQ_UPDATE_LOG_DIR;
162         fid->f_oid = index;
163         fid->f_ver = 0;
164 }
165
166 /**
167  * Check if a fid is igif or not.
168  * \param fid the fid to be tested.
169  * \return true if the fid is an igif; otherwise false.
170  */
171 static inline bool fid_seq_is_igif(__u64 seq)
172 {
173         return seq >= FID_SEQ_IGIF && seq <= FID_SEQ_IGIF_MAX;
174 }
175
176 static inline bool fid_is_igif(const struct lu_fid *fid)
177 {
178         return fid_seq_is_igif(fid_seq(fid));
179 }
180
181 /**
182  * Check if a fid is idif or not.
183  * \param fid the fid to be tested.
184  * \return true if the fid is an idif; otherwise false.
185  */
186 static inline bool fid_seq_is_idif(__u64 seq)
187 {
188         return seq >= FID_SEQ_IDIF && seq <= FID_SEQ_IDIF_MAX;
189 }
190
191 static inline bool fid_is_idif(const struct lu_fid *fid)
192 {
193         return fid_seq_is_idif(fid_seq(fid));
194 }
195
196 static inline bool fid_is_local_file(const struct lu_fid *fid)
197 {
198         return fid_seq_is_local_file(fid_seq(fid));
199 }
200
201 static inline bool fid_seq_is_norm(__u64 seq)
202 {
203         return (seq >= FID_SEQ_NORMAL);
204 }
205
206 static inline bool fid_is_norm(const struct lu_fid *fid)
207 {
208         return fid_seq_is_norm(fid_seq(fid));
209 }
210
211 static inline int fid_is_layout_rbtree(const struct lu_fid *fid)
212 {
213         return fid_seq(fid) == FID_SEQ_LAYOUT_RBTREE;
214 }
215
216 static inline bool fid_seq_is_update_log(__u64 seq)
217 {
218         return seq == FID_SEQ_UPDATE_LOG;
219 }
220
221 static inline bool fid_is_update_log(const struct lu_fid *fid)
222 {
223         return fid_seq_is_update_log(fid_seq(fid));
224 }
225
226 static inline bool fid_seq_is_update_log_dir(__u64 seq)
227 {
228         return seq == FID_SEQ_UPDATE_LOG_DIR;
229 }
230
231 static inline bool fid_is_update_log_dir(const struct lu_fid *fid)
232 {
233         return fid_seq_is_update_log_dir(fid_seq(fid));
234 }
235
236 /* convert an OST objid into an IDIF FID SEQ number */
237 static inline __u64 fid_idif_seq(__u64 id, __u32 ost_idx)
238 {
239         return FID_SEQ_IDIF | (ost_idx << 16) | ((id >> 32) & 0xffff);
240 }
241
242 /* convert a packed IDIF FID into an OST objid */
243 static inline __u64 fid_idif_id(__u64 seq, __u32 oid, __u32 ver)
244 {
245         return ((__u64)ver << 48) | ((seq & 0xffff) << 32) | oid;
246 }
247
248 static inline __u32 idif_ost_idx(__u64 seq)
249 {
250         return (seq >> 16) & 0xffff;
251 }
252
253 /* extract ost index from IDIF FID */
254 static inline __u32 fid_idif_ost_idx(const struct lu_fid *fid)
255 {
256         return idif_ost_idx(fid_seq(fid));
257 }
258
259 /* Check whether the fid is for LAST_ID */
260 static inline bool fid_is_last_id(const struct lu_fid *fid)
261 {
262         if (fid_oid(fid) != 0)
263                 return false;
264
265         if (fid_is_idif(fid) && ((fid_seq(fid) & 0xFFFF) != 0))
266                 return false;
267
268         if (fid_seq(fid) == FID_SEQ_UPDATE_LOG ||
269             fid_seq(fid) == FID_SEQ_UPDATE_LOG_DIR ||
270             fid_seq_is_igif(fid_seq(fid)))
271                 return false;
272
273         return true;
274 }
275
276 /**
277  * Get inode number from an igif.
278  * \param fid an igif to get inode number from.
279  * \return inode number for the igif.
280  */
281 static inline __kernel_ino_t lu_igif_ino(const struct lu_fid *fid)
282 {
283         return fid_seq(fid);
284 }
285
286 /**
287  * Get inode generation from an igif.
288  * \param fid an igif to get inode generation from.
289  * \return inode generation for the igif.
290  */
291 static inline __u32 lu_igif_gen(const struct lu_fid *fid)
292 {
293         return fid_oid(fid);
294 }
295
296 /**
297  * Build igif from the inode number/generation.
298  */
299 static inline void lu_igif_build(struct lu_fid *fid, __u32 ino, __u32 gen)
300 {
301         fid->f_seq = ino;
302         fid->f_oid = gen;
303         fid->f_ver = 0;
304 }
305
306 /*
307  * Fids are transmitted across network (in the sender byte-ordering),
308  * and stored on disk in big-endian order.
309  */
310 static inline void fid_cpu_to_le(struct lu_fid *dst, const struct lu_fid *src)
311 {
312         dst->f_seq = __cpu_to_le64(fid_seq(src));
313         dst->f_oid = __cpu_to_le32(fid_oid(src));
314         dst->f_ver = __cpu_to_le32(fid_ver(src));
315 }
316
317 static inline void fid_le_to_cpu(struct lu_fid *dst, const struct lu_fid *src)
318 {
319         dst->f_seq = __le64_to_cpu(fid_seq(src));
320         dst->f_oid = __le32_to_cpu(fid_oid(src));
321         dst->f_ver = __le32_to_cpu(fid_ver(src));
322 }
323
324 static inline void fid_cpu_to_be(struct lu_fid *dst, const struct lu_fid *src)
325 {
326         dst->f_seq = __cpu_to_be64(fid_seq(src));
327         dst->f_oid = __cpu_to_be32(fid_oid(src));
328         dst->f_ver = __cpu_to_be32(fid_ver(src));
329 }
330
331 static inline void fid_be_to_cpu(struct lu_fid *dst, const struct lu_fid *src)
332 {
333         dst->f_seq = __be64_to_cpu(fid_seq(src));
334         dst->f_oid = __be32_to_cpu(fid_oid(src));
335         dst->f_ver = __be32_to_cpu(fid_ver(src));
336 }
337
338 static inline bool fid_is_sane(const struct lu_fid *fid)
339 {
340         return fid && ((fid_seq(fid) >= FID_SEQ_START && !fid_ver(fid)) ||
341                         fid_is_igif(fid) || fid_is_idif(fid) ||
342                         fid_seq_is_rsvd(fid_seq(fid)));
343 }
344
345 static inline bool lu_fid_eq(const struct lu_fid *f0, const struct lu_fid *f1)
346 {
347         return !memcmp(f0, f1, sizeof(*f0));
348 }
349
350 static inline int lu_fid_cmp(const struct lu_fid *f0,
351                              const struct lu_fid *f1)
352 {
353         if (fid_seq(f0) != fid_seq(f1))
354                 return fid_seq(f0) > fid_seq(f1) ? 1 : -1;
355
356         if (fid_oid(f0) != fid_oid(f1))
357                 return fid_oid(f0) > fid_oid(f1) ? 1 : -1;
358
359         if (fid_ver(f0) != fid_ver(f1))
360                 return fid_ver(f0) > fid_ver(f1) ? 1 : -1;
361
362         return 0;
363 }
364 #endif