#define MDS_OPEN_PCC 010000000000000ULL /* PCC: auto RW-PCC cache attach
* for newly created file */
#define MDS_OP_WITH_FID 020000000000000ULL /* operation carried out by FID */
+#define MDS_OPEN_DEFAULT_LMV 040000000000000ULL /* open fetches default LMV */
/* lustre internal open flags, which should not be set from user space */
#define MDS_OPEN_FL_INTERNAL (MDS_OPEN_HAS_EA | MDS_OPEN_HAS_OBJS | \
MDS_OPEN_OWNEROVERRIDE | MDS_OPEN_LOCK | \
MDS_OPEN_BY_FID | MDS_OPEN_LEASE | \
MDS_OPEN_RELEASE | MDS_OPEN_RESYNC | \
- MDS_OPEN_PCC | MDS_OP_WITH_FID)
+ MDS_OPEN_PCC | MDS_OP_WITH_FID | \
+ MDS_OPEN_DEFAULT_LMV)
/********* Changelogs **********/
rec->cr_archive_id = op_data->op_archive_id;
}
}
+ cr_flags |= MDS_OPEN_DEFAULT_LMV;
set_mrc_cr_flags(rec, cr_flags);
}
*/
req_capsule_set_size(&req->rq_pill, &RMF_NIOBUF_INLINE, RCL_SERVER,
sizeof(struct niobuf_remote));
+ req_capsule_set_size(&req->rq_pill, &RMF_DEFAULT_MDT_MD, RCL_SERVER,
+ sizeof(struct lmv_user_md));
ptlrpc_request_set_replen(req);
/* Get real repbuf allocated size as rounded up power of 2 */
!(body->mbo_valid & OBD_MD_ENCCTX))
req_capsule_shrink(pill, &RMF_FILE_ENCCTX, 0, RCL_SERVER);
+ /* Shrink optional default LMV buffer if it is not used */
+ if (req_capsule_has_field(pill, &RMF_DEFAULT_MDT_MD, RCL_SERVER) &&
+ req_capsule_get_size(pill, &RMF_DEFAULT_MDT_MD, RCL_SERVER) != 0 &&
+ !(body->mbo_valid & OBD_MD_DEFAULT_MEA))
+ req_capsule_shrink(pill, &RMF_DEFAULT_MDT_MD, 0, RCL_SERVER);
+
/*
* Some more field should be shrinked if needed.
* This should be done by those who added fields to reply message.
*/
static void mdt_prep_ma_buf_from_rep(struct mdt_thread_info *info,
struct mdt_object *obj,
- struct md_attr *ma)
+ struct md_attr *ma, __u64 open_flags)
{
+ struct req_capsule *pill;
+
if (ma->ma_lmv || ma->ma_lmm) {
CDEBUG(D_INFO, DFID " %s already set.\n",
PFID(mdt_object_fid(obj)),
return;
}
+ pill = info->mti_pill;
if (S_ISDIR(obj->mot_header.loh_attr)) {
- ma->ma_lmv = req_capsule_server_get(info->mti_pill,
- &RMF_MDT_MD);
- ma->ma_lmv_size = req_capsule_get_size(info->mti_pill,
- &RMF_MDT_MD,
+ ma->ma_lmv = req_capsule_server_get(pill, &RMF_MDT_MD);
+ ma->ma_lmv_size = req_capsule_get_size(pill, &RMF_MDT_MD,
RCL_SERVER);
if (ma->ma_lmv_size > 0)
ma->ma_need |= MA_LMV;
+
+ if (open_flags & MDS_OPEN_DEFAULT_LMV) {
+ ma->ma_default_lmv = req_capsule_server_get(pill,
+ &RMF_DEFAULT_MDT_MD);
+ ma->ma_default_lmv_size = req_capsule_get_size(pill,
+ &RMF_DEFAULT_MDT_MD,
+ RCL_SERVER);
+ if (ma->ma_default_lmv_size > 0)
+ ma->ma_need |= MA_LMV_DEF;
+ }
} else {
- ma->ma_lmm = req_capsule_server_get(info->mti_pill,
- &RMF_MDT_MD);
- ma->ma_lmm_size = req_capsule_get_size(info->mti_pill,
- &RMF_MDT_MD,
+ ma->ma_lmm = req_capsule_server_get(pill, &RMF_MDT_MD);
+ ma->ma_lmm_size = req_capsule_get_size(pill, &RMF_MDT_MD,
RCL_SERVER);
if (ma->ma_lmm_size > 0)
ma->ma_need |= MA_LOV;
repbody->mbo_valid |= OBD_MD_FLDIREA | OBD_MD_MEA;
}
+ if (ma->ma_valid & MA_LMV_DEF) {
+ LASSERT(ma->ma_default_lmv_size != 0);
+ LASSERT(isdir);
+ repbody->mbo_valid |= OBD_MD_FLDIREA | OBD_MD_DEFAULT_MEA;
+ }
+
if (open_flags & MDS_FMODE_WRITE)
rc = mdt_write_get(o);
else if (open_flags & MDS_FMODE_EXEC)
mdt_set_disposition(info, rep,
DISP_OPEN_CREATE);
- mdt_prep_ma_buf_from_rep(info, o, ma);
+ mdt_prep_ma_buf_from_rep(info, o, ma, open_flags);
rc = mdt_attr_get_complex(info, o, ma);
if (rc)
GOTO(out, rc);
mdt_set_disposition(info, rep, (DISP_IT_EXECD | DISP_LOOKUP_EXECD));
- mdt_prep_ma_buf_from_rep(info, o, ma);
+ mdt_prep_ma_buf_from_rep(info, o, ma, open_flags);
if (open_flags & MDS_OPEN_RELEASE)
ma->ma_need |= MA_HSM;
rc = mdt_attr_get_complex(info, o, ma);
if (rc)
goto out;
- mdt_prep_ma_buf_from_rep(info, o, ma);
+ mdt_prep_ma_buf_from_rep(info, o, ma, open_flags);
rc = mdt_attr_get_complex(info, o, ma);
if (rc != 0)
GOTO(out, rc);
mdt_clear_disposition(info, ldlm_rep, DISP_OPEN_CREATE);
GOTO(out_child, result);
} else {
- mdt_prep_ma_buf_from_rep(info, child, ma);
+ mdt_prep_ma_buf_from_rep(info, child, ma, open_flags);
/* XXX: we should call this once, see few lines below */
if (result == 0)
result = mdt_attr_get_complex(info, child, ma);
/* We have to get attr & LOV EA & HSM for this
* object. */
- mdt_prep_ma_buf_from_rep(info, child, ma);
+ mdt_prep_ma_buf_from_rep(info, child, ma, open_flags);
ma->ma_need |= MA_HSM;
result = mdt_attr_get_complex(info, child, ma);
if (result != 0)
struct mdt_object *mo;
struct mdt_body *repbody;
ktime_t kstart = ktime_get();
- int rc, rc2;
+ int rc;
ENTRY;
DEBUG_REQ(D_INODE, req, "setattr "DFID" %x", PFID(rr->rr_fid1),
ktime_us_delta(ktime_get(), kstart));
mdt_client_compatibility(info);
- rc2 = mdt_fix_reply(info);
- if (rc == 0)
- rc = rc2;
return rc;
}
struct mdt_body *repbody;
struct md_layout_change layout = { .mlc_mirror_id = rr->rr_mirror_id };
bool lease_broken;
- int rc, rc2;
+ int rc;
ENTRY;
DEBUG_REQ(D_INODE, req, DFID", FLR file resync", PFID(rr->rr_fid1));
mdt_object_put(info->mti_env, mo);
out:
mdt_client_compatibility(info);
- rc2 = mdt_fix_reply(info);
- if (rc == 0)
- rc = rc2;
return rc;
}
&RMF_NIOBUF_INLINE,
&RMF_FILE_SECCTX,
&RMF_FILE_ENCCTX,
+ &RMF_DEFAULT_MDT_MD,
};
static const struct req_msg_field *ldlm_intent_getattr_client[] = {
(long long)MDS_OPEN_RESYNC);
LASSERTF(MDS_OPEN_PCC == 00000000010000000000000ULL, "found 0%.22lloULL\n",
(long long)MDS_OPEN_PCC);
+ LASSERTF(MDS_OPEN_DEFAULT_LMV == 00000000040000000000000ULL, "found 0%.22lloULL\n",
+ (long long)MDS_OPEN_DEFAULT_LMV);
LASSERTF(LUSTRE_SYNC_FL == 0x00000008UL, "found 0x%.8xUL\n",
(unsigned)LUSTRE_SYNC_FL);
LASSERTF(LUSTRE_IMMUTABLE_FL == 0x00000010UL, "found 0x%.8xUL\n",
CHECK_VALUE_64O(MDS_OPEN_LEASE);
CHECK_VALUE_64O(MDS_OPEN_RESYNC);
CHECK_VALUE_64O(MDS_OPEN_PCC);
+ CHECK_VALUE_64O(MDS_OPEN_DEFAULT_LMV);
/* these should be identical to their EXT3_*_FL counterparts, and
* are redefined only to avoid dragging in ext3_fs.h */
(long long)MDS_OPEN_RESYNC);
LASSERTF(MDS_OPEN_PCC == 00000000010000000000000ULL, "found 0%.22lloULL\n",
(long long)MDS_OPEN_PCC);
+ LASSERTF(MDS_OPEN_DEFAULT_LMV == 00000000040000000000000ULL, "found 0%.22lloULL\n",
+ (long long)MDS_OPEN_DEFAULT_LMV);
LASSERTF(LUSTRE_SYNC_FL == 0x00000008UL, "found 0x%.8xUL\n",
(unsigned)LUSTRE_SYNC_FL);
LASSERTF(LUSTRE_IMMUTABLE_FL == 0x00000010UL, "found 0x%.8xUL\n",