Whamcloud - gitweb
LU-7988 hsm: run HSM coordinator once per second at most
[fs/lustre-release.git] / lustre / mdt / mdt_reint.c
index cfe0dd1..a252b5f 100644 (file)
  *
  * You should have received a copy of the GNU General Public License
  * version 2 along with this program; If not, see
- * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
+ * http://www.gnu.org/licenses/gpl-2.0.html
  *
  * GPL HEADER END
  */
@@ -27,7 +23,7 @@
  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
  * Use is subject to license terms.
  *
- * Copyright (c) 2011, 2015, Intel Corporation.
+ * Copyright (c) 2011, 2016, Intel Corporation.
  */
 /*
  * This file is part of Lustre, http://www.lustre.org/
@@ -65,14 +61,15 @@ static inline void mdt_reint_init_ma(struct mdt_thread_info *info,
 static void mdt_obj_version_get(struct mdt_thread_info *info,
                                 struct mdt_object *o, __u64 *version)
 {
-        LASSERT(o);
+       LASSERT(o);
+
        if (mdt_object_exists(o) && !mdt_object_remote(o) &&
            !fid_is_obf(mdt_object_fid(o)))
-                *version = dt_version_get(info->mti_env, mdt_obj2dt(o));
-        else
-                *version = ENOENT_VERSION;
-        CDEBUG(D_INODE, "FID "DFID" version is "LPX64"\n",
-               PFID(mdt_object_fid(o)), *version);
+               *version = dt_version_get(info->mti_env, mdt_obj2dt(o));
+       else
+               *version = ENOENT_VERSION;
+       CDEBUG(D_INODE, "FID "DFID" version is %#llx\n",
+              PFID(mdt_object_fid(o)), *version);
 }
 
 /**
@@ -100,7 +97,7 @@ static int mdt_version_check(struct ptlrpc_request *req,
                spin_unlock(&req->rq_export->exp_lock);
                RETURN(-EOVERFLOW);
        } else if (pre_ver[idx] != version) {
-               CDEBUG(D_INODE, "Version mismatch "LPX64" != "LPX64"\n",
+               CDEBUG(D_INODE, "Version mismatch %#llx != %#llx\n",
                       pre_ver[idx], version);
                spin_lock(&req->rq_export->exp_lock);
                req->rq_export->exp_vbr_failed = 1;
@@ -323,7 +320,7 @@ static int mdt_unlock_slaves(struct mdt_thread_info *mti,
                        /* borrow s0_lh temporarily to do mdt unlock */
                        mdt_lock_reg_init(s0_lh, einfo->ei_mode);
                        s0_lh->mlh_rreg_lh = slave_locks->handles[i];
-                       mdt_object_unlock(mti, obj, s0_lh, decref);
+                       mdt_object_unlock(mti, NULL, s0_lh, decref);
                        slave_locks->handles[i].cookie = 0ull;
                }
        }
@@ -386,6 +383,8 @@ static int mdt_lock_slaves(struct mdt_thread_info *mti, struct mdt_object *obj,
        int rc;
        ENTRY;
 
+       memset(einfo, 0, sizeof(*einfo));
+
        rc = mdt_init_slaves(mti, obj, s0_fid);
        if (rc <= 0)
                RETURN(rc);
@@ -409,7 +408,6 @@ static int mdt_lock_slaves(struct mdt_thread_info *mti, struct mdt_object *obj,
                }
        }
 
-       memset(einfo, 0, sizeof(*einfo));
        einfo->ei_type = LDLM_IBITS;
        einfo->ei_mode = mode;
        einfo->ei_cb_bl = mdt_remote_blocking_ast;
