mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2024-12-26 03:09:34 +03:00
fe9d409e90
In Linux commit 13bc24457850583a2e7203ded05b7209ab4bc5ef, direct access to the i_ctime member of struct inode was removed. The new approach is to use accessor methods that exclusively handle passing the timestamp around by value. This change adds new tests for each of these functions and introduces zpl_* equivalents in include/os/linux/zfs/sys/zpl.h. In where the inode_get/set_ctime*() functions exist, these zpl_* calls will be mapped to the new functions. On older kernels, these macros just wrap direct-access calls. The code that operated on an address of ip->i_ctime to call ZFS_TIME_DECODE() now will take a local copy using zpl_inode_get_ctime(), and then pass the address of the local copy when performing the ZFS_TIME_DECODE() call, in all cases, rather than directly accessing the member. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Coleman Kane <ckane@colemankane.org> Closes #15263 Closes #15257
94 lines
2.1 KiB
Plaintext
94 lines
2.1 KiB
Plaintext
AC_DEFUN([ZFS_AC_KERNEL_SRC_INODE_TIMES], [
|
|
|
|
dnl #
|
|
dnl # 5.6 API change
|
|
dnl # timespec64_trunc() replaced by timestamp_truncate() interface.
|
|
dnl #
|
|
ZFS_LINUX_TEST_SRC([timestamp_truncate], [
|
|
#include <linux/fs.h>
|
|
],[
|
|
struct timespec64 ts;
|
|
struct inode ip;
|
|
|
|
memset(&ts, 0, sizeof(ts));
|
|
ts = timestamp_truncate(ts, &ip);
|
|
])
|
|
|
|
dnl #
|
|
dnl # 4.18 API change
|
|
dnl # i_atime, i_mtime, and i_ctime changed from timespec to timespec64.
|
|
dnl #
|
|
ZFS_LINUX_TEST_SRC([inode_times], [
|
|
#include <linux/fs.h>
|
|
],[
|
|
struct inode ip;
|
|
struct timespec ts;
|
|
|
|
memset(&ip, 0, sizeof(ip));
|
|
ts = ip.i_mtime;
|
|
])
|
|
|
|
dnl #
|
|
dnl # 6.6 API change
|
|
dnl # i_ctime no longer directly accessible, must use
|
|
dnl # inode_get_ctime(ip), inode_set_ctime*(ip) to
|
|
dnl # read/write.
|
|
dnl #
|
|
ZFS_LINUX_TEST_SRC([inode_get_ctime], [
|
|
#include <linux/fs.h>
|
|
],[
|
|
struct inode ip;
|
|
|
|
memset(&ip, 0, sizeof(ip));
|
|
inode_get_ctime(&ip);
|
|
])
|
|
|
|
ZFS_LINUX_TEST_SRC([inode_set_ctime_to_ts], [
|
|
#include <linux/fs.h>
|
|
],[
|
|
struct inode ip;
|
|
struct timespec64 ts;
|
|
|
|
memset(&ip, 0, sizeof(ip));
|
|
inode_set_ctime_to_ts(&ip, ts);
|
|
])
|
|
])
|
|
|
|
AC_DEFUN([ZFS_AC_KERNEL_INODE_TIMES], [
|
|
AC_MSG_CHECKING([whether timestamp_truncate() exists])
|
|
ZFS_LINUX_TEST_RESULT([timestamp_truncate], [
|
|
AC_MSG_RESULT(yes)
|
|
AC_DEFINE(HAVE_INODE_TIMESTAMP_TRUNCATE, 1,
|
|
[timestamp_truncate() exists])
|
|
],[
|
|
AC_MSG_RESULT(no)
|
|
])
|
|
|
|
AC_MSG_CHECKING([whether inode->i_*time's are timespec64])
|
|
ZFS_LINUX_TEST_RESULT([inode_times], [
|
|
AC_MSG_RESULT(no)
|
|
],[
|
|
AC_MSG_RESULT(yes)
|
|
AC_DEFINE(HAVE_INODE_TIMESPEC64_TIMES, 1,
|
|
[inode->i_*time's are timespec64])
|
|
])
|
|
|
|
AC_MSG_CHECKING([whether inode_get_ctime() exists])
|
|
ZFS_LINUX_TEST_RESULT([inode_get_ctime], [
|
|
AC_MSG_RESULT(yes)
|
|
AC_DEFINE(HAVE_INODE_GET_CTIME, 1,
|
|
[inode_get_ctime() exists in linux/fs.h])
|
|
],[
|
|
AC_MSG_RESULT(no)
|
|
])
|
|
|
|
AC_MSG_CHECKING([whether inode_set_ctime_to_ts() exists])
|
|
ZFS_LINUX_TEST_RESULT([inode_set_ctime_to_ts], [
|
|
AC_MSG_RESULT(yes)
|
|
AC_DEFINE(HAVE_INODE_SET_CTIME_TO_TS, 1,
|
|
[inode_set_ctime_to_ts() exists in linux/fs.h])
|
|
],[
|
|
AC_MSG_RESULT(no)
|
|
])
|
|
])
|