mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-04-02 20:44:00 +00:00
fanotify: use both marks when possible
fanotify currently, when given a vfsmount_mark will look up (if it exists) the corresponding inode mark. This patch drops that lookup and uses the mark provided. Signed-off-by: Eric Paris <eparis@redhat.com>
This commit is contained in:
parent
ce8f76fb73
commit
1968f5eed5
7 changed files with 41 additions and 61 deletions
|
@ -128,7 +128,7 @@ static int dnotify_handle_event(struct fsnotify_group *group,
|
||||||
* userspace notification for that pair.
|
* userspace notification for that pair.
|
||||||
*/
|
*/
|
||||||
static bool dnotify_should_send_event(struct fsnotify_group *group,
|
static bool dnotify_should_send_event(struct fsnotify_group *group,
|
||||||
struct inode *inode, struct vfsmount *mnt,
|
struct inode *inode,
|
||||||
struct fsnotify_mark *inode_mark,
|
struct fsnotify_mark *inode_mark,
|
||||||
struct fsnotify_mark *vfsmount_mark,
|
struct fsnotify_mark *vfsmount_mark,
|
||||||
__u32 mask, void *data, int data_type)
|
__u32 mask, void *data, int data_type)
|
||||||
|
|
|
@ -153,59 +153,20 @@ static int fanotify_handle_event(struct fsnotify_group *group,
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool should_send_vfsmount_event(struct fsnotify_group *group,
|
|
||||||
struct vfsmount *mnt,
|
|
||||||
struct inode *inode,
|
|
||||||
struct fsnotify_mark *mnt_mark,
|
|
||||||
__u32 mask)
|
|
||||||
{
|
|
||||||
struct fsnotify_mark *inode_mark;
|
|
||||||
|
|
||||||
pr_debug("%s: group=%p vfsmount=%p mark=%p mask=%x\n",
|
|
||||||
__func__, group, mnt, mnt_mark, mask);
|
|
||||||
|
|
||||||
mask &= mnt_mark->mask;
|
|
||||||
mask &= ~mnt_mark->ignored_mask;
|
|
||||||
|
|
||||||
if (mask) {
|
|
||||||
inode_mark = fsnotify_find_inode_mark(group, inode);
|
|
||||||
if (inode_mark) {
|
|
||||||
mask &= ~inode_mark->ignored_mask;
|
|
||||||
fsnotify_put_mark(inode_mark);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return mask;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool should_send_inode_event(struct fsnotify_group *group,
|
|
||||||
struct inode *inode,
|
|
||||||
struct fsnotify_mark *mark,
|
|
||||||
__u32 mask)
|
|
||||||
{
|
|
||||||
pr_debug("%s: group=%p inode=%p mark=%p mask=%x\n",
|
|
||||||
__func__, group, inode, mark, mask);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* if the event is for a child and this inode doesn't care about
|
|
||||||
* events on the child, don't send it!
|
|
||||||
*/
|
|
||||||
if ((mask & FS_EVENT_ON_CHILD) &&
|
|
||||||
!(mark->mask & FS_EVENT_ON_CHILD))
|
|
||||||
return false;
|
|
||||||
else
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool fanotify_should_send_event(struct fsnotify_group *group,
|
static bool fanotify_should_send_event(struct fsnotify_group *group,
|
||||||
struct inode *to_tell,
|
struct inode *to_tell,
|
||||||
struct vfsmount *mnt,
|
|
||||||
struct fsnotify_mark *inode_mark,
|
struct fsnotify_mark *inode_mark,
|
||||||
struct fsnotify_mark *vfsmount_mark,
|
struct fsnotify_mark *vfsmnt_mark,
|
||||||
__u32 mask, void *data, int data_type)
|
__u32 event_mask, void *data, int data_type)
|
||||||
{
|
{
|
||||||
pr_debug("%s: group=%p to_tell=%p mnt=%p mask=%x data=%p data_type=%d\n",
|
__u32 marks_mask, marks_ignored_mask;
|
||||||
__func__, group, to_tell, mnt, mask, data, data_type);
|
|
||||||
|
pr_debug("%s: group=%p to_tell=%p inode_mark=%p vfsmnt_mark=%p "
|
||||||
|
"mask=%x data=%p data_type=%d\n", __func__, group, to_tell,
|
||||||
|
inode_mark, vfsmnt_mark, event_mask, data, data_type);
|
||||||
|
|
||||||
|
pr_debug("%s: group=%p vfsmount_mark=%p inode_mark=%p mask=%x\n",
|
||||||
|
__func__, group, vfsmnt_mark, inode_mark, event_mask);
|
||||||
|
|
||||||
/* sorry, fanotify only gives a damn about files and dirs */
|
/* sorry, fanotify only gives a damn about files and dirs */
|
||||||
if (!S_ISREG(to_tell->i_mode) &&
|
if (!S_ISREG(to_tell->i_mode) &&
|
||||||
|
@ -216,11 +177,30 @@ static bool fanotify_should_send_event(struct fsnotify_group *group,
|
||||||
if (data_type != FSNOTIFY_EVENT_FILE)
|
if (data_type != FSNOTIFY_EVENT_FILE)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (mnt)
|
if (inode_mark && vfsmnt_mark) {
|
||||||
return should_send_vfsmount_event(group, mnt, to_tell,
|
marks_mask = (vfsmnt_mark->mask | inode_mark->mask);
|
||||||
vfsmount_mark, mask);
|
marks_ignored_mask = (vfsmnt_mark->ignored_mask | inode_mark->ignored_mask);
|
||||||
else
|
} else if (inode_mark) {
|
||||||
return should_send_inode_event(group, to_tell, inode_mark, mask);
|
/*
|
||||||
|
* if the event is for a child and this inode doesn't care about
|
||||||
|
* events on the child, don't send it!
|
||||||
|
*/
|
||||||
|
if ((event_mask & FS_EVENT_ON_CHILD) &&
|
||||||
|
!(inode_mark->mask & FS_EVENT_ON_CHILD))
|
||||||
|
return false;
|
||||||
|
marks_mask = inode_mark->mask;
|
||||||
|
marks_ignored_mask = inode_mark->ignored_mask;
|
||||||
|
} else if (vfsmnt_mark) {
|
||||||
|
marks_mask = vfsmnt_mark->mask;
|
||||||
|
marks_ignored_mask = vfsmnt_mark->ignored_mask;
|
||||||
|
} else {
|
||||||
|
BUG();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (event_mask & marks_mask & ~marks_ignored_mask)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
const struct fsnotify_ops fanotify_fsnotify_ops = {
|
const struct fsnotify_ops fanotify_fsnotify_ops = {
|
||||||
|
|
|
@ -183,7 +183,7 @@ static int send_to_group(struct inode *to_tell, struct vfsmount *mnt,
|
||||||
if (!inode_test_mask && !vfsmount_test_mask)
|
if (!inode_test_mask && !vfsmount_test_mask)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (group->ops->should_send_event(group, to_tell, mnt, inode_mark,
|
if (group->ops->should_send_event(group, to_tell, inode_mark,
|
||||||
vfsmount_mark, mask, data,
|
vfsmount_mark, mask, data,
|
||||||
data_is) == false)
|
data_is) == false)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -142,11 +142,11 @@ static void inotify_freeing_mark(struct fsnotify_mark *fsn_mark, struct fsnotify
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool inotify_should_send_event(struct fsnotify_group *group, struct inode *inode,
|
static bool inotify_should_send_event(struct fsnotify_group *group, struct inode *inode,
|
||||||
struct vfsmount *mnt, struct fsnotify_mark *mark,
|
struct fsnotify_mark *inode_mark,
|
||||||
struct fsnotify_mark *vfsmount_mark,
|
struct fsnotify_mark *vfsmount_mark,
|
||||||
__u32 mask, void *data, int data_type)
|
__u32 mask, void *data, int data_type)
|
||||||
{
|
{
|
||||||
if ((mark->mask & FS_EXCL_UNLINK) &&
|
if ((inode_mark->mask & FS_EXCL_UNLINK) &&
|
||||||
(data_type == FSNOTIFY_EVENT_FILE)) {
|
(data_type == FSNOTIFY_EVENT_FILE)) {
|
||||||
struct file *file = data;
|
struct file *file = data;
|
||||||
|
|
||||||
|
|
|
@ -92,7 +92,7 @@ struct fsnotify_event_private_data;
|
||||||
*/
|
*/
|
||||||
struct fsnotify_ops {
|
struct fsnotify_ops {
|
||||||
bool (*should_send_event)(struct fsnotify_group *group, struct inode *inode,
|
bool (*should_send_event)(struct fsnotify_group *group, struct inode *inode,
|
||||||
struct vfsmount *mnt, struct fsnotify_mark *inode_mark,
|
struct fsnotify_mark *inode_mark,
|
||||||
struct fsnotify_mark *vfsmount_mark,
|
struct fsnotify_mark *vfsmount_mark,
|
||||||
__u32 mask, void *data, int data_type);
|
__u32 mask, void *data, int data_type);
|
||||||
int (*handle_event)(struct fsnotify_group *group,
|
int (*handle_event)(struct fsnotify_group *group,
|
||||||
|
|
|
@ -921,7 +921,7 @@ static void audit_tree_freeing_mark(struct fsnotify_mark *entry, struct fsnotify
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool audit_tree_send_event(struct fsnotify_group *group, struct inode *inode,
|
static bool audit_tree_send_event(struct fsnotify_group *group, struct inode *inode,
|
||||||
struct vfsmount *mnt, struct fsnotify_mark *inode_mark,
|
struct fsnotify_mark *inode_mark,
|
||||||
struct fsnotify_mark *vfsmount_mark,
|
struct fsnotify_mark *vfsmount_mark,
|
||||||
__u32 mask, void *data, int data_type)
|
__u32 mask, void *data, int data_type)
|
||||||
{
|
{
|
||||||
|
|
|
@ -503,7 +503,7 @@ void audit_remove_watch_rule(struct audit_krule *krule)
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool audit_watch_should_send_event(struct fsnotify_group *group, struct inode *inode,
|
static bool audit_watch_should_send_event(struct fsnotify_group *group, struct inode *inode,
|
||||||
struct vfsmount *mnt, struct fsnotify_mark *inode_mark,
|
struct fsnotify_mark *inode_mark,
|
||||||
struct fsnotify_mark *vfsmount_mark,
|
struct fsnotify_mark *vfsmount_mark,
|
||||||
__u32 mask, void *data, int data_type)
|
__u32 mask, void *data, int data_type)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Add table
Reference in a new issue