diff options
author | Lino Sanfilippo <LinoSanfilippo@gmx.de> | 2011-06-14 11:29:50 -0400 |
---|---|---|
committer | Eric Paris <eparis@redhat.com> | 2012-12-11 13:29:46 -0500 |
commit | 986ab09807ca9454c3f54aae4db7e1bb00daeed3 (patch) | |
tree | d6b76b03624a2d95a73ba88d990cd5210ab9eb20 /fs/notify/mark.c | |
parent | 6dfbd149946c22c2e2886d6b560def78630c8387 (diff) |
fsnotify: use a mutex instead of a spinlock to protect a groups mark list
Replaces the groups mark_lock spinlock with a mutex. Using a mutex instead
of a spinlock results in more flexibility (i.e it allows to sleep while the
lock is held).
Signed-off-by: Lino Sanfilippo <LinoSanfilippo@gmx.de>
Signed-off-by: Eric Paris <eparis@redhat.com>
Diffstat (limited to 'fs/notify/mark.c')
-rw-r--r-- | fs/notify/mark.c | 18 |
1 files changed, 9 insertions, 9 deletions
diff --git a/fs/notify/mark.c b/fs/notify/mark.c index 32447dc06c07..ab25b810b146 100644 --- a/fs/notify/mark.c +++ b/fs/notify/mark.c | |||
@@ -136,13 +136,13 @@ void fsnotify_destroy_mark(struct fsnotify_mark *mark) | |||
136 | group = mark->group; | 136 | group = mark->group; |
137 | spin_unlock(&mark->lock); | 137 | spin_unlock(&mark->lock); |
138 | 138 | ||
139 | spin_lock(&group->mark_lock); | 139 | mutex_lock(&group->mark_mutex); |
140 | spin_lock(&mark->lock); | 140 | spin_lock(&mark->lock); |
141 | 141 | ||
142 | /* something else already called this function on this mark */ | 142 | /* something else already called this function on this mark */ |
143 | if (!(mark->flags & FSNOTIFY_MARK_FLAG_ALIVE)) { | 143 | if (!(mark->flags & FSNOTIFY_MARK_FLAG_ALIVE)) { |
144 | spin_unlock(&mark->lock); | 144 | spin_unlock(&mark->lock); |
145 | spin_unlock(&group->mark_lock); | 145 | mutex_unlock(&group->mark_mutex); |
146 | goto put_group; | 146 | goto put_group; |
147 | } | 147 | } |
148 | 148 | ||
@@ -159,7 +159,7 @@ void fsnotify_destroy_mark(struct fsnotify_mark *mark) | |||
159 | list_del_init(&mark->g_list); | 159 | list_del_init(&mark->g_list); |
160 | 160 | ||
161 | spin_unlock(&mark->lock); | 161 | spin_unlock(&mark->lock); |
162 | spin_unlock(&group->mark_lock); | 162 | mutex_unlock(&group->mark_mutex); |
163 | 163 | ||
164 | spin_lock(&destroy_lock); | 164 | spin_lock(&destroy_lock); |
165 | list_add(&mark->destroy_list, &destroy_list); | 165 | list_add(&mark->destroy_list, &destroy_list); |
@@ -232,11 +232,11 @@ int fsnotify_add_mark(struct fsnotify_mark *mark, | |||
232 | 232 | ||
233 | /* | 233 | /* |
234 | * LOCKING ORDER!!!! | 234 | * LOCKING ORDER!!!! |
235 | * group->mark_lock | 235 | * group->mark_mutex |
236 | * mark->lock | 236 | * mark->lock |
237 | * inode->i_lock | 237 | * inode->i_lock |
238 | */ | 238 | */ |
239 | spin_lock(&group->mark_lock); | 239 | mutex_lock(&group->mark_mutex); |
240 | 240 | ||
241 | spin_lock(&mark->lock); | 241 | spin_lock(&mark->lock); |
242 | mark->flags |= FSNOTIFY_MARK_FLAG_ALIVE; | 242 | mark->flags |= FSNOTIFY_MARK_FLAG_ALIVE; |
@@ -263,7 +263,7 @@ int fsnotify_add_mark(struct fsnotify_mark *mark, | |||
263 | fsnotify_set_mark_mask_locked(mark, mark->mask); | 263 | fsnotify_set_mark_mask_locked(mark, mark->mask); |
264 | spin_unlock(&mark->lock); | 264 | spin_unlock(&mark->lock); |
265 | 265 | ||
266 | spin_unlock(&group->mark_lock); | 266 | mutex_unlock(&group->mark_mutex); |
267 | 267 | ||
268 | if (inode) | 268 | if (inode) |
269 | __fsnotify_update_child_dentry_flags(inode); | 269 | __fsnotify_update_child_dentry_flags(inode); |
@@ -277,7 +277,7 @@ err: | |||
277 | atomic_dec(&group->num_marks); | 277 | atomic_dec(&group->num_marks); |
278 | 278 | ||
279 | spin_unlock(&mark->lock); | 279 | spin_unlock(&mark->lock); |
280 | spin_unlock(&group->mark_lock); | 280 | mutex_unlock(&group->mark_mutex); |
281 | 281 | ||
282 | spin_lock(&destroy_lock); | 282 | spin_lock(&destroy_lock); |
283 | list_add(&mark->destroy_list, &destroy_list); | 283 | list_add(&mark->destroy_list, &destroy_list); |
@@ -296,7 +296,7 @@ void fsnotify_clear_marks_by_group_flags(struct fsnotify_group *group, | |||
296 | struct fsnotify_mark *lmark, *mark; | 296 | struct fsnotify_mark *lmark, *mark; |
297 | LIST_HEAD(free_list); | 297 | LIST_HEAD(free_list); |
298 | 298 | ||
299 | spin_lock(&group->mark_lock); | 299 | mutex_lock(&group->mark_mutex); |
300 | list_for_each_entry_safe(mark, lmark, &group->marks_list, g_list) { | 300 | list_for_each_entry_safe(mark, lmark, &group->marks_list, g_list) { |
301 | if (mark->flags & flags) { | 301 | if (mark->flags & flags) { |
302 | list_add(&mark->free_g_list, &free_list); | 302 | list_add(&mark->free_g_list, &free_list); |
@@ -304,7 +304,7 @@ void fsnotify_clear_marks_by_group_flags(struct fsnotify_group *group, | |||
304 | fsnotify_get_mark(mark); | 304 | fsnotify_get_mark(mark); |
305 | } | 305 | } |
306 | } | 306 | } |
307 | spin_unlock(&group->mark_lock); | 307 | mutex_unlock(&group->mark_mutex); |
308 | 308 | ||
309 | list_for_each_entry_safe(mark, lmark, &free_list, free_g_list) { | 309 | list_for_each_entry_safe(mark, lmark, &free_list, free_g_list) { |
310 | fsnotify_destroy_mark(mark); | 310 | fsnotify_destroy_mark(mark); |