}
rc = mdt_getattr_internal(info, child, 0);
- if (unlikely(rc != 0))
+ if (unlikely(rc != 0)) {
mdt_object_unlock(info, child, lhc, 1);
+ RETURN(rc);
+ }
- mdt_pack_secctx_in_reply(info, child);
-
+ rc = mdt_pack_secctx_in_reply(info, child);
+ if (unlikely(rc))
+ mdt_object_unlock(info, child, lhc, 1);
RETURN(rc);
}
mdt_lock_reg_init(lhc, LCK_PR);
if (!(child_bits & MDS_INODELOCK_UPDATE) &&
- mdt_object_exists(child) && !mdt_object_remote(child)) {
+ !mdt_object_remote(child)) {
struct md_attr *ma = &info->mti_attr;
ma->ma_valid = 0;
* lock and this might save us RPC on later STAT. For
* directories, it also let negative dentry cache start
* working for this dir. */
- if (ma->ma_valid & MA_INODE &&
- ma->ma_attr.la_valid & LA_CTIME &&
- info->mti_mdt->mdt_namespace->ns_ctime_age_limit +
- ma->ma_attr.la_ctime < ktime_get_real_seconds())
- child_bits |= MDS_INODELOCK_UPDATE;
- }
+ if (ma->ma_valid & MA_INODE &&
+ ma->ma_attr.la_valid & LA_CTIME &&
+ info->mti_mdt->mdt_namespace->ns_ctime_age_limit +
+ ma->ma_attr.la_ctime < ktime_get_real_seconds())
+ child_bits |= MDS_INODELOCK_UPDATE;
+ }
/* layout lock must be granted in a best-effort way
* for IT operations */
GOTO(out_child, rc);
}
- mdt_pack_secctx_in_reply(info, child);
+ rc = mdt_pack_secctx_in_reply(info, child);
+ if (unlikely(rc)) {
+ mdt_object_unlock(info, child, lhc, 1);
+ GOTO(out_child, rc);
+ }
lock = ldlm_handle2lock(&lhc->mlh_reg_lh);
if (lock) {
PLDLMRES(lock->l_resource),
PFID(mdt_object_fid(child)));
- if (mdt_object_exists(child) &&
- S_ISREG(lu_object_attr(&child->mot_obj)) &&
+ if (S_ISREG(lu_object_attr(&child->mot_obj)) &&
!mdt_object_remote(child) && child != parent) {
mdt_object_put(info->mti_env, child);
rc = mdt_pack_size2body(info, child_fid,
struct linkea_data *ldata);
int mdt_close_internal(struct mdt_thread_info *info, struct ptlrpc_request *req,
struct mdt_body *repbody);
-void mdt_pack_secctx_in_reply(struct mdt_thread_info *info,
- struct mdt_object *child);
+int mdt_pack_secctx_in_reply(struct mdt_thread_info *info,
+ struct mdt_object *child);
static inline struct mdt_device *mdt_dev(struct lu_device *d)
{
RETURN(rc);
}
-void mdt_pack_secctx_in_reply(struct mdt_thread_info *info,
- struct mdt_object *child)
+int mdt_pack_secctx_in_reply(struct mdt_thread_info *info,
+ struct mdt_object *child)
{
char *secctx_name;
struct lu_buf *buffer;
struct mdt_body *repbody;
struct req_capsule *pill = info->mti_pill;
- int rc;
+ int rc = 0;
if (req_capsule_has_field(pill, &RMF_FILE_SECCTX, RCL_SERVER) &&
req_capsule_get_size(pill, &RMF_FILE_SECCTX, RCL_SERVER) != 0) {
if (rc < buffer->lb_len)
req_capsule_shrink(pill, &RMF_FILE_SECCTX, rc,
RCL_SERVER);
+ rc = 0;
} else {
CDEBUG(D_SEC,
"security context not found for "DFID": rc = %d\n",
PFID(mdt_object_fid(child)), rc);
req_capsule_shrink(pill, &RMF_FILE_SECCTX, 0,
RCL_SERVER);
+ /* handling -ENOENT is important because it may change
+ * object state in DNE env dropping LOHA_EXISTS flag,
+ * it is important to return that to the caller.
+ * Check LU-13115 for details.
+ */
+ if (rc != -ENOENT)
+ rc = 0;
}
}
+ return rc;
}
if (rc != 0)
GOTO(out, rc);
- mdt_pack_secctx_in_reply(info, o);
+ rc = mdt_pack_secctx_in_reply(info, o);
+ if (unlikely(rc))
+ GOTO(out, rc);
rc = mdt_finish_open(info, NULL, o, open_flags, 0, rep);
} else {
}
}
- mdt_pack_secctx_in_reply(info, child);
+ rc = mdt_pack_secctx_in_reply(info, child);
+ if (unlikely(rc))
+ GOTO(out_child, result = rc);
rc = mdt_check_resent_lock(info, child, lhc);
if (rc < 0) {