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>