diff options
-rw-r--r-- | drivers/infiniband/hw/qib/qib_diag.c | 25 |
1 files changed, 10 insertions, 15 deletions
diff --git a/drivers/infiniband/hw/qib/qib_diag.c b/drivers/infiniband/hw/qib/qib_diag.c index 07f9030a8f10..5dfda4c5cc9c 100644 --- a/drivers/infiniband/hw/qib/qib_diag.c +++ b/drivers/infiniband/hw/qib/qib_diag.c | |||
@@ -694,28 +694,23 @@ int qib_register_observer(struct qib_devdata *dd, | |||
694 | const struct diag_observer *op) | 694 | const struct diag_observer *op) |
695 | { | 695 | { |
696 | struct diag_observer_list_elt *olp; | 696 | struct diag_observer_list_elt *olp; |
697 | int ret = -EINVAL; | 697 | unsigned long flags; |
698 | 698 | ||
699 | if (!dd || !op) | 699 | if (!dd || !op) |
700 | goto bail; | 700 | return -EINVAL; |
701 | ret = -ENOMEM; | ||
702 | olp = vmalloc(sizeof *olp); | 701 | olp = vmalloc(sizeof *olp); |
703 | if (!olp) { | 702 | if (!olp) { |
704 | pr_err("vmalloc for observer failed\n"); | 703 | pr_err("vmalloc for observer failed\n"); |
705 | goto bail; | 704 | return -ENOMEM; |
706 | } | 705 | } |
707 | if (olp) { | ||
708 | unsigned long flags; | ||
709 | 706 | ||
710 | spin_lock_irqsave(&dd->qib_diag_trans_lock, flags); | 707 | spin_lock_irqsave(&dd->qib_diag_trans_lock, flags); |
711 | olp->op = op; | 708 | olp->op = op; |
712 | olp->next = dd->diag_observer_list; | 709 | olp->next = dd->diag_observer_list; |
713 | dd->diag_observer_list = olp; | 710 | dd->diag_observer_list = olp; |
714 | spin_unlock_irqrestore(&dd->qib_diag_trans_lock, flags); | 711 | spin_unlock_irqrestore(&dd->qib_diag_trans_lock, flags); |
715 | ret = 0; | 712 | |
716 | } | 713 | return 0; |
717 | bail: | ||
718 | return ret; | ||
719 | } | 714 | } |
720 | 715 | ||
721 | /* Remove all registered observers when device is closed */ | 716 | /* Remove all registered observers when device is closed */ |