Whamcloud - gitweb
LU-6698 kernel: kernel update RHEL 6.6 [2.6.32-504.23.4.el6]
[fs/lustre-release.git] / lustre / mdd / mdd_object.c
index f1d78f1..b6c8126 100644 (file)
@@ -27,7 +27,7 @@
  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
  * Use is subject to license terms.
  *
- * Copyright (c) 2011, 2013, Intel Corporation.
+ * Copyright (c) 2011, 2014, Intel Corporation.
  */
 /*
  * This file is part of Lustre, http://www.lustre.org/
@@ -63,7 +63,7 @@ static int mdd_xattr_get(const struct lu_env *env,
                          const char *name);
 
 int mdd_la_get(const struct lu_env *env, struct mdd_object *obj,
-               struct lu_attr *la, struct lustre_capa *capa)
+              struct lu_attr *la)
 {
         if (mdd_object_exists(obj) == 0) {
                 CERROR("%s: object "DFID" not found: rc = -2\n",
@@ -71,7 +71,7 @@ int mdd_la_get(const struct lu_env *env, struct mdd_object *obj,
                 return -ENOENT;
         }
 
-        return mdo_attr_get(env, obj, la, capa);
+       return mdo_attr_get(env, obj, la);
 }
 
 struct mdd_thread_info *mdd_env_info(const struct lu_env *env)
@@ -155,7 +155,7 @@ static int mdd_object_start(const struct lu_env *env, struct lu_object *o)
                struct mdd_object *mdd_obj = lu2mdd_obj(o);
                struct lu_attr *attr = MDD_ENV_VAR(env, la_for_start);
 
-               rc = mdd_la_get(env, mdd_obj, attr, BYPASS_CAPA);
+               rc = mdd_la_get(env, mdd_obj, attr);
        }
 
        return rc;
@@ -204,8 +204,7 @@ int mdd_attr_get(const struct lu_env *env, struct md_object *obj,
 
        ENTRY;
 
-       rc = mdd_la_get(env, mdd_obj, &ma->ma_attr,
-                       mdd_object_capa(env, md2mdd_obj(obj)));
+       rc = mdd_la_get(env, mdd_obj, &ma->ma_attr);
        if ((ma->ma_need & MA_INODE) != 0 && mdd_is_dead_obj(mdd_obj))
                ma->ma_attr.la_nlink = 0;
 
@@ -237,8 +236,7 @@ static int mdd_xattr_get(const struct lu_env *env,
                RETURN(-ENOENT);
 
         mdd_read_lock(env, mdd_obj, MOR_TGT_CHILD);
-        rc = mdo_xattr_get(env, mdd_obj, buf, name,
-                           mdd_object_capa(env, mdd_obj));
+       rc = mdo_xattr_get(env, mdd_obj, buf, name);
         mdd_read_unlock(env, mdd_obj);
 
         RETURN(rc);
@@ -268,8 +266,7 @@ int mdd_readlink(const struct lu_env *env, struct md_object *obj,
        LASSERT(next->do_body_ops != NULL);
        LASSERT(next->do_body_ops->dbo_read != NULL);
        mdd_read_lock(env, mdd_obj, MOR_TGT_CHILD);
-        rc = next->do_body_ops->dbo_read(env, next, buf, &pos,
-                                         mdd_object_capa(env, mdd_obj));
+       rc = dt_read(env, next, buf, &pos);
         mdd_read_unlock(env, mdd_obj);
         RETURN(rc);
 }
@@ -286,10 +283,38 @@ static int mdd_xattr_list(const struct lu_env *env, struct md_object *obj,
         ENTRY;
 
         mdd_read_lock(env, mdd_obj, MOR_TGT_CHILD);
-        rc = mdo_xattr_list(env, mdd_obj, buf, mdd_object_capa(env, mdd_obj));
+       rc = mdo_xattr_list(env, mdd_obj, buf);
         mdd_read_unlock(env, mdd_obj);
 
-        RETURN(rc);
+       if (rc < 0)
+               RETURN(rc);
+
+       /*
+        * Filter out XATTR_NAME_LINK if this is an orphan object.  See
+        * mdd_xattr_get().
+        */
+       if (unlikely(mdd_obj->mod_flags & (DEAD_OBJ | ORPHAN_OBJ))) {
+               char   *end = (char *)buf->lb_buf + rc;
+               char   *p = buf->lb_buf;
+
+               while (p < end) {
+                       char   *next = p + strlen(p) + 1;
+
+                       if (strcmp(p, XATTR_NAME_LINK) == 0) {
+                               if (end - next > 0)
+                                       memmove(p, next, end - next);
+                               rc -= next - p;
+                               CDEBUG(D_INFO, "Filtered out "XATTR_NAME_LINK
+                                      " of orphan "DFID"\n",
+                                      PFID(mdd_object_fid(mdd_obj)));
+                               break;
+                       }
+
+                       p = next;
+               }
+       }
+
+       RETURN(rc);
 }
 
 int mdd_declare_object_create_internal(const struct lu_env *env,
@@ -341,8 +366,6 @@ int mdd_object_create_internal(const struct lu_env *env, struct mdd_object *p,
 
        rc = mdo_create_obj(env, c, attr, hint, dof, handle);
 
-       LASSERT(ergo(rc == 0, mdd_object_exists(c)));
-
        RETURN(rc);
 }
 
@@ -353,7 +376,7 @@ int mdd_attr_set_internal(const struct lu_env *env, struct mdd_object *obj,
         int rc;
         ENTRY;
 
-        rc = mdo_attr_set(env, obj, attr, handle, mdd_object_capa(env, obj));
+       rc = mdo_attr_set(env, obj, attr, handle);
 #ifdef CONFIG_FS_POSIX_ACL
         if (!rc && (attr->la_valid & LA_MODE) && needacl)
                 rc = mdd_acl_chmod(env, obj, attr->la_mode, handle);
@@ -414,8 +437,6 @@ static int mdd_fix_attr(const struct lu_env *env, struct mdd_object *obj,
 
        LASSERT(oattr != NULL);
 
-       /* export destroy does not have ->le_ses, but we may want
-        * to drop LUSTRE_SOM_FL. */
        uc = lu_ucred_check(env);
        if (uc == NULL)
                RETURN(0);
@@ -571,44 +592,24 @@ static int mdd_fix_attr(const struct lu_env *env, struct mdd_object *obj,
                }
        }
 
-       /* For both Size-on-MDS case and truncate case,
-        * "la->la_valid & (LA_SIZE | LA_BLOCKS)" are ture.
-        * We distinguish them by "flags & MDS_SOM".
-        * For SOM case, it is true, the MAY_WRITE perm has been checked
-        * when open, no need check again. For truncate case, it is false,
-        * the MAY_WRITE perm should be checked here. */
-       if (flags & MDS_SOM) {
-               /* For the "Size-on-MDS" setattr update, merge coming
-                * attributes with the set in the inode. BUG 10641 */
-               if ((la->la_valid & LA_ATIME) &&
-                   (la->la_atime <= oattr->la_atime))
-                       la->la_valid &= ~LA_ATIME;
-
-               /* OST attributes do not have a priority over MDS attributes,
-                * so drop times if ctime is equal. */
-               if ((la->la_valid & LA_CTIME) &&
-                   (la->la_ctime <= oattr->la_ctime))
-                       la->la_valid &= ~(LA_MTIME | LA_CTIME);
-       } else {
-               if (la->la_valid & (LA_SIZE | LA_BLOCKS)) {
-                       if (!((flags & MDS_OWNEROVERRIDE) &&
-                             (uc->uc_fsuid == oattr->la_uid)) &&
-                           !(flags & MDS_PERM_BYPASS)) {
-                               rc = mdd_permission_internal(env, obj,
-                                                            oattr, MAY_WRITE);
-                               if (rc != 0)
-                                       RETURN(rc);
-                       }
-               }
-               if (la->la_valid & LA_CTIME) {
-                       /* The pure setattr, it has the priority over what is
-                        * already set, do not drop it if ctime is equal. */
-                       if (la->la_ctime < oattr->la_ctime)
-                               la->la_valid &= ~(LA_ATIME | LA_MTIME |
-                                                       LA_CTIME);
+       if (la->la_valid & (LA_SIZE | LA_BLOCKS)) {
+               if (!((flags & MDS_OWNEROVERRIDE) &&
+                     (uc->uc_fsuid == oattr->la_uid)) &&
+                   !(flags & MDS_PERM_BYPASS)) {
+                       rc = mdd_permission_internal(env, obj, oattr,
+                                                    MAY_WRITE);
+                       if (rc != 0)
+                               RETURN(rc);
                }
        }
 
+       if (la->la_valid & LA_CTIME) {
+               /* The pure setattr, it has the priority over what is
+                * already set, do not drop it if ctime is equal. */
+               if (la->la_ctime < oattr->la_ctime)
+                       la->la_valid &= ~(LA_ATIME | LA_MTIME | LA_CTIME);
+       }
+
        RETURN(0);
 }
 
@@ -616,7 +617,7 @@ static int mdd_fix_attr(const struct lu_env *env, struct mdd_object *obj,
  * If this fails, we must fail the whole transaction; we don't
  * want the change to commit without the log entry.
  * \param mdd_obj - mdd_object of change
- * \param handle - transacion handle
+ * \param handle - transaction handle
  */
 int mdd_changelog_data_store(const struct lu_env *env, struct mdd_device *mdd,
                             enum changelog_rec_type type, int flags,
@@ -649,7 +650,7 @@ int mdd_changelog_data_store(const struct lu_env *env, struct mdd_device *mdd,
         }
 
        flags = (flags & CLF_FLAGMASK) | CLF_VERSION;
-       if (uc->uc_jobid[0] != '\0')
+       if (uc != NULL && uc->uc_jobid[0] != '\0')
                flags |= CLF_JOBID;
 
        reclen = llog_data_len(changelog_rec_offset(flags & CLF_SUPPORTED));
@@ -755,7 +756,7 @@ static int mdd_declare_attr_set(const struct lu_env *env,
        if (attr->la_valid & LA_MODE) {
                 mdd_read_lock(env, obj, MOR_TGT_CHILD);
                rc = mdo_xattr_get(env, obj, &LU_BUF_NULL,
-                                  XATTR_NAME_ACL_ACCESS, BYPASS_CAPA);
+                                  XATTR_NAME_ACL_ACCESS);
                 mdd_read_unlock(env, obj);
                 if (rc == -EOPNOTSUPP || rc == -ENODATA)
                         rc = 0;
@@ -821,12 +822,11 @@ int mdd_attr_set(const struct lu_env *env, struct md_object *obj,
        int rc;
        ENTRY;
 
-       /* we do not use ->attr_set() for LOV/SOM/HSM EA any more */
+       /* we do not use ->attr_set() for LOV/HSM EA any more */
        LASSERT((ma->ma_valid & MA_LOV) == 0);
        LASSERT((ma->ma_valid & MA_HSM) == 0);
-       LASSERT((ma->ma_valid & MA_SOM) == 0);
 
-       rc = mdd_la_get(env, mdd_obj, attr, BYPASS_CAPA);
+       rc = mdd_la_get(env, mdd_obj, attr);
        if (rc)
                RETURN(rc);
 
@@ -955,8 +955,7 @@ static int mdd_hsm_update_locked(const struct lu_env *env,
        CLASSERT(sizeof(struct hsm_attrs) <= sizeof(info->mti_xattr_buf));
        current_buf = mdd_buf_get(env, info->mti_xattr_buf,
                                  sizeof(info->mti_xattr_buf));
-       rc = mdo_xattr_get(env, mdd_obj, current_buf, XATTR_NAME_HSM,
-                          mdd_object_capa(env, mdd_obj));
+       rc = mdo_xattr_get(env, mdd_obj, current_buf, XATTR_NAME_HSM);
        rc = lustre_buf2hsm(current_buf->lb_buf, rc, current_mh);
        if (rc < 0 && rc != -ENODATA)
                GOTO(free, rc);
@@ -1005,7 +1004,7 @@ static int mdd_xattr_set(const struct lu_env *env, struct md_object *obj,
        int                      rc;
        ENTRY;
 
-       rc = mdd_la_get(env, mdd_obj, attr, BYPASS_CAPA);
+       rc = mdd_la_get(env, mdd_obj, attr);
        if (rc)
                RETURN(rc);
 
@@ -1055,8 +1054,7 @@ static int mdd_xattr_set(const struct lu_env *env, struct md_object *obj,
                }
        }
 
-       rc = mdo_xattr_set(env, mdd_obj, buf, name, fl, handle,
-                          mdd_object_capa(env, mdd_obj));
+       rc = mdo_xattr_set(env, mdd_obj, buf, name, fl, handle);
        mdd_write_unlock(env, mdd_obj);
        if (rc)
                GOTO(stop, rc);
@@ -1113,7 +1111,7 @@ static int mdd_xattr_del(const struct lu_env *env, struct md_object *obj,
        int  rc;
        ENTRY;
 
-       rc = mdd_la_get(env, mdd_obj, attr, BYPASS_CAPA);
+       rc = mdd_la_get(env, mdd_obj, attr);
        if (rc)
                RETURN(rc);
 
@@ -1134,8 +1132,7 @@ static int mdd_xattr_del(const struct lu_env *env, struct md_object *obj,
                 GOTO(stop, rc);
 
         mdd_write_lock(env, mdd_obj, MOR_TGT_CHILD);
-        rc = mdo_xattr_del(env, mdd_obj, name, handle,
-                           mdd_object_capa(env, mdd_obj));
+       rc = mdo_xattr_del(env, mdd_obj, name, handle);
         mdd_write_unlock(env, mdd_obj);
        if (rc)
                GOTO(stop, rc);
@@ -1168,8 +1165,7 @@ int mdd_get_lov_ea(const struct lu_env *env, struct mdd_object *obj,
        ENTRY;
 
 repeat:
-       rc = mdo_xattr_get(env, obj, buf, XATTR_NAME_LOV,
-                          mdd_object_capa(env, obj));
+       rc = mdo_xattr_get(env, obj, buf, XATTR_NAME_LOV);
 
        if (rc == -ERANGE) {
                /* mti_big_buf is allocated but is too small
@@ -1223,7 +1219,7 @@ static int mdd_xattr_hsm_replace(const struct lu_env *env,
        ENTRY;
 
        rc = mdo_xattr_set(env, o, buf, XATTR_NAME_HSM, LU_XATTR_REPLACE,
-                          handle, mdd_object_capa(env, o));
+                          handle);
        if (rc != 0)
                RETURN(rc);
 
@@ -1318,11 +1314,11 @@ static int mdd_swap_layouts(const struct lu_env *env, struct md_object *obj1,
        if (rc < 0)
                swap(fst_o, snd_o);
 
-       rc = mdd_la_get(env, fst_o, fst_la, BYPASS_CAPA);
+       rc = mdd_la_get(env, fst_o, fst_la);
        if (rc != 0)
                RETURN(rc);
 
-       rc = mdd_la_get(env, snd_o, snd_la, BYPASS_CAPA);
+       rc = mdd_la_get(env, snd_o, snd_la);
        if (rc != 0)
                RETURN(rc);
 
@@ -1404,13 +1400,11 @@ static int mdd_swap_layouts(const struct lu_env *env, struct md_object *obj1,
                        GOTO(stop, rc = -ENOMEM);
 
                /* Read HSM attribute */
-               rc = mdo_xattr_get(env, fst_o, fst_hsm_buf, XATTR_NAME_HSM,
-                                  BYPASS_CAPA);
+               rc = mdo_xattr_get(env, fst_o, fst_hsm_buf, XATTR_NAME_HSM);
                if (rc < 0)
                        GOTO(stop, rc);
 
-               rc = mdo_xattr_get(env, snd_o, snd_hsm_buf, XATTR_NAME_HSM,
-                                  BYPASS_CAPA);
+               rc = mdo_xattr_get(env, snd_o, snd_hsm_buf, XATTR_NAME_HSM);
                if (rc < 0)
                        GOTO(stop, rc);
 
@@ -1464,8 +1458,7 @@ static int mdd_swap_layouts(const struct lu_env *env, struct md_object *obj1,
                }
        }
 
-       rc = mdo_xattr_set(env, fst_o, snd_buf, XATTR_NAME_LOV, fst_fl, handle,
-                          mdd_object_capa(env, fst_o));
+       rc = mdo_xattr_set(env, fst_o, snd_buf, XATTR_NAME_LOV, fst_fl, handle);
        if (rc != 0)
                GOTO(stop, rc);
 
@@ -1474,11 +1467,9 @@ static int mdd_swap_layouts(const struct lu_env *env, struct md_object *obj1,
        } else {
                if (fst_buf->lb_buf != NULL)
                        rc = mdo_xattr_set(env, snd_o, fst_buf, XATTR_NAME_LOV,
-                                          LU_XATTR_REPLACE, handle,
-                                          mdd_object_capa(env, snd_o));
+                                          LU_XATTR_REPLACE, handle);
                else
-                       rc = mdo_xattr_del(env, snd_o, XATTR_NAME_LOV, handle,
-                                          mdd_object_capa(env, snd_o));
+                       rc = mdo_xattr_del(env, snd_o, XATTR_NAME_LOV, handle);
        }
 
        if (rc != 0) {
@@ -1490,11 +1481,9 @@ static int mdd_swap_layouts(const struct lu_env *env, struct md_object *obj1,
                        fst_lmm->lmm_oi = *saved_oi;
                        fst_lmm->lmm_layout_gen = cpu_to_le16(fst_gen - 1);
                        rc2 = mdo_xattr_set(env, fst_o, fst_buf, XATTR_NAME_LOV,
-                                           LU_XATTR_REPLACE, handle,
-                                           mdd_object_capa(env, fst_o));
+                                           LU_XATTR_REPLACE, handle);
                } else {
-                       rc2 = mdo_xattr_del(env, fst_o, XATTR_NAME_LOV, handle,
-                                           mdd_object_capa(env, fst_o));
+                       rc2 = mdo_xattr_del(env, fst_o, XATTR_NAME_LOV, handle);
                }
                if (rc2 < 0)
                        goto do_lbug;
@@ -1665,7 +1654,7 @@ static int mdd_open(const struct lu_env *env, struct md_object *obj,
 
        mdd_write_lock(env, mdd_obj, MOR_TGT_CHILD);
 
-       rc = mdd_la_get(env, mdd_obj, attr, BYPASS_CAPA);
+       rc = mdd_la_get(env, mdd_obj, attr);
        if (rc != 0)
                GOTO(out, rc);
 
@@ -1743,8 +1732,7 @@ again:
         }
 
         mdd_write_lock(env, mdd_obj, MOR_TGT_CHILD);
-       rc = mdd_la_get(env, mdd_obj, &ma->ma_attr,
-                       mdd_object_capa(env, mdd_obj));
+       rc = mdd_la_get(env, mdd_obj, &ma->ma_attr);
        if (rc != 0) {
                CERROR("Failed to get lu_attr of "DFID": %d\n",
                       PFID(mdd_object_fid(mdd_obj)), rc);
@@ -2052,7 +2040,6 @@ const struct md_object_operations mdd_obj_ops = {
        .moo_readpage           = mdd_readpage,
        .moo_readlink           = mdd_readlink,
        .moo_changelog          = mdd_changelog,
-       .moo_capa_get           = mdd_capa_get,
        .moo_object_sync        = mdd_object_sync,
        .moo_object_lock        = mdd_object_lock,
        .moo_object_unlock      = mdd_object_unlock,