netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH RESEND 1/2] in-kernel sockets API
@ 2006-08-07 23:00 Sridhar Samudrala
  2006-08-07 23:20 ` Stephen Hemminger
  2006-08-08  3:58 ` David Miller
  0 siblings, 2 replies; 6+ messages in thread
From: Sridhar Samudrala @ 2006-08-07 23:00 UTC (permalink / raw)
  To: davem; +Cc: netdev

Dave,

Could you consider this for inclusion into 2.6.19 tree?

Thanks
Sridhar

This patch implements wrapper functions that provide a convenient way to
access the sockets API for in-kernel users like sunrpc, cifs & ocfs2 etc
and any future users.

Signed-off-by: Sridhar Samudrala <sri@us.ibm.com>
Acked-by: James Morris <jmorris@namei.org>

---

 include/linux/net.h |   19 +++++++++
 net/socket.c        |  113 +++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 132 insertions(+), 0 deletions(-)

diff --git a/include/linux/net.h b/include/linux/net.h
index b20c53c..19da2c0 100644
--- a/include/linux/net.h
+++ b/include/linux/net.h
@@ -208,6 +208,25 @@ extern int   	     kernel_recvmsg(struct
 				    struct kvec *vec, size_t num,
 				    size_t len, int flags);
 
+extern int kernel_bind(struct socket *sock, struct sockaddr *addr,
+		       int addrlen);
+extern int kernel_listen(struct socket *sock, int backlog);
+extern int kernel_accept(struct socket *sock, struct socket **newsock,
+			 int flags);
+extern int kernel_connect(struct socket *sock, struct sockaddr *addr,
+			  int addrlen, int flags);
+extern int kernel_getsockname(struct socket *sock, struct sockaddr *addr,
+			      int *addrlen);
+extern int kernel_getpeername(struct socket *sock, struct sockaddr *addr,
+			      int *addrlen);
+extern int kernel_getsockopt(struct socket *sock, int level, int optname,
+			     char *optval, int *optlen);
+extern int kernel_setsockopt(struct socket *sock, int level, int optname,
+			     char *optval, int optlen);
+extern int kernel_sendpage(struct socket *sock, struct page *page, int offset,
+			   size_t size, int flags);
+extern int kernel_sock_ioctl(struct socket *sock, int cmd, unsigned long arg);
+
 #ifndef CONFIG_SMP
 #define SOCKOPS_WRAPPED(name) name
 #define SOCKOPS_WRAP(name, fam)
diff --git a/net/socket.c b/net/socket.c
index b4848ce..0c9d01d 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -2160,6 +2160,109 @@ static long compat_sock_ioctl(struct fil
 }
 #endif
 
+int kernel_bind(struct socket *sock, struct sockaddr *addr, int addrlen)
+{
+	return sock->ops->bind(sock, addr, addrlen);
+}
+
+int kernel_listen(struct socket *sock, int backlog)
+{
+	return sock->ops->listen(sock, backlog);
+}
+
+int kernel_accept(struct socket *sock, struct socket **newsock, int flags)
+{
+	struct sock *sk = sock->sk;
+	int err;
+
+	err = sock_create_lite(sk->sk_family, sk->sk_type, sk->sk_protocol,
+			       newsock);
+	if (err < 0)
+		goto done;
+
+	err = sock->ops->accept(sock, *newsock, flags);
+	if (err < 0) {
+		sock_release(*newsock);
+		goto done;
+	}
+
+	(*newsock)->ops = sock->ops;
+
+done:
+	return err;
+}
+
+int kernel_connect(struct socket *sock, struct sockaddr *addr, int addrlen,
+                   int flags)
+{
+	return sock->ops->connect(sock, addr, addrlen, flags);
+}
+
+int kernel_getsockname(struct socket *sock, struct sockaddr *addr,
+			 int *addrlen)
+{
+	return sock->ops->getname(sock, addr, addrlen, 0);
+}
+
+int kernel_getpeername(struct socket *sock, struct sockaddr *addr,
+			 int *addrlen)
+{
+	return sock->ops->getname(sock, addr, addrlen, 1);
+}
+
+int kernel_getsockopt(struct socket *sock, int level, int optname,
+			char *optval, int *optlen)
+{
+	mm_segment_t oldfs = get_fs();
+	int err;
+
+	set_fs(KERNEL_DS);
+	if (level == SOL_SOCKET)
+		err = sock_getsockopt(sock, level, optname, optval, optlen);
+	else
+		err = sock->ops->getsockopt(sock, level, optname, optval,
+					    optlen);
+	set_fs(oldfs);
+	return err;
+}
+
+int kernel_setsockopt(struct socket *sock, int level, int optname,
+			char *optval, int optlen)
+{
+	mm_segment_t oldfs = get_fs();
+	int err;
+
+	set_fs(KERNEL_DS);
+	if (level == SOL_SOCKET)
+		err = sock_setsockopt(sock, level, optname, optval, optlen);
+	else
+		err = sock->ops->setsockopt(sock, level, optname, optval,
+					    optlen);
+	set_fs(oldfs);
+	return err;
+}
+
+int kernel_sendpage(struct socket *sock, struct page *page, int offset,
+		    size_t size, int flags)
+{
+	if (sock->ops->sendpage)
+		return sock->ops->sendpage(sock, page, offset, size, flags);
+
+	return sock_no_sendpage(sock, page, offset, size, flags);
+}
+
+int kernel_sock_ioctl(struct socket *sock, int cmd, unsigned long arg)
+{
+	mm_segment_t oldfs = get_fs();
+	int err;
+
+	set_fs(KERNEL_DS);
+	err = sock->ops->ioctl(sock, cmd, arg);
+	set_fs(oldfs);
+
+	return err;
+}
+
 /* ABI emulation layers need these two */
 EXPORT_SYMBOL(move_addr_to_kernel);
 EXPORT_SYMBOL(move_addr_to_user);
