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, write to the
18 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 * Boston, MA 021110-1307, USA
24 * Copyright (c) 2012, 2017, Intel Corporation.
27 * lustre/target/tgt_internal.h
29 * Lustre Unified Target header file
31 * Author: Mikhail Pershin <mike.pershin@intel.com>
34 #ifndef _TG_INTERNAL_H
35 #define _TG_INTERNAL_H
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>
45 extern int (*tgt_lfsck_in_notify_local)(const struct lu_env *env,
46 struct dt_device *key,
47 struct lfsck_req_local *lrl,
50 * Common data shared by tg-level handlers. This is allocated per-thread to
51 * reduce stack consumption.
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;
61 struct lu_attr tti_attr;
62 struct lu_fid tti_fid1;
64 /* transno storage during last_rcvd update */
66 __u32 tti_has_trans:1,
69 /* Updates data for OUT target */
70 struct thandle_exec_args tti_tea;
73 /* for tgt_readpage() */
74 struct lu_rdpg tti_rdpg;
75 /* for tgt_sendpage() */
76 struct l_wait_info tti_wait_info;
79 struct dt_object_format tti_update_dof;
80 struct object_update_reply *tti_update_reply;
81 struct object_update *tti_update;
82 int tti_update_reply_index;
84 struct dt_object *tti_dt_object;
85 struct l_wait_info tti_wait_info;
87 struct obd_statfs osfs; /* for obd_statfs() in OFD/MDT */
89 struct lfsck_req_local tti_lrl;
90 struct dt_insert_rec tti_rec;
93 extern struct lu_context_key tgt_thread_key;
95 static inline struct tgt_thread_info *tgt_th_info(const struct lu_env *env)
97 struct tgt_thread_info *tti;
99 tti = lu_context_key_get(&env->le_ctx, &tgt_thread_key);
104 #define MGS_SERVICE_WATCHDOG_FACTOR (2)
106 int tgt_request_handle(struct ptlrpc_request *req);
108 /* check if request's xid is equal to last one or not*/
109 static inline int req_xid_is_last(struct ptlrpc_request *req)
111 struct lsd_client_data *lcd = req->rq_export->exp_target_data.ted_lcd;
113 LASSERT(lcd != NULL);
114 return (req->rq_xid == lcd->lcd_last_xid ||
115 req->rq_xid == lcd->lcd_last_close_xid);
118 static inline char *dt_obd_name(struct dt_device *dt)
120 return dt->dd_lu_dev.ld_obd->obd_name;
124 int out_tx_create_exec(const struct lu_env *env, struct thandle *th,
126 struct tx_arg *tx_add_exec(struct thandle_exec_args *ta,
127 tx_exec_func_t func, tx_exec_func_t undo,
128 const char *file, int line);
130 int out_create_add_exec(const struct lu_env *env, struct dt_object *obj,
131 struct lu_attr *attr, struct lu_fid *parent_fid,
132 struct dt_object_format *dof,
133 struct thandle_exec_args *ta, struct thandle *th,
134 struct object_update_reply *reply,
135 int index, const char *file, int line);
137 int out_attr_set_add_exec(const struct lu_env *env, struct dt_object *dt_obj,
138 const struct lu_attr *attr,
139 struct thandle_exec_args *ta, struct thandle *th,
140 struct object_update_reply *reply, int index,
141 const char *file, int line);
143 int out_write_add_exec(const struct lu_env *env, struct dt_object *dt_obj,
144 const struct lu_buf *buf, loff_t pos,
145 struct thandle_exec_args *ta, struct thandle *th,
146 struct object_update_reply *reply, int index,
147 const char *file, int line);
149 int out_xattr_set_add_exec(const struct lu_env *env, struct dt_object *dt_obj,
150 const struct lu_buf *buf, const char *name,
151 int flags, struct thandle_exec_args *ta,
153 struct object_update_reply *reply, int index,
154 const char *file, int line);
156 int out_xattr_del_add_exec(const struct lu_env *env, struct dt_object *dt_obj,
157 const char *name, struct thandle_exec_args *ta,
159 struct object_update_reply *reply, int index,
160 const char *file, int line);
162 int out_ref_add_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);
167 int out_ref_del_add_exec(const struct lu_env *env, struct dt_object *dt_obj,
168 struct thandle_exec_args *ta, struct thandle *th,
169 struct object_update_reply *reply, int index,
170 const char *file, int line);
172 int out_index_insert_add_exec(const struct lu_env *env,
173 struct dt_object *dt_obj,
174 const struct dt_rec *rec,
175 const struct dt_key *key,
176 struct thandle_exec_args *ta,
178 struct object_update_reply *reply,
179 int index, const char *file, int line);
181 int out_index_delete_add_exec(const struct lu_env *env,
182 struct dt_object *dt_obj,
183 const struct dt_key *key,
184 struct thandle_exec_args *ta,
186 struct object_update_reply *reply,
187 int index, const char *file, int line);
189 int out_destroy_add_exec(const struct lu_env *env, struct dt_object *dt_obj,
190 struct thandle_exec_args *ta, struct thandle *th,
191 struct object_update_reply *reply,
192 int index, const char *file, int line);
194 /* Update handlers */
195 int out_handle(struct tgt_session_info *tsi);
197 #define out_tx_create(env, obj, attr, fid, dof, ta, th, reply, idx) \
198 out_create_add_exec(env, obj, attr, fid, dof, ta, th, reply, idx, \
201 #define out_tx_attr_set(env, obj, attr, ta, th, reply, idx) \
202 out_attr_set_add_exec(env, obj, attr, ta, th, reply, idx, \
205 #define out_tx_xattr_set(env, obj, buf, name, fl, ta, th, reply, idx) \
206 out_xattr_set_add_exec(env, obj, buf, name, fl, ta, th, reply, idx, \
209 #define out_tx_xattr_del(env, obj, name, ta, th, reply, idx) \
210 out_xattr_del_add_exec(env, obj, name, ta, th, reply, idx, \
213 #define out_tx_ref_add(env, obj, ta, th, reply, idx) \
214 out_ref_add_add_exec(env, obj, ta, th, reply, idx, \
217 #define out_tx_ref_del(env, obj, ta, th, reply, idx) \
218 out_ref_del_add_exec(env, obj, ta, th, reply, idx, \
221 #define out_tx_index_insert(env, obj, rec, key, ta, th, reply, idx) \
222 out_index_insert_add_exec(env, obj, rec, key, ta, th, reply, idx, \
225 #define out_tx_index_delete(env, obj, key, ta, th, reply, idx) \
226 out_index_delete_add_exec(env, obj, key, ta, th, reply, idx, \
229 #define out_tx_destroy(env, obj, ta, th, reply, idx) \
230 out_destroy_add_exec(env, obj, ta, th, reply, idx, \
233 #define out_tx_write(env, obj, buf, pos, ta, th, reply, idx) \
234 out_write_add_exec(env, obj, buf, pos, ta, th, reply, idx,\
237 const char *update_op_str(__u16 opcode);
239 extern struct page *tgt_page_to_corrupt;
241 int tgt_server_data_init(const struct lu_env *env, struct lu_target *tgt);
242 int tgt_txn_start_cb(const struct lu_env *env, struct thandle *th,
244 int tgt_txn_stop_cb(const struct lu_env *env, struct thandle *th,
246 int tgt_handle_received_xid(struct obd_export *exp, __u64 rcvd_xid);
247 int tgt_handle_tag(struct obd_export *exp, __u16 tag);
249 void update_records_dump(const struct update_records *records,
250 unsigned int mask, bool dump_updates);
251 int check_and_prepare_update_record(const struct lu_env *env,
252 struct thandle_update_records *tur);
253 struct update_thread_info {
254 struct lu_attr uti_attr;
255 struct lu_fid uti_fid;
256 struct lu_buf uti_buf;
257 struct thandle_update_records uti_tur;
258 struct obdo uti_obdo;
259 struct thandle_exec_args uti_tea;
260 struct dt_insert_rec uti_rec;
261 struct distribute_txn_replay_req *uti_dtrq;
264 extern struct lu_context_key update_thread_key;
266 static inline struct update_thread_info *
267 update_env_info(const struct lu_env *env)
269 struct update_thread_info *uti;
271 uti = lu_context_key_get(&env->le_ctx, &update_thread_key);
272 LASSERT(uti != NULL);
276 void update_info_init(void);
277 void update_info_fini(void);
278 struct sub_thandle *create_sub_thandle(struct top_multiple_thandle *tmt,
279 struct dt_device *dt_dev);
280 int sub_thandle_trans_create(const struct lu_env *env,
281 struct top_thandle *top_th,
282 struct sub_thandle *st);
283 void distribute_txn_insert_by_batchid(struct top_multiple_thandle *new);
284 int top_trans_create_tmt(const struct lu_env *env,
285 struct top_thandle *top_th);
287 void tgt_cancel_slc_locks(struct lu_target *tgt, __u64 transno);
288 void barrier_init(void);
289 void barrier_fini(void);
291 /* FMD tracking data */
292 struct tgt_fmd_data {
293 struct list_head fmd_list; /* linked to tgt_fmd_list */
294 struct lu_fid fmd_fid; /* FID being written to */
295 __u64 fmd_mactime_xid; /* xid highest {m,a,c}time setattr */
296 time64_t fmd_expire; /* time when the fmd should expire */
297 int fmd_refcount; /* reference counter - list holds 1 */
301 extern struct kmem_cache *tgt_fmd_kmem;
302 void tgt_fmd_expire(struct obd_export *exp);
303 void tgt_fmd_cleanup(struct obd_export *exp);
305 #endif /* _TG_INTERNAL_H */