Commit c86d8613 authored by Dmitry V. Levin's avatar Dmitry V. Levin Committed by Jakub Kicinski
Browse files

Partially revert "net/smc: Add netlink net namespace support"



The change of sizeof(struct smc_diag_linkinfo) by commit 79d39fc5
("net/smc: Add netlink net namespace support") introduced an ABI
regression: since struct smc_diag_lgrinfo contains an object of
type "struct smc_diag_linkinfo", offset of all subsequent members
of struct smc_diag_lgrinfo was changed by that change.

As result, applications compiled with the old version
of struct smc_diag_linkinfo will receive garbage in
struct smc_diag_lgrinfo.role if the kernel implements
this new version of struct smc_diag_linkinfo.

Fix this regression by reverting the part of commit 79d39fc5 that
changes struct smc_diag_linkinfo.  After all, there is SMC_GEN_NETLINK
interface which is good enough, so there is probably no need to touch
the smc_diag ABI in the first place.

Fixes: 79d39fc5 ("net/smc: Add netlink net namespace support")
Signed-off-by: default avatarDmitry V. Levin <ldv@altlinux.org>
Reviewed-by: default avatarKarsten Graul <kgraul@linux.ibm.com>
Link: https://lore.kernel.org/r/20220202030904.GA9742@altlinux.org


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent c8ff576e
Loading
Loading
Loading
Loading
+5 −6
Original line number Original line Diff line number Diff line
@@ -89,7 +89,6 @@ struct smc_diag_linkinfo {
	__u8 ibport;			/* RDMA device port number */
	__u8 ibport;			/* RDMA device port number */
	__u8 gid[40];			/* local GID */
	__u8 gid[40];			/* local GID */
	__u8 peer_gid[40];		/* peer GID */
	__u8 peer_gid[40];		/* peer GID */
	__aligned_u64	net_cookie;                 /* RDMA device net namespace */
};
};


struct smc_diag_lgrinfo {
struct smc_diag_lgrinfo {
+0 −2
Original line number Original line Diff line number Diff line
@@ -146,13 +146,11 @@ static int __smc_diag_dump(struct sock *sk, struct sk_buff *skb,
	    (req->diag_ext & (1 << (SMC_DIAG_LGRINFO - 1))) &&
	    (req->diag_ext & (1 << (SMC_DIAG_LGRINFO - 1))) &&
	    !list_empty(&smc->conn.lgr->list)) {
	    !list_empty(&smc->conn.lgr->list)) {
		struct smc_link *link = smc->conn.lnk;
		struct smc_link *link = smc->conn.lnk;
		struct net *net = read_pnet(&link->smcibdev->ibdev->coredev.rdma_net);


		struct smc_diag_lgrinfo linfo = {
		struct smc_diag_lgrinfo linfo = {
			.role = smc->conn.lgr->role,
			.role = smc->conn.lgr->role,
			.lnk[0].ibport = link->ibport,
			.lnk[0].ibport = link->ibport,
			.lnk[0].link_id = link->link_id,
			.lnk[0].link_id = link->link_id,
			.lnk[0].net_cookie = net->net_cookie,
		};
		};


		memcpy(linfo.lnk[0].ibname,
		memcpy(linfo.lnk[0].ibname,