int allocateClusters(int tailCluster, int count) throws IOException {
        // - bitmap of free clusters in memory?
        // - chunk with free block counting for sequential allocation?
        // - two stage allocation with "gray"
        //    +final static int CLUSTER_GALLOCATED = 0x80000000;
        //    +final static int CLUSTER_GEOC       = 0xC8000000;
        //   up bit?
        // - resize if need?
        if (count < 1)
            throw new IOException("Cannot allocate" + count + "clusters.");
        synchronized (this) {
            checkCanWrite();
            if ((tailCluster < clusterCount) && (
                    ((freeClusterCount >= 0) && (count <= freeClusterCount))
                 || ((freeClusterCount  < 0) && (count <= clusterCount)))) // without guaranty on dirty FAT
            {
                try {
                    if (tailCluster != -1 && getFatEntry(tailCluster) != FATClusterAllocator.CLUSTER_EOC)
                        throw new IOException("Can join the chain with the tail only.");
                    return clusterAllocator.allocateClusters(tailCluster, count);
                } finally {
                    //forceFat();
                }
            }
            throw new IOException("Disk full.");
        }
    }