git: 9front

Download patch

ref: b3740bc0186af76a0dcaa0676fe32dd0d4b4e69e
parent: 6195f423636d713923ecd02fd2067e2bf85855ad
author: cinap_lenrek <cinap_lenrek@gmx.de>
date: Thu Nov 15 11:43:35 EST 2012

hjfs: fix more missing dirty marks, error handling, cleanup

--- a/sys/src/cmd/hjfs/auth.c
+++ b/sys/src/cmd/hjfs/auth.c
@@ -397,22 +397,22 @@
 	c = getbuf(ch->fs->d, f.blk, TDENTRY, 0);
 	if(c == nil)
 		goto direrr2;
+	c->op |= BDELWRI;
 	d = &c->de[f.deind];
-	memset(d, 0, sizeof(Dentry));
-	strncpy(d->name, name, NAMELEN - 1);
-	d->uid = uid;
-	d->muid = uid;
-	d->gid = uid;
-	d->mode = DALLOC | 0775;
+	memset(d, 0, sizeof(*d));
 	if(newqid(fs, &d->path) < 0){
 	direrr3:
 		putbuf(c);
 		goto direrr2;
 	}
+	strncpy(d->name, name, NAMELEN - 1);
+	d->uid = uid;
+	d->muid = uid;
+	d->gid = uid;
+	d->mode = DALLOC | 0775;
 	d->type = QTDIR;
 	d->atime = time(0);
 	d->mtime = d->atime;
-	c->op |= BDELWRI;
 	goto direrr3;
 }
 
--- a/sys/src/cmd/hjfs/fs1.c
+++ b/sys/src/cmd/hjfs/fs1.c
@@ -549,6 +549,7 @@
 			if(b == nil)
 				return -1;
 			memset(b->offs, 0, sizeof(b->offs));
+			b->op |= BDELWRI;
 		}else{
 			if(mode != GBREAD && chref(fs, *loc, 0) > 1){
 				if(dumpblk(fs, L, loc) < 0){
@@ -632,9 +633,10 @@
 		b = getbuf(fs->d, *l, TINDIR, 0);
 		if(b != nil){
 			for(k = 0; k < OFFPERBLK; k++)
-				if(b->offs[k] != 0)
+				if(b->offs[k] != 0){
 					delindir(fs, &b->offs[k], n-1);
-			b->op |= BDELWRI;
+					b->op |= BDELWRI;
+				}
 			putbuf(b);
 		}
 	}
@@ -702,6 +704,7 @@
 		if(d->db[blk] != 0){
 			putfree(fs, d->db[blk]);
 			d->db[blk] = 0;
+			bd->op |= BDELWRI;
 		}
 		blk++;
 	}
@@ -856,6 +859,7 @@
 	if((d->type & QTDIR) == 0){
 		trunc(fs, l, b, 0);
 		memset(d, 0, sizeof(*d));
+		b->op |= BDELWRI;
 		return 0;
 	}
 	first = last = emalloc(sizeof(Del));
--- a/sys/src/cmd/hjfs/fs2.c
+++ b/sys/src/cmd/hjfs/fs2.c
@@ -146,6 +146,8 @@
 	c = getbuf(ch->fs->d, f.blk, TDENTRY, 0);
 	if(c == nil)
 		goto error;
+	c->op |= BDELWRI;
+	b->op |= BDELWRI;
 	modified(ch, d);
 	if(isdir)
 		perm &= ~0777 | d->mode & 0777;
@@ -152,9 +154,11 @@
 	else
 		perm &= ~0666 | d->mode & 0666;
 	d = &c->de[f.deind];
-	memset(d, 0, sizeof(Dentry));
-	if(newqid(ch->fs, &d->path) < 0)
+	memset(d, 0, sizeof(*d));
+	if(newqid(ch->fs, &d->path) < 0){
+		putbuf(c);
 		goto error;
+	}
 	d->type = perm >> 24;
 	strcpy(d->name, name);
 	d->mtime = time(0);
@@ -169,8 +173,6 @@
 		ch->loc->lwrite = d->atime;
 		qunlock(&ch->loc->ex);
 	}
