/* get type from src, can be remote req */
rc = mo_attr_get(ctx, md_object_next(mo_s), tmp_ma);
- if (rc == 0 && ma != NULL)
+ if (rc == 0) {
ma->ma_attr.la_mode = tmp_ma->ma_attr.la_mode;
-
+ ma->ma_attr.la_flags = tmp_ma->ma_attr.la_flags;
+ ma->ma_attr.la_valid |= LA_MODE | LA_FLAGS;
+ }
lu_object_put(ctx, &mo_s->mo_lu);
return rc;
}
rc = __cmm_mode_get(ctx, md_obj2dev(mo_po), lf, ma);
if (rc != 0)
RETURN(rc);
+
if (mo_t && lu_object_exists(&mo_t->mo_lu) < 0) {
/* mo_t is remote object and there is RPC to unlink it */
rc = mo_ref_del(ctx, md_object_next(mo_t), ma);
int rc;
ENTRY;
- rc = __cmm_mode_get(ctx, md_obj2dev(mo), fid, NULL);
+ cmi = lu_context_key_get(ctx, &cmm_thread_key);
+ rc = __cmm_mode_get(ctx, md_obj2dev(mo), fid, &cmi->cmi_ma);
if (rc)
RETURN(rc);
- cmi = lu_context_key_get(ctx, &cmm_thread_key);
if (!S_ISDIR(cmi->cmi_ma.ma_attr.la_mode))
RETURN(0);
LASSERT(ma->ma_attr.la_mode & S_IFMT);
is_dir = S_ISDIR(ma->ma_attr.la_mode);
-
+
+ if (ma->ma_attr.la_valid & LA_FLAGS &&
+ ma->ma_attr.la_flags & (LUSTRE_APPEND_FL | LUSTRE_IMMUTABLE_FL))
+ RETURN(-EPERM);
+
if (tobj)
mdd_tobj = md2mdd_obj(tobj);