diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2014-08-02 19:22:10 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2014-08-02 19:22:10 +0200 |
commit | 5302e88796f0ad7fb2490e68b72ef6cd417dfb03 (patch) | |
tree | c213e118e977033b6c616f80d410902bd9e69fa7 /sys/src/cmd/exportfs | |
parent | b185d2fe5c28aa1ba7bd0469c84a01e791d76f5e (diff) |
exportfs: simplify freefile() code
remove impossible checks, rewrite as while loop.
Diffstat (limited to 'sys/src/cmd/exportfs')
-rw-r--r-- | sys/src/cmd/exportfs/exportfs.c | 44 |
1 files changed, 19 insertions, 25 deletions
diff --git a/sys/src/cmd/exportfs/exportfs.c b/sys/src/cmd/exportfs/exportfs.c index 24308dcc4..af0b6ac62 100644 --- a/sys/src/cmd/exportfs/exportfs.c +++ b/sys/src/cmd/exportfs/exportfs.c @@ -587,30 +587,25 @@ freefile(File *f) { File *parent, *child; -Loop: - f->ref--; - if(f->ref > 0) - return; - freecnt++; - if(f->ref < 0) abort(); - DEBUG(DFD, "free %s\n", f->name); - /* delete from parent */ - parent = f->parent; - if(parent->child == f) - parent->child = f->childlist; - else{ - for(child=parent->child; child->childlist!=f; child=child->childlist) - if(child->childlist == nil) - fatal("bad child list"); - child->childlist = f->childlist; + while(--f->ref == 0){ + freecnt++; + DEBUG(DFD, "free %s\n", f->name); + /* delete from parent */ + parent = f->parent; + if(parent->child == f) + parent->child = f->childlist; + else{ + for(child = parent->child; child->childlist != f; child = child->childlist) { + if(child->childlist == nil) + fatal("bad child list"); + } + child->childlist = f->childlist; + } + freeqid(f->qidt); + free(f->name); + free(f); + f = parent; } - freeqid(f->qidt); - free(f->name); - f->name = nil; - free(f); - f = parent; - if(f != nil) - goto Loop; } File * @@ -744,8 +739,7 @@ freeqid(Qidtab *q) ulong h; Qidtab *l; - q->ref--; - if(q->ref > 0) + if(--q->ref) return; qfreecnt++; h = qidhash(q->path); |