From a9c402c94285fc3960799b299610a7ccb8fc0a7c Mon Sep 17 00:00:00 2001 From: lsy Date: Wed, 21 Sep 2005 12:02:28 +0000 Subject: [PATCH] put capa before calling ll_renew_capa, in case it might get updated. --- lustre/include/linux/lustre_sec.h | 1 + lustre/llite/llite_capa.c | 16 +++++++++------- lustre/obdclass/capa.c | 19 +++++++++++++------ 3 files changed, 23 insertions(+), 13 deletions(-) diff --git a/lustre/include/linux/lustre_sec.h b/lustre/include/linux/lustre_sec.h index 1a994ec..eefb2b9 100644 --- a/lustre/include/linux/lustre_sec.h +++ b/lustre/include/linux/lustre_sec.h @@ -608,6 +608,7 @@ void __capa_get(struct obd_capa *ocapa); 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); diff --git a/lustre/llite/llite_capa.c b/lustre/llite/llite_capa.c index b9e8e05..8aec261 100644 --- a/lustre/llite/llite_capa.c +++ b/lustre/llite/llite_capa.c @@ -88,9 +88,6 @@ static int ll_renew_capa(struct obd_capa *ocapa) 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); @@ -144,10 +141,18 @@ static int ll_capa_thread(void *arg) 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); @@ -155,9 +160,6 @@ static int ll_capa_thread(void *arg) rc = ll_renew_capa(&tcapa); iput(inode); - if (rc) - capa_put(ocapa); - spin_lock(&capa_lock); } else { next = ocapa; diff --git a/lustre/obdclass/capa.c b/lustre/obdclass/capa.c index 0502287..e8bd796 100644 --- a/lustre/obdclass/capa.c +++ b/lustre/obdclass/capa.c @@ -348,14 +348,11 @@ struct obd_capa * filter_capa_get(struct lustre_capa *capa) 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); @@ -363,6 +360,15 @@ void capa_put(struct obd_capa *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); } @@ -471,10 +477,11 @@ void dump_capa_hmac(char *buf, char *key) 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); -- 1.8.3.1