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
 | // 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
									
										
									
									
									
								
							
							
						
						
									
										10
									
								
								fs.c
									
										
									
									
									
								
							|  | @ -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
									
										
									
									
									
								
							
							
						
						
									
										4
									
								
								mkfs.c
									
										
									
									
									
								
							|  | @ -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; | ||||||
|  |  | ||||||
							
								
								
									
										2
									
								
								param.h
									
										
									
									
									
								
							
							
						
						
									
										2
									
								
								param.h
									
										
									
									
									
								
							|  | @ -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
									
										
									
									
									
								
							
							
						
						
									
										12
									
								
								proc.h
									
										
									
									
									
								
							|  | @ -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
									
										
									
									
									
								
							
							
						
						
									
										2
									
								
								runoff
									
										
									
									
									
								
							|  | @ -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 | ||||||
|  |  | ||||||
							
								
								
									
										95
									
								
								usertests.c
									
										
									
									
									
								
							
							
						
						
									
										95
									
								
								usertests.c
									
										
									
									
									
								
							|  | @ -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(); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 rtm
						rtm