Commit 83b711cb authored by Nicolai Stange's avatar Nicolai Stange Committed by Greg Kroah-Hartman

debugfs: unproxify files created through debugfs_create_blob()

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: default avatarNicolai Stange <nicstange@gmail.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 4d45f797
...@@ -842,8 +842,15 @@ static ssize_t read_file_blob(struct file *file, char __user *user_buf, ...@@ -842,8 +842,15 @@ static ssize_t read_file_blob(struct file *file, char __user *user_buf,
size_t count, loff_t *ppos) size_t count, loff_t *ppos)
{ {
struct debugfs_blob_wrapper *blob = file->private_data; struct debugfs_blob_wrapper *blob = file->private_data;
return simple_read_from_buffer(user_buf, count, ppos, blob->data, ssize_t r;
blob->size); 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 = { static const struct file_operations fops_blob = {
...@@ -880,7 +887,7 @@ struct dentry *debugfs_create_blob(const char *name, umode_t mode, ...@@ -880,7 +887,7 @@ struct dentry *debugfs_create_blob(const char *name, umode_t mode,
struct dentry *parent, struct dentry *parent,
struct debugfs_blob_wrapper *blob) 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); EXPORT_SYMBOL_GPL(debugfs_create_blob);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment