Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 26 Apr 2006 16:36:17 +0300
From:      Kostik Belousov <kostikbel@gmail.com>
To:        Dmitry Morozovsky <marck@rinet.ru>
Cc:        freebsd-stable@freebsd.org, Kris Kennaway <kris@obsecurity.org>
Subject:   Re: fsck_ufs locked in snaplk
Message-ID:  <20060426133617.GG1446@deviant.kiev.zoral.com.ua>
In-Reply-To: <20060426134217.C93749@woozle.rinet.ru>
References:  <20060425134418.J57625@woozle.rinet.ru> <20060425080932.1rv9hq0rcws4wc84@www.wolves.k12.mo.us> <20060425133532.GD1446@deviant.kiev.zoral.com.ua> <20060425095610.ibv24kg1kw00s040@www.wolves.k12.mo.us> <20060425185741.C71240@woozle.rinet.ru> <20060425153909.GE1446@deviant.kiev.zoral.com.ua> <20060425162252.GA54244@xor.obsecurity.org> <444EC8EA.8050305@asd.aplus.net> <20060426011703.GA61794@xor.obsecurity.org> <20060426134217.C93749@woozle.rinet.ru>

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

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

On Wed, Apr 26, 2006 at 01:43:42PM +0400, Dmitry Morozovsky wrote:
> On Tue, 25 Apr 2006, Kris Kennaway wrote:
>=20
> KK> What people are seeing now must be some other problem that I wan't
> KK> able to reproduce.
> KK>=20
> KK> Once I hear back from someone who can reproduce it with debugging
> KK> enabled (I'm also trying) we can try to fix it.
>=20
> Please try to simulate user who is over soft quota and is out of grace pe=
riod.=20
> I'm trying to do so as well, but currently quite busy with other tasks :(

I'm not sure whether the following is the issue you met, but:

dqsync from sys/ufs/ufs/ufs_quota.c calls vn_start_secondary_write()
unconditionally. As result, mp->mnt_secondary_accwrites counter
from the struct mount will always increase after the entry to the dqsync.
ffs_snapshot calls ffs_sync, that calls dsync, that
iterates over vnodes and calls dqsync on them.
And, after the qsync, ffs_sync checks whether mp->mnt_secondary_accwrites
changes by calling softdep_check_suspend (see line 1221 of ffs_vfsops.c).
If changed, ffs_sync would restart the syncing loop, that never finishes.

This is very strange, since if true, it basicaly means that snapshots
and quotas shall lead to immediate deadlock ...

The following patch moves call to vn_start_secondary_write after
check for DQ_MOD. Please, try it.


Index: sys/ufs/ufs/ufs_quota.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
RCS file: /usr/local/arch/ncvs/src/sys/ufs/ufs/ufs_quota.c,v
retrieving revision 1.81
diff -u -r1.81 ufs_quota.c
--- sys/ufs/ufs/ufs_quota.c	8 Mar 2006 23:43:39 -0000	1.81
+++ sys/ufs/ufs/ufs_quota.c	26 Apr 2006 13:34:33 -0000
@@ -989,19 +989,16 @@
 		return (0);
 	if ((dqvp =3D dq->dq_ump->um_quotas[dq->dq_type]) =3D=3D NULLVP)
 		panic("dqsync: file");
-	(void) vn_start_secondary_write(dqvp, &mp, V_WAIT);
-	if (vp !=3D dqvp)
-		vn_lock(dqvp, LK_EXCLUSIVE | LK_RETRY, td);
 	while (dq->dq_flags & DQ_LOCK) {
 		dq->dq_flags |=3D DQ_WANT;
 		(void) tsleep(dq, PINOD+2, "dqsync", 0);
 		if ((dq->dq_flags & DQ_MOD) =3D=3D 0) {
-			if (vp !=3D dqvp)
-				VOP_UNLOCK(dqvp, 0, td);
-			vn_finished_secondary_write(mp);
 			return (0);
 		}
 	}
+	(void) vn_start_secondary_write(dqvp, &mp, V_WAIT);
+	if (vp !=3D dqvp)
+		vn_lock(dqvp, LK_EXCLUSIVE | LK_RETRY, td);
 	dq->dq_flags |=3D DQ_LOCK;
 	auio.uio_iov =3D &aiov;
 	auio.uio_iovcnt =3D 1;

--XStn23h1fwudRqtG
Content-Type: application/pgp-signature
Content-Disposition: inline

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

iD8DBQFET3dQC3+MBN1Mb4gRArjkAJ9V15K8U2/3vsFOqaXY4iDDzDq2iACgsvmf
D6rp8CmJh9PEnielXxx/gzo=
=i1oT
-----END PGP SIGNATURE-----

--XStn23h1fwudRqtG--



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