Whamcloud - gitweb
LU-17144 mdt: set dmv by setxattr 10/52510/6
authorLai Siyao <lai.siyao@whamcloud.com>
Mon, 25 Sep 2023 14:28:51 +0000 (10:28 -0400)
committerOleg Drokin <green@whamcloud.com>
Wed, 13 Dec 2023 12:20:52 +0000 (12:20 +0000)
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 <lai.siyao@whamcloud.com>
Change-Id: I27d784998a9c4a182b4fffb8b06c84e9d9190919
Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/52510
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Hongchao Zhang <hongchao@whamcloud.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
lustre/llite/xattr.c
lustre/lod/lod_object.c
lustre/mdt/mdt_handler.c
lustre/mdt/mdt_internal.h
lustre/mdt/mdt_io.c
lustre/mdt/mdt_lproc.c
lustre/mdt/mdt_reint.c
lustre/mdt/mdt_xattr.c
lustre/tests/sanity.sh

index 7ef091f..6333d04 100644 (file)
@@ -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);
index 19cdd6c..3ce2118 100644 (file)
@@ -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)
index 03adf09..1feb91a 100644 (file)
@@ -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. */
index 15ff9f9..82feadc 100644 (file)
@@ -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 */
index dedb58e..2d22a27 100644 (file)
@@ -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
index 24bc276..9b13a3b 100644 (file)
@@ -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,
 };
 
index 9579e9b..4794ae7 100644 (file)
@@ -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);
index 66b9eea..655c202 100644 (file)
@@ -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 ||
index 20e6df5..6598498 100755 (executable)
@@ -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