Whamcloud - gitweb
LU-12635 build: Support for gcc -Wimplicit-fallthrough
[fs/lustre-release.git] / config / lustre-build-zfs.m4
1 dnl #
2 dnl # Supported configure options.  When no options are specified support
3 dnl # for ZFS OSDs will be autodetected assuming server support is enabled.
4 dnl # If the ZFS OSD cannot be built support for it is disabled and a
5 dnl # warning is issued but the configure process is allowed to continue.
6 dnl #
7 dnl # --without-zfs   - Disable zfs support.
8 dnl # --with-zfs=no
9 dnl #
10 dnl # --with-zfs      - Enable zfs support and attempt to autodetect the zfs
11 dnl # --with-zfs=yes    headers in one of the following places.  Because zfs
12 dnl #                   support was explicitly required if the headers cannot
13 dnl #                   be located it is treated as a fatal error.
14 dnl #
15 dnl #                       * /var/lib/dkms/zfs/${VERSION}/source
16 dnl #                       * /usr/src/zfs-${VERSION}/${LINUXRELEASE}
17 dnl #                       * /usr/src/zfs-${VERSION}
18 dnl #                       * ../zfs/
19 dnl #                       * $LINUX/zfs
20 dnl #
21 dnl # --with-zfs-devel=path
22 dnl #                 - User provided directory where zfs development headers
23 dnl #                   are located. This option is typically used when user
24 dnl #                   uses rpm2cpio to unpack src rpm.
25 dnl #                   Assumes layout of:
26 dnl #                     ${zfs-devel-path}/usr/include/libzfs
27 dnl #                     ${zfs-devel-path}/usr/include/libspl
28 dnl #                     ${zfs-devel-path}/lib64/libzfs.so.* or
29 dnl #                     ${zfs-devel-path}/lib/libzfs.so.*
30 dnl #
31 dnl # --with-zfs=path - Enable zfs support and use the zfs headers in the
32 dnl #                   provided path.  No autodetection is performed and
33 dnl #                   if no headers are found this is a fatal error.
34 dnl #
35 dnl # --with-zfs-obj  - When zfs support is enabled the object directory
36 dnl #                   will be based on the --with-zfs directory.  If this
37 dnl #                   is detected incorrectly it can be explicitly
38 dnl #                   specified using this option.
39 dnl #
40 dnl # --without-spl   - Disable spl support.
41 dnl # --with-spl=no
42 dnl #
43 dnl # --with-spl      - Enable spl support and attempt to autodetect the spl
44 dnl # --with-spl=yes    headers in one of the following places in this order:
45 dnl #                   * /var/lib/dkms/spl/${VERSION}/source
46 dnl #                   * /usr/src/spl-${VERSION}/${LINUXRELEASE}
47 dnl #                   * /usr/src/spl-${VERSION}
48 dnl #                   * ../spl/
49 dnl #                   * $LINUX/spl
50 dnl #
51 dnl # --with-spl=path - Enable spl support and use the spl headers in the
52 dnl #                   provided path.  No autodetection is performed.
53 dnl #
54 dnl # --with-spl-obj  - When spl support is enabled the object directory
55 dnl #                   will be based on the --with-spl directory.  If this
56 dnl #                   is detected incorrectly it can be explicitly
57 dnl #                   specified using this option.
58 dnl #
59 AC_DEFUN([LB_SPL], [
60         AC_ARG_WITH([spl],
61                 AS_HELP_STRING([--with-spl=PATH],
62                 [Path to spl source]),
63                 [splsrc="$withval"])
64
65         AC_ARG_WITH([spl-obj],
66                 AS_HELP_STRING([--with-spl-obj=PATH],
67                 [Path to spl build objects]),
68                 [splobj="$withval"])
69
70         dnl #
71         dnl # The existence of spl.release[.in] is used to identify a valid
72         dnl # source directory.  In order of preference:
73         dnl #
74         splver=$(ls -1 /usr/src/ | grep -m1 spl | cut -f2 -d'-')
75         spldkms="/var/lib/dkms/spl/${splver}"
76         splsrc1="/usr/src/spl-${splver}/${LINUXRELEASE}"
77         splsrc2="/usr/src/spl-${splver}"
78         splsrc3="../spl/"
79         splsrc4="$LINUX/spl"
80
81         AC_MSG_CHECKING([spl source directory])
82         AS_IF([test -z "${splsrc}"], [
83                 AS_IF([test -e "${spldkms}/source/spl.release.in"], [
84                         splsrc=${spldkms}/source
85                 ], [test -e "${splsrc1}/spl.release.in"], [
86                         splsrc=${splsrc1}
87                 ], [test -e "${splsrc2}/spl.release.in"], [
88                         splsrc=${splsrc2}
89                 ], [test -e "${splsrc3}/spl.release.in"], [
90                         splsrc=$(readlink -f "${splsrc3}")
91                 ], [test -e "${splsrc4}/spl.release.in"], [
92                         splsrc=${splsrc4}
93                 ], [
94                         splsrc="[Not found]"
95                 ])
96         ])
97         AC_MSG_RESULT([$splsrc])
98
99         AS_IF([test ! -e "$splsrc/spl.release" &&
100             test ! -e "$splsrc/spl.release.in"], [
101                 enable_zfs=no
102         ])
103
104         dnl #
105         dnl # The existence of the spl_config.h is used to identify a valid
106         dnl # spl object directory.  In many cases the object and source
107         dnl # directory are the same, however the objects may also reside
108         dnl # is a subdirectory named after the kernel version.  When
109         dnl # weak modules are used, the kernel version may not be the
110         dnl # same as the LINUXRELEASE against which we are building lustre.
111         dnl #
112         AC_MSG_CHECKING([spl build directory])
113         AS_IF([test -z "$splobj"], [
114                 last_spl_obj_dir=$(ls -d ${splsrc}/[[0-9]]*/ | tail -n 1 | sed 's|/$||')
115                 AS_IF([test "${splsrc}" = "${spldkms}/source"], [
116                         AS_IF([test -e "${spldkms}/${LINUXRELEASE}/${target_cpu}/spl_config.h"], [
117                                 splobj=${spldkms}/${LINUXRELEASE}/${target_cpu}
118                         ], [
119                                 splobj="[Not found]"
120                         ])
121                 ],[test -e "${splsrc}/${LINUXRELEASE}/spl_config.h"], [
122                         splobj="${splsrc}/${LINUXRELEASE}"
123                 ], [test -e "${splsrc}/spl_config.h"], [
124                         splobj="${splsrc}"
125                 ], [test -e "${last_spl_obj_dir}/spl_config.h"], [
126                         splobj="${last_spl_obj_dir}"
127                 ], [
128                         splobj="[Not found]"
129                 ])
130         ])
131         AC_MSG_RESULT([$splobj])
132
133         AS_IF([test ! -e "$splobj/spl_config.h"], [
134                 enable_zfs=no
135         ])
136
137         dnl #
138         dnl # Verify the source version using SPL_META_VERSION in spl_config.h
139         dnl #
140         AS_IF([test x$enable_zfs = xyes], [
141                 AC_MSG_CHECKING([spl source version])
142                 AS_IF([fgrep -q SPL_META_VERSION $splobj/spl_config.h], [
143                         splver=$((echo "#include <spl_config.h>";
144                             echo "splver=SPL_META_VERSION-SPL_META_RELEASE") |
145                             cpp -I $splobj |
146                             grep "^splver=" | tr -d \" | cut -d= -f2)
147                 ], [
148                         splver="[Not found]"
149                         enable_zfs=no
150                 ])
151                 AC_MSG_RESULT([$splver])
152         ])
153
154         dnl #
155         dnl # Verify the modules systems exist by the expect name.
156         dnl #
157         AS_IF([test x$enable_zfs = xyes], [
158                 AC_MSG_CHECKING([spl file name for module symbols])
159                 AS_IF([test -r $splobj/$SYMVERFILE], [
160                         splsym=$SYMVERFILE
161                         EXTRA_SYMBOLS="$EXTRA_SYMBOLS $splobj/$SYMVERFILE"
162                 ], [test -r $splobj/module/$SYMVERFILE], [
163                         splsym=$SYMVERFILE
164                         EXTRA_SYMBOLS="$EXTRA_SYMBOLS $splobj/module/$SYMVERFILE"
165                 ], [
166                         splsym="[Not found]"
167                         enable_zfs=no
168                 ])
169                 AC_MSG_RESULT([$splsym])
170         ])
171
172         SPL=${splsrc}
173         SPL_OBJ=${splobj}
174         SPL_VERSION=${splver}
175
176         AC_SUBST(SPL)
177         AC_SUBST(SPL_OBJ)
178         AC_SUBST(SPL_VERSION)
179         AC_SUBST(EXTRA_SYMBOLS)
180 ])
181
182 AC_DEFUN([LB_ZFS], [
183         AC_ARG_WITH([zfs-obj],
184                 AS_HELP_STRING([--with-zfs-obj=PATH],
185                 [Path to zfs build objects]),
186                 [zfsobj="$withval"])
187
188         dnl #
189         dnl # The existence of zfs.release[.in] is used to identify a valid
190         dnl # source directory.  In order of preference:
191         dnl #
192         zfsver=$(ls -1 /usr/src/ | grep -m1 zfs | cut -f2 -d'-')
193         zfsdkms="/var/lib/dkms/zfs/${zfsver}"
194         zfssrc1="/usr/src/zfs-${zfsver}/${LINUXRELEASE}"
195         zfssrc2="/usr/src/zfs-${zfsver}"
196         zfssrc3="../zfs/"
197         zfssrc4="$LINUX/zfs"
198
199         AC_MSG_CHECKING([zfs source directory])
200         AS_IF([test -z "${zfssrc}"], [
201                 AS_IF([test -e "${zfsdkms}/source/zfs.release.in"], [
202                         zfssrc=${zfsdkms}/source
203                 ], [test -e "${zfssrc1}/zfs.release.in"], [
204                         zfssrc=${zfssrc1}
205                 ], [test -e "${zfssrc2}/zfs.release.in"], [
206                         zfssrc=${zfssrc2}
207                 ], [test -e "${zfssrc3}/zfs.release.in"], [
208                         zfssrc=$(readlink -f "${zfssrc3}")
209                 ], [test -e "${zfssrc4}/zfs.release.in"], [
210                         zfssrc=${zfssrc4}
211                 ], [
212                         zfssrc="[Not found]"
213                 ])
214         ])
215         AC_MSG_RESULT([$zfssrc])
216
217         AS_IF([test ! -e "$zfssrc/zfs.release.in" &&
218             test ! -e "$zfssrc/zfs.release"], [
219                 enable_zfs=no
220         ])
221
222         dnl #
223         dnl # The existence of the zfs_config.h is used to identify a valid
224         dnl # zfs object directory.  In many cases the object and source
225         dnl # directory are the same, however the objects may also reside
226         dnl # is a subdirectory named after the kernel version.  When
227         dnl # weak modules are used, the kernel version may not be the
228         dnl # same as the LINUXRELEASE against which we are building lustre.
229         dnl #
230         AC_MSG_CHECKING([zfs build directory])
231         AS_IF([test -z "$zfsobj"], [
232                 last_zfs_obj_dir=$(ls -d ${zfssrc}/[[0-9]]*/ | tail -n 1 | sed 's|/$||')
233                 AS_IF([test "${zfssrc}" = "${zfsdkms}/source"], [
234                         AS_IF([test -e "${zfsdkms}/${LINUXRELEASE}/${target_cpu}/zfs_config.h"], [
235                                 zfsobj=${zfsdkms}/${LINUXRELEASE}/${target_cpu}
236                         ], [
237                                 zfsobj="[Not found]"
238                         ])
239                 ], [test -e "${zfssrc}/${LINUXRELEASE}/zfs_config.h"], [
240                         zfsobj="${zfssrc}/${LINUXRELEASE}"
241                 ], [test -e "${zfssrc}/zfs_config.h"], [
242                         zfsobj="${zfssrc}"
243                 ], [test -e "${last_zfs_obj_dir}/zfs_config.h"], [
244                         zfsobj="${last_zfs_obj_dir}"
245                 ], [
246                         zfsobj="[Not found]"
247                 ])
248         ])
249
250         AC_MSG_RESULT([$zfsobj])
251         AS_IF([test ! -e "$zfsobj/zfs_config.h"], [
252                 enable_zfs=no
253         ])
254
255         dnl #
256         dnl # Verify the source version using SPL_META_VERSION in spl_config.h
257         dnl #
258         AS_IF([test x$enable_zfs = xyes], [
259                 AC_MSG_CHECKING([zfs source version])
260                 AS_IF([fgrep -q ZFS_META_VERSION $zfsobj/zfs_config.h], [
261                         zfsver=$((echo "#include <zfs_config.h>";
262                             echo "zfsver=ZFS_META_VERSION-ZFS_META_RELEASE") |
263                             cpp -I $zfsobj |
264                             grep "^zfsver=" | tr -d \" | cut -d= -f2)
265                 ],[
266                         zfsver="[Not found]"
267                         enable_zfs=no
268                 ])
269                 AC_MSG_RESULT([$zfsver])
270         ])
271
272         dnl #
273         dnl # Verify the modules systems exist by the expect name.
274         dnl #
275         AS_IF([test x$enable_zfs = xyes], [
276                 AC_MSG_CHECKING([zfs file name for module symbols])
277                 AS_IF([test -r $zfsobj/$SYMVERFILE], [
278                         zfssym=$SYMVERFILE
279                         EXTRA_SYMBOLS="$EXTRA_SYMBOLS $zfsobj/$SYMVERFILE"
280                 ], [test -r $zfsobj/module/$SYMVERFILE], [
281                         zfssym=$SYMVERFILE
282                         EXTRA_SYMBOLS="$EXTRA_SYMBOLS $zfsobj/module/$SYMVERFILE"
283                 ], [
284                         zfssym="[Not found]"
285                         enable_zfs=no
286                 ])
287                 AC_MSG_RESULT([$zfssym])
288         ])
289
290         ZFS=${zfssrc}
291         ZFS_OBJ=${zfsobj}
292         ZFS_VERSION=${zfsver}
293
294         AC_SUBST(ZFS)
295         AC_SUBST(ZFS_OBJ)
296         AC_SUBST(ZFS_VERSION)
297         AC_SUBST(EXTRA_SYMBOLS)
298 ])
299
300 AC_DEFUN([LB_ZFS_DEVEL], [
301         AC_ARG_WITH([zfs-devel],
302                 [AS_HELP_STRING([--with-zfs-devel=PATH],
303                 [Path to zfs development headers])],
304                 [zfsdevel="$withval"])
305
306         AC_MSG_CHECKING([user provided zfs devel headers])
307         AS_IF([test ! -z "${zfsdevel}"], [
308                 AS_IF([test -d "${zfsdevel}/usr/include/libspl" && test -d "${zfsdevel}/usr/include/libzfs"], [
309                         zfsinc="-I $zfsdevel/usr/include/libspl -I $zfsdevel/usr/include/libzfs"
310                         zfslib="-L$zfsdevel/usr/lib64 -L$zfsdevel/usr/lib -L$zfsdevel/lib64 -L$zfsdevel/lib"
311                 ], [
312                         AC_MSG_ERROR([Path to development headers directory does not exist])
313                 ])
314         ])
315         AC_MSG_RESULT([$zfsinc])
316 ])
317
318 AC_DEFUN([LB_ZFS_USER], [
319         dnl #
320         dnl # Detect user space zfs development headers.
321         dnl #
322         AC_MSG_CHECKING([zfs devel headers])
323         AS_IF([test -z "${zfsinc}"], [
324                 AS_IF([test -e "${zfssrc}/include/libzfs.h" && test -e "${zfssrc}/lib/libspl/include"], [
325                         zfsinc="-I $zfssrc/lib/libspl/include -I $zfssrc/include"
326                         zfslib="-L$zfssrc/lib/libzfs/.libs/ -L$zfssrc/lib/libnvpair/.libs"
327                 ], [test -d /usr/include/libzfs && test -d /usr/include/libspl], [
328                         zfsinc="-I/usr/include/libspl -I /usr/include/libzfs"
329                         zfslib=""
330                 ], [
331                         zfsinc="[Not Found]"
332                         zfslib=""
333                         enable_zfs=no
334                 ])
335         ])
336         AC_MSG_RESULT([$zfsinc])
337
338         ZFS_LIBZFS_INCLUDE=${zfsinc}
339         ZFS_LIBZFS_LDFLAGS=${zfslib}
340         ZFS_LIBZFS_LIBS="-lzfs -lnvpair"
341         AC_SUBST(ZFS_LIBZFS_INCLUDE)
342         AC_SUBST(ZFS_LIBZFS_LDFLAGS)
343         AC_SUBST(ZFS_LIBZFS_LIBS)
344 ])
345
346 AC_DEFUN([LB_CONFIG_ZFS], [
347         AC_ARG_WITH([zfs],
348                 [AS_HELP_STRING([--with-zfs=PATH], [Path to zfs source])],
349                 [
350                         AS_IF([test x$withval = xno], [
351                                 enable_zfs=no
352                                 require_zfs=no
353                         ], [test x$withval = xyes], [
354                                 enable_zfs=yes
355                                 require_zfs=yes
356                         ], [
357                                 enable_zfs=yes
358                                 require_zfs=yes
359                                 zfssrc="$withval"
360                         ])
361                 ], [
362                         AS_IF([test x$enable_server != xno], [
363                                 require_zfs=no
364                                 enable_zfs=yes
365                         ], [
366                                 require_zfs=no
367                                 enable_zfs=no
368                         ])
369                 ])
370
371         AC_MSG_CHECKING([whether to enable zfs])
372         AC_MSG_RESULT([$enable_zfs])
373
374         AS_IF([test x$enable_zfs = xyes], [
375                 AS_IF([test x$enable_modules = xyes], [
376                         LB_SPL
377                         LB_ZFS
378                 ])
379                 LB_ZFS_DEVEL
380                 LB_ZFS_USER
381
382                 dnl #
383                 dnl # enable_zfs will be set to no in LB_SPL or LB_ZFS if
384                 dnl # one of more of the build requirements is not met.
385                 dnl #
386                 AS_IF([test x$enable_zfs = xyes], [
387                         AC_DEFINE(HAVE_ZFS_OSD, 1, Enable zfs osd)
388                 ],[
389                         AS_IF([test x$require_zfs = xyes], [
390                                 AC_MSG_ERROR([
391
392 Required zfs osd cannot be built due to missing zfs development headers.
393
394 Support for zfs can be enabled by downloading the required packages for your
395 distribution.  See http://zfsonlinux.org/ to determine is zfs is supported by
396 your distribution.
397                                 ])
398                         ], [
399                                 AC_MSG_WARN([
400
401 Disabling optional zfs osd due to missing development headers.
402
403 Support for zfs can be enabled by downloading the required packages for your
404 distribution.  See http://zfsonlinux.org/ to determine is zfs is supported by
405 your distribution.
406                                 ])
407                         ])
408                 ])
409         ])
410
411         dnl #
412         dnl # Define zfs source code version
413         dnl #
414         AS_IF([test x$enable_zfs = xyes], [
415                 ZFS_MAJOR=$(echo $zfsver | sed -re ['s/([0-9]+)\.([0-9]+)\.([0-9]+)(\.([0-9]+))?.*/\1/'])
416                 ZFS_MINOR=$(echo $zfsver | sed -re ['s/([0-9]+)\.([0-9]+)\.([0-9]+)(\.([0-9]+))?.*/\2/'])
417                 ZFS_PATCH=$(echo $zfsver | sed -re ['s/([0-9]+)\.([0-9]+)\.([0-9]+)(\.([0-9]+))?.*/\3/'])
418                 ZFS_FIX=$(echo $zfsver   | sed -re ['s/([0-9]+)\.([0-9]+)\.([0-9]+)(\.([0-9]+))?.*/\5/'])
419                 AS_IF([test -z "$ZFS_FIX"], [ZFS_FIX="0"])
420
421                 AC_DEFINE_UNQUOTED([ZFS_MAJOR], [$ZFS_MAJOR], [zfs major version])
422                 AC_DEFINE_UNQUOTED([ZFS_MINOR], [$ZFS_MINOR], [zfs minor version])
423                 AC_DEFINE_UNQUOTED([ZFS_PATCH], [$ZFS_PATCH], [zfs patch version])
424                 AC_DEFINE_UNQUOTED([ZFS_FIX],   [$ZFS_FIX],   [zfs fix version])
425         ])
426
427         AS_IF([test "x$enable_zfs" = xyes], [
428                 LB_CHECK_COMPILE([if zfs defines dsl_pool_config_enter/exit],
429                 dsl_pool_config_enter, [
430                         #include <sys/dsl_pool.h>
431                 ],[
432                         dsl_pool_config_enter(NULL, FTAG);
433                 ],[
434                         AC_DEFINE(HAVE_DSL_POOL_CONFIG, 1,
435                                 [Have dsl_pool_config_enter/exit in ZFS])
436                 ])
437                 LB_CHECK_COMPILE([if zfs defines dsl_sync_task_do_nowait],
438                 dsl_sync_task_do_nowait, [
439                         #include <sys/dsl_synctask.h>
440                 ],[
441                         dsl_sync_task_do_nowait(NULL, NULL, NULL, NULL, NULL, 0, NULL);
442                 ],[
443                         AC_DEFINE(HAVE_DSL_SYNC_TASK_DO_NOWAIT, 1,
444                                 [Have dsl_sync_task_do_nowait in ZFS])
445                 ])
446                 LB_CHECK_COMPILE([if zfs defines sa_spill_alloc],
447                 sa_spill_alloc, [
448                         #include <sys/kmem.h>
449                         #include <sys/sa.h>
450                 ],[
451                         void *ptr;
452
453                         ptr = sa_spill_alloc(KM_SLEEP);
454                         sa_spill_free(ptr);
455                 ],[
456                         AC_DEFINE(HAVE_SA_SPILL_ALLOC, 1,
457                                 [Have sa_spill_alloc in ZFS])
458                 ])
459                 LB_CHECK_COMPILE([if zfs defines spa_maxblocksize],
460                 spa_maxblocksize, [
461                         #include <sys/spa.h>
462                 ],[
463                         spa_t *spa = NULL;
464                         int size;
465
466                         size = spa_maxblocksize(spa);
467                 ],[
468                         AC_DEFINE(HAVE_SPA_MAXBLOCKSIZE, 1,
469                                 [Have spa_maxblocksize in ZFS])
470                 ])
471
472                 dnl #
473                 dnl # ZFS 0.7.x adds support for large dnodes.  This
474                 dnl # allows Lustre to optionally specify the size of a
475                 dnl # dnode which ZFS will then use to store metadata such
476                 dnl # as xattrs. The default dnode size specified by the
477                 dnl # 'dnodesize' dataset property will be used unless a
478                 dnl # specific value is provided.
479                 dnl #
480                 LB_CHECK_COMPILE([if zfs defines dmu_object_alloc_dnsize],
481                 dmu_object_alloc_dnsize, [
482                         #include <sys/dmu.h>
483                         #include <sys/dnode.h>
484                 ],[
485                         objset_t *os = NULL;
486                         dmu_object_type_t objtype = DMU_OT_NONE;
487                         int blocksize = 0;
488                         dmu_object_type_t bonustype = DMU_OT_SA;
489                         int dnodesize = DNODE_MIN_SIZE;
490                         dmu_tx_t *tx = NULL;
491                         uint64_t id;
492
493                         id = dmu_object_alloc_dnsize(os, objtype, blocksize,
494                                                      bonustype,
495                                                      DN_BONUS_SIZE(dnodesize),
496                                                      dnodesize, tx);
497                 ],[
498                         AC_DEFINE(HAVE_DMU_OBJECT_ALLOC_DNSIZE, 1,
499                                 [Have dmu_object_alloc_dnsize in ZFS])
500                 ])
501
502                 dnl #
503                 dnl # ZFS 0.7.x extended dmu_prefetch() to take an additional
504                 dnl # 'level' and 'priority' argument.  Use a level of 0 and a
505                 dnl # priority of ZIO_PRIORITY_SYNC_READ to replicate the
506                 dnl # behavior of the four argument version.
507                 dnl #
508                 LB_CHECK_COMPILE([if ZFS has 'dmu_prefetch' with 6 args],
509                 dmu_prefetch, [
510                         #include <sys/dmu.h>
511                 ],[
512                         objset_t *os = NULL;
513                         uint64_t object = 0;
514                         int64_t level = 0;
515                         uint64_t offset = 0;
516                         uint64_t len = 0;
517                         enum zio_priority pri = ZIO_PRIORITY_SYNC_READ;
518
519                         dmu_prefetch(os, object, level, offset, len, pri);
520                 ],[
521                         AC_DEFINE(HAVE_DMU_PREFETCH_6ARG, 1,
522                                 [Have 6 argument dmu_pretch in ZFS])
523                 ])
524                 dnl #
525                 dnl # ZFS 0.7.0 feature: SPA_FEATURE_USEROBJ_ACCOUNTING
526                 dnl #
527                 LB_CHECK_COMPILE([if ZFS has native dnode accounting supported],
528                 dmu_objset_userobjused_enabled, [
529                         #include <sys/dmu_objset.h>
530                 ],[
531                         dmu_objset_userobjused_enabled(NULL);
532                 ],[
533                         AC_DEFINE(HAVE_DMU_USEROBJ_ACCOUNTING, 1,
534                                 [Have native dnode accounting in ZFS])
535                 ])
536                 dnl #
537                 dnl # ZFS 0.7.0 feature: MULTIHOST
538                 dnl #
539                 LB_CHECK_COMPILE([if ZFS has multihost protection],
540                 spa_multihost, [
541                         #include <sys/spa.h>
542                 ],[
543                         spa_multihost(NULL);
544                 ],[
545                         AC_DEFINE(HAVE_ZFS_MULTIHOST, 1,
546                                 [Have multihost protection in ZFS])
547                 ])
548                 dnl #
549                 dnl # ZFS 0.7.x adds new method zap_lookup_by_dnode
550                 dnl #
551                 LB_CHECK_COMPILE([if ZFS has 'zap_lookup_by_dnode'],
552                 zap_lookup_by_dnode, [
553                         #include <sys/zap.h>
554                         #include <sys/dnode.h>
555                 ],[
556                         dnode_t *dn = NULL;
557                         zap_lookup_by_dnode(dn, NULL, 1, 1, NULL);
558                 ],[
559                         AC_DEFINE(HAVE_ZAP_LOOKUP_BY_DNODE, 1,
560                                 [Have zap_lookup_by_dnode() in ZFS])
561                 ])
562                 dnl #
563                 dnl # ZFS 0.7.x adds new method zap_add_by_dnode
564                 dnl #
565                 LB_CHECK_COMPILE([if ZFS has 'zap_add_by_dnode'],
566                 zap_add_by_dnode, [
567                         #include <sys/zap.h>
568                         #include <sys/dnode.h>
569                 ],[
570                         dnode_t *dn = NULL;
571                         zap_add_by_dnode(dn, NULL, 1, 1, NULL, NULL);
572                 ],[
573                         AC_DEFINE(HAVE_ZAP_ADD_BY_DNODE, 1,
574                                 [Have zap_add_by_dnode() in ZFS])
575                 ])
576                 dnl #
577                 dnl # ZFS 0.7.x adds new method zap_remove_by_dnode
578                 dnl #
579                 LB_CHECK_COMPILE([if ZFS has 'zap_remove_by_dnode'],
580                 zap_remove_by_dnode, [
581                         #include <sys/zap.h>
582                         #include <sys/dnode.h>
583                 ],[
584                         dnode_t *dn = NULL;
585                         zap_remove_by_dnode(dn, NULL, NULL);
586                 ],[
587                         AC_DEFINE(HAVE_ZAP_REMOVE_ADD_BY_DNODE, 1,
588                                 [Have zap_remove_by_dnode() in ZFS])
589                 ])
590                 dnl #
591                 dnl # ZFS 0.7.x adds new method dmu_tx_hold_zap_by_dnode
592                 dnl #
593                 LB_CHECK_COMPILE([if ZFS has 'dmu_tx_hold_zap_by_dnode'],
594                 dmu_tx_hold_zap_by_dnode, [
595                         #include <sys/zap.h>
596                         #include <sys/dnode.h>
597                 ],[
598                         dnode_t *dn = NULL;
599                         dmu_tx_hold_zap_by_dnode(NULL, dn, TRUE, NULL);
600                 ],[
601                         AC_DEFINE(HAVE_DMU_TX_HOLD_ZAP_BY_DNODE, 1,
602                                 [Have dmu_tx_hold_zap_by_dnode() in ZFS])
603                 ])
604                 dnl #
605                 dnl # ZFS 0.7.x adds new method dmu_tx_hold_write_by_dnode
606                 dnl #
607                 LB_CHECK_COMPILE([if ZFS has 'dmu_tx_hold_write_by_dnode'],
608                 dmu_tx_hold_write_by_dnode, [
609                         #include <sys/zap.h>
610                         #include <sys/dnode.h>
611                 ],[
612                         dnode_t *dn = NULL;
613                         dmu_tx_hold_write_by_dnode(NULL, dn, 0, 0);
614                 ],[
615                         AC_DEFINE(HAVE_DMU_TX_HOLD_WRITE_BY_DNODE, 1,
616                                 [Have dmu_tx_hold_write_by_dnode() in ZFS])
617                 ])
618                 dnl #
619                 dnl # ZFS 0.7.x adds new method dmu_write_by_dnode
620                 dnl #
621                 LB_CHECK_COMPILE([if ZFS has 'dmu_write_by_dnode'],
622                 dmu_write_by_dnode, [
623                         #include <sys/zap.h>
624                         #include <sys/dnode.h>
625                 ],[
626                         dnode_t *dn = NULL;
627                         dmu_write_by_dnode(dn, 0, 0, NULL, NULL);
628                 ],[
629                         AC_DEFINE(HAVE_DMU_WRITE_BY_DNODE, 1,
630                                 [Have dmu_write_by_dnode() in ZFS])
631                 ])
632                 dnl #
633                 dnl # ZFS 0.7.x adds new method dmu_read_by_dnode
634                 dnl #
635                 LB_CHECK_COMPILE([if ZFS has 'dmu_read_by_dnode'],
636                 dmu_read_by_dnode, [
637                         #include <sys/zap.h>
638                         #include <sys/dnode.h>
639                 ],[
640                         dnode_t *dn = NULL;
641                         dmu_read_by_dnode(dn, 0, 0, NULL, 0);
642                 ],[
643                         AC_DEFINE(HAVE_DMU_READ_BY_DNODE, 1,
644                                 [Have dmu_read_by_dnode() in ZFS])
645                 ])
646                 dnl #
647                 dnl # ZFS 0.7.2 adds new method dmu_tx_mark_netfree
648                 dnl #
649                 LB_CHECK_COMPILE([if ZFS has 'dmu_tx_mark_netfree'],
650                 dmu_tx_mark_netfree, [
651                         #include <sys/dmu.h>
652                 ],[
653                         dmu_tx_t *tx = NULL;
654                         dmu_tx_mark_netfree(tx);
655                 ],[
656                         AC_DEFINE(HAVE_DMU_TX_MARK_NETFREE, 1,
657                                 [Have dmu_tx_mark_netfree])
658                 ])
659                 dnl #
660                 dnl # ZFS 0.7.10 changes timestruc_t to inode_timespec_t
661                 dnl #
662                 LB_CHECK_COMPILE([if SPL has 'inode_timespec_t'],
663                 zfs_have_inode_timespec, [
664                         #include <sys/fs/zfs.h>
665                 ],[
666                         inode_timespec_t now;
667                         gethrestime(&now);
668                 ],[
669                         AC_DEFINE(HAVE_ZFS_INODE_TIMESPEC, 1,
670                                 [Have inode_timespec_t])
671                 ])
672                 dnl # ZFS 0.7.12/0.8.x uses zfs_refcount_add() instead of
673                 dnl # refcount_add().
674                 dnl #
675                 LB_CHECK_COMPILE([if ZFS has 'zfs_refcount_add'],
676                 zfs_refcount_add, [
677                         #include <sys/refcount.h>
678                 ],[
679                         zfs_refcount_add((zfs_refcount_t *) NULL, NULL);
680                 ],[
681                         AC_DEFINE(HAVE_ZFS_REFCOUNT_ADD, 1,
682                                 [Have zfs_refcount_add])
683                 ])
684                 dnl #
685                 dnl # ZFS 0.8.x changes dmu_objset_own for encryption
686                 dnl #
687                 LB_CHECK_COMPILE([if ZFS has 'dmu_objset_own' with 6 args],
688                 dmu_objset_own, [
689                         #include <sys/dmu_objset.h>
690                 ],[
691                         objset_t *os = NULL;
692                         dmu_objset_type_t type = DMU_OST_ANY;
693                         dmu_objset_own(NULL, type, B_FALSE, B_TRUE, FTAG, &os);
694                 ],[
695                         AC_DEFINE(HAVE_DMU_OBJSET_OWN_6ARG, 1,
696                                 [Have dmu_objset_own() with 6 args])
697                 ])
698                 dnl #
699                 dnl # ZFS 0.8.x changes dmu_objset_disown for encryption
700                 dnl #
701                 LB_CHECK_COMPILE([if ZFS has 'dmu_objset_disown' with 3 args],
702                 dmu_objset_disown, [
703                         #include <sys/dmu_objset.h>
704                 ],[
705                         objset_t *os = NULL;
706                         dmu_objset_disown(os, B_TRUE, FTAG);
707                 ],[
708                         AC_DEFINE(HAVE_DMU_OBJSET_DISOWN_3ARG, 1,
709                                 [Have dmu_objset_disown() with 3 args])
710                 ])
711         ])
712
713         AS_IF([test "x$enable_zfs" = xyes], [
714                 AC_SUBST(ENABLE_ZFS, yes)
715         ], [
716                 AC_SUBST(ENABLE_ZFS, no)
717         ])
718         AM_CONDITIONAL(ZFS_ENABLED, [test "x$enable_zfs" = xyes])
719 ])