svn commit: r244663 - stable/9

Alfred Perlstein bright at mu.org
Mon Dec 24 20:03:57 UTC 2012


On 12/24/12 11:24 AM, Adrian Chadd wrote:
> ... why'd we break the KBI in a stable branch?
>
I am not sure either.

I think a single VOP for nullfs (while ugly) would have sufficed.

I have a partial patch here that shows the direction I was going.

What's left is to:
  shim #defines for -stable to route the "new" vops from -current 
(VOP_ISTEXT, VOP_WRITECOUNT..) into just plain #defines inside of 
vnode.h to call into VOP_NULLFS_CALLTHROUGH with the proper 
VOP_NULLFS_IS_TEXT/VOP_NULLFS_SET_TEXT and remap stuff around into 
struct vop_nullfs_callthrough_args.
  best way to do this would be to just copy the code from the -current 
vnode_if.h into sys/vnode.h and hack it up for that it maps properly.

Partial patch attached.

-Alfred

>
> Adrian
>
>
> On 24 December 2012 06:22, Konstantin Belousov <kib at freebsd.org> wrote:
>> Author: kib
>> Date: Mon Dec 24 14:22:52 2012
>> New Revision: 244663
>> URL: http://svnweb.freebsd.org/changeset/base/244663
>>
>> Log:
>>    Note that filesystem modules must be recompiled.
>>
>> Modified:
>>    stable/9/UPDATING
>>
>> Modified: stable/9/UPDATING
>> ==============================================================================
>> --- stable/9/UPDATING   Mon Dec 24 14:12:43 2012        (r244662)
>> +++ stable/9/UPDATING   Mon Dec 24 14:22:52 2012        (r244663)
>> @@ -11,6 +11,11 @@ handbook:
>>   Items affecting the ports and packages system can be found in
>>   /usr/ports/UPDATING.  Please read that file before running portupgrade.
>>
>> +20121224:
>> +       The VFS KBI was changed with the merge of several nullfs
>> +       optimizations and fixes.  All filesystem modules must be
>> +       recompiled.
>> +
>>   20121218:
>>          With the addition of auditdistd(8), a new auditdistd user is now
>>          depended on during installworld.  "mergemaster -p" can be used to add

-------------- next part --------------
diff --git a/sys/kern/vfs_default.c b/sys/kern/vfs_default.c
index fd2437b..f109bc8 100644
--- a/sys/kern/vfs_default.c
+++ b/sys/kern/vfs_default.c
@@ -78,6 +78,8 @@ static int	dirent_exists(struct vnode *vp, const char *dirname,
 
 #define DIRENT_MINSIZE (sizeof(struct dirent) - (MAXNAMLEN+1) + 4)
 
+static int vop_nullfs_callthrough(struct vop_nullfs_callthrough_args *ap);
+
 static int vop_stdis_text(struct vop_is_text_args *ap);
 static int vop_stdset_text(struct vop_set_text_args *ap);
 static int vop_stdunset_text(struct vop_unset_text_args *ap);
@@ -132,11 +134,7 @@ struct vop_vector default_vnodeops = {
 	.vop_unp_bind =		vop_stdunp_bind,
 	.vop_unp_connect =	vop_stdunp_connect,
 	.vop_unp_detach =	vop_stdunp_detach,
-	.vop_is_text =		vop_stdis_text,
-	.vop_set_text =		vop_stdset_text,
-	.vop_unset_text =	vop_stdunset_text,
-	.vop_get_writecount =	vop_stdget_writecount,
-	.vop_add_writecount =	vop_stdadd_writecount,
+	.vop_nullfs_callthrough =   vop_stdnullfs_callthrough,
 };
 
 /*
@@ -1085,6 +1083,54 @@ vop_stdunp_detach(struct vop_unp_detach_args *ap)
 }
 
 static int
+vop_stdnullfs_callthrough(struct vop_nullfs_callthrough_args *ap)
+{
+
+	switch (ap->a_op) {
+	case VOP_NULLFS_IS_TEXT:
+		{
+			struct vop_is_text_args ap2;
+			ap2.a_vp = ap->a_vp;
+			return vop_stdis_text(&ap2);
+		}
+	case VOP_NULLFS_SET_TEXT:
+		{
+			struct vop_set_text_args ap2;
+			ap2.a_vp = ap->a_vp;
+			return vop_stdset_text(&ap2);
+		}
+	case VOP_NULLFS_UNSET_TEXT:
+		{
+			struct vop_unset_text_args ap2;
+			ap2.a_vp = ap->a_vp;
+			return vop_stdunset_text(&ap2);
+		}
+	case VOP_NULLFS_GET_WRITECOUNT:
+		{
+			struct vop_get_writecount_args ap2;
+			int error;
+			int writecount;
+
+			ap2.a_vp = ap->a_vp;
+			ap2.a_writecount = &writecount;
+			error = vop_stdget_writecount(&ap2);
+			*((int *)ap->a_out0) = writecount;
+			return (error);
+		}
+	case VOP_NULLFS_ADD_WRITECOUNT:
+		{
+			struct vop_add_writecount_args ap2;
+
+			ap2.a_vp = ap->a_vp;
+			ap2.a_inc = ap->a_in0;
+			return vop_stdadd_writecount(&ap2);
+		}
+	default:
+		return (EOPNOTSUPP);
+	}
+}
+
+static int
 vop_stdis_text(struct vop_is_text_args *ap)
 {
 
diff --git a/sys/kern/vnode_if.src b/sys/kern/vnode_if.src
index 194e9f8..2bcc80a 100644
--- a/sys/kern/vnode_if.src
+++ b/sys/kern/vnode_if.src
@@ -658,36 +658,12 @@ vop_unp_detach {
 	IN struct vnode *vp;
 };
 
-%% is_text	vp	L L L
+%% nullfs_callthrough	vp  = = =
 
-vop_is_text {
+vop_nullfs_callthrough {
 	IN struct vnode *vp;
-};
-
-%% set_text	vp	E E E
-
-vop_set_text {
-	IN struct vnode *vp;
-};
-
-%% vop_unset_text	vp	E E E
-
-vop_unset_text {
-	IN struct vnode *vp;
-};
-
-%% get_writecount	vp	L L L
-
-vop_get_writecount {
-	IN struct vnode *vp;
-	OUT int *writecount;
-};
-
-%% add_writecount	vp	E E E
-
-vop_add_writecount {
-	IN struct vnode *vp;
-	IN int inc;
+	IN  uintptr_t in0;
+	OUT uintptr_t *out0;
 };
 
 # The VOPs below are spares at the end of the table to allow new VOPs to be
@@ -695,10 +671,6 @@ vop_add_writecount {
 # be added above these spares.  When merging a new VOP to a stable branch,
 # the new VOP should replace one of the spares.
 
-vop_spare4 {
-	IN struct vnode *vp;
-};
-
 vop_spare5 {
 	IN struct vnode *vp;
 };


More information about the svn-src-stable-9 mailing list