Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 4 May 2015 18:49:25 +0000 (UTC)
From:      Gleb Smirnoff <glebius@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r282426 - head/sys/vm
Message-ID:  <201505041849.t44InPxC073254@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: glebius
Date: Mon May  4 18:49:25 2015
New Revision: 282426
URL: https://svnweb.freebsd.org/changeset/base/282426

Log:
  Fix arithmetical bug in vnode_pager_haspage().  The check against object size
  should be done not with the number of pages in the first block, but with the
  overall number of pages.  While here, add KASSERT that makes sure that BMAP
  doesn't return completely irrelevant blocks.
  
  Reviewed by:	kib
  Tested by:	pho
  Sponsored by:	Netflix
  Sponsored by:	Nginx, Inc.

Modified:
  head/sys/vm/vnode_pager.c

Modified: head/sys/vm/vnode_pager.c
==============================================================================
--- head/sys/vm/vnode_pager.c	Mon May  4 18:20:31 2015	(r282425)
+++ head/sys/vm/vnode_pager.c	Mon May  4 18:49:25 2015	(r282426)
@@ -340,16 +340,21 @@ vnode_pager_haspage(vm_object_t object, 
 			*before += poff;
 		}
 		if (after) {
-			int numafter;
+			/*
+			 * The BMAP vop can report a partial block in the
+			 * 'after', but must not count blocks after EOF.
+			 * Assert the latter, and truncate 'after' in case
+			 * of the former.
+			 */
+			KASSERT(reqblock + *after <=
+			    object->size * pagesperblock,
+			    ("%s: reqblock %jd after %d size %ju", __func__,
+			    (intmax_t )reqblock, *after,
+			    (uintmax_t )object->size));
 			*after *= pagesperblock;
-			numafter = pagesperblock - (poff + 1);
-			if (IDX_TO_OFF(pindex + numafter) >
-			    object->un_pager.vnp.vnp_size) {
-				numafter =
-		    		    OFF_TO_IDX(object->un_pager.vnp.vnp_size) -
-				    pindex;
-			}
-			*after += numafter;
+			*after += pagesperblock - (poff + 1);
+			if (pindex + *after >= object->size)
+				*after = object->size - 1 - pindex;
 		}
 	} else {
 		if (before) {



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