-	c->op |= BDELWRI;
-	b->op |= BDELWRI;
 	putbuf(c);
 	putbuf(b);
 	switch(mode & OEXEC){
@@ -259,6 +261,7 @@
 	if((mode & OTRUNC) != 0){
 		trunc(ch->fs, ch->loc, b, 0);
 		modified(ch, d);
+		b->op |= BDELWRI;
 	}
 	if((mode & ORCLOSE) != 0)
 		ch->open |= CHRCLOSE;
@@ -568,6 +571,7 @@
 
 	chbegin(ch);
 	rc = 1;
+	b = p = nil;
 	if(ch->open & CHRCLOSE){
 		if((ch->flags & CHFRO) != 0)
 			goto inval;
@@ -584,27 +588,17 @@
 		if(p == nil)
 			goto err;
 		b = getbuf(ch->fs->d, ch->loc->blk, TDENTRY, 0);
-		if(b == nil){
-			putbuf(p);
+		if(b == nil)
 			goto err;
-		}
 		if(!permcheck(ch->fs, &p->de[ch->loc->next->deind], ch->uid, OWRITE)){
 			werrstr(Eperm);
-			putbuf(b);
-			putbuf(p);
 			goto err;
 		}
 		d = &b->de[ch->loc->deind];
-		if((d->type & QTDIR) != 0 && findentry(ch->fs, ch->loc, b, nil, nil, ch->flags & CHFDUMP) != 0){
-			putbuf(b);
-			putbuf(p);
+		if((d->type & QTDIR) != 0 && findentry(ch->fs, ch->loc, b, nil, nil, ch->flags & CHFDUMP) != 0)
 			goto inval;
-		}
-		if((d->mode & DGONE) != 0){
-			putbuf(b);
-			putbuf(p);
+		if((d->mode & DGONE) != 0)
 			goto done;
-		}
 		qlock(&ch->fs->loctree);
 		if(ch->loc->ref > 1){
 			d->mode &= ~DALLOC;
@@ -617,10 +611,12 @@
 			rc = delete(ch->fs, ch->loc, b);
 		}
 		b->op |= BDELWRI;
-		putbuf(b);
-		putbuf(p);
 	}
 done:
+	if(b != nil)
+		putbuf(b);
+	if(p != nil)
+		putbuf(p);
 	if((ch->loc->type & QTEXCL) != 0){
 		qlock(&ch->loc->ex);
 		if(ch->loc->exlock == ch)
@@ -650,38 +646,24 @@
 		chend(ch);
 		return -1;
 	}
-	pb = nil;
+	b = pb = nil;
 	if(*di->name){
-		if(!namevalid(di->name) || ch->loc->next == nil){
-			werrstr(Einval);
-			chend(ch);
-			return -1;
-		}
+		if(!namevalid(di->name) || ch->loc->next == nil)
+			goto inval;
 		pb = getbuf(ch->fs->d, ch->loc->next->blk, TDENTRY, 0);
-		if(pb == nil){
-			chend(ch);
-			return -1;
-		}
-		if(!permcheck(ch->fs, &pb->de[ch->loc->next->deind], ch->uid, OWRITE)){
-			werrstr(Eperm);
-			putbuf(pb);
-			chend(ch);
-			return -1;
-		}
+		if(pb == nil)
+			goto error;
+		if(!permcheck(ch->fs, &pb->de[ch->loc->next->deind], ch->uid, OWRITE))
+			goto perm;
 		rc = findentry(ch->fs, ch->loc->next, pb, di->name, nil, ch->flags & CHFDUMP);
 		if(rc > 0)
 			werrstr(Eexists);
-		if(rc != 0){
-			putbuf(pb);
-			chend(ch);
-			return -1;
-		}
+		if(rc != 0)
+			goto error;
 	}
 	b = getbuf(ch->fs->d, ch->loc->blk, TDENTRY, 0);
-	if(b == nil){
-		chend(ch);
-		return -1;
-	}
+	if(b == nil)
+		goto error;
 	d = &b->de[ch->loc->deind];
 	isdir = (d->type & QTDIR) != 0;
 	owner = ch->uid == d->uid || ingroup(ch->fs, ch->uid, d->gid, 1) || (ch->fs->flags & FSNOPERM) != 0;
@@ -741,7 +723,8 @@
 error:
 	if(pb != nil)
 		putbuf(pb);
-	putbuf(b);
+	if(b != nil)
+		putbuf(b);
 	chend(ch);
 	return -1;
 }
--