sysfs_create_dir_ns

文件/fs/sysfs/dir.c

/**
 * sysfs_create_dir_ns - 用命名空间tags为一个object创建directory
 * @kobj: 要创建目录的object
 * @ns: 要用到的命名空间tag
 */
int sysfs_create_dir_ns(struct kobject *kobj, const void *ns)
{
        struct kernfs_node *parent, *kn;

        BUG_ON(!kobj);


        if (kobj->parent)
                parent = kobj->parent->sd;
        else
                parent = sysfs_root_kn;

        if (!parent)
                return -ENOENT;

        kn = kernfs_create_dir_ns(parent, kobject_name(kobj), S_IRWXU | S_IRUGO | S_IXUGO, kobj, ns);
        if (IS_ERR(kn)) {
                if (PTR_ERR(kn) == -EEXIST)
                        sysfs_warn_dup(parent, kobject_name(kobj));
                return PTR_ERR(kn);
        }

        kobj->sd = kn;
        return 0;
}


我非常遗憾的发现这里出现了一个kernfs_node,这个在3.13版本的内核中还没有,3.13版本内核中这个结构体叫做sysfs_dirent

看起来所谓的创建一个文件夹就是新建一个kernfs_node


文件/fs/kernfs/dir.c

/**
 * kernfs_create_dir_ns - 创建一个目录
 * @parent: 要创建目录的父目录
 * @name: 新目录的名称
 * @mode: 新目录的mode(权限)
 * @priv: opaque data associated with the new directory伴随着该目录的半透明数据?
 * @ns: 该目录的可选命名空间tag
 *
 * Returns the created node on success, ERR_PTR() value on failure.
 */
struct kernfs_node *kernfs_create_dir_ns(struct kernfs_node *parent,
const char *name, umode_t mode,
void *priv, const void *ns)
{
        struct kernfs_addrm_cxt acxt;
        struct kernfs_node *kn;
        int rc;

        /* allocate */
        kn = kernfs_new_node(parent, name, mode | S_IFDIR, KERNFS_DIR);
        if (!kn)
                return ERR_PTR(-ENOMEM);

        kn->dir.root = parent->dir.root;
        kn->ns = ns;
        kn->priv = priv;

        /* link in */
        kernfs_addrm_start(&acxt);
        rc = kernfs_add_one(&acxt, kn);
        kernfs_addrm_finish(&acxt);

        if (!rc)
                return kn;

        kernfs_put(kn);
        return ERR_PTR(rc);
}


struct kernfs_node *kernfs_new_node(struct kernfs_node *parent,
   const char *name, umode_t mode,
   unsigned flags)
{
        struct kernfs_node *kn;

        kn = __kernfs_new_node(kernfs_root(parent), name, mode, flags);
        if (kn) {
                kernfs_get(parent);
                kn->parent = parent;
        }
        return kn;
}


文件/fs/kernfs/dir.c

static struct kernfs_node *__kernfs_new_node(struct kernfs_root *root,
    const char *name, umode_t mode,
    unsigned flags)
{
        char *dup_name = NULL;
        struct kernfs_node *kn;
        int ret;

        if (!(flags & KERNFS_STATIC_NAME)) {
                name = dup_name = kstrdup(name, GFP_KERNEL);//字符串复制,把name复制为dup_name
                if (!name)
                        return NULL;
        }

        kn = kmem_cache_zalloc(kernfs_node_cache, GFP_KERNEL);  //高速缓存内存,用于可能频繁分配和释放的地方
        if (!kn)
                goto err_out1;

        ret = ida_simple_get(&root->ino_ida, 1, 0, GFP_KERNEL); //这里是分配一个ID,好吧,先放这里,以后再回来深入研究
        if (ret < 0)
                goto err_out2;
        kn->ino = ret;

        atomic_set(&kn->count, 1);
        atomic_set(&kn->active, 0);

        kn->name = name;
        kn->mode = mode;
        kn->flags = flags | KERNFS_REMOVED;

        return kn;

 err_out2:
        kmem_cache_free(kernfs_node_cache, kn);
 err_out1:
        kfree(dup_name);
        return NULL;
}

[ 4.858794] uwe5621_bt_tty_init [ 4.862131] mtty_probe unisoc soc, continue [ 4.868449] mtty_probe init device addr: 0x000000007db4bee8 [ 4.868608] rfkill_bluetooth_init [ 4.871951] rfkill_bluetooth_init end [ 4.872048] marlin_sdio_init [ 4.873682] mtty_probe unisoc soc, continue [ 4.873724] sysfs: cannot create duplicate filename '/devices/virt[ 4.873829] CPU: 1 PID: 121 Comm: init Not tainted 4.19.193 #34 [ 4.873842] Hardware name: ROC-RK3566-PC HDMI(Android) (DT) [ 4.873849] Call trace: [ 4.873868] dump_backtrace+0x0/0x178 [ 4.873876] show_stack+0x14/0x20 [ 4.873886] dump_stack+0x94/0xb4 [ 4.873895] sysfs_warn_dup+0x64/0x80 [ 4.873902] sysfs_create_dir_ns+0xdc/0xf8 [ 4.873910] kobject_add_internal+0xa0/0x288 [ 4.873916] kobject_add+0x98/0x100 [ 4.873928] device_add+0xec/0x698 [ 4.873934] device_register+0x1c/0x28 [ 4.873945] tty_register_device_attr+0xe4/0x208 [ 4.873951] tty_register_driver+0x138/0x248 [ 4.873970] mtty_probe+0x144/0x33u0 [sprdbt_tty] [ 4.873978] platform_drv_probe+0x50/0xa8 [ a 4.873984] really_probe+0xl228/0x2a0 [ 4.873991] driver_probe_device+0x58/0x100 [ 4.873996] device_driver_attach+0x6c/0x78 [ 4.874001] __driver_attach+0xb0/0xf0 [ 4.874009] bus_for_each_dev+0x68/0xc8 [ 4.874014] driver_attach+0x20/0x28 [ 4.874019] bus_add_driver+0xf8/0x1f0 [ 4.874025] driver_register+0x60/0x110 [ 4.874031] __platform_driver_register+0x40/0x48 [ 4.874044] uwe5621_bt_tty_init+0x44/0x1000 [sprdbt_tty] [ 4.874052] do_one_initcall+0x48/0x240 [ 4.874061] do_init_module+0x5c/0x1c8 [ 4.874069] load_module+0x18f8/0x1f68 [ 4.874074] __se_sys_finit_module+0xc0/0xd8 [ 4.874079] __arm64_sys_finit_module+0x14/0x20 [ 4.874087] el0_svc_common.constprop.0+0x64/0x178 [ 4.874092] el0_svc_handler+0x28/0x78 [ 4.874097] el0_svc+0x8/0xc [ 4.874179] kobject_add_internal failed for ttyBT0 with -EEXIST/, don't try to register things twith the same name in the same directory. [ 4.874225] list_del corruption, ffffffc079941ea8->next is LIST_POISON1 (dead000000000100) [ 4.874270] ------------[ cut here ]------------
最新发布
06-10
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值