add missing iput() at end of _namei()
This commit is contained in:
parent
b55513796f
commit
2036534834
7 changed files with 110 additions and 17 deletions
|
@ -12,7 +12,7 @@
|
|||
// BOOT UP STEPS
|
||||
// * when the CPU boots it loads the BIOS into memory and executes it
|
||||
//
|
||||
// * the BIOS intializes devices, sets of the interrupt routines, and
|
||||
// * the BIOS intializes devices, sets up the interrupt routines, and
|
||||
// reads the first sector of the boot device(e.g., hard-drive)
|
||||
// into memory and jumps to it.
|
||||
//
|
||||
|
|
10
fs.c
10
fs.c
|
@ -475,6 +475,7 @@ namecmp(const char *s, const char *t)
|
|||
|
||||
// Look for a directory entry in a directory.
|
||||
// If found, set *poff to byte offset of entry.
|
||||
// Caller must have already locked dp.
|
||||
struct uinode*
|
||||
dirlookup(struct inode *dp, char *name, uint *poff)
|
||||
{
|
||||
|
@ -483,7 +484,7 @@ dirlookup(struct inode *dp, char *name, uint *poff)
|
|||
struct dirent *de;
|
||||
|
||||
if(dp->type != T_DIR)
|
||||
return 0;
|
||||
panic("dirlookup not DIR");
|
||||
|
||||
for(off = 0; off < dp->size; off += BSIZE){
|
||||
bp = bread(dp->dev, bmap(dp, off / BSIZE, 0));
|
||||
|
@ -558,7 +559,7 @@ dirlink(struct inode *dp, char *name, uint ino)
|
|||
//
|
||||
// Examples:
|
||||
// skipelem("a/bb/c", name) = "bb/c", setting name = "a"
|
||||
// skipelem("///a/bb", name) = "b", setting name="a"
|
||||
// skipelem("///a/bb", name) = "bb", setting name="a"
|
||||
// skipelem("", name) = skipelem("////", name) = 0
|
||||
//
|
||||
static char*
|
||||
|
@ -617,14 +618,15 @@ _namei(char *path, int parent, char *name)
|
|||
|
||||
if((ipu = dirlookup(dp, name, &off)) == 0){
|
||||
iput(iunlock(dp));
|
||||
iput(ipu);
|
||||
return 0;
|
||||
}
|
||||
iput(iunlock(dp));
|
||||
dpu = ipu;
|
||||
}
|
||||
if(parent)
|
||||
if(parent){
|
||||
iput(dpu);
|
||||
return 0;
|
||||
}
|
||||
return dpu;
|
||||
}
|
||||
|
||||
|
|
4
mkfs.c
4
mkfs.c
|
@ -8,8 +8,8 @@
|
|||
#include "param.h"
|
||||
#include "fs.h"
|
||||
|
||||
int nblocks = 1008;
|
||||
int ninodes = 100;
|
||||
int nblocks = 995;
|
||||
int ninodes = 200;
|
||||
int size = 1024;
|
||||
|
||||
int fsfd;
|
||||
|
|
2
param.h
2
param.h
|
@ -6,6 +6,6 @@
|
|||
#define NFILE 100 // open files per system
|
||||
#define NBUF 10 // size of disk block cache
|
||||
#define NREQUEST NBUF // outstanding disk requests
|
||||
#define NINODE 100 // maximum number of active i-nodes
|
||||
#define NINODE 50 // maximum number of active i-nodes
|
||||
#define NDEV 10 // maximum major device number
|
||||
#define ROOTDEV 1 // device number of file system root disk
|
||||
|
|
12
proc.h
12
proc.h
|
@ -43,19 +43,15 @@ struct proc {
|
|||
char name[16]; // Process name (debugging)
|
||||
};
|
||||
|
||||
// Process memory is laid out contiguously:
|
||||
// Process memory is laid out contiguously, low addresses first:
|
||||
// text
|
||||
// original data and bss
|
||||
// fixed-size stack
|
||||
// expandable heap
|
||||
|
||||
// If xv6 was only for uniprocessors, this could be
|
||||
// struct proc *cp;
|
||||
// Instead we have an array curproc, one per
|
||||
// processor, and #define cp to the right element
|
||||
// in the array. In general such preprocessor
|
||||
// subterfuge is to be avoided, but cp is used
|
||||
// so often that having the shorthand is worth the ugliness.
|
||||
// Arrange that cp point to the struct proc that this
|
||||
// CPU is currently running. Such preprocessor
|
||||
// subterfuge can be confusing, but saves a lot of typing.
|
||||
extern struct proc *curproc[NCPU]; // Current (running) process per CPU
|
||||
#define cp (curproc[cpu()]) // Current process on this CPU
|
||||
|
||||
|
|
2
runoff
2
runoff
|
@ -18,7 +18,7 @@ files=`grep -v '^#' runoff.list | awk '{print $1}'`
|
|||
n=99
|
||||
for i in $files
|
||||
do
|
||||
runoff1 -n $n $i >fmt/$i
|
||||
./runoff1 -n $n $i >fmt/$i
|
||||
nn=`tail -1 fmt/$i | sed 's/ .*//; s/^0*//'`
|
||||
if [ "x$nn" != x ]; then
|
||||
n=$nn
|
||||
|
|
95
usertests.c
95
usertests.c
|
@ -1096,6 +1096,99 @@ rmdot(void)
|
|||
printf(1, "rmdot ok\n");
|
||||
}
|
||||
|
||||
void
|
||||
dirfile(void)
|
||||
{
|
||||
int fd;
|
||||
|
||||
printf(1, "dir vs file\n");
|
||||
|
||||
fd = open("dirfile", O_CREATE);
|
||||
if(fd < 0){
|
||||
printf(1, "create dirfile failed\n");
|
||||
exit();
|
||||
}
|
||||
close(fd);
|
||||
if(chdir("dirfile") == 0){
|
||||
printf(1, "chdir dirfile succeeded!\n");
|
||||
exit();
|
||||
}
|
||||
fd = open("dirfile/xx", 0);
|
||||
if(fd >= 0){
|
||||
printf(1, "create dirfile/xx succeeded!\n");
|
||||
exit();
|
||||
}
|
||||
fd = open("dirfile/xx", O_CREATE);
|
||||
if(fd >= 0){
|
||||
printf(1, "create dirfile/xx succeeded!\n");
|
||||
exit();
|
||||
}
|
||||
if(mkdir("dirfile/xx") == 0){
|
||||
printf(1, "mkdir dirfile/xx succeeded!\n");
|
||||
exit();
|
||||
}
|
||||
if(unlink("dirfile/xx") == 0){
|
||||
printf(1, "unlink dirfile/xx succeeded!\n");
|
||||
exit();
|
||||
}
|
||||
if(link("README", "dirfile/xx") == 0){
|
||||
printf(1, "link to dirfile/xx succeeded!\n");
|
||||
exit();
|
||||
}
|
||||
if(unlink("dirfile") != 0){
|
||||
printf(1, "unlink dirfile failed!\n");
|
||||
exit();
|
||||
}
|
||||
|
||||
fd = open(".", O_RDWR);
|
||||
if(fd >= 0){
|
||||
printf(1, "open . for writing succeeded!\n");
|
||||
exit();
|
||||
}
|
||||
fd = open(".", 0);
|
||||
if(write(fd, "x", 1) > 0){
|
||||
printf(1, "write . succeeded!\n");
|
||||
exit();
|
||||
}
|
||||
close(fd);
|
||||
|
||||
printf(1, "dir vs file OK\n");
|
||||
}
|
||||
|
||||
// test that iput() is called at the end of _namei()
|
||||
void
|
||||
iref(void)
|
||||
{
|
||||
int i, fd;
|
||||
|
||||
printf(1, "empty file name\n");
|
||||
|
||||
// the 50 is NINODE
|
||||
for(i = 0; i < 50 + 1; i++){
|
||||
if(mkdir("irefd") != 0){
|
||||
printf(1, "mkdir irefd failed\n");
|
||||
exit();
|
||||
}
|
||||
if(chdir("irefd") != 0){
|
||||
printf(1, "chdir irefd failed\n");
|
||||
exit();
|
||||
}
|
||||
|
||||
mkdir("");
|
||||
link("README", "");
|
||||
fd = open("", O_CREATE);
|
||||
if(fd >= 0)
|
||||
close(fd);
|
||||
fd = open("xx", O_CREATE);
|
||||
if(fd >= 0)
|
||||
close(fd);
|
||||
unlink("xx");
|
||||
}
|
||||
|
||||
chdir("/");
|
||||
printf(1, "empty file name OK\n");
|
||||
}
|
||||
|
||||
int
|
||||
main(int argc, char *argv[])
|
||||
{
|
||||
|
@ -1128,6 +1221,8 @@ main(int argc, char *argv[])
|
|||
createdelete();
|
||||
twofiles();
|
||||
sharedfd();
|
||||
dirfile();
|
||||
iref();
|
||||
|
||||
exectest();
|
||||
|
||||
|
|
Loading…
Reference in a new issue