diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2012-12-20 23:11:52 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-12-20 23:11:52 -0500 |
commit | 96680d2b9174668100824d763382240c71baa811 (patch) | |
tree | ec84c2347df47913cc98e3cfc1d43f427d51fa1f /kernel | |
parent | 4c9a44aebeaef35570a67aed17b72a2cf8d0b219 (diff) | |
parent | 1ca39ab9d21ac93f94b9e3eb364ea9a5cf2aba06 (diff) |
Merge branch 'for-next' of git://git.infradead.org/users/eparis/notify
Pull filesystem notification updates from Eric Paris:
"This pull mostly is about locking changes in the fsnotify system. By
switching the group lock from a spin_lock() to a mutex() we can now
hold the lock across things like iput(). This fixes a problem
involving unmounting a fs and having inodes be busy, first pointed out
by FAT, but reproducible with tmpfs.
This also restores signal driven I/O for inotify, which has been
broken since about 2.6.32."
Ugh. I *hate* the timing of this. It was rebased after the merge
window opened, and then left to sit with the pull request coming the day
before the merge window closes. That's just crap. But apparently the
patches themselves have been around for over a year, just gathering
dust, so now it's suddenly critical.
Fixed up semantic conflict in fs/notify/fdinfo.c as per Stephen
Rothwell's fixes from -next.
* 'for-next' of git://git.infradead.org/users/eparis/notify:
inotify: automatically restart syscalls
inotify: dont skip removal of watch descriptor if creation of ignored event failed
fanotify: dont merge permission events
fsnotify: make fasync generic for both inotify and fanotify
fsnotify: change locking order
fsnotify: dont put marks on temporary list when clearing marks by group
fsnotify: introduce locked versions of fsnotify_add_mark() and fsnotify_remove_mark()
fsnotify: pass group to fsnotify_destroy_mark()
fsnotify: use a mutex instead of a spinlock to protect a groups mark list
fanotify: add an extra flag to mark_remove_from_mask that indicates wheather a mark should be destroyed
fsnotify: take groups mark_lock before mark lock
fsnotify: use reference counting for groups
fsnotify: introduce fsnotify_get_group()
inotify, fanotify: replace fsnotify_put_group() with fsnotify_destroy_group()
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/audit_tree.c | 10 | ||||
-rw-r--r-- | kernel/audit_watch.c | 4 |
2 files changed, 7 insertions, 7 deletions
diff --git a/kernel/audit_tree.c b/kernel/audit_tree.c index ed206fd88cca..e81175ef25f8 100644 --- a/kernel/audit_tree.c +++ b/kernel/audit_tree.c | |||
@@ -249,7 +249,7 @@ static void untag_chunk(struct node *p) | |||
249 | list_del_rcu(&chunk->hash); | 249 | list_del_rcu(&chunk->hash); |
250 | spin_unlock(&hash_lock); | 250 | spin_unlock(&hash_lock); |
251 | spin_unlock(&entry->lock); | 251 | spin_unlock(&entry->lock); |
252 | fsnotify_destroy_mark(entry); | 252 | fsnotify_destroy_mark(entry, audit_tree_group); |
253 | goto out; | 253 | goto out; |
254 | } | 254 | } |
255 | 255 | ||
@@ -291,7 +291,7 @@ static void untag_chunk(struct node *p) | |||
291 | owner->root = new; | 291 | owner->root = new; |
292 | spin_unlock(&hash_lock); | 292 | spin_unlock(&hash_lock); |
293 | spin_unlock(&entry->lock); | 293 | spin_unlock(&entry->lock); |
294 | fsnotify_destroy_mark(entry); | 294 | fsnotify_destroy_mark(entry, audit_tree_group); |
295 | fsnotify_put_mark(&new->mark); /* drop initial reference */ | 295 | fsnotify_put_mark(&new->mark); /* drop initial reference */ |
296 | goto out; | 296 | goto out; |
297 | 297 | ||
@@ -331,7 +331,7 @@ static int create_chunk(struct inode *inode, struct audit_tree *tree) | |||
331 | spin_unlock(&hash_lock); | 331 | spin_unlock(&hash_lock); |
332 | chunk->dead = 1; | 332 | chunk->dead = 1; |
333 | spin_unlock(&entry->lock); | 333 | spin_unlock(&entry->lock); |
334 | fsnotify_destroy_mark(entry); | 334 | fsnotify_destroy_mark(entry, audit_tree_group); |
335 | fsnotify_put_mark(entry); | 335 | fsnotify_put_mark(entry); |
336 | return 0; | 336 | return 0; |
337 | } | 337 | } |
@@ -412,7 +412,7 @@ static int tag_chunk(struct inode *inode, struct audit_tree *tree) | |||
412 | spin_unlock(&chunk_entry->lock); | 412 | spin_unlock(&chunk_entry->lock); |
413 | spin_unlock(&old_entry->lock); | 413 | spin_unlock(&old_entry->lock); |
414 | 414 | ||
415 | fsnotify_destroy_mark(chunk_entry); | 415 | fsnotify_destroy_mark(chunk_entry, audit_tree_group); |
416 | 416 | ||
417 | fsnotify_put_mark(chunk_entry); | 417 | fsnotify_put_mark(chunk_entry); |
418 | fsnotify_put_mark(old_entry); | 418 | fsnotify_put_mark(old_entry); |
@@ -443,7 +443,7 @@ static int tag_chunk(struct inode *inode, struct audit_tree *tree) | |||
443 | spin_unlock(&hash_lock); | 443 | spin_unlock(&hash_lock); |
444 | spin_unlock(&chunk_entry->lock); | 444 | spin_unlock(&chunk_entry->lock); |
445 | spin_unlock(&old_entry->lock); | 445 | spin_unlock(&old_entry->lock); |
446 | fsnotify_destroy_mark(old_entry); | 446 | fsnotify_destroy_mark(old_entry, audit_tree_group); |
447 | fsnotify_put_mark(chunk_entry); /* drop initial reference */ | 447 | fsnotify_put_mark(chunk_entry); /* drop initial reference */ |
448 | fsnotify_put_mark(old_entry); /* pair to fsnotify_find mark_entry */ | 448 | fsnotify_put_mark(old_entry); /* pair to fsnotify_find mark_entry */ |
449 | return 0; | 449 | return 0; |
diff --git a/kernel/audit_watch.c b/kernel/audit_watch.c index 9a9ae6e3d290..4a599f699adc 100644 --- a/kernel/audit_watch.c +++ b/kernel/audit_watch.c | |||
@@ -350,7 +350,7 @@ static void audit_remove_parent_watches(struct audit_parent *parent) | |||
350 | } | 350 | } |
351 | mutex_unlock(&audit_filter_mutex); | 351 | mutex_unlock(&audit_filter_mutex); |
352 | 352 | ||
353 | fsnotify_destroy_mark(&parent->mark); | 353 | fsnotify_destroy_mark(&parent->mark, audit_watch_group); |
354 | } | 354 | } |
355 | 355 | ||
356 | /* Get path information necessary for adding watches. */ | 356 | /* Get path information necessary for adding watches. */ |
@@ -457,7 +457,7 @@ void audit_remove_watch_rule(struct audit_krule *krule) | |||
457 | 457 | ||
458 | if (list_empty(&parent->watches)) { | 458 | if (list_empty(&parent->watches)) { |
459 | audit_get_parent(parent); | 459 | audit_get_parent(parent); |
460 | fsnotify_destroy_mark(&parent->mark); | 460 | fsnotify_destroy_mark(&parent->mark, audit_watch_group); |
461 | audit_put_parent(parent); | 461 | audit_put_parent(parent); |
462 | } | 462 | } |
463 | } | 463 | } |