It is just an inode. Allocated by ialloc, the same on-disk inode allocation method. Grab an empty for use. Its data are all dirents.
Lookup entry in directory
// Look for a directory entry in a directory.// If found, set *poff to byte offset of entry.struct inode*dirlookup(struct inode *dp,char*name,uint*poff){uint off, inum;struct dirent de;if(dp->type != T_DIR)panic(“dirlookup not DIR”);for(off =0; off <dp->size; off +=sizeof(de)){if(readi(dp,0, (uint64)&de, off,sizeof(de))!=sizeof(de))panic(“dirlookup read”);if(de.inum ==0)continue;if(namecmp(name,de.name)==0){// entry matches path elementif(poff)*poff = off; inum =de.inum;returniget(dp->dev, inum); } }return0;}
Create new directory entry
// Write a new directory entry (name, inum) into the directory dp.intdirlink(struct inode *dp,char*name,uint inum){int off;struct dirent de;struct inode *ip;// Check that name is not present.if((ip =dirlookup(dp, name,0)) !=0){iput(ip);return-1; }// Look for an empty dirent.for(off =0; off <dp->size; off +=sizeof(de)){if(readi(dp,0, (uint64)&de, off,sizeof(de))!=sizeof(de))panic(“dirlink read”);if(de.inum ==0)break; }strncpy(de.name, name, DIRSIZ);de.inum = inum;if(writei(dp,0, (uint64)&de, off,sizeof(de))!=sizeof(de))panic(“dirlink”);return0;}