[RAMEN9610-9428] debugfs: call debugfs_real_fops() only after debugfs_file_get()
authorNicolai Stange <nicstange@gmail.com>
Mon, 30 Oct 2017 23:15:53 +0000 (00:15 +0100)
committerhskang <hs1218.kang@samsung.com>
Thu, 13 Dec 2018 11:42:01 +0000 (20:42 +0900)
The current implementation of debugfs_real_fops() relies on a
debugfs_fsdata instance to be installed at ->d_fsdata.

With future patches introducing lazy allocation of these, this requirement
will be guaranteed to be fullfilled only inbetween a
debugfs_file_get()/debugfs_file_put() pair.

The full proxies' fops implemented by debugfs happen to be the only
offenders. Fix them up by moving their debugfs_real_fops() calls past those
to debugfs_file_get().

full_proxy_release() is special as it doesn't invoke debugfs_file_get() at
all. Leave it alone for now.

Signed-off-by: Nicolai Stange <nicstange@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
fs/debugfs/file.c

index 53f5c9a2af88279805061028486f702887db38ca..bc3549c95574ad9d390879cb788b0dc5eb90ea9c 100644 (file)
@@ -144,13 +144,13 @@ const struct file_operations debugfs_open_proxy_file_operations = {
 static ret_type full_proxy_ ## name(proto)                             \
 {                                                                      \
        struct dentry *dentry = F_DENTRY(filp);                 \
-       const struct file_operations *real_fops =                       \
-               debugfs_real_fops(filp);                                \
+       const struct file_operations *real_fops;                        \
        ret_type r;                                                     \
                                                                        \
        r = debugfs_file_get(dentry);                                   \
        if (unlikely(r))                                                \
                return r;                                               \
+       real_fops = debugfs_real_fops(filp);                            \
        r = real_fops->name(args);                                      \
        debugfs_file_put(dentry);                                       \
        return r;                                                       \
@@ -177,13 +177,14 @@ FULL_PROXY_FUNC(unlocked_ioctl, long, filp,
 static unsigned int full_proxy_poll(struct file *filp,
                                struct poll_table_struct *wait)
 {
-       const struct file_operations *real_fops = debugfs_real_fops(filp);
        struct dentry *dentry = F_DENTRY(filp);
        unsigned int r = 0;
+       const struct file_operations *real_fops;
 
        if (debugfs_file_get(dentry))
                return POLLHUP;
 
+       real_fops = debugfs_real_fops(filp);
        r = real_fops->poll(filp, wait);
        debugfs_file_put(dentry);
        return r;