direct.c (38fd2c202a3d82bc12430bce5789fa2c2a406f71) direct.c (9811cd57f4c6b5b60ec104de68a88303717e3106)
1/*
2 * linux/fs/nfs/direct.c
3 *
4 * Copyright (C) 2003 by Chuck Lever <cel@netapp.com>
5 *
6 * High-performance uncached I/O for the Linux NFS client
7 *
8 * There are important applications whose performance or correctness

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

217out:
218 return (ssize_t) result;
219}
220
221/*
222 * Synchronous I/O uses a stack-allocated iocb. Thus we can't trust
223 * the iocb is still valid here if this is a synchronous request.
224 */
1/*
2 * linux/fs/nfs/direct.c
3 *
4 * Copyright (C) 2003 by Chuck Lever <cel@netapp.com>
5 *
6 * High-performance uncached I/O for the Linux NFS client
7 *
8 * There are important applications whose performance or correctness

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

217out:
218 return (ssize_t) result;
219}
220
221/*
222 * Synchronous I/O uses a stack-allocated iocb. Thus we can't trust
223 * the iocb is still valid here if this is a synchronous request.
224 */
225static void nfs_direct_complete(struct nfs_direct_req *dreq)
225static void nfs_direct_complete(struct nfs_direct_req *dreq, bool write)
226{
226{
227 struct inode *inode = dreq->inode;
228
227 if (dreq->iocb) {
229 if (dreq->iocb) {
230 loff_t pos = dreq->iocb->ki_pos + dreq->count;
228 long res = (long) dreq->error;
229 if (!res)
230 res = (long) dreq->count;
231 long res = (long) dreq->error;
232 if (!res)
233 res = (long) dreq->count;
234
235 if (write) {
236 spin_lock(&inode->i_lock);
237 if (i_size_read(inode) < pos)
238 i_size_write(inode, pos);
239 spin_unlock(&inode->i_lock);
240 }
241
231 aio_complete(dreq->iocb, res, 0);
232 }
233 complete_all(&dreq->completion);
234
235 nfs_direct_req_release(dreq);
236}
237
238static void nfs_direct_readpage_release(struct nfs_page *req)
239{
242 aio_complete(dreq->iocb, res, 0);
243 }
244 complete_all(&dreq->completion);
245
246 nfs_direct_req_release(dreq);
247}
248
249static void nfs_direct_readpage_release(struct nfs_page *req)
250{
240 dprintk("NFS: direct read done (%s/%lld %d@%lld)\n",
251 dprintk("NFS: direct read done (%s/%llu %d@%lld)\n",
241 req->wb_context->dentry->d_inode->i_sb->s_id,
252 req->wb_context->dentry->d_inode->i_sb->s_id,
242 (long long)NFS_FILEID(req->wb_context->dentry->d_inode),
253 (unsigned long long)NFS_FILEID(req->wb_context->dentry->d_inode),
243 req->wb_bytes,
244 (long long)req_offset(req));
245 nfs_release_request(req);
246}
247
248static void nfs_direct_read_completion(struct nfs_pgio_header *hdr)
249{
250 unsigned long bytes = 0;

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

267 if (!PageCompound(page) && bytes < hdr->good_bytes)
268 set_page_dirty(page);
269 bytes += req->wb_bytes;
270 nfs_list_remove_request(req);
271 nfs_direct_readpage_release(req);
272 }
273out_put:
274 if (put_dreq(dreq))
254 req->wb_bytes,
255 (long long)req_offset(req));
256 nfs_release_request(req);
257}
258
259static void nfs_direct_read_completion(struct nfs_pgio_header *hdr)
260{
261 unsigned long bytes = 0;

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

278 if (!PageCompound(page) && bytes < hdr->good_bytes)
279 set_page_dirty(page);
280 bytes += req->wb_bytes;
281 nfs_list_remove_request(req);
282 nfs_direct_readpage_release(req);
283 }
284out_put:
285 if (put_dreq(dreq))
275 nfs_direct_complete(dreq);
286 nfs_direct_complete(dreq, false);
276 hdr->release(hdr);
277}
278
279static void nfs_read_sync_pgio_error(struct list_head *head)
280{
281 struct nfs_page *req;
282
283 while (!list_empty(head)) {

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

429 * generic layer handle the completion.
430 */
431 if (requested_bytes == 0) {
432 nfs_direct_req_release(dreq);
433 return result < 0 ? result : -EIO;
434 }
435
436 if (put_dreq(dreq))
287 hdr->release(hdr);
288}
289
290static void nfs_read_sync_pgio_error(struct list_head *head)
291{
292 struct nfs_page *req;
293
294 while (!list_empty(head)) {

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

440 * generic layer handle the completion.
441 */
442 if (requested_bytes == 0) {
443 nfs_direct_req_release(dreq);
444 return result < 0 ? result : -EIO;
445 }
446
447 if (put_dreq(dreq))
437 nfs_direct_complete(dreq);
448 nfs_direct_complete(dreq, false);
438 return 0;
439}
440
441static ssize_t nfs_direct_read(struct kiocb *iocb, const struct iovec *iov,
442 unsigned long nr_segs, loff_t pos, bool uio)
443{
444 ssize_t result = -ENOMEM;
445 struct inode *inode = iocb->ki_filp->f_mapping->host;

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

589 case NFS_ODIRECT_DO_COMMIT:
590 nfs_direct_commit_schedule(dreq);
591 break;
592 case NFS_ODIRECT_RESCHED_WRITES:
593 nfs_direct_write_reschedule(dreq);
594 break;
595 default:
596 nfs_inode_dio_write_done(dreq->inode);
449 return 0;
450}
451
452static ssize_t nfs_direct_read(struct kiocb *iocb, const struct iovec *iov,
453 unsigned long nr_segs, loff_t pos, bool uio)
454{
455 ssize_t result = -ENOMEM;
456 struct inode *inode = iocb->ki_filp->f_mapping->host;

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

600 case NFS_ODIRECT_DO_COMMIT:
601 nfs_direct_commit_schedule(dreq);
602 break;
603 case NFS_ODIRECT_RESCHED_WRITES:
604 nfs_direct_write_reschedule(dreq);
605 break;
606 default:
607 nfs_inode_dio_write_done(dreq->inode);
597 nfs_direct_complete(dreq);
608 nfs_direct_complete(dreq, true);
598 }
599}
600
601static void nfs_direct_write_complete(struct nfs_direct_req *dreq, struct inode *inode)
602{
603 schedule_work(&dreq->work); /* Calls nfs_direct_write_schedule_work */
604}
605
606#else
607static void nfs_direct_write_schedule_work(struct work_struct *work)
608{
609}
610
611static void nfs_direct_write_complete(struct nfs_direct_req *dreq, struct inode *inode)
612{
613 nfs_inode_dio_write_done(inode);
609 }
610}
611
612static void nfs_direct_write_complete(struct nfs_direct_req *dreq, struct inode *inode)
613{
614 schedule_work(&dreq->work); /* Calls nfs_direct_write_schedule_work */
615}
616
617#else
618static void nfs_direct_write_schedule_work(struct work_struct *work)
619{
620}
621
622static void nfs_direct_write_complete(struct nfs_direct_req *dreq, struct inode *inode)
623{
624 nfs_inode_dio_write_done(inode);
614 nfs_direct_complete(dreq);
625 nfs_direct_complete(dreq, true);
615}
616#endif
617
618/*
619 * NB: Return the value of the first error return code. Subsequent
620 * errors after the first one are ignored.
621 */
622/*

--- 401 unchanged lines hidden ---
626}
627#endif
628
629/*
630 * NB: Return the value of the first error return code. Subsequent
631 * errors after the first one are ignored.
632 */
633/*

--- 401 unchanged lines hidden ---