1dnl # 2dnl # Default ZFS kernel configuration 3dnl # 4AC_DEFUN([ZFS_AC_CONFIG_KERNEL], [ 5 AM_COND_IF([BUILD_LINUX], [ 6 dnl # Setup the kernel build environment. 7 ZFS_AC_KERNEL 8 ZFS_AC_QAT 9 10 dnl # Sanity checks for module building and CONFIG_* defines 11 ZFS_AC_KERNEL_CONFIG_DEFINED 12 ZFS_AC_MODULE_SYMVERS 13 14 dnl # Sequential ZFS_LINUX_TRY_COMPILE tests 15 ZFS_AC_KERNEL_FPU_HEADER 16 ZFS_AC_KERNEL_OBJTOOL_HEADER 17 ZFS_AC_KERNEL_MISC_MINOR 18 ZFS_AC_KERNEL_DECLARE_EVENT_CLASS 19 20 dnl # Parallel ZFS_LINUX_TEST_SRC / ZFS_LINUX_TEST_RESULT tests 21 ZFS_AC_KERNEL_TEST_SRC 22 ZFS_AC_KERNEL_TEST_RESULT 23 24 AS_IF([test "$LINUX_OBJ" != "$LINUX"], [ 25 KERNEL_MAKE="$KERNEL_MAKE O=$LINUX_OBJ" 26 ]) 27 28 AC_SUBST(KERNEL_MAKE) 29 ]) 30]) 31 32dnl # 33dnl # Generate and compile all of the kernel API test cases to determine 34dnl # which interfaces are available. By invoking the kernel build system 35dnl # only once the compilation can be done in parallel significantly 36dnl # speeding up the process. 37dnl # 38AC_DEFUN([ZFS_AC_KERNEL_TEST_SRC], [ 39 ZFS_AC_KERNEL_SRC_TYPES 40 ZFS_AC_KERNEL_SRC_OBJTOOL 41 ZFS_AC_KERNEL_SRC_ACCESS_OK_TYPE 42 ZFS_AC_KERNEL_SRC_PDE_DATA 43 ZFS_AC_KERNEL_SRC_GENERIC_FADVISE 44 ZFS_AC_KERNEL_SRC_SCHED 45 ZFS_AC_KERNEL_SRC_USLEEP_RANGE 46 ZFS_AC_KERNEL_SRC_VMALLOC_PAGE_KERNEL 47 ZFS_AC_KERNEL_SRC_INODE_TIMES 48 ZFS_AC_KERNEL_SRC_PROC_OPERATIONS 49 ZFS_AC_KERNEL_SRC_BLOCK_DEVICE_OPERATIONS 50 ZFS_AC_KERNEL_SRC_BIO 51 ZFS_AC_KERNEL_SRC_BLKDEV 52 ZFS_AC_KERNEL_SRC_BLK_QUEUE 53 ZFS_AC_KERNEL_SRC_GENHD_FLAGS 54 ZFS_AC_KERNEL_SRC_REVALIDATE_DISK 55 ZFS_AC_KERNEL_SRC_GET_DISK_RO 56 ZFS_AC_KERNEL_SRC_DISCARD_GRANULARITY 57 ZFS_AC_KERNEL_SRC_INODE_OWNER_OR_CAPABLE 58 ZFS_AC_KERNEL_SRC_XATTR 59 ZFS_AC_KERNEL_SRC_ACL 60 ZFS_AC_KERNEL_SRC_INODE_SETATTR 61 ZFS_AC_KERNEL_SRC_INODE_GETATTR 62 ZFS_AC_KERNEL_SRC_SHOW_OPTIONS 63 ZFS_AC_KERNEL_SRC_SHRINKER 64 ZFS_AC_KERNEL_SRC_MKDIR 65 ZFS_AC_KERNEL_SRC_LOOKUP_FLAGS 66 ZFS_AC_KERNEL_SRC_CREATE 67 ZFS_AC_KERNEL_SRC_PERMISSION 68 ZFS_AC_KERNEL_SRC_TMPFILE 69 ZFS_AC_KERNEL_SRC_AUTOMOUNT 70 ZFS_AC_KERNEL_SRC_COMMIT_METADATA 71 ZFS_AC_KERNEL_SRC_SETATTR_PREPARE 72 ZFS_AC_KERNEL_SRC_INSERT_INODE_LOCKED 73 ZFS_AC_KERNEL_SRC_DENTRY 74 ZFS_AC_KERNEL_SRC_TRUNCATE_SETSIZE 75 ZFS_AC_KERNEL_SRC_SECURITY_INODE 76 ZFS_AC_KERNEL_SRC_FST_MOUNT 77 ZFS_AC_KERNEL_SRC_SB_DYING 78 ZFS_AC_KERNEL_SRC_SET_NLINK 79 ZFS_AC_KERNEL_SRC_SGET 80 ZFS_AC_KERNEL_SRC_VFS_FILEMAP_DIRTY_FOLIO 81 ZFS_AC_KERNEL_SRC_VFS_READ_FOLIO 82 ZFS_AC_KERNEL_SRC_VFS_MIGRATE_FOLIO 83 ZFS_AC_KERNEL_SRC_VFS_MIGRATEPAGE 84 ZFS_AC_KERNEL_SRC_VFS_FSYNC_2ARGS 85 ZFS_AC_KERNEL_SRC_VFS_READPAGES 86 ZFS_AC_KERNEL_SRC_VFS_WRITEPAGE 87 ZFS_AC_KERNEL_SRC_VFS_SET_PAGE_DIRTY_NOBUFFERS 88 ZFS_AC_KERNEL_SRC_VFS_IOV_ITER 89 ZFS_AC_KERNEL_SRC_VFS_GENERIC_COPY_FILE_RANGE 90 ZFS_AC_KERNEL_SRC_VFS_SPLICE_COPY_FILE_RANGE 91 ZFS_AC_KERNEL_SRC_VFS_REMAP_FILE_RANGE 92 ZFS_AC_KERNEL_SRC_VFS_CLONE_FILE_RANGE 93 ZFS_AC_KERNEL_SRC_VFS_DEDUPE_FILE_RANGE 94 ZFS_AC_KERNEL_SRC_KMAP_ATOMIC_ARGS 95 ZFS_AC_KERNEL_SRC_KMAP_LOCAL_PAGE 96 ZFS_AC_KERNEL_SRC_FOLLOW_DOWN_ONE 97 ZFS_AC_KERNEL_SRC_MAKE_REQUEST_FN 98 ZFS_AC_KERNEL_SRC_GENERIC_IO_ACCT 99 ZFS_AC_KERNEL_SRC_FPU 100 ZFS_AC_KERNEL_SRC_FMODE_T 101 ZFS_AC_KERNEL_SRC_KUIDGID_T 102 ZFS_AC_KERNEL_SRC_KUID_HELPERS 103 ZFS_AC_KERNEL_SRC_RENAME 104 ZFS_AC_KERNEL_SRC_TOTALRAM_PAGES_FUNC 105 ZFS_AC_KERNEL_SRC_TOTALHIGH_PAGES 106 ZFS_AC_KERNEL_SRC_PERCPU 107 ZFS_AC_KERNEL_SRC_GENERIC_FILLATTR 108 ZFS_AC_KERNEL_SRC_MKNOD 109 ZFS_AC_KERNEL_SRC_SYMLINK 110 ZFS_AC_KERNEL_SRC_BIO_MAX_SEGS 111 ZFS_AC_KERNEL_SRC_SIGINFO 112 ZFS_AC_KERNEL_SRC_SYSFS 113 ZFS_AC_KERNEL_SRC_STANDALONE_LINUX_STDARG 114 ZFS_AC_KERNEL_SRC_STRLCPY 115 ZFS_AC_KERNEL_SRC_PAGEMAP_FOLIO_WAIT_BIT 116 ZFS_AC_KERNEL_SRC_PAGEMAP_READAHEAD_PAGE 117 ZFS_AC_KERNEL_SRC_ADD_DISK 118 ZFS_AC_KERNEL_SRC_KTHREAD 119 ZFS_AC_KERNEL_SRC_ZERO_PAGE 120 ZFS_AC_KERNEL_SRC___COPY_FROM_USER_INATOMIC 121 ZFS_AC_KERNEL_SRC_IDMAP_MNT_API 122 ZFS_AC_KERNEL_SRC_IDMAP_NO_USERNS 123 ZFS_AC_KERNEL_SRC_IATTR_VFSID 124 ZFS_AC_KERNEL_SRC_WRITEBACK 125 ZFS_AC_KERNEL_SRC_RECLAIMED 126 ZFS_AC_KERNEL_SRC_REGISTER_SYSCTL_TABLE 127 ZFS_AC_KERNEL_SRC_REGISTER_SYSCTL_SZ 128 ZFS_AC_KERNEL_SRC_PROC_HANDLER_CTL_TABLE_CONST 129 ZFS_AC_KERNEL_SRC_COPY_SPLICE_READ 130 ZFS_AC_KERNEL_SRC_SYNC_BDEV 131 ZFS_AC_KERNEL_SRC_MM_PAGE_FLAGS 132 ZFS_AC_KERNEL_SRC_MM_PAGE_SIZE 133 ZFS_AC_KERNEL_SRC_MM_PAGE_MAPPING 134 ZFS_AC_KERNEL_SRC_FILE 135 ZFS_AC_KERNEL_SRC_PIN_USER_PAGES 136 ZFS_AC_KERNEL_SRC_TIMER 137 ZFS_AC_KERNEL_SRC_SUPER_BLOCK_S_WB_ERR 138 ZFS_AC_KERNEL_SRC_SOPS_FREE_INODE 139 ZFS_AC_KERNEL_SRC_NAMESPACE 140 ZFS_AC_KERNEL_SRC_INODE_GENERIC_DROP 141 ZFS_AC_KERNEL_SRC_KASAN_ENABLED 142 case "$host_cpu" in 143 powerpc*) 144 ZFS_AC_KERNEL_SRC_CPU_HAS_FEATURE 145 ZFS_AC_KERNEL_SRC_FLUSH_DCACHE_PAGE 146 ;; 147 riscv*) 148 ZFS_AC_KERNEL_SRC_FLUSH_DCACHE_PAGE 149 ;; 150 esac 151 152 AC_MSG_CHECKING([for available kernel interfaces]) 153 ZFS_LINUX_TEST_COMPILE_ALL([kabi]) 154 AC_MSG_RESULT([done]) 155]) 156 157dnl # 158dnl # Check results of kernel interface tests. 159dnl # 160AC_DEFUN([ZFS_AC_KERNEL_TEST_RESULT], [ 161 ZFS_AC_KERNEL_TYPES 162 ZFS_AC_KERNEL_ACCESS_OK_TYPE 163 ZFS_AC_KERNEL_OBJTOOL 164 ZFS_AC_KERNEL_PDE_DATA 165 ZFS_AC_KERNEL_GENERIC_FADVISE 166 ZFS_AC_KERNEL_SCHED 167 ZFS_AC_KERNEL_USLEEP_RANGE 168 ZFS_AC_KERNEL_VMALLOC_PAGE_KERNEL 169 ZFS_AC_KERNEL_INODE_TIMES 170 ZFS_AC_KERNEL_PROC_OPERATIONS 171 ZFS_AC_KERNEL_BLOCK_DEVICE_OPERATIONS 172 ZFS_AC_KERNEL_BIO 173 ZFS_AC_KERNEL_BLKDEV 174 ZFS_AC_KERNEL_BLK_QUEUE 175 ZFS_AC_KERNEL_GENHD_FLAGS 176 ZFS_AC_KERNEL_REVALIDATE_DISK 177 ZFS_AC_KERNEL_GET_DISK_RO 178 ZFS_AC_KERNEL_DISCARD_GRANULARITY 179 ZFS_AC_KERNEL_INODE_OWNER_OR_CAPABLE 180 ZFS_AC_KERNEL_XATTR 181 ZFS_AC_KERNEL_ACL 182 ZFS_AC_KERNEL_INODE_SETATTR 183 ZFS_AC_KERNEL_INODE_GETATTR 184 ZFS_AC_KERNEL_SHOW_OPTIONS 185 ZFS_AC_KERNEL_SHRINKER 186 ZFS_AC_KERNEL_MKDIR 187 ZFS_AC_KERNEL_LOOKUP_FLAGS 188 ZFS_AC_KERNEL_CREATE 189 ZFS_AC_KERNEL_PERMISSION 190 ZFS_AC_KERNEL_TMPFILE 191 ZFS_AC_KERNEL_AUTOMOUNT 192 ZFS_AC_KERNEL_COMMIT_METADATA 193 ZFS_AC_KERNEL_SETATTR_PREPARE 194 ZFS_AC_KERNEL_INSERT_INODE_LOCKED 195 ZFS_AC_KERNEL_DENTRY 196 ZFS_AC_KERNEL_TRUNCATE_SETSIZE 197 ZFS_AC_KERNEL_SECURITY_INODE 198 ZFS_AC_KERNEL_FST_MOUNT 199 ZFS_AC_KERNEL_SB_DYING 200 ZFS_AC_KERNEL_SET_NLINK 201 ZFS_AC_KERNEL_SGET 202 ZFS_AC_KERNEL_VFS_FILEMAP_DIRTY_FOLIO 203 ZFS_AC_KERNEL_VFS_READ_FOLIO 204 ZFS_AC_KERNEL_VFS_MIGRATE_FOLIO 205 ZFS_AC_KERNEL_VFS_MIGRATEPAGE 206 ZFS_AC_KERNEL_VFS_FSYNC_2ARGS 207 ZFS_AC_KERNEL_VFS_READPAGES 208 ZFS_AC_KERNEL_VFS_WRITEPAGE 209 ZFS_AC_KERNEL_VFS_SET_PAGE_DIRTY_NOBUFFERS 210 ZFS_AC_KERNEL_VFS_IOV_ITER 211 ZFS_AC_KERNEL_VFS_GENERIC_COPY_FILE_RANGE 212 ZFS_AC_KERNEL_VFS_SPLICE_COPY_FILE_RANGE 213 ZFS_AC_KERNEL_VFS_REMAP_FILE_RANGE 214 ZFS_AC_KERNEL_VFS_CLONE_FILE_RANGE 215 ZFS_AC_KERNEL_VFS_DEDUPE_FILE_RANGE 216 ZFS_AC_KERNEL_KMAP_ATOMIC_ARGS 217 ZFS_AC_KERNEL_KMAP_LOCAL_PAGE 218 ZFS_AC_KERNEL_FOLLOW_DOWN_ONE 219 ZFS_AC_KERNEL_MAKE_REQUEST_FN 220 ZFS_AC_KERNEL_GENERIC_IO_ACCT 221 ZFS_AC_KERNEL_FPU 222 ZFS_AC_KERNEL_FMODE_T 223 ZFS_AC_KERNEL_KUIDGID_T 224 ZFS_AC_KERNEL_KUID_HELPERS 225 ZFS_AC_KERNEL_RENAME 226 ZFS_AC_KERNEL_TOTALRAM_PAGES_FUNC 227 ZFS_AC_KERNEL_TOTALHIGH_PAGES 228 ZFS_AC_KERNEL_PERCPU 229 ZFS_AC_KERNEL_GENERIC_FILLATTR 230 ZFS_AC_KERNEL_MKNOD 231 ZFS_AC_KERNEL_SYMLINK 232 ZFS_AC_KERNEL_BIO_MAX_SEGS 233 ZFS_AC_KERNEL_SIGINFO 234 ZFS_AC_KERNEL_SYSFS 235 ZFS_AC_KERNEL_STANDALONE_LINUX_STDARG 236 ZFS_AC_KERNEL_STRLCPY 237 ZFS_AC_KERNEL_PAGEMAP_FOLIO_WAIT_BIT 238 ZFS_AC_KERNEL_PAGEMAP_READAHEAD_PAGE 239 ZFS_AC_KERNEL_ADD_DISK 240 ZFS_AC_KERNEL_KTHREAD 241 ZFS_AC_KERNEL_ZERO_PAGE 242 ZFS_AC_KERNEL___COPY_FROM_USER_INATOMIC 243 ZFS_AC_KERNEL_IDMAP_MNT_API 244 ZFS_AC_KERNEL_IDMAP_NO_USERNS 245 ZFS_AC_KERNEL_IATTR_VFSID 246 ZFS_AC_KERNEL_WRITEBACK 247 ZFS_AC_KERNEL_RECLAIMED 248 ZFS_AC_KERNEL_REGISTER_SYSCTL_TABLE 249 ZFS_AC_KERNEL_REGISTER_SYSCTL_SZ 250 ZFS_AC_KERNEL_PROC_HANDLER_CTL_TABLE_CONST 251 ZFS_AC_KERNEL_COPY_SPLICE_READ 252 ZFS_AC_KERNEL_SYNC_BDEV 253 ZFS_AC_KERNEL_MM_PAGE_FLAGS 254 ZFS_AC_KERNEL_MM_PAGE_SIZE 255 ZFS_AC_KERNEL_MM_PAGE_MAPPING 256 ZFS_AC_KERNEL_1ARG_ASSIGN_STR 257 ZFS_AC_KERNEL_FILE 258 ZFS_AC_KERNEL_PIN_USER_PAGES 259 ZFS_AC_KERNEL_TIMER 260 ZFS_AC_KERNEL_SUPER_BLOCK_S_WB_ERR 261 ZFS_AC_KERNEL_SOPS_FREE_INODE 262 ZFS_AC_KERNEL_NAMESPACE 263 ZFS_AC_KERNEL_INODE_GENERIC_DROP 264 ZFS_AC_KERNEL_KASAN_ENABLED 265 case "$host_cpu" in 266 powerpc*) 267 ZFS_AC_KERNEL_CPU_HAS_FEATURE 268 ZFS_AC_KERNEL_FLUSH_DCACHE_PAGE 269 ;; 270 riscv*) 271 ZFS_AC_KERNEL_FLUSH_DCACHE_PAGE 272 ;; 273 esac 274]) 275 276dnl # 277dnl # Detect name used for Module.symvers file in kernel 278dnl # 279AC_DEFUN([ZFS_AC_MODULE_SYMVERS], [ 280 modpost=$LINUX/scripts/Makefile.modpost 281 AC_MSG_CHECKING([kernel file name for module symbols]) 282 AS_IF([test "x$enable_linux_builtin" != xyes -a -f "$modpost"], [ 283 AS_IF([grep -q Modules.symvers $modpost], [ 284 LINUX_SYMBOLS=Modules.symvers 285 ], [ 286 LINUX_SYMBOLS=Module.symvers 287 ]) 288 289 AS_IF([test ! -f "$LINUX_OBJ/$LINUX_SYMBOLS"], [ 290 AC_MSG_ERROR([ 291 *** Please make sure the kernel devel package for your distribution 292 *** is installed. If you are building with a custom kernel, make sure 293 *** the kernel is configured, built, and the '--with-linux=PATH' 294 *** configure option refers to the location of the kernel source. 295 ]) 296 ]) 297 ], [ 298 LINUX_SYMBOLS=NONE 299 ]) 300 AC_MSG_RESULT($LINUX_SYMBOLS) 301 AC_SUBST(LINUX_SYMBOLS) 302]) 303 304dnl # 305dnl # Detect the kernel to be built against 306dnl # 307dnl # Most modern Linux distributions have separate locations for bare 308dnl # source (source) and prebuilt (build) files. Additionally, there are 309dnl # `source` and `build` symlinks in `/lib/modules/$(KERNEL_VERSION)` 310dnl # pointing to them. The directory search order is now: 311dnl # 312dnl # - `configure` command line values if both `--with-linux` and 313dnl # `--with-linux-obj` were defined 314dnl # 315dnl # - If only `--with-linux` was defined, `--with-linux-obj` is assumed 316dnl # to have the same value as `--with-linux` 317dnl # 318dnl # - If neither `--with-linux` nor `--with-linux-obj` were defined 319dnl # autodetection is used: 320dnl # 321dnl # - `/lib/modules/$(uname -r)/{source,build}` respectively, if exist. 322dnl # 323dnl # - If only `/lib/modules/$(uname -r)/build` exists, it is assumed 324dnl # to be both source and build directory. 325dnl # 326dnl # - The first directory in `/lib/modules` with the highest version 327dnl # number according to `sort -V` which contains both `source` and 328dnl # `build` symlinks/directories. If module directory contains only 329dnl # `build` component, it is assumed to be both source and build 330dnl # directory. 331dnl # 332dnl # - Last resort: the first directory matching `/usr/src/kernels/*` 333dnl # and `/usr/src/linux-*` with the highest version number according 334dnl # to `sort -V` is assumed to be both source and build directory. 335dnl # 336AC_DEFUN([ZFS_AC_KERNEL], [ 337 AC_ARG_WITH([linux], 338 AS_HELP_STRING([--with-linux=PATH], 339 [Path to kernel source]), 340 [kernelsrc="$withval"]) 341 342 AC_ARG_WITH(linux-obj, 343 AS_HELP_STRING([--with-linux-obj=PATH], 344 [Path to kernel build objects]), 345 [kernelbuild="$withval"]) 346 347 AC_MSG_CHECKING([kernel source and build directories]) 348 AS_IF([test -n "$kernelsrc" && test -z "$kernelbuild"], [ 349 kernelbuild="$kernelsrc" 350 ], [test -z "$kernelsrc"], [ 351 AS_IF([test -e "/lib/modules/$(uname -r)/source" && \ 352 test -e "/lib/modules/$(uname -r)/build"], [ 353 src="/lib/modules/$(uname -r)/source" 354 build="/lib/modules/$(uname -r)/build" 355 ], [test -e "/lib/modules/$(uname -r)/build"], [ 356 build="/lib/modules/$(uname -r)/build" 357 src="$build" 358 ], [ 359 src= 360 361 for d in $(ls -1d /lib/modules/* 2>/dev/null | sort -Vr); do 362 if test -e "$d/source" && test -e "$d/build"; then 363 src="$d/source" 364 build="$d/build" 365 break 366 fi 367 368 if test -e "$d/build"; then 369 src="$d/build" 370 build="$d/build" 371 break 372 fi 373 done 374 375 # the least reliable method 376 if test -z "$src"; then 377 src=$(ls -1d /usr/src/kernels/* /usr/src/linux-* \ 378 2>/dev/null | grep -v obj | sort -Vr | head -1) 379 build="$src" 380 fi 381 ]) 382 383 AS_IF([test -n "$src" && test -e "$src"], [ 384 kernelsrc=$(readlink -e "$src") 385 ], [ 386 kernelsrc="[Not found]" 387 ]) 388 AS_IF([test -n "$build" && test -e "$build"], [ 389 kernelbuild=$(readlink -e "$build") 390 ], [ 391 kernelbuild="[Not found]" 392 ]) 393 ], [ 394 AS_IF([test "$kernelsrc" = "NONE"], [ 395 kernsrcver=NONE 396 ]) 397 withlinux=yes 398 ]) 399 400 AC_MSG_RESULT([done]) 401 AC_MSG_CHECKING([kernel source directory]) 402 AC_MSG_RESULT([$kernelsrc]) 403 AC_MSG_CHECKING([kernel build directory]) 404 AC_MSG_RESULT([$kernelbuild]) 405 AS_IF([test ! -d "$kernelsrc" || test ! -d "$kernelbuild"], [ 406 AC_MSG_ERROR([ 407 *** Please make sure the kernel devel package for your distribution 408 *** is installed and then try again. If that fails, you can specify the 409 *** location of the kernel source and build with the '--with-linux=PATH' and 410 *** '--with-linux-obj=PATH' options respectively.]) 411 ]) 412 413 AC_MSG_CHECKING([kernel source version]) 414 utsrelease1=$kernelbuild/include/linux/version.h 415 utsrelease2=$kernelbuild/include/linux/utsrelease.h 416 utsrelease3=$kernelbuild/include/generated/utsrelease.h 417 AS_IF([test -r $utsrelease1 && grep -qF UTS_RELEASE $utsrelease1], [ 418 utsrelease=$utsrelease1 419 ], [test -r $utsrelease2 && grep -qF UTS_RELEASE $utsrelease2], [ 420 utsrelease=$utsrelease2 421 ], [test -r $utsrelease3 && grep -qF UTS_RELEASE $utsrelease3], [ 422 utsrelease=$utsrelease3 423 ]) 424 425 AS_IF([test -n "$utsrelease"], [ 426 kernsrcver=$($AWK '/UTS_RELEASE/ { gsub(/"/, "", $[3]); print $[3] }' $utsrelease) 427 AS_IF([test -z "$kernsrcver"], [ 428 AC_MSG_RESULT([Not found]) 429 AC_MSG_ERROR([ 430 *** Cannot determine kernel version. 431 ]) 432 ]) 433 ], [ 434 AC_MSG_RESULT([Not found]) 435 if test "x$enable_linux_builtin" != xyes; then 436 AC_MSG_ERROR([ 437 *** Cannot find UTS_RELEASE definition. 438 ]) 439 else 440 AC_MSG_ERROR([ 441 *** Cannot find UTS_RELEASE definition. 442 *** Please run 'make prepare' inside the kernel source tree.]) 443 fi 444 ]) 445 446 AC_MSG_RESULT([$kernsrcver]) 447 448 AX_COMPARE_VERSION([$kernsrcver], [ge], [$ZFS_META_KVER_MIN], [], [ 449 AC_MSG_ERROR([ 450 *** Cannot build against kernel version $kernsrcver. 451 *** The minimum supported kernel version is $ZFS_META_KVER_MIN. 452 ]) 453 ]) 454 455 AC_ARG_ENABLE([linux-experimental], 456 AS_HELP_STRING([--enable-linux-experimental], 457 [Allow building against some unsupported kernel versions])) 458 459 AX_COMPARE_VERSION([$kernsrcver], [ge], [$ZFS_META_KVER_MAX], [ 460 AX_COMPARE_VERSION([$kernsrcver], [eq2], [$ZFS_META_KVER_MAX], [ 461 kern_max_version_ok=yes 462 ], [ 463 kern_max_version_ok=no 464 ]) 465 ], [ 466 kern_max_version_ok=yes 467 ]) 468 469 AS_IF([test "x$kern_max_version_ok" != "xyes"], [ 470 AS_IF([test "x$enable_linux_experimental" == "xyes"], [ 471 AC_DEFINE(HAVE_LINUX_EXPERIMENTAL, 1, 472 [building against unsupported kernel version]) 473 ], [ 474 AC_MSG_ERROR([ 475 *** Cannot build against kernel version $kernsrcver. 476 *** The maximum supported kernel version is $ZFS_META_KVER_MAX. 477 ]) 478 ]) 479 ]) 480 481 LINUX=${kernelsrc} 482 LINUX_OBJ=${kernelbuild} 483 LINUX_VERSION=${kernsrcver} 484 485 AC_SUBST(LINUX) 486 AC_SUBST(LINUX_OBJ) 487 AC_SUBST(LINUX_VERSION) 488 489 dnl # create a relatively unique numeric checksum based on the kernel 490 dnl # version and path. this is included in the cache key below, 491 dnl # allowing different cached values for different kernels 492 _zfs_linux_cache_checksum=$(echo ${kernelsrc} {$kernelbuild} ${kernsrcver} | cksum | cut -f1 -d' ') 493]) 494 495AC_DEFUN([ZFS_AC_KERNEL_VERSION_WARNING], [ 496 AS_IF([test "x$enable_linux_experimental" = "xyes" && \ 497 test "x$kern_max_version_ok" != "xyes"], [ 498 AC_MSG_WARN([ 499 500 You are building OpenZFS against Linux version $kernsrcver. 501 502 This combination is considered EXPERIMENTAL by the OpenZFS project. 503 Even if it appears to build and run correctly, there may be bugs that 504 can cause SERIOUS DATA LOSS. 505 506 YOU HAVE BEEN WARNED! 507 508 If you choose to continue, we'd appreciate if you could report your 509 results on the OpenZFS issue tracker at: 510 511 https://github.com/openzfs/zfs/issues/new 512 513 Your feedback will help us prepare a new OpenZFS release that supports 514 this version of Linux. 515 ]) 516 ]) 517]) 518 519dnl # 520dnl # Detect the QAT module to be built against, QAT provides hardware 521dnl # acceleration for data compression: 522dnl # 523dnl # https://01.org/intel-quickassist-technology 524dnl # 525dnl # 1) Download and install QAT driver from the above link 526dnl # 2) Start QAT driver in your system: 527dnl # service qat_service start 528dnl # 3) Enable QAT in ZFS, e.g.: 529dnl # ./configure --with-qat=<qat-driver-path>/QAT1.6 530dnl # make 531dnl # 4) Set GZIP compression in ZFS dataset: 532dnl # zfs set compression = gzip <dataset> 533dnl # 534dnl # Then the data written to this ZFS pool is compressed by QAT accelerator 535dnl # automatically, and de-compressed by QAT when read from the pool. 536dnl # 537dnl # 1) Get QAT hardware statistics with: 538dnl # cat /proc/icp_dh895xcc_dev/qat 539dnl # 2) To disable QAT: 540dnl # insmod zfs.ko zfs_qat_disable=1 541dnl # 542AC_DEFUN([ZFS_AC_QAT], [ 543 AC_ARG_WITH([qat], 544 AS_HELP_STRING([--with-qat=PATH], 545 [Path to qat source]), 546 AS_IF([test "$withval" = "yes"], 547 AC_MSG_ERROR([--with-qat=PATH requires a PATH]), 548 [qatsrc="$withval"])) 549 550 AC_ARG_WITH([qat-obj], 551 AS_HELP_STRING([--with-qat-obj=PATH], 552 [Path to qat build objects]), 553 [qatbuild="$withval"]) 554 555 AS_IF([test ! -z "${qatsrc}"], [ 556 AC_MSG_CHECKING([qat source directory]) 557 AC_MSG_RESULT([$qatsrc]) 558 QAT_SRC="${qatsrc}/quickassist" 559 AS_IF([ test ! -e "$QAT_SRC/include/cpa.h"], [ 560 AC_MSG_ERROR([ 561 *** Please make sure the qat driver package is installed 562 *** and specify the location of the qat source with the 563 *** '--with-qat=PATH' option then try again. Failed to 564 *** find cpa.h in: 565 ${QAT_SRC}/include]) 566 ]) 567 ]) 568 569 AS_IF([test ! -z "${qatsrc}"], [ 570 AC_MSG_CHECKING([qat build directory]) 571 AS_IF([test -z "$qatbuild"], [ 572 qatbuild="${qatsrc}/build" 573 ]) 574 575 AC_MSG_RESULT([$qatbuild]) 576 QAT_OBJ=${qatbuild} 577 AS_IF([ ! test -e "$QAT_OBJ/icp_qa_al.ko" && ! test -e "$QAT_OBJ/qat_api.ko"], [ 578 AC_MSG_ERROR([ 579 *** Please make sure the qat driver is installed then try again. 580 *** Failed to find icp_qa_al.ko or qat_api.ko in: 581 $QAT_OBJ]) 582 ]) 583 584 AC_SUBST(QAT_SRC) 585 AC_SUBST(QAT_OBJ) 586 587 AC_DEFINE(HAVE_QAT, 1, 588 [qat is enabled and existed]) 589 ]) 590 591 dnl # 592 dnl # Detect the name used for the QAT Module.symvers file. 593 dnl # 594 AS_IF([test ! -z "${qatsrc}"], [ 595 AC_MSG_CHECKING([qat file for module symbols]) 596 QAT_SYMBOLS=$QAT_SRC/lookaside/access_layer/src/Module.symvers 597 598 AS_IF([test -r $QAT_SYMBOLS], [ 599 AC_MSG_RESULT([$QAT_SYMBOLS]) 600 AC_SUBST(QAT_SYMBOLS) 601 ],[ 602 AC_MSG_ERROR([ 603 *** Please make sure the qat driver is installed then try again. 604 *** Failed to find Module.symvers in: 605 $QAT_SYMBOLS 606 ]) 607 ]) 608 ]) 609]) 610 611dnl # 612dnl # ZFS_LINUX_CONFTEST_H 613dnl # 614AC_DEFUN([ZFS_LINUX_CONFTEST_H], [ 615test -d build/$2 || mkdir -p build/$2 616cat - <<_ACEOF >build/$2/$2.h 617$1 618_ACEOF 619]) 620 621dnl # 622dnl # ZFS_LINUX_CONFTEST_C 623dnl # 624AC_DEFUN([ZFS_LINUX_CONFTEST_C], [ 625test -d build/$2 || mkdir -p build/$2 626cat confdefs.h - <<_ACEOF >build/$2/$2.c 627$1 628_ACEOF 629]) 630 631dnl # 632dnl # ZFS_LINUX_CONFTEST_MAKEFILE 633dnl # 634dnl # $1 - test case name 635dnl # $2 - add to top-level Makefile 636dnl # $3 - additional build flags 637dnl # 638AC_DEFUN([ZFS_LINUX_CONFTEST_MAKEFILE], [ 639 test -d build || mkdir -p build 640 test -d build/$1 || mkdir -p build/$1 641 642 file=build/$1/Makefile 643 644 dnl # Example command line to manually build source. 645 cat - <<_ACEOF >$file 646# Example command line to manually build source 647# make modules -C $LINUX_OBJ $ARCH_UM M=$PWD/build/$1 648 649ccflags-y := -Werror $FRAME_LARGER_THAN 650_ACEOF 651 652 dnl # Additional custom CFLAGS as requested. 653 m4_ifval($3, [echo "ccflags-y += $3" >>$file], []) 654 655 dnl # Test case source 656 echo "obj-m := $1.o" >>$file 657 658 AS_IF([test "x$2" = "xyes"], [echo "obj-m += $1/" >>build/Makefile], []) 659]) 660 661dnl # 662dnl # ZFS_LINUX_TEST_PROGRAM(C)([PROLOGUE], [BODY]) 663dnl # 664m4_define([ZFS_LINUX_TEST_PROGRAM], [ 665#include <linux/module.h> 666$1 667 668int 669main (void) 670{ 671$2 672 ; 673 return 0; 674} 675 676MODULE_DESCRIPTION("conftest"); 677MODULE_AUTHOR(ZFS_META_AUTHOR); 678MODULE_VERSION(ZFS_META_VERSION "-" ZFS_META_RELEASE); 679MODULE_LICENSE($3); 680]) 681 682dnl # 683dnl # ZFS_LINUX_TEST_REMOVE 684dnl # 685dnl # Removes the specified test source and results. 686dnl # 687AC_DEFUN([ZFS_LINUX_TEST_REMOVE], [ 688 test -d build/$1 && rm -Rf build/$1 689 test -f build/Makefile && sed '/$1/d' build/Makefile 690]) 691 692dnl # 693dnl # ZFS_LINUX_COMPILE 694dnl # 695dnl # $1 - build dir 696dnl # $2 - test command 697dnl # $3 - pass command 698dnl # $4 - fail command 699dnl # $5 - set KBUILD_MODPOST_NOFINAL='yes' 700dnl # $6 - set KBUILD_MODPOST_WARN='yes' 701dnl # 702dnl # Used internally by ZFS_LINUX_TEST_{COMPILE,MODPOST} 703dnl # 704AC_DEFUN([ZFS_LINUX_COMPILE], [ 705 AC_ARG_VAR([KERNEL_CC], [C compiler for 706 building kernel modules]) 707 AC_ARG_VAR([KERNEL_LD], [Linker for 708 building kernel modules]) 709 AC_ARG_VAR([KERNEL_LLVM], [Binary option to 710 build kernel modules with LLVM/CLANG toolchain]) 711 AC_ARG_VAR([KERNEL_CROSS_COMPILE], [Cross compile prefix 712 for kernel module builds]) 713 AC_ARG_VAR([KERNEL_ARCH], [Architecture to build kernel modules for]) 714 AC_TRY_COMMAND([ 715 KBUILD_MODPOST_NOFINAL="$5" KBUILD_MODPOST_WARN="$6" 716 make modules -k -j$TEST_JOBS ${KERNEL_CC:+CC=$KERNEL_CC} 717 ${KERNEL_LD:+LD=$KERNEL_LD} ${KERNEL_LLVM:+LLVM=$KERNEL_LLVM} 718 CONFIG_MODULES=y CFLAGS_MODULE=-DCONFIG_MODULES 719 ${KERNEL_CROSS_COMPILE:+CROSS_COMPILE=$KERNEL_CROSS_COMPILE} 720 ${KERNEL_ARCH:+ARCH=$KERNEL_ARCH} 721 -C $LINUX_OBJ $ARCH_UM M=$PWD/$1 >$1/build.log 2>&1]) 722 AS_IF([AC_TRY_COMMAND([$2])], [$3], [$4]) 723]) 724 725dnl # 726dnl # ZFS_LINUX_TEST_COMPILE 727dnl # 728dnl # Perform a full compile excluding the final modpost phase. 729dnl # 730AC_DEFUN([ZFS_LINUX_TEST_COMPILE], [ 731 ZFS_LINUX_COMPILE([$2], [test -f $2/build.log], [ 732 mv $2/Makefile $2/Makefile.compile.$1 733 mv $2/build.log $2/build.log.$1 734 ],[ 735 AC_MSG_ERROR([ 736 *** Unable to compile test source to determine kernel interfaces.]) 737 ], [yes], []) 738]) 739 740dnl # 741dnl # ZFS_LINUX_TEST_MODPOST 742dnl # 743dnl # Perform a full compile including the modpost phase. This may 744dnl # be an incremental build if the objects have already been built. 745dnl # 746AC_DEFUN([ZFS_LINUX_TEST_MODPOST], [ 747 ZFS_LINUX_COMPILE([$2], [test -f $2/build.log], [ 748 mv $2/Makefile $2/Makefile.modpost.$1 749 cat $2/build.log >>build/build.log.$1 750 ],[ 751 AC_MSG_ERROR([ 752 *** Unable to modpost test source to determine kernel interfaces.]) 753 ], [], [yes]) 754]) 755 756dnl # 757dnl # Perform the compilation of the test cases in two phases. 758dnl # 759dnl # Phase 1) attempt to build the object files for all of the tests 760dnl # defined by the ZFS_LINUX_TEST_SRC macro. But do not 761dnl # perform the final modpost stage. 762dnl # 763dnl # Phase 2) disable all tests which failed the initial compilation, 764dnl # then invoke the final modpost step for the remaining tests. 765dnl # 766dnl # This allows us efficiently build the test cases in parallel while 767dnl # remaining resilient to build failures which are expected when 768dnl # detecting the available kernel interfaces. 769dnl # 770dnl # The maximum allowed parallelism can be controlled by setting the 771dnl # TEST_JOBS environment variable. Otherwise, it default to $(nproc). 772dnl # 773AC_DEFUN([ZFS_LINUX_TEST_COMPILE_ALL], [ 774 dnl # Phase 1 - Compilation only, final linking is skipped. 775 ZFS_LINUX_TEST_COMPILE([$1], [build]) 776 777 dnl # 778 dnl # Phase 2 - When building external modules disable test cases 779 dnl # which failed to compile and invoke modpost to verify the 780 dnl # final linking. 781 dnl # 782 dnl # Test names suffixed with '_license' call modpost independently 783 dnl # to ensure that a single incompatibility does not result in the 784 dnl # modpost phase exiting early. This check is not performed on 785 dnl # every symbol since the majority are compatible and doing so 786 dnl # would significantly slow down this phase. 787 dnl # 788 dnl # When configuring for builtin (--enable-linux-builtin) 789 dnl # fake the linking step artificially create the expected .ko 790 dnl # files for tests which did compile. This is required for 791 dnl # kernels which do not have loadable module support or have 792 dnl # not yet been built. 793 dnl # 794 AS_IF([test "x$enable_linux_builtin" = "xno"], [ 795 for dir in $(awk '/^obj-m/ { print [$]3 }' \ 796 build/Makefile.compile.$1); do 797 name=${dir%/} 798 AS_IF([test -f build/$name/$name.o], [ 799 AS_IF([test "${name##*_}" = "license"], [ 800 ZFS_LINUX_TEST_MODPOST([$1], 801 [build/$name]) 802 echo "obj-n += $dir" >>build/Makefile 803 ], [ 804 echo "obj-m += $dir" >>build/Makefile 805 ]) 806 ], [ 807 echo "obj-n += $dir" >>build/Makefile 808 ]) 809 done 810 811 ZFS_LINUX_TEST_MODPOST([$1], [build]) 812 ], [ 813 for dir in $(awk '/^obj-m/ { print [$]3 }' \ 814 build/Makefile.compile.$1); do 815 name=${dir%/} 816 AS_IF([test -f build/$name/$name.o], [ 817 touch build/$name/$name.ko 818 ]) 819 done 820 ]) 821]) 822 823dnl # 824dnl # ZFS_LINUX_TEST_SRC 825dnl # 826dnl # $1 - name 827dnl # $2 - global 828dnl # $3 - source 829dnl # $4 - extra cflags 830dnl # $5 - check license-compatibility 831dnl # 832dnl # Check if the test source is buildable at all and then if it is 833dnl # license compatible. 834dnl # 835dnl # N.B because all of the test cases are compiled in parallel they 836dnl # must never depend on the results of previous tests. Each test 837dnl # needs to be entirely independent. 838dnl # 839AC_DEFUN([ZFS_LINUX_TEST_SRC], [ 840 cachevar="zfs_cv_kernel_[$1]_$_zfs_linux_cache_checksum" 841 eval "cacheval=\$$cachevar" 842 AS_IF([test "x$cacheval" = "x"], [ 843 ZFS_LINUX_CONFTEST_C([ZFS_LINUX_TEST_PROGRAM([[$2]], [[$3]], 844 [["Dual BSD/GPL"]])], [$1]) 845 ZFS_LINUX_CONFTEST_MAKEFILE([$1], [yes], [$4]) 846 847 AS_IF([ test -n "$5" ], [ 848 ZFS_LINUX_CONFTEST_C([ZFS_LINUX_TEST_PROGRAM( 849 [[$2]], [[$3]], [[$5]])], [$1_license]) 850 ZFS_LINUX_CONFTEST_MAKEFILE([$1_license], [yes], [$4]) 851 ]) 852 ]) 853]) 854 855dnl # 856dnl # ZFS_LINUX_TEST_RESULT 857dnl # 858dnl # $1 - name of a test source (ZFS_LINUX_TEST_SRC) 859dnl # $2 - run on success (valid .ko generated) 860dnl # $3 - run on failure (unable to compile) 861dnl # 862AC_DEFUN([ZFS_LINUX_TEST_RESULT], [ 863 cachevar="zfs_cv_kernel_[$1]_$_zfs_linux_cache_checksum" 864 AC_CACHE_VAL([$cachevar], [ 865 AS_IF([test -d build/$1], [ 866 AS_IF([test -f build/$1/$1.ko], [ 867 eval "$cachevar=yes" 868 ], [ 869 eval "$cachevar=no" 870 ]) 871 ], [ 872 AC_MSG_ERROR([ 873 *** No matching source for the "$1" test, check that 874 *** both the test source and result macros refer to the same name. 875 ]) 876 ]) 877 ]) 878 eval "cacheval=\$$cachevar" 879 AS_IF([test "x$cacheval" = "xyes"], [$2], [$3]) 880]) 881 882dnl # 883dnl # ZFS_LINUX_TEST_ERROR 884dnl # 885dnl # Generic error message which can be used when none of the expected 886dnl # kernel interfaces were detected. 887dnl # 888AC_DEFUN([ZFS_LINUX_TEST_ERROR], [ 889 AC_MSG_ERROR([ 890 *** None of the expected "$1" interfaces were detected. 891 *** This may be because your kernel version is newer than what is 892 *** supported, or you are using a patched custom kernel with 893 *** incompatible modifications. 894 *** 895 *** ZFS Version: $ZFS_META_ALIAS 896 *** Compatible Kernels: $ZFS_META_KVER_MIN - $ZFS_META_KVER_MAX 897 ]) 898]) 899 900dnl # 901dnl # ZFS_LINUX_TEST_RESULT_SYMBOL 902dnl # 903dnl # Like ZFS_LINUX_TEST_RESULT except ZFS_CHECK_SYMBOL_EXPORT is called to 904dnl # verify symbol exports, unless --enable-linux-builtin was provided to 905dnl # configure. 906dnl # 907AC_DEFUN([ZFS_LINUX_TEST_RESULT_SYMBOL], [ 908 cachevar="zfs_cv_kernel_[$1]_$_zfs_linux_cache_checksum" 909 AC_CACHE_VAL([$cachevar], [ 910 AS_IF([ ! test -f build/$1/$1.ko], [ 911 eval "$cachevar=no" 912 ], [ 913 AS_IF([test "x$enable_linux_builtin" != "xyes"], [ 914 ZFS_CHECK_SYMBOL_EXPORT([$2], [$3], [ 915 eval "$cachevar=yes" 916 ], [ 917 eval "$cachevar=no" 918 ]) 919 ], [ 920 eval "$cachevar=yes" 921 ]) 922 ]) 923 ]) 924 eval "cacheval=\$$cachevar" 925 AS_IF([test "x$cacheval" = "xyes"], [$4], [$5]) 926]) 927 928dnl # 929dnl # ZFS_LINUX_COMPILE_IFELSE 930dnl # 931AC_DEFUN([ZFS_LINUX_COMPILE_IFELSE], [ 932 ZFS_LINUX_TEST_REMOVE([conftest]) 933 934 m4_ifvaln([$1], [ZFS_LINUX_CONFTEST_C([$1], [conftest])]) 935 m4_ifvaln([$5], [ZFS_LINUX_CONFTEST_H([$5], [conftest])], 936 [ZFS_LINUX_CONFTEST_H([], [conftest])]) 937 938 ZFS_LINUX_CONFTEST_MAKEFILE([conftest], [no], 939 [m4_ifvaln([$5], [-I$PWD/build/conftest], [])]) 940 ZFS_LINUX_COMPILE([build/conftest], [$2], [$3], [$4], [], []) 941]) 942 943dnl # 944dnl # ZFS_LINUX_TRY_COMPILE 945dnl # 946dnl # $1 - global 947dnl # $2 - source 948dnl # $3 - run on success (valid .ko generated) 949dnl # $4 - run on failure (unable to compile) 950dnl # 951dnl # When configuring as builtin (--enable-linux-builtin) for kernels 952dnl # without loadable module support (CONFIG_MODULES=n) only the object 953dnl # file is created. See ZFS_LINUX_TEST_COMPILE_ALL for details. 954dnl # 955AC_DEFUN([ZFS_LINUX_TRY_COMPILE], [ 956 AS_IF([test "x$enable_linux_builtin" = "xyes"], [ 957 ZFS_LINUX_COMPILE_IFELSE( 958 [ZFS_LINUX_TEST_PROGRAM([[$1]], [[$2]], 959 [[ZFS_META_LICENSE]])], 960 [test -f build/conftest/conftest.o], [$3], [$4]) 961 ], [ 962 ZFS_LINUX_COMPILE_IFELSE( 963 [ZFS_LINUX_TEST_PROGRAM([[$1]], [[$2]], 964 [[ZFS_META_LICENSE]])], 965 [test -f build/conftest/conftest.ko], [$3], [$4]) 966 ]) 967]) 968 969dnl # 970dnl # ZFS_CHECK_SYMBOL_EXPORT 971dnl # 972dnl # Check if a symbol is exported on not by consulting the symbols 973dnl # file, or optionally the source code. 974dnl # 975AC_DEFUN([ZFS_CHECK_SYMBOL_EXPORT], [ 976 grep -q -E '[[[:space:]]]$1[[[:space:]]]' \ 977 $LINUX_OBJ/$LINUX_SYMBOLS 2>/dev/null 978 rc=$? 979 if test $rc -ne 0; then 980 export=0 981 for file in $2; do 982 grep -q -E "EXPORT_SYMBOL.*($1)" \ 983 "$LINUX/$file" 2>/dev/null 984 rc=$? 985 if test $rc -eq 0; then 986 export=1 987 break; 988 fi 989 done 990 if test $export -eq 0; then : 991 $4 992 else : 993 $3 994 fi 995 else : 996 $3 997 fi 998]) 999 1000dnl # 1001dnl # ZFS_LINUX_TRY_COMPILE_SYMBOL 1002dnl # 1003dnl # Like ZFS_LINUX_TRY_COMPILER except ZFS_CHECK_SYMBOL_EXPORT is called 1004dnl # to verify symbol exports, unless --enable-linux-builtin was provided 1005dnl # to configure. 1006dnl # 1007AC_DEFUN([ZFS_LINUX_TRY_COMPILE_SYMBOL], [ 1008 ZFS_LINUX_TRY_COMPILE([$1], [$2], [rc=0], [rc=1]) 1009 if test $rc -ne 0; then : 1010 $6 1011 else 1012 if test "x$enable_linux_builtin" != xyes; then 1013 ZFS_CHECK_SYMBOL_EXPORT([$3], [$4], [rc=0], [rc=1]) 1014 fi 1015 if test $rc -ne 0; then : 1016 $6 1017 else : 1018 $5 1019 fi 1020 fi 1021]) 1022 1023dnl # 1024dnl # ZFS_LINUX_TRY_COMPILE_HEADER 1025dnl # like ZFS_LINUX_TRY_COMPILE, except the contents conftest.h are 1026dnl # provided via the fifth parameter 1027dnl # 1028AC_DEFUN([ZFS_LINUX_TRY_COMPILE_HEADER], [ 1029 AS_IF([test "x$enable_linux_builtin" = "xyes"], [ 1030 ZFS_LINUX_COMPILE_IFELSE( 1031 [ZFS_LINUX_TEST_PROGRAM([[$1]], [[$2]], 1032 [[ZFS_META_LICENSE]])], 1033 [test -f build/conftest/conftest.o], [$3], [$4], [$5]) 1034 ], [ 1035 ZFS_LINUX_COMPILE_IFELSE( 1036 [ZFS_LINUX_TEST_PROGRAM([[$1]], [[$2]], 1037 [[ZFS_META_LICENSE]])], 1038 [test -f build/conftest/conftest.ko], [$3], [$4], [$5]) 1039 ]) 1040]) 1041 1042dnl # 1043dnl # AS_VERSION_COMPARE_LE 1044dnl # like AS_VERSION_COMPARE_LE, but runs $3 if (and only if) $1 <= $2 1045dnl # AS_VERSION_COMPARE_LE (version-1, version-2, [action-if-less-or-equal], [action-if-greater]) 1046dnl # 1047AC_DEFUN([AS_VERSION_COMPARE_LE], [ 1048 AS_VERSION_COMPARE([$1], [$2], [$3], [$3], [$4]) 1049]) 1050 1051dnl # 1052dnl # ZFS_LINUX_REQUIRE_API 1053dnl # like ZFS_LINUX_TEST_ERROR, except only fails if the kernel is 1054dnl # at least some specified version. 1055dnl # 1056AC_DEFUN([ZFS_LINUX_REQUIRE_API], [ 1057 AS_VERSION_COMPARE_LE([$2], [$kernsrcver], [ 1058 AC_MSG_ERROR([ 1059 *** None of the expected "$1" interfaces were detected. This 1060 *** interface is expected for kernels version "$2" and above. 1061 *** This may be because your kernel version is newer than what is 1062 *** supported, or you are using a patched custom kernel with 1063 *** incompatible modifications. Newer kernels may have incompatible 1064 *** APIs. 1065 *** 1066 *** ZFS Version: $ZFS_META_ALIAS 1067 *** Compatible Kernels: $ZFS_META_KVER_MIN - $ZFS_META_KVER_MAX 1068 ]) 1069 ], [ 1070 AC_MSG_RESULT(no) 1071 ]) 1072]) 1073