svn commit: r308556 - stable/11/sys/fs/cd9660
Konstantin Belousov
kib at FreeBSD.org
Fri Nov 11 20:27:01 UTC 2016
Author: kib
Date: Fri Nov 11 20:27:00 2016
New Revision: 308556
URL: https://svnweb.freebsd.org/changeset/base/308556
Log:
MFC r308028:
Use buffer pager for cd9660.
For now, on stable/11, default is to use generic getpages() as before.
Modified:
stable/11/sys/fs/cd9660/cd9660_vnops.c
Directory Properties:
stable/11/ (props changed)
Modified: stable/11/sys/fs/cd9660/cd9660_vnops.c
==============================================================================
--- stable/11/sys/fs/cd9660/cd9660_vnops.c Fri Nov 11 20:24:54 2016 (r308555)
+++ stable/11/sys/fs/cd9660/cd9660_vnops.c Fri Nov 11 20:27:00 2016 (r308556)
@@ -51,6 +51,7 @@ __FBSDID("$FreeBSD$");
#include <sys/dirent.h>
#include <sys/unistd.h>
#include <sys/filio.h>
+#include <sys/sysctl.h>
#include <vm/vm.h>
#include <vm/vnode_pager.h>
@@ -74,6 +75,7 @@ static vop_readdir_t cd9660_readdir;
static vop_readlink_t cd9660_readlink;
static vop_strategy_t cd9660_strategy;
static vop_vptofh_t cd9660_vptofh;
+static vop_getpages_t cd9660_getpages;
/*
* Setattr call. Only allowed for block and character special devices.
@@ -836,6 +838,45 @@ cd9660_vptofh(ap)
return (0);
}
+SYSCTL_NODE(_vfs, OID_AUTO, cd9660, CTLFLAG_RW, 0, "cd9660 filesystem");
+static int use_buf_pager = 0;
+SYSCTL_INT(_vfs_cd9660, OID_AUTO, use_buf_pager, CTLFLAG_RWTUN,
+ &use_buf_pager, 0,
+ "Use buffer pager instead of bmap");
+
+static daddr_t
+cd9660_gbp_getblkno(struct vnode *vp, vm_ooffset_t off)
+{
+
+ return (lblkno(VTOI(vp)->i_mnt, off));
+}
+
+static int
+cd9660_gbp_getblksz(struct vnode *vp, daddr_t lbn)
+{
+ struct iso_node *ip;
+
+ ip = VTOI(vp);
+ return (blksize(ip->i_mnt, ip, lbn));
+}
+
+static int
+cd9660_getpages(struct vop_getpages_args *ap)
+{
+ struct vnode *vp;
+
+ vp = ap->a_vp;
+ if (vp->v_type == VCHR || vp->v_type == VBLK)
+ return (EOPNOTSUPP);
+
+ if (use_buf_pager)
+ return (vfs_bio_getpages(vp, ap->a_m, ap->a_count,
+ ap->a_rbehind, ap->a_rahead, cd9660_gbp_getblkno,
+ cd9660_gbp_getblksz));
+ return (vnode_pager_generic_getpages(vp, ap->a_m, ap->a_count,
+ ap->a_rbehind, ap->a_rahead, NULL, NULL));
+}
+
/*
* Global vfs data structures for cd9660
*/
@@ -857,6 +898,7 @@ struct vop_vector cd9660_vnodeops = {
.vop_setattr = cd9660_setattr,
.vop_strategy = cd9660_strategy,
.vop_vptofh = cd9660_vptofh,
+ .vop_getpages = cd9660_getpages,
};
/*
More information about the svn-src-all
mailing list