Whamcloud - gitweb
LU-12233 lnet: deadlock on LNet shutdown
[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]]*/  2> /dev/null | 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]]*/ 2> /dev/null | 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_spl=no
352                                 enable_zfs=no
353                                 require_zfs=no
354                         ], [test x$withval = xyes], [
355                                 enable_spl=yes
356                                 enable_zfs=yes
357                                 require_zfs=yes
358                         ], [
359                                 enable_spl=yes
360                                 enable_zfs=yes
361                                 require_zfs=yes
362                                 zfssrc="$withval"
363                         ])
364                 ], [
365                         AS_IF([test x$enable_server != xno], [
366                                 enable_spl=yes
367                                 require_zfs=no
368                                 enable_zfs=yes
369                         ], [
370                                 enable_spl=no
371                                 require_zfs=no
372                                 enable_zfs=no
373                         ])
374                 ])
375
376         AC_MSG_CHECKING([whether to enable zfs])
377         AC_MSG_RESULT([$enable_zfs])
378
379         AS_IF([test x$enable_zfs = xyes], [
380                 AS_IF([test x$enable_modules = xyes], [
381                         LB_ZFS
382                 ])
383                 LB_ZFS_DEVEL
384                 LB_ZFS_USER
385
386                 dnl #
387                 dnl # Define zfs source code version
388                 dnl #
389                 ZFS_MAJOR=$(echo $zfsver | sed -re ['s/([0-9]+)\.([0-9]+)\.([0-9]+)(\.([0-9]+))?.*/\1/'])
390                 ZFS_MINOR=$(echo $zfsver | sed -re ['s/([0-9]+)\.([0-9]+)\.([0-9]+)(\.([0-9]+))?.*/\2/'])
391                 ZFS_PATCH=$(echo $zfsver | sed -re ['s/([0-9]+)\.([0-9]+)\.([0-9]+)(\.([0-9]+))?.*/\3/'])
392                 ZFS_FIX=$(echo $zfsver   | sed -re ['s/([0-9]+)\.([0-9]+)\.([0-9]+)(\.([0-9]+))?.*/\5/'])
393                 AS_IF([test -z "$ZFS_FIX"], [ZFS_FIX="0"])
394
395                 AC_DEFINE_UNQUOTED([ZFS_MAJOR], [$ZFS_MAJOR], [zfs major version])
396                 AC_DEFINE_UNQUOTED([ZFS_MINOR], [$ZFS_MINOR], [zfs minor version])
397                 AC_DEFINE_UNQUOTED([ZFS_PATCH], [$ZFS_PATCH], [zfs patch version])
398                 AC_DEFINE_UNQUOTED([ZFS_FIX],   [$ZFS_FIX],   [zfs fix version])
399
400                 dnl #
401                 dnl # SPL is only needed if ZFS is prior to 0.8.0
402                 dnl #
403                 AS_IF([test x$enable_modules = xyes && test $ZFS_MAJOR -eq 0 && test $ZFS_MINOR -lt 8], [
404                         LB_SPL
405                 ],[
406                         enable_spl=no
407                 ])
408
409                 dnl #
410                 dnl # enable_zfs will be set to no in LB_SPL or LB_ZFS if
411                 dnl # one of more of the build requirements is not met.
412                 dnl #
413                 AS_IF([test x$enable_zfs = xyes], [
414                         AC_DEFINE(HAVE_ZFS_OSD, 1, Enable zfs osd)
415                 ],[
416                         AS_IF([test x$require_zfs = xyes], [
417                                 AC_MSG_ERROR([
418
419 Required zfs osd cannot be built due to missing zfs development headers.
420
421 Support for zfs can be enabled by downloading the required packages for your
422 distribution.  See http://zfsonlinux.org/ to determine is zfs is supported by
423 your distribution.
424                                 ])
425                         ], [
426                                 AC_MSG_WARN([
427
428 Disabling optional zfs osd due to missing development headers.
429
430 Support for zfs can be enabled by downloading the required packages for your
431 distribution.  See http://zfsonlinux.org/ to determine is zfs is supported by
432 your distribution.
433                                 ])
434                         ])
435                 ])
436         ])
437
438
439         AS_IF([test "x$enable_zfs" = xyes], [
440                 LB_CHECK_COMPILE([if zfs defines dsl_pool_config_enter/exit],
441                 dsl_pool_config_enter, [
442                         #include <sys/dsl_pool.h>
443                 ],[
444                         dsl_pool_config_enter(NULL, FTAG);
445                 ],[
446                         AC_DEFINE(HAVE_DSL_POOL_CONFIG, 1,
447                                 [Have dsl_pool_config_enter/exit in ZFS])
448                 ])
449                 LB_CHECK_COMPILE([if zfs defines dsl_sync_task_do_nowait],
450                 dsl_sync_task_do_nowait, [
451                         #include <sys/dsl_synctask.h>
452                 ],[
453                         dsl_sync_task_do_nowait(NULL, NULL, NULL, NULL, NULL, 0, NULL);
454                 ],[
455                         AC_DEFINE(HAVE_DSL_SYNC_TASK_DO_NOWAIT, 1,
456                                 [Have dsl_sync_task_do_nowait in ZFS])
457                 ])
458                 LB_CHECK_COMPILE([if zfs defines sa_spill_alloc],
459                 sa_spill_alloc, [
460                         #include <sys/kmem.h>
461                         #include <sys/sa.h>
462                 ],[
463                         void *ptr;
464
465                         ptr = sa_spill_alloc(KM_SLEEP);
466                         sa_spill_free(ptr);
467                 ],[
468                         AC_DEFINE(HAVE_SA_SPILL_ALLOC, 1,
469                                 [Have sa_spill_alloc in ZFS])
470                 ])
471                 LB_CHECK_COMPILE([if zfs defines spa_maxblocksize],
472                 spa_maxblocksize, [
473                         #include <sys/spa.h>
474                 ],[
475                         spa_t *spa = NULL;
476                         int size;
477
478                         size = spa_maxblocksize(spa);
479                 ],[
480                         AC_DEFINE(HAVE_SPA_MAXBLOCKSIZE, 1,
481                                 [Have spa_maxblocksize in ZFS])
482                 ])
483
484                 dnl #
485                 dnl # ZFS 0.7.x adds support for large dnodes.  This
486                 dnl # allows Lustre to optionally specify the size of a
487                 dnl # dnode which ZFS will then use to store metadata such
488                 dnl # as xattrs. The default dnode size specified by the
489                 dnl # 'dnodesize' dataset property will be used unless a
490                 dnl # specific value is provided.
491                 dnl #
492                 LB_CHECK_COMPILE([if zfs defines dmu_object_alloc_dnsize],
493                 dmu_object_alloc_dnsize, [
494                         #include <sys/dmu.h>
495                         #include <sys/dnode.h>
496                 ],[
497                         objset_t *os = NULL;
498                         dmu_object_type_t objtype = DMU_OT_NONE;
499                         int blocksize = 0;
500                         dmu_object_type_t bonustype = DMU_OT_SA;
501                         int dnodesize = DNODE_MIN_SIZE;
502                         dmu_tx_t *tx = NULL;
503                         uint64_t id;
504
505                         id = dmu_object_alloc_dnsize(os, objtype, blocksize,
506                                                      bonustype,
507                                                      DN_BONUS_SIZE(dnodesize),
508                                                      dnodesize, tx);
509                 ],[
510                         AC_DEFINE(HAVE_DMU_OBJECT_ALLOC_DNSIZE, 1,
511                                 [Have dmu_object_alloc_dnsize in ZFS])
512                 ])
513
514                 dnl #
515                 dnl # ZFS 0.7.x extended dmu_prefetch() to take an additional
516                 dnl # 'level' and 'priority' argument.  Use a level of 0 and a
517                 dnl # priority of ZIO_PRIORITY_SYNC_READ to replicate the
518                 dnl # behavior of the four argument version.
519                 dnl #
520                 LB_CHECK_COMPILE([if ZFS has 'dmu_prefetch' with 6 args],
521                 dmu_prefetch, [
522                         #include <sys/dmu.h>
523                 ],[
524                         objset_t *os = NULL;
525                         uint64_t object = 0;
526                         int64_t level = 0;
527                         uint64_t offset = 0;
528                         uint64_t len = 0;
529                         enum zio_priority pri = ZIO_PRIORITY_SYNC_READ;
530
531                         dmu_prefetch(os, object, level, offset, len, pri);
532                 ],[
533                         AC_DEFINE(HAVE_DMU_PREFETCH_6ARG, 1,
534                                 [Have 6 argument dmu_pretch in ZFS])
535                 ])
536                 dnl #
537                 dnl # ZFS 0.7.0 feature: SPA_FEATURE_USEROBJ_ACCOUNTING
538                 dnl #
539                 LB_CHECK_COMPILE([if ZFS has native dnode accounting supported],
540                 dmu_objset_userobjused_enabled, [
541                         #include <sys/dmu_objset.h>
542                 ],[
543                         dmu_objset_userobjused_enabled(NULL);
544                 ],[
545                         AC_DEFINE(HAVE_DMU_USEROBJ_ACCOUNTING, 1,
546                                 [Have native dnode accounting in ZFS])
547                 ])
548                 dnl #
549                 dnl # ZFS 0.7.0 feature: MULTIHOST
550                 dnl #
551                 LB_CHECK_COMPILE([if ZFS has multihost protection],
552                 spa_multihost, [
553                         #include <sys/spa.h>
554                 ],[
555                         spa_multihost(NULL);
556                 ],[
557                         AC_DEFINE(HAVE_ZFS_MULTIHOST, 1,
558                                 [Have multihost protection in ZFS])
559                 ])
560                 dnl #
561                 dnl # ZFS 0.7.x adds new method zap_lookup_by_dnode
562                 dnl #
563                 LB_CHECK_COMPILE([if ZFS has 'zap_lookup_by_dnode'],
564                 zap_lookup_by_dnode, [
565                         #include <sys/zap.h>
566                         #include <sys/dnode.h>
567                 ],[
568                         dnode_t *dn = NULL;
569                         zap_lookup_by_dnode(dn, NULL, 1, 1, NULL);
570                 ],[
571                         AC_DEFINE(HAVE_ZAP_LOOKUP_BY_DNODE, 1,
572                                 [Have zap_lookup_by_dnode() in ZFS])
573                 ])
574                 dnl #
575                 dnl # ZFS 0.7.x adds new method zap_add_by_dnode
576                 dnl #
577                 LB_CHECK_COMPILE([if ZFS has 'zap_add_by_dnode'],
578                 zap_add_by_dnode, [
579                         #include <sys/zap.h>
580                         #include <sys/dnode.h>
581                 ],[
582                         dnode_t *dn = NULL;
583                         zap_add_by_dnode(dn, NULL, 1, 1, NULL, NULL);
584                 ],[
585                         AC_DEFINE(HAVE_ZAP_ADD_BY_DNODE, 1,
586                                 [Have zap_add_by_dnode() in ZFS])
587                 ])
588                 dnl #
589                 dnl # ZFS 0.7.x adds new method zap_remove_by_dnode
590                 dnl #
591                 LB_CHECK_COMPILE([if ZFS has 'zap_remove_by_dnode'],
592                 zap_remove_by_dnode, [
593                         #include <sys/zap.h>
594                         #include <sys/dnode.h>
595                 ],[
596                         dnode_t *dn = NULL;
597                         zap_remove_by_dnode(dn, NULL, NULL);
598                 ],[
599                         AC_DEFINE(HAVE_ZAP_REMOVE_ADD_BY_DNODE, 1,
600                                 [Have zap_remove_by_dnode() in ZFS])
601                 ])
602                 dnl #
603                 dnl # ZFS 0.7.x adds new method dmu_tx_hold_zap_by_dnode
604                 dnl #
605                 LB_CHECK_COMPILE([if ZFS has 'dmu_tx_hold_zap_by_dnode'],
606                 dmu_tx_hold_zap_by_dnode, [
607                         #include <sys/zap.h>
608                         #include <sys/dnode.h>
609                 ],[
610                         dnode_t *dn = NULL;
611                         dmu_tx_hold_zap_by_dnode(NULL, dn, TRUE, NULL);
612                 ],[
613                         AC_DEFINE(HAVE_DMU_TX_HOLD_ZAP_BY_DNODE, 1,
614                                 [Have dmu_tx_hold_zap_by_dnode() in ZFS])
615                 ])
616                 dnl #
617                 dnl # ZFS 0.7.x adds new method dmu_tx_hold_write_by_dnode
618                 dnl #
619                 LB_CHECK_COMPILE([if ZFS has 'dmu_tx_hold_write_by_dnode'],
620                 dmu_tx_hold_write_by_dnode, [
621                         #include <sys/zap.h>
622                         #include <sys/dnode.h>
623                 ],[
624                         dnode_t *dn = NULL;
625                         dmu_tx_hold_write_by_dnode(NULL, dn, 0, 0);
626                 ],[
627                         AC_DEFINE(HAVE_DMU_TX_HOLD_WRITE_BY_DNODE, 1,
628                                 [Have dmu_tx_hold_write_by_dnode() in ZFS])
629                 ])
630                 dnl #
631                 dnl # ZFS 0.7.x adds new method dmu_write_by_dnode
632                 dnl #
633                 LB_CHECK_COMPILE([if ZFS has 'dmu_write_by_dnode'],
634                 dmu_write_by_dnode, [
635                         #include <sys/zap.h>
636                         #include <sys/dnode.h>
637                 ],[
638                         dnode_t *dn = NULL;
639                         dmu_write_by_dnode(dn, 0, 0, NULL, NULL);
640                 ],[
641                         AC_DEFINE(HAVE_DMU_WRITE_BY_DNODE, 1,
642                                 [Have dmu_write_by_dnode() in ZFS])
643                 ])
644                 dnl #
645                 dnl # ZFS 0.7.x adds new method dmu_read_by_dnode
646                 dnl #
647                 LB_CHECK_COMPILE([if ZFS has 'dmu_read_by_dnode'],
648                 dmu_read_by_dnode, [
649                         #include <sys/zap.h>
650                         #include <sys/dnode.h>
651                 ],[
652                         dnode_t *dn = NULL;
653                         dmu_read_by_dnode(dn, 0, 0, NULL, 0);
654                 ],[
655                         AC_DEFINE(HAVE_DMU_READ_BY_DNODE, 1,
656                                 [Have dmu_read_by_dnode() in ZFS])
657                 ])
658                 dnl #
659                 dnl # ZFS 0.7.2 adds new method dmu_tx_mark_netfree
660                 dnl #
661                 LB_CHECK_COMPILE([if ZFS has 'dmu_tx_mark_netfree'],
662                 dmu_tx_mark_netfree, [
663                         #include <sys/dmu.h>
664                 ],[
665                         dmu_tx_t *tx = NULL;
666                         dmu_tx_mark_netfree(tx);
667                 ],[
668                         AC_DEFINE(HAVE_DMU_TX_MARK_NETFREE, 1,
669                                 [Have dmu_tx_mark_netfree])
670                 ])
671                 dnl #
672                 dnl # ZFS 0.7.10 changes timestruc_t to inode_timespec_t
673                 dnl #
674                 LB_CHECK_COMPILE([if SPL has 'inode_timespec_t'],
675                 zfs_have_inode_timespec, [
676                         #include <sys/fs/zfs.h>
677                 ],[
678                         inode_timespec_t now;
679                         gethrestime(&now);
680                 ],[
681                         AC_DEFINE(HAVE_ZFS_INODE_TIMESPEC, 1,
682                                 [Have inode_timespec_t])
683                 ])
684                 dnl # ZFS 0.7.12/0.8.x uses zfs_refcount_add() instead of
685                 dnl # refcount_add().
686                 dnl #
687                 LB_CHECK_COMPILE([if ZFS has 'zfs_refcount_add'],
688                 zfs_refcount_add, [
689                         #include <sys/refcount.h>
690                 ],[
691                         zfs_refcount_add((zfs_refcount_t *) NULL, NULL);
692                 ],[
693                         AC_DEFINE(HAVE_ZFS_REFCOUNT_ADD, 1,
694                                 [Have zfs_refcount_add])
695                 ])
696                 dnl #
697                 dnl # ZFS 0.8.x changes dmu_objset_own for encryption
698                 dnl #
699                 LB_CHECK_COMPILE([if ZFS has 'dmu_objset_own' with 6 args],
700                 dmu_objset_own, [
701                         #include <sys/dmu_objset.h>
702                 ],[
703                         objset_t *os = NULL;
704                         dmu_objset_type_t type = DMU_OST_ANY;
705                         dmu_objset_own(NULL, type, B_FALSE, B_TRUE, FTAG, &os);
706                 ],[
707                         AC_DEFINE(HAVE_DMU_OBJSET_OWN_6ARG, 1,
708                                 [Have dmu_objset_own() with 6 args])
709                 ])
710                 dnl #
711                 dnl # ZFS 0.8.x changes dmu_objset_disown for encryption
712                 dnl #
713                 LB_CHECK_COMPILE([if ZFS has 'dmu_objset_disown' with 3 args],
714                 dmu_objset_disown, [
715                         #include <sys/dmu_objset.h>
716                 ],[
717                         objset_t *os = NULL;
718                         dmu_objset_disown(os, B_TRUE, FTAG);
719                 ],[
720                         AC_DEFINE(HAVE_DMU_OBJSET_DISOWN_3ARG, 1,
721                                 [Have dmu_objset_disown() with 3 args])
722                 ])
723         ])
724
725         AS_IF([test "x$enable_zfs" = xyes], [
726                 AC_SUBST(ENABLE_ZFS, yes)
727         ], [
728                 AC_SUBST(ENABLE_ZFS, no)
729         ])
730         AM_CONDITIONAL(ZFS_ENABLED, [test "x$enable_zfs" = xyes])
731         AM_CONDITIONAL(SPL_ENABLED, [test "x$enable_spl" = xyes])
732 ])