shithub: front

Download patch

ref: 89017223e127f17dd7b3b3ce2c250ade8bd1655f
parent: 421057ca68b328aa9434b6a5eba51d9ff7173503
author: Ori Bernstein <ori@eigenstate.org>
date: Mon May 27 21:56:26 EDT 2024

gefs: allow halting read-only file system

we would bail out of any adm op when we were in
read-only mode; we should really complain and
skip when we're not shutting it down.

--- a/sys/src/cmd/gefs/fs.c
+++ b/sys/src/cmd/gefs/fs.c
@@ -2149,7 +2149,8 @@
 	if(f->dent->mode & DMAPPEND)
 		o = f->dent->length;
 	t = agetp(&f->mnt->root);
-	for(i = 0; i < nelem(kv)-1 && c != 0; i++){
+	for(i = 0; c != 0; i++){
+		assert(i < nelem(kv));
 		assert(i == 0 || o%Blksz == 0);
 		kv[i].op = Oinsert;
 		kv[i].k = kbuf[i];
@@ -2454,10 +2455,6 @@
 		sysfatal("malloc log heads");
 	while(1){
 		am = chrecv(fs->admchan);
-		if(agetl(&fs->rdonly)){
-			fprint(2, "spurious adm message\n");
-			break;
-		}
 		switch(am->op){
 		case AOsync:
 			tracem("syncreq");
@@ -2527,8 +2524,8 @@
 		case AOsnap:
 			tracem("snapreq");
 			if(agetl(&fs->rdonly)){
-				fprint(2, "read only fs");
-				continue;
+				fprint(2, "snap on read only fs");
+				goto Next;
 			}
 			if(waserror()){
 				fprint(2, "taking snap: %s\n", errmsg());
@@ -2558,6 +2555,10 @@
 			break;
 
 		case AOrclose:
+			if(agetl(&fs->rdonly)){
+				fprint(2, "rclose on read only fs");
+				goto Next;
+			}
 			nm = 0;
 			mb[nm].op = Odelete;
 			mb[nm].k = am->dent->k;
@@ -2577,6 +2578,10 @@
 			qunlock(&fs->mutlk);
 			/* fallthrough */
 		case AOclear:
+			if(agetl(&fs->rdonly)){
+				fprint(2, "clear on read only fs");
+				goto Next;
+			}
 			tracem("bgclear");
 			if(waserror()){
 				fprint(2, "clear file %llx: %s\n", am->qpath, errmsg());
--