-static int write_quota_rec(const struct lu_env *env, struct dt_object *dt,
- __u64 id, struct lquota_glb_rec *rec)
-{
- struct osd_device *osd = osd_obj2dev(osd_dt_obj(dt));
- struct thandle *th;
- struct dt_key *key = (struct dt_key *)&id;
- int rc;
- ENTRY;
-
- th = dt_trans_create(env, &osd->od_dt_dev);
- if (IS_ERR(th))
- RETURN(PTR_ERR(th));
-
- /* the entry with 0 key can always be found in IAM file. */
- if (id == 0) {
- rc = dt_declare_delete(env, dt, key, th);
- if (rc)
- GOTO(out, rc);
- }
-
- rc = dt_declare_insert(env, dt, (struct dt_rec *)rec, key, th);
- if (rc)
- GOTO(out, rc);
-
- rc = dt_trans_start_local(env, &osd->od_dt_dev, th);
- if (rc)
- GOTO(out, rc);
-
- dt_write_lock(env, dt, 0);
-
- if (id == 0) {
- struct lquota_glb_rec *tmp;
-
- OBD_ALLOC_PTR(tmp);
- if (tmp == NULL)
- GOTO(out_lock, rc = -ENOMEM);
-
- rc = dt_lookup(env, dt, (struct dt_rec *)tmp, key,
- BYPASS_CAPA);
-
- OBD_FREE_PTR(tmp);
- if (rc == 0) {
- rc = dt_delete(env, dt, key, th, BYPASS_CAPA);
- if (rc)
- GOTO(out_lock, rc);
- }
- rc = 0;
- }
-
- rc = dt_insert(env, dt, (struct dt_rec *)rec, key, th, BYPASS_CAPA, 1);
-out_lock:
- dt_write_unlock(env, dt);
-out:
- dt_trans_stop(env, &osd->od_dt_dev, th);
- RETURN(rc);
-}
-