(2) 设置扩展属性 对于用于访问控制的ACL而言,扩展属性的设置函数为ext4_xattr_set_acl(),该函数定义在fs/ext4/acl.c中,函数头如下所示: static int ext4_xattr_set_acl(structdentry *dentry, const char *name, const void *value,size_t size, int flags, int type) 该函数有五个参数:dentry表示目标文件对应的目录项;name表示要设置的扩展属性的名字;buffer表示要设置的扩展属性值所在的存储空间;size表示用于扩展属性值的长度;type表示要处理的ACL 的类型。如图2-12所示,该函数的实际工作主要通过ext4_set_acl()函数实现,对于其调用的其他函数,参见2.3.2小节,这里不再赘述。ext4_set_acl()函数根据ACL的类型对文件的ACL属性进行设置,最终的设置操作交由ext4_xattr_set_handle()函数完成。ext4_xatr_set_handle()函数才是用于扩展属性设置操作的核心函数,该函数定义在fs/ext4/xattr.c中,函数头如下所示: int ext4_xattr_set_handle(handle_t *handle, struct inode *inode, int name_index,const char *name, const void *value, size_t value_len,int flags) 该函数包含7个参数:handle表示用于日志处理的原子更新操作;inode表示用于设置的目标文件;name_index表示扩展属性所属命名空间对应的处理程序在映射表中的索引;name表示扩展属性的名字;value表示要设置的扩展属性的值;value_len表示扩展属性值的长度;flags表示一些操作标志。对于ext4_xattr_set_handle()函数,它用于在指定的索引节点中创建、替换或删除一个扩展属性,如果用于存放扩展属性值的缓冲区为空,则该函数用于删除现存的扩展属性;反之,则根据指定名称的扩展属性是否位于文件的扩展属性列表中来替换或创建一个新的扩展属性。对于该函数,其函数调用流程图如图2-13所示: 图2-13
如图2-13所示,下面结合源码对ext4_xattr_set_handle()的执行步骤进行说明: ① 根据参数对ext4_xattr_info类型的变量i进行初始化。ext4_xattr_info结构用于表示ext4文件系统中扩展属性表项的相关信息。 ② 调用ext4_reserce_inode_write()函数来查找索引节点的位置,并对is.iloc进行初始化。其中is为ext4_xattr_ibody_find类型的变量,该结构体存放了索引节点内部用于存放扩展属性的存储空间的相关信息。 ③ 调用ext4_xattr_ibody_find()函数在指定索引节点的空闲空间内寻找扩展属性,查找结果存放在is- |
|
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系
[邮箱地址] 删除
|