Re: [Cluster-devel] [GIT PULL] GFS2 fix for v5.7-rc7

2020-05-29 Thread pr-tracker-bot
The pull request you sent on Fri, 29 May 2020 17:11:33 +0200:

> git://git.kernel.org/pub/scm/linux/kernel/git/gfs2/linux-gfs2.git 
> tags/gfs2-v5.7-rc7.fixes

has been merged into torvalds/linux.git:
https://git.kernel.org/torvalds/c/835e36b1197a4f066d0254c897f2c8b455cbb581

Thank you!

-- 
Deet-doot-dot, I am a bot.
https://korg.wiki.kernel.org/userdoc/prtracker



Re: [Cluster-devel] remove kernel_setsockopt v4

2020-05-29 Thread David Miller
From: Christoph Hellwig 
Date: Fri, 29 May 2020 14:09:39 +0200

> now that only the dlm calls to sctp are left for kernel_setsockopt,
> while we haven't really made much progress with the sctp setsockopt
> refactoring, how about this small series that splits out a
> sctp_setsockopt_bindx_kernel that takes a kernel space address array
> to share more code as requested by Marcelo.  This should fit in with
> whatever variant of the refator of sctp setsockopt we go with, but
> just solved the immediate problem for now.
 ...

Series applied, thanks.



Re: [Cluster-devel] [PATCH 1/4] sctp: add sctp_sock_set_nodelay

2020-05-29 Thread David Teigland
On Fri, May 29, 2020 at 02:09:40PM +0200, Christoph Hellwig wrote:
> Add a helper to directly set the SCTP_NODELAY sockopt from kernel space
> without going through a fake uaccess.

Ack, they look fine to me, thanks.
Dave



Re: [Cluster-devel] [PATCH 4/4] net: remove kernel_setsockopt

2020-05-29 Thread Marcelo Ricardo Leitner
On Fri, May 29, 2020 at 02:09:43PM +0200, Christoph Hellwig wrote:
> No users left.
> 
> Signed-off-by: Christoph Hellwig 

Reviewed-by: Marcelo Ricardo Leitner 

Thanks.

