kernel - ufs, ext2fs getpages/putpages cleanup
authorMatthew Dillon <dillon@apollo.backplane.com>
Wed, 20 Jan 2010 16:02:22 +0000 (08:02 -0800)
committerMatthew Dillon <dillon@apollo.backplane.com>
Wed, 20 Jan 2010 16:02:22 +0000 (08:02 -0800)
* Completely remove the original ffs_getpages/ffs_putpages code and
  remove the vfs.ffs.getpages_uses_bufcache sysctl.  UFS/FFS now
  unconditionally use vop_stdgetpages and vop_stdputpages.

* ext2fs already unconditionally calls vnode_pager_generic_getpages().
  Remove the shim and adjust ext2fs's .vop_getpages to point directly
  to vop_stdgetpages().

sys/vfs/gnu/ext2fs/ext2_vnops.c
sys/vfs/ufs/ffs_vnops.c
sys/vfs/ufs/ufs_readwrite.c

index e38235e..03d0a3f 100644 (file)
@@ -128,7 +128,6 @@ static int ext2_rmdir (struct vop_old_rmdir_args *);
 static int ext2_create (struct vop_old_create_args *);
 static int ext2_mknod (struct vop_old_mknod_args *);
 static int ext2_symlink (struct vop_old_symlink_args *);
-static int ext2_getpages (struct vop_getpages_args *);
 
 #include "ext2_readwrite.c"
 
@@ -1233,22 +1232,6 @@ bad:
        return (error);
 }
 
-/*
- * get page routine
- *
- * XXX By default, wimp out... note that a_offset is ignored (and always
- * XXX has been).
- */
-static int
-ext2_getpages(struct vop_getpages_args *ap)
-{
-       int error;
-
-       error = vnode_pager_generic_getpages(ap->a_vp, ap->a_m, ap->a_count,
-                                            ap->a_reqpage, ap->a_seqaccess);
-       return(error);
-}
-
 void
 ext2_itimes(struct vnode *vp)
 {
@@ -2076,7 +2059,7 @@ struct vop_ops ext2_vnode_vops = {
        .vop_strategy =         ext2_strategy,
        .vop_old_symlink =      ext2_symlink,
        .vop_old_whiteout =     ext2_whiteout,
-       .vop_getpages =         ext2_getpages,
+       .vop_getpages =         vop_stdgetpages,
        .vop_putpages =         vop_stdputpages
 };
 
index 5e20ff6..ab6c7a9 100644 (file)
@@ -65,7 +65,6 @@
 #include "ffs_extern.h"
 
 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 *);
 
