Skip to content
Advertisement

Where is file_lock stored in Linux

I’m reading the Understand the Linux Kernel book, and it says that the list of file_lock is stored in the file’s inode (of field i_flock).

But in the sys_flock() of Linux 2.6.11.12, which will eventually call flock_lock_file(). It uses filp->f_dentry->d_inode->i_flock to get the list of file_lock and filp->f_dentry is an dentry of the directory which “contains” the file.

int flock_lock_file(struct file *filp, struct file_lock *new_fl) {
    // ...
    struct inode * inode = filp->f_dentry->d_inode;
    // ...
}

Suppose that the file_lock list are linked with filp->f_dentry->d_inode->i_flock, What will happen when a hard link exists:

/some_path/foo/file.txt
/another_path/bar/file_link

and file_link is a hard link to file.txt

When we use this two path to open the same file, sys_open() will set filp->f_dentry to foo and bar separately, isn’t it? If my guess is right, how file_lock can work?

Advertisement

Answer

The file_lock is indeed stored in the inode of the corresponding file.

An inode can be referred by several directory entries, which linked in inode’s i_dentry field. Even for a unique file might have different filp->f_dentry, filp->f_dentry->d_inode is all refer to the same inode.

User contributions licensed under: CC BY-SA
10 People found this is helpful
Advertisement