Driver core fixes for 5.0-rc6
Here are some driver core fixes for 5.0-rc6. Well, not so much "driver core" as "debugfs". There's a lot of outstanding debugfs cleanup patches coming in through different subsystem trees, and in that process the debugfs core was found that it really should return errors when something bad happens, to prevent random files from showing up in the root of debugfs afterward. So debugfs was fixed up to handle this properly, and then two fixes for the relay and blk-mq code was needed as it was making invalid assumptions about debugfs return values. There's also a cacheinfo fix in here that resolves a tiny issue. All of these have been in linux-next for over a week with no reported problems. Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> -----BEGIN PGP SIGNATURE----- iG0EABECAC0WIQT0tgzFv3jCIUoxPcsxR9QN2y37KQUCXF069g8cZ3JlZ0Brcm9h aC5jb20ACgkQMUfUDdst+yk0+gCgy9PTVAJR5ZbYtWTJOTdBnd7pfqMAoMuGxc+6 LLEbfSykLRxEf5SeOJun =KP8e -----END PGP SIGNATURE----- Merge tag 'driver-core-5.0-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core Pull driver core fixes from Greg KH: "Here are some driver core fixes for 5.0-rc6. Well, not so much "driver core" as "debugfs". There's a lot of outstanding debugfs cleanup patches coming in through different subsystem trees, and in that process the debugfs core was found that it really should return errors when something bad happens, to prevent random files from showing up in the root of debugfs afterward. So debugfs was fixed up to handle this properly, and then two fixes for the relay and blk-mq code was needed as it was making invalid assumptions about debugfs return values. There's also a cacheinfo fix in here that resolves a tiny issue. All of these have been in linux-next for over a week with no reported problems" * tag 'driver-core-5.0-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core: blk-mq: protect debugfs_create_files() from failures relay: check return of create_buf_file() properly debugfs: debugfs_lookup() should return NULL if not found debugfs: return error values, not NULL debugfs: fix debugfs_rename parameter checking cacheinfo: Keep the old value if of_property_read_u32 fails
This commit is contained in:
commit
8c8e62cc98
|
@ -839,6 +839,9 @@ static const struct blk_mq_debugfs_attr blk_mq_debugfs_ctx_attrs[] = {
|
|||
static bool debugfs_create_files(struct dentry *parent, void *data,
|
||||
const struct blk_mq_debugfs_attr *attr)
|
||||
{
|
||||
if (IS_ERR_OR_NULL(parent))
|
||||
return false;
|
||||
|
||||
d_inode(parent)->i_private = data;
|
||||
|
||||
for (; attr->name; attr++) {
|
||||
|
|
|
@ -79,8 +79,7 @@ static void cache_size(struct cacheinfo *this_leaf, struct device_node *np)
|
|||
ct_idx = get_cacheinfo_idx(this_leaf->type);
|
||||
propname = cache_type_info[ct_idx].size_prop;
|
||||
|
||||
if (of_property_read_u32(np, propname, &this_leaf->size))
|
||||
this_leaf->size = 0;
|
||||
of_property_read_u32(np, propname, &this_leaf->size);
|
||||
}
|
||||
|
||||
/* not cache_line_size() because that's a macro in include/linux/cache.h */
|
||||
|
@ -114,8 +113,7 @@ static void cache_nr_sets(struct cacheinfo *this_leaf, struct device_node *np)
|
|||
ct_idx = get_cacheinfo_idx(this_leaf->type);
|
||||
propname = cache_type_info[ct_idx].nr_sets_prop;
|
||||
|
||||
if (of_property_read_u32(np, propname, &this_leaf->number_of_sets))
|
||||
this_leaf->number_of_sets = 0;
|
||||
of_property_read_u32(np, propname, &this_leaf->number_of_sets);
|
||||
}
|
||||
|
||||
static void cache_associativity(struct cacheinfo *this_leaf)
|
||||
|
|
|
@ -324,7 +324,7 @@ static struct dentry *failed_creating(struct dentry *dentry)
|
|||
inode_unlock(d_inode(dentry->d_parent));
|
||||
dput(dentry);
|
||||
simple_release_fs(&debugfs_mount, &debugfs_mount_count);
|
||||
return NULL;
|
||||
return ERR_PTR(-ENOMEM);
|
||||
}
|
||||
|
||||
static struct dentry *end_creating(struct dentry *dentry)
|
||||
|
@ -347,7 +347,7 @@ static struct dentry *__debugfs_create_file(const char *name, umode_t mode,
|
|||
dentry = start_creating(name, parent);
|
||||
|
||||
if (IS_ERR(dentry))
|
||||
return NULL;
|
||||
return dentry;
|
||||
|
||||
inode = debugfs_get_inode(dentry->d_sb);
|
||||
if (unlikely(!inode))
|
||||
|
@ -386,7 +386,8 @@ static struct dentry *__debugfs_create_file(const char *name, umode_t mode,
|
|||
* This function will return a pointer to a dentry if it succeeds. This
|
||||
* pointer must be passed to the debugfs_remove() function when the file is
|
||||
* to be removed (no automatic cleanup happens if your module is unloaded,
|
||||
* you are responsible here.) If an error occurs, %NULL will be returned.
|
||||
* you are responsible here.) If an error occurs, %ERR_PTR(-ERROR) will be
|
||||
* returned.
|
||||
*
|
||||
* If debugfs is not enabled in the kernel, the value -%ENODEV will be
|
||||
* returned.
|
||||
|
@ -464,7 +465,8 @@ EXPORT_SYMBOL_GPL(debugfs_create_file_unsafe);
|
|||
* This function will return a pointer to a dentry if it succeeds. This
|
||||
* pointer must be passed to the debugfs_remove() function when the file is
|
||||
* to be removed (no automatic cleanup happens if your module is unloaded,
|
||||
* you are responsible here.) If an error occurs, %NULL will be returned.
|
||||
* you are responsible here.) If an error occurs, %ERR_PTR(-ERROR) will be
|
||||
* returned.
|
||||
*
|
||||
* If debugfs is not enabled in the kernel, the value -%ENODEV will be
|
||||
* returned.
|
||||
|
@ -495,7 +497,8 @@ EXPORT_SYMBOL_GPL(debugfs_create_file_size);
|
|||
* This function will return a pointer to a dentry if it succeeds. This
|
||||
* pointer must be passed to the debugfs_remove() function when the file is
|
||||
* to be removed (no automatic cleanup happens if your module is unloaded,
|
||||
* you are responsible here.) If an error occurs, %NULL will be returned.
|
||||
* you are responsible here.) If an error occurs, %ERR_PTR(-ERROR) will be
|
||||
* returned.
|
||||
*
|
||||
* If debugfs is not enabled in the kernel, the value -%ENODEV will be
|
||||
* returned.
|
||||
|
@ -506,7 +509,7 @@ struct dentry *debugfs_create_dir(const char *name, struct dentry *parent)
|
|||
struct inode *inode;
|
||||
|
||||
if (IS_ERR(dentry))
|
||||
return NULL;
|
||||
return dentry;
|
||||
|
||||
inode = debugfs_get_inode(dentry->d_sb);
|
||||
if (unlikely(!inode))
|
||||
|
@ -545,7 +548,7 @@ struct dentry *debugfs_create_automount(const char *name,
|
|||
struct inode *inode;
|
||||
|
||||
if (IS_ERR(dentry))
|
||||
return NULL;
|
||||
return dentry;
|
||||
|
||||
inode = debugfs_get_inode(dentry->d_sb);
|
||||
if (unlikely(!inode))
|
||||
|
@ -581,8 +584,8 @@ EXPORT_SYMBOL(debugfs_create_automount);
|
|||
* This function will return a pointer to a dentry if it succeeds. This
|
||||
* pointer must be passed to the debugfs_remove() function when the symbolic
|
||||
* link is to be removed (no automatic cleanup happens if your module is
|
||||
* unloaded, you are responsible here.) If an error occurs, %NULL will be
|
||||
* returned.
|
||||
* unloaded, you are responsible here.) If an error occurs, %ERR_PTR(-ERROR)
|
||||
* will be returned.
|
||||
*
|
||||
* If debugfs is not enabled in the kernel, the value -%ENODEV will be
|
||||
* returned.
|
||||
|
@ -594,12 +597,12 @@ struct dentry *debugfs_create_symlink(const char *name, struct dentry *parent,
|
|||
struct inode *inode;
|
||||
char *link = kstrdup(target, GFP_KERNEL);
|
||||
if (!link)
|
||||
return NULL;
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
dentry = start_creating(name, parent);
|
||||
if (IS_ERR(dentry)) {
|
||||
kfree(link);
|
||||
return NULL;
|
||||
return dentry;
|
||||
}
|
||||
|
||||
inode = debugfs_get_inode(dentry->d_sb);
|
||||
|
@ -787,6 +790,13 @@ struct dentry *debugfs_rename(struct dentry *old_dir, struct dentry *old_dentry,
|
|||
struct dentry *dentry = NULL, *trap;
|
||||
struct name_snapshot old_name;
|
||||
|
||||
if (IS_ERR(old_dir))
|
||||
return old_dir;
|
||||
if (IS_ERR(new_dir))
|
||||
return new_dir;
|
||||
if (IS_ERR_OR_NULL(old_dentry))
|
||||
return old_dentry;
|
||||
|
||||
trap = lock_rename(new_dir, old_dir);
|
||||
/* Source or destination directories don't exist? */
|
||||
if (d_really_is_negative(old_dir) || d_really_is_negative(new_dir))
|
||||
|
@ -820,7 +830,9 @@ exit:
|
|||
if (dentry && !IS_ERR(dentry))
|
||||
dput(dentry);
|
||||
unlock_rename(new_dir, old_dir);
|
||||
return NULL;
|
||||
if (IS_ERR(dentry))
|
||||
return dentry;
|
||||
return ERR_PTR(-EINVAL);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(debugfs_rename);
|
||||
|
||||
|
|
|
@ -428,6 +428,8 @@ static struct dentry *relay_create_buf_file(struct rchan *chan,
|
|||
dentry = chan->cb->create_buf_file(tmpname, chan->parent,
|
||||
S_IRUSR, buf,
|
||||
&chan->is_global);
|
||||
if (IS_ERR(dentry))
|
||||
dentry = NULL;
|
||||
|
||||
kfree(tmpname);
|
||||
|
||||
|
@ -461,7 +463,7 @@ static struct rchan_buf *relay_open_buf(struct rchan *chan, unsigned int cpu)
|
|||
dentry = chan->cb->create_buf_file(NULL, NULL,
|
||||
S_IRUSR, buf,
|
||||
&chan->is_global);
|
||||
if (WARN_ON(dentry))
|
||||
if (IS_ERR_OR_NULL(dentry))
|
||||
goto free_buf;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue