From 34b9c77c9ab2794d4e912461e4c1080c4b1f6184 Mon Sep 17 00:00:00 2001
From: Shaun Ruffell <sruffell@sruffell.net>
Date: Sun, 23 Feb 2020 19:39:24 -0600
Subject: [PATCH 05/12] Use proc_ops on kernels >= 5.6

In commit (d56c0d45f0e27 "proc: decouple proc from VFS with "struct proc_ops"")
[1], proc_create_data no longer takes a file_operations structure, but instead
takes a struct proc_ops in order to conserve memory in the kernel.

This change is necessary for DAHDI to work with kernels >= 5.6

[1] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=d56c0d45f0e27f814e87a1676b6bd

Signed-off-by: Shaun Ruffell <sruffell@sruffell.net>
---
 drivers/dahdi/dahdi-base.c          |  9 +++++
 drivers/dahdi/dahdi_dynamic_ethmf.c | 18 +++++++--
 drivers/dahdi/xpp/card_bri.c        | 23 ++++++++---
 drivers/dahdi/xpp/card_fxo.c        | 25 +++++++++---
 drivers/dahdi/xpp/card_fxs.c        | 35 +++++++++++++---
 drivers/dahdi/xpp/xbus-core.c       | 62 ++++++++++++++++++++++++-----
 drivers/dahdi/xpp/xpp_dahdi.c       | 23 ++++++++---
 drivers/dahdi/xpp/xpp_usb.c         | 26 +++++++++---
 include/dahdi/kernel.h              | 11 +++--
 9 files changed, 187 insertions(+), 45 deletions(-)

--- a/drivers/dahdi/dahdi-base.c
+++ b/drivers/dahdi/dahdi-base.c
@@ -1015,6 +1015,14 @@ static int dahdi_proc_open(struct inode
 	return single_open(file, dahdi_seq_show, PDE_DATA(inode));
 }
 
+#ifdef DAHDI_HAVE_PROC_OPS
+static const struct proc_ops dahdi_proc_ops = {
+	.proc_open		= dahdi_proc_open,
+	.proc_read		= seq_read,
+	.proc_lseek		= seq_lseek,
+	.proc_release		= single_release,
+};
+#else
 static const struct file_operations dahdi_proc_ops = {
 	.owner		= THIS_MODULE,
 	.open		= dahdi_proc_open,
@@ -1022,6 +1030,7 @@ static const struct file_operations dahd
 	.llseek		= seq_lseek,
 	.release	= single_release,
 };
+#endif /* DAHDI_HAVE_PROC_OPS */
 
 #endif
 
--- a/drivers/dahdi/dahdi_dynamic_ethmf.c
+++ b/drivers/dahdi/dahdi_dynamic_ethmf.c
@@ -733,12 +733,22 @@ static int ztdethmf_proc_open(struct ino
 	return single_open(file, ztdethmf_proc_show, NULL);
 }
 
+#ifdef DAHDI_HAVE_PROC_OPS
+static const struct proc_ops ztdethmf_proc_fops = {
+	.proc_open	= ztdethmf_proc_open,
+	.proc_read	= seq_read,
+	.proc_lseek	= seq_lseek,
+	.proc_release	= seq_release,
+};
+#else
 static const struct file_operations ztdethmf_proc_fops = {
-	.open           = ztdethmf_proc_open,
-	.read           = seq_read,
-	.llseek         = seq_lseek,
-	.release        = seq_release,
+	.owner		= THIS_MODULE,
+	.open		= ztdethmf_proc_open,
+	.read		= seq_read,
+	.llseek		= seq_lseek,
+	.release	= seq_release,
 };
+#endif /* DAHDI_HAVE_PROC_OPS */
 #endif
 
 static int __init ztdethmf_init(void)
