b->blocks = 0;
/* if no object is allocated on osts, the size on mds is valid. b=22272 */
b->valid |= OBD_MD_FLSIZE | OBD_MD_FLBLOCKS;
- }
+ } else if ((ma->ma_valid & MA_LOV) && ma->ma_lmm &&
+ (ma->ma_lmm->lmm_pattern & LOV_PATTERN_F_RELEASED)) {
+ /* A released file stores its size on MDS. */
+ b->blocks = 0;
+ b->valid |= OBD_MD_FLSIZE | OBD_MD_FLBLOCKS;
+ }
if (fid) {
b->fid1 = *fid;
RETURN(rc);
}
+ /* if file is released, check if a restore is running */
+ if ((ma->ma_valid & MA_HSM) && (ma->ma_hsm.mh_flags & HS_RELEASED) &&
+ mdt_hsm_restore_is_running(info, mdt_object_fid(o))) {
+ repbody->t_state = MS_RESTORE;
+ repbody->valid |= OBD_MD_TSTATE;
+ }
+
is_root = lu_fid_eq(mdt_object_fid(o), &info->mti_mdt->mdt_md_root_fid);
/* the Lustre protocol supposes to return default striping
*/
child = mdt_object_find(info->mti_env, info->mti_mdt, child_fid);
- if (unlikely(IS_ERR(child)))
- GOTO(out_parent, rc = PTR_ERR(child));
- if (is_resent) {
- /* Do not take lock for resent case. */
- lock = ldlm_handle2lock(&lhc->mlh_reg_lh);
- LASSERTF(lock != NULL, "Invalid lock handle "LPX64"\n",
- lhc->mlh_reg_lh.cookie);
-
- res_id = &lock->l_resource->lr_name;
- if (!fid_res_name_eq(mdt_object_fid(child),
- &lock->l_resource->lr_name)) {
- LASSERTF(fid_res_name_eq(mdt_object_fid(parent),
- &lock->l_resource->lr_name),
- "Lock res_id: %lu/%lu/%lu, Fid: "DFID".\n",
- (unsigned long)res_id->name[0],
- (unsigned long)res_id->name[1],
- (unsigned long)res_id->name[2],
- PFID(mdt_object_fid(parent)));
- CWARN("Although resent, but still not get child lock"
- "parent:"DFID" child:"DFID"\n",
- PFID(mdt_object_fid(parent)),
- PFID(mdt_object_fid(child)));
- lustre_msg_clear_flags(req->rq_reqmsg, MSG_RESENT);
- LDLM_LOCK_PUT(lock);
- GOTO(relock, 0);
- }
- LDLM_LOCK_PUT(lock);
- rc = 0;
- } else {
+ if (unlikely(IS_ERR(child)))
+ GOTO(out_parent, rc = PTR_ERR(child));
+ if (is_resent) {
+ /* Do not take lock for resent case. */
+ lock = ldlm_handle2lock(&lhc->mlh_reg_lh);
+ LASSERTF(lock != NULL, "Invalid lock handle "LPX64"\n",
+ lhc->mlh_reg_lh.cookie);
+
+ res_id = &lock->l_resource->lr_name;
+ if (!fid_res_name_eq(mdt_object_fid(child),
+ &lock->l_resource->lr_name)) {
+ LASSERTF(fid_res_name_eq(mdt_object_fid(parent),
+ &lock->l_resource->lr_name),
+ "Lock res_id: "DLDLMRES", fid: "DFID"\n",
+ PLDLMRES(lock->l_resource),
+ PFID(mdt_object_fid(parent)));
+ CWARN("Although resent, but still not get child lock"
+ "parent:"DFID" child:"DFID"\n",
+ PFID(mdt_object_fid(parent)),
+ PFID(mdt_object_fid(child)));
+ lustre_msg_clear_flags(req->rq_reqmsg, MSG_RESENT);
+ LDLM_LOCK_PUT(lock);
+ GOTO(relock, 0);
+ }
+ LDLM_LOCK_PUT(lock);
+ rc = 0;
+ } else {
bool try_layout = false;
relock:
rc = mdt_getattr_internal(info, child, ma_need);
if (unlikely(rc != 0)) {
mdt_object_unlock(info, child, lhc, 1);
- } else if (lock) {
- /* Debugging code. */
- res_id = &lock->l_resource->lr_name;
- LDLM_DEBUG(lock, "Returning lock to client");
- LASSERTF(fid_res_name_eq(mdt_object_fid(child),
- &lock->l_resource->lr_name),
- "Lock res_id: %lu/%lu/%lu, Fid: "DFID".\n",
- (unsigned long)res_id->name[0],
- (unsigned long)res_id->name[1],
- (unsigned long)res_id->name[2],
- PFID(mdt_object_fid(child)));
+ } else if (lock) {
+ /* Debugging code. */
+ res_id = &lock->l_resource->lr_name;
+ LDLM_DEBUG(lock, "Returning lock to client");
+ LASSERTF(fid_res_name_eq(mdt_object_fid(child),
+ &lock->l_resource->lr_name),
+ "Lock res_id: "DLDLMRES", fid: "DFID"\n",
+ PLDLMRES(lock->l_resource),
+ PFID(mdt_object_fid(child)));
if (mdt_object_exists(child) && !mdt_object_remote(child))
mdt_pack_size2body(info, child);
}
o->lo_ops = &mdt_obj_ops;
mutex_init(&mo->mot_ioepoch_mutex);
mutex_init(&mo->mot_lov_mutex);
- RETURN(o);
- } else
- RETURN(NULL);
+ init_rwsem(&mo->mot_open_sem);
+ RETURN(o);
+ }
+ RETURN(NULL);
}
static int mdt_object_init(const struct lu_env *env, struct lu_object *o,
CDEBUG(D_INFO, "object free, fid = "DFID"\n",
PFID(lu_object_fid(o)));
- lu_object_fini(o);
- lu_object_header_fini(h);
+ LASSERT(atomic_read(&mo->mot_open_count) == 0);
+ LASSERT(atomic_read(&mo->mot_lease_count) == 0);
+
+ lu_object_fini(o);
+ lu_object_header_fini(h);
OBD_SLAB_FREE_PTR(mo, mdt_object_kmem);
- EXIT;
+ EXIT;
}
static int mdt_object_print(const struct lu_env *env, void *cookie,