в виртуальной файловой системе в линуксе (далее, vfs) используется следующая связка: всю файловую систему представляет суперблок. При первоначальной инициализации суперблока пользовательский код выдаёт dentry для корневого узла. Dentry – это описатель какого-либо элемента в файловой системе. Это может быть директория, это может быть файл. Причём понятия “директория” и “файл” в этом случае виртуальные – за ними может быть реальная директория или файл. А может и не быть. Самый известный пример директории, за которой нет реального отображения на диске – это папка /proc и её содержимое.

Для чего такое разделение на dentry и inode? Одно из назначений – это реверанс в сторону жёстких ссылок: когда некий блок данных (типа файл) может иметь несколько имён, да и может быть в разных директориях. Поэтому и выделили отдельно inode с данными поближе к диску. И отдельно выделили dentry: содержит “имя” (d_name). И, конечно же, dentry содержит указатели на inode, суперблок, родительский dentry, пачку служебных полей для кэширования и др.

в dentry есть свои операции что есть структура с указателями на функции обработчики. Также вы можете не задавать операции для каждого экземпляра dentry (если они у вас одинаковые) и задать общий операции в суперблоке.

Также dentry может хранить свои пользовательские данные в поле d_fsdata. Для управления этими данными (выделения и освобождения памяти) можно использовать операции d_init и d_release.

Состояния dentry: dentry может быть “негативной” (термин такой), что означает, что у dentry нет привязанного к ней inode. И вообще, в ряде случаев использование негативной dentry является штатным поведением (см. .Trash).