- if (capa_expired(capa)) {
- DEBUG_CAPA(D_INFO | D_ERROR, capa, "expired");
- RETURN(-ESTALE);
- }
-
- ocapa = filter_capa_get(capa);
-verify:
- if (ocapa) {
- struct timeval tv;
-
- /* fo_capa_lock protects capa too */
- do_gettimeofday(&tv);
- spin_lock(&filter->fo_capa_lock);
- if (capa->lc_keyid == ocapa->c_capa.lc_keyid) {
- rc = memcmp(capa, &ocapa->c_capa, sizeof(*capa));
- } else if (ocapa->c_bvalid &&
- capa->lc_keyid == ocapa->c_bkeyid) {
- rc = memcmp(capa->lc_hmac, ocapa->c_bhmac,
- sizeof(capa->lc_hmac));
- } else {
- /* ocapa is obsolete too */
- ocapa->c_bvalid = 0;
- goto new_capa;
- }
-
- if (rc && __capa_is_to_expire(ocapa, &tv)) {
- /* client should use new expiry now */
- ocapa->c_bvalid = 0;
- goto new_capa;
- }
- spin_unlock(&filter->fo_capa_lock);
-
- if (rc) {
- char *key1 = NULL, *key2 = NULL;
- OBD_ALLOC(key1, CAPA_DIGEST_SIZE * 2 + 1);
- OBD_ALLOC(key2, CAPA_DIGEST_SIZE * 2 + 1);
- if (key1 && key2) {
- dump_capa_hmac(key1, capa->lc_hmac);
- dump_capa_hmac(key2, ocapa->c_capa.lc_hmac);
- DEBUG_CAPA(D_ERROR, capa,
- "access denied for (%s != %s)",
- key1, key2);
- DEBUG_CAPA(D_ERROR, &ocapa->c_capa, "used capa");
+ if (capa_flags(capa) == LC_ID_CONVERT) {
+ struct obd_device *obd = exp->exp_obd;
+ struct filter_obd *filter = &obd->u.filter;
+ struct filter_capa_key *k;
+ int found = 0;
+
+ cfs_spin_lock(&capa_lock);
+ cfs_list_for_each_entry(k, &filter->fo_capa_keys, k_list) {
+ if (k->k_key.lk_seq == seq &&
+ k->k_key.lk_keyid == capa_keyid(capa)) {
+ found = 1;
+ break;