Whamcloud - gitweb
LU-13602 flr: skip unknown FLR component types
[fs/lustre-release.git] / lustre / lov / lov_object.c
index 1491851..cff9c1d 100644 (file)
@@ -683,6 +683,9 @@ static int lov_init_composite(const struct lu_env *env, struct lov_device *dev,
                        }
                        lle->lle_comp_ops = &dom_ops;
                        break;
+               case LOV_PATTERN_FOREIGN:
+                       lle->lle_comp_ops = NULL;
+                       break;
                default:
                        CERROR("%s: unknown composite layout entry type %i\n",
                               lov2obd(dev->ld_lov)->obd_name,
@@ -702,6 +705,8 @@ static int lov_init_composite(const struct lu_env *env, struct lov_device *dev,
                        if (mirror_id == lre->lre_mirror_id) {
                                lre->lre_valid |= lle->lle_valid;
                                lre->lre_stale |= !lle->lle_valid;
+                               lre->lre_foreign |=
+                                       lsme_is_foreign(lle->lle_lsme);
                                lre->lre_end = i;
                                continue;
                        }
@@ -723,6 +728,7 @@ static int lov_init_composite(const struct lu_env *env, struct lov_device *dev,
                                        LCME_FL_PREF_RD);
                lre->lre_valid = lle->lle_valid;
                lre->lre_stale = !lle->lle_valid;
+               lre->lre_foreign = lsme_is_foreign(lle->lle_lsme);
        }
 
        /* sanity check for FLR */
@@ -746,6 +752,9 @@ static int lov_init_composite(const struct lu_env *env, struct lov_device *dev,
                if (!lsme_inited(lle->lle_lsme))
                        continue;
 
+               if (lsme_is_foreign(lle->lle_lsme))
+                       continue;
+
                result = lle->lle_comp_ops->lco_init(env, dev, lov, index,
                                                     conf, lle);
                if (result < 0)
@@ -769,6 +778,9 @@ static int lov_init_composite(const struct lu_env *env, struct lov_device *dev,
                if (lre->lre_stale)
                        continue;
 
+               if (lre->lre_foreign)
+                       continue;
+
                mirror_count++; /* valid mirror */
 
                if (lre->lre_preferred || comp->lo_preferred_mirror < 0)
@@ -848,8 +860,12 @@ static int lov_delete_composite(const struct lu_env *env,
 
        lov_layout_wait(env, lov);
        if (comp->lo_entries)
-               lov_foreach_layout_entry(lov, entry)
+               lov_foreach_layout_entry(lov, entry) {
+                       if (lsme_is_foreign(entry->lle_lsme))
+                               continue;
+
                        lov_delete_raid0(env, lov, entry);
+       }
 
        RETURN(0);
 }
@@ -930,7 +946,9 @@ static int lov_print_composite(const struct lu_env *env, void *cookie,
                     lse->lsme_id, lse->lsme_pattern, lse->lsme_layout_gen,
                     lse->lsme_flags, lse->lsme_stripe_count,
                     lse->lsme_stripe_size);
-               lov_print_raid0(env, cookie, p, lle);
+
+               if (!lsme_is_foreign(lse))
+                       lov_print_raid0(env, cookie, p, lle);
        }
 
        return 0;