diff options
Diffstat (limited to 'fs/notify/fsnotify.c')
| -rw-r--r-- | fs/notify/fsnotify.c | 10 | 
1 files changed, 6 insertions, 4 deletions
| diff --git a/fs/notify/fsnotify.c b/fs/notify/fsnotify.c index 963e6ce75b96..4034ca566f95 100644 --- a/fs/notify/fsnotify.c +++ b/fs/notify/fsnotify.c @@ -252,6 +252,9 @@ static int fsnotify_handle_inode_event(struct fsnotify_group *group,  	if (WARN_ON_ONCE(!ops->handle_inode_event))  		return 0; +	if (WARN_ON_ONCE(!inode && !dir)) +		return 0; +  	if ((inode_mark->mask & FS_EXCL_UNLINK) &&  	    path && d_unlinked(path->dentry))  		return 0; @@ -455,16 +458,16 @@ static void fsnotify_iter_next(struct fsnotify_iter_info *iter_info)   *		@file_name is relative to   * @file_name:	optional file name associated with event   * @inode:	optional inode associated with event - - *		either @dir or @inode must be non-NULL. - *		if both are non-NULL event may be reported to both. + *		If @dir and @inode are both non-NULL, event may be + *		reported to both.   * @cookie:	inotify rename cookie   */  int fsnotify(__u32 mask, const void *data, int data_type, struct inode *dir,  	     const struct qstr *file_name, struct inode *inode, u32 cookie)  {  	const struct path *path = fsnotify_data_path(data, data_type); +	struct super_block *sb = fsnotify_data_sb(data, data_type);  	struct fsnotify_iter_info iter_info = {}; -	struct super_block *sb;  	struct mount *mnt = NULL;  	struct inode *parent = NULL;  	int ret = 0; @@ -483,7 +486,6 @@ int fsnotify(__u32 mask, const void *data, int data_type, struct inode *dir,  		 */  		parent = dir;  	} -	sb = inode->i_sb;  	/*  	 * Optimization: srcu_read_lock() has a memory barrier which can |