[PATCH 09/10] fsnotify: dont put marks on temporary list when clearing marks by group
Andy Whitcroft
apw at canonical.com
Mon Apr 16 18:02:39 UTC 2012
From: Lino Sanfilippo <LinoSanfilippo at gmx.de>
In clear_marks_by_group_flags() the mark list of a group is iterated and the
marks are put on a temporary list.
Since we introduced fsnotify_destroy_mark_locked() we dont need the temp list
any more and are able to remove the marks while the mark list is iterated and
the mark list mutex is held.
Signed-off-by: Lino Sanfilippo <LinoSanfilippo at gmx.de>
Signed-off-by: Eric Paris <eparis at redhat.com>
(cherry-picked from commit aaf3ccb72ad1d1ecbca2284751a440e0540301a7 git://git.infradead.org/users/eparis/notify.git)
BugLink: http://bugs.launchpad.net/bugs/922906
Signed-off-by: Andy Whitcroft <apw at canonical.com>
---
fs/notify/mark.c | 10 ++--------
include/linux/fsnotify_backend.h | 1 -
2 files changed, 2 insertions(+), 9 deletions(-)
diff --git a/fs/notify/mark.c b/fs/notify/mark.c
index 37962c7..faf8228d 100644
--- a/fs/notify/mark.c
+++ b/fs/notify/mark.c
@@ -302,22 +302,16 @@ void fsnotify_clear_marks_by_group_flags(struct fsnotify_group *group,
unsigned int flags)
{
struct fsnotify_mark *lmark, *mark;
- LIST_HEAD(free_list);
mutex_lock(&group->mark_mutex);
list_for_each_entry_safe(mark, lmark, &group->marks_list, g_list) {
if (mark->flags & flags) {
- list_add(&mark->free_g_list, &free_list);
- list_del_init(&mark->g_list);
fsnotify_get_mark(mark);
+ fsnotify_destroy_mark_locked(mark, group);
+ fsnotify_put_mark(mark);
}
}
mutex_unlock(&group->mark_mutex);
-
- list_for_each_entry_safe(mark, lmark, &free_list, free_g_list) {
- fsnotify_destroy_mark(mark, group);
- fsnotify_put_mark(mark);
- }
}
/*
diff --git a/include/linux/fsnotify_backend.h b/include/linux/fsnotify_backend.h
index 4f205fa..3fea9d4 100644
--- a/include/linux/fsnotify_backend.h
+++ b/include/linux/fsnotify_backend.h
@@ -287,7 +287,6 @@ struct fsnotify_mark {
struct fsnotify_inode_mark i;
struct fsnotify_vfsmount_mark m;
};
- struct list_head free_g_list; /* tmp list used when freeing this mark */
__u32 ignored_mask; /* events types to ignore */
#define FSNOTIFY_MARK_FLAG_INODE 0x01
#define FSNOTIFY_MARK_FLAG_VFSMOUNT 0x02
--
1.7.9.5
More information about the kernel-team
mailing list