Whamcloud - gitweb
LU-2346 quota: set default grace time
[fs/lustre-release.git] / lustre / quota / lquota_disk.c
index 6421bc4..5f8c439 100644 (file)
@@ -92,18 +92,6 @@ lquota_disk_find_create(const struct lu_env *env, struct dt_device *dev,
        obj = dt_locate(env, dev, &qti->qti_fid);
        if (IS_ERR(obj))
                GOTO(out, obj);
-
-       /* install index operation vector */
-       if (obj->do_index_ops == NULL) {
-               rc = obj->do_ops->do_index_try(env, obj, idx_feat);
-               if (rc) {
-                       CERROR("%s: fail to setup index operations for "DFID
-                              " rc:%d\n", dev->dd_lu_dev.ld_obd->obd_name,
-                              PFID(lu_object_fid(&obj->do_lu)), rc);
-                       lu_object_put(env, &obj->do_lu);
-                       obj = ERR_PTR(rc);
-               }
-       }
 out:
        local_oid_storage_fini(env, los);
        RETURN(obj);
@@ -112,7 +100,7 @@ out:
 /*
  * helper function to generate the filename associated with a slave index file
  */
-static inline int lquota_disk_slv_filename(struct lu_fid *glb_fid,
+static inline int lquota_disk_slv_filename(const struct lu_fid *glb_fid,
                                           struct obd_uuid *uuid,
                                           char *filename)
 {
@@ -291,10 +279,26 @@ struct dt_object *lquota_disk_glb_find_create(const struct lu_env *env,
                                                              idx_feat);
        }
 
-       if (IS_ERR(glb_idx))
+       if (IS_ERR(glb_idx)) {
                CERROR("%s: failed to look-up/create idx file "DFID" rc:%ld "
                       "local:%d\n", dev->dd_lu_dev.ld_obd->obd_name,
                       PFID(fid), PTR_ERR(glb_idx), local);
+               RETURN(glb_idx);
+       }
+
+       /* install index operation vector */
+       if (glb_idx->do_index_ops == NULL) {
+               int rc;
+
+               rc = glb_idx->do_ops->do_index_try(env, glb_idx, idx_feat);
+               if (rc) {
+                       CERROR("%s: failed to setup index operations for "DFID
+                              " rc:%d\n", dev->dd_lu_dev.ld_obd->obd_name,
+                              PFID(lu_object_fid(&glb_idx->do_lu)), rc);
+                       lu_object_put(env, &glb_idx->do_lu);
+                       glb_idx = ERR_PTR(rc);
+               }
+       }
 
        RETURN(glb_idx);
 }
@@ -316,7 +320,7 @@ struct dt_object *lquota_disk_glb_find_create(const struct lu_env *env,
 struct dt_object *lquota_disk_slv_find(const struct lu_env *env,
                                       struct dt_device *dev,
                                       struct dt_object *parent,
-                                      struct lu_fid *glb_fid,
+                                      const struct lu_fid *glb_fid,
                                       struct obd_uuid *uuid)
 {
        struct lquota_thread_info       *qti = lquota_info(env);
@@ -435,6 +439,22 @@ struct dt_object *lquota_disk_slv_find_create(const struct lu_env *env,
                                                  qti->qti_buf);
        }
 
+       if (IS_ERR(slv_idx))
+               RETURN(slv_idx);
+
+       /* install index operation vector */
+       if (slv_idx->do_index_ops == NULL) {
+               rc = slv_idx->do_ops->do_index_try(env, slv_idx,
+                                                  &dt_quota_slv_features);
+               if (rc) {
+                       CERROR("%s: failed to setup index operations for "DFID
+                              " rc:%d\n", dev->dd_lu_dev.ld_obd->obd_name,
+                              PFID(lu_object_fid(&slv_idx->do_lu)), rc);
+                       lu_object_put(env, &slv_idx->do_lu);
+                       slv_idx = ERR_PTR(rc);
+               }
+       }
+
        RETURN(slv_idx);
 }
 
@@ -721,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);