vfs_vnops.c (30d239bc4c510432e65a84fa1c14ed67a3ab1c92) | vfs_vnops.c (397c19d1753d210247d77eb3ca33d1c7c1eb2fa9) |
---|---|
1/*- 2 * Copyright (c) 1982, 1986, 1989, 1993 3 * The Regents of the University of California. All rights reserved. 4 * (c) UNIX System Laboratories, Inc. 5 * All or some portions of this file are derived from material licensed 6 * to the University of California by American Telephone and Telegraph 7 * Co. or Unix System Laboratories, Inc. and are reproduced herein with 8 * the permission of UNIX System Laboratories, Inc. --- 474 unchanged lines hidden (view full) --- 483 struct file *fp; 484 struct uio *uio; 485 struct ucred *active_cred; 486 struct thread *td; 487 int flags; 488{ 489 struct vnode *vp; 490 int error, ioflag; | 1/*- 2 * Copyright (c) 1982, 1986, 1989, 1993 3 * The Regents of the University of California. All rights reserved. 4 * (c) UNIX System Laboratories, Inc. 5 * All or some portions of this file are derived from material licensed 6 * to the University of California by American Telephone and Telegraph 7 * Co. or Unix System Laboratories, Inc. and are reproduced herein with 8 * the permission of UNIX System Laboratories, Inc. --- 474 unchanged lines hidden (view full) --- 483 struct file *fp; 484 struct uio *uio; 485 struct ucred *active_cred; 486 struct thread *td; 487 int flags; 488{ 489 struct vnode *vp; 490 int error, ioflag; |
491 struct mtx *mtxp; |
|
491 int vfslocked; 492 493 KASSERT(uio->uio_td == td, ("uio_td %p is not td %p", 494 uio->uio_td, td)); | 492 int vfslocked; 493 494 KASSERT(uio->uio_td == td, ("uio_td %p is not td %p", 495 uio->uio_td, td)); |
496 mtxp = NULL; |
|
495 vp = fp->f_vnode; 496 ioflag = 0; 497 if (fp->f_flag & FNONBLOCK) 498 ioflag |= IO_NDELAY; 499 if (fp->f_flag & O_DIRECT) 500 ioflag |= IO_DIRECT; 501 vfslocked = VFS_LOCK_GIANT(vp->v_mount); 502 VOP_LEASE(vp, td, fp->f_cred, LEASE_READ); 503 /* 504 * According to McKusick the vn lock was protecting f_offset here. 505 * It is now protected by the FOFFSET_LOCKED flag. 506 */ 507 if ((flags & FOF_OFFSET) == 0) { | 497 vp = fp->f_vnode; 498 ioflag = 0; 499 if (fp->f_flag & FNONBLOCK) 500 ioflag |= IO_NDELAY; 501 if (fp->f_flag & O_DIRECT) 502 ioflag |= IO_DIRECT; 503 vfslocked = VFS_LOCK_GIANT(vp->v_mount); 504 VOP_LEASE(vp, td, fp->f_cred, LEASE_READ); 505 /* 506 * According to McKusick the vn lock was protecting f_offset here. 507 * It is now protected by the FOFFSET_LOCKED flag. 508 */ 509 if ((flags & FOF_OFFSET) == 0) { |
508 FILE_LOCK(fp); | 510 mtxp = mtx_pool_find(mtxpool_sleep, fp); 511 mtx_lock(mtxp); |
509 while(fp->f_vnread_flags & FOFFSET_LOCKED) { 510 fp->f_vnread_flags |= FOFFSET_LOCK_WAITING; | 512 while(fp->f_vnread_flags & FOFFSET_LOCKED) { 513 fp->f_vnread_flags |= FOFFSET_LOCK_WAITING; |
511 msleep(&fp->f_vnread_flags,fp->f_mtxp,PUSER -1,"vnread offlock",0); | 514 msleep(&fp->f_vnread_flags, mtxp, PUSER -1, 515 "vnread offlock", 0); |
512 } 513 fp->f_vnread_flags |= FOFFSET_LOCKED; | 516 } 517 fp->f_vnread_flags |= FOFFSET_LOCKED; |
514 FILE_UNLOCK(fp); | 518 mtx_unlock(mtxp); |
515 vn_lock(vp, LK_SHARED | LK_RETRY, td); 516 uio->uio_offset = fp->f_offset; 517 } else 518 vn_lock(vp, LK_SHARED | LK_RETRY, td); 519 520 ioflag |= sequential_heuristic(uio, fp); 521 522#ifdef MAC 523 error = mac_vnode_check_read(active_cred, fp->f_cred, vp); 524 if (error == 0) 525#endif 526 error = VOP_READ(vp, uio, ioflag, fp->f_cred); 527 if ((flags & FOF_OFFSET) == 0) { 528 fp->f_offset = uio->uio_offset; | 519 vn_lock(vp, LK_SHARED | LK_RETRY, td); 520 uio->uio_offset = fp->f_offset; 521 } else 522 vn_lock(vp, LK_SHARED | LK_RETRY, td); 523 524 ioflag |= sequential_heuristic(uio, fp); 525 526#ifdef MAC 527 error = mac_vnode_check_read(active_cred, fp->f_cred, vp); 528 if (error == 0) 529#endif 530 error = VOP_READ(vp, uio, ioflag, fp->f_cred); 531 if ((flags & FOF_OFFSET) == 0) { 532 fp->f_offset = uio->uio_offset; |
529 FILE_LOCK(fp); | 533 mtx_lock(mtxp); |
530 if (fp->f_vnread_flags & FOFFSET_LOCK_WAITING) 531 wakeup(&fp->f_vnread_flags); 532 fp->f_vnread_flags = 0; | 534 if (fp->f_vnread_flags & FOFFSET_LOCK_WAITING) 535 wakeup(&fp->f_vnread_flags); 536 fp->f_vnread_flags = 0; |
533 FILE_UNLOCK(fp); | 537 mtx_unlock(mtxp); |
534 } 535 fp->f_nextoff = uio->uio_offset; 536 VOP_UNLOCK(vp, 0, td); 537 VFS_UNLOCK_GIANT(vfslocked); 538 return (error); 539} 540 541/* --- 711 unchanged lines hidden --- | 538 } 539 fp->f_nextoff = uio->uio_offset; 540 VOP_UNLOCK(vp, 0, td); 541 VFS_UNLOCK_GIANT(vfslocked); 542 return (error); 543} 544 545/* --- 711 unchanged lines hidden --- |