Whamcloud - gitweb
EX-3687 osp: do force disconnect if import is not ready
[fs/lustre-release.git] / lustre / lmv / lmv_obd.c
index ba1b656..96b6b5d 100644 (file)
@@ -1459,7 +1459,8 @@ static int lmv_close(struct obd_export *exp, struct md_op_data *op_data,
        RETURN(rc);
 }
 
-static struct lu_tgt_desc *lmv_locate_tgt_qos(struct lmv_obd *lmv, __u32 *mdt)
+static struct lu_tgt_desc *lmv_locate_tgt_qos(struct lmv_obd *lmv, __u32 *mdt,
+                                             unsigned short dir_depth)
 {
        struct lu_tgt_desc *tgt, *cur = NULL;
        __u64 total_avail = 0;
@@ -1500,10 +1501,10 @@ static struct lu_tgt_desc *lmv_locate_tgt_qos(struct lmv_obd *lmv, __u32 *mdt)
 
        /* if current MDT has above-average space, within range of the QOS
         * threshold, stay on the same MDT to avoid creating needless remote
-        * MDT directories.
+        * MDT directories. It's more likely for low level directories.
         */
        rand = total_avail * (256 - lmv->lmv_qos.lq_threshold_rr) /
-               (total_usable * 256);
+              (total_usable * 256 * (1 + dir_depth / 4));
        if (cur && cur->ltd_qos.ltq_avail >= rand) {
                tgt = cur;
                GOTO(unlock, rc = 0);
@@ -1751,12 +1752,14 @@ static inline bool lmv_op_default_qos_mkdir(const struct md_op_data *op_data)
 {
        const struct lmv_stripe_md *lsm = op_data->op_default_mea1;
 
-       return lsm && lsm->lsm_md_master_mdt_index == LMV_OFFSET_DEFAULT;
+       return (op_data->op_flags & MF_QOS_MKDIR) ||
+              (lsm && lsm->lsm_md_master_mdt_index == LMV_OFFSET_DEFAULT);
 }
 
-/* mkdir by QoS in two cases:
- * 1. 'lfs mkdir -i -1'
- * 2. parent default LMV master_mdt_index is -1
+/* mkdir by QoS in three cases:
+ * 1. ROOT default LMV is space balanced.
+ * 2. 'lfs mkdir -i -1'
+ * 3. parent default LMV master_mdt_index is -1
  *
  * NB, mkdir by QoS only if parent is not striped, this is to avoid remote
  * directories under striped directory.
@@ -1778,11 +1781,12 @@ static inline bool lmv_op_qos_mkdir(const struct md_op_data *op_data)
        return false;
 }
 
-/* if default LMV is set, and its index is LMV_OFFSET_DEFAULT, and
- * 1. max_inherit_rr is set and is not LMV_INHERIT_RR_NONE
+/* if parent default LMV is space balanced, and
+ * 1. max_inherit_rr is set
  * 2. or parent is ROOT
- * mkdir roundrobin.
- * NB, this also needs to check server is balanced, which is checked by caller.
+ * mkdir roundrobin. Or if parent doesn't have default LMV, while ROOT default
+ * LMV requests roundrobin mkdir, do the same.
+ * NB, this needs to check server is balanced, which is done by caller.
  */
 static inline bool lmv_op_default_rr_mkdir(const struct md_op_data *op_data)
 {
@@ -1791,7 +1795,8 @@ static inline bool lmv_op_default_rr_mkdir(const struct md_op_data *op_data)
        if (!lmv_op_default_qos_mkdir(op_data))
                return false;
 
-       return lsm->lsm_md_max_inherit_rr != LMV_INHERIT_RR_NONE ||
+       return (op_data->op_flags & MF_RR_MKDIR) ||
+              (lsm && lsm->lsm_md_max_inherit_rr != LMV_INHERIT_RR_NONE) ||
               fid_is_root(&op_data->op_fid1);
 }
 
@@ -1819,7 +1824,7 @@ lmv_op_default_specific_mkdir(const struct md_op_data *op_data)
 
 int lmv_create(struct obd_export *exp, struct md_op_data *op_data,
                const void *data, size_t datalen, umode_t mode, uid_t uid,
-               gid_t gid, cfs_cap_t cap_effective, __u64 rdev,
+               gid_t gid, kernel_cap_t cap_effective, __u64 rdev,
                struct ptlrpc_request **request)
 {
        struct obd_device *obd = exp->exp_obd;
@@ -1868,7 +1873,8 @@ int lmv_create(struct obd_export *exp, struct md_op_data *op_data,
        } else if (lmv_op_qos_mkdir(op_data)) {
                struct lmv_tgt_desc *tmp = tgt;
 
-               tgt = lmv_locate_tgt_qos(lmv, &op_data->op_mds);
+               tgt = lmv_locate_tgt_qos(lmv, &op_data->op_mds,
+                                        op_data->op_dir_depth);
                if (tgt == ERR_PTR(-EAGAIN)) {
                        if (ltd_qos_is_balanced(&lmv->lmv_mdt_descs) &&
                            !lmv_op_default_rr_mkdir(op_data) &&
@@ -1976,7 +1982,11 @@ lmv_getattr_name(struct obd_export *exp,struct md_op_data *op_data,
        ENTRY;
 
 retry:
-       tgt = lmv_locate_tgt(lmv, op_data);
+       if (op_data->op_namelen == 2 &&
+           op_data->op_name[0] == '.' && op_data->op_name[1] == '.')
+               tgt = lmv_fid2tgt(lmv, &op_data->op_fid1);
+       else
+               tgt = lmv_locate_tgt(lmv, op_data);
        if (IS_ERR(tgt))
                RETURN(PTR_ERR(tgt));
 
@@ -2075,7 +2085,7 @@ static int lmv_link(struct obd_export *exp, struct md_op_data *op_data,
 
        op_data->op_fsuid = from_kuid(&init_user_ns, current_fsuid());
        op_data->op_fsgid = from_kgid(&init_user_ns, current_fsgid());
-       op_data->op_cap = cfs_curproc_cap_pack();
+       op_data->op_cap = current_cap();
 
        tgt = lmv_locate_tgt2(lmv, op_data);
        if (IS_ERR(tgt))
@@ -2119,7 +2129,7 @@ static int lmv_migrate(struct obd_export *exp, struct md_op_data *op_data,
 
        op_data->op_fsuid = from_kuid(&init_user_ns, current_fsuid());
        op_data->op_fsgid = from_kgid(&init_user_ns, current_fsgid());
-       op_data->op_cap = cfs_curproc_cap_pack();
+       op_data->op_cap = current_cap();
 
        parent_tgt = lmv_fid2tgt(lmv, &op_data->op_fid1);
        if (IS_ERR(parent_tgt))
@@ -2273,7 +2283,7 @@ static int lmv_rename(struct obd_export *exp, struct md_op_data *op_data,
 
        op_data->op_fsuid = from_kuid(&init_user_ns, current_fsuid());
        op_data->op_fsgid = from_kgid(&init_user_ns, current_fsgid());
-       op_data->op_cap = cfs_curproc_cap_pack();
+       op_data->op_cap = current_cap();
 
        op_data->op_name = new;
        op_data->op_namelen = newlen;
@@ -2866,7 +2876,7 @@ static int lmv_unlink(struct obd_export *exp, struct md_op_data *op_data,
 
        op_data->op_fsuid = from_kuid(&init_user_ns, current_fsuid());
        op_data->op_fsgid = from_kgid(&init_user_ns, current_fsgid());
-       op_data->op_cap = cfs_curproc_cap_pack();
+       op_data->op_cap = current_cap();
 
 retry:
        parent_tgt = lmv_locate_tgt(lmv, op_data);
@@ -3496,9 +3506,9 @@ static int lmv_clear_open_replay_data(struct obd_export *exp,
 }
 
 static int lmv_intent_getattr_async(struct obd_export *exp,
-                                   struct md_op_item *item)
+                                   struct md_enqueue_info *minfo)
 {
-       struct md_op_data *op_data = &item->mop_data;
+       struct md_op_data *op_data = &minfo->mi_data;
        struct obd_device *obd = exp->exp_obd;
        struct lmv_obd *lmv = &obd->u.lmv;
        struct lmv_tgt_desc *ptgt;
@@ -3525,7 +3535,7 @@ static int lmv_intent_getattr_async(struct obd_export *exp,
        if (ctgt != ptgt)
                RETURN(-EREMOTE);
 
-       rc = md_intent_getattr_async(ptgt->ltd_exp, item);
+       rc = md_intent_getattr_async(ptgt->ltd_exp, minfo);
 
        RETURN(rc);
 }