static int llog_osd_declare_create(const struct lu_env *env, struct llog_handle *res, struct thandle *th) { struct llog_thread_info *lgi = llog_info(env); struct local_oid_storage *los; struct dt_object *o; int rc; ENTRY; LASSERT(res->lgh_obj); LASSERT(th); /* object can be created by another thread */ o = res->lgh_obj; if (dt_object_exists(o)) RETURN(0); los = res->private_data; LASSERT(los); rc = llog_osd_declare_new_object(env, los, o, th); if (rc) RETURN(rc); rc = dt_declare_record_write(env, o, LLOG_CHUNK_SIZE, 0, th); if (rc) RETURN(rc); if (res->lgh_name) { struct dt_object *llog_dir; llog_dir = llog_osd_dir_get(env, res->lgh_ctxt); if (IS_ERR(llog_dir)) RETURN(PTR_ERR(llog_dir)); dt_declare_ref_add(env, o, th); logid_to_fid(&res->lgh_id, &lgi->lgi_fid); rc = dt_declare_insert(env, llog_dir, (struct dt_rec *)&lgi->lgi_fid, (struct dt_key *)res->lgh_name, th); lu_object_put(env, &llog_dir->do_lu); if (rc) CERROR("%s: can't declare named llog %s: rc = %d\n", o->do_lu.lo_dev->ld_obd->obd_name, res->lgh_name, rc); } RETURN(rc); }
int orph_declare_index_insert(const struct lu_env *env, struct mdd_object *obj, umode_t mode, struct thandle *th) { struct dt_insert_rec *rec = &mdd_env_info(env)->mti_dt_rec; struct mdd_device *mdd = mdo2mdd(&obj->mod_obj); struct dt_key *key; int rc; key = orph_key_fill(env, mdo2fid(obj), ORPH_OP_UNLINK); rec->rec_fid = mdo2fid(obj); rec->rec_type = mode; rc = dt_declare_insert(env, mdd->mdd_orphans, (const struct dt_rec *)rec, key, th); if (rc != 0) return rc; rc = mdo_declare_ref_add(env, obj, th); if (rc) return rc; if (!S_ISDIR(mode)) return 0; rc = mdo_declare_ref_add(env, obj, th); if (rc) return rc; rc = dt_declare_ref_add(env, mdd->mdd_orphans, th); if (rc) return rc; rc = mdo_declare_index_delete(env, obj, dotdot, th); if (rc) return rc; rc = mdo_declare_index_insert(env, obj, lu_object_fid(&mdd->mdd_orphans->do_lu), S_IFDIR, dotdot, th); return rc; }
static int __out_tx_ref_add(const struct lu_env *env, struct dt_object *dt_obj, struct thandle_exec_args *ta, struct update_reply *reply, int index, char *file, int line) { struct tx_arg *arg; LASSERT(ta->ta_handle != NULL); ta->ta_err = dt_declare_ref_add(env, dt_obj, ta->ta_handle); if (ta->ta_err != 0) return ta->ta_err; arg = tx_add_exec(ta, out_tx_ref_add_exec, out_tx_ref_add_undo, file, line); LASSERT(arg); lu_object_get(&dt_obj->do_lu); arg->object = dt_obj; arg->reply = reply; arg->index = index; return 0; }
static int __out_tx_ref_add(struct mdt_thread_info *info, struct dt_object *dt_obj, struct thandle_exec_args *th, struct update_reply *reply, int index, char *file, int line) { struct tx_arg *arg; LASSERT(th->ta_handle != NULL); th->ta_err = dt_declare_ref_add(info->mti_env, dt_obj, th->ta_handle); if (th->ta_err != 0) return th->ta_err; arg = tx_add_exec(th, out_tx_ref_add_exec, out_tx_ref_add_undo, file, line); LASSERT(arg); lu_object_get(&dt_obj->do_lu); arg->object = dt_obj; arg->reply = reply; arg->index = index; return 0; }
int orph_declare_index_insert(const struct lu_env *env, struct mdd_object *obj, cfs_umode_t mode, struct thandle *th) { struct mdd_device *mdd = mdo2mdd(&obj->mod_obj); struct dt_key *key; int rc; key = orph_key_fill(env, mdo2fid(obj), ORPH_OP_UNLINK); rc = dt_declare_insert(env, mdd->mdd_orphans, NULL, key, th); if (rc) return rc; rc = mdo_declare_ref_add(env, obj, th); if (rc) return rc; if (!S_ISDIR(mode)) return 0; rc = mdo_declare_ref_add(env, obj, th); if (rc) return rc; rc = dt_declare_ref_add(env, mdd->mdd_orphans, th); if (rc) return rc; rc = mdo_declare_index_delete(env, obj, dotdot, th); if (rc) return rc; rc = mdo_declare_index_insert(env, obj, NULL, dotdot, th); return rc; }