aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux
diff options
context:
space:
mode:
authorDavid Howells <dhowells@redhat.com>2009-04-03 11:42:38 -0400
committerDavid Howells <dhowells@redhat.com>2009-04-03 11:42:38 -0400
commitccc4fc3d11e91477036d1f82bfa2d442f6ce77f0 (patch)
treec3ead4b385f9efce6e2688832dfb76391e18345d /include/linux
parent36c9559022850f919269564a74bf17fdabf4bb30 (diff)
FS-Cache: Implement the cookie management part of the netfs API
Implement the cookie management part of the FS-Cache netfs client API. The documentation and API header file were added in a previous patch. This patch implements the following three functions: (1) fscache_acquire_cookie(). Acquire a cookie to represent an object to the netfs. If the object in question is a non-index object, then that object and its parent indices will be created on disk at this point if they don't already exist. Index creation is deferred because an index may reside in multiple caches. (2) fscache_relinquish_cookie(). Retire or release a cookie previously acquired. At this point, the object on disk may be destroyed. (3) fscache_update_cookie(). Update the in-cache representation of a cookie. This is used to update the auxiliary data for coherency management purposes. With this patch it is possible to have a netfs instruct a cache backend to look up, validate and create metadata on disk and to destroy it again. The ability to actually store and retrieve data in the objects so created is added in later patches. Note that these functions will never return an error. _All_ errors are handled internally to FS-Cache. The worst that can happen is that fscache_acquire_cookie() may return a NULL pointer - which is considered a negative cookie pointer and can be passed back to any function that takes a cookie without harm. A negative cookie pointer merely suppresses caching at that level. The stub in linux/fscache.h will detect inline the negative cookie pointer and abort the operation as fast as possible. This means that the compiler doesn't have to set up for a call in that case. See the documentation in Documentation/filesystems/caching/netfs-api.txt for more information. Signed-off-by: David Howells <dhowells@redhat.com> Acked-by: Steve Dickson <steved@redhat.com> Acked-by: Trond Myklebust <Trond.Myklebust@netapp.com> Acked-by: Al Viro <viro@zeniv.linux.org.uk> Tested-by: Daire Byrne <Daire.Byrne@framestore.com>
Diffstat (limited to 'include/linux')
-rw-r--r--include/linux/fscache.h16
1 files changed, 15 insertions, 1 deletions
diff --git a/include/linux/fscache.h b/include/linux/fscache.h
index b195c2e1ef6a..245b48646efa 100644
--- a/include/linux/fscache.h
+++ b/include/linux/fscache.h
@@ -178,6 +178,13 @@ extern void __fscache_unregister_netfs(struct fscache_netfs *);
178extern struct fscache_cache_tag *__fscache_lookup_cache_tag(const char *); 178extern struct fscache_cache_tag *__fscache_lookup_cache_tag(const char *);
179extern void __fscache_release_cache_tag(struct fscache_cache_tag *); 179extern void __fscache_release_cache_tag(struct fscache_cache_tag *);
180 180
181extern struct fscache_cookie *__fscache_acquire_cookie(
182 struct fscache_cookie *,
183 const struct fscache_cookie_def *,
184 void *);
185extern void __fscache_relinquish_cookie(struct fscache_cookie *, int);
186extern void __fscache_update_cookie(struct fscache_cookie *);
187
181/** 188/**
182 * fscache_register_netfs - Register a filesystem as desiring caching services 189 * fscache_register_netfs - Register a filesystem as desiring caching services
183 * @netfs: The description of the filesystem 190 * @netfs: The description of the filesystem
@@ -269,7 +276,10 @@ struct fscache_cookie *fscache_acquire_cookie(
269 const struct fscache_cookie_def *def, 276 const struct fscache_cookie_def *def,
270 void *netfs_data) 277 void *netfs_data)
271{ 278{
272 return NULL; 279 if (fscache_cookie_valid(parent))
280 return __fscache_acquire_cookie(parent, def, netfs_data);
281 else
282 return NULL;
273} 283}
274 284
275/** 285/**
@@ -287,6 +297,8 @@ struct fscache_cookie *fscache_acquire_cookie(
287static inline 297static inline
288void fscache_relinquish_cookie(struct fscache_cookie *cookie, int retire) 298void fscache_relinquish_cookie(struct fscache_cookie *cookie, int retire)
289{ 299{
300 if (fscache_cookie_valid(cookie))
301 __fscache_relinquish_cookie(cookie, retire);
290} 302}
291 303
292/** 304/**
@@ -302,6 +314,8 @@ void fscache_relinquish_cookie(struct fscache_cookie *cookie, int retire)
302static inline 314static inline
303void fscache_update_cookie(struct fscache_cookie *cookie) 315void fscache_update_cookie(struct fscache_cookie *cookie)
304{ 316{
317 if (fscache_cookie_valid(cookie))
318 __fscache_update_cookie(cookie);
305} 319}
306 320
307/** 321/**