Skip to content

Commit ca74572

Browse files
committed
Merge tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rdma/rdma
Pull rdma fixes from Jason Gunthorpe: - Older "does not even boot" regression in qib from July - Bug fixes for error unwind in rtrs - Avoid a deadlock syzkaller found in srp - Fix another UAF syzkaller found in cma * tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rdma/rdma: RDMA/cma: Do not change route.addr.src_addr outside state checks RDMA/ib_srp: Fix a deadlock RDMA/rtrs-clt: Move free_permit from free_clt to rtrs_clt_close RDMA/rtrs-clt: Fix possible double free in error case IB/qib: Fix duplicate sysfs directory name
2 parents 115ccd2 + 22e9f71 commit ca74572

4 files changed

Lines changed: 50 additions & 37 deletions

File tree

drivers/infiniband/core/cma.c

Lines changed: 24 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3370,22 +3370,30 @@ static int cma_resolve_ib_addr(struct rdma_id_private *id_priv)
33703370
static int cma_bind_addr(struct rdma_cm_id *id, struct sockaddr *src_addr,
33713371
const struct sockaddr *dst_addr)
33723372
{
3373-
if (!src_addr || !src_addr->sa_family) {
3374-
src_addr = (struct sockaddr *) &id->route.addr.src_addr;
3375-
src_addr->sa_family = dst_addr->sa_family;
3376-
if (IS_ENABLED(CONFIG_IPV6) &&
3377-
dst_addr->sa_family == AF_INET6) {
3378-
struct sockaddr_in6 *src_addr6 = (struct sockaddr_in6 *) src_addr;
3379-
struct sockaddr_in6 *dst_addr6 = (struct sockaddr_in6 *) dst_addr;
3380-
src_addr6->sin6_scope_id = dst_addr6->sin6_scope_id;
3381-
if (ipv6_addr_type(&dst_addr6->sin6_addr) & IPV6_ADDR_LINKLOCAL)
3382-
id->route.addr.dev_addr.bound_dev_if = dst_addr6->sin6_scope_id;
3383-
} else if (dst_addr->sa_family == AF_IB) {
3384-
((struct sockaddr_ib *) src_addr)->sib_pkey =
3385-
((struct sockaddr_ib *) dst_addr)->sib_pkey;
3386-
}
3387-
}
3388-
return rdma_bind_addr(id, src_addr);
3373+
struct sockaddr_storage zero_sock = {};
3374+
3375+
if (src_addr && src_addr->sa_family)
3376+
return rdma_bind_addr(id, src_addr);
3377+
3378+
/*
3379+
* When the src_addr is not specified, automatically supply an any addr
3380+
*/
3381+
zero_sock.ss_family = dst_addr->sa_family;
3382+
if (IS_ENABLED(CONFIG_IPV6) && dst_addr->sa_family == AF_INET6) {
3383+
struct sockaddr_in6 *src_addr6 =
3384+
(struct sockaddr_in6 *)&zero_sock;
3385+
struct sockaddr_in6 *dst_addr6 =
3386+
(struct sockaddr_in6 *)dst_addr;
3387+
3388+
src_addr6->sin6_scope_id = dst_addr6->sin6_scope_id;
3389+
if (ipv6_addr_type(&dst_addr6->sin6_addr) & IPV6_ADDR_LINKLOCAL)
3390+
id->route.addr.dev_addr.bound_dev_if =
3391+
dst_addr6->sin6_scope_id;
3392+
} else if (dst_addr->sa_family == AF_IB) {
3393+
((struct sockaddr_ib *)&zero_sock)->sib_pkey =
3394+
((struct sockaddr_ib *)dst_addr)->sib_pkey;
3395+
}
3396+
return rdma_bind_addr(id, (struct sockaddr *)&zero_sock);
33893397
}
33903398

