From 34b9c77c9ab2794d4e912461e4c1080c4b1f6184 Mon Sep 17 00:00:00 2001 From: Shaun Ruffell Date: Sun, 23 Feb 2020 19:39:24 -0600 Subject: [PATCH] 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 --- 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(-) diff --git a/drivers/dahdi/dahdi-base.c b/drivers/dahdi/dahdi-base.c index d05eff9..4fb06d9 100644 --- a/drivers/dahdi/dahdi-base.c +++ b/drivers/dahdi/dahdi-base.c @@ -1015,6 +1015,14 @@ static int dahdi_proc_open(struct inode *inode, struct file *file) 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 dahdi_proc_ops = { .llseek = seq_lseek, .release = single_release, }; +#endif /* DAHDI_HAVE_PROC_OPS */ #endif diff --git a/drivers/dahdi/dahdi_dynamic_ethmf.c b/drivers/dahdi/dahdi_dynamic_ethmf.c index b729079..022afc7 100644 --- a/drivers/dahdi/dahdi_dynamic_ethmf.c +++ b/drivers/dahdi/dahdi_dynamic_ethmf.c @@ -733,12 +733,22 @@ static int ztdethmf_proc_open(struct inode *inode, struct file *file) 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) diff --git a/drivers/dahdi/xpp/card_bri.c b/drivers/dahdi/xpp/card_bri.c index 12efecf..5d819ca 100644 --- 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 *xpd, __u8 value); 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 inode *inode, struct file *file) 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) diff --git a/drivers/dahdi/xpp/card_fxo.c b/drivers/dahdi/xpp/card_fxo.c index 1dbd299..82dbb7a 100644 --- 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 inode *inode, struct file *file) 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) diff --git a/drivers/dahdi/xpp/card_fxs.c b/drivers/dahdi/xpp/card_fxs.c index a3a9233..bb1c169 100644 --- 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 inode *inode, struct file *file) 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 inode *inode, struct file *file) 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 diff --git a/drivers/dahdi/xpp/xbus-core.c b/drivers/dahdi/xpp/xbus-core.c index fc4ce7b..ed7c0f9 100644 --- a/drivers/dahdi/xpp/xbus-core.c +++ b/drivers/dahdi/xpp/xbus-core.c @@ -50,8 +50,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 */ @@ -65,8 +72,15 @@ static DEF_PARM_BOOL(dahdi_autoreg, 0, 0444, "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); @@ -1828,13 +1842,22 @@ static int xbus_read_proc_open(struct inode *inode, struct file *file) 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, @@ -1927,11 +1950,19 @@ static int proc_xbus_command_open(struct inode *inode, struct file *file) 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) @@ -1961,13 +1992,22 @@ static int xpp_proc_read_open(struct inode *inode, struct file *file) 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 diff --git a/drivers/dahdi/xpp/xpp_dahdi.c b/drivers/dahdi/xpp/xpp_dahdi.c index ecc272b..fd8b835 100644 --- 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 inode *inode, struct file *file) 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 diff --git a/drivers/dahdi/xpp/xpp_usb.c b/drivers/dahdi/xpp/xpp_usb.c index 1a591b1..bae2f57 100644 --- a/drivers/dahdi/xpp/xpp_usb.c +++ b/drivers/dahdi/xpp/xpp_usb.c @@ -227,9 +227,14 @@ static void xpp_receive_callback(struct urb *urb); 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 /*------------------------------------------------------------------*/ @@ -1108,13 +1113,22 @@ static int xusb_read_proc_open(struct inode *inode, struct file *file) 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 diff --git a/include/dahdi/kernel.h b/include/dahdi/kernel.h index cf629eb..dc16f81 100644 --- a/include/dahdi/kernel.h +++ b/include/dahdi/kernel.h @@ -62,6 +62,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 @@ -1369,6 +1371,10 @@ static inline short dahdi_txtone_nextsample(struct dahdi_chan *ss) /*! 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 @@ -1479,14 +1485,13 @@ static inline void *PDE_DATA(const struct inode *inode) #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) {