@@ -2176,3 +2279,13 @@ EXPORT_SYMBOL(sock_wake_async);
 EXPORT_SYMBOL(sockfd_lookup);
 EXPORT_SYMBOL(kernel_sendmsg);
 EXPORT_SYMBOL(kernel_recvmsg);
+EXPORT_SYMBOL(kernel_bind);
+EXPORT_SYMBOL(kernel_listen);
+EXPORT_SYMBOL(kernel_accept);
+EXPORT_SYMBOL(kernel_connect);
+EXPORT_SYMBOL(kernel_getsockname);
+EXPORT_SYMBOL(kernel_getpeername);
+EXPORT_SYMBOL(kernel_getsockopt);
+EXPORT_SYMBOL(kernel_setsockopt);
+EXPORT_SYMBOL(kernel_sendpage);
+EXPORT_SYMBOL(kernel_sock_ioctl);



^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH RESEND 1/2] in-kernel sockets API
  2006-08-07 23:00 [PATCH RESEND 1/2] in-kernel sockets API Sridhar Samudrala
@ 2006-08-07 23:20 ` Stephen Hemminger
  2006-08-08  0:46   ` Sridhar Samudrala
  2006-08-08  0:56   ` Al Viro
  2006-08-08  3:58 ` David Miller
  1 sibling, 2 replies; 6+ messages in thread
From: Stephen Hemminger @ 2006-08-07 23:20 UTC (permalink / raw)
  To: Sridhar Samudrala; +Cc: davem, netdev

On Mon, 07 Aug 2006 16:00:29 -0700
Sridhar Samudrala <sri@us.ibm.com> wrote:

