Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 25 Nov 2012 15:01:12 +0000 (UTC)
From:      Andriy Gapon <avg@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r243518 - head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs
Message-ID:  <201211251501.qAPF1CKS079555@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: avg
Date: Sun Nov 25 15:01:12 2012
New Revision: 243518
URL: http://svnweb.freebsd.org/changeset/base/243518

Log:
  add zfs_bmap to aid vnode_pager_haspage
  
  ... otherwise zfs_getpages would mostly be called with one page at a time.
  
  It is expected that ZFS VOP_BMAP is only called from vnode_pager_haspage.
  Since ZFS files can have variable block sizes and also because we don't
  really know if any given blocks are consecutive, we can not really report
  any additional blocks behind or ahead of a given block.  Since physical
  block numbers do not make sense for ZFS, we do not do any real translation
  and thus pass back blk = lblk.  The net effect is that vnode_pager_haspage
  knows that the block exists and that the pages backed by the block can be
  accessed.  vnode_pager_haspage may be wrong about the exact count of the
  pages backed by the block, because of a variable block size, which
  vnode_pager_haspage doesn't really know - it only knows max block size in
  a filesystem.  So pages from multiple blocks can be passed to zfs_getpages,
  but that is expected and correctly handled.
  
  vnode_pager should not call zfs_bmap for any other reason, because ZFS
  implements VOP_PUTPAGES and thus vnode_pager_generic_getpages is not used.
  
  vfs_cluster code vfs_bio code should not be called for ZFS, because ZFS does
  not use buffer cache layer.
  
  Also, ZFS does not use vn_bmap_seekhole, it has its prviate mechanism for
  working with holes.
  
  The above list should cover all the current calls to VOP_BMAP.
  
  Reviewed by:	kib
  MFC after:	6 weeks

Modified:
  head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c

Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c
==============================================================================
--- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c	Sun Nov 25 14:53:26 2012	(r243517)
+++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c	Sun Nov 25 15:01:12 2012	(r243518)
@@ -5702,6 +5702,30 @@ zfs_freebsd_getpages(ap)
 }
 
 static int
+zfs_freebsd_bmap(ap)
+	struct vop_bmap_args /* {
+		struct vnode *a_vp;
+		daddr_t  a_bn;
+		struct bufobj **a_bop;
+		daddr_t *a_bnp;
+		int *a_runp;
+		int *a_runb;
+	} */ *ap;
+{
+
+	if (ap->a_bop != NULL)
+		*ap->a_bop = &ap->a_vp->v_bufobj;
+	if (ap->a_bnp != NULL)
+		*ap->a_bnp = ap->a_bn;
+	if (ap->a_runp != NULL)
+		*ap->a_runp = 0;
+	if (ap->a_runb != NULL)
+		*ap->a_runb = 0;
+
+	return (0);
+}
+
+static int
 zfs_freebsd_open(ap)
 	struct vop_open_args /* {
 		struct vnode *a_vp;
@@ -6806,7 +6830,7 @@ struct vop_vector zfs_vnodeops = {
 	.vop_remove =		zfs_freebsd_remove,
 	.vop_rename =		zfs_freebsd_rename,
 	.vop_pathconf =		zfs_freebsd_pathconf,
-	.vop_bmap =		VOP_EOPNOTSUPP,
+	.vop_bmap =		zfs_freebsd_bmap,
 	.vop_fid =		zfs_freebsd_fid,
 	.vop_getextattr =	zfs_getextattr,
 	.vop_deleteextattr =	zfs_deleteextattr,



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201211251501.qAPF1CKS079555>