LDLM_LOCK_PUT(lock);
rc = 0;
} else {
- struct md_attr *ma;
relock:
- ma = &info->mti_attr;
-
OBD_FAIL_TIMEOUT(OBD_FAIL_MDS_RESEND, obd_timeout*2);
mdt_lock_handle_init(lhc);
mdt_lock_reg_init(lhc, LCK_PR);
GOTO(out_child, rc = -ESTALE);
}
- ma->ma_valid = 0;
- ma->ma_need = MA_INODE;
- rc = mo_attr_get(info->mti_env, next, ma);
- if (unlikely(rc != 0))
- GOTO(out_child, rc);
+ if (!(child_bits & MDS_INODELOCK_UPDATE)) {
+ struct md_attr *ma = &info->mti_attr;
- /* If the file has not been changed for some time, we return
- * not only a LOOKUP lock, but also an UPDATE lock and this
- * might save us RPC on later STAT. For directories, it also
- * let negative dentry starts 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 < cfs_time_current_sec())
- child_bits |= MDS_INODELOCK_UPDATE;
+ ma->ma_valid = 0;
+ ma->ma_need = MA_INODE;
+ rc = mo_attr_get(info->mti_env,
+ mdt_object_child(child), ma);
+ if (unlikely(rc != 0))
+ GOTO(out_child, rc);
+
+ /* If the file has not been changed for some time, we
+ * return not only a LOOKUP lock, but also an UPDATE
+ * lock and this might save us RPC on later STAT. For
+ * directories, it also let negative dentry starts
+ * 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 < cfs_time_current_sec())
+ child_bits |= MDS_INODELOCK_UPDATE;
+ }
rc = mdt_object_lock(info, child, lhc, child_bits,
MDT_CROSS_LOCK);