*
* %sccs.include.redist.c%
*
- * @(#)lfs_subr.c 7.8 (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/mount.h>
#include <ufs/ufs/quota.h>
#include <ufs/ufs/inode.h>
-
#include <ufs/lfs/lfs.h>
#include <ufs/lfs/lfs_extern.h>
* 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;
daddr_t lbn;
int bsize, error;
- ip = VTOI(vp);
+ ip = VTOI(ap->a_vp);
fs = ip->i_lfs;
- lbn = lblkno(fs, offset);
+ lbn = lblkno(fs, ap->a_offset);
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);
}
- 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);
}
-/* 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;
- 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);
+ while (fs->lfs_seglock)
+ (void)tsleep(&fs->lfs_seglock, PRIBIO + 1, "lfs seglock", 0);
+ fs->lfs_seglock = 1;
+}
- panic("lfs_ifind: dinode %u not found", ino);
- /* NOTREACHED */
+/*
+ * lfs_segunlock --
+ * Single thread the segment writer.
+ */
+void
+lfs_segunlock(fs)
+ struct lfs *fs;
+{
+ fs->lfs_seglock = 0;
+ wakeup(&fs->lfs_seglock); /* XXX: May not be necessary. */
}