From 48aac6f1d9c2dd05328023c39d0dc95be92aa0fe Mon Sep 17 00:00:00 2001 From: Mikhail Pershin Date: Wed, 12 May 2021 09:55:29 +0300 Subject: [PATCH] LU-14430 mdd: use own buffer for changelog Use own persistent buffer for changelog needs to don't interfere with generic big_buf in MDD thread info which can be in use. Fixes: f3d03bc38a ("LU-14430 mdd: fix inheritance of big default ACLs") Signed-off-by: Mikhail Pershin Change-Id: I4f4692b5556eaa98e2e23d7b58c925e33401e4e5 Reviewed-on: https://review.whamcloud.com/43672 Tested-by: jenkins Reviewed-by: Andreas Dilger Tested-by: Maloo Reviewed-by: Sebastien Buisson Reviewed-by: Oleg Drokin --- lustre/mdd/mdd_device.c | 3 ++- lustre/mdd/mdd_dir.c | 8 +++----- lustre/mdd/mdd_internal.h | 4 +++- lustre/mdd/mdd_object.c | 2 +- lustre/tests/sanity.sh | 19 +++++++++++++++++++ 5 files changed, 28 insertions(+), 8 deletions(-) diff --git a/lustre/mdd/mdd_device.c b/lustre/mdd/mdd_device.c index 9323424..a83d770 100644 --- a/lustre/mdd/mdd_device.c +++ b/lustre/mdd/mdd_device.c @@ -725,7 +725,7 @@ int mdd_changelog_write_header(const struct lu_env *env, } reclen = llog_data_len(sizeof(*rec) + len); - buf = lu_buf_check_and_alloc(&mdd_env_info(env)->mti_big_buf, reclen); + buf = lu_buf_check_and_alloc(&mdd_env_info(env)->mti_chlg_buf, reclen); if (buf->lb_buf == NULL) RETURN(-ENOMEM); rec = buf->lb_buf; @@ -1978,6 +1978,7 @@ static void mdd_key_fini(const struct lu_context *ctx, lu_buf_free(&info->mti_big_buf); lu_buf_free(&info->mti_link_buf); lu_buf_free(&info->mti_xattr_buf); + lu_buf_free(&info->mti_chlg_buf); OBD_FREE_PTR(info); } diff --git a/lustre/mdd/mdd_dir.c b/lustre/mdd/mdd_dir.c index 537bff8..90b026b 100644 --- a/lustre/mdd/mdd_dir.c +++ b/lustre/mdd/mdd_dir.c @@ -761,7 +761,7 @@ int mdd_declare_changelog_store(const struct lu_env *env, return 0; reclen = mdd_llog_record_calc_size(env, tname, sname); - buf = lu_buf_check_and_alloc(&mdd_env_info(env)->mti_big_buf, reclen); + buf = lu_buf_check_and_alloc(&mdd_env_info(env)->mti_chlg_buf, reclen); if (buf->lb_buf == NULL) return -ENOMEM; @@ -1009,7 +1009,7 @@ int mdd_changelog_ns_store(const struct lu_env *env, LASSERT(handle != NULL); reclen = mdd_llog_record_calc_size(env, tname, sname); - buf = lu_buf_check_and_alloc(&mdd_env_info(env)->mti_big_buf, reclen); + buf = lu_buf_check_and_alloc(&mdd_env_info(env)->mti_chlg_buf, reclen); if (buf->lb_buf == NULL) RETURN(-ENOMEM); rec = buf->lb_buf; @@ -2619,9 +2619,7 @@ use_bigger_buffer: acl_buf = *lu_buf_check_and_alloc(&info->mti_xattr_buf, acl_size); if (!acl_buf.lb_buf) GOTO(out_stop, rc = -ENOMEM); - /* mti_big_buf is also used down below in mdd_changelog_ns_store(), - * but def_acl_buf is finished with it before then - */ + def_acl_buf = *lu_buf_check_and_alloc(&info->mti_big_buf, acl_size); if (!def_acl_buf.lb_buf) GOTO(out_stop, rc = -ENOMEM); diff --git a/lustre/mdd/mdd_internal.h b/lustre/mdd/mdd_internal.h index f15e4c8..dc0af8f 100644 --- a/lustre/mdd/mdd_internal.h +++ b/lustre/mdd/mdd_internal.h @@ -199,7 +199,9 @@ struct mdd_thread_info { int mti_flags; char mti_name[NAME_MAX + 1]; struct lu_buf mti_buf[4]; - struct lu_buf mti_big_buf; /* biggish persistent buf */ + /* persistent buffers, must be handled with lu_buf_alloc/free */ + struct lu_buf mti_big_buf; + struct lu_buf mti_chlg_buf; struct lu_buf mti_link_buf; /* buf for link ea */ struct lu_buf mti_xattr_buf; struct obdo mti_oa; diff --git a/lustre/mdd/mdd_object.c b/lustre/mdd/mdd_object.c index 1553946..2cfde40 100644 --- a/lustre/mdd/mdd_object.c +++ b/lustre/mdd/mdd_object.c @@ -911,7 +911,7 @@ static int mdd_changelog_data_store_by_fid(const struct lu_env *env, reclen = llog_data_len(LLOG_CHANGELOG_HDR_SZ + changelog_rec_offset(clf_flags & CLF_SUPPORTED, xflags & CLFE_SUPPORTED)); - buf = lu_buf_check_and_alloc(&mdd_env_info(env)->mti_big_buf, reclen); + buf = lu_buf_check_and_alloc(&mdd_env_info(env)->mti_chlg_buf, reclen); if (buf->lb_buf == NULL) RETURN(-ENOMEM); rec = buf->lb_buf; diff --git a/lustre/tests/sanity.sh b/lustre/tests/sanity.sh index dc731af..4e9d58f 100755 --- a/lustre/tests/sanity.sh +++ b/lustre/tests/sanity.sh @@ -10895,6 +10895,25 @@ test_103e() { } run_test 103e "inheritance of big amount of default ACLs" +test_103f() { + (( $MDS1_VERSION >= $(version_code 2.14.51) )) || + skip "MDS needs to be at least 2.14.51" + + large_xattr_enabled || skip_env "ea_inode feature disabled" + + # enable changelog to consume more internal MDD buffers + changelog_register + + mkdir -p $DIR/$tdir + # add big LOV EA + $LFS setstripe -C 1000 $DIR/$tdir + setfacl -d -m user:$U:rwx $DIR/$tdir || error "Cannot add default ACLs" + mkdir $DIR/$tdir/inherited || error "failed to create subdirectory" + rmdir $DIR/$tdir/inherited || error "Cannot remove subdirectory" + rmdir $DIR/$tdir || error "Cannot remove directory" +} +run_test 103f "changelog doesn't interfere with default ACLs buffers" + test_104a() { [ $PARALLEL == "yes" ] && skip "skip parallel run" -- 1.8.3.1