struct lu_attr *la,
struct linkea_data *data)
{
+ struct lu_fid tfid = *mdo2fid(c);
int rc;
- rc = mdo_declare_index_insert(env, p, mdo2fid(c), mdd_object_type(c),
+ if (OBD_FAIL_CHECK(OBD_FAIL_LFSCK_DANGLING3))
+ tfid.f_oid = cfs_fail_val;
+
+ rc = mdo_declare_index_insert(env, p, &tfid, mdd_object_type(c),
name->ln_name, handle);
if (rc != 0)
return rc;
struct mdd_object *mdd_sobj = md2mdd_obj(src_obj);
struct lu_attr *cattr = MDD_ENV_VAR(env, cattr);
struct lu_attr *tattr = MDD_ENV_VAR(env, tattr);
- struct mdd_device *mdd = mdo2mdd(src_obj);
- struct thandle *handle;
+ struct mdd_device *mdd = mdo2mdd(src_obj);
+ struct thandle *handle;
+ struct lu_fid *tfid = &mdd_env_info(env)->mti_fid2;
struct linkea_data *ldata = &mdd_env_info(env)->mti_link_data;
int rc;
ENTRY;
GOTO(out_unlock, rc);
}
- if (OBD_FAIL_CHECK(OBD_FAIL_LFSCK_DANGLING3)) {
- struct lu_fid tfid = *mdo2fid(mdd_sobj);
-
- tfid.f_oid++;
- rc = __mdd_index_insert_only(env, mdd_tobj, &tfid,
- mdd_object_type(mdd_sobj),
- name, handle);
- } else {
- rc = __mdd_index_insert_only(env, mdd_tobj, mdo2fid(mdd_sobj),
- mdd_object_type(mdd_sobj),
- name, handle);
- }
+ *tfid = *mdo2fid(mdd_sobj);
+ if (OBD_FAIL_CHECK(OBD_FAIL_LFSCK_DANGLING3))
+ tfid->f_oid = cfs_fail_val;
+ rc = __mdd_index_insert_only(env, mdd_tobj, tfid,
+ mdd_object_type(mdd_sobj), name, handle);
if (rc != 0) {
mdo_ref_del(env, mdd_sobj, handle);
GOTO(out_unlock, rc);
* failure, reset rc here */
rc = 0;
}
- EXIT;
+ EXIT;
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:
- 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:
- return rc;
+ return rc;
}
static int mdd_mark_orphan_object(const struct lu_env *env,
}
stop:
- mdd_trans_stop(env, mdd, rc, handle);
+ rc = mdd_trans_stop(env, mdd, rc, handle);
return rc;
}
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);
/* 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);
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);
}
static int mdd_declare_object_initialize(const struct lu_env *env,
struct mdd_object *parent,
struct mdd_object *child,
- struct lu_attr *attr,
+ const struct lu_attr *attr,
struct thandle *handle)
{
int rc;
ENTRY;
- /*
- * inode mode has been set in creation time, and it's based on umask,
- * la_mode and acl, don't set here again! (which will go wrong
- * because below function doesn't consider umask).
- * I'd suggest set all object attributes in creation time, see above.
- */
LASSERT(attr->la_valid & (LA_MODE | LA_TYPE));
- attr->la_valid &= ~(LA_MODE | LA_TYPE);
- rc = mdo_declare_attr_set(env, child, attr, handle);
- attr->la_valid |= LA_MODE | LA_TYPE;
- if (rc != 0 || !S_ISDIR(attr->la_mode))
- RETURN(rc);
+ if (!S_ISDIR(attr->la_mode))
+ RETURN(0);
rc = mdo_declare_index_insert(env, child, mdo2fid(child), S_IFDIR,
dot, handle);
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,
/* 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,
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;
}
struct dt_allocation_hint *hint,
struct thandle *handle)
{
+ const struct lu_buf *buf;
int rc;
mdd_write_lock(env, son, MOR_TGT_CHILD);
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,
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;
if (rc)
GOTO(stop, rc);
stop:
- mdd_trans_stop(env, mdd, rc, handle);
+ rc = mdd_trans_stop(env, mdd, rc, handle);
+
RETURN(rc);
}
EXIT;
err_insert:
if (rc != 0) {
- int rc2;
-
if (spec->sp_cr_flags & MDS_OPEN_VOLATILE)
rc2 = __mdd_orphan_del(env, son, handle);
else
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);
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);
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:
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);
struct thandle *handle;
struct dt_it *it;
const struct dt_it_ops *iops;
- int rc;
int result;
struct lu_dirent *ent;
+ int rc;
ENTRY;
OBD_ALLOC(ent, NAME_MAX + sizeof(*ent) + 1);
int recsize;
int is_dir;
bool target_exist = false;
- int rc1;
len = iops->key_size(env, it);
if (len == 0)
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:
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);
}
struct mdd_object *mdd_tobj = md2mdd_obj(tobj);
struct lu_attr *so_attr = MDD_ENV_VAR(env, cattr);
struct lu_attr *pattr = MDD_ENV_VAR(env, pattr);
+ bool created = false;
int rc;
ENTRY;
* the file is being opened by someone else right now */
mdd_read_lock(env, mdd_sobj, MOR_SRC_CHILD);
if (mdd_sobj->mod_count > 0) {
- CERROR("%s: "DFID"%s is already opened count %d: rc = %d\n",
+ CDEBUG(D_OTHER,
+ "%s: "DFID"%s is already opened count %d: rc = %d\n",
mdd2obd_dev(mdd)->obd_name,
PFID(mdd_object_fid(mdd_sobj)), lname->ln_name,
mdd_sobj->mod_count, -EBUSY);
lname, so_attr);
if (rc != 0)
GOTO(put, rc);
+ created = true;
}
LASSERT(mdd_object_exists(mdd_tobj));
ma);
if (rc != 0)
GOTO(put, rc);
+
+ /* newly created target was not locked, don't cache its attributes */
+ if (created)
+ mdd_invalidate(env, tobj);
put:
RETURN(rc);
}