aboutsummaryrefslogtreecommitdiffstats
path: root/fs/nfs/write.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/nfs/write.c')
-rw-r--r--fs/nfs/write.c31
1 files changed, 14 insertions, 17 deletions
diff --git a/fs/nfs/write.c b/fs/nfs/write.c
index 7be42e6eb63a..1667e3984418 100644
--- a/fs/nfs/write.c
+++ b/fs/nfs/write.c
@@ -58,19 +58,13 @@ struct nfs_write_data *nfs_commit_alloc(void)
58 return p; 58 return p;
59} 59}
60 60
61static void nfs_commit_rcu_free(struct rcu_head *head) 61void nfs_commit_free(struct nfs_write_data *p)
62{ 62{
63 struct nfs_write_data *p = container_of(head, struct nfs_write_data, task.u.tk_rcu);
64 if (p && (p->pagevec != &p->page_array[0])) 63 if (p && (p->pagevec != &p->page_array[0]))
65 kfree(p->pagevec); 64 kfree(p->pagevec);
66 mempool_free(p, nfs_commit_mempool); 65 mempool_free(p, nfs_commit_mempool);
67} 66}
68 67
69void nfs_commit_free(struct nfs_write_data *wdata)
70{
71 call_rcu_bh(&wdata->task.u.tk_rcu, nfs_commit_rcu_free);
72}
73
74struct nfs_write_data *nfs_writedata_alloc(unsigned int pagecount) 68struct nfs_write_data *nfs_writedata_alloc(unsigned int pagecount)
75{ 69{
76 struct nfs_write_data *p = mempool_alloc(nfs_wdata_mempool, GFP_NOFS); 70 struct nfs_write_data *p = mempool_alloc(nfs_wdata_mempool, GFP_NOFS);
@@ -92,21 +86,18 @@ struct nfs_write_data *nfs_writedata_alloc(unsigned int pagecount)
92 return p; 86 return p;
93} 87}
94 88
95static void nfs_writedata_rcu_free(struct rcu_head *head) 89static void nfs_writedata_free(struct nfs_write_data *p)
96{ 90{
97 struct nfs_write_data *p = container_of(head, struct nfs_write_data, task.u.tk_rcu);
98 if (p && (p->pagevec != &p->page_array[0])) 91 if (p && (p->pagevec != &p->page_array[0]))
99 kfree(p->pagevec); 92 kfree(p->pagevec);
100 mempool_free(p, nfs_wdata_mempool); 93 mempool_free(p, nfs_wdata_mempool);
101} 94}
102 95
103static void nfs_writedata_free(struct nfs_write_data *wdata) 96void nfs_writedata_release(void *data)
104{ 97{
105 call_rcu_bh(&wdata->task.u.tk_rcu, nfs_writedata_rcu_free); 98 struct nfs_write_data *wdata = data;
106}
107 99
108void nfs_writedata_release(void *wdata) 100 put_nfs_open_context(wdata->args.context);
109{
110 nfs_writedata_free(wdata); 101 nfs_writedata_free(wdata);
111} 102}
112 103
@@ -738,7 +729,7 @@ int nfs_updatepage(struct file *file, struct page *page,
738 */ 729 */
739 if (nfs_write_pageuptodate(page, inode) && 730 if (nfs_write_pageuptodate(page, inode) &&
740 inode->i_flock == NULL && 731 inode->i_flock == NULL &&
741 !(file->f_mode & O_SYNC)) { 732 !(file->f_flags & O_SYNC)) {
742 count = max(count + offset, nfs_page_length(page)); 733 count = max(count + offset, nfs_page_length(page));
743 offset = 0; 734 offset = 0;
744 } 735 }
@@ -804,6 +795,7 @@ static void nfs_write_rpcsetup(struct nfs_page *req,
804 .rpc_message = &msg, 795 .rpc_message = &msg,
805 .callback_ops = call_ops, 796 .callback_ops = call_ops,
806 .callback_data = data, 797 .callback_data = data,
798 .workqueue = nfsiod_workqueue,
807 .flags = flags, 799 .flags = flags,
808 .priority = priority, 800 .priority = priority,
809 }; 801 };
@@ -820,7 +812,7 @@ static void nfs_write_rpcsetup(struct nfs_page *req,
820 data->args.pgbase = req->wb_pgbase + offset; 812 data->args.pgbase = req->wb_pgbase + offset;
821 data->args.pages = data->pagevec; 813 data->args.pages = data->pagevec;
822 data->args.count = count; 814 data->args.count = count;
823 data->args.context = req->wb_context; 815 data->args.context = get_nfs_open_context(req->wb_context);
824 data->args.stable = NFS_UNSTABLE; 816 data->args.stable = NFS_UNSTABLE;
825 if (how & FLUSH_STABLE) { 817 if (how & FLUSH_STABLE) {
826 data->args.stable = NFS_DATA_SYNC; 818 data->args.stable = NFS_DATA_SYNC;
@@ -1157,8 +1149,11 @@ int nfs_writeback_done(struct rpc_task *task, struct nfs_write_data *data)
1157 1149
1158 1150
1159#if defined(CONFIG_NFS_V3) || defined(CONFIG_NFS_V4) 1151#if defined(CONFIG_NFS_V3) || defined(CONFIG_NFS_V4)
1160void nfs_commit_release(void *wdata) 1152void nfs_commit_release(void *data)
1161{ 1153{
1154 struct nfs_write_data *wdata = data;
1155
1156 put_nfs_open_context(wdata->args.context);
1162 nfs_commit_free(wdata); 1157 nfs_commit_free(wdata);
1163} 1158}
1164 1159
@@ -1185,6 +1180,7 @@ static void nfs_commit_rpcsetup(struct list_head *head,
1185 .rpc_message = &msg, 1180 .rpc_message = &msg,
1186 .callback_ops = &nfs_commit_ops, 1181 .callback_ops = &nfs_commit_ops,
1187 .callback_data = data, 1182 .callback_data = data,
1183 .workqueue = nfsiod_workqueue,
1188 .flags = flags, 1184 .flags = flags,
1189 .priority = priority, 1185 .priority = priority,
1190 }; 1186 };
@@ -1201,6 +1197,7 @@ static void nfs_commit_rpcsetup(struct list_head *head,
1201 /* Note: we always request a commit of the entire inode */ 1197 /* Note: we always request a commit of the entire inode */
1202 data->args.offset = 0; 1198 data->args.offset = 0;
1203 data->args.count = 0; 1199 data->args.count = 0;
1200 data->args.context = get_nfs_open_context(first->wb_context);
1204 data->res.count = 0; 1201 data->res.count = 0;
1205 data->res.fattr = &data->fattr; 1202 data->res.fattr = &data->fattr;
1206 data->res.verf = &data->verf; 1203 data->res.verf = &data->verf;