source: trunk/server/common/patches/openafs-afs_conn-overcounts.patch @ 2649

Last change on this file since 2649 was 2649, checked in by andersk, 8 years ago
openafs: Fix some afs_conn overcounts Patch from http://gerrit.openafs.org/11464 .
File size: 2.5 KB
  • src/afs/afs_bypasscache.c

    From 368fff3b2fef5b559ed6da016e1e9f0413b55552 Mon Sep 17 00:00:00 2001
    From: Andrew Deason <adeason@sinenomine.net>
    Date: Sun, 14 Sep 2014 14:10:11 -0500
    Subject: [PATCH] afs: Fix some afs_conn overcounts
    
    The usual pattern of using afs_Conn looks like this:
    
      do {
          tc = afs_Conn(...);
          if (tc) {
              code = /* ... */
          } else {
              code = -1;
          }
      } while (afs_Analyze(...));
    
    The afs_Analyze call, amongst other things, puts back the reference to
    the connection obtained from afs_Conn. If anything inside the do/while
    block exits that block without calling afs_Analyze or afs_PutConn, we
    will leak a reference to the conn.
    
    A few places currently do this, by jumping out of the loop with
    'goto's. Specifically, in afs_dcache.c and afs_bypasscache.c. These
    locations currently leak references to our connection object (and to
    the underlying Rx connection object), which can cause problems over
    time. Specifically, this can cause a panic when the refcount overflows
    and becomes negative, causing a panic message that looks like:
    
      afs_PutConn: refcount imbalance 0xd34db33f -32768
    
    To avoid this, make sure we afs_PutConn in these cases where we 'goto'
    out of the afs_Conn/afs_Analyze loop. Perhaps ideally we should cause
    afs_Analyze itself to be called in these situations, but for now just
    fix the problem with the least amount of impact possible.
    
    FIXES 131885
    
    Change-Id: I3a52f8ccef24f01d04c02db0a4b711405360e323
    ---
     src/afs/afs_bypasscache.c | 1 +
     src/afs/afs_dcache.c      | 7 +++++++
     2 files changed, 8 insertions(+)
    
    diff --git a/src/afs/afs_bypasscache.c b/src/afs/afs_bypasscache.c
    index 744feb2..8fc6009 100644
    a b afs_PrefetchNoCache(struct vcache *avc, 
    637637            } else {
    638638                afs_warn("BYPASS: StartRXAFS_FetchData failed: %d\n", code);
    639639                unlock_and_release_pages(auio);
     640                afs_PutConn(tc, rxconn, SHARED_LOCK);
    640641                goto done;
    641642            }
    642643            if (code == 0) {
  • src/afs/afs_dcache.c

    diff --git a/src/afs/afs_dcache.c b/src/afs/afs_dcache.c
    index dc1e039..a156e22 100644
    a b afs_GetDCache(struct vcache *avc, afs_size_t abyte, 
    23992399                        afs_PutDCache(tdc);
    24002400                        tdc = 0;
    24012401                        ReleaseReadLock(&avc->lock);
     2402
     2403                        if (tc) {
     2404                            /* If we have a connection, we must put it back,
     2405                             * since afs_Analyze will not be called here. */
     2406                            afs_PutConn(tc, rxconn, SHARED_LOCK);
     2407                        }
     2408
    24022409                        slowPass = 1;
    24032410                        goto RetryGetDCache;
    24042411                    }
Note: See TracBrowser for help on using the repository browser.