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