提交 e8a0e696 创建 作者: Nickolai Zeldovich's avatar Nickolai Zeldovich

dirname keytype

上级 a2071cf6
......@@ -104,6 +104,7 @@ enum {
nskey_int = 1,
nskey_ii,
nskey_str,
nskey_dirname,
nskey_iis
};
......@@ -116,6 +117,7 @@ struct nskey {
uint b;
} ii;
char *s;
char *dirname;
struct {
uint a;
uint b;
......@@ -127,6 +129,7 @@ struct nskey {
#define KI(v) (struct nskey){.type=nskey_int,.u.i=v}
#define KII(x,y) (struct nskey){.type=nskey_ii,.u.ii.a=x,.u.ii.b=y}
#define KS(v) (struct nskey){.type=nskey_str,.u.s=v}
#define KD(v) (struct nskey){.type=nskey_dirname,.u.dirname=v}
#define KIIS(x,y,z) (struct nskey){.type=nskey_iis,.u.iis.a=x, \
.u.iis.b=y, \
.u.iis.s=z}
......
......@@ -231,8 +231,8 @@ ifree(void *arg)
struct inode *ip = arg;
if (ip->dir) {
ns_remove(ip->dir, KS("."), 0);
ns_remove(ip->dir, KS(".."), 0);
ns_remove(ip->dir, KD("."), 0);
ns_remove(ip->dir, KD(".."), 0);
nsfree(ip->dir);
ip->dir = 0;
}
......@@ -576,10 +576,7 @@ dir_init(struct inode *dp)
if (de->inum == 0)
continue;
char namebuf[DIRSIZ+1];
strncpy(namebuf, de->name, DIRSIZ);
namebuf[DIRSIZ] = '\0';
ns_insert(dir, KS(namebuf), (void*) (uint) de->inum);
ns_insert(dir, KD(de->name), (void*) (uint) de->inum);
}
brelse(bp, 0);
}
......@@ -595,7 +592,7 @@ dirlookup(struct inode *dp, char *name)
{
dir_init(dp);
void *vinum = ns_lookup(dp->dir, KS(name));
void *vinum = ns_lookup(dp->dir, KD(name));
uint inum = (uint) vinum;
//cprintf("dirlookup: %x (%d): %s -> %d\n", dp, dp->inum, name, inum);
......@@ -612,7 +609,7 @@ dirlink(struct inode *dp, char *name, uint inum)
dir_init(dp);
//cprintf("dirlink: %x (%d): %s -> %d\n", dp, dp->inum, name, inum);
return ns_insert(dp->dir, KS(name), (void*)inum);
return ns_insert(dp->dir, KD(name), (void*)inum);
}
//PAGEBREAK!
......
......@@ -2,6 +2,7 @@
#include "defs.h"
#include "spinlock.h"
#include "param.h"
#include "fs.h"
#include <stddef.h>
// name spaces
......@@ -24,6 +25,7 @@ struct elem {
uint b;
} iikey;
char skey[0];
char dnkey[DIRSIZ];
struct {
uint a;
uint b;
......@@ -91,6 +93,9 @@ elemalloc(struct nskey *k)
case nskey_str:
sz = offsetof(struct elem, skey) + strlen(k->u.s) + 1;
break;
case nskey_dirname:
sz = offsetof(struct elem, dnkey) + sizeof(e->dnkey);
break;
case nskey_iis:
sz = offsetof(struct elem, iiskey.s) + strlen(k->u.iis.s) + 1;
break;
......@@ -115,6 +120,8 @@ h(struct nskey *k)
return (k->u.ii.a ^ k->u.ii.b) % NHASH;
case nskey_str:
return k->u.s[0] % NHASH; // XXX
case nskey_dirname:
return k->u.dirname[0] % NHASH; // XXX
case nskey_iis:
return (k->u.iis.a ^ k->u.iis.b ^ k->u.iis.s[0]) % NHASH;
default:
......@@ -136,6 +143,9 @@ setkey(struct elem *e, struct nskey *k)
case nskey_str:
strncpy(e->skey, k->u.s, strlen(k->u.s) + 1);
break;
case nskey_dirname:
strncpy(e->dnkey, k->u.dirname, DIRSIZ);
break;
case nskey_iis:
e->iiskey.a = k->u.iis.a;
e->iiskey.b = k->u.iis.b;
......@@ -156,6 +166,8 @@ cmpkey(struct elem *e, struct nskey *k)
return e->iikey.a == k->u.ii.a && e->iikey.b == k->u.ii.b;
case nskey_str:
return !strcmp(e->skey, k->u.s);
case nskey_dirname:
return !namecmp(e->dnkey, k->u.dirname);
case nskey_iis:
return e->iiskey.a == k->u.iis.a &&
e->iiskey.b == k->u.iis.b &&
......
......@@ -169,7 +169,7 @@ int
sys_unlink(void)
{
struct inode *ip, *dp;
char name[DIRSIZ+1], *path;
char name[DIRSIZ], *path;
if(argstr(0, &path) < 0)
return -1;
......@@ -200,8 +200,7 @@ sys_unlink(void)
}
dir_init(dp);
name[DIRSIZ] = '\0';
if (ns_remove(dp->dir, KS(name), (void*)ip->inum) == 0) {
if (ns_remove(dp->dir, KD(name), (void*)ip->inum) == 0) {
iunlockput(ip);
goto retry;
}
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论