ceph: use kref for struct ceph_mds_request
authorSage Weil <sage@newdream.net>
Mon, 7 Dec 2009 20:31:09 +0000 (12:31 -0800)
committerSage Weil <sage@newdream.net>
Mon, 7 Dec 2009 20:31:09 +0000 (12:31 -0800)
Signed-off-by: Sage Weil <sage@newdream.net>
fs/ceph/mds_client.c
fs/ceph/mds_client.h

index 7da836909abb9dee6de0554682bdb5fccce54ac3..739093f281d0c9a010af53e09466f5413b3c2cd8 100644 (file)
@@ -400,41 +400,40 @@ static void put_request_session(struct ceph_mds_request *req)
        }
 }
 
-void ceph_mdsc_put_request(struct ceph_mds_request *req)
-{
-       dout("mdsc put_request %p %d -> %d\n", req,
-            atomic_read(&req->r_ref), atomic_read(&req->r_ref)-1);
-       if (atomic_dec_and_test(&req->r_ref)) {
-               if (req->r_request)
-                       ceph_msg_put(req->r_request);
-               if (req->r_reply) {
-                       ceph_msg_put(req->r_reply);
-                       destroy_reply_info(&req->r_reply_info);
-               }
-               if (req->r_inode) {
-                       ceph_put_cap_refs(ceph_inode(req->r_inode),
-                                         CEPH_CAP_PIN);
-                       iput(req->r_inode);
-               }
-               if (req->r_locked_dir)
-                       ceph_put_cap_refs(ceph_inode(req->r_locked_dir),
-                                         CEPH_CAP_PIN);
-               if (req->r_target_inode)
-                       iput(req->r_target_inode);
-               if (req->r_dentry)
-                       dput(req->r_dentry);
-               if (req->r_old_dentry) {
-                       ceph_put_cap_refs(
-                            ceph_inode(req->r_old_dentry->d_parent->d_inode),
-                            CEPH_CAP_PIN);
-                       dput(req->r_old_dentry);
-               }
-               kfree(req->r_path1);
-               kfree(req->r_path2);
-               put_request_session(req);
-               ceph_unreserve_caps(&req->r_caps_reservation);
-               kfree(req);
+void ceph_mdsc_release_request(struct kref *kref)
+{
+       struct ceph_mds_request *req = container_of(kref,
+                                                   struct ceph_mds_request,
+                                                   r_kref);
+       if (req->r_request)
+               ceph_msg_put(req->r_request);
+       if (req->r_reply) {
+               ceph_msg_put(req->r_reply);
+               destroy_reply_info(&req->r_reply_info);
+       }
+       if (req->r_inode) {
+               ceph_put_cap_refs(ceph_inode(req->r_inode),
+                                 CEPH_CAP_PIN);
+               iput(req->r_inode);
+       }
+       if (req->r_locked_dir)
+               ceph_put_cap_refs(ceph_inode(req->r_locked_dir),
+                                 CEPH_CAP_PIN);
+       if (req->r_target_inode)
+               iput(req->r_target_inode);
+       if (req->r_dentry)
+               dput(req->r_dentry);
+       if (req->r_old_dentry) {
+               ceph_put_cap_refs(
+                       ceph_inode(req->r_old_dentry->d_parent->d_inode),
+                       CEPH_CAP_PIN);
+               dput(req->r_old_dentry);
        }
+       kfree(req->r_path1);
+       kfree(req->r_path2);
+       put_request_session(req);
+       ceph_unreserve_caps(&req->r_caps_reservation);
+       kfree(req);
 }
 
 /*
@@ -1097,7 +1096,7 @@ ceph_mdsc_create_request(struct ceph_mds_client *mdsc, int op, int mode)
        req->r_resend_mds = -1;
        INIT_LIST_HEAD(&req->r_unsafe_dir_item);
        req->r_fmode = -1;
-       atomic_set(&req->r_ref, 1);  /* one for request_tree, one for caller */
+       kref_init(&req->r_kref);
        INIT_LIST_HEAD(&req->r_wait);
        init_completion(&req->r_completion);
        init_completion(&req->r_safe_completion);
index 9faa1b2f79a7c4d63738a4af870e7d5779512715..41af5ca316e6ee0142d5481b4209b90d4c03eabf 100644 (file)
@@ -2,6 +2,7 @@
 #define _FS_CEPH_MDS_CLIENT_H
 
 #include <linux/completion.h>
+#include <linux/kref.h>
 #include <linux/list.h>
 #include <linux/mutex.h>
 #include <linux/radix-tree.h>
@@ -203,7 +204,7 @@ struct ceph_mds_request {
        int               r_num_stale;
        int               r_resend_mds; /* mds to resend to next, if any*/
 
-       atomic_t          r_ref;
+       struct kref       r_kref;
        struct list_head  r_wait;
        struct completion r_completion;
        struct completion r_safe_completion;
@@ -306,9 +307,13 @@ extern int ceph_mdsc_do_request(struct ceph_mds_client *mdsc,
                                struct ceph_mds_request *req);
 static inline void ceph_mdsc_get_request(struct ceph_mds_request *req)
 {
-       atomic_inc(&req->r_ref);
+       kref_get(&req->r_kref);
+}
+extern void ceph_mdsc_release_request(struct kref *kref);
+static inline void ceph_mdsc_put_request(struct ceph_mds_request *req)
+{
+       kref_put(&req->r_kref, ceph_mdsc_release_request);
 }
-extern void ceph_mdsc_put_request(struct ceph_mds_request *req);
 
 extern void ceph_mdsc_pre_umount(struct ceph_mds_client *mdsc);