Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 16 Aug 2020 21:05:57 +0000 (UTC)
From:      Konstantin Belousov <kib@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r364288 - head/sys/fs/nullfs
Message-ID:  <202008162105.07GL5vGA076876@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: kib
Date: Sun Aug 16 21:05:56 2020
New Revision: 364288
URL: https://svnweb.freebsd.org/changeset/base/364288

Log:
  VMIO reads: enable for nullfs upper vnode if the lower vnode supports it.
  
  Reviewed by:	markj
  Tested by:	pho
  Sponsored by:	The FreeBSD Foundation
  Differential revision:	https://reviews.freebsd.org/D25968

Modified:
  head/sys/fs/nullfs/null_subr.c
  head/sys/fs/nullfs/null_vnops.c

Modified: head/sys/fs/nullfs/null_subr.c
==============================================================================
--- head/sys/fs/nullfs/null_subr.c	Sun Aug 16 21:02:45 2020	(r364287)
+++ head/sys/fs/nullfs/null_subr.c	Sun Aug 16 21:05:56 2020	(r364288)
@@ -259,12 +259,33 @@ null_nodeget(mp, lowervp, vpp)
 		vp->v_vflag |= VV_ROOT;
 
 	/*
+	 * We might miss the case where lower vnode sets VIRF_PGREAD
+	 * some time after construction, which is typical case.
+	 * null_open rechecks.
+	 */
+	if ((lowervp->v_irflag & VIRF_PGREAD) != 0) {
+		MPASS(lowervp->v_object != NULL);
+		if ((vp->v_irflag & VIRF_PGREAD) == 0) {
+			if (vp->v_object == NULL)
+				vp->v_object = lowervp->v_object;
+			else
+				MPASS(vp->v_object == lowervp->v_object);
+			VI_LOCK(vp);
+			vp->v_irflag |= VIRF_PGREAD;
+			VI_UNLOCK(vp);
+		} else {
+			MPASS(vp->v_object != NULL);
+		}
+	}
+
+	/*
 	 * Atomically insert our new node into the hash or vget existing 
 	 * if someone else has beaten us to it.
 	 */
 	*vpp = null_hashins(mp, xp);
 	if (*vpp != NULL) {
 		vrele(lowervp);
+		vp->v_object = NULL;	/* in case VIRF_PGREAD set it */
 		null_destroy_proto(vp, xp);
 		return (0);
 	}

Modified: head/sys/fs/nullfs/null_vnops.c
==============================================================================
--- head/sys/fs/nullfs/null_vnops.c	Sun Aug 16 21:02:45 2020	(r364287)
+++ head/sys/fs/nullfs/null_vnops.c	Sun Aug 16 21:05:56 2020	(r364288)
@@ -439,8 +439,17 @@ null_open(struct vop_open_args *ap)
 	vp = ap->a_vp;
 	ldvp = NULLVPTOLOWERVP(vp);
 	retval = null_bypass(&ap->a_gen);
-	if (retval == 0)
+	if (retval == 0) {
 		vp->v_object = ldvp->v_object;
+		if ((ldvp->v_irflag & VIRF_PGREAD) != 0) {
+			MPASS(vp->v_object != NULL);
+			if ((vp->v_irflag & VIRF_PGREAD) == 0) {
+				VI_LOCK(vp);
+				vp->v_irflag |= VIRF_PGREAD;
+				VI_UNLOCK(vp);
+			}
+		}
+	}
 	return (retval);
 }
 



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