2021SC@SDUSC
path_openat()
Path_openat() is function that search for files by path in order to fill a file struct.The procedure for searching is based on a structure we disscussed before, which is struct nameidata.Nameidata is a temporary variable and it not only saves key data for each time's search but also hold the result and it will be used to fill the file struct.It is temporary because it will be restored immidiatly after the function is finished.
So how does path_openat walk through the directory and finally reach the destination?The algorithm is called path_walk, walk along the path.
Path_walk
This is how path_openat was defined:
static struct file *path_openat(int dfd, struct filename *pathname,
struct nameidata *nd, const struct open_flags *op, int flags)
dfd is the start point for this path walk, and pathname, of course, is the path towards the destination.nd is the pointer to struct nameidata and it saves the context and data needed for walking, also holds the result of the walk, including the inode and other data. flags however, decide how the data in nameidata will be handled.
struct nameidata {
struct path path;
struct qstr last;
struct path root;
struct inode *inode; /* path.dentry.d_inode */
unsigned int flags;
unsigned seq;
int last_type;
unsigned depth;
char *saved_names[MAX_NESTED_LINKS + 1];
};
Allow me to show code of nameidata again.path is the last node that was handled in the path, and last is the node being operated now.