kernfs_addrm_start kernfs_add_one
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相关推荐
- sysfs_create_dir_ns
文件/fs/sysfs/dir.c /** * sysfs_create_dir_ns - 用命名空间tags为一个object创建directory * @kobj: 要创建目录的object ...
- Linux那些事儿之我是Sysfs(11)sysfs 创建普通文件
sysfs文件系统中,普通文件对应于kobject中的属性.用sysfs_create_file(),参数如下: sysfs_create_file(struct kobject * kobj, co ...
- Linux那些事儿之我是Sysfs(10)sysfs 创建目录
每当我们新增一个kobject结构的时候,同时会在/sys下创建一个目录. kobject_add() -> create_dir() -> sysfs_create_dir() 此时 ...
- 设备初始化缩水篇(一)
之前的都是直接复制,稍微翻译了一下,不过代码太乱,没有头绪,这里简化一下看看能否有一点头绪 int __init devices_init(void) { devices_kset = ...
- Linux容器化原理笔记
一.容器 1. 从一台物理机虚拟化出很多虚拟机这种方式,一定程度上实现了资源创建的灵活性.但是同时会发现,虚拟化的方式还是非常复杂的, CPU.内存.网络.硬盘全部需要虚拟化,还有性能损失.那有没有一 ...
最新文章
- idea可以使用flash框架吗_这个框架厉害了,使用它几分钟就可以编写一个微信插件...
- unity, 内存profile,ImageEffects Temp和Unity GI SystemTex RGBM
- markdown写法
- Docker搭建NSQ实时分布式消息集群
- Spring组件之一 JDBC Template
- Oracle设置和修改system和scott的口令,并且如何连接到system和scott模式下
- Java实例练习——基于UDP协议的多客户端通信
- Lazarus 1.6 增加了新的窗体编辑器——Sparta_DockedFormEditor.ipk
- 护网杯 task_shoppingCart 记录
- 如何服务器备份到移动硬盘,数据安全第一!威联通如何外接硬盘备份和同步
- nginx报502错误
- php微信上传图文素材,php使用curl 上传微信公共平台素材文件
- python模拟硬件实现btb和tomasulo算法
- c mysql trans_MYSQL STRICT_TRANS_TABLES使用图解教程
- 最佳量化交易的计算机操作系统
- 力扣第235题“二叉搜索树的最近公共先祖”的解题思路
- vue仿美团饿了么,实现购物车功能
- html的空格代码怎么写?教你如何使用空格nbsp代码(收藏)
- ffmpeg如何实现MP3转码g711a
- Mac配置mysql环境
热门文章
- Android 动态广播与静态广播
- css float 的使用
- css position属性
- linux下出现ping:unknown host www.baidu.com问题时的解决办法——ubuntu下局域网络的配置...
- aes前台加密后台解密
- num2cell用法
- 结构化方法与面向对象方法之比较
- linux内核内存管理(zone_dma zone_normal zone_highmem)
- Apache JMeter2.13 实战
- ie7和ie8 select使用jquery clone不兼容处理