aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/misc/sgi-gru/grutlbpurge.c
diff options
context:
space:
mode:
authorJack Steiner <steiner@sgi.com>2009-12-15 19:48:08 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2009-12-16 10:20:15 -0500
commit7f2251b1bcdd3d2971b2fde3008b270ea11b8780 (patch)
tree5fc3a2fc089188a6a61e16374a5b715db280aca7 /drivers/misc/sgi-gru/grutlbpurge.c
parent6c9620c64be3920487c0533e0ab6724dad565d59 (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.c8
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;
323error:
324 kfree(gms);
325 return ERR_PTR(err);
320} 326}
321 327
322void gru_drop_mmu_notifier(struct gru_mm_struct *gms) 328void gru_drop_mmu_notifier(struct gru_mm_struct *gms)