diff options
author | Jack Steiner <steiner@sgi.com> | 2009-12-15 19:48:08 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-12-16 10:20:15 -0500 |
commit | 7f2251b1bcdd3d2971b2fde3008b270ea11b8780 (patch) | |
tree | 5fc3a2fc089188a6a61e16374a5b715db280aca7 /drivers/misc/sgi-gru/grutlbpurge.c | |
parent | 6c9620c64be3920487c0533e0ab6724dad565d59 (diff) |
gru: handle failures to mmu_notifier_register
Under some conditions, mmu_notifier_register() will fail to register a
mmu_notifier. Fix the GRU driver to correctly handle these failures.
Signed-off-by: Jack Steiner <steiner@sgi.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'drivers/misc/sgi-gru/grutlbpurge.c')
-rw-r--r-- | drivers/misc/sgi-gru/grutlbpurge.c | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/drivers/misc/sgi-gru/grutlbpurge.c b/drivers/misc/sgi-gru/grutlbpurge.c index 1d125091f5e7..421c548e51f1 100644 --- a/drivers/misc/sgi-gru/grutlbpurge.c +++ b/drivers/misc/sgi-gru/grutlbpurge.c | |||
@@ -299,6 +299,7 @@ struct gru_mm_struct *gru_register_mmu_notifier(void) | |||
299 | { | 299 | { |
300 | struct gru_mm_struct *gms; | 300 | struct gru_mm_struct *gms; |
301 | struct mmu_notifier *mn; | 301 | struct mmu_notifier *mn; |
302 | int err; | ||
302 | 303 | ||
303 | mn = mmu_find_ops(current->mm, &gru_mmuops); | 304 | mn = mmu_find_ops(current->mm, &gru_mmuops); |
304 | if (mn) { | 305 | if (mn) { |
@@ -311,12 +312,17 @@ struct gru_mm_struct *gru_register_mmu_notifier(void) | |||
311 | gms->ms_notifier.ops = &gru_mmuops; | 312 | gms->ms_notifier.ops = &gru_mmuops; |
312 | atomic_set(&gms->ms_refcnt, 1); | 313 | atomic_set(&gms->ms_refcnt, 1); |
313 | init_waitqueue_head(&gms->ms_wait_queue); | 314 | init_waitqueue_head(&gms->ms_wait_queue); |
314 | __mmu_notifier_register(&gms->ms_notifier, current->mm); | 315 | err = __mmu_notifier_register(&gms->ms_notifier, current->mm); |
316 | if (err) | ||
317 | goto error; | ||
315 | } | 318 | } |
316 | } | 319 | } |
317 | gru_dbg(grudev, "gms %p, refcnt %d\n", gms, | 320 | gru_dbg(grudev, "gms %p, refcnt %d\n", gms, |
318 | atomic_read(&gms->ms_refcnt)); | 321 | atomic_read(&gms->ms_refcnt)); |
319 | return gms; | 322 | return gms; |
323 | error: | ||
324 | kfree(gms); | ||
325 | return ERR_PTR(err); | ||
320 | } | 326 | } |
321 | 327 | ||
322 | void gru_drop_mmu_notifier(struct gru_mm_struct *gms) | 328 | void gru_drop_mmu_notifier(struct gru_mm_struct *gms) |