Skip to content

Commit

Permalink
Add support for libtirpc
Browse files Browse the repository at this point in the history
While OpenSolaris libc and glibc both include XDR support, the musl libc
does not in favor of depending on the BSD-licensed libtirpc library.

Adding support is a simple matter of detecting the library, including
the headers and linking against it.  By default libtirpc will be checked
for and if available used.  Otherwise, configure will fall back to using
the xdr implementation provided by libc if available.  The options
--with-tirpc/--without-tirpc can be used to disable this checking.

In addition, the xdr_control() function has been simplied to only
handle ZFSs specific use case.

Original-patch-by: stf <s@ctrlc.hu>
Original-patch-by: Richard Yao <ryao@gentoo.org>
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Signed-off-by: Carlo Landmeter <clandmeter@gmail.com>
Closes openzfs#2254
Closes openzfs#4559
  • Loading branch information
behlendorf committed Apr 28, 2016
1 parent 463a8cf commit 1ab3678
Show file tree
Hide file tree
Showing 9 changed files with 61 additions and 132 deletions.
30 changes: 30 additions & 0 deletions config/user-libtirpc.m4
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
dnl #
dnl # Check for libtirpc - may be needed for xdr functionality
dnl #
AC_DEFUN([ZFS_AC_CONFIG_USER_LIBTIRPC], [
AC_ARG_WITH([tirpc],
[AS_HELP_STRING([--with-tirpc],
[use tirpc for xdr encoding @<:@default=check@:>@])],
[],
[with_tirpc=check])
LIBTIRPC=
LIBTIRPC_CFLAGS=
AS_IF([test "x$with_tirpc" != xno],
[AC_CHECK_LIB([tirpc], [xdrmem_create],
[AC_SUBST([LIBTIRPC], [-ltirpc])
AC_SUBST([LIBTIRPC_CFLAGS], [-I/usr/include/tirpc])
AC_DEFINE([HAVE_LIBTIRPC], [1], [Define if you have libtirpc])
],
[if test "x$with_tirpc" != xcheck; then
AC_MSG_FAILURE(
[--with-tirpc was given, but test for tirpc failed])
fi
AC_SEARCH_LIBS([xdrmem_create], [tirpc], [], [
AC_MSG_FAILURE([xdrmem_create() requires tirpc or libc])])
])],
[AC_SEARCH_LIBS([xdrmem_create], [tirpc], [], [
AC_MSG_FAILURE([xdrmem_create() requires libc])])
])
])
1 change: 1 addition & 0 deletions config/user.m4
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ AC_DEFUN([ZFS_AC_CONFIG_USER], [
ZFS_AC_CONFIG_USER_ARCH
ZFS_AC_CONFIG_USER_ZLIB
ZFS_AC_CONFIG_USER_LIBUUID
ZFS_AC_CONFIG_USER_LIBTIRPC
ZFS_AC_CONFIG_USER_LIBBLKID
ZFS_AC_CONFIG_USER_LIBATTR
ZFS_AC_CONFIG_USER_LIBUDEV
Expand Down
6 changes: 3 additions & 3 deletions lib/libnvpair/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ VPATH = \
$(top_srcdir)/module/nvpair \
$(top_srcdir)/lib/libnvpair

AM_CFLAGS += $(DEBUG_STACKFLAGS) $(FRAME_LARGER_THAN)
AM_CFLAGS += $(DEBUG_STACKFLAGS) $(FRAME_LARGER_THAN) $(LIBTIRPC_CFLAGS)

DEFAULT_INCLUDES += \
-I$(top_srcdir)/include \
Expand All @@ -26,8 +26,8 @@ nodist_libnvpair_la_SOURCES = \
$(KERNEL_C)

libnvpair_la_LIBADD = \
$(top_builddir)/lib/libuutil/libuutil.la

$(top_builddir)/lib/libuutil/libuutil.la \
$(LIBTIRPC)
libnvpair_la_LDFLAGS = -version-info 1:1:0

EXTRA_DIST = $(USER_C)
1 change: 1 addition & 0 deletions lib/libnvpair/nvpair_alloc_system.c
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@


#include <rpc/types.h>
#include <sys/kmem.h>
#include <sys/nvpair.h>

static void *
Expand Down
1 change: 0 additions & 1 deletion lib/libspl/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@ USER_C = \
strnlen.c \
timestamp.c \
zone.c \
xdr.c \
include/sys/list.h \
include/sys/list_impl.h

Expand Down
1 change: 0 additions & 1 deletion lib/libspl/include/rpc/Makefile.am
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
libspldir = $(includedir)/libspl/rpc
libspl_HEADERS = \
$(top_srcdir)/lib/libspl/include/rpc/types.h \
$(top_srcdir)/lib/libspl/include/rpc/xdr.h
32 changes: 0 additions & 32 deletions lib/libspl/include/rpc/types.h

This file was deleted.

43 changes: 26 additions & 17 deletions lib/libspl/include/rpc/xdr.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,11 +32,20 @@
#ifndef LIBSPL_RPC_XDR_H
#define LIBSPL_RPC_XDR_H

#include_next <rpc/xdr.h>

/*
* These are XDR control operators
* When available prefer libtirpc for xdr functionality. This library is
* mandatory when compiling with musl libc because it does not provide xdr.
*/
#if defined(HAVE_LIBTIRPC)

#include <tirpc/rpc/xdr.h>
#ifdef xdr_control
#undef xdr_control
#endif

#else
#include_next <rpc/xdr.h>
#endif /* HAVE_LIBTIRPC */

#define XDR_GET_BYTES_AVAIL 1

Expand All @@ -46,20 +55,20 @@ typedef struct xdr_bytesrec {
} xdr_bytesrec_t;

/*
* These are the request arguments to XDR_CONTROL.
*
* XDR_PEEK - returns the contents of the next XDR unit on the XDR stream.
* XDR_SKIPBYTES - skips the next N bytes in the XDR stream.
* XDR_RDMAGET - for xdr implementation over RDMA, gets private flags from
* the XDR stream being moved over RDMA
* XDR_RDMANOCHUNK - for xdr implementaion over RDMA, sets private flags in
* the XDR stream moving over RDMA.
* This functionality is not required and is disabled in user space.
*/
#define XDR_PEEK 2
#define XDR_SKIPBYTES 3
#define XDR_RDMAGET 4
#define XDR_RDMASET 5
static inline bool_t
xdr_control(XDR *xdrs, int request, void *info)
{
xdr_bytesrec_t *xptr;

extern bool_t xdr_control(XDR *xdrs, int request, void *info);
ASSERT3U(request, ==, XDR_GET_BYTES_AVAIL);

#endif
xptr = (xdr_bytesrec_t *)info;
xptr->xc_is_last_record = TRUE;
xptr->xc_num_avail = xdrs->x_handy;

return (TRUE);
}

#endif /* LIBSPL_RPC_XDR_H */
78 changes: 0 additions & 78 deletions lib/libspl/xdr.c

This file was deleted.

0 comments on commit 1ab3678

Please sign in to comment.