> Dave,
> 
> Could you consider this for inclusion into 2.6.19 tree?
> 
> Thanks
> Sridhar
> 
> This patch implements wrapper functions that provide a convenient way to
> access the sockets API for in-kernel users like sunrpc, cifs & ocfs2 etc
> and any future users.
> 
> Signed-off-by: Sridhar Samudrala <sri@us.ibm.com>
> Acked-by: James Morris <jmorris@namei.org>
> 
> ---
> 
>  include/linux/net.h |   19 +++++++++
>  net/socket.c        |  113 +++++++++++++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 132 insertions(+), 0 deletions(-)
> 
> diff --git a/include/linux/net.h b/include/linux/net.h
> index b20c53c..19da2c0 100644
> --- a/include/linux/net.h
> +++ b/include/linux/net.h
> @@ -208,6 +208,25 @@ extern int   	     kernel_recvmsg(struct
>  				    struct kvec *vec, size_t num,
>  				    size_t len, int flags);
>  
> +extern int kernel_bind(struct socket *sock, struct sockaddr *addr,
> +		       int addrlen);
> +extern int kernel_listen(struct socket *sock, int backlog);
> +extern int kernel_accept(struct socket *sock, struct socket **newsock,
> +			 int flags);
> +extern int kernel_connect(struct socket *sock, struct sockaddr *addr,
> +			  int addrlen, int flags);
> +extern int kernel_getsockname(struct socket *sock, struct sockaddr *addr,
> +			      int *addrlen);
> +extern int kernel_getpeername(struct socket *sock, struct sockaddr *addr,
> +			      int *addrlen);
> +extern int kernel_getsockopt(struct socket *sock, int level, int optname,
> +			     char *optval, int *optlen);
> +extern int kernel_setsockopt(struct socket *sock, int level, int optname,
> +			     char *optval, int optlen);
> +extern int kernel_sendpage(struct socket *sock, struct page *page, int offset,
> +			   size_t size, int flags);
> +extern int kernel_sock_ioctl(struct socket *sock, int cmd, unsigned long arg);
> +
>  #ifndef CONFIG_SMP
>  #define SOCKOPS_WRAPPED(name) name
>  #define SOCKOPS_WRAP(name, fam)
> diff --git a/net/socket.c b/net/socket.c
> index b4848ce..0c9d01d 100644
> --- a/net/socket.c
> +++ b/net/socket.c
> @@ -2160,6 +2160,109 @@ static long compat_sock_ioctl(struct fil
>  }
>  #endif
>  
> +int kernel_bind(struct socket *sock, struct sockaddr *addr, int addrlen)
> +{
> +	return sock->ops->bind(sock, addr, addrlen);
> +}
> +
> +int kernel_listen(struct socket *sock, int backlog)
> +{
> +	return sock->ops->listen(sock, backlog);
> +}
> +
> +int kernel_accept(struct socket *sock, struct socket **newsock, int flags)
> +{
> +	struct sock *sk = sock->sk;
> +	int err;
> +
> +	err = sock_create_lite(sk->sk_family, sk->sk_type, sk->sk_protocol,
> +			       newsock);
> +	if (err < 0)
> +		goto done;
> +
> +	err = sock->ops->accept(sock, *newsock, flags);
> +	if (err < 0) {
> +		sock_release(*newsock);
> +		goto done;
> +	}
> +
> +	(*newsock)->ops = sock->ops;
> +
> +done:
> +	return err;
> +}
> +
> +int kernel_connect(struct socket *sock, struct sockaddr *addr, int addrlen,
> +                   int flags)
> +{
> +	return sock->ops->connect(sock, addr, addrlen, flags);
> +}
> +
> +int kernel_getsockname(struct socket *sock, struct sockaddr *addr,
> +			 int *addrlen)
> +{
> +	return sock->ops->getname(sock, addr, addrlen, 0);
> +}
> +
> +int kernel_getpeername(struct socket *sock, struct sockaddr *addr,
> +			 int *addrlen)
> +{
> +	return sock->ops->getname(sock, addr, addrlen, 1);
> +}
> +
> +int kernel_getsockopt(struct socket *sock, int level, int optname,
> +			char *optval, int *optlen)
> +{
> +	mm_segment_t oldfs = get_fs();
> +	int err;
> +
> +	set_fs(KERNEL_DS);
> +	if (level == SOL_SOCKET)
> +		err = sock_getsockopt(sock, level, optname, optval, optlen);
> +	else
> +		err = sock->ops->getsockopt(sock, level, optname, optval,
> +					    optlen);
> +	set_fs(oldfs);
> +	return err;
> +}
> +
> +int kernel_setsockopt(struct socket *sock, int level, int optname,
> +			char *optval, int optlen)
> +{
> +	mm_segment_t oldfs = get_fs();
> +	int err;
> +
> +	set_fs(KERNEL_DS);
> +	if (level == SOL_SOCKET)
> +		err = sock_setsockopt(sock, level, optname, optval, optlen);
> +	else
> +		err = sock->ops->setsockopt(sock, level, optname, optval,
> +					    optlen);
> +	set_fs(oldfs);
> +	return err;
> +}
> +
> +int kernel_sendpage(struct socket *sock, struct page *page, int offset,
> +		    size_t size, int flags)
> +{
> +	if (sock->ops->sendpage)
> +		return sock->ops->sendpage(sock, page, offset, size, flags);
> +
> +	return sock_no_sendpage(sock, page, offset, size, flags);
> +}
> +
> +int kernel_sock_ioctl(struct socket *sock, int cmd, unsigned long arg)
> +{
> +	mm_segment_t oldfs = get_fs();
> +	int err;
> +
> +	set_fs(KERNEL_DS);
> +	err = sock->ops->ioctl(sock, cmd, arg);
> +	set_fs(oldfs);
> +
> +	return err;
> +}
> +
>  /* ABI emulation layers need these two */
>  EXPORT_SYMBOL(move_addr_to_kernel);
>  EXPORT_SYMBOL(move_addr_to_user);
> @@ -2176,3 +2279,13 @@ EXPORT_SYMBOL(sock_wake_async);
>  EXPORT_SYMBOL(sockfd_lookup);
>  EXPORT_SYMBOL(kernel_sendmsg);
>  EXPORT_SYMBOL(kernel_recvmsg);
> +EXPORT_SYMBOL(kernel_bind);
> +EXPORT_SYMBOL(kernel_listen);
> +EXPORT_SYMBOL(kernel_accept);
> +EXPORT_SYMBOL(kernel_connect);
> +EXPORT_SYMBOL(kernel_getsockname);
> +EXPORT_SYMBOL(kernel_getpeername);
> +EXPORT_SYMBOL(kernel_getsockopt);
> +EXPORT_SYMBOL(kernel_setsockopt);
> +EXPORT_SYMBOL(kernel_sendpage);
> +EXPORT_SYMBOL(kernel_sock_ioctl);

