From: Lai Siyao Date: Mon, 25 Sep 2023 14:28:51 +0000 (-0400) Subject: LU-17144 mdt: set dmv by setxattr X-Git-Url: https://git.whamcloud.com/?a=commitdiff_plain;h=07732c0185c3d7be85188c260e65f581036b963a;p=fs%2Flustre-release.git 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. Lustre-change: https://review.whamcloud.com/52510 Lustre-commit: 1ebe91ec0ab55f686a730d448e7a1ba2ce99639a Signed-off-by: Lai Siyao Change-Id: I27d784998a9c4a182b4fffb8b06c84e9d9190919 Reviewed-on: https://review.whamcloud.com/c/ex/lustre-release/+/52511 Tested-by: jenkins Tested-by: Maloo Reviewed-by: Andreas Dilger --- diff --git a/lustre/llite/xattr.c b/lustre/llite/xattr.c index bfbc013..84d33f3 100644 --- a/lustre/llite/xattr.c +++ b/lustre/llite/xattr.c @@ -166,6 +166,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 193d926..426ebf5 100644 --- a/lustre/lod/lod_object.c +++ b/lustre/lod/lod_object.c @@ -2484,7 +2484,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 4a8d2c1..abc29b6 100644 --- a/lustre/mdt/mdt_handler.c +++ b/lustre/mdt/mdt_handler.c @@ -899,8 +899,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 */ @@ -6012,7 +6011,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); @@ -6037,7 +6036,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; @@ -6176,7 +6175,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 496bec0..8f46cf2 100644 --- a/lustre/mdt/mdt_internal.h +++ b/lustre/mdt/mdt_internal.h @@ -271,11 +271,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 */ @@ -298,7 +294,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, @@ -311,7 +310,9 @@ struct mdt_device { mdt_readonly:1, mdt_skip_lfsck:1, /* dir restripe migrate dirent only */ - mdt_dir_restripe_nsonly:1; + mdt_dir_restripe_nsonly: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 6c699bae..18789be 100644 --- a/lustre/mdt/mdt_io.c +++ b/lustre/mdt/mdt_io.c @@ -1524,7 +1524,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 1390e4d6..2e32f42 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) { @@ -739,188 +680,46 @@ static ssize_t enable_pin_gid_store(struct kobject *kobj, } LUSTRE_RW_ATTR(enable_pin_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_xattr); /** * Show MDT async commit count. @@ -1090,200 +889,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) @@ -1351,35 +956,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) @@ -1693,6 +1269,7 @@ static struct attribute *mdt_attrs[] = { &lustre_attr_checksum_t10pi_enforce.attr, &lustre_attr_enable_remote_subdir_mount.attr, &lustre_attr_max_mod_rpcs_in_flight.attr, + &lustre_attr_enable_dmv_xattr.attr, NULL, }; diff --git a/lustre/mdt/mdt_reint.c b/lustre/mdt/mdt_reint.c index eed9084..1bc109f 100644 --- a/lustre/mdt/mdt_reint.c +++ b/lustre/mdt/mdt_reint.c @@ -2463,7 +2463,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 d2ad6df..2a6ffa1 100644 --- a/lustre/mdt/mdt_xattr.c +++ b/lustre/mdt/mdt_xattr.c @@ -598,7 +598,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 fd4ad29..2724b69 100755 --- a/lustre/tests/sanity.sh +++ b/lustre/tests/sanity.sh @@ -26773,6 +26773,44 @@ test_413h() { } run_test 413h "don't stick to parent for round-robin dirs" +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.14.0) )) || 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