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>