Whamcloud - gitweb
LU-2509 quota: various code cleanups
[fs/lustre-release.git] / lustre / quota / lquota_disk.c
index 2b037e8..9f8069b 100644 (file)
@@ -21,7 +21,7 @@
  * GPL HEADER END
  */
 /*
- * Copyright (c) 2012 Intel, Inc.
+ * Copyright (c) 2012, Intel Corporation.
  * Use is subject to license terms.
  *
  * Author: Johann Lombardi <johann.lombardi@intel.com>
@@ -482,7 +482,7 @@ int lquota_disk_for_each_slv(const struct lu_env *env, struct dt_object *parent,
        int                              rc;
        ENTRY;
 
-       OBD_ALLOC(name, sizeof("0x00000000-"));
+       OBD_ALLOC(name, LQUOTA_NAME_MAX);
        if (name == NULL)
                RETURN(-ENOMEM);
 
@@ -493,7 +493,7 @@ int lquota_disk_for_each_slv(const struct lu_env *env, struct dt_object *parent,
        iops = &parent->do_index_ops->dio_it;
        it = iops->init(env, parent, 0, BYPASS_CAPA);
        if (IS_ERR(it)) {
-               OBD_FREE(name, sizeof("0x00000000-"));
+               OBD_FREE(name, LQUOTA_NAME_MAX);
                RETURN(PTR_ERR(it));
        }
 
@@ -556,7 +556,7 @@ next:
 
        iops->put(env, it);
        iops->fini(env, it);
-       OBD_FREE(name, sizeof("0x00000000-"));
+       OBD_FREE(name, LQUOTA_NAME_MAX);
        if (rc > 0)
                rc = 0;
        RETURN(rc);
@@ -741,3 +741,69 @@ out:
        dt_trans_stop(env, dev, th);
        return rc;
 }
+
+/*
+ * Write a global record
+ *
+ * \param env - is the environment passed by the caller
+ * \param obj - is the on-disk global index to be updated
+ * \param id  - index to be updated
+ * \param rec - record to be written
+ */
+int lquota_disk_write_glb(const struct lu_env *env, struct dt_object *obj,
+                         __u64 id, struct lquota_glb_rec *rec)
+{
+       struct dt_device        *dev = lu2dt_dev(obj->do_lu.lo_dev);
+       struct thandle          *th;
+       struct dt_key           *key = (struct dt_key *)&id;
+       int                      rc;
+       ENTRY;
+
+       th = dt_trans_create(env, 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, obj, key, th);
+               if (rc)
+                       GOTO(out, rc);
+       }
+
+       rc = dt_declare_insert(env, obj, (struct dt_rec *)rec, key, th);
+       if (rc)
+               GOTO(out, rc);
+
+       rc = dt_trans_start_local(env, dev, th);
+       if (rc)
+               GOTO(out, rc);
+
+       dt_write_lock(env, obj, 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, obj, (struct dt_rec *)tmp, key,
+                              BYPASS_CAPA);
+
+               OBD_FREE_PTR(tmp);
+               if (rc == 0) {
+                       rc = dt_delete(env, obj, key, th, BYPASS_CAPA);
+                       if (rc)
+                               GOTO(out_lock, rc);
+               }
+               rc = 0;
+       }
+
+       rc = dt_insert(env, obj, (struct dt_rec *)rec, key, th, BYPASS_CAPA, 1);
+out_lock:
+       dt_write_unlock(env, obj);
+out:
+       dt_trans_stop(env, dev, th);
+       RETURN(rc);
+}
+EXPORT_SYMBOL(lquota_disk_write_glb);