Whamcloud - gitweb
LU-1842 quota: setup/shutdown qmt device
[fs/lustre-release.git] / lustre / mdt / mdt_lvb.c
index a61d46a..892c0ea 100644 (file)
 /* Called with res->lr_lvb_sem held */
 static int mdt_lvbo_init(struct ldlm_resource *res)
 {
+       if (IS_LQUOTA_RES(res)) {
+               struct mdt_device       *mdt;
+
+               mdt = ldlm_res_to_ns(res)->ns_lvbp;
+               if (mdt->mdt_qmt_dev == NULL)
+                       return 0;
+
+               /* call lvbo init function of quota master */
+               return qmt_hdls.qmth_lvbo_init(mdt->mdt_qmt_dev, res);
+       }
+
+       return 0;
+}
+
+static int mdt_lvbo_update(struct ldlm_resource *res,
+                          struct ptlrpc_request *req,
+                          int increase_only)
+{
+       if (IS_LQUOTA_RES(res)) {
+               struct mdt_device       *mdt;
+
+               mdt = ldlm_res_to_ns(res)->ns_lvbp;
+               if (mdt->mdt_qmt_dev == NULL)
+                       return 0;
+
+               /* call lvbo update function of quota master */
+               return qmt_hdls.qmth_lvbo_update(mdt->mdt_qmt_dev, res, req,
+                                                increase_only);
+       }
+
        return 0;
 }
 
+
 static int mdt_lvbo_size(struct ldlm_lock *lock)
 {
+       if (IS_LQUOTA_RES(lock->l_resource)) {
+               struct mdt_device       *mdt;
+
+               mdt = ldlm_res_to_ns(lock->l_resource)->ns_lvbp;
+               if (mdt->mdt_qmt_dev == NULL)
+                       return 0;
+
+               /* call lvbo size function of quota master */
+               return qmt_hdls.qmth_lvbo_size(mdt->mdt_qmt_dev, lock);
+       }
+
        return 0;
 }
 
 static int mdt_lvbo_fill(struct ldlm_lock *lock, void *lvb, int lvblen)
 {
+       if (IS_LQUOTA_RES(lock->l_resource)) {
+               struct mdt_device       *mdt;
+
+               mdt = ldlm_res_to_ns(lock->l_resource)->ns_lvbp;
+               if (mdt->mdt_qmt_dev == NULL)
+                       return 0;
+
+               /* call lvbo fill function of quota master */
+               return qmt_hdls.qmth_lvbo_fill(mdt->mdt_qmt_dev, lock, lvb,
+                                              lvblen);
+       }
+
+       return 0;
+}
+
+static int mdt_lvbo_free(struct ldlm_resource *res)
+{
+       if (IS_LQUOTA_RES(res)) {
+               struct mdt_device       *mdt;
+
+               mdt = ldlm_res_to_ns(res)->ns_lvbp;
+               if (mdt->mdt_qmt_dev == NULL)
+                       return 0;
+
+               /* call lvbo free function of quota master */
+               return qmt_hdls.qmth_lvbo_free(mdt->mdt_qmt_dev, res);
+       }
+
        return 0;
 }
 
 struct ldlm_valblock_ops mdt_lvbo = {
        lvbo_init:      mdt_lvbo_init,
-       lvbo_size:      mdt_lvbo_size,
-       lvbo_fill:      mdt_lvbo_fill
+       lvbo_update:    mdt_lvbo_update,
+       lvbo_size:      mdt_lvbo_size,
+       lvbo_fill:      mdt_lvbo_fill,
+       lvbo_free:      mdt_lvbo_free
 };