23 unsigned long *
count,
int *errp)
60#define NAME_HASH_SHIFT 5
61#define VALUE_HASH_SHIFT 16
70 for (
n = 0;
n <
entry->e_name_len;
n++) {
75 if (
entry->e_value_block == 0 &&
entry->e_value_size != 0) {
89#define BLOCK_HASH_SHIFT 16
118#if CONFIG_META_CSUM_ENABLE
125 __u64 le64_blocknr = blocknr;
126 struct ext4_sblock *
sb = &inode_ref->fs->sb;
128 if (ext4_sb_feature_ro_com(
sb, EXT4_FRO_COM_METADATA_CSUM)) {
132 orig_checksum =
header->h_checksum;
139 sizeof(le64_blocknr));
143 ext4_sb_get_block_size(
sb));
144 header->h_checksum = orig_checksum;
149#define ext4_xattr_block_checksum(...) 0
170 if (
a->is_data && !
b->is_data)
173 if (!
a->is_data &&
b->is_data)
176 result =
a->name_index -
b->name_index;
180 if (
a->name_len <
b->name_len)
183 if (
a->name_len >
b->name_len)
186 return memcmp(
a->name,
b->name,
a->name_len);
284 size_t new_data_size)
286 if (new_data_size !=
item->data_size) {
295 item->data = new_data;
296 item->data_size = new_data_size;
362 (
size_t)
entry->e_name_len);
412 (
size_t)
entry->e_name_len);
525 if (
item->in_inode) {
566 (last_item && !last_item->
in_inode)) {
588 if (
item->in_inode) {
628 if (
item->in_inode) {
648 size_t new_data_size)
652 size_t old_data_size =
item->data_size;
653 size_t orig_room_size =
item->in_inode ?
665 if (
item->in_inode) {
709 }
else if (to_inode) {
839 entry->e_value_offs =
841 entry->e_value_block = 0;
848 void *block_data_ptr)
853 cpu_to_le16((
char *)block_data_ptr - (
char *)block_header);
862 void *ibody_data =
NULL;
863 void *block_data =
NULL;
864 size_t inode_size_rem, block_size_rem;
878 if (!xattr_ref->
dirty)
882 memset(ibody_header, 0, inode_size_rem);
884 ibody_data = (
char *)ibody_header + inode_size_rem;
890 if (xattr_ref->
ea_size > inode_size_rem) {
900 block_data = (
char *)block_header + block_size_rem;
916 (
char *)block_header + block_size_rem;
928 if (
item->in_inode) {
929 ibody_data = (
char *)ibody_data -
947 DbgPrint(
"ext4_xattr.c: IMPOSSIBLE -ENOSPC AS WE DID INSPECTION!\n");
962 block_modified =
TRUE;
965 if (block_modified) {
984 if (!
ref->iter_from) {
986 first_node =
ref->ordered_list.next;
987 if (first_node && first_node != &
ref->ordered_list) {
1083 size_t item_size = 0;
1091 item_size =
item->data_size;
1092 if (buf_size > item_size)
1093 buf_size = item_size;
1110 xattr_block = inode_ref->
Inode.i_file_acl;
1123 ref->inode_ref = inode_ref;
1128 if (!
ref->OnDiskInode) {
1149 ref->inode_size_rem = 0;
1151 ref->inode_size_rem =
1156 ref->block_size_rem =
1172 ref->IrpContext = IrpContext;
1179 sector_t orig_file_acl =
ref->inode_ref->Inode.i_file_acl;
1181 if (
ref->IsOnDiskInodeDirty) {
1186 ref->inode_ref->Inode.i_file_acl = orig_file_acl;
1194 &
ref->inode_ref->Inode,
1201 if (
ref->block_loaded) {
1244 if (!full_name_len) {
1253 if (full_name_len >= prefix_len &&
1259 *name_len = full_name_len - prefix_len;
1261 if (!(full_name_len - prefix_len) && require_name)
1266 return full_name + prefix_len;
1278 size_t *ret_prefix_len)
1286 *ret_prefix_len = prefix_len;
1292 *ret_prefix_len = 0;
int memcmp(void *Buffer1, void *Buffer2, ACPI_SIZE Count)
ACPI_SIZE strlen(const char *String)
static int list_empty(struct list_entry *head)
static void list_add_tail(struct list_entry *head, struct list_entry *entry)
#define NT_SUCCESS(StatCode)
static cab_ULONG checksum(const cab_UBYTE *data, cab_UWORD bytes, cab_ULONG csum)
BOOL next_node(stream_t *stream, strbuf_t *buf)
#define INIT_LIST_HEAD(ptr)
#define list_entry(ptr, type, member)
#define list_for_each_entry(pos, head, member)
static void list_del_init(struct list_head *entry)
struct rb_node * rb_first(struct rb_root *)
struct rb_node * rb_next(struct rb_node *)
void rb_erase(struct rb_node *, struct rb_root *)
void rb_insert(struct rb_root *root, struct rb_node *node, int(*cmp)(struct rb_node *, struct rb_node *))
unsigned __int64 sector_t
BOOLEAN Ext2SaveInodeXattr(IN PEXT2_IRP_CONTEXT IrpContext, IN PEXT2_VCB Vcb, IN struct inode *Inode, IN PEXT2_INODE InodeXattr)
VOID Ext2DestroyInode(IN PEXT2_VCB Vcb, IN PEXT2_INODE inode)
NTSTATUS Ext2NewBlock(IN PEXT2_IRP_CONTEXT IrpContext, IN PEXT2_VCB Vcb, IN ULONG GroupHint, IN ULONG BlockHint, OUT PULONG Block, IN OUT PULONG Number)
NTSTATUS Ext2FreeBlock(IN PEXT2_IRP_CONTEXT IrpContext, IN PEXT2_VCB Vcb, IN ULONG Block, IN ULONG Number)
BOOLEAN Ext2LoadInodeXattr(IN PEXT2_VCB Vcb, IN struct inode *Inode, IN PEXT2_INODE InodeXattr)
BOOLEAN Ext2SaveInode(IN PEXT2_IRP_CONTEXT IrpContext, IN PEXT2_VCB Vcb, IN struct inode *Inode)
PEXT2_INODE Ext2AllocateInode(PEXT2_VCB Vcb)
int Ext2LinuxError(NTSTATUS Status)
unsigned long long ext4_fsblk_t
static struct ext4_xattr_item * ext4_xattr_item_alloc(__u8 name_index, const char *name, size_t name_len)
static int ext4_xattr_block_fetch(struct ext4_xattr_ref *xattr_ref)
static void * ext4_xattr_entry_data(struct ext4_xattr_ref *xattr_ref, struct ext4_xattr_entry *entry, BOOL in_inode)
#define ext4_xattr_block_checksum(...)
static int ext4_xattr_try_alloc_block(struct ext4_xattr_ref *xattr_ref)
static int ext4_xattr_write_to_disk(struct ext4_xattr_ref *xattr_ref)
static void ext4_xattr_set_inode_entry(struct ext4_xattr_item *item, struct ext4_xattr_ibody_header *ibody_header, struct ext4_xattr_entry *entry, void *ibody_data_ptr)
static void ext4_xattr_compute_hash(struct ext4_xattr_header *header, struct ext4_xattr_entry *entry)
static ext4_fsblk_t ext4_inode_to_goal_block(struct inode *inode)
static const struct xattr_prefix prefix_tbl[]
static int ext4_xattr_item_cmp(struct rb_node *_a, struct rb_node *_b)
static void ext4_xattr_try_free_block(struct ext4_xattr_ref *xattr_ref)
static void ext4_xattr_item_free_data(struct ext4_xattr_item *item)
static void ext4_xattr_set_block_entry(struct ext4_xattr_item *item, struct ext4_xattr_header *block_header, struct ext4_xattr_entry *block_entry, void *block_data_ptr)
static void ext4_xattr_item_free(struct ext4_xattr_item *item)
static int ext4_xattr_item_alloc_data(struct ext4_xattr_item *item, const void *orig_data, size_t data_size)
static int ext4_xattr_remove_item(struct ext4_xattr_ref *xattr_ref, __u8 name_index, const char *name, size_t name_len)
static void ext4_free_blocks(void *icb, struct inode *inode, ext4_fsblk_t block, int count, int flags)
static struct ext4_xattr_item * ext4_xattr_item_search(struct ext4_xattr_ref *xattr_ref, struct ext4_xattr_item *name)
static struct ext4_xattr_item * ext4_xattr_lookup_item(struct ext4_xattr_ref *xattr_ref, __u8 name_index, const char *name, size_t name_len)
static int ext4_xattr_fetch(struct ext4_xattr_ref *xattr_ref)
static __s32 ext4_xattr_inode_space(struct ext4_xattr_ref *xattr_ref)
static ext4_fsblk_t ext4_new_meta_blocks(void *icb, struct inode *inode, ext4_fsblk_t goal, unsigned int flags, unsigned long *count, int *errp)
static void ext4_xattr_item_insert(struct ext4_xattr_ref *xattr_ref, struct ext4_xattr_item *item)
static int ext4_xattr_item_resize_data(struct ext4_xattr_item *item, size_t new_data_size)
static void ext4_xattr_item_remove(struct ext4_xattr_ref *xattr_ref, struct ext4_xattr_item *item)
static struct ext4_xattr_item * ext4_xattr_insert_item_ordered(struct ext4_xattr_ref *xattr_ref, __u8 name_index, const char *name, size_t name_len, const void *data, size_t data_size, int *err)
static void ext4_xattr_set_block_header(struct ext4_xattr_ref *xattr_ref)
static struct ext4_xattr_item * ext4_xattr_insert_item(struct ext4_xattr_ref *xattr_ref, __u8 name_index, const char *name, size_t name_len, const void *data, size_t data_size, int *err)
static void ext4_xattr_set_block_checksum(PEXT2_MCB inode_ref, ext4_fsblk_t blocknr, struct ext4_xattr_header *header)
static int ext4_xattr_inode_fetch(struct ext4_xattr_ref *xattr_ref)
static __s32 ext4_xattr_block_space(struct ext4_xattr_ref *xattr_ref)
static void ext4_xattr_rehash(struct ext4_xattr_header *header, struct ext4_xattr_entry *entry)
static int ext4_xattr_resize_item(struct ext4_xattr_ref *xattr_ref, struct ext4_xattr_item *item, size_t new_data_size)
Extended Attribute manipulation.
GLuint GLuint GLsizei count
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
GLboolean GLboolean GLboolean b
GLenum GLuint GLenum GLsizei const GLchar * buf
GLboolean GLboolean GLboolean GLboolean a
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
#define container_of(ptr, type, member)
#define EXT4_XATTR_INDEX_POSIX_ACL_ACCESS
#define EXT4_XATTR_ITERATE_STOP
#define EXT4_XATTR_IFIRST(hdr)
int ext4_fs_get_xattr(struct ext4_xattr_ref *ref, __u8 name_index, const char *name, size_t name_len, void *buf, size_t buf_size, size_t *data_size)
#define EXT4_GOOD_OLD_INODE_SIZE
int ext4_fs_set_xattr(struct ext4_xattr_ref *ref, __u8 name_index, const char *name, size_t name_len, const void *data, size_t data_size, BOOL replace)
#define EXT4_XATTR_INDEX_SYSTEM
#define EXT4_XATTR_IS_LAST_ENTRY(entry)
#define EXT4_XATTR_IHDR(raw_inode)
#define EXT4_XATTR_NAME(entry)
int ext4_fs_set_xattr_ordered(struct ext4_xattr_ref *ref, __u8 name_index, const char *name, size_t name_len, const void *data, size_t data_size)
#define EXT4_XATTR_ITERATE_CONT
#define EXT4_XATTR_INDEX_SECURITY
#define EXT4_XATTR_INDEX_POSIX_ACL_DEFAULT
#define EXT4_XATTR_ENTRY(ptr)
#define EXT4_XATTR_INDEX_TRUSTED
const char * ext4_extract_xattr_name(const char *full_name, size_t full_name_len, __u8 *name_index, size_t *name_len, BOOL *found)
#define EXT4_XATTR_SIZE(size)
#define EXT4_XATTR_BFIRST(block)
#define EXT4_XATTR_LEN(name_len)
void ext4_fs_xattr_iterate_reset(struct ext4_xattr_ref *ref)
void ext4_fs_xattr_iterate(struct ext4_xattr_ref *ref, int(*iter)(struct ext4_xattr_ref *ref, struct ext4_xattr_item *item, BOOL is_last))
void ext4_xattr_purge_items(struct ext4_xattr_ref *xattr_ref)
const char * ext4_get_xattr_name_prefix(__u8 name_index, size_t *ret_prefix_len)
int ext4_fs_remove_xattr(struct ext4_xattr_ref *ref, __u8 name_index, const char *name, size_t name_len)
#define EXT4_XATTR_INDEX_USER
int ext4_fs_put_xattr_ref(struct ext4_xattr_ref *ref)
#define EXT4_XATTR_INDEX_RICHACL
#define EXT4_XATTR_PAD_BITS
#define EXT4_XATTR_BHDR(block)
int ext4_fs_get_xattr_ref(PEXT2_IRP_CONTEXT IrpContext, PEXT2_VCB fs, PEXT2_MCB inode_ref, struct ext4_xattr_ref *ref)
#define EXT4_XATTR_NEXT(entry)
static DWORD block_size(DWORD block)
#define memcpy(s1, s2, n)
struct buffer_head * extents_bread(struct super_block *sb, sector_t block)
#define kmalloc(size, gfp)
void extents_brelse(struct buffer_head *bh)
void * kzalloc(int size, int flags)
struct buffer_head * extents_bwrite(struct super_block *sb, sector_t block)
static void le32_add_cpu(__le32 *var, u32 val)
void extents_bforget(struct buffer_head *bh)
void extents_mark_buffer_dirty(struct buffer_head *bh)
INT replace(TCHAR source[MAX_PATH], TCHAR dest[MAX_PATH], DWORD dwFlags, BOOL *doMore)
struct list_head list_node
struct ext4_xattr_item * iter_from
PEXT2_IRP_CONTEXT IrpContext
struct buffer_head * block_bh
struct list_head ordered_list
struct super_block * i_sb
Character const *const prefix
ActualNumberDriverObjects * sizeof(PDRIVER_OBJECT)) PDRIVER_OBJECT *DriverObjectList
static unsigned int block