> ---
>  include/linux/net.h |  2 --
>  net/socket.c| 31 ---
>  2 files changed, 33 deletions(-)
> 
> diff --git a/include/linux/net.h b/include/linux/net.h
> index 74ef5d7315f70..e10f378194a59 100644
> --- a/include/linux/net.h
> +++ b/include/linux/net.h
> @@ -303,8 +303,6 @@ int kernel_connect(struct socket *sock, struct sockaddr 
> *addr, int addrlen,
>  int flags);
>  int kernel_getsockname(struct socket *sock, struct sockaddr *addr);
>  int kernel_getpeername(struct socket *sock, struct sockaddr *addr);
> -int kernel_setsockopt(struct socket *sock, int level, int optname, char 
> *optval,
> -   unsigned int optlen);
>  int kernel_sendpage(struct socket *sock, struct page *page, int offset,
>   size_t size, int flags);
>  int kernel_sendpage_locked(struct sock *sk, struct page *page, int offset,
> diff --git a/net/socket.c b/net/socket.c
> index 81a98b6cbd087..976426d03f099 100644
> --- a/net/socket.c
> +++ b/net/socket.c
> @@ -3624,37 +3624,6 @@ int kernel_getpeername(struct socket *sock, struct 
> sockaddr *addr)
>  }
>  EXPORT_SYMBOL(kernel_getpeername);
>  
> -/**
> - *   kernel_setsockopt - set a socket option (kernel space)
> - *   @sock: socket
> - *   @level: API level (SOL_SOCKET, ...)
> - *   @optname: option tag
> - *   @optval: option value
> - *   @optlen: option length
> - *
> - *   Returns 0 or an error.
> - */
> -
> -int kernel_setsockopt(struct socket *sock, int level, int optname,
> - char *optval, unsigned int optlen)
> -{
> - mm_segment_t oldfs = get_fs();
> - char __user *uoptval;
> - int err;
> -
> - uoptval = (char __user __force *) optval;
> -
> - set_fs(KERNEL_DS);
> - if (level == SOL_SOCKET)
> - err = sock_setsockopt(sock, level, optname, uoptval, optlen);
> - else
> - err = sock->ops->setsockopt(sock, level, optname, uoptval,
> - optlen);
> - set_fs(oldfs);
> - return err;
> -}
> -EXPORT_SYMBOL(kernel_setsockopt);
> -
>  /**
>   *   kernel_sendpage - send a  through a socket (kernel space)
>   *   @sock: socket
> -- 
> 2.26.2
> 



Re: [Cluster-devel] [PATCH 3/4] net: add a new bind_add method

2020-05-29 Thread Marcelo Ricardo Leitner
On Fri, May 29, 2020 at 02:09:42PM +0200, Christoph Hellwig wrote:
> The SCTP protocol allows to bind multiple address to a socket.  That
> feature is currently only exposed as a socket option.  Add a bind_add
> method struct proto that allows to bind additional addresses, and
> switch the dlm code to use the method instead of going through the
> socket option from kernel space.
> 
> Signed-off-by: Christoph Hellwig 

Acked-by: Marcelo Ricardo Leitner 

Even though checkpatch complained about bad alignment here:
> +static int sctp_bind_add(struct sock *sk, struct sockaddr *addrs,
> + int addrlen)



Re: [Cluster-devel] [PATCH 2/4] sctp: refactor sctp_setsockopt_bindx

2020-05-29 Thread Marcelo Ricardo Leitner
On Fri, May 29, 2020 at 02:09:41PM +0200, Christoph Hellwig wrote:
> Split out a sctp_setsockopt_bindx_kernel that takes a kernel pointer
> to the sockaddr and make sctp_setsockopt_bindx a small wrapper around
> it.  This prepares for adding a new bind_add proto op.
> 
> Signed-off-by: Christoph Hellwig 

Acked-by: Marcelo Ricardo Leitner 

> ---
>  net/sctp/socket.c | 61 ++-
>  1 file changed, 28 insertions(+), 33 deletions(-)
> 
> diff --git a/net/sctp/socket.c b/net/sctp/socket.c
> index 827a9903ee288..6e745ac3c4a59 100644
> --- a/net/sctp/socket.c
> +++ b/net/sctp/socket.c
> @@ -972,23 +972,22 @@ int sctp_asconf_mgmt(struct sctp_sock *sp, struct 
> sctp_sockaddr_entry *addrw)
>   * it.
>   *
>   * skThe sk of the socket
> - * addrs The pointer to the addresses in user land
> + * addrs The pointer to the addresses
>   * addrssize Size of the addrs buffer
>   * opOperation to perform (add or remove, see the flags of
>   *   sctp_bindx)
>   *
>   * Returns 0 if ok, <0 errno code on error.
>   */
> -static int sctp_setsockopt_bindx(struct sock *sk,
> -  struct sockaddr __user *addrs,
> -  int addrs_size, int op)
> +static int sctp_setsockopt_bindx_kernel(struct sock *sk,
> + struct sockaddr *addrs, int addrs_size,
> + int op)
>  {
> - struct sockaddr *kaddrs;
>   int err;
>   int addrcnt = 0;
>   int walk_size = 0;
>   struct sockaddr *sa_addr;
> - void *addr_buf;
> + void *addr_buf = addrs;
>   struct sctp_af *af;
>  
>   pr_debug("%s: sk:%p addrs:%p addrs_size:%d opt:%d\n",
> @@ -997,17 +996,10 @@ static int sctp_setsockopt_bindx(struct sock *sk,
>   if (unlikely(addrs_size <= 0))
>   return -EINVAL;
>  
> - kaddrs = memdup_user(addrs, addrs_size);
> - if (IS_ERR(kaddrs))
> - return PTR_ERR(kaddrs);
> -
>   /* Walk through the addrs buffer and count the number of addresses. */
> - addr_buf = kaddrs;
>   while (walk_size < addrs_size) {
> - if (walk_size + sizeof(sa_family_t) > addrs_size) {
> - kfree(kaddrs);
> + if (walk_size + sizeof(sa_family_t) > addrs_size)
>   return -EINVAL;
> - }
>  
>   sa_addr = addr_buf;
>   af = sctp_get_af_specific(sa_addr->sa_family);
> @@ -1015,10 +1007,8 @@ static int sctp_setsockopt_bindx(struct sock *sk,
>   /* If the address family is not supported or if this address
>* causes the address buffer to overflow return EINVAL.
>*/
> - if (!af || (walk_size + af->sockaddr_len) > addrs_size) {
> - kfree(kaddrs);
> + if (!af || (walk_size + af->sockaddr_len) > addrs_size)
>   return -EINVAL;
> - }
>   addrcnt++;
>   addr_buf += af->sockaddr_len;
>   walk_size += af->sockaddr_len;
> @@ -1029,31 +1019,36 @@ static int sctp_setsockopt_bindx(struct sock *sk,
>   case SCTP_BINDX_ADD_ADDR:
>   /* Allow security module to validate bindx addresses. */
>   err = security_sctp_bind_connect(sk, SCTP_SOCKOPT_BINDX_ADD,
> -  (struct sockaddr *)kaddrs,
> -  addrs_size);
> +  addrs, addrs_size);
>   if (err)
> - goto out;
> - err = sctp_bindx_add(sk, kaddrs, addrcnt);
> + return err;
> + err = sctp_bindx_add(sk, addrs, addrcnt);
>   if (err)
> - goto out;
> - err = sctp_send_asconf_add_ip(sk, kaddrs, addrcnt);
> - break;
> -
> + return err;
> + return sctp_send_asconf_add_ip(sk, addrs, addrcnt);
>   case SCTP_BINDX_REM_ADDR:
> - err = sctp_bindx_rem(sk, kaddrs, addrcnt);
> + err = sctp_bindx_rem(sk, addrs, addrcnt);
>   if (err)
> - goto out;
> - err = sctp_send_asconf_del_ip(sk, kaddrs, addrcnt);
> - break;
> + return err;
> + return sctp_send_asconf_del_ip(sk, addrs, addrcnt);
>  
>   default:
> - err = -EINVAL;
> - break;
> + return -EINVAL;
>   }
> +}
>  
> -out:
> - kfree(kaddrs);
> +static int sctp_setsockopt_bindx(struct sock *sk,
> +  struct sockaddr __user *addrs,
> +  int addrs_size, int op)
> +{
> + struct sockaddr *kaddrs;
> + int err;
>  
> + kaddrs = memdup_user(addrs, addrs_size);
> + if (IS_ERR(kaddrs))
> + return PTR_ERR(kaddrs);
> + err = sctp_setsockopt_bindx_kernel(sk, 

Re: [Cluster-devel] [PATCH 1/4] sctp: add sctp_sock_set_nodelay

2020-05-29 Thread Marcelo Ricardo Leitner
On Fri, May 29, 2020 at 02:09:40PM +0200, Christoph Hellwig wrote:
> Add a helper to directly set the SCTP_NODELAY sockopt from kernel space
> without going through a fake uaccess.
> 
> Signed-off-by: Christoph Hellwig 

Acked-by: Marcelo Ricardo Leitner 

I'm taking the action item to make sctp_setsockopt_nodelay() use the
new helper. Will likely create a __ variant of it, due to sock lock.

> ---
>  fs/dlm/lowcomms.c   | 10 ++
>  include/net/sctp/sctp.h |  7 +++
>  2 files changed, 9 insertions(+), 8 deletions(-)
> 
> diff --git a/fs/dlm/lowcomms.c b/fs/dlm/lowcomms.c
> index 69333728d871b..9f1c3cdc9d653 100644
> --- a/fs/dlm/lowcomms.c
> +++ b/fs/dlm/lowcomms.c
> @@ -914,7 +914,6 @@ static int sctp_bind_addrs(struct connection *con, 
> uint16_t port)
>  static void sctp_connect_to_sock(struct connection *con)
>  {
>   struct sockaddr_storage daddr;
> - int one = 1;
>   int result;
>   int addr_len;
>   struct socket *sock;
> @@ -961,8 +960,7 @@ static void sctp_connect_to_sock(struct connection *con)
>   log_print("connecting to %d", con->nodeid);
>  
>   /* Turn off Nagle's algorithm */
> - kernel_setsockopt(sock, SOL_SCTP, SCTP_NODELAY, (char *),
> -   sizeof(one));
> + sctp_sock_set_nodelay(sock->sk);
>  
>   /*
>* Make sock->ops->connect() function return in specified time,
> @@ -1176,7 +1174,6 @@ static int sctp_listen_for_all(void)
>   struct socket *sock = NULL;
>   int result = -EINVAL;
>   struct connection *con = nodeid2con(0, GFP_NOFS);
> - int one = 1;
>  
>   if (!con)
>   return -ENOMEM;
> @@ -1191,10 +1188,7 @@ static int sctp_listen_for_all(void)
>   }
>  
>   sock_set_rcvbuf(sock->sk, NEEDED_RMEM);
> - result = kernel_setsockopt(sock, SOL_SCTP, SCTP_NODELAY, (char *),
> -sizeof(one));
> - if (result < 0)
> - log_print("Could not set SCTP NODELAY error %d\n", result);
> + sctp_sock_set_nodelay(sock->sk);
>  
>   write_lock_bh(>sk->sk_callback_lock);
>   /* Init con struct */
> diff --git a/include/net/sctp/sctp.h b/include/net/sctp/sctp.h
> index 3ab5c6bbb90bd..f8bcb75bb0448 100644
> --- a/include/net/sctp/sctp.h
> +++ b/include/net/sctp/sctp.h
> @@ -615,4 +615,11 @@ static inline bool sctp_newsk_ready(const struct sock 
> *sk)
>   return sock_flag(sk, SOCK_DEAD) || sk->sk_socket;
>  }
>  
> +static inline void sctp_sock_set_nodelay(struct sock *sk)
> +{
> + lock_sock(sk);
> + sctp_sk(sk)->nodelay = true;
> + release_sock(sk);
> +}
> +
>  #endif /* __net_sctp_h__ */
> -- 
> 2.26.2
> 



[Cluster-devel] [GIT PULL] GFS2 fix for v5.7-rc7

2020-05-29 Thread Andreas Gruenbacher
Hi Linus,

I've screwed up commit aa83da7f47b ("gfs2: More gfs2_find_jhead
fixes") which went into v5.7-rc6. Could you please consider pulling
the following fix?

Thanks a lot,
Andreas

The following changes since commit 9cb1fd0efd195590b828b9b865421ad345a4a145:

  Linux 5.7-rc7 (2020-05-24 15:32:54 -0700)

are available in the Git repository at:

  git://git.kernel.org/pub/scm/linux/kernel/git/gfs2/linux-gfs2.git
tags/gfs2-v5.7-rc7.fixes

for you to fetch changes up to 20be493b787cd581c9fffad7fcd6bfbe6af1050c:

  gfs2: Even more gfs2_find_jhead fixes (2020-05-29 17:00:24 +0200)


Fix the previous, flawed gfs2_find_jhead commit


Andreas Gruenbacher (1):
  gfs2: Even more gfs2_find_jhead fixes

 fs/gfs2/lops.c | 15 +--
 1 file changed, 5 insertions(+), 10 deletions(-)



[Cluster-devel] [PATCH 3/4] net: add a new bind_add method

2020-05-29 Thread Christoph Hellwig
The SCTP protocol allows to bind multiple address to a socket.  That
feature is currently only exposed as a socket option.  Add a bind_add
method struct proto that allows to bind additional addresses, and
switch the dlm code to use the method instead of going through the
socket option from kernel space.

Signed-off-by: Christoph Hellwig 
---
 fs/dlm/lowcomms.c  |  9 +++--
 include/net/sock.h |  6 +-
 net/core/sock.c|  8 
 net/sctp/socket.c  | 14 ++
 4 files changed, 30 insertions(+), 7 deletions(-)

diff --git a/fs/dlm/lowcomms.c b/fs/dlm/lowcomms.c
index 9f1c3cdc9d653..3543a8fec9075 100644
--- a/fs/dlm/lowcomms.c
+++ b/fs/dlm/lowcomms.c
@@ -882,6 +882,7 @@ static void writequeue_entry_complete(struct 
writequeue_entry *e, int completed)
 static int sctp_bind_addrs(struct connection *con, uint16_t port)
 {
struct sockaddr_storage localaddr;
+   struct sockaddr *addr = (struct sockaddr *)
int i, addr_len, result = 0;
 
for (i = 0; i < dlm_local_count; i++) {
@@ -889,13 +890,9 @@ static int sctp_bind_addrs(struct connection *con, 
uint16_t port)
make_sockaddr(, port, _len);
 
if (!i)
-   result = kernel_bind(con->sock,
-(struct sockaddr *),
-addr_len);
+   result = kernel_bind(con->sock, addr, addr_len);
else
-   result = kernel_setsockopt(con->sock, SOL_SCTP,
-  SCTP_SOCKOPT_BINDX_ADD,
-  (char *), 
addr_len);
+   result = sock_bind_add(con->sock->sk, addr, addr_len);
 
if (result < 0) {
log_print("Can't bind to %d addr number %d, %d.\n",
diff --git a/include/net/sock.h b/include/net/sock.h
index d994daa418ec2..6e9f713a78607 100644
--- a/include/net/sock.h
+++ b/include/net/sock.h
@@ -1156,7 +1156,9 @@ struct proto {
int (*sendpage)(struct sock *sk, struct page *page,
int offset, size_t size, int flags);
int (*bind)(struct sock *sk,
-   struct sockaddr *uaddr, int addr_len);
+   struct sockaddr *addr, int addr_len);
+   int (*bind_add)(struct sock *sk,
+   struct sockaddr *addr, int addr_len);
 
int (*backlog_rcv) (struct sock *sk,
struct sk_buff *skb);
@@ -2698,4 +2700,6 @@ void sock_set_reuseaddr(struct sock *sk);
 void sock_set_reuseport(struct sock *sk);
 void sock_set_sndtimeo(struct sock *sk, s64 secs);
 
+int sock_bind_add(struct sock *sk, struct sockaddr *addr, int addr_len);
+
 #endif /* _SOCK_H */
diff --git a/net/core/sock.c b/net/core/sock.c
index 2ca3425b519c0..61ec573221a60 100644
--- a/net/core/sock.c
+++ b/net/core/sock.c
@@ -3712,3 +3712,11 @@ bool sk_busy_loop_end(void *p, unsigned long start_time)
 }
 EXPORT_SYMBOL(sk_busy_loop_end);
 #endif /* CONFIG_NET_RX_BUSY_POLL */
+
+int sock_bind_add(struct sock *sk, struct sockaddr *addr, int addr_len)
+{
+   if (!sk->sk_prot->bind_add)
+   return -EOPNOTSUPP;
+   return sk->sk_prot->bind_add(sk, addr, addr_len);
+}
+EXPORT_SYMBOL(sock_bind_add);
diff --git a/net/sctp/socket.c b/net/sctp/socket.c
index 6e745ac3c4a59..d57e1a002ffc8 100644
--- a/net/sctp/socket.c
+++ b/net/sctp/socket.c
@@ -1052,6 +1052,18 @@ static int sctp_setsockopt_bindx(struct sock *sk,
return err;
 }
 
+static int sctp_bind_add(struct sock *sk, struct sockaddr *addrs,
+   int addrlen)
+{
+   int err;
+
+   lock_sock(sk);
+   err = sctp_setsockopt_bindx_kernel(sk, addrs, addrlen,
+  SCTP_BINDX_ADD_ADDR);
+   release_sock(sk);
+   return err;
+}
+
 static int sctp_connect_new_asoc(struct sctp_endpoint *ep,
 const union sctp_addr *daddr,
 const struct sctp_initmsg *init,
@@ -9620,6 +9632,7 @@ struct proto sctp_prot = {
.sendmsg =  sctp_sendmsg,
.recvmsg =  sctp_recvmsg,
.bind=  sctp_bind,
+   .bind_add=  sctp_bind_add,
.backlog_rcv =  sctp_backlog_rcv,
.hash=  sctp_hash,
.unhash  =  sctp_unhash,
@@ -9662,6 +9675,7 @@ struct proto sctpv6_prot = {
.sendmsg= sctp_sendmsg,
.recvmsg= sctp_recvmsg,
.bind   = sctp_bind,
+   .bind_add   = sctp_bind_add,
.backlog_rcv= sctp_backlog_rcv,
.hash   = sctp_hash,
.unhash = sctp_unhash,
-- 
2.26.2



[Cluster-devel] [PATCH 4/4] net: remove kernel_setsockopt

2020-05-29 Thread Christoph Hellwig
No users left.

Signed-off-by: Christoph Hellwig 
---
 include/linux/net.h |  2 --
 net/socket.c| 31 ---
 2 files changed, 33 deletions(-)

diff --git a/include/linux/net.h b/include/linux/net.h
index 74ef5d7315f70..e10f378194a59 100644
--- a/include/linux/net.h
+++ b/include/linux/net.h
@@ -303,8 +303,6 @@ int kernel_connect(struct socket *sock, struct sockaddr 
*addr, int addrlen,
   int flags);
 int kernel_getsockname(struct socket *sock, struct sockaddr *addr);
 int kernel_getpeername(struct socket *sock, struct sockaddr *addr);
-int kernel_setsockopt(struct socket *sock, int level, int optname, char 
*optval,
- unsigned int optlen);
 int kernel_sendpage(struct socket *sock, struct page *page, int offset,
size_t size, int flags);
 int kernel_sendpage_locked(struct sock *sk, struct page *page, int offset,
diff --git a/net/socket.c b/net/socket.c
index 81a98b6cbd087..976426d03f099 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -3624,37 +3624,6 @@ int kernel_getpeername(struct socket *sock, struct 
sockaddr *addr)
 }
 EXPORT_SYMBOL(kernel_getpeername);
 
-/**
- * kernel_setsockopt - set a socket option (kernel space)
- * @sock: socket
- * @level: API level (SOL_SOCKET, ...)
- * @optname: option tag
- * @optval: option value
- * @optlen: option length
- *
- * Returns 0 or an error.
- */
-
-int kernel_setsockopt(struct socket *sock, int level, int optname,
-   char *optval, unsigned int optlen)
-{
-   mm_segment_t oldfs = get_fs();
-   char __user *uoptval;
-   int err;
-
-   uoptval = (char __user __force *) optval;
-
-   set_fs(KERNEL_DS);
-   if (level == SOL_SOCKET)
-   err = sock_setsockopt(sock, level, optname, uoptval, optlen);
-   else
-   err = sock->ops->setsockopt(sock, level, optname, uoptval,
-   optlen);
-   set_fs(oldfs);
-   return err;
-}
-EXPORT_SYMBOL(kernel_setsockopt);
-
 /**
  * kernel_sendpage - send a  through a socket (kernel space)
  * @sock: socket
-- 
2.26.2



[Cluster-devel] [PATCH 2/4] sctp: refactor sctp_setsockopt_bindx

2020-05-29 Thread Christoph Hellwig
Split out a sctp_setsockopt_bindx_kernel that takes a kernel pointer
to the sockaddr and make sctp_setsockopt_bindx a small wrapper around
it.  This prepares for adding a new bind_add proto op.

Signed-off-by: Christoph Hellwig 
---
 net/sctp/socket.c | 61 ++-
 1 file changed, 28 insertions(+), 33 deletions(-)

diff --git a/net/sctp/socket.c b/net/sctp/socket.c
index 827a9903ee288..6e745ac3c4a59 100644
--- a/net/sctp/socket.c
+++ b/net/sctp/socket.c
@@ -972,23 +972,22 @@ int sctp_asconf_mgmt(struct sctp_sock *sp, struct 
sctp_sockaddr_entry *addrw)
  * it.
  *
  * skThe sk of the socket
- * addrs The pointer to the addresses in user land
+ * addrs The pointer to the addresses
  * addrssize Size of the addrs buffer
  * opOperation to perform (add or remove, see the flags of
  *   sctp_bindx)
  *
  * Returns 0 if ok, <0 errno code on error.
  */
-static int sctp_setsockopt_bindx(struct sock *sk,
-struct sockaddr __user *addrs,
-int addrs_size, int op)
+static int sctp_setsockopt_bindx_kernel(struct sock *sk,
+   struct sockaddr *addrs, int addrs_size,
+   int op)
 {
-   struct sockaddr *kaddrs;
int err;
int addrcnt = 0;
int walk_size = 0;
struct sockaddr *sa_addr;
-   void *addr_buf;
+   void *addr_buf = addrs;
struct sctp_af *af;
 
pr_debug("%s: sk:%p addrs:%p addrs_size:%d opt:%d\n",
@@ -997,17 +996,10 @@ static int sctp_setsockopt_bindx(struct sock *sk,
if (unlikely(addrs_size <= 0))
return -EINVAL;
 
-   kaddrs = memdup_user(addrs, addrs_size);
-   if (IS_ERR(kaddrs))
-   return PTR_ERR(kaddrs);
-
/* Walk through the addrs buffer and count the number of addresses. */
-   addr_buf = kaddrs;
while (walk_size < addrs_size) {
-   if (walk_size + sizeof(sa_family_t) > addrs_size) {
-   kfree(kaddrs);
+   if (walk_size + sizeof(sa_family_t) > addrs_size)
return -EINVAL;
-   }
 
sa_addr = addr_buf;
af = sctp_get_af_specific(sa_addr->sa_family);
@@ -1015,10 +1007,8 @@ static int sctp_setsockopt_bindx(struct sock *sk,
/* If the address family is not supported or if this address
 * causes the address buffer to overflow return EINVAL.
 */
-   if (!af || (walk_size + af->sockaddr_len) > addrs_size) {
-   kfree(kaddrs);
+   if (!af || (walk_size + af->sockaddr_len) > addrs_size)
return -EINVAL;
-   }
addrcnt++;
addr_buf += af->sockaddr_len;
walk_size += af->sockaddr_len;
@@ -1029,31 +1019,36 @@ static int sctp_setsockopt_bindx(struct sock *sk,
case SCTP_BINDX_ADD_ADDR:
/* Allow security module to validate bindx addresses. */
err = security_sctp_bind_connect(sk, SCTP_SOCKOPT_BINDX_ADD,
-(struct sockaddr *)kaddrs,
-addrs_size);
+addrs, addrs_size);
if (err)
-   goto out;
-   err = sctp_bindx_add(sk, kaddrs, addrcnt);
+   return err;
+   err = sctp_bindx_add(sk, addrs, addrcnt);
if (err)
-   goto out;
-   err = sctp_send_asconf_add_ip(sk, kaddrs, addrcnt);
-   break;
-
+   return err;
+   return sctp_send_asconf_add_ip(sk, addrs, addrcnt);
case SCTP_BINDX_REM_ADDR:
-   err = sctp_bindx_rem(sk, kaddrs, addrcnt);
+   err = sctp_bindx_rem(sk, addrs, addrcnt);
if (err)
-   goto out;
-   err = sctp_send_asconf_del_ip(sk, kaddrs, addrcnt);
-   break;
+   return err;
+   return sctp_send_asconf_del_ip(sk, addrs, addrcnt);
 
default:
-   err = -EINVAL;
-   break;
+   return -EINVAL;
}
+}
 
-out:
-   kfree(kaddrs);
+static int sctp_setsockopt_bindx(struct sock *sk,
+struct sockaddr __user *addrs,
+int addrs_size, int op)
+{
+   struct sockaddr *kaddrs;
+   int err;
 
+   kaddrs = memdup_user(addrs, addrs_size);
+   if (IS_ERR(kaddrs))
+   return PTR_ERR(kaddrs);
+   err = sctp_setsockopt_bindx_kernel(sk, kaddrs, addrs_size, op);
+   kfree(kaddrs);
return err;
 }
 
-- 
2.26.2



[Cluster-devel] [PATCH 1/4] sctp: add sctp_sock_set_nodelay

2020-05-29 Thread Christoph Hellwig
Add a helper to directly set the SCTP_NODELAY sockopt from kernel space
without going through a fake uaccess.

Signed-off-by: Christoph Hellwig 
---
 fs/dlm/lowcomms.c   | 10 ++
 include/net/sctp/sctp.h |  7 +++
 2 files changed, 9 insertions(+), 8 deletions(-)

diff --git a/fs/dlm/lowcomms.c b/fs/dlm/lowcomms.c
index 69333728d871b..9f1c3cdc9d653 100644
--- a/fs/dlm/lowcomms.c
+++ b/fs/dlm/lowcomms.c
@@ -914,7 +914,6 @@ static int sctp_bind_addrs(struct connection *con, uint16_t 
port)
 static void sctp_connect_to_sock(struct connection *con)
 {
struct sockaddr_storage daddr;
-   int one = 1;
int result;
int addr_len;
struct socket *sock;
@@ -961,8 +960,7 @@ static void sctp_connect_to_sock(struct connection *con)
log_print("connecting to %d", con->nodeid);
 
/* Turn off Nagle's algorithm */
-   kernel_setsockopt(sock, SOL_SCTP, SCTP_NODELAY, (char *),
- sizeof(one));
+   sctp_sock_set_nodelay(sock->sk);
 
/*
 * Make sock->ops->connect() function return in specified time,
@@ -1176,7 +1174,6 @@ static int sctp_listen_for_all(void)
struct socket *sock = NULL;
int result = -EINVAL;
struct connection *con = nodeid2con(0, GFP_NOFS);
-   int one = 1;
 
if (!con)
return -ENOMEM;
@@ -1191,10 +1188,7 @@ static int sctp_listen_for_all(void)
}
 
sock_set_rcvbuf(sock->sk, NEEDED_RMEM);
-   result = kernel_setsockopt(sock, SOL_SCTP, SCTP_NODELAY, (char *),
-  sizeof(one));
-   if (result < 0)
-   log_print("Could not set SCTP NODELAY error %d\n", result);
+   sctp_sock_set_nodelay(sock->sk);
 
write_lock_bh(>sk->sk_callback_lock);
/* Init con struct */
diff --git a/include/net/sctp/sctp.h b/include/net/sctp/sctp.h
index 3ab5c6bbb90bd..f8bcb75bb0448 100644
--- a/include/net/sctp/sctp.h
+++ b/include/net/sctp/sctp.h
@@ -615,4 +615,11 @@ static inline bool sctp_newsk_ready(const struct sock *sk)
return sock_flag(sk, SOCK_DEAD) || sk->sk_socket;
 }
 
+static inline void sctp_sock_set_nodelay(struct sock *sk)
+{
+   lock_sock(sk);
+   sctp_sk(sk)->nodelay = true;
+   release_sock(sk);
+}
+
 #endif /* __net_sctp_h__ */
-- 
2.26.2



Re: [Cluster-devel] [PATCH 4/4] net: remove kernel_setsockopt

2020-05-29 Thread 'Christoph Hellwig'
On Fri, May 29, 2020 at 12:27:12PM +, David Laight wrote:
> From: Christoph Hellwig
> > Sent: 29 May 2020 13:10
> > 
> > No users left.
> 
> There is no point even proposing this until all the changes to remove
> its use have made it at least as far into 'net-next' and probably 'net'.

If you look at net-next, the only two users left are the two removed in
this series.



Re: [Cluster-devel] [PATCH 4/4] net: remove kernel_setsockopt

2020-05-29 Thread David Laight
From: Christoph Hellwig
> Sent: 29 May 2020 13:10
> 
> No users left.

There is no point even proposing this until all the changes to remove
its use have made it at least as far into 'net-next' and probably 'net'.

David

-
Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, 
UK
Registration No: 1397386 (Wales)