Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/chs-ubc2]: src/sys Rudimentary support for LFS under UBC:
details: https://anonhg.NetBSD.org/src/rev/3e30496c8b56
branches: chs-ubc2
changeset: 471461:3e30496c8b56
user: perseant <perseant%NetBSD.org@localhost>
date: Tue Aug 31 21:03:43 1999 +0000
description:
Rudimentary support for LFS under UBC:
- LFS-specific VOP_BALLOC and VOP_PUTPAGES vnode ops.
- getblk VREG panic #ifdef'd out (can be reinstated when Ifile is
internalized and Ifile can be made another type from VREG)
- interface to VOP_PUTPAGES changed to pass all pager flags, not
just sync. FS putpages routines must know about the pager flags.
- new LFS magic disk address, -2 ("unwritten"), meaning accounted for
but not assigned to a fixed disk location (since LFS does these two
things separately, and the previous accounting method using buffer
headers no longer will work). Changed references to (foo == (daddr_t)-1)
to (foo < 0). Since disk drivers reject all addresses < 0, this should
not present a problem for other FSs.
diffstat:
sys/kern/vfs_bio.c | 4 +-
sys/kern/vnode_if.src | 4 +-
sys/miscfs/genfs/genfs_vnops.c | 11 +-
sys/nfs/nfs_bio.c | 4 +-
sys/sys/vnode_if.h | 10 +-
sys/ufs/lfs/lfs.h | 6 +-
sys/ufs/lfs/lfs_alloc.c | 4 +-
sys/ufs/lfs/lfs_balloc.c | 152 ++++++++++++++++++---
sys/ufs/lfs/lfs_bio.c | 27 +++-
sys/ufs/lfs/lfs_extern.h | 11 +-
sys/ufs/lfs/lfs_inode.c | 25 ++-
sys/ufs/lfs/lfs_segment.c | 43 ++++-
sys/ufs/lfs/lfs_syscalls.c | 4 +-
sys/ufs/lfs/lfs_vfsops.c | 4 +-
sys/ufs/lfs/lfs_vnops.c | 281 ++++++++++++++++++++++++++++++++++++++++-
sys/ufs/ufs/ufs_readwrite.c | 4 +-
sys/uvm/uvm_vnode.c | 8 +-
17 files changed, 514 insertions(+), 88 deletions(-)
diffs (truncated from 1171 to 300 lines):
diff -r fdfed2a337db -r 3e30496c8b56 sys/kern/vfs_bio.c
--- a/sys/kern/vfs_bio.c Wed Aug 11 05:47:03 1999 +0000
+++ b/sys/kern/vfs_bio.c Tue Aug 31 21:03:43 1999 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: vfs_bio.c,v 1.58.6.3 1999/07/04 01:40:43 chs Exp $ */
+/* $NetBSD: vfs_bio.c,v 1.58.6.4 1999/08/31 21:03:43 perseant Exp $ */
/*-
* Copyright (c) 1994 Christopher G. Demetriou
@@ -560,7 +560,7 @@
struct buf *bp;
int s, err;
-#ifdef DIAGNOSTIC
+#if 0 /* defined(DIAGNOSTIC) && !defined(LFS) */
if (vp->v_type == VREG && blkno >= 0) {
panic("getblk of VREG vp %p blkno 0x%x", vp, blkno);
}
diff -r fdfed2a337db -r 3e30496c8b56 sys/kern/vnode_if.src
--- a/sys/kern/vnode_if.src Wed Aug 11 05:47:03 1999 +0000
+++ b/sys/kern/vnode_if.src Tue Aug 31 21:03:43 1999 +0000
@@ -1,4 +1,4 @@
-# $NetBSD: vnode_if.src,v 1.16.4.6 1999/08/09 00:05:53 chs Exp $
+# $NetBSD: vnode_if.src,v 1.16.4.7 1999/08/31 21:03:44 perseant Exp $
#
# Copyright (c) 1992, 1993
# The Regents of the University of California. All rights reserved.
@@ -533,6 +533,6 @@
IN struct vnode *vp;
IN vm_page_t *m;
IN int count;
- IN int sync;
+ IN int flags;
IN int *rtvals;
};
diff -r fdfed2a337db -r 3e30496c8b56 sys/miscfs/genfs/genfs_vnops.c
--- a/sys/miscfs/genfs/genfs_vnops.c Wed Aug 11 05:47:03 1999 +0000
+++ b/sys/miscfs/genfs/genfs_vnops.c Tue Aug 31 21:03:43 1999 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: genfs_vnops.c,v 1.11.4.6 1999/08/09 00:05:54 chs Exp $ */
+/* $NetBSD: genfs_vnops.c,v 1.11.4.7 1999/08/31 21:03:44 perseant Exp $ */
/*
* Copyright (c) 1982, 1986, 1989, 1993
@@ -51,6 +51,7 @@
#include <vm/vm.h>
#include <uvm/uvm.h>
+#include <uvm/uvm_pager.h>
#ifdef NFSSERVER
#include <nfs/rpcv2.h>
@@ -660,7 +661,7 @@
* if this is a read access, mark the pages we zeroed PG_RDONLY.
*/
- if (blkno == (daddr_t)-1) {
+ if (blkno < 0) {
UVMHIST_LOG(ubchist, "lbn 0x%x -> HOLE", lbn,0,0,0);
sawhole = TRUE;
@@ -827,7 +828,7 @@
struct vnode *a_vp;
struct vm_page **a_m;
int a_count;
- int a_sync;
+ int a_flags;
int *a_rtvals;
} */ *ap = v;
@@ -869,7 +870,7 @@
mbp->b_bufsize = npages << PAGE_SHIFT;
mbp->b_data = kva;
mbp->b_resid = mbp->b_bcount = bytes;
- mbp->b_flags = B_BUSY|B_WRITE| (ap->a_sync ? 0 : B_CALL) |
+ mbp->b_flags = B_BUSY|B_WRITE| ((ap->a_flags & PGO_SYNCIO) ? 0 : B_CALL) |
(curproc == uvm.pagedaemon_proc ? B_PDAEMON : 0);
mbp->b_iodone = uvm_aio_biodone;
mbp->b_vp = vp;
@@ -925,7 +926,7 @@
}
}
splx(s);
- if (!ap->a_sync) {
+ if (!(ap->a_flags & PGO_SYNCIO)) {
return EINPROGRESS;
}
diff -r fdfed2a337db -r 3e30496c8b56 sys/nfs/nfs_bio.c
--- a/sys/nfs/nfs_bio.c Wed Aug 11 05:47:03 1999 +0000
+++ b/sys/nfs/nfs_bio.c Tue Aug 31 21:03:43 1999 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: nfs_bio.c,v 1.45.4.4 1999/07/31 18:47:00 chs Exp $ */
+/* $NetBSD: nfs_bio.c,v 1.45.4.5 1999/08/31 21:03:44 perseant Exp $ */
/*
* Copyright (c) 1989, 1993
@@ -1389,7 +1389,7 @@
struct vnode *a_vp;
vm_page_t *a_m;
int a_count;
- int a_sync;
+ int a_flags;
int *a_rtvals;
} */ *ap = v;
diff -r fdfed2a337db -r 3e30496c8b56 sys/sys/vnode_if.h
--- a/sys/sys/vnode_if.h Wed Aug 11 05:47:03 1999 +0000
+++ b/sys/sys/vnode_if.h Tue Aug 31 21:03:43 1999 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: vnode_if.h,v 1.15.4.6 1999/08/09 00:05:54 chs Exp $ */
+/* $NetBSD: vnode_if.h,v 1.15.4.7 1999/08/31 21:03:45 perseant Exp $ */
/*
* Warning: This file is generated automatically.
@@ -1113,17 +1113,17 @@
struct vnode *a_vp;
vm_page_t *a_m;
int a_count;
- int a_sync;
+ int a_flags;
int *a_rtvals;
};
extern struct vnodeop_desc vop_putpages_desc;
static __inline int VOP_PUTPAGES __P((struct vnode *, vm_page_t *, int, int,
int *)) __attribute__((__unused__));
-static __inline int VOP_PUTPAGES(vp, m, count, sync, rtvals)
+static __inline int VOP_PUTPAGES(vp, m, count, flags, rtvals)
struct vnode *vp;
vm_page_t *m;
int count;
- int sync;
+ int flags;
int *rtvals;
{
struct vop_putpages_args a;
@@ -1131,7 +1131,7 @@
a.a_vp = vp;
a.a_m = m;
a.a_count = count;
- a.a_sync = sync;
+ a.a_flags = flags;
a.a_rtvals = rtvals;
return (VCALL(vp, VOFFSET(vop_putpages), &a));
}
diff -r fdfed2a337db -r 3e30496c8b56 sys/ufs/lfs/lfs.h
--- a/sys/ufs/lfs/lfs.h Wed Aug 11 05:47:03 1999 +0000
+++ b/sys/ufs/lfs/lfs.h Tue Aug 31 21:03:43 1999 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: lfs.h,v 1.14.4.1 1999/06/21 01:31:06 thorpej Exp $ */
+/* $NetBSD: lfs.h,v 1.14.4.2 1999/08/31 21:03:45 perseant Exp $ */
/*-
* Copyright (c) 1999 The NetBSD Foundation, Inc.
@@ -334,8 +334,10 @@
#define D_INDIR(fs) (S_INDIR(fs) - NINDIR(fs) - 1)
#define T_INDIR(fs) (D_INDIR(fs) - NINDIR(fs) * NINDIR(fs) - 1)
-/* Unassigned disk address. */
+/* Unassigned disk address (not accounted, not assigned). */
#define UNASSIGNED -1
+/* Accounted but unassigned disk address */
+#define UNWRITTEN -2
/* Unused logical block number */
#define LFS_UNUSED_LBN -1
diff -r fdfed2a337db -r 3e30496c8b56 sys/ufs/lfs/lfs_alloc.c
--- a/sys/ufs/lfs/lfs_alloc.c Wed Aug 11 05:47:03 1999 +0000
+++ b/sys/ufs/lfs/lfs_alloc.c Tue Aug 31 21:03:43 1999 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: lfs_alloc.c,v 1.18.2.2.2.3 1999/08/02 22:57:34 thorpej Exp $ */
+/* $NetBSD: lfs_alloc.c,v 1.18.2.2.2.4 1999/08/31 21:03:45 perseant Exp $ */
/*-
* Copyright (c) 1999 The NetBSD Foundation, Inc.
@@ -158,7 +158,7 @@
VOP_LOCK(vp,LK_EXCLUSIVE);
ip = VTOI(vp);
blkno = lblkno(fs, ip->i_ffs_size);
- lfs_balloc(vp, 0, fs->lfs_bsize, blkno, &bp);
+ lfs_balloc1(vp, 0, fs->lfs_bsize, blkno, &bp);
ip->i_ffs_size += fs->lfs_bsize;
uvm_vnp_setsize(vp, ip->i_ffs_size);
diff -r fdfed2a337db -r 3e30496c8b56 sys/ufs/lfs/lfs_balloc.c
--- a/sys/ufs/lfs/lfs_balloc.c Wed Aug 11 05:47:03 1999 +0000
+++ b/sys/ufs/lfs/lfs_balloc.c Tue Aug 31 21:03:43 1999 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: lfs_balloc.c,v 1.12.4.2 1999/07/04 01:54:05 chs Exp $ */
+/* $NetBSD: lfs_balloc.c,v 1.12.4.3 1999/08/31 21:03:45 perseant Exp $ */
/*-
* Copyright (c) 1999 The NetBSD Foundation, Inc.
@@ -98,8 +98,68 @@
int lfs_fragextend __P((struct vnode *, int, int, ufs_daddr_t, struct buf **));
+/*
+ * Balloc defines the structure of file system storage
+ * by allocating the physical blocks on a device given
+ * the inode and the logical block number in a file.
+ */
+
int
-lfs_balloc(vp, offset, iosize, lbn, bpp)
+lfs_balloc(v)
+ void *v;
+{
+ struct vop_balloc_args /* {
+ struct vnode *a_vp;
+ off_t a_offset;
+ off_t a_length;
+ struct ucred *a_cred;
+ int a_flags;
+ } */ *ap = v;
+
+ off_t off, len;
+ struct vnode *vp = ap->a_vp;
+ struct inode *ip = VTOI(vp);
+ struct lfs *fs = ip->i_lfs;
+ int error, delta, bshift, bsize;
+
+ bshift = fs->lfs_bshift;
+ bsize = 1 << bshift;
+
+ off = ap->a_offset;
+ len = ap->a_length;
+
+ delta = off & (bsize - 1);
+ off -= delta;
+ len += delta;
+
+ while (len > 0) {
+ bsize = min(bsize, len);
+
+ if ((error = lfs_balloc1(vp, blkoff(fs,off), bsize,
+ lblkno(fs, off), NULL))) {
+ return error;
+ }
+
+ /*
+ * increase file size now, VOP_BALLOC() requires that
+ * EOF be up-to-date before each call.
+ */
+
+ if (ip->i_ffs_size < off + bsize) {
+ ip->i_ffs_size = off + bsize;
+ if (vp->v_uvm.u_size < ip->i_ffs_size) {
+ uvm_vnp_setsize(vp, ip->i_ffs_size);
+ }
+ }
+
+ off += bsize;
+ len -= bsize;
+ }
+ return 0;
+}
+
+int
+lfs_balloc1(vp, offset, iosize, lbn, bpp)
struct vnode *vp;
int offset;
u_long iosize;
@@ -109,13 +169,16 @@
struct buf *ibp, *bp;
struct inode *ip;
struct lfs *fs;
- struct indir indirs[NIADDR+2];
+ struct indir *ap, indirs[NIADDR+2];
ufs_daddr_t daddr, lastblock;
int bb; /* number of disk blocks in a block disk blocks */
int error, frags, i, nsize, osize, num;
ip = VTOI(vp);
fs = ip->i_lfs;
+
+ /* XXX printf("lfs_balloc1(%p,%d,%ld,%x,%p)\n",
+ vp, offset, iosize, lbn, bpp); */
#ifdef DEBUG
if(!VOP_ISLOCKED(vp)) {
@@ -149,7 +212,7 @@
osize = blksize(fs, ip, lastblock);
if (osize < fs->lfs_bsize && osize > 0) {
if ((error = lfs_fragextend(vp, osize, fs->lfs_bsize,
- lastblock, &bp)))
+ lastblock, (bpp ? &bp : NULL))))
return(error);
ip->i_ffs_size = (lastblock + 1) * fs->lfs_bsize;
uvm_vnp_setsize(vp, ip->i_ffs_size);
@@ -159,9 +222,9 @@
}
bb = VFSTOUFS(vp->v_mount)->um_seqinc;
- if (daddr == UNASSIGNED)
+ if (daddr == UNASSIGNED) {
/* May need to allocate indirect blocks */
- for (i = 1; i < num; ++i)
+ for (i = 1; i < num; ++i) {
if (!indirs[i].in_exists) {
Home |
Main Index |
Thread Index |
Old Index