struct obd_capa *capa_get(uid_t uid, int capa_op, __u64 mdsid,
unsigned long ino, __u32 igen, int type);
struct obd_capa *filter_capa_get(struct lustre_capa *capa);
+void capa_put_nolock(struct obd_capa *ocapa);
void capa_put(struct obd_capa *ocapa);
struct obd_capa *capa_renew(struct lustre_capa *capa, int type);
void capa_hmac(__u8 *key, struct lustre_capa *capa);
int rc;
ENTRY;
- if (capa_expired(&ocapa->c_capa))
- RETURN(-ESTALE);
-
rc = md_getattr(md_exp, &lli->lli_id, valid, NULL, NULL, 0,
0, ocapa, &req);
RETURN(rc);
if (ocapa->c_capa.lc_op == CAPA_TRUNC)
continue;
+ if (capa_expired(&ocapa->c_capa)) {
+ capa_put_nolock(ocapa);
+ continue;
+ }
+
if (__capa_is_to_expire(ocapa, &tv)) {
inode = igrab(ocapa->c_inode);
- if (inode == NULL)
+ if (inode == NULL) {
+ DEBUG_CAPA(D_ERROR, &ocapa->c_capa,
+ "igrab failed for");
continue;
+ }
tcapa = *ocapa;
spin_unlock(&capa_lock);
rc = ll_renew_capa(&tcapa);
iput(inode);
- if (rc)
- capa_put(ocapa);
-
spin_lock(&capa_lock);
} else {
next = ocapa;
return ocapa;
}
-void capa_put(struct obd_capa *ocapa)
+void capa_put_nolock(struct obd_capa *ocapa)
{
- if (!ocapa)
- return;
-
DEBUG_CAPA(D_INODE, &ocapa->c_capa, "put %s",
capa_type_name[ocapa->c_type]);
- spin_lock(&capa_lock);
+
if (ocapa->c_type == CLIENT_CAPA) {
list_del_init(&ocapa->c_lli_list);
__capa_put(ocapa);
} else {
atomic_dec(&ocapa->c_refc);
}
+}
+
+void capa_put(struct obd_capa *ocapa)
+{
+ if (!ocapa)
+ return;
+
+ spin_lock(&capa_lock);
+ capa_put_nolock(ocapa);
spin_unlock(&capa_lock);
}
EXPORT_SYMBOL(capa_op);
EXPORT_SYMBOL(capa_get);
+EXPORT_SYMBOL(__capa_get);
EXPORT_SYMBOL(filter_capa_get);
EXPORT_SYMBOL(capa_put);
+EXPORT_SYMBOL(capa_put_nolock);
EXPORT_SYMBOL(capa_renew);
-EXPORT_SYMBOL(__capa_get);
EXPORT_SYMBOL(capa_hmac);
EXPORT_SYMBOL(capa_dup);
EXPORT_SYMBOL(capa_dup2);