linux点击屏幕某一块的函数,Linux自主访问控制机制模块详细分析之扩展属性相关操作在ext4中的实现(3)...

原标题:Linux自主访问控制机制模块详细分析之扩展属性相关操作在ext4中的实现(3)

(2) 设置扩展属性

对于用于访问控制的ACL而言,扩展属性的设置函数为ext4_xattr_set_acl(),该函数定义在fs/ext4/acl.c中,函数头如下所示:

013589d92add9501de3ccbdfca4ca8e1.png

该函数有五个参数: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中,函数头如下所示:

303b8747ca3e5bfa8606aacc3ee9c693.png

该函数包含7个参数:handle表示用于日志处理的原子更新操作;inode表示用于设置的目标文件;name_index表示扩展属性所属命名空间对应的处理程序在映射表中的索引;name表示扩展属性的名字;value表示要设置的扩展属性的值;value_len表示扩展属性值的长度;flags表示一些操作标志。对于ext4_xattr_set_handle()函数,它用于在指定的索引节点中创建、替换或删除一个扩展属性,如果用于存放扩展属性值的缓冲区为空,则该函数用于删除现存的扩展属性;反之,则根据指定名称的扩展属性是否位于文件的扩展属性列表中来替换或创建一个新的扩展属性。对于该函数,其函数调用流程图如图2-13所示:

41c67ae8cdb1e92eca1b4b6c1d64f126.png

如图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->s.not_found中。

④若没有找到,则调用ext4_xattr_block_find()函数在扩展属性所在的外部数据块中进行查找,查找结果存放在bs.s.not_found中。其中bs为ext4_xattr_block_find类型的变量,该结构体存放了用于存放扩展属性的数据块的相关信息。

⑤如果在索引节点的空闲空间内和数据块内均没有找到指定的扩展属性,则首先判断是否设置了XATTR_REPLACE标志,若没有,则判断value是否为空,若不为空,说明ext4_xattr_set_handle()函数用于创建一个新的扩展属性。其中XATTR_REPALCE标志表示扩展属性的替换,如果相应的扩展属性不存在,则返回错误。

如果扩展属性存在,即位于索引节点的空闲空间内或某个数据块内,则判断是否设置了XATTR_CREATE标志,并进行相应的处理。其中XATTR_CREATE标志表示创建一个新的扩展属性,如果相应的扩展属性已经存在,则返回错误。

⑥判断扩展属性值是否为空:

a.如果扩展属性值为空,则根据扩展属性所在的位置调用相应的函数来删除指定的扩展属性。如果扩展属性位于索引节点的空闲空间内,则调用ext4_xattr_ibody_set()函数来删除指定的扩展属性;如果位于数据块内,则调用ext4_xattr_block_set()函数完成扩展属性的删除操作。对于ext4_xattr_ibody_set()函数和ext4_xattr_block_set()函数,其实现基本相同,这里主要针对ext4_xattr_ibody_set()函数在后面进行了详细的分析。

b.如果扩展属性值非空,则根据给定的扩展属性名称及相应的属性值来修改扩展属性或创建一个新的扩展属性。这里先调用ext4_xattr_ibody_set()函数在索引节点的空闲空间内来实现指定的功能,并将函数的执行结果存放到error中。如果函数成功执行且指定的扩展属性位于数据块内,则调用ext4_xattr_block_set()函数从外部数据块中删除指定的扩展属性。反之,判断ext4_xattr_ibody_set()函数的返回值是否为ENOSPC,若是,表示索引节点的没有足够的空闲空间,则调用ext4_xattr_block_set()函数将该扩展属性插入到相应的外部数据块中,如果该函数成功执行且相应的扩展属性位于索引节点空闲空间内,则调用ext4_xattr_ibody_set()函数在索引节点的空闲空间内删除相应的扩展属性。

⑦判断ext4_xattr_*_set()函数的执行结果,如果该函数成功执行,则说明扩展属性已经改变,此时需要将索引节点标记为脏,以便将相应的数据写入磁盘:

a.调用ext4_xattr_update_super_block()判断ext4文件系统是否设置了EXT4_FEATURE_COMPAT_EXT_ATTR标志,如果没有,则设置该标志,该标志表示文件系统支持扩展属性。

b.设置索引节点的修改时间。

c.调用ext4_mark_iloc_dirty()函数,该函数通过调用ext4_do_update_inode()函数来将内存索引节点的内容写入磁盘索引节点对应的缓冲区中。

d.通过IS_SYNC()宏判断是否设置了S_SYNC或MS_SYNCHRONNOUS标志,若是,则直接调用ext4_handle_sync()函数进行数据的同步。

⑧ 调用brelse()函数将相应的缓冲区的引用计数减1.

⑨ 结束并返回。

ext4_xattr_ibody_set()函数定义fs/ext4/xattr.c中,函数头如下所示:

ce295de969f6cceaf4aa37ac67d77757.png

该函数包含4个参数:handle表示用于日志处理的原子更新操作;inode表示用于设置的目标文件;i表示要设置的扩展属性的相关信息;is表示存放在目标文件索引节点空闲空间内的扩展属性的相关信息。

43e7d718f96ce6cdec98cfced3d8ad96.png

图2-14 ext4_xattr_ibody_set()函数调用流程图

如图2-14所示,该函数的核心操作主要是通过ext4_xattr_set_entry()函数实现的。对于ext4_xattr_set_entry()函数,它用于具体的实现属性值的设置操作,该函数只不过是对扩展属性列表的修改操作,主要针对扩展属性项数据结构ext4_xattr_entry进行,因此这里不对其进行详细分析。对于ext4_xattr_block_set()函数,其实现和ext4_xattr_ibody_set()函数相似,因此这里不再赘述。返回搜狐,查看更多

责任编辑:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值