From dba0f8d66b7feff2ce8918bd425db12a3e0cb1a7 Mon Sep 17 00:00:00 2001 From: Shaun Tancheff Date: Sat, 6 Jul 2024 08:54:39 +0700 Subject: [PATCH] LU-16350 ldiskfs: Server support for linux v6.7 / Ubuntu 24.04 Exclude kunit tests [files matching *-test.c] from ldiskfs build Updated patch series for Linux v6.7: ext4-corrupted-inode-block-bitmaps-handling-patches.patch ext4-ialloc-uid-gid-and-pass-owner-down.patch Updated patch series for Linux v6.5: ext4-data-in-dirent.patch Change struct osd_it_ea_dirent.oied_name from zero length to flexible array so strncmp works as expected. Test-Parameters: trivial HPE-bug-id: LUS-11376 Signed-off-by: Shaun Tancheff Change-Id: I2b2325a5874a91096fbd63750096e459065668bc Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/54216 Reviewed-by: James Simmons Reviewed-by: Oleg Drokin Reviewed-by: Jian Yu Reviewed-by: Shuichi Ihara Tested-by: jenkins Tested-by: Maloo --- config/lustre-build-ldiskfs.m4 | 28 +- ldiskfs/Makefile.in | 3 +- .../patches/linux-6.5/ext4-data-in-dirent.patch | 13 +- ...pted-inode-block-bitmaps-handling-patches.patch | 298 +++++++++++++++++++++ .../ext4-ialloc-uid-gid-and-pass-owner-down.patch | 145 ++++++++++ .../kernel_patches/series/ldiskfs-6.7-ml.series | 37 +++ lustre/osd-ldiskfs/osd_internal.h | 2 +- 7 files changed, 501 insertions(+), 25 deletions(-) create mode 100644 ldiskfs/kernel_patches/patches/linux-6.7/ext4-corrupted-inode-block-bitmaps-handling-patches.patch create mode 100644 ldiskfs/kernel_patches/patches/linux-6.7/ext4-ialloc-uid-gid-and-pass-owner-down.patch create mode 100644 ldiskfs/kernel_patches/series/ldiskfs-6.7-ml.series diff --git a/config/lustre-build-ldiskfs.m4 b/config/lustre-build-ldiskfs.m4 index b766184..093b69d 100644 --- a/config/lustre-build-ldiskfs.m4 +++ b/config/lustre-build-ldiskfs.m4 @@ -91,28 +91,14 @@ AS_IF([test x$RHEL_KERNEL = xyes], [ ]) ], [test x$UBUNTU_KERNEL = xyes], [ BASEVER=$(echo $LINUXRELEASE | cut -d'-' -f1) + AS_VERSION_COMPARE([$BASEVER],[6.8.0],[ AS_VERSION_COMPARE([$BASEVER],[5.19.0],[ AS_VERSION_COMPARE([$BASEVER],[5.15.0],[ AS_VERSION_COMPARE([$BASEVER],[5.11.0],[ AS_VERSION_COMPARE([$BASEVER],[5.8.0],[ AS_VERSION_COMPARE([$BASEVER],[5.4.0],[ AS_VERSION_COMPARE([$BASEVER],[5.0.0],[ - AS_VERSION_COMPARE([$BASEVER],[4.15.0],[ - AS_VERSION_COMPARE([$BASEVER],[4.4.0], [], - [ - KPLEV=$(echo $LINUXRELEASE | cut -d'-' -f2) - AS_IF( - [test -z "$KPLEV"], [ - AC_MSG_WARN([Failed to determine Kernel patch level. Assume latest.]) - LDISKFS_SERIES="4.4.0-73-ubuntu14+16.series" - ], - [test $KPLEV -ge 73], [LDISKFS_SERIES="4.4.0-73-ubuntu14+16.series"], - [test $KPLEV -ge 62], [LDISKFS_SERIES="4.4.0-62-ubuntu14+16.series"], - [test $KPLEV -ge 49], [LDISKFS_SERIES="4.4.0-49-ubuntu14+16.series"], - [LDISKFS_SERIES="4.4.0-45-ubuntu14+16.series"] - ) - ], - [LDISKFS_SERIES="4.4.0-73-ubuntu14+16.series"])], + AS_VERSION_COMPARE([$BASEVER],[4.15.0], [], [ KPLEV=$(echo $LINUXRELEASE | cut -d'-' -f2) AS_IF( @@ -169,7 +155,9 @@ AS_IF([test x$RHEL_KERNEL = xyes], [ ], [LDISKFS_SERIES="5.15.0-83-ubuntu20.series"])], [LDISKFS_SERIES="5.19.0-35-ubuntu.series"], - [LDISKFS_SERIES="5.19.0-35-ubuntu.series"]) + [LDISKFS_SERIES="5.19.0-35-ubuntu.series"])], + [LDISKFS_SERIES="6.7-ml.series"], + [LDISKFS_SERIES="6.7-ml.series"]) ], [test x$OPENEULER_KERNEL = xyes], [ case $OPENEULER_VERSION_NO in 2203.0) LDISKFS_SERIES="5.10.0-oe2203.series" ;; @@ -195,7 +183,11 @@ AS_IF([test -z "$LDISKFS_SERIES"], AS_VERSION_COMPARE([$LINUXRELEASE],[6.6.0], [ LDISKFS_SERIES="6.1.38-ml.series"], [ LDISKFS_SERIES="6.6-ml.series"], [ - LDISKFS_SERIES="6.6-ml.series"] + AS_VERSION_COMPARE([$LINUXRELEASE],[6.7.0], [ + LDISKFS_SERIES="6.6-ml.series"], [ + LDISKFS_SERIES="6.7-ml.series"], [ + LDISKFS_SERIES="6.7-ml.series"] + )] # 6.7 )] # 6.6 )] # 6.1 )] # 5.10 diff --git a/ldiskfs/Makefile.in b/ldiskfs/Makefile.in index 668d17e..a1b7ada 100644 --- a/ldiskfs/Makefile.in +++ b/ldiskfs/Makefile.in @@ -10,8 +10,9 @@ linux_headers := $(wildcard @LINUX@/include/linux/ext4*.h) uapi_linux_headers := $(wildcard @LINUX@/include/uapi/linux/ext4*.h) linux_new_headers := htree_lock.h trace_headers := $(wildcard @LINUX@/include/trace/events/ext4*.h) +backfs_unit_tests := $(wildcard @EXT4_SRC_DIR@/*-test.c) -backfs_sources := $(filter-out %.mod.c %/inode-test.c @EXT4_CRYPTO@,$(wildcard @EXT4_SRC_DIR@/*.c)) +backfs_sources := $(filter-out %.mod.c $(backfs_unit_tests) @EXT4_CRYPTO@,$(wildcard @EXT4_SRC_DIR@/*.c)) new_sources := mmp.c htree_lock.c critical_encode.h encdata.h new_headers := diff --git a/ldiskfs/kernel_patches/patches/linux-6.5/ext4-data-in-dirent.patch b/ldiskfs/kernel_patches/patches/linux-6.5/ext4-data-in-dirent.patch index d031553..41040da 100644 --- a/ldiskfs/kernel_patches/patches/linux-6.5/ext4-data-in-dirent.patch +++ b/ldiskfs/kernel_patches/patches/linux-6.5/ext4-data-in-dirent.patch @@ -25,9 +25,9 @@ fs/ext4/ext4.h | 107 ++++++++++++++- fs/ext4/fast_commit.c | 2 +- fs/ext4/inline.c | 8 +- - fs/ext4/namei.c | 295 ++++++++++++++++++++++++++++++++++++------ + fs/ext4/namei.c | 297 ++++++++++++++++++++++++++++++++++++------ fs/ext4/super.c | 4 +- - 6 files changed, 369 insertions(+), 56 deletions(-) + 6 files changed, 370 insertions(+), 57 deletions(-) diff --git a/fs/ext4/dir.c b/fs/ext4/dir.c index 3985f8c3..b8e4df14 100644 @@ -305,7 +305,7 @@ index 012d9259..b86441a6 100644 ext4_set_de_type(inode->i_sb, &fake, S_IFDIR); de = &fake; diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c -index 8fafbe65..38858511 100644 +index 8fafbe65..deb7fc46 100644 --- a/fs/ext4/namei.c +++ b/fs/ext4/namei.c @@ -290,7 +290,8 @@ static unsigned dx_get_count(struct dx_entry *entries); @@ -351,9 +351,12 @@ index 8fafbe65..38858511 100644 if (offset) *offset = count_offset; -@@ -558,11 +560,12 @@ ext4_next_entry(struct ext4_dir_entry_2 *p, unsigned long blocksize) +@@ -556,13 +558,14 @@ ext4_next_entry(struct ext4_dir_entry_2 *p, unsigned long blocksize) + * Future: use high four bits of block for coalesce-on-delete flags + * Mask them off for now. */ - struct dx_root_info *dx_get_dx_info(struct ext4_dir_entry_2 *de) +-struct dx_root_info *dx_get_dx_info(struct ext4_dir_entry_2 *de) ++static struct dx_root_info *dx_get_dx_info(struct ext4_dir_entry_2 *de) { + BUG_ON(de->name_len != 1); /* get dotdot first */ diff --git a/ldiskfs/kernel_patches/patches/linux-6.7/ext4-corrupted-inode-block-bitmaps-handling-patches.patch b/ldiskfs/kernel_patches/patches/linux-6.7/ext4-corrupted-inode-block-bitmaps-handling-patches.patch new file mode 100644 index 0000000..abeb321 --- /dev/null +++ b/ldiskfs/kernel_patches/patches/linux-6.7/ext4-corrupted-inode-block-bitmaps-handling-patches.patch @@ -0,0 +1,298 @@ +commit 2963f3d09eb3a0817f87386c0bd7be7ce086809d +Author: Wang Shilong +AuthorDate: Tue Sep 8 21:54:29 2015 +0800 +LU-7114 ldiskfs: corrupted bitmaps handling patches + +This patch backported following patches from upstream: + +163a203ddb36c36d4a1c942aececda0cc8d06aa7 +ext4: mark block group as corrupt on block bitmap error + +87a39389be3e3b007d341be510a7e4a0542bdf05 +ext4: mark block group as corrupt on inode bitmap error + +bdfb6ff4a255dcebeb09a901250e13a97eff75af +ext4: mark group corrupt on group descriptor checksum + +Also use ext4_warning() instead of ext4_error() so that +filesystem don't become RO in default, and together +with these patches,FS wil still be usable even such +bad things happen. + +Signed-off-by: Wang Shilong +Change-Id: Ib4075aba7df6f7f59e89a90475405080acd43dd0 +Reviewed-on: http://review.whamcloud.com/16312 +Reviewed-by: Andreas Dilger +Reviewed-by: Yang Sheng + +NOTE: Ported to linux 6.7 keeps the ext4_warning() updates. +--- + fs/ext4/balloc.c | 18 +++++++-------- + fs/ext4/ialloc.c | 6 ++--- + fs/ext4/mballoc.c | 59 ++++++++++++++++++----------------------------- + 3 files changed, 34 insertions(+), 49 deletions(-) + +diff --git a/fs/ext4/balloc.c b/fs/ext4/balloc.c +index 591fb3f7..6f19cefd 100644 +--- a/fs/ext4/balloc.c ++++ b/fs/ext4/balloc.c +@@ -420,7 +420,7 @@ static int ext4_validate_block_bitmap(struct super_block *sb, + if (unlikely(!ext4_block_bitmap_csum_verify(sb, desc, bh) || + ext4_simulate_fail(sb, EXT4_SIM_BBITMAP_CRC))) { + ext4_unlock_group(sb, block_group); +- ext4_error(sb, "bg %u: bad block bitmap checksum", block_group); ++ ext4_warning(sb, "bg %u: bad block bitmap checksum", block_group); + ext4_mark_group_bitmap_corrupted(sb, block_group, + EXT4_GROUP_INFO_BBITMAP_CORRUPT); + return -EFSBADCRC; +@@ -428,8 +428,8 @@ static int ext4_validate_block_bitmap(struct super_block *sb, + blk = ext4_valid_block_bitmap(sb, desc, block_group, bh); + if (unlikely(blk != 0)) { + ext4_unlock_group(sb, block_group); +- ext4_error(sb, "bg %u: block %llu: invalid block bitmap", +- block_group, blk); ++ ext4_warning(sb, "bg %u: block %llu: invalid block bitmap", ++ block_group, blk); + ext4_mark_group_bitmap_corrupted(sb, block_group, + EXT4_GROUP_INFO_BBITMAP_CORRUPT); + return -EFSCORRUPTED; +@@ -519,18 +519,16 @@ ext4_read_block_bitmap_nowait(struct super_block *sb, ext4_group_t block_group, + goto out; + } + err = ext4_init_block_bitmap(sb, bh, block_group, desc); +- if (err) { +- ext4_unlock_group(sb, block_group); +- unlock_buffer(bh); +- ext4_error(sb, "Failed to init block bitmap for group " +- "%u: %d", block_group, err); +- goto out; +- } + set_bitmap_uptodate(bh); + set_buffer_uptodate(bh); + set_buffer_verified(bh); + ext4_unlock_group(sb, block_group); + unlock_buffer(bh); ++ if (err) { ++ ext4_warning(sb, "Failed to init block bitmap for group " ++ "%u: %d", block_group, err); ++ goto out; ++ } + return bh; + } + ext4_unlock_group(sb, block_group); +diff --git a/fs/ext4/ialloc.c b/fs/ext4/ialloc.c +index 31480792..c725ade0 100644 +--- a/fs/ext4/ialloc.c ++++ b/fs/ext4/ialloc.c +@@ -102,8 +102,8 @@ static int ext4_validate_inode_bitmap(struct super_block *sb, + EXT4_INODES_PER_GROUP(sb) / 8) || + ext4_simulate_fail(sb, EXT4_SIM_IBITMAP_CRC)) { + ext4_unlock_group(sb, block_group); +- ext4_error(sb, "Corrupt inode bitmap - block_group = %u, " +- "inode_bitmap = %llu", block_group, blk); ++ ext4_warning(sb, "Corrupt inode bitmap - block_group = %u, " ++ "inode_bitmap = %llu", block_group, blk); + ext4_mark_group_bitmap_corrupted(sb, block_group, + EXT4_GROUP_INFO_IBITMAP_CORRUPT); + return -EFSBADCRC; +@@ -353,7 +353,7 @@ out: + if (!fatal) + fatal = err; + } else { +- ext4_error(sb, "bit already cleared for inode %lu", ino); ++ ext4_warning(sb, "bit already cleared for inode %lu", ino); + ext4_mark_group_bitmap_corrupted(sb, block_group, + EXT4_GROUP_INFO_IBITMAP_CORRUPT); + } +diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c +index 21bd12b1..f23658f2 100644 +--- a/fs/ext4/mballoc.c ++++ b/fs/ext4/mballoc.c +@@ -1211,10 +1211,14 @@ int ext4_mb_generate_buddy(struct super_block *sb, + grp->bb_fragments = fragments; + + if (free != grp->bb_free) { +- ext4_grp_locked_error(sb, group, 0, 0, +- "block bitmap and bg descriptor " +- "inconsistent: %u vs %u free clusters", +- free, grp->bb_free); ++ struct ext4_group_desc *gdp; ++ gdp = ext4_get_group_desc(sb, group, NULL); ++ ext4_warning(sb, "group %lu: block bitmap and bg descriptor " ++ "inconsistent: %u vs %u free clusters " ++ "%u in gd, %lu pa's", ++ (long unsigned int)group, free, grp->bb_free, ++ ext4_free_group_clusters(sb, gdp), ++ grp->bb_prealloc_nr); + /* + * If we intend to continue, we consider group descriptor + * corrupt and update bb_free using bitmap value +@@ -1565,7 +1569,7 @@ ext4_mb_load_buddy_gfp(struct super_block *sb, ext4_group_t group, + int block; + int pnum; + int poff; +- struct page *page; ++ struct page *page = NULL; + int ret; + struct ext4_group_info *grp; + struct ext4_sb_info *sbi = EXT4_SB(sb); +@@ -1593,7 +1597,7 @@ ext4_mb_load_buddy_gfp(struct super_block *sb, ext4_group_t group, + */ + ret = ext4_mb_init_group(sb, group, gfp); + if (ret) +- return ret; ++ goto err; + } + + /* +@@ -1704,6 +1708,7 @@ err: + + e4b->bd_buddy = NULL; + e4b->bd_bitmap = NULL; ++ ext4_warning(sb, "Error loading buddy information for %u", group); + return ret; + } + +@@ -5097,9 +5102,11 @@ int ext4_mb_check_ondisk_bitmap(struct super_block *sb, void *bitmap, + } + + if (free != free_in_gdp) { +- ext4_error(sb, "on-disk bitmap for group %d" ++ ext4_warning(sb, "on-disk bitmap for group %d" + "corrupted: %u blocks free in bitmap, %u - in gd\n", + group, free, free_in_gdp); ++ ext4_mark_group_bitmap_corrupted(sb, group, ++ EXT4_GROUP_INFO_BBITMAP_CORRUPT); + return -EIO; + } + return 0; +@@ -5510,16 +5517,8 @@ ext4_mb_release_inode_pa(struct ext4_buddy *e4b, struct buffer_head *bitmap_bh, + /* "free < pa->pa_free" means we maybe double alloc the same blocks, + * otherwise maybe leave some free blocks unavailable, no need to BUG.*/ + if ((free > pa->pa_free && !pa->pa_error) || (free < pa->pa_free)) { +- ext4_error(sb, "pa free mismatch: [pa %p] " +- "[phy %lu] [logic %lu] [len %u] [free %u] " +- "[error %u] [inode %d] [freed %u]", pa, +- (unsigned long)pa->pa_pstart, +- (unsigned long)pa->pa_lstart, +- pa->pa_len, (unsigned)pa->pa_free, +- (unsigned)pa->pa_error, pa->pa_inode->i_ino, +- free); + ext4_grp_locked_error(sb, group, 0, 0, "free %u, pa_free %u", +- free, pa->pa_free); ++ free, pa->pa_free); + /* + * pa is already deleted so we use the value obtained + * from the bitmap and continue. +@@ -5586,16 +5585,11 @@ ext4_mb_discard_group_preallocations(struct super_block *sb, + bitmap_bh = ext4_read_block_bitmap(sb, group); + if (IS_ERR(bitmap_bh)) { + err = PTR_ERR(bitmap_bh); +- ext4_error_err(sb, -err, +- "Error %d reading block bitmap for %u", +- err, group); + goto out_dbg; + } + + err = ext4_mb_load_buddy(sb, group, &e4b); + if (err) { +- ext4_warning(sb, "Error %d loading buddy information for %u", +- err, group); + put_bh(bitmap_bh); + goto out_dbg; + } +@@ -5760,17 +5754,12 @@ repeat: + + err = ext4_mb_load_buddy_gfp(sb, group, &e4b, + GFP_NOFS|__GFP_NOFAIL); +- if (err) { +- ext4_error_err(sb, -err, "Error %d loading buddy information for %u", +- err, group); ++ if (err) + return; +- } + + bitmap_bh = ext4_read_block_bitmap(sb, group); + if (IS_ERR(bitmap_bh)) { + err = PTR_ERR(bitmap_bh); +- ext4_error_err(sb, -err, "Error %d reading block bitmap for %u", +- err, group); + ext4_mb_unload_buddy(&e4b); + continue; + } +@@ -6075,11 +6064,8 @@ ext4_mb_discard_lg_preallocations(struct super_block *sb, + group = ext4_get_group_number(sb, pa->pa_pstart); + err = ext4_mb_load_buddy_gfp(sb, group, &e4b, + GFP_NOFS|__GFP_NOFAIL); +- if (err) { +- ext4_error_err(sb, -err, "Error %d loading buddy information for %u", +- err, group); ++ if (err) + continue; +- } + ext4_lock_group(sb, group); + list_del(&pa->pa_group_list); + ext4_get_group_info(sb, group)->bb_prealloc_nr--; +@@ -6443,7 +6429,7 @@ errout: + * been updated or not when fail case. So can + * not revert pa_free back, just mark pa_error*/ + pa->pa_error++; +- ext4_error(sb, ++ ext4_warning(sb, + "Updating bitmap error: [err %d] " + "[pa %p] [phy %lu] [logic %lu] " + "[len %u] [free %u] [error %u] " +@@ -6454,6 +6440,7 @@ errout: + (unsigned)pa->pa_free, + (unsigned)pa->pa_error, + pa->pa_inode ? pa->pa_inode->i_ino : 0); ++ ext4_mark_group_bitmap_corrupted(sb, 0, 0); + } + } + ext4_mb_release_context(ac); +@@ -6649,7 +6636,7 @@ do_more: + err = ext4_mb_load_buddy_gfp(sb, block_group, &e4b, + GFP_NOFS|__GFP_NOFAIL); + if (err) +- goto error_out; ++ goto error_quiet; + + if (!(flags & EXT4_FREE_BLOCKS_VALIDATED) && + !ext4_inode_block_valid(inode, block, count)) { +@@ -6739,6 +6726,7 @@ error_clean: + ext4_mb_unload_buddy(&e4b); + error_out: + ext4_std_error(sb, err); ++error_quiet: + } + + /** +@@ -6884,7 +6872,7 @@ int ext4_group_add_blocks(handle_t *handle, struct super_block *sb, + + err = ext4_mb_load_buddy(sb, block_group, &e4b); + if (err) +- goto error_out; ++ goto error_quiet; + + if (!ext4_sb_block_valid(sb, NULL, block, count)) { + ext4_error(sb, "Adding blocks in system zones - " +@@ -6913,6 +6901,7 @@ error_clean: + ext4_mb_unload_buddy(&e4b); + error_out: + ext4_std_error(sb, err); ++error_quiet: + return err; + } + +@@ -7048,8 +7037,6 @@ ext4_trim_all_free(struct super_block *sb, ext4_group_t group, + + ret = ext4_mb_load_buddy(sb, group, &e4b); + if (ret) { +- ext4_warning(sb, "Error %d loading buddy information for %u", +- ret, group); + return ret; + } + +-- +2.34.1 + diff --git a/ldiskfs/kernel_patches/patches/linux-6.7/ext4-ialloc-uid-gid-and-pass-owner-down.patch b/ldiskfs/kernel_patches/patches/linux-6.7/ext4-ialloc-uid-gid-and-pass-owner-down.patch new file mode 100644 index 0000000..7b87089 --- /dev/null +++ b/ldiskfs/kernel_patches/patches/linux-6.7/ext4-ialloc-uid-gid-and-pass-owner-down.patch @@ -0,0 +1,145 @@ +commit 5bb641fa61175fd0fe63e830219d88304b5162c3 +Author: Shaun Tancheff +AuthorDate: Thu Dec 10 10:31:51 2020 -0600 +LU-13239 ldiskfs: pass inode timestamps at initial creation + +A previous patch https://github.com/Cray/lustre/commit/6d4fb6694 +"LUS-4880 osd-ldiskfs: pass uid/gid/xtime directly to ldiskfs" +was intended to be ported to upstream lustre but was lost. + +The patch https://review.whamcloud.com/34685/ +"LU-12151 osd-ldiskfs: pass owner down rather than transfer it" +passed the inode UID and GID down to ldiskfs at inode allocation +time to avoid the overhead of transferring quota from the inode +(initially created as root) over to the actual user of the file. + +The two patches differed slightly in that the LUS-4880 included +passing the a/m/ctimes from osd-ldiskfs to ldiskfs at inode +creation time avoids overhead of setting the timestamps afterward. + +Benchmarks using MDTEST: + mdtest -f 32 -l 32 -n 16384 -i 5 -p 120 -t -u -v -d mdtest + + master patched + Operation Mean Std Dev Mean Std Dev + --------- ---- ------- ---- ------- + Directory creation: 17008.593 72.700 17099.863 155.461 + Directory stat : 170513.269 1456.002 170105.207 2349.934 + Directory removal : 80796.147 2633.832 84480.222 892.536 + File creation : 39227.419 7014.539 40429.900 6643.868 + File stat : 101761.395 2979.802 103818.800 1146.689 + File read : 86583.370 871.982 85725.254 965.862 + File removal : 74923.504 761.048 75075.180 723.966 + Tree creation : 588.570 244.534 608.332 123.939 + Tree removal : 39.874 1.873 44.357 2.350 + +This patch also reorganizes the ldiskfs patch series in +order to accommodate struct iattr being added to +ldiskfs_create_inode. +All supported server platforms RHEL 7.5+, SUSE 12+ and +ubuntu 18+ are affected. + +HPE-bug-id: LUS-7378, LUS-4880, LUS-8042, LUS-9157, LUS-8772, LUS-8769 +Signed-off-by: Shaun Tancheff +Change-Id: I87e9c792b5240820bfd3a7268e477970ebac8465 +Reviewed-on: https://review.whamcloud.com/37556 +Reviewed-by: Petros Koutoupis +Reviewed-by: Jian Yu +Reviewed-by: Wang Shilong +--- + fs/ext4/ext4.h | 8 ++++---- + fs/ext4/ialloc.c | 11 ++++++++++- + fs/ext4/namei.c | 13 +++++++++++-- + 3 files changed, 25 insertions(+), 7 deletions(-) + +diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h +index ad4e70a5..abb98f4c 100644 +--- a/fs/ext4/ext4.h ++++ b/fs/ext4/ext4.h +@@ -3029,15 +3029,15 @@ extern struct inode *__ext4_new_inode(struct mnt_idmap *, handle_t *, + const struct qstr *qstr, __u32 goal, + uid_t *owner, __u32 i_flags, + int handle_type, unsigned int line_no, +- int nblocks); ++ int nblocks, struct iattr *iattr); + + #define ext4_new_inode(handle, dir, mode, qstr, goal, owner, i_flags) \ + __ext4_new_inode(&nop_mnt_idmap, (handle), (dir), (mode), (qstr), \ +- (goal), (owner), i_flags, 0, 0, 0) ++ (goal), (owner), i_flags, 0, 0, 0, NULL) + #define ext4_new_inode_start_handle(idmap, dir, mode, qstr, goal, owner, \ + type, nblocks) \ + __ext4_new_inode((idmap), NULL, (dir), (mode), (qstr), (goal), (owner), \ +- 0, (type), __LINE__, (nblocks)) ++ 0, (type), __LINE__, (nblocks), NULL) + + + extern void ext4_free_inode(handle_t *, struct inode *); +@@ -3231,7 +3231,7 @@ extern int ext4_htree_fill_tree(struct file *dir_file, __u32 start_hash, + __u32 start_minor_hash, __u32 *next_hash); + extern struct inode *ext4_create_inode(handle_t *handle, + struct inode *dir, int mode, +- uid_t *owner); ++ struct iattr *iattr); + extern int ext4_delete_entry(handle_t *handle, struct inode * dir, + struct ext4_dir_entry_2 *de_del, + struct buffer_head *bh); +diff --git a/fs/ext4/ialloc.c b/fs/ext4/ialloc.c +index c725ade0..fc1f09fe 100644 +--- a/fs/ext4/ialloc.c ++++ b/fs/ext4/ialloc.c +@@ -926,7 +926,7 @@ struct inode *__ext4_new_inode(struct mnt_idmap *idmap, + umode_t mode, const struct qstr *qstr, + __u32 goal, uid_t *owner, __u32 i_flags, + int handle_type, unsigned int line_no, +- int nblocks) ++ int nblocks, struct iattr *iattr) + { + struct super_block *sb; + struct buffer_head *inode_bitmap_bh = NULL; +@@ -1309,6 +1309,15 @@ got: + if (err) + goto fail_drop; + ++ if (iattr) { ++ if (iattr->ia_valid & ATTR_CTIME) ++ inode_set_ctime_to_ts(inode, iattr->ia_ctime); ++ if (iattr->ia_valid & ATTR_MTIME) ++ inode_set_mtime_to_ts(inode, iattr->ia_mtime); ++ if (iattr->ia_valid & ATTR_ATIME) ++ inode_set_atime_to_ts(inode, iattr->ia_atime); ++ } ++ + /* + * Since the encryption xattr will always be unique, create it first so + * that it's less likely to end up in an external xattr block and +diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c +index 6d2c0b6d..273d7e9f 100644 +--- a/fs/ext4/namei.c ++++ b/fs/ext4/namei.c +@@ -3435,11 +3435,20 @@ static int ext4_add_nondir(handle_t *handle, + /* Return locked inode, then the caller can modify the inode's states/flags + * before others finding it. The caller should unlock the inode by itself. */ + struct inode *ext4_create_inode(handle_t *handle, struct inode *dir, int mode, +- uid_t *owner) ++ struct iattr *iattr) + { + struct inode *inode; ++ uid_t owner[2] = {0, 0}; + +- inode = ext4_new_inode(handle, dir, mode, NULL, 0, owner, 0); ++ if (iattr) { ++ if (iattr->ia_valid & ATTR_UID) ++ owner[0] = from_kuid(&init_user_ns, iattr->ia_uid); ++ if (iattr->ia_valid & ATTR_GID) ++ owner[1] = from_kgid(&init_user_ns, iattr->ia_gid); ++ } ++ ++ inode = __ext4_new_inode(&nop_mnt_idmap, handle, dir, mode, NULL, 0, owner, 0, ++ 0, 0, 0, iattr); + if (!IS_ERR(inode)) { + if (S_ISCHR(mode) || S_ISBLK(mode) || S_ISFIFO(mode)) { + #ifdef CONFIG_LDISKFS_FS_XATTR +-- +2.34.1 + diff --git a/ldiskfs/kernel_patches/series/ldiskfs-6.7-ml.series b/ldiskfs/kernel_patches/series/ldiskfs-6.7-ml.series new file mode 100644 index 0000000..8e99c44 --- /dev/null +++ b/ldiskfs/kernel_patches/series/ldiskfs-6.7-ml.series @@ -0,0 +1,37 @@ +linux-5.16/ext4-inode-version.patch +linux-5.18/ext4-lookup-dotdot.patch +linux-5.14/ext4-print-inum-in-htree-warning.patch +linux-6.5/ext4-prealloc.patch +linux-5.16/ext4-osd-iop-common.patch +linux-5.16/ext4-misc.patch +linux-6.6/ext4-mballoc-extra-checks.patch +sles15sp4/ext4-hash-indexed-dir-dotdot-update.patch +linux-5.14/ext4-kill-dx-root.patch +linux-6.5/ext4-mballoc-pa-free-mismatch.patch +linux-6.5/ext4-data-in-dirent.patch +linux-6.6/ext4-nocmtime.patch +base/ext4-htree-lock.patch +linux-6.5/ext4-pdirop.patch +rhel9/ext4-max-dir-size.patch +linux-6.7/ext4-corrupted-inode-block-bitmaps-handling-patches.patch +rhel9/ext4-give-warning-with-dir-htree-growing.patch +ubuntu18/ext4-jcb-optimization.patch +linux-6.2/ext4-attach-jinode-in-writepages.patch +linux-6.5/ext4-dont-check-before-replay.patch +rhel7.6/ext4-use-GFP_NOFS-in-ext4_inode_attach_jinode.patch +rhel7.6/ext4-export-orphan-add.patch +linux-5.18/ext4-export-mb-stream-allocator-variables.patch +ubuntu19/ext4-iget-with-flags.patch +linux-5.14/export-ext4fs-dirhash-helper.patch +linux-5.8/ext4-no-max-dir-size-limit-for-iam-objects.patch +rhel9/ext4-dquot-commit-speedup.patch +linux-6.7/ext4-ialloc-uid-gid-and-pass-owner-down.patch +linux-5.14/ext4-projid-xattrs.patch +linux-6.6/ext4-delayed-iput.patch +rhel8/ext4-ext-merge.patch +linux-5.14/ext4-xattr-disable-credits-check.patch +rhel9.2/ext4-fiemap-kernel-data.patch +rhel8/ext4-old_ea_inodes_handling_fix.patch +ubuntu20.04.5/ext4-filename-encode.patch +rhel9.1/ext4-enc-flag.patch +linux-6.6/ext4-encdata.patch diff --git a/lustre/osd-ldiskfs/osd_internal.h b/lustre/osd-ldiskfs/osd_internal.h index f082421..b4737e2 100644 --- a/lustre/osd-ldiskfs/osd_internal.h +++ b/lustre/osd-ldiskfs/osd_internal.h @@ -501,7 +501,7 @@ struct osd_it_ea_dirent { __u64 oied_off; unsigned short oied_namelen; unsigned int oied_type; - char oied_name[0]; + char oied_name[]; } __attribute__((packed)); /** -- 1.8.3.1