ext4_xattr_get_acl() ext4_xattr_get_acl()函数用于将ACL从内存表示形式转换为磁盘表示形式,并将其存放到扩展属性中,最后返回扩展属性所占用的空间的长度,函数头如下所示: static int ext4_xattr_get_acl(struct dentry *dentry, const char *name, void *buffer,size_t size, int type) 该函数包含5个参数:dentry表示目标文件对应的目录项,name表示扩展属性的名字;buffer表示用于存放扩展属性的缓冲区;size表示缓冲区的长度;type表示ACL的类型。 图2-20 ext4_xattr_get_acl()函数调用流程图 posix_acl_to_xattr() 如图2-20所示,该函数主要通过posix_acl_to_xattr()函数实现,对于其调用的其余函数,上面已经介绍过,所以下面主要针对posix_acl_to_xattr()函数进行分析。posix_acl_to_xattr()函数用于将内存表示形式的ACL转换为磁盘表示形式,并将其存放到扩展属性中,成功执行时返回扩展属性的长度,函数头如下所示: int posix_acl_to_xattr(const struct posix_acl *acl, void *buffer, size_t size); 如上所示,该函数包含三个参数:acl表示内存形式的访问控制列表;buffer表示存放扩展属性的缓冲区;size表示缓冲区的长度。 图2-21 posix_acl_to_xattr()函数调用流程图 如图2-21所示,下面结合源码对该函数的执行步骤进行说明: ① 使用参数来初始化扩展属性中用于表示访问控制列表的数据结构posix_acl_xattr_header和posix_acl_xattr_entry。 ② 调用posix_acl_xattr_size()函数来获取含有指定数量的ACL表项的访问控制列表在扩展属性中占有的存储空间的大小。 ③ 调用cpu_to_le32()函数将一个32位的特定于cpu格式的用于表示ACL的a_version域的数据转化为相应的小端格式。 ④ 通过循环将ACL中每个ACL表项中的cpu格式的e_tag、e_perm和e_id转换为相应的小端格式,并存放到指定的扩展属性中。 ⑤ 结束并返回扩展属性占有的存储空间的大小。 posix_acl_from_xattr() 与该函数相对应一个函数为posix_acl_from_xattr()。posix_acl_from_xattr()函数用于实现和posix_acl_to_xattr()相反的功能,即从扩展属性中获取内存格式的ACL,其函数头如下所示: struct posix_acl *posix_acl_from_xattr(const void *value, size_t size) 该函数包含两个参数:value表示扩展属性所在缓冲区;size表示缓冲区的长度。 图2-22 posix_acl_from_xattr()函数调用流程图 如图2-22所示,下面结合源码对该函数的执行步骤进行说明: ① 判断参数的合法性。 ② 调用posix_acl_xattr_count()函数来获取扩展属性中所包含的ACL表项的数量。 ③ 调用posix_acl_alloc()函数为ACL分配用于存放指定数量的列表项的存储空间。 ④ 通过循环将扩展属性中的ACL项的磁盘格式的数据转换为内存格式,并赋值给指定的ACL表项。 ⑤ 结束并返回对应的acl。 posix_acl_xattr_entry和posix_acl_xattr_header 事实上,内核中就是通过这两个函数来实现扩展属性和ACL的转换,由上面的分析可知,该过程需要两个数据结构:posix_acl_xattr_entry和posix_acl_xattr_header,其定义在include/linux/posix_acl_xattr.h中,具体定义如下所示: typedef struct { __le16 e_tag; __le16 e_perm; __le32 e_id; } posix_acl_xattr_entry; typedef struct { __le32 a_version; posix_acl_xattr_entry a_entries[0]; } posix_acl_xattr_header; 如上所示,对于posix_acl_xattr_entry,该结构用来表示扩展属性中的ACL表项,其各字段的含义和posix_acl_entry中定义的相同;对于posix_acl_xattr_header,该结构用来表示扩展属性中ACL首部,其中a_version字段用于存放ACL的版本,a_entries用于存放ACL表项。该文件还同时定义了ACL所在的扩展属性的名字、支持的ACL的版本号及未定义的列表项的e_id:其定义如下所示: /* Extended attribute names */ #define POSIX_ACL_XATTR_ACCESS "system.posix_acl_access" #define POSIX_ACL_XATTR_DEFAULT "system.posix_acl_default" /* Supported ACL a_version fields */ #define POSIX_ACL_XATTR_VERSION 0x0002 /* An undefined entry e_id value */ #define ACL_UNDEFINED_ID (-1) |
|
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系
[邮箱地址] 删除
|