Creating and Removing Directories
At this point, readers should be familiar with the mechanics of how the kernel looks up a filename and creates a negative dentry before creating a file. Directory creation is a little different in that the kernel performs the lookup rather than the application calling stat() first. This is shown as follows:
Breakpoint 5, ux_lookup (dip=0xcd73cba0, dentry=0xcb5ed420) at ux_dir.c:367 367 struct ux_inode *uip = (struct ux_inode *) (gdb) bt #0 ux_lookup (dip=0xcd73cba0, dentry=0xcb5ed42 0) at ux_dir.c:367 #1 0xc014 92f2 in lookup_hash (name=0xc97ebf98, base=0xcb5ed32 0) at namei.c:781 #2 0xc0149cd1 in lookup_create (nd=0xc97ebf90, is_dir=1) at namei.c:12 0 6 #3 0xc014a251 in sys_mkdir (pathname=0xbffffc1c “/mnt/dir”, mode=511) at namei.c:1332 #4 0xc010730b in system_call ()
Because the filename won't be found (assuming it doesn't already exist), a negative dentry is created is then passed into ux_mkdir() (lines 698 to 780) as follows:
Breakpoint 7, 0xd08546d0 in ux_mkdir (dip=0xcd73cba0, dentry=0xcb5ed420, mode=4 93) (gdb) bt #0 0xd08546d0 in ux_mkdir (dip=0xcd73cba0, dentry=0xcb5ed420, mode=493) #1 0xc014a197 in vfs_mkdir (dir=0xcd73cba0, dentry=0xcb5ed420, mode=4 93) at namei.c:1307 #2 0xc014a282 in sys_mkdir (pathname=0xbffffc1c “/mnt/dir”, mode=511) at namei.c:1336 #3 0xc010730b in system_call ()
Note that dentry address is the same for both functions.
The initial steps performed by ux_mkdir() are very similar to the steps taken by ux_create() ...
Get UNIX Filesystems: Evolution, Design, and Implementation now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.