Re: PERFORCE change 59573 for review

From: Poul-Henning Kamp (phk_at_phk.freebsd.dk)
Date: 08/13/04

  • Next message: Sam: "struct buf fields"
    To: arch@freebsd.org
    Date: Fri, 13 Aug 2004 15:53:27 +0200
    
    

    Can anybody shed light on this one ?

    In message <200408131349.i7DDnaJY086691@repoman.freebsd.org>, Poul-Henning Kamp
     writes:
    >http://perforce.freebsd.org/chv.cgi?CH=59573
    >
    >Change 59573 by phk@phk_bang on 2004/08/13 13:48:38
    >
    > Bring back the first chunk of ffs_getpages().
    >
    > FFS cannot run with straight vnode_pager_generic_getpages()
    > and I suspect that means that the first code in ffs_getpages
    > really belong in vnode_pager_generic_getpages() where other
    > filesystems would benefit as well, rather than being private
    > to FFS.
    >
    >Affected files ...
    >
    >.. //depot/user/phk/phk_bufwork/sys/ufs/ffs/ffs_vnops.c#13 edit
    >
    >Differences ...
    >
    >==== //depot/user/phk/phk_bufwork/sys/ufs/ffs/ffs_vnops.c#13 (text+ko) ====
    >
    >@@ -81,6 +81,7 @@
    > extern int ffs_rawread(struct vnode *vp, struct uio *uio, int *workdone);
    > #endif
    > static int ffs_fsync(struct vop_fsync_args *);
    >+static int ffs_getpages(struct vop_getpages_args *);
    > static int ffs_read(struct vop_read_args *);
    > static int ffs_write(struct vop_write_args *);
    > static int ffs_extread(struct vnode *vp, struct uio *uio, int ioflag);
    >@@ -100,6 +101,7 @@
    > static struct vnodeopv_entry_desc ffs_vnodeop_entries[] = {
    > { &vop_default_desc, (vop_t *) ufs_vnoperate },
    > { &vop_fsync_desc, (vop_t *) ffs_fsync },
    >+ { &vop_getpages_desc, (vop_t *) ffs_getpages },
    > { &vop_read_desc, (vop_t *) ffs_read },
    > { &vop_reallocblks_desc, (vop_t *) ffs_reallocblks },
    > { &vop_write_desc, (vop_t *) ffs_write },
    >@@ -712,6 +714,50 @@
    > }
    >
    > /*
    >+ * get page routine
    >+ */
    >+static int
    >+ffs_getpages(ap)
    >+ struct vop_getpages_args *ap;
    >+{
    >+ int i;
    >+ vm_page_t mreq;
    >+ int pcount;
    >+
    >+ GIANT_REQUIRED;
    >+
    >+ pcount = round_page(ap->a_count) / PAGE_SIZE;
    >+ mreq = ap->a_m[ap->a_reqpage];
    >+
    >+ /*
    >+ * if ANY DEV_BSIZE blocks are valid on a large filesystem block,
    >+ * then the entire page is valid. Since the page may be mapped,
    >+ * user programs might reference data beyond the actual end of file
    >+ * occuring within the page. We have to zero that data.
    >+ */
    >+ VM_OBJECT_LOCK(mreq->object);
    >+ if (mreq->valid) {
    >+ if (mreq->valid != VM_PAGE_BITS_ALL)
    >+ vm_page_zero_invalid(mreq, TRUE);
    >+ vm_page_lock_queues();
    >+ for (i = 0; i < pcount; i++) {
    >+ if (i != ap->a_reqpage) {
    >+ vm_page_free(ap->a_m[i]);
    >+ }
    >+ }
    >+ vm_page_unlock_queues();
    >+ VM_OBJECT_UNLOCK(mreq->object);
    >+ return VM_PAGER_OK;
    >+ }
    >+ VM_OBJECT_UNLOCK(mreq->object);
    >+
    >+ return vnode_pager_generic_getpages(ap->a_vp, ap->a_m,
    >+ ap->a_count,
    >+ ap->a_reqpage);
    >+}
    >+
    >+
    >+/*
    > * Extended attribute area reading.
    > */
    > static int
    >

    -- 
    Poul-Henning Kamp       | UNIX since Zilog Zeus 3.20
    phk@FreeBSD.ORG         | TCP/IP since RFC 956
    FreeBSD committer       | BSD since 4.3-tahoe    
    Never attribute to malice what can adequately be explained by incompetence.
    _______________________________________________
    freebsd-arch@freebsd.org mailing list
    http://lists.freebsd.org/mailman/listinfo/freebsd-arch
    To unsubscribe, send any mail to "freebsd-arch-unsubscribe@freebsd.org"
    

  • Next message: Sam: "struct buf fields"