33913399
/*

drivers/infiniband/hw/qib/qib_sysfs.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -541,7 +541,7 @@ static struct attribute *port_diagc_attributes[] = {
541541
};
542542

543543
static const struct attribute_group port_diagc_group = {
544-
.name = "linkcontrol",
544+
.name = "diag_counters",
545545
.attrs = port_diagc_attributes,
546546
};
547547

drivers/infiniband/ulp/rtrs/rtrs-clt.c

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2682,6 +2682,8 @@ static void rtrs_clt_dev_release(struct device *dev)
26822682
struct rtrs_clt_sess *clt = container_of(dev, struct rtrs_clt_sess,
26832683
dev);
26842684

2685+
mutex_destroy(&clt->paths_ev_mutex);
2686+
mutex_destroy(&clt->paths_mutex);
26852687
kfree(clt);
26862688
}
26872689

@@ -2711,6 +2713,8 @@ static struct rtrs_clt_sess *alloc_clt(const char *sessname, size_t paths_num,
27112713
return ERR_PTR(-ENOMEM);
27122714
}
27132715

2716+
clt->dev.class = rtrs_clt_dev_class;
2717+
clt->dev.release = rtrs_clt_dev_release;
27142718
uuid_gen(&clt->paths_uuid);
27152719
INIT_LIST_HEAD_RCU(&clt->paths_list);
27162720
clt->paths_num = paths_num;
@@ -2727,53 +2731,51 @@ static struct rtrs_clt_sess *alloc_clt(const char *sessname, size_t paths_num,
27272731
init_waitqueue_head(&clt->permits_wait);
27282732
mutex_init(&clt->paths_ev_mutex);
27292733
mutex_init(&clt->paths_mutex);
2734+
device_initialize(&clt->dev);
27302735

2731-
clt->dev.class = rtrs_clt_dev_class;
2732-
clt->dev.release = rtrs_clt_dev_release;
27332736
err = dev_set_name(&clt->dev, "%s", sessname);
27342737
if (err)
2735-
goto err;
2738+
goto err_put;
2739+
27362740
/*
27372741
* Suppress user space notification until
27382742
* sysfs files are created
27392743
*/
27402744
dev_set_uevent_suppress(&clt->dev, true);
2741-
err = device_register(&clt->dev);
2742-
if (err) {
2743-
put_device(&clt->dev);
2744-
goto err;
2745-
}
2745+
err = device_add(&clt->dev);
2746+
if (err)
2747+
goto err_put;
27462748

27472749
clt->kobj_paths = kobject_create_and_add("paths", &clt->dev.kobj);
27482750
if (!clt->kobj_paths) {
27492751
err = -ENOMEM;
2750-
goto err_dev;
2752+
goto err_del;
27512753
}
27522754
err = rtrs_clt_create_sysfs_root_files(clt);
27532755
if (err) {
27542756
kobject_del(clt->kobj_paths);
27552757
kobject_put(clt->kobj_paths);
2756-
goto err_dev;
2758+
goto err_del;
27572759
}
27582760
dev_set_uevent_suppress(&clt->dev, false);
27592761
kobject_uevent(&clt->dev.kobj, KOBJ_ADD);
27602762

27612763
return clt;
2762-
err_dev:
2763-
device_unregister(&clt->dev);
2764-
err:
2764+
err_del:
2765+
device_del(&clt->dev);
2766+
err_put:
27652767
free_percpu(clt->pcpu_path);
2766-
kfree(clt);
2768+
put_device(&clt->dev);
27672769
return ERR_PTR(err);
27682770
}
27692771

27702772
static void free_clt(struct rtrs_clt_sess *clt)
27712773
{
2772-
free_permits(clt);
27732774
free_percpu(clt->pcpu_path);
2774-
mutex_destroy(&clt->paths_ev_mutex);
2775-
mutex_destroy(&clt->paths_mutex);
2776-
/* release callback will free clt in last put */
2775+
2776+
/*
2777+
* release callback will free clt and destroy mutexes in last put
2778+
*/
27772779
device_unregister(&clt->dev);
27782780
}
27792781

@@ -2890,6 +2892,7 @@ void rtrs_clt_close(struct rtrs_clt_sess *clt)
28902892
rtrs_clt_destroy_path_files(clt_path, NULL);
28912893
kobject_put(&clt_path->kobj);
28922894
}
2895+
free_permits(clt);
28932896
free_clt(clt);
28942897
}
28952898
EXPORT_SYMBOL(rtrs_clt_close);

drivers/infiniband/ulp/srp/ib_srp.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4047,9 +4047,11 @@ static void srp_remove_one(struct ib_device *device, void *client_data)
40474047
spin_unlock(&host->target_lock);
40484048

40494049
/*
4050-
* Wait for tl_err and target port removal tasks.
4050+
* srp_queue_remove_work() queues a call to
4051+
* srp_remove_target(). The latter function cancels
4052+
* target->tl_err_work so waiting for the remove works to
4053+
* finish is sufficient.
40514054
*/
4052-
flush_workqueue(system_long_wq);
40534055
flush_workqueue(srp_remove_wq);
40544056

40554057
kfree(host);

0 commit comments

Comments
 (0)