svn commit: r323760 - stable/11/sys/cddl/contrib/opensolaris/uts/common/fs/zfs

Andriy Gapon avg at FreeBSD.org
Tue Sep 19 09:35:09 UTC 2017


Author: avg
Date: Tue Sep 19 09:35:07 2017
New Revision: 323760
URL: https://svnweb.freebsd.org/changeset/base/323760

Log:
  MFC r323435: MFV r323111: 8569 problem with inline functions in abd.h
  
  illumos/illumos-gate at 37e84ab74e939caf52150fc3352081786ecc0c29
  https://github.com/illumos/illumos-gate/commit/37e84ab74e939caf52150fc3352081786ecc0c29
  
  https://www.illumos.org/issues/8569
    C [C99] has peculiar rules for inline functions that are different from the
    C++ rules.  Unlike C++ where inline is "fire and forget", in C a programmer
    must pay attention to the function's storage class / visibility.  The main
    problem is with the case where a compiler decides to not inline a call to the
    function declared as inline.
    Some relevant links:
    - http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.faqs/ka15831.html
    - http://www.drdobbs.com/the-new-c-inline-functions/184401540
    The summary is that either the inline functions should be declared 'static
    inline' or one of the compilation units (.c files) must provide a callable
    externally visible function definition.  In the former case, the compiler would
    automatically create a local non-inlined function instance in every compilation
    unit where it's needed.  In the latter case the single external definition is
    used to satisfy any non-inlined calls in all compilation units.  As things
    stand right now, we can get an undefined reference error under certain
    combinations of compilers and compiler options.  For example, this is what I
    get on FreeBSD when compiling with clang 4.0.0 and -O1:
      In function `abd_free': /usr/src/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/abd.c:385:
      undefined reference to `abd_is_linear'
  
  Reviewed by: Matt Ahrens <mahrens at delphix.com>
  Approved by: Robert Mustacchi <rm at joyent.com>
  Author: Andriy Gapon <avg at FreeBSD.org>

Modified:
  stable/11/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/abd.c
Directory Properties:
  stable/11/   (props changed)

Modified: stable/11/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/abd.c
==============================================================================
--- stable/11/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/abd.c	Tue Sep 19 09:26:13 2017	(r323759)
+++ stable/11/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/abd.c	Tue Sep 19 09:35:07 2017	(r323760)
@@ -157,6 +157,13 @@ extern vmem_t *zio_alloc_arena;
 kmem_cache_t *abd_chunk_cache;
 static kstat_t *abd_ksp;
 
+extern inline boolean_t abd_is_linear(abd_t *abd);
+extern inline void abd_copy(abd_t *dabd, abd_t *sabd, size_t size);
+extern inline void abd_copy_from_buf(abd_t *abd, const void *buf, size_t size);
+extern inline void abd_copy_to_buf(void* buf, abd_t *abd, size_t size);
+extern inline int abd_cmp_buf(abd_t *abd, const void *buf, size_t size);
+extern inline void abd_zero(abd_t *abd, size_t size);
+
 static void *
 abd_alloc_chunk()
 {


More information about the svn-src-all mailing list