From d71a24005b7533bbe76cb605a09ae8c80941c351 Mon Sep 17 00:00:00 2001 From: Lai Siyao Date: Mon, 25 Sep 2023 10:28:51 -0400 Subject: [PATCH] LU-17144 mdt: set dmv by setxattr Client side: convert setxattr("trusted.dmv") to "setdirstripe -D", as will help restore directory default LMV from backup. Server side: add a tunable to enable setxattr("trusted.dmv"), it can be turned on by "lctl set_param -n mdt.*.enable_dmv_xattr=1". It's off by default. Since empty buffer can be set by setxattr, add check in server code to avoid crash. Add sanity 413j. Test-Parameter: serverversion=2.14 mdtcount=4 testlist=sanity env=ONLY=413j Signed-off-by: Lai Siyao Change-Id: I27d784998a9c4a182b4fffb8b06c84e9d9190919 Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/52510 Tested-by: jenkins Tested-by: Maloo Reviewed-by: Hongchao Zhang Reviewed-by: Oleg Drokin Reviewed-by: Andreas Dilger --- lustre/llite/xattr.c | 31 +++ lustre/lod/lod_object.c | 5 +- lustre/mdt/mdt_handler.c | 9 +- lustre/mdt/mdt_internal.h | 15 +- lustre/mdt/mdt_io.c | 2 +- lustre/mdt/mdt_lproc.c | 540 ++++------------------------------------------ lustre/mdt/mdt_reint.c | 2 +- lustre/mdt/mdt_xattr.c | 4 +- lustre/tests/sanity.sh | 38 ++++ 9 files changed, 133 insertions(+), 513 deletions(-) diff --git a/lustre/llite/xattr.c b/lustre/llite/xattr.c index 7ef091f..6333d04 100644 --- a/lustre/llite/xattr.c +++ b/lustre/llite/xattr.c @@ -164,6 +164,37 @@ static int ll_xattr_set_common(const struct xattr_handler *handler, if (handler->flags == XATTR_SECURITY_T && strcmp(name, "c") == 0) GOTO(out, rc = -EPERM); + if (handler->flags == XATTR_TRUSTED_T && !strcmp(name, "dmv") && + (valid & OBD_MD_FLXATTR)) { + const struct lmv_user_md *clum; + struct lmv_user_md *lum; + + if (!value) + GOTO(out, rc = -EINVAL); + + clum = (const struct lmv_user_md *)value; + if (size != sizeof(*clum)) + GOTO(out, rc = -EINVAL); + + if (clum->lum_magic != LMV_USER_MAGIC) + GOTO(out, rc = -EINVAL); + + /* skip default dmv */ + if (clum->lum_stripe_offset == LMV_OFFSET_DEFAULT && + clum->lum_stripe_count == 1 && + clum->lum_hash_type == LMV_HASH_TYPE_UNKNOWN) + GOTO(out, rc = 0); + + OBD_ALLOC_PTR(lum); + if (!lum) + GOTO(out, rc = -ENOMEM); + + *lum = *clum; + rc = ll_dir_setstripe(inode, (struct lov_user_md *)lum, 1); + OBD_FREE_PTR(lum); + GOTO(out, rc); + } + fullname = kasprintf(GFP_KERNEL, "%s%s", xattr_prefix(handler), name); if (!fullname) GOTO(out, rc = -ENOMEM); diff --git a/lustre/lod/lod_object.c b/lustre/lod/lod_object.c index 19cdd6c..3ce2118 100644 --- a/lustre/lod/lod_object.c +++ b/lustre/lod/lod_object.c @@ -2520,7 +2520,10 @@ static int lod_dir_declare_xattr_set(const struct lu_env *env, if (strcmp(name, XATTR_NAME_DEFAULT_LMV) == 0) { struct lmv_user_md_v1 *lum; - LASSERT(buf != NULL && buf->lb_buf != NULL); + LASSERT(buf != NULL); + if (!buf->lb_buf || buf->lb_len < sizeof(*lum)) + RETURN(-EFAULT); + lum = buf->lb_buf; rc = lod_verify_md_striping(d, lum); if (rc != 0) diff --git a/lustre/mdt/mdt_handler.c b/lustre/mdt/mdt_handler.c index 03adf09..1feb91a 100644 --- a/lustre/mdt/mdt_handler.c +++ b/lustre/mdt/mdt_handler.c @@ -921,8 +921,7 @@ void mdt_pack_attr2body(struct mdt_thread_info *info, struct mdt_body *b, else b->mbo_blocks = 1; b->mbo_valid |= OBD_MD_FLSIZE | OBD_MD_FLBLOCKS; - } else if (info->mti_som_strict && - mdt->mdt_opts.mo_enable_strict_som) { + } else if (info->mti_som_strict && mdt->mdt_enable_strict_som) { /* use SOM for size*/ b->mbo_valid |= OBD_MD_FLSIZE | OBD_MD_FLBLOCKS; } else if (ma->ma_valid & MA_SOM) { /* lsom is valid */ @@ -6169,7 +6168,7 @@ static int mdt_init0(const struct lu_env *env, struct mdt_device *m, LASSERT(obd != NULL); m->mdt_max_mdsize = MAX_MD_SIZE_OLD; - m->mdt_opts.mo_evict_tgt_nids = 1; + m->mdt_evict_tgt_nids = 1; m->mdt_opts.mo_cos = MDT_COS_DEFAULT; lmi = server_get_mount(dev); @@ -6196,7 +6195,7 @@ static int mdt_init0(const struct lu_env *env, struct mdt_device *m, * lock granted, it may get blocked for a long time. */ m->mdt_opts.mo_dom_lock = TRYLOCK_DOM_ON_OPEN; /* DoM files are read at open and data is packed in the reply */ - m->mdt_opts.mo_dom_read_open = 1; + m->mdt_dom_read_open = 1; m->mdt_squash.rsi_uid = 0; m->mdt_squash.rsi_gid = 0; @@ -6340,7 +6339,7 @@ static int mdt_init0(const struct lu_env *env, struct mdt_device *m, else m->mdt_opts.mo_acl = 0; - m->mdt_opts.mo_enable_strict_som = 1; + m->mdt_enable_strict_som = 1; /* XXX: to support suppgid for ACL, we enable identity_upcall * by default, otherwise, maybe got unexpected -EACCESS. */ diff --git a/lustre/mdt/mdt_internal.h b/lustre/mdt/mdt_internal.h index 15ff9f9..82feadc 100644 --- a/lustre/mdt/mdt_internal.h +++ b/lustre/mdt/mdt_internal.h @@ -270,11 +270,7 @@ struct mdt_device { struct { unsigned int mo_user_xattr:1, mo_acl:1, - mo_cos:1, - mo_evict_tgt_nids:1, - mo_dom_read_open:1, - mo_migrate_hsm_allowed:1, - mo_enable_strict_som:1; + mo_cos:1; unsigned int mo_dom_lock; } mdt_opts; /* mdt state flags */ @@ -297,7 +293,10 @@ struct mdt_device { struct upcall_cache *mdt_identity_cache; - unsigned int mdt_capa_conf:1, + unsigned int mdt_evict_tgt_nids:1, + mdt_dom_read_open:1, + mdt_migrate_hsm_allowed:1, + mdt_enable_strict_som:1, /* Enable remote dir on non-MDT0 */ mdt_enable_dir_migration:1, mdt_enable_dir_restripe:1, @@ -315,7 +314,9 @@ struct mdt_device { * old client joins, disable this to handle * inherited default LMV on server. */ - mdt_enable_dmv_implicit_inherit:1; + mdt_enable_dmv_implicit_inherit:1, + /* set dmv by setxattr, off by default */ + mdt_enable_dmv_xattr:1; /* user with gid can create remote/striped * dir, and set default dir stripe */ diff --git a/lustre/mdt/mdt_io.c b/lustre/mdt/mdt_io.c index dedb58e..2d22a27 100644 --- a/lustre/mdt/mdt_io.c +++ b/lustre/mdt/mdt_io.c @@ -1744,7 +1744,7 @@ int mdt_dom_read_on_open(struct mdt_thread_info *mti, struct mdt_device *mdt, } /* return data along with open only along with DoM lock */ - if (!dom_lock || !mdt->mdt_opts.mo_dom_read_open) + if (!dom_lock || !mdt->mdt_dom_read_open) RETURN(0); /* if DoM object holds encrypted content, we need to make sure we diff --git a/lustre/mdt/mdt_lproc.c b/lustre/mdt/mdt_lproc.c index 24bc276..9b13a3b 100644 --- a/lustre/mdt/mdt_lproc.c +++ b/lustre/mdt/mdt_lproc.c @@ -448,7 +448,7 @@ lprocfs_mds_evict_client_seq_write(struct file *file, const char __user *buf, goto out; } - if (mdt->mdt_opts.mo_evict_tgt_nids) { + if (mdt->mdt_evict_tgt_nids) { rc = obd_set_info_async(NULL, mdt->mdt_child_exp, sizeof(KEY_EVICT_BY_NID), KEY_EVICT_BY_NID, @@ -473,36 +473,6 @@ out: #undef BUFLEN -static ssize_t evict_tgt_nids_show(struct kobject *kobj, - struct attribute *attr, char *buf) -{ - struct obd_device *obd = container_of(kobj, struct obd_device, - obd_kset.kobj); - struct mdt_device *mdt = mdt_dev(obd->obd_lu_dev); - - return scnprintf(buf, PAGE_SIZE, "%u\n", - mdt->mdt_opts.mo_evict_tgt_nids); -} - -static ssize_t evict_tgt_nids_store(struct kobject *kobj, - struct attribute *attr, const char *buffer, - size_t count) -{ - struct obd_device *obd = container_of(kobj, struct obd_device, - obd_kset.kobj); - struct mdt_device *mdt = mdt_dev(obd->obd_lu_dev); - bool val; - int rc; - - rc = kstrtobool(buffer, &val); - if (rc) - return rc; - - mdt->mdt_opts.mo_evict_tgt_nids = val; - return count; -} -LUSTRE_RW_ATTR(evict_tgt_nids); - static ssize_t commit_on_sharing_show(struct kobject *kobj, struct attribute *attr, char *buf) { @@ -619,35 +589,6 @@ mdt_nosquash_nids_seq_write(struct file *file, const char __user *buffer, } LPROC_SEQ_FOPS(mdt_nosquash_nids); -static ssize_t enable_remote_dir_show(struct kobject *kobj, - struct attribute *attr, char *buf) -{ - struct obd_device *obd = container_of(kobj, struct obd_device, - obd_kset.kobj); - struct mdt_device *mdt = mdt_dev(obd->obd_lu_dev); - - return scnprintf(buf, PAGE_SIZE, "%u\n", mdt->mdt_enable_remote_dir); -} - -static ssize_t enable_remote_dir_store(struct kobject *kobj, - struct attribute *attr, - const char *buffer, size_t count) -{ - struct obd_device *obd = container_of(kobj, struct obd_device, - obd_kset.kobj); - struct mdt_device *mdt = mdt_dev(obd->obd_lu_dev); - bool val; - int rc; - - rc = kstrtobool(buffer, &val); - if (rc) - return rc; - - mdt->mdt_enable_remote_dir = val; - return count; -} -LUSTRE_RW_ATTR(enable_remote_dir); - static ssize_t enable_remote_dir_gid_show(struct kobject *kobj, struct attribute *attr, char *buf) { @@ -708,188 +649,47 @@ static ssize_t enable_chprojid_gid_store(struct kobject *kobj, } LUSTRE_RW_ATTR(enable_chprojid_gid); -static ssize_t enable_parallel_rename_dir_show(struct kobject *kobj, - struct attribute *attr, - char *buf) -{ - struct obd_device *obd = container_of(kobj, struct obd_device, - obd_kset.kobj); - struct mdt_device *mdt = mdt_dev(obd->obd_lu_dev); - - return scnprintf(buf, PAGE_SIZE, "%u\n", - mdt->mdt_enable_parallel_rename_dir); -} - -static ssize_t enable_parallel_rename_dir_store(struct kobject *kobj, - struct attribute *attr, - const char *buffer, - size_t count) -{ - struct obd_device *obd = container_of(kobj, struct obd_device, - obd_kset.kobj); - struct mdt_device *mdt = mdt_dev(obd->obd_lu_dev); - bool val; - int rc; - - rc = kstrtobool(buffer, &val); - if (rc) - return rc; - - mdt->mdt_enable_parallel_rename_dir = val; - - return count; -} -LUSTRE_RW_ATTR(enable_parallel_rename_dir); - -static ssize_t enable_parallel_rename_file_show(struct kobject *kobj, - struct attribute *attr, - char *buf) -{ - struct obd_device *obd = container_of(kobj, struct obd_device, - obd_kset.kobj); - struct mdt_device *mdt = mdt_dev(obd->obd_lu_dev); - - return scnprintf(buf, PAGE_SIZE, "%u\n", - mdt->mdt_enable_parallel_rename_file); -} - -static ssize_t enable_parallel_rename_file_store(struct kobject *kobj, - struct attribute *attr, - const char *buffer, - size_t count) -{ - struct obd_device *obd = container_of(kobj, struct obd_device, - obd_kset.kobj); - struct mdt_device *mdt = mdt_dev(obd->obd_lu_dev); - bool val; - int rc; - - rc = kstrtobool(buffer, &val); - if (rc) - return rc; - - mdt->mdt_enable_parallel_rename_file = val; - - return count; -} -LUSTRE_RW_ATTR(enable_parallel_rename_file); - -static ssize_t enable_striped_dir_show(struct kobject *kobj, - struct attribute *attr, char *buf) -{ - struct obd_device *obd = container_of(kobj, struct obd_device, - obd_kset.kobj); - struct mdt_device *mdt = mdt_dev(obd->obd_lu_dev); - - return scnprintf(buf, PAGE_SIZE, "%u\n", mdt->mdt_enable_striped_dir); -} - -static ssize_t enable_striped_dir_store(struct kobject *kobj, - struct attribute *attr, - const char *buffer, size_t count) -{ - struct obd_device *obd = container_of(kobj, struct obd_device, - obd_kset.kobj); - struct mdt_device *mdt = mdt_dev(obd->obd_lu_dev); - bool val; - int rc; - - rc = kstrtobool(buffer, &val); - if (rc) - return rc; - - mdt->mdt_enable_striped_dir = val; - return count; -} -LUSTRE_RW_ATTR(enable_striped_dir); - -static ssize_t enable_dir_migration_show(struct kobject *kobj, - struct attribute *attr, char *buf) -{ - struct obd_device *obd = container_of(kobj, struct obd_device, - obd_kset.kobj); - struct mdt_device *mdt = mdt_dev(obd->obd_lu_dev); - - return scnprintf(buf, PAGE_SIZE, "%u\n", mdt->mdt_enable_dir_migration); -} - -static ssize_t enable_dir_migration_store(struct kobject *kobj, - struct attribute *attr, - const char *buffer, size_t count) -{ - struct obd_device *obd = container_of(kobj, struct obd_device, - obd_kset.kobj); - struct mdt_device *mdt = mdt_dev(obd->obd_lu_dev); - bool val; - int rc; - - rc = kstrtobool(buffer, &val); - if (rc) - return rc; - - mdt->mdt_enable_dir_migration = val; - return count; -} -LUSTRE_RW_ATTR(enable_dir_migration); - -static ssize_t enable_dir_restripe_show(struct kobject *kobj, - struct attribute *attr, char *buf) -{ - struct obd_device *obd = container_of(kobj, struct obd_device, - obd_kset.kobj); - struct mdt_device *mdt = mdt_dev(obd->obd_lu_dev); - - return scnprintf(buf, PAGE_SIZE, "%u\n", mdt->mdt_enable_dir_restripe); -} - -static ssize_t enable_dir_restripe_store(struct kobject *kobj, - struct attribute *attr, - const char *buffer, size_t count) -{ - struct obd_device *obd = container_of(kobj, struct obd_device, - obd_kset.kobj); - struct mdt_device *mdt = mdt_dev(obd->obd_lu_dev); - bool val; - int rc; - - rc = kstrtobool(buffer, &val); - if (rc) - return rc; - - mdt->mdt_enable_dir_restripe = val; - return count; -} -LUSTRE_RW_ATTR(enable_dir_restripe); - -static ssize_t enable_dir_auto_split_show(struct kobject *kobj, - struct attribute *attr, char *buf) -{ - struct obd_device *obd = container_of(kobj, struct obd_device, - obd_kset.kobj); - struct mdt_device *mdt = mdt_dev(obd->obd_lu_dev); - - return scnprintf(buf, PAGE_SIZE, "%u\n", - mdt->mdt_enable_dir_auto_split); -} - -static ssize_t enable_dir_auto_split_store(struct kobject *kobj, - struct attribute *attr, - const char *buffer, size_t count) -{ - struct obd_device *obd = container_of(kobj, struct obd_device, - obd_kset.kobj); - struct mdt_device *mdt = mdt_dev(obd->obd_lu_dev); - bool val; - int rc; - - rc = kstrtobool(buffer, &val); - if (rc) - return rc; - - mdt->mdt_enable_dir_auto_split = val; - return count; -} -LUSTRE_RW_ATTR(enable_dir_auto_split); +#define MDT_BOOL_RW_ATTR(name) \ +static ssize_t name##_show(struct kobject *kobj, struct attribute *attr,\ + char *buf) \ +{ \ + struct obd_device *obd = container_of(kobj, struct obd_device, \ + obd_kset.kobj); \ + struct mdt_device *mdt = mdt_dev(obd->obd_lu_dev); \ + return scnprintf(buf, PAGE_SIZE, "%u\n", mdt->mdt_##name); \ +} \ +static ssize_t name##_store(struct kobject *kobj, struct attribute *attr,\ + const char *buffer, size_t count) \ +{ \ + struct obd_device *obd = container_of(kobj, struct obd_device, \ + obd_kset.kobj); \ + struct mdt_device *mdt = mdt_dev(obd->obd_lu_dev); \ + bool val; \ + int rc; \ + rc = kstrtobool(buffer, &val); \ + if (rc) \ + return rc; \ + mdt->mdt_##name = val; \ + return count; \ +} \ +LUSTRE_RW_ATTR(name) + +MDT_BOOL_RW_ATTR(readonly); +MDT_BOOL_RW_ATTR(evict_tgt_nids); +MDT_BOOL_RW_ATTR(dom_read_open); +MDT_BOOL_RW_ATTR(enable_remote_dir); +MDT_BOOL_RW_ATTR(enable_remote_rename); +MDT_BOOL_RW_ATTR(enable_parallel_rename_dir); +MDT_BOOL_RW_ATTR(enable_parallel_rename_file); +MDT_BOOL_RW_ATTR(enable_striped_dir); +MDT_BOOL_RW_ATTR(enable_dir_migration); +MDT_BOOL_RW_ATTR(enable_dir_restripe); +MDT_BOOL_RW_ATTR(enable_dir_auto_split); +MDT_BOOL_RW_ATTR(dir_restripe_nsonly); +MDT_BOOL_RW_ATTR(migrate_hsm_allowed); +MDT_BOOL_RW_ATTR(enable_strict_som); +MDT_BOOL_RW_ATTR(enable_dmv_implicit_inherit); +MDT_BOOL_RW_ATTR(enable_dmv_xattr); /** * Show if the MDT is in no create mode. @@ -1108,200 +908,6 @@ static ssize_t dom_lock_store(struct kobject *kobj, struct attribute *attr, } LUSTRE_RW_ATTR(dom_lock); -/** - * Show MDT policy for data prefetch on open for DoM files.. - * - * \param[in] m seq_file handle - * \param[in] data unused - * - * \retval 0 on success - * \retval negative value on error - */ -static ssize_t dom_read_open_show(struct kobject *kobj, - struct attribute *attr, char *buf) -{ - struct obd_device *obd = container_of(kobj, struct obd_device, - obd_kset.kobj); - struct mdt_device *mdt = mdt_dev(obd->obd_lu_dev); - - return scnprintf(buf, PAGE_SIZE, "%u\n", - !!mdt->mdt_opts.mo_dom_read_open); -} - -/** - * Modify MDT policy for data prefetch on open for DoM files. - * - * If enabled then Data-on-MDT file data may be read during open and - * returned back in reply. It works only with mo_dom_lock enabled. - * - * \param[in] file proc file - * \param[in] buffer string which represents policy - * \param[in] count \a buffer length - * \param[in] off unused for single entry - * - * \retval \a count on success - * \retval negative number on error - */ -static ssize_t dom_read_open_store(struct kobject *kobj, - struct attribute *attr, const char *buffer, - size_t count) -{ - struct obd_device *obd = container_of(kobj, struct obd_device, - obd_kset.kobj); - struct mdt_device *mdt = mdt_dev(obd->obd_lu_dev); - bool val; - int rc; - - rc = kstrtobool(buffer, &val); - if (rc) - return rc; - - mdt->mdt_opts.mo_dom_read_open = !!val; - return count; -} -LUSTRE_RW_ATTR(dom_read_open); - -/** - * Show policy for using strict SOM information for real size (stat size). - * - * \param[in] m seq_file handle - * \param[in] data unused - * - * \retval 0 on success - * \retval negative value on error - */ -static ssize_t enable_strict_som_show(struct kobject *kobj, - struct attribute *attr, char *buf) -{ - struct obd_device *obd = container_of(kobj, struct obd_device, - obd_kset.kobj); - struct mdt_device *mdt = mdt_dev(obd->obd_lu_dev); - - return scnprintf(buf, PAGE_SIZE, "%u\n", - !!mdt->mdt_opts.mo_enable_strict_som); -} - -/** - * Modify policy for using strict SOM information for real size (stat size). - * - * If disabled, SOM is never used for stat. - * - * \param[in] file proc file - * \param[in] buffer string which represents policy - * \param[in] count \a buffer length - * \param[in] off unused for single entry - * - * \retval \a count on success - * \retval negative number on error - */ -static ssize_t enable_strict_som_store(struct kobject *kobj, - struct attribute *attr, - const char *buffer, size_t count) -{ - struct obd_device *obd = container_of(kobj, struct obd_device, - obd_kset.kobj); - struct mdt_device *mdt = mdt_dev(obd->obd_lu_dev); - bool val; - int rc; - - rc = kstrtobool(buffer, &val); - if (rc) - return rc; - - mdt->mdt_opts.mo_enable_strict_som = !!val; - return count; -} -LUSTRE_RW_ATTR(enable_strict_som); - -static ssize_t migrate_hsm_allowed_show(struct kobject *kobj, - struct attribute *attr, char *buf) -{ - struct obd_device *obd = container_of(kobj, struct obd_device, - obd_kset.kobj); - struct mdt_device *mdt = mdt_dev(obd->obd_lu_dev); - - return scnprintf(buf, PAGE_SIZE, "%u\n", - mdt->mdt_opts.mo_migrate_hsm_allowed); -} - -static ssize_t migrate_hsm_allowed_store(struct kobject *kobj, - struct attribute *attr, - const char *buffer, size_t count) -{ - struct obd_device *obd = container_of(kobj, struct obd_device, - obd_kset.kobj); - struct mdt_device *mdt = mdt_dev(obd->obd_lu_dev); - bool val; - int rc; - - rc = kstrtobool(buffer, &val); - if (rc) - return rc; - - mdt->mdt_opts.mo_migrate_hsm_allowed = val; - return count; -} -LUSTRE_RW_ATTR(migrate_hsm_allowed); - -static ssize_t readonly_show(struct kobject *kobj, struct attribute *attr, - char *buf) -{ - struct obd_device *obd = container_of(kobj, struct obd_device, - obd_kset.kobj); - struct mdt_device *mdt = mdt_dev(obd->obd_lu_dev); - - return scnprintf(buf, PAGE_SIZE, "%u\n", mdt->mdt_readonly); -} - -static ssize_t readonly_store(struct kobject *kobj, struct attribute *attr, - const char *buffer, size_t count) -{ - struct obd_device *obd = container_of(kobj, struct obd_device, - obd_kset.kobj); - struct mdt_device *mdt = mdt_dev(obd->obd_lu_dev); - bool val; - int rc; - - rc = kstrtobool(buffer, &val); - if (rc) - return rc; - - mdt->mdt_readonly = val; - return count; -} -LUSTRE_RW_ATTR(readonly); - -static ssize_t enable_remote_rename_show(struct kobject *kobj, - struct attribute *attr, - char *buf) -{ - struct obd_device *obd = container_of(kobj, struct obd_device, - obd_kset.kobj); - struct mdt_device *mdt = mdt_dev(obd->obd_lu_dev); - - return scnprintf(buf, PAGE_SIZE, "%u\n", - mdt->mdt_enable_remote_rename); -} - -static ssize_t enable_remote_rename_store(struct kobject *kobj, - struct attribute *attr, - const char *buffer, size_t count) -{ - struct obd_device *obd = container_of(kobj, struct obd_device, - obd_kset.kobj); - struct mdt_device *mdt = mdt_dev(obd->obd_lu_dev); - bool val; - int rc; - - rc = kstrtobool(buffer, &val); - if (rc) - return rc; - - mdt->mdt_enable_remote_rename = val; - return count; -} -LUSTRE_RW_ATTR(enable_remote_rename); - static ssize_t dir_split_count_show(struct kobject *kobj, struct attribute *attr, char *buf) @@ -1369,35 +975,6 @@ static ssize_t dir_split_delta_store(struct kobject *kobj, } LUSTRE_RW_ATTR(dir_split_delta); -static ssize_t dir_restripe_nsonly_show(struct kobject *kobj, - struct attribute *attr, char *buf) -{ - struct obd_device *obd = container_of(kobj, struct obd_device, - obd_kset.kobj); - struct mdt_device *mdt = mdt_dev(obd->obd_lu_dev); - - return scnprintf(buf, PAGE_SIZE, "%u\n", mdt->mdt_dir_restripe_nsonly); -} - -static ssize_t dir_restripe_nsonly_store(struct kobject *kobj, - struct attribute *attr, - const char *buffer, size_t count) -{ - struct obd_device *obd = container_of(kobj, struct obd_device, - obd_kset.kobj); - struct mdt_device *mdt = mdt_dev(obd->obd_lu_dev); - bool val; - int rc; - - rc = kstrtobool(buffer, &val); - if (rc) - return rc; - - mdt->mdt_dir_restripe_nsonly = val; - return count; -} -LUSTRE_RW_ATTR(dir_restripe_nsonly); - static ssize_t enable_remote_subdir_mount_show(struct kobject *kobj, struct attribute *attr, char *buf) @@ -1415,38 +992,6 @@ static ssize_t enable_remote_subdir_mount_store(struct kobject *kobj, } LUSTRE_RW_ATTR(enable_remote_subdir_mount); -static ssize_t enable_dmv_implicit_inherit_show(struct kobject *kobj, - struct attribute *attr, - char *buf) -{ - struct obd_device *obd = container_of(kobj, struct obd_device, - obd_kset.kobj); - struct mdt_device *mdt = mdt_dev(obd->obd_lu_dev); - - return scnprintf(buf, PAGE_SIZE, "%u\n", - mdt->mdt_enable_dmv_implicit_inherit); -} - -static ssize_t enable_dmv_implicit_inherit_store(struct kobject *kobj, - struct attribute *attr, - const char *buffer, - size_t count) -{ - struct obd_device *obd = container_of(kobj, struct obd_device, - obd_kset.kobj); - struct mdt_device *mdt = mdt_dev(obd->obd_lu_dev); - bool val; - int rc; - - rc = kstrtobool(buffer, &val); - if (rc) - return rc; - - mdt->mdt_enable_dmv_implicit_inherit = val; - return count; -} -LUSTRE_RW_ATTR(enable_dmv_implicit_inherit); - /** * Show if the OFD enforces T10PI checksum. * @@ -1755,6 +1300,7 @@ static struct attribute *mdt_attrs[] = { &lustre_attr_at_min.attr, &lustre_attr_at_max.attr, &lustre_attr_at_history.attr, + &lustre_attr_enable_dmv_xattr.attr, NULL, }; diff --git a/lustre/mdt/mdt_reint.c b/lustre/mdt/mdt_reint.c index 9579e9b..4794ae7 100644 --- a/lustre/mdt/mdt_reint.c +++ b/lustre/mdt/mdt_reint.c @@ -2345,7 +2345,7 @@ lock_parent: } /* if migration HSM is allowed */ - if (!mdt->mdt_opts.mo_migrate_hsm_allowed) { + if (!mdt->mdt_migrate_hsm_allowed) { ma->ma_need = MA_HSM; ma->ma_valid = 0; rc = mdt_attr_get_complex(info, sobj, ma); diff --git a/lustre/mdt/mdt_xattr.c b/lustre/mdt/mdt_xattr.c index 66b9eea..655c202 100644 --- a/lustre/mdt/mdt_xattr.c +++ b/lustre/mdt/mdt_xattr.c @@ -580,7 +580,9 @@ int mdt_reint_setxattr(struct mdt_thread_info *info, strcmp(xattr_name, XATTR_NAME_VERSION) == 0 || strcmp(xattr_name, XATTR_NAME_SOM) == 0 || strcmp(xattr_name, XATTR_NAME_HSM) == 0 || - strcmp(xattr_name, XATTR_NAME_LFSCK_NAMESPACE) == 0) + strcmp(xattr_name, XATTR_NAME_LFSCK_NAMESPACE) == 0 || + (strcmp(xattr_name, XATTR_NAME_DEFAULT_LMV) == 0 && + !info->mti_mdt->mdt_enable_dmv_xattr)) GOTO(out, rc = 0); } else if ((valid & OBD_MD_FLXATTR) && (strcmp(xattr_name, XATTR_NAME_ACL_ACCESS) == 0 || diff --git a/lustre/tests/sanity.sh b/lustre/tests/sanity.sh index 20e6df5..6598498 100755 --- a/lustre/tests/sanity.sh +++ b/lustre/tests/sanity.sh @@ -28612,6 +28612,44 @@ test_413i() { } run_test 413i "check default layout inheritance" +test_413j() +{ + (( $MDSCOUNT > 1 )) || skip_env "needs >= 2 MDTs" + + mkdir -p $DIR/$tdir || error "mkdir $tdir failed" + $LFS setdirstripe -D -c2 --max-inherit=2 $DIR/$tdir || + error "setdirstripe $tdir failed" + + local value=$(getfattr -n trusted.dmv $DIR/$tdir | \ + grep "trusted.dmv" |sed -e 's/[^=]\+=//') + + mkdir -p $DIR/$tdir/sub || error "mkdir sub failed" + # setfattr dmv calls setdirstripe -D + setfattr -n trusted.dmv -v $value $DIR/$tdir/sub || + error "setfattr sub failed" + local value2=$(getfattr -n trusted.dmv $DIR/$tdir/sub | \ + grep "trusted.dmv" |sed -e 's/[^=]\+=//') + + [ $value == $value2 ] || error "dmv mismatch" + + (( MDS1_VERSION >= $(version_code 2.15.58) )) || return 0 + + # do not allow remove dmv by setfattr -x + do_nodes $(comma_list $(mdts_nodes)) \ + "$LCTL set_param -n mdt.*MDT*.enable_dmv_xattr=0" + setfattr -x trusted.dmv $DIR/$tdir/sub || error "setfattr sub failed" + getfattr -n trusted.dmv $DIR/$tdir/sub || error "default LMV deleted" + + # allow remove dmv by setfattr -x + do_nodes $(comma_list $(mdts_nodes)) \ + "$LCTL set_param -n mdt.*MDT*.enable_dmv_xattr=1" + setfattr -x trusted.dmv $DIR/$tdir/sub || error "setfattr sub failed" + getfattr -n trusted.dmv $DIR/$tdir/sub && error "default LMV exists" + do_nodes $(comma_list $(mdts_nodes)) \ + "$LCTL set_param -n mdt.*MDT*.enable_dmv_xattr=0" +} +run_test 413j "set default LMV by setxattr" + test_413z() { local pids="" local subdir -- 1.8.3.1