update for 4.4BSD-Lite (from mycroft)
[unix-history] / usr / src / sys / isofs / cd9660 / cd9660_vnops.c
index be74890..e2e3eee 100644 (file)
@@ -9,7 +9,7 @@
  *
  * %sccs.include.redist.c%
  *
  *
  * %sccs.include.redist.c%
  *
- *     @(#)cd9660_vnops.c      8.6 (Berkeley) %G%
+ *     @(#)cd9660_vnops.c      8.8 (Berkeley) %G%
  */
 
 #include <sys/param.h>
  */
 
 #include <sys/param.h>
@@ -256,7 +256,7 @@ cd9660_read(ap)
                return (0);
        if (uio->uio_offset < 0)
                return (EINVAL);
                return (0);
        if (uio->uio_offset < 0)
                return (EINVAL);
-       ip->i_flag |= IACC;
+       ip->i_flag |= IN_ACCESS;
        imp = ip->i_mnt;
        do {
                lbn = iso_lblkno(imp, uio->uio_offset);
        imp = ip->i_mnt;
        do {
                lbn = iso_lblkno(imp, uio->uio_offset);
@@ -473,8 +473,6 @@ iso_shipdir(idp)
 
 /*
  * Vnode op for readdir
 
 /*
  * Vnode op for readdir
- * XXX make sure everything still works now that eofflagp and cookies
- * are no longer args.
  */
 int
 cd9660_readdir(ap)
  */
 int
 cd9660_readdir(ap)
@@ -502,9 +500,14 @@ cd9660_readdir(ap)
        ip = VTOI(ap->a_vp);
        imp = ip->i_mnt;
        
        ip = VTOI(ap->a_vp);
        imp = ip->i_mnt;
        
-       MALLOC(idp,struct isoreaddir *,sizeof(*idp),M_TEMP,M_WAITOK);
-       idp->saveent.d_namlen = 0;
-       idp->assocent.d_namlen = 0;
+       MALLOC(idp, struct isoreaddir *, sizeof(*idp), M_TEMP, M_WAITOK);
+       idp->saveent.d_namlen = idp->assocent.d_namlen = 0;
+       /*
+        * XXX
+        * Is it worth trying to figure out the type?
+        */
+       idp->saveent.d_type = idp->assocent.d_type = idp->current.d_type =
+           DT_UNKNOWN;
        idp->uio = uio;
        idp->eofflag = 1;
        idp->cookies = ap->a_cookies;
        idp->uio = uio;
        idp->eofflag = 1;
        idp->cookies = ap->a_cookies;
@@ -749,9 +752,42 @@ cd9660_lock(ap)
                struct vnode *a_vp;
        } */ *ap;
 {
                struct vnode *a_vp;
        } */ *ap;
 {
-       register struct iso_node *ip = VTOI(ap->a_vp);
+       register struct vnode *vp = ap->a_vp;
+       register struct iso_node *ip;
+       struct proc *p = curproc;       /* XXX */
 
 
-       ISO_ILOCK(ip);
+start:
+       while (vp->v_flag & VXLOCK) {
+               vp->v_flag |= VXWANT;
+               sleep((caddr_t)vp, PINOD);
+       }
+       if (vp->v_tag == VT_NON)
+               return (ENOENT);
+       ip = VTOI(vp);
+       if (ip->i_flag & IN_LOCKED) {
+               ip->i_flag |= IN_WANTED;
+#ifdef DIAGNOSTIC
+               if (p) {
+                       if (p->p_pid == ip->i_lockholder)
+                               panic("locking against myself");
+                       ip->i_lockwaiter = p->p_pid;
+               } else
+                       ip->i_lockwaiter = -1;
+#endif
+               (void) sleep((caddr_t)ip, PINOD);
+       }
+#ifdef DIAGNOSTIC
+       ip->i_lockwaiter = 0;
+       if (ip->i_lockholder != 0)
+               panic("lockholder (%d) != 0", ip->i_lockholder);
+       if (p && p->p_pid == 0)
+               printf("locking by process 0\n");
+       if (p)
+               ip->i_lockholder = p->p_pid;
+       else
+               ip->i_lockholder = -1;
+#endif
+       ip->i_flag |= IN_LOCKED;
        return (0);
 }
 
        return (0);
 }
 
@@ -765,10 +801,24 @@ cd9660_unlock(ap)
        } */ *ap;
 {
        register struct iso_node *ip = VTOI(ap->a_vp);
        } */ *ap;
 {
        register struct iso_node *ip = VTOI(ap->a_vp);
+       struct proc *p = curproc;       /* XXX */
 
 
-       if (!(ip->i_flag & ILOCKED))
-               panic("cd9660_unlock NOT LOCKED");
-       ISO_IUNLOCK(ip);
+#ifdef DIAGNOSTIC
+       if ((ip->i_flag & IN_LOCKED) == 0) {
+               vprint("ufs_unlock: unlocked inode", ap->a_vp);
+               panic("ufs_unlock NOT LOCKED");
+       }
+       if (p && p->p_pid != ip->i_lockholder && p->p_pid > -1 &&
+           ip->i_lockholder > -1/* && lockcount++ < 100*/)
+               panic("unlocker (%d) != lock holder (%d)",
+                   p->p_pid, ip->i_lockholder);
+       ip->i_lockholder = 0;
+#endif
+       ip->i_flag &= ~IN_LOCKED;
+       if (ip->i_flag & IN_WANTED) {
+               ip->i_flag &= ~IN_WANTED;
+               wakeup((caddr_t)ip);
+       }
        return (0);
 }
 
        return (0);
 }
 
@@ -782,7 +832,7 @@ cd9660_islocked(ap)
        } */ *ap;
 {
 
        } */ *ap;
 {
 
-       if (VTOI(ap->a_vp)->i_flag & ILOCKED)
+       if (VTOI(ap->a_vp)->i_flag & IN_LOCKED)
                return (1);
        return (0);
 }
                return (1);
        return (0);
 }