Skip to content

Commit

Permalink
Fix build failures on PaX/GRSecurity patched kernels
Browse files Browse the repository at this point in the history
Gentoo Hardened kernels include the PaX/GRSecurity patches. They use a
dialect of C that relies on a GCC plugin. In particular, struct
file_operations has been marked do_const in the PaX/GRSecurity dialect,
which causes GCC to consider all instances of it as const. This caused
failures in the autotools checks and the ZFS source code.

To address this, we modify the autotools checks to take into account
differences between the PaX C dialect and the regular C dialect. We also
modify struct zfs_acl's z_ops member to be a pointer to a function
pointer table. Lastly, we modify zpl_put_link() to address a PaX change
to the function prototype of nd_get_link().  This avoids compiler errors
in the PaX/GRSecurity dialect.

Note that the change in zpl_put_link() causes a warning that becomes a
build failure when debugging is enabled. Fixing that warning requires
ryao/spl@5ca50ef.

Signed-off-by: Richard Yao <[email protected]>
Signed-off-by: Brian Behlendorf <[email protected]>
Closes #484
  • Loading branch information
ryao authored and behlendorf committed Jul 17, 2012
1 parent b5a2880 commit 0a6b03d
Show file tree
Hide file tree
Showing 7 changed files with 1,019 additions and 419 deletions.
6 changes: 3 additions & 3 deletions config/kernel-evict-inode.m4
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,11 @@ AC_DEFUN([ZFS_AC_KERNEL_EVICT_INODE], [
AC_MSG_CHECKING([whether sops->evict_inode() exists])
ZFS_LINUX_TRY_COMPILE([
#include <linux/fs.h>
],[
void (*evict_inode) (struct inode *) = NULL;
struct super_operations sops __attribute__ ((unused)) = {
void evict_inode (struct inode * t) { return; }
static struct super_operations sops __attribute__ ((unused)) = {
.evict_inode = evict_inode,
};
],[
],[
AC_MSG_RESULT(yes)
AC_DEFINE(HAVE_EVICT_INODE, 1, [sops->evict_inode() exists])
Expand Down
21 changes: 21 additions & 0 deletions config/kernel-fallocate.m4
Original file line number Diff line number Diff line change
Expand Up @@ -38,11 +38,32 @@ AC_DEFUN([ZFS_AC_KERNEL_INODE_FALLOCATE], [
])
])

dnl #
dnl # PaX Linux 2.6.38 - 3.x API
dnl #
AC_DEFUN([ZFS_AC_PAX_KERNEL_FILE_FALLOCATE], [
AC_MSG_CHECKING([whether fops->fallocate() exists])
ZFS_LINUX_TRY_COMPILE([
#include <linux/fs.h>
],[
long (*fallocate) (struct file *, int, loff_t, loff_t) = NULL;
struct file_operations_no_const fops __attribute__ ((unused)) = {
.fallocate = fallocate,
};
],[
AC_MSG_RESULT(yes)
AC_DEFINE(HAVE_FILE_FALLOCATE, 1, [fops->fallocate() exists])
],[
AC_MSG_RESULT(no)
])
])

dnl #
dnl # The fallocate callback was moved from the inode_operations
dnl # structure to the file_operations structure.
dnl #
AC_DEFUN([ZFS_AC_KERNEL_FALLOCATE], [
ZFS_AC_KERNEL_FILE_FALLOCATE
ZFS_AC_KERNEL_INODE_FALLOCATE
ZFS_AC_PAX_KERNEL_FILE_FALLOCATE
])
62 changes: 61 additions & 1 deletion config/kernel-fsync.m4
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ AC_DEFUN([ZFS_AC_KERNEL_FSYNC_WITHOUT_DENTRY], [
])

dnl #
dnl # Linux 3.1 -x 3.x API
dnl # Linux 3.1 - 3.x API
dnl #
AC_DEFUN([ZFS_AC_KERNEL_FSYNC_RANGE], [
ZFS_LINUX_TRY_COMPILE([
Expand All @@ -55,9 +55,69 @@ AC_DEFUN([ZFS_AC_KERNEL_FSYNC_RANGE], [
])
])

dnl #
dnl # PaX Linux 2.6.x - 2.6.34 API
dnl #
AC_DEFUN([ZFS_AC_PAX_KERNEL_FSYNC_WITH_DENTRY], [
ZFS_LINUX_TRY_COMPILE([
#include <linux/fs.h>
],[
int (*fsync) (struct file *, struct dentry *, int) = NULL;
file_operations_no_const fops __attribute__ ((unused));
fops.fsync = fsync;
],[
AC_MSG_RESULT([dentry])
AC_DEFINE(HAVE_FSYNC_WITH_DENTRY, 1,
[fops->fsync() with dentry])
],[
])
])

dnl #
dnl # PaX Linux 2.6.35 - Linux 3.0 API
dnl #
AC_DEFUN([ZFS_AC_PAX_KERNEL_FSYNC_WITHOUT_DENTRY], [
ZFS_LINUX_TRY_COMPILE([
#include <linux/fs.h>
],[
int (*fsync) (struct file *, int) = NULL;
file_operations_no_const fops __attribute__ ((unused));
fops.fsync = fsync;
],[
AC_MSG_RESULT([no dentry])
AC_DEFINE(HAVE_FSYNC_WITHOUT_DENTRY, 1,
[fops->fsync() without dentry])
],[
])
])

dnl #
dnl # PaX Linux 3.1 - 3.x API
dnl #
AC_DEFUN([ZFS_AC_PAX_KERNEL_FSYNC_RANGE], [
ZFS_LINUX_TRY_COMPILE([
#include <linux/fs.h>
],[
int (*fsync) (struct file *, loff_t, loff_t, int) = NULL;
file_operations_no_const fops __attribute__ ((unused));
fops.fsync = fsync;
],[
AC_MSG_RESULT([range])
AC_DEFINE(HAVE_FSYNC_RANGE, 1,
[fops->fsync() with range])
],[
])
])

AC_DEFUN([ZFS_AC_KERNEL_FSYNC], [
AC_MSG_CHECKING([whether fops->fsync() wants])
ZFS_AC_KERNEL_FSYNC_WITH_DENTRY
ZFS_AC_KERNEL_FSYNC_WITHOUT_DENTRY
ZFS_AC_KERNEL_FSYNC_RANGE
ZFS_AC_PAX_KERNEL_FSYNC_WITH_DENTRY
ZFS_AC_PAX_KERNEL_FSYNC_WITHOUT_DENTRY
ZFS_AC_PAX_KERNEL_FSYNC_RANGE
])
Loading

0 comments on commit 0a6b03d

Please sign in to comment.