aboutsummaryrefslogtreecommitdiffstats
path: root/Documentation/filesystems/caching/netfs-api.txt
diff options
context:
space:
mode:
authorDavid Howells <dhowells@redhat.com>2018-04-04 08:41:28 -0400
committerDavid Howells <dhowells@redhat.com>2018-04-04 08:41:28 -0400
commit402cb8dda949d9b8c0df20ad2527d139faad7ca1 (patch)
tree83cdb77f5490a0990eade886aa7f8dd087864996 /Documentation/filesystems/caching/netfs-api.txt
parent08c2e3d087840cd1e7141b62d92f3dc897147984 (diff)
fscache: Attach the index key and aux data to the cookie
Attach copies of the index key and auxiliary data to the fscache cookie so that: (1) The callbacks to the netfs for this stuff can be eliminated. This can simplify things in the cache as the information is still available, even after the cache has relinquished the cookie. (2) Simplifies the locking requirements of accessing the information as we don't have to worry about the netfs object going away on us. (3) The cache can do lazy updating of the coherency information on disk. As long as the cache is flushed before reboot/poweroff, there's no need to update the coherency info on disk every time it changes. (4) Cookies can be hashed or put in a tree as the index key is easily available. This allows: (a) Checks for duplicate cookies can be made at the top fscache layer rather than down in the bowels of the cache backend. (b) Caching can be added to a netfs object that has a cookie if the cache is brought online after the netfs object is allocated. A certain amount of space is made in the cookie for inline copies of the data, but if it won't fit there, extra memory will be allocated for it. The downside of this is that live cache operation requires more memory. Signed-off-by: David Howells <dhowells@redhat.com> Acked-by: Anna Schumaker <anna.schumaker@netapp.com> Tested-by: Steve Dickson <steved@redhat.com>
Diffstat (limited to 'Documentation/filesystems/caching/netfs-api.txt')
-rw-r--r--Documentation/filesystems/caching/netfs-api.txt106
1 files changed, 51 insertions, 55 deletions
diff --git a/Documentation/filesystems/caching/netfs-api.txt b/Documentation/filesystems/caching/netfs-api.txt
index 0eb31de3a2c1..332840ad4151 100644
--- a/Documentation/filesystems/caching/netfs-api.txt
+++ b/Documentation/filesystems/caching/netfs-api.txt
@@ -129,17 +129,9 @@ To define an object, a structure of the following type should be filled out:
129 const void *parent_netfs_data, 129 const void *parent_netfs_data,
130 const void *cookie_netfs_data); 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 void (*get_attr)(const void *cookie_netfs_data, 132 void (*get_attr)(const void *cookie_netfs_data,
137 uint64_t *size); 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 enum fscache_checkaux (*check_aux)(void *cookie_netfs_data, 135 enum fscache_checkaux (*check_aux)(void *cookie_netfs_data,
144 const void *data, 136 const void *data,
145 uint16_t datalen); 137 uint16_t datalen);
@@ -187,14 +179,7 @@ This has the following fields:
187 cache in the parent's list will be chosen, or failing that, the first 179 cache in the parent's list will be chosen, or failing that, the first
188 cache in the master list. 180 cache in the master list.
189 181
190 (4) A function to retrieve an object's key from the netfs [mandatory]. 182 (4) A function to retrieve attribute data from the netfs [optional].
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].
198 183
199 This function will be called with the netfs data that was passed to the 184 This function will be called with the netfs data that was passed to the
200 cookie acquisition function. It should return the size of the file if 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 If the function is absent, a file size of 0 is assumed. 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]. 191 (5) A function to check the auxiliary data [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].
220 192
221 This function will be called to check that a match found in the cache for 193 This function will be called to check that a match found in the cache for
222 this object is valid. For instance with AFS it could check the auxiliary 194 this object is valid. For instance with AFS it could check the auxiliary
@@ -235,7 +207,7 @@ This has the following fields:
235 This function can also be used to extract data from the auxiliary data in 207 This function can also be used to extract data from the auxiliary data in
236 the cache and copy it into the netfs's structures. 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 [optional]. 211 [optional].
240 212
241 The cache read/write functions are passed a context which is then passed 213 The cache read/write functions are passed a context which is then passed
@@ -249,7 +221,7 @@ This has the following fields:
249 required for indices as indices may not contain data. These functions may 221 required for indices as indices may not contain data. These functions may
250 be called in interrupt context and so may not sleep. 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 This is called by the cache to indicate that it is retaining in-memory 226 This is called by the cache to indicate that it is retaining in-memory
255 information for this page and that the netfs should uncache the page when 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 This function is not required for indices as they're not permitted data. 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 This is called by FS-Cache to indicate that a backing store is being 238 This is called by FS-Cache to indicate that a backing store is being
267 unbound from a cookie and that all the marks on the pages should be 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 struct fscache_cookie * 305 struct fscache_cookie *
334 fscache_acquire_cookie(struct fscache_cookie *parent, 306 fscache_acquire_cookie(struct fscache_cookie *parent,
335 const struct fscache_object_def *def, 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 void *netfs_data, 312 void *netfs_data,
337 bool enable); 313 bool enable);
338 314
339This function creates an index entry in the index represented by parent, 315This function creates an index entry in the index represented by parent,
340filling in the index entry by calling the operations pointed to by def. 316filling in the index entry by calling the operations pointed to by def.
341 317
318A unique key that represents the object within the parent must be pointed to by
319index_key and is of length index_key_len.
320
321An optional blob of auxiliary data that is to be stored within the cache can be
322pointed to with aux_data and should be of length aux_data_len. This would
323typically be used for storing coherency data.
324
325The netfs may pass an arbitrary value in netfs_data and this will be presented
326to it in the event of any calling back. This may also be used in tracing or
327logging of messages.
328
342Note that this function never returns an error - all errors are handled 329Note that this function never returns an error - all errors are handled
343internally. It may, however, return NULL to indicate no cookie. It is quite 330internally. It may, however, return NULL to indicate no cookie. It is quite
344acceptable to pass this token back to this function as the parent to another 331acceptable 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
355calling fscache_enable_cookie() (see below). 342calling fscache_enable_cookie() (see below).
356 343
357For example, with AFS, a cell would be added to the primary index. This index 344For example, with AFS, a cell would be added to the primary index. This index
358entry would have a dependent inode containing a volume location index for the 345entry would have a dependent inode containing volume mappings within this cell:
359volume mappings within this cell:
360 346
361 cell->cache = 347 cell->cache =
362 fscache_acquire_cookie(afs_cache_netfs.primary_index, 348 fscache_acquire_cookie(afs_cache_netfs.primary_index,
363 &afs_cell_cache_index_def, 349 &afs_cell_cache_index_def,
350 cell->name, strlen(cell->name),
351 NULL, 0,
364 cell, true); 352 cell, true);
365 353
366Then when a volume location was accessed, it would be entered into the cell's 354And then a particular volume could be added to that index by ID, creating
367index and an inode would be allocated that acts as a volume type and hash chain 355another index for vnodes (AFS inode equivalents):
368combination:
369
370 vlocation->cache =
371 fscache_acquire_cookie(cell->cache,
372 &afs_vlocation_cache_index_def,
373 vlocation, true);
374
375And then a particular flavour of volume (R/O for example) could be added to
376that index, creating another index for vnodes (AFS inode equivalents):
377 356
378 volume->cache = 357 volume->cache =
379 fscache_acquire_cookie(vlocation->cache, 358 fscache_acquire_cookie(volume->cell->cache,
380 &afs_volume_cache_index_def, 359 &afs_volume_cache_index_def,
360 &volume->vid, sizeof(volume->vid),
361 NULL, 0,
381 volume, true); 362 volume, true);
382 363
383 364
@@ -392,6 +373,8 @@ the object definition should be something other than index type.
392 vnode->cache = 373 vnode->cache =
393 fscache_acquire_cookie(volume->cache, 374 fscache_acquire_cookie(volume->cache,
394 &afs_vnode_cache_object_def, 375 &afs_vnode_cache_object_def,
376 &key, sizeof(key),
377 &aux, sizeof(aux),
395 vnode, true); 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 xattr->cache = 391 xattr->cache =
409 fscache_acquire_cookie(vnode->cache, 392 fscache_acquire_cookie(vnode->cache,
410 &afs_xattr_cache_object_def, 393 &afs_xattr_cache_object_def,
394 &xattr->name, strlen(xattr->name),
395 NULL, 0,
411 xattr, true); 396 xattr, true);
412 397
413Miscellaneous objects might be used to store extended attributes or directory 398Miscellaneous objects might be used to store extended attributes or directory
@@ -717,21 +702,23 @@ INDEX AND DATA FILE CONSISTENCY
717To find out whether auxiliary data for an object is up to data within the 702To find out whether auxiliary data for an object is up to data within the
718cache, the following function can be called: 703cache, 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
722This will call back to the netfs to check whether the auxiliary data associated 708This will call back to the netfs to check whether the auxiliary data associated
723with a cookie is correct. It returns 0 if it is and -ESTALE if it isn't; it 709with a cookie is correct; if aux_data is non-NULL, it will update the auxiliary
724may also return -ENOMEM and -ERESTARTSYS. 710data buffer first. It returns 0 if it is and -ESTALE if it isn't; it may also
711return -ENOMEM and -ERESTARTSYS.
725 712
726To request an update of the index data for an index or other object, the 713To request an update of the index data for an index or other object, the
727following function should be called: 714following 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
731This function will refer back to the netfs_data pointer stored in the cookie by 719This function will update the cookie's auxiliary data buffer from aux_data if
732the acquisition function to obtain the data to write into each revised index 720that is non-NULL and then schedule this to be stored on disk. The update
733entry. The update method in the parent index definition will be called to 721method in the parent index definition will be called to transfer the data.
734transfer the data.
735 722
736Note that partial updates may happen automatically at other times, such as when 723Note that partial updates may happen automatically at other times, such as when
737data blocks are added to a data file object. 724data 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
750can be enabled or disabled later. To disable a cookie, call: 737can be enabled or disabled later. To disable a cookie, call:
751 738
752 void fscache_disable_cookie(struct fscache_cookie *cookie, 739 void fscache_disable_cookie(struct fscache_cookie *cookie,
740 const void *aux_data,
753 bool invalidate); 741 bool invalidate);
754 742
755If the cookie is not already disabled, this locks the cookie against other 743If the cookie is not already disabled, this locks the cookie against other
@@ -764,6 +752,7 @@ markings are cleared up.
764Cookies can be enabled or reenabled with: 752Cookies can be enabled or reenabled with:
765 753
766 void fscache_enable_cookie(struct fscache_cookie *cookie, 754 void fscache_enable_cookie(struct fscache_cookie *cookie,
755 const void *aux_data,
767 bool (*can_enable)(void *data), 756 bool (*can_enable)(void *data),
768 void *data) 757 void *data)
769 758
@@ -777,6 +766,9 @@ ruling as to whether or not enablement should actually be permitted to begin.
777All possible failures are handled internally. The cookie will only be marked 766All possible failures are handled internally. The cookie will only be marked
778as enabled if provisional backing objects are allocated. 767as enabled if provisional backing objects are allocated.
779 768
769In both cases, the cookie's auxiliary data buffer is updated from aux_data if
770that is non-NULL inside the enablement lock before proceeding.
771
780 772
781=============================== 773===============================
782MISCELLANEOUS COOKIE OPERATIONS 774MISCELLANEOUS COOKIE OPERATIONS
@@ -823,6 +815,7 @@ COOKIE UNREGISTRATION
823To get rid of a cookie, this function should be called. 815To get rid of a cookie, this function should be called.
824 816
825 void fscache_relinquish_cookie(struct fscache_cookie *cookie, 817 void fscache_relinquish_cookie(struct fscache_cookie *cookie,
818 const void *aux_data,
826 bool retire); 819 bool retire);
827 820
828If retire is non-zero, then the object will be marked for recycling, and all 821If 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
833acquisition function is called. Retirement here will overrule the pinning on a 826acquisition function is called. Retirement here will overrule the pinning on a
834cookie. 827cookie.
835 828
829The cookie's auxiliary data will be updated from aux_data if that is non-NULL
830so that the cache can lazily update it on disk.
831
836One very important note - relinquish must NOT be called for a cookie unless all 832One very important note - relinquish must NOT be called for a cookie unless all
837the cookies for "child" indices, objects and pages have been relinquished 833the cookies for "child" indices, objects and pages have been relinquished
838first. 834first.