Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 23 Aug 2011 21:27:56 +0200 (CEST)
From:      Martin Matuska <mm@FreeBSD.org>
To:        FreeBSD-gnats-submit@FreeBSD.org
Subject:   kern/160035: [zfs] zfs rollback does not invalidate mmapped cache
Message-ID:  <20110823192756.7C8031954A2@mail.vx.sk>
Resent-Message-ID: <201108231930.p7NJUAVJ071582@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help

>Number:         160035
>Category:       kern
>Synopsis:       [zfs] zfs rollback does not invalidate mmapped cache
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Tue Aug 23 19:30:10 UTC 2011
>Closed-Date:
>Last-Modified:
>Originator:     Martin Matuska
>Release:        FreeBSD 9.0-BETA1 amd64
>Organization:
>Environment:
>Description:
ZFS rollback does not invalidate mmapped cache - this may lead to a different
or corrupted view of files after a rollback (or clone swap).
This bug is related to kern/156933
>How-To-Repeat:
dd if=/dev/zero of=/tmp/testfile bs=1m count=64
zpool create test /tmp/testfile
echo "First text" > /test/file.txt
zfs snapshot test@s1
echo "Second text" > /test/file.txt
tail /test/file.txt
zfs rollback test@s1
cat /test/file.txt

Without the tail command (mmap) the file reads properly "First text".
With tail it reads cached "Second text" a remount of /test is required -
the on-disk data is correct but cached data incorrect.
The cached pages should get properly invalidated.

>Fix:
The problem may be in zfs_vnops.c, zfs_inactive():

Original OpenSolaris implementation contains:

if (zp->z_sa_hdl == NULL) {
	/*
	 * The fs has been unmounted, or we did a
	 * suspend/resume and this file no longer exists.
	 */
	if (vn_has_cached_data(vp)) {
		(void) pvn_vplist_dirty(vp, 0, zfs_null_putapage,
		    B_INVAL, cr);
	}

Our implementation misses the "if (vn_has_cached_data(vp))" part.
The function vm_object_sync() might be a possible solution to invalidate
the pages.
>Release-Note:
>Audit-Trail:
>Unformatted:



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