diff options
author | Lino Sanfilippo <LinoSanfilippo@gmx.de> | 2011-06-14 11:29:49 -0400 |
---|---|---|
committer | Eric Paris <eparis@redhat.com> | 2012-12-11 13:29:45 -0500 |
commit | 6dfbd149946c22c2e2886d6b560def78630c8387 (patch) | |
tree | 8d13ff7c1f0a8581d15ebcad6af31953d9ed290b | |
parent | 104d06f08ea59247cb0e7e548c5a5d22d21dcfd5 (diff) |
fanotify: add an extra flag to mark_remove_from_mask that indicates wheather 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 <LinoSanfilippo@gmx.de>
Signed-off-by: Eric Paris <eparis@redhat.com>
-rw-r--r-- | fs/notify/fanotify/fanotify_user.c | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/fs/notify/fanotify/fanotify_user.c b/fs/notify/fanotify/fanotify_user.c index 82ae6d783c14..599a01952c74 100644 --- a/fs/notify/fanotify/fanotify_user.c +++ b/fs/notify/fanotify/fanotify_user.c | |||
@@ -511,7 +511,8 @@ out: | |||
511 | 511 | ||
512 | static __u32 fanotify_mark_remove_from_mask(struct fsnotify_mark *fsn_mark, | 512 | static __u32 fanotify_mark_remove_from_mask(struct fsnotify_mark *fsn_mark, |
513 | __u32 mask, | 513 | __u32 mask, |
514 | unsigned int flags) | 514 | unsigned int flags, |
515 | int *destroy) | ||
515 | { | 516 | { |
516 | __u32 oldmask; | 517 | __u32 oldmask; |
517 | 518 | ||
@@ -525,8 +526,7 @@ static __u32 fanotify_mark_remove_from_mask(struct fsnotify_mark *fsn_mark, | |||
525 | } | 526 | } |
526 | spin_unlock(&fsn_mark->lock); | 527 | spin_unlock(&fsn_mark->lock); |
527 | 528 | ||
528 | if (!(oldmask & ~mask)) | 529 | *destroy = !(oldmask & ~mask); |
529 | fsnotify_destroy_mark(fsn_mark); | ||
530 | 530 | ||
531 | return mask & oldmask; | 531 | return mask & oldmask; |
532 | } | 532 | } |
@@ -537,12 +537,17 @@ static int fanotify_remove_vfsmount_mark(struct fsnotify_group *group, | |||
537 | { | 537 | { |
538 | struct fsnotify_mark *fsn_mark = NULL; | 538 | struct fsnotify_mark *fsn_mark = NULL; |
539 | __u32 removed; | 539 | __u32 removed; |
540 | int destroy_mark; | ||
540 | 541 | ||
541 | fsn_mark = fsnotify_find_vfsmount_mark(group, mnt); | 542 | fsn_mark = fsnotify_find_vfsmount_mark(group, mnt); |
542 | if (!fsn_mark) | 543 | if (!fsn_mark) |
543 | return -ENOENT; | 544 | return -ENOENT; |
544 | 545 | ||
545 | removed = fanotify_mark_remove_from_mask(fsn_mark, mask, flags); | 546 | removed = fanotify_mark_remove_from_mask(fsn_mark, mask, flags, |
547 | &destroy_mark); | ||
548 | if (destroy_mark) | ||
549 | fsnotify_destroy_mark(fsn_mark); | ||
550 | |||
546 | fsnotify_put_mark(fsn_mark); | 551 | fsnotify_put_mark(fsn_mark); |
547 | if (removed & real_mount(mnt)->mnt_fsnotify_mask) | 552 | if (removed & real_mount(mnt)->mnt_fsnotify_mask) |
548 | fsnotify_recalc_vfsmount_mask(mnt); | 553 | fsnotify_recalc_vfsmount_mask(mnt); |
@@ -556,12 +561,16 @@ static int fanotify_remove_inode_mark(struct fsnotify_group *group, | |||
556 | { | 561 | { |
557 | struct fsnotify_mark *fsn_mark = NULL; | 562 | struct fsnotify_mark *fsn_mark = NULL; |
558 | __u32 removed; | 563 | __u32 removed; |
564 | int destroy_mark; | ||
559 | 565 | ||
560 | fsn_mark = fsnotify_find_inode_mark(group, inode); | 566 | fsn_mark = fsnotify_find_inode_mark(group, inode); |
561 | if (!fsn_mark) | 567 | if (!fsn_mark) |
562 | return -ENOENT; | 568 | return -ENOENT; |
563 | 569 | ||
564 | removed = fanotify_mark_remove_from_mask(fsn_mark, mask, flags); | 570 | removed = fanotify_mark_remove_from_mask(fsn_mark, mask, flags, |
571 | &destroy_mark); | ||
572 | if (destroy_mark) | ||
573 | fsnotify_destroy_mark(fsn_mark); | ||
565 | /* matches the fsnotify_find_inode_mark() */ | 574 | /* matches the fsnotify_find_inode_mark() */ |
566 | fsnotify_put_mark(fsn_mark); | 575 | fsnotify_put_mark(fsn_mark); |
567 | if (removed & inode->i_fsnotify_mask) | 576 | if (removed & inode->i_fsnotify_mask) |