]> git.ipfire.org Git - thirdparty/squid.git/commitdiff
Polished entry freeing.
authorAlex Rousskov <rousskov@measurement-factory.com>
Sun, 20 Jan 2013 01:53:24 +0000 (18:53 -0700)
committerAlex Rousskov <rousskov@measurement-factory.com>
Sun, 20 Jan 2013 01:53:24 +0000 (18:53 -0700)
Clean Writeable entries in addition to Readables ones. Otherwise, there is no
way for the caller to completely get rid of a [large] entry the caller has
been writing! We hold the lock so this should be safe as long as slice.next
(and slice extras) are valid even in a half-baked Writeable entry.

Reset slice.next [before giving it to the caller]. As a consequence, we must
free individual slices even if cleaner is not set.

src/ipc/StoreMap.cc

index 99a040c9c7bc6a108e925f46b28a7f5f4e2a290a..ac7eb2769894838b652e718c89bfa8002413eb16 100644 (file)
@@ -229,12 +229,15 @@ Ipc::StoreMap::freeChain(const sfileno fileno, Anchor &inode, const bool keepLoc
 {
     debugs(54, 7, "freeing " << inode.state << " entry " << fileno <<
            " in map [" << path << ']');
-    if (inode.state == Anchor::Readable && cleaner) {
+    if (inode.state != Anchor::Empty) {
         sfileno sliceId = inode.start;
         debugs(54, 7, "first slice " << sliceId);
         while (sliceId >= 0) {
-                       const sfileno nextId = shared->slots[sliceId].slice.next;
-            cleaner->noteFreeMapSlice(sliceId); // might change slice state
+            Slice &slice = shared->slots[sliceId].slice;
+            const sfileno nextId = slice.next;
+            slice.next = -1;
+            if (cleaner)
+                cleaner->noteFreeMapSlice(sliceId); // might change slice state
             sliceId = nextId;
         }
     }