Loading fs/nfs/pagelist.c +8 −6 Original line number Diff line number Diff line Loading @@ -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; } Loading Loading @@ -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); Loading @@ -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; Loading fs/nfs/write.c +3 −3 Original line number Diff line number Diff line Loading @@ -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; } Loading Loading @@ -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; } Loading Loading @@ -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); Loading include/linux/nfs_page.h +5 −5 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 */ }; Loading Loading @@ -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) Loading @@ -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; } Loading Loading
fs/nfs/pagelist.c +8 −6 Original line number Diff line number Diff line Loading @@ -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; } Loading Loading @@ -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); Loading @@ -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; Loading
fs/nfs/write.c +3 −3 Original line number Diff line number Diff line Loading @@ -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; } Loading Loading @@ -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; } Loading Loading @@ -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); Loading
include/linux/nfs_page.h +5 −5 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 */ }; Loading Loading @@ -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) Loading @@ -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; } Loading