read.c (fdd1e74c89fe39259a29c494209abad63ff76f82) read.c (dbae4c73f08b8a7980cc912954ade3d4c1fb6147)
1/*
2 * linux/fs/nfs/read.c
3 *
4 * Block I/O for NFS
5 *
6 * Partial copy of Linus' read cache modifications to fs/nfs/file.c
7 * modified for async RPC by okir@monad.swb.de
8 */

--- 139 unchanged lines hidden (view full) ---

148 (long long)req_offset(req));
149 nfs_clear_request(req);
150 nfs_release_request(req);
151}
152
153/*
154 * Set up the NFS read request struct
155 */
1/*
2 * linux/fs/nfs/read.c
3 *
4 * Block I/O for NFS
5 *
6 * Partial copy of Linus' read cache modifications to fs/nfs/file.c
7 * modified for async RPC by okir@monad.swb.de
8 */

--- 139 unchanged lines hidden (view full) ---

148 (long long)req_offset(req));
149 nfs_clear_request(req);
150 nfs_release_request(req);
151}
152
153/*
154 * Set up the NFS read request struct
155 */
156static void nfs_read_rpcsetup(struct nfs_page *req, struct nfs_read_data *data,
156static int nfs_read_rpcsetup(struct nfs_page *req, struct nfs_read_data *data,
157 const struct rpc_call_ops *call_ops,
158 unsigned int count, unsigned int offset)
159{
160 struct inode *inode = req->wb_context->path.dentry->d_inode;
161 int swap_flags = IS_SWAPFILE(inode) ? NFS_RPC_SWAPFLAGS : 0;
162 struct rpc_task *task;
163 struct rpc_message msg = {
164 .rpc_argp = &data->args,

--- 32 unchanged lines hidden (view full) ---

197 dprintk("NFS: %5u initiated read call (req %s/%Ld, %u bytes @ offset %Lu)\n",
198 data->task.tk_pid,
199 inode->i_sb->s_id,
200 (long long)NFS_FILEID(inode),
201 count,
202 (unsigned long long)data->args.offset);
203
204 task = rpc_run_task(&task_setup_data);
157 const struct rpc_call_ops *call_ops,
158 unsigned int count, unsigned int offset)
159{
160 struct inode *inode = req->wb_context->path.dentry->d_inode;
161 int swap_flags = IS_SWAPFILE(inode) ? NFS_RPC_SWAPFLAGS : 0;
162 struct rpc_task *task;
163 struct rpc_message msg = {
164 .rpc_argp = &data->args,

--- 32 unchanged lines hidden (view full) ---

197 dprintk("NFS: %5u initiated read call (req %s/%Ld, %u bytes @ offset %Lu)\n",
198 data->task.tk_pid,
199 inode->i_sb->s_id,
200 (long long)NFS_FILEID(inode),
201 count,
202 (unsigned long long)data->args.offset);
203
204 task = rpc_run_task(&task_setup_data);
205 if (!IS_ERR(task))
206 rpc_put_task(task);
205 if (IS_ERR(task))
206 return PTR_ERR(task);
207 rpc_put_task(task);
208 return 0;
207}
208
209static void
210nfs_async_read_error(struct list_head *head)
211{
212 struct nfs_page *req;
213
214 while (!list_empty(head)) {

--- 20 unchanged lines hidden (view full) ---

235static int nfs_pagein_multi(struct inode *inode, struct list_head *head, unsigned int npages, size_t count, int flags)
236{
237 struct nfs_page *req = nfs_list_entry(head->next);
238 struct page *page = req->wb_page;
239 struct nfs_read_data *data;
240 size_t rsize = NFS_SERVER(inode)->rsize, nbytes;
241 unsigned int offset;
242 int requests = 0;
209}
210
211static void
212nfs_async_read_error(struct list_head *head)
213{
214 struct nfs_page *req;
215
216 while (!list_empty(head)) {

--- 20 unchanged lines hidden (view full) ---

237static int nfs_pagein_multi(struct inode *inode, struct list_head *head, unsigned int npages, size_t count, int flags)
238{
239 struct nfs_page *req = nfs_list_entry(head->next);
240 struct page *page = req->wb_page;
241 struct nfs_read_data *data;
242 size_t rsize = NFS_SERVER(inode)->rsize, nbytes;
243 unsigned int offset;
244 int requests = 0;
245 int ret = 0;
243 LIST_HEAD(list);
244
245 nfs_list_remove_request(req);
246
247 nbytes = count;
248 do {
249 size_t len = min(nbytes,rsize);
250

--- 5 unchanged lines hidden (view full) ---

256 nbytes -= len;
257 } while(nbytes != 0);
258 atomic_set(&req->wb_complete, requests);
259
260 ClearPageError(page);
261 offset = 0;
262 nbytes = count;
263 do {
246 LIST_HEAD(list);
247
248 nfs_list_remove_request(req);
249
250 nbytes = count;
251 do {
252 size_t len = min(nbytes,rsize);
253

--- 5 unchanged lines hidden (view full) ---

259 nbytes -= len;
260 } while(nbytes != 0);
261 atomic_set(&req->wb_complete, requests);
262
263 ClearPageError(page);
264 offset = 0;
265 nbytes = count;
266 do {
267 int ret2;
268
264 data = list_entry(list.next, struct nfs_read_data, pages);
265 list_del_init(&data->pages);
266
267 data->pagevec[0] = page;
268
269 if (nbytes < rsize)
270 rsize = nbytes;
269 data = list_entry(list.next, struct nfs_read_data, pages);
270 list_del_init(&data->pages);
271
272 data->pagevec[0] = page;
273
274 if (nbytes < rsize)
275 rsize = nbytes;
271 nfs_read_rpcsetup(req, data, &nfs_read_partial_ops,
276 ret2 = nfs_read_rpcsetup(req, data, &nfs_read_partial_ops,
272 rsize, offset);
277 rsize, offset);
278 if (ret == 0)
279 ret = ret2;
273 offset += rsize;
274 nbytes -= rsize;
275 } while (nbytes != 0);
276
280 offset += rsize;
281 nbytes -= rsize;
282 } while (nbytes != 0);
283
277 return 0;
284 return ret;
278
279out_bad:
280 while (!list_empty(&list)) {
281 data = list_entry(list.next, struct nfs_read_data, pages);
282 list_del(&data->pages);
283 nfs_readdata_free(data);
284 }
285 SetPageError(page);
286 nfs_readpage_release(req);
287 return -ENOMEM;
288}
289
290static int nfs_pagein_one(struct inode *inode, struct list_head *head, unsigned int npages, size_t count, int flags)
291{
292 struct nfs_page *req;
293 struct page **pages;
294 struct nfs_read_data *data;
285
286out_bad:
287 while (!list_empty(&list)) {
288 data = list_entry(list.next, struct nfs_read_data, pages);
289 list_del(&data->pages);
290 nfs_readdata_free(data);
291 }
292 SetPageError(page);
293 nfs_readpage_release(req);
294 return -ENOMEM;
295}
296
297static int nfs_pagein_one(struct inode *inode, struct list_head *head, unsigned int npages, size_t count, int flags)
298{
299 struct nfs_page *req;
300 struct page **pages;
301 struct nfs_read_data *data;
302 int ret = -ENOMEM;
295
296 data = nfs_readdata_alloc(npages);
297 if (!data)
298 goto out_bad;
299
300 pages = data->pagevec;
301 while (!list_empty(head)) {
302 req = nfs_list_entry(head->next);
303 nfs_list_remove_request(req);
304 nfs_list_add_request(req, &data->pages);
305 ClearPageError(req->wb_page);
306 *pages++ = req->wb_page;
307 }
308 req = nfs_list_entry(data->pages.next);
309
303
304 data = nfs_readdata_alloc(npages);
305 if (!data)
306 goto out_bad;
307
308 pages = data->pagevec;
309 while (!list_empty(head)) {
310 req = nfs_list_entry(head->next);
311 nfs_list_remove_request(req);
312 nfs_list_add_request(req, &data->pages);
313 ClearPageError(req->wb_page);
314 *pages++ = req->wb_page;
315 }
316 req = nfs_list_entry(data->pages.next);
317
310 nfs_read_rpcsetup(req, data, &nfs_read_full_ops, count, 0);
311 return 0;
318 return nfs_read_rpcsetup(req, data, &nfs_read_full_ops, count, 0);
312out_bad:
313 nfs_async_read_error(head);
319out_bad:
320 nfs_async_read_error(head);
314 return -ENOMEM;
321 return ret;
315}
316
317/*
318 * This is the callback from RPC telling us whether a reply was
319 * received or some error occurred (timeout or socket shutdown).
320 */
321int nfs_readpage_result(struct rpc_task *task, struct nfs_read_data *data)
322{

--- 300 unchanged lines hidden ---
322}
323
324/*
325 * This is the callback from RPC telling us whether a reply was
326 * received or some error occurred (timeout or socket shutdown).
327 */
328int nfs_readpage_result(struct rpc_task *task, struct nfs_read_data *data)
329{

--- 300 unchanged lines hidden ---