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>