{"id":2229703,"url":"http://patchwork.ozlabs.org/api/1.1/patches/2229703/?format=json","web_url":"http://patchwork.ozlabs.org/project/linux-cifs-client/patch/20260428155759.226368-3-henrique.carvalho@suse.com/","project":{"id":12,"url":"http://patchwork.ozlabs.org/api/1.1/projects/12/?format=json","name":"Linux CIFS Client","link_name":"linux-cifs-client","list_id":"linux-cifs.vger.kernel.org","list_email":"linux-cifs@vger.kernel.org","web_url":"","scm_url":"","webscm_url":""},"msgid":"<20260428155759.226368-3-henrique.carvalho@suse.com>","date":"2026-04-28T15:57:56","name":"[v2,07/11] smb: server: reuse common transport helpers in TCP transport","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"4dd7856054938366fca7574f631b77bc104ab98a","submitter":{"id":89563,"url":"http://patchwork.ozlabs.org/api/1.1/people/89563/?format=json","name":"Henrique Carvalho","email":"henrique.carvalho@suse.com"},"delegate":null,"mbox":"http://patchwork.ozlabs.org/project/linux-cifs-client/patch/20260428155759.226368-3-henrique.carvalho@suse.com/mbox/","series":[{"id":501886,"url":"http://patchwork.ozlabs.org/api/1.1/series/501886/?format=json","web_url":"http://patchwork.ozlabs.org/project/linux-cifs-client/list/?series=501886","date":"2026-04-28T15:55:41","name":"smb: implement SMB over QUIC","version":2,"mbox":"http://patchwork.ozlabs.org/series/501886/mbox/"}],"comments":"http://patchwork.ozlabs.org/api/patches/2229703/comments/","check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/2229703/checks/","tags":{},"headers":{"Return-Path":"\n <linux-cifs+bounces-11233-incoming=patchwork.ozlabs.org@vger.kernel.org>","X-Original-To":["incoming@patchwork.ozlabs.org","linux-cifs@vger.kernel.org"],"Delivered-To":"patchwork-incoming@legolas.ozlabs.org","Authentication-Results":["legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=suse.com header.i=@suse.com header.a=rsa-sha256\n header.s=google header.b=dUsZV+LE;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org\n (client-ip=172.234.253.10; helo=sea.lore.kernel.org;\n envelope-from=linux-cifs+bounces-11233-incoming=patchwork.ozlabs.org@vger.kernel.org;\n receiver=patchwork.ozlabs.org)","smtp.subspace.kernel.org;\n\tdkim=pass (2048-bit key) header.d=suse.com header.i=@suse.com\n header.b=\"dUsZV+LE\"","smtp.subspace.kernel.org;\n arc=none smtp.client-ip=209.85.128.44","smtp.subspace.kernel.org;\n dmarc=pass (p=quarantine dis=none) header.from=suse.com","smtp.subspace.kernel.org;\n spf=pass smtp.mailfrom=suse.com"],"Received":["from sea.lore.kernel.org (sea.lore.kernel.org [172.234.253.10])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519 server-signature ECDSA (secp384r1) server-digest SHA384)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4g4lqt1ZYYz1yHv\n\tfor <incoming@patchwork.ozlabs.org>; Wed, 29 Apr 2026 02:14:18 +1000 (AEST)","from smtp.subspace.kernel.org (conduit.subspace.kernel.org\n [100.90.174.1])\n\tby sea.lore.kernel.org (Postfix) with ESMTP id 254CE3117BCA\n\tfor <incoming@patchwork.ozlabs.org>; Tue, 28 Apr 2026 16:01:54 +0000 (UTC)","from localhost.localdomain (localhost.localdomain [127.0.0.1])\n\tby smtp.subspace.kernel.org (Postfix) with ESMTP id 4B9B8406276;\n\tTue, 28 Apr 2026 15:58:15 +0000 (UTC)","from mail-wm1-f44.google.com (mail-wm1-f44.google.com\n [209.85.128.44])\n\t(using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits))\n\t(No client certificate requested)\n\tby smtp.subspace.kernel.org (Postfix) with ESMTPS id 4F17544BCB1\n\tfor <linux-cifs@vger.kernel.org>; Tue, 28 Apr 2026 15:58:13 +0000 (UTC)","by mail-wm1-f44.google.com with SMTP id\n 5b1f17b1804b1-4838c15e3cbso107664425e9.3\n        for <linux-cifs@vger.kernel.org>;\n Tue, 28 Apr 2026 08:58:13 -0700 (PDT)","from precision ([2a01:4b00:c007:bb00:be9d:a3c4:18b1:4a25])\n        by smtp.gmail.com with ESMTPSA id\n 5b1f17b1804b1-48a7b560a84sm3409255e9.4.2026.04.28.08.58.10\n        (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n        Tue, 28 Apr 2026 08:58:10 -0700 (PDT)"],"ARC-Seal":"i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116;\n\tt=1777391895; cv=none;\n b=HwcfxW//2HkH9uRsH66w+b/vJQZEoOePQEzJbtZ8gl6tHbfDShJtYmgs8pjqyJPsdZ06RORWB70MqcgvaJIOIPPMS9kWW3FZZBojZV77VvkZKMpqtpsKkdLCIdsXW1yV9dc9jDvAMygSEaKROUsyT/aEq3f1Pw6BSP6ELcrCAtA=","ARC-Message-Signature":"i=1; a=rsa-sha256; d=subspace.kernel.org;\n\ts=arc-20240116; t=1777391895; c=relaxed/simple;\n\tbh=7Xc8Ab+80baGi5ee41MeMddy361+Xx0bS8BLEz1DutE=;\n\th=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References:\n\t MIME-Version;\n b=KE1n7eQtp0SX4VTR3p7qGNgvQR8HYvI2lTi2KqmQHBBoqirFl9G4rq3x+zZ5oYLO75qmt2G1S2KQK6ng6v3bUykoV9BvnW6gN987XF08cy886MjEdQcS05ss7j3pG8xfWYqqk/lyOuF/63i3Hu/YQx3ZNU3v/YpsvN+lxW9+TLE=","ARC-Authentication-Results":"i=1; smtp.subspace.kernel.org;\n dmarc=pass (p=quarantine dis=none) header.from=suse.com;\n spf=pass smtp.mailfrom=suse.com;\n dkim=pass (2048-bit key) header.d=suse.com header.i=@suse.com\n header.b=dUsZV+LE; arc=none smtp.client-ip=209.85.128.44","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n        d=suse.com; s=google; t=1777391891; x=1777996691;\n darn=vger.kernel.org;\n        h=content-transfer-encoding:mime-version:references:in-reply-to\n         :message-id:date:subject:cc:to:from:from:to:cc:subject:date\n         :message-id:reply-to;\n        bh=QuByOnTmHBNyAlDIgKmsfjc9HoNP34BF7+9rPQpnoCI=;\n        b=dUsZV+LEkmeuMds6onPNXFaXwnUVszuh03IW2yR9pVZMUG10sdeQ4ry+Cenw34a/Zs\n         CxinjayNlP22j8g/bheiDfXFNQexFmWYa5bGHlKoHzgmnt6iGOPiENJrfHv4DD4qn5OB\n         RSsT4UY/GuMWsLIOeO4tfttyR1jVovBCvLfKrVrRdFTBo1TR/tfiCBDIa2YR7hCHlOUI\n         D20Hc7rW4m27aRTj2JWtJjTdfijn4K/ZeMq7/FL9JRA1kZ9weGwkGAGmQJ2Q7vU9d+ds\n         vsoEK26+7/XSClIHG0Yq+hTMiSnacIoYQ4P/xTLPlMK1YpcpexrDyyouYYg5z9OAaQLT\n         hRmw==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n        d=1e100.net; s=20251104; t=1777391891; x=1777996691;\n        h=content-transfer-encoding:mime-version:references:in-reply-to\n         :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from\n         :to:cc:subject:date:message-id:reply-to;\n        bh=QuByOnTmHBNyAlDIgKmsfjc9HoNP34BF7+9rPQpnoCI=;\n        b=rrNeL490Bt7XYFBsRIrPqt+7V1jWgwXxt9BPvYKFU5Xb/mjl4fpqX5pBQVaNGN2YGB\n         zBJuu4KKZZ/eLezTc8CaY2oRVgCFiU5PqImTlgZmSgPcqxKNRckijT28NgrGHE/Walk0\n         sLh9Eh4Srr/ilGxGowRdizpgedrlgiiebq5HOwpthMhokvkfxMK4RHnRxVDyoVwofvcs\n         DtK3ekMWXR1cke/VS3RMVzWpCAG8O0FyWZ3fsqQORSCNoaaY6/6gp1EVufSni1EM4W1t\n         cnC3kjQM5l9K+e/FmnUqxLODA7B5ridMDAmKSg2MQCi5jpEvGmzdKt0TkohY0NG0/Vnk\n         /R7g==","X-Gm-Message-State":"AOJu0YyLlcndybqIszkAqAJyLnRs7iptKRF5aYvKQaEqKsUjgpPky8K1\n\t7317UYG/3WpMw+h1wDwkpVOzh3NQZb5pYG2Y327hxd5UpWf48vHsoS2uvlYx/4PV/NBbDZSzVwL\n\tmKm9F0FaNPw==","X-Gm-Gg":"AeBDieuzVYgcniI21KtXHnjTljappSQFs1SIr2mW2TF+t49Bjs394lom6hcFP5ADIcy\n\tNpEsWzQ63PDwWdagazg/0vmamv4ftx275UPtTbphOg5QoVfyi3Q6Mje+Z6B+aexXpt3cJKw8Azi\n\tv8CtOlFFAAQ4/THyXdWDfx6MBlhDhrZSXUBOJ5M+AflFk7YdGR1zO4MoS+kKTAcTt+GBw55agpr\n\tb/68pcJHcfUr24p8f6i9fmdtf4ki2EBdudzKeNdw9mQgvSZEK4fRgwNmDEgAV21BpccEymLrTam\n\tHi74TXp9kcULAOIqx5PMqufy09jfSEMoIv98MJLvEWbtA2cxbYwhfpPVcy1R4trS5zHOWLQRLFj\n\t5fS4Q+6O2HnWbuNdFZAfZ++UFM4nEig3d7h2urBBYX5fbz2jAAgdts/ma1UIWWl8M/qrPhORPc2\n\toTAPFcQ9zDt3o63NFk5W7lOFz6r1yPdA1E+W7cZX1LO7EF","X-Received":"by 2002:a05:600c:3541:b0:489:a4:e578 with SMTP id\n 5b1f17b1804b1-48a77b19c77mr59557575e9.14.1777391891330;\n        Tue, 28 Apr 2026 08:58:11 -0700 (PDT)","From":"Henrique Carvalho <henrique.carvalho@suse.com>","To":"linux-cifs@vger.kernel.org","Cc":"linkinjeon@kernel.org,\n\tsfrench@samba.org,\n\tmetze@samba.org,\n\tsenozhatsky@chromium.org,\n\ttom@talpey.com,\n\tematsumiya@suse.de,\n\tHenrique Carvalho <henrique.carvalho@suse.com>","Subject":"[PATCH v2 07/11] smb: server: reuse common transport helpers in TCP\n transport","Date":"Tue, 28 Apr 2026 12:57:56 -0300","Message-ID":"<20260428155759.226368-3-henrique.carvalho@suse.com>","X-Mailer":"git-send-email 2.53.0","In-Reply-To":"<20260428155759.226368-1-henrique.carvalho@suse.com>","References":"<20260428155759.226368-1-henrique.carvalho@suse.com>","Precedence":"bulk","X-Mailing-List":"linux-cifs@vger.kernel.org","List-Id":"<linux-cifs.vger.kernel.org>","List-Subscribe":"<mailto:linux-cifs+subscribe@vger.kernel.org>","List-Unsubscribe":"<mailto:linux-cifs+unsubscribe@vger.kernel.org>","MIME-Version":"1.0","Content-Transfer-Encoding":"8bit"},"content":"The new transport core already provides shared helpers for listener\ncreation, accepted-connection setup, receive-side iovec handling, and\nconnection-limit checks. Keep the TCP transport focused on TCP-specific\nsocket options and send/disconnect behavior by switching it over to the\ncommon helpers.\n\nSigned-off-by: Henrique Carvalho <henrique.carvalho@suse.com>\n---\n fs/smb/server/transport_tcp.c | 312 +++-------------------------------\n 1 file changed, 19 insertions(+), 293 deletions(-)","diff":"diff --git a/fs/smb/server/transport_tcp.c b/fs/smb/server/transport_tcp.c\nindex 07123ebcf8fd..1496f0336af6 100644\n--- a/fs/smb/server/transport_tcp.c\n+++ b/fs/smb/server/transport_tcp.c\n@@ -17,8 +17,6 @@\n struct tcp_transport {\n \tstruct ksmbd_transport\t\ttransport;\n \tstruct socket\t\t\t*sock;\n-\tstruct kvec\t\t\t*iov;\n-\tunsigned int\t\t\tnr_iov;\n };\n \n static const struct ksmbd_transport_ops ksmbd_tcp_transport_ops;\n@@ -39,50 +37,11 @@ static inline void ksmbd_tcp_reuseaddr(struct socket *sock)\n \tsock_set_reuseaddr(sock->sk);\n }\n \n-static struct tcp_transport *alloc_transport(struct socket *client_sk)\n-{\n-\tstruct tcp_transport *t;\n-\tstruct ksmbd_conn *conn;\n-\n-\tt = kzalloc_obj(*t, KSMBD_DEFAULT_GFP);\n-\tif (!t)\n-\t\treturn NULL;\n-\tt->sock = client_sk;\n-\n-\tconn = ksmbd_conn_alloc();\n-\tif (!conn) {\n-\t\tkfree(t);\n-\t\treturn NULL;\n-\t}\n-\n-#if IS_ENABLED(CONFIG_IPV6)\n-\tif (client_sk->sk->sk_family == AF_INET6) {\n-\t\tmemcpy(&conn->inet6_addr, &client_sk->sk->sk_v6_daddr, 16);\n-\t\tconn->inet_hash = ipv6_addr_hash(&client_sk->sk->sk_v6_daddr);\n-\t} else {\n-\t\tconn->inet_addr = inet_sk(client_sk->sk)->inet_daddr;\n-\t\tconn->inet_hash = ipv4_addr_hash(inet_sk(client_sk->sk)->inet_daddr);\n-\t}\n-#else\n-\tconn->inet_addr = inet_sk(client_sk->sk)->inet_daddr;\n-\tconn->inet_hash = ipv4_addr_hash(inet_sk(client_sk->sk)->inet_daddr);\n-#endif\n-\tdown_write(&conn_list_lock);\n-\thash_add(conn_list, &conn->hlist, conn->inet_hash);\n-\tup_write(&conn_list_lock);\n-\n-\tconn->transport = KSMBD_TRANS(t);\n-\tKSMBD_TRANS(t)->conn = conn;\n-\tKSMBD_TRANS(t)->ops = &ksmbd_tcp_transport_ops;\n-\treturn t;\n-}\n-\n static void ksmbd_tcp_free_transport(struct ksmbd_transport *kt)\n {\n \tstruct tcp_transport *t = TCP_TRANS(kt);\n \n \tsock_release(t->sock);\n-\tkfree(t->iov);\n \tkfree(t);\n }\n \n@@ -92,62 +51,6 @@ static void free_transport(struct tcp_transport *t)\n \tksmbd_conn_free(KSMBD_TRANS(t)->conn);\n }\n \n-/**\n- * kvec_array_init() - initialize a IO vector segment\n- * @new:\tIO vector to be initialized\n- * @iov:\tbase IO vector\n- * @nr_segs:\tnumber of segments in base iov\n- * @bytes:\ttotal iovec length so far for read\n- *\n- * Return:\tNumber of IO segments\n- */\n-static unsigned int kvec_array_init(struct kvec *new, struct kvec *iov,\n-\t\t\t\t    unsigned int nr_segs, size_t bytes)\n-{\n-\tsize_t base = 0;\n-\n-\twhile (bytes || !iov->iov_len) {\n-\t\tint copy = min(bytes, iov->iov_len);\n-\n-\t\tbytes -= copy;\n-\t\tbase += copy;\n-\t\tif (iov->iov_len == base) {\n-\t\t\tiov++;\n-\t\t\tnr_segs--;\n-\t\t\tbase = 0;\n-\t\t}\n-\t}\n-\n-\tmemcpy(new, iov, sizeof(*iov) * nr_segs);\n-\tnew->iov_base += base;\n-\tnew->iov_len -= base;\n-\treturn nr_segs;\n-}\n-\n-/**\n- * get_conn_iovec() - get connection iovec for reading from socket\n- * @t:\t\tTCP transport instance\n- * @nr_segs:\tnumber of segments in iov\n- *\n- * Return:\treturn existing or newly allocate iovec\n- */\n-static struct kvec *get_conn_iovec(struct tcp_transport *t, unsigned int nr_segs)\n-{\n-\tstruct kvec *new_iov;\n-\n-\tif (t->iov && nr_segs <= t->nr_iov)\n-\t\treturn t->iov;\n-\n-\t/* not big enough -- allocate a new one and release the old */\n-\tnew_iov = kmalloc_objs(*new_iov, nr_segs, KSMBD_DEFAULT_GFP);\n-\tif (new_iov) {\n-\t\tkfree(t->iov);\n-\t\tt->iov = new_iov;\n-\t\tt->nr_iov = nr_segs;\n-\t}\n-\treturn new_iov;\n-}\n-\n /**\n  * ksmbd_tcp_new_connection() - create a new tcp session on mount\n  * @client_sk:\tsocket associated with new connection\n@@ -161,33 +64,19 @@ static int ksmbd_tcp_new_connection(struct socket *client_sk)\n {\n \tint rc = 0;\n \tstruct tcp_transport *t;\n-\tstruct task_struct *handler;\n \n-\tt = alloc_transport(client_sk);\n+\tt = kzalloc_obj(*t, KSMBD_DEFAULT_GFP);\n \tif (!t) {\n \t\tsock_release(client_sk);\n \t\treturn -ENOMEM;\n \t}\n+\tt->sock = client_sk;\n+\tKSMBD_TRANS(t)->ops = &ksmbd_tcp_transport_ops;\n \n-#if IS_ENABLED(CONFIG_IPV6)\n-\tif (client_sk->sk->sk_family == AF_INET6)\n-\t\thandler = kthread_run(ksmbd_conn_handler_loop,\n-\t\t\t\tKSMBD_TRANS(t)->conn, \"ksmbd:%pI6c\",\n-\t\t\t\t&KSMBD_TRANS(t)->conn->inet6_addr);\n-\telse\n-\t\thandler = kthread_run(ksmbd_conn_handler_loop,\n-\t\t\t\tKSMBD_TRANS(t)->conn, \"ksmbd:%pI4\",\n-\t\t\t\t&KSMBD_TRANS(t)->conn->inet_addr);\n-#else\n-\thandler = kthread_run(ksmbd_conn_handler_loop,\n-\t\t\tKSMBD_TRANS(t)->conn, \"ksmbd:%pI4\",\n-\t\t\t&KSMBD_TRANS(t)->conn->inet_addr);\n-#endif\n-\tif (IS_ERR(handler)) {\n-\t\tpr_err(\"cannot start conn thread\\n\");\n-\t\trc = PTR_ERR(handler);\n+\trc = ksmbd_transport_alloc_conn(KSMBD_TRANS(t), client_sk);\n+\tif (rc)\n \t\tksmbd_tcp_disconnect(KSMBD_TRANS(t));\n-\t}\n+\n \treturn rc;\n }\n \n@@ -201,9 +90,7 @@ static int tcp_kthread_fn(void *p)\n {\n \tstruct socket *client_sk = NULL;\n \tstruct interface *iface = (struct interface *)p;\n-\tstruct ksmbd_conn *conn;\n-\tint ret, inet_hash;\n-\tunsigned int max_ip_conns;\n+\tint ret;\n \n \twhile (!kthread_should_stop()) {\n \t\tif (!iface->ksmbd_tcp_socket)\n@@ -214,57 +101,14 @@ static int tcp_kthread_fn(void *p)\n \t\tif (ret)\n \t\t\tcontinue;\n \n-\t\tif (!server_conf.max_ip_connections)\n-\t\t\tgoto skip_max_ip_conns_limit;\n-\n-\t\t/*\n-\t\t * Limits repeated connections from clients with the same IP.\n-\t\t */\n-#if IS_ENABLED(CONFIG_IPV6)\n-\t\tif (client_sk->sk->sk_family == AF_INET6)\n-\t\t\tinet_hash = ipv6_addr_hash(&client_sk->sk->sk_v6_daddr);\n-\t\telse\n-\t\t\tinet_hash = ipv4_addr_hash(inet_sk(client_sk->sk)->inet_daddr);\n-#else\n-\t\tinet_hash = ipv4_addr_hash(inet_sk(client_sk->sk)->inet_daddr);\n-#endif\n-\n-\t\tmax_ip_conns = 0;\n-\t\tdown_read(&conn_list_lock);\n-\t\thash_for_each_possible(conn_list, conn, hlist, inet_hash) {\n-#if IS_ENABLED(CONFIG_IPV6)\n-\t\t\tif (client_sk->sk->sk_family == AF_INET6) {\n-\t\t\t\tif (memcmp(&client_sk->sk->sk_v6_daddr,\n-\t\t\t\t\t   &conn->inet6_addr, 16) == 0)\n-\t\t\t\t\tmax_ip_conns++;\n-\t\t\t} else if (inet_sk(client_sk->sk)->inet_daddr ==\n-\t\t\t\t conn->inet_addr)\n-\t\t\t\tmax_ip_conns++;\n-#else\n-\t\t\tif (inet_sk(client_sk->sk)->inet_daddr ==\n-\t\t\t    conn->inet_addr)\n-\t\t\t\tmax_ip_conns++;\n-#endif\n-\t\t\tif (server_conf.max_ip_connections <= max_ip_conns) {\n-\t\t\t\tpr_info_ratelimited(\"Maximum IP connections exceeded (%u/%u)\\n\",\n-\t\t\t\t\t\t    max_ip_conns, server_conf.max_ip_connections);\n-\t\t\t\tret = -EAGAIN;\n-\t\t\t\tbreak;\n-\t\t\t}\n-\t\t}\n-\t\tup_read(&conn_list_lock);\n+\t\tret = ksmbd_check_max_ip_conns(client_sk);\n \t\tif (ret == -EAGAIN) {\n-\t\t\t/* Per-IP limit hit: release the just-accepted socket. */\n \t\t\tsock_release(client_sk);\n \t\t\tcontinue;\n \t\t}\n \n-skip_max_ip_conns_limit:\n-\t\tif (server_conf.max_connections &&\n-\t\t    atomic_inc_return(&active_num_conn) >= server_conf.max_connections) {\n-\t\t\tpr_info_ratelimited(\"Limit the maximum number of connections(%u)\\n\",\n-\t\t\t\t\t    atomic_read(&active_num_conn));\n-\t\t\tatomic_dec(&active_num_conn);\n+\t\tret = ksmbd_check_max_conns();\n+\t\tif (ret == -EAGAIN) {\n \t\t\tsock_release(client_sk);\n \t\t\tcontinue;\n \t\t}\n@@ -280,76 +124,6 @@ static int tcp_kthread_fn(void *p)\n \treturn 0;\n }\n \n-/**\n- * ksmbd_tcp_readv() - read data from socket in given iovec\n- * @t:\t\t\tTCP transport instance\n- * @iov_orig:\t\tbase IO vector\n- * @nr_segs:\t\tnumber of segments in base iov\n- * @to_read:\t\tnumber of bytes to read from socket\n- * @max_retries:\tmaximum retry count\n- *\n- * Return:\ton success return number of bytes read from socket,\n- *\t\totherwise return error number\n- */\n-static int ksmbd_tcp_readv(struct tcp_transport *t, struct kvec *iov_orig,\n-\t\t\t   unsigned int nr_segs, unsigned int to_read,\n-\t\t\t   int max_retries)\n-{\n-\tint length = 0;\n-\tint total_read;\n-\tunsigned int segs;\n-\tstruct msghdr ksmbd_msg;\n-\tstruct kvec *iov;\n-\tstruct ksmbd_conn *conn = KSMBD_TRANS(t)->conn;\n-\n-\tiov = get_conn_iovec(t, nr_segs);\n-\tif (!iov)\n-\t\treturn -ENOMEM;\n-\n-\tksmbd_msg.msg_control = NULL;\n-\tksmbd_msg.msg_controllen = 0;\n-\n-\tfor (total_read = 0; to_read; total_read += length, to_read -= length) {\n-\t\ttry_to_freeze();\n-\n-\t\tif (!ksmbd_conn_alive(conn)) {\n-\t\t\ttotal_read = -ESHUTDOWN;\n-\t\t\tbreak;\n-\t\t}\n-\t\tsegs = kvec_array_init(iov, iov_orig, nr_segs, total_read);\n-\n-\t\tlength = kernel_recvmsg(t->sock, &ksmbd_msg,\n-\t\t\t\t\tiov, segs, to_read, 0);\n-\n-\t\tif (length == -EINTR) {\n-\t\t\ttotal_read = -ESHUTDOWN;\n-\t\t\tbreak;\n-\t\t} else if (ksmbd_conn_need_reconnect(conn)) {\n-\t\t\ttotal_read = -EAGAIN;\n-\t\t\tbreak;\n-\t\t} else if (length == -ERESTARTSYS || length == -EAGAIN) {\n-\t\t\t/*\n-\t\t\t * If max_retries is negative, Allow unlimited\n-\t\t\t * retries to keep connection with inactive sessions.\n-\t\t\t */\n-\t\t\tif (max_retries == 0) {\n-\t\t\t\ttotal_read = length;\n-\t\t\t\tbreak;\n-\t\t\t} else if (max_retries > 0) {\n-\t\t\t\tmax_retries--;\n-\t\t\t}\n-\n-\t\t\tusleep_range(1000, 2000);\n-\t\t\tlength = 0;\n-\t\t\tcontinue;\n-\t\t} else if (length <= 0) {\n-\t\t\ttotal_read = length;\n-\t\t\tbreak;\n-\t\t}\n-\t}\n-\treturn total_read;\n-}\n-\n /**\n  * ksmbd_tcp_read() - read data from socket in given buffer\n  * @t:\t\tTCP transport instance\n@@ -368,7 +142,8 @@ static int ksmbd_tcp_read(struct ksmbd_transport *t, char *buf,\n \tiov.iov_base = buf;\n \tiov.iov_len = to_read;\n \n-\treturn ksmbd_tcp_readv(TCP_TRANS(t), &iov, 1, to_read, max_retries);\n+\treturn ksmbd_readv(t, TCP_TRANS(t)->sock, &iov, 1, to_read,\n+\t\t\t   max_retries);\n }\n \n static int ksmbd_tcp_writev(struct ksmbd_transport *t, struct kvec *iov,\n@@ -409,69 +184,20 @@ void ksmbd_tcp_destroy_socket(struct socket *ksmbd_socket)\n  */\n int ksmbd_tcp_create_socket(struct interface *iface)\n {\n-\tint ret;\n-\tstruct sockaddr_in6 sin6;\n-\tstruct sockaddr_in sin;\n \tstruct socket *ksmbd_socket;\n \tstruct task_struct *kthread;\n-\tbool ipv4 = false;\n-\n-\tret = sock_create_kern(iface->net, PF_INET6, SOCK_STREAM,\n-\t\t\t       IPPROTO_TCP, &ksmbd_socket);\n-\tif (ret) {\n-\t\tif (ret != -EAFNOSUPPORT)\n-\t\t\tpr_err(\"Can't create socket for ipv6, fallback to ipv4: %d\\n\", ret);\n-\t\tret = sock_create_kern(iface->net, PF_INET, SOCK_STREAM,\n-\t\t\t\t       IPPROTO_TCP, &ksmbd_socket);\n-\t\tif (ret) {\n-\t\t\tpr_err(\"Can't create socket for ipv4: %d\\n\", ret);\n-\t\t\tgoto out_clear;\n-\t\t}\n+\tint ret;\n \n-\t\tsin.sin_family = PF_INET;\n-\t\tsin.sin_addr.s_addr = htonl(INADDR_ANY);\n-\t\tsin.sin_port = htons(server_conf.tcp_port);\n-\t\tipv4 = true;\n-\t} else {\n-\t\tsin6.sin6_family = PF_INET6;\n-\t\tsin6.sin6_addr = in6addr_any;\n-\t\tsin6.sin6_port = htons(server_conf.tcp_port);\n-\n-\t\tlock_sock(ksmbd_socket->sk);\n-\t\tksmbd_socket->sk->sk_ipv6only = false;\n-\t\trelease_sock(ksmbd_socket->sk);\n+\tksmbd_socket = ksmbd_create_socket(iface, SOCK_STREAM, IPPROTO_TCP,\n+\t\t\t\t\t   server_conf.tcp_port);\n+\tif (IS_ERR(ksmbd_socket)) {\n+\t\tret = PTR_ERR(ksmbd_socket);\n+\t\tgoto out_clear;\n \t}\n \n \tksmbd_tcp_nodelay(ksmbd_socket);\n \tksmbd_tcp_reuseaddr(ksmbd_socket);\n \n-\tret = sock_setsockopt(ksmbd_socket,\n-\t\t\t      SOL_SOCKET,\n-\t\t\t      SO_BINDTODEVICE,\n-\t\t\t      KERNEL_SOCKPTR(iface->name),\n-\t\t\t      strlen(iface->name));\n-\tif (ret != -ENODEV && ret < 0) {\n-\t\tpr_err(\"Failed to set SO_BINDTODEVICE: %d\\n\", ret);\n-\t\tgoto out_error;\n-\t}\n-\n-\tif (ipv4)\n-\t\tret = kernel_bind(ksmbd_socket, (struct sockaddr_unsized *)&sin,\n-\t\t\t\t  sizeof(sin));\n-\telse\n-\t\tret = kernel_bind(ksmbd_socket, (struct sockaddr_unsized *)&sin6,\n-\t\t\t\t  sizeof(sin6));\n-\tif (ret) {\n-\t\tpr_err(\"Failed to bind socket: %d\\n\", ret);\n-\t\tgoto out_error;\n-\t}\n-\n-\tret = kernel_listen(ksmbd_socket, KSMBD_SOCKET_BACKLOG);\n-\tif (ret) {\n-\t\tpr_err(\"Port listen() error: %d\\n\", ret);\n-\t\tgoto out_error;\n-\t}\n-\n \tiface->ksmbd_tcp_socket = ksmbd_socket;\n \n \tkthread = ksmbd_interface_run_kthread(iface, tcp_kthread_fn, \"tcp\");\n@@ -487,7 +213,7 @@ int ksmbd_tcp_create_socket(struct interface *iface)\n \treturn 0;\n \n out_error:\n-\tksmbd_tcp_destroy_socket(ksmbd_socket);\n+\tksmbd_destroy_socket(ksmbd_socket);\n out_clear:\n \tiface->ksmbd_tcp_socket = NULL;\n \tiface->ksmbd_tcp_kthread = NULL;\n","prefixes":["v2","07/11"]}