*
* 2) send synchronous truncate RPC with just assigned id
*/
- LASSERT(attr != NULL);
+
+ /* there are few places in MDD code still passing NULL
+ * XXX: to be fixed soon */
+ if (attr == NULL)
+ RETURN(0);
+
if (attr->la_valid & LA_SIZE && attr->la_size > 0) {
LASSERT(!dt_object_exists(dt));
osp_object_assign_id(env, d, o);
RETURN(rc);
}
+ if (o->opo_new) {
+ /* no need in logging for new objects being created */
+ RETURN(0);
+ }
+
if (!(attr->la_valid & (LA_UID | LA_GID)))
RETURN(0);
if (!(attr->la_valid & (LA_UID | LA_GID)))
RETURN(0);
+ /* new object, the very first ->attr_set()
+ * initializing attributes needs no logging
+ * all subsequent one are subject to the
+ * logging and synchronization with OST */
+ if (o->opo_new) {
+ o->opo_new = 0;
+ RETURN(0);
+ }
+
/*
* once transaction is committed put proper command on
* the queue going to our OST
ENTRY;
+ /* should happen to non-0 OSP only so that at least one object
+ * has been already declared in the scenario and LOD should
+ * cleanup that */
+ if (OBD_FAIL_CHECK(OBD_FAIL_MDS_OSC_CREATE_FAIL) && d->opd_index == 1)
+ RETURN(-ENOSPC);
+
LASSERT(d->opd_last_used_file);
fid = lu_object_fid(&dt->do_lu);
/*
* There can be gaps in precreated ids and record to unlink llog
+ * XXX: we do not handle gaps yet, implemented before solution
+ * was found to be racy, so we disabled that. there is no
+ * point in making useless but expensive llog declaration.
*/
- rc = osp_sync_declare_add(env, o, MDS_UNLINK64_REC, th);
+ /* rc = osp_sync_declare_add(env, o, MDS_UNLINK64_REC, th); */
if (unlikely(!fid_is_zero(fid))) {
/* replay case: caller knows fid */
}
}
+ /* new object, the very first ->attr_set()
+ * initializing attributes needs no logging */
+ o->opo_new = 1;
+
osp_objid_buf_prep(osi, d, d->opd_index);
rc = dt_record_write(env, d->opd_last_used_file, &osi->osi_lb,
&osi->osi_off, th);