mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +00:00

Existing primitive has several problems: 1) calling conventions are clumsy - it returns a dentry reference that is either identical to its second argument or is an ERR_PTR(-E...); in both cases no refcount changes happen. Inconvenient for users and bug-prone; it would be better to have it return 0 on success and -E... on failure. 2) it allows cross-directory moves; however, no such caller have ever materialized and considering the way debugfs is used, it's unlikely to happen in the future. What's more, any such caller would have fun issues to deal with wrt interplay with recursive removal. It also makes the calling conventions clumsier... 3) tautological rename fails; the callers have no race-free way to deal with that. 4) new name must have been formed by the caller; quite a few callers have it done by sprintf/kasprintf/etc., ending up with considerable boilerplate. Proposed replacement: int debugfs_change_name(dentry, fmt, ...). All callers convert to that easily, and it's simpler internally. IMO debugfs_rename() should go; if we ever get a real-world use case for cross-directory moves in debugfs, we can always look into the right way to handle that. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk> Link: https://lore.kernel.org/r/20250112080705.141166-21-viro@zeniv.linux.org.uk Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
110 lines
2.3 KiB
C
110 lines
2.3 KiB
C
// SPDX-License-Identifier: GPL-2.0
|
|
#include <linux/kernel.h>
|
|
#include <linux/module.h>
|
|
#include <linux/device.h>
|
|
#include <linux/netdevice.h>
|
|
|
|
#include <net/bonding.h>
|
|
#include <net/bond_alb.h>
|
|
|
|
#if defined(CONFIG_DEBUG_FS) && !defined(CONFIG_NET_NS)
|
|
|
|
#include <linux/debugfs.h>
|
|
#include <linux/seq_file.h>
|
|
|
|
static struct dentry *bonding_debug_root;
|
|
|
|
/* Show RLB hash table */
|
|
static int bond_debug_rlb_hash_show(struct seq_file *m, void *v)
|
|
{
|
|
struct bonding *bond = m->private;
|
|
struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond));
|
|
struct rlb_client_info *client_info;
|
|
u32 hash_index;
|
|
|
|
if (BOND_MODE(bond) != BOND_MODE_ALB)
|
|
return 0;
|
|
|
|
seq_printf(m, "SourceIP DestinationIP "
|
|
"Destination MAC DEV\n");
|
|
|
|
spin_lock_bh(&bond->mode_lock);
|
|
|
|
hash_index = bond_info->rx_hashtbl_used_head;
|
|
for (; hash_index != RLB_NULL_INDEX;
|
|
hash_index = client_info->used_next) {
|
|
client_info = &(bond_info->rx_hashtbl[hash_index]);
|
|
seq_printf(m, "%-15pI4 %-15pI4 %-17pM %s\n",
|
|
&client_info->ip_src,
|
|
&client_info->ip_dst,
|
|
&client_info->mac_dst,
|
|
client_info->slave->dev->name);
|
|
}
|
|
|
|
spin_unlock_bh(&bond->mode_lock);
|
|
|
|
return 0;
|
|
}
|
|
DEFINE_SHOW_ATTRIBUTE(bond_debug_rlb_hash);
|
|
|
|
void bond_debug_register(struct bonding *bond)
|
|
{
|
|
bond->debug_dir =
|
|
debugfs_create_dir(bond->dev->name, bonding_debug_root);
|
|
|
|
debugfs_create_file("rlb_hash_table", 0400, bond->debug_dir,
|
|
bond, &bond_debug_rlb_hash_fops);
|
|
}
|
|
|
|
void bond_debug_unregister(struct bonding *bond)
|
|
{
|
|
debugfs_remove_recursive(bond->debug_dir);
|
|
}
|
|
|
|
void bond_debug_reregister(struct bonding *bond)
|
|
{
|
|
int err = debugfs_change_name(bond->debug_dir, "%s", bond->dev->name);
|
|
if (err) {
|
|
netdev_warn(bond->dev, "failed to reregister, so just unregister old one\n");
|
|
bond_debug_unregister(bond);
|
|
}
|
|
}
|
|
|
|
void __init bond_create_debugfs(void)
|
|
{
|
|
bonding_debug_root = debugfs_create_dir("bonding", NULL);
|
|
|
|
if (IS_ERR(bonding_debug_root))
|
|
pr_warn("Warning: Cannot create bonding directory in debugfs\n");
|
|
}
|
|
|
|
void bond_destroy_debugfs(void)
|
|
{
|
|
debugfs_remove_recursive(bonding_debug_root);
|
|
bonding_debug_root = NULL;
|
|
}
|
|
|
|
|
|
#else /* !CONFIG_DEBUG_FS */
|
|
|
|
void bond_debug_register(struct bonding *bond)
|
|
{
|
|
}
|
|
|
|
void bond_debug_unregister(struct bonding *bond)
|
|
{
|
|
}
|
|
|
|
void bond_debug_reregister(struct bonding *bond)
|
|
{
|
|
}
|
|
|
|
void __init bond_create_debugfs(void)
|
|
{
|
|
}
|
|
|
|
void bond_destroy_debugfs(void)
|
|
{
|
|
}
|
|
|
|
#endif /* CONFIG_DEBUG_FS */
|