Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 14 Oct 2012 14:25:04 +0200
From:      Pawel Jakub Dawidek <pjd@FreeBSD.org>
To:        Andriy Gapon <avg@FreeBSD.org>
Cc:        "freebsd-fs@freebsd.org" <freebsd-fs@FreeBSD.org>
Subject:   Re: potential zfs/vfs trouble in force umount
Message-ID:  <20121014122503.GS1383@garage.freebsd.pl>
In-Reply-To: <507AAC38.3000709@FreeBSD.org>
References:  <507A8954.3000702@FreeBSD.org> <20121014112546.GH1383@garage.freebsd.pl> <507AAC38.3000709@FreeBSD.org>

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

--D5tFrmRBv7YOLFOK
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable

On Sun, Oct 14, 2012 at 03:12:40PM +0300, Andriy Gapon wrote:
> on 14/10/2012 14:25 Pawel Jakub Dawidek said the following:
> > On Sun, Oct 14, 2012 at 12:43:48PM +0300, Andriy Gapon wrote:
> >>=20
> >> I think that there is the following potentially troublesome scenario. =
One
> >> thread does zil_commit and obtains a znode pointer using zfs_zget.  At
> >> this point the thread doesn't have any locks on either the znode or its
> >> vnode.  the only thing that is supposed to keep them around is a
> >> reference on the vnode. If a force umount is going on in parallel, the
> >> one of the first things it does is calling vflush(FORCECLOSE) (this
> >> happens before closing down zil).  vflush force-reclaims all vnodes in
> >> this case (even when v_usecount > 0).  So the znode in question gets
> >> destroyed. Later, when the first thread tries to dereference the znode
> >> pointer it would crash.
> >=20
> > The z_teardown_lock lock is held for reading for every VOP and zfs_umou=
nt()
> > obtains this lock for writing before calling vflush(FORCECLOSE) and sets
> > z_unmounted to true. This in turn will make every new VOP to return with
> > EIO. This ensures that no VOP is in-progress when vflush() is called.
> >=20
>=20
> What was/is not clear to me is whether zil operations are always called u=
nder
> z_teardown_lock (aka ZFS_ENTER)...

All VOP start from acquiring this lock. If there is a zil_commit() you
are talking about which is not part of a VOP, then it should be
investigated separately.

--=20
Pawel Jakub Dawidek                       http://www.wheelsystems.com
FreeBSD committer                         http://www.FreeBSD.org
Am I Evil? Yes, I Am!                     http://tupytaj.pl

--D5tFrmRBv7YOLFOK
Content-Type: application/pgp-signature

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.19 (FreeBSD)

iEYEARECAAYFAlB6rx8ACgkQForvXbEpPzSorACg9C7x+wDVuAlLNqTt/DzmS3rF
+6IAni4i8L4eD+cEmSuw0X8FA7MIDmnB
=52b2
-----END PGP SIGNATURE-----

--D5tFrmRBv7YOLFOK--



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