文件/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;
}

sysfs_create_dir_ns相关推荐

  1. Linux那些事儿之我是Sysfs(10)sysfs 创建目录

    每当我们新增一个kobject结构的时候,同时会在/sys下创建一个目录. kobject_add()  ->  create_dir() -> sysfs_create_dir() 此时 ...

  2. Linux那些事儿之我是Sysfs(6)文件系统

    接下来,我们进入sysfs部分.看看 kobject_add()->kobject_add_varg->kobject_add_internal->create_dir()-> ...

  3. 设备初始化缩水篇(一)

    之前的都是直接复制,稍微翻译了一下,不过代码太乱,没有头绪,这里简化一下看看能否有一点头绪 int __init devices_init(void) {         devices_kset = ...

  4. kset_register

    本文中的源码均来自linux内核3.14.3版本/lib/kobject.c文件 /**  * kset_register - 初始化并添加一个kset  * @k: kset.  */ int ks ...

  5. 设备驱动中的kobject(kernel-4.7)

    kobject是Linux设备模型的最底层数据结构,它代表一个内核对象. kobject结构体定义在include/linux/kobject.h文件中: struct kobject {const ...

  6. 加载linux驱动模块时,终端提示一堆内存错误

    一.问题描述 在写好一个linux驱动模块,在开发板上运行的时候,出现以下提示: WARNING: CPU: 0 PID: 100 at fs/sysfs/dir.c:31 sysfs_warn_du ...

  7. 嵌入式Linux视频笔记----驱动开发

    https://www.bilibili.com/video/BV1pf4y1974n/?spm_id_from=333.788.videocard.1 基本看完了,基本只看视频没看详细的pdf,试验 ...

最新文章

  1. python界面颜色怎么改变_pycharm 界面风格修改
  2. php数组根据指定列排序
  3. 【WPF】设置TextBox内容为空时的提示文字
  4. PHP CURL 使用代理访问服务器
  5. linux安装ant环境变量,CentOS下Ant环境配置
  6. requestAnimationFrame()
  7. 零基础带你学习MySQL—Delete语句以及注意事项(九)
  8. 试图运行项目时出错:无法启动调试 没有正确安装调试器
  9. 描述计算机病毒来源的几种代表性看法,关于计算机病毒的起源
  10. 主流GPS方案供应商大盘点
  11. 机器人对话常用语模板_电销助手——智能电话机器人
  12. 《论文阅读》D3DLO: DEEP 3D LIDAR ODOMETRY
  13. 【渗透安全】利用腾讯云CDN节点隐藏连接Webshell的真实IP
  14. 真•扑克牌洗牌算法实现
  15. 禁用鼠标cusor:no-drop与cursor:not-allowed区别与认识
  16. android 电话号码发iphone怎么样,安卓手机如何轻松的向iPhone发文件呢?
  17. win11系统512g怎么分盘合理?
  18. “麒”聚信创,共赢未来——信创解决方案分享会(首场)成功举办
  19. 搜索引擎营销的基本概念和特点是什么?
  20. ftl和html的区别?

热门文章

  1. C++ multimap 的使用
  2. Java 静态变量,静态方法,静态常量(java static 关键字)
  3. java 关键字(面试题)
  4. GridView使用的技巧
  5. 使用Java监控工具出现 Can't attach to the process
  6. 早上突然看明白 shader和材质球的关系
  7. [摘录]代码优化规则
  8. OC学习笔记之Foundation框架NSNumber、NSValue和NSDate(转)
  9. int与string转换
  10. 将动态aspx页面转换成为静态html页面的几种方法