Message ID | 20180419124140.9309-27-hch@lst.de (mailing list archive) |
---|---|
State | Not Applicable |
Headers | show |
On 19/04/2018 14:41:27+0200, Christoph Hellwig wrote: > And stop trying to get a reference on the submodule, procfs code deals > with release after and unloaded module and thus removed proc entry. > Are you sure about that? The rtc module is not the one adding the procfs file so I'm not sure how the procfs code can handle it. > Signed-off-by: Christoph Hellwig <hch@lst.de> > --- > drivers/rtc/rtc-proc.c | 33 ++------------------------------- > 1 file changed, 2 insertions(+), 31 deletions(-) > > diff --git a/drivers/rtc/rtc-proc.c b/drivers/rtc/rtc-proc.c > index 31e7e23cc5be..a9dd9218fae2 100644 > --- a/drivers/rtc/rtc-proc.c > +++ b/drivers/rtc/rtc-proc.c > @@ -107,40 +107,11 @@ static int rtc_proc_show(struct seq_file *seq, void *offset) > return 0; > } > > -static int rtc_proc_open(struct inode *inode, struct file *file) > -{ > - int ret; > - struct rtc_device *rtc = PDE_DATA(inode); > - > - if (!try_module_get(rtc->owner)) > - return -ENODEV; > - > - ret = single_open(file, rtc_proc_show, rtc); > - if (ret) > - module_put(rtc->owner); > - return ret; > -} > - > -static int rtc_proc_release(struct inode *inode, struct file *file) > -{ > - int res = single_release(inode, file); > - struct rtc_device *rtc = PDE_DATA(inode); > - > - module_put(rtc->owner); > - return res; > -} > - > -static const struct file_operations rtc_proc_fops = { > - .open = rtc_proc_open, > - .read = seq_read, > - .llseek = seq_lseek, > - .release = rtc_proc_release, > -}; > - > void rtc_proc_add_device(struct rtc_device *rtc) > { > if (is_rtc_hctosys(rtc)) > - proc_create_data("driver/rtc", 0, NULL, &rtc_proc_fops, rtc); > + proc_create_single_data("driver/rtc", 0, NULL, rtc_proc_show, > + rtc); > } > > void rtc_proc_del_device(struct rtc_device *rtc) > -- > 2.17.0 >
On Thu, Apr 19, 2018 at 03:10:27PM +0200, Alexandre Belloni wrote: > On 19/04/2018 14:41:27+0200, Christoph Hellwig wrote: > > And stop trying to get a reference on the submodule, procfs code deals > > with release after and unloaded module and thus removed proc entry. > > > > Are you sure about that? The rtc module is not the one adding the procfs > file so I'm not sure how the procfs code can handle it. The proc file is removed from this call chain: <driver>_exit (module_exit handler) -> rtc_device_unregister -> rtc_proc_del_device -> remove_proc_entry remove_proc_entry takes care of waiting for currently active file operation instances and makes sure every new operation never calls into the actual proc file ops. Same behavior as in RTC exists all over the kernel.
diff --git a/drivers/rtc/rtc-proc.c b/drivers/rtc/rtc-proc.c index 31e7e23cc5be..a9dd9218fae2 100644 --- a/drivers/rtc/rtc-proc.c +++ b/drivers/rtc/rtc-proc.c @@ -107,40 +107,11 @@ static int rtc_proc_show(struct seq_file *seq, void *offset) return 0; } -static int rtc_proc_open(struct inode *inode, struct file *file) -{ - int ret; - struct rtc_device *rtc = PDE_DATA(inode); - - if (!try_module_get(rtc->owner)) - return -ENODEV; - - ret = single_open(file, rtc_proc_show, rtc); - if (ret) - module_put(rtc->owner); - return ret; -} - -static int rtc_proc_release(struct inode *inode, struct file *file) -{ - int res = single_release(inode, file); - struct rtc_device *rtc = PDE_DATA(inode); - - module_put(rtc->owner); - return res; -} - -static const struct file_operations rtc_proc_fops = { - .open = rtc_proc_open, - .read = seq_read, - .llseek = seq_lseek, - .release = rtc_proc_release, -}; - void rtc_proc_add_device(struct rtc_device *rtc) { if (is_rtc_hctosys(rtc)) - proc_create_data("driver/rtc", 0, NULL, &rtc_proc_fops, rtc); + proc_create_single_data("driver/rtc", 0, NULL, rtc_proc_show, + rtc); } void rtc_proc_del_device(struct rtc_device *rtc)
And stop trying to get a reference on the submodule, procfs code deals with release after and unloaded module and thus removed proc entry. Signed-off-by: Christoph Hellwig <hch@lst.de> --- drivers/rtc/rtc-proc.c | 33 ++------------------------------- 1 file changed, 2 insertions(+), 31 deletions(-)