Whamcloud - gitweb
LU-8514 mdd: transaction failure should be checked
[fs/lustre-release.git] / lustre / mdd / mdd_dir.c
index bb96d7c..8417a75 100644 (file)
@@ -1385,21 +1385,20 @@ static int mdd_link(const struct lu_env *env, struct md_object *tgt_obj,
                 * failure, reset rc here */
                rc = 0;
        }
                 * failure, reset rc here */
                rc = 0;
        }
-        EXIT;
+       EXIT;
 out_unlock:
 out_unlock:
-        mdd_write_unlock(env, mdd_sobj);
-        if (rc == 0)
+       mdd_write_unlock(env, mdd_sobj);
+       if (rc == 0)
                rc = mdd_changelog_ns_store(env, mdd, CL_HARDLINK, 0, mdd_sobj,
                                            mdo2fid(mdd_tobj), NULL, NULL,
                                            lname, NULL, handle);
 stop:
                rc = mdd_changelog_ns_store(env, mdd, CL_HARDLINK, 0, mdd_sobj,
                                            mdo2fid(mdd_tobj), NULL, NULL,
                                            lname, NULL, handle);
 stop:
-       mdd_trans_stop(env, mdd, rc, handle);
-
+       rc = mdd_trans_stop(env, mdd, rc, handle);
        if (is_vmalloc_addr(ldata->ld_buf))
                /* if we vmalloced a large buffer drop it */
                lu_buf_free(ldata->ld_buf);
 out_pending:
        if (is_vmalloc_addr(ldata->ld_buf))
                /* if we vmalloced a large buffer drop it */
                lu_buf_free(ldata->ld_buf);
 out_pending:
-        return rc;
+       return rc;
 }
 
 static int mdd_mark_orphan_object(const struct lu_env *env,
 }
 
 static int mdd_mark_orphan_object(const struct lu_env *env,
@@ -1757,7 +1756,7 @@ cleanup:
        }
 
 stop:
        }
 
 stop:
-       mdd_trans_stop(env, mdd, rc, handle);
+       rc = mdd_trans_stop(env, mdd, rc, handle);
 
        return rc;
 }
 
        return rc;
 }
@@ -1777,9 +1776,11 @@ static int mdd_cd_sanity_check(const struct lu_env *env,
         RETURN(0);
 }
 
         RETURN(0);
 }
 
