OpenCores
URL https://opencores.org/ocsvn/or1k_soc_on_altera_embedded_dev_kit/or1k_soc_on_altera_embedded_dev_kit/trunk

Subversion Repositories or1k_soc_on_altera_embedded_dev_kit

[/] [or1k_soc_on_altera_embedded_dev_kit/] [trunk/] [linux-2.6/] [linux-2.6.24/] [fs/] [afs/] [cache.c] - Blame information for rev 17

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 3 xianfeng
/* AFS caching stuff
2
 *
3
 * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved.
4
 * Written by David Howells (dhowells@redhat.com)
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version
9
 * 2 of the License, or (at your option) any later version.
10
 */
11
 
12
#ifdef AFS_CACHING_SUPPORT
13
static cachefs_match_val_t afs_cell_cache_match(void *target,
14
                                                const void *entry);
15
static void afs_cell_cache_update(void *source, void *entry);
16
 
17
struct cachefs_index_def afs_cache_cell_index_def = {
18
        .name                   = "cell_ix",
19
        .data_size              = sizeof(struct afs_cache_cell),
20
        .keys[0]         = { CACHEFS_INDEX_KEYS_ASCIIZ, 64 },
21
        .match                  = afs_cell_cache_match,
22
        .update                 = afs_cell_cache_update,
23
};
24
#endif
25
 
26
/*
27
 * match a cell record obtained from the cache
28
 */
29
#ifdef AFS_CACHING_SUPPORT
30
static cachefs_match_val_t afs_cell_cache_match(void *target,
31
                                                const void *entry)
32
{
33
        const struct afs_cache_cell *ccell = entry;
34
        struct afs_cell *cell = target;
35
 
36
        _enter("{%s},{%s}", ccell->name, cell->name);
37
 
38
        if (strncmp(ccell->name, cell->name, sizeof(ccell->name)) == 0) {
39
                _leave(" = SUCCESS");
40
                return CACHEFS_MATCH_SUCCESS;
41
        }
42
 
43
        _leave(" = FAILED");
44
        return CACHEFS_MATCH_FAILED;
45
}
46
#endif
47
 
48
/*
49
 * update a cell record in the cache
50
 */
51
#ifdef AFS_CACHING_SUPPORT
52
static void afs_cell_cache_update(void *source, void *entry)
53
{
54
        struct afs_cache_cell *ccell = entry;
55
        struct afs_cell *cell = source;
56
 
57
        _enter("%p,%p", source, entry);
58
 
59
        strncpy(ccell->name, cell->name, sizeof(ccell->name));
60
 
61
        memcpy(ccell->vl_servers,
62
               cell->vl_addrs,
63
               min(sizeof(ccell->vl_servers), sizeof(cell->vl_addrs)));
64
 
65
}
66
#endif
67
 
68
#ifdef AFS_CACHING_SUPPORT
69
static cachefs_match_val_t afs_vlocation_cache_match(void *target,
70
                                                     const void *entry);
71
static void afs_vlocation_cache_update(void *source, void *entry);
72
 
73
struct cachefs_index_def afs_vlocation_cache_index_def = {
74
        .name           = "vldb",
75
        .data_size      = sizeof(struct afs_cache_vlocation),
76
        .keys[0] = { CACHEFS_INDEX_KEYS_ASCIIZ, 64 },
77
        .match          = afs_vlocation_cache_match,
78
        .update         = afs_vlocation_cache_update,
79
};
80
#endif
81
 
82
/*
83
 * match a VLDB record stored in the cache
84
 * - may also load target from entry
85
 */
86
#ifdef AFS_CACHING_SUPPORT
87
static cachefs_match_val_t afs_vlocation_cache_match(void *target,
88
                                                     const void *entry)
89
{
90
        const struct afs_cache_vlocation *vldb = entry;
91
        struct afs_vlocation *vlocation = target;
92
 
93
        _enter("{%s},{%s}", vlocation->vldb.name, vldb->name);
94
 
95
        if (strncmp(vlocation->vldb.name, vldb->name, sizeof(vldb->name)) == 0
96
            ) {
97
                if (!vlocation->valid ||
98
                    vlocation->vldb.rtime == vldb->rtime
99
                    ) {
100
                        vlocation->vldb = *vldb;
101
                        vlocation->valid = 1;
102
                        _leave(" = SUCCESS [c->m]");
103
                        return CACHEFS_MATCH_SUCCESS;
104
                } else if (memcmp(&vlocation->vldb, vldb, sizeof(*vldb)) != 0) {
105
                        /* delete if VIDs for this name differ */
106
                        if (memcmp(&vlocation->vldb.vid,
107
                                   &vldb->vid,
108
                                   sizeof(vldb->vid)) != 0) {
109
                                _leave(" = DELETE");
110
                                return CACHEFS_MATCH_SUCCESS_DELETE;
111
                        }
112
 
113
                        _leave(" = UPDATE");
114
                        return CACHEFS_MATCH_SUCCESS_UPDATE;
115
                } else {
116
                        _leave(" = SUCCESS");
117
                        return CACHEFS_MATCH_SUCCESS;
118
                }
119
        }
120
 
121
        _leave(" = FAILED");
122
        return CACHEFS_MATCH_FAILED;
123
}
124
#endif
125
 
