afs: Handle afs_AllocDCache errors
authorAndrew Deason <adeason@sinenomine.net>
Thu, 1 Nov 2012 20:43:09 +0000 (15:43 -0500)
committerDerrick Brashear <shadow@your-file-system.com>
Tue, 13 Nov 2012 18:39:07 +0000 (10:39 -0800)
Do not panic if afs_AllocDCache encounters an error and returns NULL.
Instead, go into the normal retry loop that occurs if we couldn't free
up any more free/discard dcache entries.

Change-Id: Ia165e0b5f5ef37e05942c795955d75f26e4ea7d3
Reviewed-on: http://gerrit.openafs.org/8405
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Derrick Brashear <shadow@your-file-system.com>

src/afs/afs_dcache.c

index b48c05f..b398cf5 100644 (file)
@@ -1892,35 +1892,36 @@ afs_GetDCache(struct vcache *avc, afs_size_t abyte,
                goto done;
            }
 
-           /* Make sure there is a free dcache entry for us to use */
            if (afs_discardDCList == NULLIDX && afs_freeDCList == NULLIDX) {
-               while (1) {
-                   if (!setLocks)
-                       avc->f.states |= CDCLock;
-                   /* just need slots */
-                   afs_GetDownD(5, (int *)0, afs_DCGetBucket(avc));
-                   if (!setLocks)
-                       avc->f.states &= ~CDCLock;
-                   if (afs_discardDCList != NULLIDX
-                       || afs_freeDCList != NULLIDX)
-                       break;
-                   /* If we can't get space for 5 mins we give up and panic */
-                   if (++downDCount > 300) {
-                       osi_Panic("getdcache");
-                    }
-                   ReleaseWriteLock(&afs_xdcache);
-                   /*
-                    * Locks held:
-                    * avc->lock(R) if setLocks
-                    * avc->lock(W) if !setLocks
-                    */
-                   afs_osi_Wait(1000, 0, 0);
-                   goto RetryLookup;
-               }
+               if (!setLocks)
+                   avc->f.states |= CDCLock;
+               /* just need slots */
+               afs_GetDownD(5, (int *)0, afs_DCGetBucket(avc));
+               if (!setLocks)
+                   avc->f.states &= ~CDCLock;
            }
-
            tdc = afs_AllocDCache(avc, chunk, aflags, NULL);
-           osi_Assert(tdc);
+           if (!tdc) {
+               /* If we can't get space for 5 mins we give up and panic */
+               if (++downDCount > 300)
+                   osi_Panic("getdcache");
+               ReleaseWriteLock(&afs_xdcache);
+               /*
+                * Locks held:
+                * avc->lock(R) if setLocks
+                * avc->lock(W) if !setLocks
+                */
+               afs_osi_Wait(1000, 0, 0);
+               goto RetryLookup;
+           }
+
+           /*
+            * Locks held:
+            * avc->lock(R) if setLocks
+            * avc->lock(W) if !setLocks
+            * tdc->lock(W)
+            * afs_xdcache(W)
+            */
 
            /*
             * Now add to the two hash chains - note that i is still set