Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 21 Aug 2006 13:21:51 +0000 (UTC)
From:      Tor Egge <Tor.Egge@cvsup.no.freebsd.org>
To:        kostikbel@gmail.com
Cc:        freebsd-fs@freebsd.org, tegge@freebsd.org
Subject:   Re: Deadlock between nfsd and snapshots.
Message-ID:  <20060821.132151.41668008.Tor.Egge@cvsup.no.freebsd.org>
In-Reply-To: <20060818.202001.74745664.Tor.Egge@cvsup.no.freebsd.org>
References:  <20060817170314.GA17490@peter.osted.lan> <20060818164903.GF20768@deviant.kiev.zoral.com.ua> <20060818.202001.74745664.Tor.Egge@cvsup.no.freebsd.org>

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

I wrote:

> The deadlock indicates that one or more of IN_CHANGE, IN_MODIFIED or
> IN_UPDATE was set on the inode, indicating a write operation
> (e.g. VOP_WRITE(), VOP_RENAME(), VOP_CREATE(), VOP_REMOVE(), VOP_LINK(),
> VOP_SYMLINK(), VOP_SETATTR(), VOP_MKDIR(), VOP_RMDIR(), VOP_MKNOD()) that was
> not protected by vn_start_write() or vn_start_secondary_write().

The most common "write" operation was probably VOP_GETATTR().

ufs_itimes(), called from ufs_getattr(), might set the IN_MODIFIED inode flag
if IN_ACCESS is set on the inode even if neither IN_CHANGE nor IN_UPDATE is
set, transitioning the inode flags into a state where ufs_inactive() calls the
blocking variant of vn_start_secondary_write().

calling ufs_itimes() with only a shared vnode lock might cause unsafe accesses
to the inode flags.  Setting of IN_ACCESS at the end of ffs_read() and
ffs_extread() might also be unsafe.  If DIRECTIO is enabled then O_DIRECT reads
might not even attempt to set the IN_ACCESS flag.

- Tor Egge



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