oh = container_of0(handle, struct osd_thandle, ot_super);
LASSERT(oh->ot_handle == NULL);
+ /* EA object consumes more credits than regular object: osd_mk_index
+ * vs. osd_mkreg: osd_mk_index will create 2 blocks for root_node and
+ * leaf_node, could involves the block, block bitmap, groups, GDT
+ * change for each block, so add 4 * 2 credits in that case. */
osd_trans_declare_op(env, oh, OSD_OT_CREATE,
- osd_dto_credits_noquota[DTO_OBJECT_CREATE]);
+ osd_dto_credits_noquota[DTO_OBJECT_CREATE] +
+ (dof->dof_type == DFT_INDEX) ? 4 * 2 : 0);
/* Reuse idle OI block may cause additional one OI block
* to be changed. */
osd_trans_declare_op(env, oh, OSD_OT_INSERT,
RETURN(-EPERM);
result = __osd_object_create(info, obj, attr, hint, dof, th);
- if (result == 0)
+ if (result == 0) {
result = __osd_oi_insert(env, obj, fid, th);
-
+ if (obj->oo_dt.do_body_ops == &osd_body_ops_new)
+ obj->oo_dt.do_body_ops = &osd_body_ops;
+ }
LASSERT(ergo(result == 0,
dt_object_exists(dt) && !dt_object_remote(dt)));
dot_ldp = (struct ldiskfs_dentry_param *)info->oti_ldp;
dot_ldp->edp_magic = 0;
+
return ldiskfs_add_dot_dotdot(oth->ot_handle, parent_dir,
- dir, dot_ldp, dot_dot_ldp);
+ dir, dot_ldp, dot_dot_ldp);
}
/**
fid, OI_CHECK_FLD) ?
LMAC_FID_ON_OST : 0, 0);
}
+ if (obj->oo_dt.do_body_ops == &osd_body_ops_new)
+ obj->oo_dt.do_body_ops = &osd_body_ops;
}
if (result == 0)
dir->oo_compat_dotdot_created = 1;
}
- /* ldiskfs_init_new_dir() doesn't call ldiskfs_mark_inode_dirty()
- * this seem as an optimization as usually it's called
- * later to refresh mtime of the parent. Lustre does not
- * update mtime in few cases (e.g. PENDING, .lustre)
- * we still need to transfer i_size/etc to the buffer cache */
- ldiskfs_mark_inode_dirty(oth->ot_handle, dir->oo_inode);
-
return result;
}