static struct lu_context_key osd_key;
static struct dt_object_operations osd_obj_ops;
static struct dt_body_operations osd_body_ops;
+const static struct dt_body_operations osd_body_ops_new;
static char *osd_object_tag = "osd_object";
static char *root_tag = "osd_mount, rootdb";
case DFT_NODE:
/* first, we'll create new object */
udmu_tx_hold_bonus(oh->ot_tx, DMU_NEW_OBJECT);
+ obj->oo_dt.do_body_ops = &osd_body_ops_new;
break;
default:
{
struct osd_object *obj = osd_dt_obj(dt);
struct osd_thandle *oh;
+ uint64_t oid;
vnattr_t va;
ENTRY;
oh = container_of0(th, struct osd_thandle, ot_super);
- udmu_object_getattr(obj->oo_db, &va);
- if (va.va_size < pos + size)
- udmu_tx_hold_bonus(oh->ot_tx, udmu_object_get_id(obj->oo_db));
+ if (obj->oo_db) {
+ oid = udmu_object_get_id(obj->oo_db);
+ udmu_object_getattr(obj->oo_db, &va);
+ if (va.va_size < pos + size)
+ udmu_tx_hold_bonus(oh->ot_tx, oid);
+ } else {
+ oid = DMU_NEW_OBJECT;
+ }
- udmu_tx_hold_write(oh->ot_tx, udmu_object_get_id(obj->oo_db),
- pos, size);
+ udmu_tx_hold_write(oh->ot_tx, oid, pos, size);
RETURN(0);
}
return 0;
}
+const static struct dt_body_operations osd_body_ops_new = {
+ .dbo_declare_write = osd_declare_write,
+};
+
static struct dt_body_operations osd_body_ops = {
.dbo_read = osd_read,
.dbo_declare_write = osd_declare_write,