repbody->ioepoch = o->mot_ioepoch;
}
} else if (flags & MDS_FMODE_EXEC) {
- rc = mdt_write_deny(o);
+ /* if file is released, we can't deny write because we must
+ * restore (write) it to access it.*/
+ if ((ma->ma_valid & MA_HSM) &&
+ (ma->ma_hsm.mh_flags & HS_RELEASED))
+ rc = 0;
+ else
+ rc = mdt_write_deny(o);
}
if (rc)
RETURN(rc);
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);
- ma->ma_need = MA_INODE;
+ ma->ma_need = MA_INODE | MA_HSM;
if (ma->ma_lmm_size > 0)
ma->ma_need |= MA_LOV;
struct mdt_lock_handle *lhc,
__u64 *ibits)
{
- struct md_attr *ma = &info->mti_attr;
- __u64 open_flags = info->mti_spec.sp_cr_flags;
- ldlm_mode_t lm = LCK_CR;
- bool try_layout = false;
- bool create_layout = false;
- int rc = 0;
+ struct md_attr *ma = &info->mti_attr;
+ __u64 open_flags = info->mti_spec.sp_cr_flags;
+ ldlm_mode_t lm = LCK_CR;
+ bool try_layout = false;
+ bool create_layout = false;
+ int rc = 0;
ENTRY;
*ibits = 0;
if (open_flags & MDS_OPEN_LOCK) {
if (open_flags & FMODE_WRITE)
lm = LCK_CW;
- else if (open_flags & MDS_FMODE_EXEC)
+ /* if file is released, we can't deny write because we must
+ * restore (write) it to access it. */
+ else if ((open_flags & MDS_FMODE_EXEC) &&
+ !((ma->ma_valid & MA_HSM) &&
+ (ma->ma_hsm.mh_flags & HS_RELEASED)))
lm = LCK_PR;
else
lm = LCK_CR;
}
created = 1;
} else {
- /* We have to get attr & lov ea for this object */
+ /* We have to get attr & LOV EA, HSM bits for this object */
+ ma->ma_need |= MA_HSM;
result = mdt_attr_get_complex(info, child, ma);
/*
* The object is on remote node, return its FID for remote open.