* 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/
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);
(char *)target->ft_exp->exp_obd->obd_uuid.uuid :
"<null>";
- 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);
}
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);
}
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)
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);
}
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 /
}
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;
{
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;
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);
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,
return 0;
}
-static void __exit fld_mod_exit(void)
+static void __exit fld_exit(void)
{
#ifdef HAVE_SERVER_SUPPORT
fld_server_mod_exit();
}
}
-MODULE_AUTHOR("Sun Microsystems, Inc. <http://www.lustre.org/>");
-MODULE_DESCRIPTION("Lustre FLD");
+MODULE_AUTHOR("OpenSFS, Inc. <http://www.lustre.org/>");
+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);