Whamcloud - gitweb
branch: HEAD
[fs/lustre-release.git] / lustre / mdt / mdt_internal.h
1 /* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
2  * vim:expandtab:shiftwidth=8:tabstop=8:
3  *
4  *  lustre/mdt/mdt_internal.h
5  *  Lustre Metadata Target (mdt) request handler
6  *
7  *  Copyright (c) 2006 Cluster File Systems, Inc.
8  *   Author: Peter Braam <braam@clusterfs.com>
9  *   Author: Andreas Dilger <adilger@clusterfs.com>
10  *   Author: Phil Schwan <phil@clusterfs.com>
11  *   Author: Mike Shaver <shaver@clusterfs.com>
12  *   Author: Nikita Danilov <nikita@clusterfs.com>
13  *   Author: Huang Hua <huanghua@clusterfs.com>
14  *
15  *   This file is part of the Lustre file system, http://www.lustre.org
16  *   Lustre is a trademark of Cluster File Systems, Inc.
17  *
18  *   You may have signed or agreed to another license before downloading
19  *   this software.  If so, you are bound by the terms and conditions
20  *   of that agreement, and the following does not apply to you.  See the
21  *   LICENSE file included with this distribution for more information.
22  *
23  *   If you did not agree to a different license, then this copy of Lustre
24  *   is open source software; you can redistribute it and/or modify it
25  *   under the terms of version 2 of the GNU General Public License as
26  *   published by the Free Software Foundation.
27  *
28  *   In either case, Lustre is distributed in the hope that it will be
29  *   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
30  *   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
31  *   license text for more details.
32  */
33
34 #ifndef _MDT_INTERNAL_H
35 #define _MDT_INTERNAL_H
36
37 #if defined(__KERNEL__)
38
39 /*
40  * struct ptlrpc_client
41  */
42 #include <lustre_net.h>
43 #include <obd.h>
44 /*
45  * struct obd_connect_data
46  * struct lustre_handle
47  */
48 #include <lustre/lustre_idl.h>
49 #include <md_object.h>
50 #include <dt_object.h>
51 #include <lustre_fid.h>
52 #include <lustre_fld.h>
53 #include <lustre_req_layout.h>
54 /* LR_CLIENT_SIZE, etc. */
55 #include <lustre_disk.h>
56 #include <lustre_sec.h>
57 #include <lvfs.h>
58 #include <lustre_idmap.h>
59 #include <lustre_eacl.h>
60
61 static inline __u64 lcd_last_transno(struct lsd_client_data *lcd)
62 {
63         return max(lcd->lcd_last_transno, lcd->lcd_last_close_transno);
64 }
65
66 static inline __u64 lcd_last_xid(struct lsd_client_data *lcd)
67 {
68         return max(lcd->lcd_last_xid, lcd->lcd_last_close_xid);
69 }
70
71 /* check if request's xid is equal to last one or not*/
72 static inline int req_xid_is_last(struct ptlrpc_request *req)
73 {
74         struct lsd_client_data *lcd = req->rq_export->exp_mdt_data.med_lcd;
75         return (req->rq_xid == lcd->lcd_last_xid ||
76                 req->rq_xid == lcd->lcd_last_close_xid);
77 }
78
79 struct mdt_object;
80 /* file data for open files on MDS */
81 struct mdt_file_data {
82         struct portals_handle mfd_handle; /* must be first */
83         struct list_head      mfd_list;   /* protected by med_open_lock */
84         __u64                 mfd_xid;    /* xid of the open request */
85         struct lustre_handle  mfd_old_handle; /* old handle in replay case */
86         int                   mfd_mode;   /* open mode provided by client */
87         struct mdt_object    *mfd_object; /* point to opened object */
88 };
89
90 struct mdt_device {
91         /* super-class */
92         struct md_device           mdt_md_dev;
93         struct ptlrpc_service     *mdt_regular_service;
94         struct ptlrpc_service     *mdt_readpage_service;
95         struct ptlrpc_service     *mdt_xmds_service;
96         struct ptlrpc_service     *mdt_setattr_service;
97         struct ptlrpc_service     *mdt_mdsc_service;
98         struct ptlrpc_service     *mdt_mdss_service;
99         struct ptlrpc_service     *mdt_dtss_service;
100         struct ptlrpc_service     *mdt_fld_service;
101         /* DLM name-space for meta-data locks maintained by this server */
102         struct ldlm_namespace     *mdt_namespace;
103         /* ptlrpc handle for MDS->client connections (for lock ASTs). */
104         struct ptlrpc_client      *mdt_ldlm_client;
105         /* underlying device */
106         struct md_device          *mdt_child;
107         struct dt_device          *mdt_bottom;
108         /*
109          * Options bit-fields.
110          */
111         struct {
112                 signed int         mo_user_xattr :1,
113                                    mo_acl        :1,
114                                    mo_compat_resname:1,
115                                    mo_mds_capa   :1,
116                                    mo_oss_capa   :1;
117         } mdt_opts;
118         /* mdt state flags */
119         __u32                      mdt_fl_cfglog:1,
120                                    mdt_fl_synced:1;
121         /* lock to pretect epoch and write count */
122         spinlock_t                 mdt_ioepoch_lock;
123         __u64                      mdt_ioepoch;
124
125         /* Transaction related stuff here */
126         spinlock_t                 mdt_transno_lock;
127         __u64                      mdt_last_transno;
128
129         /* transaction callbacks */
130         struct dt_txn_callback     mdt_txn_cb;
131         /* last_rcvd file */
132         struct dt_object          *mdt_last_rcvd;
133
134         /* these values should be updated from lov if necessary.
135          * or should be placed somewhere else. */
136         int                        mdt_max_mdsize;
137         int                        mdt_max_cookiesize;
138         __u64                      mdt_mount_count;
139
140         /* last_rcvd data */
141         struct lr_server_data      mdt_lsd;
142         spinlock_t                 mdt_client_bitmap_lock;
143         unsigned long              mdt_client_bitmap[(LR_MAX_CLIENTS >> 3) / sizeof(long)];
144
145         struct upcall_cache        *mdt_identity_cache;
146
147         /* sptlrpc rules */
148         rwlock_t                   mdt_sptlrpc_lock;
149         struct sptlrpc_rule_set    mdt_sptlrpc_rset;
150
151         /* capability keys */
152         unsigned long              mdt_capa_timeout;
153         __u32                      mdt_capa_alg;
154         struct dt_object          *mdt_ck_obj;
155         unsigned long              mdt_ck_timeout;
156         unsigned long              mdt_ck_expiry;
157         cfs_timer_t                mdt_ck_timer;
158         struct ptlrpc_thread       mdt_ck_thread;
159         struct lustre_capa_key     mdt_capa_keys[2];
160         unsigned int               mdt_capa_conf:1;
161
162         cfs_proc_dir_entry_t      *mdt_proc_entry;
163         struct lprocfs_stats      *mdt_stats;
164 };
165
166 #define MDT_SERVICE_WATCHDOG_FACTOR     (2000)
167 #define MDT_ROCOMPAT_SUPP       (OBD_ROCOMPAT_LOVOBJID)
168 #define MDT_INCOMPAT_SUPP       (OBD_INCOMPAT_MDT | OBD_INCOMPAT_COMMON_LR)
169
170 struct mdt_object {
171         struct lu_object_header mot_header;
172         struct md_object        mot_obj;
173         __u64                   mot_ioepoch;
174         __u64                   mot_flags;
175         int                     mot_epochcount;
176         int                     mot_writecount;
177 };
178
179 struct mdt_lock_handle {
180         /* Lock type, reg for cross-ref use or pdo lock. */
181         mdl_type_t              mlh_type;
182
183         /* Regular lock */
184         struct lustre_handle    mlh_reg_lh;
185         ldlm_mode_t             mlh_reg_mode;
186
187         /* Pdirops lock */
188         struct lustre_handle    mlh_pdo_lh;
189         ldlm_mode_t             mlh_pdo_mode;
190         unsigned int            mlh_pdo_hash;
191 };
192
193 enum {
194         MDT_LH_PARENT, /* parent lockh */
195         MDT_LH_CHILD,  /* child lockh */
196         MDT_LH_OLD,    /* old lockh for rename */
197         MDT_LH_NEW,    /* new lockh for rename */
198         MDT_LH_RMT,    /* used for return lh to caller */
199         MDT_LH_NR
200 };
201
202 enum {
203         MDT_LOCAL_LOCK,
204         MDT_CROSS_LOCK
205 };
206
207 struct mdt_reint_record {
208         mdt_reint_t             rr_opcode;
209         const struct lustre_handle *rr_handle;
210         const struct lu_fid    *rr_fid1;
211         const struct lu_fid    *rr_fid2;
212         const char             *rr_name;
213         int                     rr_namelen;
214         const char             *rr_tgt;
215         int                     rr_tgtlen;
216         const void             *rr_eadata;
217         int                     rr_eadatalen;
218         int                     rr_logcookielen;
219         const struct llog_cookie  *rr_logcookies;
220         __u32                   rr_flags;
221 };
222
223 enum mdt_reint_flag {
224         MRF_SETATTR_LOCKED = 1 << 0,
225 };
226
227 /*
228  * Common data shared by mdt-level handlers. This is allocated per-thread to
229  * reduce stack consumption.
230  */
231 struct mdt_thread_info {
232         /*
233          * XXX: Part One:
234          * The following members will be filled explicitly
235          * with specific data in mdt_thread_info_init().
236          */
237         /* TODO: move this into mdt_session_key(with LCT_SESSION), because
238          * request handling may migrate from one server thread to another.
239          */
240         struct req_capsule        *mti_pill;
241
242         /* although we have export in req, there are cases when it is not
243          * available, e.g. closing files upon export destroy */
244         struct obd_export          *mti_exp;
245         /*
246          * A couple of lock handles.
247          */
248         struct mdt_lock_handle     mti_lh[MDT_LH_NR];
249
250         struct mdt_device         *mti_mdt;
251         const struct lu_env       *mti_env;
252
253         /*
254          * Additional fail id that can be set by handler. Passed to
255          * target_send_reply().
256          */
257         int                        mti_fail_id;
258
259         /* transaction number of current request */
260         __u64                      mti_transno;
261
262
263         /*
264          * XXX: Part Two:
265          * The following members will be filled expilictly
266          * with zero in mdt_thread_info_init(). These members may be used
267          * by all requests.
268          */
269
270         /*
271          * Object attributes.
272          */
273         struct md_attr             mti_attr;
274         /*
275          * Body for "habeo corpus" operations.
276          */
277         const struct mdt_body     *mti_body;
278         /*
279          * Host object. This is released at the end of mdt_handler().
280          */
281         struct mdt_object         *mti_object;
282         /*
283          * Lock request for "habeo clavis" operations.
284          */
285         const struct ldlm_request *mti_dlm_req;
286
287         __u32                      mti_has_trans:1, /* has txn already? */
288                                    mti_no_need_trans:1,
289                                    mti_cross_ref:1;
290
291         /* opdata for mdt_reint_open(), has the same as
292          * ldlm_reply:lock_policy_res1.  mdt_update_last_rcvd() stores this
293          * value onto disk for recovery when mdt_trans_stop_cb() is called.
294          */
295         __u64                      mti_opdata;
296
297         /*
298          * XXX: Part Three:
299          * The following members will be filled expilictly
300          * with zero in mdt_reint_unpack(), because they are only used
301          * by reint requests (including mdt_reint_open()).
302          */
303
304         /*
305          * reint record. contains information for reint operations.
306          */
307         struct mdt_reint_record    mti_rr;
308
309         /*
310          * Operation specification (currently create and lookup)
311          */
312         struct md_op_spec          mti_spec;
313
314         /*
315          * XXX: Part Four:
316          * The following members will _NOT_ be initialized at all.
317          * DO NOT expect them to contain any valid value.
318          * They should be initialized explicitly by the user themselves.
319          */
320
321          /* XXX: If something is in a union, make sure they do not conflict */
322
323         struct lu_fid              mti_tmp_fid1;
324         struct lu_fid              mti_tmp_fid2;
325         ldlm_policy_data_t         mti_policy;    /* for mdt_object_lock() and
326                                                    * mdt_rename_lock() */
327         struct ldlm_res_id         mti_res_id;    /* for mdt_object_lock() and
328                                                      mdt_rename_lock()   */
329         union {
330                 struct obd_uuid    uuid[2];       /* for mdt_seq_init_cli()  */
331                 char               ns_name[48];   /* for mdt_init0()         */
332                 struct lustre_cfg_bufs bufs;      /* for mdt_stack_fini()    */
333                 struct kstatfs     ksfs;          /* for mdt_statfs()        */
334                 struct {
335                         /* for mdt_readpage()      */
336                         struct lu_rdpg     mti_rdpg;
337                         /* for mdt_sendpage()      */
338                         struct l_wait_info mti_wait_info;
339                 } rdpg;
340         } mti_u;
341
342         /* IO epoch related stuff. */
343         struct mdt_epoch          *mti_epoch;
344         __u64                      mti_replayepoch;
345
346         /* server and client data buffers */
347         struct lr_server_data      mti_lsd;
348         struct lsd_client_data     mti_lcd;
349         loff_t                     mti_off;
350         struct txn_param           mti_txn_param;
351         struct lu_buf              mti_buf;
352         struct lustre_capa_key     mti_capa_key;
353
354         /* Ops object filename */
355         struct lu_name             mti_name;
356 };
357
358 typedef void (*mdt_cb_t)(const struct mdt_device *mdt, __u64 transno,
359                          void *data, int err);
360 struct mdt_commit_cb {
361         mdt_cb_t  mdt_cb_func;
362         void     *mdt_cb_data;
363 };
364
365 /*
366  * Info allocated per-transaction.
367  */
368 #define MDT_MAX_COMMIT_CB       4
369 struct mdt_txn_info {
370         __u64                 txi_transno;
371         unsigned int          txi_cb_count;
372         struct mdt_commit_cb  txi_cb[MDT_MAX_COMMIT_CB];
373 };
374
375 extern struct lu_context_key mdt_txn_key;
376
377 static inline void mdt_trans_add_cb(const struct thandle *th,
378                                     mdt_cb_t cb_func, void *cb_data) 
379 {
380         struct mdt_txn_info *txi;
381         
382         txi = lu_context_key_get(&th->th_ctx, &mdt_txn_key);
383         LASSERT(txi->txi_cb_count < ARRAY_SIZE(txi->txi_cb));
384
385         /* add new callback */
386         txi->txi_cb[txi->txi_cb_count].mdt_cb_func = cb_func;
387         txi->txi_cb[txi->txi_cb_count].mdt_cb_data = cb_data;
388         txi->txi_cb_count++;
389 }
390
391 static inline struct md_device_operations *mdt_child_ops(struct mdt_device * m)
392 {
393         LASSERT(m->mdt_child);
394         return m->mdt_child->md_ops;
395 }
396
397 static inline struct md_object *mdt_object_child(struct mdt_object *o)
398 {
399         LASSERT(o);
400         return lu2md(lu_object_next(&o->mot_obj.mo_lu));
401 }
402
403 static inline struct ptlrpc_request *mdt_info_req(struct mdt_thread_info *info)
404 {
405          return info->mti_pill ? info->mti_pill->rc_req : NULL;
406 }
407
408 static inline __u64 mdt_conn_flags(struct mdt_thread_info *info)
409 {
410         LASSERT(info->mti_exp);
411         return info->mti_exp->exp_connect_flags;
412 }
413
414 static inline void mdt_object_get(const struct lu_env *env,
415                                   struct mdt_object *o)
416 {
417         ENTRY;
418         lu_object_get(&o->mot_obj.mo_lu);
419         EXIT;
420 }
421
422 static inline void mdt_object_put(const struct lu_env *env,
423                                   struct mdt_object *o)
424 {
425         ENTRY;
426         lu_object_put(env, &o->mot_obj.mo_lu);
427         EXIT;
428 }
429
430 static inline int mdt_object_exists(const struct mdt_object *o)
431 {
432         return lu_object_exists(&o->mot_obj.mo_lu);
433 }
434
435 static inline const struct lu_fid *mdt_object_fid(struct mdt_object *o)
436 {
437         return lu_object_fid(&o->mot_obj.mo_lu);
438 }
439
440
441 static inline void mdt_export_evict(struct obd_export *exp)
442 {
443         class_fail_export(exp);
444         class_export_put(exp);
445 }
446
447 int mdt_get_disposition(struct ldlm_reply *rep, int flag);
448 void mdt_set_disposition(struct mdt_thread_info *info,
449                         struct ldlm_reply *rep, int flag);
450 void mdt_clear_disposition(struct mdt_thread_info *info,
451                         struct ldlm_reply *rep, int flag);
452
453 void mdt_lock_pdo_init(struct mdt_lock_handle *lh,
454                        ldlm_mode_t lm, const char *name,
455                        int namelen);
456
457 void mdt_lock_reg_init(struct mdt_lock_handle *lh,
458                        ldlm_mode_t lm);
459
460 int mdt_lock_setup(struct mdt_thread_info *info,
461                    struct mdt_object *o,
462                    struct mdt_lock_handle *lh);
463
464 int mdt_object_lock(struct mdt_thread_info *,
465                     struct mdt_object *,
466                     struct mdt_lock_handle *,
467                     __u64, int);
468
469 void mdt_object_unlock(struct mdt_thread_info *,
470                        struct mdt_object *,
471                        struct mdt_lock_handle *,
472                        int decref);
473
474 struct mdt_object *mdt_object_find(const struct lu_env *,
475                                    struct mdt_device *,
476                                    const struct lu_fid *);
477 struct mdt_object *mdt_object_find_lock(struct mdt_thread_info *,
478                                         const struct lu_fid *,
479                                         struct mdt_lock_handle *,
480                                         __u64);
481 void mdt_object_unlock_put(struct mdt_thread_info *,
482                            struct mdt_object *,
483                            struct mdt_lock_handle *,
484                            int decref);
485
486 int mdt_close_unpack(struct mdt_thread_info *info);
487 int mdt_reint_unpack(struct mdt_thread_info *info, __u32 op);
488 int mdt_reint_rec(struct mdt_thread_info *, struct mdt_lock_handle *);
489 void mdt_pack_size2body(struct mdt_thread_info *info,
490                         struct mdt_object *o);
491 void mdt_pack_attr2body(struct mdt_thread_info *info, struct mdt_body *b,
492                         const struct lu_attr *attr, const struct lu_fid *fid);
493
494 int mdt_getxattr(struct mdt_thread_info *info);
495 int mdt_reint_setxattr(struct mdt_thread_info *info,
496                        struct mdt_lock_handle *lh);
497
498 void mdt_lock_handle_init(struct mdt_lock_handle *lh);
499 void mdt_lock_handle_fini(struct mdt_lock_handle *lh);
500
501 void mdt_reconstruct(struct mdt_thread_info *, struct mdt_lock_handle *);
502 void mdt_reconstruct_generic(struct mdt_thread_info *mti,
503                              struct mdt_lock_handle *lhc);
504
505 extern void target_recovery_fini(struct obd_device *obd);
506 extern void target_recovery_init(struct obd_device *obd,
507                                  svc_handler_t handler);
508 int mdt_fs_setup(const struct lu_env *, struct mdt_device *,
509                  struct obd_device *);
510 void mdt_fs_cleanup(const struct lu_env *, struct mdt_device *);
511
512 int mdt_client_del(const struct lu_env *env,
513                     struct mdt_device *mdt);
514 int mdt_client_add(const struct lu_env *env,
515                    struct mdt_device *mdt,
516                    int cl_idx);
517 int mdt_client_new(const struct lu_env *env,
518                    struct mdt_device *mdt);
519
520 int mdt_pin(struct mdt_thread_info* info);
521
522 int mdt_lock_new_child(struct mdt_thread_info *info,
523                        struct mdt_object *o,
524                        struct mdt_lock_handle *child_lockh);
525
526 void mdt_mfd_set_mode(struct mdt_file_data *mfd,
527                       int mode);
528
529 int mdt_reint_open(struct mdt_thread_info *info,
530                    struct mdt_lock_handle *lhc);
531
532 struct mdt_file_data *mdt_handle2mfd(struct mdt_thread_info *,
533                                      const struct lustre_handle *);
534 int mdt_epoch_open(struct mdt_thread_info *info, struct mdt_object *o);
535 void mdt_sizeonmds_enable(struct mdt_thread_info *info, struct mdt_object *mo);
536 int mdt_sizeonmds_enabled(struct mdt_object *mo);
537 int mdt_write_get(struct mdt_device *mdt, struct mdt_object *o);
538 int mdt_write_read(struct mdt_device *mdt, struct mdt_object *o);
539 struct mdt_file_data *mdt_mfd_new(void);
540 int mdt_mfd_close(struct mdt_thread_info *info, struct mdt_file_data *mfd);
541 void mdt_mfd_free(struct mdt_file_data *mfd);
542 int mdt_close(struct mdt_thread_info *info);
543 int mdt_attr_set(struct mdt_thread_info *info, struct mdt_object *mo,
544                  int flags);
545 int mdt_done_writing(struct mdt_thread_info *info);
546 void mdt_shrink_reply(struct mdt_thread_info *info);
547 int mdt_handle_last_unlink(struct mdt_thread_info *, struct mdt_object *,
548                            const struct md_attr *);
549 void mdt_reconstruct_open(struct mdt_thread_info *, struct mdt_lock_handle *);
550 struct thandle* mdt_trans_start(const struct lu_env *env,
551                                 struct mdt_device *mdt, int credits);
552 void mdt_trans_stop(const struct lu_env *env,
553                     struct mdt_device *mdt, struct thandle *th);
554 int mdt_record_write(const struct lu_env *env,
555                      struct dt_object *dt, const struct lu_buf *buf,
556                      loff_t *pos, struct thandle *th);
557 int mdt_record_read(const struct lu_env *env,
558                     struct dt_object *dt, struct lu_buf *buf, loff_t *pos);
559
560 struct lu_buf *mdt_buf(const struct lu_env *env, void *area, ssize_t len);
561 const struct lu_buf *mdt_buf_const(const struct lu_env *env,
562                                    const void *area, ssize_t len);
563
564 void mdt_dump_lmm(int level, const struct lov_mds_md *lmm);
565
566 int mdt_check_ucred(struct mdt_thread_info *);
567 int mdt_init_ucred(struct mdt_thread_info *, struct mdt_body *);
568 int mdt_init_ucred_reint(struct mdt_thread_info *);
569 void mdt_exit_ucred(struct mdt_thread_info *);
570
571 /* mdt_idmap.c */
572 int mdt_init_idmap(struct mdt_thread_info *);
573
574 void mdt_cleanup_idmap(struct mdt_export_data *);
575
576 int mdt_handle_idmap(struct mdt_thread_info *);
577
578 int ptlrpc_user_desc_do_idmap(struct ptlrpc_request *,
579                               struct ptlrpc_user_desc *);
580
581 void mdt_body_reverse_idmap(struct mdt_thread_info *,
582                             struct mdt_body *);
583
584 int mdt_remote_perm_reverse_idmap(struct ptlrpc_request *,
585                                   struct mdt_remote_perm *);
586
587 int mdt_fix_attr_ucred(struct mdt_thread_info *, __u32);
588
589 static inline struct mdt_device *mdt_dev(struct lu_device *d)
590 {
591 //        LASSERT(lu_device_is_mdt(d));
592         return container_of0(d, struct mdt_device, mdt_md_dev.md_lu_dev);
593 }
594
595 /* mdt/mdt_identity.c */
596 #define MDT_IDENTITY_UPCALL_PATH        "/usr/sbin/l_getidentity"
597
598 extern struct upcall_cache_ops mdt_identity_upcall_cache_ops;
599
600 struct md_identity *mdt_identity_get(struct upcall_cache *, __u32);
601
602 void mdt_identity_put(struct upcall_cache *, struct md_identity *);
603
604 void mdt_flush_identity(struct upcall_cache *, int);
605
606 __u32 mdt_identity_get_perm(struct md_identity *, __u32, lnet_nid_t);
607
608 int mdt_pack_remote_perm(struct mdt_thread_info *, struct mdt_object *, void *);
609
610 extern struct lu_context_key       mdt_thread_key;
611 /* debug issues helper starts here*/
612 static inline void mdt_fail_write(const struct lu_env *env,
613                                   struct dt_device *dd, int id)
614 {
615         if (OBD_FAIL_CHECK_ORSET(id, OBD_FAIL_ONCE)) {
616                 CERROR(LUSTRE_MDT_NAME": obd_fail_loc=%x, fail write ops\n",
617                        id);
618                 dd->dd_ops->dt_ro(env, dd);
619                 /* We set FAIL_ONCE because we never "un-fail" a device */
620         }
621 }
622
623 static inline struct mdt_export_data *mdt_req2med(struct ptlrpc_request *req)
624 {
625         return &req->rq_export->exp_mdt_data;
626 }
627
628 typedef void (*mdt_reconstruct_t)(struct mdt_thread_info *mti,
629                                   struct mdt_lock_handle *lhc);
630 static inline int mdt_check_resent(struct mdt_thread_info *info,
631                                    mdt_reconstruct_t reconstruct,
632                                    struct mdt_lock_handle *lhc)
633 {
634         struct ptlrpc_request *req = mdt_info_req(info);
635         ENTRY;
636
637         if (lustre_msg_get_flags(req->rq_reqmsg) & MSG_RESENT) {
638                 if (req_xid_is_last(req)) {
639                         reconstruct(info, lhc);
640                         RETURN(1);
641                 }
642                 DEBUG_REQ(D_HA, req, "no reply for RESENT req (have "LPD64")",
643                           req->rq_export->exp_mdt_data.med_lcd->lcd_last_xid);
644         }
645         RETURN(0);
646 }
647
648 struct md_ucred *mdt_ucred(const struct mdt_thread_info *info);
649
650 static inline int is_identity_get_disabled(struct upcall_cache *cache)
651 {
652         return cache ? (strcmp(cache->uc_upcall, "NONE") == 0) : 1;
653 }
654
655 /* Issues dlm lock on passed @ns, @f stores it lock handle into @lh. */
656 static inline int mdt_fid_lock(struct ldlm_namespace *ns,
657                                struct lustre_handle *lh,
658                                ldlm_mode_t mode,
659                                ldlm_policy_data_t *policy,
660                                const struct ldlm_res_id *res_id,
661                                int flags)
662 {
663         int rc;
664
665         LASSERT(ns != NULL);
666         LASSERT(lh != NULL);
667
668         rc = ldlm_cli_enqueue_local(ns, res_id, LDLM_IBITS, policy,
669                                     mode, &flags, ldlm_blocking_ast,
670                                     ldlm_completion_ast, NULL, NULL,
671                                     0, NULL, lh);
672         return rc == ELDLM_OK ? 0 : -EIO;
673 }
674
675 static inline void mdt_fid_unlock(struct lustre_handle *lh,
676                                   ldlm_mode_t mode)
677 {
678         ldlm_lock_decref(lh, mode);
679 }
680
681 extern mdl_mode_t mdt_mdl_lock_modes[];
682 extern ldlm_mode_t mdt_dlm_lock_modes[];
683
684 static inline mdl_mode_t mdt_dlm_mode2mdl_mode(ldlm_mode_t mode)
685 {
686         LASSERT(IS_PO2(mode));
687         return mdt_mdl_lock_modes[mode];
688 }
689
690 static inline ldlm_mode_t mdt_mdl_mode2dlm_mode(mdl_mode_t mode)
691 {
692         LASSERT(IS_PO2(mode));
693         return mdt_dlm_lock_modes[mode];
694 }
695
696 static inline struct lu_name *mdt_name(const struct lu_env *env,
697                                        char *name, int namelen)
698 {
699         struct lu_name *lname;
700         struct mdt_thread_info *mti;
701
702         LASSERT(namelen > 0);
703         /* trailing '\0' in buffer */
704         LASSERT(name[namelen] == '\0');
705
706         mti = lu_context_key_get(&env->le_ctx, &mdt_thread_key);
707         lname = &mti->mti_name;
708         lname->ln_name = name;
709         lname->ln_namelen = namelen;
710         return lname;
711 }
712
713 static inline struct lu_name *mdt_name_copy(struct lu_name *tlname,
714                                             struct lu_name *slname)
715 {
716         LASSERT(tlname);
717         LASSERT(slname);
718
719         tlname->ln_name = slname->ln_name;
720         tlname->ln_namelen = slname->ln_namelen;
721         return tlname;
722 }
723
724 /* lprocfs stuff */
725 void lprocfs_mdt_init_vars(struct lprocfs_static_vars *lvars);
726 int mdt_procfs_init(struct mdt_device *mdt, const char *name);
727 int mdt_procfs_fini(struct mdt_device *mdt);
728
729 void mdt_time_start(const struct mdt_thread_info *info);
730 void mdt_time_end(const struct mdt_thread_info *info, int idx);
731
732 enum {
733         LPROC_MDT_NR
734 };
735
736 /* Capability */
737 int mdt_ck_thread_start(struct mdt_device *mdt);
738 void mdt_ck_thread_stop(struct mdt_device *mdt);
739 void mdt_ck_timer_callback(unsigned long castmeharder);
740 int mdt_capa_keys_init(const struct lu_env *env, struct mdt_device *mdt);
741
742 static inline void mdt_set_capainfo(struct mdt_thread_info *info, int offset,
743                                     const struct lu_fid *fid,
744                                     struct lustre_capa *capa)
745 {
746         struct mdt_device *dev = info->mti_mdt;
747         struct md_capainfo *ci;
748
749         LASSERT(offset >= 0 && offset <= MD_CAPAINFO_MAX);
750         if (!dev->mdt_opts.mo_mds_capa)
751                 return;
752
753         ci = md_capainfo(info->mti_env);
754         LASSERT(ci);
755         ci->mc_fid[offset]  = fid;
756         ci->mc_capa[offset] = capa;
757 }
758
759 static inline void mdt_dump_capainfo(struct mdt_thread_info *info)
760 {
761         struct md_capainfo *ci = md_capainfo(info->mti_env);
762         int i;
763
764         if (!ci)
765                 return;
766         for (i = 0; i < MD_CAPAINFO_MAX; i++) {
767                 if (!ci->mc_fid[i])
768                         continue;
769                 if (!ci->mc_capa[i]) {
770                         CERROR("no capa for index %d "DFID"\n",
771                                i, PFID(ci->mc_fid[i]));
772                         continue;
773                 }
774                 if (ci->mc_capa[i] == BYPASS_CAPA) {
775                         CERROR("bypass for index %d "DFID"\n",
776                                i, PFID(ci->mc_fid[i]));
777                         continue;
778                 }
779                 DEBUG_CAPA(D_ERROR, ci->mc_capa[i], "index %d", i);
780         }
781 }
782
783 #endif /* __KERNEL__ */
784 #endif /* _MDT_H */