diff options
author | cinap_lenrek <cinap_lenrek@gmx.de> | 2012-11-15 16:43:35 +0100 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@gmx.de> | 2012-11-15 16:43:35 +0100 |
commit | df829e6c07ddc515fa6c00e4baa888dfaecbd26d (patch) | |
tree | ad203af66897546e81293ab4e21df305458c1936 /sys/src/cmd/hjfs/fs2.c | |
parent | 7ced300071e59a22a8afddee2a4bb242987ea214 (diff) |
hjfs: fix more missing dirty marks, error handling, cleanup
Diffstat (limited to 'sys/src/cmd/hjfs/fs2.c')
-rw-r--r-- | sys/src/cmd/hjfs/fs2.c | 73 |
1 files changed, 28 insertions, 45 deletions
diff --git a/sys/src/cmd/hjfs/fs2.c b/sys/src/cmd/hjfs/fs2.c index 3b25287d8..cdc7a6cd6 100644 --- a/sys/src/cmd/hjfs/fs2.c +++ b/sys/src/cmd/hjfs/fs2.c @@ -146,15 +146,19 @@ chancreat(Chan *ch, char *name, int perm, int mode) 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; 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 @@ chancreat(Chan *ch, char *name, int perm, int mode) 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 @@ chanopen(Chan *ch, int mode) 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 @@ chanclunk(Chan *ch) chbegin(ch); rc = 1; + b = p = nil; if(ch->open & CHRCLOSE){ if((ch->flags & CHFRO) != 0) goto inval; @@ -584,27 +588,17 @@ chanclunk(Chan *ch) 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 @@ chanclunk(Chan *ch) 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 @@ chanwstat(Chan *ch, Dir *di) 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 @@ perm: error: if(pb != nil) putbuf(pb); - putbuf(b); + if(b != nil) + putbuf(b); chend(ch); return -1; } |