staging/lustre/fld: refer to MDT0 for fld lookup in some cases
authorwang di <di.wang@intel.com>
Mon, 2 Feb 2015 02:52:14 +0000 (21:52 -0500)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 7 Feb 2015 09:32:33 +0000 (17:32 +0800)
It is possible that when fld client is trying to lookup seq
on one of MDT, but the connection between the client and the MDT
is not being initialized yet, especially during striped dir creation,
because client will only send create req to the master MDT, then
master MDT will distribute the operation to all of other MDT, instead
of client distributing these requests, which will usually trigger
the connection.

In this case, we will send the fld request to MDT0, since it has
all of location information.

Signed-off-by: wang di <di.wang@intel.com>
Reviewed-on: http://review.whamcloud.com/11780
Intel-bug-id: https://jira.hpdd.intel.com/browse/LU-4855
Reviewed-by: Fan Yong <fan.yong@intel.com>
Reviewed-by: Mike Pershin <mike.pershin@intel.com>
Signed-off-by: Oleg Drokin <oleg.drokin@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/lustre/lustre/fld/fld_request.c

index 7801db0e79ce256bd84b8ebb776e09e6a81c4c75..b8d17e109a961a1d30e3b016173a42378eff0d25 100644 (file)
@@ -131,11 +131,20 @@ fld_rrb_scan(struct lu_client_fld *fld, u64 seq)
        else
                hash = 0;
 
+again:
        list_for_each_entry(target, &fld->lcf_targets, ft_chain) {
                if (target->ft_idx == hash)
                        return target;
        }
 
+       if (hash != 0) {
+               /* It is possible the remote target(MDT) are not connected to
+                * with client yet, so we will refer this to MDT0, which should
+                * be connected during mount */
+               hash = 0;
+               goto again;
+       }
+
        CERROR("%s: Can't find target by hash %d (seq %#llx). Targets (%d):\n",
                fld->lcf_name, hash, seq, fld->lcf_count);