X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=ldiskfs%2Fkernel_patches%2Fpatches%2Fsles12sp2%2Fext4-large-eas.patch;h=0bf0c7d0a8599aeee95a8f94288cc4c037d77632;hb=e41bdca7559;hp=962512e7d36c87999eff74ba6a57e459dfc487ec;hpb=3b3eeeb08407588c75e47a751a72fad6ac7d78f2;p=fs%2Flustre-release.git diff --git a/ldiskfs/kernel_patches/patches/sles12sp2/ext4-large-eas.patch b/ldiskfs/kernel_patches/patches/sles12sp2/ext4-large-eas.patch index 962512e..0bf0c7d 100644 --- a/ldiskfs/kernel_patches/patches/sles12sp2/ext4-large-eas.patch +++ b/ldiskfs/kernel_patches/patches/sles12sp2/ext4-large-eas.patch @@ -16,19 +16,6 @@ Index: linux-stage/fs/ext4/ext4.h EXT4_FEATURE_INCOMPAT_MMP | \ EXT4_FEATURE_INCOMPAT_DIRDATA| \ EXT4_FEATURE_INCOMPAT_INLINE_DATA) -@@ -1979,6 +1980,12 @@ struct mmpd_data { - #define EXT4_MMP_MAX_CHECK_INTERVAL 300UL - - /* -+ * Maximum size of xattr attributes for FEATURE_INCOMPAT_EA_INODE 1Mb -+ * This limit is arbitrary, but is reasonable for the xattr API. -+ */ -+#define EXT4_XATTR_MAX_LARGE_EA_SIZE (1024 * 1024) -+ -+/* - * Function prototypes - */ - @@ -1990,6 +1997,10 @@ struct mmpd_data { # define ATTRIB_NORET __attribute__((noreturn)) # define NORET_AND noreturn, @@ -369,7 +356,7 @@ Index: linux-stage/fs/ext4/xattr.c size_t offs = le16_to_cpu(last->e_value_offs); if (offs < *min_offs) *min_offs = offs; -@@ -611,16 +728,176 @@ static size_t ext4_xattr_free_space(stru +@@ -611,16 +728,200 @@ static size_t ext4_xattr_free_space(stru return (*min_offs - ((void *)last - base) - sizeof(__u32)); } @@ -448,11 +435,22 @@ Index: linux-stage/fs/ext4/xattr.c + return ret; +} + ++static void ext4_xattr_inode_set_ref(struct inode *ea_inode, __u64 ref_count) ++{ ++ ea_inode->i_ctime.tv_sec = (__u32)(ref_count >> 32); ++ ea_inode->i_version = (__u32)ref_count; ++} ++ ++static void ext4_xattr_inode_set_hash(struct inode *ea_inode, __u32 hash) ++{ ++ ea_inode->i_atime.tv_sec = hash; ++} ++ +/* + * Create an inode to store the value of a large EA. + */ +static struct inode * -+ext4_xattr_inode_create(handle_t *handle, struct inode *inode) ++ext4_xattr_inode_create(handle_t *handle, struct inode *inode, __u32 hash) +{ + struct inode *ea_inode = NULL; + @@ -476,6 +474,9 @@ Index: linux-stage/fs/ext4/xattr.c + */ + EXT4_XATTR_INODE_SET_PARENT(ea_inode, inode->i_ino); + unlock_new_inode(ea_inode); ++ ++ ext4_xattr_inode_set_ref(ea_inode, 1); ++ ext4_xattr_inode_set_hash(ea_inode, hash); + } + + return ea_inode; @@ -500,6 +501,14 @@ Index: linux-stage/fs/ext4/xattr.c + return 0; +} + ++static __u32 ++ext4_xattr_inode_hash(struct ext4_sb_info *sbi, const void *buffer, size_t size) ++{ ++ if (ext4_has_metadata_csum(sbi->s_sb)) ++ return ext4_chksum(sbi, sbi->s_csum_seed, buffer, size); ++ return 0; ++} ++ +/* + * Add value of the EA in an inode. + */ @@ -508,10 +517,12 @@ Index: linux-stage/fs/ext4/xattr.c + const void *value, size_t value_len) +{ + struct inode *ea_inode = NULL; ++ __u32 hash; + int err; + + /* Create an inode for the EA value */ -+ ea_inode = ext4_xattr_inode_create(handle, inode); ++ hash = ext4_xattr_inode_hash(EXT4_SB(inode->i_sb), value, value_len); ++ ea_inode = ext4_xattr_inode_create(handle, inode, hash); + if (IS_ERR(ea_inode)) + return -1; + @@ -548,7 +559,7 @@ Index: linux-stage/fs/ext4/xattr.c size_t offs = le16_to_cpu(last->e_value_offs); if (offs < min_offs) min_offs = offs; -@@ -628,15 +903,20 @@ ext4_xattr_set_entry(struct ext4_xattr_i +@@ -628,15 +927,20 @@ ext4_xattr_set_entry(struct ext4_xattr_i } free = min_offs - ((void *)last - s->base) - sizeof(__u32); if (!s->not_found) { @@ -572,7 +583,7 @@ Index: linux-stage/fs/ext4/xattr.c return -ENOSPC; } -@@ -651,7 +931,8 @@ ext4_xattr_set_entry(struct ext4_xattr_i +@@ -651,7 +955,8 @@ ext4_xattr_set_entry(struct ext4_xattr_i s->here->e_name_len = name_len; memcpy(s->here->e_name, i->name, name_len); } else { @@ -582,7 +593,7 @@ Index: linux-stage/fs/ext4/xattr.c void *first_val = s->base + min_offs; size_t offs = le16_to_cpu(s->here->e_value_offs); void *val = s->base + offs; -@@ -685,13 +966,18 @@ ext4_xattr_set_entry(struct ext4_xattr_i +@@ -685,13 +990,18 @@ ext4_xattr_set_entry(struct ext4_xattr_i last = s->first; while (!IS_LAST_ENTRY(last)) { size_t o = le16_to_cpu(last->e_value_offs); @@ -602,7 +613,7 @@ Index: linux-stage/fs/ext4/xattr.c if (!i->value) { /* Remove the old name. */ size_t size = EXT4_XATTR_LEN(name_len); -@@ -705,10 +990,17 @@ ext4_xattr_set_entry(struct ext4_xattr_i +@@ -705,10 +1014,17 @@ ext4_xattr_set_entry(struct ext4_xattr_i if (i->value) { /* Insert the new value. */ s->here->e_value_size = cpu_to_le32(i->value_len); @@ -621,7 +632,7 @@ Index: linux-stage/fs/ext4/xattr.c if (i->value == EXT4_ZERO_XATTR_VALUE) { memset(val, 0, size); } else { -@@ -758,7 +1050,7 @@ ext4_xattr_block_find(struct inode *inod +@@ -758,7 +1074,7 @@ ext4_xattr_block_find(struct inode *inod bs->s.end = bs->bh->b_data + bs->bh->b_size; bs->s.here = bs->s.first; error = ext4_xattr_find_entry(&bs->s.here, i->name_index, @@ -630,7 +641,7 @@ Index: linux-stage/fs/ext4/xattr.c if (error && error != -ENODATA) goto cleanup; bs->s.not_found = error; -@@ -782,8 +1074,6 @@ ext4_xattr_block_set(handle_t *handle, s +@@ -782,8 +1098,6 @@ ext4_xattr_block_set(handle_t *handle, s #define header(x) ((struct ext4_xattr_header *)(x)) @@ -639,7 +650,7 @@ Index: linux-stage/fs/ext4/xattr.c if (s->base) { ce = mb_cache_entry_get(ext4_xattr_cache, bs->bh->b_bdev, bs->bh->b_blocknr); -@@ -799,7 +1089,7 @@ ext4_xattr_block_set(handle_t *handle, s +@@ -799,7 +1113,7 @@ ext4_xattr_block_set(handle_t *handle, s ce = NULL; } ea_bdebug(bs->bh, "modifying in-place"); @@ -648,7 +659,7 @@ Index: linux-stage/fs/ext4/xattr.c if (!error) { if (!IS_LAST_ENTRY(s->first)) ext4_xattr_rehash(header(s->base), -@@ -850,7 +1140,7 @@ ext4_xattr_block_set(handle_t *handle, s +@@ -850,7 +1164,7 @@ ext4_xattr_block_set(handle_t *handle, s s->end = s->base + sb->s_blocksize; } @@ -657,7 +668,7 @@ Index: linux-stage/fs/ext4/xattr.c if (error == -EFSCORRUPTED) goto bad_block; if (error) -@@ -1000,7 +1290,7 @@ int ext4_xattr_ibody_find(struct inode * +@@ -1000,7 +1314,7 @@ int ext4_xattr_ibody_find(struct inode * /* Find the named attribute. */ error = ext4_xattr_find_entry(&is->s.here, i->name_index, i->name, is->s.end - @@ -666,7 +677,7 @@ Index: linux-stage/fs/ext4/xattr.c if (error && error != -ENODATA) return error; is->s.not_found = error; -@@ -1018,7 +1308,7 @@ int ext4_xattr_ibody_inline_set(handle_t +@@ -1018,7 +1332,7 @@ int ext4_xattr_ibody_inline_set(handle_t if (EXT4_I(inode)->i_extra_isize == 0) return -ENOSPC; @@ -675,7 +686,7 @@ Index: linux-stage/fs/ext4/xattr.c if (error) { if (error == -ENOSPC && ext4_has_inline_data(inode)) { -@@ -1030,7 +1320,7 @@ int ext4_xattr_ibody_inline_set(handle_t +@@ -1030,7 +1344,7 @@ int ext4_xattr_ibody_inline_set(handle_t error = ext4_xattr_ibody_find(inode, i, is); if (error) return error; @@ -684,7 +695,7 @@ Index: linux-stage/fs/ext4/xattr.c } if (error) return error; -@@ -1056,7 +1346,7 @@ static int ext4_xattr_ibody_set(handle_t +@@ -1056,7 +1370,7 @@ static int ext4_xattr_ibody_set(handle_t if (EXT4_I(inode)->i_extra_isize == 0) return -ENOSPC; @@ -693,7 +704,7 @@ Index: linux-stage/fs/ext4/xattr.c if (error) return error; header = IHDR(inode, ext4_raw_inode(&is->iloc)); -@@ -1092,7 +1382,7 @@ ext4_xattr_set_handle(handle_t *handle, +@@ -1092,7 +1406,7 @@ ext4_xattr_set_handle(handle_t *handle, .name = name, .value = value, .value_len = value_len, @@ -702,7 +713,7 @@ Index: linux-stage/fs/ext4/xattr.c }; struct ext4_xattr_ibody_find is = { .s = { .not_found = -ENODATA, }, -@@ -1157,6 +1447,15 @@ ext4_xattr_set_handle(handle_t *handle, +@@ -1157,6 +1471,15 @@ ext4_xattr_set_handle(handle_t *handle, goto cleanup; } error = ext4_xattr_block_set(handle, inode, &i, &bs); @@ -718,7 +729,7 @@ Index: linux-stage/fs/ext4/xattr.c if (error) goto cleanup; if (!is.s.not_found) { -@@ -1203,9 +1502,22 @@ ext4_xattr_set(struct inode *inode, int +@@ -1203,9 +1526,22 @@ ext4_xattr_set(struct inode *inode, int const void *value, size_t value_len, int flags) { handle_t *handle; @@ -741,7 +752,7 @@ Index: linux-stage/fs/ext4/xattr.c retry: handle = ext4_journal_start(inode, EXT4_HT_XATTR, credits); if (IS_ERR(handle)) { -@@ -1217,7 +1529,7 @@ retry: +@@ -1217,7 +1553,7 @@ retry: value, value_len, flags); error2 = ext4_journal_stop(handle); if (error == -ENOSPC && @@ -750,7 +761,7 @@ Index: linux-stage/fs/ext4/xattr.c goto retry; if (error == 0) error = error2; -@@ -1239,7 +1551,7 @@ static void ext4_xattr_shift_entries(str +@@ -1239,7 +1575,7 @@ static void ext4_xattr_shift_entries(str /* Adjust the value offsets of the entries */ for (; !IS_LAST_ENTRY(last); last = EXT4_XATTR_NEXT(last)) { @@ -759,7 +770,7 @@ Index: linux-stage/fs/ext4/xattr.c new_offs = le16_to_cpu(last->e_value_offs) + value_offs_shift; BUG_ON(new_offs + le32_to_cpu(last->e_value_size) -@@ -1477,21 +1789,135 @@ cleanup: +@@ -1477,21 +1813,135 @@ cleanup: } @@ -900,7 +911,7 @@ Index: linux-stage/fs/ext4/xattr.c bh = sb_bread(inode->i_sb, EXT4_I(inode)->i_file_acl); if (!bh) { EXT4_ERROR_INODE(inode, "block %llu read error", -@@ -1504,11 +1930,69 @@ ext4_xattr_delete_inode(handle_t *handle +@@ -1504,11 +1954,69 @@ ext4_xattr_delete_inode(handle_t *handle EXT4_I(inode)->i_file_acl); goto cleanup; } @@ -970,7 +981,7 @@ Index: linux-stage/fs/ext4/xattr.c } /* -@@ -1578,10 +2062,9 @@ ext4_xattr_cmp(struct ext4_xattr_header +@@ -1578,10 +2086,9 @@ ext4_xattr_cmp(struct ext4_xattr_header entry1->e_name_index != entry2->e_name_index || entry1->e_name_len != entry2->e_name_len || entry1->e_value_size != entry2->e_value_size || @@ -982,7 +993,7 @@ Index: linux-stage/fs/ext4/xattr.c if (memcmp((char *)header1 + le16_to_cpu(entry1->e_value_offs), (char *)header2 + le16_to_cpu(entry2->e_value_offs), le32_to_cpu(entry1->e_value_size))) -@@ -1665,7 +2148,7 @@ static inline void ext4_xattr_hash_entry +@@ -1665,7 +2172,7 @@ static inline void ext4_xattr_hash_entry *name++; }