
From: Ursula Braun <ubraun@linux.ibm.com> mainline inclusion from mainline-v5.4-rc6 commit f536dffc0b79738c3104af999318279dccbaa261 category: bugfix bugzilla: https://gitee.com/src-openeuler/kernel/issues/IC4DSN Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?i... -------------------------------- For SMC sockets forced to fallback to TCP, the file is propagated from the outer SMC to the internal TCP socket. When closing the SMC socket, the internal TCP socket file pointer must be restored to the original NULL value, otherwise memory leaks may show up (found with CONFIG_DEBUG_KMEMLEAK). The internal TCP socket is released in smc_clcsock_release(), which calls __sock_release() function in net/socket.c. This calls the needed iput(SOCK_INODE(sock)) only, if the file pointer has been reset to the original NULL-value. Fixes: 07603b230895 ("net/smc: propagate file from SMC to TCP socket") Signed-off-by: Ursula Braun <ubraun@linux.ibm.com> Signed-off-by: Karsten Graul <kgraul@linux.ibm.com> Signed-off-by: David S. Miller <davem@davemloft.net> Conflicts: net/smc/af_smc.c [conflicts due to not merge 39f41f367b08 ("net/smc: common release code for non-accepted sockets")] Signed-off-by: Wang Liang <wangliang74@huawei.com> --- net/smc/af_smc.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/net/smc/af_smc.c b/net/smc/af_smc.c index 13b9f4cfb45a..e10ec8564fe0 100644 --- a/net/smc/af_smc.c +++ b/net/smc/af_smc.c @@ -115,6 +115,12 @@ struct proto smc_proto6 = { }; EXPORT_SYMBOL_GPL(smc_proto6); +static void smc_restore_fallback_changes(struct smc_sock *smc) +{ + smc->clcsock->file->private_data = smc->sk.sk_socket; + smc->clcsock->file = NULL; +} + static int smc_release(struct socket *sock) { struct sock *sk = sock->sk; @@ -162,6 +168,7 @@ static int smc_release(struct socket *sock) sock_put(sk); /* passive closing */ sk->sk_state = SMC_CLOSED; sk->sk_state_change(sk); + smc_restore_fallback_changes(smc); } /* detach socket */ -- 2.34.1