Skip to content

Commit

Permalink
add missing iput() at end of _namei()
Browse files Browse the repository at this point in the history
  • Loading branch information
rtm committed Aug 24, 2007
1 parent b555137 commit 2036534
Show file tree
Hide file tree
Showing 7 changed files with 110 additions and 17 deletions.
2 changes: 1 addition & 1 deletion bootmain.c
Original file line number Diff line number Diff line change
Expand Up @@ -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.
//
Expand Down
10 changes: 6 additions & 4 deletions fs.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand All @@ -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));
Expand Down Expand Up @@ -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*
Expand Down Expand Up @@ -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;
}

Expand Down
4 changes: 2 additions & 2 deletions mkfs.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
2 changes: 1 addition & 1 deletion param.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 changes: 4 additions & 8 deletions proc.h
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
2 changes: 1 addition & 1 deletion runoff
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
95 changes: 95 additions & 0 deletions usertests.c
Original file line number Diff line number Diff line change
Expand Up @@ -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[])
{
Expand Down Expand Up @@ -1128,6 +1221,8 @@ main(int argc, char *argv[])
createdelete();
twofiles();
sharedfd();
dirfile();
iref();

exectest();

Expand Down

0 comments on commit 2036534

Please sign in to comment.