Please consider EXPORT_SYMBOL_GPL because this interface would be a obvious
target for binary modules writers to use.

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH RESEND 1/2] in-kernel sockets API
  2006-08-07 23:20 ` Stephen Hemminger
@ 2006-08-08  0:46   ` Sridhar Samudrala
  2006-08-08  0:56   ` Al Viro
  1 sibling, 0 replies; 6+ messages in thread
From: Sridhar Samudrala @ 2006-08-08  0:46 UTC (permalink / raw)
  To: Stephen Hemminger; +Cc: davem, netdev

On Mon, 2006-08-07 at 16:20 -0700, Stephen Hemminger wrote:
> On Mon, 07 Aug 2006 16:00:29 -0700
> Sridhar Samudrala <sri@us.ibm.com> wrote:
> 
> > Dave,
> > 
> > Could you consider this for inclusion into 2.6.19 tree?
> > 
> > Thanks
> > Sridhar
> > 
> > This patch implements wrapper functions that provide a convenient way to
> > access the sockets API for in-kernel users like sunrpc, cifs & ocfs2 etc
> > and any future users.
> > 
> > Signed-off-by: Sridhar Samudrala <sri@us.ibm.com>
> > Acked-by: James Morris <jmorris@namei.org>
> > 
> > ---
> > 
> >  include/linux/net.h |   19 +++++++++
> >  net/socket.c        |  113 +++++++++++++++++++++++++++++++++++++++++++++++++++
> >  2 files changed, 132 insertions(+), 0 deletions(-)
> > 
> > diff --git a/include/linux/net.h b/include/linux/net.h
> > index b20c53c..19da2c0 100644
> > --- a/include/linux/net.h
> > +++ b/include/linux/net.h
> > @@ -208,6 +208,25 @@ extern int   	     kernel_recvmsg(struct
> >  				    struct kvec *vec, size_t num,
> >  				    size_t len, int flags);
> >  
> > +extern int kernel_bind(struct socket *sock, struct sockaddr *addr,
> > +		       int addrlen);
> > +extern int kernel_listen(struct socket *sock, int backlog);
> > +extern int kernel_accept(struct socket *sock, struct socket **newsock,
> > +			 int flags);
> > +extern int kernel_connect(struct socket *sock, struct sockaddr *addr,
> > +			  int addrlen, int flags);
> > +extern int kernel_getsockname(struct socket *sock, struct sockaddr *addr,
> > +			      int *addrlen);
> > +extern int kernel_getpeername(struct socket *sock, struct sockaddr *addr,
> > +			      int *addrlen);
> > +extern int kernel_getsockopt(struct socket *sock, int level, int optname,
> > +			     char *optval, int *optlen);
> > +extern int kernel_setsockopt(struct socket *sock, int level, int optname,
> > +			     char *optval, int optlen);
> > +extern int kernel_sendpage(struct socket *sock, struct page *page, int offset,
> > +			   size_t size, int flags);
> > +extern int kernel_sock_ioctl(struct socket *sock, int cmd, unsigned long arg);
> > +
> >  #ifndef CONFIG_SMP
> >  #define SOCKOPS_WRAPPED(name) name
> >  #define SOCKOPS_WRAP(name, fam)
> > diff --git a/net/socket.c b/net/socket.c
> > index b4848ce..0c9d01d 100644
> > --- a/net/socket.c
> > +++ b/net/socket.c
> > @@ -2160,6 +2160,109 @@ static long compat_sock_ioctl(struct fil
> >  }
> >  #endif
> >  
> > +int kernel_bind(struct socket *sock, struct sockaddr *addr, int addrlen)
> > +{
> > +	return sock->ops->bind(sock, addr, addrlen);
> > +}
> > +
> > +int kernel_listen(struct socket *sock, int backlog)
> > +{
> > +	return sock->ops->listen(sock, backlog);
> > +}
> > +
> > +int kernel_accept(struct socket *sock, struct socket **newsock, int flags)
> > +{
> > +	struct sock *sk = sock->sk;
> > +	int err;
> > +
> > +	err = sock_create_lite(sk->sk_family, sk->sk_type, sk->sk_protocol,
> > +			       newsock);
> > +	if (err < 0)
> > +		goto done;
> > +
> > +	err = sock->ops->accept(sock, *newsock, flags);
> > +	if (err < 0) {
> > +		sock_release(*newsock);
> > +		goto done;
> > +	}
> > +
> > +	(*newsock)->ops = sock->ops;
> > +
> > +done:
> > +	return err;
> > +}
> > +
> > +int kernel_connect(struct socket *sock, struct sockaddr *addr, int addrlen,
> > +                   int flags)
> > +{
> > +	return sock->ops->connect(sock, addr, addrlen, flags);
> > +}
> > +
> > +int kernel_getsockname(struct socket *sock, struct sockaddr *addr,
> > +			 int *addrlen)
> > +{
> > +	return sock->ops->getname(sock, addr, addrlen, 0);
> > +}
> > +
> > +int kernel_getpeername(struct socket *sock, struct sockaddr *addr,
> > +			 int *addrlen)
> > +{
> > +	return sock->ops->getname(sock, addr, addrlen, 1);
> > +}
> > +
> > +int kernel_getsockopt(struct socket *sock, int level, int optname,
> > +			char *optval, int *optlen)
> > +{
> > +	mm_segment_t oldfs = get_fs();
> > +	int err;
> > +
> > +	set_fs(KERNEL_DS);
> > +	if (level == SOL_SOCKET)
> > +		err = sock_getsockopt(sock, level, optname, optval, optlen);
> > +	else
> > +		err = sock->ops->getsockopt(sock, level, optname, optval,
> > +					    optlen);
> > +	set_fs(oldfs);
> > +	return err;
> > +}
> > +
> > +int kernel_setsockopt(struct socket *sock, int level, int optname,
> > +			char *optval, int optlen)
> > +{
> > +	mm_segment_t oldfs = get_fs();
> > +	int err;
> > +
> > +	set_fs(KERNEL_DS);
> > +	if (level == SOL_SOCKET)
> > +		err = sock_setsockopt(sock, level, optname, optval, optlen);
> > +	else
> > +		err = sock->ops->setsockopt(sock, level, optname, optval,
> > +					    optlen);
> > +	set_fs(oldfs);
> > +	return err;
> > +}
> > +
> > +int kernel_sendpage(struct socket *sock, struct page *page, int offset,
> > +		    size_t size, int flags)
> > +{
> > +	if (sock->ops->sendpage)
> > +		return sock->ops->sendpage(sock, page, offset, size, flags);
> > +
> > +	return sock_no_sendpage(sock, page, offset, size, flags);
> > +}
> > +
> > +int kernel_sock_ioctl(struct socket *sock, int cmd, unsigned long arg)
> > +{
> > +	mm_segment_t oldfs = get_fs();
> > +	int err;
> > +
> > +	set_fs(KERNEL_DS);
> > +	err = sock->ops->ioctl(sock, cmd, arg);
> > +	set_fs(oldfs);
> > +
> > +	return err;
> > +}
> > +
> >  /* ABI emulation layers need these two */
> >  EXPORT_SYMBOL(move_addr_to_kernel);
> >  EXPORT_SYMBOL(move_addr_to_user);
> > @@ -2176,3 +2279,13 @@ EXPORT_SYMBOL(sock_wake_async);
> >  EXPORT_SYMBOL(sockfd_lookup);
> >  EXPORT_SYMBOL(kernel_sendmsg);
> >  EXPORT_SYMBOL(kernel_recvmsg);
> > +EXPORT_SYMBOL(kernel_bind);
> > +EXPORT_SYMBOL(kernel_listen);
> > +EXPORT_SYMBOL(kernel_accept);
> > +EXPORT_SYMBOL(kernel_connect);
> > +EXPORT_SYMBOL(kernel_getsockname);
> > +EXPORT_SYMBOL(kernel_getpeername);
> > +EXPORT_SYMBOL(kernel_getsockopt);
> > +EXPORT_SYMBOL(kernel_setsockopt);
> > +EXPORT_SYMBOL(kernel_sendpage);
> > +EXPORT_SYMBOL(kernel_sock_ioctl);
> 
> Please consider EXPORT_SYMBOL_GPL because this interface would be a obvious
> target for binary modules writers to use.

I used EXPORT_SYMBOL() just to be consistent with the existing kernel_sendmsg()
and kernel_recvmsg(). I am OK with changing them to EXPORT_SYMBOL_GPL().

Dave, I will send an updated version if you are OK with it.

Thanks
Sridhar


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH RESEND 1/2] in-kernel sockets API
  2006-08-07 23:20 ` Stephen Hemminger
  2006-08-08  0:46   ` Sridhar Samudrala
@ 2006-08-08  0:56   ` Al Viro
  2006-08-08  1:50     ` David Miller
  1 sibling, 1 reply; 6+ messages in thread
From: Al Viro @ 2006-08-08  0:56 UTC (permalink / raw)
  To: Stephen Hemminger; +Cc: Sridhar Samudrala, davem, netdev

On Mon, Aug 07, 2006 at 04:20:33PM -0700, Stephen Hemminger wrote:
> Please consider EXPORT_SYMBOL_GPL because this interface would be a obvious
> target for binary modules writers to use.

As opposed to duplicating it?  WTFPoint of restriction that is trivial to
bypass?  Look at those functions; there's nothing that couldn't be
immediately open-coded in a binary module and use of _GPL doesn't serve
any purpose.

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH RESEND 1/2] in-kernel sockets API
  2006-08-08  0:56   ` Al Viro
