docs: public void cache_free_storage_info()
      throws IOException
      {
          Block block;
          byte[] buf;
          ByteArrayPlusOutputStream bos;
          long cache_size;
          DataOutputStream dos;
          int qlist_num;
  
          if (readOnly) {
              throw (new FileManagerException("Attempt to cache free storage information in read only mode"));
          }
          cache_size = (2*LONG_SIZE) + ((free_blocks + nonempty_lists) *
                                        (INT_SIZE + PTR_SIZE));
          bos = new ByteArrayPlusOutputStream((int) cache_size);
          dos = new DataOutputStream(bos);
          dos.writeLong(allocated_blocks);
          dos.writeLong(allocated_words);
          for (qlist_num = 0; qlist_num <= last_ql_index;
              qlist_num++) {
              if (ql_heads[qlist_num].first_block != null) {
                  dos.writeInt(qlist_num);
                  block = ql_heads[qlist_num].first_block;
                  while (block != null) {
                      dos.writeLong(block.address); 
                      dos.writeInt(block.size); 
                      block = block.next;
                  }
                  dos.writeLong(DISK_NULL);
              }
          }
          dos.close();
          bos.close();
          buf = bos.getTheBuffer();
  
          seek(tail_ptr);
          write(buf);
          seek(CACHE_END);
          writeLong(tail_ptr + cache_size);
      }