X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Ffld%2Ffld_request.c;h=19b5789c19851d2339ee9506b51554952d70bcda;hb=9407629a816feff9f773517f90b615164319642f;hp=019e8fd7ab0d3a5a0fd68be5e7c4cd62683f770e;hpb=7817e4c785d075aae76b635dcf799064590833b0;p=fs%2Flustre-release.git diff --git a/lustre/fld/fld_request.c b/lustre/fld/fld_request.c index 019e8fd..19b5789 100644 --- a/lustre/fld/fld_request.c +++ b/lustre/fld/fld_request.c @@ -15,11 +15,7 @@ * * You should have received a copy of the GNU General Public License * version 2 along with this program; If not, see - * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf - * - * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, - * CA 95054 USA or visit www.sun.com if you need additional information or - * have any questions. + * http://www.gnu.org/licenses/gpl-2.0.html * * GPL HEADER END */ @@ -27,7 +23,7 @@ * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. * - * Copyright (c) 2011, 2014, Intel Corporation. + * Copyright (c) 2011, 2016, Intel Corporation. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -92,7 +88,7 @@ again: goto again; } - CERROR("%s: Can't find target by hash %d (seq "LPX64"). " + CERROR("%s: Can't find target by hash %d (seq %#llx). " "Targets (%d):\n", fld->lcf_name, hash, seq, fld->lcf_count); @@ -103,7 +99,7 @@ again: (char *)target->ft_exp->exp_obd->obd_uuid.uuid : ""; - CERROR(" exp: 0x%p (%s), srv: 0x%p (%s), idx: "LPU64"\n", + CERROR(" exp: 0x%p (%s), srv: 0x%p (%s), idx: %llu\n", target->ft_exp, exp_name, target->ft_srv, srv_name, target->ft_idx); } @@ -140,8 +136,8 @@ fld_client_get_target(struct lu_client_fld *fld, u64 seq) spin_unlock(&fld->lcf_lock); if (target != NULL) { - CDEBUG(D_INFO, "%s: Found target (idx "LPU64 - ") by seq "LPX64"\n", fld->lcf_name, + CDEBUG(D_INFO, "%s: Found target (idx %llu" + ") by seq %#llx\n", fld->lcf_name, target->ft_idx, seq); } @@ -164,15 +160,8 @@ int fld_client_add_target(struct lu_client_fld *fld, LASSERT(name != NULL); LASSERT(tar->ft_srv != NULL || tar->ft_exp != NULL); - if (fld->lcf_flags != LUSTRE_FLD_INIT) { - CERROR("%s: Attempt to add target %s (idx "LPU64") " - "on fly - skip it\n", fld->lcf_name, name, - tar->ft_idx); - RETURN(0); - } else { - CDEBUG(D_INFO, "%s: Adding target %s (idx " - LPU64")\n", fld->lcf_name, name, tar->ft_idx); - } + CDEBUG(D_INFO, "%s: Adding target %s (idx %llu)\n", fld->lcf_name, + name, tar->ft_idx); OBD_ALLOC_PTR(target); if (target == NULL) @@ -183,7 +172,7 @@ int fld_client_add_target(struct lu_client_fld *fld, 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", + CERROR("Target %s exists in FLD and known as %s:#%llu\n", name, fld_target_name(tmp), tmp->ft_idx); RETURN(-EEXIST); } @@ -227,7 +216,6 @@ int fld_client_del_target(struct lu_client_fld *fld, __u64 idx) spin_unlock(&fld->lcf_lock); RETURN(-ENOENT); } -EXPORT_SYMBOL(fld_client_del_target); #ifdef CONFIG_PROC_FS static int fld_client_proc_init(struct lu_client_fld *fld) @@ -235,9 +223,8 @@ static int fld_client_proc_init(struct lu_client_fld *fld) int rc; ENTRY; - fld->lcf_proc_dir = lprocfs_seq_register(fld->lcf_name, - fld_type_proc_dir, - NULL, NULL); + fld->lcf_proc_dir = lprocfs_register(fld->lcf_name, fld_type_proc_dir, + NULL, NULL); if (IS_ERR(fld->lcf_proc_dir)) { CERROR("%s: LProcFS failed in fld-init\n", fld->lcf_name); @@ -245,8 +232,7 @@ static int fld_client_proc_init(struct lu_client_fld *fld) RETURN(rc); } - rc = lprocfs_seq_add_vars(fld->lcf_proc_dir, - fld_client_proc_list, fld); + rc = lprocfs_add_vars(fld->lcf_proc_dir, fld_client_proc_list, fld); if (rc) { CERROR("%s: Can't init FLD proc, rc %d\n", fld->lcf_name, rc); @@ -307,10 +293,9 @@ int fld_client_init(struct lu_client_fld *fld, RETURN(-EINVAL); } - fld->lcf_count = 0; + fld->lcf_count = 0; spin_lock_init(&fld->lcf_lock); - fld->lcf_hash = &fld_hash[hash]; - fld->lcf_flags = LUSTRE_FLD_INIT; + fld->lcf_hash = &fld_hash[hash]; INIT_LIST_HEAD(&fld->lcf_targets); cache_size = FLD_CLIENT_CACHE_SIZE / @@ -409,7 +394,7 @@ again: RETURN(-ENOMEM); req_capsule_set_size(&req->rq_pill, &RMF_GENERIC_DATA, - RCL_SERVER, PAGE_CACHE_SIZE); + RCL_SERVER, PAGE_SIZE); break; default: rc = -EINVAL; @@ -436,10 +421,16 @@ again: } if (rc != 0) { - if (imp->imp_state != LUSTRE_IMP_CLOSED) { + if (imp->imp_state != LUSTRE_IMP_CLOSED && + !imp->imp_deactive && + imp->imp_connect_flags_orig & OBD_CONNECT_MDS_MDS && + OCD_HAS_FLAG(&imp->imp_connect_data, LIGHTWEIGHT) && + rc != -ENOTSUPP) { /* Since LWP is not replayable, so it will keep - * trying unless umount happens, otherwise it would - * cause unecessary failure of the application. */ + * trying unless umount happens or the remote + * target does not support the operation, otherwise + * it would cause unecessary failure of the + * application. */ ptlrpc_req_finished(req); rc = 0; goto again; @@ -473,23 +464,23 @@ int fld_client_lookup(struct lu_client_fld *fld, u64 seq, u32 *mds, { struct lu_seq_range res = { 0 }; struct lu_fld_target *target; + struct lu_fld_target *origin; int rc; ENTRY; - fld->lcf_flags |= LUSTRE_FLD_RUN; - - rc = fld_cache_lookup(fld->lcf_cache, seq, &res); - if (rc == 0) { - *mds = res.lsr_index; - RETURN(0); - } + rc = fld_cache_lookup(fld->lcf_cache, seq, &res); + if (rc == 0) { + *mds = res.lsr_index; + RETURN(0); + } /* Can not find it in the cache */ target = fld_client_get_target(fld, seq); LASSERT(target != NULL); - - CDEBUG(D_INFO, "%s: Lookup fld entry (seq: "LPX64") on " - "target %s (idx "LPU64")\n", fld->lcf_name, seq, + origin = target; +again: + CDEBUG(D_INFO, "%s: Lookup fld entry (seq: %#llx) on " + "target %s (idx %llu)\n", fld->lcf_name, seq, fld_target_name(target), target->ft_idx); res.lsr_start = seq; @@ -505,6 +496,27 @@ int fld_client_lookup(struct lu_client_fld *fld, u64 seq, u32 *mds, rc = fld_client_rpc(target->ft_exp, &res, FLD_QUERY, NULL); } + if (rc == -ESHUTDOWN) { + /* If fld lookup failed because the target has been shutdown, + * then try next target in the list, until trying all targets + * or fld lookup succeeds */ + spin_lock(&fld->lcf_lock); + + /* If the next entry in the list is the head of the list, + * move to the next entry after the head and retrieve + * the target. Else retreive the next target entry. */ + + if (target->ft_chain.next == &fld->lcf_targets) + target = list_entry(target->ft_chain.next->next, + struct lu_fld_target, ft_chain); + else + target = list_entry(target->ft_chain.next, + struct lu_fld_target, + ft_chain); + spin_unlock(&fld->lcf_lock); + if (target != origin) + goto again; + } if (rc == 0) { *mds = res.lsr_index; fld_cache_insert(fld->lcf_cache, &res); @@ -518,16 +530,15 @@ void fld_client_flush(struct lu_client_fld *fld) { fld_cache_flush(fld->lcf_cache); } -EXPORT_SYMBOL(fld_client_flush); struct proc_dir_entry *fld_type_proc_dir; -static int __init fld_mod_init(void) +static int __init fld_init(void) { - fld_type_proc_dir = lprocfs_seq_register(LUSTRE_FLD_NAME, - proc_lustre_root, - NULL, NULL); + fld_type_proc_dir = lprocfs_register(LUSTRE_FLD_NAME, + proc_lustre_root, + NULL, NULL); if (IS_ERR(fld_type_proc_dir)) return PTR_ERR(fld_type_proc_dir); @@ -538,7 +549,7 @@ static int __init fld_mod_init(void) return 0; } -static void __exit fld_mod_exit(void) +static void __exit fld_exit(void) { #ifdef HAVE_SERVER_SUPPORT fld_server_mod_exit(); @@ -550,8 +561,10 @@ static void __exit fld_mod_exit(void) } } -MODULE_AUTHOR("Sun Microsystems, Inc. "); -MODULE_DESCRIPTION("Lustre FLD"); +MODULE_AUTHOR("OpenSFS, Inc. "); +MODULE_DESCRIPTION("Lustre FID Location Database"); +MODULE_VERSION(LUSTRE_VERSION_STRING); MODULE_LICENSE("GPL"); -cfs_module(mdd, LUSTRE_VERSION_STRING, fld_mod_init, fld_mod_exit); +module_init(fld_init); +module_exit(fld_exit);