Commit ccc4fc3d authored by David Howells's avatar David Howells

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: default avatarDavid Howells <dhowells@redhat.com>
Acked-by: default avatarSteve Dickson <steved@redhat.com>
Acked-by: default avatarTrond Myklebust <Trond.Myklebust@netapp.com>
Acked-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
Tested-by: default avatarDaire Byrne <Daire.Byrne@framestore.com>
parent 36c95590
This diff is collapsed.
...@@ -178,6 +178,13 @@ extern void __fscache_unregister_netfs(struct fscache_netfs *); ...@@ -178,6 +178,13 @@ extern void __fscache_unregister_netfs(struct fscache_netfs *);
extern struct fscache_cache_tag *__fscache_lookup_cache_tag(const char *); extern struct fscache_cache_tag *__fscache_lookup_cache_tag(const char *);
extern void __fscache_release_cache_tag(struct fscache_cache_tag *); extern void __fscache_release_cache_tag(struct fscache_cache_tag *);
extern struct fscache_cookie *__fscache_acquire_cookie(
struct fscache_cookie *,
const struct fscache_cookie_def *,
void *);
extern void __fscache_relinquish_cookie(struct fscache_cookie *, int);
extern void __fscache_update_cookie(struct fscache_cookie *);
/** /**
* fscache_register_netfs - Register a filesystem as desiring caching services * fscache_register_netfs - Register a filesystem as desiring caching services
* @netfs: The description of the filesystem * @netfs: The description of the filesystem
...@@ -269,6 +276,9 @@ struct fscache_cookie *fscache_acquire_cookie( ...@@ -269,6 +276,9 @@ struct fscache_cookie *fscache_acquire_cookie(
const struct fscache_cookie_def *def, const struct fscache_cookie_def *def,
void *netfs_data) void *netfs_data)
{ {
if (fscache_cookie_valid(parent))
return __fscache_acquire_cookie(parent, def, netfs_data);
else
return NULL; return NULL;
} }
...@@ -287,6 +297,8 @@ struct fscache_cookie *fscache_acquire_cookie( ...@@ -287,6 +297,8 @@ struct fscache_cookie *fscache_acquire_cookie(
static inline static inline
void fscache_relinquish_cookie(struct fscache_cookie *cookie, int retire) void fscache_relinquish_cookie(struct fscache_cookie *cookie, int retire)
{ {
if (fscache_cookie_valid(cookie))
__fscache_relinquish_cookie(cookie, retire);
} }
/** /**
...@@ -302,6 +314,8 @@ void fscache_relinquish_cookie(struct fscache_cookie *cookie, int retire) ...@@ -302,6 +314,8 @@ void fscache_relinquish_cookie(struct fscache_cookie *cookie, int retire)
static inline static inline
void fscache_update_cookie(struct fscache_cookie *cookie) void fscache_update_cookie(struct fscache_cookie *cookie)
{ {
if (fscache_cookie_valid(cookie))
__fscache_update_cookie(cookie);
} }
/** /**
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment