Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 20 May 2016 10:11:38 +1000 (EST)
From:      Bruce Evans <brde@optusnet.com.au>
To:        Bruce Evans <brde@optusnet.com.au>
Cc:        Konstantin Belousov <kostikbel@gmail.com>, fs@freebsd.org
Subject:   Re: fix for per-mount i/o counting in ffs
Message-ID:  <20160520095504.X1527@besplex.bde.org>
In-Reply-To: <20160520074427.W1151@besplex.bde.org>
References:  <20160517072104.I2137@besplex.bde.org> <20160517084241.GY89104@kib.kiev.ua> <20160518061040.D5948@besplex.bde.org> <20160518070252.F6121@besplex.bde.org> <20160517220055.GF89104@kib.kiev.ua> <20160518084931.T6534@besplex.bde.org> <20160518110834.GJ89104@kib.kiev.ua> <20160519065714.H1393@besplex.bde.org> <20160519094901.O1798@besplex.bde.org> <20160519120557.A2250@besplex.bde.org> <20160519104128.GN89104@kib.kiev.ua> <20160520074427.W1151@besplex.bde.org>

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

On Fri, 20 May 2016, Bruce Evans wrote:

> On Thu, 19 May 2016, Konstantin Belousov wrote:
>> diff --git a/sys/ufs/ffs/ffs_vfsops.c b/sys/ufs/ffs/ffs_vfsops.c
>> index 712fc21..21425f5 100644
>> --- a/sys/ufs/ffs/ffs_vfsops.c
>> +++ b/sys/ufs/ffs/ffs_vfsops.c
>> @@ -764,24 +764,29 @@ ffs_mountfs(devvp, mp, td)
>> 	cred = td ? td->td_ucred : NOCRED;
>> 	ronly = (mp->mnt_flag & MNT_RDONLY) != 0;
>> 
>> +	KASSERT(devvp->v_type == VCHR, ("reclaimed devvp"));

I still don't like this.  The source code tends to fill up with assertions
(and comments) about simple things.

>> 	dev = devvp->v_rdev;
>> 	dev_ref(dev);
>> +	if (!atomic_cmpset_ptr(&dev->si_mountpt, 0, mp)) {

I used != 0.

>> @@ -1083,8 +1088,6 @@ ffs_mountfs(devvp, mp, td)
>> out:
>> 	if (bp)
>> 		brelse(bp);
>> -	if (devvp->v_type == VCHR && devvp->v_rdev != NULL)
>> -		devvp->v_rdev->si_mountpt = NULL;
>> 	if (cp != NULL) {
>> 		DROP_GIANT();
>> 		g_topology_lock();
>> @@ -1102,6 +1105,7 @@ out:
>> 		free(ump, M_UFSMNT);
>> 		mp->mnt_data = NULL;
>> 	}
>> +	dev->si_mountpt = NULL;
>
> This should remain before the vnode unlock.  Otherwise a new mount can
> fail unnecessarily.
>
>> 	dev_rel(dev);
>> 	return (error);
>> }

Oops.  The vnode lock is not held here, so the order in ffs_mount() cannot
be duplicated.  I moved the resetting of si_mountpt down to here too.

Not locking here and elsewhere makes the locking for v_bufobj even
more obscure.  v_bufobj is a whole struct living in the vnode.  It has
no locking annotation, but has a style bug (a stray '*') where its
locking annotation should be.  g_vfs_open() sets sc->sc_bo to
&vp->v_bufobj and I think most uses of this don't lock the vnode or
check if has been revoked.  Perhaps ro accesses are OK (revoke() must
not clean v_bufobj).  Cleaning v_bufobj on mount failure without the
vnode lock would be a bug.  I think it is just not cleaned or used
until the next mount changes it.

Bruce



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