Skip to content

Commit

Permalink
fanotify: add an extra flag to mark_remove_from_mask that indicates w…
Browse files Browse the repository at this point in the history
…heather a mark should be destroyed

This patch adds an extra flag to mark_remove_from_mask() to inform the caller if
the mark should be destroyed.
With this we dont destroy the mark implicitly in the function itself any more
but let the caller handle it.

Signed-off-by: Lino Sanfilippo <[email protected]>
Signed-off-by: Eric Paris <[email protected]>
  • Loading branch information
LinoSanfilippo333 authored and eparis committed Dec 11, 2012
1 parent 104d06f commit 6dfbd14
Showing 1 changed file with 14 additions and 5 deletions.
19 changes: 14 additions & 5 deletions fs/notify/fanotify/fanotify_user.c
Original file line number Diff line number Diff line change
Expand Up @@ -511,7 +511,8 @@ static int fanotify_find_path(int dfd, const char __user *filename,

static __u32 fanotify_mark_remove_from_mask(struct fsnotify_mark *fsn_mark,
__u32 mask,
unsigned int flags)
unsigned int flags,
int *destroy)
{
__u32 oldmask;

Expand All @@ -525,8 +526,7 @@ static __u32 fanotify_mark_remove_from_mask(struct fsnotify_mark *fsn_mark,
}
spin_unlock(&fsn_mark->lock);

if (!(oldmask & ~mask))
fsnotify_destroy_mark(fsn_mark);
*destroy = !(oldmask & ~mask);

return mask & oldmask;
}
Expand All @@ -537,12 +537,17 @@ static int fanotify_remove_vfsmount_mark(struct fsnotify_group *group,
{
struct fsnotify_mark *fsn_mark = NULL;
__u32 removed;
int destroy_mark;

fsn_mark = fsnotify_find_vfsmount_mark(group, mnt);
if (!fsn_mark)
return -ENOENT;

removed = fanotify_mark_remove_from_mask(fsn_mark, mask, flags);
removed = fanotify_mark_remove_from_mask(fsn_mark, mask, flags,
&destroy_mark);
if (destroy_mark)
fsnotify_destroy_mark(fsn_mark);

fsnotify_put_mark(fsn_mark);
if (removed & real_mount(mnt)->mnt_fsnotify_mask)
fsnotify_recalc_vfsmount_mask(mnt);
Expand All @@ -556,12 +561,16 @@ static int fanotify_remove_inode_mark(struct fsnotify_group *group,
{
struct fsnotify_mark *fsn_mark = NULL;
__u32 removed;
int destroy_mark;

fsn_mark = fsnotify_find_inode_mark(group, inode);
if (!fsn_mark)
return -ENOENT;

removed = fanotify_mark_remove_from_mask(fsn_mark, mask, flags);
removed = fanotify_mark_remove_from_mask(fsn_mark, mask, flags,
&destroy_mark);
if (destroy_mark)
fsnotify_destroy_mark(fsn_mark);
/* matches the fsnotify_find_inode_mark() */
fsnotify_put_mark(fsn_mark);
if (removed & inode->i_fsnotify_mask)
Expand Down

0 comments on commit 6dfbd14

Please sign in to comment.