diff options
| author | Al Viro <viro@zeniv.linux.org.uk> | 2010-10-30 02:18:32 -0400 |
|---|---|---|
| committer | Al Viro <viro@zeniv.linux.org.uk> | 2010-10-30 02:18:32 -0400 |
| commit | f7a998a9491f2da1d3e44d150aa611d10093da4f (patch) | |
| tree | 5d7c32eff458aeab7bcfeafd2d27e377b1f2b970 /kernel | |
| parent | b8800aa5d9c7e4e2869321c77b80f322a0d9663a (diff) | |
in untag_chunk() we need to do alloc_chunk() a bit earlier
... while we are not holding spinlocks.
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/audit_tree.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/kernel/audit_tree.c b/kernel/audit_tree.c index 7f18d3a4527e..37b2bea170c8 100644 --- a/kernel/audit_tree.c +++ b/kernel/audit_tree.c | |||
| @@ -223,7 +223,7 @@ static void untag_chunk(struct node *p) | |||
| 223 | { | 223 | { |
| 224 | struct audit_chunk *chunk = find_chunk(p); | 224 | struct audit_chunk *chunk = find_chunk(p); |
| 225 | struct fsnotify_mark *entry = &chunk->mark; | 225 | struct fsnotify_mark *entry = &chunk->mark; |
| 226 | struct audit_chunk *new; | 226 | struct audit_chunk *new = NULL; |
| 227 | struct audit_tree *owner; | 227 | struct audit_tree *owner; |
| 228 | int size = chunk->count - 1; | 228 | int size = chunk->count - 1; |
| 229 | int i, j; | 229 | int i, j; |
| @@ -232,9 +232,14 @@ static void untag_chunk(struct node *p) | |||
| 232 | 232 | ||
| 233 | spin_unlock(&hash_lock); | 233 | spin_unlock(&hash_lock); |
| 234 | 234 | ||
| 235 | if (size) | ||
| 236 | new = alloc_chunk(size); | ||
| 237 | |||
| 235 | spin_lock(&entry->lock); | 238 | spin_lock(&entry->lock); |
| 236 | if (chunk->dead || !entry->i.inode) { | 239 | if (chunk->dead || !entry->i.inode) { |
| 237 | spin_unlock(&entry->lock); | 240 | spin_unlock(&entry->lock); |
| 241 | if (new) | ||
| 242 | free_chunk(new); | ||
| 238 | goto out; | 243 | goto out; |
| 239 | } | 244 | } |
| 240 | 245 | ||
| @@ -255,9 +260,9 @@ static void untag_chunk(struct node *p) | |||
| 255 | goto out; | 260 | goto out; |
| 256 | } | 261 | } |
| 257 | 262 | ||
| 258 | new = alloc_chunk(size); | ||
| 259 | if (!new) | 263 | if (!new) |
| 260 | goto Fallback; | 264 | goto Fallback; |
| 265 | |||
| 261 | fsnotify_duplicate_mark(&new->mark, entry); | 266 | fsnotify_duplicate_mark(&new->mark, entry); |
| 262 | if (fsnotify_add_mark(&new->mark, new->mark.group, new->mark.i.inode, NULL, 1)) { | 267 | if (fsnotify_add_mark(&new->mark, new->mark.group, new->mark.i.inode, NULL, 1)) { |
| 263 | free_chunk(new); | 268 | free_chunk(new); |
