describe ap (Kirk); delete lfs_mntinvalbuf, lfs_vinvalbuf, add
[unix-history] / usr / src / sys / ufs / lfs / lfs_subr.c
index e8bc0d3..4e4d98c 100644 (file)
@@ -4,17 +4,17 @@
  *
  * %sccs.include.redist.c%
  *
  *
  * %sccs.include.redist.c%
  *
- *     @(#)lfs_subr.c  7.5 (Berkeley) %G%
+ *     @(#)lfs_subr.c  7.13 (Berkeley) %G%
  */
 
 #include <sys/param.h>
 #include <sys/namei.h>
 #include <sys/vnode.h>
 #include <sys/buf.h>
  */
 
 #include <sys/param.h>
 #include <sys/namei.h>
 #include <sys/vnode.h>
 #include <sys/buf.h>
+#include <sys/mount.h>
 
 #include <ufs/ufs/quota.h>
 #include <ufs/ufs/inode.h>
 
 #include <ufs/ufs/quota.h>
 #include <ufs/ufs/inode.h>
-
 #include <ufs/lfs/lfs.h>
 #include <ufs/lfs/lfs_extern.h>
 
 #include <ufs/lfs/lfs.h>
 #include <ufs/lfs/lfs_extern.h>
 
  * remaining space in the directory.
  */
 int
  * remaining space in the directory.
  */
 int
-lfs_blkatoff(vp, offset, res, bpp)
-       struct vnode *vp;
-       off_t offset;
-       char **res;
-       struct buf **bpp;
+lfs_blkatoff(ap)
+       struct vop_blkatoff_args /* {
+               struct vnode *a_vp;
+               off_t a_offset;
+               char **a_res;
+               struct buf **a_bpp;
+       } */ *ap;
 {
        register struct lfs *fs;
        struct inode *ip;
 {
        register struct lfs *fs;
        struct inode *ip;
@@ -36,61 +38,43 @@ lfs_blkatoff(vp, offset, res, bpp)
        daddr_t lbn;
        int bsize, error;
 
        daddr_t lbn;
        int bsize, error;
 
-       ip = VTOI(vp);
+       ip = VTOI(ap->a_vp);
        fs = ip->i_lfs;
        fs = ip->i_lfs;
-       lbn = lblkno(fs, offset);
+       lbn = lblkno(fs, ap->a_offset);
        bsize = blksize(fs);
 
        bsize = blksize(fs);
 
-       *bpp = NULL;
-       if (error = bread(vp, lbn, bsize, NOCRED, &bp)) {
+       *ap->a_bpp = NULL;
+       if (error = bread(ap->a_vp, lbn, bsize, NOCRED, &bp)) {
                brelse(bp);
                return (error);
        }
                brelse(bp);
                return (error);
        }
-       if (res)
-               *res = bp->b_un.b_addr + blkoff(fs, offset);
-       *bpp = bp;
+       if (ap->a_res)
+               *ap->a_res = bp->b_un.b_addr + blkoff(fs, ap->a_offset);
+       *ap->a_bpp = bp;
        return (0);
 }
 
        return (0);
 }
 
-/* Search a block for a specific dinode. */
-DINODE *
-lfs_ifind(fs, ino, page)
+/*
+ * lfs_seglock --
+ *     Single thread the segment writer.
+ */
+void
+lfs_seglock(fs)
        struct lfs *fs;
        struct lfs *fs;
-       ino_t ino;
-       void *page;
 {
 {
-       register DINODE *dip;
-       register int cnt;
-
-#ifdef VERBOSE
-       printf("lfs_ifind: inode %d\n", ino);
-#endif
-       dip = page;
-       for (cnt = INOPB(fs); cnt--; ++dip)
-               if (dip->di_inum == ino)
-                       return (dip);
-
-       panic("lfs_ifind: dinode %u not found", ino);
-       /* NOTREACHED */
+       while (fs->lfs_seglock)
+               (void)tsleep(&fs->lfs_seglock, PRIBIO + 1, "lfs seglock", 0);
+       fs->lfs_seglock = 1;
 }
 
 }
 
-daddr_t
-lfs_itod(fs, ino)
+/*
+ * lfs_segunlock --
+ *     Single thread the segment writer.
+ */
+void
+lfs_segunlock(fs)
        struct lfs *fs;
        struct lfs *fs;
-       ino_t ino;
 {
 {
-       BUF *bp;
-       IFILE *ifp;
-       daddr_t iaddr;
-
-#ifdef VERBOSE
-       printf("lfs_itod %d\n", ino);
-#endif
-       /* Translate an inode number to a disk address. */
-       LFS_IENTRY(ifp, fs, ino, bp);
-       if (ifp->if_daddr == LFS_UNUSED_DADDR)
-               panic("lfs_itod: unused disk address");
-       iaddr = ifp->if_daddr;
-       LFS_IRELEASE(fs, bp);
-       return (iaddr);
+       fs->lfs_seglock = 0;
+       wakeup(&fs->lfs_seglock);       /* XXX: May not be necessary. */
 }
 }