ENTRY;
- ls = container_of0(o->lo_dev, struct ls_device, ls_top_dev.dd_lu_dev);
+ ls = container_of(o->lo_dev, struct ls_device, ls_top_dev.dd_lu_dev);
under = &ls->ls_osd->dd_lu_dev;
below = under->ld_ops->ldo_object_alloc(env, o->lo_header, under);
if (below == NULL)
dt_object_fini(&obj->ls_obj);
lu_object_header_fini(h);
- OBD_FREE_PTR(obj);
+ OBD_FREE_PRE(obj, sizeof(*obj), "kfreed");
+ kfree_rcu(obj, ls_header.loh_rcu);
}
-static struct lu_object_operations ls_lu_obj_ops = {
+static const struct lu_object_operations ls_lu_obj_ops = {
.loo_object_init = ls_object_init,
.loo_object_free = ls_object_free,
};
}
}
-static struct lu_device_operations ls_lu_dev_ops = {
+static const struct lu_device_operations ls_lu_dev_ops = {
.ldo_object_alloc = ls_object_alloc
};
return ls;
}
-static struct lu_device_type_operations ls_device_type_ops = {
+static const struct lu_device_type_operations ls_device_type_ops = {
.ldto_start = NULL,
.ldto_stop = NULL,
};
ls = ls_device_get(dt);
if (IS_ERR(ls)) {
- dto = ERR_PTR(PTR_ERR(ls));
+ dto = ERR_CAST(ls);
} else {
/* create the object */
dti->dti_attr.la_valid = LA_MODE;
ls = ls_device_get(dt);
if (IS_ERR(ls)) {
- dto = ERR_PTR(PTR_ERR(ls));
+ dto = ERR_CAST(ls);
} else {
/* create the object */
dti->dti_attr.la_valid = LA_MODE;
if (rc < 0)
return rc;
+ if (S_ISDIR(p->do_lu.lo_header->loh_attr)) {
+ rc = dt_declare_ref_del(env, p, th);
+ if (rc < 0)
+ return rc;
+ }
+
rc = dt_declare_ref_del(env, c, th);
if (rc < 0)
return rc;
if (rc < 0)
GOTO(stop, rc);
+ if (S_ISDIR(dto->do_lu.lo_header->loh_attr)) {
+ dt_write_lock(env, parent, 0);
+ rc = dt_ref_del(env, parent, th);
+ dt_write_unlock(env, parent);
+ if (rc)
+ GOTO(stop, rc);
+ }
+
dt_write_lock(env, dto, 0);
rc = dt_delete(env, parent, (struct dt_key *)name, th);
if (rc < 0)
/* should never happen, only local_oid_storage_fini should
* drop refcount to zero */
LBUG();
- return;
}
/* after Lustre 2.3 release there may be old file to store last generated FID