diff options
Diffstat (limited to 'fs/nfs/write.c')
-rw-r--r-- | fs/nfs/write.c | 31 |
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 | ||
61 | static void nfs_commit_rcu_free(struct rcu_head *head) | 61 | void 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 | ||
69 | void nfs_commit_free(struct nfs_write_data *wdata) | ||
70 | { | ||
71 | call_rcu_bh(&wdata->task.u.tk_rcu, nfs_commit_rcu_free); | ||
72 | } | ||
73 | |||
74 | struct nfs_write_data *nfs_writedata_alloc(unsigned int pagecount) | 68 | struct 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 | ||
95 | static void nfs_writedata_rcu_free(struct rcu_head *head) | 89 | static 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 | ||
103 | static void nfs_writedata_free(struct nfs_write_data *wdata) | 96 | void 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 | ||
108 | void 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) |
1160 | void nfs_commit_release(void *wdata) | 1152 | void 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; |