X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Ffld%2Ffld_request.c;h=55e93cbf7044967acf2db975cf417c7c6ccd2151;hb=5fc8551aaba3bc467647d8ea549fafee039b48f9;hp=b0841c64356f1bbd317556f8f375a1985cf23070;hpb=65701b4a30efdb695776bcf690a2b3cabc928da1;p=fs%2Flustre-release.git diff --git a/lustre/fld/fld_request.c b/lustre/fld/fld_request.c index b0841c6..55e93cb 100644 --- a/lustre/fld/fld_request.c +++ b/lustre/fld/fld_request.c @@ -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. @@ -29,7 +27,7 @@ * 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/ @@ -42,9 +40,6 @@ * Author: Yury Umanets */ -#ifndef EXPORT_SYMTAB -# define EXPORT_SYMTAB -#endif #define DEBUG_SUBSYSTEM S_FLD #ifdef __KERNEL__ @@ -135,7 +130,15 @@ fld_rrb_scan(struct lu_client_fld *fld, seqno_t seq) 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) @@ -178,17 +181,16 @@ struct lu_fld_hash fld_hash[] = { }; static struct lu_fld_target * -fld_client_get_target(struct lu_client_fld *fld, - seqno_t seq) +fld_client_get_target(struct lu_client_fld *fld, seqno_t seq) { - struct lu_fld_target *target; - ENTRY; + struct lu_fld_target *target; + ENTRY; - LASSERT(fld->lcf_hash != NULL); + LASSERT(fld->lcf_hash != NULL); - cfs_spin_lock(&fld->lcf_lock); - target = fld->lcf_hash->fh_scan_func(fld, seq); - cfs_spin_unlock(&fld->lcf_lock); + spin_lock(&fld->lcf_lock); + target = fld->lcf_hash->fh_scan_func(fld, seq); + spin_unlock(&fld->lcf_lock); if (target != NULL) { CDEBUG(D_INFO, "%s: Found target (idx "LPU64 @@ -206,11 +208,12 @@ fld_client_get_target(struct lu_client_fld *fld, 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); @@ -228,10 +231,10 @@ int fld_client_add_target(struct lu_client_fld *fld, if (target == NULL) RETURN(-ENOMEM); - cfs_spin_lock(&fld->lcf_lock); - cfs_list_for_each_entry(tmp, &fld->lcf_targets, ft_chain) { - if (tmp->ft_idx == tar->ft_idx) { - cfs_spin_unlock(&fld->lcf_lock); + spin_lock(&fld->lcf_lock); + cfs_list_for_each_entry(tmp, &fld->lcf_targets, ft_chain) { + if (tmp->ft_idx == tar->ft_idx) { + spin_unlock(&fld->lcf_lock); OBD_FREE_PTR(target); CERROR("Target %s exists in FLD and known as %s:#"LPU64"\n", name, fld_target_name(tmp), tmp->ft_idx); @@ -249,26 +252,25 @@ int fld_client_add_target(struct lu_client_fld *fld, &fld->lcf_targets); fld->lcf_count++; - cfs_spin_unlock(&fld->lcf_lock); + spin_unlock(&fld->lcf_lock); - RETURN(0); + RETURN(0); } EXPORT_SYMBOL(fld_client_add_target); /* Remove export from FLD */ -int fld_client_del_target(struct lu_client_fld *fld, - __u64 idx) +int fld_client_del_target(struct lu_client_fld *fld, __u64 idx) { - struct lu_fld_target *target, *tmp; - ENTRY; + struct lu_fld_target *target, *tmp; + ENTRY; - cfs_spin_lock(&fld->lcf_lock); - cfs_list_for_each_entry_safe(target, tmp, - &fld->lcf_targets, ft_chain) { - if (target->ft_idx == idx) { - fld->lcf_count--; - cfs_list_del(&target->ft_chain); - cfs_spin_unlock(&fld->lcf_lock); + spin_lock(&fld->lcf_lock); + cfs_list_for_each_entry_safe(target, tmp, + &fld->lcf_targets, ft_chain) { + if (target->ft_idx == idx) { + fld->lcf_count--; + cfs_list_del(&target->ft_chain); + spin_unlock(&fld->lcf_lock); if (target->ft_exp != NULL) class_export_put(target->ft_exp); @@ -277,8 +279,8 @@ int fld_client_del_target(struct lu_client_fld *fld, RETURN(0); } } - cfs_spin_unlock(&fld->lcf_lock); - RETURN(-ENOENT); + spin_unlock(&fld->lcf_lock); + RETURN(-ENOENT); } EXPORT_SYMBOL(fld_client_del_target); @@ -362,7 +364,7 @@ int fld_client_init(struct lu_client_fld *fld, } fld->lcf_count = 0; - cfs_spin_lock_init(&fld->lcf_lock); + spin_lock_init(&fld->lcf_lock); fld->lcf_hash = &fld_hash[hash]; fld->lcf_flags = LUSTRE_FLD_INIT; CFS_INIT_LIST_HEAD(&fld->lcf_targets); @@ -397,10 +399,10 @@ EXPORT_SYMBOL(fld_client_init); void fld_client_fini(struct lu_client_fld *fld) { - struct lu_fld_target *target, *tmp; - ENTRY; + struct lu_fld_target *target, *tmp; + ENTRY; - cfs_spin_lock(&fld->lcf_lock); + spin_lock(&fld->lcf_lock); cfs_list_for_each_entry_safe(target, tmp, &fld->lcf_targets, ft_chain) { fld->lcf_count--; @@ -409,7 +411,7 @@ void fld_client_fini(struct lu_client_fld *fld) class_export_put(target->ft_exp); OBD_FREE_PTR(target); } - cfs_spin_unlock(&fld->lcf_lock); + spin_unlock(&fld->lcf_lock); if (fld->lcf_cache != NULL) { if (!IS_ERR(fld->lcf_cache)) @@ -424,16 +426,18 @@ EXPORT_SYMBOL(fld_client_fini); 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; - - LASSERT(exp != NULL); - - req = ptlrpc_request_alloc_pack(class_exp2cliimp(exp), &RQF_FLD_QUERY, - LUSTRE_MDS_VERSION, FLD_QUERY); + struct ptlrpc_request *req; + struct lu_seq_range *prange; + __u32 *op; + int rc; + struct obd_import *imp; + ENTRY; + + LASSERT(exp != NULL); + + imp = class_exp2cliimp(exp); + req = ptlrpc_request_alloc_pack(imp, &RQF_FLD_QUERY, LUSTRE_MDS_VERSION, + FLD_QUERY); if (req == NULL) RETURN(-ENOMEM); @@ -447,6 +451,10 @@ int fld_client_rpc(struct obd_export *exp, 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); @@ -495,9 +503,8 @@ int fld_client_lookup(struct lu_client_fld *fld, seqno_t seq, mdsno_t *mds, 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, @@ -509,7 +516,7 @@ int fld_client_lookup(struct lu_client_fld *fld, seqno_t seq, mdsno_t *mds, if (rc == 0) { *mds = res.lsr_index; - fld_cache_insert(fld->lcf_cache, &res); + fld_cache_insert(fld->lcf_cache, &res); } RETURN(rc); }