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.