@@ -433,7 +431,7 @@ static int mdt_lock_slaves(struct mdt_thread_info *mti, struct mdt_object *obj,
  * 2 - child. Version of child by FID. Must be ENOENT. It is mostly sanity
  * check.
  */
-static int mdt_md_create(struct mdt_thread_info *info)
+static int mdt_create(struct mdt_thread_info *info)
 {
        struct mdt_device       *mdt = info->mti_mdt;
        struct mdt_object       *parent;
@@ -597,7 +595,8 @@ static int mdt_attr_set(struct mdt_thread_info *info, struct mdt_object *mo,
                        struct md_attr *ma)
 {
        struct mdt_lock_handle  *lh;
-       int do_vbr = ma->ma_attr.la_valid & (LA_MODE|LA_UID|LA_GID|LA_FLAGS);
+       int do_vbr = ma->ma_attr.la_valid &
+                       (LA_MODE | LA_UID | LA_GID | LA_PROJID | LA_FLAGS);
        __u64 lockpart = MDS_INODELOCK_UPDATE;
        struct ldlm_enqueue_info *einfo = &info->mti_einfo;
        struct lu_fid *s0_fid = &info->mti_tmp_fid1;
@@ -650,13 +649,13 @@ static int mdt_attr_set(struct mdt_thread_info *info, struct mdt_object *mo,
         }
 
        /* Ensure constant striping during chown(). See LU-2789. */
-       if (ma->ma_attr.la_valid & (LA_UID|LA_GID))
+       if (ma->ma_attr.la_valid & (LA_UID|LA_GID|LA_PROJID))
                mutex_lock(&mo->mot_lov_mutex);
 
         /* all attrs are packed into mti_attr in unpack_setattr */
         rc = mo_attr_set(info->mti_env, mdt_object_child(mo), ma);
 
-       if (ma->ma_attr.la_valid & (LA_UID|LA_GID))
+       if (ma->ma_attr.la_valid & (LA_UID|LA_GID|LA_PROJID))
                mutex_unlock(&mo->mot_lov_mutex);
 
         if (rc != 0)
@@ -693,20 +692,12 @@ int mdt_add_dirty_flag(struct mdt_thread_info *info, struct mdt_object *mo,
        /* If an up2date copy exists in the backend, add dirty flag */
        if ((ma->ma_valid & MA_HSM) && (ma->ma_hsm.mh_flags & HS_EXISTS)
            && !(ma->ma_hsm.mh_flags & (HS_DIRTY|HS_RELEASED))) {
-               struct mdt_lock_handle  *lh = &info->mti_lh[MDT_LH_CHILD];
-
                ma->ma_hsm.mh_flags |= HS_DIRTY;
 
-               mdt_lock_reg_init(lh, LCK_PW);
-               rc = mdt_object_lock(info, mo, lh, MDS_INODELOCK_XATTR);
-               if (rc != 0)
-                       RETURN(rc);
-
                rc = mdt_hsm_attr_set(info, mo, &ma->ma_hsm);
                if (rc)
                        CERROR("file attribute change error for "DFID": %d\n",
                                PFID(mdt_object_fid(mo)), rc);
-               mdt_object_unlock(info, mo, lh, rc);
        }
 
        RETURN(rc);
@@ -752,21 +743,10 @@ static int mdt_reint_setattr(struct mdt_thread_info *info,
                        GOTO(out_put, rc = -EPROTO);
 
                rc = mdt_attr_set(info, mo, ma);
-                if (rc)
-                        GOTO(out_put, rc);
-       } else if ((ma->ma_valid & MA_LOV) && (ma->ma_valid & MA_INODE)) {
-               struct lu_buf *buf  = &info->mti_buf;
-
-               if (ma->ma_attr.la_valid != 0)
-                       GOTO(out_put, rc = -EPROTO);
-
-               buf->lb_buf = ma->ma_lmm;
-               buf->lb_len = ma->ma_lmm_size;
-               rc = mo_xattr_set(info->mti_env, mdt_object_child(mo),
-                                 buf, XATTR_NAME_LOV, 0);
                if (rc)
                        GOTO(out_put, rc);
-       } else if ((ma->ma_valid & MA_LMV) && (ma->ma_valid & MA_INODE)) {
+       } else if ((ma->ma_valid & (MA_LOV | MA_LMV)) &&
+                  (ma->ma_valid & MA_INODE)) {
                struct lu_buf *buf  = &info->mti_buf;
                struct mdt_lock_handle  *lh;
 
@@ -780,15 +760,21 @@ static int mdt_reint_setattr(struct mdt_thread_info *info,
                lh = &info->mti_lh[MDT_LH_PARENT];
                mdt_lock_reg_init(lh, LCK_PW);
 
-               rc = mdt_object_lock(info, mo, lh,
-                                    MDS_INODELOCK_XATTR);
+               rc = mdt_object_lock(info, mo, lh, MDS_INODELOCK_XATTR);
                if (rc != 0)
                        GOTO(out_put, rc);
 
-               buf->lb_buf = ma->ma_lmv;
-               buf->lb_len = ma->ma_lmv_size;
-               rc = mo_xattr_set(info->mti_env, mdt_object_child(mo),
-                                 buf, XATTR_NAME_DEFAULT_LMV, 0);
+               if (ma->ma_valid & MA_LOV) {
+                       buf->lb_buf = ma->ma_lmm;
+                       buf->lb_len = ma->ma_lmm_size;
+               } else {
+                       buf->lb_buf = ma->ma_lmv;
+                       buf->lb_len = ma->ma_lmv_size;
+               }
+               rc = mo_xattr_set(info->mti_env, mdt_object_child(mo), buf,
+                                 (ma->ma_valid & MA_LOV) ?
+                                       XATTR_NAME_LOV : XATTR_NAME_DEFAULT_LMV,
+                                 0);
 
                mdt_object_unlock(info, mo, lh, rc);
                if (rc)
@@ -860,7 +846,7 @@ static int mdt_reint_create(struct mdt_thread_info *info,
                RETURN(err_serious(-EOPNOTSUPP));
        }
 
-       rc = mdt_md_create(info);
+       rc = mdt_create(info);
        RETURN(rc);
 }
 
@@ -1405,6 +1391,7 @@ again:
                struct mdt_lock_list *mll;
                struct lu_name name;
                struct lu_fid  fid;
+               __u64 ibits;
 
                linkea_entry_unpack(ldata.ld_lee, &ldata.ld_reclen,
                                    &name, &fid);
@@ -1449,9 +1436,10 @@ again:
                 * cannot be gotten because of conflicting locks, then drop all
                 * current locks, send an AST to the client, and start again. */
                mdt_lock_pdo_init(&mll->mll_lh, LCK_PW, &name);
-               rc = mdt_reint_object_lock_try(info, mdt_pobj, &mll->mll_lh,
-                                               MDS_INODELOCK_UPDATE, true);
-               if (rc == 0) {
+               ibits = 0;
+               rc = mdt_object_lock_try(info, mdt_pobj, &mll->mll_lh, &ibits,
+                                        MDS_INODELOCK_UPDATE, true);
+               if (!(ibits & MDS_INODELOCK_UPDATE)) {
                        mdt_unlock_list(info, lock_list, rc);
 
                        CDEBUG(D_INFO, "%s: busy lock on "DFID" %s retry %d\n",
@@ -1532,7 +1520,7 @@ static int mdt_reint_migrate_internal(struct mdt_thread_info *info,
        /* 1: lock the source dir. */
        msrcdir = mdt_object_find(info->mti_env, info->mti_mdt, rr->rr_fid1);
        if (IS_ERR(msrcdir)) {
-               CERROR("%s: cannot find source dir "DFID" : rc = %d\n",
+               CDEBUG(D_OTHER, "%s: cannot find source dir "DFID" : rc = %d\n",
                        mdt_obd_name(info->mti_mdt), PFID(rr->rr_fid1),
                        (int)PTR_ERR(msrcdir));
                RETURN(PTR_ERR(msrcdir));
@@ -1571,14 +1559,14 @@ static int mdt_reint_migrate_internal(struct mdt_thread_info *info,
                GOTO(out_unlock_parent, rc = PTR_ERR(mold));
 
        if (mdt_object_remote(mold)) {
-               CERROR("%s: source "DFID" is on the remote MDT\n",
+               CDEBUG(D_OTHER, "%s: source "DFID" is on the remote MDT\n",
                       mdt_obd_name(info->mti_mdt), PFID(old_fid));
                GOTO(out_put_child, rc = -EREMOTE);
        }
 
        if (S_ISREG(lu_object_attr(&mold->mot_obj)) &&
            !mdt_object_remote(msrcdir)) {
-               CERROR("%s: parent "DFID" is still on the same"
+               CDEBUG(D_OTHER, "%s: parent "DFID" is still on the same"
                       " MDT, which should be migrated first:"
                       " rc = %d\n", mdt_obd_name(info->mti_mdt),
                       PFID(mdt_object_fid(msrcdir)), -EPERM);
@@ -1674,7 +1662,8 @@ out_lease:
 
        if ((ma->ma_valid & MA_HSM) && ma->ma_hsm.mh_flags != 0) {
                rc = -ENOSYS;
-               CERROR("%s: cannot migrate HSM archived file "DFID": rc = %d\n",
+               CDEBUG(D_OTHER,
+                      "%s: cannot migrate HSM archived file "DFID": rc = %d\n",
                       mdt_obd_name(info->mti_mdt), PFID(old_fid), rc);
                GOTO(out_unlock_child, rc);
        }
@@ -1693,7 +1682,7 @@ out_lease:
                lmv_le_to_cpu(ma->ma_lmv, ma->ma_lmv);
                lmm1 = &ma->ma_lmv->lmv_md_v1;
                if (!(lmm1->lmv_hash_type & LMV_HASH_FLAG_MIGRATION)) {
-                       CERROR("%s: can not migrate striped dir "DFID
+                       CDEBUG(D_OTHER, "%s: can not migrate striped dir "DFID
                               ": rc = %d\n", mdt_obd_name(info->mti_mdt),
                               PFID(mdt_object_fid(mold)), -EPERM);
                        GOTO(out_unlock_child, rc = -EPERM);
@@ -1708,7 +1697,8 @@ out_lease:
                        GOTO(out_unlock_child, rc = PTR_ERR(mnew));
 
                if (!mdt_object_remote(mnew)) {
-                       CERROR("%s: "DFID" being migrated is on this MDT:"
+                       CDEBUG(D_OTHER,
+                              "%s: "DFID" being migrated is on this MDT:"
                               " rc  = %d\n", mdt_obd_name(info->mti_mdt),
                               PFID(rr->rr_fid2), -EPERM);
                        GOTO(out_put_new, rc = -EPERM);
@@ -1731,7 +1721,7 @@ out_lease:
                if (IS_ERR(mnew))
                        GOTO(out_unlock_child, rc = PTR_ERR(mnew));
                if (!mdt_object_remote(mnew)) {
-                       CERROR("%s: Migration "DFID" is on this MDT:"
+                       CDEBUG(D_OTHER, "%s: Migration "DFID" is on this MDT:"
                               " rc = %d\n", mdt_obd_name(info->mti_mdt),
                               PFID(rr->rr_fid2), -EXDEV);
                        GOTO(out_put_new, rc = -EXDEV);