From owner-cvs-all@FreeBSD.ORG Fri Aug 10 09:26:26 2007 Return-Path: Delivered-To: cvs-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 8CDC316A417; Fri, 10 Aug 2007 09:26:26 +0000 (UTC) (envelope-from kostikbel@gmail.com) Received: from relay02.kiev.sovam.com (relay02.kiev.sovam.com [62.64.120.197]) by mx1.freebsd.org (Postfix) with ESMTP id 1E53713C461; Fri, 10 Aug 2007 09:26:26 +0000 (UTC) (envelope-from kostikbel@gmail.com) Received: from [89.162.146.170] (helo=skuns.kiev.zoral.com.ua) by relay02.kiev.sovam.com with esmtps (TLSv1:AES256-SHA:256) (Exim 4.67) (envelope-from ) id 1IJQP8-000LcV-9h; Fri, 10 Aug 2007 12:03:43 +0300 Received: from deviant.kiev.zoral.com.ua (root@[10.1.1.148]) by skuns.kiev.zoral.com.ua (8.14.1/8.14.1) with ESMTP id l7A8Z7cS079539 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Fri, 10 Aug 2007 11:35:07 +0300 (EEST) (envelope-from kostikbel@gmail.com) Received: from deviant.kiev.zoral.com.ua (kostik@localhost [127.0.0.1]) by deviant.kiev.zoral.com.ua (8.14.1/8.14.1) with ESMTP id l7A8Z7AI001263; Fri, 10 Aug 2007 11:35:07 +0300 (EEST) (envelope-from kostikbel@gmail.com) Received: (from kostik@localhost) by deviant.kiev.zoral.com.ua (8.14.1/8.14.1/Submit) id l7A8Z6Tl001262; Fri, 10 Aug 2007 11:35:06 +0300 (EEST) (envelope-from kostikbel@gmail.com) X-Authentication-Warning: deviant.kiev.zoral.com.ua: kostik set sender to kostikbel@gmail.com using -f Date: Fri, 10 Aug 2007 11:35:06 +0300 From: Kostik Belousov To: Xin LI Message-ID: <20070810083506.GS2738@deviant.kiev.zoral.com.ua> References: <200708100524.l7A5OnE4065132@repoman.freebsd.org> <20070810052455.0B4B716A4F4@hub.freebsd.org> Mime-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="UPvCt0eiAD9X+G9u" Content-Disposition: inline In-Reply-To: <20070810052455.0B4B716A4F4@hub.freebsd.org> User-Agent: Mutt/1.4.2.3i X-Virus-Scanned: ClamAV version 0.91.1, clamav-milter version 0.91.1 on skuns.kiev.zoral.com.ua X-Virus-Status: Clean X-Spam-Status: No, score=-1.4 required=5.0 tests=ALL_TRUSTED autolearn=failed version=3.2.1 X-Spam-Checker-Version: SpamAssassin 3.2.1 (2007-05-02) on skuns.kiev.zoral.com.ua X-Scanner-Signature: ebef06da57613c13a9510a9a5e517e93 X-DrWeb-checked: yes X-SpamTest-Envelope-From: kostikbel@gmail.com X-SpamTest-Group-ID: 00000000 X-SpamTest-Header: Not Detected X-SpamTest-Info: Profiles 1371 [August 10 2007] X-SpamTest-Info: helo_type=3 X-SpamTest-Method: none X-SpamTest-Rate: 0 X-SpamTest-Status: Not detected X-SpamTest-Status-Extended: not_detected X-SpamTest-Version: SMTP-Filter Version 3.0.0 [0255], KAS30/Release Cc: cvs-src@freebsd.org, src-committers@freebsd.org, cvs-all@freebsd.org Subject: Re: [src] cvs commit: src/sys/fs/tmpfs tmpfs.h tmpfs_subr.c tmpfs_vfsops.c tmpfs_vnops.c X-BeenThere: cvs-all@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: CVS commit messages for the entire tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 10 Aug 2007 09:26:26 -0000 --UPvCt0eiAD9X+G9u Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Fri, Aug 10, 2007 at 05:24:54AM +0000, Xin LI wrote: > delphij 2007-08-10 05:24:49 UTC >=20 > FreeBSD src repository >=20 > Modified files: > sys/fs/tmpfs tmpfs.h tmpfs_subr.c tmpfs_vfsops.c=20 > tmpfs_vnops.c=20 > Log: > MFp4: > =20 > - Respect cnflag and don't lock vnode always as LK_EXCLUSIVE [1] > - Properly lock around tn_vnode to avoid NULL deference > - Be more careful handling vnodes (*) > =20 > (*) This is a WIP > [1] by pjd via howardsu > =20 > Thanks kib@ for his valuable VFS related comments. > =20 > Tested with: fsx, fstest, tmpfs regression test set > Found by: pho's stress2 suite > Approved by: re (tmpfs blanket) > =20 > Revision Changes Path > 1.10 +2 -2 src/sys/fs/tmpfs/tmpfs.h > 1.11 +28 -19 src/sys/fs/tmpfs/tmpfs_subr.c > 1.9 +5 -2 src/sys/fs/tmpfs/tmpfs_vfsops.c > 1.9 +34 -13 src/sys/fs/tmpfs/tmpfs_vnops.c > Index: src/sys/fs/tmpfs/tmpfs_subr.c > diff -u src/sys/fs/tmpfs/tmpfs_subr.c:1.10 src/sys/fs/tmpfs/tmpfs_subr.c:= 1.11 > --- src/sys/fs/tmpfs/tmpfs_subr.c:1.10 Fri Aug 3 06:24:31 2007 > +++ src/sys/fs/tmpfs/tmpfs_subr.c Fri Aug 10 05:24:49 2007 > @@ -302,15 +308,20 @@ > * Returns zero on success or an appropriate error code on failure. > */ > int > -tmpfs_alloc_vp(struct mount *mp, struct tmpfs_node *node, struct vnode *= *vpp, > - struct thread *td) > +tmpfs_alloc_vp(struct mount *mp, struct tmpfs_node *node, int lkflag, > + struct vnode **vpp, struct thread *td) > { > int error; > struct vnode *vp; > =20 > loop: > + TMPFS_NODE_LOCK(node); > if ((vp =3D node->tn_vnode) !=3D NULL) { > - error =3D vget(vp, LK_EXCLUSIVE | LK_RETRY, td); > + VI_LOCK(vp); > + TMPFS_NODE_UNLOCK(node); > + vholdl(vp); > + error =3D vget(vp, lkflag | LK_INTERLOCK | LK_RETRY, td); > + vdrop(vp); > if (error) > return error; LK_RETRY prohibits the vget() and vn_lock() to return error. > Index: src/sys/fs/tmpfs/tmpfs_vnops.c > diff -u src/sys/fs/tmpfs/tmpfs_vnops.c:1.8 src/sys/fs/tmpfs/tmpfs_vnops.c= :1.9 > --- src/sys/fs/tmpfs/tmpfs_vnops.c:1.8 Thu Jul 19 03:34:50 2007 > +++ src/sys/fs/tmpfs/tmpfs_vnops.c Fri Aug 10 05:24:49 2007 > @@ -95,12 +95,20 @@ > !(cnp->cn_flags & ISDOTDOT))); > =20 > if (cnp->cn_flags & ISDOTDOT) { > - VOP_UNLOCK(dvp, 0, td); > + int ltype =3D 0; > =20 > + ltype =3D VOP_ISLOCKED(dvp, td); > + vholdl(dvp); vholdl() assumes that vnode interlock is locked, not vnode itself. You shall use vhold() when not holding vnode interlock. Later, you use dvp->v_mount, that could change to NULL once you dropped the dvp lock. Moreover, filesystem may be unmounted after you dropped vnode lock. UFS has the same problem. > + VOP_UNLOCK(dvp, 0, td); > /* Allocate a new vnode on the matching entry. */ > - error =3D tmpfs_alloc_vp(dvp->v_mount, dnode->tn_dir.tn_parent, vpp, t= d); > + error =3D tmpfs_alloc_vp(dvp->v_mount, dnode->tn_dir.tn_parent, > + cnp->cn_lkflags, vpp, td); > =20 > - vn_lock(dvp, LK_EXCLUSIVE | LK_RETRY, td); > + vn_lock(dvp, ltype | LK_RETRY, td); > + if (ltype & LK_INTERLOCK) > + vdropl(dvp); > + else > + vdrop(dvp); ltype cannot contain LK_INTERLOCK flag. Moreover, vn_lock() always returns with interlock being dropped. You shall simply vdrop(dvp) there. > =20 > dnode->tn_dir.tn_parent->tn_lookup_dirent =3D NULL; > } else if (cnp->cn_namelen =3D=3D 1 && cnp->cn_nameptr[0] =3D=3D '.') { --UPvCt0eiAD9X+G9u Content-Type: application/pgp-signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.7 (FreeBSD) iD8DBQFGvCM6C3+MBN1Mb4gRAvnKAJ4yBFu81yAdm3/aRM/mTEACvDJMXgCgpqJZ i3Ykfautlu8xg7/BDasOMYk= =rpuw -----END PGP SIGNATURE----- --UPvCt0eiAD9X+G9u--