vfs_aio.c (fe0bdd1d2c2269b72e4e7fcdc0a38f359ca48eee) | vfs_aio.c (b1012d8036ca7175147f72004bb0f71153fd93f1) |
---|---|
1/*- 2 * Copyright (c) 1997 John S. Dyson. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. --- 729 unchanged lines hidden (view full) --- 738{ 739 struct ucred *td_savedcred; 740 struct thread *td; 741 struct aiocb *cb; 742 struct file *fp; 743 struct uio auio; 744 struct iovec aiov; 745 ssize_t cnt; | 1/*- 2 * Copyright (c) 1997 John S. Dyson. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. --- 729 unchanged lines hidden (view full) --- 738{ 739 struct ucred *td_savedcred; 740 struct thread *td; 741 struct aiocb *cb; 742 struct file *fp; 743 struct uio auio; 744 struct iovec aiov; 745 ssize_t cnt; |
746 long msgsnd_st, msgsnd_end; 747 long msgrcv_st, msgrcv_end; 748 long oublock_st, oublock_end; 749 long inblock_st, inblock_end; |
|
746 int error; | 750 int error; |
747 int oublock_st, oublock_end; 748 int inblock_st, inblock_end; | |
749 750 KASSERT(job->uaiocb.aio_lio_opcode == LIO_READ || 751 job->uaiocb.aio_lio_opcode == LIO_WRITE, 752 ("%s: opcode %d", __func__, job->uaiocb.aio_lio_opcode)); 753 754 aio_switch_vmspace(job); 755 td = curthread; 756 td_savedcred = td->td_ucred; --- 7 unchanged lines hidden (view full) --- 764 auio.uio_iov = &aiov; 765 auio.uio_iovcnt = 1; 766 auio.uio_offset = cb->aio_offset; 767 auio.uio_resid = cb->aio_nbytes; 768 cnt = cb->aio_nbytes; 769 auio.uio_segflg = UIO_USERSPACE; 770 auio.uio_td = td; 771 | 751 752 KASSERT(job->uaiocb.aio_lio_opcode == LIO_READ || 753 job->uaiocb.aio_lio_opcode == LIO_WRITE, 754 ("%s: opcode %d", __func__, job->uaiocb.aio_lio_opcode)); 755 756 aio_switch_vmspace(job); 757 td = curthread; 758 td_savedcred = td->td_ucred; --- 7 unchanged lines hidden (view full) --- 766 auio.uio_iov = &aiov; 767 auio.uio_iovcnt = 1; 768 auio.uio_offset = cb->aio_offset; 769 auio.uio_resid = cb->aio_nbytes; 770 cnt = cb->aio_nbytes; 771 auio.uio_segflg = UIO_USERSPACE; 772 auio.uio_td = td; 773 |
774 msgrcv_st = td->td_ru.ru_msgrcv; 775 msgsnd_st = td->td_ru.ru_msgsnd; |
|
772 inblock_st = td->td_ru.ru_inblock; 773 oublock_st = td->td_ru.ru_oublock; | 776 inblock_st = td->td_ru.ru_inblock; 777 oublock_st = td->td_ru.ru_oublock; |
778 |
|
774 /* 775 * aio_aqueue() acquires a reference to the file that is 776 * released in aio_free_entry(). 777 */ 778 if (cb->aio_lio_opcode == LIO_READ) { 779 auio.uio_rw = UIO_READ; 780 if (auio.uio_resid == 0) 781 error = 0; 782 else 783 error = fo_read(fp, &auio, fp->f_cred, FOF_OFFSET, td); 784 } else { 785 if (fp->f_type == DTYPE_VNODE) 786 bwillwrite(); 787 auio.uio_rw = UIO_WRITE; 788 error = fo_write(fp, &auio, fp->f_cred, FOF_OFFSET, td); 789 } | 779 /* 780 * aio_aqueue() acquires a reference to the file that is 781 * released in aio_free_entry(). 782 */ 783 if (cb->aio_lio_opcode == LIO_READ) { 784 auio.uio_rw = UIO_READ; 785 if (auio.uio_resid == 0) 786 error = 0; 787 else 788 error = fo_read(fp, &auio, fp->f_cred, FOF_OFFSET, td); 789 } else { 790 if (fp->f_type == DTYPE_VNODE) 791 bwillwrite(); 792 auio.uio_rw = UIO_WRITE; 793 error = fo_write(fp, &auio, fp->f_cred, FOF_OFFSET, td); 794 } |
795 msgrcv_end = td->td_ru.ru_msgrcv; 796 msgsnd_end = td->td_ru.ru_msgsnd; |
|
790 inblock_end = td->td_ru.ru_inblock; 791 oublock_end = td->td_ru.ru_oublock; 792 | 797 inblock_end = td->td_ru.ru_inblock; 798 oublock_end = td->td_ru.ru_oublock; 799 |
793 job->inputcharge = inblock_end - inblock_st; 794 job->outputcharge = oublock_end - oublock_st; | 800 job->msgrcv = msgrcv_end - msgrcv_st; 801 job->msgsnd = msgsnd_end - msgsnd_st; 802 job->inblock = inblock_end - inblock_st; 803 job->outblock = oublock_end - oublock_st; |
795 796 if ((error) && (auio.uio_resid != cnt)) { 797 if (error == ERESTART || error == EINTR || error == EWOULDBLOCK) 798 error = 0; 799 if ((error == EPIPE) && (cb->aio_lio_opcode == LIO_WRITE)) { 800 PROC_LOCK(job->userproc); 801 kern_psignal(job->userproc, SIGPIPE); 802 PROC_UNLOCK(job->userproc); --- 997 unchanged lines hidden (view full) --- 1800 if (job->ujob == ujob) 1801 break; 1802 } 1803 if (job != NULL) { 1804 MPASS(job->jobflags & KAIOCB_FINISHED); 1805 status = job->uaiocb._aiocb_private.status; 1806 error = job->uaiocb._aiocb_private.error; 1807 td->td_retval[0] = status; | 804 805 if ((error) && (auio.uio_resid != cnt)) { 806 if (error == ERESTART || error == EINTR || error == EWOULDBLOCK) 807 error = 0; 808 if ((error == EPIPE) && (cb->aio_lio_opcode == LIO_WRITE)) { 809 PROC_LOCK(job->userproc); 810 kern_psignal(job->userproc, SIGPIPE); 811 PROC_UNLOCK(job->userproc); --- 997 unchanged lines hidden (view full) --- 1809 if (job->ujob == ujob) 1810 break; 1811 } 1812 if (job != NULL) { 1813 MPASS(job->jobflags & KAIOCB_FINISHED); 1814 status = job->uaiocb._aiocb_private.status; 1815 error = job->uaiocb._aiocb_private.error; 1816 td->td_retval[0] = status; |
1808 if (job->uaiocb.aio_lio_opcode == LIO_WRITE) { 1809 td->td_ru.ru_oublock += job->outputcharge; 1810 job->outputcharge = 0; 1811 } else if (job->uaiocb.aio_lio_opcode == LIO_READ) { 1812 td->td_ru.ru_inblock += job->inputcharge; 1813 job->inputcharge = 0; 1814 } | 1817 td->td_ru.ru_oublock += job->outblock; 1818 td->td_ru.ru_inblock += job->inblock; 1819 td->td_ru.ru_msgsnd += job->msgsnd; 1820 td->td_ru.ru_msgrcv += job->msgrcv; |
1815 aio_free_entry(job); 1816 AIO_UNLOCK(ki); 1817 ops->store_error(ujob, error); 1818 ops->store_status(ujob, status); 1819 } else { 1820 error = EINVAL; 1821 AIO_UNLOCK(ki); 1822 } --- 499 unchanged lines hidden (view full) --- 2322 bp = job->bp; 2323 job->bp = NULL; 2324 nbytes = job->uaiocb.aio_nbytes - bp->bio_resid; 2325 error = 0; 2326 if (bp->bio_flags & BIO_ERROR) 2327 error = bp->bio_error; 2328 nblks = btodb(nbytes); 2329 if (job->uaiocb.aio_lio_opcode == LIO_WRITE) | 1821 aio_free_entry(job); 1822 AIO_UNLOCK(ki); 1823 ops->store_error(ujob, error); 1824 ops->store_status(ujob, status); 1825 } else { 1826 error = EINVAL; 1827 AIO_UNLOCK(ki); 1828 } --- 499 unchanged lines hidden (view full) --- 2328 bp = job->bp; 2329 job->bp = NULL; 2330 nbytes = job->uaiocb.aio_nbytes - bp->bio_resid; 2331 error = 0; 2332 if (bp->bio_flags & BIO_ERROR) 2333 error = bp->bio_error; 2334 nblks = btodb(nbytes); 2335 if (job->uaiocb.aio_lio_opcode == LIO_WRITE) |
2330 job->outputcharge += nblks; | 2336 job->outblock += nblks; |
2331 else | 2337 else |
2332 job->inputcharge += nblks; | 2338 job->inblock += nblks; |
2333 2334 if (error) 2335 aio_complete(job, -1, error); 2336 else 2337 aio_complete(job, nbytes, 0); 2338 2339 g_destroy_bio(bp); 2340} --- 49 unchanged lines hidden (view full) --- 2390 } 2391 2392 if (job != NULL) { 2393 MPASS(job->jobflags & KAIOCB_FINISHED); 2394 ujob = job->ujob; 2395 status = job->uaiocb._aiocb_private.status; 2396 error = job->uaiocb._aiocb_private.error; 2397 td->td_retval[0] = status; | 2339 2340 if (error) 2341 aio_complete(job, -1, error); 2342 else 2343 aio_complete(job, nbytes, 0); 2344 2345 g_destroy_bio(bp); 2346} --- 49 unchanged lines hidden (view full) --- 2396 } 2397 2398 if (job != NULL) { 2399 MPASS(job->jobflags & KAIOCB_FINISHED); 2400 ujob = job->ujob; 2401 status = job->uaiocb._aiocb_private.status; 2402 error = job->uaiocb._aiocb_private.error; 2403 td->td_retval[0] = status; |
2398 if (job->uaiocb.aio_lio_opcode == LIO_WRITE) { 2399 td->td_ru.ru_oublock += job->outputcharge; 2400 job->outputcharge = 0; 2401 } else if (job->uaiocb.aio_lio_opcode == LIO_READ) { 2402 td->td_ru.ru_inblock += job->inputcharge; 2403 job->inputcharge = 0; 2404 } | 2404 td->td_ru.ru_oublock += job->outblock; 2405 td->td_ru.ru_inblock += job->inblock; 2406 td->td_ru.ru_msgsnd += job->msgsnd; 2407 td->td_ru.ru_msgrcv += job->msgrcv; |
2405 aio_free_entry(job); 2406 AIO_UNLOCK(ki); 2407 ops->store_aiocb(ujobp, ujob); 2408 ops->store_error(ujob, error); 2409 ops->store_status(ujob, status); 2410 } else 2411 AIO_UNLOCK(ki); 2412 --- 544 unchanged lines hidden --- | 2408 aio_free_entry(job); 2409 AIO_UNLOCK(ki); 2410 ops->store_aiocb(ujobp, ujob); 2411 ops->store_error(ujob, error); 2412 ops->store_status(ujob, status); 2413 } else 2414 AIO_UNLOCK(ki); 2415 --- 544 unchanged lines hidden --- |