Whamcloud - gitweb
- additional debug to catch the case when client gets openhandle w/o capa
[fs/lustre-release.git] / lustre / llite / llite_capa.c
index 5962d84..e9296b1 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;
@@ -255,8 +257,15 @@ int ll_set_capa(struct inode *inode, struct lookup_intent *it,
         LASSERT(body != NULL);          /* reply already checked out */
         LASSERT_REPSWABBED(req, 1);     /* and swabbed down */
 
-        if (!(body->valid & OBD_MD_CAPA))
+        if (!(body->valid & OBD_MD_CAPA)) {
+                if (atomic_read(&ll_capa_stat))
+                        DEBUG_REQ(D_ERROR, req,
+                                  "no capa for (uid %u, op %d, "DLID4"\n",
+                                   (unsigned)current->uid, it->it_flags,
+                                   OLID4(&lli->lli_id));
+
                 return 0;
+        }
 
         ENTRY;
 
@@ -341,8 +350,8 @@ struct obd_capa *ll_get_capa(struct inode *inode, uid_t uid, int op)
         }
 
         if (atomic_read(&ll_capa_stat)) {
-                CDEBUG(D_ERROR, "find capa for (uid %u, op %d, mdsid "LPU64","
-                       " ino %u igen %u) failed.\n",
+                CDEBUG(D_ERROR, "can't find capa for (uid %u, op %d, mdsid "
+                       LPU64", ino %u igen %u) failed.\n",
                        (unsigned)uid, op, id_group(&lli->lli_id),
                        (unsigned)id_ino(&lli->lli_id), id_gen(&lli->lli_id));
                 atomic_set(&ll_capa_stat, 0);