Date: Wed, 25 Sep 2002 03:57:36 -0700 (PDT) From: Don Lewis <dl-freebsd@catspoiler.org> To: jroberson@chesapeake.net Cc: rwatson@FreeBSD.org, cvs-committers@FreeBSD.org, cvs-all@FreeBSD.org Subject: Re: cvs commit: src/sys/sys lockmgr.h Message-ID: <200209251057.g8PAvamY016744@gw.catspoiler.org> In-Reply-To: <20020925003055.L97589-100000@mail.chesapeake.net>
next in thread | previous in thread | raw e-mail | index | archive | help
On 25 Sep, Jeff Roberson wrote:
> There are some mp_fixmes, and some general cleanups that should happen.
> I'd like to be able to run with DEBUG_VFS_LOCKS enabled all the time.
> Right now there are still places that break on that. After that, namei()
> and rename() are broken and unsafe wrt locking. Right now all vfs locks
> are recursive. I may take advantage of that to simplify the rename code.
kern_rename() and other callers of VOP_RENAME() should probably lock fvp
before calling VOP_RENAME() instead of leaving this up to the leaf
filesystems. ext2_rename() and ufs_rename() are already locking fvp, and
nfs_rename() needs to before it calls VOP_FSYNC(), so it would make more
sense to move this common code to the caller.
The current implementation doesn't properly handle the failure of
vn_lock(fvp, ...). This also looks like it would be easier to handle if
the locking was done by kern_rename(). I believe that if the attempt to
lock fvp fails we should do something like:
NDFREE(&tond, NDF_ONLY_PNBUF);
if (tdvp == tvp)
vrele(tdvp);
else
vput(tdvp);
if (tvp)
vput(tvp);
and then to retry starting with:
NDINIT(&tond, RENAME, LOCKPARENT | LOCKLEAF | NOCACHE | SAVESTART |
NOOBJ, pathseg, to, td);
if (fromnd.ni_vp->v_type == VDIR)
tond.ni_cnd.cn_flags |= WILLBEDIR;
if ((error = namei(&tond)) != 0) {
Maybe the NDFREE() and NDINIT() stuff could be skipped on the retry ...
I haven't looked at the other places in the source where VOP_RENAME() is
called to see if it would make sense to encapsulate some of this stuff
in a wrapper.
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe cvs-all" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200209251057.g8PAvamY016744>
