diff options
| author | 2020-07-08 14:11:37 +0300 | |
|---|---|---|
| committer | 2020-07-15 17:36:41 +0200 | |
| commit | c738fbabb0ff62d0f9a9572e56e65d05a1b34c6a (patch) | |
| tree | 3bd2d3996e88cfe74a51e4403ef67108365de1b6 /include/linux/fsnotify.h | |
| parent | fsnotify: Rearrange fast path to minimise overhead when there is no watcher (diff) | |
| download | wireguard-linux-c738fbabb0ff62d0f9a9572e56e65d05a1b34c6a.tar.xz wireguard-linux-c738fbabb0ff62d0f9a9572e56e65d05a1b34c6a.zip | |
fsnotify: fold fsnotify() call into fsnotify_parent()
All (two) callers of fsnotify_parent() also call fsnotify() to notify
the child inode. Move the second fsnotify() call into fsnotify_parent().
This will allow more flexibility in making decisions about which of the
two event falvors should be sent.
Using 'goto notify_child' in the inline helper seems a bit strange, but
it mimics the code in __fsnotify_parent() for clarity and the goto
pattern will become less strage after following patches are applied.
Link: https://lore.kernel.org/r/20200708111156.24659-2-amir73il@gmail.com
Signed-off-by: Amir Goldstein <amir73il@gmail.com>
Signed-off-by: Jan Kara <jack@suse.cz>
Diffstat (limited to 'include/linux/fsnotify.h')
| -rw-r--r-- | include/linux/fsnotify.h | 33 | 
1 files changed, 13 insertions, 20 deletions
| diff --git a/include/linux/fsnotify.h b/include/linux/fsnotify.h index 508f6bb0b06b..316c9b820517 100644 --- a/include/linux/fsnotify.h +++ b/include/linux/fsnotify.h @@ -48,44 +48,37 @@ static inline void fsnotify_dirent(struct inode *dir, struct dentry *dentry,  static inline int fsnotify_parent(struct dentry *dentry, __u32 mask,  				  const void *data, int data_type)  { +	struct inode *inode = d_inode(dentry); + +	if (S_ISDIR(inode->i_mode)) +		mask |= FS_ISDIR; +  	if (!(dentry->d_flags & DCACHE_FSNOTIFY_PARENT_WATCHED)) -		return 0; +		goto notify_child;  	return __fsnotify_parent(dentry, mask, data, data_type); + +notify_child: +	return fsnotify(inode, mask, data, data_type, NULL, 0);  }  /* - * Simple wrappers to consolidate calls fsnotify_parent()/fsnotify() when - * an event is on a file/dentry. + * Simple wrappers to consolidate calls to fsnotify_parent() when an event + * is on a file/dentry.   */  static inline void fsnotify_dentry(struct dentry *dentry, __u32 mask)  { -	struct inode *inode = d_inode(dentry); - -	if (S_ISDIR(inode->i_mode)) -		mask |= FS_ISDIR; - -	fsnotify_parent(dentry, mask, inode, FSNOTIFY_EVENT_INODE); -	fsnotify(inode, mask, inode, FSNOTIFY_EVENT_INODE, NULL, 0); +	fsnotify_parent(dentry, mask, d_inode(dentry), FSNOTIFY_EVENT_INODE);  }  static inline int fsnotify_file(struct file *file, __u32 mask)  {  	const struct path *path = &file->f_path; -	struct inode *inode = file_inode(file); -	int ret;  	if (file->f_mode & FMODE_NONOTIFY)  		return 0; -	if (S_ISDIR(inode->i_mode)) -		mask |= FS_ISDIR; - -	ret = fsnotify_parent(path->dentry, mask, path, FSNOTIFY_EVENT_PATH); -	if (ret) -		return ret; - -	return fsnotify(inode, mask, path, FSNOTIFY_EVENT_PATH, NULL, 0); +	return fsnotify_parent(path->dentry, mask, path, FSNOTIFY_EVENT_PATH);  }  /* Simple call site for access decisions */ | 
