Whamcloud - gitweb
LU-17744 ldiskfs: mballoc stats fixes
[fs/lustre-release.git] / lustre / target / tgt_internal.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, write to the
18  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19  * Boston, MA 021110-1307, USA
20  *
21  * GPL HEADER END
22  */
23 /*
24  * Copyright (c) 2012, 2017, Intel Corporation.
25  */
26 /*
27  * lustre/target/tgt_internal.h
28  *
29  * Lustre Unified Target header file
30  *
31  * Author: Mikhail Pershin <mike.pershin@intel.com>
32  */
33
34 #ifndef _TG_INTERNAL_H
35 #define _TG_INTERNAL_H
36
37 #include <lustre_net.h>
38 #include <lu_target.h>
39 #include <lustre_export.h>
40 #include <lustre_fid.h>
41 #include <lustre_fld.h>
42 #include <lustre_req_layout.h>
43 #include <lustre_sec.h>
44
45 extern int (*tgt_lfsck_in_notify_local)(const struct lu_env *env,
46                                         struct dt_device *key,
47                                         struct lfsck_req_local *lrl,
48                                         struct thandle *th);
49 /**
50  * Common data shared by tg-level handlers. This is allocated per-thread to
51  * reduce stack consumption.
52  */
53 struct tgt_thread_info {
54         /* server and client data buffers */
55         struct lr_server_data    tti_lsd;
56         struct lsd_client_data   tti_lcd;
57         struct lsd_reply_data    tti_lrd;
58         struct lu_buf            tti_buf;
59         loff_t                   tti_off;
60
61         struct lu_attr           tti_attr;
62         struct lu_fid            tti_fid1;
63
64         /* transno storage during last_rcvd update */
65         __u64                    tti_transno;
66
67         /* Updates data for OUT target */
68         struct thandle_exec_args tti_tea;
69         union {
70                 struct {
71                         /* for tgt_readpage()      */
72                         struct lu_rdpg     tti_rdpg;
73                 } rdpg;
74                 struct {
75                         struct dt_object_format    tti_update_dof;
76                         struct object_update_reply *tti_update_reply;
77                         struct object_update       *tti_update;
78                         int                        tti_update_reply_index;
79                         struct obdo                tti_obdo;
80                         struct dt_object           *tti_dt_object;
81                 } update;
82                 struct obd_statfs osfs; /* for obd_statfs() in OFD/MDT */
83         } tti_u;
84         struct lfsck_req_local tti_lrl;
85         struct dt_insert_rec tti_rec;
86 };
87
88 extern struct lu_context_key tgt_thread_key;
89
90 static inline struct tgt_thread_info *tgt_th_info(const struct lu_env *env)
91 {
92         struct tgt_thread_info *tti;
93
94         tti = lu_context_key_get(&env->le_ctx, &tgt_thread_key);
95         LASSERT(tti);
96         return tti;
97 }
98
99 #define MGS_SERVICE_WATCHDOG_FACTOR      (2)
100
101 int tgt_request_handle(struct ptlrpc_request *req);
102
103 /* check if request's xid is equal to last one or not*/
104 static inline int req_xid_is_last(struct ptlrpc_request *req)
105 {
106         struct lsd_client_data *lcd = req->rq_export->exp_target_data.ted_lcd;
107
108         LASSERT(lcd != NULL);
109         return (req->rq_xid == lcd->lcd_last_xid ||
110                 req->rq_xid == lcd->lcd_last_close_xid);
111 }
112
113 static inline char *dt_obd_name(struct dt_device *dt)
114 {
115         return dt->dd_lu_dev.ld_obd->obd_name;
116 }
117
118 /* out_lib.c */
119 int out_tx_create_exec(const struct lu_env *env, struct thandle *th,
120                        struct tx_arg *arg);
121 struct tx_arg *tx_add_exec(struct thandle_exec_args *ta,
122                            tx_exec_func_t func, tx_exec_func_t undo,
123                            const char *file, int line);
124
125 int out_create_add_exec(const struct lu_env *env, struct dt_object *obj,
126                         struct lu_attr *attr, struct lu_fid *parent_fid,
127                         struct dt_object_format *dof,
128                         struct thandle_exec_args *ta, struct thandle *th,
129                         struct object_update_reply *reply,
130                         int index, const char *file, int line);
131
132 int out_attr_set_add_exec(const struct lu_env *env, struct dt_object *dt_obj,
133                           const struct lu_attr *attr,
134                           struct thandle_exec_args *ta, struct thandle *th,
135                           struct object_update_reply *reply, int index,
136                           const char *file, int line);
137
138 int out_write_add_exec(const struct lu_env *env, struct dt_object *dt_obj,
139                        const struct lu_buf *buf, loff_t pos,
140                        struct thandle_exec_args *ta, struct thandle *th,
141                        struct object_update_reply *reply, int index,
142                        const char *file, int line);
143
144 int out_xattr_set_add_exec(const struct lu_env *env, struct dt_object *dt_obj,
145                            const struct lu_buf *buf, const char *name,
146                            int flags, struct thandle_exec_args *ta,
147                            struct thandle *th,
148                            struct object_update_reply *reply, int index,
149                            const char *file, int line);
150
151 int out_xattr_del_add_exec(const struct lu_env *env, struct dt_object *dt_obj,
152                            const char *name, struct thandle_exec_args *ta,
153                            struct thandle *th,
154                            struct object_update_reply *reply, int index,
155                            const char *file, int line);
156
157 int out_ref_add_add_exec(const struct lu_env *env, struct dt_object *dt_obj,
158                          struct thandle_exec_args *ta, struct thandle *th,
159                          struct object_update_reply *reply, int index,
160                          const char *file, int line);
161
162 int out_ref_del_add_exec(const struct lu_env *env, struct dt_object *dt_obj,
163                          struct thandle_exec_args *ta, struct thandle *th,
164                          struct object_update_reply *reply, int index,
165                          const char *file, int line);
166
167 int out_index_insert_add_exec(const struct lu_env *env,
168                               struct dt_object *dt_obj,
169                               const struct dt_rec *rec,
170                               const struct dt_key *key,
171                               struct thandle_exec_args *ta,
172                               struct thandle *th,
173                               struct object_update_reply *reply,
174                               int index, const char *file, int line);
175
176 int out_index_delete_add_exec(const struct lu_env *env,
177                               struct dt_object *dt_obj,
178                               const struct dt_key *key,
179                               struct thandle_exec_args *ta,
180                               struct thandle *th,
181                               struct object_update_reply *reply,
182                               int index, const char *file, int line);
183
184 int out_destroy_add_exec(const struct lu_env *env, struct dt_object *dt_obj,
185                          struct thandle_exec_args *ta, struct thandle *th,
186                          struct object_update_reply *reply,
187                          int index, const char *file, int line);
188
189 /* Update handlers */
190 int out_handle(struct tgt_session_info *tsi);
191
192 #define out_tx_create(env, obj, attr, fid, dof, ta, th, reply, idx) \
193         out_create_add_exec(env, obj, attr, fid, dof, ta, th, reply, idx, \
194                             __FILE__, __LINE__)
195
196 #define out_tx_attr_set(env, obj, attr, ta, th, reply, idx) \
197         out_attr_set_add_exec(env, obj, attr, ta, th, reply, idx, \
198                               __FILE__, __LINE__)
199
200 #define out_tx_xattr_set(env, obj, buf, name, fl, ta, th, reply, idx)   \
201         out_xattr_set_add_exec(env, obj, buf, name, fl, ta, th, reply, idx, \
202                                __FILE__, __LINE__)
203
204 #define out_tx_xattr_del(env, obj, name, ta, th, reply, idx)    \
205         out_xattr_del_add_exec(env, obj, name, ta, th, reply, idx,      \
206                                __FILE__, __LINE__)
207
208 #define out_tx_ref_add(env, obj, ta, th, reply, idx) \
209         out_ref_add_add_exec(env, obj, ta, th, reply, idx,      \
210                              __FILE__, __LINE__)
211
212 #define out_tx_ref_del(env, obj, ta, th, reply, idx) \
213         out_ref_del_add_exec(env, obj, ta, th, reply, idx,      \
214                              __FILE__, __LINE__)
215
216 #define out_tx_index_insert(env, obj, rec, key, ta, th, reply, idx) \
217         out_index_insert_add_exec(env, obj, rec, key, ta, th, reply, idx, \
218                                   __FILE__, __LINE__)
219
220 #define out_tx_index_delete(env, obj, key, ta, th, reply, idx) \
221         out_index_delete_add_exec(env, obj, key, ta, th, reply, idx, \
222                                   __FILE__, __LINE__)
223
224 #define out_tx_destroy(env, obj, ta, th, reply, idx) \
225         out_destroy_add_exec(env, obj, ta, th, reply, idx,      \
226                              __FILE__, __LINE__)
227
228 #define out_tx_write(env, obj, buf, pos, ta, th, reply, idx) \
229         out_write_add_exec(env, obj, buf, pos, ta, th, reply, idx,\
230                            __FILE__, __LINE__)
231
232 const char *update_op_str(__u16 opcode);
233
234 extern struct page *tgt_page_to_corrupt;
235
236 int tgt_server_data_init(const struct lu_env *env, struct lu_target *tgt);
237 int tgt_txn_start_cb(const struct lu_env *env, struct thandle *th,
238                      void *cookie);
239 int tgt_txn_stop_cb(const struct lu_env *env, struct thandle *th,
240                     void *cookie);
241 int tgt_handle_received_xid(struct obd_export *exp, __u64 rcvd_xid);
242 int tgt_handle_tag(struct ptlrpc_request *req);
243
244 void update_records_dump(const struct update_records *records,
245                          unsigned int mask, bool dump_updates);
246 int check_and_prepare_update_record(const struct lu_env *env,
247                                     struct thandle_update_records *tur);
248 struct update_thread_info {
249         struct lu_attr                  uti_attr;
250         struct lu_fid                   uti_fid;
251         struct lu_buf                   uti_buf;
252         struct thandle_update_records   uti_tur;
253         struct obdo                     uti_obdo;
254         struct thandle_exec_args        uti_tea;
255         struct dt_insert_rec            uti_rec;
256         struct distribute_txn_replay_req *uti_dtrq;
257 };
258
259 extern struct lu_context_key update_thread_key;
260
261 static inline struct update_thread_info *
262 update_env_info(const struct lu_env *env)
263 {
264         struct update_thread_info *uti;
265
266         uti = lu_context_key_get(&env->le_ctx, &update_thread_key);
267         LASSERT(uti != NULL);
268         return uti;
269 }
270
271 void update_info_init(void);
272 void update_info_fini(void);
273 struct sub_thandle *create_sub_thandle(struct top_multiple_thandle *tmt,
274                                        struct dt_device *dt_dev);
275 int sub_thandle_trans_create(const struct lu_env *env,
276                              struct top_thandle *top_th,
277                              struct sub_thandle *st);
278 void distribute_txn_insert_by_batchid(struct top_multiple_thandle *new);
279 int top_trans_create_tmt(const struct lu_env *env,
280                          struct top_thandle *top_th);
281
282 void tgt_cancel_slc_locks(struct lu_target *tgt, __u64 transno);
283 int lustre_tgt_register_fs(void);
284 void lustre_tgt_unregister_fs(void);
285 void barrier_init(void);
286 void barrier_fini(void);
287
288 /* FMD tracking data */
289 struct tgt_fmd_data {
290         struct list_head fmd_list;        /* linked to tgt_fmd_list */
291         struct lu_fid    fmd_fid;         /* FID being written to */
292         __u64            fmd_mactime_xid; /* xid highest {m,a,c}time setattr */
293         time64_t         fmd_expire;      /* time when the fmd should expire */
294         int              fmd_refcount;    /* reference counter - list holds 1 */
295 };
296
297 /* tgt_fmd.c */
298 extern struct kmem_cache *tgt_fmd_kmem;
299 void tgt_fmd_expire(struct obd_export *exp);
300 void tgt_fmd_cleanup(struct obd_export *exp);
301
302 #endif /* _TG_INTERNAL_H */