fix for remove for NFS through nullfs

Rick Macklem rmacklem at uoguelph.ca
Mon Jul 19 02:22:35 UTC 2010


Mikolaj Golub submitted the attached patch that fixes a problem w.r.t.
a nullfs mounted NFS mount point for remove. The problem is that,
without this patch, NFS does not see that a file is still open
(v_usecount > 1) when removed and removes it instead of silly renaming
it. This patch increments the v_usecount of the lower level vnode
during the remove call, so that silly rename works. kib@ has noted
that this may be "racy" and result in silly rename happening when it
isn't required but, imho, that is less of a problem than it never
working. (I have tested it a bit for NFS and UFS and it seems to
work for those file systems under a nullfs mount.)

Why I am posting is that I am wondering if anyone knows of a file
system type where this extra v_usecount on the vnode at the time of remove
will/might cause problems?

Thanks in advance for looking at this, rick
--- submitted patch for nullfs ---
--- fs/nullfs/null_vnops.c.sav	2010-07-18 19:33:00.000000000 -0400
+++ fs/nullfs/null_vnops.c	2010-07-18 19:35:25.000000000 -0400
@@ -499,6 +499,29 @@
  }

  /*
+ * 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.
+ */
+static int
+null_remove(struct vop_remove_args *ap)
+{
+	int retval;
+	struct vnode *lvp;
+	boolean_t vreleit;
+
+	if (ap->a_vp->v_usecount > 1) {
+		lvp = NULLVPTOLOWERVP(ap->a_vp);
+		VREF(lvp);
+		vreleit = TRUE;
+	} else
+		vreleit = FALSE;
+	retval = null_bypass(&ap->a_gen);
+	if (vreleit)
+		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.
@@ -809,6 +832,7 @@
  	.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,


More information about the freebsd-fs mailing list