NFS: Convert struct nfs_page to use krefs
authorTrond Myklebust <Trond.Myklebust@netapp.com>
Sun, 17 Jun 2007 17:26:38 +0000 (13:26 -0400)
committerTrond Myklebust <Trond.Myklebust@netapp.com>
Wed, 11 Jul 2007 03:40:26 +0000 (23:40 -0400)
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
fs/nfs/pagelist.c
fs/nfs/write.c
include/linux/nfs_page.h

index f8a4ba5..257a7f8 100644 (file)
@@ -85,9 +85,8 @@ nfs_create_request(struct nfs_open_context *ctx, struct inode *inode,
        req->wb_offset  = offset;
        req->wb_pgbase  = offset;
        req->wb_bytes   = count;
-       atomic_set(&req->wb_count, 1);
        req->wb_context = get_nfs_open_context(ctx);
-
+       kref_init(&req->wb_kref);
        return req;
 }
 
@@ -160,11 +159,9 @@ void nfs_clear_request(struct nfs_page *req)
  *
  * Note: Should never be called with the spinlock held!
  */
-void
-nfs_release_request(struct nfs_page *req)
+static void nfs_free_request(struct kref *kref)
 {
-       if (!atomic_dec_and_test(&req->wb_count))
-               return;
+       struct nfs_page *req = container_of(kref, struct nfs_page, wb_kref);
 
        /* Release struct file or cached credential */
        nfs_clear_request(req);
@@ -172,6 +169,11 @@ nfs_release_request(struct nfs_page *req)
        nfs_page_free(req);
 }
 
+void nfs_release_request(struct nfs_page *req)
+{
+       kref_put(&req->wb_kref, nfs_free_request);
+}
+
 static int nfs_wait_bit_interruptible(void *word)
 {
        int ret = 0;
index 9e7c21d..e940432 100644 (file)
@@ -117,7 +117,7 @@ static struct nfs_page *nfs_page_find_request_locked(struct page *page)
        if (PagePrivate(page)) {
                req = (struct nfs_page *)page_private(page);
                if (req != NULL)
-                       atomic_inc(&req->wb_count);
+                       kref_get(&req->wb_kref);
        }
        return req;
 }
@@ -398,7 +398,7 @@ static int nfs_inode_add_request(struct inode *inode, struct nfs_page *req)
        if (PageDirty(req->wb_page))
                set_bit(PG_NEED_FLUSH, &req->wb_flags);
        nfsi->npages++;
-       atomic_inc(&req->wb_count);
+       kref_get(&req->wb_kref);
        return 0;
 }
 
@@ -531,7 +531,7 @@ static int nfs_wait_on_requests_locked(struct inode *inode, pgoff_t idx_start, u
                next = req->wb_index + 1;
                BUG_ON(!NFS_WBACK_BUSY(req));
 
-               atomic_inc(&req->wb_count);
+               kref_get(&req->wb_kref);
                spin_unlock(&nfsi->req_lock);
                error = nfs_wait_on_request(req);
                nfs_release_request(req);
index bd193af..c780e7e 100644 (file)
@@ -16,7 +16,7 @@
 #include <linux/sunrpc/auth.h>
 #include <linux/nfs_xdr.h>
 
-#include <asm/atomic.h>
+#include <linux/kref.h>
 
 /*
  * Valid flags for the radix tree
@@ -42,7 +42,7 @@ struct nfs_page {
        unsigned int            wb_offset,      /* Offset & ~PAGE_CACHE_MASK */
                                wb_pgbase,      /* Start of page data */
                                wb_bytes;       /* Length of request */
-       atomic_t                wb_count;       /* reference count */
+       struct kref             wb_kref;        /* reference count */
        unsigned long           wb_flags;
        struct nfs_writeverf    wb_verf;        /* Commit cookie */
 };
@@ -89,7 +89,7 @@ extern  void nfs_clear_page_writeback(struct nfs_page *req);
 
 
 /*
- * Lock the page of an asynchronous request without incrementing the wb_count
+ * Lock the page of an asynchronous request without getting a new reference
  */
 static inline int
 nfs_lock_request_dontget(struct nfs_page *req)
@@ -98,14 +98,14 @@ nfs_lock_request_dontget(struct nfs_page *req)
 }
 
 /*
- * Lock the page of an asynchronous request
+ * Lock the page of an asynchronous request and take a reference
  */
 static inline int
 nfs_lock_request(struct nfs_page *req)
 {
        if (test_and_set_bit(PG_BUSY, &req->wb_flags))
                return 0;
-       atomic_inc(&req->wb_count);
+       kref_get(&req->wb_kref);
        return 1;
 }