fsnotify: Retrieve super block from the data field
[ Upstream commit 29335033c574a15334015d8c4e36862cff3d3384 ] Some file system events (i.e. FS_ERROR) might not be associated with an inode or directory. For these, we can retrieve the super block from the data field. But, since the super_block is available in the data field on every event type, simplify the code to always retrieve it from there, through a new helper. Link: https://lore.kernel.org/r/20211025192746.66445-11-krisman@collabora.com Suggested-by: Jan Kara <jack@suse.cz> Reviewed-by: Amir Goldstein <amir73il@gmail.com> Reviewed-by: Jan Kara <jack@suse.cz> Signed-off-by: Gabriel Krisman Bertazi <krisman@collabora.com> Signed-off-by: Jan Kara <jack@suse.cz> Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:

committed by
Greg Kroah-Hartman

parent
44844158ee
commit
5c4ce075c9
@@ -455,16 +455,16 @@ static void fsnotify_iter_next(struct fsnotify_iter_info *iter_info)
|
|||||||
* @file_name is relative to
|
* @file_name is relative to
|
||||||
* @file_name: optional file name associated with event
|
* @file_name: optional file name associated with event
|
||||||
* @inode: optional inode associated with event -
|
* @inode: optional inode associated with event -
|
||||||
* either @dir or @inode must be non-NULL.
|
* If @dir and @inode are both non-NULL, event may be
|
||||||
* if both are non-NULL event may be reported to both.
|
* reported to both.
|
||||||
* @cookie: inotify rename cookie
|
* @cookie: inotify rename cookie
|
||||||
*/
|
*/
|
||||||
int fsnotify(__u32 mask, const void *data, int data_type, struct inode *dir,
|
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 qstr *file_name, struct inode *inode, u32 cookie)
|
||||||
{
|
{
|
||||||
const struct path *path = fsnotify_data_path(data, data_type);
|
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 fsnotify_iter_info iter_info = {};
|
||||||
struct super_block *sb;
|
|
||||||
struct mount *mnt = NULL;
|
struct mount *mnt = NULL;
|
||||||
struct inode *parent = NULL;
|
struct inode *parent = NULL;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
@@ -483,7 +483,6 @@ int fsnotify(__u32 mask, const void *data, int data_type, struct inode *dir,
|
|||||||
*/
|
*/
|
||||||
parent = dir;
|
parent = dir;
|
||||||
}
|
}
|
||||||
sb = inode->i_sb;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Optimization: srcu_read_lock() has a memory barrier which can
|
* Optimization: srcu_read_lock() has a memory barrier which can
|
||||||
|
@@ -289,6 +289,21 @@ static inline const struct path *fsnotify_data_path(const void *data,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline struct super_block *fsnotify_data_sb(const void *data,
|
||||||
|
int data_type)
|
||||||
|
{
|
||||||
|
switch (data_type) {
|
||||||
|
case FSNOTIFY_EVENT_INODE:
|
||||||
|
return ((struct inode *)data)->i_sb;
|
||||||
|
case FSNOTIFY_EVENT_DENTRY:
|
||||||
|
return ((struct dentry *)data)->d_sb;
|
||||||
|
case FSNOTIFY_EVENT_PATH:
|
||||||
|
return ((const struct path *)data)->dentry->d_sb;
|
||||||
|
default:
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
enum fsnotify_obj_type {
|
enum fsnotify_obj_type {
|
||||||
FSNOTIFY_OBJ_TYPE_INODE,
|
FSNOTIFY_OBJ_TYPE_INODE,
|
||||||
FSNOTIFY_OBJ_TYPE_PARENT,
|
FSNOTIFY_OBJ_TYPE_PARENT,
|
||||||
|
Reference in New Issue
Block a user