| From foo@baz Sat 16 May 2020 02:04:40 PM CEST |
| From: Paolo Abeni <pabeni@redhat.com> |
| Date: Thu, 7 May 2020 18:53:24 +0200 |
| Subject: mptcp: set correct vfs info for subflows |
| |
| From: Paolo Abeni <pabeni@redhat.com> |
| |
| [ Upstream commit 7d14b0d2b9b317cfc14161143e2006b95a5da9b1 ] |
| |
| When a subflow is created via mptcp_subflow_create_socket(), |
| a new 'struct socket' is allocated, with a new i_ino value. |
| |
| When inspecting TCP sockets via the procfs and or the diag |
| interface, the above ones are not related to the process owning |
| the MPTCP master socket, even if they are a logical part of it |
| ('ss -p' shows an empty process field) |
| |
| Additionally, subflows created by the path manager get |
| the uid/gid from the running workqueue. |
| |
| Subflows are part of the owning MPTCP master socket, let's |
| adjust the vfs info to reflect this. |
| |
| After this patch, 'ss' correctly displays subflows as belonging |
| to the msk socket creator. |
| |
| Fixes: 2303f994b3e1 ("mptcp: Associate MPTCP context with TCP socket") |
| Signed-off-by: Paolo Abeni <pabeni@redhat.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| net/mptcp/subflow.c | 10 ++++++++++ |
| 1 file changed, 10 insertions(+) |
| |
| --- a/net/mptcp/subflow.c |
| +++ b/net/mptcp/subflow.c |
| @@ -633,6 +633,16 @@ int mptcp_subflow_create_socket(struct s |
| if (err) |
| return err; |
| |
| + /* the newly created socket really belongs to the owning MPTCP master |
| + * socket, even if for additional subflows the allocation is performed |
| + * by a kernel workqueue. Adjust inode references, so that the |
| + * procfs/diag interaces really show this one belonging to the correct |
| + * user. |
| + */ |
| + SOCK_INODE(sf)->i_ino = SOCK_INODE(sk->sk_socket)->i_ino; |
| + SOCK_INODE(sf)->i_uid = SOCK_INODE(sk->sk_socket)->i_uid; |
| + SOCK_INODE(sf)->i_gid = SOCK_INODE(sk->sk_socket)->i_gid; |
| + |
| subflow = mptcp_subflow_ctx(sf->sk); |
| pr_debug("subflow=%p", subflow); |
| |