1 /* netfs cookie management
3 * Copyright (C) 2004-2007 Red Hat, Inc. All Rights Reserved.
4 * Written by David Howells (dhowells@redhat.com)
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version
9 * 2 of the License, or (at your option) any later version.
11 * See Documentation/filesystems/caching/netfs-api.txt for more information on
15 #define FSCACHE_DEBUG_LEVEL COOKIE
16 #include <linux/module.h>
17 #include <linux/slab.h>
20 struct kmem_cache *fscache_cookie_jar;
22 static atomic_t fscache_object_debug_id = ATOMIC_INIT(0);
24 static int fscache_acquire_non_index_cookie(struct fscache_cookie *cookie);
25 static int fscache_alloc_object(struct fscache_cache *cache,
26 struct fscache_cookie *cookie);
27 static int fscache_attach_object(struct fscache_cookie *cookie,
28 struct fscache_object *object);
31 * initialise an cookie jar slab element prior to any use
33 void fscache_cookie_init_once(void *_cookie)
35 struct fscache_cookie *cookie = _cookie;
37 memset(cookie, 0, sizeof(*cookie));
38 spin_lock_init(&cookie->lock);
39 spin_lock_init(&cookie->stores_lock);
40 INIT_HLIST_HEAD(&cookie->backing_objects);
44 * request a cookie to represent an object (index, datafile, xattr, etc)
45 * - parent specifies the parent object
46 * - the top level index cookie for each netfs is stored in the fscache_netfs
47 * struct upon registration
48 * - def points to the definition
49 * - the netfs_data will be passed to the functions pointed to in *def
50 * - all attached caches will be searched to see if they contain this object
51 * - index objects aren't stored on disk until there's a dependent file that
53 * - other objects are stored in a selected cache immediately, and all the
54 * indices forming the path to it are instantiated if necessary
55 * - we never let on to the netfs about errors
56 * - we may set a negative cookie pointer, but that's okay
58 struct fscache_cookie *__fscache_acquire_cookie(
59 struct fscache_cookie *parent,
60 const struct fscache_cookie_def *def,
64 struct fscache_cookie *cookie;
68 _enter("{%s},{%s},%p,%u",
69 parent ? (char *) parent->def->name : "<no-parent>",
70 def->name, netfs_data, enable);
72 fscache_stat(&fscache_n_acquires);
74 /* if there's no parent cookie, then we don't create one here either */
76 fscache_stat(&fscache_n_acquires_null);
77 _leave(" [no parent]");
81 /* validate the definition */
82 BUG_ON(!def->get_key);
83 BUG_ON(!def->name[0]);
85 BUG_ON(def->type == FSCACHE_COOKIE_TYPE_INDEX &&
86 parent->def->type != FSCACHE_COOKIE_TYPE_INDEX);
88 /* allocate and initialise a cookie */
89 cookie = kmem_cache_alloc(fscache_cookie_jar, GFP_KERNEL);
91 fscache_stat(&fscache_n_acquires_oom);
96 atomic_set(&cookie->usage, 1);
97 atomic_set(&cookie->n_children, 0);
99 /* We keep the active count elevated until relinquishment to prevent an
100 * attempt to wake up every time the object operations queue quiesces.
102 atomic_set(&cookie->n_active, 1);
104 fscache_cookie_get(parent, fscache_cookie_get_acquire_parent);
105 atomic_inc(&parent->n_children);
108 cookie->parent = parent;
109 cookie->netfs_data = netfs_data;
110 cookie->flags = (1 << FSCACHE_COOKIE_NO_DATA_YET);
112 /* radix tree insertion won't use the preallocation pool unless it's
113 * told it may not wait */
114 INIT_RADIX_TREE(&cookie->stores, GFP_NOFS & ~__GFP_DIRECT_RECLAIM);
116 switch (cookie->def->type) {
117 case FSCACHE_COOKIE_TYPE_INDEX:
118 fscache_stat(&fscache_n_cookie_index);
120 case FSCACHE_COOKIE_TYPE_DATAFILE:
121 fscache_stat(&fscache_n_cookie_data);
124 fscache_stat(&fscache_n_cookie_special);
128 trace_fscache_acquire(cookie);
131 /* if the object is an index then we need do nothing more here
132 * - we create indices on disk when we need them as an index
133 * may exist in multiple caches */
134 if (cookie->def->type != FSCACHE_COOKIE_TYPE_INDEX) {
135 if (fscache_acquire_non_index_cookie(cookie) == 0) {
136 set_bit(FSCACHE_COOKIE_ENABLED, &cookie->flags);
138 atomic_dec(&parent->n_children);
139 fscache_cookie_put(cookie,
140 fscache_cookie_put_acquire_nobufs);
141 fscache_stat(&fscache_n_acquires_nobufs);
146 set_bit(FSCACHE_COOKIE_ENABLED, &cookie->flags);
150 fscache_stat(&fscache_n_acquires_ok);
151 _leave(" = %p", cookie);
154 EXPORT_SYMBOL(__fscache_acquire_cookie);
157 * Enable a cookie to permit it to accept new operations.
159 void __fscache_enable_cookie(struct fscache_cookie *cookie,
160 bool (*can_enable)(void *data),
163 _enter("%p", cookie);
165 trace_fscache_enable(cookie);
167 wait_on_bit_lock(&cookie->flags, FSCACHE_COOKIE_ENABLEMENT_LOCK,
168 TASK_UNINTERRUPTIBLE);
170 if (test_bit(FSCACHE_COOKIE_ENABLED, &cookie->flags))
173 if (can_enable && !can_enable(data)) {
174 /* The netfs decided it didn't want to enable after all */
175 } else if (cookie->def->type != FSCACHE_COOKIE_TYPE_INDEX) {
176 /* Wait for outstanding disablement to complete */
177 __fscache_wait_on_invalidate(cookie);
179 if (fscache_acquire_non_index_cookie(cookie) == 0)
180 set_bit(FSCACHE_COOKIE_ENABLED, &cookie->flags);
182 set_bit(FSCACHE_COOKIE_ENABLED, &cookie->flags);
186 clear_bit_unlock(FSCACHE_COOKIE_ENABLEMENT_LOCK, &cookie->flags);
187 wake_up_bit(&cookie->flags, FSCACHE_COOKIE_ENABLEMENT_LOCK);
189 EXPORT_SYMBOL(__fscache_enable_cookie);
192 * acquire a non-index cookie
193 * - this must make sure the index chain is instantiated and instantiate the
194 * object representation too
196 static int fscache_acquire_non_index_cookie(struct fscache_cookie *cookie)
198 struct fscache_object *object;
199 struct fscache_cache *cache;
205 set_bit(FSCACHE_COOKIE_UNAVAILABLE, &cookie->flags);
207 /* now we need to see whether the backing objects for this cookie yet
208 * exist, if not there'll be nothing to search */
209 down_read(&fscache_addremove_sem);
211 if (list_empty(&fscache_cache_list)) {
212 up_read(&fscache_addremove_sem);
213 _leave(" = 0 [no caches]");
217 /* select a cache in which to store the object */
218 cache = fscache_select_cache_for_object(cookie->parent);
220 up_read(&fscache_addremove_sem);
221 fscache_stat(&fscache_n_acquires_no_cache);
222 _leave(" = -ENOMEDIUM [no cache]");
226 _debug("cache %s", cache->tag->name);
228 set_bit(FSCACHE_COOKIE_LOOKING_UP, &cookie->flags);
230 /* ask the cache to allocate objects for this cookie and its parent
232 ret = fscache_alloc_object(cache, cookie);
234 up_read(&fscache_addremove_sem);
235 _leave(" = %d", ret);
239 /* pass on how big the object we're caching is supposed to be */
240 cookie->def->get_attr(cookie->netfs_data, &i_size);
242 spin_lock(&cookie->lock);
243 if (hlist_empty(&cookie->backing_objects)) {
244 spin_unlock(&cookie->lock);
248 object = hlist_entry(cookie->backing_objects.first,
249 struct fscache_object, cookie_link);
251 fscache_set_store_limit(object, i_size);
253 /* initiate the process of looking up all the objects in the chain
254 * (done by fscache_initialise_object()) */
255 fscache_raise_event(object, FSCACHE_OBJECT_EV_NEW_CHILD);
257 spin_unlock(&cookie->lock);
259 /* we may be required to wait for lookup to complete at this point */
260 if (!fscache_defer_lookup) {
261 _debug("non-deferred lookup %p", &cookie->flags);
262 wait_on_bit(&cookie->flags, FSCACHE_COOKIE_LOOKING_UP,
263 TASK_UNINTERRUPTIBLE);
265 if (test_bit(FSCACHE_COOKIE_UNAVAILABLE, &cookie->flags))
269 up_read(&fscache_addremove_sem);
270 _leave(" = 0 [deferred]");
274 up_read(&fscache_addremove_sem);
275 _leave(" = -ENOBUFS");
280 * recursively allocate cache object records for a cookie/cache combination
281 * - caller must be holding the addremove sem
283 static int fscache_alloc_object(struct fscache_cache *cache,
284 struct fscache_cookie *cookie)
286 struct fscache_object *object;
289 _enter("%p,%p{%s}", cache, cookie, cookie->def->name);
291 spin_lock(&cookie->lock);
292 hlist_for_each_entry(object, &cookie->backing_objects,
294 if (object->cache == cache)
295 goto object_already_extant;
297 spin_unlock(&cookie->lock);
299 /* ask the cache to allocate an object (we may end up with duplicate
300 * objects at this stage, but we sort that out later) */
301 fscache_stat(&fscache_n_cop_alloc_object);
302 object = cache->ops->alloc_object(cache, cookie);
303 fscache_stat_d(&fscache_n_cop_alloc_object);
304 if (IS_ERR(object)) {
305 fscache_stat(&fscache_n_object_no_alloc);
306 ret = PTR_ERR(object);
310 fscache_stat(&fscache_n_object_alloc);
312 object->debug_id = atomic_inc_return(&fscache_object_debug_id);
314 _debug("ALLOC OBJ%x: %s {%lx}",
315 object->debug_id, cookie->def->name, object->events);
317 ret = fscache_alloc_object(cache, cookie->parent);
321 /* only attach if we managed to allocate all we needed, otherwise
322 * discard the object we just allocated and instead use the one
323 * attached to the cookie */
324 if (fscache_attach_object(cookie, object) < 0) {
325 fscache_stat(&fscache_n_cop_put_object);
326 cache->ops->put_object(object, fscache_obj_put_attach_fail);
327 fscache_stat_d(&fscache_n_cop_put_object);
333 object_already_extant:
335 if (fscache_object_is_dying(object) ||
336 fscache_cache_is_broken(object)) {
337 spin_unlock(&cookie->lock);
340 spin_unlock(&cookie->lock);
341 _leave(" = 0 [found]");
345 fscache_stat(&fscache_n_cop_put_object);
346 cache->ops->put_object(object, fscache_obj_put_alloc_fail);
347 fscache_stat_d(&fscache_n_cop_put_object);
349 _leave(" = %d", ret);
354 * attach a cache object to a cookie
356 static int fscache_attach_object(struct fscache_cookie *cookie,
357 struct fscache_object *object)
359 struct fscache_object *p;
360 struct fscache_cache *cache = object->cache;
363 _enter("{%s},{OBJ%x}", cookie->def->name, object->debug_id);
365 spin_lock(&cookie->lock);
367 /* there may be multiple initial creations of this object, but we only
370 hlist_for_each_entry(p, &cookie->backing_objects, cookie_link) {
371 if (p->cache == object->cache) {
372 if (fscache_object_is_dying(p))
374 goto cant_attach_object;
378 /* pin the parent object */
379 spin_lock_nested(&cookie->parent->lock, 1);
380 hlist_for_each_entry(p, &cookie->parent->backing_objects,
382 if (p->cache == object->cache) {
383 if (fscache_object_is_dying(p)) {
385 spin_unlock(&cookie->parent->lock);
386 goto cant_attach_object;
391 spin_unlock(&p->lock);
395 spin_unlock(&cookie->parent->lock);
397 /* attach to the cache's object list */
398 if (list_empty(&object->cache_link)) {
399 spin_lock(&cache->object_list_lock);
400 list_add(&object->cache_link, &cache->object_list);
401 spin_unlock(&cache->object_list_lock);
404 /* attach to the cookie */
405 object->cookie = cookie;
406 fscache_cookie_get(cookie, fscache_cookie_get_attach_object);
407 hlist_add_head(&object->cookie_link, &cookie->backing_objects);
409 fscache_objlist_add(object);
413 spin_unlock(&cookie->lock);
414 _leave(" = %d", ret);
419 * Invalidate an object. Callable with spinlocks held.
421 void __fscache_invalidate(struct fscache_cookie *cookie)
423 struct fscache_object *object;
425 _enter("{%s}", cookie->def->name);
427 fscache_stat(&fscache_n_invalidates);
429 /* Only permit invalidation of data files. Invalidating an index will
430 * require the caller to release all its attachments to the tree rooted
431 * there, and if it's doing that, it may as well just retire the
434 ASSERTCMP(cookie->def->type, ==, FSCACHE_COOKIE_TYPE_DATAFILE);
436 /* We will be updating the cookie too. */
437 BUG_ON(!cookie->def->get_aux);
439 /* If there's an object, we tell the object state machine to handle the
440 * invalidation on our behalf, otherwise there's nothing to do.
442 if (!hlist_empty(&cookie->backing_objects)) {
443 spin_lock(&cookie->lock);
445 if (fscache_cookie_enabled(cookie) &&
446 !hlist_empty(&cookie->backing_objects) &&
447 !test_and_set_bit(FSCACHE_COOKIE_INVALIDATING,
449 object = hlist_entry(cookie->backing_objects.first,
450 struct fscache_object,
452 if (fscache_object_is_live(object))
454 object, FSCACHE_OBJECT_EV_INVALIDATE);
457 spin_unlock(&cookie->lock);
462 EXPORT_SYMBOL(__fscache_invalidate);
465 * Wait for object invalidation to complete.
467 void __fscache_wait_on_invalidate(struct fscache_cookie *cookie)
469 _enter("%p", cookie);
471 wait_on_bit(&cookie->flags, FSCACHE_COOKIE_INVALIDATING,
472 TASK_UNINTERRUPTIBLE);
476 EXPORT_SYMBOL(__fscache_wait_on_invalidate);
479 * update the index entries backing a cookie
481 void __fscache_update_cookie(struct fscache_cookie *cookie)
483 struct fscache_object *object;
485 fscache_stat(&fscache_n_updates);
488 fscache_stat(&fscache_n_updates_null);
489 _leave(" [no cookie]");
493 _enter("{%s}", cookie->def->name);
495 BUG_ON(!cookie->def->get_aux);
497 spin_lock(&cookie->lock);
499 if (fscache_cookie_enabled(cookie)) {
500 /* update the index entry on disk in each cache backing this
503 hlist_for_each_entry(object,
504 &cookie->backing_objects, cookie_link) {
505 fscache_raise_event(object, FSCACHE_OBJECT_EV_UPDATE);
509 spin_unlock(&cookie->lock);
512 EXPORT_SYMBOL(__fscache_update_cookie);
515 * Disable a cookie to stop it from accepting new requests from the netfs.
517 void __fscache_disable_cookie(struct fscache_cookie *cookie, bool invalidate)
519 struct fscache_object *object;
522 _enter("%p,%u", cookie, invalidate);
524 trace_fscache_disable(cookie);
526 ASSERTCMP(atomic_read(&cookie->n_active), >, 0);
528 if (atomic_read(&cookie->n_children) != 0) {
529 pr_err("Cookie '%s' still has children\n",
534 wait_on_bit_lock(&cookie->flags, FSCACHE_COOKIE_ENABLEMENT_LOCK,
535 TASK_UNINTERRUPTIBLE);
536 if (!test_and_clear_bit(FSCACHE_COOKIE_ENABLED, &cookie->flags))
537 goto out_unlock_enable;
539 /* If the cookie is being invalidated, wait for that to complete first
540 * so that we can reuse the flag.
542 __fscache_wait_on_invalidate(cookie);
544 /* Dispose of the backing objects */
545 set_bit(FSCACHE_COOKIE_INVALIDATING, &cookie->flags);
547 spin_lock(&cookie->lock);
548 if (!hlist_empty(&cookie->backing_objects)) {
549 hlist_for_each_entry(object, &cookie->backing_objects, cookie_link) {
551 set_bit(FSCACHE_OBJECT_RETIRED, &object->flags);
552 clear_bit(FSCACHE_OBJECT_PENDING_WRITE, &object->flags);
553 fscache_raise_event(object, FSCACHE_OBJECT_EV_KILL);
556 if (test_and_clear_bit(FSCACHE_COOKIE_INVALIDATING, &cookie->flags))
559 spin_unlock(&cookie->lock);
561 wake_up_bit(&cookie->flags, FSCACHE_COOKIE_INVALIDATING);
563 /* Wait for cessation of activity requiring access to the netfs (when
564 * n_active reaches 0). This makes sure outstanding reads and writes
567 if (!atomic_dec_and_test(&cookie->n_active)) {
568 wait_var_event(&cookie->n_active,
569 !atomic_read(&cookie->n_active));
572 /* Make sure any pending writes are cancelled. */
573 if (cookie->def->type != FSCACHE_COOKIE_TYPE_INDEX)
574 fscache_invalidate_writes(cookie);
576 /* Reset the cookie state if it wasn't relinquished */
577 if (!test_bit(FSCACHE_COOKIE_RELINQUISHED, &cookie->flags)) {
578 atomic_inc(&cookie->n_active);
579 set_bit(FSCACHE_COOKIE_NO_DATA_YET, &cookie->flags);
583 clear_bit_unlock(FSCACHE_COOKIE_ENABLEMENT_LOCK, &cookie->flags);
584 wake_up_bit(&cookie->flags, FSCACHE_COOKIE_ENABLEMENT_LOCK);
587 EXPORT_SYMBOL(__fscache_disable_cookie);
590 * release a cookie back to the cache
591 * - the object will be marked as recyclable on disk if retire is true
592 * - all dependents of this cookie must have already been unregistered
593 * (indices/files/pages)
595 void __fscache_relinquish_cookie(struct fscache_cookie *cookie, bool retire)
597 fscache_stat(&fscache_n_relinquishes);
599 fscache_stat(&fscache_n_relinquishes_retire);
602 fscache_stat(&fscache_n_relinquishes_null);
603 _leave(" [no cookie]");
607 _enter("%p{%s,%p,%d},%d",
608 cookie, cookie->def->name, cookie->netfs_data,
609 atomic_read(&cookie->n_active), retire);
611 trace_fscache_relinquish(cookie, retire);
613 /* No further netfs-accessing operations on this cookie permitted */
614 if (test_and_set_bit(FSCACHE_COOKIE_RELINQUISHED, &cookie->flags))
617 __fscache_disable_cookie(cookie, retire);
619 /* Clear pointers back to the netfs */
620 cookie->netfs_data = NULL;
622 BUG_ON(cookie->stores.rnode);
624 if (cookie->parent) {
625 ASSERTCMP(atomic_read(&cookie->parent->usage), >, 0);
626 ASSERTCMP(atomic_read(&cookie->parent->n_children), >, 0);
627 atomic_dec(&cookie->parent->n_children);
630 /* Dispose of the netfs's link to the cookie */
631 ASSERTCMP(atomic_read(&cookie->usage), >, 0);
632 fscache_cookie_put(cookie, fscache_cookie_put_relinquish);
636 EXPORT_SYMBOL(__fscache_relinquish_cookie);
639 * Drop a reference to a cookie.
641 void fscache_cookie_put(struct fscache_cookie *cookie,
642 enum fscache_cookie_trace where)
644 struct fscache_cookie *parent;
647 _enter("%p", cookie);
650 usage = atomic_dec_return(&cookie->usage);
651 trace_fscache_cookie(cookie, where, usage);
657 parent = cookie->parent;
658 BUG_ON(!hlist_empty(&cookie->backing_objects));
659 kmem_cache_free(fscache_cookie_jar, cookie);
662 where = fscache_cookie_put_parent;
669 * check the consistency between the netfs inode and the backing cache
671 * NOTE: it only serves no-index type
673 int __fscache_check_consistency(struct fscache_cookie *cookie)
675 struct fscache_operation *op;
676 struct fscache_object *object;
677 bool wake_cookie = false;
680 _enter("%p,", cookie);
682 ASSERTCMP(cookie->def->type, ==, FSCACHE_COOKIE_TYPE_DATAFILE);
684 if (fscache_wait_for_deferred_lookup(cookie) < 0)
687 if (hlist_empty(&cookie->backing_objects))
690 op = kzalloc(sizeof(*op), GFP_NOIO | __GFP_NOMEMALLOC | __GFP_NORETRY);
694 fscache_operation_init(op, NULL, NULL, NULL);
695 op->flags = FSCACHE_OP_MYTHREAD |
696 (1 << FSCACHE_OP_WAITING) |
697 (1 << FSCACHE_OP_UNUSE_COOKIE);
699 spin_lock(&cookie->lock);
701 if (!fscache_cookie_enabled(cookie) ||
702 hlist_empty(&cookie->backing_objects))
704 object = hlist_entry(cookie->backing_objects.first,
705 struct fscache_object, cookie_link);
706 if (test_bit(FSCACHE_IOERROR, &object->cache->flags))
709 op->debug_id = atomic_inc_return(&fscache_op_debug_id);
711 __fscache_use_cookie(cookie);
712 if (fscache_submit_op(object, op) < 0)
715 /* the work queue now carries its own ref on the object */
716 spin_unlock(&cookie->lock);
718 ret = fscache_wait_for_operation_activation(object, op, NULL, NULL);
720 /* ask the cache to honour the operation */
721 ret = object->cache->ops->check_consistency(op);
722 fscache_op_complete(op, false);
723 } else if (ret == -ENOBUFS) {
727 fscache_put_operation(op);
728 _leave(" = %d", ret);
732 wake_cookie = __fscache_unuse_cookie(cookie);
734 spin_unlock(&cookie->lock);
736 __fscache_wake_unused_cookie(cookie);
738 _leave(" = -ESTALE");
741 EXPORT_SYMBOL(__fscache_check_consistency);