1 /*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License, Version 1.0 only
6 * (the "License"). You may not use this file except in compliance
7 * with the License.
8 *
9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 * or http://www.opensolaris.org/os/licensing.
11 * See the License for the specific language governing permissions
12 * and limitations under the License.
13 *
14 * When distributing Covered Code, include this CDDL HEADER in each
15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 * If applicable, add the following below this CDDL HEADER, with the
17 * fields enclosed by brackets "[]" replaced with your own identifying
18 * information: Portions Copyright [yyyy] [name of copyright owner]
19 *
20 * CDDL HEADER END
21 */
22 /*
23 * Copyright (c) 1994-2001 by Sun Microsystems, Inc.
24 * All rights reserved.
25 */
26
27 #pragma ident "%Z%%M% %I% %E% SMI"
28
29 /*
30 * Methods for the cfsd_all class.
31 */
32
33 #include <stdio.h>
34 #include <stdlib.h>
35 #include <string.h>
36 #include <thread.h>
37 #include <synch.h>
38 #include <locale.h>
39 #include <errno.h>
40 #include <sys/utsname.h>
41 #include <sys/param.h>
42 #include <sys/mnttab.h>
43 #include <sys/vfstab.h>
44 #include <mdbug/mdbug.h>
45 #include <sys/fs/cachefs_fs.h>
46 #include <sys/fs/cachefs_dlog.h>
47 #include <sys/fs/cachefs_ioctl.h>
48 #include "cfsd.h"
49 #include "cfsd_kmod.h"
50 #include "cfsd_maptbl.h"
51 #include "cfsd_logfile.h"
52 #include "cfsd_fscache.h"
53 #include "cfsd_cache.h"
54 #include "cfsd_all.h"
55
56 /*
57 * ------------------------------------------------------------
58 * cfsd_all_create
59 *
60 * Description:
61 * Arguments:
62 * Returns:
63 * Preconditions:
64 */
65 cfsd_all_object_t *
cfsd_all_create(void)66 cfsd_all_create(void)
67 {
68
69 /* get the host name */
70 struct utsname info;
71 cfsd_all_object_t *all_object_p;
72 int xx;
73 char buffer[MAXPATHLEN];
74
75 dbug_enter("cfsd_all_create");
76
77 all_object_p =
78 (cfsd_all_object_t *)cfsd_calloc(sizeof (cfsd_all_object_t));
79
80 xx = uname(&info);
81 if (xx == -1) {
82 dbug_print(("error", "cannot get host name"));
83 strlcpy(all_object_p->i_machname, gettext("unknown"),
84 sizeof (all_object_p->i_machname));
85 } else {
86 strlcpy(all_object_p->i_machname, info.nodename,
87 sizeof (all_object_p->i_machname));
88 }
89
90 /* initialize the locking mutex */
91 xx = mutex_init(&all_object_p->i_lock, USYNC_THREAD, NULL);
92 dbug_assert(xx == 0);
93
94 all_object_p->i_nextcacheid = 0;
95 all_object_p->i_modify = 1;
96 all_object_p->i_cachelist = NULL;
97 all_object_p->i_cachecount = 0;
98
99 /* all_object_p->i_hoardp = NULL; */
100
101 snprintf(buffer, sizeof (buffer), gettext("host name is \"%s\""),
102 all_object_p->i_machname);
103 dbug_print(("info", buffer));
104 dbug_leave("cfsd_all_create");
105 return (all_object_p);
106 }
107
108 /*
109 * ------------------------------------------------------------
110 * cfsd_all_destroy
111 *
112 * Description:
113 * Arguments:
114 * Returns:
115 * Preconditions:
116 */
117 void
cfsd_all_destroy(cfsd_all_object_t * all_object_p)118 cfsd_all_destroy(cfsd_all_object_t *all_object_p)
119 {
120 cfsd_cache_object_t *cache_object_p;
121 cfsd_cache_object_t *tmp_cache_object_p;
122 int xx;
123
124 dbug_enter("cfsd_all_destroy");
125
126 /* dbug_assert(all_object_p->i_hoardp == NULL); */
127
128 /* get rid of any cache objects */
129 cache_object_p = all_object_p->i_cachelist;
130
131 while (cache_object_p != NULL) {
132 tmp_cache_object_p = cache_object_p->i_next;
133 cfsd_cache_destroy(cache_object_p);
134 cache_object_p = tmp_cache_object_p;
135 }
136
137 /* destroy the locking mutex */
138 xx = mutex_destroy(&all_object_p->i_lock);
139 dbug_assert(xx == 0);
140 cfsd_free(all_object_p);
141 dbug_leave("cfsd_all_destroy");
142 }
143
144 /*
145 * ------------------------------------------------------------
146 * all_lock
147 *
148 * Description:
149 * Arguments:
150 * Returns:
151 * Preconditions:
152 */
153 void
all_lock(cfsd_all_object_t * all_object_p)154 all_lock(cfsd_all_object_t *all_object_p)
155 {
156 dbug_enter("all_lock");
157
158 mutex_lock(&all_object_p->i_lock);
159 dbug_leave("all_lock");
160 }
161
162 /*
163 * ------------------------------------------------------------
164 * all_unlock
165 *
166 * Description:
167 * Arguments:
168 * Returns:
169 * Preconditions:
170 */
171 void
all_unlock(cfsd_all_object_t * all_object_p)172 all_unlock(cfsd_all_object_t *all_object_p)
173 {
174 dbug_enter("all_unlock");
175
176 mutex_unlock(&all_object_p->i_lock);
177 dbug_leave("all_unlock");
178 }
179
180 /*
181 * ------------------------------------------------------------
182 * all_cachelist_at
183 *
184 * Description:
185 * Arguments:
186 * index
187 * Returns:
188 * Returns ...
189 * Preconditions:
190 */
191 cfsd_cache_object_t *
all_cachelist_at(cfsd_all_object_t * all_object_p,size_t index)192 all_cachelist_at(cfsd_all_object_t *all_object_p, size_t index)
193 {
194 cfsd_cache_object_t *cache_object_p;
195 int i = 0;
196
197 dbug_enter("all_cachelist_at");
198
199 /* find the correct cache object */
200 cache_object_p = all_object_p->i_cachelist;
201
202 while ((cache_object_p != NULL) && (i++ < index)) {
203 cache_object_p = cache_object_p->i_next;
204 }
205
206 dbug_leave("all_cachelist_at");
207 return (cache_object_p);
208 }
209
210 /*
211 * ------------------------------------------------------------
212 * all_cachelist_add
213 *
214 * Description:
215 * Arguments:
216 * cachep
217 * Returns:
218 * Preconditions:
219 * precond(cachep)
220 */
221 void
all_cachelist_add(cfsd_all_object_t * all_object_p,cfsd_cache_object_t * cache_object_p)222 all_cachelist_add(cfsd_all_object_t *all_object_p,
223 cfsd_cache_object_t *cache_object_p)
224 {
225 dbug_enter("all_cachelist_add");
226
227 dbug_precond(cache_object_p);
228
229 cache_object_p->i_next = all_object_p->i_cachelist;
230 all_object_p->i_cachelist = cache_object_p;
231 all_object_p->i_modify++;
232 all_object_p->i_cachecount++;
233 dbug_leave("all_cachelist_add");
234 }
235
236 /*
237 * ------------------------------------------------------------
238 * all_cachelist_find
239 *
240 * Description:
241 * Arguments:
242 * namep
243 * Returns:
244 * Returns ...
245 * Preconditions:
246 * precond(namep)
247 */
248 cfsd_cache_object_t *
all_cachelist_find(cfsd_all_object_t * all_object_p,const char * namep)249 all_cachelist_find(cfsd_all_object_t *all_object_p, const char *namep)
250 {
251 cfsd_cache_object_t *cache_object_p;
252
253 dbug_enter("all_cachelist_find");
254
255 dbug_precond(namep);
256
257 /* find the correct cache object */
258 cache_object_p = all_object_p->i_cachelist;
259
260 while ((cache_object_p != NULL) &&
261 strcmp(namep, cache_object_p->i_cachedir)) {
262 cache_object_p = cache_object_p->i_next;
263 }
264
265 dbug_leave("all_cachelist_find");
266 return (cache_object_p);
267 }
268
269 /*
270 * ------------------------------------------------------------
271 * all_cachefstab_update
272 *
273 * Description:
274 * Arguments:
275 * Returns:
276 * Preconditions:
277 */
278 void
all_cachefstab_update(cfsd_all_object_t * all_object_p)279 all_cachefstab_update(cfsd_all_object_t *all_object_p)
280 {
281 cfsd_cache_object_t *cache_object_p;
282 FILE *fout;
283
284 dbug_enter("all_cachefstab_update");
285
286 fout = fopen(CACHEFSTAB, "w");
287 if (fout == NULL) {
288 dbug_print(("error", "cannot write %s", CACHEFSTAB));
289 } else {
290 cache_object_p = all_object_p->i_cachelist;
291
292 while (cache_object_p != NULL) {
293 dbug_assert(cache_object_p);
294 fprintf(fout, "%s\n", cache_object_p->i_cachedir);
295 cache_object_p = cache_object_p->i_next;
296 }
297 if (fclose(fout))
298 dbug_print(("error", "cannot close %s error %d",
299 CACHEFSTAB, errno));
300 }
301 dbug_leave("all_cachefstab_update");
302 }
303