Whamcloud - gitweb
e572552bd1f95b898373571ddbd5f181544f38e4
[fs/lustre-release.git] / lustre / osp / osp_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, see
18  * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
19  *
20  * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
21  * CA 95054 USA or visit www.sun.com if you need additional information or
22  * have any questions.
23  *
24  * GPL HEADER END
25  */
26 /*
27  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
28  * Use is subject to license terms.
29  *
30  * Copyright (c) 2011, 2012, Intel, Inc.
31  */
32 /*
33  * This file is part of Lustre, http://www.lustre.org/
34  * Lustre is a trademark of Sun Microsystems, Inc.
35  *
36  * lustre/osp/osp_internal.h
37  *
38  * Author: Alex Zhuravlev <alexey.zhuravlev@intel.com>
39  */
40
41 #ifndef _OSP_INTERNAL_H
42 #define _OSP_INTERNAL_H
43
44 #include <obd.h>
45 #include <dt_object.h>
46 #include <lustre_fid.h>
47
48 struct osp_device {
49         struct dt_device                 opd_dt_dev;
50         /* corresponded OST index */
51         int                              opd_index;
52         /* device used to store persistent state (llogs, last ids) */
53         struct obd_export               *opd_storage_exp;
54         struct dt_device                *opd_storage;
55         struct dt_object                *opd_last_used_file;
56         /* protected by opd_pre_lock */
57         volatile obd_id                  opd_last_used_id;
58         obd_id                           opd_gap_start;
59         int                              opd_gap_count;
60         /* connection to OST */
61         struct obd_device               *opd_obd;
62         struct obd_export               *opd_exp;
63         struct obd_uuid                  opd_cluuid;
64         struct obd_connect_data         *opd_connect_data;
65         int                              opd_connects;
66         cfs_proc_dir_entry_t            *opd_proc_entry;
67         struct lprocfs_stats            *opd_stats;
68         /* connection status. */
69         int                              opd_new_connection;
70         int                              opd_got_disconnected;
71         int                              opd_imp_connected;
72         int                              opd_imp_active;
73         int                              opd_imp_seen_connected:1;
74
75         /* whether local recovery is completed:
76          * reported via ->ldo_recovery_complete() */
77         int                              opd_recovery_completed;
78
79         cfs_proc_dir_entry_t            *opd_symlink;
80 };
81
82 extern cfs_mem_cache_t *osp_object_kmem;
83
84 /* this is a top object */
85 struct osp_object {
86         struct lu_object_header  opo_header;
87         struct dt_object         opo_obj;
88         int                      opo_reserved;
89 };
90
91 extern struct lu_object_operations osp_lu_obj_ops;
92
93 struct osp_thread_info {
94         struct lu_buf            osi_lb;
95         struct lu_fid            osi_fid;
96         struct lu_attr           osi_attr;
97         obd_id                   osi_id;
98         loff_t                   osi_off;
99 };
100
101 static inline void osp_objid_buf_prep(struct osp_thread_info *osi,
102                                       struct osp_device *d, int index)
103 {
104         osi->osi_lb.lb_buf = (void *)&d->opd_last_used_id;
105         osi->osi_lb.lb_len = sizeof(d->opd_last_used_id);
106         osi->osi_off = sizeof(d->opd_last_used_id) * index;
107 }
108
109 extern struct lu_context_key osp_thread_key;
110
111 static inline struct osp_thread_info *osp_env_info(const struct lu_env *env)
112 {
113         struct osp_thread_info *info;
114
115         info = lu_context_key_get(&env->le_ctx, &osp_thread_key);
116         if (info == NULL) {
117                 lu_env_refill((struct lu_env *)env);
118                 info = lu_context_key_get(&env->le_ctx, &osp_thread_key);
119         }
120         LASSERT(info);
121         return info;
122 }
123
124 struct osp_txn_info {
125         __u32   oti_current_id;
126 };
127
128 extern struct lu_context_key osp_txn_key;
129
130 static inline struct osp_txn_info *osp_txn_info(struct lu_context *ctx)
131 {
132         struct osp_txn_info *info;
133
134         info = lu_context_key_get(ctx, &osp_txn_key);
135         return info;
136 }
137
138 extern const struct lu_device_operations osp_lu_ops;
139
140 static inline int lu_device_is_osp(struct lu_device *d)
141 {
142         return ergo(d != NULL && d->ld_ops != NULL, d->ld_ops == &osp_lu_ops);
143 }
144
145 static inline struct osp_device *lu2osp_dev(struct lu_device *d)
146 {
147         LASSERT(lu_device_is_osp(d));
148         return container_of0(d, struct osp_device, opd_dt_dev.dd_lu_dev);
149 }
150
151 static inline struct lu_device *osp2lu_dev(struct osp_device *d)
152 {
153         return &d->opd_dt_dev.dd_lu_dev;
154 }
155
156 static inline struct osp_device *dt2osp_dev(struct dt_device *d)
157 {
158         LASSERT(lu_device_is_osp(&d->dd_lu_dev));
159         return container_of0(d, struct osp_device, opd_dt_dev);
160 }
161
162 static inline struct osp_object *lu2osp_obj(struct lu_object *o)
163 {
164         LASSERT(ergo(o != NULL, lu_device_is_osp(o->lo_dev)));
165         return container_of0(o, struct osp_object, opo_obj.do_lu);
166 }
167
168 static inline struct lu_object *osp2lu_obj(struct osp_object *obj)
169 {
170         return &obj->opo_obj.do_lu;
171 }
172
173 static inline struct osp_object *osp_obj(const struct lu_object *o)
174 {
175         LASSERT(lu_device_is_osp(o->lo_dev));
176         return container_of0(o, struct osp_object, opo_obj.do_lu);
177 }
178
179 static inline struct osp_object *dt2osp_obj(const struct dt_object *d)
180 {
181         return osp_obj(&d->do_lu);
182 }
183
184 static inline struct dt_object *osp_object_child(struct osp_object *o)
185 {
186         return container_of0(lu_object_next(osp2lu_obj(o)),
187                              struct dt_object, do_lu);
188 }
189
190 /* osp_dev.c */
191 void osp_update_last_id(struct osp_device *d, obd_id objid);
192
193 /* lproc_osp.c */
194 void lprocfs_osp_init_vars(struct lprocfs_static_vars *lvars);
195
196 #endif