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