* GPL HEADER END
*/
/*
- * Copyright (c) 2012, 2015, Intel Corporation.
+ * Copyright (c) 2012, 2017, Intel Corporation.
*/
/*
* lustre/obdclass/local_storage.c
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,
};
if (rc)
GOTO(trans_stop, rc);
- dt_write_lock(env, dto, LOS_CHILD);
+ dt_write_lock(env, dto, DT_SRC_CHILD);
if (dt_object_exists(dto))
GOTO(unlock, rc = 0);
rec->rec_fid = fid;
/* Add "." and ".." for newly created dir */
rc = dt_insert(env, dto, (const struct dt_rec *)rec,
- (const struct dt_key *)".", th, 1);
+ (const struct dt_key *)".", th);
if (rc != 0)
GOTO(destroy, rc);
dt_ref_add(env, dto, th);
rec->rec_fid = lu_object_fid(&parent->do_lu);
rc = dt_insert(env, dto, (const struct dt_rec *)rec,
- (const struct dt_key *)"..", th, 1);
+ (const struct dt_key *)"..", th);
if (rc != 0)
GOTO(destroy, rc);
}
rec->rec_fid = fid;
rec->rec_type = dto->do_lu.lo_header->loh_attr;
- dt_write_lock(env, parent, LOS_PARENT);
+ dt_write_lock(env, parent, DT_SRC_PARENT);
rc = dt_insert(env, parent, (const struct dt_rec *)rec,
- (const struct dt_key *)name, th, 1);
+ (const struct dt_key *)name, th);
if (dti->dti_dof.dof_type == DFT_DIR)
dt_ref_add(env, parent, th);
dt_write_unlock(env, parent);
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)
rec->rec_fid = &dti->dti_fid;
rec->rec_type = dto->do_lu.lo_header->loh_attr;
rc = dt_insert(env, parent, (const struct dt_rec *)rec,
- (const struct dt_key *)name, th, 1);
+ (const struct dt_key *)name, th);
GOTO(unlock, rc);
}
/* 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