* Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
* Use is subject to license terms.
*
- * Copyright (c) 2011, Whamcloud, Inc.
+ * Copyright (c) 2011, 2013, Intel Corporation.
*/
/*
* This file is part of Lustre, http://www.lustre.org/
int hash;
ENTRY;
- hash = fld_rrb_hash(fld, seq);
+ /* Because almost all of special sequence located in MDT0,
+ * it should go to index 0 directly, instead of calculating
+ * hash again, and also if other MDTs is not being connected,
+ * the fld lookup requests(for seq on MDT0) should not be
+ * blocked because of other MDTs */
+ if (fid_seq_is_norm(seq))
+ hash = fld_rrb_hash(fld, seq);
+ else
+ hash = 0;
cfs_list_for_each_entry(target, &fld->lcf_targets, ft_chain) {
if (target->ft_idx == hash)
int fld_client_add_target(struct lu_client_fld *fld,
struct lu_fld_target *tar)
{
- const char *name = fld_target_name(tar);
+ const char *name;
struct lu_fld_target *target, *tmp;
ENTRY;
LASSERT(tar != NULL);
+ name = fld_target_name(tar);
LASSERT(name != NULL);
LASSERT(tar->ft_srv != NULL || tar->ft_exp != NULL);
int fld_client_rpc(struct obd_export *exp,
struct lu_seq_range *range, __u32 fld_op)
{
- struct ptlrpc_request *req;
- struct lu_seq_range *prange;
- __u32 *op;
- int rc;
- ENTRY;
+ struct ptlrpc_request *req;
+ struct lu_seq_range *prange;
+ __u32 *op;
+ int rc;
+ struct obd_import *imp;
+ ENTRY;
- LASSERT(exp != NULL);
+ LASSERT(exp != NULL);
- req = ptlrpc_request_alloc_pack(class_exp2cliimp(exp), &RQF_FLD_QUERY,
- LUSTRE_MDS_VERSION, FLD_QUERY);
+ imp = class_exp2cliimp(exp);
+ req = ptlrpc_request_alloc_pack(imp, &RQF_FLD_QUERY, LUSTRE_MDS_VERSION,
+ FLD_QUERY);
if (req == NULL)
RETURN(-ENOMEM);
req->rq_request_portal = FLD_REQUEST_PORTAL;
ptlrpc_at_set_req_timeout(req);
+ if (fld_op == FLD_LOOKUP &&
+ imp->imp_connect_flags_orig & OBD_CONNECT_MDS_MDS)
+ req->rq_allow_replay = 1;
+
if (fld_op != FLD_LOOKUP)
mdc_get_rpc_lock(exp->exp_obd->u.cli.cl_rpc_lock, NULL);
fld_enter_request(&exp->exp_obd->u.cli);
res.lsr_flags = flags;
#ifdef __KERNEL__
if (target->ft_srv != NULL) {
- LASSERT(env != NULL);
- rc = fld_server_lookup(target->ft_srv,
- env, seq, &res);
+ LASSERT(env != NULL);
+ rc = fld_server_lookup(env, target->ft_srv, seq, &res);
} else {
#endif
rc = fld_client_rpc(target->ft_exp,
if (rc == 0) {
*mds = res.lsr_index;
- fld_cache_insert(fld->lcf_cache, &res);
+ fld_cache_insert(fld->lcf_cache, &res);
}
RETURN(rc);
}