aboutsummaryrefslogtreecommitdiffstats
path: root/fs/nfs/read.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/nfs/read.c')
-rw-r--r--fs/nfs/read.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/fs/nfs/read.c b/fs/nfs/read.c
index c2e49c397a27..8b58bbf6e39e 100644
--- a/fs/nfs/read.c
+++ b/fs/nfs/read.c
@@ -65,13 +65,19 @@ struct nfs_read_data *nfs_readdata_alloc(size_t len)
65 return p; 65 return p;
66} 66}
67 67
68static void nfs_readdata_free(struct nfs_read_data *p) 68static void nfs_readdata_rcu_free(struct rcu_head *head)
69{ 69{
70 struct nfs_read_data *p = container_of(head, struct nfs_read_data, task.u.tk_rcu);
70 if (p && (p->pagevec != &p->page_array[0])) 71 if (p && (p->pagevec != &p->page_array[0]))
71 kfree(p->pagevec); 72 kfree(p->pagevec);
72 mempool_free(p, nfs_rdata_mempool); 73 mempool_free(p, nfs_rdata_mempool);
73} 74}
74 75
76static void nfs_readdata_free(struct nfs_read_data *rdata)
77{
78 call_rcu_bh(&rdata->task.u.tk_rcu, nfs_readdata_rcu_free);
79}
80
75void nfs_readdata_release(void *data) 81void nfs_readdata_release(void *data)
76{ 82{
77 nfs_readdata_free(data); 83 nfs_readdata_free(data);