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;
static unsigned int block
#define EXT4_XATTR_LEN(name_len)
static __s32 ext4_xattr_inode_space(struct ext4_xattr_ref *xattr_ref)
static ext4_fsblk_t ext4_inode_to_goal_block(struct inode *inode)
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)
NTSTATUS Ext2NewBlock(IN PEXT2_IRP_CONTEXT IrpContext, IN PEXT2_VCB Vcb, IN ULONG GroupHint, IN ULONG BlockHint, OUT PULONG Block, IN OUT PULONG Number)
void extents_mark_buffer_dirty(struct buffer_head *bh)
PEXT2_INODE Ext2AllocateInode(PEXT2_VCB Vcb)
static int ext4_xattr_resize_item(struct ext4_xattr_ref *xattr_ref, struct ext4_xattr_item *item, size_t new_data_size)
static struct ext4_xattr_item * ext4_xattr_item_alloc(__u8 name_index, const char *name, size_t name_len)
int memcmp(void *Buffer1, void *Buffer2, ACPI_SIZE Count)
BOOLEAN Ext2SaveInodeXattr(IN PEXT2_IRP_CONTEXT IrpContext, IN PEXT2_VCB Vcb, IN struct inode *Inode, IN PEXT2_INODE InodeXattr)
unsigned __int64 sector_t
static int ext4_xattr_fetch(struct ext4_xattr_ref *xattr_ref)
ActualNumberDriverObjects * sizeof(PDRIVER_OBJECT)) PDRIVER_OBJECT *DriverObjectList
#define EXT4_XATTR_PAD_BITS
ACPI_SIZE strlen(const char *String)
static void ext4_free_blocks(void *icb, struct inode *inode, ext4_fsblk_t block, int count, int flags)
#define EXT4_XATTR_NEXT(entry)
Extended Attribute manipulation.
static int ext4_xattr_block_fetch(struct ext4_xattr_ref *xattr_ref)
GLuint GLuint GLsizei count
#define EXT4_XATTR_SIZE(size)
struct rb_node * rb_next(struct rb_node *)
#define EXT4_XATTR_ENTRY(ptr)
#define INIT_LIST_HEAD(ptr)
void rb_insert(struct rb_root *root, struct rb_node *node, int(*cmp)(struct rb_node *, struct rb_node *))
PEXT2_IRP_CONTEXT IrpContext
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 const struct xattr_prefix prefix_tbl[]
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)
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)
BOOL next_node(stream_t *stream, strbuf_t *buf)
static void ext4_xattr_item_insert(struct ext4_xattr_ref *xattr_ref, struct ext4_xattr_item *item)
struct rb_node * rb_first(struct rb_root *)
#define list_entry(ptr, type, member)
static int ext4_xattr_write_to_disk(struct ext4_xattr_ref *xattr_ref)
static void ext4_xattr_item_remove(struct ext4_xattr_ref *xattr_ref, struct ext4_xattr_item *item)
static DWORD block_size(DWORD block)
struct ext4_xattr_item * iter_from
unsigned long long ext4_fsblk_t
#define list_for_each_entry(pos, head, member)
struct buffer_head * extents_bwrite(struct super_block *sb, sector_t block)
__WINE_SERVER_LIST_INLINE void list_add_tail(struct list *list, struct list *elem)
GLenum GLuint GLenum GLsizei const GLchar * buf
#define EXT4_XATTR_BFIRST(block)
void rb_erase(struct rb_node *, struct rb_root *)
static void ext4_xattr_try_free_block(struct ext4_xattr_ref *xattr_ref)
#define EXT4_XATTR_INDEX_SECURITY
#define EXT4_XATTR_INDEX_RICHACL
void extents_brelse(struct buffer_head *bh)
static void ext4_xattr_set_block_checksum(PEXT2_MCB inode_ref, ext4_fsblk_t blocknr, struct ext4_xattr_header *header)
#define EXT4_XATTR_INDEX_USER
void extents_bforget(struct buffer_head *bh)
static void list_del_init(struct list_head *entry)
NTSTATUS Ext2FreeBlock(IN PEXT2_IRP_CONTEXT IrpContext, IN PEXT2_VCB Vcb, IN ULONG Block, IN ULONG Number)
struct buffer_head * block_bh
BOOLEAN Ext2LoadInodeXattr(IN PEXT2_VCB Vcb, IN struct inode *Inode, IN PEXT2_INODE InodeXattr)
static void ext4_xattr_compute_hash(struct ext4_xattr_header *header, struct ext4_xattr_entry *entry)
#define EXT4_XATTR_INDEX_SYSTEM
#define EXT4_XATTR_IS_LAST_ENTRY(entry)
int ext4_fs_get_xattr_ref(PEXT2_IRP_CONTEXT IrpContext, PEXT2_VCB fs, PEXT2_MCB inode_ref, struct ext4_xattr_ref *ref)
INT replace(TCHAR source[MAX_PATH], TCHAR dest[MAX_PATH], DWORD dwFlags, BOOL *doMore)
struct list_head list_node
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)
#define EXT4_XATTR_INDEX_TRUSTED
GLboolean GLboolean GLboolean b
#define EXT4_XATTR_IFIRST(hdr)
int ext4_fs_put_xattr_ref(struct ext4_xattr_ref *ref)
#define NT_SUCCESS(StatCode)
#define ext4_xattr_block_checksum(...)
#define container_of(ptr, type, member)
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_fs_xattr_iterate_reset(struct ext4_xattr_ref *ref)
static void ext4_xattr_item_free(struct ext4_xattr_item *item)
static void ext4_xattr_rehash(struct ext4_xattr_header *header, struct ext4_xattr_entry *entry)
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
static void le32_add_cpu(__le32 *var, u32 val)
#define EXT4_XATTR_ITERATE_STOP
#define memcpy(s1, s2, n)
static cab_ULONG checksum(const cab_UBYTE *data, cab_UWORD bytes, cab_ULONG csum)
static void ext4_xattr_item_free_data(struct ext4_xattr_item *item)
#define EXT4_XATTR_IHDR(raw_inode)
VOID Ext2DestroyInode(IN PEXT2_VCB Vcb, IN PEXT2_INODE inode)
static int ext4_xattr_item_resize_data(struct ext4_xattr_item *item, size_t new_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 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 int ext4_xattr_inode_fetch(struct ext4_xattr_ref *xattr_ref)
static int ext4_xattr_item_alloc_data(struct ext4_xattr_item *item, const void *orig_data, size_t data_size)
__WINE_SERVER_LIST_INLINE int list_empty(const struct list *list)
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)
int ext4_fs_remove_xattr(struct ext4_xattr_ref *ref, __u8 name_index, const char *name, size_t name_len)
#define EXT4_XATTR_ITERATE_CONT
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
static struct ext4_xattr_item * ext4_xattr_item_search(struct ext4_xattr_ref *xattr_ref, struct ext4_xattr_item *name)
void * kmalloc(size_t, int)
static int ext4_xattr_item_cmp(struct rb_node *_a, struct rb_node *_b)
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 __s32 ext4_xattr_block_space(struct ext4_xattr_ref *xattr_ref)
int Ext2LinuxError(NTSTATUS Status)
#define EXT4_XATTR_BHDR(block)
struct buffer_head * extents_bread(struct super_block *sb, sector_t block)
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)
void * kzalloc(int size, int flags)
const char * ext4_get_xattr_name_prefix(__u8 name_index, size_t *ret_prefix_len)
#define EXT4_XATTR_INDEX_POSIX_ACL_ACCESS
struct super_block * i_sb
#define EXT4_GOOD_OLD_INODE_SIZE
static void ext4_xattr_set_block_header(struct ext4_xattr_ref *xattr_ref)
GLboolean GLboolean GLboolean GLboolean a
#define EXT4_XATTR_INDEX_POSIX_ACL_DEFAULT
static void * ext4_xattr_entry_data(struct ext4_xattr_ref *xattr_ref, struct ext4_xattr_entry *entry, BOOL in_inode)
#define EXT4_XATTR_NAME(entry)
static SERVICE_STATUS status
const char * ext4_extract_xattr_name(const char *full_name, size_t full_name_len, __u8 *name_index, size_t *name_len, BOOL *found)
BOOLEAN Ext2SaveInode(IN PEXT2_IRP_CONTEXT IrpContext, IN PEXT2_VCB Vcb, IN struct inode *Inode)
static int ext4_xattr_try_alloc_block(struct ext4_xattr_ref *xattr_ref)
void ext4_xattr_purge_items(struct ext4_xattr_ref *xattr_ref)
struct list_head ordered_list