OpenAFS Master Repository branch, master, updated. openafs-devel-1_9_1-87-g92222d0

Gerrit Code Review gerrit@openafs.org
Tue, 14 Sep 2021 12:37:46 -0400


The following commit has been merged in the master branch:
commit 92222d023142b06ac148778263f6cef6115f9cfb
Author: Andrew Deason <adeason@dson.org>
Date:   Sun May 3 10:26:27 2020 -0500

    FBSD: Disable background stores
    
    Currently, when closing a vcache (via afs_close), we write any dirty
    data to the net, and we do so via a background daemon if one is
    available (for the rarely-used 'fs storebehind' functionality).
    
    However, on FBSD, this breaks the locking rules, since flushing dirty
    pages for a vnode requires the vnode to be locked. In the situation
    where we are writing via a background daemon, the afs_close() thread
    is what holds the vnode lock, but the background thread is the one
    that's actually flushing the dirty pages. So the vnode is effectively
    locked in this situation, but to the FreeBSD kernel it looks like we
    are flushing pages without the vnode lock, and so it complains:
    
        kernel: KDB: stack backtrace:
        kernel: #0 0xffffffff80bf6557 at kdb_backtrace+0x67
        kernel: #1 0xffffffff80c7a337 at assert_vop_locked+0x77
        kernel: #2 0xffffffff811fc0bb at VOP_PUTPAGES_APV+0x7b
        kernel: #3 0xffffffff80f016bd at vnode_pager_putpages+0x7d
        kernel: #4 0xffffffff80ef424f at vm_pageout_flush+0xff
        kernel: #5 0xffffffff80ee9b39 at vm_object_page_collect_flush+0x239
        kernel: #6 0xffffffff80ee9819 at vm_object_page_clean+0x179
        kernel: #7 0xffffffff828d7181 at osi_VM_StoreAllSegments+0x111
        kernel: #8 0xffffffff82850a3d at afs_StoreAllSegments+0x9d
        kernel: #9 0xffffffff8287b1ce at afs_StoreOnLastReference+0x17e
        kernel: #10 0xffffffff8282dc70 at BStore+0xd0
        kernel: #11 0xffffffff8282d6ec at afs_BackgroundDaemon+0x2cc
        kernel: #12 0xffffffff828c2f2f at afs_syscall_call+0x35f
        kernel: #13 0xffffffff82855963 at afs3_syscall+0x83
        kernel: #14 0xffffffff81074581 at amd64_syscall+0x291
        kernel: #15 0xffffffff8104cde0 at fast_syscall_common+0x101
        kernel: vnode 0xfffff8006974fc58: tag afs, type VREG
        kernel:     usecount 2, writecount 0, refcount 3
        kernel:     flags (VI_ACTIVE)
        kernel:     v_object 0xfffff80023917900 ref 0 pages 171 cleanbuf 0 dirtybuf 0
        kernel:     lock type afs: EXCL by thread 0xfffff800852775e0 (pid 31828, ld.lld, tid 100787)
        kernel: #0 0xffffffff80b81fc2 at lockmgr_lock_fast_path+0x1e2
        kernel: #1 0xffffffff811fa9f6 at VOP_LOCK1_APV+0x96
        kernel: #2 0xffffffff80c8c705 at _vn_lock+0x65
        kernel: #3 0xffffffff80c8c8a3 at vn_close1+0x73
        kernel: #4 0xffffffff80c8b76c at vn_closefile+0x4c
        kernel: #5 0xffffffff80b571ba at _fdrop+0x1a
        kernel: #6 0xffffffff80b5a3cc at closef+0x1ec
        kernel: #7 0xffffffff80b577be at closefp+0x9e
        kernel: #8 0xffffffff81074581 at amd64_syscall+0x291
        kernel: #9 0xffffffff8104cde0 at fast_syscall_common+0x101
        kernel: vc 0xfffffe002b8d4d30 vp 0xfffff8006974fc58 tag afs, fid: 1.536870912.13317022.33596982, opens 1, writers 1
        kernel:   states statd dirty
        kernel: VOP_PUTPAGES: 0xfffff8006974fc58 is not locked but should be
    
    To avoid this, force afs_close() to write dirty data in the same
    thread, instead of passing it off to a background daemon.
    
    Change-Id: Id952c7928c301fcc35d226e117dc19010b42776a
    Reviewed-on: https://gerrit.openafs.org/14185
    Tested-by: BuildBot <buildbot@rampaginggeek.com>
    Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>

 src/afs/VNOPS/afs_vnop_write.c | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

-- 
OpenAFS Master Repository