126
/*
127
 * update a VLDB record stored in the cache
128
 */
129
#ifdef AFS_CACHING_SUPPORT
130
static void afs_vlocation_cache_update(void *source, void *entry)
131
{
132
        struct afs_cache_vlocation *vldb = entry;
133
        struct afs_vlocation *vlocation = source;
134
 
135
        _enter("");
136
 
137
        *vldb = vlocation->vldb;
138
}
139
#endif
140
 
141
#ifdef AFS_CACHING_SUPPORT
142
static cachefs_match_val_t afs_volume_cache_match(void *target,
143
                                                  const void *entry);
144
static void afs_volume_cache_update(void *source, void *entry);
145
 
146
struct cachefs_index_def afs_volume_cache_index_def = {
147
        .name           = "volume",
148
        .data_size      = sizeof(struct afs_cache_vhash),
149
        .keys[0] = { CACHEFS_INDEX_KEYS_BIN, 1 },
150
        .keys[1]        = { CACHEFS_INDEX_KEYS_BIN, 1 },
151
        .match          = afs_volume_cache_match,
152
        .update         = afs_volume_cache_update,
153
};
154
#endif
155
 
156
/*
157
 * match a volume hash record stored in the cache
158
 */
159
#ifdef AFS_CACHING_SUPPORT
160
static cachefs_match_val_t afs_volume_cache_match(void *target,
161
                                                  const void *entry)
162
{
163
        const struct afs_cache_vhash *vhash = entry;
164
        struct afs_volume *volume = target;
165
 
166
        _enter("{%u},{%u}", volume->type, vhash->vtype);
167
 
168
        if (volume->type == vhash->vtype) {
169
                _leave(" = SUCCESS");
170
                return CACHEFS_MATCH_SUCCESS;
171
        }
172
 
173
        _leave(" = FAILED");
174
        return CACHEFS_MATCH_FAILED;
175
}
176
#endif
177
 
178
/*
179
 * update a volume hash record stored in the cache
180
 */
181
#ifdef AFS_CACHING_SUPPORT
182
static void afs_volume_cache_update(void *source, void *entry)
183
{
184
        struct afs_cache_vhash *vhash = entry;
185
        struct afs_volume *volume = source;
186
 
187
        _enter("");
188
 
189
        vhash->vtype = volume->type;
190
}
191
#endif
192
 
193
#ifdef AFS_CACHING_SUPPORT
194
static cachefs_match_val_t afs_vnode_cache_match(void *target,
195
                                                 const void *entry);
196
static void afs_vnode_cache_update(void *source, void *entry);
197
 
198
struct cachefs_index_def afs_vnode_cache_index_def = {
199
        .name           = "vnode",
200
        .data_size      = sizeof(struct afs_cache_vnode),
201
        .keys[0] = { CACHEFS_INDEX_KEYS_BIN, 4 },
202
        .match          = afs_vnode_cache_match,
203
        .update         = afs_vnode_cache_update,
204
};
205
#endif
206
 
207
/*
208
 * match a vnode record stored in the cache
209
 */
210
#ifdef AFS_CACHING_SUPPORT
211
static cachefs_match_val_t afs_vnode_cache_match(void *target,
212
                                                 const void *entry)
213
{
214
        const struct afs_cache_vnode *cvnode = entry;
215
        struct afs_vnode *vnode = target;
216
 
217
        _enter("{%x,%x,%Lx},{%x,%x,%Lx}",
218
               vnode->fid.vnode,
219
               vnode->fid.unique,
220
               vnode->status.version,
221
               cvnode->vnode_id,
222
               cvnode->vnode_unique,
223
               cvnode->data_version);
224
 
225
        if (vnode->fid.vnode != cvnode->vnode_id) {
226
                _leave(" = FAILED");
227
                return CACHEFS_MATCH_FAILED;
228
        }
229
 
230
        if (vnode->fid.unique != cvnode->vnode_unique ||
231
            vnode->status.version != cvnode->data_version) {
232
                _leave(" = DELETE");
233
                return CACHEFS_MATCH_SUCCESS_DELETE;
234
        }
235
 
236
        _leave(" = SUCCESS");
237
        return CACHEFS_MATCH_SUCCESS;
238
}
239
#endif
240
 
241
/*
242
 * update a vnode record stored in the cache
243
 */
244
#ifdef AFS_CACHING_SUPPORT
245
static void afs_vnode_cache_update(void *source, void *entry)
246
{
247
        struct afs_cache_vnode *cvnode = entry;
248
        struct afs_vnode *vnode = source;
249
 
250
        _enter("");
251
 
252
        cvnode->vnode_id        = vnode->fid.vnode;
253
        cvnode->vnode_unique    = vnode->fid.unique;
254
        cvnode->data_version    = vnode->status.version;
255
}
256
#endif

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.