Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 22 Sep 2013 23:19:16 +0300
From:      Konstantin Belousov <kostikbel@gmail.com>
To:        Matthew Fleming <mdf@FreeBSD.org>
Cc:        "svn-src-head@freebsd.org" <svn-src-head@freebsd.org>, Attilio Rao <attilio@freebsd.org>, "svn-src-all@freebsd.org" <svn-src-all@freebsd.org>, "src-committers@freebsd.org" <src-committers@freebsd.org>
Subject:   Re: svn commit: r255797 - head/sys/kern
Message-ID:  <20130922201916.GL41229@kib.kiev.ua>
In-Reply-To: <CAMBSHm_RYzVVm7cEEqntfChgC%2B2sC6CEonZgLob-nRKCUoLmQg@mail.gmail.com>
References:  <201309221923.r8MJNm3u021657@svn.freebsd.org> <CAMBSHm_RYzVVm7cEEqntfChgC%2B2sC6CEonZgLob-nRKCUoLmQg@mail.gmail.com>

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

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

On Sun, Sep 22, 2013 at 01:14:21PM -0700, Matthew Fleming wrote:
> On Sun, Sep 22, 2013 at 12:23 PM, Konstantin Belousov <kib@freebsd.org>wr=
ote:
>=20
> > Author: kib
> > Date: Sun Sep 22 19:23:48 2013
> > New Revision: 255797
> > URL: http://svnweb.freebsd.org/changeset/base/255797
> >
> > Log:
> >   Increase the chance of the buffer write from the bufdaemon helper
> >   context to succeed.  If the locked vnode which owns the buffer to be
> >   written is shared locked, try the non-blocking upgrade of the lock to
> >   exclusive.
> >
> >   PR:   kern/178997
> >   Reported and tested by:       Klaus Weber <
> > fbsd-bugs-2013-1@unix-admin.de>
> >   Sponsored by: The FreeBSD Foundation
> >   MFC after:    1 week
> >   Approved by:  re (marius)
> >
> > Modified:
> >   head/sys/kern/vfs_bio.c
> >
> > Modified: head/sys/kern/vfs_bio.c
> >
> > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D
> > --- head/sys/kern/vfs_bio.c     Sun Sep 22 19:15:24 2013        (r25579=
6)
> > +++ head/sys/kern/vfs_bio.c     Sun Sep 22 19:23:48 2013        (r25579=
7)
> > @@ -2624,6 +2624,8 @@ flushbufqueues(struct vnode *lvp, int ta
> >         int hasdeps;
> >         int flushed;
> >         int queue;
> > +       int error;
> > +       bool unlock;
> >
> >         flushed =3D 0;
> >         queue =3D QUEUE_DIRTY;
> > @@ -2699,7 +2701,16 @@ flushbufqueues(struct vnode *lvp, int ta
> >                         BUF_UNLOCK(bp);
> >                         continue;
> >                 }
> > -               if (vn_lock(vp, LK_EXCLUSIVE | LK_NOWAIT | LK_CANRECURS=
E)
> > =3D=3D 0) {
> > +               if (lvp =3D=3D NULL) {
> > +                       unlock =3D true;
> > +                       error =3D vn_lock(vp, LK_EXCLUSIVE | LK_NOWAIT);
> > +               } else {
> > +                       ASSERT_VOP_LOCKED(vp, "getbuf");
> > +                       unlock =3D false;
> > +                       error =3D VOP_ISLOCKED(vp) =3D=3D LK_EXCLUSIVE =
? 0 :
> > +                           vn_lock(vp, LK_UPGRADE | LK_NOWAIT);
> >
>=20
> I don't think this is quite right.
>=20
> When the lock is held shared, and VOP_LOCK is implemented by lockmgr(9),
> (i.e. all in-tree filesystems?), LK_UPGRADE may drop the lock, and not
> reacquire it.  This would happen when the vnode is locked shared, the
> upgrade fails (2 shared owners), then lockmgr(9) will try to lock EX, whi=
ch
> will also fail (still one shared owner).  The caller's lock is no longer
> held.
>=20
> Doesn't that scenario (LK_UPGRADE failing) cause problems both for the
> caller (unexpected unlock) and for flushbufqueues(), which expects the
> vnode lock to be held since lvp is non-NULL?

Does it ? If the lock is dropped, the code is indeed in trouble.
Please note that LK_NOWAIT is specified for upgrade, and I believe
that this causes lockmgr to return with EBUSY without dropping
the lock.

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

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

iQIcBAEBAgAGBQJSP1DDAAoJEJDCuSvBvK1BvdEQAKNEXVW1leB8fpsX8NIbAn4x
CGspvlWPta2+UQdnAxh7Z9+Uy2peE9lEHBfC+Hq+OHNH5VcstfACs44/fILxVr0t
U7GWX/+XOYWawlP3Y8ui9oYeZ5XlWpMqjrXk60eDNBhw15n/7RS20yfOGZ0SfzCW
5aZ8QljGReSHrUIlL2VaO7dRH28hiB3OUsGMtQCl3wPGM6OlHBWV3IWbsIMXyN3b
vJBQAo9HjOj4e9fA3HSrFzTFpsC3O/PSiNB+qsqxnirgzTg0jylWYS5DqyropDc6
gN8LfkV1bZTBM8pfzYaJnMMgpWMTrTdXmyJ8WALD0aGkurlbSvaQ6csgMt3NdL8G
6HOwbZKQIhhhOmIL12WnskLRMTgvqcrlYnRN5TnUHlDV5/99UU0DSuSMFWj978uU
IA55I3TTbeVfb4ASvpRcowGY/qWdnM15H2uUNPzZlE2PdbB0runi9tbrk6g79GNV
Yd0HOkdeKPpcvvNkqsqYrh8YF5AcXif94UJJmLwRxDV8rWSC3ccp/MU9IfedWaBo
BTsQF9EXtbhGrOD6+8cvE03LsPoTGjRvse69/YkaMamw84ktvv6dtPYnmHinrGfV
LMgh245v8O0EntVlB76NHrAGaVd+sKLzToHFGByZOOejby+lYAlLMr9fCqgQkCrt
oYnPmDosY9C0EKgMrt0f
=dfwX
-----END PGP SIGNATURE-----

--UZ6ltp17Ke3Obxch--



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