]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
debugfs: unproxify files created through debugfs_create_blob()
authorNicolai Stange <nicstange@gmail.com>
Tue, 22 Mar 2016 13:11:19 +0000 (14:11 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 12 Apr 2016 21:14:21 +0000 (14:14 -0700)
Currently, the struct file_operations fops_blob associated with files
created through the debugfs_create_blob() helpers are not file
lifetime aware.

Thus, a lifetime managing proxy is created around fops_blob each time such
a file is opened which is an unnecessary waste of resources.

Implement file lifetime management for the fops_bool file_operations.
Namely, make read_file_blob() safe gainst file removals by means of
debugfs_use_file_start() and debugfs_use_file_finish().

Make debugfs_create_blob() create its files in non-proxying operation mode
by means of debugfs_create_file_unsafe().

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

index 8a548bee1b3d68b277ed7028a93e7edf5a703906..2e86d66f7850368c2afa81fb0e1a9adc8149e872 100644 (file)
@@ -842,8 +842,15 @@ static ssize_t read_file_blob(struct file *file, char __user *user_buf,
                              size_t count, loff_t *ppos)
 {
        struct debugfs_blob_wrapper *blob = file->private_data;
-       return simple_read_from_buffer(user_buf, count, ppos, blob->data,
-                       blob->size);
+       ssize_t r;
+       int srcu_idx;
+
+       r = debugfs_use_file_start(F_DENTRY(file), &srcu_idx);
+       if (likely(!r))
+               r = simple_read_from_buffer(user_buf, count, ppos, blob->data,
+                                       blob->size);
+       debugfs_use_file_finish(srcu_idx);
+       return r;
 }
 
 static const struct file_operations fops_blob = {
@@ -880,7 +887,7 @@ struct dentry *debugfs_create_blob(const char *name, umode_t mode,
                                   struct dentry *parent,
                                   struct debugfs_blob_wrapper *blob)
 {
-       return debugfs_create_file(name, mode, parent, blob, &fops_blob);
+       return debugfs_create_file_unsafe(name, mode, parent, blob, &fops_blob);
 }
 EXPORT_SYMBOL_GPL(debugfs_create_blob);