linux内核版本3.14.3

文件/fs/kernfs/dir.c

/**
 * kernfs_addrm_start - 为kernfs_node添加/删除准备
 * @acxt: 指向要使用的kernfs_addrm_cxt的指针
 *
 * 该方法在调用方需要添加或删除kernfs_node的时候调用,该方法需要
 * kernfs_mutex.  @acxt是用来保存和传递内容到其他的addrm(add/remove)方法
 *
 * LOCKING:
 * Kernel thread context (may sleep).  kernfs_mutex is locked on
 * return.
 */
void kernfs_addrm_start(struct kernfs_addrm_cxt *acxt)
__acquires(kernfs_mutex)
{
        memset(acxt, 0, sizeof(*acxt));

mutex_lock(&kernfs_mutex);
}

这里的缩写让我很难办,addrm是(add/rm),cxt是context,看下面的结构体就可以理解了

文件/fs/kernfs/kernfs-internal.h

/*
 * Context structure to be used while adding/removing nodes.看英文更容易明白缩写到底是啥
 */
struct kernfs_addrm_cxt {
        struct kernfs_node*removed;
};

文件/fs/kernfs/dir.c

/**
 * kernfs_add_one - 无警告添加kernfs_node到parent
 * @acxt: 用于add/remove的context
 * @kn: 用来添加的kernfs_node
 *
 * 该调用必须已经初始化过@kn->parent.  如果@kn是一个目录,
 * 该方法会增加parent的inode的nlink,并链接到parent的 children list.
 *
 * 该方法应该在kernfs_addrm_start()和kernfs_addrm_finish()
 * 之间调用,并应该和和kernfs_addrm_start()传递相同的@acxt.
 *
 * LOCKING:
 * Determined by kernfs_addrm_start().
 *
 * RETURNS:
 * 成功返回0, 如果给定的entry名称已存在返回-EEXIST
 */
int kernfs_add_one(struct kernfs_addrm_cxt *acxt, struct kernfs_node *kn)
{
        struct kernfs_node *parent = kn->parent;
        bool has_ns = kernfs_ns_enabled(parent);
        struct kernfs_iattrs *ps_iattr;
        int ret;

if (has_ns != (bool)kn->ns) {
                WARN(1, KERN_WARNING "kernfs: ns %s in '%s' for '%s'\n",  has_ns ? "required" : "invalid", parent->name, kn->name);
                return -EINVAL;
        }

if (kernfs_type(parent) != KERNFS_DIR)
        return -EINVAL;

if (parent->flags & KERNFS_REMOVED)
        return -ENOENT;

kn->hash = kernfs_name_hash(kn->name, kn->ns);

ret = kernfs_link_sibling(kn);
        if (ret)
                return ret;

/* 更新parent的时间戳*/
        ps_iattr = parent->iattr;
        if (ps_iattr) {
                struct iattr *ps_iattrs = &ps_iattr->ia_iattr;
                ps_iattrs->ia_ctime = ps_iattrs->ia_mtime = CURRENT_TIME;
        }

/* Mark the entry added into directory tree */
        kn->flags &= ~KERNFS_REMOVED;

return 0;
}

/**
 * kernfs_name_hash
 * @name: 转hash的以Null('\0')结尾的字符串
 * @ns:   转hash的命名空间tag
 *
 * Returns 31 bit hash of ns + name (so it fits in an off_t )
 */
static unsigned int kernfs_name_hash(const char *name, const void *ns)
{
        unsigned long hash = init_name_hash();//#define init_name_hash()                0
        unsigned int len = strlen(name);
        while (len--)
                hash = partial_name_hash(*name++, hash);
        hash = (end_name_hash(hash) ^ hash_ptr((void *)ns, 31));
        hash &= 0x7fffffffU;
        /* Reserve hash numbers 0, 1 and INT_MAX for magic directory entries */
        if (hash < 2)
                hash += 2;
        if (hash >= INT_MAX)
                hash = INT_MAX - 1;
        return hash;
}

文件/include/linux/dcache.h

/* partial hash update function. Assume roughly 4 bits per character */
static inline unsigned long
partial_name_hash(unsigned long c, unsigned long prevhash)
{
        return (prevhash + (c << 4) + (c >> 4)) * 11;
}

我想这里就到此为止吧,所谓的kernfs_name_hash无非是把name这个字符串通过一个复杂的计算方法转换为一个unsigned int的数值,据说是为了查找方便,而这个复杂的算法,就先不研究了

kernfs_addrm_start kernfs_add_one相关推荐

  1. sysfs_create_dir_ns

    文件/fs/sysfs/dir.c /**  * sysfs_create_dir_ns - 用命名空间tags为一个object创建directory  * @kobj: 要创建目录的object ...

  2. Linux那些事儿之我是Sysfs(11)sysfs 创建普通文件

    sysfs文件系统中,普通文件对应于kobject中的属性.用sysfs_create_file(),参数如下: sysfs_create_file(struct kobject * kobj, co ...

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

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

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

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

  5. Linux容器化原理笔记

    一.容器 1. 从一台物理机虚拟化出很多虚拟机这种方式,一定程度上实现了资源创建的灵活性.但是同时会发现,虚拟化的方式还是非常复杂的, CPU.内存.网络.硬盘全部需要虚拟化,还有性能损失.那有没有一 ...

最新文章

  1. idea可以使用flash框架吗_这个框架厉害了,使用它几分钟就可以编写一个微信插件...
  2. unity, 内存profile,ImageEffects Temp和Unity GI SystemTex RGBM
  3. markdown写法
  4. Docker搭建NSQ实时分布式消息集群
  5. Spring组件之一 JDBC Template
  6. Oracle设置和修改system和scott的口令,并且如何连接到system和scott模式下
  7. Java实例练习——基于UDP协议的多客户端通信
  8. Lazarus 1.6 增加了新的窗体编辑器——Sparta_DockedFormEditor.ipk
  9. 护网杯 task_shoppingCart 记录
  10. 如何服务器备份到移动硬盘,数据安全第一!威联通如何外接硬盘备份和同步
  11. nginx报502错误
  12. php微信上传图文素材,php使用curl 上传微信公共平台素材文件
  13. python模拟硬件实现btb和tomasulo算法
  14. c mysql trans_MYSQL STRICT_TRANS_TABLES使用图解教程
  15. 最佳量化交易的计算机操作系统
  16. 力扣第235题“二叉搜索树的最近公共先祖”的解题思路
  17. vue仿美团饿了么,实现购物车功能
  18. html的空格代码怎么写?教你如何使用空格nbsp代码(收藏)
  19. ffmpeg如何实现MP3转码g711a
  20. Mac配置mysql环境

热门文章

  1. Android 动态广播与静态广播
  2. css float 的使用
  3. css position属性
  4. linux下出现ping:unknown host www.baidu.com问题时的解决办法——ubuntu下局域网络的配置...
  5. aes前台加密后台解密
  6. num2cell用法
  7. 结构化方法与面向对象方法之比较
  8. linux内核内存管理(zone_dma zone_normal zone_highmem)
  9. Apache JMeter2.13 实战
  10. ie7和ie8 select使用jquery clone不兼容处理