]> git.baikalelectronics.ru Git - kernel.git/commitdiff
9p: Drop kref usage
authorKent Overstreet <kent.overstreet@gmail.com>
Mon, 4 Jul 2022 01:02:49 +0000 (21:02 -0400)
committerDominique Martinet <dominique.martinet@atmark-techno.com>
Sat, 9 Jul 2022 05:38:12 +0000 (14:38 +0900)
An upcoming patch is going to require passing the client through
p9_req_put() -> p9_req_free(), but that's awkward with the kref
indirection - so this patch switches to using refcount_t directly.

Link: https://lkml.kernel.org/r/20220704014243.153050-1-kent.overstreet@gmail.com
Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
Cc: Eric Van Hensbergen <ericvh@gmail.com>
Cc: Latchesar Ionkov <lucho@ionkov.net>
Signed-off-by: Dominique Martinet <asmadeus@codewreck.org>
include/net/9p/client.h
net/9p/client.c

index 8f629f1df86542002070fd058eda29819c4a01a8..ad38325aaef0eb8742296cde0a2027abfa18c107 100644 (file)
@@ -77,7 +77,7 @@ enum p9_req_status_t {
 struct p9_req_t {
        int status;
        int t_err;
-       struct kref refcount;
+       refcount_t refcount;
        wait_queue_head_t wq;
        struct p9_fcall tc;
        struct p9_fcall rc;
@@ -228,12 +228,12 @@ struct p9_req_t *p9_tag_lookup(struct p9_client *c, u16 tag);
 
 static inline void p9_req_get(struct p9_req_t *r)
 {
-       kref_get(&r->refcount);
+       refcount_inc(&r->refcount);
 }
 
 static inline int p9_req_try_get(struct p9_req_t *r)
 {
-       return kref_get_unless_zero(&r->refcount);
+       return refcount_inc_not_zero(&r->refcount);
 }
 
 int p9_req_put(struct p9_req_t *r);
index dfe8beb864fc7f91b31c9206d02b9b474fb2bd26..3717d3f21a9f7a886056bc2c4387dd87eeea7433 100644 (file)
@@ -305,7 +305,7 @@ p9_tag_alloc(struct p9_client *c, int8_t type, unsigned int max_size)
         * callback), so p9_client_cb eats the second ref there
         * as the pointer is duplicated directly by virtqueue_add_sgs()
         */
-       refcount_set(&req->refcount.refcount, 2);
+       refcount_set(&req->refcount, 2);
 
        return req;
 
@@ -370,18 +370,15 @@ static int p9_tag_remove(struct p9_client *c, struct p9_req_t *r)
        return p9_req_put(r);
 }
 
-static void p9_req_free(struct kref *ref)
-{
-       struct p9_req_t *r = container_of(ref, struct p9_req_t, refcount);
-
-       p9_fcall_fini(&r->tc);
-       p9_fcall_fini(&r->rc);
-       kmem_cache_free(p9_req_cache, r);
-}
-
 int p9_req_put(struct p9_req_t *r)
 {
-       return kref_put(&r->refcount, p9_req_free);
+       if (refcount_dec_and_test(&r->refcount)) {
+               p9_fcall_fini(&r->tc);
+               p9_fcall_fini(&r->rc);
+               kmem_cache_free(p9_req_cache, r);
+               return 1;
+       }
+       return 0;
 }
 EXPORT_SYMBOL(p9_req_put);