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

dirname keytype

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