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…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 rtm
						rtm