r=ericm,fanyong
Fixed an issue in __mds_lov_synchronize(), where mds_propagate_capa_keys() tried to propagate the capa keys to all OSTs. This is not good because if one of the OST is not ready, it will cause the mds.osc to be set to inactive, and don't have a chane to get over.
+struct mds_capa_info {
+ struct obd_uuid *uuid;
+ struct lustre_capa_key *capa;
+};
+
/* mds/mds_lov.c */
int mds_lov_write_objids(struct obd_device *obd);
int mds_lov_prepare_objids(struct obd_device *obd, struct lov_mds_md *lmm);
/* mds/mds_lov.c */
int mds_lov_write_objids(struct obd_device *obd);
int mds_lov_prepare_objids(struct obd_device *obd, struct lov_mds_md *lmm);
struct lov_tgt_desc *tgt;
unsigned incr, check_uuid,
do_inactive, no_set;
struct lov_tgt_desc *tgt;
unsigned incr, check_uuid,
do_inactive, no_set;
- unsigned next_id = 0, mds_con = 0;
+ unsigned next_id = 0, mds_con = 0, capa = 0;
ENTRY;
incr = check_uuid = do_inactive = no_set = 0;
ENTRY;
incr = check_uuid = do_inactive = no_set = 0;
/* use defaults: do_inactive = incr = 0; */
} else if (KEY_IS(KEY_MDS_CONN)) {
mds_con = 1;
/* use defaults: do_inactive = incr = 0; */
} else if (KEY_IS(KEY_MDS_CONN)) {
mds_con = 1;
+ } else if (KEY_IS(KEY_CAPA_KEY)) {
+ capa = 1;
}
for (i = 0; i < count; i++, val = (char *)val + incr) {
}
for (i = 0; i < count; i++, val = (char *)val + incr) {
err = obd_set_info_async(tgt->ltd_exp,
keylen, key, vallen,
((struct obd_id_info*)val)->data, set);
err = obd_set_info_async(tgt->ltd_exp,
keylen, key, vallen,
((struct obd_id_info*)val)->data, set);
+ } else if (capa) {
+ struct mds_capa_info *info = (struct mds_capa_info*)val;
+
+ LASSERT(vallen == sizeof(*info));
+
+ /* Only want a specific OSC */
+ if (info->uuid &&
+ !obd_uuid_equals(info->uuid, &tgt->ltd_uuid))
+ continue;
+
+ err = obd_set_info_async(tgt->ltd_exp, keylen, key,
+ sizeof(*info->capa),
+ info->capa, set);
+
+ } else {
/* Only want a specific OSC */
if (check_uuid &&
!obd_uuid_equals(val, &tgt->ltd_uuid))
/* Only want a specific OSC */
if (check_uuid &&
!obd_uuid_equals(val, &tgt->ltd_uuid))
struct md_device *m,
struct lustre_capa_key *key)
{
struct md_device *m,
struct lustre_capa_key *key)
{
+ struct mds_capa_info info = { .uuid = NULL, .capa = key };
struct mdd_device *mdd = lu2mdd_dev(&m->md_lu_dev);
struct obd_export *lov_exp = mdd2obd_dev(mdd)->u.mds.mds_osc_exp;
int rc;
ENTRY;
rc = obd_set_info_async(lov_exp, sizeof(KEY_CAPA_KEY), KEY_CAPA_KEY,
struct mdd_device *mdd = lu2mdd_dev(&m->md_lu_dev);
struct obd_export *lov_exp = mdd2obd_dev(mdd)->u.mds.mds_osc_exp;
int rc;
ENTRY;
rc = obd_set_info_async(lov_exp, sizeof(KEY_CAPA_KEY), KEY_CAPA_KEY,
- sizeof(*key), key, NULL);
+ sizeof(info), &info, NULL);
__u32 mlsi_index; /* index of target */
};
__u32 mlsi_index; /* index of target */
};
-static int mds_propagate_capa_keys(struct mds_obd *mds)
+static int mds_propagate_capa_keys(struct mds_obd *mds, struct obd_uuid *uuid)
+ struct mds_capa_info info = { .uuid = uuid };
struct lustre_capa_key *key;
int i, rc = 0;
struct lustre_capa_key *key;
int i, rc = 0;
key = &mds->mds_capa_keys[i];
DEBUG_CAPA_KEY(D_SEC, key, "propagate");
key = &mds->mds_capa_keys[i];
DEBUG_CAPA_KEY(D_SEC, key, "propagate");
rc = obd_set_info_async(mds->mds_osc_exp, sizeof(KEY_CAPA_KEY),
rc = obd_set_info_async(mds->mds_osc_exp, sizeof(KEY_CAPA_KEY),
- KEY_CAPA_KEY, sizeof(*key), key, NULL);
+ KEY_CAPA_KEY, sizeof(info), &info, NULL);
if (rc) {
DEBUG_CAPA_KEY(D_ERROR, key,
"propagate failed (rc = %d) for", rc);
if (rc) {
DEBUG_CAPA_KEY(D_ERROR, key,
"propagate failed (rc = %d) for", rc);
if (rc != 0)
GOTO(out, rc);
/* propagate capability keys */
if (rc != 0)
GOTO(out, rc);
/* propagate capability keys */
- rc = mds_propagate_capa_keys(mds);
+ rc = mds_propagate_capa_keys(mds, uuid);