From b4c0ba496cd396f7082104b869fd4ac45bec1480 Mon Sep 17 00:00:00 2001 From: Sebastien Buisson 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. Lustre-change: https://review.whamcloud.com/43672 Lustre-commit: c352b89dc981e5ebe73c8bd2d9e0949094c828b2 Fixes: f3d03bc38a ("LU-14430 mdd: fix inheritance of big default ACLs") Signed-off-by: Mikhail Pershin Change-Id: I4f4692b5556eaa98e2e23d7b58c925e33401e4e5 Reviewed-by: Sebastien Buisson Reviewed-by: Andreas Dilger Reviewed-by: Li Xi Reviewed-on: https://review.whamcloud.com/43731 Tested-by: jenkins Tested-by: Maloo --- 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 cd03553..b371f12 100644 --- a/lustre/mdd/mdd_device.c +++ b/lustre/mdd/mdd_device.c @@ -723,7 +723,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; @@ -1972,6 +1972,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 2088089..b709f94 100644 --- a/lustre/mdd/mdd_dir.c +++ b/lustre/mdd/mdd_dir.c @@ -762,7 +762,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; @@ -1010,7 +1010,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; @@ -2615,9 +2615,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 f54b401..382db50 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 36b83f7..57509a9 100644 --- a/lustre/mdd/mdd_object.c +++ b/lustre/mdd/mdd_object.c @@ -912,7 +912,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 ddb8b49..c0ff280 100755 --- a/lustre/tests/sanity.sh +++ b/lustre/tests/sanity.sh @@ -10586,6 +10586,25 @@ test_103e() { } run_test 103e "inheritance of big amount of default ACLs" +test_103f() { + (( $MDS1_VERSION >= $(version_code 2.16.6) )) || + skip "MDS needs to be at least 2.16.6" + + 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