Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 14 Sep 2010 01:28:05 +0000 (UTC)
From:      Rick Macklem <rmacklem@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org
Subject:   svn commit: r212590 - stable/8/sys/fs/nullfs
Message-ID:  <201009140128.o8E1S5ZV051863@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: rmacklem
Date: Tue Sep 14 01:28:05 2010
New Revision: 212590
URL: http://svn.freebsd.org/changeset/base/212590

Log:
  MFC: r212043
  Add a null_remove() function to nullfs, so that the v_usecount
  of the lower level vnode is incremented to greater than 1 when
  the upper level vnode's v_usecount is greater than one. This
  is necessary for the NFS clients, so that they will do a silly
  rename of the file instead of actually removing it when the
  file is still in use. It is "racy", since the v_usecount is
  incremented in many places in the kernel with
  minimal synchronization, but an extraneous silly rename is
  preferred to not doing a silly rename when it is required.
  The only other file systems that currently check the value
  of v_usecount in their VOP_REMOVE() functions are nwfs and
  smbfs. These file systems choose to fail a remove when the
  v_usecount is greater than 1 and I believe will function
  more correctly with this patch, as well.

Modified:
  stable/8/sys/fs/nullfs/null_vnops.c
Directory Properties:
  stable/8/sys/   (props changed)
  stable/8/sys/amd64/include/xen/   (props changed)
  stable/8/sys/cddl/contrib/opensolaris/   (props changed)
  stable/8/sys/contrib/dev/acpica/   (props changed)
  stable/8/sys/contrib/pf/   (props changed)
  stable/8/sys/dev/xen/xenpci/   (props changed)

Modified: stable/8/sys/fs/nullfs/null_vnops.c
==============================================================================
--- stable/8/sys/fs/nullfs/null_vnops.c	Tue Sep 14 01:27:53 2010	(r212589)
+++ stable/8/sys/fs/nullfs/null_vnops.c	Tue Sep 14 01:28:05 2010	(r212590)
@@ -499,6 +499,32 @@ null_accessx(struct vop_accessx_args *ap
 }
 
 /*
+ * Increasing refcount of lower vnode is needed at least for the case
+ * when lower FS is NFS to do sillyrename if the file is in use.
+ * Unfortunately v_usecount is incremented in many places in
+ * the kernel and, as such, there may be races that result in
+ * the NFS client doing an extraneous silly rename, but that seems
+ * preferable to not doing a silly rename when it is needed.
+ */
+static int
+null_remove(struct vop_remove_args *ap)
+{
+	int retval, vreleit;
+	struct vnode *lvp;
+
+	if (vrefcnt(ap->a_vp) > 1) {
+		lvp = NULLVPTOLOWERVP(ap->a_vp);
+		VREF(lvp);
+		vreleit = 1;
+	} else
+		vreleit = 0;
+	retval = null_bypass(&ap->a_gen);
+	if (vreleit != 0)
+		vrele(lvp);
+	return (retval);
+}
+
+/*
  * We handle this to eliminate null FS to lower FS
  * file moving. Don't know why we don't allow this,
  * possibly we should.
@@ -808,6 +834,7 @@ struct vop_vector null_vnodeops = {
 	.vop_open =		null_open,
 	.vop_print =		null_print,
 	.vop_reclaim =		null_reclaim,
+	.vop_remove =		null_remove,
 	.vop_rename =		null_rename,
 	.vop_setattr =		null_setattr,
 	.vop_strategy =		VOP_EOPNOTSUPP,



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