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 --- |