| /* netfs cookie management |
| * |
| * Copyright (C) 2004-2007 Red Hat, Inc. All Rights Reserved. |
| * Written by David Howells (dhowells@redhat.com) |
| * |
| * This program is free software; you can redistribute it and/or |
| * modify it under the terms of the GNU General Public License |
| * as published by the Free Software Foundation; either version |
| * 2 of the License, or (at your option) any later version. |
| */ |
| |
| #define FSCACHE_DEBUG_LEVEL COOKIE |
| #include <linux/module.h> |
| #include <linux/slab.h> |
| #include "internal.h" |
| |
| struct kmem_cache *fscache_cookie_jar; |
| |
| /* |
| * initialise an cookie jar slab element prior to any use |
| */ |
| void fscache_cookie_init_once(void *_cookie) |
| { |
| struct fscache_cookie *cookie = _cookie; |
| |
| memset(cookie, 0, sizeof(*cookie)); |
| spin_lock_init(&cookie->lock); |
| INIT_HLIST_HEAD(&cookie->backing_objects); |
| } |
| |
| /* |
| * destroy a cookie |
| */ |
| void __fscache_cookie_put(struct fscache_cookie *cookie) |
| { |
| struct fscache_cookie *parent; |
| |
| _enter("%p", cookie); |
| |
| for (;;) { |
| _debug("FREE COOKIE %p", cookie); |
| parent = cookie->parent; |
| BUG_ON(!hlist_empty(&cookie->backing_objects)); |
| kmem_cache_free(fscache_cookie_jar, cookie); |
| |
| if (!parent) |
| break; |
| |
| cookie = parent; |
| BUG_ON(atomic_read(&cookie->usage) <= 0); |
| if (!atomic_dec_and_test(&cookie->usage)) |
| break; |
| } |
| |
| _leave(""); |
| } |