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,
};
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)