@@ -73,7 +72,7 @@ static int    ffs_write (struct vop_write_args *);
 struct vop_ops ffs_vnode_vops = {
        .vop_default =          ufs_vnoperate,
        .vop_fsync =            ffs_fsync,
-       .vop_getpages =         ffs_getpages,
+       .vop_getpages =         vop_stdgetpages,
        .vop_putpages =         vop_stdputpages,
        .vop_read =             ffs_read,
        .vop_balloc =           ffs_balloc,
index 4467d2c..c440239 100644 (file)
@@ -59,8 +59,6 @@ extern int ffs_rawread(struct vnode *vp, struct uio *uio, int *workdone);
 #endif
 
 SYSCTL_DECL(_vfs_ffs);
-static int getpages_uses_bufcache = 1;
-SYSCTL_INT(_vfs_ffs, OID_AUTO, getpages_uses_bufcache, CTLFLAG_RW, &getpages_uses_bufcache, 0, "");
 
 /*
  * Vnode op for reading.
@@ -432,157 +430,3 @@ ffs_write(struct vop_write_args *ap)
        return (error);
 }
 
-
-/*
- * get page routine
- */
-int
-ffs_getpages(struct vop_getpages_args *ap)
-{
-       off_t foff, physoffset;
-       int i, size, bsize;
-       struct vnode *dp, *vp;
-       vm_object_t obj;
-       vm_pindex_t pindex, firstindex;
-       vm_page_t mreq;
-       int bbackwards, bforwards;
-       int pbackwards, pforwards;
-       int firstpage;
-       off_t reqoffset;
-       off_t doffset;
-       int poff;
-       int pcount;
-       int rtval;
-       int pagesperblock;
-
-       /*
-        * If set just use the system standard getpages which issues a
-        * UIO_NOCOPY VOP_READ.
-        */
-       if (getpages_uses_bufcache) {
-               return vop_stdgetpages(ap);
-       }
-
-       pcount = round_page(ap->a_count) / PAGE_SIZE;
-       mreq = ap->a_m[ap->a_reqpage];
-       firstindex = ap->a_m[0]->pindex;
-
-       /*
-        * 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.
-        */
-       if (mreq->valid) {
-               if (mreq->valid != VM_PAGE_BITS_ALL)
-                       vm_page_zero_invalid(mreq, TRUE);
-               for (i = 0; i < pcount; i++) {
-                       if (i != ap->a_reqpage) {
-                               vm_page_free(ap->a_m[i]);
-                       }
-               }
-               return VM_PAGER_OK;
-       }
-
-       vp = ap->a_vp;
-       obj = vp->v_object;
-       bsize = vp->v_mount->mnt_stat.f_iosize;
-       pindex = mreq->pindex;
-       foff = IDX_TO_OFF(pindex) /* + ap->a_offset should be zero */;
-
-       if (bsize < PAGE_SIZE)
-               return vnode_pager_generic_getpages(ap->a_vp, ap->a_m,
-                                                   ap->a_count, ap->a_reqpage,
-                                                   ap->a_seqaccess);
-
-       /*
-        * foff is the file offset of the required page
-        * reqlblkno is the logical block that contains the page
-        * poff is the bytes offset of the page in the logical block
-        */
-       poff = (int)(foff % bsize);
-       reqoffset = foff - poff;
-
-       if (VOP_BMAP(vp, reqoffset, &doffset, &bforwards, &bbackwards, BUF_CMD_READ) ||
-           doffset == NOOFFSET
-       ) {
-               for (i = 0; i < pcount; i++) {
-                       if (i != ap->a_reqpage)
-                               vm_page_free(ap->a_m[i]);
-               }
-               if (doffset == NOOFFSET) {
-                       if ((mreq->flags & PG_ZERO) == 0)
-                               vm_page_zero_fill(mreq);
-                       vm_page_undirty(mreq);
-                       mreq->valid = VM_PAGE_BITS_ALL;
-                       return VM_PAGER_OK;
-               } else {
-                       return VM_PAGER_ERROR;
-               }
-       }
-
-       physoffset = doffset + poff;
-       pagesperblock = bsize / PAGE_SIZE;
-
-       /*
-        * find the first page that is contiguous.
-        *
-        * bforwards and bbackwards are the number of contiguous bytes
-        * available before and after the block offset.  poff is the page
-        * offset, in bytes, relative to the block offset.
-        *
-        * pforwards and pbackwards are the number of contiguous pages
-        * relative to the requested page, non-inclusive of the requested
-        * page (so a pbackwards and  pforwards of 0 indicates just the
-        * requested page).
-        */
-       firstpage = 0;
-       if (ap->a_count) {
-               /*
-                * Calculate pbackwards and clean up any requested
-                * pages that are too far back.
-                */
-               pbackwards = (poff + bbackwards) >> PAGE_SHIFT;
-               if (ap->a_reqpage > pbackwards) {
-                       firstpage = ap->a_reqpage - pbackwards;
-                       for (i = 0; i < firstpage; i++)
-                               vm_page_free(ap->a_m[i]);
-               }
-
-               /*
-                * Calculate pforwards
-                */
-               pforwards = (bforwards - poff - PAGE_SIZE) >> PAGE_SHIFT;
-               if (pforwards < 0)
-                       pforwards = 0;
-               if (pforwards < (pcount - (ap->a_reqpage + 1))) {
-                       for(i = ap->a_reqpage + pforwards + 1; i < pcount; i++)
-                               vm_page_free(ap->a_m[i]);
-                       pcount = ap->a_reqpage + pforwards + 1;
-               }
-
-               /*
-                * Adjust pcount to be relative to firstpage.  All pages prior
-                * to firstpage in the array have been cleaned up.
-                */
-               pcount -= firstpage;
-       }
-
-       /*
-        * calculate the size of the transfer
-        */
-       size = pcount * PAGE_SIZE;
-
-       if ((IDX_TO_OFF(ap->a_m[firstpage]->pindex) + size) > vp->v_filesize) {
-               size = vp->v_filesize - IDX_TO_OFF(ap->a_m[firstpage]->pindex);
-       }
-
-       physoffset -= foff;
-       dp = VTOI(ap->a_vp)->i_devvp;
-       rtval = VOP_GETPAGES(dp, &ap->a_m[firstpage], size,
-                            (ap->a_reqpage - firstpage), physoffset,
-                            ap->a_seqaccess);
-
-       return (rtval);
-}
-