fscache: Use refcount_t for the cookie refcount instead of atomic_t
[linux-2.6-microblaze.git] / fs / fscache / cookie.c
index 6df3732..cd42be6 100644 (file)
@@ -164,7 +164,7 @@ struct fscache_cookie *fscache_alloc_cookie(
                        goto nomem;
        }
 
-       atomic_set(&cookie->usage, 1);
+       refcount_set(&cookie->ref, 1);
        atomic_set(&cookie->n_children, 0);
        cookie->debug_id = atomic_inc_return(&fscache_cookie_debug_id);
 
@@ -225,7 +225,7 @@ struct fscache_cookie *fscache_hash_cookie(struct fscache_cookie *candidate)
 
 collision:
        if (test_and_set_bit(FSCACHE_COOKIE_ACQUIRED, &cursor->flags)) {
-               trace_fscache_cookie(cursor->debug_id, atomic_read(&cursor->usage),
+               trace_fscache_cookie(cursor->debug_id, refcount_read(&cursor->ref),
                                     fscache_cookie_collision);
                pr_err("Duplicate cookie detected\n");
                fscache_print_cookie(cursor, 'O');
@@ -826,13 +826,12 @@ void __fscache_relinquish_cookie(struct fscache_cookie *cookie,
        BUG_ON(!radix_tree_empty(&cookie->stores));
 
        if (cookie->parent) {
-               ASSERTCMP(atomic_read(&cookie->parent->usage), >, 0);
+               ASSERTCMP(refcount_read(&cookie->parent->ref), >, 0);
                ASSERTCMP(atomic_read(&cookie->parent->n_children), >, 0);
                atomic_dec(&cookie->parent->n_children);
        }
 
        /* Dispose of the netfs's link to the cookie */
-       ASSERTCMP(atomic_read(&cookie->usage), >, 0);
        fscache_cookie_put(cookie, fscache_cookie_put_relinquish);
 
        _leave("");
@@ -862,18 +861,17 @@ void fscache_cookie_put(struct fscache_cookie *cookie,
                        enum fscache_cookie_trace where)
 {
        struct fscache_cookie *parent;
-       int usage;
+       int ref;
 
        _enter("%x", cookie->debug_id);
 
        do {
                unsigned int cookie_debug_id = cookie->debug_id;
-               usage = atomic_dec_return(&cookie->usage);
-               trace_fscache_cookie(cookie_debug_id, usage, where);
+               bool zero = __refcount_dec_and_test(&cookie->ref, &ref);
 
-               if (usage > 0)
+               trace_fscache_cookie(cookie_debug_id, ref - 1, where);
+               if (!zero)
                        return;
-               BUG_ON(usage < 0);
 
                parent = cookie->parent;
                fscache_unhash_cookie(cookie);
@@ -886,6 +884,19 @@ void fscache_cookie_put(struct fscache_cookie *cookie,
        _leave("");
 }
 
+/*
+ * Get a reference to a cookie.
+ */
+struct fscache_cookie *fscache_cookie_get(struct fscache_cookie *cookie,
+                                         enum fscache_cookie_trace where)
+{
+       int ref;
+
+       __refcount_inc(&cookie->ref, &ref);
+       trace_fscache_cookie(cookie->debug_id, ref + 1, where);
+       return cookie;
+}
+
 /*
  * check the consistency between the netfs inode and the backing cache
  *
@@ -1003,7 +1014,7 @@ static int fscache_cookies_seq_show(struct seq_file *m, void *v)
                   "%08x %08x %5u %5u %3u %s %03lx %-16s %px",
                   cookie->debug_id,
                   cookie->parent ? cookie->parent->debug_id : 0,
-                  atomic_read(&cookie->usage),
+                  refcount_read(&cookie->ref),
                   atomic_read(&cookie->n_children),
                   atomic_read(&cookie->n_active),
                   type,