ext2文件系统源代码之xattr.h

今天我们开始看ext2文件系统里的另一个重要的东西,就是扩展文件属性,我们首先看它的头文件定义xattr.h
/*
  File: linux/ext2_xattr.h


  On-disk format of extended attributes for the ext2 filesystem.


  (C) 2001 Andreas Gruenbacher, <a.gruenbacher@computer.org>
*/


#include <linux/init.h>
#include <linux/xattr.h>


/* 扩展属性的魔数值 */
#define EXT2_XATTR_MAGIC		0xEA020000


/* 每一个文件属性块的最大引用数目 */
#define EXT2_XATTR_REFCOUNT_MAX		1024


/* 名称索引 */
#define EXT2_XATTR_INDEX_USER			1
#define EXT2_XATTR_INDEX_POSIX_ACL_ACCESS	2
#define EXT2_XATTR_INDEX_POSIX_ACL_DEFAULT	3
#define EXT2_XATTR_INDEX_TRUSTED		4
#define	EXT2_XATTR_INDEX_LUSTRE			5
#define EXT2_XATTR_INDEX_SECURITY	        6
/*扩展属性头部*/
struct ext2_xattr_header {
	__le32	h_magic;	/* 扩展属性标识码,就是上边定义的EXT2_XATTR_MAGIC */
	__le32	h_refcount;	/* 这个属性块被引用的次数 */
	__le32	h_blocks;	/* 扩展属性使用的块数 */
	__le32	h_hash;		/* 所有属性的hash值*/
	__u32	h_reserved[4];	/* 保留字段 */
};
/*扩展属性入口项结构体*/
struct ext2_xattr_entry {
	__u8	e_name_len;	/* 属性名长度 */
	__u8	e_name_index;	/* 属性名索引 */
	__le16	e_value_offs;	/* 属性值在文件里的偏移量 */
	__le32	e_value_block;	/* 保存值得块号 */
	__le32	e_value_size;	/* 属性值长度 */
	__le32	e_hash;		/* 属性名和值得hash值 */
	char	e_name[0];	/* 属性名 */
};


/*xattr是按照四字节对齐的*/
#define EXT2_XATTR_PAD_BITS		2
#define EXT2_XATTR_PAD		(1<<EXT2_XATTR_PAD_BITS)
#define EXT2_XATTR_ROUND		(EXT2_XATTR_PAD-1)
/*名称长度给定情况下,扩展属性入口项结构体按照4字节对齐后的大小*/
#define EXT2_XATTR_LEN(name_len) \
	(((name_len) + EXT2_XATTR_ROUND + \
	sizeof(struct ext2_xattr_entry)) & ~EXT2_XATTR_ROUND)
/*得到当前入口项的下一个项*/
#define EXT2_XATTR_NEXT(entry) \
	( (struct ext2_xattr_entry *)( \
	  (char *)(entry) + EXT2_XATTR_LEN((entry)->e_name_len)) )
/*由当前的入口项实际大小按照4字节对齐后得到的存储大小*/
#define EXT2_XATTR_SIZE(size) \
	(((size) + EXT2_XATTR_ROUND) & ~EXT2_XATTR_ROUND)
/*扩展属性结构体*/
# ifdef CONFIG_EXT2_FS_XATTR


extern struct xattr_handler ext2_xattr_user_handler;
extern struct xattr_handler ext2_xattr_trusted_handler;
extern struct xattr_handler ext2_xattr_acl_access_handler;
extern struct xattr_handler ext2_xattr_acl_default_handler;
extern struct xattr_handler ext2_xattr_security_handler;


extern ssize_t ext2_listxattr(struct dentry *, char *, size_t);


extern int ext2_xattr_get(struct inode *, int, const char *, void *, size_t);
extern int ext2_xattr_set(struct inode *, int, const char *, const void *, size_t, int);


extern void ext2_xattr_delete_inode(struct inode *);
extern void ext2_xattr_put_super(struct super_block *);


extern int init_ext2_xattr(void);
extern void exit_ext2_xattr(void);


extern struct xattr_handler *ext2_xattr_handlers[];


# else  /* CONFIG_EXT2_FS_XATTR */
/*如果没有配置这个宏,就返回操作不被支持*/
static inline int
ext2_xattr_get(struct inode *inode, int name_index,
	       const char *name, void *buffer, size_t size)
{
	return -EOPNOTSUPP;
}


static inline int
ext2_xattr_set(struct inode *inode, int name_index, const char *name,
	       const void *value, size_t size, int flags)
{
	return -EOPNOTSUPP;
}


static inline void
ext2_xattr_delete_inode(struct inode *inode)
{
}


static inline void
ext2_xattr_put_super(struct super_block *sb)
{
}


static inline int
init_ext2_xattr(void)
{
	return 0;
}


static inline void
exit_ext2_xattr(void)
{
}


#define ext2_xattr_handlers NULL


# endif  /* CONFIG_EXT2_FS_XATTR */


#ifdef CONFIG_EXT2_FS_SECURITY
extern int ext2_init_security(struct inode *inode, struct inode *dir);
#else
static inline int ext2_init_security(struct inode *inode, struct inode *dir)
{
	return 0;
}
#endif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值