Whamcloud - gitweb
branch: b_new_cmd
[fs/lustre-release.git] / lustre / mdd / mdd_internal.h
1 /* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
2  * vim:expandtab:shiftwidth=8:tabstop=8:
3  *  mdd/mdd_internel.c
4  *
5  *  Copyright (C) 2006 Cluster File Systems, Inc.
6  *   Author: Wang Di <wangdi@clusterfs.com>
7  *
8  *   This file is part of the Lustre file system, http://www.lustre.org
9  *   Lustre is a trademark of Cluster File Systems, Inc.
10  *
11  *   You may have signed or agreed to another license before downloading
12  *   this software.  If so, you are bound by the terms and conditions
13  *   of that agreement, and the following does not apply to you.  See the
14  *   LICENSE file included with this distribution for more information.
15  *
16  *   If you did not agree to a different license, then this copy of Lustre
17  *   is open source software; you can redistribute it and/or modify it
18  *   under the terms of version 2 of the GNU General Public License as
19  *   published by the Free Software Foundation.
20  *
21  *   In either case, Lustre is distributed in the hope that it will be
22  *   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
23  *   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
24  *   license text for more details.
25  */
26
27 #ifndef _MDD_INTERNAL_H
28 #define _MDD_INTERNAL_H
29
30 #include <asm/semaphore.h>
31
32 #include <linux/lustre_acl.h>
33 #include <obd.h>
34 #include <md_object.h>
35 #include <dt_object.h>
36 #include <linux/sched.h>
37 #include <linux/capability.h>
38 #include <linux/dynlocks.h>
39
40 enum mdd_txn_op {
41         MDD_TXN_OBJECT_DESTROY_OP = 0,
42         MDD_TXN_OBJECT_CREATE_OP,
43         MDD_TXN_ATTR_SET_OP,
44         MDD_TXN_XATTR_SET_OP,
45         MDD_TXN_INDEX_INSERT_OP,
46         MDD_TXN_INDEX_DELETE_OP,
47         MDD_TXN_LINK_OP,
48         MDD_TXN_UNLINK_OP,
49         MDD_TXN_RENAME_OP,
50         MDD_TXN_RENAME_TGT_OP,
51         MDD_TXN_CREATE_DATA_OP,
52         MDD_TXN_MKDIR_OP,
53         MDD_TXN_LAST_OP
54 };
55
56 struct mdd_txn_op_descr {
57         enum mdd_txn_op mod_op;
58         unsigned int    mod_credits;
59 };
60
61 struct mdd_device {
62         struct md_device                 mdd_md_dev;
63         struct dt_device                *mdd_child;
64         struct obd_device               *mdd_obd_dev;
65         struct lu_fid                    mdd_root_fid;
66         struct dt_device_param           mdd_dt_conf;
67         struct dt_object                *mdd_orphans;
68         struct dt_txn_callback           mdd_txn_cb;
69         cfs_proc_dir_entry_t            *mdd_proc_entry;
70         struct lprocfs_stats            *mdd_stats;
71         struct mdd_txn_op_descr          mdd_tod[MDD_TXN_LAST_OP];
72 };
73
74 enum mod_flags {
75         /* The dir object has been unlinked */
76         DEAD_OBJ   = 1 << 0,
77         APPEND_OBJ = 1 << 1,
78         IMMUTE_OBJ = 1 << 2,
79         ORPHAN_OBJ = 1 << 3
80 };
81
82 #define LUSTRE_APPEND_FL LDISKFS_APPEND_FL
83 #define LUSTRE_IMMUTABLE_FL LDISKFS_IMMUTABLE_FL
84
85 struct mdd_object {
86         struct md_object  mod_obj;
87         /* open count */
88         __u32             mod_count;
89         __u32             mod_valid;
90         unsigned long     mod_flags;
91         struct dynlock    mod_pdlock;
92 };
93
94 struct orph_key {
95         /* fid of the object*/
96         struct lu_fid ok_fid;
97         /* type of operation: unlink, truncate */
98         __u32         ok_op;
99 };
100
101 struct mdd_thread_info {
102         struct txn_param      mti_param;
103         struct lu_fid         mti_fid;
104         struct lu_attr        mti_la;
105         struct md_attr        mti_ma;
106         struct lu_attr        mti_la_for_fix;
107         struct lov_mds_md     mti_lmm;
108         struct obd_info       mti_oi;
109         struct orph_key       mti_orph_key;
110         struct obd_trans_info mti_oti;
111         struct lu_buf         mti_buf;
112         struct obdo           mti_oa;
113         char                  mti_xattr_buf[LUSTRE_POSIX_ACL_MAX_SIZE];
114         struct lu_fid         mti_fid2; /* used for be & cpu converting */
115 };
116
117 int mdd_init_obd(const struct lu_env *env, struct mdd_device *mdd,
118                  struct lustre_cfg *cfg);
119 int mdd_fini_obd(const struct lu_env *, struct mdd_device *);
120 int mdd_xattr_set_txn(const struct lu_env *env, struct mdd_object *obj,
121                       const struct lu_buf *buf, const char *name, int fl,
122                       struct thandle *txn);
123 int mdd_lov_set_md(const struct lu_env *env, struct mdd_object *pobj,
124                    struct mdd_object *child, struct lov_mds_md *lmm,
125                    int lmm_size, struct thandle *handle, int set_stripe);
126 int mdd_lov_create(const struct lu_env *env, struct mdd_device *mdd,
127                    struct mdd_object *parent, struct mdd_object *child,
128                    struct lov_mds_md **lmm, int *lmm_size,
129                    const struct md_create_spec *spec, struct lu_attr *la);
130 void mdd_lov_create_finish(const struct lu_env *env,
131                            struct mdd_device *mdd, int rc);
132 int mdd_get_md(const struct lu_env *env, struct mdd_object *obj,
133                void *md, int *md_size, const char *name);
134 int mdd_get_md_locked(const struct lu_env *env, struct mdd_object *obj,
135                       void *md, int *md_size, const char *name);
136 int mdd_la_get(const struct lu_env *env, struct mdd_object *obj,
137                struct lu_attr *la, struct lustre_capa *capa);
138 int mdd_attr_set_internal(const struct lu_env *env, struct mdd_object *o,
139                           const struct lu_attr *attr, struct thandle *handle,
140                           const int needacl);
141 int mdd_object_kill(const struct lu_env *env, struct mdd_object *obj,
142                     struct md_attr *ma);
143 int mdd_iattr_get(const struct lu_env *env, struct mdd_object *mdd_obj,
144                   struct md_attr *ma);
145 int mdd_attr_get_internal_locked(const struct lu_env *env,
146                                  struct mdd_object *mdd_obj,
147                                  struct md_attr *ma);
148 int mdd_object_create_internal(const struct lu_env *env,
149                                struct mdd_object *obj, struct md_attr *ma,
150                                struct thandle *handle);
151 int mdd_attr_set_internal_locked(const struct lu_env *env,
152                                  struct mdd_object *o,
153                                  const struct lu_attr *attr,
154                                  struct thandle *handle, const int needacl);
155 int mdd_lmm_get_locked(const struct lu_env *env, struct mdd_object *mdd_obj,
156                        struct md_attr *ma);
157 /* mdd_lock.c */
158 void mdd_write_lock(const struct lu_env *env, struct mdd_object *obj);
159 void mdd_read_lock(const struct lu_env *env, struct mdd_object *obj);
160 void mdd_write_unlock(const struct lu_env *env, struct mdd_object *obj);
161 void mdd_read_unlock(const struct lu_env *env, struct mdd_object *obj);
162
163 void mdd_pdlock_init(struct mdd_object *obj);
164 unsigned long mdd_name2hash(const char *name);
165 struct dynlock_handle *mdd_pdo_write_lock(const struct lu_env *env,
166                                           struct mdd_object *obj,
167                                           const char *name);
168 struct dynlock_handle *mdd_pdo_read_lock(const struct lu_env *env,
169                                          struct mdd_object *obj,
170                                          const char *name);
171 void mdd_pdo_write_unlock(const struct lu_env *env, struct mdd_object *obj,
172                           struct dynlock_handle *dlh);
173 void mdd_pdo_read_unlock(const struct lu_env *env, struct mdd_object *obj,
174                          struct dynlock_handle *dlh);
175 /* mdd_dir.c */
176 int mdd_unlink_sanity_check(const struct lu_env *env, struct mdd_object *pobj,
177                             struct mdd_object *cobj, struct md_attr *ma);
178 int mdd_finish_unlink(const struct lu_env *env, struct mdd_object *obj,
179                       struct md_attr *ma, struct thandle *th);
180 int mdd_object_initialize(const struct lu_env *env, const struct lu_fid *pfid,
181                           struct mdd_object *child, struct md_attr *ma,
182                           struct thandle *handle);
183 int mdd_link_sanity_check(const struct lu_env *env, struct mdd_object *tgt_obj,
184                           struct mdd_object *src_obj);
185 void mdd_ref_add_internal(const struct lu_env *env, struct mdd_object *obj,
186                           struct thandle *handle);
187 void mdd_ref_del_internal(const struct lu_env *env, struct mdd_object *obj,
188                           struct thandle *handle);
189 /* mdd_lov.c */
190 int mdd_unlink_log(const struct lu_env *env, struct mdd_device *mdd,
191                    struct mdd_object *mdd_cobj, struct md_attr *ma);
192
193 int mdd_get_cookie_size(const struct lu_env *env, struct mdd_device *mdd,
194                         struct lov_mds_md *lmm);
195
196 int mdd_lov_setattr_async(const struct lu_env *env, struct mdd_object *obj,
197                           struct lov_mds_md *lmm, int lmm_size);
198
199 struct mdd_thread_info *mdd_env_info(const struct lu_env *env);
200
201 struct lu_buf *mdd_buf_get(const struct lu_env *env, void *area, ssize_t len);
202 const struct lu_buf *mdd_buf_get_const(const struct lu_env *env,
203                                        const void *area, ssize_t len);
204
205 int __mdd_orphan_cleanup(const struct lu_env *env, struct mdd_device *d);
206 int __mdd_orphan_add(const struct lu_env *, struct mdd_object *,
207                      struct thandle *);
208 int __mdd_orphan_del(const struct lu_env *, struct mdd_object *,
209                      struct thandle *);
210 int orph_index_init(const struct lu_env *env, struct mdd_device *mdd);
211 void orph_index_fini(const struct lu_env *env, struct mdd_device *mdd);
212 int mdd_txn_init_credits(const struct lu_env *env, struct mdd_device *mdd);
213
214 int mdd_procfs_init(struct mdd_device *mdd, const char *name);
215 int mdd_procfs_fini(struct mdd_device *mdd);
216 void mdd_lproc_time_start(struct mdd_device *mdd, struct timeval *start,
217                           int op);
218 void mdd_lproc_time_end(struct mdd_device *mdd, struct timeval *start, int op);
219
220 int mdd_get_flags(const struct lu_env *env, struct mdd_object *obj);
221
222 extern struct md_dir_operations    mdd_dir_ops;
223 extern struct md_object_operations mdd_obj_ops;
224
225 /* mdd_trans.c */
226 void mdd_txn_param_build(const struct lu_env *env, struct mdd_device *mdd,
227                          enum mdd_txn_op);
228 int mdd_log_txn_param_build(const struct lu_env *env, struct md_object *obj,
229                             struct md_attr *ma, enum mdd_txn_op);
230
231 static inline void mdd_object_put(const struct lu_env *env,
232                                   struct mdd_object *o)
233 {
234         lu_object_put(env, &o->mod_obj.mo_lu);
235 }
236
237 struct thandle* mdd_trans_start(const struct lu_env *env,
238                                        struct mdd_device *);
239
240 void mdd_trans_stop(const struct lu_env *env, struct mdd_device *mdd,
241                     int rc, struct thandle *handle);
242
243 int mdd_txn_start_cb(const struct lu_env *env, struct txn_param *param,
244                      void *cookie);
245
246 int mdd_txn_stop_cb(const struct lu_env *env, struct thandle *txn,
247                     void *cookie);
248
249 int mdd_txn_commit_cb(const struct lu_env *env, struct thandle *txn,
250                       void *cookie);
251 /* mdd_device.c */
252 struct lu_object *mdd_object_alloc(const struct lu_env *env,
253                                    const struct lu_object_header *hdr,
254                                    struct lu_device *d);
255
256 /* mdd_object.c */
257 extern struct lu_context_key mdd_thread_key;
258 extern struct lu_device_operations mdd_lu_ops;
259
260 struct mdd_object *mdd_object_find(const struct lu_env *env,
261                                    struct mdd_device *d,
262                                    const struct lu_fid *f);
263 /* mdd_permission.c */
264 #define mdd_cap_t(x) (x)
265
266 #define MDD_CAP_TO_MASK(x) (1 << (x))
267
268 #define mdd_cap_raised(c, flag) (mdd_cap_t(c) & MDD_CAP_TO_MASK(flag))
269
270 /* capable() is copied from linux kernel! */
271 static inline int mdd_capable(struct md_ucred *uc, int cap)
272 {
273         if (mdd_cap_raised(uc->mu_cap, cap))
274                 return 1;
275         return 0;
276 }
277
278 int mdd_in_group_p(struct md_ucred *uc, gid_t grp);
279 int mdd_acl_def_get(const struct lu_env *env, struct mdd_object *mdd_obj,
280                     struct md_attr *ma);
281 int mdd_acl_chmod(const struct lu_env *env, struct mdd_object *o, __u32 mode,
282                   struct thandle *handle);
283 int __mdd_acl_init(const struct lu_env *env, struct mdd_object *obj,
284                    struct lu_buf *buf, __u32 *mode, struct thandle *handle);
285 int mdd_acl_init(const struct lu_env *env, struct mdd_object *pobj,
286                  struct mdd_object *cobj, __u32 *mode, struct thandle *handle);
287 int __mdd_permission_internal(const struct lu_env *env, struct mdd_object *obj,
288                               int mask, int getattr);
289 int mdd_permission_internal(const struct lu_env *env, struct mdd_object *obj,
290                             int mask);
291 int mdd_permission_internal_locked(const struct lu_env *env,
292                                    struct mdd_object *obj, int mask);
293
294 int mdd_permission(const struct lu_env *env, struct md_object *obj, int mask);
295 int mdd_capa_get(const struct lu_env *env, struct md_object *obj,
296                  struct lustre_capa *capa, int renewal);
297
298 static inline int lu_device_is_mdd(struct lu_device *d)
299 {
300         return ergo(d != NULL && d->ld_ops != NULL, d->ld_ops == &mdd_lu_ops);
301 }
302
303 static inline struct mdd_device* lu2mdd_dev(struct lu_device *d)
304 {
305         LASSERT(lu_device_is_mdd(d));
306         return container_of0(d, struct mdd_device, mdd_md_dev.md_lu_dev);
307 }
308
309 static inline struct lu_device *mdd2lu_dev(struct mdd_device *d)
310 {
311         return (&d->mdd_md_dev.md_lu_dev);
312 }
313
314 static inline struct mdd_object *lu2mdd_obj(struct lu_object *o)
315 {
316         LASSERT(ergo(o != NULL, lu_device_is_mdd(o->lo_dev)));
317         return container_of0(o, struct mdd_object, mod_obj.mo_lu);
318 }
319
320 static inline struct mdd_device* mdo2mdd(struct md_object *mdo)
321 {
322         return lu2mdd_dev(mdo->mo_lu.lo_dev);
323 }
324
325 static inline struct mdd_object* md2mdd_obj(struct md_object *mdo)
326 {
327         return container_of0(mdo, struct mdd_object, mod_obj);
328 }
329
330 static inline struct dt_device_operations *mdd_child_ops(struct mdd_device *d)
331 {
332         return d->mdd_child->dd_ops;
333 }
334
335 static inline struct lu_object *mdd2lu_obj(struct mdd_object *obj)
336 {
337         return &obj->mod_obj.mo_lu;
338 }
339
340 static inline struct dt_object* mdd_object_child(struct mdd_object *o)
341 {
342         return container_of0(lu_object_next(mdd2lu_obj(o)),
343                              struct dt_object, do_lu);
344 }
345 static inline struct obd_device *mdd2obd_dev(struct mdd_device *mdd)
346 {
347         return mdd->mdd_obd_dev;
348 }
349
350 static inline const struct lu_fid *mdo2fid(const struct mdd_object *obj)
351 {
352         return lu_object_fid(&obj->mod_obj.mo_lu);
353 }
354
355 static inline umode_t mdd_object_type(const struct mdd_object *obj)
356 {
357         return lu_object_attr(&obj->mod_obj.mo_lu);
358 }
359
360 static inline int mdd_lov_mdsize(const struct lu_env *env,
361                                  struct mdd_device *mdd)
362 {
363         struct obd_device *obd = mdd2obd_dev(mdd);
364         return obd->u.mds.mds_max_mdsize;
365 }
366
367 static inline int mdd_lov_cookiesize(const struct lu_env *env,
368                                      struct mdd_device *mdd)
369 {
370         struct obd_device *obd = mdd2obd_dev(mdd);
371         return obd->u.mds.mds_max_cookiesize;
372 }
373
374 static inline int mdd_is_immutable(struct mdd_object *obj)
375 {
376         return obj->mod_flags & IMMUTE_OBJ;
377 }
378
379 static inline int mdd_is_dead_obj(struct mdd_object *obj)
380 {
381         return obj && obj->mod_flags & DEAD_OBJ;
382 }
383
384 static inline int mdd_is_append(struct mdd_object *obj)
385 {
386         return obj->mod_flags & APPEND_OBJ;
387 }
388
389 static inline struct lustre_capa *mdd_object_capa(const struct lu_env *env,
390                                                   const struct mdd_object *obj)
391 {
392         struct md_capainfo *ci = md_capainfo(env);
393         const struct lu_fid *fid = mdo2fid(obj);
394         int i;
395
396         /* NB: in mdt_init0 */
397         if (!ci)
398                 return BYPASS_CAPA;
399         for (i = 0; i < 4; i++)
400                 if (ci->mc_fid[i] && lu_fid_eq(ci->mc_fid[i], fid))
401                         return ci->mc_capa[i];
402         return NULL;
403 }
404
405 enum {
406         LPROC_MDD_OPEN = 0,
407         LPROC_MDD_CREATE,
408         LPROC_MDD_INDEX_INSERT,
409         LPROC_MDD_INDEX_DELETE,
410         LPROC_MDD_SET_MD,
411         LPROC_MDD_GET_MD,
412         LPROC_MDD_UNLINK,
413         LPROC_MDD_UNLINK_LOG,
414         LPROC_MDD_LOV_CREATE,
415         LPROC_MDD_LOOKUP,
416         LPROC_MDD_LAST
417 };
418 #endif