@@ -129,17 +129,9 @@ To define an object, a structure of the following type should be filled out:
129
129
const void *parent_netfs_data,
130
130
const void *cookie_netfs_data);
131
131
132
- uint16_t (*get_key)(const void *cookie_netfs_data,
133
- void *buffer,
134
- uint16_t bufmax);
135
-
136
132
void (*get_attr)(const void *cookie_netfs_data,
137
133
uint64_t *size);
138
134
139
- uint16_t (*get_aux)(const void *cookie_netfs_data,
140
- void *buffer,
141
- uint16_t bufmax);
142
-
143
135
enum fscache_checkaux (*check_aux)(void *cookie_netfs_data,
144
136
const void *data,
145
137
uint16_t datalen);
@@ -187,14 +179,7 @@ This has the following fields:
187
179
cache in the parent's list will be chosen, or failing that, the first
188
180
cache in the master list.
189
181
190
- (4) A function to retrieve an object's key from the netfs [mandatory].
191
-
192
- This function will be called with the netfs data that was passed to the
193
- cookie acquisition function and the maximum length of key data that it may
194
- provide. It should write the required key data into the given buffer and
195
- return the quantity it wrote.
196
-
197
- (5) A function to retrieve attribute data from the netfs [optional].
182
+ (4) A function to retrieve attribute data from the netfs [optional].
198
183
199
184
This function will be called with the netfs data that was passed to the
200
185
cookie acquisition function. It should return the size of the file if
@@ -203,20 +188,7 @@ This has the following fields:
203
188
204
189
If the function is absent, a file size of 0 is assumed.
205
190
206
- (6) A function to retrieve auxiliary data from the netfs [optional].
207
-
208
- This function will be called with the netfs data that was passed to the
209
- cookie acquisition function and the maximum length of auxiliary data that
210
- it may provide. It should write the auxiliary data into the given buffer
211
- and return the quantity it wrote.
212
-
213
- If this function is absent, the auxiliary data length will be set to 0.
214
-
215
- The length of the auxiliary data buffer may be dependent on the key
216
- length. A netfs mustn't rely on being able to provide more than 400 bytes
217
- for both.
218
-
219
- (7) A function to check the auxiliary data [optional].
191
+ (5) A function to check the auxiliary data [optional].
220
192
221
193
This function will be called to check that a match found in the cache for
222
194
this object is valid. For instance with AFS it could check the auxiliary
@@ -235,7 +207,7 @@ This has the following fields:
235
207
This function can also be used to extract data from the auxiliary data in
236
208
the cache and copy it into the netfs's structures.
237
209
238
- (8 ) A pair of functions to manage contexts for the completion callback
210
+ (6 ) A pair of functions to manage contexts for the completion callback
239
211
[optional].
240
212
241
213
The cache read/write functions are passed a context which is then passed
@@ -249,7 +221,7 @@ This has the following fields:
249
221
required for indices as indices may not contain data. These functions may
250
222
be called in interrupt context and so may not sleep.
251
223
252
- (9 ) A function to mark a page as retaining cache metadata [optional].
224
+ (7 ) A function to mark a page as retaining cache metadata [optional].
253
225
254
226
This is called by the cache to indicate that it is retaining in-memory
255
227
information for this page and that the netfs should uncache the page when
@@ -261,7 +233,7 @@ This has the following fields:
261
233
262
234
This function is not required for indices as they're not permitted data.
263
235
264
- (10 ) A function to unmark all the pages retaining cache metadata [mandatory].
236
+ (8 ) A function to unmark all the pages retaining cache metadata [mandatory].
265
237
266
238
This is called by FS-Cache to indicate that a backing store is being
267
239
unbound from a cookie and that all the marks on the pages should be
@@ -333,12 +305,27 @@ the path to the file:
333
305
struct fscache_cookie *
334
306
fscache_acquire_cookie(struct fscache_cookie *parent,
335
307
const struct fscache_object_def *def,
308
+ const void *index_key,
309
+ size_t index_key_len,
310
+ const void *aux_data,
311
+ size_t aux_data_len,
336
312
void *netfs_data,
337
313
bool enable);
338
314
339
315
This function creates an index entry in the index represented by parent,
340
316
filling in the index entry by calling the operations pointed to by def.
341
317
318
+ A unique key that represents the object within the parent must be pointed to by
319
+ index_key and is of length index_key_len.
320
+
321
+ An optional blob of auxiliary data that is to be stored within the cache can be
322
+ pointed to with aux_data and should be of length aux_data_len. This would
323
+ typically be used for storing coherency data.
324
+
325
+ The netfs may pass an arbitrary value in netfs_data and this will be presented
326
+ to it in the event of any calling back. This may also be used in tracing or
327
+ logging of messages.
328
+
342
329
Note that this function never returns an error - all errors are handled
343
330
internally. It may, however, return NULL to indicate no cookie. It is quite
344
331
acceptable to pass this token back to this function as the parent to another
@@ -355,29 +342,23 @@ must be enabled to do anything with it. A disabled cookie can be enabled by
355
342
calling fscache_enable_cookie() (see below).
356
343
357
344
For example, with AFS, a cell would be added to the primary index. This index
358
- entry would have a dependent inode containing a volume location index for the
359
- volume mappings within this cell:
345
+ entry would have a dependent inode containing volume mappings within this cell:
360
346
361
347
cell->cache =
362
348
fscache_acquire_cookie(afs_cache_netfs.primary_index,
363
349
&afs_cell_cache_index_def,
350
+ cell->name, strlen(cell->name),
351
+ NULL, 0,
364
352
cell, true);
365
353
366
- Then when a volume location was accessed, it would be entered into the cell's
367
- index and an inode would be allocated that acts as a volume type and hash chain
368
- combination:
369
-
370
- vlocation->cache =
371
- fscache_acquire_cookie(cell->cache,
372
- &afs_vlocation_cache_index_def,
373
- vlocation, true);
374
-
375
- And then a particular flavour of volume (R/O for example) could be added to
376
- that index, creating another index for vnodes (AFS inode equivalents):
354
+ And then a particular volume could be added to that index by ID, creating
355
+ another index for vnodes (AFS inode equivalents):
377
356
378
357
volume->cache =
379
- fscache_acquire_cookie(vlocation ->cache,
358
+ fscache_acquire_cookie(volume->cell ->cache,
380
359
&afs_volume_cache_index_def,
360
+ &volume->vid, sizeof(volume->vid),
361
+ NULL, 0,
381
362
volume, true);
382
363
383
364
@@ -392,6 +373,8 @@ the object definition should be something other than index type.
392
373
vnode->cache =
393
374
fscache_acquire_cookie(volume->cache,
394
375
&afs_vnode_cache_object_def,
376
+ &key, sizeof(key),
377
+ &aux, sizeof(aux),
395
378
vnode, true);
396
379
397
380
@@ -408,6 +391,8 @@ it would be some other type of object such as a data file.
408
391
xattr->cache =
409
392
fscache_acquire_cookie(vnode->cache,
410
393
&afs_xattr_cache_object_def,
394
+ &xattr->name, strlen(xattr->name),
395
+ NULL, 0,
411
396
xattr, true);
412
397
413
398
Miscellaneous objects might be used to store extended attributes or directory
@@ -717,21 +702,23 @@ INDEX AND DATA FILE CONSISTENCY
717
702
To find out whether auxiliary data for an object is up to data within the
718
703
cache, the following function can be called:
719
704
720
- int fscache_check_consistency(struct fscache_cookie *cookie)
705
+ int fscache_check_consistency(struct fscache_cookie *cookie,
706
+ const void *aux_data);
721
707
722
708
This will call back to the netfs to check whether the auxiliary data associated
723
- with a cookie is correct. It returns 0 if it is and -ESTALE if it isn't; it
724
- may also return -ENOMEM and -ERESTARTSYS.
709
+ with a cookie is correct; if aux_data is non-NULL, it will update the auxiliary
710
+ data buffer first. It returns 0 if it is and -ESTALE if it isn't; it may also
711
+ return -ENOMEM and -ERESTARTSYS.
725
712
726
713
To request an update of the index data for an index or other object, the
727
714
following function should be called:
728
715
729
- void fscache_update_cookie(struct fscache_cookie *cookie);
716
+ void fscache_update_cookie(struct fscache_cookie *cookie,
717
+ const void *aux_data);
730
718
731
- This function will refer back to the netfs_data pointer stored in the cookie by
732
- the acquisition function to obtain the data to write into each revised index
733
- entry. The update method in the parent index definition will be called to
734
- transfer the data.
719
+ This function will update the cookie's auxiliary data buffer from aux_data if
720
+ that is non-NULL and then schedule this to be stored on disk. The update
721
+ method in the parent index definition will be called to transfer the data.
735
722
736
723
Note that partial updates may happen automatically at other times, such as when
737
724
data blocks are added to a data file object.
@@ -750,6 +737,7 @@ The initial enablement state is set by fscache_acquire_cookie(), but the cookie
750
737
can be enabled or disabled later. To disable a cookie, call:
751
738
752
739
void fscache_disable_cookie(struct fscache_cookie *cookie,
740
+ const void *aux_data,
753
741
bool invalidate);
754
742
755
743
If the cookie is not already disabled, this locks the cookie against other
@@ -764,6 +752,7 @@ markings are cleared up.
764
752
Cookies can be enabled or reenabled with:
765
753
766
754
void fscache_enable_cookie(struct fscache_cookie *cookie,
755
+ const void *aux_data,
767
756
bool (*can_enable)(void *data),
768
757
void *data)
769
758
@@ -777,6 +766,9 @@ ruling as to whether or not enablement should actually be permitted to begin.
777
766
All possible failures are handled internally. The cookie will only be marked
778
767
as enabled if provisional backing objects are allocated.
779
768
769
+ In both cases, the cookie's auxiliary data buffer is updated from aux_data if
770
+ that is non-NULL inside the enablement lock before proceeding.
771
+
780
772
781
773
===============================
782
774
MISCELLANEOUS COOKIE OPERATIONS
@@ -823,6 +815,7 @@ COOKIE UNREGISTRATION
823
815
To get rid of a cookie, this function should be called.
824
816
825
817
void fscache_relinquish_cookie(struct fscache_cookie *cookie,
818
+ const void *aux_data,
826
819
bool retire);
827
820
828
821
If retire is non-zero, then the object will be marked for recycling, and all
@@ -833,6 +826,9 @@ If retire is zero, then the object may be available again when next the
833
826
acquisition function is called. Retirement here will overrule the pinning on a
834
827
cookie.
835
828
829
+ The cookie's auxiliary data will be updated from aux_data if that is non-NULL
830
+ so that the cache can lazily update it on disk.
831
+
836
832
One very important note - relinquish must NOT be called for a cookie unless all
837
833
the cookies for "child" indices, objects and pages have been relinquished
838
834
first.
0 commit comments