Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 6 Jun 2006 12:22:12 +0300
From:      Konstantin Belousov <kostikbel@gmail.com>
To:        Andrey Simonenko <simon@comsys.ntu-kpi.kiev.ua>
Cc:        freebsd-hackers@freebsd.org
Subject:   Re: Question about synchronization (nfssvc, vfs_busy)
Message-ID:  <20060606092212.GB45380@deviant.kiev.zoral.com.ua>
In-Reply-To: <20060606082529.GA767@pm513-1.comsys.ntu-kpi.kiev.ua>
References:  <20060605110136.GA1348@pm513-1.comsys.ntu-kpi.kiev.ua> <20060605173045.GA45380@deviant.kiev.zoral.com.ua> <20060606082529.GA767@pm513-1.comsys.ntu-kpi.kiev.ua>

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

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

On Tue, Jun 06, 2006 at 11:25:29AM +0300, Andrey Simonenko wrote:
> On Mon, Jun 05, 2006 at 08:30:45PM +0300, Konstantin Belousov wrote:
> > On Mon, Jun 05, 2006 at 02:01:36PM +0300, Andrey Simonenko wrote:
> > > 2.
> > >=20
> > > If vfs_busy() is called without LK_NOWAIT flag, then it can sleep
> > > if a filesystem is being unmounted.  At some point unmount() will
> > If vfs_busy() is called without LK_NOWAIT and fs is being unmounted,
> > then vfs_busy returns with ENOENT error, isn't it ?
> >=20
>=20
> Yes, it returns ENOENT, but before this event vfs_busy() sets MNTK_MWAIT
> flag and sleeps on mount point address.  When vfs_mount_destroy() sees
> MNTK_MWAIT, it wakes up a thread which sleeps in vfs_busy().  Since
> vfs_busy() and vfs_mount_destroy() are active only if MNT_MTX(mp) is
> acquired, vfs_mount_destroy() continues own execution, deallocating
> mount point, so mutex address passed to msleep() in vfs_busy() is not
> valid any more.
Are you concerned about invocation of
vfs_mount_destroy() at line 1224 of vfs_mount.c, in dounmount ?=20
Do you experience problems (panics, etc) caused by this issue ?

It seems that this scenario is impossible for some reasons that are
external to vfs_busy, because dounmount() aquires exclusive lock on the
vnode covered by mount point.
As far as I see, all invocations of vfs_busy() without LK_NOWAIT
flag are done while holding at least shared lock on that vnode.
See, for instance, fchdir() from vfs_syscalls.c.

--Bn2rw/3z4jIqBvZU
Content-Type: application/pgp-signature
Content-Disposition: inline

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.3 (FreeBSD)

iD8DBQFEhUlDC3+MBN1Mb4gRAuGbAKCOc65xHM6O8ae7ovh7r+moQJI4cwCgglMg
cwK4VUKBGqbIZiabcx2WHVg=
=aGaX
-----END PGP SIGNATURE-----

--Bn2rw/3z4jIqBvZU--



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