Merge branch 'for-linus' of master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband
* 'for-linus' of master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband: IB/ehca: Fix mismatched spin_unlock in irq handler IB/ehca: Fix improper use of yield() with spinlock held IB/srp: Check match_strdup() return
This commit is contained in:
commit
821836e5ba
3 changed files with 26 additions and 2 deletions
|
@ -344,8 +344,11 @@ int ehca_destroy_cq(struct ib_cq *cq)
|
|||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&ehca_cq_idr_lock, flags);
|
||||
while (my_cq->nr_callbacks)
|
||||
while (my_cq->nr_callbacks) {
|
||||
spin_unlock_irqrestore(&ehca_cq_idr_lock, flags);
|
||||
yield();
|
||||
spin_lock_irqsave(&ehca_cq_idr_lock, flags);
|
||||
}
|
||||
|
||||
idr_remove(&ehca_cq_idr, my_cq->token);
|
||||
spin_unlock_irqrestore(&ehca_cq_idr_lock, flags);
|
||||
|
|
|
@ -440,7 +440,8 @@ void ehca_tasklet_eq(unsigned long data)
|
|||
cq = idr_find(&ehca_cq_idr, token);
|
||||
|
||||
if (cq == NULL) {
|
||||
spin_unlock(&ehca_cq_idr_lock);
|
||||
spin_unlock_irqrestore(&ehca_cq_idr_lock,
|
||||
flags);
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
|
@ -1621,18 +1621,30 @@ static int srp_parse_options(const char *buf, struct srp_target_port *target)
|
|||
switch (token) {
|
||||
case SRP_OPT_ID_EXT:
|
||||
p = match_strdup(args);
|
||||
if (!p) {
|
||||
ret = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
target->id_ext = cpu_to_be64(simple_strtoull(p, NULL, 16));
|
||||
kfree(p);
|
||||
break;
|
||||
|
||||
case SRP_OPT_IOC_GUID:
|
||||
p = match_strdup(args);
|
||||
if (!p) {
|
||||
ret = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
target->ioc_guid = cpu_to_be64(simple_strtoull(p, NULL, 16));
|
||||
kfree(p);
|
||||
break;
|
||||
|
||||
case SRP_OPT_DGID:
|
||||
p = match_strdup(args);
|
||||
if (!p) {
|
||||
ret = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
if (strlen(p) != 32) {
|
||||
printk(KERN_WARNING PFX "bad dest GID parameter '%s'\n", p);
|
||||
kfree(p);
|
||||
|
@ -1656,6 +1668,10 @@ static int srp_parse_options(const char *buf, struct srp_target_port *target)
|
|||
|
||||
case SRP_OPT_SERVICE_ID:
|
||||
p = match_strdup(args);
|
||||
if (!p) {
|
||||
ret = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
target->service_id = cpu_to_be64(simple_strtoull(p, NULL, 16));
|
||||
kfree(p);
|
||||
break;
|
||||
|
@ -1693,6 +1709,10 @@ static int srp_parse_options(const char *buf, struct srp_target_port *target)
|
|||
|
||||
case SRP_OPT_INITIATOR_EXT:
|
||||
p = match_strdup(args);
|
||||
if (!p) {
|
||||
ret = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
target->initiator_ext = cpu_to_be64(simple_strtoull(p, NULL, 16));
|
||||
kfree(p);
|
||||
break;
|
||||
|
|
Loading…
Reference in a new issue