SCCS-vsn: sys/miscfs/fdesc/fdesc_vnops.c 7.6
*
* %sccs.include.redist.c%
*
*
* %sccs.include.redist.c%
*
- * @(#)fdesc_vnops.c 7.5 (Berkeley) %G%
+ * @(#)fdesc_vnops.c 7.6 (Berkeley) %G%
*
* $Id: fdesc_vnops.c,v 1.12 1993/04/06 16:17:17 jsp Exp $
*/
*
* $Id: fdesc_vnops.c,v 1.12 1993/04/06 16:17:17 jsp Exp $
*/
struct vnode **nvpp = 0;
int error = 0;
struct vnode **nvpp = 0;
int error = 0;
/* get stashed copy of the vnode */
if (ix >= 0 && ix < FD_MAX) {
nvpp = &fdescvp[ix];
/* get stashed copy of the vnode */
if (ix >= 0 && ix < FD_MAX) {
nvpp = &fdescvp[ix];
- if (*nvpp && vget(*nvpp) == 0) {
+ if (*nvpp) {
+ if (vget(*nvpp))
+ goto loop;
VOP_UNLOCK(*nvpp);
*vpp = *nvpp;
return (error);
VOP_UNLOCK(*nvpp);
*vpp = *nvpp;
return (error);
* otherwise lock the array while we call getnewvnode
* since that can block.
*/
* otherwise lock the array while we call getnewvnode
* since that can block.
*/
- while (fdescvplock & FDL_LOCKED) {
+ if (fdescvplock & FDL_LOCKED) {
fdescvplock |= FDL_WANT;
sleep((caddr_t) &fdescvplock, PINOD);
fdescvplock |= FDL_WANT;
sleep((caddr_t) &fdescvplock, PINOD);
}
fdescvplock |= FDL_LOCKED;
}
fdescvplock |= FDL_LOCKED;