Fix build failures on PaX/GRSecurity patched kernels

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@5ca50ef459.

Signed-off-by: Richard Yao <ryao@cs.stonybrook.edu>
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Closes #484
This commit is contained in:
Richard Yao 2012-05-30 23:25:31 -04:00 committed by Brian Behlendorf
parent b5a28807cd
commit 0a6b03d3b8
7 changed files with 640 additions and 40 deletions

View File

@ -7,11 +7,11 @@ AC_DEFUN([ZFS_AC_KERNEL_EVICT_INODE], [
AC_MSG_CHECKING([whether sops->evict_inode() exists]) AC_MSG_CHECKING([whether sops->evict_inode() exists])
ZFS_LINUX_TRY_COMPILE([ ZFS_LINUX_TRY_COMPILE([
#include <linux/fs.h> #include <linux/fs.h>
],[ void evict_inode (struct inode * t) { return; }
void (*evict_inode) (struct inode *) = NULL; static struct super_operations sops __attribute__ ((unused)) = {
struct super_operations sops __attribute__ ((unused)) = {
.evict_inode = evict_inode, .evict_inode = evict_inode,
}; };
],[
],[ ],[
AC_MSG_RESULT(yes) AC_MSG_RESULT(yes)
AC_DEFINE(HAVE_EVICT_INODE, 1, [sops->evict_inode() exists]) AC_DEFINE(HAVE_EVICT_INODE, 1, [sops->evict_inode() exists])

View File

@ -38,6 +38,26 @@ 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 #
dnl # The fallocate callback was moved from the inode_operations dnl # The fallocate callback was moved from the inode_operations
dnl # structure to the file_operations structure. dnl # structure to the file_operations structure.
@ -45,4 +65,5 @@ dnl #
AC_DEFUN([ZFS_AC_KERNEL_FALLOCATE], [ AC_DEFUN([ZFS_AC_KERNEL_FALLOCATE], [
ZFS_AC_KERNEL_FILE_FALLOCATE ZFS_AC_KERNEL_FILE_FALLOCATE
ZFS_AC_KERNEL_INODE_FALLOCATE ZFS_AC_KERNEL_INODE_FALLOCATE
ZFS_AC_PAX_KERNEL_FILE_FALLOCATE
]) ])

View File

@ -37,7 +37,7 @@ AC_DEFUN([ZFS_AC_KERNEL_FSYNC_WITHOUT_DENTRY], [
]) ])
dnl # dnl #
dnl # Linux 3.1 -x 3.x API dnl # Linux 3.1 - 3.x API
dnl # dnl #
AC_DEFUN([ZFS_AC_KERNEL_FSYNC_RANGE], [ AC_DEFUN([ZFS_AC_KERNEL_FSYNC_RANGE], [
ZFS_LINUX_TRY_COMPILE([ ZFS_LINUX_TRY_COMPILE([
@ -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_DEFUN([ZFS_AC_KERNEL_FSYNC], [
AC_MSG_CHECKING([whether fops->fsync() wants]) AC_MSG_CHECKING([whether fops->fsync() wants])
ZFS_AC_KERNEL_FSYNC_WITH_DENTRY ZFS_AC_KERNEL_FSYNC_WITH_DENTRY
ZFS_AC_KERNEL_FSYNC_WITHOUT_DENTRY ZFS_AC_KERNEL_FSYNC_WITHOUT_DENTRY
ZFS_AC_KERNEL_FSYNC_RANGE 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
]) ])

536
configure vendored
View File

@ -15530,8 +15530,69 @@ fi
{ $as_echo "$as_me:$LINENO: checking whether sops->evict_inode() exists" >&5
$as_echo_n "checking whether sops->evict_inode() exists... " >&6; } cat confdefs.h - <<_ACEOF >conftest.c
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
#include <linux/fs.h>
int
main (void)
{
int (*fsync) (struct file *, struct dentry *, int) = NULL;
file_operations_no_const fops __attribute__ ((unused));
fops.fsync = fsync;
;
return 0;
}
_ACEOF
rm -Rf build && mkdir -p build
echo "obj-m := conftest.o" >build/Makefile
if { ac_try='cp conftest.c build && make modules -C $LINUX_OBJ EXTRA_CFLAGS="-Werror-implicit-function-declaration $EXTRA_KCFLAGS" $ARCH_UM M=$PWD/build'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
$as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; } >/dev/null && { ac_try='test -s build/conftest.o'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
$as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
{ $as_echo "$as_me:$LINENO: result: dentry" >&5
$as_echo "dentry" >&6; }
cat >>confdefs.h <<\_ACEOF
#define HAVE_FSYNC_WITH_DENTRY 1
_ACEOF
else
$as_echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
fi
rm -Rf build
cat confdefs.h - <<_ACEOF >conftest.c cat confdefs.h - <<_ACEOF >conftest.c
@ -15548,11 +15609,142 @@ int
main (void) main (void)
{ {
void (*evict_inode) (struct inode *) = NULL; int (*fsync) (struct file *, int) = NULL;
struct super_operations sops __attribute__ ((unused)) = { file_operations_no_const fops __attribute__ ((unused));
fops.fsync = fsync;
;
return 0;
}
_ACEOF
rm -Rf build && mkdir -p build
echo "obj-m := conftest.o" >build/Makefile
if { ac_try='cp conftest.c build && make modules -C $LINUX_OBJ EXTRA_CFLAGS="-Werror-implicit-function-declaration $EXTRA_KCFLAGS" $ARCH_UM M=$PWD/build'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
$as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; } >/dev/null && { ac_try='test -s build/conftest.o'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
$as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
{ $as_echo "$as_me:$LINENO: result: no dentry" >&5
$as_echo "no dentry" >&6; }
cat >>confdefs.h <<\_ACEOF
#define HAVE_FSYNC_WITHOUT_DENTRY 1
_ACEOF
else
$as_echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
fi
rm -Rf build
cat confdefs.h - <<_ACEOF >conftest.c
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
#include <linux/fs.h>
int
main (void)
{
int (*fsync) (struct file *, loff_t, loff_t, int) = NULL;
file_operations_no_const fops __attribute__ ((unused));
fops.fsync = fsync;
;
return 0;
}
_ACEOF
rm -Rf build && mkdir -p build
echo "obj-m := conftest.o" >build/Makefile
if { ac_try='cp conftest.c build && make modules -C $LINUX_OBJ EXTRA_CFLAGS="-Werror-implicit-function-declaration $EXTRA_KCFLAGS" $ARCH_UM M=$PWD/build'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
$as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; } >/dev/null && { ac_try='test -s build/conftest.o'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
$as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
{ $as_echo "$as_me:$LINENO: result: range" >&5
$as_echo "range" >&6; }
cat >>confdefs.h <<\_ACEOF
#define HAVE_FSYNC_RANGE 1
_ACEOF
else
$as_echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
fi
rm -Rf build
{ $as_echo "$as_me:$LINENO: checking whether sops->evict_inode() exists" >&5
$as_echo_n "checking whether sops->evict_inode() exists... " >&6; }
cat confdefs.h - <<_ACEOF >conftest.c
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
#include <linux/fs.h>
void evict_inode (struct inode * t) { return; }
static struct super_operations sops __attribute__ ((unused)) = {
.evict_inode = evict_inode, .evict_inode = evict_inode,
}; };
int
main (void)
{
; ;
return 0; return 0;
} }
@ -15873,6 +16065,74 @@ fi
{ $as_echo "$as_me:$LINENO: checking whether fops->fallocate() exists" >&5
$as_echo_n "checking whether fops->fallocate() exists... " >&6; }
cat confdefs.h - <<_ACEOF >conftest.c
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
#include <linux/fs.h>
int
main (void)
{
long (*fallocate) (struct file *, int, loff_t, loff_t) = NULL;
struct file_operations_no_const fops __attribute__ ((unused)) = {
.fallocate = fallocate,
};
;
return 0;
}
_ACEOF
rm -Rf build && mkdir -p build
echo "obj-m := conftest.o" >build/Makefile
if { ac_try='cp conftest.c build && make modules -C $LINUX_OBJ EXTRA_CFLAGS="-Werror-implicit-function-declaration $EXTRA_KCFLAGS" $ARCH_UM M=$PWD/build'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
$as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; } >/dev/null && { ac_try='test -s build/conftest.o'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
$as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
{ $as_echo "$as_me:$LINENO: result: yes" >&5
$as_echo "yes" >&6; }
cat >>confdefs.h <<\_ACEOF
#define HAVE_FILE_FALLOCATE 1
_ACEOF
else
$as_echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
{ $as_echo "$as_me:$LINENO: result: no" >&5
$as_echo "no" >&6; }
fi
rm -Rf build
{ $as_echo "$as_me:$LINENO: checking whether iops->create()/mkdir()/mknod() take umode_t" >&5 { $as_echo "$as_me:$LINENO: checking whether iops->create()/mkdir()/mknod() take umode_t" >&5
$as_echo_n "checking whether iops->create()/mkdir()/mknod() take umode_t... " >&6; } $as_echo_n "checking whether iops->create()/mkdir()/mknod() take umode_t... " >&6; }
@ -21797,8 +22057,69 @@ fi
{ $as_echo "$as_me:$LINENO: checking whether sops->evict_inode() exists" >&5
$as_echo_n "checking whether sops->evict_inode() exists... " >&6; } cat confdefs.h - <<_ACEOF >conftest.c
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
#include <linux/fs.h>
int
main (void)
{
int (*fsync) (struct file *, struct dentry *, int) = NULL;
file_operations_no_const fops __attribute__ ((unused));
fops.fsync = fsync;
;
return 0;
}
_ACEOF
rm -Rf build && mkdir -p build
echo "obj-m := conftest.o" >build/Makefile
if { ac_try='cp conftest.c build && make modules -C $LINUX_OBJ EXTRA_CFLAGS="-Werror-implicit-function-declaration $EXTRA_KCFLAGS" $ARCH_UM M=$PWD/build'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
$as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; } >/dev/null && { ac_try='test -s build/conftest.o'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
$as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
{ $as_echo "$as_me:$LINENO: result: dentry" >&5
$as_echo "dentry" >&6; }
cat >>confdefs.h <<\_ACEOF
#define HAVE_FSYNC_WITH_DENTRY 1
_ACEOF
else
$as_echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
fi
rm -Rf build
cat confdefs.h - <<_ACEOF >conftest.c cat confdefs.h - <<_ACEOF >conftest.c
@ -21815,11 +22136,142 @@ int
main (void) main (void)
{ {
void (*evict_inode) (struct inode *) = NULL; int (*fsync) (struct file *, int) = NULL;
struct super_operations sops __attribute__ ((unused)) = { file_operations_no_const fops __attribute__ ((unused));
fops.fsync = fsync;
;
return 0;
}
_ACEOF
rm -Rf build && mkdir -p build
echo "obj-m := conftest.o" >build/Makefile
if { ac_try='cp conftest.c build && make modules -C $LINUX_OBJ EXTRA_CFLAGS="-Werror-implicit-function-declaration $EXTRA_KCFLAGS" $ARCH_UM M=$PWD/build'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
$as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; } >/dev/null && { ac_try='test -s build/conftest.o'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
$as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
{ $as_echo "$as_me:$LINENO: result: no dentry" >&5
$as_echo "no dentry" >&6; }
cat >>confdefs.h <<\_ACEOF
#define HAVE_FSYNC_WITHOUT_DENTRY 1
_ACEOF
else
$as_echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
fi
rm -Rf build
cat confdefs.h - <<_ACEOF >conftest.c
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
#include <linux/fs.h>
int
main (void)
{
int (*fsync) (struct file *, loff_t, loff_t, int) = NULL;
file_operations_no_const fops __attribute__ ((unused));
fops.fsync = fsync;
;
return 0;
}
_ACEOF
rm -Rf build && mkdir -p build
echo "obj-m := conftest.o" >build/Makefile
if { ac_try='cp conftest.c build && make modules -C $LINUX_OBJ EXTRA_CFLAGS="-Werror-implicit-function-declaration $EXTRA_KCFLAGS" $ARCH_UM M=$PWD/build'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
$as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; } >/dev/null && { ac_try='test -s build/conftest.o'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
$as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
{ $as_echo "$as_me:$LINENO: result: range" >&5
$as_echo "range" >&6; }
cat >>confdefs.h <<\_ACEOF
#define HAVE_FSYNC_RANGE 1
_ACEOF
else
$as_echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
fi
rm -Rf build
{ $as_echo "$as_me:$LINENO: checking whether sops->evict_inode() exists" >&5
$as_echo_n "checking whether sops->evict_inode() exists... " >&6; }
cat confdefs.h - <<_ACEOF >conftest.c
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
#include <linux/fs.h>
void evict_inode (struct inode * t) { return; }
static struct super_operations sops __attribute__ ((unused)) = {
.evict_inode = evict_inode, .evict_inode = evict_inode,
}; };
int
main (void)
{
; ;
return 0; return 0;
} }
@ -22140,6 +22592,74 @@ fi
{ $as_echo "$as_me:$LINENO: checking whether fops->fallocate() exists" >&5
$as_echo_n "checking whether fops->fallocate() exists... " >&6; }
cat confdefs.h - <<_ACEOF >conftest.c
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
#include <linux/fs.h>
int
main (void)
{
long (*fallocate) (struct file *, int, loff_t, loff_t) = NULL;
struct file_operations_no_const fops __attribute__ ((unused)) = {
.fallocate = fallocate,
};
;
return 0;
}
_ACEOF
rm -Rf build && mkdir -p build
echo "obj-m := conftest.o" >build/Makefile
if { ac_try='cp conftest.c build && make modules -C $LINUX_OBJ EXTRA_CFLAGS="-Werror-implicit-function-declaration $EXTRA_KCFLAGS" $ARCH_UM M=$PWD/build'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
$as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; } >/dev/null && { ac_try='test -s build/conftest.o'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
$as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
{ $as_echo "$as_me:$LINENO: result: yes" >&5
$as_echo "yes" >&6; }
cat >>confdefs.h <<\_ACEOF
#define HAVE_FILE_FALLOCATE 1
_ACEOF
else
$as_echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
{ $as_echo "$as_me:$LINENO: result: no" >&5
$as_echo "no" >&6; }
fi
rm -Rf build
{ $as_echo "$as_me:$LINENO: checking whether iops->create()/mkdir()/mknod() take umode_t" >&5 { $as_echo "$as_me:$LINENO: checking whether iops->create()/mkdir()/mknod() take umode_t" >&5
$as_echo_n "checking whether iops->create()/mkdir()/mknod() take umode_t... " >&6; } $as_echo_n "checking whether iops->create()/mkdir()/mknod() take umode_t... " >&6; }

View File

@ -165,7 +165,7 @@ typedef struct zfs_acl {
uint64_t z_hints; /* ACL hints (ZFS_INHERIT_ACE ...) */ uint64_t z_hints; /* ACL hints (ZFS_INHERIT_ACE ...) */
zfs_acl_node_t *z_curr_node; /* current node iterator is handling */ zfs_acl_node_t *z_curr_node; /* current node iterator is handling */
list_t z_acl; /* chunks of ACE data */ list_t z_acl; /* chunks of ACE data */
acl_ops_t z_ops; /* ACL operations */ acl_ops_t *z_ops; /* ACL operations */
} zfs_acl_t; } zfs_acl_t;
typedef struct acl_locator_cb { typedef struct acl_locator_cb {

View File

@ -457,9 +457,9 @@ zfs_acl_alloc(int vers)
offsetof(zfs_acl_node_t, z_next)); offsetof(zfs_acl_node_t, z_next));
aclp->z_version = vers; aclp->z_version = vers;
if (vers == ZFS_ACL_VERSION_FUID) if (vers == ZFS_ACL_VERSION_FUID)
aclp->z_ops = zfs_acl_fuid_ops; aclp->z_ops = &zfs_acl_fuid_ops;
else else
aclp->z_ops = zfs_acl_v0_ops; aclp->z_ops = &zfs_acl_v0_ops;
return (aclp); return (aclp);
} }
@ -609,17 +609,17 @@ zfs_acl_next_ace(zfs_acl_t *aclp, void *start, uint64_t *who,
/* /*
* Make sure we don't overstep our bounds * Make sure we don't overstep our bounds
*/ */
ace_size = aclp->z_ops.ace_size(acep); ace_size = aclp->z_ops->ace_size(acep);
if (((caddr_t)acep + ace_size) > if (((caddr_t)acep + ace_size) >
((caddr_t)aclnode->z_acldata + aclnode->z_size)) { ((caddr_t)aclnode->z_acldata + aclnode->z_size)) {
return (NULL); return (NULL);
} }
*iflags = aclp->z_ops.ace_flags_get(acep); *iflags = aclp->z_ops->ace_flags_get(acep);
*type = aclp->z_ops.ace_type_get(acep); *type = aclp->z_ops->ace_type_get(acep);
*access_mask = aclp->z_ops.ace_mask_get(acep); *access_mask = aclp->z_ops->ace_mask_get(acep);
*who = aclp->z_ops.ace_who_get(acep); *who = aclp->z_ops->ace_who_get(acep);
aclp->z_next_ace = (caddr_t)aclp->z_next_ace + ace_size; aclp->z_next_ace = (caddr_t)aclp->z_next_ace + ace_size;
aclnode->z_ace_idx++; aclnode->z_ace_idx++;
@ -698,7 +698,7 @@ zfs_copy_ace_2_fuid(zfs_sb_t *zsb, umode_t obj_mode, zfs_acl_t *aclp,
} }
aceptr = (zfs_ace_t *)((caddr_t)aceptr + aceptr = (zfs_ace_t *)((caddr_t)aceptr +
aclp->z_ops.ace_size(aceptr)); aclp->z_ops->ace_size(aceptr));
} }
*size = (caddr_t)aceptr - (caddr_t)z_acl; *size = (caddr_t)aceptr - (caddr_t)z_acl;
@ -824,7 +824,7 @@ zfs_acl_xform(znode_t *zp, zfs_acl_t *aclp, cred_t *cr)
newaclnode = zfs_acl_node_alloc(aclp->z_acl_count * newaclnode = zfs_acl_node_alloc(aclp->z_acl_count *
sizeof (zfs_object_ace_t)); sizeof (zfs_object_ace_t));
aclp->z_ops = zfs_acl_fuid_ops; aclp->z_ops = &zfs_acl_fuid_ops;
VERIFY(zfs_copy_ace_2_fuid(ZTOZSB(zp), ZTOI(zp)->i_mode, VERIFY(zfs_copy_ace_2_fuid(ZTOZSB(zp), ZTOI(zp)->i_mode,
aclp, oldaclp, newaclnode->z_acldata, aclp->z_acl_count, aclp, oldaclp, newaclnode->z_acldata, aclp->z_acl_count,
&newaclnode->z_size, NULL, cr) == 0); &newaclnode->z_size, NULL, cr) == 0);
@ -868,12 +868,12 @@ zfs_set_ace(zfs_acl_t *aclp, void *acep, uint32_t access_mask,
{ {
uint16_t type = entry_type & ACE_TYPE_FLAGS; uint16_t type = entry_type & ACE_TYPE_FLAGS;
aclp->z_ops.ace_mask_set(acep, access_mask); aclp->z_ops->ace_mask_set(acep, access_mask);
aclp->z_ops.ace_type_set(acep, access_type); aclp->z_ops->ace_type_set(acep, access_type);
aclp->z_ops.ace_flags_set(acep, entry_type); aclp->z_ops->ace_flags_set(acep, entry_type);
if ((type != ACE_OWNER && type != OWNING_GROUP && if ((type != ACE_OWNER && type != OWNING_GROUP &&
type != ACE_EVERYONE)) type != ACE_EVERYONE))
aclp->z_ops.ace_who_set(acep, fuid); aclp->z_ops->ace_who_set(acep, fuid);
} }
/* /*
@ -1454,7 +1454,7 @@ zfs_acl_chmod(zfs_sb_t *zsb, uint64_t mode, zfs_acl_t *aclp)
uint16_t iflags, type; uint16_t iflags, type;
uint32_t access_mask; uint32_t access_mask;
zfs_acl_node_t *newnode; zfs_acl_node_t *newnode;
size_t abstract_size = aclp->z_ops.ace_abstract_size(); size_t abstract_size = aclp->z_ops->ace_abstract_size();
void *zacep; void *zacep;
uint32_t owner, group, everyone; uint32_t owner, group, everyone;
uint32_t deny1, deny2, allow0; uint32_t deny1, deny2, allow0;
@ -1530,7 +1530,7 @@ zfs_acl_chmod(zfs_sb_t *zsb, uint64_t mode, zfs_acl_t *aclp)
} }
} }
zfs_set_ace(aclp, zacep, access_mask, type, who, iflags); zfs_set_ace(aclp, zacep, access_mask, type, who, iflags);
ace_size = aclp->z_ops.ace_size(acep); ace_size = aclp->z_ops->ace_size(acep);
zacep = (void *)((uintptr_t)zacep + ace_size); zacep = (void *)((uintptr_t)zacep + ace_size);
new_count++; new_count++;
new_bytes += ace_size; new_bytes += ace_size;
@ -1570,12 +1570,12 @@ zfs_acl_chmod_setattr(znode_t *zp, zfs_acl_t **aclp, uint64_t mode)
static void static void
zfs_restricted_update(zfs_sb_t *zsb, zfs_acl_t *aclp, void *acep) zfs_restricted_update(zfs_sb_t *zsb, zfs_acl_t *aclp, void *acep)
{ {
uint32_t mask = aclp->z_ops.ace_mask_get(acep); uint32_t mask = aclp->z_ops->ace_mask_get(acep);
if ((zsb->z_acl_inherit == ZFS_ACL_RESTRICTED) && if ((zsb->z_acl_inherit == ZFS_ACL_RESTRICTED) &&
(aclp->z_ops.ace_type_get(acep) == ALLOW)) { (aclp->z_ops->ace_type_get(acep) == ALLOW)) {
mask &= ~RESTRICTED_CLEAR; mask &= ~RESTRICTED_CLEAR;
aclp->z_ops.ace_mask_set(acep, mask); aclp->z_ops->ace_mask_set(acep, mask);
} }
} }
@ -1640,7 +1640,7 @@ zfs_acl_inherit(zfs_sb_t *zsb, umode_t obj_mode, zfs_acl_t *paclp,
if (noallow && type == ALLOW) if (noallow && type == ALLOW)
continue; continue;
ace_size = aclp->z_ops.ace_size(pacep); ace_size = aclp->z_ops->ace_size(pacep);
if (!zfs_ace_can_use(obj_mode, iflags)) if (!zfs_ace_can_use(obj_mode, iflags))
continue; continue;
@ -1672,8 +1672,8 @@ zfs_acl_inherit(zfs_sb_t *zsb, umode_t obj_mode, zfs_acl_t *paclp,
/* /*
* Copy special opaque data if any * Copy special opaque data if any
*/ */
if ((data1sz = paclp->z_ops.ace_data(pacep, &data1)) != 0) { if ((data1sz = paclp->z_ops->ace_data(pacep, &data1)) != 0) {
VERIFY((data2sz = aclp->z_ops.ace_data(acep, VERIFY((data2sz = aclp->z_ops->ace_data(acep,
&data2)) == data1sz); &data2)) == data1sz);
bcopy(data1, data2, data2sz); bcopy(data1, data2, data2sz);
} }
@ -1681,14 +1681,14 @@ zfs_acl_inherit(zfs_sb_t *zsb, umode_t obj_mode, zfs_acl_t *paclp,
aclp->z_acl_count++; aclp->z_acl_count++;
aclnode->z_ace_count++; aclnode->z_ace_count++;
aclp->z_acl_bytes += aclnode->z_size; aclp->z_acl_bytes += aclnode->z_size;
newflags = aclp->z_ops.ace_flags_get(acep); newflags = aclp->z_ops->ace_flags_get(acep);
if (vdir) if (vdir)
aclp->z_hints |= ZFS_INHERIT_ACE; aclp->z_hints |= ZFS_INHERIT_ACE;
if ((iflags & ACE_NO_PROPAGATE_INHERIT_ACE) || !vdir) { if ((iflags & ACE_NO_PROPAGATE_INHERIT_ACE) || !vdir) {
newflags &= ~ALL_INHERIT; newflags &= ~ALL_INHERIT;
aclp->z_ops.ace_flags_set(acep, aclp->z_ops->ace_flags_set(acep,
newflags|ACE_INHERITED_ACE); newflags|ACE_INHERITED_ACE);
zfs_restricted_update(zsb, aclp, acep); zfs_restricted_update(zsb, aclp, acep);
continue; continue;
@ -1703,11 +1703,11 @@ zfs_acl_inherit(zfs_sb_t *zsb, umode_t obj_mode, zfs_acl_t *paclp,
if ((iflags & (ACE_FILE_INHERIT_ACE | if ((iflags & (ACE_FILE_INHERIT_ACE |
ACE_DIRECTORY_INHERIT_ACE)) == ACE_FILE_INHERIT_ACE) { ACE_DIRECTORY_INHERIT_ACE)) == ACE_FILE_INHERIT_ACE) {
newflags |= ACE_INHERIT_ONLY_ACE; newflags |= ACE_INHERIT_ONLY_ACE;
aclp->z_ops.ace_flags_set(acep, aclp->z_ops->ace_flags_set(acep,
newflags|ACE_INHERITED_ACE); newflags|ACE_INHERITED_ACE);
} else { } else {
newflags &= ~ACE_INHERIT_ONLY_ACE; newflags &= ~ACE_INHERIT_ONLY_ACE;
aclp->z_ops.ace_flags_set(acep, aclp->z_ops->ace_flags_set(acep,
newflags|ACE_INHERITED_ACE); newflags|ACE_INHERITED_ACE);
} }
} }

View File

@ -294,9 +294,8 @@ zpl_follow_link(struct dentry *dentry, struct nameidata *nd)
static void static void
zpl_put_link(struct dentry *dentry, struct nameidata *nd, void *ptr) zpl_put_link(struct dentry *dentry, struct nameidata *nd, void *ptr)
{ {
char *link; const char *link = nd_get_link(nd);
link = nd_get_link(nd);
if (!IS_ERR(link)) if (!IS_ERR(link))
kmem_free(link, MAXPATHLEN); kmem_free(link, MAXPATHLEN);
} }