about summary refs log tree commit diff
path: root/pkgs/os-specific/linux/zfs/3.19-compat-git.patch
blob: 07c4eb55acdad5c266478dccdbe3d68ae698fef4 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
From 5a562310d706c3c2f2adc067fe73f1061c4fc386 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=B6rg=20Thalheim?= <joerg@higgsboson.tk>
Date: Sat, 7 Feb 2015 13:41:01 +0100
Subject: [PATCH] Linux 3.19 compat: file_inode was added

struct access f->f_dentry->d_inode was replaced by accessor function
file_inode(f)
---
 config/kernel-file-inode.m4 | 20 ++++++++++++++++++++
 config/kernel.m4            |  1 +
 include/linux/Makefile.am   |  1 +
 include/linux/fs_compat.h   | 38 ++++++++++++++++++++++++++++++++++++++
 include/sys/zpl.h           |  1 +
 module/zfs/zpl_file.c       |  4 ++--
 6 files changed, 63 insertions(+), 2 deletions(-)
 create mode 100644 config/kernel-file-inode.m4
 create mode 100644 include/linux/fs_compat.h

diff --git a/config/kernel-file-inode.m4 b/config/kernel-file-inode.m4
new file mode 100644
index 0000000..13af4e6
--- /dev/null
+++ b/config/kernel-file-inode.m4
@@ -0,0 +1,20 @@
+dnl #
+dnl # 3.19 API change
+dnl # struct access f->f_dentry->d_inode was replaced by accessor function
+dnl # file_inode(f)
+dnl #
+AC_DEFUN([ZFS_AC_KERNEL_FILE_INODE], [
+	AC_MSG_CHECKING([whether file_inode() is available])
+	ZFS_LINUX_TRY_COMPILE([
+		#include <linux/fs.h>
+	],[
+		struct file *f = NULL;
+		file_inode(f);
+	],[
+		AC_MSG_RESULT(yes)
+		AC_DEFINE(HAVE_FILE_INODE, 1,
+		          [file_inode() is available])
+	],[
+		AC_MSG_RESULT(no)
+	])
+])
diff --git a/config/kernel.m4 b/config/kernel.m4
index bdfb19c..e0b7954 100644
--- a/config/kernel.m4
+++ b/config/kernel.m4
@@ -61,6 +61,7 @@ AC_DEFUN([ZFS_AC_CONFIG_KERNEL], [
 	ZFS_AC_KERNEL_INODE_OPERATIONS_GET_ACL
 	ZFS_AC_KERNEL_CURRENT_UMASK
 	ZFS_AC_KERNEL_SHOW_OPTIONS
+	ZFS_AC_KERNEL_FILE_INODE
 	ZFS_AC_KERNEL_FSYNC
 	ZFS_AC_KERNEL_EVICT_INODE
 	ZFS_AC_KERNEL_DIRTY_INODE_WITH_FLAGS
diff --git a/include/linux/Makefile.am b/include/linux/Makefile.am
index d00b1c8..480af26 100644
--- a/include/linux/Makefile.am
+++ b/include/linux/Makefile.am
@@ -4,6 +4,7 @@ KERNEL_H = \
 	$(top_srcdir)/include/linux/dcache_compat.h \
 	$(top_srcdir)/include/linux/xattr_compat.h \
 	$(top_srcdir)/include/linux/vfs_compat.h \
+	$(top_srcdir)/include/linux/fs_compat.h \
 	$(top_srcdir)/include/linux/blkdev_compat.h \
 	$(top_srcdir)/include/linux/utsname_compat.h
 
diff --git a/include/linux/fs_compat.h b/include/linux/fs_compat.h
new file mode 100644
index 0000000..7860d75
--- /dev/null
+++ b/include/linux/fs_compat.h
@@ -0,0 +1,38 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+
+/*
+ * Copyright (C) 2015 Jörg Thalheim.
+ */
+
+#ifndef _ZFS_FS_H
+#define	_ZFS_FS_H
+
+#include <linux/fs.h>
+
+#ifndef HAVE_FILE_INODE
+static inline struct inode *file_inode(const struct file *f)
+{
+    return f->f_dentry->d_inode;
+}
+#endif /* HAVE_FILE_INODE */
+
+#endif /* _ZFS_FS_H */
diff --git a/include/sys/zpl.h b/include/sys/zpl.h
index 3fc5d97..20eb27b 100644
--- a/include/sys/zpl.h
+++ b/include/sys/zpl.h
@@ -31,6 +31,7 @@
 #include <linux/exportfs.h>
 #include <linux/falloc.h>
 #include <linux/file_compat.h>
+#include <linux/fs_compat.h>
 #include <linux/task_io_accounting_ops.h>
 #include <linux/vfs_compat.h>
 #include <linux/writeback.h>
diff --git a/module/zfs/zpl_file.c b/module/zfs/zpl_file.c
index 1f4f219..5f5bbba 100644
--- a/module/zfs/zpl_file.c
+++ b/module/zfs/zpl_file.c
@@ -617,7 +617,7 @@ zpl_fallocate(struct file *filp, int mode, loff_t offset, loff_t len)
 static int
 zpl_ioctl_getflags(struct file *filp, void __user *arg)
 {
-	struct inode *ip = filp->f_dentry->d_inode;
+	struct inode *ip = file_inode(filp);
 	unsigned int ioctl_flags = 0;
 	uint64_t zfs_flags = ITOZ(ip)->z_pflags;
 	int error;
@@ -653,7 +653,7 @@ zpl_ioctl_getflags(struct file *filp, void __user *arg)
 static int
 zpl_ioctl_setflags(struct file *filp, void __user *arg)
 {
-	struct inode	*ip = filp->f_dentry->d_inode;
+	struct inode	*ip = file_inode(filp);
 	uint64_t	zfs_flags = ITOZ(ip)->z_pflags;
 	unsigned int	ioctl_flags;
 	cred_t		*cr = CRED();