Whamcloud - gitweb
put capa before calling ll_renew_capa, in case it might get updated.
authorlsy <lsy>
Wed, 21 Sep 2005 12:02:28 +0000 (12:02 +0000)
committerlsy <lsy>
Wed, 21 Sep 2005 12:02:28 +0000 (12:02 +0000)
lustre/include/linux/lustre_sec.h
lustre/llite/llite_capa.c
lustre/obdclass/capa.c

index 1a994ec..eefb2b9 100644 (file)
@@ -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);
index b9e8e05..8aec261 100644 (file)
@@ -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;
index 0502287..e8bd796 100644 (file)
@@ -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);