@ 2006-08-08  1:50     ` David Miller
  0 siblings, 0 replies; 6+ messages in thread
From: David Miller @ 2006-08-08  1:50 UTC (permalink / raw)
  To: viro; +Cc: shemminger, sri, netdev

From: Al Viro <viro@ftp.linux.org.uk>
Date: Tue, 8 Aug 2006 01:56:19 +0100

> On Mon, Aug 07, 2006 at 04:20:33PM -0700, Stephen Hemminger wrote:
> > Please consider EXPORT_SYMBOL_GPL because this interface would be a obvious
> > target for binary modules writers to use.
> 
> As opposed to duplicating it?  WTFPoint of restriction that is trivial to
> bypass?  Look at those functions; there's nothing that couldn't be
> immediately open-coded in a binary module and use of _GPL doesn't serve
> any purpose.

Agreed.

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH RESEND 1/2] in-kernel sockets API
  2006-08-07 23:00 [PATCH RESEND 1/2] in-kernel sockets API Sridhar Samudrala
  2006-08-07 23:20 ` Stephen Hemminger
@ 2006-08-08  3:58 ` David Miller
  1 sibling, 0 replies; 6+ messages in thread
From: David Miller @ 2006-08-08  3:58 UTC (permalink / raw)
  To: sri; +Cc: netdev

From: Sridhar Samudrala <sri@us.ibm.com>
Date: Mon, 07 Aug 2006 16:00:29 -0700

> This patch implements wrapper functions that provide a convenient way to
> access the sockets API for in-kernel users like sunrpc, cifs & ocfs2 etc
> and any future users.
> 
> Signed-off-by: Sridhar Samudrala <sri@us.ibm.com>
> Acked-by: James Morris <jmorris@namei.org>

Applied, thanks Sridhar.

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2006-08-08  3:58 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-08-07 23:00 [PATCH RESEND 1/2] in-kernel sockets API Sridhar Samudrala
2006-08-07 23:20 ` Stephen Hemminger
2006-08-08  0:46   ` Sridhar Samudrala
2006-08-08  0:56   ` Al Viro
2006-08-08  1:50     ` David Miller
2006-08-08  3:58 ` David Miller

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).