Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 19 May 2016 10:23:54 +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:  <20160519094901.O1798@besplex.bde.org>
In-Reply-To: <20160519065714.H1393@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>

next in thread | previous in thread | raw e-mail | index | archive | help
On Thu, 19 May 2016, Bruce Evans wrote:

>  ...
> I think the following works to prevent multiple mounts via all of the
> known buggy paths: early in every fsmount():
>
> 	dev = devvp->v_rdev;
> 	if (dev->si_mountpt != NULL) {
> 		cleanup();
> 		return (EBUSY);
> 	}
> 	dev->si_mountpt = mp;
>
> This also prevents other mounts racing with us before we complete.  Too
> bad if we fail but the other mount would have succeeded.  In fsunmount(),
> move clearing si_mountpt to near the end.  I hope si_mountpt is locked
> by the device reference and that this makes si_mountpt robust enough to
> use as an exclusive access flag.

Nah, the reference is not a lock.  This needs dev_lock() or similar to
be robust.

struct cdef has no documented locking, bug dev_lock() should work and is
probably needed for writes.  It is never used for accesses to si_mountpt
now.  Reads are safe enough since the are of the form
'mp = dev->si_mountpt; if (mp == NULL) dont_use_mp();'.

Bruce



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