Whamcloud - gitweb
LU-169 lov: add lsm refcounting
[fs/lustre-release.git] / lustre / lov / lov_qos.c
index c1f8c96..527620a 100644 (file)
@@ -1,6 +1,4 @@
-/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
- * vim:expandtab:shiftwidth=8:tabstop=8:
- *
+/*
  * GPL HEADER START
  *
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 /*
  * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
  * Use is subject to license terms.
+ *
+ * Copyright (c) 2011, 2012, Whamcloud, Inc.
  */
 /*
  * This file is part of Lustre, http://www.lustre.org/
  * Lustre is a trademark of Sun Microsystems, Inc.
  */
 
-#ifndef EXPORT_SYMTAB
-# define EXPORT_SYMTAB
-#endif
 #define DEBUG_SUBSYSTEM S_LOV
 
 #ifdef __KERNEL__
@@ -73,7 +70,7 @@ int qos_add_tgt(struct obd_device *obd, __u32 index)
         }
 
         cfs_down_write(&lov->lov_qos.lq_rw_sem);
-        cfs_mutex_down(&lov->lov_lock);
+        cfs_mutex_lock(&lov->lov_lock);
         cfs_list_for_each_entry(oss, &lov->lov_qos.lq_oss_list, lqo_oss_list) {
                 if (obd_uuid_equals(&oss->lqo_uuid,
                                     &exp->exp_connection->c_remote_uuid)) {
@@ -117,7 +114,7 @@ int qos_add_tgt(struct obd_device *obd, __u32 index)
                oss->lqo_ost_count);
 
 out:
-        cfs_mutex_up(&lov->lov_lock);
+        cfs_mutex_unlock(&lov->lov_lock);
         cfs_up_write(&lov->lov_qos.lq_rw_sem);
         RETURN(rc);
 }
@@ -199,11 +196,11 @@ static int qos_calc_ppo(struct obd_device *obd)
                         lov->lov_qos.lq_active_oss_count++;
                 lov->lov_tgts[i]->ltd_qos.ltq_oss->lqo_bavail += temp;
 
-                /* per-OST penalty is prio * TGT_bavail / (num_ost - 1) / 2 */
-                temp >>= 1;
-                do_div(temp, num_active);
-                lov->lov_tgts[i]->ltd_qos.ltq_penalty_per_obj =
-                        (temp * prio_wide) >> 8;
+               /* per-OST penalty is prio * TGT_bavail / (num_ost - 1) / 2 */
+               temp >>= 1;
+               lov_do_div64(temp, num_active);
+               lov->lov_tgts[i]->ltd_qos.ltq_penalty_per_obj =
+                       (temp * prio_wide) >> 8;
 
                 age = (now - lov->lov_tgts[i]->ltd_qos.ltq_used) >> 3;
                 if (lov->lov_qos.lq_reset || age > 32 * lov->desc.ld_qos_maxage)
