Commit fd5a3ff4 authored by Amir Goldstein's avatar Amir Goldstein Committed by Jan Kara

fsnotify: pass dentry instead of inode data

Define a new data type to pass for event - FSNOTIFY_EVENT_DENTRY.
Use it to pass the dentry instead of it's ->d_inode where available.

This is needed in preparation to the refactor to retrieve the super
block from the data field.  In some cases (i.e. mkdir in kernfs), the
data inode comes from a negative dentry, such that no super block
information would be available. By receiving the dentry itself, instead
of the inode, fsnotify can derive the super block even on these cases.

Link: https://lore.kernel.org/r/20211025192746.66445-3-krisman@collabora.comReviewed-by: default avatarJan Kara <jack@suse.cz>
Signed-off-by: default avatarAmir Goldstein <amir73il@gmail.com>
[Expand explanation in commit message]
Signed-off-by: default avatarGabriel Krisman Bertazi <krisman@collabora.com>
Signed-off-by: default avatarJan Kara <jack@suse.cz>
parent 9baf93d6
...@@ -39,8 +39,7 @@ static inline int fsnotify_name(__u32 mask, const void *data, int data_type, ...@@ -39,8 +39,7 @@ static inline int fsnotify_name(__u32 mask, const void *data, int data_type,
static inline void fsnotify_dirent(struct inode *dir, struct dentry *dentry, static inline void fsnotify_dirent(struct inode *dir, struct dentry *dentry,
__u32 mask) __u32 mask)
{ {
fsnotify_name(mask, d_inode(dentry), FSNOTIFY_EVENT_INODE, fsnotify_name(mask, dentry, FSNOTIFY_EVENT_DENTRY, dir, &dentry->d_name, 0);
dir, &dentry->d_name, 0);
} }
static inline void fsnotify_inode(struct inode *inode, __u32 mask) static inline void fsnotify_inode(struct inode *inode, __u32 mask)
...@@ -87,7 +86,7 @@ static inline int fsnotify_parent(struct dentry *dentry, __u32 mask, ...@@ -87,7 +86,7 @@ static inline int fsnotify_parent(struct dentry *dentry, __u32 mask,
*/ */
static inline void fsnotify_dentry(struct dentry *dentry, __u32 mask) static inline void fsnotify_dentry(struct dentry *dentry, __u32 mask)
{ {
fsnotify_parent(dentry, mask, d_inode(dentry), FSNOTIFY_EVENT_INODE); fsnotify_parent(dentry, mask, dentry, FSNOTIFY_EVENT_DENTRY);
} }
static inline int fsnotify_file(struct file *file, __u32 mask) static inline int fsnotify_file(struct file *file, __u32 mask)
......
...@@ -248,6 +248,7 @@ enum fsnotify_data_type { ...@@ -248,6 +248,7 @@ enum fsnotify_data_type {
FSNOTIFY_EVENT_NONE, FSNOTIFY_EVENT_NONE,
FSNOTIFY_EVENT_PATH, FSNOTIFY_EVENT_PATH,
FSNOTIFY_EVENT_INODE, FSNOTIFY_EVENT_INODE,
FSNOTIFY_EVENT_DENTRY,
}; };
static inline struct inode *fsnotify_data_inode(const void *data, int data_type) static inline struct inode *fsnotify_data_inode(const void *data, int data_type)
...@@ -255,6 +256,8 @@ static inline struct inode *fsnotify_data_inode(const void *data, int data_type) ...@@ -255,6 +256,8 @@ static inline struct inode *fsnotify_data_inode(const void *data, int data_type)
switch (data_type) { switch (data_type) {
case FSNOTIFY_EVENT_INODE: case FSNOTIFY_EVENT_INODE:
return (struct inode *)data; return (struct inode *)data;
case FSNOTIFY_EVENT_DENTRY:
return d_inode(data);
case FSNOTIFY_EVENT_PATH: case FSNOTIFY_EVENT_PATH:
return d_inode(((const struct path *)data)->dentry); return d_inode(((const struct path *)data)->dentry);
default: default:
...@@ -262,6 +265,19 @@ static inline struct inode *fsnotify_data_inode(const void *data, int data_type) ...@@ -262,6 +265,19 @@ static inline struct inode *fsnotify_data_inode(const void *data, int data_type)
} }
} }
static inline struct dentry *fsnotify_data_dentry(const void *data, int data_type)
{
switch (data_type) {
case FSNOTIFY_EVENT_DENTRY:
/* Non const is needed for dget() */
return (struct dentry *)data;
case FSNOTIFY_EVENT_PATH:
return ((const struct path *)data)->dentry;
default:
return NULL;
}
}
static inline const struct path *fsnotify_data_path(const void *data, static inline const struct path *fsnotify_data_path(const void *data,
int data_type) int data_type)
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment