linux-ext3-adds-items-to-struct-inode-and-so-do-we-20010807
[openafs.git] / src / afs / afs_exporter.c
1 /*
2  * Copyright 2000, International Business Machines Corporation and others.
3  * All Rights Reserved.
4  * 
5  * This software has been released under the terms of the IBM Public
6  * License.  For details, see the LICENSE file in the top-level source
7  * directory or online at http://www.openafs.org/dl/license10.html
8  */
9
10 #include <afsconfig.h>
11 #include "../afs/param.h"
12
13 RCSID("$Header$");
14
15 #include "../afs/sysincludes.h" /* Standard vendor system headers */
16 #include "../afs/afsincludes.h" /* Afs-based standard headers */
17 #include "../afs/afs_stats.h"   /* statistics gathering code */
18
19 struct afs_exporter     *root_exported=0;   /* Head of "exporters" link list */
20 afs_lock_t              afs_xexp;
21
22
23 /* Add a new "afs exporter" entry to the table of exporters. The default initial values of the entry are passed in as parameters. */
24 static afs_int32 init_xexported = 0;
25 struct afs_exporter *exporter_add(size, ops, state, type, data)
26 afs_int32 size, state, type;
27 struct exporterops *ops;
28 char *data;
29 {
30     struct afs_exporter *ex, *op;
31     afs_int32 length;
32
33     AFS_STATCNT(exporter_add);
34     if (!init_xexported) {
35         init_xexported = 1;
36         LOCK_INIT(&afs_xexp, "afs_xexp");
37     }
38     length = (size ? size : sizeof(struct afs_exporter));
39     ex = (struct afs_exporter *) afs_osi_Alloc(length);
40     memset((char *)ex, 0, length);
41     MObtainWriteLock(&afs_xexp,308);
42     for (op = root_exported; op; op = op->exp_next) {
43         if (!op->exp_next)
44             break;
45     }
46     if (op) 
47         op->exp_next = ex;
48     else
49         root_exported = ex;
50     MReleaseWriteLock(&afs_xexp);
51     ex->exp_next = 0;
52     ex->exp_op = ops;
53     ex->exp_states = state;
54     ex->exp_data = data;
55     ex->exp_type = type;
56     return ex;
57 }
58
59
60 /* Returns the "afs exporter" structure of type, "type". NULL is returned if not found */
61 struct afs_exporter *exporter_find(type)
62 int type;
63 {
64     struct afs_exporter *op;
65
66     AFS_STATCNT(exporter_add);
67     MObtainReadLock(&afs_xexp);
68     for (op = root_exported; op; op = op->exp_next) {
69         if (op->exp_type == type) {
70             MReleaseReadLock(&afs_xexp);
71             return op;
72         }
73     }
74     MReleaseReadLock(&afs_xexp);
75     return (struct afs_exporter *)0;
76 }
77
78
79 shutdown_exporter() 
80 {
81     struct afs_exporter *ex, *op;
82
83     for (op = root_exported; op; op = ex) {
84         ex = op->exp_next;
85         afs_osi_Free(op, sizeof(struct afs_exporter));
86     }
87     init_xexported = 0;
88 }