Date: Thu, 4 Mar 1999 17:10:01 -0800 (PST) From: John Plevyak <jplevyak@inktomi.com> To: freebsd-bugs@FreeBSD.org Subject: Re: kern/8011: libc_r does not have pread() or pwrite() interfaces Message-ID: <199903050110.RAA49007@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
The following reply was made to PR kern/8011; it has been noted by GNATS. From: John Plevyak <jplevyak@inktomi.com> To: freebsd-gnats-submit@freebsd.org, info@highwind.com Cc: Subject: Re: kern/8011: libc_r does not have pread() or pwrite() interfaces Date: Fri, 05 Mar 1999 01:09:12 +0000 pread and pwrite under FreeBSD 3.1+ also require patching vfs_vnops.c because vn_read/vn_write mess with fp->f_offset as well: Index: sys/kern/vfs_vnops.c =================================================================== RCS file: /usr/cvsroot/src/sys/kern/vfs_vnops.c,v retrieving revision 1.62 diff -c -r1.62 vfs_vnops.c *** vfs_vnops.c 1999/01/20 14:49:11 1.62 --- vfs_vnops.c 1999/03/04 16:09:40 *************** *** 284,296 **** VOP_LEASE(vp, p, cred, LEASE_READ); vn_lock(vp, LK_SHARED | LK_NOPAUSE | LK_RETRY, p); ! if (uio->uio_offset == -1) ! uio->uio_offset = fp->f_offset; ! count = uio->uio_resid; flag = 0; if (fp->f_flag & FNONBLOCK) flag |= IO_NDELAY; /* * Sequential read heuristic. * If we have been doing sequential input, --- 284,306 ---- VOP_LEASE(vp, p, cred, LEASE_READ); vn_lock(vp, LK_SHARED | LK_NOPAUSE | LK_RETRY, p); ! flag = 0; if (fp->f_flag & FNONBLOCK) flag |= IO_NDELAY; + if (uio->uio_offset != -1) { + flag = 0; + if (fp->f_flag & FNONBLOCK) + flag |= IO_NDELAY; + error = VOP_READ(vp, uio, flag, cred); + VOP_UNLOCK(vp, 0, p); + return error; + } + + uio->uio_offset = fp->f_offset; + count = uio->uio_resid; + /* * Sequential read heuristic. * If we have been doing sequential input, *************** *** 347,352 **** --- 357,367 ---- ioflag |= IO_SYNC; VOP_LEASE(vp, p, cred, LEASE_WRITE); vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, p); + if (uio->uio_offset != -1) { + error = VOP_WRITE(vp, uio, ioflag, cred); + VOP_UNLOCK(vp, 0, p); + return error; + } uio->uio_offset = fp->f_offset; count = uio->uio_resid; error = VOP_WRITE(vp, uio, ioflag, cred); To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-bugs" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199903050110.RAA49007>