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 */
65cfsd_all_object_t *
66cfsd_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 */
117void
118cfsd_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 */
153void
154all_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 */
171void
172all_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 */
191cfsd_cache_object_t *
192all_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 */
221void
222all_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 */
248cfsd_cache_object_t *
249all_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 */
278void
279all_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