Commit | Line | Data |
---|---|---|
d7e09d03 PT |
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) 2012, 2013, Intel Corporation. | |
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/fld/fld_internal.h | |
37 | * | |
38 | * Author: Yury Umanets <umka@clusterfs.com> | |
39 | * Author: Tom WangDi <wangdi@clusterfs.com> | |
40 | */ | |
41 | #ifndef __FLD_INTERNAL_H | |
42 | #define __FLD_INTERNAL_H | |
43 | ||
0e9ad0ef GKH |
44 | #include "../include/lustre/lustre_idl.h" |
45 | #include "../include/dt_object.h" | |
d7e09d03 | 46 | |
9fdaf8c0 | 47 | #include "../../include/linux/libcfs/libcfs.h" |
0e9ad0ef GKH |
48 | #include "../include/lustre_req_layout.h" |
49 | #include "../include/lustre_fld.h" | |
d7e09d03 PT |
50 | |
51 | enum { | |
52 | LUSTRE_FLD_INIT = 1 << 0, | |
53 | LUSTRE_FLD_RUN = 1 << 1 | |
54 | }; | |
55 | ||
56 | struct fld_stats { | |
57 | __u64 fst_count; | |
58 | __u64 fst_cache; | |
59 | __u64 fst_inflight; | |
60 | }; | |
61 | ||
62 | typedef int (*fld_hash_func_t) (struct lu_client_fld *, __u64); | |
63 | ||
64 | typedef struct lu_fld_target * | |
65 | (*fld_scan_func_t) (struct lu_client_fld *, __u64); | |
66 | ||
67 | struct lu_fld_hash { | |
68 | const char *fh_name; | |
69 | fld_hash_func_t fh_hash_func; | |
70 | fld_scan_func_t fh_scan_func; | |
71 | }; | |
72 | ||
73 | struct fld_cache_entry { | |
74 | struct list_head fce_lru; | |
75 | struct list_head fce_list; | |
76 | /** | |
77 | * fld cache entries are sorted on range->lsr_start field. */ | |
78 | struct lu_seq_range fce_range; | |
79 | }; | |
80 | ||
81 | struct fld_cache { | |
82 | /** | |
83 | * Cache guard, protects fci_hash mostly because others immutable after | |
84 | * init is finished. | |
85 | */ | |
86 | rwlock_t fci_lock; | |
87 | ||
88 | /** | |
89 | * Cache shrink threshold */ | |
90 | int fci_threshold; | |
91 | ||
92 | /** | |
34ca8748 | 93 | * Preferred number of cached entries */ |
d7e09d03 PT |
94 | int fci_cache_size; |
95 | ||
96 | /** | |
97 | * Current number of cached entries. Protected by \a fci_lock */ | |
98 | int fci_cache_count; | |
99 | ||
100 | /** | |
101 | * LRU list fld entries. */ | |
102 | struct list_head fci_lru; | |
103 | ||
104 | /** | |
105 | * sorted fld entries. */ | |
106 | struct list_head fci_entries_head; | |
107 | ||
108 | /** | |
109 | * Cache statistics. */ | |
110 | struct fld_stats fci_stat; | |
111 | ||
112 | /** | |
113 | * Cache name used for debug and messages. */ | |
114 | char fci_name[80]; | |
115 | unsigned int fci_no_shrink:1; | |
116 | }; | |
117 | ||
118 | enum fld_op { | |
119 | FLD_CREATE = 0, | |
120 | FLD_DELETE = 1, | |
121 | FLD_LOOKUP = 2 | |
122 | }; | |
123 | ||
124 | enum { | |
125 | /* 4M of FLD cache will not hurt client a lot. */ | |
126 | FLD_SERVER_CACHE_SIZE = (4 * 0x100000), | |
127 | ||
128 | /* 1M of FLD cache will not hurt client a lot. */ | |
129 | FLD_CLIENT_CACHE_SIZE = (1 * 0x100000) | |
130 | }; | |
131 | ||
132 | enum { | |
133 | /* Cache threshold is 10 percent of size. */ | |
134 | FLD_SERVER_CACHE_THRESHOLD = 10, | |
135 | ||
136 | /* Cache threshold is 10 percent of size. */ | |
137 | FLD_CLIENT_CACHE_THRESHOLD = 10 | |
138 | }; | |
139 | ||
140 | extern struct lu_fld_hash fld_hash[]; | |
141 | ||
d7e09d03 PT |
142 | int fld_client_rpc(struct obd_export *exp, |
143 | struct lu_seq_range *range, __u32 fld_op); | |
144 | ||
f267cdb4 | 145 | #if defined (CONFIG_PROC_FS) |
d7e09d03 PT |
146 | extern struct lprocfs_vars fld_client_proc_list[]; |
147 | #endif | |
148 | ||
149 | ||
150 | struct fld_cache *fld_cache_init(const char *name, | |
151 | int cache_size, int cache_threshold); | |
152 | ||
153 | void fld_cache_fini(struct fld_cache *cache); | |
154 | ||
155 | void fld_cache_flush(struct fld_cache *cache); | |
156 | ||
157 | int fld_cache_insert(struct fld_cache *cache, | |
158 | const struct lu_seq_range *range); | |
159 | ||
160 | struct fld_cache_entry | |
161 | *fld_cache_entry_create(const struct lu_seq_range *range); | |
162 | ||
163 | int fld_cache_insert_nolock(struct fld_cache *cache, | |
164 | struct fld_cache_entry *f_new); | |
165 | void fld_cache_delete(struct fld_cache *cache, | |
166 | const struct lu_seq_range *range); | |
167 | void fld_cache_delete_nolock(struct fld_cache *cache, | |
168 | const struct lu_seq_range *range); | |
169 | int fld_cache_lookup(struct fld_cache *cache, | |
114acca8 | 170 | const u64 seq, struct lu_seq_range *range); |
d7e09d03 PT |
171 | |
172 | struct fld_cache_entry* | |
173 | fld_cache_entry_lookup(struct fld_cache *cache, struct lu_seq_range *range); | |
174 | void fld_cache_entry_delete(struct fld_cache *cache, | |
175 | struct fld_cache_entry *node); | |
176 | void fld_dump_cache_entries(struct fld_cache *cache); | |
177 | ||
178 | struct fld_cache_entry | |
179 | *fld_cache_entry_lookup_nolock(struct fld_cache *cache, | |
180 | struct lu_seq_range *range); | |
181 | int fld_write_range(const struct lu_env *env, struct dt_object *dt, | |
182 | const struct lu_seq_range *range, struct thandle *th); | |
183 | ||
184 | static inline const char * | |
185 | fld_target_name(struct lu_fld_target *tar) | |
186 | { | |
187 | if (tar->ft_srv != NULL) | |
188 | return tar->ft_srv->lsf_name; | |
189 | ||
190 | return (const char *)tar->ft_exp->exp_obd->obd_name; | |
191 | } | |
192 | ||
d7e09d03 | 193 | #endif /* __FLD_INTERNAL_H */ |