@@ -232,9 +229,9 @@ static int qos_calc_ppo(struct obd_device *obd)
 
         /* Per-OSS penalty is prio * oss_avail / oss_osts / (num_oss - 1) / 2 */
         cfs_list_for_each_entry(oss, &lov->lov_qos.lq_oss_list, lqo_oss_list) {
-                temp = oss->lqo_bavail >> 1;
-                do_div(temp, oss->lqo_ost_count * num_active);
-                oss->lqo_penalty_per_obj = (temp * prio_wide) >> 8;
+               temp = oss->lqo_bavail >> 1;
+               lov_do_div64(temp, oss->lqo_ost_count * num_active);
+               oss->lqo_penalty_per_obj = (temp * prio_wide) >> 8;
 
                 age = (now - oss->lqo_used) >> 3;
                 if (lov->lov_qos.lq_reset || age > 32 * lov->desc.ld_qos_maxage)
@@ -505,7 +502,7 @@ static int lov_check_and_create_object(struct lov_obd *lov, int ost_idx,
                                        struct lov_request *req,
                                        struct obd_trans_info *oti)
 {
-        int stripe;
+        __u16 stripe;
         int rc = -EIO;
         ENTRY;
 
@@ -523,7 +520,7 @@ static int lov_check_and_create_object(struct lov_obd *lov, int ost_idx,
 
         if (stripe >= lsm->lsm_stripe_count) {
                 req->rq_idx = ost_idx;
-                rc = obd_create(lov->lov_tgts[ost_idx]->ltd_exp,
+                rc = obd_create(NULL, lov->lov_tgts[ost_idx]->ltd_exp,
                                 req->rq_oi.oi_oa, &req->rq_oi.oi_md,
                                 oti);
         }
@@ -790,7 +787,6 @@ static int alloc_qos(struct obd_export *exp, int *idx_arr, int *stripe_cnt,
         int stripe_cnt_min = min_stripe_count(*stripe_cnt, flags);
         struct pool_desc *pool;
         struct ost_pool *osts;
-        struct lov_qos_rr *lqr;
         ENTRY;
 
         if (stripe_cnt_min < 1)
@@ -799,11 +795,9 @@ static int alloc_qos(struct obd_export *exp, int *idx_arr, int *stripe_cnt,
         pool = lov_find_pool(lov, poolname);
         if (pool == NULL) {
                 osts = &(lov->lov_packed);
-                lqr = &(lov->lov_qos.lq_rr);
         } else {
                 cfs_down_read(&pool_tgt_rw_sem(pool));
                 osts = &(pool->pool_obds);
-                lqr = &(pool->pool_rr);
         }
 
         obd_getref(exp->exp_obd);
@@ -1008,7 +1002,7 @@ int qos_prep_create(struct obd_export *exp, struct lov_request_set *set)
         LASSERT(src_oa->o_valid & OBD_MD_FLGROUP);
 
         if (set->set_oi->oi_md == NULL) {
-                int stripes_def = lov_get_stripecnt(lov, 0);
+                __u16 stripes_def = lov_get_stripecnt(lov, LOV_MAGIC, 0);
 
                 /* If the MDS file was truncated up to some size, stripe over
                  * enough OSTs to allow the file to be created at that size.
@@ -1032,8 +1026,8 @@ int qos_prep_create(struct obd_export *exp, struct lov_request_set *set)
                         if (stripes < stripes_def)
                                 stripes = stripes_def;
                 } else {
-                         flag = LOV_USES_DEFAULT_STRIPE;
-                         stripes = stripes_def;
+                        flag = LOV_USES_DEFAULT_STRIPE;
+                        stripes = stripes_def;
                 }
 
                 rc = lov_alloc_memmd(&set->set_oi->oi_md, stripes,
@@ -1049,6 +1043,7 @@ int qos_prep_create(struct obd_export *exp, struct lov_request_set *set)
         lsm = set->set_oi->oi_md;
         lsm->lsm_object_id = src_oa->o_id;
         lsm->lsm_object_seq = src_oa->o_seq;
+        lsm->lsm_layout_gen = 0; /* actual generation set in mdd_lov_create() */
 
         if (!lsm->lsm_stripe_size)
                 lsm->lsm_stripe_size = lov->desc.ld_default_stripe_size;
@@ -1132,11 +1127,12 @@ void qos_update(struct lov_obd *lov)
 
 void qos_statfs_done(struct lov_obd *lov)
 {
-        LASSERT(lov->lov_qos.lq_statfs_in_progress);
         cfs_down_write(&lov->lov_qos.lq_rw_sem);
-        lov->lov_qos.lq_statfs_in_progress = 0;
-        /* wake up any threads waiting for the statfs rpcs to complete */
-        cfs_waitq_signal(&lov->lov_qos.lq_statfs_waitq);
+        if (lov->lov_qos.lq_statfs_in_progress) {
+                lov->lov_qos.lq_statfs_in_progress = 0;
+                /* wake up any threads waiting for the statfs rpcs to complete*/
+                cfs_waitq_signal(&lov->lov_qos.lq_statfs_waitq);
+        }
         cfs_up_write(&lov->lov_qos.lq_rw_sem);
 }
 
@@ -1202,7 +1198,7 @@ void qos_statfs_update(struct obd_device *obd, __u64 max_age, int wait)
         if (!set)
                 GOTO(out_failed, rc = -ENOMEM);
 
-        rc = obd_statfs_async(obd, oinfo, max_age, set);
+        rc = obd_statfs_async(obd->obd_self_export, oinfo, max_age, set);
         if (rc || cfs_list_empty(&set->set_requests)) {
                 if (rc)
                         CWARN("statfs failed with %d\n", rc);