From owner-svn-src-projects@freebsd.org Fri Apr 26 17:09:28 2019 Return-Path: Delivered-To: svn-src-projects@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 148861599066 for ; Fri, 26 Apr 2019 17:09:28 +0000 (UTC) (envelope-from asomers@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) server-signature RSA-PSS (4096 bits) client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id B07157510E; Fri, 26 Apr 2019 17:09:27 +0000 (UTC) (envelope-from asomers@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 89E19E93C; Fri, 26 Apr 2019 17:09:27 +0000 (UTC) (envelope-from asomers@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id x3QH9RQ2002948; Fri, 26 Apr 2019 17:09:27 GMT (envelope-from asomers@FreeBSD.org) Received: (from asomers@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id x3QH9RvZ002947; Fri, 26 Apr 2019 17:09:27 GMT (envelope-from asomers@FreeBSD.org) Message-Id: <201904261709.x3QH9RvZ002947@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: asomers set sender to asomers@FreeBSD.org using -f From: Alan Somers Date: Fri, 26 Apr 2019 17:09:27 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r346756 - in projects/fuse2: sys/kern tests/sys/fs/fusefs X-SVN-Group: projects X-SVN-Commit-Author: asomers X-SVN-Commit-Paths: in projects/fuse2: sys/kern tests/sys/fs/fusefs X-SVN-Commit-Revision: 346756 X-SVN-Commit-Repository: base MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Rspamd-Queue-Id: B07157510E X-Spamd-Bar: -- Authentication-Results: mx1.freebsd.org X-Spamd-Result: default: False [-2.97 / 15.00]; local_wl_from(0.00)[FreeBSD.org]; NEURAL_HAM_MEDIUM(-1.00)[-0.997,0]; NEURAL_HAM_SHORT(-0.97)[-0.974,0]; ASN(0.00)[asn:11403, ipnet:2610:1c1:1::/48, country:US]; NEURAL_HAM_LONG(-1.00)[-1.000,0] X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 26 Apr 2019 17:09:28 -0000 Author: asomers Date: Fri Apr 26 17:09:26 2019 New Revision: 346756 URL: https://svnweb.freebsd.org/changeset/base/346756 Log: fusefs: fix cache invalidation error from r346162 An off-by-one error led to the last page of a write not being removed from its object, even though that page's buffer was marked as invalid. PR: 235774 Sponsored by: The FreeBSD Foundation Modified: projects/fuse2/sys/kern/vfs_subr.c projects/fuse2/tests/sys/fs/fusefs/write.cc Modified: projects/fuse2/sys/kern/vfs_subr.c ============================================================================== --- projects/fuse2/sys/kern/vfs_subr.c Fri Apr 26 17:01:56 2019 (r346755) +++ projects/fuse2/sys/kern/vfs_subr.c Fri Apr 26 17:09:26 2019 (r346756) @@ -1927,10 +1927,13 @@ v_inval_buf_range(struct vnode *vp, off_t start, off_t { struct bufobj *bo; daddr_t startlbn, endlbn; + vm_pindex_t startp, endp; /* Round "outwards" */ startlbn = start / blksize; endlbn = howmany(end, blksize); + startp = OFF_TO_IDX(start); + endp = OFF_TO_IDX(end + PAGE_SIZE - 1); ASSERT_VOP_LOCKED(vp, "v_inval_buf_range"); @@ -1960,7 +1963,7 @@ restart: goto restart; BO_UNLOCK(bo); - vn_pages_remove(vp, OFF_TO_IDX(start), OFF_TO_IDX(end)); + vn_pages_remove(vp, startp, endp); } /* Like v_inval_buf_range, but operates on whole buffers instead of offsets */ Modified: projects/fuse2/tests/sys/fs/fusefs/write.cc ============================================================================== --- projects/fuse2/tests/sys/fs/fusefs/write.cc Fri Apr 26 17:01:56 2019 (r346755) +++ projects/fuse2/tests/sys/fs/fusefs/write.cc Fri Apr 26 17:09:26 2019 (r346756) @@ -413,17 +413,28 @@ TEST_F(WriteThrough, evicts_read_cache) { const char FULLPATH[] = "mountpoint/some_file.txt"; const char RELPATH[] = "some_file.txt"; - const char CONTENTS0[] = "abcdefgh"; - const char CONTENTS1[] = "ijklmnop"; + ssize_t bufsize = 65536; + /* End the write in the middle of a page */ + ssize_t wrsize = bufsize - 1000; + char *contents0, *contents1, *readbuf, *expected; uint64_t ino = 42; int fd; - ssize_t bufsize = strlen(CONTENTS0) + 1; - char readbuf[bufsize]; + contents0 = (char*)malloc(bufsize); + memset(contents0, 'X', bufsize); + contents0[bufsize - 1] = '\0'; // Null-terminate + contents1 = (char*)malloc(wrsize); + memset(contents1, 'Y', wrsize); + readbuf = (char*)calloc(bufsize, 1); + expected = (char*)malloc(bufsize); + memset(expected, 'Y', wrsize); + memset(expected + wrsize, 'X', bufsize - wrsize); + expected[bufsize - 1] = '\0'; // Null-terminate + expect_lookup(RELPATH, ino, bufsize); expect_open(ino, 0, 1); - expect_read(ino, 0, bufsize, bufsize, CONTENTS0); - expect_write(ino, 0, bufsize, bufsize, 0, CONTENTS1); + expect_read(ino, 0, bufsize, bufsize, contents0); + expect_write(ino, 0, wrsize, wrsize, 0, contents1); fd = open(FULLPATH, O_RDWR); EXPECT_LE(0, fd) << strerror(errno); @@ -433,13 +444,13 @@ TEST_F(WriteThrough, evicts_read_cache) // Write directly, evicting cache ASSERT_EQ(0, lseek(fd, 0, SEEK_SET)) << strerror(errno); - ASSERT_EQ(bufsize, write(fd, CONTENTS1, bufsize)) << strerror(errno); + ASSERT_EQ(wrsize, write(fd, contents1, wrsize)) << strerror(errno); // Read again. Cache should be bypassed - expect_read(ino, 0, bufsize, bufsize, CONTENTS1); + expect_read(ino, 0, bufsize, bufsize, expected); ASSERT_EQ(0, lseek(fd, 0, SEEK_SET)) << strerror(errno); ASSERT_EQ(bufsize, read(fd, readbuf, bufsize)) << strerror(errno); - ASSERT_STREQ(readbuf, CONTENTS1); + ASSERT_STREQ(readbuf, expected); /* Deliberately leak fd. close(2) will be tested in release.cc */ }