Merge tag 'driver-core-5.3-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core
Pull driver core and debugfs updates from Greg KH: "Here is the "big" driver core and debugfs changes for 5.3-rc1 It's a lot of different patches, all across the tree due to some api changes and lots of debugfs cleanups. Other than the debugfs cleanups, in this set of changes we have: - bus iteration function cleanups - scripts/get_abi.pl tool to display and parse Documentation/ABI entries in a simple way - cleanups to Documenatation/ABI/ entries to make them parse easier due to typos and other minor things - default_attrs use for some ktype users - driver model documentation file conversions to .rst - compressed firmware file loading - deferred probe fixes All of these have been in linux-next for a while, with a bunch of merge issues that Stephen has been patient with me for" * tag 'driver-core-5.3-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core: (102 commits) debugfs: make error message a bit more verbose orangefs: fix build warning from debugfs cleanup patch ubifs: fix build warning after debugfs cleanup patch driver: core: Allow subsystems to continue deferring probe drivers: base: cacheinfo: Ensure cpu hotplug work is done before Intel RDT arch_topology: Remove error messages on out-of-memory conditions lib: notifier-error-inject: no need to check return value of debugfs_create functions swiotlb: no need to check return value of debugfs_create functions ceph: no need to check return value of debugfs_create functions sunrpc: no need to check return value of debugfs_create functions ubifs: no need to check return value of debugfs_create functions orangefs: no need to check return value of debugfs_create functions nfsd: no need to check return value of debugfs_create functions lib: 842: no need to check return value of debugfs_create functions debugfs: provide pr_fmt() macro debugfs: log errors when something goes wrong drivers: s390/cio: Fix compilation warning about const qualifiers drivers: Add generic helper to match by of_node driver_find_device: Unify the match function with class_find_device() bus_find_device: Unify the match callback with class_find_device ...
This commit is contained in:
@@ -303,11 +303,12 @@ static ssize_t raid_bytes_show(struct kobject *kobj,
|
||||
return snprintf(buf, PAGE_SIZE, "%llu\n", val);
|
||||
}
|
||||
|
||||
static struct attribute *raid_attributes[] = {
|
||||
static struct attribute *raid_attrs[] = {
|
||||
BTRFS_ATTR_PTR(raid, total_bytes),
|
||||
BTRFS_ATTR_PTR(raid, used_bytes),
|
||||
NULL
|
||||
};
|
||||
ATTRIBUTE_GROUPS(raid);
|
||||
|
||||
static void release_raid_kobj(struct kobject *kobj)
|
||||
{
|
||||
@@ -317,7 +318,7 @@ static void release_raid_kobj(struct kobject *kobj)
|
||||
struct kobj_type btrfs_raid_ktype = {
|
||||
.sysfs_ops = &kobj_sysfs_ops,
|
||||
.release = release_raid_kobj,
|
||||
.default_attrs = raid_attributes,
|
||||
.default_groups = raid_groups,
|
||||
};
|
||||
|
||||
#define SPACE_INFO_ATTR(field) \
|
||||
@@ -364,6 +365,7 @@ static struct attribute *space_info_attrs[] = {
|
||||
BTRFS_ATTR_PTR(space_info, total_bytes_pinned),
|
||||
NULL,
|
||||
};
|
||||
ATTRIBUTE_GROUPS(space_info);
|
||||
|
||||
static void space_info_release(struct kobject *kobj)
|
||||
{
|
||||
@@ -375,7 +377,7 @@ static void space_info_release(struct kobject *kobj)
|
||||
struct kobj_type space_info_ktype = {
|
||||
.sysfs_ops = &kobj_sysfs_ops,
|
||||
.release = space_info_release,
|
||||
.default_attrs = space_info_attrs,
|
||||
.default_groups = space_info_groups,
|
||||
};
|
||||
|
||||
static const struct attribute *allocation_attrs[] = {
|
||||
@@ -910,12 +912,10 @@ void btrfs_sysfs_feature_update(struct btrfs_fs_info *fs_info,
|
||||
ret = sysfs_create_group(fsid_kobj, &btrfs_feature_attr_group);
|
||||
}
|
||||
|
||||
static int btrfs_init_debugfs(void)
|
||||
static void btrfs_init_debugfs(void)
|
||||
{
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
btrfs_debugfs_root_dentry = debugfs_create_dir("btrfs", NULL);
|
||||
if (!btrfs_debugfs_root_dentry)
|
||||
return -ENOMEM;
|
||||
|
||||
/*
|
||||
* Example code, how to export data through debugfs.
|
||||
@@ -929,7 +929,6 @@ static int btrfs_init_debugfs(void)
|
||||
#endif
|
||||
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
int __init btrfs_init_sysfs(void)
|
||||
@@ -940,9 +939,7 @@ int __init btrfs_init_sysfs(void)
|
||||
if (!btrfs_kset)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = btrfs_init_debugfs();
|
||||
if (ret)
|
||||
goto out1;
|
||||
btrfs_init_debugfs();
|
||||
|
||||
init_feature_attrs();
|
||||
ret = sysfs_create_group(&btrfs_kset->kobj, &btrfs_feature_attr_group);
|
||||
@@ -959,7 +956,6 @@ out_remove_group:
|
||||
sysfs_remove_group(&btrfs_kset->kobj, &btrfs_feature_attr_group);
|
||||
out2:
|
||||
debugfs_remove_recursive(btrfs_debugfs_root_dentry);
|
||||
out1:
|
||||
kset_unregister(btrfs_kset);
|
||||
|
||||
return ret;
|
||||
|
@@ -245,21 +245,17 @@ void ceph_fs_debugfs_cleanup(struct ceph_fs_client *fsc)
|
||||
debugfs_remove(fsc->debugfs_mdsc);
|
||||
}
|
||||
|
||||
int ceph_fs_debugfs_init(struct ceph_fs_client *fsc)
|
||||
void ceph_fs_debugfs_init(struct ceph_fs_client *fsc)
|
||||
{
|
||||
char name[100];
|
||||
int err = -ENOMEM;
|
||||
|
||||
dout("ceph_fs_debugfs_init\n");
|
||||
BUG_ON(!fsc->client->debugfs_dir);
|
||||
fsc->debugfs_congestion_kb =
|
||||
debugfs_create_file("writeback_congestion_kb",
|
||||
0600,
|
||||
fsc->client->debugfs_dir,
|
||||
fsc,
|
||||
&congestion_kb_fops);
|
||||
if (!fsc->debugfs_congestion_kb)
|
||||
goto out;
|
||||
|
||||
snprintf(name, sizeof(name), "../../bdi/%s",
|
||||
dev_name(fsc->sb->s_bdi->dev));
|
||||
@@ -267,52 +263,36 @@ int ceph_fs_debugfs_init(struct ceph_fs_client *fsc)
|
||||
debugfs_create_symlink("bdi",
|
||||
fsc->client->debugfs_dir,
|
||||
name);
|
||||
if (!fsc->debugfs_bdi)
|
||||
goto out;
|
||||
|
||||
fsc->debugfs_mdsmap = debugfs_create_file("mdsmap",
|
||||
0400,
|
||||
fsc->client->debugfs_dir,
|
||||
fsc,
|
||||
&mdsmap_show_fops);
|
||||
if (!fsc->debugfs_mdsmap)
|
||||
goto out;
|
||||
|
||||
fsc->debugfs_mds_sessions = debugfs_create_file("mds_sessions",
|
||||
0400,
|
||||
fsc->client->debugfs_dir,
|
||||
fsc,
|
||||
&mds_sessions_show_fops);
|
||||
if (!fsc->debugfs_mds_sessions)
|
||||
goto out;
|
||||
|
||||
fsc->debugfs_mdsc = debugfs_create_file("mdsc",
|
||||
0400,
|
||||
fsc->client->debugfs_dir,
|
||||
fsc,
|
||||
&mdsc_show_fops);
|
||||
if (!fsc->debugfs_mdsc)
|
||||
goto out;
|
||||
|
||||
fsc->debugfs_caps = debugfs_create_file("caps",
|
||||
0400,
|
||||
fsc->client->debugfs_dir,
|
||||
fsc,
|
||||
&caps_show_fops);
|
||||
if (!fsc->debugfs_caps)
|
||||
goto out;
|
||||
|
||||
return 0;
|
||||
|
||||
out:
|
||||
ceph_fs_debugfs_cleanup(fsc);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
#else /* CONFIG_DEBUG_FS */
|
||||
|
||||
int ceph_fs_debugfs_init(struct ceph_fs_client *fsc)
|
||||
void ceph_fs_debugfs_init(struct ceph_fs_client *fsc)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
@@ -937,9 +937,7 @@ static struct dentry *ceph_real_mount(struct ceph_fs_client *fsc)
|
||||
dout("mount opening path %s\n", path);
|
||||
}
|
||||
|
||||
err = ceph_fs_debugfs_init(fsc);
|
||||
if (err < 0)
|
||||
goto out;
|
||||
ceph_fs_debugfs_init(fsc);
|
||||
|
||||
root = open_root_dentry(fsc, path, started);
|
||||
if (IS_ERR(root)) {
|
||||
|
@@ -1102,7 +1102,7 @@ extern int ceph_locks_to_pagelist(struct ceph_filelock *flocks,
|
||||
int num_fcntl_locks, int num_flock_locks);
|
||||
|
||||
/* debugfs.c */
|
||||
extern int ceph_fs_debugfs_init(struct ceph_fs_client *client);
|
||||
extern void ceph_fs_debugfs_init(struct ceph_fs_client *client);
|
||||
extern void ceph_fs_debugfs_cleanup(struct ceph_fs_client *client);
|
||||
|
||||
/* quota.c */
|
||||
|
@@ -997,25 +997,19 @@ static const struct file_operations u32_array_fops = {
|
||||
* @array as data. If the @mode variable is so set it can be read from.
|
||||
* Writing is not supported. Seek within the file is also not supported.
|
||||
* Once array is created its size can not be changed.
|
||||
*
|
||||
* The function returns a pointer to dentry on success. If an error occurs,
|
||||
* %ERR_PTR(-ERROR) or NULL will be returned. If debugfs is not enabled in
|
||||
* the kernel, the value %ERR_PTR(-ENODEV) will be returned.
|
||||
*/
|
||||
struct dentry *debugfs_create_u32_array(const char *name, umode_t mode,
|
||||
struct dentry *parent,
|
||||
u32 *array, u32 elements)
|
||||
void debugfs_create_u32_array(const char *name, umode_t mode,
|
||||
struct dentry *parent, u32 *array, u32 elements)
|
||||
{
|
||||
struct array_data *data = kmalloc(sizeof(*data), GFP_KERNEL);
|
||||
|
||||
if (data == NULL)
|
||||
return NULL;
|
||||
return;
|
||||
|
||||
data->array = array;
|
||||
data->elements = elements;
|
||||
|
||||
return debugfs_create_file_unsafe(name, mode, parent, data,
|
||||
&u32_array_fops);
|
||||
debugfs_create_file_unsafe(name, mode, parent, data, &u32_array_fops);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(debugfs_create_u32_array);
|
||||
|
||||
|
@@ -2,13 +2,16 @@
|
||||
/*
|
||||
* inode.c - part of debugfs, a tiny little debug file system
|
||||
*
|
||||
* Copyright (C) 2004 Greg Kroah-Hartman <greg@kroah.com>
|
||||
* Copyright (C) 2004,2019 Greg Kroah-Hartman <greg@kroah.com>
|
||||
* Copyright (C) 2004 IBM Inc.
|
||||
* Copyright (C) 2019 Linux Foundation <gregkh@linuxfoundation.org>
|
||||
*
|
||||
* debugfs is for people to use instead of /proc or /sys.
|
||||
* See ./Documentation/core-api/kernel-api.rst for more details.
|
||||
*/
|
||||
|
||||
#define pr_fmt(fmt) "debugfs: " fmt
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/mount.h>
|
||||
@@ -285,15 +288,17 @@ static struct dentry *start_creating(const char *name, struct dentry *parent)
|
||||
struct dentry *dentry;
|
||||
int error;
|
||||
|
||||
pr_debug("debugfs: creating file '%s'\n",name);
|
||||
pr_debug("creating file '%s'\n", name);
|
||||
|
||||
if (IS_ERR(parent))
|
||||
return parent;
|
||||
|
||||
error = simple_pin_fs(&debug_fs_type, &debugfs_mount,
|
||||
&debugfs_mount_count);
|
||||
if (error)
|
||||
if (error) {
|
||||
pr_err("Unable to pin filesystem for file '%s'\n", name);
|
||||
return ERR_PTR(error);
|
||||
}
|
||||
|
||||
/* If the parent is not specified, we create it in the root.
|
||||
* We need the root dentry to do this, which is in the super
|
||||
@@ -306,6 +311,12 @@ static struct dentry *start_creating(const char *name, struct dentry *parent)
|
||||
inode_lock(d_inode(parent));
|
||||
dentry = lookup_one_len(name, parent, strlen(name));
|
||||
if (!IS_ERR(dentry) && d_really_is_positive(dentry)) {
|
||||
if (d_is_dir(dentry))
|
||||
pr_err("Directory '%s' with parent '%s' already present!\n",
|
||||
name, parent->d_name.name);
|
||||
else
|
||||
pr_err("File '%s' in directory '%s' already present!\n",
|
||||
name, parent->d_name.name);
|
||||
dput(dentry);
|
||||
dentry = ERR_PTR(-EEXIST);
|
||||
}
|
||||
@@ -349,8 +360,11 @@ static struct dentry *__debugfs_create_file(const char *name, umode_t mode,
|
||||
return dentry;
|
||||
|
||||
inode = debugfs_get_inode(dentry->d_sb);
|
||||
if (unlikely(!inode))
|
||||
if (unlikely(!inode)) {
|
||||
pr_err("out of free dentries, can not create file '%s'\n",
|
||||
name);
|
||||
return failed_creating(dentry);
|
||||
}
|
||||
|
||||
inode->i_mode = mode;
|
||||
inode->i_private = data;
|
||||
@@ -511,8 +525,11 @@ struct dentry *debugfs_create_dir(const char *name, struct dentry *parent)
|
||||
return dentry;
|
||||
|
||||
inode = debugfs_get_inode(dentry->d_sb);
|
||||
if (unlikely(!inode))
|
||||
if (unlikely(!inode)) {
|
||||
pr_err("out of free dentries, can not create directory '%s'\n",
|
||||
name);
|
||||
return failed_creating(dentry);
|
||||
}
|
||||
|
||||
inode->i_mode = S_IFDIR | S_IRWXU | S_IRUGO | S_IXUGO;
|
||||
inode->i_op = &simple_dir_inode_operations;
|
||||
@@ -550,8 +567,11 @@ struct dentry *debugfs_create_automount(const char *name,
|
||||
return dentry;
|
||||
|
||||
inode = debugfs_get_inode(dentry->d_sb);
|
||||
if (unlikely(!inode))
|
||||
if (unlikely(!inode)) {
|
||||
pr_err("out of free dentries, can not create automount '%s'\n",
|
||||
name);
|
||||
return failed_creating(dentry);
|
||||
}
|
||||
|
||||
make_empty_dir_inode(inode);
|
||||
inode->i_flags |= S_AUTOMOUNT;
|
||||
@@ -606,6 +626,8 @@ struct dentry *debugfs_create_symlink(const char *name, struct dentry *parent,
|
||||
|
||||
inode = debugfs_get_inode(dentry->d_sb);
|
||||
if (unlikely(!inode)) {
|
||||
pr_err("out of free dentries, can not create symlink '%s'\n",
|
||||
name);
|
||||
kfree(link);
|
||||
return failed_creating(dentry);
|
||||
}
|
||||
|
@@ -158,6 +158,7 @@ static struct attribute *dlm_attrs[] = {
|
||||
&dlm_attr_recover_nodeid.attr,
|
||||
NULL,
|
||||
};
|
||||
ATTRIBUTE_GROUPS(dlm);
|
||||
|
||||
static ssize_t dlm_attr_show(struct kobject *kobj, struct attribute *attr,
|
||||
char *buf)
|
||||
@@ -187,7 +188,7 @@ static const struct sysfs_ops dlm_attr_ops = {
|
||||
};
|
||||
|
||||
static struct kobj_type dlm_ktype = {
|
||||
.default_attrs = dlm_attrs,
|
||||
.default_groups = dlm_groups,
|
||||
.sysfs_ops = &dlm_attr_ops,
|
||||
.release = lockspace_kobj_release,
|
||||
};
|
||||
|
@@ -501,6 +501,7 @@ static struct attribute *f2fs_attrs[] = {
|
||||
ATTR_LIST(current_reserved_blocks),
|
||||
NULL,
|
||||
};
|
||||
ATTRIBUTE_GROUPS(f2fs);
|
||||
|
||||
static struct attribute *f2fs_feat_attrs[] = {
|
||||
#ifdef CONFIG_FS_ENCRYPTION
|
||||
@@ -520,6 +521,7 @@ static struct attribute *f2fs_feat_attrs[] = {
|
||||
ATTR_LIST(sb_checksum),
|
||||
NULL,
|
||||
};
|
||||
ATTRIBUTE_GROUPS(f2fs_feat);
|
||||
|
||||
static const struct sysfs_ops f2fs_attr_ops = {
|
||||
.show = f2fs_attr_show,
|
||||
@@ -527,7 +529,7 @@ static const struct sysfs_ops f2fs_attr_ops = {
|
||||
};
|
||||
|
||||
static struct kobj_type f2fs_sb_ktype = {
|
||||
.default_attrs = f2fs_attrs,
|
||||
.default_groups = f2fs_groups,
|
||||
.sysfs_ops = &f2fs_attr_ops,
|
||||
.release = f2fs_sb_release,
|
||||
};
|
||||
@@ -541,7 +543,7 @@ static struct kset f2fs_kset = {
|
||||
};
|
||||
|
||||
static struct kobj_type f2fs_feat_ktype = {
|
||||
.default_attrs = f2fs_feat_attrs,
|
||||
.default_groups = f2fs_feat_groups,
|
||||
.sysfs_ops = &f2fs_attr_ops,
|
||||
};
|
||||
|
||||
|
@@ -296,6 +296,7 @@ static struct attribute *gfs2_attrs[] = {
|
||||
&gfs2_attr_demote_rq.attr,
|
||||
NULL,
|
||||
};
|
||||
ATTRIBUTE_GROUPS(gfs2);
|
||||
|
||||
static void gfs2_sbd_release(struct kobject *kobj)
|
||||
{
|
||||
@@ -306,7 +307,7 @@ static void gfs2_sbd_release(struct kobject *kobj)
|
||||
|
||||
static struct kobj_type gfs2_ktype = {
|
||||
.release = gfs2_sbd_release,
|
||||
.default_attrs = gfs2_attrs,
|
||||
.default_groups = gfs2_groups,
|
||||
.sysfs_ops = &gfs2_attr_ops,
|
||||
};
|
||||
|
||||
|
@@ -127,24 +127,16 @@ static struct nfsd_fault_inject_op inject_ops[] = {
|
||||
},
|
||||
};
|
||||
|
||||
int nfsd_fault_inject_init(void)
|
||||
void nfsd_fault_inject_init(void)
|
||||
{
|
||||
unsigned int i;
|
||||
struct nfsd_fault_inject_op *op;
|
||||
umode_t mode = S_IFREG | S_IRUSR | S_IWUSR;
|
||||
|
||||
debug_dir = debugfs_create_dir("nfsd", NULL);
|
||||
if (!debug_dir)
|
||||
goto fail;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(inject_ops); i++) {
|
||||
op = &inject_ops[i];
|
||||
if (!debugfs_create_file(op->file, mode, debug_dir, op, &fops_nfsd))
|
||||
goto fail;
|
||||
debugfs_create_file(op->file, mode, debug_dir, op, &fops_nfsd);
|
||||
}
|
||||
return 0;
|
||||
|
||||
fail:
|
||||
nfsd_fault_inject_cleanup();
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
@@ -1514,9 +1514,7 @@ static int __init init_nfsd(void)
|
||||
retval = nfsd4_init_pnfs();
|
||||
if (retval)
|
||||
goto out_free_slabs;
|
||||
retval = nfsd_fault_inject_init(); /* nfsd fault injection controls */
|
||||
if (retval)
|
||||
goto out_exit_pnfs;
|
||||
nfsd_fault_inject_init(); /* nfsd fault injection controls */
|
||||
nfsd_stat_init(); /* Statistics */
|
||||
nfsd_lockd_init(); /* lockd->nfsd callbacks */
|
||||
retval = create_proc_exports_entry();
|
||||
@@ -1533,7 +1531,6 @@ out_free_lockd:
|
||||
nfsd_lockd_shutdown();
|
||||
nfsd_stat_shutdown();
|
||||
nfsd_fault_inject_cleanup();
|
||||
out_exit_pnfs:
|
||||
nfsd4_exit_pnfs();
|
||||
out_free_slabs:
|
||||
nfsd4_free_slabs();
|
||||
|
@@ -672,7 +672,7 @@ extern void nfsd4_record_grace_done(struct nfsd_net *nn);
|
||||
|
||||
/* nfs fault injection functions */
|
||||
#ifdef CONFIG_NFSD_FAULT_INJECTION
|
||||
int nfsd_fault_inject_init(void);
|
||||
void nfsd_fault_inject_init(void);
|
||||
void nfsd_fault_inject_cleanup(void);
|
||||
|
||||
u64 nfsd_inject_print_clients(void);
|
||||
@@ -693,7 +693,7 @@ u64 nfsd_inject_forget_delegations(u64);
|
||||
u64 nfsd_inject_recall_client_delegations(struct sockaddr_storage *, size_t);
|
||||
u64 nfsd_inject_recall_delegations(u64);
|
||||
#else /* CONFIG_NFSD_FAULT_INJECTION */
|
||||
static inline int nfsd_fault_inject_init(void) { return 0; }
|
||||
static inline void nfsd_fault_inject_init(void) {}
|
||||
static inline void nfsd_fault_inject_cleanup(void) {}
|
||||
#endif /* CONFIG_NFSD_FAULT_INJECTION */
|
||||
|
||||
|
@@ -64,7 +64,7 @@ struct client_debug_mask {
|
||||
__u64 mask2;
|
||||
};
|
||||
|
||||
static int orangefs_kernel_debug_init(void);
|
||||
static void orangefs_kernel_debug_init(void);
|
||||
|
||||
static int orangefs_debug_help_open(struct inode *, struct file *);
|
||||
static void *help_start(struct seq_file *, loff_t *);
|
||||
@@ -99,7 +99,6 @@ static char *debug_help_string;
|
||||
static char client_debug_string[ORANGEFS_MAX_DEBUG_STRING_LEN];
|
||||
static char client_debug_array_string[ORANGEFS_MAX_DEBUG_STRING_LEN];
|
||||
|
||||
static struct dentry *help_file_dentry;
|
||||
static struct dentry *client_debug_dentry;
|
||||
static struct dentry *debug_dir;
|
||||
|
||||
@@ -151,10 +150,8 @@ static DEFINE_MUTEX(orangefs_help_file_lock);
|
||||
* initialize kmod debug operations, create orangefs debugfs dir and
|
||||
* ORANGEFS_KMOD_DEBUG_HELP_FILE.
|
||||
*/
|
||||
int orangefs_debugfs_init(int debug_mask)
|
||||
void orangefs_debugfs_init(int debug_mask)
|
||||
{
|
||||
int rc = -ENOMEM;
|
||||
|
||||
/* convert input debug mask to a 64-bit unsigned integer */
|
||||
orangefs_gossip_debug_mask = (unsigned long long)debug_mask;
|
||||
|
||||
@@ -183,37 +180,21 @@ int orangefs_debugfs_init(int debug_mask)
|
||||
(unsigned long long)orangefs_gossip_debug_mask);
|
||||
|
||||
debug_dir = debugfs_create_dir("orangefs", NULL);
|
||||
if (!debug_dir) {
|
||||
pr_info("%s: debugfs_create_dir failed.\n", __func__);
|
||||
goto out;
|
||||
}
|
||||
|
||||
help_file_dentry = debugfs_create_file(ORANGEFS_KMOD_DEBUG_HELP_FILE,
|
||||
0444,
|
||||
debug_dir,
|
||||
debug_help_string,
|
||||
&debug_help_fops);
|
||||
if (!help_file_dentry) {
|
||||
pr_info("%s: debugfs_create_file failed.\n", __func__);
|
||||
goto out;
|
||||
}
|
||||
debugfs_create_file(ORANGEFS_KMOD_DEBUG_HELP_FILE, 0444, debug_dir,
|
||||
debug_help_string, &debug_help_fops);
|
||||
|
||||
orangefs_debug_disabled = 0;
|
||||
|
||||
rc = orangefs_kernel_debug_init();
|
||||
|
||||
out:
|
||||
|
||||
return rc;
|
||||
orangefs_kernel_debug_init();
|
||||
}
|
||||
|
||||
/*
|
||||
* initialize the kernel-debug file.
|
||||
*/
|
||||
static int orangefs_kernel_debug_init(void)
|
||||
static void orangefs_kernel_debug_init(void)
|
||||
{
|
||||
int rc = -ENOMEM;
|
||||
struct dentry *ret;
|
||||
char *k_buffer = NULL;
|
||||
|
||||
gossip_debug(GOSSIP_DEBUGFS_DEBUG, "%s: start\n", __func__);
|
||||
@@ -230,24 +211,11 @@ static int orangefs_kernel_debug_init(void)
|
||||
pr_info("%s: overflow 1!\n", __func__);
|
||||
}
|
||||
|
||||
ret = debugfs_create_file(ORANGEFS_KMOD_DEBUG_FILE,
|
||||
0444,
|
||||
debug_dir,
|
||||
k_buffer,
|
||||
&kernel_debug_fops);
|
||||
if (!ret) {
|
||||
pr_info("%s: failed to create %s.\n",
|
||||
__func__,
|
||||
ORANGEFS_KMOD_DEBUG_FILE);
|
||||
goto out;
|
||||
}
|
||||
|
||||
rc = 0;
|
||||
debugfs_create_file(ORANGEFS_KMOD_DEBUG_FILE, 0444, debug_dir, k_buffer,
|
||||
&kernel_debug_fops);
|
||||
|
||||
out:
|
||||
|
||||
gossip_debug(GOSSIP_DEBUGFS_DEBUG, "%s: rc:%d:\n", __func__, rc);
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
||||
@@ -353,12 +321,6 @@ static int orangefs_client_debug_init(void)
|
||||
debug_dir,
|
||||
c_buffer,
|
||||
&kernel_debug_fops);
|
||||
if (!client_debug_dentry) {
|
||||
pr_info("%s: failed to create updated %s.\n",
|
||||
__func__,
|
||||
ORANGEFS_CLIENT_DEBUG_FILE);
|
||||
goto out;
|
||||
}
|
||||
|
||||
rc = 0;
|
||||
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
int orangefs_debugfs_init(int);
|
||||
void orangefs_debugfs_init(int);
|
||||
void orangefs_debugfs_cleanup(void);
|
||||
int orangefs_prepare_debugfs_help_string(int);
|
||||
int orangefs_debugfs_new_client_mask(void __user *);
|
||||
|
@@ -129,9 +129,7 @@ static int __init orangefs_init(void)
|
||||
if (ret)
|
||||
goto cleanup_key_table;
|
||||
|
||||
ret = orangefs_debugfs_init(module_parm_debug_mask);
|
||||
if (ret)
|
||||
goto debugfs_init_failed;
|
||||
orangefs_debugfs_init(module_parm_debug_mask);
|
||||
|
||||
ret = orangefs_sysfs_init();
|
||||
if (ret)
|
||||
@@ -161,8 +159,6 @@ cleanup_device:
|
||||
orangefs_dev_cleanup();
|
||||
|
||||
sysfs_init_failed:
|
||||
|
||||
debugfs_init_failed:
|
||||
orangefs_debugfs_cleanup();
|
||||
|
||||
cleanup_key_table:
|
||||
|
169
fs/ubifs/debug.c
169
fs/ubifs/debug.c
@@ -2800,115 +2800,69 @@ static const struct file_operations dfs_fops = {
|
||||
* dbg_debugfs_init_fs - initialize debugfs for UBIFS instance.
|
||||
* @c: UBIFS file-system description object
|
||||
*
|
||||
* This function creates all debugfs files for this instance of UBIFS. Returns
|
||||
* zero in case of success and a negative error code in case of failure.
|
||||
* This function creates all debugfs files for this instance of UBIFS.
|
||||
*
|
||||
* Note, the only reason we have not merged this function with the
|
||||
* 'ubifs_debugging_init()' function is because it is better to initialize
|
||||
* debugfs interfaces at the very end of the mount process, and remove them at
|
||||
* the very beginning of the mount process.
|
||||
*/
|
||||
int dbg_debugfs_init_fs(struct ubifs_info *c)
|
||||
void dbg_debugfs_init_fs(struct ubifs_info *c)
|
||||
{
|
||||
int err, n;
|
||||
int n;
|
||||
const char *fname;
|
||||
struct dentry *dent;
|
||||
struct ubifs_debug_info *d = c->dbg;
|
||||
|
||||
if (!IS_ENABLED(CONFIG_DEBUG_FS))
|
||||
return 0;
|
||||
|
||||
n = snprintf(d->dfs_dir_name, UBIFS_DFS_DIR_LEN + 1, UBIFS_DFS_DIR_NAME,
|
||||
c->vi.ubi_num, c->vi.vol_id);
|
||||
if (n == UBIFS_DFS_DIR_LEN) {
|
||||
/* The array size is too small */
|
||||
fname = UBIFS_DFS_DIR_NAME;
|
||||
dent = ERR_PTR(-EINVAL);
|
||||
goto out;
|
||||
return;
|
||||
}
|
||||
|
||||
fname = d->dfs_dir_name;
|
||||
dent = debugfs_create_dir(fname, dfs_rootdir);
|
||||
if (IS_ERR_OR_NULL(dent))
|
||||
goto out;
|
||||
d->dfs_dir = dent;
|
||||
d->dfs_dir = debugfs_create_dir(fname, dfs_rootdir);
|
||||
|
||||
fname = "dump_lprops";
|
||||
dent = debugfs_create_file(fname, S_IWUSR, d->dfs_dir, c, &dfs_fops);
|
||||
if (IS_ERR_OR_NULL(dent))
|
||||
goto out_remove;
|
||||
d->dfs_dump_lprops = dent;
|
||||
d->dfs_dump_lprops = debugfs_create_file(fname, S_IWUSR, d->dfs_dir, c,
|
||||
&dfs_fops);
|
||||
|
||||
fname = "dump_budg";
|
||||
dent = debugfs_create_file(fname, S_IWUSR, d->dfs_dir, c, &dfs_fops);
|
||||
if (IS_ERR_OR_NULL(dent))
|
||||
goto out_remove;
|
||||
d->dfs_dump_budg = dent;
|
||||
d->dfs_dump_budg = debugfs_create_file(fname, S_IWUSR, d->dfs_dir, c,
|
||||
&dfs_fops);
|
||||
|
||||
fname = "dump_tnc";
|
||||
dent = debugfs_create_file(fname, S_IWUSR, d->dfs_dir, c, &dfs_fops);
|
||||
if (IS_ERR_OR_NULL(dent))
|
||||
goto out_remove;
|
||||
d->dfs_dump_tnc = dent;
|
||||
d->dfs_dump_tnc = debugfs_create_file(fname, S_IWUSR, d->dfs_dir, c,
|
||||
&dfs_fops);
|
||||
|
||||
fname = "chk_general";
|
||||
dent = debugfs_create_file(fname, S_IRUSR | S_IWUSR, d->dfs_dir, c,
|
||||
&dfs_fops);
|
||||
if (IS_ERR_OR_NULL(dent))
|
||||
goto out_remove;
|
||||
d->dfs_chk_gen = dent;
|
||||
d->dfs_chk_gen = debugfs_create_file(fname, S_IRUSR | S_IWUSR,
|
||||
d->dfs_dir, c, &dfs_fops);
|
||||
|
||||
fname = "chk_index";
|
||||
dent = debugfs_create_file(fname, S_IRUSR | S_IWUSR, d->dfs_dir, c,
|
||||
&dfs_fops);
|
||||
if (IS_ERR_OR_NULL(dent))
|
||||
goto out_remove;
|
||||
d->dfs_chk_index = dent;
|
||||
d->dfs_chk_index = debugfs_create_file(fname, S_IRUSR | S_IWUSR,
|
||||
d->dfs_dir, c, &dfs_fops);
|
||||
|
||||
fname = "chk_orphans";
|
||||
dent = debugfs_create_file(fname, S_IRUSR | S_IWUSR, d->dfs_dir, c,
|
||||
&dfs_fops);
|
||||
if (IS_ERR_OR_NULL(dent))
|
||||
goto out_remove;
|
||||
d->dfs_chk_orph = dent;
|
||||
d->dfs_chk_orph = debugfs_create_file(fname, S_IRUSR | S_IWUSR,
|
||||
d->dfs_dir, c, &dfs_fops);
|
||||
|
||||
fname = "chk_lprops";
|
||||
dent = debugfs_create_file(fname, S_IRUSR | S_IWUSR, d->dfs_dir, c,
|
||||
&dfs_fops);
|
||||
if (IS_ERR_OR_NULL(dent))
|
||||
goto out_remove;
|
||||
d->dfs_chk_lprops = dent;
|
||||
d->dfs_chk_lprops = debugfs_create_file(fname, S_IRUSR | S_IWUSR,
|
||||
d->dfs_dir, c, &dfs_fops);
|
||||
|
||||
fname = "chk_fs";
|
||||
dent = debugfs_create_file(fname, S_IRUSR | S_IWUSR, d->dfs_dir, c,
|
||||
&dfs_fops);
|
||||
if (IS_ERR_OR_NULL(dent))
|
||||
goto out_remove;
|
||||
d->dfs_chk_fs = dent;
|
||||
d->dfs_chk_fs = debugfs_create_file(fname, S_IRUSR | S_IWUSR,
|
||||
d->dfs_dir, c, &dfs_fops);
|
||||
|
||||
fname = "tst_recovery";
|
||||
dent = debugfs_create_file(fname, S_IRUSR | S_IWUSR, d->dfs_dir, c,
|
||||
&dfs_fops);
|
||||
if (IS_ERR_OR_NULL(dent))
|
||||
goto out_remove;
|
||||
d->dfs_tst_rcvry = dent;
|
||||
d->dfs_tst_rcvry = debugfs_create_file(fname, S_IRUSR | S_IWUSR,
|
||||
d->dfs_dir, c, &dfs_fops);
|
||||
|
||||
fname = "ro_error";
|
||||
dent = debugfs_create_file(fname, S_IRUSR | S_IWUSR, d->dfs_dir, c,
|
||||
&dfs_fops);
|
||||
if (IS_ERR_OR_NULL(dent))
|
||||
goto out_remove;
|
||||
d->dfs_ro_error = dent;
|
||||
|
||||
return 0;
|
||||
|
||||
out_remove:
|
||||
debugfs_remove_recursive(d->dfs_dir);
|
||||
out:
|
||||
err = dent ? PTR_ERR(dent) : -ENODEV;
|
||||
ubifs_err(c, "cannot create \"%s\" debugfs file or directory, error %d\n",
|
||||
fname, err);
|
||||
return err;
|
||||
d->dfs_ro_error = debugfs_create_file(fname, S_IRUSR | S_IWUSR,
|
||||
d->dfs_dir, c, &dfs_fops);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -2917,8 +2871,7 @@ out:
|
||||
*/
|
||||
void dbg_debugfs_exit_fs(struct ubifs_info *c)
|
||||
{
|
||||
if (IS_ENABLED(CONFIG_DEBUG_FS))
|
||||
debugfs_remove_recursive(c->dbg->dfs_dir);
|
||||
debugfs_remove_recursive(c->dbg->dfs_dir);
|
||||
}
|
||||
|
||||
struct ubifs_global_debug_info ubifs_dbg;
|
||||
@@ -2994,75 +2947,38 @@ static const struct file_operations dfs_global_fops = {
|
||||
*
|
||||
* UBIFS uses debugfs file-system to expose various debugging knobs to
|
||||
* user-space. This function creates "ubifs" directory in the debugfs
|
||||
* file-system. Returns zero in case of success and a negative error code in
|
||||
* case of failure.
|
||||
* file-system.
|
||||
*/
|
||||
int dbg_debugfs_init(void)
|
||||
void dbg_debugfs_init(void)
|
||||
{
|
||||
int err;
|
||||
const char *fname;
|
||||
struct dentry *dent;
|
||||
|
||||
if (!IS_ENABLED(CONFIG_DEBUG_FS))
|
||||
return 0;
|
||||
|
||||
fname = "ubifs";
|
||||
dent = debugfs_create_dir(fname, NULL);
|
||||
if (IS_ERR_OR_NULL(dent))
|
||||
goto out;
|
||||
dfs_rootdir = dent;
|
||||
dfs_rootdir = debugfs_create_dir(fname, NULL);
|
||||
|
||||
fname = "chk_general";
|
||||
dent = debugfs_create_file(fname, S_IRUSR | S_IWUSR, dfs_rootdir, NULL,
|
||||
&dfs_global_fops);
|
||||
if (IS_ERR_OR_NULL(dent))
|
||||
goto out_remove;
|
||||
dfs_chk_gen = dent;
|
||||
dfs_chk_gen = debugfs_create_file(fname, S_IRUSR | S_IWUSR, dfs_rootdir,
|
||||
NULL, &dfs_global_fops);
|
||||
|
||||
fname = "chk_index";
|
||||
dent = debugfs_create_file(fname, S_IRUSR | S_IWUSR, dfs_rootdir, NULL,
|
||||
&dfs_global_fops);
|
||||
if (IS_ERR_OR_NULL(dent))
|
||||
goto out_remove;
|
||||
dfs_chk_index = dent;
|
||||
dfs_chk_index = debugfs_create_file(fname, S_IRUSR | S_IWUSR,
|
||||
dfs_rootdir, NULL, &dfs_global_fops);
|
||||
|
||||
fname = "chk_orphans";
|
||||
dent = debugfs_create_file(fname, S_IRUSR | S_IWUSR, dfs_rootdir, NULL,
|
||||
&dfs_global_fops);
|
||||
if (IS_ERR_OR_NULL(dent))
|
||||
goto out_remove;
|
||||
dfs_chk_orph = dent;
|
||||
dfs_chk_orph = debugfs_create_file(fname, S_IRUSR | S_IWUSR,
|
||||
dfs_rootdir, NULL, &dfs_global_fops);
|
||||
|
||||
fname = "chk_lprops";
|
||||
dent = debugfs_create_file(fname, S_IRUSR | S_IWUSR, dfs_rootdir, NULL,
|
||||
&dfs_global_fops);
|
||||
if (IS_ERR_OR_NULL(dent))
|
||||
goto out_remove;
|
||||
dfs_chk_lprops = dent;
|
||||
dfs_chk_lprops = debugfs_create_file(fname, S_IRUSR | S_IWUSR,
|
||||
dfs_rootdir, NULL, &dfs_global_fops);
|
||||
|
||||
fname = "chk_fs";
|
||||
dent = debugfs_create_file(fname, S_IRUSR | S_IWUSR, dfs_rootdir, NULL,
|
||||
&dfs_global_fops);
|
||||
if (IS_ERR_OR_NULL(dent))
|
||||
goto out_remove;
|
||||
dfs_chk_fs = dent;
|
||||
dfs_chk_fs = debugfs_create_file(fname, S_IRUSR | S_IWUSR, dfs_rootdir,
|
||||
NULL, &dfs_global_fops);
|
||||
|
||||
fname = "tst_recovery";
|
||||
dent = debugfs_create_file(fname, S_IRUSR | S_IWUSR, dfs_rootdir, NULL,
|
||||
&dfs_global_fops);
|
||||
if (IS_ERR_OR_NULL(dent))
|
||||
goto out_remove;
|
||||
dfs_tst_rcvry = dent;
|
||||
|
||||
return 0;
|
||||
|
||||
out_remove:
|
||||
debugfs_remove_recursive(dfs_rootdir);
|
||||
out:
|
||||
err = dent ? PTR_ERR(dent) : -ENODEV;
|
||||
pr_err("UBIFS error (pid %d): cannot create \"%s\" debugfs file or directory, error %d\n",
|
||||
current->pid, fname, err);
|
||||
return err;
|
||||
dfs_tst_rcvry = debugfs_create_file(fname, S_IRUSR | S_IWUSR,
|
||||
dfs_rootdir, NULL, &dfs_global_fops);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -3070,8 +2986,7 @@ out:
|
||||
*/
|
||||
void dbg_debugfs_exit(void)
|
||||
{
|
||||
if (IS_ENABLED(CONFIG_DEBUG_FS))
|
||||
debugfs_remove_recursive(dfs_rootdir);
|
||||
debugfs_remove_recursive(dfs_rootdir);
|
||||
}
|
||||
|
||||
void ubifs_assert_failed(struct ubifs_info *c, const char *expr,
|
||||
|
@@ -297,9 +297,9 @@ int dbg_leb_unmap(struct ubifs_info *c, int lnum);
|
||||
int dbg_leb_map(struct ubifs_info *c, int lnum);
|
||||
|
||||
/* Debugfs-related stuff */
|
||||
int dbg_debugfs_init(void);
|
||||
void dbg_debugfs_init(void);
|
||||
void dbg_debugfs_exit(void);
|
||||
int dbg_debugfs_init_fs(struct ubifs_info *c);
|
||||
void dbg_debugfs_init_fs(struct ubifs_info *c);
|
||||
void dbg_debugfs_exit_fs(struct ubifs_info *c);
|
||||
|
||||
#endif /* !__UBIFS_DEBUG_H__ */
|
||||
|
@@ -1465,9 +1465,7 @@ static int mount_ubifs(struct ubifs_info *c)
|
||||
if (err)
|
||||
goto out_infos;
|
||||
|
||||
err = dbg_debugfs_init_fs(c);
|
||||
if (err)
|
||||
goto out_infos;
|
||||
dbg_debugfs_init_fs(c);
|
||||
|
||||
c->mounting = 0;
|
||||
|
||||
@@ -2352,9 +2350,7 @@ static int __init ubifs_init(void)
|
||||
if (err)
|
||||
goto out_shrinker;
|
||||
|
||||
err = dbg_debugfs_init();
|
||||
if (err)
|
||||
goto out_compr;
|
||||
dbg_debugfs_init();
|
||||
|
||||
err = register_filesystem(&ubifs_fs_type);
|
||||
if (err) {
|
||||
@@ -2366,7 +2362,6 @@ static int __init ubifs_init(void)
|
||||
|
||||
out_dbg:
|
||||
dbg_debugfs_exit();
|
||||
out_compr:
|
||||
ubifs_compressors_exit();
|
||||
out_shrinker:
|
||||
unregister_shrinker(&ubifs_shrinker_info);
|
||||
|
Reference in New Issue
Block a user