ref: f5a0673424c39533b76e08a3b4a754c3f66f4bb4
parent: 898b283a3c6c6df204e648269a9283cb7c026df8
author: Michael Forney <mforney@mforney.org>
date: Tue Mar 22 01:34:29 EDT 2022
fs: avoid btlookup in fsstat We already have the Xdir struct in the Dent, so we just need to make sure that we keep the name field updated.
--- a/fs.c
+++ b/fs.c
@@ -359,6 +359,7 @@
return nil;
de->k = de->buf;
de->nk = e - de->buf;
+ de->name = de->buf + 11;
de->next = fs->dtab[h];
fs->dtab[h] = de;
@@ -937,10 +938,9 @@
static void
fsstat(Fmsg *m)
{
- char *err, buf[STATMAX], kvbuf[Kvmax];
+ char buf[STATMAX];
Fcall r;
Fid *f;
- Kvp kv;
int n;
if((f = getfid(m->conn, m->fid)) == nil){
@@ -947,12 +947,10 @@
rerror(m, Efid);
return;
}
- if((err = lookup(f, f->dent, &kv, kvbuf, sizeof(kvbuf))) != nil){
- rerror(m, err);
- putfid(f);
- return;
- }
- if((n = kv2statbuf(&kv, buf, sizeof(buf))) == -1){
+ rlock(f->dent);
+ n = dir2statbuf(f->dent, buf, sizeof(buf));
+ runlock(f->dent);
+ if(n == -1){
rerror(m, "stat: %r");
putfid(f);
return;
--- a/pack.c
+++ b/pack.c
@@ -247,7 +247,6 @@
v = unpack32(&err, v, ev, &d->gid);
v = unpack32(&err, v, ev, &d->muid);
if(err){
-// print("fucked: %P\n", kv);
werrstr("val too small [%s]", d->name);
return -1;
}
@@ -263,33 +262,29 @@
}
int
-kv2statbuf(Kvp *kv, char *buf, int nbuf)
+dir2statbuf(Xdir *d, char *buf, int nbuf)
{
int sz, nn, nu, ng, nm, ret;
vlong atime, mtime;
User *u, *g, *m;
char *p;
- Xdir d;
- if(kv2dir(kv, &d) == -1)
- return -1;
-
ret = -1;
rlock(&fs->userlk);
- if((u = uid2user(d.uid)) == nil)
+ if((u = uid2user(d->uid)) == nil)
goto Out;
- if((g = uid2user(d.gid)) == nil)
+ if((g = uid2user(d->gid)) == nil)
goto Out;
- if((m = uid2user(d.muid)) == nil)
+ if((m = uid2user(d->muid)) == nil)
goto Out;
p = buf;
- nn = strlen(d.name);
+ nn = strlen(d->name);
nu = strlen(u->name);
ng = strlen(g->name);
nm = strlen(m->name);
- atime = (d.atime+Nsec/2)/Nsec;
- mtime = (d.mtime+Nsec/2)/Nsec;
+ atime = (d->atime+Nsec/2)/Nsec;
+ mtime = (d->mtime+Nsec/2)/Nsec;
sz = STATFIXLEN + nn + nu + ng + nm;
if(sz > nbuf)
goto Out;
@@ -297,16 +292,16 @@
PBIT16(p, sz-2); p += 2;
PBIT16(p, -1 /*type*/); p += 2;
PBIT32(p, -1 /*dev*/); p += 4;
- PBIT8(p, d.qid.type); p += 1;
- PBIT32(p, d.qid.vers); p += 4;
- PBIT64(p, d.qid.path); p += 8;
- PBIT32(p, d.mode); p += 4;
+ PBIT8(p, d->qid.type); p += 1;
+ PBIT32(p, d->qid.vers); p += 4;
+ PBIT64(p, d->qid.path); p += 8;
+ PBIT32(p, d->mode); p += 4;
PBIT32(p, atime); p += 4;
PBIT32(p, mtime); p += 4;
- PBIT64(p, d.length); p += 8;
+ PBIT64(p, d->length); p += 8;
PBIT16(p, nn); p += 2;
- memcpy(p, d.name, nn); p += nn;
+ memcpy(p, d->name, nn); p += nn;
PBIT16(p, nu); p += 2;
memcpy(p, u->name, nu); p += nu;
PBIT16(p, ng); p += 2;
@@ -318,6 +313,16 @@
Out:
runlock(&fs->userlk);
return ret;
+}
+
+int
+kv2statbuf(Kvp *kv, char *buf, int nbuf)
+{
+ Xdir d;
+
+ if(kv2dir(kv, &d) == -1)
+ return -1;
+ return dir2statbuf(&d, buf, nbuf);
}
int