--- a/drivers/dahdi/xpp/card_bri.c
+++ b/drivers/dahdi/xpp/card_bri.c
@@ -153,8 +153,12 @@ static int write_state_register(xpd_t *x
 static bool bri_packet_is_valid(xpacket_t *pack);
 static void bri_packet_dump(const char *msg, xpacket_t *pack);
 #ifdef	CONFIG_PROC_FS
+#ifdef DAHDI_HAVE_PROC_OPS
+static const struct proc_ops proc_bri_info_ops;
+#else
 static const struct file_operations proc_bri_info_ops;
 #endif
+#endif
 static int bri_spanconfig(struct file *file, struct dahdi_span *span,
 			  struct dahdi_lineconfig *lc);
 static int bri_chanconfig(struct file *file, struct dahdi_chan *chan,
@@ -1740,13 +1744,22 @@ static int proc_bri_info_open(struct ino
 	return single_open(file, proc_bri_info_show, PDE_DATA(inode));
 }
 
+#ifdef DAHDI_HAVE_PROC_OPS
+static const struct proc_ops proc_bri_info_ops = {
+	.proc_open		= proc_bri_info_open,
+	.proc_read		= seq_read,
+	.proc_lseek		= seq_lseek,
+	.proc_release		= single_release,
+};
+#else
 static const struct file_operations proc_bri_info_ops = {
-	.owner		= THIS_MODULE,
-	.open		= proc_bri_info_open,
-	.read		= seq_read,
-	.llseek		= seq_lseek,
-	.release	= single_release,
+	.owner			= THIS_MODULE,
+	.open			= proc_bri_info_open,
+	.read			= seq_read,
+	.llseek			= seq_lseek,
+	.release		= single_release,
 };
+#endif /* DAHDI_HAVE_PROC_OPS */
 #endif
 
 static int bri_xpd_probe(struct device *dev)
--- a/drivers/dahdi/xpp/card_fxo.c
+++ b/drivers/dahdi/xpp/card_fxo.c
@@ -107,9 +107,13 @@ enum fxo_leds {
 static bool fxo_packet_is_valid(xpacket_t *pack);
 static void fxo_packet_dump(const char *msg, xpacket_t *pack);
 #ifdef CONFIG_PROC_FS
+#ifdef DAHDI_HAVE_PROC_OPS
+static const struct proc_ops proc_fxo_info_ops;
+#else
 static const struct file_operations proc_fxo_info_ops;
+#endif
 #ifdef	WITH_METERING
-static const struct file_operations proc_xpd_metering_ops;
+static const struct proc_ops proc_xpd_metering_ops;
 #endif
 #endif
 static void dahdi_report_battery(xpd_t *xpd, lineno_t chan);
@@ -1484,13 +1488,22 @@ static int proc_fxo_info_open(struct ino
 	return single_open(file, proc_fxo_info_show, PDE_DATA(inode));
 }
 
+#ifdef DAHDI_HAVE_PROC_OPS
+static const struct proc_ops proc_fxo_info_ops = {
+	.proc_open		= proc_fxo_info_open,
+	.proc_read		= seq_read,
+	.proc_lseek		= seq_lseek,
+	.proc_release		= single_release,
+};
+#else
 static const struct file_operations proc_fxo_info_ops = {
-	.owner		= THIS_MODULE,
-	.open		= proc_fxo_info_open,
-	.read		= seq_read,
-	.llseek		= seq_lseek,
-	.release	= single_release,
+	.owner			= THIS_MODULE,
+	.open			= proc_fxo_info_open,
+	.read			= seq_read,
+	.llseek			= seq_lseek,
+	.release		= single_release,
 };
+#endif
 
 #ifdef	WITH_METERING
 static int proc_xpd_metering_show(struct seq_file *sfile, void *not_used)
--- a/drivers/dahdi/xpp/card_fxs.c
+++ b/drivers/dahdi/xpp/card_fxs.c
@@ -160,11 +160,19 @@ enum neon_state {
 static bool fxs_packet_is_valid(xpacket_t *pack);
 static void fxs_packet_dump(const char *msg, xpacket_t *pack);
 #ifdef CONFIG_PROC_FS
+#ifdef DAHDI_HAVE_PROC_OPS
+static const struct proc_ops proc_fxs_info_ops;
+#else
 static const struct file_operations proc_fxs_info_ops;
+#endif
 #ifdef	WITH_METERING
+#ifdef DAHDI_HAVE_PROC_OPS
+static const struct proc_ops proc_xpd_metering_ops;
+#else
 static const struct file_operations proc_xpd_metering_ops;
 #endif
 #endif
+#endif
 static void start_stop_vm_led(xbus_t *xbus, xpd_t *xpd, lineno_t pos);
 
 #define	PROC_FXS_INFO_FNAME	"fxs_info"
@@ -2115,13 +2123,22 @@ static int proc_fxs_info_open(struct ino
 	return single_open(file, proc_fxs_info_show, PDE_DATA(inode));
 }
 
+#ifdef DAHDI_HAVE_PROC_OPS
+static const struct proc_ops proc_fxs_info_ops = {
+	.proc_open		= proc_fxs_info_open,
+	.proc_read		= seq_read,
+	.proc_lseek		= seq_lseek,
+	.proc_release		= single_release,
+};
+#else
 static const struct file_operations proc_fxs_info_ops = {
-	.owner		= THIS_MODULE,
-	.open		= proc_fxs_info_open,
-	.read		= seq_read,
-	.llseek		= seq_lseek,
-	.release	= single_release,
+	.owner			= THIS_MODULE,
+	.open			= proc_fxs_info_open,
+	.read			= seq_read,
+	.llseek			= seq_lseek,
+	.release		= single_release,
 };
+#endif
 
 #ifdef	WITH_METERING
 static ssize_t proc_xpd_metering_write(struct file *file,
@@ -2165,12 +2182,20 @@ static int proc_xpd_metering_open(struct
 	file->private_data = PDE_DATA(inode);
 }
 
+#ifdef DAHDI_HAVE_PROC_OPS
+static const struct proc_ops proc_xpd_metering_ops = {
+	.proc_open	= proc_xpd_metering_open,
+	.proc_write	= proc_xpd_metering_write,
+	.proc_release	= single_release,
+};
+#else
 static const struct file_operations proc_xpd_metering_ops = {
 	.owner		= THIS_MODULE,
 	.open		= proc_xpd_metering_open,
 	.write		= proc_xpd_metering_write,
 	.release	= single_release,
 };
+#endif /* DAHDI_HAVE_PROC_OPS */
 #endif
 #endif
 
--- a/drivers/dahdi/xpp/xbus-core.c
+++ b/drivers/dahdi/xpp/xbus-core.c
@@ -51,8 +51,15 @@ static const char rcsid[] = "$Id$";
 #ifdef	PROTOCOL_DEBUG
 #ifdef	CONFIG_PROC_FS
 #define	PROC_XBUS_COMMAND	"command"
+
+#ifdef DAHDI_HAVE_PROC_OPS
+static const struct proc_ops proc_xbus_command_ops;
+#else
 static const struct file_operations proc_xbus_command_ops;
+#endif /* DAHDI_HAVE_PROC_OPS */
+
 #endif
+
 #endif
 
 /* Command line parameters */
@@ -66,8 +73,15 @@ static DEF_PARM_BOOL(dahdi_autoreg, 0, 0
 		     "Register devices automatically (1) or not (0). UNUSED.");
 
 #ifdef	CONFIG_PROC_FS
+
+#ifdef DAHDI_HAVE_PROC_OPS
+static const struct proc_ops xbus_read_proc_ops;
+#else
 static const struct file_operations xbus_read_proc_ops;
-#endif
+#endif /* DAHDI_HAVE_PROC_OPS */
+
+#endif /* CONFIG_PROC_FS */
+
 static void transport_init(xbus_t *xbus, struct xbus_ops *ops,
 			   ushort max_send_size,
 			   struct device *transport_device, void *priv);
@@ -1831,13 +1845,22 @@ static int xbus_read_proc_open(struct in
 	return single_open(file, xbus_proc_show, PDE_DATA(inode));
 }
 
+#ifdef DAHDI_HAVE_PROC_OPS
+static const struct proc_ops xbus_read_proc_ops = {
+	.proc_open		= xbus_read_proc_open,
+	.proc_read		= seq_read,
+	.proc_lseek		= seq_lseek,
+	.proc_release		= single_release,
+};
+#else
 static const struct file_operations xbus_read_proc_ops = {
-	.owner		= THIS_MODULE,
-	.open		= xbus_read_proc_open,
-	.read		= seq_read,
-	.llseek		= seq_lseek,
-	.release	= single_release,
+	.owner			= THIS_MODULE,
+	.open			= xbus_read_proc_open,
+	.read			= seq_read,
+	.llseek			= seq_lseek,
+	.release		= single_release,
 };
+#endif /* DAHDI_HAVE_PROC_OPS */
 
 #ifdef	PROTOCOL_DEBUG
 static ssize_t proc_xbus_command_write(struct file *file,
@@ -1930,11 +1953,19 @@ static int proc_xbus_command_open(struct
 	return 0;
 }
 
+#ifdef DAHDI_HAVE_PROC_OPS
+static const struct proc_ops proc_xbus_command_ops = {
+	.proc_open		= proc_xbus_command_open,
+	.proc_write		= proc_xbus_command_write,
+};
+#else
 static const struct file_operations proc_xbus_command_ops = {
 	.owner		= THIS_MODULE,
 	.open		= proc_xbus_command_open,
 	.write		= proc_xbus_command_write,
 };
+#endif /* DAHDI_HAVE_PROC_OPS */
+
 #endif
 
 static int xpp_proc_read_show(struct seq_file *sfile, void *data)
@@ -1964,13 +1995,22 @@ static int xpp_proc_read_open(struct ino
 	return single_open(file, xpp_proc_read_show, PDE_DATA(inode));
 }
 
+#ifdef DAHDI_HAVE_PROC_OPS
+static const struct proc_ops xpp_proc_read_ops = {
+	.proc_open		= xpp_proc_read_open,
+	.proc_read		= seq_read,
+	.proc_lseek		= seq_lseek,
+	.proc_release		= single_release,
+};
+#else
 static const struct file_operations xpp_proc_read_ops = {
-	.owner		= THIS_MODULE,
-	.open		= xpp_proc_read_open,
-	.read		= seq_read,
-	.llseek		= seq_lseek,
-	.release	= single_release,
+	.owner			= THIS_MODULE,
+	.open			= xpp_proc_read_open,
+	.read			= seq_read,
+	.llseek			= seq_lseek,
+	.release		= single_release,
 };
+#endif /* DAHDI_HAVE_PROC_OPS */
 
 #endif
 
--- a/drivers/dahdi/xpp/xpp_dahdi.c
+++ b/drivers/dahdi/xpp/xpp_dahdi.c
@@ -103,8 +103,12 @@ int total_registered_spans(void)
 }
 
 #ifdef	CONFIG_PROC_FS
+#ifdef DAHDI_HAVE_PROC_OPS
+static const struct proc_ops xpd_read_proc_ops;
+#else
 static const struct file_operations xpd_read_proc_ops;
 #endif
+#endif
 
 /*------------------------- XPD Management -------------------------*/
 
@@ -392,13 +396,22 @@ static int xpd_read_proc_open(struct ino
 	return single_open(file, xpd_read_proc_show, PDE_DATA(inode));
 }
 
+#ifdef DAHDI_HAVE_PROC_OPS
+static const struct proc_ops xpd_read_proc_ops = {
+	.proc_open		= xpd_read_proc_open,
+	.proc_read		= seq_read,
+	.proc_lseek		= seq_lseek,
+	.proc_release		= single_release,
+};
+#else
 static const struct file_operations xpd_read_proc_ops = {
-	.owner		= THIS_MODULE,
-	.open		= xpd_read_proc_open,
-	.read		= seq_read,
-	.llseek		= seq_lseek,
-	.release	= single_release,
+	.owner			= THIS_MODULE,
+	.open			= xpd_read_proc_open,
+	.read			= seq_read,
+	.llseek			= seq_lseek,
+	.release		= single_release,
 };
+#endif
 
 #endif
 
--- a/drivers/dahdi/xpp/xpp_usb.c
+++ b/drivers/dahdi/xpp/xpp_usb.c
@@ -232,9 +232,14 @@ static void xpp_receive_callback(struct
 static int xusb_probe(struct usb_interface *interface,
 		      const struct usb_device_id *id);
 static void xusb_disconnect(struct usb_interface *interface);
-#ifdef	CONFIG_PROC_FS
+
+#ifdef CONFIG_PROC_FS
+#ifdef DAHDI_HAVE_PROC_OPS
+static const struct proc_ops xusb_read_proc_ops;
+#else
 static const struct file_operations xusb_read_proc_ops;
 #endif
+#endif
 
 /*------------------------------------------------------------------*/
 
@@ -1113,13 +1118,22 @@ static int xusb_read_proc_open(struct in
 	return single_open(file, xusb_read_proc_show, PDE_DATA(inode));
 }
 
+#ifdef DAHDI_HAVE_PROC_OPS
+static const struct proc_ops xusb_read_proc_ops = {
+	.proc_open		= xusb_read_proc_open,
+	.proc_read		= seq_read,
+	.proc_lseek		= seq_lseek,
+	.proc_release		= single_release,
+};
+#else
 static const struct file_operations xusb_read_proc_ops = {
-	.owner		= THIS_MODULE,
-	.open		= xusb_read_proc_open,
-	.read		= seq_read,
-	.llseek		= seq_lseek,
-	.release	= single_release,
+	.owner			= THIS_MODULE,
+	.open			= xusb_read_proc_open,
+	.read			= seq_read,
+	.llseek			= seq_lseek,
+	.release		= single_release,
 };
+#endif
 
 
 #endif
--- a/include/dahdi/kernel.h
+++ b/include/dahdi/kernel.h
@@ -68,6 +68,8 @@
 #define HAVE_NET_DEVICE_OPS
 #endif
 
+#define DAHDI_HAVE_PROC_OPS
+
 /* __dev* were removed in 3.8. They still have effect in 2.6.18. */
 #ifndef __devinit
 #  define __devinit
@@ -1375,6 +1377,10 @@ static inline short dahdi_txtone_nextsam
 /*! Maximum audio mask */
 #define DAHDI_FORMAT_AUDIO_MASK	((1 << 16) - 1)
 
+#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 6, 0)
+
+#undef DAHDI_HAVE_PROC_OPS
+
 #if LINUX_VERSION_CODE < KERNEL_VERSION(4, 15, 0)
 
 #ifndef TIMER_DATA_TYPE
@@ -1485,14 +1491,13 @@ static inline void *PDE_DATA(const struc
 #endif /* 4.10.0 */
 #endif /* 4.11.0 */
 #endif /* 4.13.0 */
-#else /* >= 4.15.0 */
+#endif /* 4.15.0 */
+#endif /* 5.6 */
 
 #ifndef TIMER_DATA_TYPE
 #define TIMER_DATA_TYPE struct timer_list *
 #endif
 
-#endif /* 4.15.0 */
-
 #ifndef dahdi_ktime_equal
 static inline int dahdi_ktime_equal(const ktime_t cmp1, const ktime_t cmp2)
 {
