* GPL HEADER END
*/
/*
- * Copyright (c) 2012, 2013, Intel Corporation.
+ * Copyright (c) 2012, 2015, Intel Corporation.
*/
/*
* lustre/obdclass/local_storage.c
struct dt_object_format *dof, struct thandle *th)
{
struct dt_thread_info *dti = dt_info(env);
- obd_id lastid;
+ u64 lastid;
int rc;
ENTRY;
}
rec->rec_fid = fid;
- rec->rec_type = dto->do_lu.lo_header->loh_attr;
+ rec->rec_type = attr->la_mode & S_IFMT;
rc = dt_declare_insert(env, parent, (const struct dt_rec *)rec,
(const struct dt_key *)name, th);
if (rc)
GOTO(trans_stop, rc);
+ if (dti->dti_dof.dof_type == DFT_DIR) {
+ if (!dt_try_as_dir(env, dto))
+ GOTO(trans_stop, rc = -ENOTDIR);
+
+ rec->rec_type = S_IFDIR;
+ rec->rec_fid = fid;
+ rc = dt_declare_insert(env, dto, (const struct dt_rec *)rec,
+ (const struct dt_key *)".", th);
+ if (rc != 0)
+ GOTO(trans_stop, rc);
+
+ rec->rec_fid = lu_object_fid(&parent->do_lu);
+ rc = dt_declare_insert(env, dto, (const struct dt_rec *)rec,
+ (const struct dt_key *)"..", th);
+ if (rc != 0)
+ GOTO(trans_stop, rc);
+
+ rc = dt_declare_ref_add(env, dto, th);
+ if (rc != 0)
+ GOTO(trans_stop, rc);
+ }
+
rc = dt_trans_start_local(env, ls->ls_osd, th);
if (rc)
GOTO(trans_stop, rc);
- dt_write_lock(env, dto, 0);
+ dt_write_lock(env, dto, LOS_CHILD);
if (dt_object_exists(dto))
GOTO(unlock, rc = 0);
LASSERT(dt_object_exists(dto));
if (dti->dti_dof.dof_type == DFT_DIR) {
- if (!dt_try_as_dir(env, dto))
- GOTO(destroy, rc = -ENOTDIR);
rec->rec_type = S_IFDIR;
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, BYPASS_CAPA, 1);
+ (const struct dt_key *)".", th, 1);
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, BYPASS_CAPA, 1);
+ (const struct dt_key *)"..", th, 1);
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, 0);
+ dt_write_lock(env, parent, LOS_PARENT);
rc = dt_insert(env, parent, (const struct dt_rec *)rec,
- (const struct dt_key *)name, th, BYPASS_CAPA, 1);
+ (const struct dt_key *)name, th, 1);
if (dti->dti_dof.dof_type == DFT_DIR)
dt_ref_add(env, parent, th);
dt_write_unlock(env, parent);
GOTO(stop, rc);
dt_write_lock(env, dto, 0);
- rc = dt_delete(env, parent, (struct dt_key *)name, th, BYPASS_CAPA);
+ rc = dt_delete(env, parent, (struct dt_key *)name, th);
if (rc < 0)
GOTO(unlock, rc);
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, BYPASS_CAPA, 1);
+ (const struct dt_key *)name, th, 1);
GOTO(unlock, rc);
}
{
struct dt_thread_info *dti = dt_info(env);
struct ls_device *ls;
- obd_id lastid;
+ u64 lastid;
struct dt_object *o = NULL;
struct thandle *th;
__u32 first_oid = fid_oid(first_fid);