int group;
};
+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);
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;
/* 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) {
err = obd_set_info_async(tgt->ltd_exp,
keylen, key, vallen,
((struct obd_id_info*)val)->data, set);
- } else {
+ } 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))
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,
- sizeof(*key), key, NULL);
+ sizeof(info), &info, NULL);
RETURN(rc);
}
__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;
key = &mds->mds_capa_keys[i];
DEBUG_CAPA_KEY(D_SEC, key, "propagate");
+ info.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 != 0)
GOTO(out, rc);
/* propagate capability keys */
- rc = mds_propagate_capa_keys(mds);
+ rc = mds_propagate_capa_keys(mds, uuid);
if (rc)
GOTO(out, rc);