code: plan9front

Download patch

ref: c91e9322f1f76fa86db69ade780110664750408d
parent: 5e6f3db0d764ef8774e880c96e95f805df6a09e9
author: Ori Bernstein <ori@eigenstate.org>
date: Sat Jun 8 12:21:16 EDT 2024

gefs: only start epochs for console procs that need them

we shouldn't need to defer reclamation for procs that
don't actually interact with the tree directly, especially
since if they send on a channel they can stall for a while.

--- a/sys/src/cmd/gefs/cons.c
+++ b/sys/src/cmd/gefs/cons.c
@@ -14,6 +14,7 @@
 	char	*sub;
 	int	minarg;
 	int	maxarg;
+	int	epoch;
 	void	(*fn)(int, char**, int);
 };
 
@@ -391,7 +392,7 @@
 
 Cmd cmdtab[] = {
 	/* admin */
-	{.name="check",		.sub=nil,	.minarg=0, .maxarg=0, .fn=fsckfs},
+	{.name="check",		.sub=nil,	.minarg=0, .maxarg=0, .fn=fsckfs, .epoch=1},
 	{.name="df",		.sub=nil, 	.minarg=0, .maxarg=0, .fn=showdf},
 	{.name="halt",		.sub=nil,	.minarg=0, .maxarg=0, .fn=haltfs},
 	{.name="help",		.sub=nil,	.minarg=0, .maxarg=0, .fn=help},
@@ -403,9 +404,9 @@
 
 	/* debugging */
 	{.name="show",		.sub="fid",	.minarg=0, .maxarg=0, .fn=showfid},
-	{.name="show",		.sub="tree",	.minarg=0, .maxarg=1, .fn=showtree},
+	{.name="show",		.sub="tree",	.minarg=0, .maxarg=1, .fn=showtree, .epoch=1},
 	{.name="show",		.sub="users",	.minarg=0, .maxarg=0, .fn=showusers},
-	{.name="show",		.sub="bstate",	.minarg=0, .maxarg=0, .fn=showbstate},
+	{.name="show",		.sub="bstate",	.minarg=0, .maxarg=0, .fn=showbstate, .epoch=1},
 	{.name="show",		.sub="free",	.minarg=0, .maxarg=0, .fn=showfree},
 	{.name="debug",		.sub=nil,	.minarg=0, .maxarg=1, .fn=setdbg},
 	{.name="save",		.sub="trace",	.minarg=0, .maxarg=1, .fn=savetrace},
@@ -424,11 +425,10 @@
 		fprint(fd, "gefs# ");
 		if((n = read(fd, buf, sizeof(buf)-1)) == -1)
 			break;
-		epochstart(tid);
 		buf[n] = 0;
 		nf = tokenize(buf, f, nelem(f));
 		if(nf == 0 || strlen(f[0]) == 0)
-			goto Next;
+			continue;
 		for(c = cmdtab; c->name != nil; c++){
 			ap = f;
 			na = nf;
@@ -444,7 +444,15 @@
 			}
 			if(na < c->minarg || na > c->maxarg)
 				continue;
-			c->fn(fd, ap, na);
+			if(c->epoch)
+				epochstart(tid);
+			if(!waserror()){
+				c->fn(fd, ap, na);
+				poperror();
+			}else
+				fprint(fd, "%s: %s\n", f[0], errmsg());
+			if(c->epoch)
+				epochend(tid);
 			break;
 		}
 		if(c->name == nil){
@@ -453,7 +461,5 @@
 				fprint(fd, " %s", f[i]);
 			fprint(fd, "'\n");
 		}
-Next:
-		epochend(tid);
 	}
 }