X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Ffld%2Ffld_request.c;h=374d40519855444ee71a58f1ebdf3cf13be5c02f;hb=500f334631c6ebec72f5791472f21603da3e0ef9;hp=c8df2489a1709ee4a158a3fcd7ca2df587b266b8;hpb=34bdd30ec6a2010dfd98c5110487df210d03815d;p=fs%2Flustre-release.git diff --git a/lustre/fld/fld_request.c b/lustre/fld/fld_request.c index c8df248..374d405 100644 --- a/lustre/fld/fld_request.c +++ b/lustre/fld/fld_request.c @@ -27,7 +27,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, 2015, Intel Corporation. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -92,7 +92,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 +103,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 +140,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 +164,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 +176,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); } @@ -304,10 +297,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 / @@ -433,10 +425,15 @@ 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 && + 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; @@ -470,23 +467,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; @@ -502,6 +499,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); @@ -519,7 +537,7 @@ void fld_client_flush(struct lu_client_fld *fld) 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_register(LUSTRE_FLD_NAME, proc_lustre_root, @@ -534,7 +552,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(); @@ -546,8 +564,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);