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