fsnotify: create method handle_inode_event() in fsnotify_operations
The method handle_event() grew a lot of complexity due to the design of fanotify and merging of ignore masks. Most backends do not care about this complex functionality, so we can hide this complexity from them. Introduce a method handle_inode_event() that serves those backends and passes a single inode mark and less arguments. This change converts all backends except fanotify and inotify to use the simplified handle_inode_event() method. In pricipal, inotify could have also used the new method, but that would require passing more arguments on the simple helper (data, data_type, cookie), so we leave it with the handle_event() method. Link: https://lore.kernel.org/r/20200722125849.17418-9-amir73il@gmail.com Suggested-by: Jan Kara <jack@suse.cz> Signed-off-by: Amir Goldstein <amir73il@gmail.com> Signed-off-by: Jan Kara <jack@suse.cz>
This commit is contained in:
@@ -152,35 +152,31 @@ static void audit_autoremove_mark_rule(struct audit_fsnotify_mark *audit_mark)
|
||||
}
|
||||
|
||||
/* Update mark data in audit rules based on fsnotify events. */
|
||||
static int audit_mark_handle_event(struct fsnotify_group *group, u32 mask,
|
||||
const void *data, int data_type,
|
||||
struct inode *dir,
|
||||
const struct qstr *dname, u32 cookie,
|
||||
struct fsnotify_iter_info *iter_info)
|
||||
static int audit_mark_handle_event(struct fsnotify_mark *inode_mark, u32 mask,
|
||||
struct inode *inode, struct inode *dir,
|
||||
const struct qstr *dname)
|
||||
{
|
||||
struct fsnotify_mark *inode_mark = fsnotify_iter_inode_mark(iter_info);
|
||||
struct audit_fsnotify_mark *audit_mark;
|
||||
const struct inode *inode = fsnotify_data_inode(data, data_type);
|
||||
|
||||
audit_mark = container_of(inode_mark, struct audit_fsnotify_mark, mark);
|
||||
|
||||
BUG_ON(group != audit_fsnotify_group);
|
||||
|
||||
if (WARN_ON(!inode))
|
||||
if (WARN_ON_ONCE(inode_mark->group != audit_fsnotify_group) ||
|
||||
WARN_ON_ONCE(!inode))
|
||||
return 0;
|
||||
|
||||
if (mask & (FS_CREATE|FS_MOVED_TO|FS_DELETE|FS_MOVED_FROM)) {
|
||||
if (audit_compare_dname_path(dname, audit_mark->path, AUDIT_NAME_FULL))
|
||||
return 0;
|
||||
audit_update_mark(audit_mark, inode);
|
||||
} else if (mask & (FS_DELETE_SELF|FS_UNMOUNT|FS_MOVE_SELF))
|
||||
} else if (mask & (FS_DELETE_SELF|FS_UNMOUNT|FS_MOVE_SELF)) {
|
||||
audit_autoremove_mark_rule(audit_mark);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct fsnotify_ops audit_mark_fsnotify_ops = {
|
||||
.handle_event = audit_mark_handle_event,
|
||||
.handle_inode_event = audit_mark_handle_event,
|
||||
.free_mark = audit_fsnotify_free_mark,
|
||||
};
|
||||
|
||||
|
Reference in New Issue
Block a user