add missing iput() at end of _namei()

This commit is contained in:
rtm 2007-08-24 14:56:17 +00:00
parent b55513796f
commit 2036534834
7 changed files with 110 additions and 17 deletions

View file

@ -12,7 +12,7 @@
// BOOT UP STEPS // BOOT UP STEPS
// * when the CPU boots it loads the BIOS into memory and executes it // * 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) // reads the first sector of the boot device(e.g., hard-drive)
// into memory and jumps to it. // into memory and jumps to it.
// //

10
fs.c
View file

@ -475,6 +475,7 @@ namecmp(const char *s, const char *t)
// Look for a directory entry in a directory. // Look for a directory entry in a directory.
// If found, set *poff to byte offset of entry. // If found, set *poff to byte offset of entry.
// Caller must have already locked dp.
struct uinode* struct uinode*
dirlookup(struct inode *dp, char *name, uint *poff) dirlookup(struct inode *dp, char *name, uint *poff)
{ {
@ -483,7 +484,7 @@ dirlookup(struct inode *dp, char *name, uint *poff)
struct dirent *de; struct dirent *de;
if(dp->type != T_DIR) if(dp->type != T_DIR)
return 0; panic("dirlookup not DIR");
for(off = 0; off < dp->size; off += BSIZE){ for(off = 0; off < dp->size; off += BSIZE){
bp = bread(dp->dev, bmap(dp, off / BSIZE, 0)); bp = bread(dp->dev, bmap(dp, off / BSIZE, 0));
@ -558,7 +559,7 @@ dirlink(struct inode *dp, char *name, uint ino)
// //
// Examples: // Examples:
// skipelem("a/bb/c", name) = "bb/c", setting name = "a" // 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 // skipelem("", name) = skipelem("////", name) = 0
// //
static char* static char*
@ -617,14 +618,15 @@ _namei(char *path, int parent, char *name)
if((ipu = dirlookup(dp, name, &off)) == 0){ if((ipu = dirlookup(dp, name, &off)) == 0){
iput(iunlock(dp)); iput(iunlock(dp));
iput(ipu);
return 0; return 0;
} }
iput(iunlock(dp)); iput(iunlock(dp));
dpu = ipu; dpu = ipu;
} }
if(parent) if(parent){
iput(dpu);
return 0; return 0;
}
return dpu; return dpu;
} }

4
mkfs.c
View file

@ -8,8 +8,8 @@
#include "param.h" #include "param.h"
#include "fs.h" #include "fs.h"
int nblocks = 1008; int nblocks = 995;
int ninodes = 100; int ninodes = 200;
int size = 1024; int size = 1024;
int fsfd; int fsfd;

View file

@ -6,6 +6,6 @@
#define NFILE 100 // open files per system #define NFILE 100 // open files per system
#define NBUF 10 // size of disk block cache #define NBUF 10 // size of disk block cache
#define NREQUEST NBUF // outstanding disk requests #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 NDEV 10 // maximum major device number
#define ROOTDEV 1 // device number of file system root disk #define ROOTDEV 1 // device number of file system root disk

12
proc.h
View file

@ -43,19 +43,15 @@ struct proc {
char name[16]; // Process name (debugging) char name[16]; // Process name (debugging)
}; };
// Process memory is laid out contiguously: // Process memory is laid out contiguously, low addresses first:
// text // text
// original data and bss // original data and bss
// fixed-size stack // fixed-size stack
// expandable heap // expandable heap
// If xv6 was only for uniprocessors, this could be // Arrange that cp point to the struct proc that this
// struct proc *cp; // CPU is currently running. Such preprocessor
// Instead we have an array curproc, one per // subterfuge can be confusing, but saves a lot of typing.
// 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.
extern struct proc *curproc[NCPU]; // Current (running) process per CPU extern struct proc *curproc[NCPU]; // Current (running) process per CPU
#define cp (curproc[cpu()]) // Current process on this CPU #define cp (curproc[cpu()]) // Current process on this CPU

2
runoff
View file

@ -18,7 +18,7 @@ files=`grep -v '^#' runoff.list | awk '{print $1}'`
n=99 n=99
for i in $files for i in $files
do do
runoff1 -n $n $i >fmt/$i ./runoff1 -n $n $i >fmt/$i
nn=`tail -1 fmt/$i | sed 's/ .*//; s/^0*//'` nn=`tail -1 fmt/$i | sed 's/ .*//; s/^0*//'`
if [ "x$nn" != x ]; then if [ "x$nn" != x ]; then
n=$nn n=$nn

View file

@ -1096,6 +1096,99 @@ rmdot(void)
printf(1, "rmdot ok\n"); 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 int
main(int argc, char *argv[]) main(int argc, char *argv[])
{ {
@ -1128,6 +1221,8 @@ main(int argc, char *argv[])
createdelete(); createdelete();
twofiles(); twofiles();
sharedfd(); sharedfd();
dirfile();
iref();
exectest(); exectest();