-static int mdd_create_data(const struct lu_env *env, struct md_object *pobj,
-                           struct md_object *cobj, const struct md_op_spec *spec,
-                           struct md_attr *ma)
+static int mdd_create_data(const struct lu_env *env,
+                          struct md_object *pobj,
+                          struct md_object *cobj,
+                          const struct md_op_spec *spec,
+                          struct md_attr *ma)
 {
        struct mdd_device *mdd = mdo2mdd(cobj);
        struct mdd_object *mdd_pobj = md2mdd_obj(pobj);
 {
        struct mdd_device *mdd = mdo2mdd(cobj);
        struct mdd_object *mdd_pobj = md2mdd_obj(pobj);
@@ -1811,14 +1812,14 @@ static int mdd_create_data(const struct lu_env *env, struct md_object *pobj,
        /* calling ->ah_make_hint() is used to transfer information from parent */
        mdd_object_make_hint(env, mdd_pobj, son, attr, spec, hint);
 
        /* calling ->ah_make_hint() is used to transfer information from parent */
        mdd_object_make_hint(env, mdd_pobj, son, attr, spec, hint);
 
-        handle = mdd_trans_create(env, mdd);
-        if (IS_ERR(handle))
-                GOTO(out_free, rc = PTR_ERR(handle));
+       handle = mdd_trans_create(env, mdd);
+       if (IS_ERR(handle))
+               GOTO(out_free, rc = PTR_ERR(handle));
 
 
-        /*
-         * XXX: Setting the lov ea is not locked but setting the attr is locked?
-         * Should this be fixed?
-         */
+       /*
+        * XXX: Setting the lov ea is not locked but setting the attr is locked?
+        * Should this be fixed?
+        */
        CDEBUG(D_OTHER, "ea %p/%u, cr_flags "LPO64", no_create %u\n",
               spec->u.sp_ea.eadata, spec->u.sp_ea.eadatalen,
               spec->sp_cr_flags, spec->no_create);
        CDEBUG(D_OTHER, "ea %p/%u, cr_flags "LPO64", no_create %u\n",
               spec->u.sp_ea.eadata, spec->u.sp_ea.eadatalen,
               spec->sp_cr_flags, spec->no_create);
@@ -1852,7 +1853,8 @@ static int mdd_create_data(const struct lu_env *env, struct md_object *pobj,
        rc = mdd_changelog_data_store(env, mdd, CL_LAYOUT, 0, son, handle);
 
 stop:
        rc = mdd_changelog_data_store(env, mdd, CL_LAYOUT, 0, son, handle);
 
 stop:
-       mdd_trans_stop(env, mdd, rc, handle);
+       rc = mdd_trans_stop(env, mdd, rc, handle);
+
 out_free:
        RETURN(rc);
 }
 out_free:
        RETURN(rc);
 }
@@ -2016,6 +2018,7 @@ static int mdd_declare_object_create(const struct lu_env *env,
                                     struct lu_buf *acl_buf,
                                     struct dt_allocation_hint *hint)
 {
                                     struct lu_buf *acl_buf,
                                     struct dt_allocation_hint *hint)
 {
+       const struct lu_buf *buf;
        int rc;
 
        rc = mdd_declare_object_create_internal(env, p, c, attr, handle, spec,
        int rc;
 
        rc = mdd_declare_object_create_internal(env, p, c, attr, handle, spec,
@@ -2051,8 +2054,6 @@ static int mdd_declare_object_create(const struct lu_env *env,
        /* replay case, create LOV EA from client data */
        if (spec->no_create ||
            (spec->sp_cr_flags & MDS_OPEN_HAS_EA && S_ISREG(attr->la_mode))) {
        /* replay case, create LOV EA from client data */
        if (spec->no_create ||
            (spec->sp_cr_flags & MDS_OPEN_HAS_EA && S_ISREG(attr->la_mode))) {
-               const struct lu_buf *buf;
-
                buf = mdd_buf_get_const(env, spec->u.sp_ea.eadata,
                                        spec->u.sp_ea.eadatalen);
                rc = mdo_declare_xattr_set(env, c, buf, XATTR_NAME_LOV, 0,
                buf = mdd_buf_get_const(env, spec->u.sp_ea.eadata,
                                        spec->u.sp_ea.eadatalen);
                rc = mdo_declare_xattr_set(env, c, buf, XATTR_NAME_LOV, 0,
@@ -2072,6 +2073,16 @@ static int mdd_declare_object_create(const struct lu_env *env,
                 if (rc)
                         GOTO(out, rc);
         }
                 if (rc)
                         GOTO(out, rc);
         }
+
+       if (spec->sp_cr_file_secctx_name != NULL) {
+               buf = mdd_buf_get_const(env, spec->sp_cr_file_secctx,
+                                       spec->sp_cr_file_secctx_size);
+               rc = mdo_declare_xattr_set(env, c, buf,
+                                          spec->sp_cr_file_secctx_name, 0,
+                                          handle);
+               if (rc < 0)
+                       GOTO(out, rc);
+       }
 out:
        return rc;
 }
 out:
        return rc;
 }
@@ -2182,6 +2193,7 @@ static int mdd_object_create(const struct lu_env *env, struct mdd_object *pobj,
                             struct dt_allocation_hint *hint,
                             struct thandle *handle)
 {
                             struct dt_allocation_hint *hint,
                             struct thandle *handle)
 {
+       const struct lu_buf    *buf;
        int                     rc;
 
        mdd_write_lock(env, son, MOR_TGT_CHILD);
        int                     rc;
 
        mdd_write_lock(env, son, MOR_TGT_CHILD);
@@ -2217,8 +2229,6 @@ static int mdd_object_create(const struct lu_env *env, struct mdd_object *pobj,
        if (spec->no_create ||
            (S_ISREG(attr->la_mode) && spec->sp_cr_flags & MDS_OPEN_HAS_EA) ||
            S_ISDIR(attr->la_mode)) {
        if (spec->no_create ||
            (S_ISREG(attr->la_mode) && spec->sp_cr_flags & MDS_OPEN_HAS_EA) ||
            S_ISDIR(attr->la_mode)) {
-               const struct lu_buf *buf;
-
                buf = mdd_buf_get_const(env, spec->u.sp_ea.eadata,
                                        spec->u.sp_ea.eadatalen);
                rc = mdo_xattr_set(env, son, buf,
                buf = mdd_buf_get_const(env, spec->u.sp_ea.eadata,
                                        spec->u.sp_ea.eadatalen);
                rc = mdo_xattr_set(env, son, buf,
@@ -2268,6 +2278,15 @@ static int mdd_object_create(const struct lu_env *env, struct mdd_object *pobj,
                        GOTO(err_initlized, rc = -EFAULT);
        }
 
                        GOTO(err_initlized, rc = -EFAULT);
        }
 
+       if (spec->sp_cr_file_secctx_name != NULL) {
+               buf = mdd_buf_get_const(env, spec->sp_cr_file_secctx,
+                                       spec->sp_cr_file_secctx_size);
+               rc = mdo_xattr_set(env, son, buf, spec->sp_cr_file_secctx_name,
+                                  0, handle);
+               if (rc < 0)
+                       GOTO(err_initlized, rc);
+       }
+
 err_initlized:
        if (unlikely(rc != 0)) {
                int rc2;
 err_initlized:
        if (unlikely(rc != 0)) {
                int rc2;
@@ -2326,7 +2345,8 @@ static int mdd_index_delete(const struct lu_env *env,
        if (rc)
                GOTO(stop, rc);
 stop:
        if (rc)
                GOTO(stop, rc);
 stop:
-       mdd_trans_stop(env, mdd, rc, handle);
+       rc = mdd_trans_stop(env, mdd, rc, handle);
+
        RETURN(rc);
 }
 
        RETURN(rc);
 }
 
@@ -2468,8 +2488,6 @@ static int mdd_create(const struct lu_env *env, struct md_object *pobj,
        EXIT;
 err_insert:
        if (rc != 0) {
        EXIT;
 err_insert:
        if (rc != 0) {
-               int rc2;
-
                if (spec->sp_cr_flags & MDS_OPEN_VOLATILE)
                        rc2 = __mdd_orphan_del(env, son, handle);
                else
                if (spec->sp_cr_flags & MDS_OPEN_VOLATILE)
                        rc2 = __mdd_orphan_del(env, son, handle);
                else
@@ -3038,7 +3056,7 @@ cleanup:
                                            ltname, lsname, handle);
 
 stop:
                                            ltname, lsname, handle);
 
 stop:
-       mdd_trans_stop(env, mdd, rc, handle);
+       rc = mdd_trans_stop(env, mdd, rc, handle);
 
 out_pending:
        mdd_object_put(env, mdd_sobj);
 
 out_pending:
        mdd_object_put(env, mdd_sobj);
@@ -3300,7 +3318,6 @@ static int mdd_migrate_xattrs(const struct lu_env *env,
        int                     list_xsize;
        struct lu_buf           list_xbuf;
        int                     rc;
        int                     list_xsize;
        struct lu_buf           list_xbuf;
        int                     rc;
-       int                     rc1;
 
        /* retrieve xattr list from the old object */
        list_xsize = mdo_xattr_list(env, mdd_sobj, &LU_BUF_NULL);
 
        /* retrieve xattr list from the old object */
        list_xsize = mdo_xattr_list(env, mdd_sobj, &LU_BUF_NULL);
@@ -3375,9 +3392,7 @@ static int mdd_migrate_xattrs(const struct lu_env *env,
                if (rc != 0)
                        GOTO(stop_trans, rc);
 stop_trans:
                if (rc != 0)
                        GOTO(stop_trans, rc);
 stop_trans:
-               rc1 = mdd_trans_stop(env, mdd, rc, handle);
-               if (rc == 0)
-                       rc = rc1;
+               rc = mdd_trans_stop(env, mdd, rc, handle);
                if (rc != 0)
                        GOTO(out, rc);
 next:
                if (rc != 0)
                        GOTO(out, rc);
 next:
@@ -3579,13 +3594,8 @@ static int mdd_migrate_create(const struct lu_env *env,
        la_flag->la_flags = la->la_flags | LUSTRE_IMMUTABLE_FL;
        rc = mdo_attr_set(env, mdd_sobj, la_flag, handle);
 stop_trans:
        la_flag->la_flags = la->la_flags | LUSTRE_IMMUTABLE_FL;
        rc = mdo_attr_set(env, mdd_sobj, la_flag, handle);
 stop_trans:
-       if (handle != NULL) {
-               int rc1;
-
-               rc1 = mdd_trans_stop(env, mdd, rc, handle);
-               if (rc == 0)
-                       rc = rc1;
-       }
+       if (handle != NULL)
+               rc = mdd_trans_stop(env, mdd, rc, handle);
 out_free:
        if (lmm_buf.lb_buf != NULL)
                OBD_FREE(lmm_buf.lb_buf, lmm_buf.lb_len);
 out_free:
        if (lmm_buf.lb_buf != NULL)
                OBD_FREE(lmm_buf.lb_buf, lmm_buf.lb_len);
@@ -3602,9 +3612,9 @@ static int mdd_migrate_entries(const struct lu_env *env,
        struct thandle          *handle;
        struct dt_it            *it;
        const struct dt_it_ops  *iops;
        struct thandle          *handle;
        struct dt_it            *it;
        const struct dt_it_ops  *iops;
-       int                      rc;
        int                      result;
        struct lu_dirent        *ent;
        int                      result;
        struct lu_dirent        *ent;
+       int                      rc;
        ENTRY;
 
        OBD_ALLOC(ent, NAME_MAX + sizeof(*ent) + 1);
        ENTRY;
 
        OBD_ALLOC(ent, NAME_MAX + sizeof(*ent) + 1);
@@ -3640,7 +3650,6 @@ static int mdd_migrate_entries(const struct lu_env *env,
                int                     recsize;
                int                     is_dir;
                bool                    target_exist = false;
                int                     recsize;
                int                     is_dir;
                bool                    target_exist = false;
-               int                     rc1;
 
                len = iops->key_size(env, it);
                if (len == 0)
 
                len = iops->key_size(env, it);
                if (len == 0)
@@ -3774,10 +3783,7 @@ static int mdd_migrate_entries(const struct lu_env *env,
 out_put:
                mdd_write_unlock(env, child);
                mdd_object_put(env, child);
 out_put:
                mdd_write_unlock(env, child);
                mdd_object_put(env, child);
-               rc1 = mdd_trans_stop(env, mdd, rc, handle);
-               if (rc == 0)
-                       rc = rc1;
-
+               rc = mdd_trans_stop(env, mdd, rc, handle);
                if (rc != 0)
                        GOTO(out, rc);
 next:
                if (rc != 0)
                        GOTO(out, rc);
 next:
@@ -4072,7 +4078,7 @@ out_unlock:
        mdd_write_unlock(env, mdd_sobj);
 
 stop_trans:
        mdd_write_unlock(env, mdd_sobj);
 
 stop_trans:
-       mdd_trans_stop(env, mdd, rc, handle);
+       rc = mdd_trans_stop(env, mdd, rc, handle);
 
        RETURN(rc);
 }
 
        RETURN(rc);
 }