shithub: riscv

Download patch

ref: b24ebff76a1d0ef99ecef551a78288642e6ea35b
parent: f616c63b399fed4f78121f387be9599e8e0c2b4c
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Sun Mar 12 17:23:21 EDT 2017

upas/fs: remove useless syncsem, make sure mbox is locked when fetching / syncing

--- a/sys/src/cmd/upas/fs/dat.h
+++ b/sys/src/cmd/upas/fs/dat.h
@@ -149,7 +149,6 @@
 struct Mailbox {
 	QLock;
 	long	idxsem;		/* abort on concurrent index access */
-	long	syncsem;		/* abort on concurrent syncs */
 	int	refs;
 	Mailbox	*next;
 	int	id;
--- a/sys/src/cmd/upas/fs/fs.c
+++ b/sys/src/cmd/upas/fs/fs.c
@@ -1244,6 +1244,7 @@
 		return nil;
 	}
 
+	qlock(f->mb);
 	switch(t){
 	case Qctl:
 		rhdr.count = 0;
@@ -1251,7 +1252,6 @@
 	case Qmboxctl:
 		i = mboxctlread(f->mb, &p);
 		goto output;
-		break;
 	case Qheader:
 		cacheheaders(f->mb, f->m);
 		rhdr.count = readheader(f->m, (char*)mbuf, off, cnt);
@@ -1287,6 +1287,7 @@
 		}
 		break;
 	}
+	qunlock(f->mb);
 	return nil;
 }
 
@@ -1410,7 +1411,10 @@
 			argc = tokenize(thdr.data, argv, nelem(argvbuf));
 			if(argc == 0)
 				return Ebadctl;
-			return f->mb->ctl(f->mb, argc, argv);
+			qlock(f->mb);
+			err = f->mb->ctl(f->mb, argc, argv);
+			qunlock(f->mb);
+			return err;
 		}
 		break;
 	case Qflags:
@@ -1419,11 +1423,10 @@
 		 */
 		if(!f->mb || !f->m)
 			break;
+		qlock(f->mb);
 		m = gettopmsg(f->mb, f->m);
 		err = modflags(f->mb, m, thdr.data);
-//		premature optimization?  flags not written immediately.
-//		if(err == nil && f->m->cstate&Cidxstale)
-//			wridxfile(f->mb);		/* syncmbox(f->mb, 1); */
+		qunlock(f->mb);
 		return err;
 	}
 	return Eperm;
@@ -1607,28 +1610,24 @@
 		t = time(0);
 		qlock(&mbllock);
 		for(mb = mbl; mb != nil; mb = mb->next){
-			assert(mb->refs > 0);
+			if(!canqlock(mb))
+				continue;
 			if(mb->waketime != 0 && t >= mb->waketime){
-				qlock(mb);
 				mb->waketime = 0;
 				break;
 			}
-
-			if(mb->d == nil || mb->d->name == nil)
-				continue;
-			d = dirstat(mb->path);
-			if(d == nil)
-				continue;
-
-			qlock(mb);
-			if(mb->d)
-			if(d->qid.path != mb->d->qid.path
-			   || d->qid.vers != mb->d->qid.vers){
-				free(d);
-				break;
+			if(mb->d != nil && mb->d->name != nil){
+				d = dirstat(mb->path);
+				if(d != nil){
+					if(d->qid.path != mb->d->qid.path
+					|| d->qid.vers != mb->d->qid.vers){
+						free(d);
+						break;
+					}
+					free(d);
+				}
 			}
 			qunlock(mb);
-			free(d);
 		}
 		qunlock(&mbllock);
 		if(mb != nil){
--- a/sys/src/cmd/upas/fs/mbox.c
+++ b/sys/src/cmd/upas/fs/mbox.c
@@ -66,15 +66,12 @@
 	int n, d, y, a;
 	Message *m, *next;
 
-	if(semacquire(&mb->syncsem, 0) <= 0)
-		return nil;
+	assert(canqlock(mb) == 0);
 	a = mb->root->subname;
 	if(rdidxfile(mb, doplumb) == -2)
 		wridxfile(mb);
-	if(s = mb->sync(mb, doplumb, &n)){
-		semrelease(&mb->syncsem, 1);
+	if(s = mb->sync(mb, doplumb, &n))
 		return s;
-	}
 	d = 0;
 	y = 0;
 	for(m = mb->root->part; m; m = next){
@@ -102,7 +99,6 @@
 		henter(PATH(0, Qtop), mb->name,
 			(Qid){PATH(mb->id, Qmbox), mb->vers, QTDIR}, nil, mb);
 	}
-	semrelease(&mb->syncsem, 1);
 	return nil;
 }
 
@@ -182,7 +178,6 @@
 	initheaders();
 	mb = emalloc(sizeof *mb);
 	mb->idxsem = 1;
-	mb->syncsem = 1;
 	mb->flags = flags;
 	strncpy(mb->path, path, sizeof mb->path - 1);
 	p = name;
@@ -1184,8 +1179,8 @@
 void
 mboxdecref(Mailbox *mb)
 {
-	assert(mb->refs > 0);
 	qlock(mb);
+	assert(mb->refs > 0);
 	mb->refs--;
 	if(mb->refs == 0){
 		syncmbox(mb, 1);